[Non-ACR] Update tct-tools_r4_rc1 folder 94/289194/1
authorPham Tien Duc <tienduc.pham@samsung.com>
Thu, 2 Mar 2023 09:00:28 +0000 (16:00 +0700)
committerPham Tien Duc <tienduc.pham@samsung.com>
Thu, 2 Mar 2023 09:02:44 +0000 (16:02 +0700)
Change-Id: Id5b4d439a0f068a7e54b555485c4f39a04423da8

258 files changed:
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/TCT_CONFIG [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/VERSION [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/full_pkg_generator [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/doc/NET_TCT_6.0_Tester_User_Guide_v1.0.docx [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/doc/Native_TCT_6.0_Tester_User_Guide_v1.0.docx [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/doc/RELEASE_NOTES [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/doc/TCT-manager-guide.pdf [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/doc/Web_TCT_2.3_Behavior_Test_Tool_User_Guide_v1.0.pdf [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/doc/Web_TCT_2.3_Manager_User_Guide_v1.0.pdf [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/doc/Web_TCT_2.3_Shell_User_Guide_v1.0.pdf [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/doc/Web_TCT_2.3_TestSuite_Packaging_Guide_v1.0.pdf [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/doc/Web_TCT_2.3_Tool_Packaging_Ubuntu_Guide_v1.0.pdf [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/doc/Web_TCT_2.3_User_Guide_v1.0.pdf [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/doc/Web_TCT_6.0_Tester_User_Guide_v1.0.pdf [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/lib/activation.jar [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/lib/appFramework-1.0.jar [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/lib/commons-cli-1.2.jar [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/lib/commons-compress-1.12.jar [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/lib/commons-io-2.4.jar [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/lib/jaxb-api.jar [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/lib/jaxb-impl.jar [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/lib/jaxb-xjc.jar [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/lib/jdom-1.1.2.jar [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/lib/json_simple-1.1.jar [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/lib/log4j-1.2.17.jar [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/lib/log4j.properties [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/lib/manager.properties [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/lib/tct-mgr-app.jar [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/lib/xmlparserv2-19.3.0.0.jar [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/plan/Full_common_iot.xml [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/plan/Full_mobile.xml [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/plan/Full_tv.xml [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/plan/Full_wearable.xml [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/script/temp [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/style/application.js [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/style/back_top.png [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/style/blue.jpg [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/style/gray.jpg [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/style/jquery.min.js [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/style/orange.jpg [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/style/popup.js [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/style/red.jpg [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/style/summary.xsl [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/style/testresult.xsl [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/style/tests.css [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/tmp/temp [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/.cproject [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/.exportMap [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/.project [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/.tproject [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/Build/appendix.mk [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/Build/basedef.mk [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/Build/flags.mk [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/Build/makefile [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/Build/prepost.mk [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/Build/tooldef.mk [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/inc/assert.h [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/inc/assert_common.h [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/inc/tct_common.h [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/inc/testcase.h [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/inc/{TESTSUITE_NAME}.h [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/project_def.prop [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/shared/res/res/org.tizen.helloworld-1.0.0-arm.tpk [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/shared/res/res/org.tizen.helloworld-1.0.0-i386.tpk [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/shared/res/res/org.tizen.helloworld2-1.0.0-arm.tpk [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/shared/res/res/org.tizen.helloworld2-1.0.0-i386.tpk [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/shared/res/{TESTSUITE_NAME}.png [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/src/tct_common.c [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/src/{TESTSUITE_NAME}.c [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/tizen-manifest.xml [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/COPYING [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/LICENSE.Apache-2.0 [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/Makefile.am [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/NOTICE [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/README [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/autogen [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/config.xml [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/configure.ac [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/icon.png [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/inst.sh [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/manifest.json [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/pack.sh [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/resources/COPYING [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/resources/Makefile.am [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/resources/testharness.css [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/resources/testharness.js [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/resources/testharnessreport.js [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/testcase.xsl [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/testcase/Makefile.am [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/testresult.xsl [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/tests.css [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/tests.full.xml [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/tests.xml [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/webrunner/Makefile.am [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/webrunner/index.html [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/webrunner/jquery-1.10.2.min.js [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/webrunner/testrunner.js [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/{TESTSUITE_NAME}.spec [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/sdb/sdb-32 [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/sdb/sdb-32.exe [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/sdb/sdb-64 [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/sdb/sdb-64.exe [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/shell [new submodule]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/tct-config-tools.py [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/tct-mgr [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/tct-mgr.bat [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/tct-shell [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkit-lite_native [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkit-lite_web_csharp [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/LICENSE [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/README [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/VERSION [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/Makefile.am [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/__init__.py [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/__init__.pyc [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/autoexec.py [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/autoexec.pyc [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/connector.py [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/connector.pyc [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/httprequest.py [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/httprequest.pyc [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/impl/Makefile.am [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/impl/__init__.py [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/impl/localhost.py [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/impl/tizenmobile.py [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/killall.py [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/killall.pyc [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/log.py [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/log.pyc [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/str2.py [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/str2.pyc [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/debian/changelog [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/debian/compat [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/debian/control [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/debian/copyright [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/debian/docs [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/debian/files [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/debian/postinst [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/debian/rules [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/doc/Makefile.am [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/doc/testkit-lite_user_guide.pdf [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/doc/testkit-lite_user_guide_for_tct.pdf [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/packaging/Makefile [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/packaging/testkit-lite.dsc [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/packaging/testkit-lite.spec [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/setup.py [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/temp/temp [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkit-lite [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/Makefile.am [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/__init__.py [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/__init__.pyc [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/common/Makefile.am [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/common/__init__.py [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/common/__init__.pyc [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/common/process_killall.py [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/common/process_killall.pyc [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/engines/Makefile.am [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/engines/__init__.py [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/engines/__init__.pyc [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/engines/default/Makefile.am [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/engines/default/__init__.py [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/engines/default/__init__.pyc [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/engines/default/runner.py [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/engines/default/runner.pyc [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/engines/default/worker.py [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/engines/default/worker.pyc [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/web/Makefile.am [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/web/index.html [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/web/jquery.js [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/web/manual_harness.html [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/web/manualharness.html [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/xsd/Makefile.am [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/xsd/application.js [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/xsd/back_top.png [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/xsd/jquery.min.js [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/xsd/readme.txt [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/xsd/release-notes [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/xsd/result.xml [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/xsd/test_definition.xsd [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/xsd/testcase.xsl [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/xsd/testresult.xsl [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/xsd/tests.css [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/xsd/tests.xml [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/CONFIG [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/LICENSE [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/README.md [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/VERSION [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/debian/changelog [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/debian/compat [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/debian/control [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/debian/copyright [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/debian/docs [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/debian/files [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/debian/postinst [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/debian/rules [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/doc/Makefile.am [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/doc/test_definition_schema.pdf [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/doc/testkit-lite_tutorial.pdf [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/doc/testkit-lite_user_guide.pdf [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/packaging/Makefile [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/packaging/testkit-lite.dsc [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/packaging/testkit-lite.spec [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/resource/mh.html [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/setup.py [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/temp/temp [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkit-lite [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkit-merge [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/Makefile.am [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/__init__.py [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/capability/Makefile.am [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/capability/__init__.py [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/capability/chrome_ubuntu.py [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/capability/xw_android.py [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/capability/xw_tizen.py [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/commodule/CONFIG [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/commodule/Makefile.am [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/commodule/__init__.py [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/commodule/androidmobile.py [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/commodule/localhost.py [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/commodule/tizenivi.py [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/commodule/tizenlocal.py [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/commodule/tizenmobile.py [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/engines/Makefile.am [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/engines/__init__.py [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/engines/androidunit.py [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/engines/default.py [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/engines/pyunit.py [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/engines/test_executer.py [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/engines/webdriver.py [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/util/CONFIG [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/util/Makefile.am [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/util/__init__.py [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/util/autoexec.py [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/util/config.py [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/util/connector.py [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/util/errors.py [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/util/httprequest.py [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/util/killall.py [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/util/log.py [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/util/process.py [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/util/result.py [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/util/session.py [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/util/str2.py [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/util/tr_utils.py [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitmerge/__init__.py [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitmerge/merger.py [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/xsd/Makefile.am [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/xsd/application.js [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/xsd/back_top.png [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/xsd/jquery.min.js [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/xsd/readme.md [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/xsd/release-notes [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/xsd/result.xml [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/xsd/test_definition.xsd [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/xsd/testcase.xsl [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/xsd/testresult.xsl [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/xsd/tests.css [new file with mode: 0644]
release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/xsd/tests.xml [new file with mode: 0644]

diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/TCT_CONFIG b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/TCT_CONFIG
new file mode 100644 (file)
index 0000000..1207692
--- /dev/null
@@ -0,0 +1,10 @@
+[DEVICE]
+DEVICE_SUITE_TARGET_24=/opt/usr/media
+DEVICE_SUITE_TARGET_30=/opt/usr/home/owner/share
+DEVICE_USER_30=/opt/usr/home/owner
+DEVICE_EXECUTION_MODE_30=owner
+DEVICE_PHYSICAL_STORAGE_30=/home/owner/media
+DEVICE_ADMIN_USER_30=owner
+DEVICE_ADMIN_USER_APPS_ROOT_30=/opt/usr/globalapps
+DEVICE_OTHER_USER_APPS_ROOT_30=/opt/usr/home/owner/apps_rw
+DEVICE_STORAGE_30=/home/owner/media
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/VERSION b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/VERSION
new file mode 100644 (file)
index 0000000..2e471da
--- /dev/null
@@ -0,0 +1 @@
+tct-tools_r4_rc1
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/full_pkg_generator b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/full_pkg_generator
new file mode 100644 (file)
index 0000000..4f7bb7c
--- /dev/null
@@ -0,0 +1,11 @@
+#!/bin/bash
+
+THE_CLASSPATH=
+for i in `ls /opt/tools/manager/lib/*.jar`
+do
+  THE_CLASSPATH=${THE_CLASSPATH}:${i}
+done
+
+
+java -cp /opt/tools/manager/config/:${THE_CLASSPATH} org.tizen.tct.tool.mgr.PackageList "${@}"
+chmod 777 /opt/tools/manager/tmp/
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/doc/NET_TCT_6.0_Tester_User_Guide_v1.0.docx b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/doc/NET_TCT_6.0_Tester_User_Guide_v1.0.docx
new file mode 100644 (file)
index 0000000..1b499de
Binary files /dev/null and b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/doc/NET_TCT_6.0_Tester_User_Guide_v1.0.docx differ
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/doc/Native_TCT_6.0_Tester_User_Guide_v1.0.docx b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/doc/Native_TCT_6.0_Tester_User_Guide_v1.0.docx
new file mode 100644 (file)
index 0000000..b1875ad
Binary files /dev/null and b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/doc/Native_TCT_6.0_Tester_User_Guide_v1.0.docx differ
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/doc/RELEASE_NOTES b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/doc/RELEASE_NOTES
new file mode 100644 (file)
index 0000000..cdce62c
--- /dev/null
@@ -0,0 +1,64 @@
+TCT 2.3 Release Notes
+
+1. Content overview
+ +----doc
+     |---- Web_TCT_2.3_Behavior_Test_Tool_User_Guide_v1.0.pdf
+     |---- Web_TCT_2.3_Manager_User_Guide_v1.0.pdf
+     |---- Web_TCT_2.3_Shell_User_Guide_v1.0.pdf
+     |---- Web_TCT_2.3_TestSuite_Packaging_Guide_v1.0.pdf
+     |---- Web_TCT_2.3_Tool_Packaging_Guide_v1.0.pdf
+     |---- Web_TCT_2.3_Tool_Packaging_Ubuntu_Guide_v1.0.pdf
+     |---- Web_TCT_2.3_User_Guide_v1.0.pdf
+     |---- RELEASE_NOTES
+ +----package
+     +---- common
+     +---- mobile
+     +---- wearable
+     +---- pkg_infos
+ +----resource
+     |---- getCap.wgt
+     |---- tct-testconfig-2.3-1.zip
+     |---- org.tizen.datacontrolprovider-1.0.0-arm.tpk
+     |---- org.tizen.datacontrolprovider-1.0.0-i386.tpk
+     +---- testkit-stub
+     +---- tinyweb subdirectory
+ +----tools
+     |---- healthcheck.ini
+     |---- full_pkg_generator
+     |---- tct-config-device.py
+     |---- tct-config-host.py
+     |---- tct-shell
+     |---- testkit-lite
+     |---- tct-mgr
+     +---- sdb
+     +---- shell
+     +---- testkitlite
+     +---- manager
+           +---- tct-manager related files
+
+2 Getting started
+
+2.1 TCT tools overview
+Tizen Compliance Tests (TCT) tools consist of these components:
+* Web TCT Manager:  A java GUI tool that runs on the host machine, allowing users to create a test execution plan, trigger test execution, and view the test report.
+* Web TCT Shell: A lightweight console tool that runs on the host machine, allowing users to trigger TCT testing with an existing test plan, or a package list, or a test case ID.
+* Web TCT Behavior Test Tool: A device behavior checker developed using jQuery.
+
+2.2 Setting up the environment and installing the tools
+Follow instructions in doc/Web_TCT_2.3_User_Guide_v1.0.pdf to set up the environment of both the host and the device, and to install the tools.
+
+2.3 Using the tools
+Consult these documents below for detailed usage information:
+* doc/Web_TCT_Manager_2.3_User_Guide_v1.0.pdf
+* doc/Web_TCT_Shell_2.3_User_Guide_v1.0.pdf
+* doc/Web_TCT_Behavior_Test_Tool_2.3_User_Guide_v1.0.pdf
+
+3. Contacting us
+We're counting on your feedback to further improve our tools. In the meantime, we'll help you out if you encounter any problems. Please contact cathy.shen@intel.com if you'd like to get help, offer feedback, or contribute new ideas.
+
+4. Upcoming features and enhancements
+Upcoming features and enhancements include:
+* Manual test cases will be automated, as much as possible, to save execution effort.
+* TCT tools and cases will be modified according to TCS changes and feedback.
+* Manual case support for Web TCT Shell and the "--manual" command option are placeholders, currently.
+
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/doc/TCT-manager-guide.pdf b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/doc/TCT-manager-guide.pdf
new file mode 100644 (file)
index 0000000..3f2d277
Binary files /dev/null and b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/doc/TCT-manager-guide.pdf differ
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/doc/Web_TCT_2.3_Behavior_Test_Tool_User_Guide_v1.0.pdf b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/doc/Web_TCT_2.3_Behavior_Test_Tool_User_Guide_v1.0.pdf
new file mode 100644 (file)
index 0000000..b9dd66b
Binary files /dev/null and b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/doc/Web_TCT_2.3_Behavior_Test_Tool_User_Guide_v1.0.pdf differ
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/doc/Web_TCT_2.3_Manager_User_Guide_v1.0.pdf b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/doc/Web_TCT_2.3_Manager_User_Guide_v1.0.pdf
new file mode 100644 (file)
index 0000000..8b1b100
Binary files /dev/null and b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/doc/Web_TCT_2.3_Manager_User_Guide_v1.0.pdf differ
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/doc/Web_TCT_2.3_Shell_User_Guide_v1.0.pdf b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/doc/Web_TCT_2.3_Shell_User_Guide_v1.0.pdf
new file mode 100644 (file)
index 0000000..46e4d9e
Binary files /dev/null and b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/doc/Web_TCT_2.3_Shell_User_Guide_v1.0.pdf differ
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/doc/Web_TCT_2.3_TestSuite_Packaging_Guide_v1.0.pdf b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/doc/Web_TCT_2.3_TestSuite_Packaging_Guide_v1.0.pdf
new file mode 100644 (file)
index 0000000..91f1b61
Binary files /dev/null and b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/doc/Web_TCT_2.3_TestSuite_Packaging_Guide_v1.0.pdf differ
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/doc/Web_TCT_2.3_Tool_Packaging_Ubuntu_Guide_v1.0.pdf b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/doc/Web_TCT_2.3_Tool_Packaging_Ubuntu_Guide_v1.0.pdf
new file mode 100644 (file)
index 0000000..eded39b
Binary files /dev/null and b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/doc/Web_TCT_2.3_Tool_Packaging_Ubuntu_Guide_v1.0.pdf differ
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/doc/Web_TCT_2.3_User_Guide_v1.0.pdf b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/doc/Web_TCT_2.3_User_Guide_v1.0.pdf
new file mode 100644 (file)
index 0000000..4ed1efe
Binary files /dev/null and b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/doc/Web_TCT_2.3_User_Guide_v1.0.pdf differ
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/doc/Web_TCT_6.0_Tester_User_Guide_v1.0.pdf b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/doc/Web_TCT_6.0_Tester_User_Guide_v1.0.pdf
new file mode 100644 (file)
index 0000000..67f7f60
Binary files /dev/null and b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/doc/Web_TCT_6.0_Tester_User_Guide_v1.0.pdf differ
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/lib/activation.jar b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/lib/activation.jar
new file mode 100644 (file)
index 0000000..5f37ea4
Binary files /dev/null and b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/lib/activation.jar differ
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/lib/appFramework-1.0.jar b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/lib/appFramework-1.0.jar
new file mode 100644 (file)
index 0000000..f480d62
Binary files /dev/null and b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/lib/appFramework-1.0.jar differ
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/lib/commons-cli-1.2.jar b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/lib/commons-cli-1.2.jar
new file mode 100644 (file)
index 0000000..ce4b9ff
Binary files /dev/null and b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/lib/commons-cli-1.2.jar differ
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/lib/commons-compress-1.12.jar b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/lib/commons-compress-1.12.jar
new file mode 100644 (file)
index 0000000..4867705
Binary files /dev/null and b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/lib/commons-compress-1.12.jar differ
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/lib/commons-io-2.4.jar b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/lib/commons-io-2.4.jar
new file mode 100644 (file)
index 0000000..90035a4
Binary files /dev/null and b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/lib/commons-io-2.4.jar differ
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/lib/jaxb-api.jar b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/lib/jaxb-api.jar
new file mode 100644 (file)
index 0000000..3e6d134
Binary files /dev/null and b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/lib/jaxb-api.jar differ
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/lib/jaxb-impl.jar b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/lib/jaxb-impl.jar
new file mode 100644 (file)
index 0000000..7670708
Binary files /dev/null and b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/lib/jaxb-impl.jar differ
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/lib/jaxb-xjc.jar b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/lib/jaxb-xjc.jar
new file mode 100644 (file)
index 0000000..fc5d69d
Binary files /dev/null and b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/lib/jaxb-xjc.jar differ
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/lib/jdom-1.1.2.jar b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/lib/jdom-1.1.2.jar
new file mode 100644 (file)
index 0000000..b8091ef
Binary files /dev/null and b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/lib/jdom-1.1.2.jar differ
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/lib/json_simple-1.1.jar b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/lib/json_simple-1.1.jar
new file mode 100644 (file)
index 0000000..f395f41
Binary files /dev/null and b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/lib/json_simple-1.1.jar differ
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/lib/log4j-1.2.17.jar b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/lib/log4j-1.2.17.jar
new file mode 100644 (file)
index 0000000..068867e
Binary files /dev/null and b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/lib/log4j-1.2.17.jar differ
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/lib/log4j.properties b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/lib/log4j.properties
new file mode 100644 (file)
index 0000000..6956ec6
--- /dev/null
@@ -0,0 +1,33 @@
+log4j.rootLogger=INFO,CONSOLE,FILE, ROLLING_FILE
+#DEBUG,CONSOLE,FILE,ROLLING_FILE,MAIL,DATABASE
+log4j.addivity.org.apache=true
+###################
+# Console Appender
+###################
+log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
+log4j.appender.Threshold=DEBUG
+log4j.appender.CONSOLE.Target=System.out
+log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
+log4j.appender.CONSOLE.layout.ConversionPattern=[%p]-%d-[%t] %c (%F:%L) - %m%n
+#log4j.appender.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n
+#####################
+# File Appender
+#####################
+log4j.appender.FILE=org.apache.log4j.FileAppender
+log4j.appender.FILE.File=/opt/tools/manager/log/file.log
+log4j.appender.FILE.Append=false
+log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
+#log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
+log4j.appender.FILE.layout.ConversionPattern=[%p]-%d-[%t] %c (%F:%L) - %m%n
+########################
+# Rolling File
+########################
+log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender
+log4j.appender.ROLLING_FILE.Threshold=ERROR
+log4j.appender.ROLLING_FILE.File=/opt/tools/manager/log/rolling.log
+log4j.appender.ROLLING_FILE.Append=true
+log4j.appender.ROLLING_FILE.MaxFileSize=10KB
+log4j.appender.ROLLING_FILE.MaxBackupIndex=1
+log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout
+#log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
+log4j.appender.ROLLING_FILE.layout.ConversionPattern=[%p]-%d-[%t] %c (%F:%L) - %m%n
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/lib/manager.properties b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/lib/manager.properties
new file mode 100644 (file)
index 0000000..090089e
--- /dev/null
@@ -0,0 +1,2 @@
+TIZENV=tizen_web_6.0,tizen_native_6.0,tizen_csharp_6.0,tizen_web_6.5,tizen_native_6.5,tizen_csharp_6.5,tizen_web_7.0,tizen_native_7.0,tizen_csharp_7.0,tizen_web_7.5,tizen_native_7.5,tizen_csharp_7.5
+PROFILE=mobile,wearable,tv,tizeniot
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/lib/tct-mgr-app.jar b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/lib/tct-mgr-app.jar
new file mode 100644 (file)
index 0000000..dc0b788
Binary files /dev/null and b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/lib/tct-mgr-app.jar differ
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/lib/xmlparserv2-19.3.0.0.jar b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/lib/xmlparserv2-19.3.0.0.jar
new file mode 100644 (file)
index 0000000..5d946ad
Binary files /dev/null and b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/lib/xmlparserv2-19.3.0.0.jar differ
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/plan/Full_common_iot.xml b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/plan/Full_common_iot.xml
new file mode 100644 (file)
index 0000000..8117552
--- /dev/null
@@ -0,0 +1,755 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ns3:testplan xmlns:ns3="http://www.example.org/plan/" xmlns="" name="Full_mobile" profile="mobile">
+  <execute_type>All</execute_type>
+  <suite name="tct-webdatabase-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>247</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>247</total_tcn>
+    <pkg_name>mobile/tct-webdatabase-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-jsenhance-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>49</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>49</total_tcn>
+    <pkg_name>common/tct-jsenhance-html5-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-multicolumn-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>141</auto_tcn>
+    <manual_tcn>18</manual_tcn>
+    <total_tcn>159</total_tcn>
+    <pkg_name>mobile/tct-multicolumn-css3-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-messaging-mms-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>123</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>123</total_tcn>
+    <pkg_name>mobile/tct-messaging-mms-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-workers-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>85</auto_tcn>
+    <manual_tcn>1</manual_tcn>
+    <total_tcn>86</total_tcn>
+    <pkg_name>mobile/tct-workers-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-transitions-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>26</auto_tcn>
+    <manual_tcn>5</manual_tcn>
+    <total_tcn>31</total_tcn>
+    <pkg_name>common/tct-transitions-css3-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-namespace-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>23</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>23</total_tcn>
+    <pkg_name>common/tct-namespace-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-messaging-email-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>308</auto_tcn>
+    <manual_tcn>1</manual_tcn>
+    <total_tcn>309</total_tcn>
+    <pkg_name>mobile/tct-messaging-email-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-2dtransforms-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>34</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>34</total_tcn>
+    <pkg_name>common/tct-2dtransforms-css3-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-time-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>470</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>470</total_tcn>
+    <pkg_name>mobile/tct-time-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-forms-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>151</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>151</total_tcn>
+    <pkg_name>mobile/tct-forms-html5-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-capability-tests" launcher="WRTLauncher" category="Compliance">
+    <auto_tcn>15</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>15</total_tcn>
+    <pkg_name>common/tct-capability-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-fileapi-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>98</auto_tcn>
+    <manual_tcn>3</manual_tcn>
+    <total_tcn>101</total_tcn>
+    <pkg_name>mobile/tct-fileapi-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-mediacapture-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>7</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>7</total_tcn>
+    <pkg_name>common/tct-mediacapture-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-ext01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">
+    <auto_tcn>3</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>3</total_tcn>
+    <pkg_name>mobile/tct-ext01-wrt-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-exif-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>64</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>64</total_tcn>
+    <pkg_name>common/tct-exif-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-csp-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>133</auto_tcn>
+    <manual_tcn>78</manual_tcn>
+    <total_tcn>211</total_tcn>
+    <pkg_name>mobile/tct-csp-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-privilege-wrt-tests" category="Web Runtime">
+    <auto_tcn>155</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>155</total_tcn>
+    <pkg_name>mobile/tct-privilege-wrt-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-mediakey-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>11</auto_tcn>
+    <manual_tcn>4</manual_tcn>
+    <total_tcn>15</total_tcn>
+    <pkg_name>mobile/tct-mediakey-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-deviceorientation-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>37</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>37</total_tcn>
+    <pkg_name>mobile/tct-deviceorientation-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-webmessaging-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>176</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>176</total_tcn>
+    <pkg_name>mobile/tct-webmessaging-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-package-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>54</auto_tcn>
+    <manual_tcn>12</manual_tcn>
+    <total_tcn>66</total_tcn>
+    <pkg_name>common/tct-package-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-notification-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>93</auto_tcn>
+    <manual_tcn>1</manual_tcn>
+    <total_tcn>94</total_tcn>
+    <pkg_name>mobile/tct-notification-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-fmradio-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>67</auto_tcn>
+    <manual_tcn>7</manual_tcn>
+    <total_tcn>74</total_tcn>
+    <pkg_name>mobile/tct-fmradio-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-rt01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">
+    <auto_tcn>12</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>12</total_tcn>
+    <pkg_name>common/tct-rt01-wrt-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-appcache-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>36</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>36</total_tcn>
+    <pkg_name>mobile/tct-appcache-html5-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-filesystemapi-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>208</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>208</total_tcn>
+    <pkg_name>mobile/tct-filesystemapi-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-svg-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>3</auto_tcn>
+    <manual_tcn>9</manual_tcn>
+    <total_tcn>12</total_tcn>
+    <pkg_name>common/tct-svg-html5-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-websocket-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>270</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>270</total_tcn>
+    <pkg_name>mobile/tct-websocket-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-flexiblebox-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>25</auto_tcn>
+    <manual_tcn>28</manual_tcn>
+    <total_tcn>53</total_tcn>
+    <pkg_name>common/tct-flexiblebox-css3-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-dnd-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>6</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>6</total_tcn>
+    <pkg_name>mobile/tct-dnd-html5-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-extra-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>548</auto_tcn>
+    <manual_tcn>25</manual_tcn>
+    <total_tcn>573</total_tcn>
+    <pkg_name>mobile/tct-extra-html5-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-fullscreen-nonw3c-tests" launcher="WRTLauncher" category="Supplementary APIs">
+    <auto_tcn>16</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>16</total_tcn>
+    <pkg_name>mobile/tct-fullscreen-nonw3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-colors-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>46</auto_tcn>
+    <manual_tcn>29</manual_tcn>
+    <total_tcn>75</total_tcn>
+    <pkg_name>common/tct-colors-css3-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-indexeddb-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>400</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>400</total_tcn>
+    <pkg_name>mobile/tct-indexeddb-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-sandbox-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>72</auto_tcn>
+    <manual_tcn>1</manual_tcn>
+    <total_tcn>73</total_tcn>
+    <pkg_name>common/tct-sandbox-html5-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-networkbearerselection-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>24</auto_tcn>
+    <manual_tcn>1</manual_tcn>
+    <total_tcn>25</total_tcn>
+    <pkg_name>mobile/tct-networkbearerselection-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-push-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>41</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>41</total_tcn>
+    <pkg_name>common/tct-push-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-messageport-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>48</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>48</total_tcn>
+    <pkg_name>mobile/tct-messageport-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-browserstate-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>3</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>3</total_tcn>
+    <pkg_name>mobile/tct-browserstate-html5-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-cors-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>10</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>10</total_tcn>
+    <pkg_name>common/tct-cors-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-xmlhttprequest-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>262</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>262</total_tcn>
+    <pkg_name>mobile/tct-xmlhttprequest-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-navigationtiming-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>45</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>45</total_tcn>
+    <pkg_name>mobile/tct-navigationtiming-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-typedarrays-nonw3c-tests" launcher="WRTLauncher" category="Supplementary APIs">
+    <auto_tcn>80</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>80</total_tcn>
+    <pkg_name>common/tct-typedarrays-nonw3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-animations-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>24</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>24</total_tcn>
+    <pkg_name>common/tct-animations-css3-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-badge-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>26</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>26</total_tcn>
+    <pkg_name>mobile/tct-badge-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-nfc-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>195</auto_tcn>
+    <manual_tcn>35</manual_tcn>
+    <total_tcn>230</total_tcn>
+    <pkg_name>mobile/tct-nfc-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-pagevisibility-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>18</auto_tcn>
+    <manual_tcn>2</manual_tcn>
+    <total_tcn>20</total_tcn>
+    <pkg_name>mobile/tct-pagevisibility-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-contact-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>441</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>441</total_tcn>
+    <pkg_name>mobile/tct-contact-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-content-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>245</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>245</total_tcn>
+    <pkg_name>common/tct-content-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-gumallow-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>6</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>6</total_tcn>
+    <pkg_name>common/tct-gumallow-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-notification-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>14</auto_tcn>
+    <manual_tcn>3</manual_tcn>
+    <total_tcn>17</total_tcn>
+    <pkg_name>mobile/tct-notification-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-sp01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">
+    <auto_tcn>4</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>4</total_tcn>
+    <pkg_name>common/tct-sp01-wrt-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-widget02-w3c-tests" category="W3C/HTML5 APIs">
+    <auto_tcn>68</auto_tcn>
+    <manual_tcn>82</manual_tcn>
+    <total_tcn>150</total_tcn>
+    <pkg_name>mobile/tct-widget02-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-websetting-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>22</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>22</total_tcn>
+    <pkg_name>mobile/tct-websetting-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-audio-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>333</auto_tcn>
+    <manual_tcn>1</manual_tcn>
+    <total_tcn>334</total_tcn>
+    <pkg_name>mobile/tct-audio-html5-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-screenorientation-w3c-tests" launcher="xwalk" category="W3C/HTML5 APIs">
+    <auto_tcn>17</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>17</total_tcn>
+    <pkg_name>mobile/tct-screenorientation-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-rt02-wrt-tests" category="Web Runtime">
+    <auto_tcn>3</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>3</total_tcn>
+    <pkg_name>common/tct-rt02-wrt-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-sp02-wrt-tests" category="Web Runtime">
+    <auto_tcn>1</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>1</total_tcn>
+    <pkg_name>common/tct-sp02-wrt-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-sound-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>52</auto_tcn>
+    <manual_tcn>8</manual_tcn>
+    <total_tcn>60</total_tcn>
+    <pkg_name>mobile/tct-sound-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-ext02-wrt-tests" category="Web Runtime">
+    <auto_tcn>8</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>8</total_tcn>
+    <pkg_name>common/tct-ext02-wrt-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-application-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>184</auto_tcn>
+    <manual_tcn>8</manual_tcn>
+    <total_tcn>192</total_tcn>
+    <pkg_name>mobile/tct-application-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-bluetooth-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>257</auto_tcn>
+    <manual_tcn>142</manual_tcn>
+    <total_tcn>399</total_tcn>
+    <pkg_name>mobile/tct-bluetooth-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-humanactivitymonitor-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>61</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>61</total_tcn>
+    <pkg_name>mobile/tct-humanactivitymonitor-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-fonts-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>11</auto_tcn>
+    <manual_tcn>131</manual_tcn>
+    <total_tcn>142</total_tcn>
+    <pkg_name>common/tct-fonts-css3-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-speech-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>40</auto_tcn>
+    <manual_tcn>1</manual_tcn>
+    <total_tcn>41</total_tcn>
+    <pkg_name>common/tct-speech-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-security-tcs-tests" launcher="WRTLauncher" category="Compliance">
+    <auto_tcn>3</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>3</total_tcn>
+    <pkg_name>common/tct-security-tcs-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-ui01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">
+    <auto_tcn>30</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>30</total_tcn>
+    <pkg_name>mobile/tct-ui01-wrt-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-animationtiming-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>11</auto_tcn>
+    <manual_tcn>7</manual_tcn>
+    <total_tcn>18</total_tcn>
+    <pkg_name>common/tct-animationtiming-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-selectorslevel2-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>30</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>30</total_tcn>
+    <pkg_name>common/tct-selectorslevel2-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-wgtapi01-w3c-tests" launcher="WRTLauncher -iu" category="W3C/HTML5 APIs">
+    <auto_tcn>107</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>107</total_tcn>
+    <pkg_name>common/tct-wgtapi01-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-inputdevice-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>19</auto_tcn>
+    <manual_tcn>1</manual_tcn>
+    <total_tcn>20</total_tcn>
+    <pkg_name>mobile/tct-inputdevice-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-webaudio-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>422</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>422</total_tcn>
+    <pkg_name>mobile/tct-webaudio-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-filewriterapi-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>106</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>106</total_tcn>
+    <pkg_name>mobile/tct-filewriterapi-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-sensor-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>119</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>119</total_tcn>
+    <pkg_name>mobile/tct-sensor-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-secureelement-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>71</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>71</total_tcn>
+    <pkg_name>mobile/tct-secureelement-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-power-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>50</auto_tcn>
+    <manual_tcn>6</manual_tcn>
+    <total_tcn>56</total_tcn>
+    <pkg_name>mobile/tct-power-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-appwgt-wrt-tests" category="Web Runtime">
+    <auto_tcn>7</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>7</total_tcn>
+    <pkg_name>common/tct-appwgt-wrt-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-privilege-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>65</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>65</total_tcn>
+    <pkg_name>common/tct-privilege-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-alarm-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>61</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>61</total_tcn>
+    <pkg_name>common/tct-alarm-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-touchevent-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>16</auto_tcn>
+    <manual_tcn>7</manual_tcn>
+    <total_tcn>23</total_tcn>
+    <pkg_name>mobile/tct-touchevent-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-wgtapi02-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>0</auto_tcn>
+    <manual_tcn>34</manual_tcn>
+    <total_tcn>34</total_tcn>
+    <pkg_name>common/tct-wgtapi02-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-archive-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>106</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>106</total_tcn>
+    <pkg_name>common/tct-archive-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-account-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>89</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>89</total_tcn>
+    <pkg_name>mobile/tct-account-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-tizen-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>81</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>81</total_tcn>
+    <pkg_name>common/tct-tizen-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-widget01-w3c-tests" launcher="WRTLauncher -iu" category="W3C/HTML5 APIs">
+    <auto_tcn>155</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>155</total_tcn>
+    <pkg_name>mobile/tct-widget01-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-bookmark-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>36</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>36</total_tcn>
+    <pkg_name>mobile/tct-bookmark-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-3dtransforms-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>32</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>32</total_tcn>
+    <pkg_name>common/tct-3dtransforms-css3-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-geoallow-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>208</auto_tcn>
+    <manual_tcn>3</manual_tcn>
+    <total_tcn>211</total_tcn>
+    <pkg_name>mobile/tct-geoallow-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-calendar-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>354</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>354</total_tcn>
+    <pkg_name>mobile/tct-calendar-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-sessionhistory-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>148</auto_tcn>
+    <manual_tcn>1</manual_tcn>
+    <total_tcn>149</total_tcn>
+    <pkg_name>common/tct-sessionhistory-html5-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-datacontrol-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>113</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>113</total_tcn>
+    <pkg_name>mobile/tct-datacontrol-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-appcontrol-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>5</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>5</total_tcn>
+    <pkg_name>mobile/tct-appcontrol-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-callhistory-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>80</auto_tcn>
+    <manual_tcn>27</manual_tcn>
+    <total_tcn>107</total_tcn>
+    <pkg_name>mobile/tct-callhistory-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-geodeny-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>0</auto_tcn>
+    <manual_tcn>3</manual_tcn>
+    <total_tcn>3</total_tcn>
+    <pkg_name>mobile/tct-geodeny-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-canvas-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>846</auto_tcn>
+    <manual_tcn>18</manual_tcn>
+    <total_tcn>864</total_tcn>
+    <pkg_name>common/tct-canvas-html5-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-ui-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>43</auto_tcn>
+    <manual_tcn>1</manual_tcn>
+    <total_tcn>44</total_tcn>
+    <pkg_name>common/tct-ui-css3-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-testconfig" launcher="WRTLauncher">
+    <auto_tcn>0</auto_tcn>
+    <manual_tcn>20</manual_tcn>
+    <total_tcn>20</total_tcn>
+    <pkg_name>common/tct-testconfig-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-selectorslevel1-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>78</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>78</total_tcn>
+    <pkg_name>common/tct-selectorslevel1-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-sse-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>68</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>68</total_tcn>
+    <pkg_name>mobile/tct-sse-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-widgetpolicy-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>0</auto_tcn>
+    <manual_tcn>33</manual_tcn>
+    <total_tcn>33</total_tcn>
+    <pkg_name>common/tct-widgetpolicy-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-batterystatus-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>23</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>23</total_tcn>
+    <pkg_name>mobile/tct-batterystatus-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-mediacontroller-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>162</auto_tcn>
+    <manual_tcn>3</manual_tcn>
+    <total_tcn>165</total_tcn>
+    <pkg_name>mobile/tct-mediacontroller-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-webuifw-tests03" category="Web UI Framework">
+    <auto_tcn>179</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>179</total_tcn>
+    <pkg_name>mobile/tct-webuifw-tests03-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-maxLength-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">
+    <auto_tcn>14</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>14</total_tcn>
+    <pkg_name>common/tct-maxLength-wrt-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-webuifw-tests04" category="Web UI Framework">
+    <auto_tcn>375</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>375</total_tcn>
+    <pkg_name>mobile/tct-webuifw-tests04-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-systeminfo-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>304</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>304</total_tcn>
+    <pkg_name>mobile/tct-systeminfo-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-webuifw-tests05" category="Web UI Framework">
+    <auto_tcn>322</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>322</total_tcn>
+    <pkg_name>mobile/tct-webuifw-tests05-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-filesystem-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>289</auto_tcn>
+    <manual_tcn>3</manual_tcn>
+    <total_tcn>292</total_tcn>
+    <pkg_name>mobile/tct-filesystem-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-webuifw-tests06" category="Web UI Framework">
+    <auto_tcn>98</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>98</total_tcn>
+    <pkg_name>mobile/tct-webuifw-tests06-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-webuifw-tests01" category="Web UI Framework">
+    <auto_tcn>355</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>355</total_tcn>
+    <pkg_name>mobile/tct-webuifw-tests01-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-webuifw-tests02" category="Web UI Framework">
+    <auto_tcn>455</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>455</total_tcn>
+    <pkg_name>mobile/tct-webuifw-tests02-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-vibration-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>2</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>2</total_tcn>
+    <pkg_name>mobile/tct-vibration-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-messaging-sms-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>184</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>184</total_tcn>
+    <pkg_name>mobile/tct-messaging-sms-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-text-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>27</auto_tcn>
+    <manual_tcn>15</manual_tcn>
+    <total_tcn>42</total_tcn>
+    <pkg_name>common/tct-text-css3-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-stab-wrt-tests" category="Web Runtime">
+    <auto_tcn>1</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>1</total_tcn>
+    <pkg_name>common/tct-stab-wrt-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-webstorage-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>177</auto_tcn>
+    <manual_tcn>4</manual_tcn>
+    <total_tcn>181</total_tcn>
+    <pkg_name>common/tct-webstorage-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-behavior-tests">
+    <auto_tcn>0</auto_tcn>
+    <manual_tcn>30</manual_tcn>
+    <total_tcn>30</total_tcn>
+    <pkg_name>mobile/tct-behavior-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-download-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>62</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>62</total_tcn>
+    <pkg_name>common/tct-download-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-mediaqueries-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>49</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>49</total_tcn>
+    <pkg_name>mobile/tct-mediaqueries-css3-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-systemsetting-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>33</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>33</total_tcn>
+    <pkg_name>mobile/tct-systemsetting-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-backgrounds-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>541</auto_tcn>
+    <manual_tcn>74</manual_tcn>
+    <total_tcn>615</total_tcn>
+    <pkg_name>mobile/tct-backgrounds-css3-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-video-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>361</auto_tcn>
+    <manual_tcn>4</manual_tcn>
+    <total_tcn>365</total_tcn>
+    <pkg_name>mobile/tct-video-html5-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-pm-wrt-tests" category="Web Runtime">
+    <auto_tcn>24</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>24</total_tcn>
+    <pkg_name>common/tct-pm-wrt-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-webgl-nonw3c-tests" launcher="WRTLauncher" category="Supplementary APIs">
+    <auto_tcn>889</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>889</total_tcn>
+    <pkg_name>common/tct-webgl-nonw3c-tests-2.4.zip</pkg_name>
+  </suite>
+</ns3:testplan>
+
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/plan/Full_mobile.xml b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/plan/Full_mobile.xml
new file mode 100644 (file)
index 0000000..8117552
--- /dev/null
@@ -0,0 +1,755 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ns3:testplan xmlns:ns3="http://www.example.org/plan/" xmlns="" name="Full_mobile" profile="mobile">
+  <execute_type>All</execute_type>
+  <suite name="tct-webdatabase-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>247</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>247</total_tcn>
+    <pkg_name>mobile/tct-webdatabase-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-jsenhance-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>49</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>49</total_tcn>
+    <pkg_name>common/tct-jsenhance-html5-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-multicolumn-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>141</auto_tcn>
+    <manual_tcn>18</manual_tcn>
+    <total_tcn>159</total_tcn>
+    <pkg_name>mobile/tct-multicolumn-css3-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-messaging-mms-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>123</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>123</total_tcn>
+    <pkg_name>mobile/tct-messaging-mms-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-workers-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>85</auto_tcn>
+    <manual_tcn>1</manual_tcn>
+    <total_tcn>86</total_tcn>
+    <pkg_name>mobile/tct-workers-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-transitions-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>26</auto_tcn>
+    <manual_tcn>5</manual_tcn>
+    <total_tcn>31</total_tcn>
+    <pkg_name>common/tct-transitions-css3-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-namespace-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>23</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>23</total_tcn>
+    <pkg_name>common/tct-namespace-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-messaging-email-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>308</auto_tcn>
+    <manual_tcn>1</manual_tcn>
+    <total_tcn>309</total_tcn>
+    <pkg_name>mobile/tct-messaging-email-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-2dtransforms-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>34</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>34</total_tcn>
+    <pkg_name>common/tct-2dtransforms-css3-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-time-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>470</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>470</total_tcn>
+    <pkg_name>mobile/tct-time-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-forms-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>151</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>151</total_tcn>
+    <pkg_name>mobile/tct-forms-html5-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-capability-tests" launcher="WRTLauncher" category="Compliance">
+    <auto_tcn>15</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>15</total_tcn>
+    <pkg_name>common/tct-capability-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-fileapi-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>98</auto_tcn>
+    <manual_tcn>3</manual_tcn>
+    <total_tcn>101</total_tcn>
+    <pkg_name>mobile/tct-fileapi-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-mediacapture-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>7</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>7</total_tcn>
+    <pkg_name>common/tct-mediacapture-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-ext01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">
+    <auto_tcn>3</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>3</total_tcn>
+    <pkg_name>mobile/tct-ext01-wrt-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-exif-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>64</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>64</total_tcn>
+    <pkg_name>common/tct-exif-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-csp-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>133</auto_tcn>
+    <manual_tcn>78</manual_tcn>
+    <total_tcn>211</total_tcn>
+    <pkg_name>mobile/tct-csp-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-privilege-wrt-tests" category="Web Runtime">
+    <auto_tcn>155</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>155</total_tcn>
+    <pkg_name>mobile/tct-privilege-wrt-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-mediakey-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>11</auto_tcn>
+    <manual_tcn>4</manual_tcn>
+    <total_tcn>15</total_tcn>
+    <pkg_name>mobile/tct-mediakey-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-deviceorientation-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>37</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>37</total_tcn>
+    <pkg_name>mobile/tct-deviceorientation-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-webmessaging-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>176</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>176</total_tcn>
+    <pkg_name>mobile/tct-webmessaging-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-package-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>54</auto_tcn>
+    <manual_tcn>12</manual_tcn>
+    <total_tcn>66</total_tcn>
+    <pkg_name>common/tct-package-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-notification-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>93</auto_tcn>
+    <manual_tcn>1</manual_tcn>
+    <total_tcn>94</total_tcn>
+    <pkg_name>mobile/tct-notification-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-fmradio-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>67</auto_tcn>
+    <manual_tcn>7</manual_tcn>
+    <total_tcn>74</total_tcn>
+    <pkg_name>mobile/tct-fmradio-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-rt01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">
+    <auto_tcn>12</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>12</total_tcn>
+    <pkg_name>common/tct-rt01-wrt-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-appcache-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>36</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>36</total_tcn>
+    <pkg_name>mobile/tct-appcache-html5-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-filesystemapi-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>208</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>208</total_tcn>
+    <pkg_name>mobile/tct-filesystemapi-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-svg-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>3</auto_tcn>
+    <manual_tcn>9</manual_tcn>
+    <total_tcn>12</total_tcn>
+    <pkg_name>common/tct-svg-html5-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-websocket-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>270</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>270</total_tcn>
+    <pkg_name>mobile/tct-websocket-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-flexiblebox-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>25</auto_tcn>
+    <manual_tcn>28</manual_tcn>
+    <total_tcn>53</total_tcn>
+    <pkg_name>common/tct-flexiblebox-css3-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-dnd-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>6</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>6</total_tcn>
+    <pkg_name>mobile/tct-dnd-html5-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-extra-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>548</auto_tcn>
+    <manual_tcn>25</manual_tcn>
+    <total_tcn>573</total_tcn>
+    <pkg_name>mobile/tct-extra-html5-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-fullscreen-nonw3c-tests" launcher="WRTLauncher" category="Supplementary APIs">
+    <auto_tcn>16</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>16</total_tcn>
+    <pkg_name>mobile/tct-fullscreen-nonw3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-colors-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>46</auto_tcn>
+    <manual_tcn>29</manual_tcn>
+    <total_tcn>75</total_tcn>
+    <pkg_name>common/tct-colors-css3-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-indexeddb-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>400</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>400</total_tcn>
+    <pkg_name>mobile/tct-indexeddb-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-sandbox-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>72</auto_tcn>
+    <manual_tcn>1</manual_tcn>
+    <total_tcn>73</total_tcn>
+    <pkg_name>common/tct-sandbox-html5-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-networkbearerselection-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>24</auto_tcn>
+    <manual_tcn>1</manual_tcn>
+    <total_tcn>25</total_tcn>
+    <pkg_name>mobile/tct-networkbearerselection-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-push-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>41</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>41</total_tcn>
+    <pkg_name>common/tct-push-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-messageport-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>48</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>48</total_tcn>
+    <pkg_name>mobile/tct-messageport-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-browserstate-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>3</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>3</total_tcn>
+    <pkg_name>mobile/tct-browserstate-html5-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-cors-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>10</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>10</total_tcn>
+    <pkg_name>common/tct-cors-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-xmlhttprequest-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>262</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>262</total_tcn>
+    <pkg_name>mobile/tct-xmlhttprequest-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-navigationtiming-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>45</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>45</total_tcn>
+    <pkg_name>mobile/tct-navigationtiming-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-typedarrays-nonw3c-tests" launcher="WRTLauncher" category="Supplementary APIs">
+    <auto_tcn>80</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>80</total_tcn>
+    <pkg_name>common/tct-typedarrays-nonw3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-animations-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>24</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>24</total_tcn>
+    <pkg_name>common/tct-animations-css3-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-badge-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>26</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>26</total_tcn>
+    <pkg_name>mobile/tct-badge-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-nfc-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>195</auto_tcn>
+    <manual_tcn>35</manual_tcn>
+    <total_tcn>230</total_tcn>
+    <pkg_name>mobile/tct-nfc-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-pagevisibility-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>18</auto_tcn>
+    <manual_tcn>2</manual_tcn>
+    <total_tcn>20</total_tcn>
+    <pkg_name>mobile/tct-pagevisibility-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-contact-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>441</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>441</total_tcn>
+    <pkg_name>mobile/tct-contact-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-content-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>245</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>245</total_tcn>
+    <pkg_name>common/tct-content-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-gumallow-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>6</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>6</total_tcn>
+    <pkg_name>common/tct-gumallow-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-notification-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>14</auto_tcn>
+    <manual_tcn>3</manual_tcn>
+    <total_tcn>17</total_tcn>
+    <pkg_name>mobile/tct-notification-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-sp01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">
+    <auto_tcn>4</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>4</total_tcn>
+    <pkg_name>common/tct-sp01-wrt-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-widget02-w3c-tests" category="W3C/HTML5 APIs">
+    <auto_tcn>68</auto_tcn>
+    <manual_tcn>82</manual_tcn>
+    <total_tcn>150</total_tcn>
+    <pkg_name>mobile/tct-widget02-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-websetting-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>22</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>22</total_tcn>
+    <pkg_name>mobile/tct-websetting-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-audio-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>333</auto_tcn>
+    <manual_tcn>1</manual_tcn>
+    <total_tcn>334</total_tcn>
+    <pkg_name>mobile/tct-audio-html5-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-screenorientation-w3c-tests" launcher="xwalk" category="W3C/HTML5 APIs">
+    <auto_tcn>17</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>17</total_tcn>
+    <pkg_name>mobile/tct-screenorientation-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-rt02-wrt-tests" category="Web Runtime">
+    <auto_tcn>3</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>3</total_tcn>
+    <pkg_name>common/tct-rt02-wrt-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-sp02-wrt-tests" category="Web Runtime">
+    <auto_tcn>1</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>1</total_tcn>
+    <pkg_name>common/tct-sp02-wrt-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-sound-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>52</auto_tcn>
+    <manual_tcn>8</manual_tcn>
+    <total_tcn>60</total_tcn>
+    <pkg_name>mobile/tct-sound-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-ext02-wrt-tests" category="Web Runtime">
+    <auto_tcn>8</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>8</total_tcn>
+    <pkg_name>common/tct-ext02-wrt-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-application-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>184</auto_tcn>
+    <manual_tcn>8</manual_tcn>
+    <total_tcn>192</total_tcn>
+    <pkg_name>mobile/tct-application-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-bluetooth-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>257</auto_tcn>
+    <manual_tcn>142</manual_tcn>
+    <total_tcn>399</total_tcn>
+    <pkg_name>mobile/tct-bluetooth-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-humanactivitymonitor-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>61</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>61</total_tcn>
+    <pkg_name>mobile/tct-humanactivitymonitor-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-fonts-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>11</auto_tcn>
+    <manual_tcn>131</manual_tcn>
+    <total_tcn>142</total_tcn>
+    <pkg_name>common/tct-fonts-css3-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-speech-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>40</auto_tcn>
+    <manual_tcn>1</manual_tcn>
+    <total_tcn>41</total_tcn>
+    <pkg_name>common/tct-speech-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-security-tcs-tests" launcher="WRTLauncher" category="Compliance">
+    <auto_tcn>3</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>3</total_tcn>
+    <pkg_name>common/tct-security-tcs-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-ui01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">
+    <auto_tcn>30</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>30</total_tcn>
+    <pkg_name>mobile/tct-ui01-wrt-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-animationtiming-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>11</auto_tcn>
+    <manual_tcn>7</manual_tcn>
+    <total_tcn>18</total_tcn>
+    <pkg_name>common/tct-animationtiming-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-selectorslevel2-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>30</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>30</total_tcn>
+    <pkg_name>common/tct-selectorslevel2-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-wgtapi01-w3c-tests" launcher="WRTLauncher -iu" category="W3C/HTML5 APIs">
+    <auto_tcn>107</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>107</total_tcn>
+    <pkg_name>common/tct-wgtapi01-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-inputdevice-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>19</auto_tcn>
+    <manual_tcn>1</manual_tcn>
+    <total_tcn>20</total_tcn>
+    <pkg_name>mobile/tct-inputdevice-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-webaudio-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>422</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>422</total_tcn>
+    <pkg_name>mobile/tct-webaudio-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-filewriterapi-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>106</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>106</total_tcn>
+    <pkg_name>mobile/tct-filewriterapi-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-sensor-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>119</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>119</total_tcn>
+    <pkg_name>mobile/tct-sensor-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-secureelement-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>71</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>71</total_tcn>
+    <pkg_name>mobile/tct-secureelement-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-power-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>50</auto_tcn>
+    <manual_tcn>6</manual_tcn>
+    <total_tcn>56</total_tcn>
+    <pkg_name>mobile/tct-power-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-appwgt-wrt-tests" category="Web Runtime">
+    <auto_tcn>7</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>7</total_tcn>
+    <pkg_name>common/tct-appwgt-wrt-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-privilege-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>65</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>65</total_tcn>
+    <pkg_name>common/tct-privilege-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-alarm-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>61</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>61</total_tcn>
+    <pkg_name>common/tct-alarm-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-touchevent-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>16</auto_tcn>
+    <manual_tcn>7</manual_tcn>
+    <total_tcn>23</total_tcn>
+    <pkg_name>mobile/tct-touchevent-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-wgtapi02-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>0</auto_tcn>
+    <manual_tcn>34</manual_tcn>
+    <total_tcn>34</total_tcn>
+    <pkg_name>common/tct-wgtapi02-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-archive-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>106</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>106</total_tcn>
+    <pkg_name>common/tct-archive-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-account-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>89</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>89</total_tcn>
+    <pkg_name>mobile/tct-account-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-tizen-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>81</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>81</total_tcn>
+    <pkg_name>common/tct-tizen-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-widget01-w3c-tests" launcher="WRTLauncher -iu" category="W3C/HTML5 APIs">
+    <auto_tcn>155</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>155</total_tcn>
+    <pkg_name>mobile/tct-widget01-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-bookmark-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>36</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>36</total_tcn>
+    <pkg_name>mobile/tct-bookmark-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-3dtransforms-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>32</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>32</total_tcn>
+    <pkg_name>common/tct-3dtransforms-css3-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-geoallow-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>208</auto_tcn>
+    <manual_tcn>3</manual_tcn>
+    <total_tcn>211</total_tcn>
+    <pkg_name>mobile/tct-geoallow-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-calendar-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>354</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>354</total_tcn>
+    <pkg_name>mobile/tct-calendar-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-sessionhistory-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>148</auto_tcn>
+    <manual_tcn>1</manual_tcn>
+    <total_tcn>149</total_tcn>
+    <pkg_name>common/tct-sessionhistory-html5-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-datacontrol-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>113</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>113</total_tcn>
+    <pkg_name>mobile/tct-datacontrol-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-appcontrol-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>5</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>5</total_tcn>
+    <pkg_name>mobile/tct-appcontrol-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-callhistory-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>80</auto_tcn>
+    <manual_tcn>27</manual_tcn>
+    <total_tcn>107</total_tcn>
+    <pkg_name>mobile/tct-callhistory-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-geodeny-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>0</auto_tcn>
+    <manual_tcn>3</manual_tcn>
+    <total_tcn>3</total_tcn>
+    <pkg_name>mobile/tct-geodeny-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-canvas-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>846</auto_tcn>
+    <manual_tcn>18</manual_tcn>
+    <total_tcn>864</total_tcn>
+    <pkg_name>common/tct-canvas-html5-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-ui-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>43</auto_tcn>
+    <manual_tcn>1</manual_tcn>
+    <total_tcn>44</total_tcn>
+    <pkg_name>common/tct-ui-css3-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-testconfig" launcher="WRTLauncher">
+    <auto_tcn>0</auto_tcn>
+    <manual_tcn>20</manual_tcn>
+    <total_tcn>20</total_tcn>
+    <pkg_name>common/tct-testconfig-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-selectorslevel1-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>78</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>78</total_tcn>
+    <pkg_name>common/tct-selectorslevel1-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-sse-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>68</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>68</total_tcn>
+    <pkg_name>mobile/tct-sse-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-widgetpolicy-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>0</auto_tcn>
+    <manual_tcn>33</manual_tcn>
+    <total_tcn>33</total_tcn>
+    <pkg_name>common/tct-widgetpolicy-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-batterystatus-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>23</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>23</total_tcn>
+    <pkg_name>mobile/tct-batterystatus-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-mediacontroller-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>162</auto_tcn>
+    <manual_tcn>3</manual_tcn>
+    <total_tcn>165</total_tcn>
+    <pkg_name>mobile/tct-mediacontroller-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-webuifw-tests03" category="Web UI Framework">
+    <auto_tcn>179</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>179</total_tcn>
+    <pkg_name>mobile/tct-webuifw-tests03-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-maxLength-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">
+    <auto_tcn>14</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>14</total_tcn>
+    <pkg_name>common/tct-maxLength-wrt-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-webuifw-tests04" category="Web UI Framework">
+    <auto_tcn>375</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>375</total_tcn>
+    <pkg_name>mobile/tct-webuifw-tests04-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-systeminfo-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>304</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>304</total_tcn>
+    <pkg_name>mobile/tct-systeminfo-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-webuifw-tests05" category="Web UI Framework">
+    <auto_tcn>322</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>322</total_tcn>
+    <pkg_name>mobile/tct-webuifw-tests05-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-filesystem-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>289</auto_tcn>
+    <manual_tcn>3</manual_tcn>
+    <total_tcn>292</total_tcn>
+    <pkg_name>mobile/tct-filesystem-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-webuifw-tests06" category="Web UI Framework">
+    <auto_tcn>98</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>98</total_tcn>
+    <pkg_name>mobile/tct-webuifw-tests06-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-webuifw-tests01" category="Web UI Framework">
+    <auto_tcn>355</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>355</total_tcn>
+    <pkg_name>mobile/tct-webuifw-tests01-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-webuifw-tests02" category="Web UI Framework">
+    <auto_tcn>455</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>455</total_tcn>
+    <pkg_name>mobile/tct-webuifw-tests02-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-vibration-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>2</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>2</total_tcn>
+    <pkg_name>mobile/tct-vibration-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-messaging-sms-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>184</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>184</total_tcn>
+    <pkg_name>mobile/tct-messaging-sms-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-text-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>27</auto_tcn>
+    <manual_tcn>15</manual_tcn>
+    <total_tcn>42</total_tcn>
+    <pkg_name>common/tct-text-css3-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-stab-wrt-tests" category="Web Runtime">
+    <auto_tcn>1</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>1</total_tcn>
+    <pkg_name>common/tct-stab-wrt-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-webstorage-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>177</auto_tcn>
+    <manual_tcn>4</manual_tcn>
+    <total_tcn>181</total_tcn>
+    <pkg_name>common/tct-webstorage-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-behavior-tests">
+    <auto_tcn>0</auto_tcn>
+    <manual_tcn>30</manual_tcn>
+    <total_tcn>30</total_tcn>
+    <pkg_name>mobile/tct-behavior-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-download-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>62</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>62</total_tcn>
+    <pkg_name>common/tct-download-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-mediaqueries-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>49</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>49</total_tcn>
+    <pkg_name>mobile/tct-mediaqueries-css3-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-systemsetting-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>33</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>33</total_tcn>
+    <pkg_name>mobile/tct-systemsetting-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-backgrounds-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>541</auto_tcn>
+    <manual_tcn>74</manual_tcn>
+    <total_tcn>615</total_tcn>
+    <pkg_name>mobile/tct-backgrounds-css3-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-video-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>361</auto_tcn>
+    <manual_tcn>4</manual_tcn>
+    <total_tcn>365</total_tcn>
+    <pkg_name>mobile/tct-video-html5-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-pm-wrt-tests" category="Web Runtime">
+    <auto_tcn>24</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>24</total_tcn>
+    <pkg_name>common/tct-pm-wrt-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-webgl-nonw3c-tests" launcher="WRTLauncher" category="Supplementary APIs">
+    <auto_tcn>889</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>889</total_tcn>
+    <pkg_name>common/tct-webgl-nonw3c-tests-2.4.zip</pkg_name>
+  </suite>
+</ns3:testplan>
+
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/plan/Full_tv.xml b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/plan/Full_tv.xml
new file mode 100644 (file)
index 0000000..194efb1
--- /dev/null
@@ -0,0 +1,653 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ns3:testplan xmlns:ns3="http://www.example.org/plan/" xmlns="" name="Full_tv" profile="tv">
+  <execute_type>All</execute_type>
+  <suite name="tct-jsenhance-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>49</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>49</total_tcn>
+    <pkg_name>common/tct-jsenhance-html5-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-multicolumn-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>141</auto_tcn>
+    <manual_tcn>18</manual_tcn>
+    <total_tcn>159</total_tcn>
+    <pkg_name>tv/tct-multicolumn-css3-tests-2.3.1.zip</pkg_name>
+  </suite>
+  <suite name="tct-workers-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>85</auto_tcn>
+    <manual_tcn>1</manual_tcn>
+    <total_tcn>86</total_tcn>
+    <pkg_name>tv/tct-workers-w3c-tests-2.3.1.zip</pkg_name>
+  </suite>
+  <suite name="tct-namespace-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>23</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>23</total_tcn>
+    <pkg_name>common/tct-namespace-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-transitions-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>26</auto_tcn>
+    <manual_tcn>5</manual_tcn>
+    <total_tcn>31</total_tcn>
+    <pkg_name>common/tct-transitions-css3-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-2dtransforms-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>34</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>34</total_tcn>
+    <pkg_name>common/tct-2dtransforms-css3-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-time-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>459</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>459</total_tcn>
+    <pkg_name>tv/tct-time-tizen-tests-2.4-1.zip</pkg_name>
+  </suite>
+  <suite name="tct-forms-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>146</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>146</total_tcn>
+    <pkg_name>tv/tct-forms-html5-tests-2.3.1.zip</pkg_name>
+  </suite>
+  <suite name="tct-capability-tests" launcher="WRTLauncher" category="Compliance">
+    <auto_tcn>15</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>15</total_tcn>
+    <pkg_name>common/tct-capability-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-fileapi-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>97</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>97</total_tcn>
+    <pkg_name>tv/tct-fileapi-w3c-tests-2.3.1.zip</pkg_name>
+  </suite>
+  <suite name="tct-mediacapture-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>7</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>7</total_tcn>
+    <pkg_name>common/tct-mediacapture-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-ext01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">
+    <auto_tcn>2</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>2</total_tcn>
+    <pkg_name>tv/tct-ext01-wrt-tests-2.3-1.zip</pkg_name>
+  </suite>
+  <suite name="tct-tv-channel-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>123</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>123</total_tcn>
+    <pkg_name>tv/tct-tv-channel-tizen-tests-2.4-1.zip</pkg_name>
+  </suite>
+  <suite name="tct-exif-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>63</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>63</total_tcn>
+    <pkg_name>common/tct-exif-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-csp-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>133</auto_tcn>
+    <manual_tcn>78</manual_tcn>
+    <total_tcn>211</total_tcn>
+    <pkg_name>common/tct-csp-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-mediakey-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>11</auto_tcn>
+    <manual_tcn>4</manual_tcn>
+    <total_tcn>15</total_tcn>
+    <pkg_name>common/tct-mediakey-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-deviceorientation-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>37</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>37</total_tcn>
+    <pkg_name>common/tct-deviceorientation-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-webmessaging-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>175</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>175</total_tcn>
+    <pkg_name>tv/tct-webmessaging-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-package-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>54</auto_tcn>
+    <manual_tcn>12</manual_tcn>
+    <total_tcn>66</total_tcn>
+    <pkg_name>common/tct-package-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-appcache-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>36</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>36</total_tcn>
+    <pkg_name>tv/tct-appcache-html5-tests-2.3.1.zip</pkg_name>
+  </suite>
+  <suite name="tct-rt01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">
+    <auto_tcn>12</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>12</total_tcn>
+    <pkg_name>common/tct-rt01-wrt-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-svg-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>3</auto_tcn>
+    <manual_tcn>9</manual_tcn>
+    <total_tcn>12</total_tcn>
+    <pkg_name>common/tct-svg-html5-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-flexiblebox-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>25</auto_tcn>
+    <manual_tcn>28</manual_tcn>
+    <total_tcn>53</total_tcn>
+    <pkg_name>common/tct-flexiblebox-css3-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-websocket-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>268</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>268</total_tcn>
+    <pkg_name>tv/tct-websocket-w3c-tests-2.3.1.zip</pkg_name>
+  </suite>
+  <suite name="tct-extra-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>544</auto_tcn>
+    <manual_tcn>25</manual_tcn>
+    <total_tcn>569</total_tcn>
+    <pkg_name>tv/tct-extra-html5-tests-2.3.1.zip</pkg_name>
+  </suite>
+  <suite name="tct-dnd-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>6</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>6</total_tcn>
+    <pkg_name>common/tct-dnd-html5-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-fullscreen-nonw3c-tests" launcher="WRTLauncher" category="Supplementary APIs">
+    <auto_tcn>16</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>16</total_tcn>
+    <pkg_name>tv/tct-fullscreen-nonw3c-tests-2.3.1.zip</pkg_name>
+  </suite>
+  <suite name="tct-colors-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>46</auto_tcn>
+    <manual_tcn>29</manual_tcn>
+    <total_tcn>75</total_tcn>
+    <pkg_name>common/tct-colors-css3-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-indexeddb-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>391</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>391</total_tcn>
+    <pkg_name>tv/tct-indexeddb-w3c-tests-2.3.1.zip</pkg_name>
+  </suite>
+  <suite name="tct-sandbox-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>72</auto_tcn>
+    <manual_tcn>1</manual_tcn>
+    <total_tcn>73</total_tcn>
+    <pkg_name>common/tct-sandbox-html5-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-messageport-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>48</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>48</total_tcn>
+    <pkg_name>common/tct-messageport-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-browserstate-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>3</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>3</total_tcn>
+    <pkg_name>tv/tct-browserstate-html5-tests-2.3.1.zip</pkg_name>
+  </suite>
+  <suite name="tct-cors-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>10</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>10</total_tcn>
+    <pkg_name>common/tct-cors-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-xmlhttprequest-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>202</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>202</total_tcn>
+    <pkg_name>tv/tct-xmlhttprequest-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-navigationtiming-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>45</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>45</total_tcn>
+    <pkg_name>tv/tct-navigationtiming-w3c-tests-2.3.1.zip</pkg_name>
+  </suite>
+  <suite name="tct-typedarrays-nonw3c-tests" launcher="WRTLauncher" category="Supplementary APIs">
+    <auto_tcn>80</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>80</total_tcn>
+    <pkg_name>common/tct-typedarrays-nonw3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-animations-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>24</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>24</total_tcn>
+    <pkg_name>common/tct-animations-css3-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-badge-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>26</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>26</total_tcn>
+    <pkg_name>common/tct-badge-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-pagevisibility-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>18</auto_tcn>
+    <manual_tcn>2</manual_tcn>
+    <total_tcn>20</total_tcn>
+    <pkg_name>tv/tct-pagevisibility-w3c-tests-2.3.1.zip</pkg_name>
+  </suite>
+  <suite name="tct-content-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>230</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>230</total_tcn>
+    <pkg_name>common/tct-content-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-gumallow-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>6</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>6</total_tcn>
+    <pkg_name>common/tct-gumallow-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-notification-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>14</auto_tcn>
+    <manual_tcn>3</manual_tcn>
+    <total_tcn>17</total_tcn>
+    <pkg_name>tv/tct-notification-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-tv-displaycontrol-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>20</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>20</total_tcn>
+    <pkg_name>tv/tct-tv-displaycontrol-tizen-tests-2.4-1.zip</pkg_name>
+  </suite>
+  <suite name="tct-sp01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">
+    <auto_tcn>4</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>4</total_tcn>
+    <pkg_name>common/tct-sp01-wrt-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-widget02-w3c-tests" category="W3C/HTML5 APIs">
+    <auto_tcn>18</auto_tcn>
+    <manual_tcn>51</manual_tcn>
+    <total_tcn>69</total_tcn>
+    <pkg_name>tv/tct-widget02-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-websetting-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>22</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>22</total_tcn>
+    <pkg_name>tv/tct-websetting-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-audio-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>338</auto_tcn>
+    <manual_tcn>1</manual_tcn>
+    <total_tcn>339</total_tcn>
+    <pkg_name>common/tct-audio-html5-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-screenorientation-w3c-tests" launcher="xwalk" category="W3C/HTML5 APIs">
+    <auto_tcn>17</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>17</total_tcn>
+    <pkg_name>tv/tct-screenorientation-w3c-tests-2.3.1.zip</pkg_name>
+  </suite>
+  <suite name="tct-sp02-wrt-tests" category="Web Runtime">
+    <auto_tcn>1</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>1</total_tcn>
+    <pkg_name>common/tct-sp02-wrt-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-sound-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>52</auto_tcn>
+    <manual_tcn>8</manual_tcn>
+    <total_tcn>60</total_tcn>
+    <pkg_name>common/tct-sound-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-rt02-wrt-tests" category="Web Runtime">
+    <auto_tcn>3</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>3</total_tcn>
+    <pkg_name>common/tct-rt02-wrt-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-ext02-wrt-tests" category="Web Runtime">
+    <auto_tcn>8</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>8</total_tcn>
+    <pkg_name>common/tct-ext02-wrt-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-application-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>159</auto_tcn>
+    <manual_tcn>6</manual_tcn>
+    <total_tcn>165</total_tcn>
+    <pkg_name>tv/tct-application-tizen-tests-2.3-1.zip</pkg_name>
+  </suite>
+  <suite name="tct-humanactivitymonitor-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>47</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>47</total_tcn>
+    <pkg_name>common/tct-humanactivitymonitor-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-fonts-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>11</auto_tcn>
+    <manual_tcn>131</manual_tcn>
+    <total_tcn>142</total_tcn>
+    <pkg_name>common/tct-fonts-css3-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-security-tcs-tests" launcher="WRTLauncher" category="Compliance">
+    <auto_tcn>3</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>3</total_tcn>
+    <pkg_name>common/tct-security-tcs-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-speech-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>40</auto_tcn>
+    <manual_tcn>1</manual_tcn>
+    <total_tcn>41</total_tcn>
+    <pkg_name>common/tct-speech-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-ui01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">
+    <auto_tcn>11</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>11</total_tcn>
+    <pkg_name>tv/tct-ui01-wrt-tests-2.4-1.zip</pkg_name>
+  </suite>
+  <suite name="tct-dynamicbox-wrt-tests" category="Web Runtime">
+    <auto_tcn>17</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>17</total_tcn>
+    <pkg_name>common/tct-dynamicbox-wrt-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-animationtiming-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>11</auto_tcn>
+    <manual_tcn>7</manual_tcn>
+    <total_tcn>18</total_tcn>
+    <pkg_name>common/tct-animationtiming-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-tv-window-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>70</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>70</total_tcn>
+    <pkg_name>tv/tct-tv-window-tizen-tests-2.4-1.zip</pkg_name>
+  </suite>
+  <suite name="tct-selectorslevel2-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>30</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>30</total_tcn>
+    <pkg_name>common/tct-selectorslevel2-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-wgtapi01-w3c-tests" launcher="WRTLauncher -iu" category="W3C/HTML5 APIs">
+    <auto_tcn>107</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>107</total_tcn>
+    <pkg_name>common/tct-wgtapi01-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-webaudio-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>422</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>422</total_tcn>
+    <pkg_name>tv/tct-webaudio-w3c-tests-2.3.1.zip</pkg_name>
+  </suite>
+  <suite name="tct-sensor-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>100</auto_tcn>
+    <manual_tcn>19</manual_tcn>
+    <total_tcn>119</total_tcn>
+    <pkg_name>common/tct-sensor-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-power-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>50</auto_tcn>
+    <manual_tcn>6</manual_tcn>
+    <total_tcn>56</total_tcn>
+    <pkg_name>common/tct-power-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-tv-inputdevice-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>23</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>23</total_tcn>
+    <pkg_name>tv/tct-tv-inputdevice-tizen-tests-2.4-1.zip</pkg_name>
+  </suite>
+  <suite name="tct-appwgt-wrt-tests" category="Web Runtime">
+    <auto_tcn>7</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>7</total_tcn>
+    <pkg_name>common/tct-appwgt-wrt-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-privilege-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>70</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>70</total_tcn>
+    <pkg_name>common/tct-privilege-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-alarm-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>61</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>61</total_tcn>
+    <pkg_name>common/tct-alarm-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-touchevent-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>16</auto_tcn>
+    <manual_tcn>7</manual_tcn>
+    <total_tcn>23</total_tcn>
+    <pkg_name>common/tct-touchevent-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-tv-audiocontrol-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>61</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>61</total_tcn>
+    <pkg_name>tv/tct-tv-audiocontrol-tizen-tests-2.4-1.zip</pkg_name>
+  </suite>
+  <suite name="tct-wgtapi02-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>0</auto_tcn>
+    <manual_tcn>34</manual_tcn>
+    <total_tcn>34</total_tcn>
+    <pkg_name>common/tct-wgtapi02-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-archive-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>106</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>106</total_tcn>
+    <pkg_name>common/tct-archive-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-tizen-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>81</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>81</total_tcn>
+    <pkg_name>common/tct-tizen-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-widget01-w3c-tests" launcher="WRTLauncher -iu" category="W3C/HTML5 APIs">
+    <auto_tcn>75</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>75</total_tcn>
+    <pkg_name>tv/tct-widget01-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-3dtransforms-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>32</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>32</total_tcn>
+    <pkg_name>common/tct-3dtransforms-css3-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-geoallow-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>209</auto_tcn>
+    <manual_tcn>3</manual_tcn>
+    <total_tcn>212</total_tcn>
+    <pkg_name>common/tct-geoallow-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-sessionhistory-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>148</auto_tcn>
+    <manual_tcn>1</manual_tcn>
+    <total_tcn>149</total_tcn>
+    <pkg_name>common/tct-sessionhistory-html5-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-geodeny-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>0</auto_tcn>
+    <manual_tcn>3</manual_tcn>
+    <total_tcn>3</total_tcn>
+    <pkg_name>common/tct-geodeny-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-canvas-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>846</auto_tcn>
+    <manual_tcn>19</manual_tcn>
+    <total_tcn>865</total_tcn>
+    <pkg_name>common/tct-canvas-html5-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-ui-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>43</auto_tcn>
+    <manual_tcn>1</manual_tcn>
+    <total_tcn>44</total_tcn>
+    <pkg_name>common/tct-ui-css3-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-testconfig" launcher="WRTLauncher">
+    <auto_tcn>0</auto_tcn>
+    <manual_tcn>19</manual_tcn>
+    <total_tcn>19</total_tcn>
+    <pkg_name>common/tct-testconfig-2.3.1.zip</pkg_name>
+  </suite>
+  <suite name="tct-selectorslevel1-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>78</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>78</total_tcn>
+    <pkg_name>common/tct-selectorslevel1-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-sse-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>68</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>68</total_tcn>
+    <pkg_name>tv/tct-sse-w3c-tests-2.3.1.zip</pkg_name>
+  </suite>
+  <suite name="tct-widgetpolicy-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>0</auto_tcn>
+    <manual_tcn>33</manual_tcn>
+    <total_tcn>33</total_tcn>
+    <pkg_name>common/tct-widgetpolicy-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-batterystatus-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>23</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>23</total_tcn>
+    <pkg_name>common/tct-batterystatus-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-webuifw-tests03" category="Web UI Framework">
+    <auto_tcn>179</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>179</total_tcn>
+    <pkg_name>tv/tct-webuifw-tests03-2.3.1.zip</pkg_name>
+  </suite>
+  <suite name="tct-webuifw-tests04" category="Web UI Framework">
+    <auto_tcn>375</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>375</total_tcn>
+    <pkg_name>tv/tct-webuifw-tests04-2.3.1.zip</pkg_name>
+  </suite>
+  <suite name="tct-maxLength-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">
+    <auto_tcn>14</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>14</total_tcn>
+    <pkg_name>common/tct-maxLength-wrt-tests-2.3.1.zip</pkg_name>
+  </suite>
+  <suite name="tct-webuifw-tests05" category="Web UI Framework">
+    <auto_tcn>322</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>322</total_tcn>
+    <pkg_name>tv/tct-webuifw-tests05-2.3.1.zip</pkg_name>
+  </suite>
+  <suite name="tct-filesystem-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>291</auto_tcn>
+    <manual_tcn>3</manual_tcn>
+    <total_tcn>294</total_tcn>
+    <pkg_name>tv/tct-filesystem-tizen-tests-2.3-1.zip</pkg_name>
+  </suite>
+  <suite name="tct-systeminfo-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>276</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>276</total_tcn>
+    <pkg_name>tv/tct-systeminfo-tizen-tests-2.3-1.zip</pkg_name>
+  </suite>
+  <suite name="tct-webuifw-tests06" category="Web UI Framework">
+    <auto_tcn>98</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>98</total_tcn>
+    <pkg_name>tv/tct-webuifw-tests06-2.3.1.zip</pkg_name>
+  </suite>
+  <suite name="tct-webuifw-tests01" category="Web UI Framework">
+    <auto_tcn>355</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>355</total_tcn>
+    <pkg_name>tv/tct-webuifw-tests01-2.3.1.zip</pkg_name>
+  </suite>
+  <suite name="tct-webuifw-tests02" category="Web UI Framework">
+    <auto_tcn>455</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>455</total_tcn>
+    <pkg_name>tv/tct-webuifw-tests02-2.3.1.zip</pkg_name>
+  </suite>
+  <suite name="tct-vibration-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>2</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>2</total_tcn>
+    <pkg_name>common/tct-vibration-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-stab-wrt-tests" category="Web Runtime">
+    <auto_tcn>1</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>1</total_tcn>
+    <pkg_name>common/tct-stab-wrt-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-text-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>27</auto_tcn>
+    <manual_tcn>15</manual_tcn>
+    <total_tcn>42</total_tcn>
+    <pkg_name>common/tct-text-css3-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-behavior-tests">
+    <auto_tcn>0</auto_tcn>
+    <manual_tcn>15</manual_tcn>
+    <total_tcn>15</total_tcn>
+    <pkg_name>tv/tct-behavior-tests-2.4-1.zip</pkg_name>
+  </suite>
+  <suite name="tct-webstorage-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>177</auto_tcn>
+    <manual_tcn>4</manual_tcn>
+    <total_tcn>181</total_tcn>
+    <pkg_name>common/tct-webstorage-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-download-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>62</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>62</total_tcn>
+    <pkg_name>common/tct-download-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-mediaqueries-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>52</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>52</total_tcn>
+    <pkg_name>tv/tct-mediaqueries-css3-tests-2.3.1.zip</pkg_name>
+  </suite>
+  <suite name="tct-systemsetting-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>33</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>33</total_tcn>
+    <pkg_name>common/tct-systemsetting-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-backgrounds-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>541</auto_tcn>
+    <manual_tcn>74</manual_tcn>
+    <total_tcn>615</total_tcn>
+    <pkg_name>tv/tct-backgrounds-css3-tests-2.3.1.zip</pkg_name>
+  </suite>
+  <suite name="tct-video-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>366</auto_tcn>
+    <manual_tcn>4</manual_tcn>
+    <total_tcn>370</total_tcn>
+    <pkg_name>tv/tct-video-html5-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-pm-wrt-tests" category="Web Runtime">
+    <auto_tcn>24</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>24</total_tcn>
+    <pkg_name>common/tct-pm-wrt-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-webgl-nonw3c-tests" launcher="WRTLauncher" category="Supplementary APIs">
+    <auto_tcn>889</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>889</total_tcn>
+    <pkg_name>common/tct-webgl-nonw3c-tests-2.4.zip</pkg_name>
+  </suite>
+</ns3:testplan>
+
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/plan/Full_wearable.xml b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/plan/Full_wearable.xml
new file mode 100644 (file)
index 0000000..d950284
--- /dev/null
@@ -0,0 +1,557 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ns3:testplan xmlns:ns3="http://www.example.org/plan/" xmlns="" name="Full_wearable" profile="wearable">
+  <execute_type>All</execute_type>
+  <suite name="tct-sp01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">
+    <auto_tcn>4</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>4</total_tcn>
+    <pkg_name>common/tct-sp01-wrt-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-widget02-w3c-tests" category="W3C/HTML5 APIs">
+    <auto_tcn>68</auto_tcn>
+    <manual_tcn>63</manual_tcn>
+    <total_tcn>131</total_tcn>
+    <pkg_name>wearable/tct-widget02-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-jsenhance-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>49</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>49</total_tcn>
+    <pkg_name>common/tct-jsenhance-html5-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-audio-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>338</auto_tcn>
+    <manual_tcn>1</manual_tcn>
+    <total_tcn>339</total_tcn>
+    <pkg_name>common/tct-audio-html5-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-sp02-wrt-tests" category="Web Runtime">
+    <auto_tcn>1</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>1</total_tcn>
+    <pkg_name>common/tct-sp02-wrt-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-rt02-wrt-tests" category="Web Runtime">
+    <auto_tcn>3</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>3</total_tcn>
+    <pkg_name>common/tct-rt02-wrt-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-sound-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>52</auto_tcn>
+    <manual_tcn>8</manual_tcn>
+    <total_tcn>60</total_tcn>
+    <pkg_name>common/tct-sound-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-workers-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>85</auto_tcn>
+    <manual_tcn>1</manual_tcn>
+    <total_tcn>86</total_tcn>
+    <pkg_name>wearable/tct-workers-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-ext02-wrt-tests" category="Web Runtime">
+    <auto_tcn>8</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>8</total_tcn>
+    <pkg_name>common/tct-ext02-wrt-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-transitions-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>26</auto_tcn>
+    <manual_tcn>5</manual_tcn>
+    <total_tcn>31</total_tcn>
+    <pkg_name>common/tct-transitions-css3-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-namespace-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>23</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>23</total_tcn>
+    <pkg_name>common/tct-namespace-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-application-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>159</auto_tcn>
+    <manual_tcn>6</manual_tcn>
+    <total_tcn>165</total_tcn>
+    <pkg_name>wearable/tct-application-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-humanactivitymonitor-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>47</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>47</total_tcn>
+    <pkg_name>common/tct-humanactivitymonitor-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-bluetooth-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>214</auto_tcn>
+    <manual_tcn>44</manual_tcn>
+    <total_tcn>258</total_tcn>
+    <pkg_name>common/tct-bluetooth-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-fonts-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>11</auto_tcn>
+    <manual_tcn>131</manual_tcn>
+    <total_tcn>142</total_tcn>
+    <pkg_name>common/tct-fonts-css3-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-speech-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>40</auto_tcn>
+    <manual_tcn>1</manual_tcn>
+    <total_tcn>41</total_tcn>
+    <pkg_name>common/tct-speech-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-security-tcs-tests" launcher="WRTLauncher" category="Compliance">
+    <auto_tcn>3</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>3</total_tcn>
+    <pkg_name>common/tct-security-tcs-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-ui01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">
+    <auto_tcn>11</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>11</total_tcn>
+    <pkg_name>wearable/tct-ui01-wrt-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-dynamicbox-wrt-tests" category="Web Runtime">
+    <auto_tcn>17</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>17</total_tcn>
+    <pkg_name>common/tct-dynamicbox-wrt-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-animationtiming-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>11</auto_tcn>
+    <manual_tcn>7</manual_tcn>
+    <total_tcn>18</total_tcn>
+    <pkg_name>common/tct-animationtiming-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-selectorslevel2-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>30</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>30</total_tcn>
+    <pkg_name>common/tct-selectorslevel2-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-2dtransforms-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>34</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>34</total_tcn>
+    <pkg_name>common/tct-2dtransforms-css3-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-forms-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>146</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>146</total_tcn>
+    <pkg_name>wearable/tct-forms-html5-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-time-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>470</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>470</total_tcn>
+    <pkg_name>wearable/tct-time-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-wgtapi01-w3c-tests" launcher="WRTLauncher -iu" category="W3C/HTML5 APIs">
+    <auto_tcn>107</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>107</total_tcn>
+    <pkg_name>common/tct-wgtapi01-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-fileapi-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>98</auto_tcn>
+    <manual_tcn>3</manual_tcn>
+    <total_tcn>101</total_tcn>
+    <pkg_name>wearable/tct-fileapi-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-capability-tests" launcher="WRTLauncher" category="Compliance">
+    <auto_tcn>15</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>15</total_tcn>
+    <pkg_name>common/tct-capability-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-ext01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">
+    <auto_tcn>2</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>2</total_tcn>
+    <pkg_name>wearable/tct-ext01-wrt-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-mediacapture-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>7</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>7</total_tcn>
+    <pkg_name>common/tct-mediacapture-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-exif-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>63</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>63</total_tcn>
+    <pkg_name>common/tct-exif-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-csp-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>133</auto_tcn>
+    <manual_tcn>78</manual_tcn>
+    <total_tcn>211</total_tcn>
+    <pkg_name>common/tct-csp-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-sensor-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>119</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>119</total_tcn>
+    <pkg_name>common/tct-sensor-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-privilege-wrt-tests" category="Web Runtime">
+    <auto_tcn>142</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>142</total_tcn>
+    <pkg_name>wearable/tct-privilege-wrt-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-power-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>50</auto_tcn>
+    <manual_tcn>6</manual_tcn>
+    <total_tcn>56</total_tcn>
+    <pkg_name>common/tct-power-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-appwgt-wrt-tests" category="Web Runtime">
+    <auto_tcn>7</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>7</total_tcn>
+    <pkg_name>common/tct-appwgt-wrt-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-privilege-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>66</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>66</total_tcn>
+    <pkg_name>common/tct-privilege-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-mediakey-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>11</auto_tcn>
+    <manual_tcn>4</manual_tcn>
+    <total_tcn>15</total_tcn>
+    <pkg_name>common/tct-mediakey-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-alarm-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>61</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>61</total_tcn>
+    <pkg_name>common/tct-alarm-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-touchevent-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>16</auto_tcn>
+    <manual_tcn>7</manual_tcn>
+    <total_tcn>23</total_tcn>
+    <pkg_name>common/tct-touchevent-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-wgtapi02-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>0</auto_tcn>
+    <manual_tcn>34</manual_tcn>
+    <total_tcn>34</total_tcn>
+    <pkg_name>common/tct-wgtapi02-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-deviceorientation-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>37</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>37</total_tcn>
+    <pkg_name>common/tct-deviceorientation-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-archive-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>106</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>106</total_tcn>
+    <pkg_name>common/tct-archive-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-webmessaging-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>175</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>175</total_tcn>
+    <pkg_name>wearable/tct-webmessaging-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-package-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>54</auto_tcn>
+    <manual_tcn>12</manual_tcn>
+    <total_tcn>66</total_tcn>
+    <pkg_name>common/tct-package-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-notification-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>85</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>85</total_tcn>
+    <pkg_name>wearable/tct-notification-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-tizen-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>81</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>81</total_tcn>
+    <pkg_name>common/tct-tizen-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-rt01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">
+    <auto_tcn>12</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>12</total_tcn>
+    <pkg_name>common/tct-rt01-wrt-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-widget01-w3c-tests" launcher="WRTLauncher -iu" category="W3C/HTML5 APIs">
+    <auto_tcn>155</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>155</total_tcn>
+    <pkg_name>wearable/tct-widget01-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-svg-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>3</auto_tcn>
+    <manual_tcn>9</manual_tcn>
+    <total_tcn>12</total_tcn>
+    <pkg_name>common/tct-svg-html5-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-3dtransforms-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>32</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>32</total_tcn>
+    <pkg_name>common/tct-3dtransforms-css3-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-geoallow-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>209</auto_tcn>
+    <manual_tcn>3</manual_tcn>
+    <total_tcn>212</total_tcn>
+    <pkg_name>common/tct-geoallow-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-sessionhistory-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>148</auto_tcn>
+    <manual_tcn>1</manual_tcn>
+    <total_tcn>149</total_tcn>
+    <pkg_name>common/tct-sessionhistory-html5-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-websocket-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>268</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>268</total_tcn>
+    <pkg_name>wearable/tct-websocket-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-flexiblebox-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>25</auto_tcn>
+    <manual_tcn>28</manual_tcn>
+    <total_tcn>53</total_tcn>
+    <pkg_name>common/tct-flexiblebox-css3-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-extra-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>544</auto_tcn>
+    <manual_tcn>25</manual_tcn>
+    <total_tcn>569</total_tcn>
+    <pkg_name>wearable/tct-extra-html5-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-dnd-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>6</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>6</total_tcn>
+    <pkg_name>common/tct-dnd-html5-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-geodeny-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>0</auto_tcn>
+    <manual_tcn>3</manual_tcn>
+    <total_tcn>3</total_tcn>
+    <pkg_name>common/tct-geodeny-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-colors-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>46</auto_tcn>
+    <manual_tcn>29</manual_tcn>
+    <total_tcn>75</total_tcn>
+    <pkg_name>common/tct-colors-css3-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-indexeddb-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>391</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>391</total_tcn>
+    <pkg_name>wearable/tct-indexeddb-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-sandbox-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>72</auto_tcn>
+    <manual_tcn>1</manual_tcn>
+    <total_tcn>73</total_tcn>
+    <pkg_name>common/tct-sandbox-html5-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-camera-nonw3c-tests" launcher="WRTLauncher" category="Supplementary APIs">
+    <auto_tcn>83</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>83</total_tcn>
+    <pkg_name>wearable/tct-camera-nonw3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-ui-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>43</auto_tcn>
+    <manual_tcn>1</manual_tcn>
+    <total_tcn>44</total_tcn>
+    <pkg_name>common/tct-ui-css3-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-canvas-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>846</auto_tcn>
+    <manual_tcn>18</manual_tcn>
+    <total_tcn>864</total_tcn>
+    <pkg_name>common/tct-canvas-html5-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-messageport-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>48</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>48</total_tcn>
+    <pkg_name>common/tct-messageport-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-testconfig" launcher="WRTLauncher">
+    <auto_tcn>0</auto_tcn>
+    <manual_tcn>19</manual_tcn>
+    <total_tcn>19</total_tcn>
+    <pkg_name>common/tct-testconfig-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-selectorslevel1-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>78</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>78</total_tcn>
+    <pkg_name>common/tct-selectorslevel1-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-widgetpolicy-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>0</auto_tcn>
+    <manual_tcn>34</manual_tcn>
+    <total_tcn>34</total_tcn>
+    <pkg_name>common/tct-widgetpolicy-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-cors-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>10</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>10</total_tcn>
+    <pkg_name>common/tct-cors-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-batterystatus-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>23</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>23</total_tcn>
+    <pkg_name>common/tct-batterystatus-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-xmlhttprequest-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>202</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>202</total_tcn>
+    <pkg_name>wearable/tct-xmlhttprequest-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-maxLength-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">
+    <auto_tcn>14</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>14</total_tcn>
+    <pkg_name>common/tct-maxLength-wrt-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-systeminfo-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>281</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>281</total_tcn>
+    <pkg_name>wearable/tct-systeminfo-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-filesystem-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>289</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>289</total_tcn>
+    <pkg_name>wearable/tct-filesystem-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-typedarrays-nonw3c-tests" launcher="WRTLauncher" category="Supplementary APIs">
+    <auto_tcn>80</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>80</total_tcn>
+    <pkg_name>common/tct-typedarrays-nonw3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-animations-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>24</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>24</total_tcn>
+    <pkg_name>common/tct-animations-css3-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-badge-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>26</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>26</total_tcn>
+    <pkg_name>common/tct-badge-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-vibration-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>2</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>2</total_tcn>
+    <pkg_name>common/tct-vibration-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-pagevisibility-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>18</auto_tcn>
+    <manual_tcn>2</manual_tcn>
+    <total_tcn>20</total_tcn>
+    <pkg_name>wearable/tct-pagevisibility-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-stab-wrt-tests" category="Web Runtime">
+    <auto_tcn>1</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>1</total_tcn>
+    <pkg_name>common/tct-stab-wrt-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-text-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>27</auto_tcn>
+    <manual_tcn>15</manual_tcn>
+    <total_tcn>42</total_tcn>
+    <pkg_name>common/tct-text-css3-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-behavior-tests">
+    <auto_tcn>0</auto_tcn>
+    <manual_tcn>19</manual_tcn>
+    <total_tcn>19</total_tcn>
+    <pkg_name>wearable/tct-behavior-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-webstorage-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>177</auto_tcn>
+    <manual_tcn>4</manual_tcn>
+    <total_tcn>181</total_tcn>
+    <pkg_name>common/tct-webstorage-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-webuifw-tests" category="Web UI Framework">
+    <auto_tcn>524</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>524</total_tcn>
+    <pkg_name>wearable/tct-webuifw-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-download-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>62</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>62</total_tcn>
+    <pkg_name>common/tct-download-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-mediaqueries-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>52</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>52</total_tcn>
+    <pkg_name>wearable/tct-mediaqueries-css3-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-content-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>230</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>230</total_tcn>
+    <pkg_name>common/tct-content-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-gumallow-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>6</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>6</total_tcn>
+    <pkg_name>common/tct-gumallow-w3c-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-systemsetting-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">
+    <auto_tcn>33</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>33</total_tcn>
+    <pkg_name>common/tct-systemsetting-tizen-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-video-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>366</auto_tcn>
+    <manual_tcn>4</manual_tcn>
+    <total_tcn>370</total_tcn>
+    <pkg_name>wearable/tct-video-html5-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-backgrounds-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">
+    <auto_tcn>541</auto_tcn>
+    <manual_tcn>74</manual_tcn>
+    <total_tcn>615</total_tcn>
+    <pkg_name>wearable/tct-backgrounds-css3-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-pm-wrt-tests" category="Web Runtime">
+    <auto_tcn>24</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>24</total_tcn>
+    <pkg_name>common/tct-pm-wrt-tests-2.4.zip</pkg_name>
+  </suite>
+  <suite name="tct-webgl-nonw3c-tests" launcher="WRTLauncher" category="Supplementary APIs">
+    <auto_tcn>889</auto_tcn>
+    <manual_tcn>0</manual_tcn>
+    <total_tcn>889</total_tcn>
+    <pkg_name>common/tct-webgl-nonw3c-tests-2.4.zip</pkg_name>
+  </suite>
+</ns3:testplan>
+
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/script/temp b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/script/temp
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/style/application.js b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/style/application.js
new file mode 100644 (file)
index 0000000..147094f
--- /dev/null
@@ -0,0 +1,194 @@
+function getScrollTop() {
+       return f_scrollTop();
+}
+
+function f_scrollTop() {
+       return f_filterResults($(window) ? $(window).scrollTop() : 0,
+                       document.documentElement ? document.documentElement.scrollTop : 0,
+                       document.body ? document.body.scrollTop : 0);
+}
+function f_filterResults(n_win, n_docel, n_body) {
+       var n_result = n_win ? n_win : 0;
+       if (n_docel && (!n_result || (n_result > n_docel)))
+               n_result = n_docel;
+       return n_body && (!n_result || (n_result > n_body)) ? n_body : n_result;
+}
+
+function setScrollTop() {
+       $(window) ? $(window).scrollTop(0) : 0;
+       document.documentElement ? document.documentElement.scrollTop = 0 : 0;
+       document.body ? document.body.scrollTop = 0 : 0;
+}
+
+function goTopEx() {
+       $node = $('#goTopBtn');
+       if (getScrollTop() > 0) {
+               $node.show();
+       } else {
+               $node.hide();
+       }
+
+       $(window).scroll(function() {
+               if (getScrollTop() > 0) {
+                       $node.show();
+               } else {
+                       $node.hide();
+               }
+       });
+
+       $node.click(function() {
+               setScrollTop();
+       });
+}
+
+function drawRatio() {
+       $('.suite_item').each(function(i, node) {
+               drawSuiteRatio(node)
+       });
+}
+
+$(".see_all").click(function(){
+       $("#see_all").show();
+    $("#see_fail").hide();
+    $("#see_block").hide();
+    $("#see_na").hide();
+    updateToggles();
+    return false;
+});
+
+$(".see_failed").click(function(){
+       $("#see_all").hide();
+    $("#see_fail").show();
+    $("#see_block").hide();
+    $("#see_na").hide();
+    updateToggles();
+    return false;
+});
+
+$(".see_blocked").click(function(){
+       $("#see_all").hide();
+    $("#see_fail").hide();
+    $("#see_block").show();
+    $("#see_na").hide();
+    updateToggles();
+    return false;
+});
+
+$(".see_na").click(function(){
+       $("#see_all").hide();
+    $("#see_fail").hide();
+    $("#see_block").hide();
+    $("#see_na").show();
+    updateToggles();
+    return false;
+});
+
+$("a.test_case_popup").click(function(){
+       var $this = $(this);
+       Popup.show($this.attr('id'));
+    return false;
+});
+
+$(".see_capabilities").click(function(){
+       if ($('#capability_table').css('display') == 'none') {
+               $("#capability_table").show();
+       }else{
+               $("#capability_table").hide();
+       }
+    return false;
+});
+
+function drawSuiteRatio(node) {
+       arrTitle = new Array("Passed", "Failed", "Blocked", "Not Executed");
+       var $node = $(node);
+       var $total = $node.find('.total');
+       var $pass = $node.find('.pass');
+       var $fail = $node.find('.fail');
+       var $block = $node.find('.block');
+       var $na = $node.find('.na');
+       var $div = $node.find('.RatioGraphic');
+
+       var total_int = parseInt($total.text());
+       var pass_int = parseInt($pass.text());
+       var fail_int = parseInt($fail.text());
+       var block_int = parseInt($block.text());
+       var na_int = parseInt($na.text());
+
+       var pass_rate = pass_int * 100 / total_int;
+       var fail_rate = fail_int * 100 / total_int;
+       var block_rate = block_int * 100 / total_int;
+       var na_rate = na_int * 100 / total_int;
+
+       var areaWidth = 380;
+
+       var pass_width = areaWidth * pass_rate / 100;
+       var fail_width = areaWidth * fail_rate / 100;
+       var block_width = areaWidth * block_rate / 100;
+       var na_width = areaWidth * na_rate / 100;
+       
+       pass_rate = pass_rate.toFixed(2);
+       fail_rate = fail_rate.toFixed(2);
+       block_rate = block_rate.toFixed(2);
+       na_rate = na_rate.toFixed(2);
+
+       var pass_style = "padding:3px 0px 0px 0px;font-size:9pt;height:17px;text-align:center;color:white;font-weight:bold;background:url(&quot;./style/blue.jpg&quot;);"
+       var fail_style = "padding:3px 0px 0px 0px;font-size:9pt;height:17px;text-align:center;color:white;font-weight:bold;background:url(&quot;./style/red.jpg&quot;);"
+       var block_style = "padding:3px 0px 0px 0px;font-size:9pt;height:17px;text-align:center;color:white;font-weight:bold;background:url(&quot;./style/orange.jpg&quot;);"
+       var na_style = "padding:3px 0px 0px 0px;font-size:9pt;height:17px;text-align:center;color:white;font-weight:bold;background:url(&quot;./style/gray.jpg&quot;);"
+
+       var html = "<table width=\"380.68\" align=\"center\"><tbody><tr>";
+       if (pass_width > 0){
+           html += "<td width=\""
+                       + pass_width
+                       + "\" style=\""
+                       + pass_style
+                       + "\" title=\"Passed :"
+                       + pass_rate
+                       + "%\">";
+           if (pass_width > 20){
+               html += pass_rate + "%"
+           }
+           html +=  "</td>";
+       }
+       if (fail_width > 0){
+               html += "<td width=\""
+                       + fail_width
+                       + "\" style=\""
+                       + fail_style
+                       + "\" title=\"Failed :"
+                       + fail_rate
+                       + "%\">";
+           if (fail_width > 20){
+               html += fail_rate + "%"
+           }
+           html +=  "</td>";
+       }
+       if (block_width > 0){
+               html += "<td width=\""
+                       + block_width
+                       + "\" style=\""
+                       + block_style
+                       + "\" title=\"Blocked :"
+                       + block_rate
+                       + "%\">";
+           if (block_width > 20){
+               html += block_rate + "%"
+           }
+           html +=  "</td>";
+       }
+       if (na_width > 0){
+               html += "<td width=\""
+                       + na_width
+                       + "\" style=\""
+                       + na_style
+                       + "\" title=\"Blocked :"
+                       + na_rate
+                       + "%\">";
+           if (na_width > 20){
+               html += na_rate + "%"
+           }
+           html +=  "</td>";
+       }
+       html += "</tr></tbody></table>";
+       $div.html(html);
+}
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/style/back_top.png b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/style/back_top.png
new file mode 100644 (file)
index 0000000..19cbd76
Binary files /dev/null and b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/style/back_top.png differ
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/style/blue.jpg b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/style/blue.jpg
new file mode 100644 (file)
index 0000000..d1db8f7
Binary files /dev/null and b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/style/blue.jpg differ
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/style/gray.jpg b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/style/gray.jpg
new file mode 100644 (file)
index 0000000..f1acfdb
Binary files /dev/null and b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/style/gray.jpg differ
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/style/jquery.min.js b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/style/jquery.min.js
new file mode 100644 (file)
index 0000000..198b3ff
--- /dev/null
@@ -0,0 +1,4 @@
+/*! jQuery v1.7.1 jquery.com | jquery.org/license */
+(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>"),cm.close();d=cm.createElement(a),cm.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cl)}ck[a]=e}return ck[a]}function cu(a,b){var c={};f.each(cq.concat.apply([],cq.slice(0,b)),function(){c[this]=a});return c}function ct(){cr=b}function cs(){setTimeout(ct,0);return cr=f.now()}function cj(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ci(){try{return new a.XMLHttpRequest}catch(b){}}function cc(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function cb(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function ca(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bE.test(a)?d(a,e):ca(a+"["+(typeof e=="object"||f.isArray(e)?b:"")+"]",e,c,d)});else if(!c&&b!=null&&typeof b=="object")for(var e in b)ca(a+"["+e+"]",b[e],c,d);else d(a,b)}function b_(a,c){var d,e,g=f.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((g[d]?a:e||(e={}))[d]=c[d]);e&&f.extend(!0,a,e)}function b$(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bT,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=b$(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=b$(a,c,d,e,"*",g));return l}function bZ(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bP),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bC(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?bx:by,g=0,h=e.length;if(d>0){if(c!=="border")for(;g<h;g++)c||(d-=parseFloat(f.css(a,"padding"+e[g]))||0),c==="margin"?d+=parseFloat(f.css(a,c+e[g]))||0:d-=parseFloat(f.css(a,"border"+e[g]+"Width"))||0;return d+"px"}d=bz(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0;if(c)for(;g<h;g++)d+=parseFloat(f.css(a,"padding"+e[g]))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+e[g]+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+e[g]))||0);return d+"px"}function bp(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bf,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bo(a){var b=c.createElement("div");bh.appendChild(b),b.innerHTML=a.outerHTML;return b.firstChild}function bn(a){var b=(a.nodeName||"").toLowerCase();b==="input"?bm(a):b!=="script"&&typeof a.getElementsByTagName!="undefined"&&f.grep(a.getElementsByTagName("input"),bm)}function bm(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bl(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bk(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bj(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c,d,e,g=f._data(a),h=f._data(b,g),i=g.events;if(i){delete h.handle,h.events={};for(c in i)for(d=0,e=i[c].length;d<e;d++)f.event.add(b,c+(i[c][d].namespace?".":"")+i[c][d].namespace,i[c][d],i[c][d].data)}h.data&&(h.data=f.extend({},h.data))}}function bi(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function U(a){var b=V.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function T(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=f.grep(a,function(a){return a.nodeType===1});if(O.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c<d;c++)b[a[c]]=!0;return b}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)break;return a},trim:G?function(a){return a==null?"":G.call(a)}:function(a){return a==null?"":(a+"").replace(k,"").replace(l,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d==="string"||d==="function"||d==="regexp"||e.isWindow(a)?E.call(c,a):e.merge(c,a)}return c},inArray:function(a,b,c){var d;if(b){if(H)return H.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length=="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j=="number"&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c=="string"){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=function(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h){var i=a.length;if(typeof c=="object"){for(var j in c)e.access(a,j,c[j],f,g,d);return a}if(d!==b){f=!h&&f&&e.isFunction(d);for(var k=0;k<i;k++)g(a[k],c,f?d.call(a[k],k,g(a[k],c)):d,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf("compatible")<0&&u.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},browser:{}}),e.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){I["[object "+b+"]"]=b.toLowerCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&&(e.browser.safari=!0),j.test(" ")&&(k=/^[\s\xA0]+/,l=/[\s\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener("DOMContentLoaded",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",B),e.ready())});return e}(),g={};f.Callbacks=function(a){a=a?g[a]||h(a):{};var c=[],d=[],e,i,j,k,l,m=function(b){var d,e,g,h,i;for(d=0,e=b.length;d<e;d++)g=b[d],h=f.type(g),h==="array"?m(g):h==="function"&&(!a.unique||!o.has(g))&&c.push(g)},n=function(b,f){f=f||[],e=!a.memory||[b,f],i=!0,l=j||0,j=0,k=c.length;for(;c&&l<k;l++)if(c[l].apply(b,f)===!1&&a.stopOnFalse){e=!0;break}i=!1,c&&(a.once?e===!0?o.disable():c=[]:d&&d.length&&(e=d.shift(),o.fireWith(e[0],e[1])))},o={add:function(){if(c){var a=c.length;m(arguments),i?k=c.length:e&&e!==!0&&(j=a,n(e[0],e[1]))}return this},remove:function(){if(c){var b=arguments,d=0,e=b.length;for(;d<e;d++)for(var f=0;f<c.length;f++)if(b[d]===c[f]){i&&f<=k&&(k--,f<=l&&l--),c.splice(f--,1);if(a.unique)break}}return this},has:function(a){if(c){var b=0,d=c.length;for(;b<d;b++)if(a===c[b])return!0}return!1},empty:function(){c=[];return this},disable:function(){c=d=e=b;return this},disabled:function(){return!c},lock:function(){d=b,(!e||e===!0)&&o.disable();return this},locked:function(){return!d},fireWith:function(b,c){d&&(i?a.once||d.push([b,c]):(!a.once||!e)&&n(b,c));return this},fire:function(){o.fireWith(this,arguments);return this},fired:function(){return!!e}};return o};var i=[].slice;f.extend({Deferred:function(a){var b=f.Callbacks("once memory"),c=f.Callbacks("once memory"),d=f.Callbacks("memory"),e="pending",g={resolve:b,reject:c,notify:d},h={done:b.add,fail:c.add,progress:d.add,state:function(){return e},isResolved:b.fired,isRejected:c.fired,then:function(a,b,c){i.done(a).fail(b).progress(c);return this},always:function(){i.done.apply(i,arguments).fail.apply(i,arguments);return this},pipe:function(a,b,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[b,"reject"],progress:[c,"notify"]},function(a,b){var c=b[0],e=b[1],g;f.isFunction(c)?i[a](function(){g=c.apply(this,arguments),g&&f.isFunction(g.promise)?g.promise().then(d.resolve,d.reject,d.notify):d[e+"With"](this===i?d:this,[g])}):i[a](d[e])})}).promise()},promise:function(a){if(a==null)a=h;else for(var b in h)a[b]=h[b];return a}},i=h.promise({}),j;for(j in g)i[j]=g[j].fire,i[j+"With"]=g[j].fireWith;i.done(function(){e="resolved"},c.disable,d.lock).fail(function(){e="rejected"},b.disable,d.lock),a&&a.call(i,i);return i},when:function(a){function m(a){return function(b){e[a]=arguments.length>1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c<d;c++)b[c]&&b[c].promise&&f.isFunction(b[c].promise)?b[c].promise().then(l(c),j.reject,m(c)):--g;g||j.resolveWith(j,b)}else j!==a&&j.resolveWith(j,d?[a]:[]);return k}}),f.support=function(){var b,d,e,g,h,i,j,k,l,m,n,o,p,q=c.createElement("div"),r=c.documentElement;q.setAttribute("className","t"),q.innerHTML="   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",d=q.getElementsByTagName("*"),e=q.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=q.getElementsByTagName("input")[0],b={leadingWhitespace:q.firstChild.nodeType===3,tbody:!q.getElementsByTagName("tbody").length,htmlSerialize:!!q.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:q.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete q.test}catch(s){b.deleteExpando=!1}!q.addEventListener&&q.attachEvent&&q.fireEvent&&(q.attachEvent("onclick",function(){b.noCloneEvent=!1}),q.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),q.appendChild(i),k=c.createDocumentFragment(),k.appendChild(q.lastChild),b.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,k.removeChild(i),k.appendChild(q),q.innerHTML="",a.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",q.style.width="2px",q.appendChild(j),b.reliableMarginRight=(parseInt((a.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(q.attachEvent)for(o in{submit:1,change:1,focusin:1})n="on"+o,p=n in q,p||(q.setAttribute(n,"return;"),p=typeof q[n]=="function"),b[o+"Bubbles"]=p;k.removeChild(q),k=g=h=j=q=i=null,f(function(){var a,d,e,g,h,i,j,k,m,n,o,r=c.getElementsByTagName("body")[0];!r||(j=1,k="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",m="visibility:hidden;border:0;",n="style='"+k+"border:5px solid #000;padding:0;'",o="<div "+n+"><div></div></div>"+"<table "+n+" cellpadding='0' cellspacing='0'>"+"<tr><td></td></tr></table>",a=c.createElement("div"),a.style.cssText=m+"width:0;height:0;position:static;top:0;margin-top:"+j+"px",r.insertBefore(a,r.firstChild),q=c.createElement("div"),a.appendChild(q),q.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>",l=q.getElementsByTagName("td"),p=l[0].offsetHeight===0,l[0].style.display="",l[1].style.display="none",b.reliableHiddenOffsets=p&&l[0].offsetHeight===0,q.innerHTML="",q.style.width=q.style.paddingLeft="1px",f.boxModel=b.boxModel=q.offsetWidth===2,typeof q.style.zoom!="undefined"&&(q.style.display="inline",q.style.zoom=1,b.inlineBlockNeedsLayout=q.offsetWidth===2,q.style.display="",q.innerHTML="<div style='width:4px;'></div>",b.shrinkWrapBlocks=q.offsetWidth!==2),q.style.cssText=k+m,q.innerHTML=o,d=q.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,i={doesNotAddBorder:e.offsetTop!==5,doesAddBorderForTableAndCells:h.offsetTop===5},e.style.position="fixed",e.style.top="20px",i.fixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",i.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,i.doesNotIncludeMarginInBodyOffset=r.offsetTop!==j,r.removeChild(a),q=a=null,f.extend(b,i))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e<g;e++)delete d[b[e]];if(!(c?m:f.isEmptyObject)(d))return}}if(!c){delete j[k].data;if(!m(j[k]))return}f.support.deleteExpando||!j.setInterval?delete j[k]:j[k]=null,i&&(f.support.deleteExpando?delete a[h]:a.removeAttribute?a.removeAttribute(h):a[h]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d,e,g,h=null;if(typeof a=="undefined"){if(this.length){h=f.data(this[0]);if(this[0].nodeType===1&&!f._data(this[0],"parsedAttrs")){e=this[0].attributes;for(var i=0,j=e.length;i<j;i++)g=e[i].name,g.indexOf("data-")===0&&(g=f.camelCase(g.substring(5)),l(this[0],g,h[g]));f._data(this[0],"parsedAttrs",!0)}}return h}if(typeof a=="object")return this.each(function(){f.data(this,a)});d=a.split("."),d[1]=d[1]?"."+d[1]:"";if(c===b){h=this.triggerHandler("getData"+d[1]+"!",[d[0]]),h===b&&this.length&&(h=f.data(this[0],a),h=l(this[0],a,h));return h===b&&d[1]?this.data(d[0]):h}return this.each(function(){var b=f(this),e=[d[0],c];b.triggerHandler("setData"+d[1]+"!",e),f.data(this,a,c),b.triggerHandler("changeData"+d[1]+"!",e)})},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){typeof a!="string"&&(c=a,a="fx");if(c===b)return f.queue(this[0],a);return this.each(function(){var b=f.queue(this,a,c);a==="fx"&&b[0]!=="inprogress"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!="string"&&(c=a,a=b),a=a||"fx";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+"defer",j=a+"queue",k=a+"mark",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f.Callbacks("once memory"),!0))h++,l.add(m);m();return d.promise()}});var o=/[\n\t\r]/g,p=/\s+/,q=/\r/g,r=/^(?:button|input)$/i,s=/^(?:button|input|object|select|textarea)$/i,t=/^a(?:rea)?$/i,u=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,v=f.support.getSetAttribute,w,x,y;f.fn.extend({attr:function(a,b){return f.access(this,a,b,!0,f.attr)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,a,b,!0,f.prop)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{g=" "+e.className+" ";for(h=0,i=b.length;h<i;h++)~g.indexOf(" "+b[h]+" ")||(g+=b[h]+" ");e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(p);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(" "+g.className+" ").replace(o," ");for(i=0,j=c.length;i<j;i++)h=h.replace(" "+c[i]+" "," ");g.className=f.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c==="string"){var e,g=0,h=f(this),i=b,j=a.split(p);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&f._data(this,"__className__",this.className),this.className=this.className||a===!1?"":f._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c<d;c++)if(this[c].nodeType===1&&(" "+this[c].className+" ").replace(o," ").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c<d;c++){e=i[c];if(e.selected&&(f.support.optDisabled?!e.disabled:e.getAttribute("disabled")===null)&&(!e.parentNode.disabled||!f.nodeName(e.parentNode,"optgroup"))){b=f(e).val();if(j)return b;h.push(b)}}if(j&&!h.length&&i.length)return f(i[g]).val();return h},set:function(a,b){var c=f.makeArray(b);f(a).find("option").each(function(){this.selected=f.inArray(f(this).val(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;h<g;h++)e=d[h],e&&(c=f.propFix[e]||e,f.attr(a,e,""),a.removeAttribute(v?e:c),u.test(e)&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(r.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(w&&f.nodeName(a,"button"))return w.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(w&&f.nodeName(a,"button"))return w.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e,g,h,i=a.nodeType;if(!!a&&i!==3&&i!==8&&i!==2){h=i!==1||!f.isXMLDoc(a),h&&(c=f.propFix[c]||c,g=f.propHooks[c]);return d!==b?g&&"set"in g&&(e=g.set(a,d,c))!==b?e:a[c]=d:g&&"get"in g&&(e=g.get(a,c))!==null?e:a[c]}},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):s.test(a.nodeName)||t.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabindex=f.propHooks.tabIndex,x={get:function(a,c){var d,e=f.prop(a,c);return e===!0||typeof e!="boolean"&&(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},v||(y={name:!0,id:!0},w=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&(y[c]?d.nodeValue!=="":d.specified)?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+""}},f.attrHooks.tabindex.set=w.set,f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})}),f.attrHooks.contenteditable={get:w.get,set:function(a,b,c){b===""&&(b="false"),w.set(a,b,c)}}),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.enctype||(f.propFix.enctype="encoding"),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/\bhover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};
+f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k<c.length;k++){l=A.exec(c[k])||[],m=l[1],n=(l[2]||"").split(".").sort(),s=f.event.special[m]||{},m=(g?s.delegateType:s.bindType)||m,s=f.event.special[m]||{},o=f.extend({type:m,origType:l[1],data:e,handler:d,guid:d.guid,selector:g,quick:G(g),namespace:n.join(".")},p),r=j[m];if(!r){r=j[m]=[],r.delegateCount=0;if(!s.setup||s.setup.call(a,e,n,i)===!1)a.addEventListener?a.addEventListener(m,i,!1):a.attachEvent&&a.attachEvent("on"+m,i)}s.add&&(s.add.call(a,o),o.handler.guid||(o.handler.guid=d.guid)),g?r.splice(r.delegateCount++,0,o):r.push(o),f.event.global[m]=!0}a=null}},global:{},remove:function(a,b,c,d,e){var g=f.hasData(a)&&f._data(a),h,i,j,k,l,m,n,o,p,q,r,s;if(!!g&&!!(o=g.events)){b=f.trim(I(b||"")).split(" ");for(h=0;h<b.length;h++){i=A.exec(b[h])||[],j=k=i[1],l=i[2];if(!j){for(j in o)f.event.remove(a,j+b[h],c,d,!0);continue}p=f.event.special[j]||{},j=(d?p.delegateType:p.bindType)||j,r=o[j]||[],m=r.length,l=l?new RegExp("(^|\\.)"+l.split(".").sort().join("\\.(?:.*\\.)?")+"(\\.|$)"):null;for(n=0;n<r.length;n++)s=r[n],(e||k===s.origType)&&(!c||c.guid===s.guid)&&(!l||l.test(s.namespace))&&(!d||d===s.selector||d==="**"&&s.selector)&&(r.splice(n--,1),s.selector&&r.delegateCount--,p.remove&&p.remove.call(a,s));r.length===0&&m!==r.length&&((!p.teardown||p.teardown.call(a,l)===!1)&&f.removeEvent(a,j,g.handle),delete o[j])}f.isEmptyObject(o)&&(q=g.handle,q&&(q.elem=null),f.removeData(a,["events","handle"],!0))}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){if(!e||e.nodeType!==3&&e.nodeType!==8){var h=c.type||c,i=[],j,k,l,m,n,o,p,q,r,s;if(E.test(h+f.event.triggered))return;h.indexOf("!")>=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;l<r.length&&!c.isPropagationStopped();l++)m=r[l][0],c.type=r[l][1],q=(f._data(m,"events")||{})[c.type]&&f._data(m,"handle"),q&&q.apply(m,d),q=o&&m[o],q&&f.acceptData(m)&&q.apply(m,d)===!1&&c.preventDefault();c.type=h,!g&&!c.isDefaultPrevented()&&(!p._default||p._default.apply(e.ownerDocument,d)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)&&o&&e[h]&&(h!=="focus"&&h!=="blur"||c.target.offsetWidth!==0)&&!f.isWindow(e)&&(n=e[o],n&&(e[o]=null),f.event.triggered=h,e[h](),f.event.triggered=b,n&&(e[o]=n));return c.result}},dispatch:function(c){c=f.event.fix(c||a.event);var d=(f._data(this,"events")||{})[c.type]||[],e=d.delegateCount,g=[].slice.call(arguments,0),h=!c.exclusive&&!c.namespace,i=[],j,k,l,m,n,o,p,q,r,s,t;g[0]=c,c.delegateTarget=this;if(e&&!c.target.disabled&&(!c.button||c.type!=="click")){m=f(this),m.context=this.ownerDocument||this;for(l=c.target;l!=this;l=l.parentNode||this){o={},q=[],m[0]=l;for(j=0;j<e;j++)r=d[j],s=r.selector,o[s]===b&&(o[s]=r.quick?H(l,r.quick):m.is(s)),o[s]&&q.push(r);q.length&&i.push({elem:l,matches:q})}}d.length>e&&i.push({elem:this,matches:d.slice(e)});for(j=0;j<i.length&&!c.isPropagationStopped();j++){p=i[j],c.currentTarget=p.elem;for(k=0;k<p.matches.length&&!c.isImmediatePropagationStopped();k++){r=p.matches[k];if(h||!c.namespace&&!r.namespace||c.namespace_re&&c.namespace_re.test(r.namespace))c.data=r.data,c.handleObj=r,n=((f.event.special[r.origType]||{}).handle||r.handler).apply(p.elem,g),n!==b&&(c.result=n,n===!1&&(c.preventDefault(),c.stopPropagation()))}}return c.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode);return a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,d){var e,f,g,h=d.button,i=d.fromElement;a.pageX==null&&d.clientX!=null&&(e=a.target.ownerDocument||c,f=e.documentElement,g=e.body,a.pageX=d.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=d.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?d.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0);return a}},fix:function(a){if(a[f.expando])return a;var d,e,g=a,h=f.event.fixHooks[a.type]||{},i=h.props?this.props.concat(h.props):this.props;a=f.Event(g);for(d=i.length;d;)e=i[--d],a[e]=g[e];a.target||(a.target=g.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey===b&&(a.metaKey=a.ctrlKey);return h.filter?h.filter(a,g):a},special:{ready:{setup:f.bindReady},load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}},simulate:function(a,b,c,d){var e=f.extend(new f.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?f.event.trigger(e,null,b):f.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},f.event.handle=f.event.dispatch,f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},f.Event=function(a,b){if(!(this instanceof f.Event))return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?K:J):this.type=a,b&&f.extend(this,b),this.timeStamp=a&&a.timeStamp||f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=K;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=K;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=K,this.stopPropagation()},isDefaultPrevented:J,isPropagationStopped:J,isImmediatePropagationStopped:J},f.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){f.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c=this,d=a.relatedTarget,e=a.handleObj,g=e.selector,h;if(!d||d!==c&&!f.contains(c,d))a.type=e.origType,h=e.handler.apply(this,arguments),a.type=b;return h}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(){if(f.nodeName(this,"form"))return!1;f.event.add(this,"click._submit keypress._submit",function(a){var c=a.target,d=f.nodeName(c,"input")||f.nodeName(c,"button")?c.form:b;d&&!d._submit_attached&&(f.event.add(d,"submit._submit",function(a){this.parentNode&&!a.isTrigger&&f.event.simulate("submit",this.parentNode,a,!0)}),d._submit_attached=!0)})},teardown:function(){if(f.nodeName(this,"form"))return!1;f.event.remove(this,"._submit")}}),f.support.changeBubbles||(f.event.special.change={setup:function(){if(z.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")f.event.add(this,"propertychange._change",function(a){a.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),f.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1,f.event.simulate("change",this,a,!0))});return!1}f.event.add(this,"beforeactivate._change",function(a){var b=a.target;z.test(b.nodeName)&&!b._change_attached&&(f.event.add(b,"change._change",function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&f.event.simulate("change",this.parentNode,a,!0)}),b._change_attached=!0)})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!=="radio"&&b.type!=="checkbox")return a.handleObj.handler.apply(this,arguments)},teardown:function(){f.event.remove(this,"._change");return z.test(this.nodeName)}}),f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){var d=0,e=function(a){f.event.simulate(b,a.target,f.event.fix(a),!0)};f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.fn.extend({on:function(a,c,d,e,g){var h,i;if(typeof a=="object"){typeof c!="string"&&(d=c,c=b);for(i in a)this.on(i,c,d,a[i],g);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typeof c=="string"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=J;else if(!e)return this;g===1&&(h=e,e=function(a){f().off(a);return h.apply(this,arguments)},e.guid=h.guid||(h.guid=f.guid++));return this.each(function(){f.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on.call(this,a,b,c,d,1)},off:function(a,c,d){if(a&&a.preventDefault&&a.handleObj){var e=a.handleObj;f(a.delegateTarget).off(e.namespace?e.type+"."+e.namespace:e.type,e.selector,e.handler);return this}if(typeof a=="object"){for(var g in a)this.off(g,c,a[g]);return this}if(c===!1||typeof c=="function")d=c,c=b;d===!1&&(d=J);return this.each(function(){f.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){f(this.context).on(a,this.selector,b,c);return this},die:function(a,b){f(this.context).off(a,this.selector||"**",b);return this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length==1?this.off(a,"**"):this.off(b,a,c)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f._data(this,"lastToggle"+a.guid)||0)%d;f._data(this,"lastToggle"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),f.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){f.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}if(j.nodeType===1){g||(j[d]=c,j.sizset=h);if(typeof b!="string"){if(j===b){k=!0;break}}else if(m.filter(b,[j]).length>0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}j.nodeType===1&&!g&&(j[d]=c,j.sizset=h);if(j.nodeName.toLowerCase()===b){k=j;break}j=j[a]}e[h]=k}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},m.matches=function(a,b){return m(a,null,null,b)},m.matchesSelector=function(a,b){return m(b,null,null,[a]).length>0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e<f;e++){h=o.order[e];if(g=o.leftMatch[h].exec(a)){i=g[1],g.splice(1,1);if(i.substr(i.length-1)!=="\\"){g[1]=(g[1]||"").replace(j,""),d=o.find[h](g,b,c);if(d!=null){a=a.replace(o.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},m.filter=function(a,c,d,e){var f,g,h,i,j,k,l,n,p,q=a,r=[],s=c,t=c&&c[0]&&m.isXML(c[0]);while(a&&c.length){for(h in o.filter)if((f=o.leftMatch[h].exec(a))!=null&&f[2]){k=o.filter[h],l=f[1],g=!1,f.splice(1,1);if(l.substr(l.length-1)==="\\")continue;s===r&&(r=[]);if(o.preFilter[h]){f=o.preFilter[h](f,s,d,r,e,t);if(!f)g=i=!0;else if(f===!0)continue}if(f)for(n=0;(j=s[n])!=null;n++)j&&(i=k(j,f,n,s),p=e^i,d&&i!=null?p?g=!0:s[n]=!1:p&&(r.push(j),g=!0));if(i!==b){d||(s=r),a=a.replace(o.match[h],"");if(!g)return[];break}}if(a===q)if(g==null)m.error(a);else break;q=a}return s},m.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)};var n=m.getText=function(a){var b,c,d=a.nodeType,e="";if(d){if(d===1||d===9){if(typeof a.textContent=="string")return a.textContent;if(typeof a.innerText=="string")return a.innerText.replace(k,"");for(a=a.firstChild;a;a=a.nextSibling)e+=n(a)}else if(d===3||d===4)return a.nodeValue}else for(b=0;c=a[b];b++)c.nodeType!==8&&(e+=n(c));return e},o=m.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b=="string",d=c&&!l.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&m.filter(b,a,!0)},">":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&m.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("parentNode",b,f,a,d,c)},"~":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("previousSibling",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(j,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}m.error(e)},CHILD:function(a,b){var c,e,f,g,h,i,j,k=b[1],l=a;switch(k){case"only":case"first":while(l=l.previousSibling)if(l.nodeType===1)return!1;if(k==="first")return!0;l=a;case"last":while(l=l.nextSibling)if(l.nodeType===1)return!1;return!0;case"nth":c=b[2],e=b[3];if(c===1&&e===0)return!0;f=b[0],g=a.parentNode;if(g&&(g[d]!==f||!a.nodeIndex)){i=0;for(l=g.firstChild;l;l=l.nextSibling)l.nodeType===1&&(l.nodeIndex=++i);g[d]=f}j=a.nodeIndex-e;return c===0?j===0:j%c===0&&j/c>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var u,v;c.documentElement.compareDocumentPosition?u=function(a,b){if(a===b){h=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(u=function(a,b){if(a===b){h=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],g=a.parentNode,i=b.parentNode,j=g;if(g===i)return v(a,b);if(!g)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return v(e[k],f[k]);return k===c?v(a,f[k],-1):v(e[k],b,1)},v=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h<i;h++)m(a,g[h],e,c);return m.filter(f,e)};m.attr=f.attr,m.selectors.attrMap={},f.find=m,f.expr=m.selectors,f.expr[":"]=f.expr.filters,f.unique=m.uniqueSort,f.text=m.getText,f.isXMLDoc=m.isXML,f.contains=m.contains}();var L=/Until$/,M=/^(?:parents|prevUntil|prevAll)/,N=/,/,O=/^.[^:#\[\.,]*$/,P=Array.prototype.slice,Q=f.expr.match.POS,R={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!="string")return f(a).filter(function(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack("","find",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(T(this,a,!1),"not",a)},filter:function(a){return this.pushStack(T(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?Q.test(a)?f(a,this.context).index(this[0])>=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d<a.length;d++)f(g).is(a[d])&&c.push({selector:a[d],elem:g,level:h});g=g.parentNode,h++}return c}var i=Q.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d<e;d++){g=this[d];while(g){if(i?i.index(g)>-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/<tbody/i,_=/<|&#?\w+;/,ba=/<(?:script|style)/i,bb=/<(?:script|object|embed|option|style)/i,bc=new RegExp("<(?:"+V+")","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*<!(?:\[CDATA\[|\-\-)/,bg={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div<div>","</div>"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function()
+{for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1></$2>");try{for(var c=0,d=this.length;c<d;c++)this[c].nodeType===1&&(f.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(e){this.empty().append(a)}}else f.isFunction(a)?this.each(function(b){var c=f(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bd.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bi(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,bp)}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i,j=a[0];b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof j=="string"&&j.length<512&&i===c&&j.charAt(0)==="<"&&!bb.test(j)&&(f.support.checkClone||!bd.test(j))&&(f.support.html5Clone||!bc.test(j))&&(g=!0,h=f.fragments[j],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[j]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||!bc.test("<"+a.nodeName)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1></$2>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");b===c?bh.appendChild(o):U(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]==="<table>"&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i<r;i++)bn(k[i]);else bn(k);k.nodeType?h.push(k):h=f.merge(h,k)}if(d){g=function(a){return!a.type||be.test(a.type)};for(j=0;h[j];j++)if(e&&f.nodeName(h[j],"script")&&(!h[j].type||h[j].type.toLowerCase()==="text/javascript"))e.push(h[j].parentNode?h[j].parentNode.removeChild(h[j]):h[j]);else{if(h[j].nodeType===1){var s=f.grep(h[j].getElementsByTagName("script"),g);h.splice.apply(h,[j+1,0].concat(s))}d.appendChild(h[j])}}return h},cleanData:function(a){var b,c,d=f.cache,e=f.event.special,g=f.support.deleteExpando;for(var h=0,i;(i=a[h])!=null;h++){if(i.nodeName&&f.noData[i.nodeName.toLowerCase()])continue;c=i[f.expando];if(c){b=d[c];if(b&&b.events){for(var j in b.events)e[j]?f.event.remove(i,j):f.removeEvent(i,j,b.handle);b.handle&&(b.handle.elem=null)}g?delete i[f.expando]:i.removeAttribute&&i.removeAttribute(f.expando),delete d[c]}}}});var bq=/alpha\([^)]*\)/i,br=/opacity=([^)]*)/,bs=/([A-Z]|^ms)/g,bt=/^-?\d+(?:px)?$/i,bu=/^-?\d/,bv=/^([\-+])=([\-+.\de]+)/,bw={position:"absolute",visibility:"hidden",display:"block"},bx=["Left","Right"],by=["Top","Bottom"],bz,bA,bB;f.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return f.access(this,a,c,!0,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)})},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bz(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bv.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(bz)return bz(a,c)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]}}),f.curCSS=f.css,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){var e;if(c){if(a.offsetWidth!==0)return bC(a,b,d);f.swap(a,bw,function(){e=bC(a,b,d)});return e}},set:function(a,b){if(!bt.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return br.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bq,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bq.test(g)?g.replace(bq,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,b){var c,d,e;b=b.replace(bs,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b)));return c}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bt.test(f)&&bu.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f||0,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bD=/%20/g,bE=/\[\]$/,bF=/\r?\n/g,bG=/#.*$/,bH=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bI=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bJ=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bK=/^(?:GET|HEAD)$/,bL=/^\/\//,bM=/\?/,bN=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bO=/^(?:select|textarea)/i,bP=/\s+/,bQ=/([?&])_=[^&]*/,bR=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bS=f.fn.load,bT={},bU={},bV,bW,bX=["*/"]+["*"];try{bV=e.href}catch(bY){bV=c.createElement("a"),bV.href="",bV=bV.href}bW=bR.exec(bV.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bS)return bS.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("<div>").append(c.replace(bN,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bO.test(this.nodeName)||bI.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bF,"\r\n")}}):{name:b.name,value:c.replace(bF,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b_(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b_(a,b);return a},ajaxSettings:{url:bV,isLocal:bJ.test(bW[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bX},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bZ(bT),ajaxTransport:bZ(bU),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?cb(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cc(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bH.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bG,"").replace(bL,bW[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bP),d.crossDomain==null&&(r=bR.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bW[1]&&r[2]==bW[2]&&(r[3]||(r[1]==="http:"?80:443))==(bW[3]||(bW[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),b$(bT,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bK.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bM.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bQ,"$1_="+x);d.url=y+(y===d.url?(bM.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bX+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=b$(bU,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)ca(g,a[g],c,e);return d.join("&").replace(bD,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cd=f.now(),ce=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cd++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ce.test(b.url)||e&&ce.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ce,l),b.url===j&&(e&&(k=k.replace(ce,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cf=a.ActiveXObject?function(){for(var a in ch)ch[a](0,1)}:!1,cg=0,ch;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ci()||cj()}:ci,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cf&&delete ch[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cg,cf&&(ch||(ch={},f(a).unload(cf)),ch[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var ck={},cl,cm,cn=/^(?:toggle|show|hide)$/,co=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cp,cq=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cr;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cu("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d.style&&(e=d.style.display,!f._data(d,"olddisplay")&&e==="none"&&(e=d.style.display=""),e===""&&f.css(d,"display")==="none"&&f._data(d,"olddisplay",cv(d.nodeName)));for(g=0;g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===""||e==="none")d.style.display=f._data(d,"olddisplay")||""}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(cu("hide",3),a,b,c);var d,e,g=0,h=this.length;for(;g<h;g++)d=this[g],d.style&&(e=f.css(d,"display"),e!=="none"&&!f._data(d,"olddisplay")&&f._data(d,"olddisplay",e));for(g=0;g<h;g++)this[g].style&&(this[g].style.display="none");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a=="boolean";f.isFunction(a)&&f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(":hidden");f(this)[b?"show":"hide"]()}):this.animate(cu("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){function g(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=c&&f(this).is(":hidden"),g,h,i,j,k,l,m,n,o;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&&(a[g]=a[i],delete a[i]),h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||"swing";if(h==="hide"&&d||h==="show"&&!d)return b.complete.call(this);c&&(g==="height"||g==="width")&&(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,"display")==="inline"&&f.css(this,"float")==="none"&&(!f.support.inlineBlockNeedsLayout||cv(this.nodeName)==="inline"?this.style.display="inline-block":this.style.zoom=1))}b.overflow!=null&&(this.style.overflow="hidden");for(i in a)j=new f.fx(this,b,i),h=a[i],cn.test(h)?(o=f._data(this,"toggle"+i)||(h==="toggle"?d?"show":"hide":0),o?(f._data(this,"toggle"+i,o==="show"?"hide":"show"),j[o]()):j[h]()):(k=co.exec(h),l=j.cur(),k?(m=parseFloat(k[2]),n=k[3]||(f.cssNumber[i]?"":"px"),n!=="px"&&(f.style(this,i,(m||1)+n),l=(m||1)/j.cur()*l,f.style(this,i,l+n)),k[1]&&(m=(k[1]==="-="?-1:1)*m+l),j.custom(l,m,n)):j.custom(l,h,""));return!0}var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return e.queue===!1?this.each(g):this.queue(e.queue,g)},stop:function(a,c,d){typeof a!="string"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||"fx",[]);return this.each(function(){function h(a,b,c){var e=b[c];f.removeData(a,c,!0),e.stop(d)}var b,c=!1,e=f.timers,g=f._data(this);d||f._unmark(!0,this);if(a==null)for(b in g)g[b]&&g[b].stop&&b.indexOf(".run")===b.length-4&&h(this,g,b);else g[b=a+".run"]&&g[b].stop&&h(this,g,b);for(b=e.length;b--;)e[b].elem===this&&(a==null||e[b].queue===a)&&(d?e[b](!0):e[b].saveState(),c=!0,e.splice(b,1));(!d||!c)&&f.dequeue(this,a)})}}),f.each({slideDown:cu("show",1),slideUp:cu("hide",1),slideToggle:cu("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&typeof a=="object"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,duration:a,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue="fx";d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue?f.dequeue(this,d.queue):a!==!1&&f._unmark(this)};return d},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,c,d){function h(a){return e.step(a)}var e=this,g=f.fx;this.startTime=cr||cs(),this.end=c,this.now=this.start=a,this.pos=this.state=0,this.unit=d||this.unit||(f.cssNumber[this.prop]?"":"px"),h.queue=this.options.queue,h.elem=this.elem,h.saveState=function(){e.options.hide&&f._data(e.elem,"fxshow"+e.prop)===b&&f._data(e.elem,"fxshow"+e.prop,e.start)},h()&&f.timers.push(h)&&!cp&&(cp=setInterval(g.tick,g.interval))},show:function(){var a=f._data(this.elem,"fxshow"+this.prop);this.options.orig[this.prop]=a||f.style(this.elem,this.prop),this.options.show=!0,a!==b?this.custom(this.cur(),a):this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f._data(this.elem,"fxshow"+this.prop)||f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b,c,d,e=cr||cs(),g=!0,h=this.elem,i=this.options;if(a||e>=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&b[c]===a&&b.splice(c--,1);b.length||f.fx.stop()},interval:13,stop:function(){clearInterval(cp),cp=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=a.now+a.unit:a.elem[a.prop]=a.now}}}),f.each(["width","height"],function(a,b){f.fx.step[b]=function(a){f.style(a.elem,b,Math.max(0,a.now)+a.unit)}}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var cw=/^t(?:able|d|h)$/i,cx=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?f.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(d){}var e=b.ownerDocument,g=e.documentElement;if(!c||!f.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=e.body,i=cy(e),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||f.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||f.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:f.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);var c,d=b.offsetParent,e=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(f.support.fixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===d&&(l+=b.offsetTop,m+=b.offsetLeft,f.support.doesNotAddBorder&&(!f.support.doesAddBorderForTableAndCells||!cw.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),e=d,d=b.offsetParent),f.support.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;f.support.fixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},f.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.support.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cy(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cy(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,d,"padding")):this[d]():null},f.fn["outer"+c]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,d,a?"margin":"border")):this[d]():null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNumeric(j)?j:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window);
\ No newline at end of file
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/style/orange.jpg b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/style/orange.jpg
new file mode 100644 (file)
index 0000000..ac4c749
Binary files /dev/null and b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/style/orange.jpg differ
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/style/popup.js b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/style/popup.js
new file mode 100644 (file)
index 0000000..5f994f4
--- /dev/null
@@ -0,0 +1,1215 @@
+/**
+ * Copyright (c)2005-2009 Matt Kruse (javascripttoolbox.com)
+ * 
+ * Dual licensed under the MIT and GPL licenses. 
+ * This basically means you can use this code however you want for
+ * free, but don't claim to have written it yourself!
+ * Donations always accepted: http://www.JavascriptToolbox.com/donate/
+ * 
+ * Please do not link to the .js files on javascripttoolbox.com from
+ * your site. Copy the files locally to your server instead.
+ * 
+ */
+/* ******************************************************************* */
+/*   UTIL FUNCTIONS                                                    */
+/* ******************************************************************* */
+var Util = {'$VERSION':1.06};
+
+// Util functions - these are GLOBAL so they
+// look like built-in functions.
+
+// Determine if an object is an array
+function isArray(o) {
+       return (o!=null && typeof(o)=="object" && typeof(o.length)=="number" && (o.length==0 || defined(o[0])));
+};
+
+// Determine if an object is an Object
+function isObject(o) {
+       return (o!=null && typeof(o)=="object" && defined(o.constructor) && o.constructor==Object && !defined(o.nodeName));
+};
+
+// Determine if a reference is defined
+function defined(o) {
+       return (typeof(o)!="undefined");
+};
+
+// Iterate over an array, object, or list of items and run code against each item
+// Similar functionality to Perl's map() function
+function map(func) {
+       var i,j,o;
+       var results = [];
+       if (typeof(func)=="string") {
+               func = new Function('$_',func);
+       }
+       for (i=1; i<arguments.length; i++) {
+               o = arguments[i];
+               if (isArray(o)) {
+                       for (j=0; j<o.length; j++) {
+                               results[results.length] = func(o[j]);
+                       }
+               }
+               else if (isObject(o)) {
+                       for (j in o) {
+                               results[results.length] = func(o[j]);
+                       }
+               }
+               else {
+                       results[results.length] = func(o);
+               }
+       }
+       return results;
+};
+
+// Set default values in an object if they are undefined
+function setDefaultValues(o,values) {
+       if (!defined(o) || o==null) {
+               o = {};
+       }
+       if (!defined(values) || values==null) {
+               return o;
+       }
+       for (var val in values) {
+               if (!defined(o[val])) {
+                       o[val] = values[val];
+               }
+       }
+       return o;
+};
+
+/* ******************************************************************* */
+/*   DEFAULT OBJECT PROTOTYPE ENHANCEMENTS                             */
+/* ******************************************************************* */
+// These functions add useful functionality to built-in objects
+Array.prototype.contains = function(o) {
+       var i,l;
+       if (!(l = this.length)) { return false; }
+       for (i=0; i<l; i++) {
+               if (o==this[i]) {
+                       return true;
+               }
+       }
+};
+
+/* ******************************************************************* */
+/*   DOM FUNCTIONS                                                     */
+/* ******************************************************************* */
+var DOM = (function() { 
+       var dom = {};
+       
+       // Get a parent tag with a given nodename
+       dom.getParentByTagName = function(o,tagNames) {
+               if(o==null) { return null; }
+               if (isArray(tagNames)) {
+                       tagNames = map("return $_.toUpperCase()",tagNames);
+                       while (o=o.parentNode) {
+                               if (o.nodeName && tagNames.contains(o.nodeName)) {
+                                       return o;
+                               }
+                       }
+               }
+               else {
+                       tagNames = tagNames.toUpperCase();
+                       while (o=o.parentNode) {
+                               if (o.nodeName && tagNames==o.nodeName) {
+                                       return o;
+                               }
+                       }
+               }
+               return null;
+       };
+       
+       // Remove a node from its parent
+       dom.removeNode = function(o) {
+               if (o!=null && o.parentNode && o.parentNode.removeChild) {
+                       // First remove all attributes which are func references, to avoid memory leaks
+                       for (var i in o) {
+                               if (typeof(o[i])=="function") {
+                                       o[i] = null;
+                               }
+                       }
+                       o.parentNode.removeChild(o);
+                       return true;
+               }
+               return false;
+       };
+
+       // Get the outer width in pixels of an object, including borders, padding, and margin
+       dom.getOuterWidth = function(o) {
+               if (defined(o.offsetWidth)) {
+                       return o.offsetWidth;
+               }
+               return null;
+       };
+
+       // Get the outer height in pixels of an object, including borders, padding, and margin
+       dom.getOuterHeight = function(o) {
+               if (defined(o.offsetHeight)) {
+                       return o.offsetHeight;
+               }
+               return null;
+       };
+
+       // Resolve an item, an array of items, or an object of items
+       dom.resolve = function() {
+               var results = new Array();
+               var i,j,o;
+               for (var i=0; i<arguments.length; i++) {
+                       var o = arguments[i];
+                       if (o==null) {
+                               if (arguments.length==1) {
+                                       return null;
+                               }
+                               results[results.length] = null;
+                       }
+                       else if (typeof(o)=='string') {
+                               if (document.getElementById) {
+                                       o = document.getElementById(o);
+                               }
+                               else if (document.all) {
+                                       o = document.all[o];
+                               }
+                               if (arguments.length==1) {
+                                       return o;
+                               }
+                               results[results.length] = o;
+                       }
+                       else if (isArray(o)) {
+                               for (j=0; j<o.length; j++) {
+                                       results[results.length] = o[j];
+                               }
+                       }
+                       else if (isObject(o)) {
+                               for (j in o) {
+                                       results[results.length] = o[j];
+                               }
+                       }
+                       else if (arguments.length==1) {
+                               return o;
+                       }
+                       else {
+                               results[results.length] = o;
+                       }
+         }
+         return results;
+       };
+       dom.$ = dom.resolve;
+       
+       return dom;
+})();
+
+/* ******************************************************************* */
+/*   CSS FUNCTIONS                                                     */
+/* ******************************************************************* */
+var CSS = (function(){
+       var css = {};
+
+       // Convert an RGB string in the form "rgb (255, 255, 255)" to "#ffffff"
+       css.rgb2hex = function(rgbString) {
+               if (typeof(rgbString)!="string" || !defined(rgbString.match)) { return null; }
+               var result = rgbString.match(/^\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*/);
+               if (result==null) { return rgbString; }
+               var rgb = +result[1] << 16 | +result[2] << 8 | +result[3];
+               var hex = "";
+               var digits = "0123456789abcdef";
+               while(rgb!=0) { 
+                       hex = digits.charAt(rgb&0xf)+hex; 
+                       rgb>>>=4; 
+               } 
+               while(hex.length<6) { hex='0'+hex; }
+               return "#" + hex;
+       };
+
+       // Convert hyphen style names like border-width to camel case like borderWidth
+       css.hyphen2camel = function(property) {
+               if (!defined(property) || property==null) { return null; }
+               if (property.indexOf("-")<0) { return property; }
+               var str = "";
+               var c = null;
+               var l = property.length;
+               for (var i=0; i<l; i++) {
+                       c = property.charAt(i);
+                       str += (c!="-")?c:property.charAt(++i).toUpperCase();
+               }
+               return str;
+       };
+       
+       // Determine if an object or class string contains a given class.
+       css.hasClass = function(obj,className) {
+               if (!defined(obj) || obj==null || !RegExp) { return false; }
+               var re = new RegExp("(^|\\s)" + className + "(\\s|$)");
+               if (typeof(obj)=="string") {
+                       return re.test(obj);
+               }
+               else if (typeof(obj)=="object" && obj.className) {
+                       return re.test(obj.className);
+               }
+               return false;
+       };
+       
+       // Add a class to an object
+       css.addClass = function(obj,className) {
+               if (typeof(obj)!="object" || obj==null || !defined(obj.className)) { return false; }
+               if (obj.className==null || obj.className=='') { 
+                       obj.className = className; 
+                       return true; 
+               }
+               if (css.hasClass(obj,className)) { return true; }
+               obj.className = obj.className + " " + className;
+               return true;
+       };
+       
+       // Remove a class from an object
+       css.removeClass = function(obj,className) {
+               if (typeof(obj)!="object" || obj==null || !defined(obj.className) || obj.className==null) { return false; }
+               if (!css.hasClass(obj,className)) { return false; }
+               var re = new RegExp("(^|\\s+)" + className + "(\\s+|$)");
+               obj.className = obj.className.replace(re,' ');
+               return true;
+       };
+       
+       // Fully replace a class with a new one
+       css.replaceClass = function(obj,className,newClassName) {
+               if (typeof(obj)!="object" || obj==null || !defined(obj.className) || obj.className==null) { return false; }
+               css.removeClass(obj,className);
+               css.addClass(obj,newClassName);
+               return true;
+       };
+       
+       // Get the currently-applied style of an object
+       css.getStyle = function(o, property) {
+               if (o==null) { return null; }
+               var val = null;
+               var camelProperty = css.hyphen2camel(property);
+               // Handle "float" property as a special case
+               if (property=="float") {
+                       val = css.getStyle(o,"cssFloat");
+                       if (val==null) { 
+                               val = css.getStyle(o,"styleFloat"); 
+                       }
+               }
+               else if (o.currentStyle && defined(o.currentStyle[camelProperty])) {
+                       val = o.currentStyle[camelProperty];
+               }
+               else if (window.getComputedStyle) {
+                       val = window.getComputedStyle(o,null).getPropertyValue(property);
+               }
+               else if (o.style && defined(o.style[camelProperty])) {
+                       val = o.style[camelProperty];
+               }
+               // For color values, make the value consistent across browsers
+               // Convert rgb() colors back to hex for consistency
+               if (/^\s*rgb\s*\(/.test(val)) {
+                       val = css.rgb2hex(val);
+               }
+               // Lowercase all #hex values
+               if (/^#/.test(val)) {
+                       val = val.toLowerCase();
+               }
+               return val;
+       };
+       css.get = css.getStyle;
+
+       // Set a style on an object
+       css.setStyle = function(o, property, value) {
+               if (o==null || !defined(o.style) || !defined(property) || property==null || !defined(value)) { return false; }
+               if (property=="float") {
+                       o.style["cssFloat"] = value;
+                       o.style["styleFloat"] = value;
+               }
+               else if (property=="opacity") {
+                       o.style['-moz-opacity'] = value;
+                       o.style['-khtml-opacity'] = value;
+                       o.style.opacity = value;
+                       if (defined(o.style.filter)) {
+                               o.style.filter = "alpha(opacity=" + value*100 + ")";
+                       }
+               }
+               else {
+                       o.style[css.hyphen2camel(property)] = value;
+               }
+               return true;
+       };
+       css.set = css.setStyle;
+       
+       // Get a unique ID which doesn't already exist on the page
+       css.uniqueIdNumber=1000;
+       css.createId = function(o) {
+               if (defined(o) && o!=null && defined(o.id) && o.id!=null && o.id!="") { 
+                       return o.id;
+               }
+               var id = null;
+               while (id==null || document.getElementById(id)!=null) {
+                       id = "ID_"+(css.uniqueIdNumber++);
+               }
+               if (defined(o) && o!=null && (!defined(o.id)||o.id=="")) {
+                       o.id = id;
+               }
+               return id;
+       };
+       
+       return css;
+})();
+
+/* ******************************************************************* */
+/*   EVENT FUNCTIONS                                                   */
+/* ******************************************************************* */
+
+var Event = (function(){
+       var ev = {};
+       
+       // Resolve an event using IE's window.event if necessary
+       // --------------------------------------------------------------------
+       ev.resolve = function(e) {
+               if (!defined(e) && defined(window.event)) {
+                       e = window.event;
+               }
+               return e;
+       };
+       
+       // Add an event handler to a function
+       // Note: Don't use 'this' within functions added using this method, since
+       // the attachEvent and addEventListener models differ.
+       // --------------------------------------------------------------------
+       ev.add = function( obj, type, fn, capture ) {
+               if (obj.addEventListener) {
+                       obj.addEventListener( type, fn, capture );
+                       return true;
+               }
+               else if (obj.attachEvent) {
+                       obj.attachEvent( "on"+type, fn );
+                       return true;
+               }
+               return false;
+       };
+
+       // Get the mouse position of an event
+       // --------------------------------------------------------------------
+       // PageX/Y, where they exist, are more reliable than ClientX/Y because 
+       // of some browser bugs in Opera/Safari
+       ev.getMouseX = function(e) {
+               e = ev.resolve(e);
+               if (defined(e.pageX)) {
+                       return e.pageX;
+               }
+               if (defined(e.clientX)) {
+                       return e.clientX+Screen.getScrollLeft();
+               }
+               return null;
+       };
+       ev.getMouseY = function(e) {
+               e = ev.resolve(e);
+               if (defined(e.pageY)) {
+                       return e.pageY;
+               }
+               if (defined(e.clientY)) {
+                       return e.clientY+Screen.getScrollTop();
+               }
+               return null;
+       };
+
+       // Stop the event from bubbling up to parent elements.
+       // Two method names map to the same function
+       // --------------------------------------------------------------------
+       ev.cancelBubble = function(e) {
+               e = ev.resolve(e);
+               if (typeof(e.stopPropagation)=="function") { e.stopPropagation(); } 
+               if (defined(e.cancelBubble)) { e.cancelBubble = true; }
+       };
+       ev.stopPropagation = ev.cancelBubble;
+
+       // Prevent the default handling of the event to occur
+       // --------------------------------------------------------------------
+       ev.preventDefault = function(e) {
+               e = ev.resolve(e);
+               if (typeof(e.preventDefault)=="function") { e.preventDefault(); } 
+               if (defined(e.returnValue)) { e.returnValue = false; }
+       };
+       
+       return ev;
+})();
+
+/* ******************************************************************* */
+/*   SCREEN FUNCTIONS                                                  */
+/* ******************************************************************* */
+var Screen = (function() {
+       var screen = {};
+
+       // Get a reference to the body
+       // --------------------------------------------------------------------
+       screen.getBody = function() {
+               if (document.body) {
+                       return document.body;
+               }
+               if (document.getElementsByTagName) {
+                       var bodies = document.getElementsByTagName("BODY");
+                       if (bodies!=null && bodies.length>0) {
+                               return bodies[0];
+                       }
+               }
+               return null;
+       };
+
+       // Get the amount that the main document has scrolled from top
+       // --------------------------------------------------------------------
+       screen.getScrollTop = function() {
+               if (document.documentElement && defined(document.documentElement.scrollTop) && document.documentElement.scrollTop>0) {
+                       return document.documentElement.scrollTop;
+               }
+               if (document.body && defined(document.body.scrollTop)) {
+                       return document.body.scrollTop;
+               }
+               return null;
+       };
+       
+       // Get the amount that the main document has scrolled from left
+       // --------------------------------------------------------------------
+       screen.getScrollLeft = function() {
+               if (document.documentElement && defined(document.documentElement.scrollLeft) && document.documentElement.scrollLeft>0) {
+                       return document.documentElement.scrollLeft;
+               }
+               if (document.body && defined(document.body.scrollLeft)) {
+                       return document.body.scrollLeft;
+               }
+               return null;
+       };
+       
+       // Util function to default a bad number to 0
+       // --------------------------------------------------------------------
+       screen.zero = function(n) {
+               return (!defined(n) || isNaN(n))?0:n;
+       };
+
+       // Get the width of the entire document
+       // --------------------------------------------------------------------
+       screen.getDocumentWidth = function() {
+               var width = 0;
+               var body = screen.getBody();
+               if (document.documentElement && (!document.compatMode || document.compatMode=="CSS1Compat")) {
+                   var rightMargin = parseInt(CSS.get(body,'marginRight'),10) || 0;
+                   var leftMargin = parseInt(CSS.get(body,'marginLeft'), 10) || 0;
+                       width = Math.max(body.offsetWidth + leftMargin + rightMargin, document.documentElement.clientWidth);
+               }
+               else {
+                       width =  Math.max(body.clientWidth, body.scrollWidth);
+               }
+               if (isNaN(width) || width==0) {
+                       width = screen.zero(self.innerWidth);
+               }
+               return width;
+       };
+       
+       // Get the height of the entire document
+       // --------------------------------------------------------------------
+       screen.getDocumentHeight = function() {
+               var body = screen.getBody();
+               var innerHeight = (defined(self.innerHeight)&&!isNaN(self.innerHeight))?self.innerHeight:0;
+               if (document.documentElement && (!document.compatMode || document.compatMode=="CSS1Compat")) {
+                   var topMargin = parseInt(CSS.get(body,'marginTop'),10) || 0;
+                   var bottomMargin = parseInt(CSS.get(body,'marginBottom'), 10) || 0;
+                       return Math.max(body.offsetHeight + topMargin + bottomMargin, document.documentElement.clientHeight, document.documentElement.scrollHeight, screen.zero(self.innerHeight));
+               }
+               return Math.max(body.scrollHeight, body.clientHeight, screen.zero(self.innerHeight));
+       };
+       
+       // Get the width of the viewport (viewable area) in the browser window
+       // --------------------------------------------------------------------
+       screen.getViewportWidth = function() {
+               if (document.documentElement && (!document.compatMode || document.compatMode=="CSS1Compat")) {
+                       return document.documentElement.clientWidth;
+               }
+               else if (document.compatMode && document.body) {
+                       return document.body.clientWidth;
+               }
+               return screen.zero(self.innerWidth);
+       };
+       
+       // Get the height of the viewport (viewable area) in the browser window
+       // --------------------------------------------------------------------
+       screen.getViewportHeight = function() {
+               if (!window.opera && document.documentElement && (!document.compatMode || document.compatMode=="CSS1Compat")) {
+                       return document.documentElement.clientHeight;
+               }
+               else if (document.compatMode && !window.opera && document.body) {
+                       return document.body.clientHeight;
+               }
+               return screen.zero(self.innerHeight);
+       };
+
+       return screen;
+})();var Sort = (function(){
+       var sort = {};
+       sort.AlphaNumeric = function(a,b) {
+               if (a==b) { return 0; }
+               if (a<b) { return -1; }
+               return 1;
+       };
+
+       sort.Default = sort.AlphaNumeric;
+       
+       sort.NumericConversion = function(val) {
+               if (typeof(val)!="number") {
+                       if (typeof(val)=="string") {
+                               val = parseFloat(val.replace(/,/g,''));
+                               if (isNaN(val) || val==null) { val=0; }
+                       }
+                       else {
+                               val = 0;
+                       }
+               }
+               return val;
+       };
+       
+       sort.Numeric = function(a,b) {
+               return sort.NumericConversion(a)-sort.NumericConversion(b);
+       };
+
+       sort.IgnoreCaseConversion = function(val) {
+               if (val==null) { val=""; }
+               return (""+val).toLowerCase();
+       };
+
+       sort.IgnoreCase = function(a,b) {
+               return sort.AlphaNumeric(sort.IgnoreCaseConversion(a),sort.IgnoreCaseConversion(b));
+       };
+
+       sort.CurrencyConversion = function(val) {
+               if (typeof(val)=="string") {
+                       val = val.replace(/^[^\d\.]/,'');
+               }
+               return sort.NumericConversion(val);
+       };
+       
+       sort.Currency = function(a,b) {
+               return sort.Numeric(sort.CurrencyConversion(a),sort.CurrencyConversion(b));
+       };
+       
+       sort.DateConversion = function(val) {
+               // inner util function to parse date formats
+               function getdate(str) {
+                       // inner util function to convert 2-digit years to 4
+                       function fixYear(yr) {
+                               yr = +yr;
+                               if (yr<50) { yr += 2000; }
+                               else if (yr<100) { yr += 1900; }
+                               return yr;
+                       };
+                       var ret;
+                       // YYYY-MM-DD
+                       if (ret=str.match(/(\d{2,4})-(\d{1,2})-(\d{1,2})/)) {
+                               return (fixYear(ret[1])*10000) + (ret[2]*100) + (+ret[3]);
+                       }
+                       // MM/DD/YY[YY] or MM-DD-YY[YY]
+                       if (ret=str.match(/(\d{1,2})[\/-](\d{1,2})[\/-](\d{2,4})/)) {
+                               return (fixYear(ret[3])*10000) + (ret[1]*100) + (+ret[2]);
+                       }
+                       return 99999999; // So non-parsed dates will be last, not first
+               };
+               return getdate(val);
+       };
+
+       sort.Date = function(a,b) {
+               return sort.Numeric(sort.DateConversion(a),sort.DateConversion(b));
+       };
+
+       return sort;
+})();
+
+var Position = (function() {
+       // Resolve a string identifier to an object
+       // ========================================
+       function resolveObject(s) {
+               if (document.getElementById && document.getElementById(s)!=null) {
+                       return document.getElementById(s);
+               }
+               else if (document.all && document.all[s]!=null) {
+                       return document.all[s];
+               }
+               else if (document.anchors && document.anchors.length && document.anchors.length>0 && document.anchors[0].x) {
+                       for (var i=0; i<document.anchors.length; i++) {
+                               if (document.anchors[i].name==s) { 
+                                       return document.anchors[i]
+                               }
+                       }
+               }
+       }
+       
+       var pos = {};
+       pos.$VERSION = 1.0;
+       
+       // Set the position of an object
+       // =============================
+       pos.set = function(o,left,top) {
+               if (typeof(o)=="string") {
+                       o = resolveObject(o);
+               }
+               if (o==null || !o.style) {
+                       return false;
+               }
+               
+               // If the second parameter is an object, it is assumed to be the result of getPosition()
+               if (typeof(left)=="object") {
+                       var pos = left;
+                       left = pos.left;
+                       top = pos.top;
+               }
+               
+               o.style.left = left + "px";
+               o.style.top = top + "px";
+               return true;
+       };
+       
+       // Retrieve the position and size of an object
+       // ===========================================
+       pos.get = function(o) {
+               var fixBrowserQuirks = true;
+                       // If a string is passed in instead of an object ref, resolve it
+               if (typeof(o)=="string") {
+                       o = resolveObject(o);
+               }
+               
+               if (o==null) {
+                       return null;
+               }
+               
+               var left = 0;
+               var top = 0;
+               var width = 0;
+               var height = 0;
+               var parentNode = null;
+               var offsetParent = null;
+       
+               
+               offsetParent = o.offsetParent;
+               var originalObject = o;
+               var el = o; // "el" will be nodes as we walk up, "o" will be saved for offsetParent references
+               while (el.parentNode!=null) {
+                       el = el.parentNode;
+                       if (el.offsetParent==null) {
+                       }
+                       else {
+                               var considerScroll = true;
+                               /*
+                               In Opera, if parentNode of the first object is scrollable, then offsetLeft/offsetTop already 
+                               take its scroll position into account. If elements further up the chain are scrollable, their 
+                               scroll offsets still need to be added in. And for some reason, TR nodes have a scrolltop value
+                               which must be ignored.
+                               */
+                               if (fixBrowserQuirks && window.opera) {
+                                       if (el==originalObject.parentNode || el.nodeName=="TR") {
+                                               considerScroll = false;
+                                       }
+                               }
+                               if (considerScroll) {
+                                       if (el.scrollTop && el.scrollTop>0) {
+                                               top -= el.scrollTop;
+                                       }
+                                       if (el.scrollLeft && el.scrollLeft>0) {
+                                               left -= el.scrollLeft;
+                                       }
+                               }
+                       }
+                       // If this node is also the offsetParent, add on the offsets and reset to the new offsetParent
+                       if (el == offsetParent) {
+                               left += o.offsetLeft;
+                               if (el.clientLeft && el.nodeName!="TABLE") { 
+                                       left += el.clientLeft;
+                               }
+                               top += o.offsetTop;
+                               if (el.clientTop && el.nodeName!="TABLE") {
+                                       top += el.clientTop;
+                               }
+                               o = el;
+                               if (o.offsetParent==null) {
+                                       if (o.offsetLeft) {
+                                               left += o.offsetLeft;
+                                       }
+                                       if (o.offsetTop) {
+                                               top += o.offsetTop;
+                                       }
+                               }
+                               offsetParent = o.offsetParent;
+                       }
+               }
+               
+       
+               if (originalObject.offsetWidth) {
+                       width = originalObject.offsetWidth;
+               }
+               if (originalObject.offsetHeight) {
+                       height = originalObject.offsetHeight;
+               }
+               
+               return {'left':left, 'top':top, 'width':width, 'height':height
+                               };
+       };
+       
+       // Retrieve the position of an object's center point
+       // =================================================
+       pos.getCenter = function(o) {
+               var c = this.get(o);
+               if (c==null) { return null; }
+               c.left = c.left + (c.width/2);
+               c.top = c.top + (c.height/2);
+               return c;
+       };
+       
+       return pos;
+})();// CLASS CONSTRUCTOR
+// --------------------------------------------------------------------
+var Popup = function(div, options) {
+       this.div = defined(div)?div:null;
+       this.index = Popup.maxIndex++;
+       this.ref = "Popup.objects["+this.index+"]";
+       Popup.objects[this.index] = this;
+       // Store a reference to the DIV by id, also
+       if (typeof(this.div)=="string") {
+               Popup.objectsById[this.div] = this;
+       }
+       if (defined(this.div) && this.div!=null && defined(this.div.id)) {
+               Popup.objectsById[this.div.id] = this.div.id;
+       }
+       // Apply passed-in options
+       if (defined(options) && options!=null && typeof(options)=="object") {
+               for (var i in options) {
+                       this[i] = options[i];
+               }
+       }
+       return this;
+};
+
+// CLASS PROPERTIES
+// --------------------------------------------------------------------
+// Index of popup objects, to maintain a global reference if necessary
+Popup.maxIndex = 0;
+Popup.objects = {};
+Popup.objectsById = {};
+
+// The z-index value that popups will start at
+Popup.minZIndex = 101;
+
+// Class names to assign to other objects
+Popup.screenClass = "PopupScreen";
+Popup.iframeClass = "PopupIframe";
+Popup.screenIframeClass = "PopupScreenIframe";
+
+// CLASS METHODS
+// --------------------------------------------------------------------
+
+// Hide all currently-visible non-modal dialogs
+Popup.hideAll = function() {
+       for (var i in Popup.objects) {
+               var p = Popup.objects[i];
+               if (!p.modal && p.autoHide) {
+                       p.hide();
+               }
+       }
+};
+// Catch global events as a trigger to hide auto-hide popups
+Event.add(document, "mouseup", Popup.hideAll, false);
+
+// A simple class method to show a popup without creating an instance
+Popup.show = function(divObject, referenceObject, position, options, modal) {
+       var popup;
+       if (defined(divObject)) { 
+               popup = new Popup(divObject);
+       }
+       else {
+               popup = new Popup();
+               popup.destroyDivOnHide = true;
+       }
+       if (defined(referenceObject)) { popup.reference = DOM.resolve(referenceObject); }
+       if (defined(position)) { popup.position = position; }
+       if (defined(options) && options!=null && typeof(options)=="object") {
+               for (var i in options) {
+                       popup[i] = options[i];
+               }
+       }
+       if (typeof(modal)=="boolean") {
+               popup.modal = modal;
+       }
+       popup.destroyObjectsOnHide = true;
+       popup.show();
+       return popup;
+};
+
+// A simple class method to show a modal popup
+Popup.showModal = function(divObject, referenceObject, position, options) {
+       Popup.show(divObject, referenceObject, position, options, true);
+};
+
+// A method to retrieve a popup object based on a div ID
+Popup.get = function(divId) {
+       if (defined(Popup.objectsById[divId])) {
+               return Popup.objectsById[divId];
+       }
+       return null;
+};
+
+// A method to hide a popup based on a div id
+Popup.hide = function(divId) {
+       var popup = Popup.get(divId);
+       if (popup!=null) {
+               popup.hide();
+       }
+};
+
+// PROTOTYPE PROPERTIES
+// --------------------------------------------------------------------
+Popup.prototype.content = null;
+Popup.prototype.className = "PopupDiv";
+Popup.prototype.style = null; // Styles to be applied to the DIV
+Popup.prototype.width = null;
+Popup.prototype.height = null;
+Popup.prototype.top = null;
+Popup.prototype.left = null;
+Popup.prototype.offsetLeft = 0;
+Popup.prototype.offsetTop = 0;
+Popup.prototype.constrainToScreen = true;
+Popup.prototype.autoHide = true;
+Popup.prototype.useIframeShim = false; /*@cc_on @*/ /*@if (@_win32) {Popup.prototype.useIframeShim = true;} @end @*/ 
+Popup.prototype.iframe = null;
+Popup.prototype.position = null; // vertical: "above top center bottom below", horizontal: "adjacent-left,left,center,right,adjacent-right"
+Popup.prototype.reference = null;
+Popup.prototype.modal = false;
+Popup.prototype.destroyDivOnHide = false;
+Popup.prototype.destroyObjectsOnHide = false;
+Popup.prototype.screen = null;
+Popup.prototype.screenIframeShim = null;
+Popup.prototype.screenOpacity=.4;
+Popup.prototype.screenColor="#cccccc";
+
+// INSTANCE METHODS
+// --------------------------------------------------------------------
+
+// Show the popup
+// --------------------------------------------------------------------
+Popup.prototype.show = function(options, modal) {
+       this.modal = this.modal || (typeof(modal)=="boolean" && modal);
+       if (defined(options) && options!=null && typeof(options)=="object") {
+               for (var i in options) {
+                       this[i] = options[i];
+               }
+       }
+       this.div = DOM.resolve(this.div);
+       CSS.setStyle(this.div,'position','absolute');
+       
+       // If there is no div pre-defined to use, create one
+       if (this.div==null) {
+               this.div = this.createDiv();
+       }
+       if (this.content!=null) {
+               this.div.innerHTML = this.content;
+               this.content = null;
+       }
+       if (this.className!=null) {
+               this.div.className = this.className;
+       }
+       if (this.style!=null) {
+               this.applyStyle();
+       }
+       if (this.width!=null) {
+               this.div.style.width = this.width+"px";
+               this.div.style.overflowX="auto";
+       }
+       if (this.height!=null) {
+               this.div.style.height = this.height+"px";
+               this.div.style.overflowY="auto";
+       }
+
+       // Do the actual display - this is a separate method so display transitions can be implemented
+       this.transition();
+       
+       // Make sure clicks on the DIV don't bubble up to the document
+       this.div.onclick = function(e) { 
+               Event.cancelBubble(Event.resolve(e));
+       };
+       this.div.onmouseup = this.div.onclick;
+       
+       // Focus to the DIV if possible 
+       if (this.modal && this.div.focus) {
+               this.div.focus();
+       }
+};
+
+// Show the popup but make it modal
+// --------------------------------------------------------------------
+Popup.prototype.transition = function() {
+       if (this.modal) {
+               this.addScreen();
+       }
+       
+       // Make the DIV displayed but hidden so its size can be measured
+       CSS.setStyle(this.div,'visibility','hidden');
+       CSS.setStyle(this.div,'display','block');
+
+       // Position the popup
+       this.setPosition();
+
+       // Add the shim if necessary    
+       if (this.useIframeShim) {
+               this.addIframeShim();
+       }
+
+       // Make sure the DIV is higher than the shim
+       this.div.style.zIndex = Popup.minZIndex++;
+
+       CSS.setStyle(this.div,'display','block');
+       CSS.setStyle(this.div,'visibility','visible');
+};
+
+// Show the popup but make it modal
+// --------------------------------------------------------------------
+Popup.prototype.showModal = function(options) {
+       this.show(options,true);
+};
+
+// Apply user styles to the DIV
+// --------------------------------------------------------------------
+Popup.prototype.applyStyle = function() {
+       if (this.div!=null && this.style!=null && typeof(this.style)=="object") {
+               for (var i in this.style) {
+                       this.div.style[i] = this.style[i];
+               }
+       }
+};
+
+// Hide the popup
+// --------------------------------------------------------------------
+Popup.prototype.hide = function() {
+       // If this was a temp object creating on-the-fly, then remove objects from the DOM so
+       // The document doesn't get littered with extra objects
+       if (this.destroyDivOnHide) {
+               DOM.removeNode(this.div);
+               this.div = null;
+               delete Popup.objects[this.id];
+       }
+       else if (this.div!=null) {
+               CSS.setStyle(this.div,'display','none');
+       }
+
+       if (this.destroyObjectsOnHide) {
+               DOM.removeNode(this.iframe);
+               DOM.removeNode(this.screen);
+               DOM.removeNode(this.screenIframeShim);
+       }
+       else {
+               if (this.iframe!=null) {
+                       this.iframe.style.display = "none";
+               }
+               if (this.screen!=null) {
+                       this.screen.style.display = "none";
+               }
+               if (this.screenIframeShim!=null) {
+                       this.screenIframeShim.style.display = "none";
+               }
+       }
+};
+
+// Util funcs for position
+// --------------------------------------------------------------------
+Popup.prototype.setTop = function(top) {
+       this.div.style.top = top+"px";
+};
+Popup.prototype.setLeft = function(left) {
+       this.div.style.left = left+"px";
+};
+Popup.prototype.getTop = function() {
+       return parseInt(CSS.getStyle(this.div,"top"),10);
+};
+Popup.prototype.getLeft = function() {
+       return parseInt(CSS.getStyle(this.div,"left"),10);
+};
+
+// All the logic to position the popup based on various criteria
+// --------------------------------------------------------------------
+Popup.prototype.setPosition = function() {
+       if (this.position!=null) {
+               var m = this.position.match(/^(\S+)\s+(\S+)/); 
+               if (m!=null && m.length==3) {
+                       var v = m[1];
+                       var h = m[2];
+
+                       var ref = this.reference;
+                       if (ref==null) { ref = Screen.getBody(); }
+                       var p = Position.get(ref);
+                       var refTop = p.top;
+                       var refLeft = p.left;
+                       var refWidth = DOM.getOuterWidth(ref);
+                       var refHeight = DOM.getOuterHeight(ref);
+                       
+                       var width = DOM.getOuterWidth(this.div);
+                       var height = DOM.getOuterHeight(this.div);
+                       
+                       var scrollLeft = Screen.getScrollLeft();
+                       var scrollTop = Screen.getScrollTop();
+
+                       // Set vertical position relative to reference object
+                       if (v=="above") { this.setTop(refTop-height+this.offsetTop); }
+                       else if (v=="top") { this.setTop(refTop+this.offsetTop); }
+                       else if (v=="center") { this.setTop(refTop+(refHeight/2)-(height/2)+this.offsetTop); }
+                       else if (v=="bottom") { this.setTop(refTop+refHeight-height+this.offsetTop); }
+                       else if (v=="below") { this.setTop(refTop+refHeight+this.offsetTop); }
+
+                       // Set horizontal position relative to reference object
+                       if (h=="adjacent-left") { this.setLeft(refLeft-width+this.offsetLeft); }
+                       else if (h=="left") { this.setLeft(refLeft+this.offsetLeft); }
+                       else if (h=="center") { this.setLeft(refLeft+(refWidth/2)-(width/2)+this.offsetLeft); }
+                       else if (h=="right") { this.setLeft(refLeft+refWidth-width+this.offsetLeft); }
+                       else if (h=="adjacent-right") { this.setLeft(refLeft+refWidth+this.offsetLeft); }
+               }
+       }
+       else if (this.top==null && this.left==null) {
+               this.center();
+       }
+       else {
+               if (this.top==null) { this.top=0; }
+               if (this.left==null) { this.left=0; }
+               this.div.style.top = this.top+this.offsetTop+"px";
+               this.div.style.left = this.left+this.offsetLeft+"px";
+       }
+
+       // Re-position to make sure it stays on the screen
+       if (this.constrainToScreen) {
+               this.fitToScreen();
+       }
+};
+
+// Append an object to the body
+// --------------------------------------------------------------------
+Popup.prototype.appendToBody = function(o) {
+       var body = Screen.getBody();
+       if (body && body.appendChild) {
+               body.appendChild(o);
+       }
+};
+
+// Create a new DIV object to be used for a popup
+// --------------------------------------------------------------------
+Popup.prototype.createDiv = function() {
+       if (document.createElement) {
+               var d = document.createElement("DIV");
+               d.style.position="absolute";
+               d.style.display="block";
+               d.style.visibility="hidden";
+               this.appendToBody(d);
+               return d;
+       }
+       alert("ERROR: Couldn't create DIV element in Popup.prototype.createDiv()");
+       return null;
+};
+
+// Create a new IFRAME object to be used behind the popup
+// --------------------------------------------------------------------
+Popup.prototype.createIframe = function() {
+       if (document.createElement) {
+               var i= document.createElement("IFRAME");
+               i.style.position="absolute";
+               i.style.display="block";
+               i.style.visibility="hidden";
+               i.style.background="none";
+               this.appendToBody(i);
+               return i;
+       }
+       else {
+               alert("ERROR: Couldn't create IFRAME object in Popup.prototype.createIframe()");
+       }
+};
+
+// Add an IFRAME shim for the DIV
+// --------------------------------------------------------------------
+Popup.prototype.addIframeShim = function() {
+       if (this.iframe==null) {
+               this.iframe = this.createIframe();
+       }
+       this.iframe.className = Popup.iframeClass;
+       CSS.setStyle(this.iframe,'top',this.getTop()+"px");
+       CSS.setStyle(this.iframe,'left',this.getLeft()+"px");
+       CSS.setStyle(this.iframe,'width',DOM.getOuterWidth(this.div) + "px");
+       CSS.setStyle(this.iframe,'height',DOM.getOuterHeight(this.div) + "px");
+       CSS.setStyle(this.iframe,'zIndex',Popup.minZIndex++);
+       CSS.setStyle(this.iframe,'opacity',0);
+       CSS.setStyle(this.iframe,'visibility','visible');
+       CSS.setStyle(this.iframe,'display','block');
+};
+
+// Create a "screen" to make a popup modal
+// --------------------------------------------------------------------
+Popup.prototype.addScreen = function() {
+       if (this.screen==null) {
+               this.screen = this.createDiv();
+               this.screen.style.top="0px";
+               this.screen.style.left="0px";
+               this.screen.style.backgroundColor = this.screenColor;
+               this.screen.className=Popup.screenClass;;
+               CSS.setStyle(this.screen,"opacity",this.screenOpacity);
+               this.screen.onclick = function(e) { Event.cancelBubble(Event.resolve(e)); }
+       }
+       if (this.screenIframeShim==null) {
+               this.screenIframeShim = this.createIframe();
+               this.screenIframeShim.style.top="0px";
+               this.screenIframeShim.style.left="0px";
+               this.screenIframeShim.className=Popup.screenIframeClass;
+               CSS.setStyle(this.screenIframeShim,"opacity",0);
+       }
+       this.screen.style.width = Screen.getDocumentWidth()+"px";
+       this.screen.style.height = Screen.getDocumentHeight()+"px";
+       this.screenIframeShim.style.width = Screen.getDocumentWidth()+"px";
+       this.screenIframeShim.style.height = Screen.getDocumentHeight()+"px";
+       this.screenIframeShim.style.zIndex = Popup.minZIndex++;
+       this.screenIframeShim.style.visibility="visible";
+       this.screenIframeShim.style.display="block";
+       this.screen.style.zIndex = Popup.minZIndex++;
+       this.screen.style.visibility="visible";
+       this.screen.style.display="block";
+};
+
+// Re-position the DIV so it stays on the screen
+// --------------------------------------------------------------------
+Popup.prototype.fitToScreen = function() {
+       var width = DOM.getOuterWidth(this.div);
+       var height = DOM.getOuterHeight(this.div);
+       var top = this.getTop();
+       var left = this.getLeft();
+       
+       var clientWidth = Screen.getViewportWidth();
+       var clientHeight = Screen.getViewportHeight();
+       
+       var scrollLeft = Screen.getScrollLeft();
+       var scrollTop = Screen.getScrollTop();
+
+       if (top-scrollTop+height>clientHeight) {
+               top = top - ((top+height) - (scrollTop+clientHeight));
+               this.div.style.top = top + "px";
+       }
+       if (left-scrollLeft+width>clientWidth) {
+               left = left - ((left+width) - (scrollLeft+clientWidth));
+               this.div.style.left = left + "px";
+       }
+       if (top<scrollTop) {
+               this.div.style.top=scrollTop+"px";
+       }
+       if (left<scrollLeft) {
+               this.div.style.left=scrollLeft+"px";
+       }
+};
+
+// Center the DIV object
+// --------------------------------------------------------------------
+Popup.prototype.center = function() {
+       var left = DOM.getOuterWidth(this.div);
+       var top = DOM.getOuterHeight(this.div);
+       if (isNaN(left)) { left=0; }
+       if (isNaN(top)) { top=0; }      
+       var clientW = Screen.getViewportWidth();
+       var clientH = Screen.getViewportHeight();
+       if (clientW!=null && clientH!=null) {
+               top = (clientH-top)/2;
+               left = (clientW-left)/2;
+       }
+       top += Screen.getScrollTop();
+       left += Screen.getScrollLeft();
+       
+       this.div.style.top = top+this.offsetTop+"px";
+       this.div.style.left = left+this.offsetLeft+"px";
+};
+
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/style/red.jpg b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/style/red.jpg
new file mode 100644 (file)
index 0000000..ab67c5a
Binary files /dev/null and b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/style/red.jpg differ
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/style/summary.xsl b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/style/summary.xsl
new file mode 100644 (file)
index 0000000..263fc8e
--- /dev/null
@@ -0,0 +1,523 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet version="1.0"
+       xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+       <xsl:output method="html" version="1.0" encoding="UTF-8"
+               indent="yes" />
+       <xsl:template match="/">
+               <html>
+                       <STYLE type="text/css">
+                               @import "./style/tests.css";
+                       </STYLE>
+                       <head>
+                               <script type="text/javascript" src="./style/jquery.min.js" />
+                       </head>
+                       <body>
+                               <div id="testcasepage">
+                                       <div id="title">
+                                               <table>
+                                                       <tr>
+                                                               <td>
+                                                                       <h1>TCT Report</h1>
+                                                               </td>
+                                                       </tr>
+                                               </table>
+                                       </div>
+                                       <div id="overview">
+                                       <table>
+                                               <tr>
+                                                       <td>
+                                       <div id="summary">
+                                               <table>
+                                                       <tr>
+                                                               <th colspan="2">Test Summary</th>
+                                                       </tr>
+                                                       <tr>
+                                                               <td>TCT Version</td>
+                                                               <td>
+                                                                       <xsl:value-of select="result_summary/environment/@tct_version" />
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <td>Test Plan Name</td>
+                                                               <td>
+                                                                       <xsl:value-of select="result_summary/@plan_name" />
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <td>Test Profile</td>
+                                                               <td>
+                                                                       <xsl:value-of select="result_summary/environment/@tct_profile" />
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <td>Build ID</td>
+                                                               <td>
+                                                                       <xsl:choose>
+                                                                               <xsl:when test="result_summary/environment/@build_id">
+                                                                                       <xsl:if test="result_summary/environment/@build_id = ''">
+                                                                                               N/A
+                                                                                       </xsl:if>
+                                                                                       <xsl:value-of select="result_summary/environment/@build_id" />
+                                                                               </xsl:when>
+                                                                               <xsl:otherwise>
+                                                                                       N/A
+                                                                               </xsl:otherwise>
+                                                                       </xsl:choose>
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <td>Test Total</td>
+                                                               <td>
+                                                                       <xsl:value-of select="sum(result_summary//suite/total_case)" />
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <td>Test Passed</td>
+                                                               <td>
+                                                                       <xsl:value-of select="sum(result_summary//suite/pass_case)" />
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <td>Test Failed</td>
+                                                               <td>
+                                                                       <xsl:value-of select="sum(result_summary//suite/fail_case)" />
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <td>Test Blocked</td>
+                                                               <td>
+                                                                       <xsl:value-of select="sum(result_summary//suite/block_case)" />
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <td>Test Not Executed</td>
+                                                               <td>
+                                                                       <xsl:value-of select="sum(result_summary//suite/na_case)" />
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <td>Time</td>
+                                                               <td>
+                                                                       <xsl:value-of select="result_summary/summary/start_at" />
+                                                                       ~
+                                                                       <xsl:value-of select="result_summary/summary/end_at" />
+                                                               </td>
+                                                       </tr>
+                                               </table>
+                                       </div>
+                                       </td>
+                                       <td>
+                                       <div id="device">
+                                               <table>
+                                                       <tr>
+                                                               <th colspan="2">Device Information</th>
+                                                       </tr>
+                                                       <tr>
+                                                               <td>Host Device</td>
+                                                               <td>
+                                                                       <xsl:choose>
+                                                                               <xsl:when test="result_summary/environment/@host">
+                                                                                       <xsl:if test="result_summary/environment/@host = ''">
+                                                                                               N/A
+                                                                                       </xsl:if>
+                                                                                       <xsl:value-of select="result_summary/environment/@host" />
+                                                                               </xsl:when>
+                                                                               <xsl:otherwise>
+                                                                                       N/A
+                                                                               </xsl:otherwise>
+                                                                       </xsl:choose>
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <td>Manufacturer</td>
+                                                               <td>
+                                                                       <xsl:choose>
+                                                                               <xsl:when test="result_summary/environment/@manufacturer">
+                                                                                       <xsl:if test="result_summary/environment/@manufacturer = ''">
+                                                                                               N/A
+                                                                                       </xsl:if>
+                                                                                       <xsl:value-of select="result_summary/environment/@manufacturer" />
+                                                                               </xsl:when>
+                                                                               <xsl:otherwise>
+                                                                                       N/A
+                                                                               </xsl:otherwise>
+                                                                       </xsl:choose>
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <td>Device Model</td>
+                                                               <td>
+                                                                       <xsl:choose>
+                                                                               <xsl:when test="result_summary/environment/@device_model">
+                                                                                       <xsl:if test="result_summary/environment/@device_model = ''">
+                                                                                               N/A
+                                                                                       </xsl:if>
+                                                                                       <xsl:value-of select="result_summary/environment/@device_model" />
+                                                                               </xsl:when>
+                                                                               <xsl:otherwise>
+                                                                                       N/A
+                                                                               </xsl:otherwise>
+                                                                       </xsl:choose>
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <td>Device ID</td>
+                                                               <td>
+                                                                       <xsl:choose>
+                                                                               <xsl:when test="result_summary/environment/@device_id">
+                                                                                       <xsl:if test="result_summary/environment/@device_id = ''">
+                                                                                               N/A
+                                                                                       </xsl:if>
+                                                                                       <xsl:value-of select="result_summary/environment/@device_id" />
+                                                                               </xsl:when>
+                                                                               <xsl:otherwise>
+                                                                                       N/A
+                                                                               </xsl:otherwise>
+                                                                       </xsl:choose>
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <td>Screen Size</td>
+                                                               <td>
+                                                                       <xsl:choose>
+                                                                               <xsl:when test="result_summary/environment/@screen_size">
+                                                                                       <xsl:if test="result_summary/environment/@screen_size = ''">
+                                                                                               N/A
+                                                                                       </xsl:if>
+                                                                                       <xsl:value-of select="result_summary/environment/@screen_size" />
+                                                                               </xsl:when>
+                                                                               <xsl:otherwise>
+                                                                                       N/A
+                                                                               </xsl:otherwise>
+                                                                       </xsl:choose>
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <td>Resolution</td>
+                                                               <td>
+                                                                       <xsl:choose>
+                                                                               <xsl:when test="result_summary/environment/@resolution">
+                                                                                       <xsl:if test="result_summary/environment/@resolution = ''">
+                                                                                               N/A
+                                                                                       </xsl:if>
+                                                                                       <xsl:value-of select="result_summary/environment/@resolution" />
+                                                                               </xsl:when>
+                                                                               <xsl:otherwise>
+                                                                                       N/A
+                                                                               </xsl:otherwise>
+                                                                       </xsl:choose>
+                                                               </td>
+                                                       </tr>
+                                               </table>
+                                       </div>
+                                       </td>
+                                       </tr>
+                                       </table>
+                                       </div>
+                                       <div id="capability">
+                                               <div id="title">
+                                                       <a name="contents"></a>
+                                                       <table>
+                                                               <tr>
+                                                                       <td class="title">
+                                                                               <h1><a href="#" class="see_capabilities">Device Capability</a></h1>
+                                                                       </td>
+                                                               </tr>
+                                                       </table>
+                                               </div>
+                                               <xsl:choose>
+                                                       <xsl:when test="result_summary/capabilities">
+                                                               <div id="capability_table" style="display:none;">
+                                                               <table>
+                                                                       <tr>
+                                                                               <th>Capability Name</th>
+                                                                               <th>Type</th>
+                                                                               <th>Value</th>
+                                                                       </tr>
+                                                                       <xsl:for-each select="result_summary/capabilities/capability">
+                                                                               <xsl:sort select="@name" />
+                                                                               <tr>
+                                                                                       <td>
+                                                                                               <xsl:value-of select="@name" />
+                                                                                       </td>
+                                                                                       <td>
+                                                                                               <xsl:value-of select="@type" />
+                                                                                       </td>
+                                                                                       <td>
+                                                                                               <xsl:choose>
+                                                                                                       <xsl:when test="value">
+                                                                                                               <xsl:value-of select="value" />
+                                                                                                       </xsl:when>
+                                                                                                       <xsl:otherwise>
+                                                                                                               <xsl:value-of select="@support" />
+                                                                                                       </xsl:otherwise>
+                                                                                               </xsl:choose>
+                                                                                       </td>
+                                                                               </tr>
+                                                                       </xsl:for-each>
+                                                               </table>
+                                                               </div>
+                                                       </xsl:when>
+                                                       <xsl:otherwise>
+                                                               The information of device capability is not available.
+                                                       </xsl:otherwise>
+                                               </xsl:choose>
+                                       </div>
+                                       <div id="btc">
+                                               <table>
+                                                       <tr>
+                                                               <td>
+                                                                       <a href="#" class="see_all">Show all</a>
+                                                               </td>
+                                                               <td>
+                                                                       <a href="#" class="see_failed">Show only failed</a>
+                                                               </td>
+                                                               <td>
+                                                                       <a href="#" class="see_blocked">Show only blocked</a>
+                                                               </td>
+                                                               <td>
+                                                                       <a href="#" class="see_na">Show only not executed</a>
+                                                               </td>
+                                                       </tr>
+                                               </table>
+                                       </div>
+                                       <div id="title">
+                                               <h1></h1>
+                                       </div>
+                                       <div id="suite_summary">
+                                               <div id="title">
+                                                       <a name="contents"></a>
+                                                       <table>
+                                                               <tr>
+                                                                       <td class="title">
+                                                                               <h1>Test Summary by Suite</h1>
+                                                                       </td>
+                                                               </tr>
+                                                       </table>
+                                               </div>
+                                               <div id="see_all">
+                                                       <table>
+                                                               <tr>
+                                                                       <th>Suite</th>
+                                                                       <th>Total</th>
+                                                                       <th>Passed</th>
+                                                                       <th>Failed</th>
+                                                                       <th>Blocked</th>
+                                                                       <th>Not Executed</th>
+                                                                       <th class="Ratio">Ratio</th>
+                                                               </tr>
+                                                               <xsl:for-each select="result_summary/suite">
+                                                                       <xsl:if test="total_case &gt; 0">
+                                                                               <tr class="suite_item">
+                                                                                       <xsl:attribute name="id">
+                                                               <xsl:value-of
+                                                                                               select="@name" />
+                                                   </xsl:attribute>
+                                                                                       <td>
+                                                                                               <a>
+                                                                                                       <xsl:attribute name="href"><xsl:value-of
+                                                                                                               select="@name" />.html</xsl:attribute>
+                                                                                                       <xsl:value-of select="@name" />
+                                                                                               </a>
+                                                                                       </td>
+                                                                                       <td class="total">
+                                                                                               <xsl:value-of select="total_case" />
+                                                                                       </td>
+                                                                                       <td class="pass">
+                                                                                               <xsl:value-of select="pass_case" />
+                                                                                       </td>
+                                                                                       <td class="fail">
+                                                                                               <xsl:value-of select="fail_case" />
+                                                                                       </td>
+                                                                                       <td class="block">
+                                                                                               <xsl:value-of select="block_case" />
+                                                                                       </td>
+                                                                                       <td class="na">
+                                                                                               <xsl:value-of select="na_case" />
+                                                                                       </td>
+                                                                                       <td class="Ratio">
+                                                                                               <div class="RatioGraphic" />
+                                                                                       </td>
+                                                                               </tr>
+                                                                       </xsl:if>
+                                                               </xsl:for-each>
+                                                       </table>
+                                               </div>
+                                               <div id="see_fail" style="display:none;">
+                                                       <table>
+                                                               <tr>
+                                                                       <th>Suite</th>
+                                                                       <th>Total</th>
+                                                                       <th>Passed</th>
+                                                                       <th>Failed</th>
+                                                                       <th>Blocked</th>
+                                                                       <th>Not Executed</th>
+                                                                       <th class="Ratio">Ratio</th>
+                                                               </tr>
+                                                               <xsl:for-each select="result_summary/suite">
+                                                                       <xsl:if test="fail_case &gt; 0">
+                                                                               <tr class="suite_item">
+                                                                                       <xsl:attribute name="id">
+                                                               <xsl:value-of
+                                                                                               select="@name" />
+                                                   </xsl:attribute>
+                                                                                       <td>
+                                                                                               <a>
+                                                                                                       <xsl:attribute name="href"><xsl:value-of
+                                                                                                               select="@name" />.html</xsl:attribute>
+                                                                                                       <xsl:value-of select="@name" />
+                                                                                               </a>
+                                                                                       </td>
+                                                                                       <td class="total">
+                                                                                               <xsl:value-of select="total_case" />
+                                                                                       </td>
+                                                                                       <td class="pass">
+                                                                                               <xsl:value-of select="pass_case" />
+                                                                                       </td>
+                                                                                       <td class="fail">
+                                                                                               <xsl:value-of select="fail_case" />
+                                                                                       </td>
+                                                                                       <td class="block">
+                                                                                               <xsl:value-of select="block_case" />
+                                                                                       </td>
+                                                                                       <td class="na">
+                                                                                               <xsl:value-of select="na_case" />
+                                                                                       </td>
+                                                                                       <td class="Ratio">
+                                                                                               <div class="RatioGraphic" />
+                                                                                       </td>
+                                                                               </tr>
+                                                                       </xsl:if>
+                                                               </xsl:for-each>
+                                                       </table>
+                                               </div>
+                                               <div id="see_block" style="display:none;">
+                                                       <table>
+                                                               <tr>
+                                                                       <th>Suite</th>
+                                                                       <th>Total</th>
+                                                                       <th>Passed</th>
+                                                                       <th>Failed</th>
+                                                                       <th>Blocked</th>
+                                                                       <th>Not Executed</th>
+                                                                       <th class="Ratio">Ratio</th>
+                                                               </tr>
+                                                               <xsl:for-each select="result_summary/suite">
+                                                                       <xsl:if test="block_case &gt; 0">
+                                                                               <tr class="suite_item">
+                                                                                       <xsl:attribute name="id">
+                                                               <xsl:value-of
+                                                                                               select="@name" />
+                                                   </xsl:attribute>
+                                                                                       <td>
+                                                                                               <a>
+                                                                                                       <xsl:attribute name="href"><xsl:value-of
+                                                                                                               select="@name" />.html</xsl:attribute>
+                                                                                                       <xsl:value-of select="@name" />
+                                                                                               </a>
+                                                                                       </td>
+                                                                                       <td class="total">
+                                                                                               <xsl:value-of select="total_case" />
+                                                                                       </td>
+                                                                                       <td class="pass">
+                                                                                               <xsl:value-of select="pass_case" />
+                                                                                       </td>
+                                                                                       <td class="fail">
+                                                                                               <xsl:value-of select="fail_case" />
+                                                                                       </td>
+                                                                                       <td class="block">
+                                                                                               <xsl:value-of select="block_case" />
+                                                                                       </td>
+                                                                                       <td class="na">
+                                                                                               <xsl:value-of select="na_case" />
+                                                                                       </td>
+                                                                                       <td class="Ratio">
+                                                                                               <div class="RatioGraphic" />
+                                                                                       </td>
+                                                                               </tr>
+                                                                       </xsl:if>
+                                                               </xsl:for-each>
+                                                       </table>
+                                               </div>
+                                               <div id="see_na" style="display:none;">
+                                                       <table>
+                                                               <tr>
+                                                                       <th>Suite</th>
+                                                                       <th>Total</th>
+                                                                       <th>Passed</th>
+                                                                       <th>Failed</th>
+                                                                       <th>Blocked</th>
+                                                                       <th>Not Executed</th>
+                                                                       <th class="Ratio">Ratio</th>
+                                                               </tr>
+                                                               <xsl:for-each select="result_summary/suite">
+                                                                       <xsl:if test="na_case &gt; 0">
+                                                                               <tr class="suite_item">
+                                                                                       <xsl:attribute name="id">
+                                                               <xsl:value-of
+                                                                                               select="@name" />
+                                                   </xsl:attribute>
+                                                                                       <td>
+                                                                                               <a>
+                                                                                                       <xsl:attribute name="href"><xsl:value-of
+                                                                                                               select="@name" />.html</xsl:attribute>
+                                                                                                       <xsl:value-of select="@name" />
+                                                                                               </a>
+                                                                                       </td>
+                                                                                       <td class="total">
+                                                                                               <xsl:value-of select="total_case" />
+                                                                                       </td>
+                                                                                       <td class="pass">
+                                                                                               <xsl:value-of select="pass_case" />
+                                                                                       </td>
+                                                                                       <td class="fail">
+                                                                                               <xsl:value-of select="fail_case" />
+                                                                                       </td>
+                                                                                       <td class="block">
+                                                                                               <xsl:value-of select="block_case" />
+                                                                                       </td>
+                                                                                       <td class="na">
+                                                                                               <xsl:value-of select="na_case" />
+                                                                                       </td>
+                                                                                       <td class="Ratio">
+                                                                                               <div class="RatioGraphic" />
+                                                                                       </td>
+                                                                               </tr>
+                                                                       </xsl:if>
+                                                               </xsl:for-each>
+                                                       </table>
+                                               </div>
+                                       </div>
+                               </div>
+                               <div id="goTopBtn">
+                                       <img border="0" src="./style/back_top.png" />
+                               </div>
+                               <script type="text/javascript" src="./style/application.js" />
+                               <script language="javascript" type="text/javascript">
+                                       $(document).ready(function(){
+                                       goTopEx();
+                                       drawRatio();
+                                       });
+                               </script>
+                       </body>
+               </html>
+       </xsl:template>
+       <xsl:template name="br-replace">
+               <xsl:param name="word" />
+               <xsl:variable name="cr">
+                       <xsl:text>\n</xsl:text>
+               </xsl:variable>
+               <xsl:choose>
+                       <xsl:when test="contains($word,$cr)">
+                               <xsl:value-of select="substring-before($word,$cr)" />
+                               <br />
+                               <xsl:call-template name="br-replace">
+                                       <xsl:with-param name="word" select="substring-after($word,$cr)" />
+                               </xsl:call-template>
+                       </xsl:when>
+                       <xsl:otherwise>
+                               <xsl:value-of select="$word" />
+                       </xsl:otherwise>
+               </xsl:choose>
+       </xsl:template>
+</xsl:stylesheet>
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/style/testresult.xsl b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/style/testresult.xsl
new file mode 100644 (file)
index 0000000..78e17ac
--- /dev/null
@@ -0,0 +1,559 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet version="1.0"
+       xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+       <xsl:output method="html" version="1.0" encoding="UTF-8"
+               indent="yes" />
+       <xsl:template match="/">
+               <html>
+                       <STYLE type="text/css">
+                               @import "./style/tests.css";
+                       </STYLE>
+                       <head>
+                               <script type="text/javascript" src="./style/jquery.min.js" />
+                               <script type="text/javascript" src="./style/popup.js" />
+                       </head>
+                       <body>
+                               <div id="title">
+                                       <table>
+                                               <tr>
+                                                       <td class="title">
+                                                               <h1 align="center">Suite Test Results</h1>
+                                                       </td>
+                                               </tr>
+                                       </table>
+                               </div>
+                               <div id="btc">
+                                       <table>
+                                               <tr>
+                                                       <td>
+                                                               <a href="#" class="see_all">Show all</a>
+                                                       </td>
+                                                       <td>
+                                                               <a href="#" class="see_failed">Show only failed</a>
+                                                       </td>
+                                                       <td>
+                                                               <a href="#" class="see_blocked">Show only blocked</a>
+                                                       </td>
+                                                       <td>
+                                                               <a href="#" class="see_na">Show only not executed</a>
+                                                       </td>
+                                                       <td>
+                                                               <a href="report.html">Summary</a>
+                                                       </td>
+                                               </tr>
+                                       </table>
+                               </div>
+                               <div id="testcasepage">
+                                       <div id="cases">
+                                               <div id="see_all">
+                                                       <xsl:for-each select="test_definition/suite">
+                                                               <div id="suite_title">
+                                                                       <h2>
+                                                                               Test Suite:
+                                                                               <xsl:value-of select="@name" />
+                                                                               (All)
+                                                                       </h2>
+                                                                       <a>
+                                                                               <xsl:attribute name="name">
+                                                                     <xsl:value-of
+                                                                                       select="@name" />
+                                                                  </xsl:attribute>
+                                                                       </a>
+                                                               </div>
+                                                               <table>
+                                                                       <tr>
+                                                                               <th>Case_ID</th>
+                                                                               <th>Purpose</th>
+                                                                               <th>Result</th>
+                                                                               <th>Stdout</th>
+                                                                       </tr>
+                                                                       <xsl:for-each select=".//set">
+                                                                               <tr>
+                                                                                       <xsl:choose>
+                                                                                               <xsl:when test="@name">
+                                                                                                       <td colspan="3">
+                                                                                                               <h3>
+                                                                                                                       Test Set:
+                                                                                                                       <xsl:value-of select="@name" />
+                                                                                                               </h3>
+                                                                                                       </td>
+                                                                                                       <td colspan="1">
+                                                                                                               <h4>
+                                                                                                                       <a>
+                                                                                                                               <xsl:attribute name="href"><xsl:value-of
+                                                                                                                                       select="@set_debug_msg" /></xsl:attribute>
+                                                                                                                               dlog
+                                                                                                                       </a>
+                                                                                                               </h4>
+                                                                                                       </td>
+                                                                                               </xsl:when>
+                                                                                               <xsl:otherwise>
+                                                                                                       <td colspan="4">
+                                                                                                               <h3>
+                                                                                                                       Test Set:
+                                                                                                                       <xsl:value-of select="@name" />
+                                                                                                               </h3>
+                                                                                                       </td>
+                                                                                               </xsl:otherwise>
+                                                                                       </xsl:choose>
+                                                                               </tr>
+                                                                               <xsl:for-each select=".//testcase">
+                                                                                       <tr>
+                                                                                               <td>
+                                                                                                       <div
+                                                                                                               style="background-color:#F5DEB3;border:1px solid black;display:none;">
+                                                                                                               <xsl:attribute name="id"><xsl:value-of
+                                                                                                                       select="@id" /></xsl:attribute>
+                                                                                                               <p>
+                                                                                                                       <xsl:for-each select="./description/steps//step">
+                                                                                                                               <xsl:sort select="@order" />
+                                                                                                                               <B>
+                                                                                                                                       Step
+                                                                                                                                       <xsl:value-of select="@order" />
+                                                                                                                                       :
+                                                                                                                               </B>
+                                                                                                                               <br />
+                                                                                                                               <xsl:value-of select=".//step_desc" />
+                                                                                                                               <br />
+                                                                                                                               <B>Expected:</B>
+                                                                                                                               <xsl:value-of select=".//expected" />
+                                                                                                                               <br />
+                                                                                                                       </xsl:for-each>
+                                                                                                               </p>
+                                                                                                               <p>
+                                                                                                                       <br />
+                                                                                                                       <B>
+                                                                                                                               Entry:
+                                                                                                                               <br />
+                                                                                                                       </B>
+                                                                                                                       <xsl:value-of select="./description//test_script_entry" />
+                                                                                                                       <br />
+                                                                                                               </p>
+                                                                                                       </div>
+                                                                                                       <a href="#" class="test_case_popup">
+                                                                                                               <xsl:attribute name="id"><xsl:value-of
+                                                                                                                       select="@id" /></xsl:attribute>
+                                                                                                               <xsl:value-of select="@id" />
+                                                                                                       </a>
+                                                                                               </td>
+                                                                                               <td>
+                                                                                                       <xsl:value-of select="@purpose" />
+                                                                                               </td>
+
+                                                                                               <xsl:choose>
+                                                                                                       <xsl:when test="@result">
+                                                                                                               <xsl:if test="@result = 'FAIL'">
+                                                                                                                       <td class="red_rate">
+                                                                                                                               <xsl:value-of select="@result" />
+                                                                                                                       </td>
+                                                                                                               </xsl:if>
+                                                                                                               <xsl:if test="@result = 'PASS'">
+                                                                                                                       <td class="green_rate">
+                                                                                                                               <xsl:value-of select="@result" />
+                                                                                                                       </td>
+                                                                                                               </xsl:if>
+                                                                                                               <xsl:if test="@result = 'BLOCK' ">
+                                                                                                                       <td class="orange_rate">
+                                                                                                                               BLOCK
+                                                                                                                       </td>
+                                                                                                               </xsl:if>
+                                                                                                               <xsl:if
+                                                                                                                       test="@result != 'BLOCK' and @result != 'FAIL' and @result != 'PASS' ">
+                                                                                                                       <td class="gray_rate">
+                                                                                                                               Not Run
+                                                                                                                       </td>
+                                                                                                               </xsl:if>
+                                                                                                       </xsl:when>
+                                                                                                       <xsl:otherwise>
+                                                                                                               <td>
+
+                                                                                                               </td>
+                                                                                                       </xsl:otherwise>
+                                                                                               </xsl:choose>
+                                                                                               <td>
+                                                                                                       <xsl:call-template name="br-replace">
+                                                                                                               <xsl:with-param name="word"
+                                                                                                                       select=".//result_info/stdout" />
+                                                                                                       </xsl:call-template>
+                                                                                                       <xsl:if test=".//result_info/stdout = ''">
+                                                                                                               N/A
+                                                                                                       </xsl:if>
+                                                                                               </td>
+                                                                                       </tr>
+                                                                               </xsl:for-each>
+                                                                       </xsl:for-each>
+                                                               </table>
+                                                       </xsl:for-each>
+                                               </div>
+                                               <div id="see_fail" style="display:none;">
+                                                       <xsl:for-each select="test_definition/suite">
+                                                               <div id="suite_title">
+                                                                       <h2>
+                                                                               Test Suite:
+                                                                               <xsl:value-of select="@name" />
+                                                                               (Failed only)
+                                                                       </h2>
+                                                                       <a>
+                                                                               <xsl:attribute name="name">
+                                                                     <xsl:value-of
+                                                                                       select="@name" />
+                                                                  </xsl:attribute>
+                                                                       </a>
+                                                               </div>
+                                                               <table>
+                                                                       <tr>
+                                                                               <th>Case_ID</th>
+                                                                               <th>Purpose</th>
+                                                                               <th>Result</th>
+                                                                               <th>Stdout</th>
+                                                                       </tr>
+                                                                       <xsl:for-each select=".//set">
+                                                                               <tr>
+                                                                                       <xsl:choose>
+                                                                                               <xsl:when test="@name">
+                                                                                                       <td colspan="3">
+                                                                                                               <h3>
+                                                                                                                       Test Set:
+                                                                                                                       <xsl:value-of select="@name" />
+                                                                                                               </h3>
+                                                                                                       </td>
+                                                                                                       <td colspan="1">
+                                                                                                               <h4>
+                                                                                                                       <a>
+                                                                                                                               <xsl:attribute name="href"><xsl:value-of
+                                                                                                                                       select="@set_debug_msg" /></xsl:attribute>
+                                                                                                                               dlog
+                                                                                                                       </a>
+                                                                                                               </h4>
+                                                                                                       </td>
+                                                                                               </xsl:when>
+                                                                                               <xsl:otherwise>
+                                                                                                       <td colspan="4">
+                                                                                                               <h3>
+                                                                                                                       Test Set:
+                                                                                                                       <xsl:value-of select="@name" />
+                                                                                                               </h3>
+                                                                                                       </td>
+                                                                                               </xsl:otherwise>
+                                                                                       </xsl:choose>
+                                                                               </tr>
+                                                                               <xsl:for-each select=".//testcase[@result='FAIL']">
+                                                                                       <tr>
+                                                                                               <td>
+                                                                                                       <div
+                                                                                                               style="background-color:#F5DEB3;border:1px solid black;display:none;">
+                                                                                                               <xsl:attribute name="id">fail_<xsl:value-of
+                                                                                                                       select="@id" /></xsl:attribute>
+                                                                                                               <p>
+                                                                                                                       <xsl:for-each select="./description/steps//step">
+                                                                                                                               <xsl:sort select="@order" />
+                                                                                                                               <B>
+                                                                                                                                       Step
+                                                                                                                                       <xsl:value-of select="@order" />
+                                                                                                                                       :
+                                                                                                                               </B>
+                                                                                                                               <br />
+                                                                                                                               <xsl:value-of select=".//step_desc" />
+                                                                                                                               <br />
+                                                                                                                               <B>Expected:</B>
+                                                                                                                               <xsl:value-of select=".//expected" />
+                                                                                                                               <br />
+                                                                                                                       </xsl:for-each>
+                                                                                                               </p>
+                                                                                                               <p>
+                                                                                                                       <br />
+                                                                                                                       <B>
+                                                                                                                               Entry:
+                                                                                                                               <br />
+                                                                                                                       </B>
+                                                                                                                       <xsl:value-of select="./description//test_script_entry" />
+                                                                                                                       <br />
+                                                                                                               </p>
+                                                                                                       </div>
+                                                                                                       <a href="#" class="test_case_popup">
+                                                                                                               <xsl:attribute name="id">fail_<xsl:value-of
+                                                                                                                       select="@id" /></xsl:attribute>
+                                                                                                               <xsl:value-of select="@id" />
+                                                                                                       </a>
+                                                                                               </td>
+                                                                                               <td>
+                                                                                                       <xsl:value-of select="@purpose" />
+                                                                                               </td>
+
+                                                                                               <td class="red_rate">
+                                                                                                       <xsl:value-of select="@result" />
+                                                                                               </td>
+                                                                                               <td>
+                                                                                                       <xsl:call-template name="br-replace">
+                                                                                                               <xsl:with-param name="word"
+                                                                                                                       select=".//result_info/stdout" />
+                                                                                                       </xsl:call-template>
+                                                                                                       <xsl:if test=".//result_info/stdout = ''">
+                                                                                                               N/A
+                                                                                                       </xsl:if>
+                                                                                               </td>
+                                                                                       </tr>
+                                                                               </xsl:for-each>
+                                                                       </xsl:for-each>
+                                                               </table>
+                                                       </xsl:for-each>
+                                               </div>
+                                               <div id="see_block" style="display:none;">
+                                                       <xsl:for-each select="test_definition/suite">
+                                                               <div id="suite_title">
+                                                                       <h2>
+                                                                               Test Suite:
+                                                                               <xsl:value-of select="@name" />
+                                                                               (Blocked Only)
+                                                                       </h2>
+                                                                       <a>
+                                                                               <xsl:attribute name="name">
+                                                                     <xsl:value-of
+                                                                                       select="@name" />
+                                                                  </xsl:attribute>
+                                                                       </a>
+                                                               </div>
+                                                               <table>
+                                                                       <tr>
+                                                                               <th>Case_ID</th>
+                                                                               <th>Purpose</th>
+                                                                               <th>Result</th>
+                                                                               <th>Stdout</th>
+                                                                       </tr>
+                                                                       <xsl:for-each select=".//set">
+                                                                               <tr>
+                                                                                       <xsl:choose>
+                                                                                               <xsl:when test="@name">
+                                                                                                       <td colspan="3">
+                                                                                                               <h3>
+                                                                                                                       Test Set:
+                                                                                                                       <xsl:value-of select="@name" />
+                                                                                                               </h3>
+                                                                                                       </td>
+                                                                                                       <td colspan="1">
+                                                                                                               <h4>
+                                                                                                                       <a>
+                                                                                                                               <xsl:attribute name="href"><xsl:value-of
+                                                                                                                                       select="@set_debug_msg" /></xsl:attribute>
+                                                                                                                               dlog
+                                                                                                                       </a>
+                                                                                                               </h4>
+                                                                                                       </td>
+                                                                                               </xsl:when>
+                                                                                               <xsl:otherwise>
+                                                                                                       <td colspan="4">
+                                                                                                               <h3>
+                                                                                                                       Test Set:
+                                                                                                                       <xsl:value-of select="@name" />
+                                                                                                               </h3>
+                                                                                                       </td>
+                                                                                               </xsl:otherwise>
+                                                                                       </xsl:choose>
+                                                                               </tr>
+                                                                               <xsl:for-each select=".//testcase[@result='BLOCK']">
+                                                                                       <tr>
+                                                                                               <td>
+                                                                                                       <div
+                                                                                                               style="background-color:#F5DEB3;border:1px solid black;display:none;">
+                                                                                                               <xsl:attribute name="id">block_<xsl:value-of
+                                                                                                                       select="@id" /></xsl:attribute>
+                                                                                                               <p>
+                                                                                                                       <xsl:for-each select="./description/steps//step">
+                                                                                                                               <xsl:sort select="@order" />
+                                                                                                                               <B>
+                                                                                                                                       Step
+                                                                                                                                       <xsl:value-of select="@order" />
+                                                                                                                                       :
+                                                                                                                               </B>
+                                                                                                                               <br />
+                                                                                                                               <xsl:value-of select=".//step_desc" />
+                                                                                                                               <br />
+                                                                                                                               <B>Expected:</B>
+                                                                                                                               <xsl:value-of select=".//expected" />
+                                                                                                                               <br />
+                                                                                                                       </xsl:for-each>
+                                                                                                               </p>
+                                                                                                               <p>
+                                                                                                                       <br />
+                                                                                                                       <B>
+                                                                                                                               Entry:
+                                                                                                                               <br />
+                                                                                                                       </B>
+                                                                                                                       <xsl:value-of select="./description//test_script_entry" />
+                                                                                                                       <br />
+                                                                                                               </p>
+                                                                                                       </div>
+                                                                                                       <a href="#" class="test_case_popup">
+                                                                                                               <xsl:attribute name="id">block_<xsl:value-of
+                                                                                                                       select="@id" /></xsl:attribute>
+                                                                                                               <xsl:value-of select="@id" />
+                                                                                                       </a>
+                                                                                               </td>
+                                                                                               <td>
+                                                                                                       <xsl:value-of select="@purpose" />
+                                                                                               </td>
+
+                                                                                               <td class="orange_rate">
+                                                                                                       <xsl:value-of select="@result" />
+                                                                                               </td>
+                                                                                               <td>
+                                                                                                       <xsl:call-template name="br-replace">
+                                                                                                               <xsl:with-param name="word"
+                                                                                                                       select=".//result_info/stdout" />
+                                                                                                       </xsl:call-template>
+                                                                                                       <xsl:if test=".//result_info/stdout = ''">
+                                                                                                               N/A
+                                                                                                       </xsl:if>
+                                                                                               </td>
+                                                                                       </tr>
+                                                                               </xsl:for-each>
+                                                                       </xsl:for-each>
+                                                               </table>
+                                                       </xsl:for-each>
+                                               </div>
+                                               <div id="see_na" style="display:none;">
+                                                       <xsl:for-each select="test_definition/suite">
+                                                               <div id="suite_title">
+                                                                       <h2>
+                                                                               Test Suite:
+                                                                               <xsl:value-of select="@name" />
+                                                                               (Not executed Only)
+                                                                       </h2>
+                                                                       <a>
+                                                                               <xsl:attribute name="name">
+                                                                     <xsl:value-of
+                                                                                       select="@name" />
+                                                                  </xsl:attribute>
+                                                                       </a>
+                                                               </div>
+                                                               <table>
+                                                                       <tr>
+                                                                               <th>Case_ID</th>
+                                                                               <th>Purpose</th>
+                                                                               <th>Result</th>
+                                                                               <th>Stdout</th>
+                                                                       </tr>
+                                                                       <xsl:for-each select=".//set">
+                                                                               <tr>
+                                                                                       <xsl:choose>
+                                                                                               <xsl:when test="@name">
+                                                                                                       <td colspan="3">
+                                                                                                               <h3>
+                                                                                                                       Test Set:
+                                                                                                                       <xsl:value-of select="@name" />
+                                                                                                               </h3>
+                                                                                                       </td>
+                                                                                                       <td colspan="1">
+                                                                                                               <h4>
+                                                                                                                       <a>
+                                                                                                                               <xsl:attribute name="href"><xsl:value-of
+                                                                                                                                       select="@set_debug_msg" /></xsl:attribute>
+                                                                                                                               dlog
+                                                                                                                       </a>
+                                                                                                               </h4>
+                                                                                                       </td>
+                                                                                               </xsl:when>
+                                                                                               <xsl:otherwise>
+                                                                                                       <td colspan="4">
+                                                                                                               <h3>
+                                                                                                                       Test Set:
+                                                                                                                       <xsl:value-of select="@name" />
+                                                                                                               </h3>
+                                                                                                       </td>
+                                                                                               </xsl:otherwise>
+                                                                                       </xsl:choose>
+                                                                               </tr>
+                                                                               <xsl:for-each select=".//testcase[@result='N/A']">
+                                                                                       <tr>
+                                                                                               <td>
+                                                                                                       <div
+                                                                                                               style="background-color:#F5DEB3;border:1px solid black;display:none;">
+                                                                                                               <xsl:attribute name="id">na_<xsl:value-of
+                                                                                                                       select="@id" /></xsl:attribute>
+                                                                                                               <p>
+                                                                                                                       <xsl:for-each select="./description/steps//step">
+                                                                                                                               <xsl:sort select="@order" />
+                                                                                                                               <B>
+                                                                                                                                       Step
+                                                                                                                                       <xsl:value-of select="@order" />
+                                                                                                                                       :
+                                                                                                                               </B>
+                                                                                                                               <br />
+                                                                                                                               <xsl:value-of select=".//step_desc" />
+                                                                                                                               <br />
+                                                                                                                               <B>Expected:</B>
+                                                                                                                               <xsl:value-of select=".//expected" />
+                                                                                                                               <br />
+                                                                                                                       </xsl:for-each>
+                                                                                                               </p>
+                                                                                                               <p>
+                                                                                                                       <br />
+                                                                                                                       <B>
+                                                                                                                               Entry:
+                                                                                                                               <br />
+                                                                                                                       </B>
+                                                                                                                       <xsl:value-of select="./description//test_script_entry" />
+                                                                                                                       <br />
+                                                                                                               </p>
+                                                                                                       </div>
+                                                                                                       <a href="#" class="test_case_popup">
+                                                                                                               <xsl:attribute name="id">na_<xsl:value-of
+                                                                                                                       select="@id" /></xsl:attribute>
+                                                                                                               <xsl:value-of select="@id" />
+                                                                                                       </a>
+                                                                                               </td>
+                                                                                               <td>
+                                                                                                       <xsl:value-of select="@purpose" />
+                                                                                               </td>
+
+                                                                                               <td class="gray_rate">
+                                                                                                       <xsl:value-of select="@result" />
+                                                                                               </td>
+                                                                                               <td>
+                                                                                                       <xsl:call-template name="br-replace">
+                                                                                                               <xsl:with-param name="word"
+                                                                                                                       select=".//result_info/stdout" />
+                                                                                                       </xsl:call-template>
+                                                                                                       <xsl:if test=".//result_info/stdout = ''">
+                                                                                                               N/A
+                                                                                                       </xsl:if>
+                                                                                               </td>
+                                                                                       </tr>
+                                                                               </xsl:for-each>
+                                                                       </xsl:for-each>
+                                                               </table>
+                                                       </xsl:for-each>
+                                               </div>
+                                       </div>
+                               </div>
+                               <div id="goTopBtn">
+                                       <img border="0" src="./style/back_top.png" />
+                               </div>
+                               <script type="text/javascript" src="./style/application.js" />
+                               <script language="javascript" type="text/javascript">
+                                       $(document).ready(function(){
+                                       goTopEx();
+                                       });
+                               </script>
+                       </body>
+               </html>
+       </xsl:template>
+       <xsl:template name="br-replace">
+               <xsl:param name="word" />
+               <xsl:variable name="cr">
+                       <xsl:text>\n</xsl:text>
+               </xsl:variable>
+               <xsl:choose>
+                       <xsl:when test="contains($word,$cr)">
+                               <xsl:value-of select="substring-before($word,$cr)" />
+                               <br />
+                               <xsl:call-template name="br-replace">
+                                       <xsl:with-param name="word" select="substring-after($word,$cr)" />
+                               </xsl:call-template>
+                       </xsl:when>
+                       <xsl:otherwise>
+                               <xsl:value-of select="$word" />
+                       </xsl:otherwise>
+               </xsl:choose>
+       </xsl:template>
+</xsl:stylesheet>
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/style/tests.css b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/style/tests.css
new file mode 100644 (file)
index 0000000..2fda634
--- /dev/null
@@ -0,0 +1,195 @@
+@charset "UTF-8";
+/* CSS Document */
+#testcasepage div,#testcasepage h1,#testcasepage p,#testcasepage table,#testcasepage tr,#testcasepage th,#testcasepage td
+       {
+       margin: 0;
+       padding: 0;
+       border: 0;
+       font-weight: inherit;
+       font-style: inherit;
+       font-size: 0.96em;
+       font-family: arial;
+       vertical-align: baseline;
+}
+
+#title td, #btc td{
+       margin: 0;
+       padding: 0;
+       border: 0;
+       font-weight: inherit;
+       font-style: inherit;
+       font-size: 0.96em;
+       font-family: arial;
+       vertical-align: baseline;
+}
+
+td.Ratio {
+       text-align: left;
+       font-weight: normal;
+       padding: 4px 10px 4px 5px;
+       vertical-align: middle;
+}
+
+th.Ratio {
+       width: 400px;
+}
+
+#testcasepage p {
+       text-align: left;
+}
+
+#suite_title {
+       text-align: left;
+}
+
+#btc {
+       text-align: right;
+}
+
+#btc table {
+       position: absolute;
+       right: 0px;
+       width: 600px;
+}
+
+#testcasepage table {
+       border-collapse: separate;
+       border-spacing: 0;
+       margin-bottom: 1.4em;
+       vertical-align: middle;
+}
+
+#testcasepage th,#testcasepage td {
+       text-align: left;
+       font-weight: normal;
+       padding: 4px 10px 4px 5px;
+       vertical-align: middle;
+}
+
+#cases table {
+       width: 101%;
+}
+
+#cases td {
+       border-left: 0px;
+       font-weight: normal;
+       border-bottom: 0px;
+}
+
+#suite_summary table {
+       width: 100%;
+}
+
+
+#overview table {
+       width: 101%;
+}
+
+#overview table, #overview td, #overview tr {
+       border-left: none;
+       border-bottom: none;
+       border-right: none;
+       vertical-align: top;
+}
+
+#overview td{
+       width: 50%;
+}
+
+#capability table {
+       width: 50%;
+}
+
+#fail_cases table {
+       width: 101%;
+}
+
+#title table {
+       width: 101%;
+}
+
+#device table {
+       width: 100%;
+}
+
+#summary table {
+       width: 100%;
+}
+
+#testcasepage th {
+       border-bottom: 1px solid #000;
+       background-color: #AAAAAA;
+       border-left: 1px solid #000;
+       border-top: 1px solid #000;
+       color: #000;
+       font-weight: bold;
+       vertical-align: bottom;
+}
+
+#summary th:last-child,#summary td:last-child, #device th:last-child,#device td:last-child, #suite_summary th:last-child,#suite_summary td:last-child,#cases th:last-child,#cases td:last-child,#capability th:last-child,#capability td:last-child {
+       border-right: 1px solid #000;
+}
+
+#testcasepage td {
+       font-weight: normal;
+}
+
+#summary td, #device td, #capability td, #suite_summary td, #cases td{
+       border-left: 1px solid;
+       font-weight: normal;
+       border-bottom: 1px solid;
+}
+
+#testcasepage td.yellow_rate {
+       background-color: #ffcc00;
+}
+
+#testcasepage td.green_rate {
+       background-color: #1E90FF;
+}
+
+#testcasepage td.dgreen_rate {
+       background-color: #339933;
+}
+
+#testcasepage td.red_rate {
+       background-color: #FF3333;
+}
+
+#testcasepage td.orange_rate {
+       background-color: #FFA500;
+}
+
+#testcasepage td.gray_rate {
+       background-color: #AAAAAA;
+}
+
+#title table,#title tr,#title td {
+       border-left: none;
+       border-bottom: none;
+       text-align: center;
+}
+
+#title td:last-child {
+       border-right: none;
+}
+
+#testcasepage h1 {
+       font-size: 2em;
+       font-family: Arial, sans-serif;
+       font-weight: bold;
+       line-height: 1;
+       color: #000;
+       margin-bottom: 0.75em;
+       padding-top: 0.25em;
+       font-weight: bold;
+}
+
+#goTopBtn {
+       right: 0px;
+       bottom: 0px;
+       position: fixed; +
+       position: absolute;
+       top: expression(parseInt(document.body.scrollTop)+document.body.clientHeight-40
+               );
+}
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/tmp/temp b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/manager/tmp/temp
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/.cproject b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/.cproject
new file mode 100644 (file)
index 0000000..db22a91
--- /dev/null
@@ -0,0 +1,543 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
+       <storageModule moduleId="org.eclipse.cdt.core.settings">
+               <cconfiguration id="org.tizen.nativecore.config.sbi.gcc45.app.debug.542757660">
+                       <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="org.tizen.nativecore.config.sbi.gcc45.app.debug.542757660" moduleId="org.eclipse.cdt.core.settings" name="Debug">
+                               <externalSettings/>
+                               <extensions>
+                                       <extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+                                       <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+                                       <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
+                                       <extension id="org.eclipse.cdt.core.MakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+                                       <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+                                       <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+                                       <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+                               </extensions>
+                       </storageModule>
+                       <storageModule moduleId="cdtBuildSystem" version="4.0.0">
+                               <configuration artifactName="{TESTSUITE_NAME}" buildArtefactType="org.tizen.nativecore.buildArtefactType.app" buildProperties="org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug,org.eclipse.cdt.build.core.buildArtefactType=org.tizen.nativecore.buildArtefactType.app" description="" errorParsers="org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;" id="org.tizen.nativecore.config.sbi.gcc45.app.debug.542757660" name="Debug" parent="org.tizen.nativecore.config.sbi.gcc45.app.debug">
+                                       <folderInfo id="org.tizen.nativecore.config.sbi.gcc45.app.debug.542757660." name="/" resourcePath="">
+                                               <toolChain id="org.tizen.nativecore.toolchain.sbi.gcc45.app.debug.1784086492" name="Tizen Native Toolchain" superClass="org.tizen.nativecore.toolchain.sbi.gcc45.app.debug">
+                                                       <targetPlatform binaryParser="org.eclipse.cdt.core.ELF" id="org.tizen.nativeide.target.sbi.gnu.platform.base.165304646" osList="linux,win32" superClass="org.tizen.nativeide.target.sbi.gnu.platform.base"/>
+                                                       <builder autoBuildTarget="all" buildPath="${workspace_loc:/{TESTSUITE_NAME}/Debug}" enableAutoBuild="true" id="org.tizen.nativecore.target.sbi.gnu.builder.910776161" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Tizen Application Builder" superClass="org.tizen.nativecore.target.sbi.gnu.builder"/>
+                                                       <tool id="org.tizen.nativecore.tool.sbi.gnu.archiver.707842937" name="Archiver" superClass="org.tizen.nativecore.tool.sbi.gnu.archiver"/>
+                                                       <tool command="clang++" id="org.tizen.nativecore.tool.sbi.gnu.cpp.compiler.1219153705" name="C++ Compiler" superClass="org.tizen.nativecore.tool.sbi.gnu.cpp.compiler">
+                                                               <option id="gnu.cpp.compiler.option.optimization.level.235211314" name="Optimization Level" superClass="gnu.cpp.compiler.option.optimization.level" value="gnu.cpp.compiler.optimization.level.none" valueType="enumerated"/>
+                                                               <option id="sbi.gnu.cpp.compiler.option.debugging.level.275888905" name="Debug level" superClass="sbi.gnu.cpp.compiler.option.debugging.level" value="gnu.cpp.compiler.debugging.level.max" valueType="enumerated"/>
+                                                               <option id="sbi.gnu.cpp.compiler.option.debug.applog.437831432" name="Enable application logging (-D_APP_LOG)" superClass="sbi.gnu.cpp.compiler.option.debug.applog" value="true" valueType="boolean"/>
+                                                               <option id="sbi.gnu.cpp.compiler.option.2067868547" superClass="sbi.gnu.cpp.compiler.option" valueType="userObjs">
+                                                                       <listOptionValue builtIn="false" value="mobile-2.4-emulator.core_llvm36.i386.core.app"/>
+                                                               </option>
+                                                               <option id="sbi.gnu.cpp.compiler.option.frameworks_inc.core.1395160493" superClass="sbi.gnu.cpp.compiler.option.frameworks_inc.core" valueType="includePath">
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/libxml2&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/appcore-agent&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/appfw&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/attach-panel&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/badge&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/base&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/cairo&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/calendar-service2&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ckm&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/contacts-svc&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/content&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/context-service&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/dali&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/dali-toolkit&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/dbus-1.0&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/device&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/dlog&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ecore-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ecore-con-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ecore-evas-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ecore-file-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ecore-imf-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ecore-imf-evas-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ecore-input-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ecore-input-evas-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ecore-ipc-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ecore-x-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/e_dbus-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/edje-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/eet-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/efl-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/efl-extension&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/efreet-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/eina-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/eina-1/eina&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/eio-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/eldbus-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/elementary-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/embryo-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/eo-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/eom&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ethumb-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ethumb-client-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/evas-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ewebkit2-0&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/feedback&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/fontconfig&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/freetype2&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/geofence&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/gio-unix-2.0&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/glib-2.0&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/harfbuzz&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/json-glib-1.0&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/location&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/maps&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/media&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/media-content&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/messaging&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/metadata-editor&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/minicontrol&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/minizip&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/network&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/notification&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/phonenumber-utils&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/sensor&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/shortcut&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/storage&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/system&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/telephony&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ui&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/web&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/widget_service&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/widget_viewer_evas&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/wifi-direct&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/lib/dbus-1.0/include&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/lib/glib-2.0/include&quot;"/>
+                                                               </option>
+                                                               <option id="sbi.gnu.cpp.compiler.option.frameworks_cflags.core.2042453024" superClass="sbi.gnu.cpp.compiler.option.frameworks_cflags.core" valueType="stringList">
+                                                                       <listOptionValue builtIn="false" value="${TC_COMPILER_MISC}"/>
+                                                                       <listOptionValue builtIn="false" value="${RS_COMPILER_MISC}"/>
+                                                                       <listOptionValue builtIn="false" value=" -fPIE"/>
+                                                                       <listOptionValue builtIn="false" value="--sysroot=&quot;${SBI_SYSROOT}&quot;"/>
+                                                               </option>
+                                                               <option id="gnu.cpp.compiler.option.include.paths.1491943414" superClass="gnu.cpp.compiler.option.include.paths" valueType="includePath">
+                                                                       <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/inc}&quot;"/>
+                                                               </option>
+                                                               <option id="sbi.gnu.cpp.compiler.option.frameworks.core.399579441" superClass="sbi.gnu.cpp.compiler.option.frameworks.core" valueType="userObjs">
+                                                                       <listOptionValue builtIn="false" value="Native_API"/>
+                                                               </option>
+                                                               <option id="gnu.cpp.compiler.option.preprocessor.def.1290489636" superClass="gnu.cpp.compiler.option.preprocessor.def" valueType="definedSymbols">
+                                                                       <listOptionValue builtIn="false" value="_DEBUG"/>
+                                                               </option>
+                                                               <inputType id="sbi.gnu.cpp.compiler.tizen.inputType.1444030222"/>
+                                                               <inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.828773414" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
+                                                       </tool>
+                                                       <tool command="clang" id="org.tizen.nativecore.tool.sbi.gnu.c.compiler.1332097163" name="C Compiler" superClass="org.tizen.nativecore.tool.sbi.gnu.c.compiler">
+                                                               <option defaultValue="gnu.c.optimization.level.none" id="gnu.c.compiler.option.optimization.level.569133032" name="Optimization Level" superClass="gnu.c.compiler.option.optimization.level" valueType="enumerated"/>
+                                                               <option id="sbi.gnu.c.compiler.option.debugging.level.1038790997" name="Debug level" superClass="sbi.gnu.c.compiler.option.debugging.level" value="gnu.c.debugging.level.max" valueType="enumerated"/>
+                                                               <option id="sbi.gnu.c.compiler.option.debug.applog.30619937" name="Enable application logging (-D_APP_LOG)" superClass="sbi.gnu.c.compiler.option.debug.applog" value="true" valueType="boolean"/>
+                                                               <option id="sbi.gnu.c.compiler.option.2093892473" superClass="sbi.gnu.c.compiler.option" valueType="userObjs">
+                                                                       <listOptionValue builtIn="false" value="mobile-2.4-emulator.core_llvm36.i386.core.app"/>
+                                                               </option>
+                                                               <option id="sbi.gnu.c.compiler.option.frameworks_inc.core.1795177369" superClass="sbi.gnu.c.compiler.option.frameworks_inc.core" valueType="includePath">
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/libxml2&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/appcore-agent&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/appfw&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/attach-panel&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/badge&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/base&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/cairo&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/calendar-service2&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ckm&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/contacts-svc&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/content&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/context-service&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/dali&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/dali-toolkit&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/dbus-1.0&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/device&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/dlog&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ecore-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ecore-con-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ecore-evas-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ecore-file-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ecore-imf-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ecore-imf-evas-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ecore-input-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ecore-input-evas-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ecore-ipc-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ecore-x-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/e_dbus-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/edje-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/eet-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/efl-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/efl-extension&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/efreet-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/eina-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/eina-1/eina&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/eio-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/eldbus-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/elementary-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/embryo-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/eo-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/eom&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ethumb-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ethumb-client-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/evas-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ewebkit2-0&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/feedback&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/fontconfig&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/freetype2&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/geofence&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/gio-unix-2.0&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/glib-2.0&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/harfbuzz&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/json-glib-1.0&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/location&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/maps&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/media&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/media-content&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/messaging&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/metadata-editor&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/minicontrol&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/minizip&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/network&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/notification&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/phonenumber-utils&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/sensor&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/shortcut&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/storage&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/system&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/telephony&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ui&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/web&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/widget_service&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/widget_viewer_evas&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/wifi-direct&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/lib/dbus-1.0/include&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/lib/glib-2.0/include&quot;"/>
+                                                               </option>
+                                                               <option id="sbi.gnu.c.compiler.option.frameworks_cflags.core.129230233" superClass="sbi.gnu.c.compiler.option.frameworks_cflags.core" valueType="stringList">
+                                                                       <listOptionValue builtIn="false" value="${TC_COMPILER_MISC}"/>
+                                                                       <listOptionValue builtIn="false" value="${RS_COMPILER_MISC}"/>
+                                                                       <listOptionValue builtIn="false" value=" -fPIE"/>
+                                                                       <listOptionValue builtIn="false" value="--sysroot=&quot;${SBI_SYSROOT}&quot;"/>
+                                                               </option>
+                                                               <option id="gnu.c.compiler.option.include.paths.2147015964" superClass="gnu.c.compiler.option.include.paths" valueType="includePath">
+                                                                       <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/inc}&quot;"/>
+                                                               </option>
+                                                               <option id="sbi.gnu.c.compiler.option.frameworks.core.435620859" superClass="sbi.gnu.c.compiler.option.frameworks.core" valueType="userObjs">
+                                                                       <listOptionValue builtIn="false" value="Native_API"/>
+                                                               </option>
+                                                               <option id="gnu.c.compiler.option.preprocessor.def.symbols.927058880" superClass="gnu.c.compiler.option.preprocessor.def.symbols" valueType="definedSymbols">
+                                                                       <listOptionValue builtIn="false" value="_DEBUG"/>
+                                                               </option>
+                                                               <inputType id="sbi.gnu.c.compiler.tizen.inputType.386884738"/>
+                                                               <inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.981494680" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
+                                                       </tool>
+                                                       <tool id="org.tizen.nativeide.tool.sbi.gnu.c.linker.base.640241801" name="C Linker" superClass="org.tizen.nativeide.tool.sbi.gnu.c.linker.base"/>
+                                                       <tool command="clang++" id="org.tizen.nativecore.tool.sbi.gnu.cpp.linker.901135465" name="C++ Linker" superClass="org.tizen.nativecore.tool.sbi.gnu.cpp.linker">
+                                                               <option id="sbi.gnu.cpp.linker.option.frameworks_lflags.core.787442281" superClass="sbi.gnu.cpp.linker.option.frameworks_lflags.core" valueType="stringList">
+                                                                       <listOptionValue builtIn="false" value="${TC_LINKER_MISC}"/>
+                                                                       <listOptionValue builtIn="false" value="${RS_LINKER_MISC}"/>
+                                                                       <listOptionValue builtIn="false" value="-pie -lpthread "/>
+                                                                       <listOptionValue builtIn="false" value="-Xlinker -rpath=&quot;/home/developer/sdk_tools/lib&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="--sysroot=&quot;${SBI_SYSROOT}&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="-Xlinker --version-script=&quot;${PROJ_PATH}/.exportMap&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="-L&quot;${SBI_SYSROOT}/usr/lib&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="$(RS_LIBRARIES)"/>
+                                                               </option>
+                                                               <option id="gnu.cpp.link.option.paths.1307041173" superClass="gnu.cpp.link.option.paths" valueType="libPaths">
+                                                                       <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/lib}&quot;"/>
+                                                               </option>
+                                                               <inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.2119600729" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
+                                                                       <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
+                                                                       <additionalInput kind="additionalinput" paths="$(LIBS)"/>
+                                                               </inputType>
+                                                       </tool>
+                                                       <tool command="i386-linux-gnueabi-as" id="org.tizen.nativeapp.tool.sbi.gnu.assembler.base.2146766494" name="Assembler" superClass="org.tizen.nativeapp.tool.sbi.gnu.assembler.base">
+                                                               <inputType id="cdt.managedbuild.tool.gnu.assembler.input.2008442855" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
+                                                       </tool>
+                                                       <tool id="org.tizen.nativecore.tool.sbi.po.compiler.248419226" name="PO Resource Compiler" superClass="org.tizen.nativecore.tool.sbi.po.compiler"/>
+                                                       <tool id="org.tizen.nativecore.tool.sbi.edc.compiler.2010848909" name="EDC Resource Compiler" superClass="org.tizen.nativecore.tool.sbi.edc.compiler"/>
+                                                       <tool id="org.tizen.nativecore.tool.fnmapgen.147350839" name="C FN-Map Generator" superClass="org.tizen.nativecore.tool.fnmapgen"/>
+                                                       <tool id="org.tizen.nativecore.tool.fnmapgen.cpp.2051940365" name="C++ FN-Map Generator" superClass="org.tizen.nativecore.tool.fnmapgen.cpp"/>
+                                                       <tool id="org.tizen.nativecore.tool.ast.1075947210" name="C Static Analyzer" superClass="org.tizen.nativecore.tool.ast"/>
+                                                       <tool id="org.tizen.nativecore.tool.ast.cpp.255856593" name="C++ Static Analyzer" superClass="org.tizen.nativecore.tool.ast.cpp"/>
+                                                       <tool id="org.tizen.nativecore.tool.sbi.gnu.archiver.mergelib.1173374538" name="Archive Generator" superClass="org.tizen.nativecore.tool.sbi.gnu.archiver.mergelib"/>
+                                               </toolChain>
+                                       </folderInfo>
+                                       <sourceEntries>
+                                               <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="res"/>
+                                               <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src"/>
+                                               <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="inc"/>
+                                       </sourceEntries>
+                               </configuration>
+                       </storageModule>
+                       <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
+               </cconfiguration>
+               <cconfiguration id="org.tizen.nativecore.config.sbi.gcc45.app.release.728069853">
+                       <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="org.tizen.nativecore.config.sbi.gcc45.app.release.728069853" moduleId="org.eclipse.cdt.core.settings" name="Release">
+                               <externalSettings/>
+                               <extensions>
+                                       <extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+                                       <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+                                       <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
+                                       <extension id="org.eclipse.cdt.core.MakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+                                       <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+                                       <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+                                       <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+                               </extensions>
+                       </storageModule>
+                       <storageModule moduleId="cdtBuildSystem" version="4.0.0">
+                               <configuration artifactName="${ProjName}" buildArtefactType="org.tizen.nativecore.buildArtefactType.app" buildProperties="org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release,org.eclipse.cdt.build.core.buildArtefactType=org.tizen.nativecore.buildArtefactType.app" description="" errorParsers="org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;" id="org.tizen.nativecore.config.sbi.gcc45.app.release.728069853" name="Release" parent="org.tizen.nativecore.config.sbi.gcc45.app.release">
+                                       <folderInfo id="org.tizen.nativecore.config.sbi.gcc45.app.release.728069853." name="/" resourcePath="">
+                                               <toolChain id="org.tizen.nativecore.toolchain.sbi.gcc45.app.release.1698569602" name="Tizen Native Toolchain" superClass="org.tizen.nativecore.toolchain.sbi.gcc45.app.release">
+                                                       <targetPlatform binaryParser="org.eclipse.cdt.core.ELF" id="org.tizen.nativeide.target.sbi.gnu.platform.base.530558826" osList="linux,win32" superClass="org.tizen.nativeide.target.sbi.gnu.platform.base"/>
+                                                       <builder buildPath="${workspace_loc:/{TESTSUITE_NAME}/Release}" id="org.tizen.nativecore.target.sbi.gnu.builder.975214550" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Tizen Application Builder" superClass="org.tizen.nativecore.target.sbi.gnu.builder"/>
+                                                       <tool id="org.tizen.nativecore.tool.sbi.gnu.archiver.1514849212" name="Archiver" superClass="org.tizen.nativecore.tool.sbi.gnu.archiver"/>
+                                                       <tool command="clang++" id="org.tizen.nativecore.tool.sbi.gnu.cpp.compiler.1790549045" name="C++ Compiler" superClass="org.tizen.nativecore.tool.sbi.gnu.cpp.compiler">
+                                                               <option id="gnu.cpp.compiler.option.optimization.level.316489008" name="Optimization Level" superClass="gnu.cpp.compiler.option.optimization.level" value="gnu.cpp.compiler.optimization.level.most" valueType="enumerated"/>
+                                                               <option id="sbi.gnu.cpp.compiler.option.debugging.level.1500294719" name="Debug level" superClass="sbi.gnu.cpp.compiler.option.debugging.level"/>
+                                                               <option id="sbi.gnu.cpp.compiler.option.debug.applog.220428565" name="Enable application logging (-D_APP_LOG)" superClass="sbi.gnu.cpp.compiler.option.debug.applog"/>
+                                                               <option id="sbi.gnu.cpp.compiler.option.900296718" superClass="sbi.gnu.cpp.compiler.option" valueType="userObjs">
+                                                                       <listOptionValue builtIn="false" value="mobile-2.4-emulator.core_llvm36.i386.core.app"/>
+                                                               </option>
+                                                               <option id="sbi.gnu.cpp.compiler.option.frameworks_inc.core.1334366520" superClass="sbi.gnu.cpp.compiler.option.frameworks_inc.core" valueType="includePath">
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/libxml2&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/appcore-agent&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/appfw&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/attach-panel&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/badge&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/base&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/cairo&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/calendar-service2&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ckm&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/contacts-svc&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/content&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/context-service&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/dali&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/dali-toolkit&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/dbus-1.0&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/device&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/dlog&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ecore-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ecore-con-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ecore-evas-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ecore-file-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ecore-imf-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ecore-imf-evas-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ecore-input-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ecore-input-evas-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ecore-ipc-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ecore-x-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/e_dbus-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/edje-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/eet-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/efl-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/efl-extension&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/efreet-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/eina-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/eina-1/eina&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/eio-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/eldbus-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/elementary-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/embryo-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/eo-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/eom&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ethumb-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ethumb-client-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/evas-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ewebkit2-0&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/feedback&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/fontconfig&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/freetype2&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/geofence&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/gio-unix-2.0&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/glib-2.0&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/harfbuzz&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/json-glib-1.0&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/location&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/maps&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/media&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/media-content&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/messaging&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/metadata-editor&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/minicontrol&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/minizip&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/network&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/notification&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/phonenumber-utils&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/sensor&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/shortcut&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/storage&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/system&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/telephony&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ui&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/web&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/widget_service&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/widget_viewer_evas&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/wifi-direct&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/lib/dbus-1.0/include&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/lib/glib-2.0/include&quot;"/>
+                                                               </option>
+                                                               <option id="sbi.gnu.cpp.compiler.option.frameworks_cflags.core.528700311" superClass="sbi.gnu.cpp.compiler.option.frameworks_cflags.core" valueType="stringList">
+                                                                       <listOptionValue builtIn="false" value="${TC_COMPILER_MISC}"/>
+                                                                       <listOptionValue builtIn="false" value="${RS_COMPILER_MISC}"/>
+                                                                       <listOptionValue builtIn="false" value=" -fPIE"/>
+                                                                       <listOptionValue builtIn="false" value="--sysroot=&quot;${SBI_SYSROOT}&quot;"/>
+                                                               </option>
+                                                               <option id="gnu.cpp.compiler.option.include.paths.623797688" superClass="gnu.cpp.compiler.option.include.paths" valueType="includePath">
+                                                                       <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/inc}&quot;"/>
+                                                               </option>
+                                                               <option id="sbi.gnu.cpp.compiler.option.frameworks.core.1909718066" superClass="sbi.gnu.cpp.compiler.option.frameworks.core" valueType="userObjs">
+                                                                       <listOptionValue builtIn="false" value="Native_API"/>
+                                                               </option>
+                                                               <inputType id="sbi.gnu.cpp.compiler.tizen.inputType.1912377546"/>
+                                                               <inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.916984243" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
+                                                       </tool>
+                                                       <tool command="clang" id="org.tizen.nativecore.tool.sbi.gnu.c.compiler.2061633942" name="C Compiler" superClass="org.tizen.nativecore.tool.sbi.gnu.c.compiler">
+                                                               <option defaultValue="gnu.c.optimization.level.most" id="gnu.c.compiler.option.optimization.level.2022990414" name="Optimization Level" superClass="gnu.c.compiler.option.optimization.level" valueType="enumerated"/>
+                                                               <option id="sbi.gnu.c.compiler.option.debugging.level.2037589780" name="Debug level" superClass="sbi.gnu.c.compiler.option.debugging.level"/>
+                                                               <option id="sbi.gnu.c.compiler.option.debug.applog.930351060" name="Enable application logging (-D_APP_LOG)" superClass="sbi.gnu.c.compiler.option.debug.applog"/>
+                                                               <option id="sbi.gnu.c.compiler.option.623943791" superClass="sbi.gnu.c.compiler.option" valueType="userObjs">
+                                                                       <listOptionValue builtIn="false" value="mobile-2.4-emulator.core_llvm36.i386.core.app"/>
+                                                               </option>
+                                                               <option id="sbi.gnu.c.compiler.option.frameworks_inc.core.1091342970" superClass="sbi.gnu.c.compiler.option.frameworks_inc.core" valueType="includePath">
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/libxml2&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/appcore-agent&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/appfw&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/attach-panel&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/badge&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/base&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/cairo&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/calendar-service2&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ckm&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/contacts-svc&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/content&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/context-service&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/dali&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/dali-toolkit&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/dbus-1.0&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/device&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/dlog&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ecore-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ecore-con-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ecore-evas-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ecore-file-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ecore-imf-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ecore-imf-evas-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ecore-input-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ecore-input-evas-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ecore-ipc-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ecore-x-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/e_dbus-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/edje-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/eet-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/efl-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/efl-extension&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/efreet-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/eina-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/eina-1/eina&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/eio-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/eldbus-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/elementary-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/embryo-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/eo-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/eom&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ethumb-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ethumb-client-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/evas-1&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ewebkit2-0&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/feedback&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/fontconfig&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/freetype2&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/geofence&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/gio-unix-2.0&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/glib-2.0&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/harfbuzz&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/json-glib-1.0&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/location&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/maps&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/media&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/media-content&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/messaging&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/metadata-editor&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/minicontrol&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/minizip&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/network&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/notification&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/phonenumber-utils&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/sensor&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/shortcut&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/storage&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/system&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/telephony&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/ui&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/web&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/widget_service&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/widget_viewer_evas&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/wifi-direct&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/lib/dbus-1.0/include&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/lib/glib-2.0/include&quot;"/>
+                                                               </option>
+                                                               <option id="sbi.gnu.c.compiler.option.frameworks_cflags.core.1782808167" superClass="sbi.gnu.c.compiler.option.frameworks_cflags.core" valueType="stringList">
+                                                                       <listOptionValue builtIn="false" value="${TC_COMPILER_MISC}"/>
+                                                                       <listOptionValue builtIn="false" value="${RS_COMPILER_MISC}"/>
+                                                                       <listOptionValue builtIn="false" value=" -fPIE"/>
+                                                                       <listOptionValue builtIn="false" value="--sysroot=&quot;${SBI_SYSROOT}&quot;"/>
+                                                               </option>
+                                                               <option id="gnu.c.compiler.option.include.paths.499488519" superClass="gnu.c.compiler.option.include.paths" valueType="includePath">
+                                                                       <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/inc}&quot;"/>
+                                                               </option>
+                                                               <option id="sbi.gnu.c.compiler.option.frameworks.core.120447946" superClass="sbi.gnu.c.compiler.option.frameworks.core" valueType="userObjs">
+                                                                       <listOptionValue builtIn="false" value="Native_API"/>
+                                                               </option>
+                                                               <inputType id="sbi.gnu.c.compiler.tizen.inputType.1431704404"/>
+                                                               <inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.27305889" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
+                                                       </tool>
+                                                       <tool id="org.tizen.nativeide.tool.sbi.gnu.c.linker.base.267766539" name="C Linker" superClass="org.tizen.nativeide.tool.sbi.gnu.c.linker.base"/>
+                                                       <tool command="clang++" id="org.tizen.nativecore.tool.sbi.gnu.cpp.linker.1382202266" name="C++ Linker" superClass="org.tizen.nativecore.tool.sbi.gnu.cpp.linker">
+                                                               <option id="sbi.gnu.cpp.linker.option.frameworks_lflags.core.476062144" superClass="sbi.gnu.cpp.linker.option.frameworks_lflags.core" valueType="stringList">
+                                                                       <listOptionValue builtIn="false" value="${TC_LINKER_MISC}"/>
+                                                                       <listOptionValue builtIn="false" value="${RS_LINKER_MISC}"/>
+                                                                       <listOptionValue builtIn="false" value="-pie -lpthread "/>
+                                                                       <listOptionValue builtIn="false" value="-Xlinker -rpath=&quot;/home/developer/sdk_tools/lib&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="--sysroot=&quot;${SBI_SYSROOT}&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="-Xlinker --version-script=&quot;${PROJ_PATH}/.exportMap&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="-L&quot;${SBI_SYSROOT}/usr/lib&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="$(RS_LIBRARIES)"/>
+                                                               </option>
+                                                               <option id="gnu.cpp.link.option.paths.29188932" superClass="gnu.cpp.link.option.paths" valueType="libPaths">
+                                                                       <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/lib}&quot;"/>
+                                                               </option>
+                                                               <inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.140241049" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
+                                                                       <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
+                                                                       <additionalInput kind="additionalinput" paths="$(LIBS)"/>
+                                                               </inputType>
+                                                       </tool>
+                                                       <tool command="i386-linux-gnueabi-as" id="org.tizen.nativeapp.tool.sbi.gnu.assembler.base.1380224608" name="Assembler" superClass="org.tizen.nativeapp.tool.sbi.gnu.assembler.base">
+                                                               <inputType id="cdt.managedbuild.tool.gnu.assembler.input.383736666" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
+                                                       </tool>
+                                                       <tool id="org.tizen.nativecore.tool.sbi.po.compiler.1356965384" name="PO Resource Compiler" superClass="org.tizen.nativecore.tool.sbi.po.compiler"/>
+                                                       <tool id="org.tizen.nativecore.tool.sbi.edc.compiler.1251472052" name="EDC Resource Compiler" superClass="org.tizen.nativecore.tool.sbi.edc.compiler"/>
+                                                       <tool id="org.tizen.nativecore.tool.fnmapgen.1001165225" name="C FN-Map Generator" superClass="org.tizen.nativecore.tool.fnmapgen"/>
+                                                       <tool id="org.tizen.nativecore.tool.fnmapgen.cpp.259998567" name="C++ FN-Map Generator" superClass="org.tizen.nativecore.tool.fnmapgen.cpp"/>
+                                                       <tool id="org.tizen.nativecore.tool.ast.277372493" name="C Static Analyzer" superClass="org.tizen.nativecore.tool.ast"/>
+                                                       <tool id="org.tizen.nativecore.tool.ast.cpp.616356266" name="C++ Static Analyzer" superClass="org.tizen.nativecore.tool.ast.cpp"/>
+                                                       <tool id="org.tizen.nativecore.tool.sbi.gnu.archiver.mergelib.1007103551" name="Archive Generator" superClass="org.tizen.nativecore.tool.sbi.gnu.archiver.mergelib"/>
+                                               </toolChain>
+                                       </folderInfo>
+                                       <sourceEntries>
+                                               <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="res"/>
+                                               <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src"/>
+                                               <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="inc"/>
+                                       </sourceEntries>
+                               </configuration>
+                       </storageModule>
+                       <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
+               </cconfiguration>
+       </storageModule>
+       <storageModule moduleId="cdtBuildSystem" version="4.0.0">
+               <project id="{TESTSUITE_NAME}.org.tizen.nativecore.target.sbi.gcc45.app.893663013" name="Tizen Core Application" projectType="org.tizen.nativecore.target.sbi.gcc45.app"/>
+       </storageModule>
+       <storageModule moduleId="com.samsung.tizen.nativeapp.projectInfo" version="1.0.0"/>
+       <storageModule moduleId="scannerConfiguration"/>
+       <storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
+</cproject>
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/.exportMap b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/.exportMap
new file mode 100644 (file)
index 0000000..43e310e
--- /dev/null
@@ -0,0 +1,4 @@
+{
+       global: main;
+       local: *;
+};
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/.project b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/.project
new file mode 100644 (file)
index 0000000..8b7ae50
--- /dev/null
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>{TESTSUITE_NAME}</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
+                       <arguments>
+                               <dictionary>
+                                       <key>?name?</key>
+                                       <value></value>
+                               </dictionary>
+                               <dictionary>
+                                       <key>org.eclipse.cdt.make.core.append_environment</key>
+                                       <value>true</value>
+                               </dictionary>
+                               <dictionary>
+                                       <key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+                                       <value>all</value>
+                               </dictionary>
+                               <dictionary>
+                                       <key>org.eclipse.cdt.make.core.buildArguments</key>
+                                       <value></value>
+                               </dictionary>
+                               <dictionary>
+                                       <key>org.eclipse.cdt.make.core.buildCommand</key>
+                                       <value>sbi-make</value>
+                               </dictionary>
+                               <dictionary>
+                                       <key>org.eclipse.cdt.make.core.buildLocation</key>
+                                       <value>${workspace_loc:/{TESTSUITE_NAME}/Debug}</value>
+                               </dictionary>
+                               <dictionary>
+                                       <key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+                                       <value>clean</value>
+                               </dictionary>
+                               <dictionary>
+                                       <key>org.eclipse.cdt.make.core.contents</key>
+                                       <value>org.eclipse.cdt.make.core.activeConfigSettings</value>
+                               </dictionary>
+                               <dictionary>
+                                       <key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+                                       <value>true</value>
+                               </dictionary>
+                               <dictionary>
+                                       <key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+                                       <value>true</value>
+                               </dictionary>
+                               <dictionary>
+                                       <key>org.eclipse.cdt.make.core.enableFullBuild</key>
+                                       <value>true</value>
+                               </dictionary>
+                               <dictionary>
+                                       <key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+                                       <value>all</value>
+                               </dictionary>
+                               <dictionary>
+                                       <key>org.eclipse.cdt.make.core.stopOnError</key>
+                                       <value>true</value>
+                               </dictionary>
+                               <dictionary>
+                                       <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+                                       <value>true</value>
+                               </dictionary>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
+                       <triggers>full,incremental,</triggers>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.tizen.nativecore.apichecker.core.builder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>org.eclipse.cdt.core.cnature</nature>
+               <nature>org.eclipse.cdt.core.ccnature</nature>
+               <nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
+               <nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
+               <nature>org.tizen.nativecore.apichecker.core.tizenCppNature</nature>
+       </natures>
+       <filteredResources>
+               <filter>
+                       <id>1360216703005</id>
+                       <name></name>
+                       <type>26</type>
+                       <matcher>
+                               <id>org.eclipse.ui.ide.multiFilter</id>
+                               <arguments>1.0-projectRelativePath-matches-false-false-*/.tpk</arguments>
+                       </matcher>
+               </filter>
+       </filteredResources>
+</projectDescription>
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/.tproject b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/.tproject
new file mode 100644 (file)
index 0000000..7a02b61
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<tproject xmlns="http://www.tizen.org/tproject">
+    <platforms>
+        <platform>
+            <name>mobile-2.4</name>
+        </platform>
+    </platforms>
+</tproject>
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/Build/appendix.mk b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/Build/appendix.mk
new file mode 100644 (file)
index 0000000..fad5ae4
--- /dev/null
@@ -0,0 +1 @@
+# Appendix
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/Build/basedef.mk b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/Build/basedef.mk
new file mode 100644 (file)
index 0000000..1324388
--- /dev/null
@@ -0,0 +1,113 @@
+# Add inputs and outputs from these tool invocations to the build variables
+
+C_DEPS +=
+
+USES_EFL = yes
+USES_USR_INC = yes
+
+SYSROOT = $(SBI_SYSROOT)
+
+ifneq ($(strip $(SYSROOT)),)
+
+ifeq ($(strip $(USES_EFL)),yes)
+_EFL_INCS := \
+     ecore-1 \
+     ecore-audio-1 \
+     ecore-avahi-1 \
+     ecore-con-1 \
+     ecore-evas-1 \
+     ecore-fb-1 \
+     ecore-file-1  \
+     ecore-imf-1 \
+     ecore-imf-evas-1 \
+     ecore-input-1 \
+     ecore-input-evas-1 \
+     ecore-ipc-1 \
+     ecore-x-1 \
+     e_dbus-1 \
+     edje-1 \
+     eet-1 \
+     efl-1 \
+     efl-extension efl-extension/default efl-extension/circle \
+     efreet-1 \
+     eina-1 eina-1/eina \
+     eio-1 \
+     eldbus-1 \
+     elementary-1 \
+     embryo-1 \
+     eo-1 \
+     eom \
+     ethumb-1 \
+     ethumb-client-1 \
+     evas-1 \
+     ewebkit2-0
+_EFL_INC_ROOT := $(SYSROOT)/usr/include
+EFL_INCS := $(addprefix -I $(_EFL_INC_ROOT)/,$(_EFL_INCS))
+endif
+
+ifeq ($(strip $(USES_USR_INC)),yes)
+_USR_INCS := \
+     usr/include \
+     usr/include/AL \
+     usr/include/feedback \
+     usr/include/ui-extension \
+     usr/include/vconf \
+     usr/include/weconn \
+     usr/include/wipc \
+     usr/include/wnoti-service \
+     usr/include/appcore-agent \
+     usr/include/appcore-watch \
+     usr/include/appfw \
+     usr/include/badge \
+     usr/include/base \
+     usr/include/cairo \
+     usr/include/calendar-service2 \
+     usr/include/ckm \
+     usr/include/contacts-svc \
+     usr/include/content \
+     usr/include/context-manager \
+     usr/include/context-service \
+     usr/include/dali \
+     usr/include/dali-toolkit \
+     usr/include/dbus-1.0 \
+     usr/include/device \
+     usr/include/dlog \
+     usr/include/fontconfig \
+     usr/include/freetype2 \
+     usr/include/geofence \
+     usr/include/gio-unix-2.0 \
+     usr/include/glib-2.0 \
+     usr/include/json-glib-1.0 \
+     usr/include/json-glib-1.0/json-glib \
+     usr/include/libxml2 \
+     usr/include/location \
+     usr/include/maps \
+     usr/include/media \
+     usr/include/media-content \
+     usr/include/messaging \
+     usr/include/metadata-editor \
+     usr/include/minicontrol \
+     usr/include/minizip \
+     usr/include/network \
+     usr/include/notification \
+     usr/include/phonenumber-utils \
+     usr/include/sensor \
+     usr/include/shortcut \
+     usr/include/storage \
+     usr/include/system \
+     usr/include/telephony \
+     usr/include/ui \
+     usr/include/web \
+     usr/include/widget_service \
+     usr/include/widget_viewer_evas \
+     usr/include/wifi-direct \
+     usr/lib/dbus-1.0/include \
+     usr/lib/glib-2.0/include 
+_USR_INC_ROOT := $(SYSROOT)
+USR_INCS := $(addprefix -I $(_USR_INC_ROOT)/,$(_USR_INCS))
+endif
+
+PLATFORM_INCS = $(USR_INCS) $(EFL_INCS) \
+     -I"$(SDK_PATH)/library" 
+
+endif
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/Build/flags.mk b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/Build/flags.mk
new file mode 100644 (file)
index 0000000..3305cb8
--- /dev/null
@@ -0,0 +1,10 @@
+
+COMPILE_FLAGS = $(DEBUG_OP) $(OPTIMIZATION_OP) -Wall -c -fmessage-length=0 
+
+CPP_COMPILE_FLAGS = $(DEBUG_OP) $(OPTIMIZATION_OP) 
+
+LINK_FLAGS = 
+
+AR_FLAGS = 
+
+EDC_COMPILE_FLAGS = 
\ No newline at end of file
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/Build/makefile b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/Build/makefile
new file mode 100644 (file)
index 0000000..d0a02f2
--- /dev/null
@@ -0,0 +1,265 @@
+BUILD_SCRIPT_VERSION := 1.0.6
+
+BSLASH := \\#
+
+PROJ_ROOT := $(subst $(BSLASH),/,$(PROJPATH))
+
+-include $(PROJ_ROOT)/project_def.prop
+-include basedef.mk
+-include tooldef.mk
+-include flags.mk
+-include prepost.mk
+
+APPTYPE := $(type)
+
+OBJ_OUTPUT := $(OUTPUT_DIR)/objs
+
+OS_NAME = $(shell $(UNAME))
+
+ifneq ($(strip $(PLATFORM_INCS)),)
+PLATFORM_INCS_FILE := $(OBJ_OUTPUT)/platform_incs_file.inc 
+endif
+
+FIND_FILES = $(shell $(FIND) $(PROJ_ROOT)/$(dir $(1)) -type f -name $(notdir $(1)) -printf '$(dir $(1))%P ')
+
+#USER_SRCS2 := $(shell sed -n '/^\s*USER_SRCS\s*=/s/USER_SRCS\s*=\s*//gp' '$(PROJ_ROOT)/project_def.prop')
+USER_SRCS2 := $(shell sed --version)
+
+NORMAL_SRCS := $(filter-out %*.c %*.cpp,$(USER_SRCS))
+WIDLCARD_SRCS := $(filter %*.c %*.cpp,$(USER_SRCS))
+ALL_SRCS := $(NORMAL_SRCS) $(foreach var,$(WIDLCARD_SRCS),$(call FIND_FILES,$(var)))
+
+C_SRCS := $(filter %.c,$(ALL_SRCS))
+CPP_SRCS := $(filter %.cpp,$(ALL_SRCS))
+
+USER_EDCS := $(subst $(BSLASH),/,$(USER_EDCS))
+NORMAL_EDCS := $(filter-out %*.edc,$(USER_EDCS))
+WIDLCARD_EDCS := $(filter %*.edc,$(USER_EDCS))
+EDCS := $(NORMAL_EDCS) $(foreach var,$(WIDLCARD_EDCS),$(call FIND_FILES,$(var)))
+
+NORMAL_POS := $(filter-out %*.po,$(USER_POS))
+WIDLCARD_POS := $(filter %*.po,$(USER_POS))
+POS := $(NORMAL_POS) $(foreach var,$(WIDLCARD_POS),$(call FIND_FILES,$(var)))
+
+LIBPATHS := $(addprefix -L$(PROJ_ROOT)/,$(USER_LIB_DIRS)) \
+                       $(addprefix -L,$(USER_LIB_DIRS_ABS))
+LIBS += $(addprefix -l,$(USER_LIBS))
+UOBJS := $(addprefix $(PROJ_ROOT)/,$(USER_OBJS)) \
+                $(USER_OBJS_ABS)
+
+M_OPT = -MMD -MP -MF"$(@:%.o=%.d)"
+
+#LOWER_APPNAME := $(shell echo translit($(APPNAME),[A-Z],[a-z])|$(M4))
+LOWER_APPNAME := $(shell echo $(APPNAME)|$(TR) [A-Z] [a-z])
+
+ifeq ($(strip $(APPTYPE)),app)
+APPFILE := $(OUTPUT_DIR)/$(LOWER_APPNAME)
+endif
+ifeq ($(strip $(APPTYPE)),staticLib)
+APPFILE := $(OUTPUT_DIR)/lib$(LOWER_APPNAME).a
+endif
+ifeq ($(strip $(APPTYPE)),sharedLib)
+APPFILE := $(OUTPUT_DIR)/lib$(LOWER_APPNAME).so
+endif
+
+FUNC_C2O = $(patsubst %.c,$(OBJ_OUTPUT)/%.o,$(1))
+FUNC_CPP2O = $(patsubst %.cpp,$(OBJ_OUTPUT)/%.o,$(1))
+FUNC_EDC2EDJ = $(patsubst %.edc,$(OUTPUT_DIR)/%.edj,$(1))
+FUNC_PO2MO = $(patsubst %.po,$(OUTPUT_DIR)/res/locale/%/LC_MESSAGES/$(LOWER_APPNAME).mo,$(notdir $(1)))
+
+
+C_OBJS := $(call FUNC_C2O,$(C_SRCS)) 
+CPP_OBJS := $(call FUNC_CPP2O,$(CPP_SRCS)) 
+OBJS := $(C_OBJS) $(CPP_OBJS)
+EDJ_FILES := $(call FUNC_EDC2EDJ,$(EDCS))
+MO_FILES := $(call FUNC_PO2MO,$(POS))
+DEPS := $(OBJS:.o=.d)
+
+
+all : preproc $(APPFILE) secondary-outputs postproc
+
+ifneq ($(strip $(DEPS)),)
+-include $(DEPS)
+endif
+
+ifeq ($(strip $(APPTYPE)),app)
+$(APPFILE) : $(OBJS) $(UOBJS)
+       @echo '  Building target: $@'
+       @echo '  Invoking: C/C++ Linker'
+       @$(MKDIR) $(MKDIR_OP) $(subst $(BSLASH),/,$(@D))
+       $(CXX) -o "$(APPFILE)" $(OBJS) $(UOBJS) $(LIBPATHS) $(LIBS) $(LINK_FLAGS) $(TC_LINKER_MISC) $(RS_LINKER_MISC) -pie -lpthread -Xlinker -rpath="/home/developer/sdk_tools/lib" --sysroot="$(SYSROOT)" -Xlinker --version-script="$(PROJ_PATH)/.exportMap" -L"$(SBI_SYSROOT)/usr/lib" $(RS_LIBRARIES) -Xlinker -rpath="/opt/usr/apps/$(APPID)/lib" -Werror-implicit-function-declaration
+       @echo '  Finished building target: $@'
+endif
+ifeq ($(strip $(APPTYPE)),staticLib)
+$(APPFILE) : $(OBJS) $(UOBJS)
+       @echo '  Building target: $@'
+       @echo '  Invoking: Archive utility'
+       @$(MKDIR) $(MKDIR_OP) $(subst $(BSLASH),/,$(@D))
+       $(AR) -r "$(APPFILE)" $(OBJS) $(UOBJS) $(AR_FLAGS)
+       @echo '  Finished building target: $@'
+endif
+ifeq ($(strip $(APPTYPE)),sharedLib)
+$(APPFILE) : $(OBJS) $(UOBJS)
+       @echo '  Building target: $@'
+       @echo '  Invoking: C/C++ Linker'
+       @$(MKDIR) $(MKDIR_OP) $(subst $(BSLASH),/,$(@D))
+       $(CXX) -o "$(APPFILE)" $(OBJS) $(UOBJS) $(LIBPATHS) $(LIBS) $(LINK_FLAGS) $(TC_LINKER_MISC) $(RS_LINKER_MISC) -shared -lpthread --sysroot="$(SYSROOT)" -L"$(SYSROOT)/usr/lib" $(RS_LIBRARIES)
+       @echo '  Finished building target: $@'
+endif
+
+
+ifneq ($(strip $(C_SRCS)),)
+CDEFS += $(addprefix -D,$(USER_DEFS))
+CDEFS += $(addprefix -U,$(USER_UNDEFS))
+
+INCS := $(addprefix -I$(PROJ_ROOT)/,$(USER_INC_DIRS)) \
+               $(addprefix -I,$(USER_INC_DIRS_ABS)) \
+               $(addprefix -include$(PROJ_ROOT)/,$(USER_INC_FILES)) \
+               $(addprefix -include,$(USER_INC_FILES_ABS))
+
+$(C_OBJS) : $(OBJ_OUTPUT)/%.o : $(PROJ_ROOT)/%.c $(PLATFORM_INCS_FILE)  
+       @echo '  Building file: $<'
+       @echo '  Invoking: C Compiler'
+       @$(MKDIR) $(MKDIR_OP) $(subst $(BSLASH),/,$(@D))
+ifeq ($(strip $(APPTYPE)),sharedLib)
+       $(CC) -c $< -o $@ $(CDEFS) $(INCS) -I"pch" $(COMPILE_FLAGS) $(TC_COMPILER_MISC) $(RS_COMPILER_MISC) -fPIC --sysroot="$(SYSROOT)" -Werror-implicit-function-declaration $(M_OPT) @$(PLATFORM_INCS_FILE)
+else
+       $(CC) -c $< -o $@ $(CDEFS) $(INCS) -I"pch" $(COMPILE_FLAGS) $(TC_COMPILER_MISC) $(RS_COMPILER_MISC) -fPIE --sysroot="$(SYSROOT)" -Werror-implicit-function-declaration $(M_OPT) @$(PLATFORM_INCS_FILE)
+endif
+       @echo '  Finished building: $<'
+endif
+
+ifneq ($(strip $(CPP_SRCS)),)
+CPPDEFS += $(addprefix -D,$(USER_CPP_DEFS))
+CPPDEFS += $(addprefix -U,$(USER_CPP_UNDEFS))
+
+CPP_INCS := $(addprefix -I$(PROJ_ROOT)/,$(USER_CPP_INC_DIRS)) \
+               $(addprefix -I,$(USER_CPP_INC_DIRS_ABS)) \
+               $(addprefix -include$(PROJ_ROOT)/,$(USER_CPP_INC_FILES)) \
+               $(addprefix -include,$(USER_CPP_INC_FILES_ABS))
+               
+$(CPP_OBJS) : $(OBJ_OUTPUT)/%.o : $(PROJ_ROOT)/%.cpp $(PLATFORM_INCS_FILE)  
+       @echo '  Building file: $<'
+       @echo '  Invoking: C++ Compiler'
+       @$(MKDIR) $(MKDIR_OP) $(subst $(BSLASH),/,$(@D))
+ifeq ($(strip $(APPTYPE)),sharedLib)
+       $(CXX) -c $< -o $@ $(CPPDEFS) $(CPP_INCS) -I"pch" $(CPP_COMPILE_FLAGS) $(TC_COMPILER_MISC) $(RS_COMPILER_MISC) -fPIC --sysroot="$(SYSROOT)" -Werror-implicit-function-declaration $(M_OPT) @$(PLATFORM_INCS_FILE)
+else
+       $(CXX) -c $< -o $@ $(CPPDEFS) $(CPP_INCS) -I"pch" $(CPP_COMPILE_FLAGS) $(TC_COMPILER_MISC) $(RS_COMPILER_MISC) -fPIE --sysroot="$(SYSROOT)" -Werror-implicit-function-declaration $(M_OPT) @$(PLATFORM_INCS_FILE)
+endif
+       @echo '  Finished building: $<'
+endif
+
+preproc :
+ifneq ($(strip $(PREBUILD_COMMAND)),)
+ifneq ($(strip $(PREBUILD_DESC)),)
+       @echo $(PREBUILD_DESC)
+endif  
+       @echo $(shell $(PREBUILD_COMMAND))
+endif  
+       @$(MKDIR) $(MKDIR_OP) $(subst $(BSLASH),/,$(OBJ_OUTPUT))
+
+postproc :
+ifneq ($(strip $(POSTBUILD_COMMAND)),)
+ifneq ($(strip $(POSTBUILD_DESC)),)
+       @echo $(POSTBUILD_DESC)
+endif  
+       @echo $(shell $(POSTBUILD_COMMAND))
+endif  
+
+ifneq ($(strip $(PLATFORM_INCS)),)
+$(PLATFORM_INCS_FILE) :
+       @$(MKDIR) $(MKDIR_OP) $(subst $(BSLASH),/,$(@D))
+ifneq ($(findstring Linux,$(OS_NAME)),)
+       @echo $(PLATFORM_INCS) > $@
+else
+ifneq ($(findstring 3.82,$(MAKE_VERSION)),)
+       $(file > $@,$(PLATFORM_INCS))
+else
+       @echo $(PLATFORM_INCS) > $@
+endif   
+endif
+endif
+
+ALL_EDJ_FILES :=
+
+define EDJ_PROC
+ALL_EDCS := $$(subst $(BSLASH),/,$$($(2)))
+NORMAL_EDCS := $$(filter-out %*.edc,$$(ALL_EDCS))
+WIDLCARD_EDCS := $$(filter %*.edc,$$(ALL_EDCS))
+EDCS := $$(NORMAL_EDCS) $$(foreach var_edc,$$(WIDLCARD_EDCS),$$(call FIND_FILES,$$(var_edc)))
+
+ifneq ($$(strip $$(EDCS)),)
+EDJ_FILES := $$(call FUNC_EDC2EDJ,$$(EDCS))
+
+ALL_EDJ_FILES += $$(EDJ_FILES)
+
+EDC_$(1)_COMPILER_FLAGS := -id "$$(SDK_TOOLPATH)/enventor/share/enventor/images"
+EDC_$(1)_COMPILER_FLAGS += -sd "$$(SDK_TOOLPATH)/enventor/share/enventor/sounds"
+EDC_$(1)_COMPILER_FLAGS += -fd "$$(SDK_TOOLPATH)/enventor/share/enventor/fonts"
+
+ifneq ($$(strip $(3)),)
+EDC_$(1)_COMPILER_FLAGS += $$(addprefix -id $$(PROJ_PATH)/,$$($(3)))
+endif
+ifneq ($$(strip $(4)),)
+EDC_$(1)_COMPILER_FLAGS += $$(addprefix -id ,$$($(4)))
+endif
+ifneq ($$(strip $(5)),)
+EDC_$(1)_COMPILER_FLAGS += $$(addprefix -sd $$(PROJ_PATH)/,$$($(5)))
+endif
+ifneq ($$(strip $(6)),)
+EDC_$(1)_COMPILER_FLAGS += $$(addprefix -sd ,$$($(6)))
+endif
+ifneq ($$(strip $(7)),)
+EDC_$(1)_COMPILER_FLAGS += $$(addprefix -fd $$(PROJ_PATH)/,$$($(7)))
+endif
+ifneq ($$(strip $(8)),)
+EDC_$(1)_COMPILER_FLAGS += $$(addprefix -fd ,$$($(8)))
+endif
+
+$$(EDJ_FILES) : $$(OUTPUT_DIR)/%.edj : $$(PROJ_ROOT)/%.edc 
+       @echo '  Building file: $$<'
+       @echo '  Invoking: EDC Resource Compiler'
+       @$$(MKDIR) $$(MKDIR_OP) $$(subst $$(BSLASH),/,$$(@D))
+       $$(EDJE_CC) $$(EDC_$(1)_COMPILER_FLAGS) $$(CDEFS) "$$<" "$$@"
+       @echo '  Finished building: $$<'
+endif
+endef
+
+# Global EDCs
+ifneq ($(strip $(USER_EDCS)),)
+$(eval $(call EDJ_PROC,,USER_EDCS,USER_EDCS_IMAGE_DIRS,USER_EDCS_IMAGE_DIRS_ABS,USER_EDCS_SOUND_DIRS,USER_EDCS_SOUND_DIRS_ABS,USER_EDCS_FONT_DIRS,USER_EDCS_FONT_DIRS_ABS))
+endif
+
+# Individual EDCs
+ifneq ($(strip $(USER_EXT_EDC_KEYS)),)
+$(foreach var,$(USER_EXT_EDC_KEYS),$(eval $(call EDJ_PROC,$(var),USER_EXT_$(var)_EDCS,USER_EXT_$(var)_EDCS_IMAGE_DIRS,USER_EXT_$(var)_EDCS_IMAGE_DIRS_ABS,USER_EXT_$(var)_EDCS_SOUND_DIRS,USER_EXT_$(var)_EDCS_SOUND_DIRS_ABS,USER_EXT_$(var)_EDCS_FONT_DIRS,USER_EXT_$(var)_EDCS_FONT_DIRS_ABS)))
+endif
+
+
+ifneq ($(strip $(POS)),)
+define MO_RULE
+$(call FUNC_PO2MO,$(1)) : $(PROJ_ROOT)/$(1)
+       @echo '  Building file: $$<'
+       @echo '  Invoking: msgfmt String Formatter'
+       @$$(MKDIR) $$(MKDIR_OP) $$(subst $$(BSLASH),/,$$(@D))
+       $$(MSGFMT) -o $$@ $$<
+       @echo '  Finished building: $$<'
+endef
+
+$(foreach var,$(POS),$(eval $(call MO_RULE,$(var))))
+endif
+
+
+secondary-outputs : $(ALL_EDJ_FILES) $(MO_FILES)
+
+-include appendix.mk
+
+
+clean :
+       rm -f "$(APPFILE)"
+       rm -rf "$(OUTPUT_DIR)"
+
+
+version :
+       @echo $(BUILD_SCRIPT_VERSION)
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/Build/prepost.mk b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/Build/prepost.mk
new file mode 100644 (file)
index 0000000..6bb5e2f
--- /dev/null
@@ -0,0 +1,6 @@
+
+# Add pre/post build process
+PREBUILD_DESC = 
+PREBUILD_COMMAND = 
+POSTBUILD_DESC = 
+POSTBUILD_COMMAND = 
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/Build/tooldef.mk b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/Build/tooldef.mk
new file mode 100644 (file)
index 0000000..4244fb3
--- /dev/null
@@ -0,0 +1,61 @@
+# Add inputs and outputs from these tool invocations to the build variables
+
+ifeq ($(strip $(BUILD_CONFIG)),)
+BUILD_CONFIG = Debug
+endif
+
+ifeq ($(strip $(OUTPUT_DIR)),)
+OUTPUT_DIR := $(PROJPATH)/$(BUILD_CONFIG)
+endif
+
+
+ifneq ($(strip $(MKDIR_BIN)),)
+MKDIR = $(MKDIR_BIN)
+MKDIR_OP = -p
+else
+MKDIR = mkdir
+MKDIR_OP = -p
+endif
+
+ifneq ($(strip $(UNAME_BIN)),)
+UNAME = $(UNAME_BIN)
+else
+UNAME = uname
+endif
+
+ifneq ($(strip $(M4_BIN)),)
+M4 = $(M4_BIN)
+else
+M4 = m4
+endif
+
+ifneq ($(strip $(TR_BIN)),)
+TR = $(TR_BIN)
+else
+TR = tr
+endif
+
+ifneq ($(strip $(FIND_BIN)),)
+FIND = $(FIND_BIN)
+else
+FIND = find
+endif
+
+ifneq ($(strip $(GREP_BIN)),)
+GREP = $(GREP_BIN)
+else
+GREP = grep
+endif
+
+ifneq ($(strip $(EDJE_CC_BIN)),)
+EDJE_CC = $(EDJE_CC_BIN)
+else
+EDJE_CC = edje_cc
+endif
+
+ifneq ($(strip $(MSGFMT_BIN)),)
+MSGFMT = $(MSGFMT_BIN)
+else
+MSGFMT = msgfmt
+endif
+
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/inc/assert.h b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/inc/assert.h
new file mode 100644 (file)
index 0000000..594bf5c
--- /dev/null
@@ -0,0 +1,70 @@
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Apache License, Version 2.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+#ifndef _ASSERT_H_
+#define _ASSERT_H_
+#include <stdio.h>
+#include <stdlib.h>
+
+#define assert(exp) \
+    if (!(exp)) { \
+        fprintf(stderr, \
+            "\\n[TCT][%s][Line : %d] Assert Fail; Following expression is not true: %s\\n", __FILE__, __LINE__, #exp); \
+        return 1; \
+    }
+
+#define assert_eq(var, ref) \
+    if (var != ref) { \
+        fprintf(stderr, \
+            "\\n[TCT][%s][Line : %d] Assert fail; Values (%s) and (%s) are not equal\\n", __FILE__, __LINE__, #var, #ref); \
+        return 1; \
+    }
+
+#define assert_neq(var, ref) \
+   if (var == ref) { \
+        fprintf(stderr, \
+            "\\n[TCT][%s][Line : %d] Assert fail; Values (%s) and (%s) are equal\\n", __FILE__, __LINE__, #var, #ref); \
+        return 1; \
+    }
+
+#define assert_gt(var, ref) \
+    if (var <= ref) { \
+        fprintf(stderr, \
+            "\\n[TCT][%s][Line : %d] Assert fail; Values (%s) is not greater than (%s)\\n", __FILE__, __LINE__, #var, #ref); \
+        return 1; \
+    }
+
+#define assert_geq(var, ref) \
+    if (var < ref) { \
+        fprintf(stderr, \
+            "\\n[TCT][%s][Line : %d] Assert fail; Values (%s) is not greater than or equal to (%s)\\n", __FILE__, __LINE__, #var, #ref); \
+        return 1; \
+    }
+
+#define assert_lt(var, ref) \
+    if (var >= ref) { \
+        fprintf(stderr, \
+            "\\n[TCT][%s][Line : %d] Assert fail; Values (%s) is not lower than (%s)\\n", __FILE__, __LINE__, #var, #ref); \
+        return 1; \
+    }
+
+#define assert_leq(var, ref) \
+    if (var > ref) { \
+        fprintf(stderr, \
+            "\\n[TCT][%s][Line : %d] Assert fail; Values (%s) is not lower than or equal to (%s)\\n", __FILE__, __LINE__, #var, #ref); \
+        return 1; \
+    }
+
+#endif //  _ASSERT_H_
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/inc/assert_common.h b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/inc/assert_common.h
new file mode 100644 (file)
index 0000000..0a3e388
--- /dev/null
@@ -0,0 +1,83 @@
+#ifndef __ASSERT_COMMON_H__
+#define __ASSERT_COMMON_H__
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <app.h>
+
+int utc_result;
+
+#define assert_with_exit(exp) do { \
+               if (!(exp)) { \
+                       fprintf(stderr, \
+                               "Assert fail in %s:%d\n", __FILE__, __LINE__); \
+                       fprintf(stderr, \
+                               "Following expression is not true:\n" \
+                               "%s\n", #exp); \
+                       utc_result = 1; \
+                       ui_app_exit(); \
+                       return 1; \
+               } \
+       } while (0)
+
+#define assert_eq_with_exit(var, ref) do { \
+               if (var != ref) { \
+                       fprintf(stderr, \
+                               "Assert fail in %s:%d\n", __FILE__, __LINE__); \
+                       fprintf(stderr, \
+                               "Values \"%s\" and \"%s\" are not equal:\n" \
+                               "%s == %d, %s == %d\n", \
+                               #var, #ref, #var, (int)var, #ref, (int)ref); \
+                       utc_result = 1; \
+                       ui_app_exit(); \
+                       return 1; \
+               } \
+       } while (0)
+
+#define assert_neq_with_exit(var, ref) do { \
+               if (var == ref) { \
+                       fprintf(stderr, \
+                               "Assert fail in %s:%d\n", __FILE__, __LINE__); \
+                       fprintf(stderr, \
+                               "Values \"%s\" and \"%s\" are equal:\n" \
+                               "%s == %s == %d\n", \
+                               #var, #ref, #var, #ref, (int)ref); \
+                       utc_result = 1; \
+                       ui_app_exit(); \
+                       return 1; \
+               } \
+       } while (0)
+
+#define assert_eq_without_exit(var, ref) do { \
+               if (var != ref) { \
+                       fprintf(stderr, \
+                               "Assert fail in %s:%d\n", __FILE__, __LINE__); \
+                       fprintf(stderr, \
+                               "Values \"%s\" and \"%s\" are not equal:\n" \
+                               "%s == %d, %s == %d\n", \
+                               #var, #ref, #var, (int)var, #ref, (int)ref); \
+                       utc_result = 1; \
+                       return 1; \
+               } \
+       } while (0)
+
+#define assert_neq_without_exit(var, ref) do { \
+               if (var == ref) { \
+                       fprintf(stderr, \
+                               "Assert fail in %s:%d\n", __FILE__, __LINE__); \
+                       fprintf(stderr, \
+                               "Values \"%s\" and \"%s\" are equal:\n" \
+                               "%s == %s == %d\n", \
+                               #var, #ref, #var, #ref, (int)ref); \
+                       utc_result = 1; \
+                       return 1; \
+               } \
+       } while (0)
+
+#define normal_exit(result) do { \
+               utc_result = result; \
+               ui_app_exit(); \
+       } while (0)
+
+
+#endif /* __ASSERT_COMMON_H__ */
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/inc/tct_common.h b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/inc/tct_common.h
new file mode 100644 (file)
index 0000000..85fff6e
--- /dev/null
@@ -0,0 +1,190 @@
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Apache License, Version 2.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+#ifndef _TCT_COMMON_H_
+#define _TCT_COMMON_H_
+
+#include "assert.h"
+
+#include <malloc.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <system_info.h>
+
+#define DEBUG 1
+#define ERR_LOG "/tmp/tclog"
+#define TC_RESULT "/tmp/tcresult"
+#define UTC_LOG "/tmp/utclog_core"
+#define CONFIGFILE_PATH "/tmp/TC_Config.txt"
+#define CONFIG_LINE_LEN_MAX                    2048
+#define CONFIG_VALUE_LEN_MAX           1024
+
+FILE *g_fpLog;
+FILE *g_fpLogDump;
+
+#define FPRINTF(...) {\
+       g_fpLog = fopen(ERR_LOG, "a");\
+       fprintf(g_fpLog, __VA_ARGS__);\
+       fclose(g_fpLog);\
+}
+
+#define DUMP_UTC_ERRLOG() {\
+       g_fpLogDump = freopen(ERR_LOG, "w", stderr);\
+       fflush(stderr);\
+}
+
+#define CLOSE_UTC_ERRLOG() {\
+       if(g_fpLogDump) \
+       {       fclose(g_fpLogDump); g_fpLogDump = NULL; }\
+}
+
+#define PRINT_UTC_LOG(...) {\
+       g_fpLog = fopen(UTC_LOG, "a");\
+       fprintf(g_fpLog, __VA_ARGS__);\
+       fclose(g_fpLog);\
+}
+
+
+#define PRINT_TC_RESULT(...) {\
+       g_fpLog = fopen(TC_RESULT, "w");\
+       fprintf(g_fpLog, __VA_ARGS__);\
+       fclose(g_fpLog);\
+}
+
+
+#define IS_FEATURE_SUPPORTED(feature_name, featureFlag, ModuleName)\
+{\
+       if ( !(TCTCheckSystemInfoFeatureSupported(feature_name, ModuleName)) )\
+{\
+       featureFlag = false;\
+}\
+       else\
+{\
+       featureFlag = true;\
+}\
+}
+
+#define PRINT_RESULT(eCompare, eRetVal, API, Error) {\
+       if ( eRetVal == eCompare )\
+{\
+       if ( DEBUG )\
+{\
+       FPRINTF("[Line : %d][%s] %s passed\\n", __LINE__, API_NAMESPACE, API);\
+}\
+}\
+       else \
+{\
+       FPRINTF("[Line : %d][%s] %s failed, error returned = %s [%d]\\n", __LINE__, API_NAMESPACE, API, Error, eRetVal);\
+       return 1;\
+}\
+}
+
+#define PRINT_RESULT_NORETURN(eCompare, eRetVal, API, Error) {\
+       if ( eRetVal == eCompare )\
+{\
+       if ( DEBUG )\
+{\
+       FPRINTF("[Line : %d][%s] %s passed\\n", __LINE__, API_NAMESPACE, API);\
+}\
+}\
+       else \
+{\
+       FPRINTF("[Line : %d][%s] %s failed, error returned = %s [%d]\\n", __LINE__, API_NAMESPACE, API, Error, eRetVal);\
+}\
+}
+
+#define PRINT_RESULT_CLEANUP(eCompare, eRetVal, API, Error, FreeResource) {\
+       if ( eRetVal == eCompare )\
+{\
+       if ( DEBUG )\
+{\
+       FPRINTF("[Line : %d][%s] %s passed\\n", __LINE__, API_NAMESPACE, API);\
+}\
+}\
+else \
+{\
+       FPRINTF("[Line : %d][%s] %s failed, error returned = %s [%d]\\n", __LINE__, API_NAMESPACE, API, Error, eRetVal);\
+       FreeResource;\
+       return 1;\
+}\
+}
+
+
+#define PRINT_RESULT(eCompare, eRetVal, API, Error) {\
+       if ( eRetVal == eCompare )\
+{\
+       if ( DEBUG )\
+{\
+       FPRINTF("[Line : %d][%s] %s passed\\n", __LINE__, API_NAMESPACE, API);\
+}\
+}\
+       else \
+{\
+       FPRINTF("[Line : %d][%s] %s failed, error returned = %s [%d]\\n", __LINE__, API_NAMESPACE, API, Error, eRetVal);\
+       return 1;\
+}\
+}
+
+
+#define CHECK_VALUE_STRING(StringVariable, API) {\
+       if ( StringVariable == NULL )\
+{\
+       FPRINTF("[Line : %d][%s] %s failed, error returned = value returned is NULL\\n", __LINE__, API_NAMESPACE, API);\
+       return 1;\
+}\
+       else if ( DEBUG )\
+{\
+       FPRINTF("[Line : %d][%s] value returned = %s\\n", __LINE__, API_NAMESPACE, StringVariable);\
+}\
+       free(StringVariable);\
+       StringVariable = NULL;\
+}
+
+#define CHECK_VALUE_INT(Variable, API) {\
+       if ( Variable == 0 )\
+{\
+       FPRINTF("[Line : %d][%s] %s failed, error returned = value returned is Zero\\n", __LINE__, API_NAMESPACE, API);\
+       return 1;\
+}\
+       else if ( DEBUG )\
+{\
+       FPRINTF("[Line : %d][%s] value returned = %d\\n", __LINE__, API_NAMESPACE, Variable);\
+}\
+}
+
+#define CHECK_HANDLE(Handle, API) {\
+       if ( Handle == NULL )\
+{\
+       FPRINTF("[Line : %d][%s] %s failed, error returned = Handle returned is NULL\\n", __LINE__, API_NAMESPACE, API);\
+       return 1;\
+}\
+}
+
+#define FREE_MEMORY(buffer) {\
+       if ( buffer != NULL )\
+{\
+       free(buffer);\
+       buffer = NULL;\
+}\
+}
+
+bool TCTCheckSystemInfoFeatureSupported(char* pszKey, char* pszModuleName);
+char* TCTSystemInfoGetError(int nRet);
+bool GetValueFromConfigFile(char* pstrKeyString, char* pstrValue, char* pstrModule);
+#endif // _TCT_COMMON_H_
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/inc/testcase.h b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/inc/testcase.h
new file mode 100644 (file)
index 0000000..63584c9
--- /dev/null
@@ -0,0 +1,33 @@
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Apache License, Version 2.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+#ifndef _TESTCASE_H_
+#define _TESTCASE_H_
+
+/* pointer to startup/cleanup functions */
+typedef void (*void_fun_ptr)(void);
+
+/* pointer to testcase functions */
+typedef int (*tc_fun_ptr)(void);
+
+/* struct describing specific testcase */
+typedef struct testcase_s {
+    const char* name;
+    tc_fun_ptr function;
+    void_fun_ptr startup;
+    void_fun_ptr cleanup;
+} testcase;
+
+#endif // _TESTCASE_H_
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/inc/{TESTSUITE_NAME}.h b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/inc/{TESTSUITE_NAME}.h
new file mode 100644 (file)
index 0000000..f88b5ce
--- /dev/null
@@ -0,0 +1,27 @@
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Apache License, Version 2.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+#ifndef __{TESTSUITE_NAME}_H__
+#define __{TESTSUITE_NAME}_H__
+
+#include "testcase.h"
+#include "tct_common.h"
+
+
+testcase tc_array[] = {
+    {NULL, NULL}
+};
+
+#endif
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/project_def.prop b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/project_def.prop
new file mode 100644 (file)
index 0000000..9156e17
--- /dev/null
@@ -0,0 +1,61 @@
+
+# Project Name
+APPNAME = {TESTSUITE_NAME}
+
+# Project Type
+type = app
+
+# Project Profile
+profile = mobile-2.4
+
+# C Sources
+USER_SRCS = src/tct_common.c src/{TESTSUITE_NAME}.c
+
+# EDC Sources
+USER_EDCS =  
+
+# PO Sources
+USER_POS = 
+
+# User Defines
+USER_DEFS = 
+USER_CPP_DEFS = 
+
+# User Undefines
+USER_UNDEFS = 
+USER_CPP_UNDEFS = 
+
+# User Libraries
+USER_LIBS = 
+
+# User Objects
+USER_OBJS = 
+USER_OBJS_ABS = 
+
+# User Includes
+## C Compiler
+USER_INC_DIRS = inc 
+USER_INC_DIRS_ABS = 
+USER_INC_FILES = 
+USER_INC_FILES_ABS = 
+## C++ Compiler
+USER_CPP_INC_DIRS = 
+USER_CPP_INC_DIRS_ABS = 
+USER_CPP_INC_FILES = 
+USER_CPP_INC_FILES_ABS = 
+
+# User Library Path
+USER_LIB_DIRS = 
+USER_LIB_DIRS_ABS = 
+
+# EDC Resource Path
+USER_EDCS_IMAGE_DIRS = 
+USER_EDCS_IMAGE_DIRS_ABS = 
+USER_EDCS_SOUND_DIRS = 
+USER_EDCS_SOUND_DIRS_ABS = 
+USER_EDCS_FONT_DIRS = 
+USER_EDCS_FONT_DIRS_ABS = 
+
+# EDC Flags
+USER_EXT_EDC_KEYS = 
+
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/shared/res/res/org.tizen.helloworld-1.0.0-arm.tpk b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/shared/res/res/org.tizen.helloworld-1.0.0-arm.tpk
new file mode 100644 (file)
index 0000000..502b223
Binary files /dev/null and b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/shared/res/res/org.tizen.helloworld-1.0.0-arm.tpk differ
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/shared/res/res/org.tizen.helloworld-1.0.0-i386.tpk b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/shared/res/res/org.tizen.helloworld-1.0.0-i386.tpk
new file mode 100644 (file)
index 0000000..8569cb7
Binary files /dev/null and b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/shared/res/res/org.tizen.helloworld-1.0.0-i386.tpk differ
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/shared/res/res/org.tizen.helloworld2-1.0.0-arm.tpk b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/shared/res/res/org.tizen.helloworld2-1.0.0-arm.tpk
new file mode 100644 (file)
index 0000000..757c942
Binary files /dev/null and b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/shared/res/res/org.tizen.helloworld2-1.0.0-arm.tpk differ
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/shared/res/res/org.tizen.helloworld2-1.0.0-i386.tpk b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/shared/res/res/org.tizen.helloworld2-1.0.0-i386.tpk
new file mode 100644 (file)
index 0000000..67e98f2
Binary files /dev/null and b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/shared/res/res/org.tizen.helloworld2-1.0.0-i386.tpk differ
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/shared/res/{TESTSUITE_NAME}.png b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/shared/res/{TESTSUITE_NAME}.png
new file mode 100644 (file)
index 0000000..9765b1b
Binary files /dev/null and b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/shared/res/{TESTSUITE_NAME}.png differ
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/src/tct_common.c b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/src/tct_common.c
new file mode 100644 (file)
index 0000000..51059ae
--- /dev/null
@@ -0,0 +1,140 @@
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Apache License, Version 2.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include "tct_common.h"
+
+/**
+* @function            TCTCheckSystemInfoFeatureSupported
+* @description         Check the supported feature for the given key value
+* @parameter           char* pszKey : key value, char* pszModuleName : module name
+* @return                      true if supported else false
+*/
+bool TCTCheckSystemInfoFeatureSupported(char* pszKey, char* pszModuleName)
+{
+       if ( NULL == pszKey )
+       {
+               FPRINTF("[Line : %d][%s] Null key value passed to function : TCTCheckSystemInfoFeatureSupported\\n", __LINE__, pszModuleName);
+               return false;
+       }
+
+       bool bValue = false;
+       int nRet = system_info_get_platform_bool (pszKey, &bValue);
+
+       if ( nRet != SYSTEM_INFO_ERROR_NONE )
+       {
+               FPRINTF("[Line : %d][%s] system_info_get_platform_bool returned (error = %s) for (key = %s)\\n", __LINE__, pszModuleName, TCTSystemInfoGetError(nRet), pszKey);
+               return false;
+       }
+
+       if ( bValue )
+       {
+               FPRINTF("[Line : %d][%s] Feature %s is supported\\n", __LINE__, pszModuleName, pszKey);
+       }
+       else
+       {
+               FPRINTF("[Line : %d][%s] Feature %s is not supported\\n", __LINE__, pszModuleName, pszKey);
+       }
+
+
+       return bValue;
+}
+
+/**
+* @function            TCTSystemInfoGetError
+* @description         Maps error enums to string values
+* @parameter           nRet : error code returned
+* @return                      error string
+*/
+char* TCTSystemInfoGetError(int nRet)
+{
+       char *szErrorVal = NULL;
+
+       switch ( nRet )
+       {
+       case SYSTEM_INFO_ERROR_NONE:                            szErrorVal = "SYSTEM_INFO_ERROR_NONE";                                  break;
+       case SYSTEM_INFO_ERROR_INVALID_PARAMETER:       szErrorVal = "SYSTEM_INFO_ERROR_INVALID_PARAMETER";             break;
+       case SYSTEM_INFO_ERROR_IO_ERROR:                        szErrorVal = "SYSTEM_INFO_ERROR_IO_ERROR";                              break;
+       case SYSTEM_INFO_ERROR_OUT_OF_MEMORY :          szErrorVal = "SYSTEM_INFO_ERROR_OUT_OF_MEMORY";                 break;
+       default :                                                                       szErrorVal = "Unknown error";                                                   break;
+       }
+
+       return szErrorVal;
+}
+
+/**
+* @function            GetValueFromConfigFile
+* @description         Get the corresponding value for a key from config file
+* @parameter           pstrKeyString : Key, pstrValue : Value
+* @return                      true for success, false for failure
+*/ 
+bool GetValueFromConfigFile(char* pstrKeyString, char* pstrValue, char* pstrModule)
+{
+       if ( NULL == pstrKeyString )
+       {
+               FPRINTF("[Line : %d][%s] The key string provided to fetch config file value is null\\n", __LINE__, pstrModule);
+               return false;
+       }
+
+
+       FILE* pfilePtr = fopen(CONFIGFILE_PATH, "r");
+       if ( NULL == pfilePtr )
+       {
+               FPRINTF("[Line : %d][%s] Unable to open configuration file : %s\\n", __LINE__, pstrModule, CONFIGFILE_PATH);
+               return false;
+       }
+
+       char* pszKey = NULL;
+       char* pszValue = NULL;
+       char* pszDelim = "=\n";
+       char szConfigLine[CONFIG_LINE_LEN_MAX] = {0,};
+
+       while ( !feof(pfilePtr) )
+       {
+               if ( fgets(szConfigLine, CONFIG_LINE_LEN_MAX, pfilePtr) != NULL )
+               {
+                       pszKey = strtok(szConfigLine, pszDelim);
+                       pszValue = strtok(NULL, pszDelim);
+
+                       if ( 0 == strcmp(pszKey, pstrKeyString) )
+                       {
+#if DEBUG
+                               FPRINTF("[Line : %d][%s][Key = %s;Config value = %s]\\n", __LINE__, pstrModule, pszKey, pszValue);
+#endif
+                               break;
+                       }
+
+                       pszKey = NULL;
+                       pszValue = NULL;
+               }
+       }
+
+       fclose(pfilePtr);
+       if ( NULL == pszValue )
+       {
+               FPRINTF("[Line : %d][%s][Key = %s;Unable to retrieve config value for this key. Check key at config file location : %s]\\n", __LINE__, pstrModule, pstrKeyString, CONFIGFILE_PATH);
+               return false;
+       }
+
+       if (strlen(pszValue) >= CONFIG_VALUE_LEN_MAX )
+       {
+               FPRINTF("[Line : %d][%s][Key = %s;Config Value should be less than %d characters in length]\\n", __LINE__, pstrModule, pszKey, CONFIG_VALUE_LEN_MAX);
+               return false;
+       }
+
+       memset(pstrValue, 0, CONFIG_VALUE_LEN_MAX);
+       strcpy(pstrValue, pszValue);
+       return true;
+}
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/src/{TESTSUITE_NAME}.c b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/src/{TESTSUITE_NAME}.c
new file mode 100644 (file)
index 0000000..42d5fe3
--- /dev/null
@@ -0,0 +1,122 @@
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Apache License, Version 2.0 (the License);
+// you may not use this g_TCFILE except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+#include <stdio.h>
+#include <string.h>
+#include "{TESTSUITE_NAME}.h"
+#include <malloc.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+#include <glib.h>
+#include <stdbool.h>
+#include "tct_common.h"
+#include <app.h>
+#include <dlog.h>
+#include <errno.h>
+
+#include <Elementary.h>
+#include <efl_extension.h>
+
+typedef struct appdata {
+       Evas_Object *win;
+       Evas_Object *conform;
+       Evas_Object *label;
+} appdata_s;
+
+static bool app_create(void *data)
+{
+       return true;
+}
+
+static void app_control(app_control_h app_control, void *data)
+{
+       char* pszGetTCName = NULL;
+       int i=0, result=0, nRet=0;
+       nRet = app_control_get_extra_data(app_control, "testcase_name", &pszGetTCName);
+       if(nRet != APP_CONTROL_ERROR_NONE)
+       {
+               dlog_print(DLOG_ERROR, "NativeTCT", "[%s:%d] app_control_get_extra_data returns error = %d", __FUNCTION__, __LINE__, nRet);
+               PRINT_UTC_LOG("\\n[%s][Line : %d]Unable to fetch test case name: app_control_get_extra_data API call fails\\n", __FILE__, __LINE__);
+               PRINT_TC_RESULT("%d",1);
+               FREE_MEMORY(pszGetTCName);
+               return;
+       }
+
+       dlog_print(DLOG_INFO, "NativeTCT", "[%s:%d] Executing TC Name = %s", __FUNCTION__, __LINE__, pszGetTCName);
+       for ( i = 0; tc_array[i].name; i++ )
+       {
+               if ( 0 == strncmp(pszGetTCName, tc_array[i].name, strlen(pszGetTCName)) )
+               {
+                       DUMP_UTC_ERRLOG();
+                       if ( tc_array[i].startup )
+                       {
+                               dlog_print(DLOG_INFO, "NativeTCT", "%s : Start up", pszGetTCName);
+                               tc_array[i].startup();
+                       }
+
+                       dlog_print(DLOG_INFO, "NativeTCT", "%s : Body", pszGetTCName);
+                       result = tc_array[i].function();
+                       dlog_print(DLOG_INFO, "NativeTCT", "%s returns value = %d", pszGetTCName, result);
+
+                       if ( tc_array[i].cleanup )
+                       {
+                               dlog_print(DLOG_INFO, "NativeTCT", "%s : Clean up", pszGetTCName);
+                               tc_array[i].cleanup();
+                       }
+
+                       CLOSE_UTC_ERRLOG();
+                       PRINT_TC_RESULT("%d",result);
+                       FREE_MEMORY(pszGetTCName);
+                       return;
+               }
+       }
+
+       dlog_print(DLOG_ERROR, "NativeTCT", "[%s:%d] Unable to execute %s : Unknown Test Case Name", __FUNCTION__, __LINE__, pszGetTCName);
+       PRINT_UTC_LOG("\\n[%s][Line : %d]Unable to execute %s : Unknown Test Case Name\\n", __FILE__, __LINE__, pszGetTCName);
+       PRINT_TC_RESULT("%d",1);
+       FREE_MEMORY(pszGetTCName);
+       return;
+}
+
+static void app_terminate(void *data)
+{
+       dlog_print(DLOG_INFO, "NativeTCT", "[%s:%d] Application Package is now Terminating", __FUNCTION__, __LINE__);
+}
+
+int main(int argc, char *argv[])
+{
+       int ret = 0;
+       appdata_s ad = {0,};
+
+       ui_app_lifecycle_callback_s event_callback = {0,};
+       event_callback.create = app_create;
+       event_callback.terminate = app_terminate;
+       event_callback.app_control = app_control;
+
+       dlog_print(DLOG_INFO, "NativeTCT", "[%s:%d] Application Main Function is Invoked", __FUNCTION__, __LINE__);
+       ret = ui_app_main(argc, argv, &event_callback, &ad);
+       if (ret != APP_ERROR_NONE)
+       {
+               dlog_print(DLOG_ERROR, "NativeTCT", "Application ui_app_main call gets failed. err = %d", ret);
+               PRINT_UTC_LOG("\\n[%s][Line : %d]Application ui_app_main call gets failed. err = %d\\n", __FILE__, __LINE__, ret);
+               PRINT_TC_RESULT("%d",1);
+               return ret;
+       }
+
+       dlog_print(DLOG_INFO, "NativeTCT", "[%s:%d] Application Package is Terminated", __FUNCTION__, __LINE__);
+       return ret;
+}
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/tizen-manifest.xml b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/native_templates/tizen-manifest.xml
new file mode 100644 (file)
index 0000000..1af5391
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns="http://tizen.org/ns/packages" api-version="2.4" package="org.tizen.{TESTSUITE_NAME}" version="1.0.0">
+       <profile name="mobile" />
+       <ui-application appid="org.tizen.{TESTSUITE_NAME}" exec="{TESTSUITE_NAME}" type="capp" multiple="false" taskmanage="true" nodisplay="false">
+               <icon>{TESTSUITE_NAME}.png</icon>
+               <label>{TESTSUITE_NAME}</label>
+       </ui-application>
+   <privileges>
+               <privilege></privilege>
+    </privileges>
+</manifest>
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/COPYING b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/COPYING
new file mode 100644 (file)
index 0000000..9485674
--- /dev/null
@@ -0,0 +1,25 @@
+Copyright (c) 2015 Samsung Electronics Co.
+
+Redistribution and use in source and binary forms, with or without modification, 
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list 
+  of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice, 
+  this list of conditions and the following disclaimer in the documentation 
+  and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors 
+  may be used to endorse or promote products derived from this work without 
+  specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS" 
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT, 
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/LICENSE.Apache-2.0 b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/LICENSE.Apache-2.0
new file mode 100644 (file)
index 0000000..d645695
--- /dev/null
@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/Makefile.am b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/Makefile.am
new file mode 100644 (file)
index 0000000..0062d68
--- /dev/null
@@ -0,0 +1,4 @@
+commondir = resources webrunner
+SUBDIRS = testcase $(commondir)
+docdir = $(prefix)/opt/{TESTSUITE_NAME}
+dist_doc_DATA = README tests.xml tests.full.xml NOTICE LICENSE.Apache-2.0 COPYING
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/NOTICE b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/NOTICE
new file mode 100644 (file)
index 0000000..e6f64da
--- /dev/null
@@ -0,0 +1,5 @@
+Copyright (c) 2015 Samsung Electronics Co., Ltd. All rights reserved.
+Copyright (c) 2012 Intel Corporation.
+Except as noted, this software is licensed under Apache License, Version 2 or BSD-3-Clause License.
+Please, see the LICENSE.Apache-2.0 file for Apache License, Version 2 terms and conditions
+or the COPYING file for BSD-3-Clause License.
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/README b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/README
new file mode 100644 (file)
index 0000000..564d9fc
--- /dev/null
@@ -0,0 +1,67 @@
+----------------------------------------------
+License
+----------------------------------------------
+Copyright (c) 2015 Samsung Electronics Co. 
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+  of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+  this list of conditions and the following disclaimer in the documentation
+  and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+  may be used to endorse or promote products derived from this work without
+  specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+
+
+----------------------------------------------
+Introduction
+----------------------------------------------
+This test suite is for testing Tizen {API_NAME} API, which covers the following specifications:
+
+
+
+----------------------------------------------
+Test Environment
+----------------------------------------------
+1. Testkit-stub must be installed on target device.
+2. Testkit-lite must be installed on test machine.
+
+
+----------------------------------------------
+Build and Run
+----------------------------------------------
+(Suppose you only get the source code and Testkit-Lite has been set up on your test machine.
+ If you have obtained tct-alarm-tizen-tests ZIP packages, you can directly go to step 3 on the test machine;
+ if you have not installed Testkit-Lite, you need to install the latest version.)
+
+Steps:
+1. Prepare for building by running the following command:
+   cd {TESTSUITE_NAME}
+
+2. Build ZIP package by running the following command:
+   ./pack.sh
+
+3. Unzip the package on the test machine by running the following command:
+   unzip -o {TESTSUITE_NAME}-<version>.zip -d /opt/usr/media/tct
+
+4. Install the package on the test machine by running the following command:
+   /opt/usr/media/tct/opt/{TESTSUITE_NAME}/inst.sh
+
+5. Run test cases by running the following command on host:
+   testkit-lite -f device:/opt/usr/media/tct/opt/{TESTSUITE_NAME}/tests.xml -e "WRTLauncher" -o {TESTSUITE_NAME}.results.xml
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/autogen b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/autogen
new file mode 100644 (file)
index 0000000..c5a7472
--- /dev/null
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+autoreconf --install
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/config.xml b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/config.xml
new file mode 100644 (file)
index 0000000..3cdca4e
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<widget id='http://tizen.org/test/{TESTSUITE_NAME}' xmlns='http://www.w3.org/ns/widgets' xmlns:tizen='http://tizen.org/ns/widgets' version='{TIZEN_VERSION}'>
+  <name>{TESTSUITE_NAME}</name>
+  <icon src="icon.png" height="117" width="117"/>
+  <tizen:application id="{APP_ID}" package="{PACK_ID}" required_version="{REQUIRED_VER}"/>
+  <tizen:setting screen-orientation="landscape" />
+  <tizen:setting background-support="enable"/>
+</widget>
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/configure.ac b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/configure.ac
new file mode 100644 (file)
index 0000000..62e72ed
--- /dev/null
@@ -0,0 +1,8 @@
+AC_INIT([{TESTSUITE_NAME}], [2.4], [kimsamsung@samsung.com])
+AM_INIT_AUTOMAKE([-Wall -Werror foreign])
+
+AC_CONFIG_FILES([Makefile \
+testcase/Makefile \
+resources/Makefile \
+webrunner/Makefile])
+AC_OUTPUT
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/icon.png b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/icon.png
new file mode 100644 (file)
index 0000000..aa50240
Binary files /dev/null and b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/icon.png differ
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/inst.sh b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/inst.sh
new file mode 100644 (file)
index 0000000..b21fb56
--- /dev/null
@@ -0,0 +1,89 @@
+#!/bin/bash
+wgt_installer="pkgcmd"
+NAME=$(basename $(cd $(dirname $0);pwd))
+
+#parse params
+USAGE="Usage: ./inst.sh [-i] [-u]
+  -i install wgt and config environment 
+  -u uninstall wgt and remove source file
+[-i] option was set as default."
+
+function installpkg(){
+### install wgt ###
+type $wgt_installer > /dev/null 2>&1
+if [ $? -eq 0 ]; then
+    [ -e /opt/usr/media/tct/opt/$NAME/$NAME.wgt ] && $wgt_installer -i -t wgt -q -p /opt/usr/media/tct/opt/$NAME/$NAME.wgt
+    if [ $? -eq 0 ]; then
+        echo "Install /opt/usr/media/tct/opt/$NAME/$NAME.wgt to /opt/usr/apps/`wrt-launcher -l 2> /dev/null | grep $NAME | tail -n 1 | awk '{ print $(NF-1) }'` done"
+        echo "$(wrt-launcher -l | grep $NAME | awk '{ print $(NF-1) }') sdbd rw" | smackload
+    else
+        echo "Install /opt/$NAME/$NAME.wgt fail ..."
+    fi
+    sync
+fi
+}
+
+function uninstallpkg(){
+### uninstall wgt ###
+type $wgt_installer > /dev/null 2>&1
+if [ $? -eq 0 ]; then
+    package_id=`wrt-launcher -l 2> /dev/null | grep $NAME | tail -n 1 | awk '{ print $(NF-1) }'`
+    if [ -n "$(ps -ef | grep $package_id | grep -v grep | awk '{print $2}')" ]; then
+        for i in $(ps -ef | grep $package_id | grep -v grep | awk '{print $2}')
+        do
+            kill -9 $i
+            if [ "$?" -ne 0 ]; then
+                echo "Kill the processes of $NAME fail ..."
+            else
+                echo "Kill the processes of $NAME done"
+            fi
+        done
+    fi
+    if [ -n "$package_id" ]; then
+        $wgt_installer -u -q -t wgt -n $package_id
+        if [ "$?" -ne 0 ]; then
+                echo "Uninstall $NAME fail ..."
+        else
+                echo "Uninstall $NAME done"
+        fi
+        sync
+    fi
+    for i in testalar00
+    do
+        if [ -n "$(ps -ef | grep $i | grep -v grep | awk '{print $2}')" ]; then
+            kill -9 $(ps -ef | grep $i | grep -v grep | awk '{print $2}')
+            if [ "$?" -ne 0 ]; then
+                echo "Kill the processes of $i fail ..."
+            else
+                echo "Kill the processes of $i done"
+           fi
+        fi
+        INSTALLED=`wrt-launcher -l | awk /$i/' { print $(NF); }'`
+        if [ -n "$INSTALLED" ] ; then
+            $wgt_installer -u -q -t wgt -n $i
+            if [ "$?" -ne 0 ]; then
+                echo "Uninstall $i fail ..."
+            else
+                echo "Uninstall $i done"
+            fi
+        fi
+    done
+fi
+
+### remove source file ###
+if [ -d /opt/usr/media/tct/opt/$NAME ];then
+    rm -rf /opt/usr/media/tct/opt/$NAME
+else
+    echo "Remove source file fail,please check if the source file exist: /opt/usr/media/tct/opt/$NAME ..."
+fi
+}
+
+case "$1" in
+    -h|--help) echo "$USAGE"
+               exit ;;
+    ""|-i) installpkg;;
+    -u) uninstallpkg;;
+    *) echo "Unknown option: $1"
+       echo "$USAGE"
+       exit ;;
+esac
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/manifest.json b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/manifest.json
new file mode 100644 (file)
index 0000000..f8b3349
--- /dev/null
@@ -0,0 +1,13 @@
+{
+    "version": "{TIZEN_VERSION}",
+    "name": "{TESTSUITE_NAME}",
+    "permissions": ["tabs", "unlimited_storage", "notifications", "http://*/*", "https://*/*"],
+    "description": "{TESTSUITE_NAME}",
+    "webapimanager": true,
+    "file_name": "manifest.json",
+    "app": {
+        "launch": {
+            "local_path": "index.html"
+        }
+    }
+}
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/pack.sh b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/pack.sh
new file mode 100644 (file)
index 0000000..5d069a1
--- /dev/null
@@ -0,0 +1,274 @@
+#!/bin/bash
+source $(dirname $0)/$(basename $(pwd)).spec
+
+#parse params
+usage="Usage: ./pack.sh [-t <package type: wgt | apk | crx | xpk>]
+[-t wgt] option was set as default."
+
+if [[ $1 == "-h" || $1 == "--help" ]]; then
+    echo $usage
+    exit 1
+fi
+
+type="wgt"
+while getopts t: o
+do
+    case "$o" in
+    t) type=$OPTARG;;
+    *) echo $usage
+       exit 1;;
+    esac
+done
+
+if [[ $type == "wgt" || $type == "apk" || $type == "crx" || $type == "xpk" ]];then
+    echo "Create package with $type and raw source"
+else 
+    echo "Sorry,$type is not support... >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
+    echo "$usage"
+    exit 1
+fi
+
+if [[ -z $name || -z $version || -z $appname ]];then
+    echo "Package name or version not specified in setting file"
+    exit 1
+fi
+
+SRC_ROOT=$PWD
+BUILD_ROOT=/tmp/${name}_pack
+BUILD_DEST=/tmp/${name}
+
+# check precondition
+function check_precondition(){
+    which $1 > /dev/null 2>&1
+    if [ $? -ne 0 ]; then
+        echo "Error: no tool: $1"
+        exit 1
+    fi
+}
+check_precondition autoreconf
+check_precondition gcc
+check_precondition make
+
+# clean
+function clean_workspace(){
+echo "cleaning workspace... >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
+rm -rf $BUILD_ROOT $BUILD_DEST
+}
+
+clean_workspace
+mkdir -p $BUILD_ROOT $BUILD_DEST
+
+# copy source code
+rm -rf *.rpm *.tar.bz2 *.tar.gz *.zip
+cp -arf $SRC_ROOT/* $BUILD_ROOT/
+
+# build
+echo "build from workspace... >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
+cd  $BUILD_ROOT
+./autogen && ./configure --prefix=/ && make && make install DESTDIR=$BUILD_DEST
+if [ $? -ne 0 ];then
+    echo "build fail,please check Makefile.am and cofigure.ac... >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
+    clean_workspace
+    exit 1
+fi
+find $BUILD_DEST -name "Makefile*" -delete
+
+## function for create wgt apk xpk ##
+
+function create_wgt(){
+# create wgt
+cd $BUILD_DEST
+cp -a $BUILD_ROOT/manifest.json   $BUILD_DEST/
+cp -a $BUILD_ROOT/icon.png     $BUILD_DEST/
+cat > index.html << EOF
+<!doctype html>
+<head>
+    <meta http-equiv="Refresh" content="1; url=opt/$name/webrunner/index.html?testsuite=/opt/usr/media/tct/opt/$name/tests.xml">
+</head>
+EOF
+cp -f $BUILD_ROOT/config.xml $BUILD_DEST/config.xml
+zip -rq $BUILD_DEST/opt/$name/$name.wgt *
+if [ $? -ne 0 ];then
+    echo "Create $name.wgt fail.... >>>>>>>>>>>>>>>>>>>>>>>>>"
+    clean_workspace
+    exit 1
+fi
+
+# sign wgt
+if [ $sign -eq 1 ];then
+    # copy signing tool
+    echo "copy signing tool... >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
+    cp -arf $SRC_ROOT/../../tools/signing $BUILD_ROOT/signing
+    if [ $? -ne 0 ];then
+        echo "No signing tool found in $SRC_ROOT/../tools.... >>>>>>>>>>>>>>>>>>>>>>>>>"
+        clean_workspace
+        exit 1
+    fi
+    wgt=$(find $BUILD_DEST/opt/$name/ -name *.wgt)
+    for wgt in $(find $BUILD_DEST/opt/$name/ -name *.wgt);do
+        $BUILD_ROOT/signing/sign-widget.sh --dist platform $wgt
+        if [ $? -ne 0 ];then
+            echo "Please check your signature files... >>>>>>>>>>>>>>>>>>>>>>>>>"
+            clean_workspace
+            exit 1
+        fi
+    done
+fi
+}
+
+function create_apk(){
+cd $BUILD_DEST
+cat > index.html << EOF
+<!doctype html>
+<head>
+    <meta http-equiv="Refresh" content="1; url=opt/$name/webrunner/index.html?testsuite=../tests.xml&testprefix=../../..">
+</head>
+EOF
+cp $BUILD_DEST/opt/$name/tests.xml $BUILD_DEST/
+cp -a $BUILD_ROOT/icon.png     $BUILD_DEST/
+cp -r $SRC_ROOT/../tools/xwalk_app_template $BUILD_ROOT/xwalk_app_template
+
+cd $BUILD_ROOT/xwalk_app_template
+python make_apk.py --package=org.xwalk.$appname --name=$appname --app-root=$BUILD_DEST --app-local-path=index.html --icon=$BUILD_DEST/icon.png
+if [ $? -ne 0 ];then
+    echo "Create $name.apk fail.... >>>>>>>>>>>>>>>>>>>>>>>>>"
+    clean_workspace
+    exit 1
+fi
+}
+
+function create_xpk(){
+cp -a $BUILD_ROOT/manifest.json   $BUILD_DEST/
+cp -a $BUILD_ROOT/icon.png     $BUILD_DEST/
+
+cd $BUILD_DEST
+cat > index.html << EOF
+<!doctype html>
+<head>
+    <meta http-equiv="Refresh" content="1; url=opt/$name/webrunner/index.html?testsuite=../tests.xml&testprefix=../../..">
+</head>
+EOF
+
+cp $SRC_ROOT/../tools/xpk_generator $BUILD_ROOT/xpk_generator
+cd $BUILD_ROOT
+./xpk_generator /tmp/$name key
+if [ $? -ne 0 ];then
+    echo "Create $name.xpk fail.... >>>>>>>>>>>>>>>>>>>>>>>>>"
+    clean_workspace
+    exit 1
+fi
+}
+
+function create_crx(){
+echo "crx is not support yet... >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
+clean_workspace
+exit 1
+}
+
+## zip function ##
+function zip_for_wgt(){
+cd $BUILD_DEST
+# cp inst.sh script #
+cp -af $BUILD_ROOT/inst.sh $BUILD_DEST/opt/$name/inst.sh
+
+if [ $src_file -eq 0 ];then
+    for file in $(ls opt/$name |grep -v wgt);do
+        if [[ "${whitelist[@]}" =~ $file ]];then
+            echo "$file in whitelist,keep it..."
+        else
+            echo "Remove unnessary file:$file..."
+            rm -rf opt/$name/$file
+        fi
+    done
+fi
+zip -Drq $BUILD_DEST/$name-$version.zip opt/
+if [ $? -ne 0 ];then
+    echo "Create zip package fail... >>>>>>>>>>>>>>>>>>>>>>>>>"
+    clean_workspace
+    exit 1
+fi
+}
+
+function zip_for_apk(){
+cd $BUILD_DEST
+# cp inst.sh script #
+cp -af $BUILD_ROOT/inst.sh.apk $BUILD_DEST/opt/$name/inst.sh
+mv $BUILD_ROOT/xwalk_app_template/$appname.apk $BUILD_DEST/opt/$name/
+
+if [ $src_file -eq 0 ];then
+    for file in $(ls opt/$name |grep -v apk);do
+        if [[ "${whitelist[@]}" =~ $file ]];then
+            echo "$file in whitelist,keep it..."
+        else
+            echo "Remove unnessary file:$file..."
+            rm -rf opt/$name/$file
+        fi
+    done
+fi
+zip -Drq $BUILD_DEST/$name-$version.zip opt/
+if [ $? -ne 0 ];then
+    echo "Create zip package fail... >>>>>>>>>>>>>>>>>>>>>>>>>"
+    clean_workspace
+    exit 1
+fi
+}
+
+function zip_for_xpk(){
+cd $BUILD_DEST
+cp -af $BUILD_ROOT/inst.sh.xpk $BUILD_DEST/opt/$name/inst.sh
+mv $BUILD_ROOT/$name.xpk $BUILD_DEST/opt/$name/
+
+if [ $src_file -eq 0 ];then
+    for file in $(ls opt/$name |grep -v xpk);do
+        if [[ "${whitelist[@]}" =~ $file ]];then
+            echo "$file in whitelist,keep it..."
+        else
+            echo "Remove unnessary file:$file..."
+            rm -rf opt/$name/$file
+        fi
+    done
+fi
+zip -Drq $BUILD_DEST/$name-$version.zip opt/
+if [ $? -ne 0 ];then
+    echo "Create zip package fail... >>>>>>>>>>>>>>>>>>>>>>>>>"
+    clean_workspace
+    exit 1
+fi
+}
+
+function zip_for_crx(){
+echo "zip_for_crx not ready yet... >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
+clean_workspace
+exit 1
+}
+
+## create wgt crx apk xpk and zip package ##
+case $type in
+    wgt) create_wgt
+         zip_for_wgt;;
+    apk) create_apk
+         zip_for_apk;;
+    xpk) create_xpk
+         zip_for_xpk;;
+    crx) create_crx
+         zip_for_crx;;
+esac
+
+
+# copy zip file
+echo "copy package from workspace... >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
+cp -f $BUILD_DEST/$name-$version.zip $SRC_ROOT/$name-$version.zip
+
+# clean workspace
+clean_workspace
+
+# validate
+echo "checking result... >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
+if [ -z "`ls $SRC_ROOT | grep "\.zip"`" ];then
+    echo "------------------------------ FAILED to build $name packages --------------------------"
+    exit 1
+fi
+
+echo "------------------------------ Done to build $name packages --------------------------"
+cd $SRC_ROOT
+ls *.zip 2>/dev/null
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/resources/COPYING b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/resources/COPYING
new file mode 100644 (file)
index 0000000..1866d2d
--- /dev/null
@@ -0,0 +1,12 @@
+All test files under this folder except COPYING and Makefile.am come from
+https://github.com/w3c/testharness.js (commit 81649066b179216eed02dfb58f631eb8bb6c7629)
+without any modification besides the necessary adjustment on reference path to test harness
+
+These tests are copyright by W3C and/or the author listed in the test
+file. The tests are dual-licensed under the W3C Test Suite License:
+http://www.w3.org/Consortium/Legal/2008/04-testsuite-license
+and the BSD 3-clause License:
+http://www.w3.org/Consortium/Legal/2008/03-bsd-license
+under W3C's test suite licensing policy:
+http://www.w3.org/Consortium/Legal/2008/04-testsuite-copyright
+
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/resources/Makefile.am b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/resources/Makefile.am
new file mode 100644 (file)
index 0000000..9624e21
--- /dev/null
@@ -0,0 +1,5 @@
+resources_SCRIPTS = *
+resourcesdir = $(prefix)/opt/{TESTSUITE_NAME}/resources
+EXTRA_DIST = $(resources_SCRIPTS)
+docdir = $(prefix)/opt/{TESTSUITE_NAME}/resources
+dist_doc_DATA = COPYING
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/resources/testharness.css b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/resources/testharness.css
new file mode 100644 (file)
index 0000000..365084f
--- /dev/null
@@ -0,0 +1,92 @@
+html {
+    font-family:DejaVu Sans, Bitstream Vera Sans, Arial, Sans;
+}
+
+#log .warning,
+#log .warning a {
+  color: black;
+  background: yellow;
+}
+
+#log .error,
+#log .error a {
+  color: white;
+  background: red;
+}
+
+#log pre {
+  border: 1px solid black;
+  padding: 1em;
+}
+
+section#summary {
+    margin-bottom:1em;
+}
+
+table#results {
+    border-collapse:collapse;
+    table-layout:fixed;
+    width:100%;
+}
+
+table#results th:first-child,
+table#results td:first-child {
+    width:4em;
+}
+
+table#results th:last-child,
+table#results td:last-child {
+    width:50%;
+}
+
+table#results.assertions th:last-child,
+table#results.assertions td:last-child {
+    width:35%;
+}
+
+table#results th {
+    padding:0;
+    padding-bottom:0.5em;
+    border-bottom:medium solid black;
+}
+
+table#results td {
+    padding:1em;
+    padding-bottom:0.5em;
+    border-bottom:thin solid black;
+}
+
+tr.pass > td:first-child {
+    color:green;
+}
+
+tr.fail > td:first-child {
+    color:red;
+}
+
+tr.timeout > td:first-child {
+    color:red;
+}
+
+tr.notrun > td:first-child {
+    color:blue;
+}
+
+.pass > td:first-child, .fail > td:first-child, .timeout > td:first-child, .notrun > td:first-child {
+    font-variant:small-caps;
+}
+
+table#results span {
+    display:block;
+}
+
+table#results span.expected {
+    font-family:DejaVu Sans Mono, Bitstream Vera Sans Mono, Monospace;
+    white-space:pre;
+}
+
+table#results span.actual {
+    font-family:DejaVu Sans Mono, Bitstream Vera Sans Mono, Monospace;
+    white-space:pre;
+}
+
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/resources/testharness.js b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/resources/testharness.js
new file mode 100644 (file)
index 0000000..a07de77
--- /dev/null
@@ -0,0 +1,2223 @@
+/*
+Distributed under both the W3C Test Suite License [1] and the W3C
+3-clause BSD License [2]. To contribute to a W3C Test Suite, see the
+policies and contribution forms [3].
+
+[1] http://www.w3.org/Consortium/Legal/2008/04-testsuite-license
+[2] http://www.w3.org/Consortium/Legal/2008/03-bsd-license
+[3] http://www.w3.org/2004/10/27-testcases
+*/
+
+/*
+ * == Introduction ==
+ *
+ * This file provides a framework for writing testcases. It is intended to
+ * provide a convenient API for making common assertions, and to work both
+ * for testing synchronous and asynchronous DOM features in a way that
+ * promotes clear, robust, tests.
+ *
+ * == Basic Usage ==
+ *
+ * To use this file, import the script and the testharnessreport script into
+ * the test document:
+ * <script src="/resources/testharness.js"></script>
+ * <script src="/resources/testharnessreport.js"></script>
+ *
+ * Within each file one may define one or more tests. Each test is atomic
+ * in the sense that a single test has a single result (pass/fail/timeout).
+ * Within each test one may have a number of asserts. The test fails at the
+ * first failing assert, and the remainder of the test is (typically) not run.
+ *
+ * If the file containing the tests is a HTML file with an element of id "log"
+ * this will be populated with a table containing the test results after all
+ * the tests have run.
+ *
+ * NOTE: By default tests must be created before the load event fires. For ways
+ *       to create tests after the load event, see "Determining when all tests
+ *       are complete", below
+ *
+ * == Synchronous Tests ==
+ *
+ * To create a synchronous test use the test() function:
+ *
+ * test(test_function, name, properties)
+ *
+ * test_function is a function that contains the code to test. For example a
+ * trivial passing test would be:
+ *
+ * test(function() {assert_true(true)}, "assert_true with true")
+ *
+ * The function passed in is run in the test() call.
+ *
+ * properties is an object that overrides default test properties. The
+ * recognised properties are:
+ *    timeout - the test timeout in ms
+ *
+ * e.g.
+ * test(test_function, "Sample test", {timeout:1000})
+ *
+ * would run test_function with a timeout of 1s.
+ *
+ * Additionally, test-specific metadata can be passed in the properties. These
+ * are used when the individual test has different metadata from that stored 
+ * in the <head>.
+ * The recognized metadata properties are:
+ *
+ *    help - The url of the part of the specification being tested
+ *
+ *    assert - A human readable description of what the test is attempting 
+ *             to prove
+ *
+ *    author - Name and contact information for the author of the test in the
+ *             format: "Name <email_addr>" or "Name http://contact/url"
+ *
+ * == Asynchronous Tests ==
+ *
+ * Testing asynchronous features is somewhat more complex since the result of
+ * a test may depend on one or more events or other callbacks. The API provided
+ * for testing these features is indended to be rather low-level but hopefully
+ * applicable to many situations.
+ *
+ * To create a test, one starts by getting a Test object using async_test:
+ *
+ * async_test(name, properties)
+ *
+ * e.g.
+ * var t = async_test("Simple async test")
+ *
+ * Assertions can be added to the test by calling the step method of the test
+ * object with a function containing the test assertions:
+ *
+ * t.step(function() {assert_true(true)});
+ *
+ * When all the steps are complete, the done() method must be called:
+ *
+ * t.done();
+ *
+ * As a convenience, async_test can also takes a function as first argument.
+ * This function is called with the test object as both its `this` object and
+ * first argument. The above example can be rewritten as:
+ *
+ * async_test(function(t) {
+ *     object.some_event = function() {
+ *         t.step(function (){assert_true(true); t.done();});
+ *     };
+ * }, "Simple async test");
+ *
+ * which avoids cluttering the global scope with references to async
+ * tests instances.
+ *
+ * The properties argument is identical to that for test().
+ *
+ * In many cases it is convenient to run a step in response to an event or a
+ * callback. A convenient method of doing this is through the step_func method
+ * which returns a function that, when called runs a test step. For example
+ *
+ * object.some_event = t.step_func(function(e) {assert_true(e.a)});
+ *
+ * == Making assertions ==
+ *
+ * Functions for making assertions start assert_
+ * The best way to get a list is to look in this file for functions names
+ * matching that pattern. The general signature is
+ *
+ * assert_something(actual, expected, description)
+ *
+ * although not all assertions precisely match this pattern e.g. assert_true
+ * only takes actual and description as arguments.
+ *
+ * The description parameter is used to present more useful error messages when
+ * a test fails
+ *
+ * NOTE: All asserts must be located in a test() or a step of an async_test().
+ *       asserts outside these places won't be detected correctly by the harness
+ *       and may cause a file to stop testing.
+ *
+ * == Setup ==
+ *
+ * Sometimes tests require non-trivial setup that may fail. For this purpose
+ * there is a setup() function, that may be called with one or two arguments.
+ * The two argument version is:
+ *
+ * setup(func, properties)
+ *
+ * The one argument versions may omit either argument.
+ * func is a function to be run synchronously. setup() becomes a no-op once
+ * any tests have returned results. Properties are global properties of the test
+ * harness. Currently recognised properties are:
+ *
+ * timeout - The time in ms after which the harness should stop waiting for
+ *           tests to complete (this is different to the per-test timeout
+ *           because async tests do not start their timer until .step is called)
+ *
+ * explicit_done - Wait for an explicit call to done() before declaring all
+ *                 tests complete (see below)
+ *
+ * output_document - The document to which results should be logged. By default
+ *                   this is the current document but could be an ancestor
+ *                   document in some cases e.g. a SVG test loaded in an HTML
+ *                   wrapper
+ *
+ * explicit_timeout - disable file timeout; only stop waiting for results
+ *                    when the timeout() function is called (typically for
+ *                    use when integrating with some existing test framework
+ *                    that has its own timeout mechanism).
+ *
+ * == Determining when all tests are complete ==
+ *
+ * By default the test harness will assume there are no more results to come
+ * when:
+ * 1) There are no Test objects that have been created but not completed
+ * 2) The load event on the document has fired
+ *
+ * This behaviour can be overridden by setting the explicit_done property to
+ * true in a call to setup(). If explicit_done is true, the test harness will
+ * not assume it is done until the global done() function is called. Once done()
+ * is called, the two conditions above apply like normal.
+ *
+ * == Generating tests ==
+ *
+ * NOTE: this functionality may be removed
+ *
+ * There are scenarios in which is is desirable to create a large number of
+ * (synchronous) tests that are internally similar but vary in the parameters
+ * used. To make this easier, the generate_tests function allows a single
+ * function to be called with each set of parameters in a list:
+ *
+ * generate_tests(test_function, parameter_lists, properties)
+ *
+ * For example:
+ *
+ * generate_tests(assert_equals, [
+ *     ["Sum one and one", 1+1, 2],
+ *     ["Sum one and zero", 1+0, 1]
+ *     ])
+ *
+ * Is equivalent to:
+ *
+ * test(function() {assert_equals(1+1, 2)}, "Sum one and one")
+ * test(function() {assert_equals(1+0, 1)}, "Sum one and zero")
+ *
+ * Note that the first item in each parameter list corresponds to the name of
+ * the test.
+ *
+ * The properties argument is identical to that for test(). This may be a 
+ * single object (used for all generated tests) or an array.
+ *
+ * == Callback API ==
+ *
+ * The framework provides callbacks corresponding to 3 events:
+ *
+ * start - happens when the first Test is created
+ * result - happens when a test result is recieved
+ * complete - happens when all results are recieved
+ *
+ * The page defining the tests may add callbacks for these events by calling
+ * the following methods:
+ *
+ *   add_start_callback(callback) - callback called with no arguments
+ *   add_result_callback(callback) - callback called with a test argument
+ *   add_completion_callback(callback) - callback called with an array of tests
+ *                                       and an status object
+ *
+ * tests have the following properties:
+ *   status: A status code. This can be compared to the PASS, FAIL, TIMEOUT and
+ *           NOTRUN properties on the test object
+ *   message: A message indicating the reason for failure. In the future this
+ *            will always be a string
+ *
+ *  The status object gives the overall status of the harness. It has the
+ *  following properties:
+ *    status: Can be compared to the OK, ERROR and TIMEOUT properties
+ *    message: An error message set when the status is ERROR
+ *
+ * == External API ==
+ *
+ * In order to collect the results of multiple pages containing tests, the test
+ * harness will, when loaded in a nested browsing context, attempt to call
+ * certain functions in each ancestor and opener browsing context:
+ *
+ * start - start_callback
+ * result - result_callback
+ * complete - completion_callback
+ *
+ * These are given the same arguments as the corresponding internal callbacks
+ * described above.
+ *
+ * == External API through cross-document messaging ==
+ *
+ * Where supported, the test harness will also send messages using
+ * cross-document messaging to each ancestor and opener browsing context. Since
+ * it uses the wildcard keyword (*), cross-origin communication is enabled and
+ * script on different origins can collect the results.
+ *
+ * This API follows similar conventions as those described above only slightly
+ * modified to accommodate message event API. Each message is sent by the harness
+ * is passed a single vanilla object, available as the `data` property of the
+ * event object. These objects are structures as follows:
+ *
+ * start - { type: "start" }
+ * result - { type: "result", test: Test }
+ * complete - { type: "complete", tests: [Test, ...], status: TestsStatus }
+ *
+ * == List of assertions ==
+ *
+ * assert_true(actual, description)
+ *   asserts that /actual/ is strictly true
+ *
+ * assert_false(actual, description)
+ *   asserts that /actual/ is strictly false
+ *
+ * assert_equals(actual, expected, description)
+ *   asserts that /actual/ is the same value as /expected/
+ *
+ * assert_not_equals(actual, expected, description)
+ *   asserts that /actual/ is a different value to /expected/. Yes, this means
+ *   that "expected" is a misnomer
+ *
+ * assert_in_array(actual, expected, description)
+ *   asserts that /expected/ is an Array, and /actual/ is equal to one of the
+ *   members -- expected.indexOf(actual) != -1
+ *
+ * assert_array_equals(actual, expected, description)
+ *   asserts that /actual/ and /expected/ have the same length and the value of
+ *   each indexed property in /actual/ is the strictly equal to the corresponding
+ *   property value in /expected/
+ *
+ * assert_approx_equals(actual, expected, epsilon, description)
+ *   asserts that /actual/ is a number within +/- /epsilon/ of /expected/
+ *
+ * assert_less_than(actual, expected, description)
+ *   asserts that /actual/ is a number less than /expected/
+ *
+ * assert_greater_than(actual, expected, description)
+ *   asserts that /actual/ is a number greater than /expected/
+ *
+ * assert_less_than_equal(actual, expected, description)
+ *   asserts that /actual/ is a number less than or equal to /expected/
+ *
+ * assert_greater_than_equal(actual, expected, description)
+ *   asserts that /actual/ is a number greater than or equal to /expected/
+ *
+ * assert_regexp_match(actual, expected, description)
+ *   asserts that /actual/ matches the regexp /expected/
+ *
+ * assert_class_string(object, class_name, description)
+ *   asserts that the class string of /object/ as returned in
+ *   Object.prototype.toString is equal to /class_name/.
+ *
+ * assert_own_property(object, property_name, description)
+ *   assert that object has own property property_name
+ *
+ * assert_inherits(object, property_name, description)
+ *   assert that object does not have an own property named property_name
+ *   but that property_name is present in the prototype chain for object
+ *
+ * assert_idl_attribute(object, attribute_name, description)
+ *   assert that an object that is an instance of some interface has the
+ *   attribute attribute_name following the conditions specified by WebIDL
+ *
+ * assert_readonly(object, property_name, description)
+ *   assert that property property_name on object is readonly
+ *
+ * assert_throws(code, func, description)
+ *   code - the expected exception:
+ *     o string: the thrown exception must be a DOMException with the given
+ *               name, e.g., "TimeoutError" (for compatibility with existing
+ *               tests, a constant is also supported, e.g., "TIMEOUT_ERR")
+ *     o object: the thrown exception must have a property called "name" that
+ *               matches code.name
+ *     o null:   allow any exception (in general, one of the options above
+ *               should be used)
+ *   func - a function that should throw
+ *
+ * assert_unreached(description)
+ *   asserts if called. Used to ensure that some codepath is *not* taken e.g.
+ *   an event does not fire.
+ *
+ * assert_any(assert_func, actual, expected_array, extra_arg_1, ... extra_arg_N)
+ *   asserts that one assert_func(actual, expected_array_N, extra_arg1, ..., extra_arg_N)
+ *   is true for some expected_array_N in expected_array. This only works for assert_func
+ *   with signature assert_func(actual, expected, args_1, ..., args_N). Note that tests
+ *   with multiple allowed pass conditions are bad practice unless the spec specifically
+ *   allows multiple behaviours. Test authors should not use this method simply to hide 
+ *   UA bugs.
+ *
+ * assert_exists(object, property_name, description)
+ *   *** deprecated ***
+ *   asserts that object has an own property property_name
+ *
+ * assert_not_exists(object, property_name, description)
+ *   *** deprecated ***
+ *   assert that object does not have own property property_name
+ */
+
+(function ()
+{
+    var debug = false;
+    // default timeout is 5 seconds, test can override if needed
+    var settings = {
+      output:true,
+      timeout:5000,
+      test_timeout:2000
+    };
+
+    var xhtml_ns = "http://www.w3.org/1999/xhtml";
+
+    // script_prefix is used by Output.prototype.show_results() to figure out
+    // where to get testharness.css from.  It's enclosed in an extra closure to
+    // not pollute the library's namespace with variables like "src".
+    var script_prefix = null;
+    (function ()
+    {
+        var scripts = document.getElementsByTagName("script");
+        for (var i = 0; i < scripts.length; i++)
+        {
+            if (scripts[i].src)
+            {
+                var src = scripts[i].src;
+            }
+            else if (scripts[i].href)
+            {
+                //SVG case
+                var src = scripts[i].href.baseVal;
+            }
+            if (src && src.slice(src.length - "testharness.js".length) === "testharness.js")
+            {
+                script_prefix = src.slice(0, src.length - "testharness.js".length);
+                break;
+            }
+        }
+    })();
+
+    /*
+     * API functions
+     */
+
+    var name_counter = 0;
+    function next_default_name()
+    {
+        //Don't use document.title to work around an Opera bug in XHTML documents
+        var prefix = document.getElementsByTagName("title").length > 0 ?
+                         document.getElementsByTagName("title")[0].firstChild.data :
+                         "Untitled";
+        var suffix = name_counter > 0 ? " " + name_counter : "";
+        name_counter++;
+        return prefix + suffix;
+    }
+
+    function test(func, name, properties)
+    {
+        var test_name = name ? name : next_default_name();
+        properties = properties ? properties : {};
+        var test_obj = new Test(test_name, properties);
+        test_obj.step(func);
+        if (test_obj.status === test_obj.NOTRUN) {
+            test_obj.done();
+        }
+    }
+
+    function async_test(func, name, properties)
+    {
+        if (typeof func !== "function") {
+            properties = name;
+            name = func;
+            func = null;
+        }
+        var test_name = name ? name : next_default_name();
+        properties = properties ? properties : {};
+        var test_obj = new Test(test_name, properties);
+        if (func) {
+            test_obj.step(func, test_obj, test_obj);
+        }
+        return test_obj;
+    }
+
+    function setup(func_or_properties, maybe_properties)
+    {
+        var func = null;
+        var properties = {};
+        if (arguments.length === 2) {
+            func = func_or_properties;
+            properties = maybe_properties;
+        } else if (func_or_properties instanceof Function){
+            func = func_or_properties;
+        } else {
+            properties = func_or_properties;
+        }
+        tests.setup(func, properties);
+        output.setup(properties);
+    }
+
+    function done() {
+        tests.end_wait();
+    }
+
+    function generate_tests(func, args, properties) {
+        forEach(args, function(x, i)
+                {
+                    var name = x[0];
+                    test(function()
+                         {
+                             func.apply(this, x.slice(1));
+                         }, 
+                         name, 
+                         Array.isArray(properties) ? properties[i] : properties);
+                });
+    }
+
+    function on_event(object, event, callback)
+    {
+      object.addEventListener(event, callback, false);
+    }
+
+    expose(test, 'test');
+    expose(async_test, 'async_test');
+    expose(generate_tests, 'generate_tests');
+    expose(setup, 'setup');
+    expose(done, 'done');
+    expose(on_event, 'on_event');
+
+    /*
+     * Return a string truncated to the given length, with ... added at the end
+     * if it was longer.
+     */
+    function truncate(s, len)
+    {
+        if (s.length > len) {
+            return s.substring(0, len - 3) + "...";
+        }
+        return s;
+    }
+
+    /*
+     * Convert a value to a nice, human-readable string
+     */
+    function format_value(val)
+    {
+        if (Array.isArray(val))
+        {
+            return "[" + val.map(format_value).join(", ") + "]";
+        }
+
+        switch (typeof val)
+        {
+        case "string":
+            val = val.replace("\\", "\\\\");
+            for (var i = 0; i < 32; i++)
+            {
+                var replace = "\\";
+                switch (i) {
+                case 0: replace += "0"; break;
+                case 1: replace += "x01"; break;
+                case 2: replace += "x02"; break;
+                case 3: replace += "x03"; break;
+                case 4: replace += "x04"; break;
+                case 5: replace += "x05"; break;
+                case 6: replace += "x06"; break;
+                case 7: replace += "x07"; break;
+                case 8: replace += "b"; break;
+                case 9: replace += "t"; break;
+                case 10: replace += "n"; break;
+                case 11: replace += "v"; break;
+                case 12: replace += "f"; break;
+                case 13: replace += "r"; break;
+                case 14: replace += "x0e"; break;
+                case 15: replace += "x0f"; break;
+                case 16: replace += "x10"; break;
+                case 17: replace += "x11"; break;
+                case 18: replace += "x12"; break;
+                case 19: replace += "x13"; break;
+                case 20: replace += "x14"; break;
+                case 21: replace += "x15"; break;
+                case 22: replace += "x16"; break;
+                case 23: replace += "x17"; break;
+                case 24: replace += "x18"; break;
+                case 25: replace += "x19"; break;
+                case 26: replace += "x1a"; break;
+                case 27: replace += "x1b"; break;
+                case 28: replace += "x1c"; break;
+                case 29: replace += "x1d"; break;
+                case 30: replace += "x1e"; break;
+                case 31: replace += "x1f"; break;
+                }
+                val = val.replace(RegExp(String.fromCharCode(i), "g"), replace);
+            }
+            return '"' + val.replace(/"/g, '\\"') + '"';
+        case "boolean":
+        case "undefined":
+            return String(val);
+        case "number":
+            // In JavaScript, -0 === 0 and String(-0) == "0", so we have to
+            // special-case.
+            if (val === -0 && 1/val === -Infinity)
+            {
+                return "-0";
+            }
+            return String(val);
+        case "object":
+            if (val === null)
+            {
+                return "null";
+            }
+
+            // Special-case Node objects, since those come up a lot in my tests.  I
+            // ignore namespaces.  I use duck-typing instead of instanceof, because
+            // instanceof doesn't work if the node is from another window (like an
+            // iframe's contentWindow):
+            // http://www.w3.org/Bugs/Public/show_bug.cgi?id=12295
+            if ("nodeType" in val
+            && "nodeName" in val
+            && "nodeValue" in val
+            && "childNodes" in val)
+            {
+                switch (val.nodeType)
+                {
+                case Node.ELEMENT_NODE:
+                    var ret = "<" + val.tagName.toLowerCase();
+                    for (var i = 0; i < val.attributes.length; i++)
+                    {
+                        ret += " " + val.attributes[i].name + '="' + val.attributes[i].value + '"';
+                    }
+                    ret += ">" + val.innerHTML + "</" + val.tagName.toLowerCase() + ">";
+                    return "Element node " + truncate(ret, 60);
+                case Node.TEXT_NODE:
+                    return 'Text node "' + truncate(val.data, 60) + '"';
+                case Node.PROCESSING_INSTRUCTION_NODE:
+                    return "ProcessingInstruction node with target " + format_value(truncate(val.target, 60)) + " and data " + format_value(truncate(val.data, 60));
+                case Node.COMMENT_NODE:
+                    return "Comment node <!--" + truncate(val.data, 60) + "-->";
+                case Node.DOCUMENT_NODE:
+                    return "Document node with " + val.childNodes.length + (val.childNodes.length == 1 ? " child" : " children");
+                case Node.DOCUMENT_TYPE_NODE:
+                    return "DocumentType node";
+                case Node.DOCUMENT_FRAGMENT_NODE:
+                    return "DocumentFragment node with " + val.childNodes.length + (val.childNodes.length == 1 ? " child" : " children");
+                default:
+                    return "Node object of unknown type";
+                }
+            }
+
+            // Fall through to default
+        default:
+            return typeof val + ' "' + truncate(String(val), 60) + '"';
+        }
+    }
+    expose(format_value, "format_value");
+
+    /*
+     * Assertions
+     */
+
+    function assert_true(actual, description)
+    {
+        assert(actual === true, "assert_true", description,
+                                "expected true got ${actual}", {actual:actual});
+    };
+    expose(assert_true, "assert_true");
+
+    function assert_false(actual, description)
+    {
+        assert(actual === false, "assert_false", description,
+                                 "expected false got ${actual}", {actual:actual});
+    };
+    expose(assert_false, "assert_false");
+
+    function same_value(x, y) {
+        if (y !== y)
+        {
+            //NaN case
+            return x !== x;
+        }
+        else if (x === 0 && y === 0) {
+            //Distinguish +0 and -0
+            return 1/x === 1/y;
+        }
+        else
+        {
+            //typical case
+            return x === y;
+        }
+    }
+
+    function assert_equals(actual, expected, description)
+    {
+         /*
+          * Test if two primitives are equal or two objects
+          * are the same object
+          */
+        if (typeof actual != typeof expected)
+        {
+            assert(false, "assert_equals", description,
+                          "expected (" + typeof expected + ") ${expected} but got (" + typeof actual + ") ${actual}",
+                          {expected:expected, actual:actual});
+            return;
+        }
+        assert(same_value(actual, expected), "assert_equals", description,
+                                             "expected ${expected} but got ${actual}",
+                                             {expected:expected, actual:actual});
+    };
+    expose(assert_equals, "assert_equals");
+
+    function assert_not_equals(actual, expected, description)
+    {
+         /*
+          * Test if two primitives are unequal or two objects
+          * are different objects
+          */
+        assert(!same_value(actual, expected), "assert_not_equals", description,
+                                              "got disallowed value ${actual}",
+                                              {actual:actual});
+    };
+    expose(assert_not_equals, "assert_not_equals");
+
+    function assert_in_array(actual, expected, description)
+    {
+        assert(expected.indexOf(actual) != -1, "assert_in_array", description,
+                                               "value ${actual} not in array ${expected}",
+                                               {actual:actual, expected:expected});
+    }
+    expose(assert_in_array, "assert_in_array");
+
+    function assert_object_equals(actual, expected, description)
+    {
+         //This needs to be improved a great deal
+         function check_equal(actual, expected, stack)
+         {
+             stack.push(actual);
+
+             var p;
+             for (p in actual)
+             {
+                 assert(expected.hasOwnProperty(p), "assert_object_equals", description,
+                                                    "unexpected property ${p}", {p:p});
+
+                 if (typeof actual[p] === "object" && actual[p] !== null)
+                 {
+                     if (stack.indexOf(actual[p]) === -1)
+                     {
+                         check_equal(actual[p], expected[p], stack);
+                     }
+                 }
+                 else
+                 {
+                     assert(same_value(actual[p], expected[p]), "assert_object_equals", description,
+                                                       "property ${p} expected ${expected} got ${actual}",
+                                                       {p:p, expected:expected, actual:actual});
+                 }
+             }
+             for (p in expected)
+             {
+                 assert(actual.hasOwnProperty(p),
+                        "assert_object_equals", description,
+                        "expected property ${p} missing", {p:p});
+             }
+             stack.pop();
+         }
+         check_equal(actual, expected, []);
+    };
+    expose(assert_object_equals, "assert_object_equals");
+
+    function assert_array_equals(actual, expected, description)
+    {
+        assert(actual.length === expected.length,
+               "assert_array_equals", description,
+               "lengths differ, expected ${expected} got ${actual}",
+               {expected:expected.length, actual:actual.length});
+
+        for (var i=0; i < actual.length; i++)
+        {
+            assert(actual.hasOwnProperty(i) === expected.hasOwnProperty(i),
+                   "assert_array_equals", description,
+                   "property ${i}, property expected to be $expected but was $actual",
+                   {i:i, expected:expected.hasOwnProperty(i) ? "present" : "missing",
+                   actual:actual.hasOwnProperty(i) ? "present" : "missing"});
+            assert(same_value(expected[i], actual[i]),
+                   "assert_array_equals", description,
+                   "property ${i}, expected ${expected} but got ${actual}",
+                   {i:i, expected:expected[i], actual:actual[i]});
+        }
+    }
+    expose(assert_array_equals, "assert_array_equals");
+
+    function assert_approx_equals(actual, expected, epsilon, description)
+    {
+        /*
+         * Test if two primitive numbers are equal withing +/- epsilon
+         */
+        assert(typeof actual === "number",
+               "assert_approx_equals", description,
+               "expected a number but got a ${type_actual}",
+               {type_actual:typeof actual});
+
+        assert(Math.abs(actual - expected) <= epsilon,
+               "assert_approx_equals", description,
+               "expected ${expected} +/- ${epsilon} but got ${actual}",
+               {expected:expected, actual:actual, epsilon:epsilon});
+    };
+    expose(assert_approx_equals, "assert_approx_equals");
+
+    function assert_less_than(actual, expected, description)
+    {
+        /*
+         * Test if a primitive number is less than another
+         */
+        assert(typeof actual === "number",
+               "assert_less_than", description,
+               "expected a number but got a ${type_actual}",
+               {type_actual:typeof actual});
+
+        assert(actual < expected,
+               "assert_less_than", description,
+               "expected a number less than ${expected} but got ${actual}",
+               {expected:expected, actual:actual});
+    };
+    expose(assert_less_than, "assert_less_than");
+
+    function assert_greater_than(actual, expected, description)
+    {
+        /*
+         * Test if a primitive number is greater than another
+         */
+        assert(typeof actual === "number",
+               "assert_greater_than", description,
+               "expected a number but got a ${type_actual}",
+               {type_actual:typeof actual});
+
+        assert(actual > expected,
+               "assert_greater_than", description,
+               "expected a number greater than ${expected} but got ${actual}",
+               {expected:expected, actual:actual});
+    };
+    expose(assert_greater_than, "assert_greater_than");
+
+    function assert_less_than_equal(actual, expected, description)
+    {
+        /*
+         * Test if a primitive number is less than or equal to another
+         */
+        assert(typeof actual === "number",
+               "assert_less_than_equal", description,
+               "expected a number but got a ${type_actual}",
+               {type_actual:typeof actual});
+
+        assert(actual <= expected,
+               "assert_less_than", description,
+               "expected a number less than or equal to ${expected} but got ${actual}",
+               {expected:expected, actual:actual});
+    };
+    expose(assert_less_than_equal, "assert_less_than_equal");
+
+    function assert_greater_than_equal(actual, expected, description)
+    {
+        /*
+         * Test if a primitive number is greater than or equal to another
+         */
+        assert(typeof actual === "number",
+               "assert_greater_than_equal", description,
+               "expected a number but got a ${type_actual}",
+               {type_actual:typeof actual});
+
+        assert(actual >= expected,
+               "assert_greater_than_equal", description,
+               "expected a number greater than or equal to ${expected} but got ${actual}",
+               {expected:expected, actual:actual});
+    };
+    expose(assert_greater_than_equal, "assert_greater_than_equal");
+
+    function assert_regexp_match(actual, expected, description) {
+        /*
+         * Test if a string (actual) matches a regexp (expected)
+         */
+        assert(expected.test(actual),
+               "assert_regexp_match", description,
+               "expected ${expected} but got ${actual}",
+               {expected:expected, actual:actual});
+    }
+    expose(assert_regexp_match, "assert_regexp_match");
+
+    function assert_class_string(object, class_string, description) {
+        assert_equals({}.toString.call(object), "[object " + class_string + "]",
+                      description);
+    }
+    expose(assert_class_string, "assert_class_string");
+
+
+    function _assert_own_property(name) {
+        return function(object, property_name, description)
+        {
+            assert(object.hasOwnProperty(property_name),
+                   name, description,
+                   "expected property ${p} missing", {p:property_name});
+        };
+    }
+    expose(_assert_own_property("assert_exists"), "assert_exists");
+    expose(_assert_own_property("assert_own_property"), "assert_own_property");
+
+    function assert_not_exists(object, property_name, description)
+    {
+        assert(!object.hasOwnProperty(property_name),
+               "assert_not_exists", description,
+               "unexpected property ${p} found", {p:property_name});
+    };
+    expose(assert_not_exists, "assert_not_exists");
+
+    function _assert_inherits(name) {
+        return function (object, property_name, description)
+        {
+            assert(typeof object === "object",
+                   name, description,
+                   "provided value is not an object");
+
+            assert("hasOwnProperty" in object,
+                   name, description,
+                   "provided value is an object but has no hasOwnProperty method");
+
+            assert(!object.hasOwnProperty(property_name),
+                   name, description,
+                   "property ${p} found on object expected in prototype chain",
+                   {p:property_name});
+
+            assert(property_name in object,
+                   name, description,
+                   "property ${p} not found in prototype chain",
+                   {p:property_name});
+        };
+    }
+    expose(_assert_inherits("assert_inherits"), "assert_inherits");
+    expose(_assert_inherits("assert_idl_attribute"), "assert_idl_attribute");
+
+    function assert_readonly(object, property_name, description)
+    {
+         var initial_value = object[property_name];
+         try {
+             //Note that this can have side effects in the case where
+             //the property has PutForwards
+             object[property_name] = initial_value + "a"; //XXX use some other value here?
+             assert(same_value(object[property_name], initial_value),
+                    "assert_readonly", description,
+                    "changing property ${p} succeeded",
+                    {p:property_name});
+         }
+         finally
+         {
+             object[property_name] = initial_value;
+         }
+    };
+    expose(assert_readonly, "assert_readonly");
+
+    function assert_throws(code, func, description)
+    {
+        try
+        {
+            func.call(this);
+            assert(false, "assert_throws", description,
+                   "${func} did not throw", {func:func});
+        }
+        catch(e)
+        {
+            if (e instanceof AssertionError) {
+                throw(e);
+            }
+            if (code === null)
+            {
+                return;
+            }
+            if (typeof code === "object")
+            {
+                assert(typeof e == "object" && "name" in e && e.name == code.name,
+                       "assert_throws", description,
+                       "${func} threw ${actual} (${actual_name}) expected ${expected} (${expected_name})",
+                                    {func:func, actual:e, actual_name:e.name,
+                                     expected:code,
+                                     expected_name:code.name});
+                return;
+            }
+
+            var code_name_map = {
+                INDEX_SIZE_ERR: 'IndexSizeError',
+                HIERARCHY_REQUEST_ERR: 'HierarchyRequestError',
+                WRONG_DOCUMENT_ERR: 'WrongDocumentError',
+                INVALID_CHARACTER_ERR: 'InvalidCharacterError',
+                NO_MODIFICATION_ALLOWED_ERR: 'NoModificationAllowedError',
+                NOT_FOUND_ERR: 'NotFoundError',
+                NOT_SUPPORTED_ERR: 'NotSupportedError',
+                INVALID_STATE_ERR: 'InvalidStateError',
+                SYNTAX_ERR: 'SyntaxError',
+                INVALID_MODIFICATION_ERR: 'InvalidModificationError',
+                NAMESPACE_ERR: 'NamespaceError',
+                INVALID_ACCESS_ERR: 'InvalidAccessError',
+                TYPE_MISMATCH_ERR: 'TypeMismatchError',
+                SECURITY_ERR: 'SecurityError',
+                NETWORK_ERR: 'NetworkError',
+                ABORT_ERR: 'AbortError',
+                URL_MISMATCH_ERR: 'URLMismatchError',
+                QUOTA_EXCEEDED_ERR: 'QuotaExceededError',
+                TIMEOUT_ERR: 'TimeoutError',
+                INVALID_NODE_TYPE_ERR: 'InvalidNodeTypeError',
+                DATA_CLONE_ERR: 'DataCloneError'
+            };
+
+            var name = code in code_name_map ? code_name_map[code] : code;
+
+            var name_code_map = {
+                IndexSizeError: 1,
+                HierarchyRequestError: 3,
+                WrongDocumentError: 4,
+                InvalidCharacterError: 5,
+                NoModificationAllowedError: 7,
+                NotFoundError: 8,
+                NotSupportedError: 9,
+                InvalidStateError: 11,
+                SyntaxError: 12,
+                InvalidModificationError: 13,
+                NamespaceError: 14,
+                InvalidAccessError: 15,
+                TypeMismatchError: 17,
+                SecurityError: 18,
+                NetworkError: 19,
+                AbortError: 20,
+                URLMismatchError: 21,
+                QuotaExceededError: 22,
+                TimeoutError: 23,
+                InvalidNodeTypeError: 24,
+                DataCloneError: 25,
+
+                UnknownError: 0,
+                ConstraintError: 0,
+                DataError: 0,
+                TransactionInactiveError: 0,
+                ReadOnlyError: 0,
+                VersionError: 0
+            };
+
+            if (!(name in name_code_map))
+            {
+                throw new AssertionError('Test bug: unrecognized DOMException code "' + code + '" passed to assert_throws()');
+            }
+
+            var required_props = { code: name_code_map[name] };
+
+            if (required_props.code === 0
+            || ("name" in e && e.name !== e.name.toUpperCase() && e.name !== "DOMException"))
+            {
+                // New style exception: also test the name property.
+                required_props.name = name;
+            }
+
+            //We'd like to test that e instanceof the appropriate interface,
+            //but we can't, because we don't know what window it was created
+            //in.  It might be an instanceof the appropriate interface on some
+            //unknown other window.  TODO: Work around this somehow?
+
+            assert(typeof e == "object",
+                   "assert_throws", description,
+                   "${func} threw ${e} with type ${type}, not an object",
+                   {func:func, e:e, type:typeof e});
+
+            for (var prop in required_props)
+            {
+                assert(typeof e == "object" && prop in e && e[prop] == required_props[prop],
+                       "assert_throws", description,
+                       "${func} threw ${e} that is not a DOMException " + code + ": property ${prop} is equal to ${actual}, expected ${expected}",
+                       {func:func, e:e, prop:prop, actual:e[prop], expected:required_props[prop]});
+            }
+        }
+    }
+    expose(assert_throws, "assert_throws");
+
+    function assert_unreached(description) {
+         assert(false, "assert_unreached", description,
+                "Reached unreachable code");
+    }
+    expose(assert_unreached, "assert_unreached");
+
+    function assert_any(assert_func, actual, expected_array) 
+    {
+        var args = [].slice.call(arguments, 3)
+        var errors = []
+        var passed = false;
+        forEach(expected_array, 
+                function(expected)
+                {
+                    try {
+                        assert_func.apply(this, [actual, expected].concat(args))
+                        passed = true;
+                    } catch(e) {
+                        errors.push(e.message);
+                    }
+                });
+        if (!passed) {
+            throw new AssertionError(errors.join("\n\n"));
+        }
+    }
+    expose(assert_any, "assert_any");
+
+    function Test(name, properties)
+    {
+        this.name = name;
+        this.status = this.NOTRUN;
+        this.timeout_id = null;
+        this.is_done = false;
+
+        this.properties = properties;
+        this.timeout_length = properties.timeout ? properties.timeout : settings.test_timeout;
+
+        this.message = null;
+
+        var this_obj = this;
+        this.steps = [];
+
+        tests.push(this);
+    }
+
+    Test.statuses = {
+        PASS:0,
+        FAIL:1,
+        TIMEOUT:2,
+        NOTRUN:3
+    };
+
+    Test.prototype = merge({}, Test.statuses);
+
+    Test.prototype.structured_clone = function()
+    {
+        if(!this._structured_clone)
+        {
+            var msg = this.message;
+            msg = msg ? String(msg) : msg;
+            this._structured_clone = merge({
+                name:String(this.name),
+                status:this.status,
+                message:msg
+            }, Test.statuses);
+        }
+        return this._structured_clone;
+    };
+
+    Test.prototype.step = function(func, this_obj)
+    {
+        //In case the test has already failed
+        if (this.status !== this.NOTRUN)
+        {
+          return;
+        }
+
+        tests.started = true;
+
+        if (this.timeout_id === null) {
+            this.set_timeout();
+        }
+
+        this.steps.push(func);
+
+        if (arguments.length === 1)
+        {
+            this_obj = this;
+        }
+
+        try
+        {
+            return func.apply(this_obj, Array.prototype.slice.call(arguments, 2));
+        }
+        catch(e)
+        {
+            //This can happen if something called synchronously invoked another
+            //step
+            if (this.status !== this.NOTRUN)
+            {
+                return;
+            }
+            this.status = this.FAIL;
+            this.message = (typeof e === "object" && e !== null) ? e.message : e;
+            if (typeof e.stack != "undefined" && typeof e.message == "string") {
+                //Try to make it more informative for some exceptions, at least
+                //in Gecko and WebKit.  This results in a stack dump instead of
+                //just errors like "Cannot read property 'parentNode' of null"
+                //or "root is null".  Makes it a lot longer, of course.
+                this.message += "(stack: " + e.stack + ")";
+            }
+            this.done();
+            if (debug && e.constructor !== AssertionError) {
+                throw e;
+            }
+        }
+    };
+
+    Test.prototype.step_func = function(func, this_obj)
+    {
+        var test_this = this;
+
+        if (arguments.length === 1)
+        {
+            this_obj = test_this;
+        }
+
+        return function()
+        {
+            test_this.step.apply(test_this, [func, this_obj].concat(
+                Array.prototype.slice.call(arguments)));
+        };
+    };
+
+    Test.prototype.step_func_done = function(func, this_obj)
+    {
+        var test_this = this;
+
+        if (arguments.length === 1)
+        {
+            this_obj = test_this;
+        }
+
+        return function()
+        {
+            test_this.step.apply(test_this, [func, this_obj].concat(
+                Array.prototype.slice.call(arguments)));
+            test_this.done();
+        };
+    };
+
+    Test.prototype.set_timeout = function()
+    {
+        var this_obj = this;
+        this.timeout_id = setTimeout(function()
+                                     {
+                                         this_obj.timeout();
+                                     }, this.timeout_length);
+    };
+
+    Test.prototype.timeout = function()
+    {
+        this.status = this.TIMEOUT;
+        this.timeout_id = null;
+        this.message = "Test timed out";
+        this.done();
+    };
+
+    Test.prototype.done = function()
+    {
+        if (this.is_done) {
+            return;
+        }
+        clearTimeout(this.timeout_id);
+        if (this.status === this.NOTRUN)
+        {
+            this.status = this.PASS;
+        }
+        this.is_done = true;
+        tests.result(this);
+    };
+
+
+    /*
+     * Harness
+     */
+
+    function TestsStatus()
+    {
+        this.status = null;
+        this.message = null;
+    }
+
+    TestsStatus.statuses = {
+        OK:0,
+        ERROR:1,
+        TIMEOUT:2
+    };
+
+    TestsStatus.prototype = merge({}, TestsStatus.statuses);
+
+    TestsStatus.prototype.structured_clone = function()
+    {
+        if(!this._structured_clone)
+        {
+            var msg = this.message;
+            msg = msg ? String(msg) : msg;
+            this._structured_clone = merge({
+                status:this.status,
+                message:msg
+            }, TestsStatus.statuses);
+        }
+        return this._structured_clone;
+    };
+
+    function Tests()
+    {
+        this.tests = [];
+        this.num_pending = 0;
+
+        this.phases = {
+            INITIAL:0,
+            SETUP:1,
+            HAVE_TESTS:2,
+            HAVE_RESULTS:3,
+            COMPLETE:4
+        };
+        this.phase = this.phases.INITIAL;
+
+        this.properties = {};
+
+        //All tests can't be done until the load event fires
+        this.all_loaded = false;
+        this.wait_for_finish = false;
+        this.processing_callbacks = false;
+
+        this.timeout_length = settings.timeout;
+        this.timeout_id = null;
+
+        this.start_callbacks = [];
+        this.test_done_callbacks = [];
+        this.all_done_callbacks = [];
+
+        this.status = new TestsStatus();
+
+        var this_obj = this;
+
+        on_event(window, "load",
+                 function()
+                 {
+                     this_obj.all_loaded = true;
+                     if (this_obj.all_done())
+                     {
+                         this_obj.complete();
+                     }
+                 });
+
+        this.set_timeout();
+    }
+
+    Tests.prototype.setup = function(func, properties)
+    {
+        if (this.phase >= this.phases.HAVE_RESULTS)
+        {
+            return;
+        }
+        if (this.phase < this.phases.SETUP)
+        {
+            this.phase = this.phases.SETUP;
+        }
+
+        for (var p in properties)
+        {
+            if (properties.hasOwnProperty(p))
+            {
+                this.properties[p] = properties[p];
+            }
+        }
+
+        if (properties.timeout)
+        {
+            this.timeout_length = properties.timeout;
+        }
+        if (properties.explicit_done)
+        {
+            this.wait_for_finish = true;
+        }
+        if (properties.explicit_timeout) {
+            this.timeout_length = null;
+        }
+
+        if (func)
+        {
+            try
+            {
+                func();
+            } catch(e)
+            {
+                this.status.status = this.status.ERROR;
+                this.status.message = e;
+            };
+        }
+        this.set_timeout();
+    };
+
+    Tests.prototype.set_timeout = function()
+    {
+        var this_obj = this;
+        clearTimeout(this.timeout_id);
+        if (this.timeout_length !== null)
+        {
+            this.timeout_id = setTimeout(function() {
+                                             this_obj.timeout();
+                                         }, this.timeout_length);
+        }
+    };
+
+    Tests.prototype.timeout = function() {
+        this.status.status = this.status.TIMEOUT;
+        this.complete();
+    };
+
+    Tests.prototype.end_wait = function()
+    {
+        this.wait_for_finish = false;
+        if (this.all_done()) {
+            this.complete();
+        }
+    };
+
+    Tests.prototype.push = function(test)
+    {
+        if (this.phase < this.phases.HAVE_TESTS) {
+            this.start();
+        }
+        this.num_pending++;
+        this.tests.push(test);
+    };
+
+    Tests.prototype.all_done = function() {
+        return (this.all_loaded && this.num_pending === 0 &&
+                !this.wait_for_finish && !this.processing_callbacks);
+    };
+
+    Tests.prototype.start = function() {
+        this.phase = this.phases.HAVE_TESTS;
+        this.notify_start();
+    };
+
+    Tests.prototype.notify_start = function() {
+        var this_obj = this;
+        forEach (this.start_callbacks,
+                 function(callback)
+                 {
+                     callback(this_obj.properties);
+                 });
+        forEach_windows(
+                function(w, is_same_origin)
+                {
+                    if(is_same_origin && w.start_callback)
+                    {
+                        try
+                        {
+                            w.start_callback(this_obj.properties);
+                        }
+                        catch(e)
+                        {
+                            if (debug)
+                            {
+                                throw(e);
+                            }
+                        }
+                    }
+                    if (supports_post_message(w) && w !== self)
+                    {
+                        w.postMessage({
+                            type: "start",
+                            properties: this_obj.properties
+                        }, "*");
+                    }
+                });
+    };
+
+    Tests.prototype.result = function(test)
+    {
+        if (this.phase > this.phases.HAVE_RESULTS)
+        {
+            return;
+        }
+        this.phase = this.phases.HAVE_RESULTS;
+        this.num_pending--;
+        this.notify_result(test);
+    };
+
+    Tests.prototype.notify_result = function(test) {
+        var this_obj = this;
+        this.processing_callbacks = true;
+        forEach(this.test_done_callbacks,
+                function(callback)
+                {
+                    callback(test, this_obj);
+                });
+
+        forEach_windows(
+                function(w, is_same_origin)
+                {
+                    if(is_same_origin && w.result_callback)
+                    {
+                        try
+                        {
+                            w.result_callback(test);
+                        }
+                        catch(e)
+                        {
+                            if(debug) {
+                                throw e;
+                            }
+                        }
+                    }
+                    if (supports_post_message(w) && w !== self)
+                    {
+                        w.postMessage({
+                            type: "result",
+                            test: test.structured_clone()
+                        }, "*");
+                    }
+                });
+        this.processing_callbacks = false;
+        if (this_obj.all_done())
+        {
+            this_obj.complete();
+        }
+    };
+
+    Tests.prototype.complete = function() {
+        if (this.phase === this.phases.COMPLETE) {
+            return;
+        }
+        this.phase = this.phases.COMPLETE;
+        var this_obj = this;
+        this.tests.forEach(
+            function(x)
+            {
+                if(x.status === x.NOTRUN)
+                {
+                    this_obj.notify_result(x);
+                }
+            }
+        );
+        this.notify_complete();
+    };
+
+    Tests.prototype.notify_complete = function()
+    {
+        clearTimeout(this.timeout_id);
+        var this_obj = this;
+        var tests = map(this_obj.tests,
+                        function(test)
+                        {
+                            return test.structured_clone();
+                        });
+        if (this.status.status === null)
+        {
+            this.status.status = this.status.OK;
+        }
+
+        forEach (this.all_done_callbacks,
+                 function(callback)
+                 {
+                     callback(this_obj.tests, this_obj.status);
+                 });
+
+        forEach_windows(
+                function(w, is_same_origin)
+                {
+                    if(is_same_origin && w.completion_callback)
+                    {
+                        try
+                        {
+                            w.completion_callback(this_obj.tests, this_obj.status);
+                        }
+                        catch(e)
+                        {
+                            if (debug)
+                            {
+                                throw e;
+                            }
+                        }
+                    }
+                    if (supports_post_message(w) && w !== self)
+                    {
+                        w.postMessage({
+                            type: "complete",
+                            tests: tests,
+                            status: this_obj.status.structured_clone()
+                        }, "*");
+                    }
+                });
+    };
+
+    var tests = new Tests();
+
+    function timeout() {
+        if (tests.timeout_length === null)
+        {
+            tests.timeout();
+        }
+    }
+    expose(timeout, 'timeout');
+
+    function add_start_callback(callback) {
+        tests.start_callbacks.push(callback);
+    }
+
+    function add_result_callback(callback)
+    {
+        tests.test_done_callbacks.push(callback);
+    }
+
+    function add_completion_callback(callback)
+    {
+       tests.all_done_callbacks.push(callback);
+    }
+
+    expose(add_start_callback, 'add_start_callback');
+    expose(add_result_callback, 'add_result_callback');
+    expose(add_completion_callback, 'add_completion_callback');
+
+    /*
+     * Output listener
+    */
+
+    function Output() {
+      this.output_document = document;
+      this.output_node = null;
+      this.done_count = 0;
+      this.enabled = settings.output;
+      this.phase = this.INITIAL;
+    }
+
+    Output.prototype.INITIAL = 0;
+    Output.prototype.STARTED = 1;
+    Output.prototype.HAVE_RESULTS = 2;
+    Output.prototype.COMPLETE = 3;
+
+    Output.prototype.setup = function(properties) {
+        if (this.phase > this.INITIAL) {
+            return;
+        }
+
+        //If output is disabled in testharnessreport.js the test shouldn't be
+        //able to override that
+        this.enabled = this.enabled && (properties.hasOwnProperty("output") ?
+                                        properties.output : settings.output);
+    };
+
+    Output.prototype.init = function(properties)
+    {
+        if (this.phase >= this.STARTED) {
+            return;
+        }
+        if (properties.output_document) {
+            this.output_document = properties.output_document;
+        } else {
+            this.output_document = document;
+        }
+        this.phase = this.STARTED;
+    };
+
+    Output.prototype.resolve_log = function()
+    {
+        var output_document;
+        if (typeof this.output_document === "function")
+        {
+            output_document = this.output_document.apply(undefined);
+        } else
+        {
+            output_document = this.output_document;
+        }
+        if (!output_document)
+        {
+            return;
+        }
+        var node = output_document.getElementById("log");
+        if (node)
+        {
+            this.output_document = output_document;
+            this.output_node = node;
+        }
+    };
+
+    Output.prototype.show_status = function(test)
+    {
+        if (this.phase < this.STARTED)
+        {
+            this.init();
+        }
+        if (!this.enabled)
+        {
+            return;
+        }
+        if (this.phase < this.HAVE_RESULTS)
+        {
+            this.resolve_log();
+            this.phase = this.HAVE_RESULTS;
+        }
+        this.done_count++;
+        if (this.output_node)
+        {
+            if (this.done_count < 100
+            || (this.done_count < 1000 && this.done_count % 100 == 0)
+            || this.done_count % 1000 == 0) {
+                this.output_node.textContent = "Running, "
+                    + this.done_count + " complete, "
+                    + tests.num_pending + " remain";
+            }
+        }
+    };
+
+    Output.prototype.show_results = function (tests, harness_status)
+    {
+        if (this.phase >= this.COMPLETE) {
+            return;
+        }
+        if (!this.enabled)
+        {
+            return;
+        }
+        if (!this.output_node) {
+            this.resolve_log();
+        }
+        this.phase = this.COMPLETE;
+
+        var log = this.output_node;
+        if (!log)
+        {
+            return;
+        }
+        var output_document = this.output_document;
+
+        while (log.lastChild)
+        {
+            log.removeChild(log.lastChild);
+        }
+
+        if (script_prefix != null) {
+            var stylesheet = output_document.createElementNS(xhtml_ns, "link");
+            stylesheet.setAttribute("rel", "stylesheet");
+            stylesheet.setAttribute("href", script_prefix + "testharness.css");
+            var heads = output_document.getElementsByTagName("head");
+            if (heads.length) {
+                heads[0].appendChild(stylesheet);
+            }
+        }
+
+        var status_text = {};
+        status_text[Test.prototype.PASS] = "Pass";
+        status_text[Test.prototype.FAIL] = "Fail";
+        status_text[Test.prototype.TIMEOUT] = "Timeout";
+        status_text[Test.prototype.NOTRUN] = "Not Run";
+
+        var status_number = {};
+        forEach(tests, function(test) {
+                    var status = status_text[test.status];
+                    if (status_number.hasOwnProperty(status))
+                    {
+                        status_number[status] += 1;
+                    } else {
+                        status_number[status] = 1;
+                    }
+                });
+
+        function status_class(status)
+        {
+            return status.replace(/\s/g, '').toLowerCase();
+        }
+
+        var summary_template = ["section", {"id":"summary"},
+                                ["h2", {}, "Summary"],
+                                ["p", {}, "Found ${num_tests} tests"],
+                                function(vars) {
+                                    var rv = [["div", {}]];
+                                    var i=0;
+                                    while (status_text.hasOwnProperty(i)) {
+                                        if (status_number.hasOwnProperty(status_text[i])) {
+                                            var status = status_text[i];
+                                            rv[0].push(["div", {"class":status_class(status)},
+                                                        ["label", {},
+                                                         ["input", {type:"checkbox", checked:"checked"}],
+                                                         status_number[status] + " " + status]]);
+                                        }
+                                        i++;
+                                    }
+                                    return rv;
+                                }];
+
+        log.appendChild(render(summary_template, {num_tests:tests.length}, output_document));
+
+        forEach(output_document.querySelectorAll("section#summary label"),
+                function(element)
+                {
+                    on_event(element, "click",
+                             function(e)
+                             {
+                                 if (output_document.getElementById("results") === null)
+                                 {
+                                     e.preventDefault();
+                                     return;
+                                 }
+                                 var result_class = element.parentNode.getAttribute("class");
+                                 var style_element = output_document.querySelector("style#hide-" + result_class);
+                                 var input_element = element.querySelector("input");
+                                 if (!style_element && !input_element.checked) {
+                                     style_element = output_document.createElementNS(xhtml_ns, "style");
+                                     style_element.id = "hide-" + result_class;
+                                     style_element.textContent = "table#results > tbody > tr."+result_class+"{display:none}";
+                                     output_document.body.appendChild(style_element);
+                                 } else if (style_element && input_element.checked) {
+                                     style_element.parentNode.removeChild(style_element);
+                                 }
+                             });
+                });
+
+        // This use of innerHTML plus manual escaping is not recommended in
+        // general, but is necessary here for performance.  Using textContent
+        // on each individual <td> adds tens of seconds of execution time for
+        // large test suites (tens of thousands of tests).
+        function escape_html(s)
+        {
+            return s.replace(/\&/g, "&amp;")
+                .replace(/</g, "&lt;")
+                .replace(/"/g, "&quot;")
+                .replace(/'/g, "&#39;");
+        }
+
+        function has_assertions()
+        {
+            for (var i = 0; i < tests.length; i++) {
+                if (tests[i].properties.hasOwnProperty("assert")) {
+                    return true;
+                }
+            }
+            return false;
+        }
+        
+        function get_assertion(test)
+        {
+            if (test.properties.hasOwnProperty("assert")) {
+                if (Array.isArray(test.properties.assert)) {
+                    return test.properties.assert.join(' ');
+                }
+                return test.properties.assert;
+            }
+            return '';
+        }
+        
+        log.appendChild(document.createElementNS(xhtml_ns, "section"));
+        var assertions = has_assertions();
+        var html = "<h2>Details</h2><table id='results' " + (assertions ? "class='assertions'" : "" ) + ">"
+            + "<thead><tr><th>Result</th><th>Test Name</th>"
+            + (assertions ? "<th>Assertion</th>" : "")
+            + "<th>Message</th></tr></thead>"
+            + "<tbody>";
+        for (var i = 0; i < tests.length; i++) {
+            html += '<tr class="'
+                + escape_html(status_class(status_text[tests[i].status]))
+                + '"><td>'
+                + escape_html(status_text[tests[i].status])
+                + "</td><td>"
+                + escape_html(tests[i].name)
+                + "</td><td>"
+                + (assertions ? escape_html(get_assertion(tests[i])) + "</td><td>" : "")
+                + escape_html(tests[i].message ? tests[i].message : " ")
+                + "</td></tr>";
+        }
+        html += "</tbody></table>";
+        try {
+            log.lastChild.innerHTML = html;
+        } catch (e) {
+            log.appendChild(document.createElementNS(xhtml_ns, "p"))
+               .textContent = "Setting innerHTML for the log threw an exception.";
+            log.appendChild(document.createElementNS(xhtml_ns, "pre"))
+               .textContent = html;
+        }
+    };
+
+    var output = new Output();
+    add_start_callback(function (properties) {output.init(properties);});
+    add_result_callback(function (test) {output.show_status(tests);});
+    add_completion_callback(function (tests, harness_status) {output.show_results(tests, harness_status);});
+
+    /*
+     * Template code
+     *
+     * A template is just a javascript structure. An element is represented as:
+     *
+     * [tag_name, {attr_name:attr_value}, child1, child2]
+     *
+     * the children can either be strings (which act like text nodes), other templates or
+     * functions (see below)
+     *
+     * A text node is represented as
+     *
+     * ["{text}", value]
+     *
+     * String values have a simple substitution syntax; ${foo} represents a variable foo.
+     *
+     * It is possible to embed logic in templates by using a function in a place where a
+     * node would usually go. The function must either return part of a template or null.
+     *
+     * In cases where a set of nodes are required as output rather than a single node
+     * with children it is possible to just use a list
+     * [node1, node2, node3]
+     *
+     * Usage:
+     *
+     * render(template, substitutions) - take a template and an object mapping
+     * variable names to parameters and return either a DOM node or a list of DOM nodes
+     *
+     * substitute(template, substitutions) - take a template and variable mapping object,
+     * make the variable substitutions and return the substituted template
+     *
+     */
+
+    function is_single_node(template)
+    {
+        return typeof template[0] === "string";
+    }
+
+    function substitute(template, substitutions)
+    {
+        if (typeof template === "function") {
+            var replacement = template(substitutions);
+            if (replacement)
+            {
+                var rv = substitute(replacement, substitutions);
+                return rv;
+            }
+            else
+            {
+                return null;
+            }
+        }
+        else if (is_single_node(template))
+        {
+            return substitute_single(template, substitutions);
+        }
+        else
+        {
+            return filter(map(template, function(x) {
+                                  return substitute(x, substitutions);
+                              }), function(x) {return x !== null;});
+        }
+    }
+
+    function substitute_single(template, substitutions)
+    {
+        var substitution_re = /\${([^ }]*)}/g;
+
+        function do_substitution(input) {
+            var components = input.split(substitution_re);
+            var rv = [];
+            for (var i=0; i<components.length; i+=2)
+            {
+                rv.push(components[i]);
+                if (components[i+1])
+                {
+                    rv.push(String(substitutions[components[i+1]]));
+                }
+            }
+            return rv;
+        }
+
+        var rv = [];
+        rv.push(do_substitution(String(template[0])).join(""));
+
+        if (template[0] === "{text}") {
+            substitute_children(template.slice(1), rv);
+        } else {
+            substitute_attrs(template[1], rv);
+            substitute_children(template.slice(2), rv);
+        }
+
+        function substitute_attrs(attrs, rv)
+        {
+            rv[1] = {};
+            for (var name in template[1])
+            {
+                if (attrs.hasOwnProperty(name))
+                {
+                    var new_name = do_substitution(name).join("");
+                    var new_value = do_substitution(attrs[name]).join("");
+                    rv[1][new_name] = new_value;
+                };
+            }
+        }
+
+        function substitute_children(children, rv)
+        {
+            for (var i=0; i<children.length; i++)
+            {
+                if (children[i] instanceof Object) {
+                    var replacement = substitute(children[i], substitutions);
+                    if (replacement !== null)
+                    {
+                        if (is_single_node(replacement))
+                        {
+                            rv.push(replacement);
+                        }
+                        else
+                        {
+                            extend(rv, replacement);
+                        }
+                    }
+                }
+                else
+                {
+                    extend(rv, do_substitution(String(children[i])));
+                }
+            }
+            return rv;
+        }
+
+        return rv;
+    }
+
+ function make_dom_single(template, doc)
+ {
+     var output_document = doc || document;
+     if (template[0] === "{text}")
+     {
+         var element = output_document.createTextNode("");
+         for (var i=1; i<template.length; i++)
+         {
+             element.data += template[i];
+         }
+     }
+     else
+     {
+         var element = output_document.createElementNS(xhtml_ns, template[0]);
+         for (var name in template[1]) {
+             if (template[1].hasOwnProperty(name))
+             {
+                 element.setAttribute(name, template[1][name]);
+             }
+         }
+         for (var i=2; i<template.length; i++)
+         {
+             if (template[i] instanceof Object)
+             {
+                 var sub_element = make_dom(template[i]);
+                 element.appendChild(sub_element);
+             }
+             else
+             {
+                 var text_node = output_document.createTextNode(template[i]);
+                 element.appendChild(text_node);
+             }
+         }
+     }
+
+     return element;
+ }
+
+
+
+ function make_dom(template, substitutions, output_document)
+    {
+        if (is_single_node(template))
+        {
+            return make_dom_single(template, output_document);
+        }
+        else
+        {
+            return map(template, function(x) {
+                           return make_dom_single(x, output_document);
+                       });
+        }
+    }
+
+ function render(template, substitutions, output_document)
+    {
+        return make_dom(substitute(template, substitutions), output_document);
+    }
+
+    /*
+     * Utility funcions
+     */
+    function assert(expected_true, function_name, description, error, substitutions)
+    {
+        if (expected_true !== true)
+        {
+            throw new AssertionError(make_message(function_name, description,
+                                                  error, substitutions));
+        }
+    }
+
+    function AssertionError(message)
+    {
+        this.message = message;
+    }
+
+    function make_message(function_name, description, error, substitutions)
+    {
+        for (var p in substitutions) {
+            if (substitutions.hasOwnProperty(p)) {
+                substitutions[p] = format_value(substitutions[p]);
+            }
+        }
+        var node_form = substitute(["{text}", "${function_name}: ${description}" + error],
+                                   merge({function_name:function_name,
+                                          description:(description?description + " ":"")},
+                                          substitutions));
+        return node_form.slice(1).join("");
+    }
+
+    function filter(array, callable, thisObj) {
+        var rv = [];
+        for (var i=0; i<array.length; i++)
+        {
+            if (array.hasOwnProperty(i))
+            {
+                var pass = callable.call(thisObj, array[i], i, array);
+                if (pass) {
+                    rv.push(array[i]);
+                }
+            }
+        }
+        return rv;
+    }
+
+    function map(array, callable, thisObj)
+    {
+        var rv = [];
+        rv.length = array.length;
+        for (var i=0; i<array.length; i++)
+        {
+            if (array.hasOwnProperty(i))
+            {
+                rv[i] = callable.call(thisObj, array[i], i, array);
+            }
+        }
+        return rv;
+    }
+
+    function extend(array, items)
+    {
+        Array.prototype.push.apply(array, items);
+    }
+
+    function forEach (array, callback, thisObj)
+    {
+        for (var i=0; i<array.length; i++)
+        {
+            if (array.hasOwnProperty(i))
+            {
+                callback.call(thisObj, array[i], i, array);
+            }
+        }
+    }
+
+    function merge(a,b)
+    {
+        var rv = {};
+        var p;
+        for (p in a)
+        {
+            rv[p] = a[p];
+        }
+        for (p in b) {
+            rv[p] = b[p];
+        }
+        return rv;
+    }
+
+    function expose(object, name)
+    {
+        var components = name.split(".");
+        var target = window;
+        for (var i=0; i<components.length - 1; i++)
+        {
+            if (!(components[i] in target))
+            {
+                target[components[i]] = {};
+            }
+            target = target[components[i]];
+        }
+        target[components[components.length - 1]] = object;
+    }
+
+    function forEach_windows(callback) {
+        // Iterate of the the windows [self ... top, opener]. The callback is passed
+        // two objects, the first one is the windows object itself, the second one
+        // is a boolean indicating whether or not its on the same origin as the
+        // current window.
+        var cache = forEach_windows.result_cache;
+        if (!cache) {
+            cache = [[self, true]];
+            var w = self;
+            var i = 0;
+            var so;
+            var origins = location.ancestorOrigins;
+            while (w != w.parent)
+            {
+                w = w.parent;
+                // In WebKit, calls to parent windows' properties that aren't on the same
+                // origin cause an error message to be displayed in the error console but
+                // don't throw an exception. This is a deviation from the current HTML5
+                // spec. See: https://bugs.webkit.org/show_bug.cgi?id=43504
+                // The problem with WebKit's behavior is that it pollutes the error console
+                // with error messages that can't be caught.
+                //
+                // This issue can be mitigated by relying on the (for now) proprietary
+                // `location.ancestorOrigins` property which returns an ordered list of
+                // the origins of enclosing windows. See:
+                // http://trac.webkit.org/changeset/113945.
+                if(origins) {
+                    so = (location.origin == origins[i]);
+                }
+                else
+                {
+                    so = is_same_origin(w);
+                }
+                cache.push([w, so]);
+                i++;
+            }
+            w = window.opener;
+            if(w)
+            {
+                // window.opener isn't included in the `location.ancestorOrigins` prop.
+                // We'll just have to deal with a simple check and an error msg on WebKit
+                // browsers in this case.
+                cache.push([w, is_same_origin(w)]);
+            }
+            forEach_windows.result_cache = cache;
+        }
+
+        forEach(cache,
+                function(a)
+                {
+                    callback.apply(null, a);
+                });
+    }
+
+    function is_same_origin(w) {
+        try {
+            'random_prop' in w;
+            return true;
+        } catch(e) {
+            return false;
+        }
+    }
+
+    function supports_post_message(w)
+    {
+        var supports;
+        var type;
+        // Given IE  implements postMessage across nested iframes but not across
+        // windows or tabs, you can't infer cross-origin communication from the presence
+        // of postMessage on the current window object only.
+        //
+        // Touching the postMessage prop on a window can throw if the window is
+        // not from the same origin AND post message is not supported in that
+        // browser. So just doing an existence test here won't do, you also need
+        // to wrap it in a try..cacth block.
+        try
+        {
+            type = typeof w.postMessage;
+            if (type === "function")
+            {
+                supports = true;
+            }
+            // IE8 supports postMessage, but implements it as a host object which
+            // returns "object" as its `typeof`.
+            else if (type === "object")
+            {
+                supports = true;
+            }
+            // This is the case where postMessage isn't supported AND accessing a
+            // window property across origins does NOT throw (e.g. old Safari browser).
+            else
+            {
+                supports = false;
+            }
+        }
+        catch(e) {
+            // This is the case where postMessage isn't supported AND accessing a
+            // window property across origins throws (e.g. old Firefox browser).
+            supports = false;
+        }
+        return supports;
+    }
+})();
+
+// vim: set expandtab shiftwidth=4 tabstop=4:
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/resources/testharnessreport.js b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/resources/testharnessreport.js
new file mode 100644 (file)
index 0000000..fa73347
--- /dev/null
@@ -0,0 +1,380 @@
+/*
+ * This file is intended for vendors to implement
+ * code needed to integrate testharness.js tests with their own test systems.
+ *
+ * The default implementation extracts metadata from the tests and validates 
+ * it against the cached version that should be present in the test source 
+ * file. If the cache is not found or is out of sync, source code suitable for
+ * caching the metadata is optionally generated.
+ *
+ * The cached metadata is present for extraction by test processing tools that
+ * are unable to execute javascript.
+ *
+ * Metadata is attached to tests via the properties parameter in the test
+ * constructor. See testharness.js for details.
+ *
+ * Typically test system integration will attach callbacks when each test has
+ * run, using add_result_callback(callback(test)), or when the whole test file
+ * has completed, using 
+ * add_completion_callback(callback(tests, harness_status)).
+ *
+ * For more documentation about the callback functions and the
+ * parameters they are called with see testharness.js
+ */
+
+
+
+var metadata_generator = {
+
+    currentMetadata: {},
+    cachedMetadata: false,
+    metadataProperties: ['help', 'assert', 'author'],
+    
+    error: function(message) {
+        var messageElement = document.createElement('p');
+        messageElement.setAttribute('class', 'error');
+        this.appendText(messageElement, message);
+        
+        var summary = document.getElementById('summary');
+        if (summary) {
+            summary.parentNode.insertBefore(messageElement, summary);
+        }
+        else {
+            document.body.appendChild(messageElement);
+        }
+    },
+
+    /**
+     * Ensure property value has contact information
+     */
+    validateContact: function(test, propertyName) {
+        var result = true;
+        var value = test.properties[propertyName];
+        var values = Array.isArray(value) ? value : [value];
+        for (var index = 0; index < values.length; index++) {
+            value = values[index];
+            var re = /(\S+)(\s*)<(.*)>(.*)/;
+            if (! re.test(value)) {
+                re = /(\S+)(\s+)(http[s]?:\/\/)(.*)/
+                if (! re.test(value)) {
+                    this.error('Metadata property "' + propertyName + 
+                        '" for test: "' + test.name +
+                        '" must have name and contact information ' +
+                        '("name <email>" or "name http(s)://")');
+                    result = false;
+                }
+            }
+        }
+        return result;
+    },
+    
+    /**
+     * Extract metadata from test object
+     */
+    extractFromTest: function(test) {
+        var testMetadata = {};
+        // filter out metadata from other properties in test
+        for (var metaIndex = 0; metaIndex < this.metadataProperties.length;
+             metaIndex++) {
+            var meta = this.metadataProperties[metaIndex];
+            if (test.properties.hasOwnProperty(meta)) {
+                if ('author' == meta) {
+                    this.validateContact(test, meta);
+                }
+                testMetadata[meta] = test.properties[meta];
+            }
+        }
+        return testMetadata;
+    },
+    
+    /**
+     * Compare cached metadata to extracted metadata
+     */
+    validateCache: function() {
+        for (var testName in this.currentMetadata) {
+            if (! this.cachedMetadata.hasOwnProperty(testName)) {
+                return false;
+            }
+            var testMetadata = this.currentMetadata[testName];
+            var cachedTestMetadata = this.cachedMetadata[testName];
+            delete this.cachedMetadata[testName];
+            
+            for (var metaIndex = 0; metaIndex < this.metadataProperties.length;
+                 metaIndex++) {
+                var meta = this.metadataProperties[metaIndex];
+                if (cachedTestMetadata.hasOwnProperty(meta) && 
+                    testMetadata.hasOwnProperty(meta)) {
+                    if (Array.isArray(cachedTestMetadata[meta])) {
+                      if (! Array.isArray(testMetadata[meta])) {
+                          return false;
+                      }
+                      if (cachedTestMetadata[meta].length == 
+                          testMetadata[meta].length) {
+                          for (var index = 0; 
+                               index < cachedTestMetadata[meta].length; 
+                               index++) {
+                              if (cachedTestMetadata[meta][index] != 
+                                  testMetadata[meta][index]) {
+                                  return false;
+                              }
+                          }
+                      }
+                      else {
+                          return false;
+                      }
+                    }
+                    else {
+                      if (Array.isArray(testMetadata[meta])) {
+                        return false;
+                      }
+                      if (cachedTestMetadata[meta] != testMetadata[meta]) {
+                        return false;
+                      }
+                    }
+                }
+                else if (cachedTestMetadata.hasOwnProperty(meta) || 
+                         testMetadata.hasOwnProperty(meta)) {
+                    return false;
+                }
+            }
+        }
+        for (var testName in this.cachedMetadata) {
+            return false;
+        }
+        return true;
+    },
+  
+    appendText: function(elemement, text) {
+        elemement.appendChild(document.createTextNode(text));
+    },
+  
+    jsonifyArray: function(arrayValue, indent) {
+        var output = '[';
+
+        if (1 == arrayValue.length) {
+            output += JSON.stringify(arrayValue[0]);
+        }
+        else {
+            for (var index = 0; index < arrayValue.length; index++) {
+                if (0 < index) {
+                    output += ',\n  ' + indent;
+                }
+                output += JSON.stringify(arrayValue[index]);
+            }
+        }
+        output += ']';
+        return output;
+    },
+    
+    jsonifyObject: function(objectValue, indent) {
+        var output = '{';
+        
+        var count = 0;
+        for (var property in objectValue) {
+            ++count;
+            if (Array.isArray(objectValue[property]) || 
+                ('object' == typeof(value))) {
+                ++count;
+            }
+        }
+        if (1 == count) {
+            for (var property in objectValue) {
+                output += ' "' + property + '": '
+                          + JSON.stringify(objectValue[property])
+                          + ' ';
+            }
+        }
+        else {
+            var first = true;
+            for (var property in objectValue) {
+                if (! first) {
+                    output += ',';
+                }
+                first = false;
+                output += '\n  ' + indent + '"' + property + '": ';
+                var value = objectValue[property];
+                if (Array.isArray(value)) {
+                    output += this.jsonifyArray(value, indent + 
+                        '                '.substr(0, 5 + property.length));
+                }
+                else if ('object' == typeof(value)) {
+                    output += this.jsonifyObject(value, indent + '  ');
+                }
+                else {
+                    output += JSON.stringify(value);
+                }
+            }
+            if (1 < output.length) {
+                output += '\n' + indent;
+            }
+        }
+        output += '}';
+        return output;
+    },
+  
+    /**
+     * Generate javascript source code for captured metadata
+     * Metadata is in pretty-printed JSON format
+     */
+    generateSource: function() {
+        var source = 
+            '<script id="metadata_cache">/*\n' + 
+            this.jsonifyObject(this.currentMetadata, '') + '\n' + 
+            '*/</script>\n';
+        return source;
+    },
+    
+    /**
+     * Add element containing metadata source code
+     */
+    addSourceElement: function(event) {
+        var sourceWrapper = document.createElement('div');
+        sourceWrapper.setAttribute('id', 'metadata_source');
+
+        var instructions = document.createElement('p');
+        if (this.cachedMetadata) {
+            this.appendText(instructions, 
+                'Replace the existing <script id="metadata_cache"> element ' + 
+                'in the test\'s <head> with the following:');
+        }
+        else {
+            this.appendText(instructions, 
+                'Copy the following into the <head> element of the test ' +
+                'or the test\'s metadata sidecar file:');
+        }
+        sourceWrapper.appendChild(instructions);
+        
+        var sourceElement = document.createElement('pre');
+        this.appendText(sourceElement, this.generateSource());
+
+        sourceWrapper.appendChild(sourceElement);
+        
+        var messageElement = document.getElementById('metadata_issue');
+        messageElement.parentNode.insertBefore(sourceWrapper, 
+                                               messageElement.nextSibling);
+        messageElement.parentNode.removeChild(messageElement);
+
+        (event.preventDefault) ? event.preventDefault() : 
+                                 event.returnValue = false;
+    },
+    
+    /**
+     * Extract the metadata cache from the cache element if present
+     */
+    getCachedMetadata: function() {
+        var cacheElement = document.getElementById('metadata_cache');
+        
+        if (cacheElement) {
+            var cacheText = cacheElement.firstChild.nodeValue;
+            var openBrace = cacheText.indexOf('{');
+            var closeBrace = cacheText.lastIndexOf('}');
+            if ((-1 < openBrace) && (-1 < closeBrace)) {
+                cacheText = cacheText.slice(openBrace, closeBrace + 1);
+                try {
+                    this.cachedMetadata = JSON.parse(cacheText);
+                }
+                catch (exc) {
+                    this.cachedMetadata = 'Invalid JSON in Cached metadata. ';
+                }
+            }
+            else {
+                this.cachedMetadata = 'Metadata not found in cache element. ';
+            }
+        }
+    },
+    
+    /**
+     * Main entry point, extract metadata from tests, compare to cached version
+     * if present.
+     * If cache not present or differs from extrated metadata, generate an error
+     */
+    process: function(tests, harness_status) {
+        for (var index = 0; index < tests.length; index++) {
+            var test = tests[index];
+            if (this.currentMetadata.hasOwnProperty(test.name)) {
+                this.error('Duplicate test name: ' + test.name);
+            }
+            else {
+                this.currentMetadata[test.name] = this.extractFromTest(test);
+            }
+        }
+
+        this.getCachedMetadata();
+        
+        var message = null;
+        var messageClass = 'warning';
+        var showSource = false;
+        
+        if (0 == tests.length) {
+            if (this.cachedMetadata) {
+                message = 'Cached metadata present but no tests. ';
+            }
+        }
+        else if (1 == tests.length) {
+            if (this.cachedMetadata) {
+                message = 'Single test files should not have cached metadata. ';
+            }
+            else {
+                var testMetadata = this.currentMetadata[tests[0].name];
+                var hasMetadata = false;
+                for (var meta in testMetadata) {
+                    hasMetadata |= testMetadata.hasOwnProperty(meta);
+                }
+                if (hasMetadata) {
+                    message = 'Single tests should not have metadata. ' +
+                              'Move metadata to <head>. ';
+                }
+            }
+        }
+        else {
+            if (this.cachedMetadata) {
+                messageClass = 'error';
+                if ('string' == typeof(this.cachedMetadata)) {
+                    message = this.cachedMetadata;
+                    showSource = true;
+                }
+                else if (! this.validateCache()) {
+                    message = 'Cached metadata out of sync. ';
+                    showSource = true;
+                }
+            }
+        }
+        
+        if (message) {
+            var messageElement = document.createElement('p');
+            messageElement.setAttribute('id', 'metadata_issue');
+            messageElement.setAttribute('class', messageClass);
+            this.appendText(messageElement, message);
+            
+            if (showSource) {
+                var link = document.createElement('a');
+                this.appendText(link, 'Click for source code.');
+                link.setAttribute('href', '#');
+                link.setAttribute('onclick', 
+                                  'metadata_generator.addSourceElement(event)');
+                messageElement.appendChild(link);
+            }
+            
+            var summary = document.getElementById('summary');
+            if (summary) {
+                summary.parentNode.insertBefore(messageElement, summary);
+            }
+            else {
+                var log = document.getElementById('log');
+                if (log) {
+                    log.appendChild(messageElement);
+                }
+            }
+        }
+    },
+
+    setup: function() {
+        add_completion_callback(
+            function (tests, harness_status) { 
+                metadata_generator.process(tests, harness_status)
+            });
+    }
+}
+
+metadata_generator.setup();
+// vim: set expandtab shiftwidth=4 tabstop=4:
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/testcase.xsl b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/testcase.xsl
new file mode 100644 (file)
index 0000000..8623c28
--- /dev/null
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet version="1.0"
+       xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+       <xsl:output method="html" version="1.0" encoding="UTF-8"
+               indent="yes" />
+       <xsl:template match="/">
+               <html>
+                       <STYLE type="text/css">
+                               @import "tests.css";
+                       </STYLE>
+
+                       <body>
+                               <div id="testcasepage">
+                                       <div id="title">
+                                               <table>
+                                                       <tr>
+                                                               <td>
+                                                                       <h1>Test Cases</h1>
+                                                               </td>
+                                                       </tr>
+                                               </table>
+                                       </div>
+                                       <div id="suites">
+                                               <table>
+                                                       <tr>
+                                                               <th>Test Suite</th>
+                                                               <th>Total</th>
+                                                               <th>Auto</th>
+                                                               <th>Manual</th>
+                                                       </tr>
+                                                       <tr>
+                                                               <td>
+                                                                       Total
+                                                               </td>
+                                                               <td>
+                                                                       <xsl:value-of select="count(test_definition/suite/set//testcase)" />
+                                                               </td>
+                                                               <td>
+                                                                       <xsl:value-of
+                                                                               select="count(test_definition/suite/set//testcase[@execution_type = 'auto'])" />
+                                                               </td>
+                                                               <td>
+                                                                       <xsl:value-of
+                                                                               select="count(test_definition/suite/set//testcase[@execution_type != 'auto'])" />
+                                                               </td>
+                                                       </tr>
+                                                       <xsl:for-each select="test_definition/suite">
+                                                               <tr>
+                                                                       <td>
+                                                                               <xsl:value-of select="@name" />
+                                                                       </td>
+                                                                       <td>
+                                                                               <xsl:value-of select="count(set//testcase)" />
+                                                                       </td>
+                                                                       <td>
+                                                                               <xsl:value-of select="count(set/testcase[@execution_type = 'auto'])" />
+                                                                       </td>
+                                                                       <td>
+                                                                               <xsl:value-of select="count(set/testcase[@execution_type != 'auto'])" />
+                                                                       </td>
+                                                               </tr>
+                                                       </xsl:for-each>
+                                               </table>
+                                       </div>
+                                       <div id="title">
+                                               <table>
+                                                       <tr>
+                                                               <td class="title">
+                                                                       <h1>Detailed Test Cases</h1>
+                                                               </td>
+                                                       </tr>
+                                               </table>
+                                       </div>
+                                       <div id="cases">
+                                               <xsl:for-each select="test_definition/suite">
+                                                       <xsl:sort select="@name" />
+                                                       <p>
+                                                               Test Suite:
+                                                               <xsl:value-of select="@name" />
+                                                       </p>
+                                                       <table>
+                                                               <tr>
+                                                                       <th>Case_ID</th>
+                                                                       <th>Purpose</th>
+                                                                       <th>Type</th>
+                                                                       <th>Component</th>
+                                                                       <th>Execution Type</th>
+                                                                       <th>Description</th>
+                                                                       <th>Specification</th>
+                                                               </tr>
+                                                               <xsl:for-each select=".//set">
+                                                                       <xsl:sort select="@name" />
+                                                                       <tr>
+                                                                               <td colspan="7">
+                                                                                       Test Set:
+                                                                                       <xsl:value-of select="@name" />
+                                                                               </td>
+                                                                       </tr>
+                                                                       <xsl:for-each select=".//testcase">
+                                                                               <xsl:sort select="@id" />
+                                                                               <tr>
+                                                                                       <td>
+                                                                                               <xsl:value-of select="@id" />
+                                                                                       </td>
+                                                                                       <td>
+                                                                                               <xsl:value-of select="@purpose" />
+                                                                                       </td>
+                                                                                       <td>
+                                                                                               <xsl:value-of select="@type" />
+                                                                                       </td>
+                                                                                       <td>
+                                                                                               <xsl:value-of select="@component" />
+                                                                                       </td>
+                                                                                       <td>
+                                                                                               <xsl:value-of select="@execution_type" />
+                                                                                       </td>
+                                                                                       <td>
+                                                                                               <p>
+                                                                                                       Pre_condition:
+                                                                                                       <xsl:value-of select=".//description/pre_condition" />
+                                                                                               </p>
+                                                                                               <p>
+                                                                                                       Post_condition:
+                                                                                                       <xsl:value-of select=".//description/post_condition" />
+                                                                                               </p>
+                                                                                               <p>
+                                                                                                       Test Script Entry:
+                                                                                                       <xsl:value-of select=".//description/test_script_entry" />
+                                                                                               </p>
+                                                                                               <p>
+                                                                                                       Steps:
+                                                                                                       <p />
+                                                                                                       <xsl:for-each select=".//description/steps/step">
+                                                                                                               <xsl:sort select="@order" />
+                                                                                                               Step
+                                                                                                               <xsl:value-of select="@order" />
+                                                                                                               :
+                                                                                                               <xsl:value-of select="./step_desc" />
+                                                                                                               ;
+                                                                                                               <p />
+                                                                                                               Expected Result:
+                                                                                                               <xsl:value-of select="./expected" />
+                                                                                                               <p />
+                                                                                                       </xsl:for-each>
+                                                                                               </p>
+                                                                                       </td>
+                                                                                       <td>
+                                                                                               <xsl:call-template name="br-replace">
+                                                                                                       <xsl:with-param name="word" select=".//spec" />
+                                                                                               </xsl:call-template>
+                                                                                       </td>
+                                                                               </tr>
+                                                                       </xsl:for-each>
+                                                               </xsl:for-each>
+                                                       </table>
+                                               </xsl:for-each>
+                                       </div>
+                               </div>
+                       </body>
+               </html>
+       </xsl:template>
+       <xsl:template name="br-replace">
+               <xsl:param name="word" />
+               <xsl:variable name="cr">
+                       <xsl:text>
+</xsl:text>
+               </xsl:variable>
+               <xsl:choose>
+                       <xsl:when test="contains($word,$cr)">
+                               <xsl:value-of select="substring-before($word,$cr)" />
+                               <br />
+                               <xsl:call-template name="br-replace">
+                                       <xsl:with-param name="word" select="substring-after($word,$cr)" />
+                               </xsl:call-template>
+                       </xsl:when>
+                       <xsl:otherwise>
+                               <xsl:value-of select="$word" />
+                       </xsl:otherwise>
+               </xsl:choose>
+       </xsl:template>
+</xsl:stylesheet>
\ No newline at end of file
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/testcase/Makefile.am b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/testcase/Makefile.am
new file mode 100644 (file)
index 0000000..4cc5091
--- /dev/null
@@ -0,0 +1,3 @@
+testcase_SCRIPTS = *
+testcasedir = $(prefix)/opt/{TESTSUITE_NAME}/testcase
+EXTRA_DIST = $(testcase_SCRIPTS)
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/testresult.xsl b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/testresult.xsl
new file mode 100644 (file)
index 0000000..d1ad1b9
--- /dev/null
@@ -0,0 +1,273 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet version="1.0"
+       xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+       <xsl:output method="html" version="1.0" encoding="UTF-8"
+               indent="yes" />
+       <xsl:template match="/">
+               <html>
+                       <STYLE type="text/css">
+                               @import "tests.css";
+                       </STYLE>
+
+                       <body>
+                               <div id="testcasepage">
+                                       <div id="title">
+                                               <table>
+                                                       <tr>
+                                                               <td>
+                                                                       <h1>Test Report</h1>
+                                                               </td>
+                                                       </tr>
+                                               </table>
+                                       </div>
+                                       <div id="device">
+                                               <table>
+                                                       <tr>
+                                                               <th colspan="2">Device Information</th>
+                                                       </tr>
+                                                       <tr>
+                                                               <td>Device Name</td>
+                                                               <td>
+                                                                       <xsl:value-of select="test_definition/environment/@device_name" />
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <td>Device Model</td>
+                                                               <td>
+                                                                       <xsl:value-of select="test_definition/environment/@device_model" />
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <td>OS Version</td>
+                                                               <td>
+                                                                       <xsl:value-of select="test_definition/environment/@os_version" />
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <td>Device ID</td>
+                                                               <td>
+                                                                       <xsl:value-of select="test_definition/environment/@device_id" />
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <td>Firmware Version</td>
+                                                               <td>
+                                                                       <xsl:value-of select="test_definition/environment/@firmware_version" />
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <td>Screen Size</td>
+                                                               <td>
+                                                                       <xsl:value-of select="test_definition/environment/@screen_size" />
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <td>Resolution</td>
+                                                               <td>
+                                                                       <xsl:value-of select="test_definition/environment/@resolution" />
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <td>Host Info</td>
+                                                               <td>
+                                                                       <xsl:value-of select="test_definition/environment/@host" />
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <td>Others</td>
+                                                               <td>
+                                                                       <xsl:value-of select="test_definition/environment/other" />
+                                                               </td>
+                                                       </tr>
+                                               </table>
+                                       </div>
+
+                                       <div id="summary">
+                                               <table>
+                                                       <tr>
+                                                               <th colspan="2">Test Summary</th>
+                                                       </tr>
+                                                       <tr>
+                                                               <td>Test Plan Name</td>
+                                                               <td>
+                                                                       <xsl:value-of select="test_definition/summary/@test_plan_name" />
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <td>Tests Total</td>
+                                                               <td>
+                                                                       <xsl:value-of select="count(test_definition//suite/set/testcase)" />
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <td>Test Passed</td>
+                                                               <td>
+                                                                       <xsl:value-of
+                                                                               select="count(test_definition//suite/set/testcase[@result = 'PASS'])" />
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <td>Test Failed</td>
+                                                               <td>
+                                                                       <xsl:value-of
+                                                                               select="count(test_definition//suite/set/testcase[@result = 'FAIL'])" />
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <td>Test N/A</td>
+                                                               <td>
+                                                                       <xsl:value-of
+                                                                               select="count(test_definition//suite/set/testcase[@result = 'BLOCK'])" />
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <td>Test Not Run</td>
+                                                               <td>
+                                                                       <xsl:value-of
+                                                                               select="count(test_definition//suite/set/testcase) - count(test_definition//suite/set/testcase[@result = 'PASS']) - count(test_definition//suite/set/testcase[@result = 'FAIL']) - count(test_definition//suite/set/testcase[@result = 'BLOCK'])" />
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <td>Start time</td>
+                                                               <td>
+                                                                       <xsl:value-of select="test_definition/summary/start_at" />
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <td>End time</td>
+                                                               <td>
+                                                                       <xsl:value-of select="test_definition/summary/end_at" />
+                                                               </td>
+                                                       </tr>
+                                               </table>
+                                       </div>
+
+
+                                       <div id="suite_summary">
+                                               <div id="title">
+                                                       <table>
+                                                               <tr>
+                                                                       <td class="title">
+                                                                               <h1>Test Summary by Suite</h1>
+                                                                       </td>
+                                                               </tr>
+                                                       </table>
+                                               </div>
+                                               <table>
+                                                       <tr>
+                                                               <th>Suite</th>
+                                                               <th>Passed</th>
+                                                               <th>Failed</th>
+                                                               <th>N/A</th>
+                                                               <th>Not Run</th>
+                                                               <th>Total</th>
+                                                       </tr>
+                                                       <xsl:for-each select="test_definition/suite">
+                                                               <xsl:sort select="@name" />
+                                                               <tr>
+                                                                       <td>
+                                                                               <xsl:value-of select="@name" />
+                                                                       </td>
+                                                                       <td>
+                                                                               <xsl:value-of select="count(set//testcase[@result = 'PASS'])" />
+                                                                       </td>
+                                                                       <td>
+                                                                               <xsl:value-of select="count(set//testcase[@result = 'FAIL'])" />
+                                                                       </td>
+                                                                       <td>
+                                                                               <xsl:value-of select="count(set//testcase[@result = 'BLOCK'])" />
+                                                                       </td>
+                                                                       <td>
+                                                                               <xsl:value-of
+                                                                                       select="count(set//testcase) - count(set//testcase[@result = 'PASS']) - count(set//testcase[@result = 'FAIL']) - count(set//testcase[@result = 'BLOCK'])" />
+                                                                       </td>
+                                                                       <td>
+                                                                               <xsl:value-of select="count(set//testcase)" />
+                                                                       </td>
+                                                               </tr>
+                                                       </xsl:for-each>
+                                               </table>
+                                       </div>
+
+                                       <div id="cases">
+                                               <div id="title">
+                                                       <table>
+                                                               <tr>
+                                                                       <td class="title">
+                                                                               <h1 align="center">Detailed Test Results</h1>
+                                                                       </td>
+                                                               </tr>
+                                                       </table>
+                                               </div>
+                                               <xsl:for-each select="test_definition/suite">
+                                                       <xsl:sort select="@name" />
+                                                       <p>
+                                                               Test Suite:
+                                                               <xsl:value-of select="@name" />
+                                                       </p>
+                                                       <table>
+                                                               <tr>
+                                                                       <th>Case_ID</th>
+                                                                       <th>Purpose</th>
+                                                                       <th>Result</th>
+                                                                       <th>Stdout</th>
+                                                               </tr>
+                                                               <xsl:for-each select=".//set">
+                                                                       <xsl:sort select="@name" />
+                                                                       <tr>
+                                                                               <td colspan="4">
+                                                                                       Test Set:
+                                                                                       <xsl:value-of select="@name" />
+                                                                               </td>
+                                                                       </tr>
+                                                                       <xsl:for-each select=".//testcase">
+                                                                               <xsl:sort select="@id" />
+                                                                               <tr>
+                                                                                       <td>
+                                                                                               <xsl:value-of select="@id" />
+                                                                                       </td>
+                                                                                       <td>
+                                                                                               <xsl:value-of select="@purpose" />
+                                                                                       </td>
+
+                                                                                       <xsl:choose>
+                                                                                               <xsl:when test="@result">
+                                                                                                       <xsl:if test="@result = 'FAIL'">
+                                                                                                               <td class="red_rate">
+                                                                                                                       <xsl:value-of select="@result" />
+                                                                                                               </td>
+                                                                                                       </xsl:if>
+                                                                                                       <xsl:if test="@result = 'PASS'">
+                                                                                                               <td class="green_rate">
+                                                                                                                       <xsl:value-of select="@result" />
+                                                                                                               </td>
+                                                                                                       </xsl:if>
+                                                                                                       <xsl:if test="@result = 'BLOCK' ">
+                                                                                                               <td>
+                                                                                                                       BLOCK
+                                                                                                               </td>
+                                                                                                       </xsl:if>
+                                                                                               </xsl:when>
+                                                                                               <xsl:otherwise>
+                                                                                                       <td>
+
+                                                                                                       </td>
+                                                                                               </xsl:otherwise>
+                                                                                       </xsl:choose>
+                                                                                       <td>
+                                                                                               <xsl:value-of select=".//result_info/stdout" />
+                                                                                               <xsl:if test=".//result_info/stdout = ''">
+                                                                                                       N/A
+                                                                                               </xsl:if>
+                                                                                       </td>
+                                                                               </tr>
+                                                                       </xsl:for-each>
+                                                               </xsl:for-each>
+                                                       </table>
+                                               </xsl:for-each>
+                                       </div>
+                               </div>
+                       </body>
+               </html>
+       </xsl:template>
+</xsl:stylesheet>
\ No newline at end of file
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/tests.css b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/tests.css
new file mode 100644 (file)
index 0000000..30c3670
--- /dev/null
@@ -0,0 +1,103 @@
+@charset "UTF-8";
+/* CSS Document */
+#testcasepage div,#testcasepage h1,#testcasepage p,#testcasepage table,#testcasepage tr,#testcasepage th,#testcasepage td
+       {
+       margin: 0;
+       padding: 0;
+       border: 0;
+       font-weight: inherit;
+       font-style: inherit;
+       font-size: 0.96em;
+       font-family: arial;
+       vertical-align: baseline;
+}
+
+#testcasepage p {
+       text-align: left;
+}
+
+#testcasepage table {
+       border-collapse: separate;
+       border-spacing: 0;
+       margin-bottom: 1.4em;
+       vertical-align: middle;
+}
+
+#testcasepage th,#testcasepage td {
+       text-align: left;
+       font-weight: normal;
+       padding: 4px 10px 4px 5px;
+       vertical-align: middle;
+}
+
+#cases table {
+       width: 101%;
+}
+
+#title table {
+       width: 101%;
+}
+
+#device table {
+       width: 50%;
+}
+
+#summary table {
+       width: 50%;
+}
+
+#testcasepage th {
+       border-bottom: 1px solid #000;
+       background-color: #AAAAAA;
+       border-left: 1px solid #000;
+       border-top: 1px solid #000;
+       color: #000;
+       font-weight: bold;
+       vertical-align: bottom;
+}
+
+#testcasepage th:last-child, #testcasepage td:last-child {
+       border-right: 1px solid #000;
+}
+
+#testcasepage td {
+       border-left: 1px solid;
+       font-weight: normal;
+       border-bottom: 1px solid;
+}
+
+#testcasepage td.yellow_rate {
+       background-color: #ffcc00;
+}
+
+#testcasepage td.green_rate {
+       background-color: #33cc33;
+}
+
+#testcasepage td.dgreen_rate {
+       background-color: #339933;
+}
+
+#testcasepage td.red_rate {
+       background-color: #FF3333;
+}
+
+#title table, #title tr, #title td {
+       border-left: none;
+       border-bottom: none;
+       text-align: center;
+}
+
+#title td:last-child {
+       border-right: none;
+}
+
+#testcasepage h1 {
+       font-size: 2em;
+       font-family: Arial, sans-serif; font-weight : bold;
+       line-height: 1;
+       color: #000;
+       margin-bottom: 0.75em;
+       padding-top: 0.25em;
+       font-weight: bold;
+}
\ No newline at end of file
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/tests.full.xml b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/tests.full.xml
new file mode 100644 (file)
index 0000000..53e541d
--- /dev/null
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl"  href="./testcase.xsl"?>
+<test_definition>
+  <suite name="{TESTSUITE_NAME}" launcher="WRTLauncher" category="undefined">
+    <set name="Default">
+      <testcase component="TizenAPI/Application/Default" execution_type="auto"  id="testcase" priority="P1" purpose="" type="" status="approved">
+        <description>
+          <test_script_entry>/opt/{TESTSUITE_NAME}/testcase/{TESTCASE}.html</test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion element_type="" element_name="" interface="" specification="" section="" category=""/>
+            <spec_url></spec_url>
+            <spec_statement/>
+          </spec>
+        </specs>
+      </testcase>
+    </set>
+  </suite>
+</test_definition>
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/tests.xml b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/tests.xml
new file mode 100644 (file)
index 0000000..b8c5326
--- /dev/null
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="./testcase.xsl"?>
+<test_definition>
+  <suite name="{TESTSUITE_NAME}" launcher="WRTLauncher" category="undefined">
+    <set name="Default">
+      <testcase component="TizenAPI/Application/Default" execution_type="auto" id="testcase" priority="P1" purpose="">
+        <description>
+          <test_script_entry>/opt/{TESTSUITE_NAME}/testcase/{TESTCASE}.html</test_script_entry>
+        </description>
+      </testcase>
+    </set>
+  </suite>
+</test_definition>
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/webrunner/Makefile.am b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/webrunner/Makefile.am
new file mode 100644 (file)
index 0000000..82b67c5
--- /dev/null
@@ -0,0 +1,3 @@
+webrunner_SCRIPTS = *
+webrunnerdir = $(prefix)/opt/{TESTSUITE_NAME}/webrunner
+EXTRA_DIST = $(webrunner_SCRIPTS)
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/webrunner/index.html b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/webrunner/index.html
new file mode 100644 (file)
index 0000000..51e03b2
--- /dev/null
@@ -0,0 +1,141 @@
+<!doctype html>
+<!--
+Copyright (c) 2015 Samsung Electronics Co.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+  of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+  this list of conditions and the following disclaimer in the documentation
+  and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+  may be used to endorse or promote products derived from this work without
+  specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+
+
+-->
+
+<head>
+<meta name="viewport" content="width=device-width">
+<script src="jquery-1.10.2.min.js"></script>
+<style type="text/css">
+html {
+       font-family:DejaVu Sans, Bitstream Vera Sans, Arial, Sans;
+}
+
+body {
+       background-color: white;
+}
+
+table#browse {
+       border-collapse:collapse;
+       table-layout:fixed;width:80%;
+}
+
+table#browse th:first-child,table#browse td:first-child {width:40%;}
+
+table#browse th:last-child,table#browse td:last-child {width:30%;}
+
+table#browse th {
+       padding:0;
+       padding-bottom:0.5em;
+       text-align:left;
+       border-bottom:medium solid black;
+}
+table#browse td {
+       padding:1em;
+       padding-bottom:0.5em;
+       border-bottom:thin solid black;
+}
+div#navbar{
+       box-sizing: border-box;
+       width: 99%;
+       border: 0px;
+       text-align: left;
+       background: slateblue;
+       color: white;
+}
+div#footbar{
+       width: 99%;
+       border: 0px;
+       text-align: left;
+}
+textarea#testinfo{
+       width: 99%;
+       font-size: 0.8em;
+}
+input{
+       font-size: 1.2em;
+       padding-top: 0.1em;
+       padding-bottom: 0.1em;
+}
+
+#btnPrev,#btnNext{
+       width: 8%;
+}
+#btnDone,#btnRun,#btnList,#btnPass,#btnFail,#btnBlock{
+       width: 12%;
+       font-weight: bold;
+}
+
+#btnPass { color: green;}
+#btnFail { color: red;}
+#btnBlock { color: orange;}
+#labBatch{
+       font-size: 0.5em;
+}
+#textTest {
+       width: 60%;
+}
+
+#frmTest {
+       border: none;
+}
+.singlemode { display: none;}
+.short{
+       padding-left: 1em;
+}
+</style>
+</head>
+
+<body>
+<div id="navbar" class="batchmode">
+       <span class="short singlemode"><input type="button" id="btnList" value="List"/></span>
+       <span class="singlemode short">
+               <input type="button" id="btnPrev" value="<"/>
+               <input type="text"  id="textTest" readonly />
+               <input type="button" id="btnNext" value=">"/> 
+       </span>
+       <span class="short listmode"> <input type="button" id="btnDone" value="Done"/></span>
+</div>
+<div id="divSum"> </div>
+<div width="99%" class="singlemode">
+       <textarea class="batchmode" id="testinfo" rows=4 disabled>
+       </textarea>
+</div>
+<div id="footbar" class="batchmode">
+       <span class="short"><input type="button"  id="btnRun" value="Run"/></span>
+       <span class="short singlemode"><input type="button" id="btnPass" value="PASS"/></span>
+       <span class="short singlemode"><input type="button" id="btnFail" value="FAIL"/></span>
+       <span class="short singlemode"><input type="button" id="btnBlock" value="BLOCK"/></span>
+</div>
+<iframe width="100%" id="frmTest" allowFullScreen="true" mozAllowFullScreen="true" webkitAllowFullscreen="true" src="">
+</iframe>
+<script src="testrunner.js"> </script>
+</body>
+</html>
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/webrunner/jquery-1.10.2.min.js b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/webrunner/jquery-1.10.2.min.js
new file mode 100644 (file)
index 0000000..da41706
--- /dev/null
@@ -0,0 +1,6 @@
+/*! jQuery v1.10.2 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license
+//@ sourceMappingURL=jquery-1.10.2.min.map
+*/
+(function(e,t){var n,r,i=typeof t,o=e.location,a=e.document,s=a.documentElement,l=e.jQuery,u=e.$,c={},p=[],f="1.10.2",d=p.concat,h=p.push,g=p.slice,m=p.indexOf,y=c.toString,v=c.hasOwnProperty,b=f.trim,x=function(e,t){return new x.fn.init(e,t,r)},w=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=/\S+/g,C=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,k=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,E=/^[\],:{}\s]*$/,S=/(?:^|:|,)(?:\s*\[)+/g,A=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,j=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,D=/^-ms-/,L=/-([\da-z])/gi,H=function(e,t){return t.toUpperCase()},q=function(e){(a.addEventListener||"load"===e.type||"complete"===a.readyState)&&(_(),x.ready())},_=function(){a.addEventListener?(a.removeEventListener("DOMContentLoaded",q,!1),e.removeEventListener("load",q,!1)):(a.detachEvent("onreadystatechange",q),e.detachEvent("onload",q))};x.fn=x.prototype={jquery:f,constructor:x,init:function(e,n,r){var i,o;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof x?n[0]:n,x.merge(this,x.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:a,!0)),k.test(i[1])&&x.isPlainObject(n))for(i in n)x.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(o=a.getElementById(i[2]),o&&o.parentNode){if(o.id!==i[2])return r.find(e);this.length=1,this[0]=o}return this.context=a,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return g.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(g.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},l=1,u=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},l=2),"object"==typeof s||x.isFunction(s)||(s={}),u===l&&(s=this,--l);u>l;l++)if(null!=(o=arguments[l]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(x.isPlainObject(r)||(n=x.isArray(r)))?(n?(n=!1,a=e&&x.isArray(e)?e:[]):a=e&&x.isPlainObject(e)?e:{},s[i]=x.extend(c,a,r)):r!==t&&(s[i]=r));return s},x.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=l),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){if(e===!0?!--x.readyWait:!x.isReady){if(!a.body)return setTimeout(x.ready);x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(a,[x]),x.fn.trigger&&x(a).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray||function(e){return"array"===x.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?c[y.call(e)]||"object":typeof e},isPlainObject:function(e){var n;if(!e||"object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!v.call(e,"constructor")&&!v.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(r){return!1}if(x.support.ownLast)for(n in e)return v.call(e,n);for(n in e);return n===t||v.call(e,n)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||a;var r=k.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=x.trim(n),n&&E.test(n.replace(A,"@").replace(j,"]").replace(S,"")))?Function("return "+n)():(x.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||x.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&x.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(D,"ms-").replace(L,H)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:b&&!b.call("\ufeff\u00a0")?function(e){return null==e?"":b.call(e)}:function(e){return null==e?"":(e+"").replace(C,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?x.merge(n,"string"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(m)return m.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return d.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),x.isFunction(e)?(r=g.call(arguments,2),i=function(){return e.apply(n||this,r.concat(g.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):t},access:function(e,n,r,i,o,a,s){var l=0,u=e.length,c=null==r;if("object"===x.type(r)){o=!0;for(l in r)x.access(e,n,l,r[l],!0,a,s)}else if(i!==t&&(o=!0,x.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(x(e),n)})),n))for(;u>l;l++)n(e[l],r,s?i:i.call(e[l],l,n(e[l],r)));return o?e:c?n.call(e):u?n(e[0],r):a},now:function(){return(new Date).getTime()},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),x.ready.promise=function(t){if(!n)if(n=x.Deferred(),"complete"===a.readyState)setTimeout(x.ready);else if(a.addEventListener)a.addEventListener("DOMContentLoaded",q,!1),e.addEventListener("load",q,!1);else{a.attachEvent("onreadystatechange",q),e.attachEvent("onload",q);var r=!1;try{r=null==e.frameElement&&a.documentElement}catch(i){}r&&r.doScroll&&function o(){if(!x.isReady){try{r.doScroll("left")}catch(e){return setTimeout(o,50)}_(),x.ready()}}()}return n.promise(t)},x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){c["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=x(a),function(e,t){var n,r,i,o,a,s,l,u,c,p,f,d,h,g,m,y,v,b="sizzle"+-new Date,w=e.document,T=0,C=0,N=st(),k=st(),E=st(),S=!1,A=function(e,t){return e===t?(S=!0,0):0},j=typeof t,D=1<<31,L={}.hasOwnProperty,H=[],q=H.pop,_=H.push,M=H.push,O=H.slice,F=H.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},B="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",P="[\\x20\\t\\r\\n\\f]",R="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",W=R.replace("w","w#"),$="\\["+P+"*("+R+")"+P+"*(?:([*^$|!~]?=)"+P+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+W+")|)|)"+P+"*\\]",I=":("+R+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+$.replace(3,8)+")*)|.*)\\)|)",z=RegExp("^"+P+"+|((?:^|[^\\\\])(?:\\\\.)*)"+P+"+$","g"),X=RegExp("^"+P+"*,"+P+"*"),U=RegExp("^"+P+"*([>+~]|"+P+")"+P+"*"),V=RegExp(P+"*[+~]"),Y=RegExp("="+P+"*([^\\]'\"]*)"+P+"*\\]","g"),J=RegExp(I),G=RegExp("^"+W+"$"),Q={ID:RegExp("^#("+R+")"),CLASS:RegExp("^\\.("+R+")"),TAG:RegExp("^("+R.replace("w","w*")+")"),ATTR:RegExp("^"+$),PSEUDO:RegExp("^"+I),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+P+"*(even|odd|(([+-]|)(\\d*)n|)"+P+"*(?:([+-]|)"+P+"*(\\d+)|))"+P+"*\\)|)","i"),bool:RegExp("^(?:"+B+")$","i"),needsContext:RegExp("^"+P+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+P+"*((?:-\\d)?\\d*)"+P+"*\\)|)(?=[^-]|$)","i")},K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,et=/^(?:input|select|textarea|button)$/i,tt=/^h\d$/i,nt=/'|\\/g,rt=RegExp("\\\\([\\da-f]{1,6}"+P+"?|("+P+")|.)","ig"),it=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{M.apply(H=O.call(w.childNodes),w.childNodes),H[w.childNodes.length].nodeType}catch(ot){M={apply:H.length?function(e,t){_.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function at(e,t,n,i){var o,a,s,l,u,c,d,m,y,x;if((t?t.ownerDocument||t:w)!==f&&p(t),t=t||f,n=n||[],!e||"string"!=typeof e)return n;if(1!==(l=t.nodeType)&&9!==l)return[];if(h&&!i){if(o=Z.exec(e))if(s=o[1]){if(9===l){if(a=t.getElementById(s),!a||!a.parentNode)return n;if(a.id===s)return n.push(a),n}else if(t.ownerDocument&&(a=t.ownerDocument.getElementById(s))&&v(t,a)&&a.id===s)return n.push(a),n}else{if(o[2])return M.apply(n,t.getElementsByTagName(e)),n;if((s=o[3])&&r.getElementsByClassName&&t.getElementsByClassName)return M.apply(n,t.getElementsByClassName(s)),n}if(r.qsa&&(!g||!g.test(e))){if(m=d=b,y=t,x=9===l&&e,1===l&&"object"!==t.nodeName.toLowerCase()){c=mt(e),(d=t.getAttribute("id"))?m=d.replace(nt,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",u=c.length;while(u--)c[u]=m+yt(c[u]);y=V.test(e)&&t.parentNode||t,x=c.join(",")}if(x)try{return M.apply(n,y.querySelectorAll(x)),n}catch(T){}finally{d||t.removeAttribute("id")}}}return kt(e.replace(z,"$1"),t,n,i)}function st(){var e=[];function t(n,r){return e.push(n+=" ")>o.cacheLength&&delete t[e.shift()],t[n]=r}return t}function lt(e){return e[b]=!0,e}function ut(e){var t=f.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function ct(e,t){var n=e.split("|"),r=e.length;while(r--)o.attrHandle[n[r]]=t}function pt(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function ft(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function dt(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function ht(e){return lt(function(t){return t=+t,lt(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}s=at.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},r=at.support={},p=at.setDocument=function(e){var n=e?e.ownerDocument||e:w,i=n.defaultView;return n!==f&&9===n.nodeType&&n.documentElement?(f=n,d=n.documentElement,h=!s(n),i&&i.attachEvent&&i!==i.top&&i.attachEvent("onbeforeunload",function(){p()}),r.attributes=ut(function(e){return e.className="i",!e.getAttribute("className")}),r.getElementsByTagName=ut(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),r.getElementsByClassName=ut(function(e){return e.innerHTML="<div class='a'></div><div class='a i'></div>",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),r.getById=ut(function(e){return d.appendChild(e).id=b,!n.getElementsByName||!n.getElementsByName(b).length}),r.getById?(o.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){return e.getAttribute("id")===t}}):(delete o.find.ID,o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode("id");return n&&n.value===t}}),o.find.TAG=r.getElementsByTagName?function(e,n){return typeof n.getElementsByTagName!==j?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},o.find.CLASS=r.getElementsByClassName&&function(e,n){return typeof n.getElementsByClassName!==j&&h?n.getElementsByClassName(e):t},m=[],g=[],(r.qsa=K.test(n.querySelectorAll))&&(ut(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||g.push("\\["+P+"*(?:value|"+B+")"),e.querySelectorAll(":checked").length||g.push(":checked")}),ut(function(e){var t=n.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("t",""),e.querySelectorAll("[t^='']").length&&g.push("[*^$]="+P+"*(?:''|\"\")"),e.querySelectorAll(":enabled").length||g.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),g.push(",.*:")})),(r.matchesSelector=K.test(y=d.webkitMatchesSelector||d.mozMatchesSelector||d.oMatchesSelector||d.msMatchesSelector))&&ut(function(e){r.disconnectedMatch=y.call(e,"div"),y.call(e,"[s!='']:x"),m.push("!=",I)}),g=g.length&&RegExp(g.join("|")),m=m.length&&RegExp(m.join("|")),v=K.test(d.contains)||d.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},A=d.compareDocumentPosition?function(e,t){if(e===t)return S=!0,0;var i=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t);return i?1&i||!r.sortDetached&&t.compareDocumentPosition(e)===i?e===n||v(w,e)?-1:t===n||v(w,t)?1:c?F.call(c,e)-F.call(c,t):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return S=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:c?F.call(c,e)-F.call(c,t):0;if(o===a)return pt(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?pt(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},n):f},at.matches=function(e,t){return at(e,null,null,t)},at.matchesSelector=function(e,t){if((e.ownerDocument||e)!==f&&p(e),t=t.replace(Y,"='$1']"),!(!r.matchesSelector||!h||m&&m.test(t)||g&&g.test(t)))try{var n=y.call(e,t);if(n||r.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(i){}return at(t,f,null,[e]).length>0},at.contains=function(e,t){return(e.ownerDocument||e)!==f&&p(e),v(e,t)},at.attr=function(e,n){(e.ownerDocument||e)!==f&&p(e);var i=o.attrHandle[n.toLowerCase()],a=i&&L.call(o.attrHandle,n.toLowerCase())?i(e,n,!h):t;return a===t?r.attributes||!h?e.getAttribute(n):(a=e.getAttributeNode(n))&&a.specified?a.value:null:a},at.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},at.uniqueSort=function(e){var t,n=[],i=0,o=0;if(S=!r.detectDuplicates,c=!r.sortStable&&e.slice(0),e.sort(A),S){while(t=e[o++])t===e[o]&&(i=n.push(o));while(i--)e.splice(n[i],1)}return e},a=at.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=a(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=a(t);return n},o=at.selectors={cacheLength:50,createPseudo:lt,match:Q,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(rt,it),e[3]=(e[4]||e[5]||"").replace(rt,it),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||at.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&at.error(e[0]),e},PSEUDO:function(e){var n,r=!e[5]&&e[2];return Q.CHILD.test(e[0])?null:(e[3]&&e[4]!==t?e[2]=e[4]:r&&J.test(r)&&(n=mt(r,!0))&&(n=r.indexOf(")",r.length-n)-r.length)&&(e[0]=e[0].slice(0,n),e[2]=r.slice(0,n)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(rt,it).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=N[e+" "];return t||(t=RegExp("(^|"+P+")"+e+"("+P+"|$)"))&&N(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=at.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,l){var u,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!l&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[b]||(m[b]={}),u=c[e]||[],d=u[0]===T&&u[1],f=u[0]===T&&u[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[T,d,f];break}}else if(v&&(u=(t[b]||(t[b]={}))[e])&&u[0]===T)f=u[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[b]||(p[b]={}))[e]=[T,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=o.pseudos[e]||o.setFilters[e.toLowerCase()]||at.error("unsupported pseudo: "+e);return r[b]?r(t):r.length>1?(n=[e,e,"",t],o.setFilters.hasOwnProperty(e.toLowerCase())?lt(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=F.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:lt(function(e){var t=[],n=[],r=l(e.replace(z,"$1"));return r[b]?lt(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:lt(function(e){return function(t){return at(e,t).length>0}}),contains:lt(function(e){return function(t){return(t.textContent||t.innerText||a(t)).indexOf(e)>-1}}),lang:lt(function(e){return G.test(e||"")||at.error("unsupported lang: "+e),e=e.replace(rt,it).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===d},focus:function(e){return e===f.activeElement&&(!f.hasFocus||f.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!o.pseudos.empty(e)},header:function(e){return tt.test(e.nodeName)},input:function(e){return et.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:ht(function(){return[0]}),last:ht(function(e,t){return[t-1]}),eq:ht(function(e,t,n){return[0>n?n+t:n]}),even:ht(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:ht(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:ht(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:ht(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}},o.pseudos.nth=o.pseudos.eq;for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})o.pseudos[n]=ft(n);for(n in{submit:!0,reset:!0})o.pseudos[n]=dt(n);function gt(){}gt.prototype=o.filters=o.pseudos,o.setFilters=new gt;function mt(e,t){var n,r,i,a,s,l,u,c=k[e+" "];if(c)return t?0:c.slice(0);s=e,l=[],u=o.preFilter;while(s){(!n||(r=X.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),l.push(i=[])),n=!1,(r=U.exec(s))&&(n=r.shift(),i.push({value:n,type:r[0].replace(z," ")}),s=s.slice(n.length));for(a in o.filter)!(r=Q[a].exec(s))||u[a]&&!(r=u[a](r))||(n=r.shift(),i.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?at.error(e):k(e,l).slice(0)}function yt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function vt(e,t,n){var r=t.dir,o=n&&"parentNode"===r,a=C++;return t.first?function(t,n,i){while(t=t[r])if(1===t.nodeType||o)return e(t,n,i)}:function(t,n,s){var l,u,c,p=T+" "+a;if(s){while(t=t[r])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[r])if(1===t.nodeType||o)if(c=t[b]||(t[b]={}),(u=c[r])&&u[0]===p){if((l=u[1])===!0||l===i)return l===!0}else if(u=c[r]=[p],u[1]=e(t,n,s)||i,u[1]===!0)return!0}}function bt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function xt(e,t,n,r,i){var o,a=[],s=0,l=e.length,u=null!=t;for(;l>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),u&&t.push(s));return a}function wt(e,t,n,r,i,o){return r&&!r[b]&&(r=wt(r)),i&&!i[b]&&(i=wt(i,o)),lt(function(o,a,s,l){var u,c,p,f=[],d=[],h=a.length,g=o||Nt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:xt(g,f,e,s,l),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,l),r){u=xt(y,d),r(u,[],s,l),c=u.length;while(c--)(p=u[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){u=[],c=y.length;while(c--)(p=y[c])&&u.push(m[c]=p);i(null,y=[],u,l)}c=y.length;while(c--)(p=y[c])&&(u=i?F.call(o,p):f[c])>-1&&(o[u]=!(a[u]=p))}}else y=xt(y===a?y.splice(h,y.length):y),i?i(null,a,y,l):M.apply(a,y)})}function Tt(e){var t,n,r,i=e.length,a=o.relative[e[0].type],s=a||o.relative[" "],l=a?1:0,c=vt(function(e){return e===t},s,!0),p=vt(function(e){return F.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;i>l;l++)if(n=o.relative[e[l].type])f=[vt(bt(f),n)];else{if(n=o.filter[e[l].type].apply(null,e[l].matches),n[b]){for(r=++l;i>r;r++)if(o.relative[e[r].type])break;return wt(l>1&&bt(f),l>1&&yt(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(z,"$1"),n,r>l&&Tt(e.slice(l,r)),i>r&&Tt(e=e.slice(r)),i>r&&yt(e))}f.push(n)}return bt(f)}function Ct(e,t){var n=0,r=t.length>0,a=e.length>0,s=function(s,l,c,p,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,C=u,N=s||a&&o.find.TAG("*",d&&l.parentNode||l),k=T+=null==C?1:Math.random()||.1;for(w&&(u=l!==f&&l,i=n);null!=(h=N[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,l,c)){p.push(h);break}w&&(T=k,i=++n)}r&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,r&&b!==v){g=0;while(m=t[g++])m(x,y,l,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=q.call(p));y=xt(y)}M.apply(p,y),w&&!s&&y.length>0&&v+t.length>1&&at.uniqueSort(p)}return w&&(T=k,u=C),x};return r?lt(s):s}l=at.compile=function(e,t){var n,r=[],i=[],o=E[e+" "];if(!o){t||(t=mt(e)),n=t.length;while(n--)o=Tt(t[n]),o[b]?r.push(o):i.push(o);o=E(e,Ct(i,r))}return o};function Nt(e,t,n){var r=0,i=t.length;for(;i>r;r++)at(e,t[r],n);return n}function kt(e,t,n,i){var a,s,u,c,p,f=mt(e);if(!i&&1===f.length){if(s=f[0]=f[0].slice(0),s.length>2&&"ID"===(u=s[0]).type&&r.getById&&9===t.nodeType&&h&&o.relative[s[1].type]){if(t=(o.find.ID(u.matches[0].replace(rt,it),t)||[])[0],!t)return n;e=e.slice(s.shift().value.length)}a=Q.needsContext.test(e)?0:s.length;while(a--){if(u=s[a],o.relative[c=u.type])break;if((p=o.find[c])&&(i=p(u.matches[0].replace(rt,it),V.test(s[0].type)&&t.parentNode||t))){if(s.splice(a,1),e=i.length&&yt(s),!e)return M.apply(n,i),n;break}}}return l(e,f)(i,t,!h,n,V.test(e)),n}r.sortStable=b.split("").sort(A).join("")===b,r.detectDuplicates=S,p(),r.sortDetached=ut(function(e){return 1&e.compareDocumentPosition(f.createElement("div"))}),ut(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||ct("type|href|height|width",function(e,n,r){return r?t:e.getAttribute(n,"type"===n.toLowerCase()?1:2)}),r.attributes&&ut(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||ct("value",function(e,n,r){return r||"input"!==e.nodeName.toLowerCase()?t:e.defaultValue}),ut(function(e){return null==e.getAttribute("disabled")})||ct(B,function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&i.specified?i.value:e[n]===!0?n.toLowerCase():null}),x.find=at,x.expr=at.selectors,x.expr[":"]=x.expr.pseudos,x.unique=at.uniqueSort,x.text=at.getText,x.isXMLDoc=at.isXML,x.contains=at.contains}(e);var O={};function F(e){var t=O[e]={};return x.each(e.match(T)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e="string"==typeof e?O[e]||F(e):x.extend({},e);var n,r,i,o,a,s,l=[],u=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=l.length,n=!0;l&&o>a;a++)if(l[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,l&&(u?u.length&&c(u.shift()):r?l=[]:p.disable())},p={add:function(){if(l){var t=l.length;(function i(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&p.has(n)||l.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=l.length:r&&(s=t,c(r))}return this},remove:function(){return l&&x.each(arguments,function(e,t){var r;while((r=x.inArray(t,l,r))>-1)l.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?x.inArray(e,l)>-1:!(!l||!l.length)},empty:function(){return l=[],o=0,this},disable:function(){return l=u=r=t,this},disabled:function(){return!l},lock:function(){return u=t,r||p.disable(),this},locked:function(){return!u},fireWith:function(e,t){return!l||i&&!u||(t=t||[],t=[e,t.slice?t.slice():t],n?u.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},x.extend({Deferred:function(e){var t=[["resolve","done",x.Callbacks("once memory"),"resolved"],["reject","fail",x.Callbacks("once memory"),"rejected"],["notify","progress",x.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var a=o[0],s=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=g.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?g.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,l,u;if(r>1)for(s=Array(r),l=Array(r),u=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(a(t,u,n)).fail(o.reject).progress(a(t,l,s)):--i;return i||o.resolveWith(u,n),o.promise()}}),x.support=function(t){var n,r,o,s,l,u,c,p,f,d=a.createElement("div");if(d.setAttribute("className","t"),d.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",n=d.getElementsByTagName("*")||[],r=d.getElementsByTagName("a")[0],!r||!r.style||!n.length)return t;s=a.createElement("select"),u=s.appendChild(a.createElement("option")),o=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t.getSetAttribute="t"!==d.className,t.leadingWhitespace=3===d.firstChild.nodeType,t.tbody=!d.getElementsByTagName("tbody").length,t.htmlSerialize=!!d.getElementsByTagName("link").length,t.style=/top/.test(r.getAttribute("style")),t.hrefNormalized="/a"===r.getAttribute("href"),t.opacity=/^0.5/.test(r.style.opacity),t.cssFloat=!!r.style.cssFloat,t.checkOn=!!o.value,t.optSelected=u.selected,t.enctype=!!a.createElement("form").enctype,t.html5Clone="<:nav></:nav>"!==a.createElement("nav").cloneNode(!0).outerHTML,t.inlineBlockNeedsLayout=!1,t.shrinkWrapBlocks=!1,t.pixelPosition=!1,t.deleteExpando=!0,t.noCloneEvent=!0,t.reliableMarginRight=!0,t.boxSizingReliable=!0,o.checked=!0,t.noCloneChecked=o.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!u.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}o=a.createElement("input"),o.setAttribute("value",""),t.input=""===o.getAttribute("value"),o.value="t",o.setAttribute("type","radio"),t.radioValue="t"===o.value,o.setAttribute("checked","t"),o.setAttribute("name","t"),l=a.createDocumentFragment(),l.appendChild(o),t.appendChecked=o.checked,t.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip;for(f in x(t))break;return t.ownLast="0"!==f,x(function(){var n,r,o,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",l=a.getElementsByTagName("body")[0];l&&(n=a.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",l.appendChild(n).appendChild(d),d.innerHTML="<table><tr><td></td><td>t</td></tr></table>",o=d.getElementsByTagName("td"),o[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===o[0].offsetHeight,o[0].style.display="",o[1].style.display="none",t.reliableHiddenOffsets=p&&0===o[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",x.swap(l,null!=l.style.zoom?{zoom:1}:{},function(){t.boxSizing=4===d.offsetWidth}),e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(a.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="<div></div>",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(l.style.zoom=1)),l.removeChild(n),n=d=o=r=null)}),n=s=l=u=r=o=null,t
+}({});var B=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;function R(e,n,r,i){if(x.acceptData(e)){var o,a,s=x.expando,l=e.nodeType,u=l?x.cache:e,c=l?e[s]:e[s]&&s;if(c&&u[c]&&(i||u[c].data)||r!==t||"string"!=typeof n)return c||(c=l?e[s]=p.pop()||x.guid++:s),u[c]||(u[c]=l?{}:{toJSON:x.noop}),("object"==typeof n||"function"==typeof n)&&(i?u[c]=x.extend(u[c],n):u[c].data=x.extend(u[c].data,n)),a=u[c],i||(a.data||(a.data={}),a=a.data),r!==t&&(a[x.camelCase(n)]=r),"string"==typeof n?(o=a[n],null==o&&(o=a[x.camelCase(n)])):o=a,o}}function W(e,t,n){if(x.acceptData(e)){var r,i,o=e.nodeType,a=o?x.cache:e,s=o?e[x.expando]:x.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){x.isArray(t)?t=t.concat(x.map(t,x.camelCase)):t in r?t=[t]:(t=x.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;while(i--)delete r[t[i]];if(n?!I(r):!x.isEmptyObject(r))return}(n||(delete a[s].data,I(a[s])))&&(o?x.cleanData([e],!0):x.support.deleteExpando||a!=a.window?delete a[s]:a[s]=null)}}}x.extend({cache:{},noData:{applet:!0,embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?x.cache[e[x.expando]]:e[x.expando],!!e&&!I(e)},data:function(e,t,n){return R(e,t,n)},removeData:function(e,t){return W(e,t)},_data:function(e,t,n){return R(e,t,n,!0)},_removeData:function(e,t){return W(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&x.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),x.fn.extend({data:function(e,n){var r,i,o=null,a=0,s=this[0];if(e===t){if(this.length&&(o=x.data(s),1===s.nodeType&&!x._data(s,"parsedAttrs"))){for(r=s.attributes;r.length>a;a++)i=r[a].name,0===i.indexOf("data-")&&(i=x.camelCase(i.slice(5)),$(s,i,o[i]));x._data(s,"parsedAttrs",!0)}return o}return"object"==typeof e?this.each(function(){x.data(this,e)}):arguments.length>1?this.each(function(){x.data(this,e,n)}):s?$(s,e,x.data(s,e)):null},removeData:function(e){return this.each(function(){x.removeData(this,e)})}});function $(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(P,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:B.test(r)?x.parseJSON(r):r}catch(o){}x.data(e,n,r)}else r=t}return r}function I(e){var t;for(t in e)if(("data"!==t||!x.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}x.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=x._data(e,n),r&&(!i||x.isArray(r)?i=x._data(e,n,x.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=x.queue(e,t),r=n.length,i=n.shift(),o=x._queueHooks(e,t),a=function(){x.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return x._data(e,n)||x._data(e,n,{empty:x.Callbacks("once memory").add(function(){x._removeData(e,t+"queue"),x._removeData(e,n)})})}}),x.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?x.queue(this[0],e):n===t?this:this.each(function(){var t=x.queue(this,e,n);x._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&x.dequeue(this,e)})},dequeue:function(e){return this.each(function(){x.dequeue(this,e)})},delay:function(e,t){return e=x.fx?x.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=x.Deferred(),a=this,s=this.length,l=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=x._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(l));return l(),o.promise(n)}});var z,X,U=/[\t\r\n\f]/g,V=/\r/g,Y=/^(?:input|select|textarea|button|object)$/i,J=/^(?:a|area)$/i,G=/^(?:checked|selected)$/i,Q=x.support.getSetAttribute,K=x.support.input;x.fn.extend({attr:function(e,t){return x.access(this,x.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){x.removeAttr(this,e)})},prop:function(e,t){return x.access(this,x.prop,e,t,arguments.length>1)},removeProp:function(e){return e=x.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,l="string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).addClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=x.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,l=0===arguments.length||"string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).removeClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?x.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):x.isFunction(e)?this.each(function(n){x(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var t,r=0,o=x(this),a=e.match(T)||[];while(t=a[r++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else(n===i||"boolean"===n)&&(this.className&&x._data(this,"__className__",this.className),this.className=this.className||e===!1?"":x._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(U," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=x.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=i?e.call(this,n,x(this).val()):e,null==o?o="":"number"==typeof o?o+="":x.isArray(o)&&(o=x.map(o,function(e){return null==e?"":e+""})),r=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(V,""):null==n?"":n)}}}),x.extend({valHooks:{option:{get:function(e){var t=x.find.attr(e,"value");return null!=t?t:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,l=0>i?s:o?i:0;for(;s>l;l++)if(n=r[l],!(!n.selected&&l!==i||(x.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&x.nodeName(n.parentNode,"optgroup"))){if(t=x(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n,r,i=e.options,o=x.makeArray(t),a=i.length;while(a--)r=i[a],(r.selected=x.inArray(x(r).val(),o)>=0)&&(n=!0);return n||(e.selectedIndex=-1),o}}},attr:function(e,n,r){var o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return typeof e.getAttribute===i?x.prop(e,n,r):(1===s&&x.isXMLDoc(e)||(n=n.toLowerCase(),o=x.attrHooks[n]||(x.expr.match.bool.test(n)?X:z)),r===t?o&&"get"in o&&null!==(a=o.get(e,n))?a:(a=x.find.attr(e,n),null==a?t:a):null!==r?o&&"set"in o&&(a=o.set(e,r,n))!==t?a:(e.setAttribute(n,r+""),r):(x.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(T);if(o&&1===e.nodeType)while(n=o[i++])r=x.propFix[n]||n,x.expr.match.bool.test(n)?K&&Q||!G.test(n)?e[r]=!1:e[x.camelCase("default-"+n)]=e[r]=!1:x.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!x.support.radioValue&&"radio"===t&&x.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{"for":"htmlFor","class":"className"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!x.isXMLDoc(e),a&&(n=x.propFix[n]||n,o=x.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var t=x.find.attr(e,"tabindex");return t?parseInt(t,10):Y.test(e.nodeName)||J.test(e.nodeName)&&e.href?0:-1}}}}),X={set:function(e,t,n){return t===!1?x.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&x.propFix[n]||n,n):e[x.camelCase("default-"+n)]=e[n]=!0,n}},x.each(x.expr.match.bool.source.match(/\w+/g),function(e,n){var r=x.expr.attrHandle[n]||x.find.attr;x.expr.attrHandle[n]=K&&Q||!G.test(n)?function(e,n,i){var o=x.expr.attrHandle[n],a=i?t:(x.expr.attrHandle[n]=t)!=r(e,n,i)?n.toLowerCase():null;return x.expr.attrHandle[n]=o,a}:function(e,n,r){return r?t:e[x.camelCase("default-"+n)]?n.toLowerCase():null}}),K&&Q||(x.attrHooks.value={set:function(e,n,r){return x.nodeName(e,"input")?(e.defaultValue=n,t):z&&z.set(e,n,r)}}),Q||(z={set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},x.expr.attrHandle.id=x.expr.attrHandle.name=x.expr.attrHandle.coords=function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&""!==i.value?i.value:null},x.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&r.specified?r.value:t},set:z.set},x.attrHooks.contenteditable={set:function(e,t,n){z.set(e,""===t?!1:t,n)}},x.each(["width","height"],function(e,n){x.attrHooks[n]={set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}}})),x.support.hrefNormalized||x.each(["href","src"],function(e,t){x.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),x.support.style||(x.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),x.support.optSelected||(x.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){x.propFix[this.toLowerCase()]=this}),x.support.enctype||(x.propFix.enctype="encoding"),x.each(["radio","checkbox"],function(){x.valHooks[this]={set:function(e,n){return x.isArray(n)?e.checked=x.inArray(x(e).val(),n)>=0:t}},x.support.checkOn||(x.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}function at(){try{return a.activeElement}catch(e){}}x.event={global:{},add:function(e,n,r,o,a){var s,l,u,c,p,f,d,h,g,m,y,v=x._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=x.guid++),(l=v.events)||(l=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof x===i||e&&x.event.triggered===e.type?t:x.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(T)||[""],u=n.length;while(u--)s=rt.exec(n[u])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),g&&(p=x.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=x.event.special[g]||{},d=x.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&x.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=l[g])||(h=l[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),x.event.global[g]=!0);e=null}},remove:function(e,t,n,r,i){var o,a,s,l,u,c,p,f,d,h,g,m=x.hasData(e)&&x._data(e);if(m&&(c=m.events)){t=(t||"").match(T)||[""],u=t.length;while(u--)if(s=rt.exec(t[u])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=x.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),l=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));l&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||x.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)x.event.remove(e,d+t[u],n,r,!0);x.isEmptyObject(c)&&(delete m.handle,x._removeData(e,"events"))}},trigger:function(n,r,i,o){var s,l,u,c,p,f,d,h=[i||a],g=v.call(n,"type")?n.type:n,m=v.call(n,"namespace")?n.namespace.split("."):[];if(u=f=i=i||a,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+x.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),l=0>g.indexOf(":")&&"on"+g,n=n[x.expando]?n:new x.Event(g,"object"==typeof n&&n),n.isTrigger=o?2:3,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:x.makeArray(r,[n]),p=x.event.special[g]||{},o||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!o&&!p.noBubble&&!x.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(u=u.parentNode);u;u=u.parentNode)h.push(u),f=u;f===(i.ownerDocument||a)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((u=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(x._data(u,"events")||{})[n.type]&&x._data(u,"handle"),s&&s.apply(u,r),s=l&&u[l],s&&x.acceptData(u)&&s.apply&&s.apply(u,r)===!1&&n.preventDefault();if(n.type=g,!o&&!n.isDefaultPrevented()&&(!p._default||p._default.apply(h.pop(),r)===!1)&&x.acceptData(i)&&l&&i[g]&&!x.isWindow(i)){f=i[l],f&&(i[l]=null),x.event.triggered=g;try{i[g]()}catch(y){}x.event.triggered=t,f&&(i[l]=f)}return n.result}},dispatch:function(e){e=x.event.fix(e);var n,r,i,o,a,s=[],l=g.call(arguments),u=(x._data(this,"events")||{})[e.type]||[],c=x.event.special[e.type]||{};if(l[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=x.event.handlers.call(this,e,u),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((x.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,l),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],l=n.delegateCount,u=e.target;if(l&&u.nodeType&&(!e.button||"click"!==e.type))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(o=[],a=0;l>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?x(r,this).index(u)>=0:x.find(r,this,null,[u]).length),o[r]&&o.push(i);o.length&&s.push({elem:u,handlers:o})}return n.length>l&&s.push({elem:this,handlers:n.slice(l)}),s},fix:function(e){if(e[x.expando])return e;var t,n,r,i=e.type,o=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new x.Event(o),t=r.length;while(t--)n=r[t],e[n]=o[n];return e.target||(e.target=o.srcElement||a),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,o):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,o,s=n.button,l=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||a,o=i.documentElement,r=i.body,e.pageX=n.clientX+(o&&o.scrollLeft||r&&r.scrollLeft||0)-(o&&o.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(o&&o.scrollTop||r&&r.scrollTop||0)-(o&&o.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&l&&(e.relatedTarget=l===e.target?n.toElement:l),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==at()&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===at()&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},click:{trigger:function(){return x.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t},_default:function(e){return x.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=x.extend(new x.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?x.event.trigger(i,null,t):x.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},x.removeEvent=a.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},x.Event=function(e,n){return this instanceof x.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&x.extend(this,n),this.timeStamp=e&&e.timeStamp||x.now(),this[x.expando]=!0,t):new x.Event(e,n)},x.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},x.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){x.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!x.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),x.support.submitBubbles||(x.event.special.submit={setup:function(){return x.nodeName(this,"form")?!1:(x.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=x.nodeName(n,"input")||x.nodeName(n,"button")?n.form:t;r&&!x._data(r,"submitBubbles")&&(x.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),x._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&x.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return x.nodeName(this,"form")?!1:(x.event.remove(this,"._submit"),t)}}),x.support.changeBubbles||(x.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(x.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),x.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),x.event.simulate("change",this,e,!0)})),!1):(x.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!x._data(t,"changeBubbles")&&(x.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||x.event.simulate("change",this.parentNode,e,!0)}),x._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return x.event.remove(this,"._change"),!Z.test(this.nodeName)}}),x.support.focusinBubbles||x.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){x.event.simulate(t,e.target,x.event.fix(e),!0)};x.event.special[t]={setup:function(){0===n++&&a.addEventListener(e,r,!0)},teardown:function(){0===--n&&a.removeEventListener(e,r,!0)}}}),x.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return x().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=x.guid++)),this.each(function(){x.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,x(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){x.event.remove(this,e,r,n)})},trigger:function(e,t){return this.each(function(){x.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?x.event.trigger(e,n,r,!0):t}});var st=/^.[^:#\[\.,]*$/,lt=/^(?:parents|prev(?:Until|All))/,ut=x.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};x.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(x(e).filter(function(){for(t=0;i>t;t++)if(x.contains(r[t],this))return!0}));for(t=0;i>t;t++)x.find(e,r[t],n);return n=this.pushStack(i>1?x.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},has:function(e){var t,n=x(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(x.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e||[],!0))},filter:function(e){return this.pushStack(ft(this,e||[],!1))},is:function(e){return!!ft(this,"string"==typeof e&&ut.test(e)?x(e):e||[],!1).length},closest:function(e,t){var n,r=0,i=this.length,o=[],a=ut.test(e)||"string"!=typeof e?x(e,t||this.context):0;for(;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(11>n.nodeType&&(a?a.index(n)>-1:1===n.nodeType&&x.find.matchesSelector(n,e))){n=o.push(n);break}return this.pushStack(o.length>1?x.unique(o):o)},index:function(e){return e?"string"==typeof e?x.inArray(this[0],x(e)):x.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?x(e,t):x.makeArray(e&&e.nodeType?[e]:e),r=x.merge(this.get(),n);return this.pushStack(x.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}x.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return x.dir(e,"parentNode")},parentsUntil:function(e,t,n){return x.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return x.dir(e,"nextSibling")},prevAll:function(e){return x.dir(e,"previousSibling")},nextUntil:function(e,t,n){return x.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return x.dir(e,"previousSibling",n)},siblings:function(e){return x.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return x.sibling(e.firstChild)},contents:function(e){return x.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:x.merge([],e.childNodes)}},function(e,t){x.fn[e]=function(n,r){var i=x.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=x.filter(r,i)),this.length>1&&(ct[e]||(i=x.unique(i)),lt.test(e)&&(i=i.reverse())),this.pushStack(i)}}),x.extend({filter:function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?x.find.matchesSelector(r,e)?[r]:[]:x.find.matches(e,x.grep(t,function(e){return 1===e.nodeType}))},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!x(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return x.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(st.test(t))return x.filter(t,e,n);t=x.filter(t,e)}return x.grep(e,function(e){return x.inArray(e,t)>=0!==n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/<tbody/i,wt=/<|&#?\w+;/,Tt=/<(?:script|style|link)/i,Ct=/^(?:checkbox|radio)$/i,Nt=/checked\s*(?:[^=]|=\s*.checked.)/i,kt=/^$|\/(?:java|ecma)script/i,Et=/^true\/(.*)/,St=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,At={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:x.support.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},jt=dt(a),Dt=jt.appendChild(a.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,x.fn.extend({text:function(e){return x.access(this,function(e){return e===t?x.text(this):this.empty().append((this[0]&&this[0].ownerDocument||a).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?x.filter(e,this):this,i=0;for(;null!=(n=r[i]);i++)t||1!==n.nodeType||x.cleanData(Ft(n)),n.parentNode&&(t&&x.contains(n.ownerDocument,n)&&_t(Ft(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&x.cleanData(Ft(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&x.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return x.clone(this,e,t)})},html:function(e){return x.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!x.support.htmlSerialize&&mt.test(e)||!x.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1></$2>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(x.cleanData(Ft(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=x.map(this,function(e){return[e.nextSibling,e.parentNode]}),t=0;return this.domManip(arguments,function(n){var r=e[t++],i=e[t++];i&&(r&&r.parentNode!==i&&(r=this.nextSibling),x(this).remove(),i.insertBefore(n,r))},!0),t?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t,n){e=d.apply([],e);var r,i,o,a,s,l,u=0,c=this.length,p=this,f=c-1,h=e[0],g=x.isFunction(h);if(g||!(1>=c||"string"!=typeof h||x.support.checkClone)&&Nt.test(h))return this.each(function(r){var i=p.eq(r);g&&(e[0]=h.call(this,r,i.html())),i.domManip(e,t,n)});if(c&&(l=x.buildFragment(e,this[0].ownerDocument,!1,!n&&this),r=l.firstChild,1===l.childNodes.length&&(l=r),r)){for(a=x.map(Ft(l,"script"),Ht),o=a.length;c>u;u++)i=l,u!==f&&(i=x.clone(i,!0,!0),o&&x.merge(a,Ft(i,"script"))),t.call(this[u],i,u);if(o)for(s=a[a.length-1].ownerDocument,x.map(a,qt),u=0;o>u;u++)i=a[u],kt.test(i.type||"")&&!x._data(i,"globalEval")&&x.contains(s,i)&&(i.src?x._evalUrl(i.src):x.globalEval((i.text||i.textContent||i.innerHTML||"").replace(St,"")));l=r=null}return this}});function Lt(e,t){return x.nodeName(e,"table")&&x.nodeName(1===t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function Ht(e){return e.type=(null!==x.find.attr(e,"type"))+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function _t(e,t){var n,r=0;for(;null!=(n=e[r]);r++)x._data(n,"globalEval",!t||x._data(t[r],"globalEval"))}function Mt(e,t){if(1===t.nodeType&&x.hasData(e)){var n,r,i,o=x._data(e),a=x._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)x.event.add(t,n,s[n][r])}a.data&&(a.data=x.extend({},a.data))}}function Ot(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!x.support.noCloneEvent&&t[x.expando]){i=x._data(t);for(r in i.events)x.removeEvent(t,r,i.handle);t.removeAttribute(x.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),x.support.html5Clone&&e.innerHTML&&!x.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Ct.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}x.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){x.fn[e]=function(e){var n,r=0,i=[],o=x(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),x(o[r])[t](n),h.apply(i,n.get());return this.pushStack(i)}});function Ft(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||x.nodeName(o,n)?s.push(o):x.merge(s,Ft(o,n));return n===t||n&&x.nodeName(e,n)?x.merge([e],s):s}function Bt(e){Ct.test(e.type)&&(e.defaultChecked=e.checked)}x.extend({clone:function(e,t,n){var r,i,o,a,s,l=x.contains(e.ownerDocument,e);if(x.support.html5Clone||x.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(x.support.noCloneEvent&&x.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(r=Ft(o),s=Ft(e),a=0;null!=(i=s[a]);++a)r[a]&&Ot(i,r[a]);if(t)if(n)for(s=s||Ft(e),r=r||Ft(o),a=0;null!=(i=s[a]);a++)Mt(i,r[a]);else Mt(e,o);return r=Ft(o,"script"),r.length>0&&_t(r,!l&&Ft(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,l,u,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===x.type(o))x.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),l=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[l]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1></$2>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!x.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!x.support.tbody){o="table"!==l||xt.test(o)?"<table>"!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)x.nodeName(u=o.childNodes[i],"tbody")&&!u.childNodes.length&&o.removeChild(u)}x.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),x.support.appendChecked||x.grep(Ft(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===x.inArray(o,r))&&(a=x.contains(o.ownerDocument,o),s=Ft(f.appendChild(o),"script"),a&&_t(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,l=x.expando,u=x.cache,c=x.support.deleteExpando,f=x.event.special;for(;null!=(n=e[s]);s++)if((t||x.acceptData(n))&&(o=n[l],a=o&&u[o])){if(a.events)for(r in a.events)f[r]?x.event.remove(n,r):x.removeEvent(n,r,a.handle);
+u[o]&&(delete u[o],c?delete n[l]:typeof n.removeAttribute!==i?n.removeAttribute(l):n[l]=null,p.push(o))}},_evalUrl:function(e){return x.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})}}),x.fn.extend({wrapAll:function(e){if(x.isFunction(e))return this.each(function(t){x(this).wrapAll(e.call(this,t))});if(this[0]){var t=x(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return x.isFunction(e)?this.each(function(t){x(this).wrapInner(e.call(this,t))}):this.each(function(){var t=x(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=x.isFunction(e);return this.each(function(n){x(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){x.nodeName(this,"body")||x(this).replaceWith(this.childNodes)}).end()}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+w+")(.*)$","i"),Yt=RegExp("^("+w+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+w+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===x.css(e,"display")||!x.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=x._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=x._data(r,"olddisplay",ln(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&x._data(r,"olddisplay",i?n:x.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}x.fn.extend({css:function(e,n){return x.access(this,function(e,n,r){var i,o,a={},s=0;if(x.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=x.css(e,n[s],!1,o);return a}return r!==t?x.style(e,n,r):x.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){nn(this)?x(this).show():x(this).hide()})}}),x.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":x.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,l=x.camelCase(n),u=e.style;if(n=x.cssProps[l]||(x.cssProps[l]=tn(u,l)),s=x.cssHooks[n]||x.cssHooks[l],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:u[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(x.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||x.cssNumber[l]||(r+="px"),x.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(u[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{u[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,l=x.camelCase(n);return n=x.cssProps[l]||(x.cssProps[l]=tn(e.style,l)),s=x.cssHooks[n]||x.cssHooks[l],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||x.isNumeric(o)?o||0:a):a}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s.getPropertyValue(n)||s[n]:t,u=e.style;return s&&(""!==l||x.contains(e.ownerDocument,e)||(l=x.style(e,n)),Yt.test(l)&&Ut.test(n)&&(i=u.width,o=u.minWidth,a=u.maxWidth,u.minWidth=u.maxWidth=u.width=l,l=s.width,u.width=i,u.minWidth=o,u.maxWidth=a)),l}):a.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s[n]:t,u=e.style;return null==l&&u&&u[n]&&(l=u[n]),Yt.test(l)&&!zt.test(n)&&(i=u.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),u.left="fontSize"===n?"1em":l,l=u.pixelLeft+"px",u.left=i,a&&(o.left=a)),""===l?"auto":l});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=x.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=x.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=x.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=x.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=x.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(x.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function ln(e){var t=a,n=Gt[e];return n||(n=un(e,t),"none"!==n&&n||(Pt=(Pt||x("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(t.documentElement),t=(Pt[0].contentWindow||Pt[0].contentDocument).document,t.write("<!doctype html><html><body>"),t.close(),n=un(e,t),Pt.detach()),Gt[e]=n),n}function un(e,t){var n=x(t.createElement(e)).appendTo(t.body),r=x.css(n[0],"display");return n.remove(),r}x.each(["height","width"],function(e,n){x.cssHooks[n]={get:function(e,r,i){return r?0===e.offsetWidth&&Xt.test(x.css(e,"display"))?x.swap(e,Qt,function(){return sn(e,n,i)}):sn(e,n,i):t},set:function(e,t,r){var i=r&&Rt(e);return on(e,t,r?an(e,n,r,x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,i),i):0)}}}),x.support.opacity||(x.cssHooks.opacity={get:function(e,t){return It.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=x.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===x.trim(o.replace($t,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=$t.test(o)?o.replace($t,i):o+" "+i)}}),x(function(){x.support.reliableMarginRight||(x.cssHooks.marginRight={get:function(e,n){return n?x.swap(e,{display:"inline-block"},Wt,[e,"marginRight"]):t}}),!x.support.pixelPosition&&x.fn.position&&x.each(["top","left"],function(e,n){x.cssHooks[n]={get:function(e,r){return r?(r=Wt(e,n),Yt.test(r)?x(e).position()[n]+"px":r):t}}})}),x.expr&&x.expr.filters&&(x.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight||!x.support.reliableHiddenOffsets&&"none"===(e.style&&e.style.display||x.css(e,"display"))},x.expr.filters.visible=function(e){return!x.expr.filters.hidden(e)}),x.each({margin:"",padding:"",border:"Width"},function(e,t){x.cssHooks[e+t]={expand:function(n){var r=0,i={},o="string"==typeof n?n.split(" "):[n];for(;4>r;r++)i[e+Zt[r]+t]=o[r]||o[r-2]||o[0];return i}},Ut.test(e)||(x.cssHooks[e+t].set=on)});var cn=/%20/g,pn=/\[\]$/,fn=/\r?\n/g,dn=/^(?:submit|button|image|reset|file)$/i,hn=/^(?:input|select|textarea|keygen)/i;x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=x.prop(this,"elements");return e?x.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!x(this).is(":disabled")&&hn.test(this.nodeName)&&!dn.test(e)&&(this.checked||!Ct.test(e))}).map(function(e,t){var n=x(this).val();return null==n?null:x.isArray(n)?x.map(n,function(e){return{name:t.name,value:e.replace(fn,"\r\n")}}):{name:t.name,value:n.replace(fn,"\r\n")}}).get()}}),x.param=function(e,n){var r,i=[],o=function(e,t){t=x.isFunction(t)?t():null==t?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(n===t&&(n=x.ajaxSettings&&x.ajaxSettings.traditional),x.isArray(e)||e.jquery&&!x.isPlainObject(e))x.each(e,function(){o(this.name,this.value)});else for(r in e)gn(r,e[r],n,o);return i.join("&").replace(cn,"+")};function gn(e,t,n,r){var i;if(x.isArray(t))x.each(t,function(t,i){n||pn.test(e)?r(e,i):gn(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==x.type(t))r(e,t);else for(i in t)gn(e+"["+i+"]",t[i],n,r)}x.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){x.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),x.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}});var mn,yn,vn=x.now(),bn=/\?/,xn=/#.*$/,wn=/([?&])_=[^&]*/,Tn=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Cn=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Nn=/^(?:GET|HEAD)$/,kn=/^\/\//,En=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,Sn=x.fn.load,An={},jn={},Dn="*/".concat("*");try{yn=o.href}catch(Ln){yn=a.createElement("a"),yn.href="",yn=yn.href}mn=En.exec(yn.toLowerCase())||[];function Hn(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(T)||[];if(x.isFunction(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function qn(e,n,r,i){var o={},a=e===jn;function s(l){var u;return o[l]=!0,x.each(e[l]||[],function(e,l){var c=l(n,r,i);return"string"!=typeof c||a||o[c]?a?!(u=c):t:(n.dataTypes.unshift(c),s(c),!1)}),u}return s(n.dataTypes[0])||!o["*"]&&s("*")}function _n(e,n){var r,i,o=x.ajaxSettings.flatOptions||{};for(i in n)n[i]!==t&&((o[i]?e:r||(r={}))[i]=n[i]);return r&&x.extend(!0,e,r),e}x.fn.load=function(e,n,r){if("string"!=typeof e&&Sn)return Sn.apply(this,arguments);var i,o,a,s=this,l=e.indexOf(" ");return l>=0&&(i=e.slice(l,e.length),e=e.slice(0,l)),x.isFunction(n)?(r=n,n=t):n&&"object"==typeof n&&(a="POST"),s.length>0&&x.ajax({url:e,type:a,dataType:"html",data:n}).done(function(e){o=arguments,s.html(i?x("<div>").append(x.parseHTML(e)).find(i):e)}).complete(r&&function(e,t){s.each(r,o||[e.responseText,t,e])}),this},x.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){x.fn[t]=function(e){return this.on(t,e)}}),x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:yn,type:"GET",isLocal:Cn.test(mn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Dn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":x.parseJSON,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?_n(_n(e,x.ajaxSettings),t):_n(x.ajaxSettings,e)},ajaxPrefilter:Hn(An),ajaxTransport:Hn(jn),ajax:function(e,n){"object"==typeof e&&(n=e,e=t),n=n||{};var r,i,o,a,s,l,u,c,p=x.ajaxSetup({},n),f=p.context||p,d=p.context&&(f.nodeType||f.jquery)?x(f):x.event,h=x.Deferred(),g=x.Callbacks("once memory"),m=p.statusCode||{},y={},v={},b=0,w="canceled",C={readyState:0,getResponseHeader:function(e){var t;if(2===b){if(!c){c={};while(t=Tn.exec(a))c[t[1].toLowerCase()]=t[2]}t=c[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===b?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return b||(e=v[n]=v[n]||e,y[e]=t),this},overrideMimeType:function(e){return b||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>b)for(t in e)m[t]=[m[t],e[t]];else C.always(e[C.status]);return this},abort:function(e){var t=e||w;return u&&u.abort(t),k(0,t),this}};if(h.promise(C).complete=g.add,C.success=C.done,C.error=C.fail,p.url=((e||p.url||yn)+"").replace(xn,"").replace(kn,mn[1]+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=x.trim(p.dataType||"*").toLowerCase().match(T)||[""],null==p.crossDomain&&(r=En.exec(p.url.toLowerCase()),p.crossDomain=!(!r||r[1]===mn[1]&&r[2]===mn[2]&&(r[3]||("http:"===r[1]?"80":"443"))===(mn[3]||("http:"===mn[1]?"80":"443")))),p.data&&p.processData&&"string"!=typeof p.data&&(p.data=x.param(p.data,p.traditional)),qn(An,p,n,C),2===b)return C;l=p.global,l&&0===x.active++&&x.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Nn.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(bn.test(o)?"&":"?")+p.data,delete p.data),p.cache===!1&&(p.url=wn.test(o)?o.replace(wn,"$1_="+vn++):o+(bn.test(o)?"&":"?")+"_="+vn++)),p.ifModified&&(x.lastModified[o]&&C.setRequestHeader("If-Modified-Since",x.lastModified[o]),x.etag[o]&&C.setRequestHeader("If-None-Match",x.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&C.setRequestHeader("Content-Type",p.contentType),C.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Dn+"; q=0.01":""):p.accepts["*"]);for(i in p.headers)C.setRequestHeader(i,p.headers[i]);if(p.beforeSend&&(p.beforeSend.call(f,C,p)===!1||2===b))return C.abort();w="abort";for(i in{success:1,error:1,complete:1})C[i](p[i]);if(u=qn(jn,p,n,C)){C.readyState=1,l&&d.trigger("ajaxSend",[C,p]),p.async&&p.timeout>0&&(s=setTimeout(function(){C.abort("timeout")},p.timeout));try{b=1,u.send(y,k)}catch(N){if(!(2>b))throw N;k(-1,N)}}else k(-1,"No Transport");function k(e,n,r,i){var c,y,v,w,T,N=n;2!==b&&(b=2,s&&clearTimeout(s),u=t,a=i||"",C.readyState=e>0?4:0,c=e>=200&&300>e||304===e,r&&(w=Mn(p,C,r)),w=On(p,w,C,c),c?(p.ifModified&&(T=C.getResponseHeader("Last-Modified"),T&&(x.lastModified[o]=T),T=C.getResponseHeader("etag"),T&&(x.etag[o]=T)),204===e||"HEAD"===p.type?N="nocontent":304===e?N="notmodified":(N=w.state,y=w.data,v=w.error,c=!v)):(v=N,(e||!N)&&(N="error",0>e&&(e=0))),C.status=e,C.statusText=(n||N)+"",c?h.resolveWith(f,[y,N,C]):h.rejectWith(f,[C,N,v]),C.statusCode(m),m=t,l&&d.trigger(c?"ajaxSuccess":"ajaxError",[C,p,c?y:v]),g.fireWith(f,[C,N]),l&&(d.trigger("ajaxComplete",[C,p]),--x.active||x.event.trigger("ajaxStop")))}return C},getJSON:function(e,t,n){return x.get(e,t,n,"json")},getScript:function(e,n){return x.get(e,t,n,"script")}}),x.each(["get","post"],function(e,n){x[n]=function(e,r,i,o){return x.isFunction(r)&&(o=o||i,i=r,r=t),x.ajax({url:e,type:n,dataType:o,data:r,success:i})}});function Mn(e,n,r){var i,o,a,s,l=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),o===t&&(o=e.mimeType||n.getResponseHeader("Content-Type"));if(o)for(s in l)if(l[s]&&l[s].test(o)){u.unshift(s);break}if(u[0]in r)a=u[0];else{for(s in r){if(!u[0]||e.converters[s+" "+u[0]]){a=s;break}i||(i=s)}a=a||i}return a?(a!==u[0]&&u.unshift(a),r[a]):t}function On(e,t,n,r){var i,o,a,s,l,u={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)u[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!l&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),l=o,o=c.shift())if("*"===o)o=l;else if("*"!==l&&l!==o){if(a=u[l+" "+o]||u["* "+o],!a)for(i in u)if(s=i.split(" "),s[1]===o&&(a=u[l+" "+s[0]]||u["* "+s[0]])){a===!0?a=u[i]:u[i]!==!0&&(o=s[0],c.unshift(s[1]));break}if(a!==!0)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(p){return{state:"parsererror",error:a?p:"No conversion from "+l+" to "+o}}}return{state:"success",data:t}}x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return x.globalEval(e),e}}}),x.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),x.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=a.head||x("head")[0]||a.documentElement;return{send:function(t,i){n=a.createElement("script"),n.async=!0,e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,t){(t||!n.readyState||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=null,n.parentNode&&n.parentNode.removeChild(n),n=null,t||i(200,"success"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(t,!0)}}}});var Fn=[],Bn=/(=)\?(?=&|$)|\?\?/;x.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Fn.pop()||x.expando+"_"+vn++;return this[e]=!0,e}}),x.ajaxPrefilter("json jsonp",function(n,r,i){var o,a,s,l=n.jsonp!==!1&&(Bn.test(n.url)?"url":"string"==typeof n.data&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Bn.test(n.data)&&"data");return l||"jsonp"===n.dataTypes[0]?(o=n.jsonpCallback=x.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,l?n[l]=n[l].replace(Bn,"$1"+o):n.jsonp!==!1&&(n.url+=(bn.test(n.url)?"&":"?")+n.jsonp+"="+o),n.converters["script json"]=function(){return s||x.error(o+" was not called"),s[0]},n.dataTypes[0]="json",a=e[o],e[o]=function(){s=arguments},i.always(function(){e[o]=a,n[o]&&(n.jsonpCallback=r.jsonpCallback,Fn.push(o)),s&&x.isFunction(a)&&a(s[0]),s=a=t}),"script"):t});var Pn,Rn,Wn=0,$n=e.ActiveXObject&&function(){var e;for(e in Pn)Pn[e](t,!0)};function In(){try{return new e.XMLHttpRequest}catch(t){}}function zn(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}x.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&In()||zn()}:In,Rn=x.ajaxSettings.xhr(),x.support.cors=!!Rn&&"withCredentials"in Rn,Rn=x.support.ajax=!!Rn,Rn&&x.ajaxTransport(function(n){if(!n.crossDomain||x.support.cors){var r;return{send:function(i,o){var a,s,l=n.xhr();if(n.username?l.open(n.type,n.url,n.async,n.username,n.password):l.open(n.type,n.url,n.async),n.xhrFields)for(s in n.xhrFields)l[s]=n.xhrFields[s];n.mimeType&&l.overrideMimeType&&l.overrideMimeType(n.mimeType),n.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");try{for(s in i)l.setRequestHeader(s,i[s])}catch(u){}l.send(n.hasContent&&n.data||null),r=function(e,i){var s,u,c,p;try{if(r&&(i||4===l.readyState))if(r=t,a&&(l.onreadystatechange=x.noop,$n&&delete Pn[a]),i)4!==l.readyState&&l.abort();else{p={},s=l.status,u=l.getAllResponseHeaders(),"string"==typeof l.responseText&&(p.text=l.responseText);try{c=l.statusText}catch(f){c=""}s||!n.isLocal||n.crossDomain?1223===s&&(s=204):s=p.text?200:404}}catch(d){i||o(-1,d)}p&&o(s,c,p,u)},n.async?4===l.readyState?setTimeout(r):(a=++Wn,$n&&(Pn||(Pn={},x(e).unload($n)),Pn[a]=r),l.onreadystatechange=r):r()},abort:function(){r&&r(t,!0)}}}});var Xn,Un,Vn=/^(?:toggle|show|hide)$/,Yn=RegExp("^(?:([+-])=|)("+w+")([a-z%]*)$","i"),Jn=/queueHooks$/,Gn=[nr],Qn={"*":[function(e,t){var n=this.createTween(e,t),r=n.cur(),i=Yn.exec(t),o=i&&i[3]||(x.cssNumber[e]?"":"px"),a=(x.cssNumber[e]||"px"!==o&&+r)&&Yn.exec(x.css(n.elem,e)),s=1,l=20;if(a&&a[3]!==o){o=o||a[3],i=i||[],a=+r||1;do s=s||".5",a/=s,x.style(n.elem,e,a+o);while(s!==(s=n.cur()/r)&&1!==s&&--l)}return i&&(a=n.start=+a||+r||0,n.unit=o,n.end=i[1]?a+(i[1]+1)*i[2]:+i[2]),n}]};function Kn(){return setTimeout(function(){Xn=t}),Xn=x.now()}function Zn(e,t,n){var r,i=(Qn[t]||[]).concat(Qn["*"]),o=0,a=i.length;for(;a>o;o++)if(r=i[o].call(n,t,e))return r}function er(e,t,n){var r,i,o=0,a=Gn.length,s=x.Deferred().always(function(){delete l.elem}),l=function(){if(i)return!1;var t=Xn||Kn(),n=Math.max(0,u.startTime+u.duration-t),r=n/u.duration||0,o=1-r,a=0,l=u.tweens.length;for(;l>a;a++)u.tweens[a].run(o);return s.notifyWith(e,[u,o,n]),1>o&&l?n:(s.resolveWith(e,[u]),!1)},u=s.promise({elem:e,props:x.extend({},t),opts:x.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Xn||Kn(),duration:n.duration,tweens:[],createTween:function(t,n){var r=x.Tween(e,u.opts,t,n,u.opts.specialEasing[t]||u.opts.easing);return u.tweens.push(r),r},stop:function(t){var n=0,r=t?u.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)u.tweens[n].run(1);return t?s.resolveWith(e,[u,t]):s.rejectWith(e,[u,t]),this}}),c=u.props;for(tr(c,u.opts.specialEasing);a>o;o++)if(r=Gn[o].call(u,e,c,u.opts))return r;return x.map(c,Zn,u),x.isFunction(u.opts.start)&&u.opts.start.call(e,u),x.fx.timer(x.extend(l,{elem:e,anim:u,queue:u.opts.queue})),u.progress(u.opts.progress).done(u.opts.done,u.opts.complete).fail(u.opts.fail).always(u.opts.always)}function tr(e,t){var n,r,i,o,a;for(n in e)if(r=x.camelCase(n),i=t[r],o=e[n],x.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),a=x.cssHooks[r],a&&"expand"in a){o=a.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}x.Animation=x.extend(er,{tweener:function(e,t){x.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Qn[n]=Qn[n]||[],Qn[n].unshift(t)},prefilter:function(e,t){t?Gn.unshift(e):Gn.push(e)}});function nr(e,t,n){var r,i,o,a,s,l,u=this,c={},p=e.style,f=e.nodeType&&nn(e),d=x._data(e,"fxshow");n.queue||(s=x._queueHooks(e,"fx"),null==s.unqueued&&(s.unqueued=0,l=s.empty.fire,s.empty.fire=function(){s.unqueued||l()}),s.unqueued++,u.always(function(){u.always(function(){s.unqueued--,x.queue(e,"fx").length||s.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],"inline"===x.css(e,"display")&&"none"===x.css(e,"float")&&(x.support.inlineBlockNeedsLayout&&"inline"!==ln(e.nodeName)?p.zoom=1:p.display="inline-block")),n.overflow&&(p.overflow="hidden",x.support.shrinkWrapBlocks||u.always(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t)if(i=t[r],Vn.exec(i)){if(delete t[r],o=o||"toggle"===i,i===(f?"hide":"show"))continue;c[r]=d&&d[r]||x.style(e,r)}if(!x.isEmptyObject(c)){d?"hidden"in d&&(f=d.hidden):d=x._data(e,"fxshow",{}),o&&(d.hidden=!f),f?x(e).show():u.done(function(){x(e).hide()}),u.done(function(){var t;x._removeData(e,"fxshow");for(t in c)x.style(e,t,c[t])});for(r in c)a=Zn(f?d[r]:0,r,u),r in d||(d[r]=a.start,f&&(a.end=a.start,a.start="width"===r||"height"===r?1:0))}}function rr(e,t,n,r,i){return new rr.prototype.init(e,t,n,r,i)}x.Tween=rr,rr.prototype={constructor:rr,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(x.cssNumber[n]?"":"px")},cur:function(){var e=rr.propHooks[this.prop];return e&&e.get?e.get(this):rr.propHooks._default.get(this)},run:function(e){var t,n=rr.propHooks[this.prop];return this.pos=t=this.options.duration?x.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):rr.propHooks._default.set(this),this}},rr.prototype.init.prototype=rr.prototype,rr.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=x.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){x.fx.step[e.prop]?x.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[x.cssProps[e.prop]]||x.cssHooks[e.prop])?x.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},rr.propHooks.scrollTop=rr.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},x.each(["toggle","show","hide"],function(e,t){var n=x.fn[t];x.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ir(t,!0),e,r,i)}}),x.fn.extend({fadeTo:function(e,t,n,r){return this.filter(nn).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=x.isEmptyObject(e),o=x.speed(t,n,r),a=function(){var t=er(this,x.extend({},e),o);(i||x._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return"string"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=null!=e&&e+"queueHooks",o=x.timers,a=x._data(this);if(n)a[n]&&a[n].stop&&i(a[n]);else for(n in a)a[n]&&a[n].stop&&Jn.test(n)&&i(a[n]);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(o[n].anim.stop(r),t=!1,o.splice(n,1));(t||!r)&&x.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=x._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=x.timers,a=r?r.length:0;for(n.finish=!0,x.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function ir(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Zt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}x.each({slideDown:ir("show"),slideUp:ir("hide"),slideToggle:ir("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){x.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),x.speed=function(e,t,n){var r=e&&"object"==typeof e?x.extend({},e):{complete:n||!n&&t||x.isFunction(e)&&e,duration:e,easing:n&&t||t&&!x.isFunction(t)&&t};return r.duration=x.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in x.fx.speeds?x.fx.speeds[r.duration]:x.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){x.isFunction(r.old)&&r.old.call(this),r.queue&&x.dequeue(this,r.queue)},r},x.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},x.timers=[],x.fx=rr.prototype.init,x.fx.tick=function(){var e,n=x.timers,r=0;for(Xn=x.now();n.length>r;r++)e=n[r],e()||n[r]!==e||n.splice(r--,1);n.length||x.fx.stop(),Xn=t},x.fx.timer=function(e){e()&&x.timers.push(e)&&x.fx.start()},x.fx.interval=13,x.fx.start=function(){Un||(Un=setInterval(x.fx.tick,x.fx.interval))},x.fx.stop=function(){clearInterval(Un),Un=null},x.fx.speeds={slow:600,fast:200,_default:400},x.fx.step={},x.expr&&x.expr.filters&&(x.expr.filters.animated=function(e){return x.grep(x.timers,function(t){return e===t.elem}).length}),x.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){x.offset.setOffset(this,e,t)});var n,r,o={top:0,left:0},a=this[0],s=a&&a.ownerDocument;if(s)return n=s.documentElement,x.contains(n,a)?(typeof a.getBoundingClientRect!==i&&(o=a.getBoundingClientRect()),r=or(s),{top:o.top+(r.pageYOffset||n.scrollTop)-(n.clientTop||0),left:o.left+(r.pageXOffset||n.scrollLeft)-(n.clientLeft||0)}):o},x.offset={setOffset:function(e,t,n){var r=x.css(e,"position");"static"===r&&(e.style.position="relative");var i=x(e),o=i.offset(),a=x.css(e,"top"),s=x.css(e,"left"),l=("absolute"===r||"fixed"===r)&&x.inArray("auto",[a,s])>-1,u={},c={},p,f;l?(c=i.position(),p=c.top,f=c.left):(p=parseFloat(a)||0,f=parseFloat(s)||0),x.isFunction(t)&&(t=t.call(e,n,o)),null!=t.top&&(u.top=t.top-o.top+p),null!=t.left&&(u.left=t.left-o.left+f),"using"in t?t.using.call(e,u):i.css(u)}},x.fn.extend({position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===x.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),x.nodeName(e[0],"html")||(n=e.offset()),n.top+=x.css(e[0],"borderTopWidth",!0),n.left+=x.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-x.css(r,"marginTop",!0),left:t.left-n.left-x.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||s;while(e&&!x.nodeName(e,"html")&&"static"===x.css(e,"position"))e=e.offsetParent;return e||s})}}),x.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);x.fn[e]=function(i){return x.access(this,function(e,i,o){var a=or(e);return o===t?a?n in a?a[n]:a.document.documentElement[i]:e[i]:(a?a.scrollTo(r?x(a).scrollLeft():o,r?o:x(a).scrollTop()):e[i]=o,t)},e,i,arguments.length,null)}});function or(e){return x.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}x.each({Height:"height",Width:"width"},function(e,n){x.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){x.fn[i]=function(i,o){var a=arguments.length&&(r||"boolean"!=typeof i),s=r||(i===!0||o===!0?"margin":"border");return x.access(this,function(n,r,i){var o;return x.isWindow(n)?n.document.documentElement["client"+e]:9===n.nodeType?(o=n.documentElement,Math.max(n.body["scroll"+e],o["scroll"+e],n.body["offset"+e],o["offset"+e],o["client"+e])):i===t?x.css(n,r,s):x.style(n,r,i,s)},n,a?i:t,a,null)}})}),x.fn.size=function(){return this.length},x.fn.andSelf=x.fn.addBack,"object"==typeof module&&module&&"object"==typeof module.exports?module.exports=x:(e.jQuery=e.$=x,"function"==typeof define&&define.amd&&define("jquery",[],function(){return x}))})(window);
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/webrunner/testrunner.js b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/webrunner/testrunner.js
new file mode 100644 (file)
index 0000000..9b2e69f
--- /dev/null
@@ -0,0 +1,792 @@
+/*
+Copyright (c) 2015 Samsung Electronics Co.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+  of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+  this list of conditions and the following disclaimer in the documentation
+  and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+  may be used to endorse or promote products derived from this work without
+  specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+
+*/
+var STUB_PORT = "";
+var RESOURCE_DIR = "/opt/usr/media";
+$.ajax({
+  url:RESOURCE_DIR + "/tct/portconfigure.json",
+  dataType:"json",
+  data:{},
+  async:false,
+  success:function(data){
+    STUB_PORT = data[0]["STUB_PORT"];
+  }
+});
+
+$(function(){
+ try {
+     // Checks if a device supports bluetooth API or not
+     var shape = tizen.systeminfo.getCapability("http://tizen.org/feature/screen.shape");
+    console.log("Shape = " + shape);
+     //alert(" Shape = " + shape);
+ } catch (error) {
+    // alert("Error name: " + error.name + ", message: " + error.message);
+    console.log("Error name: " + error.name + ", message: " + error.message);
+ }
+
+    if(shape=="circle"){
+       $('body').css('max-width', '100%');
+       $('body').css('max-height', '100%');
+       $('body').css('background-color', 'white');
+       $('body').css('margin-top', '20%');
+       $('body').css('margin-bottom', '20%');
+       $('body').css('margin-left', '20%');
+       $('body').css('margin-right', '20%');
+       }
+});
+(function (window){
+       function TestRunner() {
+               this.start = null;
+               this.ui = null;
+               this.submitResult = null;
+               this.report = function (result, message) {};
+               this.doTest = function () {};
+       }
+
+       TestRunner.prototype = (function () {
+               var index = -1;
+               var Tests = [];
+               var Sets =  {};
+               function newSummary() {
+                       return {"TOTAL": 0,
+                               "PASS" : 0,
+                               "FAIL" : 0,
+                               "BLOCK" : 0,
+                               "NOTRUN" : 0};
+               }
+               function newTestContext() {
+                       return {start_time: null,
+                               prev_uri: "",
+                               uri: "",
+                               sub_index: 0,
+                               onload_delay: 0
+                       };
+               }
+               function getParms () {
+                       var parms = {};
+                       var items = location.search.substring(1).split('&');
+                       for ( var i = 0, max = items.length; i < max; i++) {
+                               var pos = items[i].indexOf('=');
+                               if (pos > 0) {
+                                       var key = items[i].substring(0, pos);
+                                       var val = items[i].substring(pos + 1);
+                                       if (!parms[key]) {
+                                               var rawVal = decodeURI(val);
+                                               if (rawVal.indexOf(',') < 0)
+                                                       parms[key] = rawVal;
+                                               else
+                                                       parms[key] = rawVal.split(',');
+                                       }
+                               } else
+                                  parms[items[i]] = 1;
+                       }
+                       if (!parms.testsuite)
+                               parms.testsuite = 'tests.xml';
+                       return parms;
+               }
+               var parms = getParms();
+               var sum = newSummary();
+               var testContext =  newTestContext();
+               return { 
+                       constructor: TestRunner,
+                       options:  parms,
+                       getTestContext: function (field) {
+                               return testContext[field];
+                       },
+
+                       goNext: function () {
+                               if (Tests.length === 0) return false;
+                               if (index >= Tests.length) {
+                                       index = -1;
+                                       return false;
+                               }
+                               index++;
+                               return true;
+                       },
+       
+                       goPrev: function () {
+                               if (Tests.length === 0) return false;
+                               if (index < 0) {
+                                       index = Tests.length;
+                                       return false;
+                               }
+                               index--;
+                               return true;
+                       },
+
+                       runAll: function () {
+                               testContext = newTestContext();
+                               this.ui.updateView(VIEWFLAGS.add("batch"));
+                               this.ui.updateView(VIEWFLAGS.del("list"));
+                               this.testIndex(-1);     
+                               this.doTest();
+                       },
+       
+                       cleanTests: function () {
+                               Tests = [];
+                       },
+
+                       testIndex: function (ind) {
+                               if (typeof ind === "undefined")
+                                       return index;
+                               index = ind;
+                       },
+
+                       getTest: function (ind) {
+                               if (typeof ind === "undefined")
+                                       ind = index;
+                               return Tests[ind];
+                       },
+
+                       addTest: function (test) {
+                               if (test instanceof Array)
+                                       Tests = Tests.concat(test);
+                               else
+                                       Tests.push(test);
+                       },
+
+                       sumInit: function (num) {
+                               if (typeof num === "undefined")
+                                       num = Tests.length;
+                               sum.TOTAL = sum.NOTRUN = num;
+                               sum.PASS = sum.FAIL = sum.BLOCK = 0;
+                       },
+                       
+                       sumUpdate: function (oldRes, newRes, set) {
+                               if (oldRes !== null) {
+                                       sum[oldRes]--;
+                                       if (set !== null) Sets[set][oldRes]--;
+                               }
+                               if (newRes !== null) {
+                                       sum[newRes]++;
+                                       if (set != null) Sets[set][newRes]++;
+                               }
+                       },
+
+                       checkResult: function (oTestDoc) {
+                               var message = "";
+                               // Handle sub-index test
+                               if (testContext.sub_index > 0) {
+                                       var oRes = $(oTestDoc).find("table#results");
+                                       if (oRes.length == 0)
+                                               return false;
+                                       var ind = testContext.sub_index - 1;
+                                       var $n = $(oRes).find('tbody > tr').eq(ind);
+                                       if ($n.length == 0)
+                                               return false
+                                       var result = $n.children("td:eq(0)").text();
+                                       message = $n.children("td:eq(2)").text();
+                                       this.report(result.toUpperCase(), message);
+                                       return true;
+                               }
+
+                               var oPass = $(oTestDoc).find(".pass");
+                               var oFail = $(oTestDoc).find(".fail");
+                               // All tests pass
+                               if (oPass.length > 0 && oFail.length == 0) {
+                                       this.report('PASS', message);
+                                       return true;
+                               }
+                               // Handle failed tests
+                               if (oFail.length > 0) {
+                                       var oRes = $(oTestDoc).find("table#results");
+                                       $(oRes).find('tr.fail').each(function() {
+                                               message += " *" + $(this).children("td:eq(1)").text() + ": ";
+                                               message += $(this).children("td:eq(2)").text();
+                                       });
+                                       this.report('FAIL', message);
+                                       return true;
+                               }
+                               return false;
+                       },
+
+                       testInfo: function (ind) {
+                               var info = "";
+                               var tc = this.getTest();
+                               if (!tc) return info;
+                               info += "Test   : (" + (index + 1) + "/" + sum.TOTAL + ") ";
+                               info += tc.test_script_entry;
+                               info += "\nPurpose: " +  tc.purpose;
+                               if (tc.pre_condition)
+                                       info += "\nPrecondition: " + tc.pre_condition;
+                               if (tc.steps)
+                                       info += "\n" + tc.steps;
+                               return info;
+                       },
+
+                       getTestCaseUrl: function () {
+                               function getUriField(uri, param) {
+                                       var querys = uri.split("?")
+                                       if (querys.length <= 1)
+                                               return "";
+                                       uri = querys[1];
+                                       var start = uri.indexOf(param);
+                                       if (start == -1)
+                                               return "";
+                                       start += param.length + 1;
+                                       var end = uri.indexOf("&", start);
+                                       if (end == -1)
+                                               return uri.substring(start);
+                                       return uri.substring(start, end);
+                               }
+                               var tc = this.getTest();
+                               if (!tc) return null;
+                               var delay = tc.onload_delay;
+                               if (delay)
+                                       testContext.onload_delay = parseInt(delay) * 1000;
+                               else
+                                       testContext.onload_delay = 5000;
+
+                               var uri = tc.test_script_entry;
+                               if (typeof this.options.testprefix !== "undefined") {
+                                       var pos = uri.indexOf('http://');
+                                       if (pos !== 0)
+                                               uri = this.options.testprefix + uri
+                               }
+                               var val = getUriField(uri, "value");
+                               if (val && tc.execution_type == "auto" && VIEWFLAGS.has("batch")) { // Need sub index in TC
+                                       testContext.sub_index = parseInt(val);
+                                       testContext.uri = uri.split("?")[0];
+                                       if (testContext.uri == testContext.prev_uri)
+                                               return "";
+                               } else {
+                                       testContext.uri = uri;
+                                       testContext.sub_index = 0;
+                               }
+                               testContext.prev_uri = testContext.uri;
+                               testContext.start_time = new Date();
+                               return testContext.uri;
+                       },
+
+                       loadReady: function () {
+                               if (!VIEWFLAGS.has("batch"))
+                                       return;
+                               if (!this.ui.testComplete()){
+                                       if (testContext.onload_delay > 0){
+                                               var tval = 500;
+                                               var self = this;
+                                               setTimeout(function() {self.loadReady();}, tval);
+                                               testContext.onload_delay -= tval;
+                                               return
+                                       }
+                                       this.report("BLOCK", "Timeout");
+                               }
+                               this.doTest();
+                       },
+
+                       getTestSum: function (include_set) {
+                               var sumdata = "<section><h3>Total:" + sum.TOTAL
+                                               + " Pass:<span style='color:green;'>" + sum.PASS
+                                               + "</span> Fail:<span style='color:red;'>" + sum.FAIL
+                                               + "</span> Block:<span style='color:orange;'>" + sum.BLOCK
+                                               + "</span> NotRun:<span style='color:black;'>" + sum.NOTRUN
+                                               + "</span></h3></section>";
+                               if (VIEWFLAGS.has("batch")) {
+                                       var tc = this.getTest();
+                                       if (tc) sumdata += "<h4><span style='background-color: wheat'>(#" + index + ") " + tc.id + "</span></h4>";
+                               }
+
+                               if (include_set) {
+                                       sumdata += "<p><table id='browse'><tr><th>TestSet</th>";
+                                       sumdata += "<th>Total</th><th>Pass</th><th>Fail</th><th>Block</th></tr>";
+                                       $.each(Sets, function (key, val){
+                                               sumdata += "<tr><td>" + key+ "</td>";
+                                               sumdata += "<td style='color:black;'>" + val.TOTAL + "</td>";
+                                               sumdata += "<td style='color:green;'>" + val.PASS + "</td>";
+                                               sumdata += "<td style='color:red;'>" + val.FAIL + "</td>";
+                                               sumdata += "<td style='color:orange;'>" + val.BLOCK + "</td></tr>";
+                                       });
+                                       sumdata += "</table>";
+                               }
+                               return sumdata;
+                       },
+
+                       getBrowseInfo: function () {
+                               var failList = passList = blockList = notrunList = "";
+                               function createTestList(tc, color, ind) {
+                                       var mtag = (tc.execution_type === "manual") ? "(M)" : ""; 
+                                       return "<li>" + mtag + "<a rel='" + ind + "' href='' style ='color:" + color + ";'>" + tc.id + "</a>" + "</li>";
+                               }
+                               Sets = {};
+                               $.each(Tests, function (ind ,val) {
+                                       if (this.set === null)
+                                               this.set = "default";
+                                       if (typeof Sets[this.set] === "undefined")
+                                               Sets[this.set] = newSummary(); 
+                                       Sets[this.set][this.result]++;
+                                       Sets[this.set]["TOTAL"]++;
+                                       if (this.result == "FAIL")
+                                               failList += createTestList(this, "red", ind);
+                                       if (this.result == "PASS")
+                                               passList += createTestList(this, "green", ind);
+                                       if (this.result == "BLOCK")
+                                               blockList += createTestList(this, "orange", ind);
+                                       if (this.result == "NOTRUN")
+                                               notrunList += createTestList(this, "black", ind);
+                               });
+                               var data = "<html><head><style>ul li {padding-bottom:0.8em;font-size: 1.3em;}";
+                               data += "html{font-family:DejaVu Sans, Bitstream Vera Sans, Arial, Sans;}</style></head><body>";
+                               if (notrunList)
+                                       data += "<section><h3>Notruns</h3><ul>" + notrunList + "</ul></section>";
+                               if (failList)
+                                       data += "<section><h3 style='color: red;'>Fails</h3><ul>" + failList + "</ul></section>";
+                               if (blockList)
+                                       data += "<section><h3 style='color: orange;'>Blocks</h3><ul>" + blockList + "</ul></section>";
+                               if (passList)
+                                       data += "<section><h3 style='color: green'>Passes</h3><ul>" + passList + "</ul></section>";
+                               data += "</body></html>";
+                               return data;
+                       },
+
+                       TestCase: function () {
+                               return {
+                                       id: null,
+                                       test_script_entry: null,
+                                       execution_type: "manual",
+                                       result: "NOTRUN",
+                                       purpose: "",
+                                       set: null,
+                                       pre_condition: "",
+                                       onload_delay: 0,
+                                       steps: "",
+                                       data: null};
+                       }
+               };
+          }());
+       // Standalone test runner
+       var master_runner = new TestRunner();
+       master_runner.start = function (ui) {
+               function filter(xml, self) {
+                       var set_ind = 0;
+                       var manuals = [];
+                       $(xml).find("set").each(function () {
+                               var setname = $(this).attr("name");
+                               if (!setname)
+                                       setname = "set" + set_ind;
+                               $(this).find("testcase").each(function () {
+                                       var v = $(this).attr('execution_type');
+                                       if (self.options.execution_type && v != self.options.execution_type
+                                                       && $.inArray(v, self.options.execution_type) < 0) {
+                                               $(this).remove();
+                                               return;
+                                       }
+                                       v = $(this).attr('priority');
+                                       if (self.options.priority && v != self.options.priority
+                                                       && $.inArray(v, self.options.priority) < 0){
+                                               $(this).remove();
+                                               return;
+                                       }
+                                       var test = self.TestCase();
+                                       test.id = $(this).attr("id");
+                                       test.execution_type = $(this).attr("execution_type");
+                                       test.test_script_entry = $(this).find("test_script_entry").text();
+                                       test.purpose = $(this).attr("purpose");
+                                       test.pre_condition = $(this).find("pre_condition").text();
+                                       test.onload_delay = $(this).attr("onload_delay");
+                                       test.result = "NOTRUN";
+                                       test.set = setname;
+                                       test.data = this;
+                                       if (test.execution_type === "auto")
+                                               self.addTest(test);
+                                       else
+                                               manuals.push(test);
+                               });
+                               set_ind++;
+                       });
+                       self.addTest(manuals);
+               }
+
+               var self = this;
+               ui.bind(self);
+               $.get(self.options.testsuite, null, function (xml) {
+                       self.internal.xmldoc = xml;
+                       filter(xml, self);
+                       self.sumInit();
+                       setTimeout(function () {
+                               self.ui.browse();
+                               setTimeout(function () {
+                                       if (self.options.autorun)
+                                               self.runAll();
+                               }, 2000);
+                       }, 100);
+               }, "xml");
+       };
+
+       master_runner.doTest = function () {
+               var self = this, tc = null;
+               while (self.goNext()) {
+                       tc = self.getTest();
+                       if (!tc || tc.execution_type === "manual")
+                               break;
+                       self.ui.updateTestInfo(self.testInfo(), null, null);
+                       self.ui.runTest(self.getTestCaseUrl());
+                       return;
+               }
+               if (self.options.autorun) {
+                       self.submitResult();
+                       close_window();
+                       return;
+               }
+               this.ui.updateView(VIEWFLAGS.del("batch"));
+               if (!tc) {
+                       setTimeout(function () {self.ui.browse();}, 500);
+                       return;
+               }
+               this.ui.updateTest();   
+       };
+
+       master_runner.report = function (result, log) {
+               var tc = this.getTest();
+               if (!tc) return;
+               var oldresult = tc.result;
+               this.sumUpdate(oldresult, result, tc.set);
+               tc.result = result;
+               $(tc.data).find('result_info').remove();
+               $(tc.data).attr('result', result);
+               var doc = $.parseXML("<result_info><actual_result>" + result +
+                                  "</actual_result><start>" + this.getTestContext("start_time") +
+                                  "</start><end>" + new Date() + "</end><stdout>" +
+                                  escape_html(log) + "</stdout></result_info>");
+               $(tc.data).append(doc.documentElement);
+               if (VIEWFLAGS.has("batch")) result = null;
+               this.ui.updateTestInfo(null, this.getTestSum(false), result);
+       };
+
+       master_runner.submitResult = function () {
+               var xmldoc = this.internal.xmldoc;
+               var contents = (new XMLSerializer()).serializeToString(xmldoc);
+               if (window.opener) window.opener.postMessage(contents, "*");
+       };
+
+       master_runner.internal = {xmldoc: null};
+
+       // Controlled test runner
+       var slave_runner = new TestRunner();
+       slave_runner.start = function (ui) {
+               function sync_session_id() {
+                       $.get(SERVER + "/init_session_id?session_id="
+                                         + self.internal.session_id);
+               }
+               var self = this;
+               self.internal.session_id = Math.round(Math.random() * 10000);
+               sync_session_id();
+               var next_step = self.internal.get_json("ask_next_step");
+               if (!next_step || next_step.step != "continue")
+                        return false;
+               ui.bind(self);
+               var f = function () {
+                       var p = self.internal.get_json("check_execution_progress");
+                       if (p) self.sumInit(parseInt(p.total));
+                       self.doTest();
+               };
+               self.ui.updateView(VIEWFLAGS.add("batch"));
+               self.ui.updateView(VIEWFLAGS.del("list"));
+               setTimeout(f, 1000);
+               return true;
+       };
+
+       slave_runner.doTest = function () {
+               var self = this;
+               if (self.internal.stage > 0) {
+                       self.ui.updateView(VIEWFLAGS.del("batch"));
+                       self.goNext();
+                       self.ui.updateTest();
+                       return;
+               }
+               var next_step = self.internal.get_json("ask_next_step");
+               if (next_step && next_step.step == "continue") {
+                       var task = self.internal.get_json("auto_test_task");
+                       if (task === null) {
+                               print_error("ask_test_task", "Fail get task");
+                       } else if (task.invalid === 0) {
+                               print_error("ask_test_task", "Invalid session");
+                       } else if (task.stop === 0) {
+                               print_error("ask_test_task", "close window");
+                       } else if (task.none !== 0) { //handle auto test
+                               var test = self.TestCase();
+                               test.id = task.case_id;
+                               test.onload_delay = task.onload_delay;
+                               test.test_script_entry = task.entry;
+                               test.execution_type = "auto";
+                               test.purpose = task.purpose;
+                               test.pre_condition = task.pre_condition;
+                               self.addTest(test);
+                               self.goNext();
+                               self.ui.updateTestInfo(self.testInfo(), null, null);
+                               self.ui.runTest(self.getTestCaseUrl());
+                               return;
+                       } else {  //handle manual test
+                               self.ui.updateView(VIEWFLAGS.del("batch"));
+                               self.internal.stage = 1;
+                               var mtask = self.internal.get_json("manual_cases");
+                               if (mtask && mtask.none != 0) {
+                                       self.cleanTests();
+                                       for (var i = 0, max = mtask.length; i < max; i++) {
+                                               var test = self.TestCase();
+                                               test.id = mtask[i].case_id;
+                                               test.test_script_entry = mtask[i].entry;
+                                               test.purpose = mtask[i].purpose;
+                                               test.pre_condition = mtask[i].pre_condition;
+                                               test.result = "NOTRUN";
+                                               test.execution_type = "manual";
+                                               test.index = i;
+                                               var steps = "";
+                                               $(mtask[i].steps).each(function () {
+                                                       steps += "Step-" + this.order + "\t: " + this.step_desc + "\n";
+                                                       steps += "Expect\t: " + this.expected + "\n";
+                                               });
+                                               test.steps = steps;
+                                               self.addTest(test);
+                                       }
+                                       self.ui.updateTest(-1);
+                                       self.sumInit();
+                                       self.ui.browse();
+                               } else
+                                       close_window();
+                               return;
+                       }
+               }
+               close_window();
+       };
+
+       slave_runner.report = function(result, log) {
+               var tc = this.getTest();
+               var oldresult;
+               if (this.internal.stage > 0) {
+                       this.internal.post_json("commit_manual_result",
+                               {"case_id": tc.id, "result": result});
+                       oldresult = tc.result
+                       tc.result = result;
+               } else {
+                       this.internal.post_json("commit_result",
+                               { "case_id" : tc.id,
+                                 "result" : result,
+                                 "msg" : "[Message]" + log,
+                                 "session_id" : this.internal.session_id});
+                       oldresult = "NOTRUN";
+               }
+               this.sumUpdate(oldresult, result, null);
+               if (VIEWFLAGS.has("batch")) result = null;
+               this.ui.updateTestInfo(null, this.getTestSum(false), result);
+       };
+
+       slave_runner.submitResult = function () {
+               $.get(SERVER + "/generate_xml");
+       };
+
+       slave_runner.internal = {
+               session_id: null,
+               stage: 0,
+               get_json: function (name) {
+                       var jsondata = null;
+                       $.getJSON(SERVER + "/" + name + "?session_id="
+                                + this.session_id, function(data) {
+                                        jsondata = data;});
+                       return jsondata; },
+               post_json: function (name, d) {
+                  $.post(SERVER + "/" + name, d, null, "json");
+               }
+       };
+
+       var i_ui = (function () {
+               var testinfo = $("#testinfo").get(0);
+               var frmTest = $("#frmTest").get(0);
+               var textTest  = $("#textTest").get(0);
+               var btnPass = $("#btnPass").get(0);
+               var btnFail = $("#btnFail").get(0);
+               var btnBlock = $("#btnBlock").get(0);
+               var btnDone = $("#btnDone").get(0);
+               var btnNext = $("#btnNext").get(0);
+               var btnPrev = $("#btnPrev").get(0);
+               var btnRun      = $("#btnRun").get(0);
+               var divSum = $("#divSum").get(0);
+               var btnList = $("#btnList").get(0);
+               var runner = null;
+               var listmode = null;
+               var nextTest = function () {
+                       runner.goNext();
+                       selectTest();
+               };
+
+               var prevTest = function() {
+                       runner.goPrev();
+                       selectTest();
+               };
+
+               var selectResult = function() {
+                       runner.report(this.value, "");
+               };
+
+               var selectTest = function () {
+                       frmTest.src = "";
+                       var tc = runner.getTest();
+                       if (!tc) {
+                               if (runner.testIndex() === -1)
+                                       textTest.value = "---Begin---";
+                               else
+                                       textTest.value = "---End---";
+                               changeColor("NOTRUN");
+                               return;
+                       }
+                       testinfo.value = runner.testInfo();
+                       $(divSum).html(runner.getTestSum(false));
+                       textTest.value = ((tc.execution_type === "manual") ? "(M)" : "") + tc.id;
+                       changeColor(tc.result);
+               };
+
+               function changeColor(result) {
+                       if (result === "PASS")
+                               $(textTest).css("backgroundColor", "lightgreen");
+                       else if (result === "FAIL")
+                               $(textTest).css("backgroundColor", "tomato");
+                       else if (result === "BLOCK")
+                               $(textTest).css("backgroundColor", "yellow");
+                       else
+                               $(textTest).css("backgroundColor", "white");
+               }
+
+               return {
+                       bind: function (r) {
+                               var self = this;
+                               r.ui = self;
+                               runner = r;
+                               $(btnPass).on("click", selectResult);
+                               $(btnFail).on("click", selectResult);
+                               $(btnBlock).on("click", selectResult);
+                               $(btnNext).on("click", nextTest);
+                               $(btnPrev).on("click", prevTest);
+                               $(btnRun).on("click",  function () {
+                                       if (VIEWFLAGS.has("list")) {
+                                               runner.runAll();
+                                       } else 
+                                               self.runTest(runner.getTestCaseUrl());
+                               });
+                               $(frmTest).on("load",  function () {runner.loadReady();});
+                               $(btnDone).on("click", function () {
+                                       runner.submitResult();
+                                       close_window();
+                               });
+                               $(btnList).on("click", function () {
+                                       frmTest.src = "";
+                                       //self.updateTest(-1);
+                                       setTimeout(function () {self.browse();}, 300);
+                               });
+                               frmTest.height = $(window).height();
+                       },
+               
+                       browse: function () {
+                               var tdoc = frmTest.contentWindow.document;
+                               tdoc.open("text/html", "replace");
+                               tdoc.writeln(runner.getBrowseInfo());
+                               var self = this;
+                               $(tdoc).find("section ul li>a").on("click", function (e) {
+                                       var ind = parseInt($(this).attr("rel"));
+                                       self.updateView(VIEWFLAGS.del("list")); 
+                                       self.updateTest(ind);
+                                       window.scrollTo(0, 0);
+                                       e.preventDefault();
+                               });
+                               $(divSum).html(runner.getTestSum(true));
+                               self.updateView(VIEWFLAGS.add("list")); 
+                       },
+       
+                       updateTest: function (ind) {
+                               if (typeof ind !== "undefined") runner.testIndex(ind);
+                               selectTest();
+                       },
+
+                       updateView: function (flags) {
+                               if (flags & VIEWFLAGS.flags.list) {
+                                       $(".listmode").show();
+                                       $(".singlemode").hide();
+                               } else {
+                                       $(".listmode").hide();
+                                       $(".singlemode").show();
+                               }
+                               if (flags & VIEWFLAGS.flags.batch)
+                                       $(".batchmode").hide();
+                               else
+                                       $(".batchmode").show();
+                       },
+
+                       testComplete: function () {
+                               return runner.checkResult(frmTest.contentWindow.document);
+                       },
+                       runTest: function (uri) {
+                               if (uri === null) return;
+                               if (uri)
+                                       frmTest.src = uri;
+                               else
+                                       runner.loadReady();
+                               
+                       },
+
+                       updateTestInfo: function (info, sum, result) {
+                               if (info !== null)
+                                       testinfo.value = info;
+                               if (sum !== null)
+                                       $(divSum).html(sum);
+                               if (result !== null)
+                                       changeColor(result);
+                       },
+          };
+       } ());
+
+       function escape_html(s) {
+               return s.replace(/\&/g, "&amp;").replace(/</g, "&lt;").replace(/"/g,
+                       "&quot;").replace(/'/g, "&#39;");
+       }
+
+       function print_error(command, message) {
+               console.warn("Command -" + command + ": " + message);
+       }
+
+       function close_window() {
+               setTimeout("window.open('','_self','');window.close()", 1000);
+       }
+
+       function pre_init() {
+               var runner_ok = false;
+               $.get(SERVER + "/check_server", function () {
+                       runner_ok = slave_runner.start(i_ui);
+               });
+               if (!runner_ok)
+                       master_runner.start(i_ui);
+       }
+       var SERVER = "http://127.0.0.1:"+STUB_PORT;
+       var VIEWFLAGS = { val: 0,
+               flags: {list: 1, batch: 2},
+               add: function (f) { this.val |= this.flags[f]; return this.val},
+               del: function (f) { this.val &= ~this.flags[f]; return this.val},
+               has: function (f) { return this.val & this.flags[f];},
+       };
+       $.ajaxSetup({ async: false});
+       $(window).on("ready", pre_init);
+})(window);
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/{TESTSUITE_NAME}.spec b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/plugin/web_templates/{TESTSUITE_NAME}.spec
new file mode 100644 (file)
index 0000000..9da7f3a
--- /dev/null
@@ -0,0 +1,22 @@
+name=$(basename $(pwd))
+main_version="2.4"
+release=""
+version="$main_version"
+appname=$(echo $name|sed 's/-/_/g')
+
+# set value "1" if this suite need to sign,otherwise set "0" #
+sign="1"
+
+# set value "1" if this suite need to keep src_file,otherwise set "0" #
+src_file="0"
+
+# specified files to be kept in whitelist #
+whitelist="
+inst.sh
+tests.xml
+tests.full.xml
+COPYING
+LICENSE.Apache-2.0
+LICENSE.CC-BY-3.0
+NOTICE
+mediasrc"
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/sdb/sdb-32 b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/sdb/sdb-32
new file mode 100644 (file)
index 0000000..a3f6c27
Binary files /dev/null and b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/sdb/sdb-32 differ
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/sdb/sdb-32.exe b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/sdb/sdb-32.exe
new file mode 100644 (file)
index 0000000..b522f56
Binary files /dev/null and b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/sdb/sdb-32.exe differ
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/sdb/sdb-64 b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/sdb/sdb-64
new file mode 100644 (file)
index 0000000..5ae10e3
Binary files /dev/null and b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/sdb/sdb-64 differ
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/sdb/sdb-64.exe b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/sdb/sdb-64.exe
new file mode 100644 (file)
index 0000000..b522f56
Binary files /dev/null and b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/sdb/sdb-64.exe differ
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/shell b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/shell
new file mode 160000 (submodule)
index 0000000..2f3dbe8
--- /dev/null
@@ -0,0 +1 @@
+Subproject commit 2f3dbe87e10508060d1f7f73eaa376d1c3ed4383
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/tct-config-tools.py b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/tct-config-tools.py
new file mode 100644 (file)
index 0000000..dcd4bc7
--- /dev/null
@@ -0,0 +1,336 @@
+#!/usr/bin/env python3
+import os
+import platform
+import shutil
+import stat
+import subprocess
+from optparse import OptionParser
+
+SDB_SERNO = "sdb"
+
+
+class CpFile:
+    sep = os.sep
+    TARGET_BASE_PATH = os.path.join(os.sep + "opt", "tools")
+    TARGET_BASE_LITE = os.path.join(os.sep + "opt", "testkit")
+
+    CURRENT_TARGET_BASE_PATH = ""
+    CURRENT_TARGET_LITE_PATH = ""
+    CURRENT_SOURCE_LITE_PATH = ""
+
+    #shell
+    SOURCE_SHELL_PATH = sep + "shell"
+    TARGET_SHELL_PATH = sep + "shell"
+    #manager
+    SOURCE_MANAGER_PATH = sep + "manager"
+    TARGET_MANAGER_PATH = sep + "manager"
+    #script
+    SOURCE_SCRIPT_PATH = ""
+    TARGET_SCRIPT_PATH = sep + "tools" + sep + "scripts"
+    #testkit1.0
+    SOURCE_TESTKIT_PATH1 = sep + "testkitlite_native"
+    TARGET_TESTKIT_PATH1 = sep + "lite_native"
+    #testkit2.0
+    SOURCE_TESTKIT_PATH2 = sep + "testkitlite_web_csharp"
+    TARGET_TESTKIT_PATH2 = sep + "lite_web_csharp"
+    #plugin
+    SOURCE_PLUGIN_PATH = sep + "plugin"
+    TARGET_PLUGIN_PATH = sep + "plugin"
+
+    def getCurrentOSBit(self):
+        return platform.architecture()
+
+    def setCurrentPath(self):
+        self.CURRENT_SOURCE_BASE_PATH = os.getcwd() + self.sep
+        self.CURRENT_TARGET_BASE_PATH = self.TARGET_BASE_PATH
+        self.CURRENT_TARGET_LITE_PATH = self.TARGET_BASE_LITE
+        print("current source base path =" + self.CURRENT_SOURCE_BASE_PATH)
+        print("current target base path =" + self.CURRENT_TARGET_BASE_PATH)
+
+    def cpSdb(self):
+        osInfo = self.getCurrentOSBit()
+        if (platform.system() == "Windows"):
+            if (str(osInfo[0]).find("64") != -1):
+                self.cpFile(
+                    self.CURRENT_SOURCE_BASE_PATH + self.SOURCE_SCRIPT_PATH + \
+                            self.sep + "sdb" + self.sep + "sdb-64.exe",
+                    self.CURRENT_TARGET_BASE_PATH + self.sep + "sdb.exe")
+            if (str(osInfo[0]).find("32") != -1):
+                self.cpFile(self.CURRENT_SOURCE_BASE_PATH + \
+                        self.SOURCE_SCRIPT_PATH + self.sep + "sdb" + self.sep \
+                        + "sdb-32.exe", self.CURRENT_TARGET_BASE_PATH + \
+                        self.sep + "sdb.exe")
+        else:
+            '''
+            # get status and output of the command
+            status, output = commands.getstatusoutput('lsof | \
+                    grep /usr/bin/sdb')
+            # merge continuing spaces to one
+            collapsedOutput = ' '.join(output.split())
+            # split words
+            result = collapsedOutput.split(' ')
+            # get the process id of the sdb
+            if status is not 256 :
+                # find the word sdb
+                for x in range(0, result.__len__()):
+                    if (result[x] == "sdb"):
+                        break
+                # get the process id of the sdb
+                os.system('kill -9 ' + result[x+1])
+            '''
+            try:
+
+                if(self.checkInstalledSdb()):
+                    print("sdb install is not required")
+                    return
+
+                print("sdb install")
+
+                if (str(osInfo[0]).find("64") != -1):
+                    self.cpFile(
+                        self.CURRENT_SOURCE_BASE_PATH + \
+                                self.SOURCE_SCRIPT_PATH + self.sep + "sdb" + \
+                                self.sep + "sdb-64",
+                        self.CURRENT_TARGET_BASE_PATH + self.sep + "sdb")
+                    self.cpFile(
+                        self.CURRENT_SOURCE_BASE_PATH + \
+                                self.SOURCE_SCRIPT_PATH + self.sep + "sdb" + \
+                                self.sep + "sdb-64",
+                        "/usr/bin/" + "sdb")
+                if (str(osInfo[0]).find("32") != -1):
+                    self.cpFile(
+                        self.CURRENT_SOURCE_BASE_PATH + \
+                                self.SOURCE_SCRIPT_PATH + self.sep + "sdb" + \
+                                self.sep + "sdb-32",
+                        self.CURRENT_TARGET_BASE_PATH + self.sep + "sdb")
+                    self.cpFile(
+                        self.CURRENT_SOURCE_BASE_PATH + \
+                                self.SOURCE_SCRIPT_PATH + self.sep + "sdb" + \
+                                self.sep + "sdb-32",
+                        "/usr/bin/" + "sdb")
+                os.system("chmod -R 777 /usr/bin/sdb")
+            except:
+                pass
+
+    def get_cmd_result(self, command):
+        p = subprocess.Popen(command,
+                         stdout=subprocess.PIPE,
+                         stderr=subprocess.STDOUT)
+        return p.stdout.readline()
+
+    def checkInstalledSdb(self):
+        cmd = ["sdb", "version"]
+        installedVer = ""
+        try:
+            output = str(self.get_cmd_result(cmd).split('\n')[0])
+            if output.find('Smart Development Bridge') > -1:
+                installedVer = output.split(' ')[4]
+            else:
+                raise
+        except:
+            print("sdb is not installed")
+            return False
+
+        osInfo = self.getCurrentOSBit()
+        if (str(osInfo[0]).find("32") != -1):
+            cmd = ["sdb/sdb-32", "version"]
+        else:
+            cmd = ["sdb/sdb-64", "version"]
+        toolVer = ""
+        try:
+            output = str(self.get_cmd_result(cmd).split('\n')[0])
+            if output.find('Smart Development Bridge') > -1:
+                toolVer = output.split(' ')[4]
+            else:
+                raise
+        except:
+            print("tool's sdb is not valid")
+            return True
+
+        print("installed sdb version : %s / tool's sdb version : %s" % (installedVer, toolVer))
+        installedSplit = installedVer.split('.')
+        toolSplit = toolVer.split('.')
+        hit = 0
+        for i in range(0, 3):
+            if(int(installedSplit[i]) > int(toolSplit[i])):
+                print("Higher version sdb is already installed : " + installedVer)
+                return True
+            if(int(installedSplit[i]) == int(toolSplit[i])):
+                hit += 1
+                continue
+            if(int(installedSplit[i]) < int(toolSplit[i])):
+                break
+        if(hit==3):
+            print("Same version of sdb is already installed : " + installedVer)
+            return True
+
+        return False
+
+    def cpOtherFiles(self):
+        tct_mgr = "tct-mgr"
+        tct_shell = "tct-shell"
+        testkit_lite1 = "testkit-lite_native"
+        testkit_lite2 = "testkit-lite_web_csharp"
+        tct_config = "TCT_CONFIG"
+
+        if (platform.system() == "Windows"):
+            tct_mgr = "tct-mgr.bat"
+
+        self.cpFile(self.CURRENT_SOURCE_BASE_PATH + self.SOURCE_SCRIPT_PATH + \
+                self.sep + tct_mgr, self.CURRENT_TARGET_BASE_PATH + \
+                self.sep + tct_mgr)
+        self.cpFile(self.CURRENT_SOURCE_BASE_PATH + self.SOURCE_SCRIPT_PATH + \
+                self.sep + tct_shell, self.CURRENT_TARGET_BASE_PATH + \
+                self.sep + tct_shell)
+        self.cpFile(self.CURRENT_SOURCE_BASE_PATH + self.SOURCE_SCRIPT_PATH + \
+                self.sep + testkit_lite1, self.CURRENT_TARGET_BASE_PATH + \
+                self.sep + testkit_lite1)
+        self.cpFile(self.CURRENT_SOURCE_BASE_PATH + self.SOURCE_SCRIPT_PATH + \
+                self.sep + testkit_lite2, self.CURRENT_TARGET_BASE_PATH + \
+                self.sep + testkit_lite2)
+        self.cpFile(self.CURRENT_SOURCE_BASE_PATH + self.SOURCE_SCRIPT_PATH + \
+                self.sep + tct_config, self.CURRENT_TARGET_BASE_PATH + \
+                self.sep + tct_config)
+
+    def cpOtherFilesToBinDir(self):
+        tct_mgr = "tct-mgr"
+        tct_shell = "tct-shell"
+        testkit_lite1 = "testkit-lite_native"
+        testkit_lite2 = "testkit-lite_web_csharp"
+
+        if (platform.system() != "Windows"):
+            self.cpFile(self.CURRENT_SOURCE_BASE_PATH + \
+                    self.SOURCE_SCRIPT_PATH + self.sep + \
+                    tct_mgr, "/usr/bin/" + tct_mgr)
+            self.cpFile(self.CURRENT_SOURCE_BASE_PATH + \
+                    self.SOURCE_SCRIPT_PATH + self.sep + \
+                    tct_shell, "/usr/bin/" + tct_shell)
+            self.cpFile(self.CURRENT_SOURCE_BASE_PATH + \
+                    self.SOURCE_SCRIPT_PATH + self.sep + testkit_lite1,\
+                    "/usr/bin/" + testkit_lite1)
+            self.cpFile(self.CURRENT_SOURCE_BASE_PATH + \
+                    self.SOURCE_SCRIPT_PATH + self.sep + testkit_lite2,\
+                    "/usr/bin/" + testkit_lite2)
+
+            try:
+                os.system("chmod -R 777 /usr/bin/" + tct_mgr)
+                os.system("chmod -R 777 /usr/bin/" + tct_shell)
+                os.system("chmod -R 777 /usr/bin/" + testkit_lite1)
+                os.system("chmod -R 777 /usr/bin/" + testkit_lite2)
+                os.system("chmod -R 777 /usr/bin/sdb")
+            except:
+                pass
+
+    def cpTestKitLite(self):
+        self.cpDir(self.CURRENT_SOURCE_BASE_PATH + self.SOURCE_TESTKIT_PATH1, \
+                   self.CURRENT_TARGET_LITE_PATH + self.TARGET_TESTKIT_PATH1, \
+                           "lite_native")
+        for r, d, f in os.walk(self.CURRENT_TARGET_LITE_PATH + \
+                self.TARGET_TESTKIT_PATH1):
+            if (platform.system() != "Windows"):
+                os.chmod(r, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
+
+        self.cpDir(self.CURRENT_SOURCE_BASE_PATH + self.SOURCE_TESTKIT_PATH2,
+                   self.CURRENT_TARGET_LITE_PATH + self.TARGET_TESTKIT_PATH2, \
+                           "lite_web_csharp")
+        for r, d, f in os.walk(self.CURRENT_TARGET_LITE_PATH + \
+                self.TARGET_TESTKIT_PATH2):
+            if (platform.system() != "Windows"):
+                os.chmod(r, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
+
+    def cpManager(self):
+        self.cpDir(self.CURRENT_SOURCE_BASE_PATH + self.SOURCE_MANAGER_PATH,
+                   self.CURRENT_TARGET_BASE_PATH + self.TARGET_MANAGER_PATH, \
+                           "manager")
+        for r, d, f in os.walk(self.CURRENT_TARGET_BASE_PATH + \
+                self.TARGET_MANAGER_PATH):
+            if (platform.system() != "Windows"):
+                os.chmod(r, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
+
+    def cpShell(self):
+        self.cpDir(self.CURRENT_SOURCE_BASE_PATH + self.SOURCE_SHELL_PATH,
+                   self.CURRENT_TARGET_BASE_PATH + self.TARGET_SHELL_PATH, \
+                           "shell")
+        for r, d, f in os.walk(self.CURRENT_TARGET_BASE_PATH + \
+                self.TARGET_SHELL_PATH):
+            if (platform.system() != "Windows"):
+                os.chmod(r, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
+
+    def cpPlugin(self):
+        self.cpDir(self.CURRENT_SOURCE_BASE_PATH + self.SOURCE_PLUGIN_PATH,
+                   self.CURRENT_TARGET_BASE_PATH + self.TARGET_PLUGIN_PATH, \
+                           "plugin")
+        for r, d, f in os.walk(self.CURRENT_TARGET_BASE_PATH + \
+                self.TARGET_PLUGIN_PATH):
+            if (platform.system() != "Windows"):
+                os.chmod(r, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
+
+    def cpFile(self, src, target):
+        if (not os.path.isfile(src)):
+            print(src + " is not a file")
+            return
+        path = os.path.dirname(target)
+        if (not os.path.isdir(path)):
+            os.makedirs(path)
+        shutil.copyfile(src, target)
+
+    def del_rw(self, action, name, exc):
+        if (platform.system() != "Windows"):
+            os.chmod(name, stat.S_IWRITE)
+        os.remove(name)
+
+    def cpDir(self, src, target, name):
+        if (os.path.isdir(src) and not os.path.exists(target)):
+            print("copy " + name + "  dir start")
+            shutil.copytree(src, target)
+            print("copy " + name + "  dir finish")
+        else:
+            if (not os.path.isdir(src)):
+                print("source " + name + " path is not a dir")
+            if (os.path.exists(target)):
+                print("target " + name + " path is exists")
+                try:
+                    shutil.rmtree(target, onerror=self.del_rw)
+                except Exception as data:
+                    print(Exception, ":", data)
+
+                print("target " + name + " dir destroyed")
+                try:
+                    shutil.copytree(src, target)
+                except Exception as data:
+                    print(Exception, ":", data)
+                print("copy " + name + "  dir finish")
+
+    def clear(self):
+        self.setCurrentPath()
+        try:
+            shutil.rmtree(self.CURRENT_TARGET_BASE_PATH, onerror=self.del_rw)
+        except Exception as data:
+            print(Exception, ":", data)
+
+    def cp(self):
+        self.setCurrentPath()
+        self.cpShell()
+        self.cpManager()
+        self.cpOtherFiles()
+        self.cpTestKitLite()
+        self.cpPlugin()
+        self.cpOtherFilesToBinDir()
+        self.cpSdb()
+
+parser = OptionParser()
+parser.add_option("-i", "--install", dest="install", action="store_true", \
+        default=False, help="copy folders and file into os")
+parser.add_option("-p", "--purge", dest="clear", action="store_true", \
+        default=False, help="clear all files")
+
+(options, args) = parser.parse_args()
+if (options.install):
+    test = CpFile()
+    test.cp()
+elif(options.clear):
+    test = CpFile()
+    test.clear()
+else:
+    test = CpFile()
+    test.cp()
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/tct-mgr b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/tct-mgr
new file mode 100644 (file)
index 0000000..bb918fd
--- /dev/null
@@ -0,0 +1,10 @@
+#!/bin/bash
+
+THE_CLASSPATH=
+for i in `ls /opt/tools/manager/lib/*.jar`
+do
+  THE_CLASSPATH=${THE_CLASSPATH}:${i}
+done
+
+java -cp ${THE_CLASSPATH} org.tizen.tct.tool.mgr.TctGui "${@}"
+
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/tct-mgr.bat b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/tct-mgr.bat
new file mode 100644 (file)
index 0000000..9cf7241
--- /dev/null
@@ -0,0 +1,10 @@
+@echo off
+Setlocal EnableDelayedExpansion
+
+set classpath=
+for %%f in (/opt/tools/manager/lib/*.jar) do set classpath=!classpath!;/opt/tools/manager/lib/%%f
+
+echo ==================================================================================
+echo java_classpath = %classpath%
+java -cp %classpath% org.tizen.tct.tool.mgr.TctGui
+echo ==================================================================================
\ No newline at end of file
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/tct-shell b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/tct-shell
new file mode 100644 (file)
index 0000000..78ee3e9
--- /dev/null
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+python3 /opt/tools/shell/tct-shell "${@}"
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkit-lite_native b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkit-lite_native
new file mode 100644 (file)
index 0000000..35ea8d3
--- /dev/null
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+python3 /opt/testkit/lite_native/testkit-lite "${@}"
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkit-lite_web_csharp b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkit-lite_web_csharp
new file mode 100644 (file)
index 0000000..b32952b
--- /dev/null
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+python3 /opt/testkit/lite_web_csharp/testkit-lite "${@}"
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/LICENSE b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/LICENSE
new file mode 100644 (file)
index 0000000..6d45519
--- /dev/null
@@ -0,0 +1,340 @@
+                   GNU GENERAL PUBLIC LICENSE
+                      Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                       51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                           Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                   GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                           NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                    END OF TERMS AND CONDITIONS
+
+           How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/README b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/README
new file mode 100644 (file)
index 0000000..b82cff0
--- /dev/null
@@ -0,0 +1,77 @@
+Dependency:
+=================
+python2.7 python-pip requests
+
+       sudo apt-get install python-pip
+       sudo pip install requests
+
+How to build:
+=================
+    Build from source code: 
+        sudo python setup.py build
+
+How to install:
+=================
+    Install testkit lite  from source code: 
+        sudo python setup.py install
+
+How to use:
+=================
+    At first, install a test package or prepare one tests.xml file aligned with schema files: /opt/testkit/lite/xsd/testdefinition-syntax.xsd.
+
+    And then,
+        1) You can run case on target:
+            For web test cases:
+                testkit-lite -f device:"<somewhere>/<package_name>/tests.xml" -e 'WRTLauncher <package_name>'
+            For native test cases:
+                testkit-lite -f device:"<somewhere>/<package_name>/tests.xml" 
+
+        2) You can run case in single mode :
+            For web test cases:
+                testkit-lite -f "<somewhere>/<package_name>/tests.xml" -e 'WRTLauncher <package_name>' --comm localhost
+            For native test cases:
+                testkit-lite -f "<somewhere>/<package_name>/tests.xml" --comm localhost
+    
+        3) You can select on parser engine to simply conduct one or more tests.xml on target:
+            testkit-lite -f device:"<somewhere>/<package_name1>/tests.xml ... <somewhere>/<package_namen>/tests.xml" -e 'WRTLauncher <package_name1> ... <package_namen>'
+        4) If you want to execute both auto and manual tests:
+            testkit-lite -f device:"<somewhere>/<package_name>/tests.xml"
+            
+        5) If you just want to execute manual tests:
+            testkit-lite -f device:"<somewhere>/<package_name>/tests.xml" -M
+            
+        6) If you just want to execute auto tests:
+            testkit-lite -f device:"<somewhere>/<package_name>/tests.xml" -A
+            
+        7) If you want to save test result to another file, by default it'll be under /opt/testkit/lite/latest:
+            testkit-lite -f device:"<somewhere>/<package_name>/tests.xml" -o <somewhere>/xxx.xml
+            
+        8) If you want to choose some filters:
+            testkit-lite -f device:"<somewhere>/<package_name>/tests.xml" --status level1 --type type1 ...
+
+        9) If you want to run test according capability:
+            testkit-lite -f device:"<somewhere>/<package_name>/tests.xml" --capability capability.xml
+            
+        10) At last, you can freely compose the above parameters together:
+             testkit-lite -f <somewhere1>/tests.xml <somewhere2>/tests.xml -A --priority P1 --type type1 ...
+
+Get Results:
+=================
+
+    Test report will be generated as tests.result.xml   
+       The result will be under /opt/testkit/lite/latest after execution, you can also check the history results in /opt/testkit/lite/yyyy-mm-dd-HH:MM:SS.NNNNNN.
+
+View Results:
+=================
+
+Test report can be viewed in HTML format, so the data in the xml result file looks more human friendly.
+
+Please follow the following steps to view test report:
+    1) copy files: application.js back_top.png jquery.min.js testresult.xsl tests.css under directory /opt/testkit/lite/xsd/
+    2) put the files from step 1) under the same directory as the xml result file
+    3) open xml result file with a web browser(IE, Chrome or Firefox)
+
+Known Issues:
+=================
+N/A
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/VERSION b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/VERSION
new file mode 100644 (file)
index 0000000..fb8d81b
--- /dev/null
@@ -0,0 +1,4 @@
+[public_version]
+version=TESTKIT1_3.0
+[internal_version]
+version=TESTKIT1_3.0.1-151106
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/Makefile.am b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/Makefile.am
new file mode 100644 (file)
index 0000000..37da5f6
--- /dev/null
@@ -0,0 +1,24 @@
+# Copyright (C) 2012 Intel Corporation
+# 
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+#
+# Authors:
+#              Yuanyuan,Zou  <zouyuanx@intel.com>
+
+
+SUBDIRS = impl
+
+commoduledir = /usr/lib/python3/dist-packages/commodule
+dist_commodule_SCRIPTS = *.py
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/__init__.py b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/__init__.py
new file mode 100644 (file)
index 0000000..8b13789
--- /dev/null
@@ -0,0 +1 @@
+
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/__init__.pyc b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/__init__.pyc
new file mode 100644 (file)
index 0000000..4aae30a
Binary files /dev/null and b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/__init__.pyc differ
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/autoexec.py b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/autoexec.py
new file mode 100644 (file)
index 0000000..e1d4e49
--- /dev/null
@@ -0,0 +1,107 @@
+#!/usr/bin/python
+#
+# Copyright (C) 2012 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor,
+# Boston, MA  02110-1301, USA.
+#
+# Authors:
+#              Liu,chengtao <chengtaox.liu@intel.com>
+""" The shell command executor module"""
+
+import os
+import sys
+import time
+import subprocess
+from datetime import datetime
+
+from .log import LOGGER
+from .killall import killall
+from .str2 import str2str
+
+
+def shell_command(cmd, timeout=15):
+    """shell communication for quick return in sync mode"""
+    proc = subprocess.Popen(cmd,
+                            shell=True,
+                            bufsize=0,
+                            stdout=subprocess.PIPE,
+                            stderr=subprocess.PIPE,
+                            stdin=subprocess.PIPE)
+    time_cnt = 0
+    exit_code = None
+    while time_cnt < timeout:
+        exit_code = proc.poll()
+        if not exit_code is None:
+            break
+        time_cnt += 0.2
+        time.sleep(0.2)
+
+    if exit_code is None:
+        killall(proc.pid)
+        exit_code = -1
+        result = []
+    else:
+        result = proc.stdout.readlines() or proc.stderr.readlines()
+        for idx, r in enumerate(result):
+            result[idx] = r.decode("utf-8")
+    return [exit_code, result]
+
+
+def shell_command_ext(cmd="",
+                      timeout=None,
+                      boutput=False,
+                      stdout_file=None,
+                      stderr_file=None):
+    """shell executor, return [exitcode, stdout/stderr]
+       timeout: None means unlimited timeout
+       boutput: specify whether print output during the command running
+    """
+    cmd_open = subprocess.Popen(args=cmd,
+                                shell=True,
+                                bufsize=0,
+                                stdout=subprocess.PIPE,
+                                stderr=subprocess.PIPE,
+                                stdin=subprocess.PIPE)
+
+    while True:
+        exit_code = cmd_open.poll()
+        if exit_code is not None:
+            break
+        if timeout is not None:
+            timeout -= 0.1
+            if timeout <= 0:
+                try:
+                    exit_code = "timeout"
+                    cmd_open.terminate()
+                    time.sleep(5)
+                except OSError:
+                    killall(cmd_open.pid)
+                break
+        time.sleep(0.1)
+
+    try:
+        stdout_log = cmd_open.stdout.read().decode("utf-8")
+    except:
+        LOGGER.info("Cannot decode bytes using utf-8, hence using latin-1 decoder")
+        stdout_log = cmd_open.stdout.read().decode("latin-1")
+    stderr_log = cmd_open.stderr.read().decode("utf-8")
+    if 'returncode=' in stdout_log:
+        index = stdout_log.find('returncode=') + 11
+        exit_code = str(stdout_log[index:]).strip('\r\n')
+    stdout_log = '<![CDATA[' + stdout_log + ']]>'
+    stderr_log = '<![CDATA[' + stderr_log + ']]>'
+
+    return [exit_code, stdout_log, stderr_log]
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/autoexec.pyc b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/autoexec.pyc
new file mode 100644 (file)
index 0000000..799851b
Binary files /dev/null and b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/autoexec.pyc differ
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/connector.py b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/connector.py
new file mode 100644 (file)
index 0000000..b8d4511
--- /dev/null
@@ -0,0 +1,52 @@
+#!/usr/bin/python
+#
+# Copyright (C) 2013 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor,Boston, MA 02110-1301,USA.
+#
+# Authors:
+#              Liu,chengtao <chengtaox.liu@intel.com>
+"""Test connector for test instance and target instance"""
+
+from .log import LOGGER
+from .impl.tizenmobile import get_target_conn as tizenmobile_conn
+from .impl.localhost import get_target_conn as localhost_conn
+
+class Connector:
+
+    """Communication module for test host and test remote"""
+
+    def __init__(self, config):
+        self.conn = None
+        if "testmode" in config:
+            try:
+                #exec("from impl.%s import get_target_conn" % config[
+                #    "testmode"])
+                if config["testmode"]=="tizenmobile":
+                    get_target_conn = tizenmobile_conn
+                else:
+                    get_target_conn = localhost_conn
+                device_no = config.get('deviceid', None)
+                if device_no is not None:
+                    self.conn = get_target_conn(device_no)
+                else:
+                    self.conn = get_target_conn()
+            except Exception as error:
+                LOGGER.error("[Error: Failed to initilize com-module,"
+                             " exception: % s]\n" % error)
+
+    def get_connector(self):
+        """list the handler instance"""
+        return self.conn
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/connector.pyc b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/connector.pyc
new file mode 100644 (file)
index 0000000..892603b
Binary files /dev/null and b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/connector.pyc differ
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/httprequest.py b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/httprequest.py
new file mode 100644 (file)
index 0000000..97ad3f3
--- /dev/null
@@ -0,0 +1,55 @@
+#!/usr/bin/python
+#
+# Copyright (C) 2012 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor,
+# Boston, MA  02110-1301, USA.
+#
+# Authors:
+#           Liu,chengtao <chengtaox.liu@intel.com>
+""" The http request process module"""
+
+import requests
+import json
+
+
+def get_url(baseurl, api):
+    """get full url string"""
+    return "%s%s" % (baseurl, api)
+
+
+def http_request(url, rtype="POST", data=None, time_out=10):
+    """
+    http request to the device http server
+    """
+    result = None
+    if rtype == "POST":
+        headers = {'content-type': 'application/json'}
+        try:
+            ret = requests.post(url, data=json.dumps(
+                data), headers=headers, timeout=time_out)
+
+            if ret:
+                result = ret.json()
+        except Exception as error:
+            pass
+    elif rtype == "GET":
+        try:
+            ret = requests.get(url, params=data, timeout=time_out)
+            if ret:
+                result = ret.json()
+        except Exception as error:
+            pass
+    return result
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/httprequest.pyc b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/httprequest.pyc
new file mode 100644 (file)
index 0000000..455a4c9
Binary files /dev/null and b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/httprequest.pyc differ
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/impl/Makefile.am b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/impl/Makefile.am
new file mode 100644 (file)
index 0000000..6e8c33c
--- /dev/null
@@ -0,0 +1,22 @@
+# Copyright (C) 2012 Intel Corporation
+# 
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+#
+# Authors:
+#              Yuanyuan,Zou  <zouyuanx@intel.com>
+
+
+commoduleimpldir = /usr/lib/python3/dist-packages/commodule/impl
+dist_commoduleimpl_SCRIPTS = *.py
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/impl/__init__.py b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/impl/__init__.py
new file mode 100644 (file)
index 0000000..8b13789
--- /dev/null
@@ -0,0 +1 @@
+
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/impl/localhost.py b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/impl/localhost.py
new file mode 100644 (file)
index 0000000..94bc888
--- /dev/null
@@ -0,0 +1,146 @@
+#!/usr/bin/python
+#
+# Copyright (C) 2012 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor,
+# Boston, MA  02110-1301, USA.
+#
+# Authors:
+#           Liu,chengtao <chengtaox.liu@intel.com>
+
+""" The implementation of local host communication"""
+
+import os
+import time
+import socket
+import re
+from shutil import copyfile
+
+from commodule.log import LOGGER
+from commodule.autoexec import shell_command, shell_command_ext
+
+
+HOST_NS = "127.0.0.1"
+os.environ['no_proxy'] = HOST_NS
+APP_QUERY_STR = "ps aux | grep %s | grep -v grep"
+
+
+class LocalHost:
+
+    """ Implementation for transfer data
+        between Host and Tizen PC
+    """
+
+    def __init__(self):
+        self.deviceid = "localhost"
+
+    def shell_cmd(self, cmd="", timeout=15):
+        return shell_command(cmd, timeout)
+
+    def check_process(self, process_name):
+        exit_code, ret = shell_command(APP_QUERY_STR % process_name)
+        return len(ret)
+
+    def launch_stub(self, stub_app, stub_port="8000", debug_opt=""):
+        cmdline = "%s --port:%s %s" % (stub_app, stub_port, debug_opt)
+        exit_code, ret = self.shell_cmd(cmdline)
+        time.sleep(2)
+
+    def check_widget_process(self, wgt_name):
+        return True
+
+    def shell_cmd_ext(self,
+                      cmd="",
+                      timeout=None,
+                      boutput=False,
+                      stdout_file=None,
+                      stderr_file=None):
+        return shell_command_ext(cmd, timeout, boutput, stdout_file, stderr_file)
+
+    def get_device_ids(self):
+        """
+            get device list of ids
+        """
+        return ['localhost']
+
+    def get_device_info(self):
+        """
+            get tizen device inforamtion
+        """
+        device_info = {}
+        device_info["device_id"] = self.deviceid
+        device_info["resolution"] = "N/A"
+        device_info["screen_size"] = "N/A"
+        device_info["device_model"] = "N/A"
+        device_info["device_name"] = "N/A"
+        device_info["os_version"] = "N/A"
+        device_info["build_id"] = "N/A"
+        return device_info
+
+    def get_server_url(self, remote_port="8000"):
+        """get server url"""
+        url_forward = "http://%s:%s" % (HOST_NS, remote_port)
+        return url_forward
+
+    def install_package(self, pkgpath):
+        """
+           install a package on tizen device
+        """
+        cmd = "rpm -ivh %s" % pkgpath
+        exit_code, ret = shell_command(cmd)
+        return ret
+
+    def get_installed_package(self):
+        """get list of installed package from device"""
+        cmd = "rpm -qa | grep tct"
+        exit_code, ret = shell_command(cmd)
+        return ret
+
+    def download_file(self, remote_path, local_path):
+        """download file"""
+        # copyfile(remote_path, local_path)
+        # return True
+        return False
+
+    def upload_file(self, remote_path, local_path):
+        """upload file"""
+        # copyfile(local_path, remote_path)
+        return False
+
+    def get_launcher_opt(self, test_launcher, test_suite, test_set, fuzzy_match, auto_iu):
+        """get test option dict """
+        test_opt = {}
+        test_opt["suite_name"] = test_suite
+        test_opt["launcher"] = test_launcher
+        test_opt["test_app_id"] = test_launcher
+        return test_opt
+
+    def launch_app(self, wgt_name):
+        exit_code, ret = shell_command(wgt_name + '&')
+        return True
+
+    def kill_app(self, wgt_name):
+        return True
+
+    def start_debug(self, dlogfile):
+        pass
+
+    def stop_debug(self):
+        pass
+
+
+def get_target_conn():
+    """ Get connection for Test Target"""
+    return LocalHost()
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/impl/tizenmobile.py b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/impl/tizenmobile.py
new file mode 100644 (file)
index 0000000..0abd937
--- /dev/null
@@ -0,0 +1,467 @@
+#!/usr/bin/python
+#
+# Copyright (C) 2012 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+# MA  02110-1301, USA.
+#
+# Authors:
+#           Chengtao,Liu  <chengtaox.liu@intel.com>
+
+""" The implementation of TIZEN mobile communication"""
+
+import os
+import time
+import socket
+import threading
+import re
+import shutil
+import configparser
+import platform
+import xml.etree.ElementTree as etree
+
+from commodule.log import LOGGER
+from commodule.autoexec import shell_command, shell_command_ext
+from commodule.killall import killall
+
+TCT_CONFIG_FILE = "/opt/tools/TCT_CONFIG"
+tct_parser = configparser.ConfigParser()
+tct_parser.read(TCT_CONFIG_FILE)
+
+DEVICE_SUITE_TARGET_24 = tct_parser.get('DEVICE', 'DEVICE_SUITE_TARGET_24')
+DEVICE_SUITE_TARGET_30 = tct_parser.get('DEVICE', 'DEVICE_SUITE_TARGET_30')
+
+LOCAL_HOST_NS = "127.0.0.1"
+RPM_INSTALL = "sdb -s %s shell rpm -ivh %s"
+RPM_UNINSTALL = "sdb -s %s shell rpm -e %s"
+RPM_LIST = "sdb -s %s shell \"rpm -qa|grep tct\""
+APP_QUERY_STR = "sdb -s %s shell \"ps aux|grep '%s'|grep -v grep\"|awk '{print $2}'"
+APP_KILL_STR = "sdb -s %s shell kill -9 %s"
+WRT_QUERY_STR = "sdb -s %s shell wrt-launcher -l | grep '%s'|awk '{print $2\":\"$NF}'"
+WRT_START_STR = "sdb -s %s shell 'wrt-launcher -s %s; echo returncode=$?'"
+WRT_STOP_STR = "sdb -s %s shell wrt-launcher -k %s"
+WRT_INSTALL_STR = "sdb -s %s shell pkgcmd -i -t wgt -q -p %s"
+WRT_UNINSTL_STR = "sdb -s %s shell pkgcmd -u -t wgt -q -n %s"
+WRT_SMOCK_STR = "sdb -s %s shell 'echo \"%s sdbd rw\" | smackload'"
+WRT_SMOCK_REV_STR = "sdb -s %s shell 'echo \"sdbd %s rw\" | smackload'"
+WRT_LOCATION = os.path.join(DEVICE_SUITE_TARGET_24, "tct/opt/%s/%s.wgt")
+DLOG_CLEAR = "sdb -s %s shell dlogutil -c"
+DLOG_WRT = "sdb -s %s shell dlogutil -v threadtime"
+
+SDB_COMMAND_RTN =  "sdb -s %s shell '%s; echo returncode=$?'"
+
+# redefine constants for windows
+if platform.system() == "Windows":
+    WRT_START_STR = 'sdb -s %s shell "wrt-launcher -s %s; echo returncode=$?"'
+    SDB_COMMAND_RTN =  'sdb -s %s shell "%s; echo returncode=$?"'
+
+def debug_trace(cmdline, logfile):
+    global debug_flag, metux
+    wbuffile = open(logfile, "wb")
+    import subprocess
+    exit_code = None
+    proc = subprocess.Popen(args=cmdline,
+                            shell=True,
+                            stdout=wbuffile,
+                            stderr=None)
+    while True:
+        exit_code = proc.poll()
+        if exit_code is not None:
+            break
+        time.sleep(0.5)
+        metux.acquire()
+        proc_flag = debug_flag
+        metux.release()
+        if not proc_flag:
+            break
+    wbuffile.close()
+    if exit_code is None:
+        killall(proc.pid)
+
+
+def _get_device_ids():
+    """get tizen device list of ids"""
+    result = []
+    exit_code, ret = shell_command("sdb devices")
+    for line in ret:
+        if str.find(line, "\tdevice") != -1:
+            result.append(line.split("\t")[0])
+    return result
+
+
+class TizenMobile:
+
+    """
+    Implementation for transfer data
+    between Host and Tizen Mobile Device
+    """
+
+    def __init__(self, device_id=None):
+        self.deviceid = device_id
+        self.is_NE = 0
+        if self.deviceid and self.deviceid.find('NE') > -1:
+            self.is_NE = int(self.deviceid.split(':')[1].split('_')[0])
+            self.deviceid = self.deviceid.split('_')[1]
+        
+        self._wrt = False
+
+    def is_NE_mode(self):
+        return self.is_NE
+
+    def get_devid(self):
+        return self.deviceid
+
+    def shell_cmd(self, cmd="", timeout=15):
+        cmdline = "sdb -s %s shell \"%s\" " % (self.deviceid, cmd)
+        return shell_command(cmdline, timeout)
+
+    def check_process(self, process_name):
+        exit_code, ret = shell_command(
+            APP_QUERY_STR % (self.deviceid, process_name))
+        return len(ret)
+
+    def launch_stub(self, stub_app, stub_port, debug_opt=""):
+        cmdline = "/opt/home/developer/%s --port:%s %s; sleep 2s" \
+                % (stub_app, stub_port, debug_opt)
+        exit_code, ret = self.shell_cmd(cmdline)
+        time.sleep(2)
+
+    def shell_cmd_ext(self,
+                      cmd="",
+                      timeout=None,
+                      boutput=False,
+                      stdout_file=None,
+                      stderr_file=None):
+            
+        cmdline = SDB_COMMAND_RTN % (
+            self.deviceid, cmd)
+        return shell_command_ext(cmdline, timeout, boutput, \
+                stdout_file, stderr_file)
+
+    def get_device_info(self):
+        """get tizen device inforamtion"""
+        device_info = {}
+        resolution_str = ""
+        screen_size_str = ""
+        device_model_str = ""
+        device_name_str = ""
+        build_id_str = ""
+        os_version_str = ""
+
+        # get resolution and screen size
+        exit_code, ret = shell_command(
+            "sdb -s %s shell xrandr" % self.deviceid)
+        pattern = re.compile("connected (\d+)x(\d+).* (\d+mm) x (\d+mm)")
+        for line in ret:
+            match = pattern.search(line)
+            if match:
+                resolution_str = "%s x %s" % (match.group(1), match.group(2))
+                screen_size_str = "%s x %s" % (match.group(3), match.group(4))
+
+        # get architecture
+        exit_code, ret = shell_command(
+            "sdb -s %s shell uname -m" % self.deviceid)
+        if len(ret) > 0:
+            device_model_str = ret[0]
+
+        # get hostname
+        exit_code, ret = shell_command(
+            "sdb -s %s shell uname -n" % self.deviceid)
+        if len(ret) > 0:
+            device_name_str = ret[0]
+
+        # get os version
+        exit_code, ret = shell_command(
+            "sdb -s %s shell cat /etc/issue" % self.deviceid)
+        for line in ret:
+            if len(line) > 1:
+                os_version_str = "%s %s" % (os_version_str, line)
+
+        # get build id
+        exit_code, ret = shell_command(
+            "sdb -s %s shell cat /etc/tizen-release" % self.deviceid)
+        for line in ret:
+            if line.find("BUILD_ID=") != -1:
+                build_id_str = line.split('=')[1].strip('\"\r\n')
+
+        os_version_str = os_version_str[0:-1]
+
+        device_info["device_id"] = self.deviceid
+        device_info["resolution"] = resolution_str
+        device_info["screen_size"] = screen_size_str
+        device_info["device_model"] = device_model_str
+        device_info["device_name"] = device_name_str
+        device_info["os_version"] = os_version_str
+        device_info["build_id"] = build_id_str
+        return device_info
+
+    def get_buildinfo(self, _tizenV):
+        """ get builf info"""
+        device_file = ""
+        if _tizenV and _tizenV.find("6.0") > -1:
+            device_file = DEVICE_SUITE_TARGET_30 + '/Documents/tct/buildinfo.xml'
+        elif _tizenV and _tizenV.find("6.5") > -1:
+            device_file = DEVICE_SUITE_TARGET_30 + '/Documents/tct/buildinfo.xml'
+        elif _tizenV and _tizenV.find("7.0") > -1:
+            device_file = DEVICE_SUITE_TARGET_30 + '/Documents/tct/buildinfo.xml'
+        elif _tizenV and _tizenV.find("7.5") > -1:
+            device_file = DEVICE_SUITE_TARGET_30 + '/Documents/tct/buildinfo.xml'
+        else:
+            device_file = DEVICE_SUITE_TARGET_24 + '/Documents/tct/buildinfo.xml'
+
+        builfinfo_file = '/opt/testkit/lite_native/' + self.deviceid + '/buildinfo.xml'
+        build_info = {}
+        build_info['buildid'] = ''
+        build_info['manufacturer'] = ''
+        build_info['model'] = ''
+
+        if self.download_file(device_file, builfinfo_file) \
+            and os.path.exists(builfinfo_file):
+            root = etree.parse(builfinfo_file).getroot()
+            for element in root.findall("buildinfo"):
+                if element is not None:
+                    if element.get("name").lower() == 'buildversion':
+                        child = etree.Element.getchildren(element)
+                        if child and child[0].text:
+                            buildid = child[0].text
+                            build_info['buildid'] = buildid
+                    if element.get("name").lower() == 'manufacturer':
+                        child = etree.Element.getchildren(element)
+                        if child and child[0].text:
+                            manufacturer = child[0].text
+                            build_info['manufacturer'] = manufacturer
+                    if element.get("name").lower() == 'model':
+                        child = etree.Element.getchildren(element)
+                        if child and child[0].text:
+                            model = child[0].text
+                            build_info['model'] = model
+            os.remove(builfinfo_file)
+        return build_info
+
+
+    def get_server_url(self, remote_port="8000"):
+        """forward request a host tcp port to targe tcp port"""
+        if remote_port is None:
+            return None
+
+        os.environ['no_proxy'] = LOCAL_HOST_NS
+        host = LOCAL_HOST_NS
+        inner_port = 9000
+        time_out = 2
+        bflag = False
+        while True:
+            sock_inner = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+            sock_inner.settimeout(time_out)
+            try:
+                sock_inner.bind((host, inner_port))
+                sock_inner.close()
+                bflag = False
+            except socket.error as error:
+                if error.errno == 98 or error.errno == 13:
+                    bflag = True
+            if bflag:
+                inner_port += 1
+            else:
+                break
+        host_port = str(inner_port)
+        cmd = "sdb -s %s forward tcp:%s tcp:%s" % \
+            (self.deviceid, host_port, remote_port)
+        exit_code, ret = shell_command(cmd)
+        url_forward = "http://%s:%s" % (host, host_port)
+        return url_forward
+
+    def download_file(self, remote_path, local_path):
+        """download file from device"""
+            
+        local_path_dir = os.path.dirname(local_path)
+        if not os.path.exists(local_path_dir):
+            os.makedirs(local_path_dir)
+        filename = os.path.basename(remote_path)
+        cmd = "sdb -s %s pull %s %s" % (
+            self.deviceid, remote_path, local_path_dir)
+        exit_code, ret = shell_command(cmd)
+        if exit_code != 0:
+            error = ret[0].strip('\r\n') if len(ret) else "sdb shell timeout"
+            LOGGER.info("[ Download file \"%s\" failed, error: %s ]"
+                        % (remote_path, error))
+            return False
+        else:
+            src_path = os.path.join(local_path_dir, filename)
+            if src_path != local_path:
+                shutil.move(src_path, local_path)
+            return True
+
+    def upload_file(self, remote_path, local_path):
+        """upload file to device"""
+        cmd = "sdb -s %s push %s %s" % (self.deviceid, local_path, remote_path)
+        exit_code, ret = shell_command(cmd)
+        if exit_code != 0:
+            error = ret[0].strip('\r\n') if len(ret) else "sdb shell timeout"
+            LOGGER.info("[ Upload file \"%s\" failed,"
+                        " get error: %s ]" % (local_path, error))
+            return False
+        else:
+            return True
+
+    def get_launcher_opt(self, test_launcher, test_suite, test_set, \
+            fuzzy_match, auto_iu):
+        """
+        get test option dict
+        """
+        test_opt = {}
+        test_opt["suite_name"] = test_suite
+        test_opt["launcher"] = test_launcher
+        test_opt["test_app_id"] = test_launcher
+        self._wrt = False
+        if test_launcher.find('WRTLauncher') != -1:
+            self._wrt = True
+            cmd = ""
+            test_app_id = None
+            test_opt["launcher"] = "wrt-launcher"
+            # test suite need to be installed by commodule
+            if auto_iu:
+                test_wgt = test_set
+                test_wgt_path = WRT_LOCATION % (test_suite, test_wgt)
+                if not self.install_app(test_wgt_path):
+                    LOGGER.info("[ failed to install widget \"%s\" in target ]"
+                                % test_wgt)
+                    return None
+            else:
+                test_wgt = test_suite
+
+            # query the whether test widget is installed ok
+            cmd = WRT_QUERY_STR % (self.deviceid, test_wgt)
+            exit_code, ret = shell_command(cmd)
+            if exit_code == -1:
+                return None
+            for line in ret:
+                items = line.split(':')
+                if len(items) < 1:
+                    continue
+                if (fuzzy_match and items[0].find(test_wgt) != -1) \
+                        or items[0] == test_wgt:
+                    test_app_id = items[1].strip('\r\n')
+                    break
+
+            if test_app_id is None:
+                LOGGER.info("[ test widget \"%s\" not found in target ]"
+                            % test_wgt)
+                return None
+            else:
+                test_opt["test_app_id"] = test_app_id
+
+            cmd1 = WRT_SMOCK_STR % (self.deviceid, test_app_id.split('.')[0])
+            cmd2 = WRT_SMOCK_REV_STR % \
+                    (self.deviceid, test_app_id.split('.')[0])
+            shell_command(cmd1)
+            shell_command(cmd2)
+
+        return test_opt
+
+    def install_package(self, pkgpath):
+        """install a package on tizen device:
+        push package and install with shell command
+        """
+        cmd = RPM_INSTALL % (self.deviceid, pkgpath)
+        exit_code, ret = shell_command(cmd)
+        return ret
+
+    def uninstall_package(self, pkgname):
+        """install a package on tizen device:
+        push package and install with shell command
+        """
+        cmd = RPM_UNINSTALL % (self.deviceid, pkgname)
+        exit_code, ret = shell_command(cmd)
+        return ret
+
+    def get_installed_package(self):
+        """get list of installed package from device"""
+        cmd = RPM_LIST % self.deviceid
+        exit_code, ret = shell_command(cmd)
+        return ret
+    def start_debug(self, dlogfile):
+        global debug_flag, metux
+        if self.is_NE_mode():
+            return 
+        debug_flag = True
+        metux = threading.Lock()
+        cmdline = DLOG_CLEAR % self.deviceid
+        exit_code, ret = shell_command(cmdline)
+        cmdline = DLOG_WRT % self.deviceid
+        LOGGER.debug("[ DLOGFILE_PATH:%s ]" % str(dlogfile))
+        th = threading.Thread(target=debug_trace, args=(cmdline, dlogfile))
+        th.setDaemon(True)
+        th.start()
+
+    def stop_debug(self):
+        global debug_flag, metux
+        if self.is_NE_mode():
+            return 
+
+        metux.acquire()
+        debug_flag = False
+        metux.release()
+
+    def launch_app(self, wgt_name):
+        if not self._wrt:
+            exit_code, ret = self.shell_cmd(wgt_name)
+            return True
+        timecnt = 0
+        blauched = False
+        cmdline = WRT_STOP_STR % (self.deviceid, wgt_name)
+        exit_code, ret = shell_command(cmdline)
+        cmdline = WRT_START_STR % (self.deviceid, wgt_name)
+        while timecnt < 3:
+            exit_code, ret_out, ret_err = shell_command_ext(cmdline, 30)
+            if exit_code == "0":
+                blauched = True
+                break
+            timecnt += 1
+            time.sleep(3)
+        return blauched
+
+    def kill_app(self, wgt_name):
+        if not self._wrt:
+            return True
+        cmdline = WRT_STOP_STR % (self.deviceid, wgt_name)
+        exit_code, ret = shell_command(cmdline)
+        return True
+
+    def install_app(self, wgt_path="", timeout=90):
+        cmd = WRT_INSTALL_STR % (self.deviceid, wgt_path)
+        exit_code, ret = shell_command(cmd, timeout)
+        if exit_code == -1:
+            cmd = APP_QUERY_STR % (self.deviceid, wgt_path)
+            exit_code, ret = shell_command(cmd)
+            for line in ret:
+                cmd = APP_KILL_STR % (self.deviceid, line.strip('\r\n'))
+                exit_code, ret = shell_command(cmd)
+            return False
+        else:
+            return True
+
+    def uninstall_app(self, wgt_name):
+        cmd = WRT_UNINSTL_STR % (self.deviceid, wgt_name.split('.')[0])
+        exit_code, ret = shell_command(cmd)
+        return True
+
+
+def get_target_conn(device_id=None):
+    """ Get connection for Test Target"""
+    if device_id is None:
+        dev_list = _get_device_ids()
+        device_id = dev_list[0] if len(dev_list) else None
+    return TizenMobile(device_id)
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/killall.py b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/killall.py
new file mode 100644 (file)
index 0000000..e9fa500
--- /dev/null
@@ -0,0 +1,74 @@
+#!/usr/bin/python
+#
+# Copyright (C) 2012 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor,
+# Boston, MA  02110 - 1301, USA.
+#
+# Authors:
+#              Zhang, Huihui <huihuix.zhang@intel.com>
+#              Wendong,Sui  <weidongx.sun@intel.com>
+""" The process kill for os"""
+
+import os
+import platform
+import signal
+import re
+import ctypes
+
+
+def killall(ppid):
+    """Kill all children process by parent process ID"""
+    os_ver = platform.system()
+    try:
+        if os_ver == "Linux" or os_ver == "Darwin":
+            ppid = str(ppid)
+            pidgrp = []
+
+            def getchildpids(ppid):
+                """Return a list of children process"""
+                command = "ps -ef | awk '{if ($3 == %s) print $2;}'" % str(
+                    ppid)
+                pids = os.popen(command).read()
+                pids = pids.split()
+                return pids
+
+            pidgrp.extend(getchildpids(ppid))
+            for pid in pidgrp:
+                pidgrp.extend(getchildpids(pid))
+            # Insert self process ID to PID group list
+            pidgrp.insert(0, ppid)
+            while len(pidgrp) > 0:
+                pid = pidgrp.pop()
+                try:
+                    os.kill(int(pid), signal.SIGKILL)
+                except OSError as error:
+                    pattern = re.compile('No such process')
+                    match = pattern.search(str(error))
+                    if not match:
+                        print("[ Error: fail to kill pid: %s," \
+                            " error: %s ]\n" % (int(pid), error))
+        # kill for windows platform
+        else:
+            kernel32 = ctypes.windll.kernel32
+            handle = kernel32.OpenProcess(1, 0, int(ppid))
+            kernel32.TerminateProcess(handle, 0)
+    except OSError as error:
+        pattern = re.compile('No such process')
+        match = pattern.search(str(error))
+        if not match:
+            print("[ Error: fail to kill pid: %s, error: %s ]\n" \
+                % (int(ppid), error))
+    return None
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/killall.pyc b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/killall.pyc
new file mode 100644 (file)
index 0000000..edbc428
Binary files /dev/null and b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/killall.pyc differ
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/log.py b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/log.py
new file mode 100644 (file)
index 0000000..8c4fee6
--- /dev/null
@@ -0,0 +1,101 @@
+#!/usr/bin/python
+#
+# Copyright (C) 2013 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor,
+# Boston, MA  02110-1301, USA.
+#
+# Authors:
+#              Liu,chengtao <liux.chengtao@intel.com>
+"""General Implementation"""
+
+import threading
+import logging
+import logging.handlers
+import sys
+import os
+
+# logger levels
+LEVELS = {"CRITICAL": 50,
+          "ERROR": 40,
+          "WARNING": 30,
+          "INFO": 20,
+          "DEBUG": 10,
+          "NOTSET": 0
+          }
+
+
+class Logger:
+
+    """General Logger Class"""
+    _instance = None
+    _mutex = threading.Lock()
+
+    def __init__(self, level="DEBUG", format_str="%(message)s"):
+        """Generate root logger"""
+        self._logger = logging.getLogger("TCT")
+        self._logger.setLevel(LEVELS[level])
+        self._formatter = logging.Formatter(format_str)
+        self.add_print_logger()
+
+    def add_print_logger(self, level="INFO"):
+        """Generate console writer [StreamHandler]"""
+        writer = logging.StreamHandler(sys.stdout)
+        writer.setLevel(LEVELS[level])
+        writer.setFormatter(self._formatter)
+        self._logger.addHandler(writer)
+
+    @staticmethod
+    def get_logger(level="DEBUG", format_str="%(message)s"):
+        """sinlgeton of Logger"""
+        if Logger._instance is None:
+            Logger._mutex.acquire()
+            if Logger._instance is None:
+                Logger._instance = Logger(level, format_str)
+            else:
+                pass
+            Logger._mutex.release()
+        return Logger._instance
+
+    def debug(self, msg):
+        """debug level message"""
+        if msg is not None:
+            sys.stdout.write(msg + '\r\n')
+            sys.stdout.flush()
+
+    def info(self, msg):
+        """info level message"""
+        if msg is not None:
+            sys.stdout.write(msg + '\r\n')
+            sys.stdout.flush()
+
+    def warning(self, msg):
+        """warning level message"""
+        if msg is not None:
+            self._logger.warning(msg)
+
+    def error(self, msg):
+        """error level message"""
+        if msg is not None:
+            sys.stdout.write(msg + '\r\n')
+            sys.stdout.flush()
+
+    def critical(self, msg):
+        """critical level message"""
+        if msg is not None:
+            self._logger.critical(msg)
+
+
+LOGGER = Logger.get_logger(level=os.environ.get('LOG_LEVEL', 'INFO'))
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/log.pyc b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/log.pyc
new file mode 100644 (file)
index 0000000..772cafe
Binary files /dev/null and b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/log.pyc differ
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/str2.py b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/str2.py
new file mode 100644 (file)
index 0000000..77cc09f
--- /dev/null
@@ -0,0 +1,70 @@
+#!/usr/bin/python
+#
+# Copyright (C) 2012 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+# MA  02110-1301, USA.
+#
+# Authors:
+#              Zhang, Huihui <huihuix.zhang@intel.com>
+#              Wendong,Sui  <weidongx.sun@intel.com>
+""" string convertor"""
+
+import string
+
+
+def str2str(src):
+    """string to printable string"""
+    if isinstance(src, str):
+        return src.encode("utf8")
+
+    if isinstance(src, str):
+        accept = string.punctuation + string.letters + string.digits + ' \r\n'
+        return [x for x in src if x in accept]
+
+    return ""
+
+
+def str2val(src):
+    """string to program value"""
+    ret = None
+    try:
+        ret = eval(str2str(src))
+    except:
+        pass
+    return ret
+
+
+def str2bool(src):
+    """string to boolean"""
+    if "TRUE" == str2str(src).upper():
+        return True
+    if "FALSE" == str2str(src).upper():
+        return False
+    return None
+
+
+def str2number(src):
+    """string to boolean"""
+    val = str2val(str2str(src))
+    if type(val) in [int, float]:
+        return val
+    else:
+        return None
+
+
+def str2xmlstr(src):
+    """string to xml string value"""
+    return src.replace('\n', '\\n')
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/str2.pyc b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/str2.pyc
new file mode 100644 (file)
index 0000000..1605ae2
Binary files /dev/null and b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/commodule/str2.pyc differ
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/debian/changelog b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/debian/changelog
new file mode 100644 (file)
index 0000000..a7ad288
--- /dev/null
@@ -0,0 +1,5 @@
+testkit-lite (2.3.22) unstable; urgency=low
+
+  * TCT2.3 Release.
+
+ -- ChengTao Liu <chengtaox.liu@intel.com>  Mon, 4 Nov 2013 11:13:11 +0800
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/debian/compat b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/debian/compat
new file mode 100644 (file)
index 0000000..45a4fb7
--- /dev/null
@@ -0,0 +1 @@
+8
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/debian/control b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/debian/control
new file mode 100644 (file)
index 0000000..a30c031
--- /dev/null
@@ -0,0 +1,16 @@
+Source: testkit-lite
+Section: utils
+Priority: standard
+Maintainer: Cathy Shen <cathy.shen@intel.com>
+Build-Depends: debhelper (>= 8.0.0), python-setuptools, python-support (>= 0.8.4)
+Standards-Version: 3.9.3
+Homepage: https://github.com/testkit/testkit-lite
+#Vcs-Git: git://git.debian.org/collab-maint/testkit-manager.git
+#Vcs-Browser: http://git.debian.org/?p=collab-maint/testkit-manager.git;a=summary
+
+Package: testkit-lite
+Architecture: all
+Depends: ${misc:Depends}, ${python:Depends}
+XB-Python-Version: ${python:Versions}
+Description: Test runner for test execution.
+
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/debian/copyright b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/debian/copyright
new file mode 100644 (file)
index 0000000..71edd1c
--- /dev/null
@@ -0,0 +1,27 @@
+Format: http://dep.debian.net/deps/dep5
+Source: https://github.com/testkit/testkit-lite
+
+Files: *
+Copyright: 2012-2013 Intel Corp. 
+License: GPL-2.0
+
+Files: debian/*
+Copyright: 2012-2013 Intel Corp.
+License: GPL-2.0
+
+License: GPL-2.0
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 2 of the License
+ .
+ This package is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ GNU General Public License for more details.
+ .
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ .
+ On Debian systems, the complete text of the GNU General
+ Public License version 3 can be found in "/usr/share/common-licenses/GPL-3".
+
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/debian/docs b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/debian/docs
new file mode 100644 (file)
index 0000000..e845566
--- /dev/null
@@ -0,0 +1 @@
+README
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/debian/files b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/debian/files
new file mode 100644 (file)
index 0000000..c282b42
--- /dev/null
@@ -0,0 +1 @@
+testkit-lite_2.3.20_all.deb utils standard
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/debian/postinst b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/debian/postinst
new file mode 100644 (file)
index 0000000..36ea91c
--- /dev/null
@@ -0,0 +1,8 @@
+#!/bin/sh
+
+# Set permissions
+mkdir /opt/testkit/lite_native/test_packages
+chmod ugo+rwx -R /opt/testkit/lite_native
+ln -fs /usr/share/pyshared/commodule /usr/lib/python3/dist-packages/commodule
+ln -fs /usr/share/pyshared/testkitlite /usr/lib/python3/dist-packages/testkitlite
+
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/debian/rules b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/debian/rules
new file mode 100644 (file)
index 0000000..abde6ef
--- /dev/null
@@ -0,0 +1,5 @@
+#!/usr/bin/make -f
+
+%:
+       dh $@
+
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/doc/Makefile.am b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/doc/Makefile.am
new file mode 100644 (file)
index 0000000..c8e543f
--- /dev/null
@@ -0,0 +1,22 @@
+# Copyright (C) 2012 Intel Corporation
+# 
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+#
+# Authors:
+#              Zhang, Huihui <huihuix.zhang@intel.com>
+#              Wendong,Sui  <weidongx.sun@intel.com>
+
+testkitdocdir = /opt/testkit/lite_native/doc
+dist_testkitdoc_DATA = testkit-lite_user_guide_for_tct.pdf
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/doc/testkit-lite_user_guide.pdf b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/doc/testkit-lite_user_guide.pdf
new file mode 100644 (file)
index 0000000..95af88e
Binary files /dev/null and b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/doc/testkit-lite_user_guide.pdf differ
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/doc/testkit-lite_user_guide_for_tct.pdf b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/doc/testkit-lite_user_guide_for_tct.pdf
new file mode 100644 (file)
index 0000000..c0d9323
Binary files /dev/null and b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/doc/testkit-lite_user_guide_for_tct.pdf differ
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/packaging/Makefile b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/packaging/Makefile
new file mode 100644 (file)
index 0000000..24da850
--- /dev/null
@@ -0,0 +1,21 @@
+PKG_NAME := testkit-lite
+SPECFILE = $(addsuffix .spec, $(PKG_NAME))
+PKG_VERSION := $(shell grep '^Version: ' $(SPECFILE)|awk '{print $$2}')
+
+TARBALL := $(PKG_NAME)_$(PKG_VERSION).tar.gz
+
+dsc: $(TARBALL)
+               $(eval MD5=$(shell md5sum $(TARBALL) | sed "s/  / $(shell stat -c '%s' $(TARBALL)) /"))
+                       @sed  -i 's/^Version:.*/Version: $(PKG_VERSION)/' $(PKG_NAME).dsc
+                       @sed  -i 's/ [a-f0-9]\+ [0-9]\+ $(PKG_NAME).*tar.*/ $(MD5)/' $(PKG_NAME).dsc
+
+$(TARBALL):
+               cd "$$(git rev-parse --show-toplevel)" \
+                       && git archive --prefix $(PKG_NAME)-$(PKG_VERSION)/ HEAD \
+                       | gzip > "$(CURDIR)/$(TARBALL)"
+
+clean:
+               rm -f $(PKG_NAME)*.tar.gz
+
+all: clean dsc
+
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/packaging/testkit-lite.dsc b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/packaging/testkit-lite.dsc
new file mode 100644 (file)
index 0000000..bc65561
--- /dev/null
@@ -0,0 +1,11 @@
+Source: testkit-lite
+Section: utils
+Priority: standard
+Maintainer: Lei Yang <lei.a.yang@intel.com>
+Build-Depends: debhelper (>= 8.0.0), python-setuptools, python-support (>= 0.8.4)
+Standards-Version: 3.9.2
+Homepage: https://github.com/testkit/testkit-manager
+Version: 2.3.4
+Files:
+ 82c2118d146839ec9139559f5049d2bf 6361871 testkit-lite_2.3.4.tar.gz
+
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/packaging/testkit-lite.spec b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/packaging/testkit-lite.spec
new file mode 100644 (file)
index 0000000..e915ec4
--- /dev/null
@@ -0,0 +1,47 @@
+Summary: TCT-Lite
+Name: testkit-lite
+Version: 2.3.22
+Release: 1
+License: GPLv2
+Group: Applications/System
+Source: %{name}_%{version}.tar.gz
+
+BuildRequires: python-distribute
+
+%{!?python_sitelib: %define python_sitelib %(python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")}
+
+%description
+testkit-lite is a test runner with command-line interface.It has the following functions 
+1. Accepts .xml test case descriptor files as input. 
+2. drives automatic test execution. 
+3. provide multiple options to meet various test requirements. 
+
+%prep
+%setup -q
+
+%build
+
+%install
+python setup.py install --prefix=%{_prefix} --root=%{buildroot}
+# remove tests
+rm -rf %{buildroot}/%{python_sitelib}/tests
+
+%clean
+rm -rf %{buildroot}
+
+%post
+# Set permissions
+chmod ugo+rwx /opt/testkit/lite_native
+
+%files
+%{python_sitelib}/testkitlite/*
+%{python_sitelib}/commodule/*
+%{python_sitelib}/testkit_lite-*.egg-info/*
+/opt/testkit/lite_native/VERSION
+%{_bindir}/testkit-lite
+%defattr(-,root,root)
+
+%doc
+/opt/testkit/lite_native/testkit-lite_user_guide_for_tct.pdf
+
+%changelog
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/setup.py b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/setup.py
new file mode 100644 (file)
index 0000000..7d737a9
--- /dev/null
@@ -0,0 +1,17 @@
+#!/usr/bin/python
+
+from setuptools import setup, find_packages
+
+setup(
+    name = "testkit-lite",
+    description = "Test runner for test execution",
+    url = "https://github.com/testkit/testkit-lite",
+    author = "Cathy Shen",
+    author_email = "cathy.shen@intel.com",
+    version = "2.3.22",
+    include_package_data = True,
+    data_files = [('/opt/testkit/lite_native/',
+                 ('VERSION', 'doc/testkit-lite_user_guide_for_tct.pdf'))],
+    scripts = ('testkit-lite',),
+    packages = find_packages(),
+)
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/temp/temp b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/temp/temp
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkit-lite b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkit-lite
new file mode 100644 (file)
index 0000000..612d352
--- /dev/null
@@ -0,0 +1,567 @@
+#!/usr/bin/env python3
+#
+# Copyright (C) 2012 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+# USA.
+#
+# Authors:
+#              Jing,Wang  <jing.j.wang@intel.com>
+#              Yuanyuan,Zou  <zouyuanx@intel.com>
+""" testkit lite tools"""
+
+import os
+import sys
+import traceback
+import platform
+import configparser
+import re
+import xml.etree.ElementTree as etree
+from optparse import OptionParser, make_option
+from datetime import datetime
+
+# import logger
+try:
+    from commodule.log import LOGGER
+except ImportError as err:
+    print("[ Error: loading logging failed, error: %s ]\n" % err)
+    print("try to run command " \
+        "'export PYTHONPATH=/usr/lib/python2.7/dist-packages' and " \
+        "'export PYTHONPATH=/usr/share/pyshared/' to resolve this issue")
+    sys.exit(1)
+
+# import  process kill
+try:
+    from testkitlite.common.process_killall import kill_testkit_lite, clean_testxml
+except ImportError as err:
+    LOGGER.error("[ Error: loading module killall failed, error: %s ]\n" % err)
+    LOGGER.info("try to run command \
+'export PYTHONPATH=/usr/lib/python2.7/dist-packages' and \
+'export PYTHONPATH=/usr/share/pyshared/' to resolve this issue")
+    sys.exit(1)
+
+# get platform version info
+os_ver = platform.system()
+JOIN = os.path.join
+EXISTS = os.path.exists
+DIRNAME = os.path.dirname
+BASENAME = os.path.basename
+ABSPATH = os.path.abspath
+SPLIT = os.path.split
+ISLINK = os.path.islink
+
+NOW = datetime.now().strftime("%Y-%m-%d_%H_%M_%S")+ str(os.getpid())
+TESTKIT_DIR = "/opt/testkit/lite_native"
+if not os_ver == "Linux" and not os_ver == "Darwin":
+    TESTKIT_DIR = DIRNAME(ABSPATH(__file__))
+    sys.path += [JOIN(TESTKIT_DIR)]
+    TESTKIT_DIR = JOIN(TESTKIT_DIR, "results")
+
+LOG_DIR = TESTKIT_DIR
+NOW_DIR = JOIN(LOG_DIR, NOW)
+PID_FILE = JOIN(NOW_DIR, "pid.log")
+TEST_PACKAGES_DIR = JOIN(NOW_DIR, "test_packages")
+
+if not EXISTS(NOW_DIR):
+       os.makedirs(NOW_DIR)
+
+#LOGGER.info("\nNOW:%s\n NOW_DIR:%s\n TESTKIT_DIR:%s\n LOG_DIR:%s\n PID_FILE:%s\n TEST_PACKAGES_DIR:%s\n"% (NOW, NOW_DIR, TESTKIT_DIR, LOG_DIR, PID_FILE, TEST_PACKAGES_DIR))
+COMMON_FILTERS = {
+    "suite": [],
+    "set": [],
+    "priority": [],
+    "id": [],
+    "type": [],
+    "component": []}
+down_status = False
+remote_test = False
+can_merge_result = False
+
+# start testkit-lite in Singleton mode
+#kill_testkit_lite(PID_FILE)
+
+if not os_ver == "Linux" and not os_ver == "Darwin":
+    try:
+        #LOGGER.info("\n[ makedirs LOG_DIR: %s ]\n" % LOG_DIR)
+        if not EXISTS(LOG_DIR):
+            os.makedirs(LOG_DIR)
+    except OSError as err:
+        LOGGER.error("[ Error: create results directory:"
+                     " %s failed, error: %s ]\n" % (LOG_DIR, err))
+
+try:
+    #LOGGER.info("\n[ Opening PID_FILE: %s ]\n" % PID_FILE)
+    with open(PID_FILE, "w") as fd:
+        PID = str(os.getpid())
+        fd.writelines(PID + '\n')
+except OSError as e:
+    LOGGER.error("[ Error: can't create pid log file: %s, error: %s ]\n" %
+                (PID_FILE, err))
+    sys.exit(1)
+
+try:
+    os.chmod(PID_FILE, 0o666)
+except OSError:
+    pass
+
+# detect version option
+if "--version" in sys.argv:
+    try:
+        CONFIG = configparser.ConfigParser()
+        if platform.system() == "Linux":
+            CONFIG.read('/opt/testkit/lite_native/VERSION')
+        else:
+            VERSION_FILE = JOIN(sys.path[0], 'VERSION')
+            CONFIG.read(VERSION_FILE)
+        VERSION = CONFIG.get('public_version', 'version')
+        LOGGER.info("V%s" % VERSION)
+    except configparser.Error as err:
+        LOGGER.error(
+            "[ Error: fail to parse version info, error: %s ]\n" % err)
+    sys.exit(1)
+
+# detect internal version option
+if "--internal-version" in sys.argv:
+    try:
+        CONFIG = configparser.ConfigParser()
+        if platform.system() == "Linux":
+            CONFIG.read('/opt/testkit/lite_native/VERSION')
+        else:
+            VERSION_FILE = JOIN(sys.path[0], 'VERSION')
+            CONFIG.read(VERSION_FILE)
+        VERSION = CONFIG.get('internal_version', 'version')
+        print(VERSION)
+    except configparser.Error as err:
+        print("[ Error: fail to parse version info, error: %s ]\n" % err)
+    sys.exit(1)
+
+
+# init test engine here
+try:
+    from testkitlite.engines.default.runner import TRunner
+    from commodule.connector import Connector
+except ImportError as err:
+    LOGGER.error("[ Error: loading test engine failed, error: %s ]\n" % err)
+    LOGGER.info("try to run command "
+                "'export PYTHONPATH=/usr/lib/python2.7/dist-packages' and "
+                "'export PYTHONPATH=/usr/share/pyshared/'to resolve this issue")
+    sys.exit(1)
+
+
+def varnarg(option, opt_str, value, parser):
+    """ parser srg"""
+    value = []
+    import re
+    for arg in parser.rargs:
+        if re.search('^--.+', arg) or \
+                re.search('^-[\D]', arg):
+            break
+        value.append(arg)
+
+    del parser.rargs[:len(value)]
+    setattr(parser.values, option.dest, value)
+
+try:
+    OPTION_LIST = [
+        make_option("-f", "--testxml", dest="testxml",
+                    action="callback", callback=varnarg,
+                    help="Specify the path of test definition file (tests.xml)."
+                    " If run more one test package,just list the all the path "
+                    " of \"tests.xml\" and separate with a whitespace"),
+        make_option("-D", "--dryrun", dest="bdryrun",
+                    action="store_true",
+                    help="Dry-run the selected test cases"),
+        make_option("-M", "--manual-only", dest="bmanualonly",
+                    action="store_true",
+                    help="Enable only manual tests"),
+        make_option("-A", "--auto-only", dest="bautoonly",
+                    action="store_true",
+                    help="Enable only auto tests"),
+        make_option("-o", "--output", dest="resultfile",
+                    help="Specify output file for result xml. \
+                    If more than one testxml provided, \
+                    results will be merged together to this output file"),
+        make_option("-e", dest="exttest", action="store",
+                    help="Launch external test with a launcher,\
+                         supports browser or other web-runtime"),
+        make_option("--version", dest="version_info", action="store_true",
+                    help="Show version information"),
+        make_option("--internal-version", dest="internal_version_info",
+                    action="store_true",
+                    help="Show internal version information"),
+        make_option("--deviceid", dest="device_serial", action="store",
+                    help="set device serial information"),
+        make_option("--testprefix", dest="test_prefix", action="store",
+                    help="set prefix for test case entry"),
+        make_option("--comm", dest="commodule", action="store",
+                    help="set commodule by default,"
+                    "set \"localhost\" for local web testing"),
+        make_option("--capability", dest="capability", action="store",
+                    help="set platform for sepecfic device capability"),
+        make_option("--quit", dest="quit", action="store_true",
+                    help="quit testkit-lite"),
+        make_option("--debug", dest="debug", action="store_true",
+                    help="run in debug mode,more log information print out"),
+        make_option("--rerun", dest="rerun", action="store_true",
+                    help="check if rerun test mode"),
+        make_option("--non-active", dest="non_active", action="store_true",
+                    help="Disable the ability to set the result of \
+                    core manual cases from the console"),
+        make_option("--tizen-version", dest="tizenversion", action="callback", callback=varnarg, help="set tizen version infomation"),
+        make_option("--skip-tc", dest="skip_tc", action="callback", callback=varnarg, help="Specify the testcase id for exclude from the test"),
+        make_option("--stub-port", dest="stubport", action="callback", callback=varnarg, help = "set testkit-stub port number")
+
+    ]
+
+    OPTION_LIST.extend([
+        make_option("--%s" % flt,
+                    dest="w%s" % flt, action="callback", callback=varnarg,
+                    help="Select the specified filter-rules : %s" % flt)
+        for flt in COMMON_FILTERS])
+
+    try:
+        # untrusted behaviour of %%prog
+        USAGE = "%%prog [options] -f [prefix:]\"<somewhere/test.xml>\" -e \
+\"<launcher-name>\"\n\
+forms:    %%prog  -f [prefix:]\"<somewhere>/test.xml\"\n\
+          %%prog  -f [prefix:]\"<somewhere>/test.xml\" -D\n\
+          %%prog  -f [prefix:]\"<somewhere>/test.xml\" -A\n\
+          %%prog  -f [prefix:]\"<somewhere>/test.xml\" -M\n\
+         %%prog  -f [prefix:]\"<somewhere>/test.xml\" --type \"smoke\"\n\
+         %%prog  -f [prefix:]\"<somewhere>/test.xml\" --component \"TizenAPI/Communication/Messaging\"\n\
+          %%prog  -f [prefix:]\"<somewhere>/test1.xml <somewhere>/test2.xml \
+<somewhere>/test3.xml\" \n\
+          %%prog  -f [prefix:]\"<somewhere>/test.xml\" -D -A \ --capability <capability file> --comm <commoduletype>\n\
+          %%prog  -f [prefix:]\"<somewhere>/test.xml\" -D -A \
+...\n\
+exmaples: \n\
+    run a web test package from device side with device WRT (it is default): \n\
+          %%prog -f device:\"/opt/usr/media/tct/opt/tct-websocket-w3c-tests/tests.xml\" -e \
+'WRTLauncher' -A \n\
+    run a web test package from local path with chrome browser: \n\
+          %%prog -f \"/usr/share/webapi-webkit-tests/tests.xml\" -e \
+'<somewhere>/chrome-startup' -A --comm localhost \n\
+\n\
+Note: \n\
+          1) Proxy settings should be disabled when execute webapi packages\n\
+          2) TestLog is stored to %s/latest\n\
+          3) %%prog enables both auto and manual tests by default\n\
+          4) Obviously -A and -M are conflict options\n\
+          5) -e option does not support -D mode\n\
+          6) The test cases' order in the result files might be arbitrary,\
+when running same tests.xml with same options. This is caused \
+by python's API 'iter' from module 'xml.etree.ElementTree'\n\
+          7) run command 'testkit-lite', \
+            it might not be able to locate module 'testkitlite.engines.\
+default.runner', \
+            run command 'export PYTHONPATH=/usr/share/pyshared/' \
+            run command 'export PYTHONPATH=/usr/lib/python2.7/dist-packages' \
+            to resolve this issue" % (LOG_DIR)
+    except Exception:
+        USAGE = None
+
+    # detect non-params
+    if len(sys.argv) == 1:
+        sys.argv.append("-h")
+
+    PARSERS = OptionParser(option_list=OPTION_LIST, usage=USAGE)
+
+    (OPTIONS, ARGS) = PARSERS.parse_args()
+    # detect quit action
+    if OPTIONS.quit:
+        try:
+            LOGGER.info("[ Quit testkit-lite now ]")
+            kill_testkit_lite(PID_FILE)
+        except Exception as err:
+            LOGGER.error("[ Error: fail to kill existing testkit-lite,"
+                         " error: %s ]\n" % err)
+            sys.exit(1)
+
+    # detect conflict
+    if OPTIONS.bautoonly and OPTIONS.bmanualonly:
+        raise ValueError("-A and -M are conflict")
+    if OPTIONS.commodule:
+        if OPTIONS.commodule == 'localhost' and "device:" in OPTIONS.testxml[0]:
+            raise ValueError("For single mode, pls set local file to test ")
+        COMMODULE_TYPE = OPTIONS.commodule
+    else:
+        COMMODULE_TYPE = "tizenmobile"
+
+    CONNECTOR = Connector({"testmode": COMMODULE_TYPE, "deviceid":OPTIONS.device_serial}).get_connector()
+    if CONNECTOR == None:
+        LOGGER.error("[ Error: init commodule error... ]\n")
+        sys.exit(1)
+
+    # create runner
+    RUNNER = TRunner(CONNECTOR)
+    RUNNER.set_pid_log(PID_FILE)
+
+    # apply all options
+    RUNNER.set_global_parameters(OPTIONS)
+
+    if OPTIONS.tizenversion is None:
+        LOGGER.error("[ Error : input your tizen version ]\n")
+        sys.exit(1)
+    else :
+        tizenver = OPTIONS.tizenversion[0]
+        VER_PATTERN = "^tizen_web_\d.\d|^tizen_native_\d.\d"
+        pa = re.compile(VER_PATTERN, re.I)
+        ma = pa.match(tizenver)
+        if ma is None:
+             LOGGER.error("A required \"/opt/tct/"+tizenver+" could not be found.\n")
+             sys.exit(1)
+
+        RUNNER.set_tizenversion(tizenver)
+
+    if OPTIONS.stubport is not None:
+        port = OPTIONS.stubport[0]
+        RUNNER.set_stubport(port)
+
+    if OPTIONS.skip_tc is not None:
+        RUNNER.set_skip_tc(OPTIONS.skip_tc)
+
+    # set capability
+    if OPTIONS.capability:
+        GET_CAPABILITY_STATUS = RUNNER.get_capability(OPTIONS.capability)
+        if not GET_CAPABILITY_STATUS:
+            sys.exit(1)
+
+    if "device:" in OPTIONS.testxml[0]:
+        remote_test = True
+        try:
+            #LOGGER.info("\n[ makedirs TEST_PACKAGES_DIR: %s ]\n" % TEST_PACKAGES_DIR)
+            if not EXISTS(TEST_PACKAGES_DIR):
+                os.makedirs(TEST_PACKAGES_DIR)
+        except OSError as err:
+            LOGGER.error("[ Error: "
+                "can't create test package directory: %s, error: %s ]\n" %
+                        (TEST_PACKAGES_DIR, err))
+            sys.exit(1)
+        REMOTE_TESTLITS = OPTIONS.testxml[0]
+        REMOTE_TESTLITS = REMOTE_TESTLITS.split(':')[1]
+        TESTLISTARRARY = REMOTE_TESTLITS.split()
+        LOCALARRY = []
+
+        for remote_file in TESTLISTARRARY:
+            tmp_remote_file = SPLIT(remote_file)
+            tmp_remote_folder = BASENAME(tmp_remote_file[0])
+            tmp_remote_test_xml = JOIN(
+                tmp_remote_folder, tmp_remote_file[1])
+            local_test_package = JOIN(
+                TEST_PACKAGES_DIR, tmp_remote_test_xml)
+            down_status = RUNNER.connector.download_file(remote_file, local_test_package)
+            if not down_status:
+                LOGGER.error("can not get test definition file, pls check file on device:%s"
+                             % remote_file)
+                sys.exit(1)
+            LOCALARRY.append(local_test_package)
+        OPTIONS.testxml = LOCALARRY
+    else:
+        if len(OPTIONS.testxml) == 1:
+            i = 0
+            start = 0
+            end = 0
+            LOCAL_TESTLISTS= []
+            temp_xml = OPTIONS.testxml[0]
+            while(i < len(temp_xml)):
+                tmp = temp_xml[i:len(temp_xml)]
+                if ".xml" in tmp :
+                    index = tmp.index(".xml")+4+i
+                    end = index
+                    i=index+1
+                    LOCAL_TESTLISTS.append(temp_xml[start:end])
+                    start = index+1
+                else:
+                    print('no xml found')
+                    break
+            OPTIONS.testxml = LOCAL_TESTLISTS
+
+    # apply filter
+    WFILTERS = {}
+    for flt in COMMON_FILTERS:
+        if eval('OPTIONS.w%s' % flt):
+            WFILTERS[flt] = eval('OPTIONS.w%s' % flt)
+    RUNNER.add_filter_rules(**WFILTERS)
+
+    if not OPTIONS.testxml:
+        LOGGER.error("[ Error: not specify a test xml... ]\n")
+        sys.exit(1)
+
+    # 1) prepare log dir
+    if os_ver == "Linux" or os_ver == "Darwin":
+        SESSION = datetime.today().isoformat('-')+str(os.getpid())+"_session"
+    else:
+        SESSION = datetime.today().strftime("%Y-%m-%d_%H_%M_%S")+str(os.getpid())+"_session"
+    CURRENT_LOG_DIR = JOIN(LOG_DIR, SESSION)
+    LATEST_DIR = JOIN(LOG_DIR, "latest")
+    try:
+        if EXISTS(LATEST_DIR):
+            os.remove(LATEST_DIR)
+        if ISLINK(LATEST_DIR):
+            os.remove(LATEST_DIR)
+        os.makedirs(CURRENT_LOG_DIR)
+        if os.name == "posix":
+            os.symlink(CURRENT_LOG_DIR, LATEST_DIR)
+    except IOError as err:
+        LOGGER.error("[ Error: create session log directory: "
+                     "%s failed, error: %s ]\n" % (CURRENT_LOG_DIR, err))
+    except OSError as err:
+        LOGGER.error("error : %s" % err)
+
+    finally:
+        if not EXISTS(CURRENT_LOG_DIR):
+            os.makedirs(CURRENT_LOG_DIR)
+
+    # 2) prepare run test
+    # run more than one tests.xml
+    # 1. run all auto cases from the xmls
+    # 2. run all manual cases from the xmls
+    TESTXMLS = set(OPTIONS.testxml)
+    for t in TESTXMLS:
+        if EXISTS(t):
+            filename = t
+            filename = os.path.splitext(filename)[0]
+            if os_ver == "Linux" or os_ver == "Darwin":
+                if not filename.startswith('/'):
+                    LOGGER.error("[ Error:"
+                          " xml file %s should start with '/' ]" % filename)
+                    sys.exit(1)
+                else:
+                    filename = filename.split('/')[-2]
+                    if filename == "":
+                        LOGGER.error("[ Error:"
+                             " unable to find package name from %s ]" % t)
+                        sys.exit(1)
+            else:
+                filename = filename.split('\\')[-2]
+            filename = "%s.total" % BASENAME(filename)
+            resultfile = "%s.xml" % filename
+            resultfile = JOIN(CURRENT_LOG_DIR, resultfile)
+            try:
+                ep = etree.parse(t)
+                suiteparent = ep.getroot()
+            except etree.ParseError:
+                LOGGER.error("[ Error: no case found in testxml, "
+                             "pls check the test package ]\n")
+                sys.exit(1)
+            no_test_definition = 1
+            for tf in ep.iter('test_definition'):
+                no_test_definition = 0
+            if no_test_definition:
+                suiteparent = etree.Element('test_definition')
+                suiteparent.tail = "\n"
+                for suite in ep.iter('suite'):
+                    suite.tail = "\n"
+                    suiteparent.append(suite)
+            if OPTIONS.bautoonly:
+                WFILTERS['execution_type'] = ["auto"]
+                RUNNER.add_filter_rules(**WFILTERS)
+            if OPTIONS.bmanualonly:
+                WFILTERS['execution_type'] = ["manual"]
+                RUNNER.add_filter_rules(**WFILTERS)
+            RUNNER.apply_filter(suiteparent)
+            # just leave suite and set for merge result
+            for suite in ep.iter('suite'):
+                for tset in suite.findall('set'):
+                    for testcase in tset.findall('testcase'):
+                        tset.remove(testcase)
+            try:
+                #LOGGER.info("\n[ Opening resultfile: %s ]\n" % resultfile)
+                with open(resultfile, 'wb') as output:
+                    tree = etree.ElementTree(element=suiteparent)
+                    tree.write(output)
+            except IOError as err:
+                LOGGER.error(
+                    "[ Error: create filtered total result file: %s failed, "
+                    "error: %s ]\n" % (resultfile, err))
+        else:
+            print("[ Have no test xml found ]")
+            sys.exit(1)
+    START_TIME = datetime.today().strftime("%Y-%m-%d_%H_%M_%S")
+    if not OPTIONS.bautoonly:
+        if OPTIONS.bmanualonly:
+            for t in TESTXMLS:
+                try:
+                    WFILTERS['execution_type'] = ["manual"]
+                    RUNNER.add_filter_rules(**WFILTERS)
+                    RUNNER.prepare_run(t, resultdir=CURRENT_LOG_DIR)
+                except IOError as err:
+                    LOGGER.error("[ Error: prepare_run test xml: "
+                      "%s from testkit-lite failed, error: %s ]\n" % (t, err))
+        else:
+            for t in TESTXMLS:
+                try:
+                    WFILTERS['execution_type'] = ["auto"]
+                    RUNNER.add_filter_rules(**WFILTERS)
+                    RUNNER.prepare_run(t, resultdir=CURRENT_LOG_DIR)
+                except IOError as err:
+                    LOGGER.error("[ Error: prepare_run test xml: "
+                      "%s from testkit-lite failed, error: %s ]\n" % (t, err))
+            for t in TESTXMLS:
+                try:
+                    WFILTERS['execution_type'] = ["manual"]
+                    RUNNER.add_filter_rules(**WFILTERS)
+                    RUNNER.prepare_run(t, resultdir=CURRENT_LOG_DIR)
+                except IOError as err:
+                    LOGGER.error("[ Error: prepare_run test xml: "
+                      "%s from testkit-lite failed, error: %s ]\n" % (t, err))
+    else:
+        for t in TESTXMLS:
+            try:
+                WFILTERS['execution_type'] = ["auto"]
+                RUNNER.add_filter_rules(**WFILTERS)
+                RUNNER.prepare_run(t, resultdir=CURRENT_LOG_DIR)
+            except IOError as err:
+                clean_testxml(TESTXMLS, remote_test)
+                LOGGER.error("[ Error: prepare_run test xml: "
+                  "%s from testkit-lite failed, error: %s ]\n" % (t, err))
+
+    try:
+        can_merge_result = True
+        RUNNER.run_case(CURRENT_LOG_DIR)
+    except Exception as err:
+        clean_testxml(TESTXMLS, remote_test)
+        traceback.print_exc()
+        LOGGER.error("[ Error: run_test_case failed ,error: %s ]\n" % err)
+    try:
+        RUNNER.merge_resultfile(START_TIME, CURRENT_LOG_DIR)
+        clean_testxml(TESTXMLS, remote_test)
+        LOGGER.info("[ all tasks for testkit lite are accomplished, goodbye ]")
+    except Exception as err:
+        traceback.print_exc()
+        clean_testxml(TESTXMLS,remote_test)
+        LOGGER.error("[ Error: merge_resultfile "
+                     "failed,error: %s, goodbye ]\n" % err)
+
+except KeyboardInterrupt as err:
+    if RUNNER.session_id:
+        RUNNER.finalize_test(RUNNER.session_id)
+    if can_merge_result:
+        RUNNER.merge_resultfile(START_TIME, CURRENT_LOG_DIR)
+    if down_status:
+        clean_testxml(OPTIONS.testxml, remote_test)
+    LOGGER.info("\n[ exiting testkit-lite on user cancel, goodbye ]\n")
+    sys.exit(1)
+except Exception as err:
+    if RUNNER.session_id:
+        RUNNER.finalize_test(RUNNER.session_id)
+    if can_merge_result:
+        RUNNER.merge_resultfile(START_TIME, CURRENT_LOG_DIR)
+    if down_status:
+        clean_testxml(OPTIONS.testxml, remote_test)
+    LOGGER.error("\n[ Error: exiting testkit-lite "
+                 "by catching a critical error: %s, goodbye ]\n" % err)
+    traceback.print_exc()
+    sys.exit(1)
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/Makefile.am b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/Makefile.am
new file mode 100644 (file)
index 0000000..adeb570
--- /dev/null
@@ -0,0 +1,24 @@
+# Copyright (C) 2012 Intel Corporation
+# 
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+#
+# Authors:
+#              Zhang, Huihui <huihuix.zhang@intel.com>
+#              Wendong,Sui  <weidongx.sun@intel.com>
+
+SUBDIRS = common engines
+
+testkitlitedir = /usr/lib/python3/dist-packages/testkitlite
+dist_testkitlite_SCRIPTS = __init__.py
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/__init__.py b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/__init__.py
new file mode 100644 (file)
index 0000000..8b13789
--- /dev/null
@@ -0,0 +1 @@
+
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/__init__.pyc b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/__init__.pyc
new file mode 100644 (file)
index 0000000..0b97be5
Binary files /dev/null and b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/__init__.pyc differ
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/common/Makefile.am b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/common/Makefile.am
new file mode 100644 (file)
index 0000000..69860de
--- /dev/null
@@ -0,0 +1,22 @@
+# Copyright (C) 2012 Intel Corporation
+# 
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+#
+# Authors:
+#              Zhang, Huihui <huihuix.zhang@intel.com>
+#              Wendong,Sui  <weidongx.sun@intel.com>
+
+testkitlitecommondir = /usr/lib/python3/dist-packages/testkitlite/common
+dist_testkitlitecommon_SCRIPTS = *.py
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/common/__init__.py b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/common/__init__.py
new file mode 100644 (file)
index 0000000..8b13789
--- /dev/null
@@ -0,0 +1 @@
+
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/common/__init__.pyc b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/common/__init__.pyc
new file mode 100644 (file)
index 0000000..153a963
Binary files /dev/null and b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/common/__init__.pyc differ
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/common/process_killall.py b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/common/process_killall.py
new file mode 100644 (file)
index 0000000..955b0c2
--- /dev/null
@@ -0,0 +1,57 @@
+#!/usr/bin/python
+#
+# Copyright (C) 2012 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+# MA  02110-1301, USA.
+#
+# Authors:
+#              Zhang, Huihui <huihuix.zhang@intel.com>
+#              Wendong,Sui  <weidongx.sun@intel.com>
+""" kill testkit-lite """
+import os
+import platform
+import signal
+import re
+import ctypes
+from commodule.log import LOGGER
+from commodule.killall import killall
+
+
+def kill_testkit_lite(pid_file):
+    """ kill testkit lite"""
+    try:
+        with open(pid_file, "r") as pidfile:
+            pid = pidfile.readline().rstrip("\n")
+            if pid:
+                killall(pid)
+    except IOError as error:
+        pattern = re.compile('No such file or directory|No such process')
+        match = pattern.search(str(error))
+        if not match:
+            LOGGER.info("[ Error: fail to kill existing testkit-lite, "\
+                "error: %s ]\n" % error)
+    return None
+
+def clean_testxml(testxmls,remote_test):
+    """clean all test xmls"""
+    if remote_test:
+        EXISTS = os.path.exists
+        for testxml in testxmls:
+            if EXISTS(testxml):
+                fd_name = os.path.dirname(testxml)
+                os.remove(testxml)
+                os.rmdir(fd_name)
+    return None
\ No newline at end of file
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/common/process_killall.pyc b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/common/process_killall.pyc
new file mode 100644 (file)
index 0000000..46ed1b0
Binary files /dev/null and b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/common/process_killall.pyc differ
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/engines/Makefile.am b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/engines/Makefile.am
new file mode 100644 (file)
index 0000000..ce3bfec
--- /dev/null
@@ -0,0 +1,24 @@
+# Copyright (C) 2012 Intel Corporation
+# 
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+#
+# Authors:
+#              Zhang, Huihui <huihuix.zhang@intel.com>
+#              Wendong,Sui  <weidongx.sun@intel.com>
+
+SUBDIRS = default
+
+testkitliteenginesdir = /usr/lib/python3/dist-packages/testkitlite/engines
+dist_testkitliteengines_SCRIPTS = __init__.py
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/engines/__init__.py b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/engines/__init__.py
new file mode 100644 (file)
index 0000000..8b13789
--- /dev/null
@@ -0,0 +1 @@
+
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/engines/__init__.pyc b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/engines/__init__.pyc
new file mode 100644 (file)
index 0000000..7819696
Binary files /dev/null and b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/engines/__init__.pyc differ
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/engines/default/Makefile.am b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/engines/default/Makefile.am
new file mode 100644 (file)
index 0000000..f19e3c8
--- /dev/null
@@ -0,0 +1,22 @@
+# Copyright (C) 2012 Intel Corporation
+# 
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+#
+# Authors:
+#              Zhang, Huihui <huihuix.zhang@intel.com>
+#              Wendong,Sui  <weidongx.sun@intel.com>
+
+testkitliteenginesdefaultdir = /usr/lib/python3/dist-packages/testkitlite/engines/default
+dist_testkitliteenginesdefault_SCRIPTS = *.py
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/engines/default/__init__.py b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/engines/default/__init__.py
new file mode 100644 (file)
index 0000000..8b13789
--- /dev/null
@@ -0,0 +1 @@
+
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/engines/default/__init__.pyc b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/engines/default/__init__.pyc
new file mode 100644 (file)
index 0000000..a2d6885
Binary files /dev/null and b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/engines/default/__init__.pyc differ
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/engines/default/runner.py b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/engines/default/runner.py
new file mode 100644 (file)
index 0000000..4ac984c
--- /dev/null
@@ -0,0 +1,1209 @@
+#!/usr/bin/python
+#
+# Copyright (C) 2012 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc.,
+# 51 Franklin Street,
+# Fifth Floor,
+# Boston, MA  02110-1301, USA.
+#
+# Authors:
+#              Zhang, Huihui <huihuix.zhang@intel.com>
+#              Wendong,Sui  <weidongx.sun@intel.com>
+#              Yuanyuan,Zou  <zouyuanx@intel.com>
+""" prepare run , split xml ,run case , merge result """
+
+import os
+import platform
+import time
+import sys
+import traceback
+import collections
+import string
+import random
+from datetime import datetime
+from shutil import copyfile
+import xml.etree.ElementTree as etree
+import configparser
+from tempfile import mktemp
+from shutil import move
+from os import remove
+from commodule.log import LOGGER
+from commodule.str2 import str2xmlstr
+
+
+from .worker import TestWorker
+
+TCT_CONFIG_FILE = "/opt/tools/TCT_CONFIG"
+tct_parser = configparser.ConfigParser()
+tct_parser.read(TCT_CONFIG_FILE)
+
+DEVICE_SUITE_TARGET_24 = tct_parser.get('DEVICE', 'DEVICE_SUITE_TARGET_24')
+DEVICE_SUITE_TARGET_30 = tct_parser.get('DEVICE', 'DEVICE_SUITE_TARGET_30')
+DEVICE_EXECUTION_MODE_30 = tct_parser.get('DEVICE', 'DEVICE_EXECUTION_MODE_30')
+DEVICE_SUITE_TARGET_30_STR = "{DEVICE_SUITE_TARGET_30}"
+DEVICE_EXECUTION_MODE_30_STR = "{DEVICE_EXECUTION_MODE_30}"
+
+JOIN = os.path.join
+DIRNAME = os.path.dirname
+BASENAME = os.path.basename
+EXISTS = os.path.exists
+ABSPATH = os.path.abspath
+
+
+class TRunner:
+
+    """
+    Parse the testdefinition.xml files.
+    Apply filter for each run.
+    Conduct tests execution.
+    """
+
+    def __init__(self, connector):
+        """ init all self parameters here """
+        # dryrun
+        self.bdryrun = False
+        # non_active
+        self.non_active = False
+        # result file
+        self.resultfile = None
+        # external test
+        self.external_test = None
+        # filter rules
+        self.filter_rules = None
+        self.debug = False
+        self.resultfiles = set()
+        self.core_auto_files = []
+        self.core_manual_files = []
+        self.skip_all_manual = False
+        self.testsuite_dict = {}
+        self.exe_sequence = []
+        self.testresult_dict = {"pass": 0, "fail": 0,
+                                "block": 0, "not_run": 0}
+        self.current_test_xml = "none"
+        self.first_run = True
+        self.deviceid = None
+        self.session_id = None
+        self.pid_log = None
+        self.set_parameters = {}
+        self.connector = connector
+        self.testworker = TestWorker(connector)
+        self.stub_name = "testkit-stub"
+        self.capabilities = {}
+        self.has_capability = False
+        self.rerun = False
+        self.test_prefix = ""
+        self.tizenV = None
+        self.skip_tc = None
+        self.stub_port = "8000"
+
+    def set_global_parameters(self, options):
+        "get all options "
+        # apply dryrun
+        if options.bdryrun:
+            self.bdryrun = options.bdryrun
+        # Disable set the result of core manual cases from the console
+        if options.non_active:
+            self.non_active = options.non_active
+        # apply user specify test result file
+        if options.resultfile:
+            self.resultfile = options.resultfile
+        # set the external test WRTLauncher
+        if options.exttest:
+            self.external_test = options.exttest
+        if options.debug:
+            self.debug = options.debug
+        if options.rerun:
+            self.rerun = options.rerun
+        if options.test_prefix:
+            self.test_prefix = options.test_prefix
+        if options.device_serial:
+            self.deviceid = options.device_serial
+
+    def set_pid_log(self, pid_log):
+        """ get pid_log file """
+        self.pid_log = pid_log
+
+    def add_filter_rules(self, **kargs):
+        """
+        kargs:  key:values - "":["",]
+        """
+        self.filter_rules = kargs
+
+    def set_session_id(self, session_id):
+        """ set the set test session id which is get form com_module """
+        self.session_id = session_id
+
+    def set_stubport(self, stubport):
+        self.stub_port = stubport
+
+    def set_tizenversion(self, _tizenV):
+        self.tizenV = _tizenV
+        self.testworker.set_TizenVersion(self.tizenV)
+
+    def set_skip_tc(self, skip_tc):
+        self.skip_tc = skip_tc
+
+    def set_capability(self, capabilities):
+        """ set capabilitys  """
+        self.capabilities = capabilities
+        self.has_capability = True
+
+    def prepare_run(self, testxmlfile, resultdir=None):
+        """
+        testxmlfile: target testxml file
+        execdir and resultdir: should be the absolute path since TRunner
+        is the common lib
+        """
+        # resultdir is set to current directory by default
+        if not resultdir:
+            resultdir = os.getcwd()
+        ok_prepare = True
+        if ok_prepare:
+            try:
+                filename = testxmlfile
+                filename = os.path.splitext(filename)[0]
+                if platform.system() == "Linux":
+                    filename = filename.split('/')[-2]
+                else:
+                    filename = filename.split('\\')[-2]
+                if self.filter_rules["execution_type"] == ["manual"]:
+                    resultfile = "%s.manual.xml" % filename
+                else:
+                    resultfile = "%s.auto.xml" % filename
+                resultfile = JOIN(resultdir, resultfile)
+                if not EXISTS(resultdir):
+                    os.mkdir(resultdir)
+                LOGGER.info("[ analysis test xml file: %s ]" % resultfile)
+                self.__prepare_result_file(testxmlfile, resultfile)
+                self.__split_test_xml(resultfile, resultdir)
+            except IOError as error:
+                LOGGER.error(error)
+                ok_prepare &= False
+        return ok_prepare
+
+    def __split_test_xml(self, resultfile, resultdir):
+        """ split_test_xml into auto and manual"""
+        casefind = etree.parse(resultfile).iter('testcase')
+        if casefind:
+            test_file_name = "%s" % BASENAME(resultfile)
+            test_file_name = os.path.splitext(test_file_name)[0]
+            self.__splite_external_test(
+                resultfile, test_file_name, resultdir)
+
+    def __splite_core_test(self, resultfile):
+        """select core test"""
+        if self.filter_rules["execution_type"] == ["auto"]:
+            self.core_auto_files.append(resultfile)
+        else:
+            self.core_manual_files.append(resultfile)
+        self.resultfiles.add(resultfile)
+
+    def __splite_external_test(self, resultfile, test_file_name, resultdir):
+        """select external_test"""
+        testsuite_dict_value_list = []
+        testsuite_dict_add_flag = 0
+        filename_diff = 1
+
+        parser = etree.parse(resultfile)
+        for tsuite in parser.iter('suite'):
+            root = etree.Element('test_definition')
+            suitefilename = os.path.splitext(resultfile)[0]
+            suitefilename += ".suite_%s.xml" % filename_diff
+            suitefilename = JOIN(resultdir, suitefilename)
+            tsuite.tail = "\n"
+            root.append(tsuite)
+            try:
+                with open(suitefilename, 'wb') as output:
+                    tree = etree.ElementTree(element=root)
+                    tree.write(output)
+            except IOError as error:
+                LOGGER.error("[ Error: create filtered result file: %s failed,\
+                 error: %s ]" % (suitefilename, error))
+            case_suite_find = etree.parse(
+                suitefilename).iter('testcase')
+            if case_suite_find:
+                if tsuite.get('launcher'):
+                    if tsuite.get('launcher').find('WRTLauncher'):
+                        self.__splite_core_test(suitefilename)
+                    else:
+                        testsuite_dict_value_list.append(suitefilename)
+                        if testsuite_dict_add_flag == 0:
+                            self.exe_sequence.append(test_file_name)
+                        testsuite_dict_add_flag = 1
+                        self.resultfiles.add(suitefilename)
+                else:
+                    if self.filter_rules["execution_type"] == ["auto"]:
+                        self.core_auto_files.append(suitefilename)
+                    else:
+                        self.core_manual_files.append(suitefilename)
+                    self.resultfiles.add(suitefilename)
+            filename_diff += 1
+        if testsuite_dict_add_flag:
+            self.testsuite_dict[test_file_name] = testsuite_dict_value_list
+
+    def __prepare_result_file(self, testxmlfile, resultfile):
+        """ write the test_xml content to resultfile"""
+        try:
+            parse_tree = etree.parse(testxmlfile)
+            suiteparent = parse_tree.getroot()
+            no_test_definition = 1
+            if parse_tree.iter('test_definition'):
+                no_test_definition = 0
+            if no_test_definition:
+                suiteparent = etree.Element('test_definition')
+                suiteparent.tail = "\n"
+                for suite in parse_tree.iter('suite'):
+                    suite.tail = "\n"
+                    suiteparent.append(suite)
+            self.apply_filter(suiteparent)
+            try:
+                with open(resultfile, 'wb') as output:
+                    tree = etree.ElementTree(element=suiteparent)
+                    tree.write(output)
+            except IOError as error:
+                LOGGER.error("[ Error: create filtered result file: %s failed,\
+                    error: %s ]" % (resultfile, error))
+        except IOError as error:
+            LOGGER.error(error)
+            return False
+
+    def run_case(self, latest_dir):
+        """ run case """
+        # run core auto cases
+        self.__run_core_auto()
+
+        # run webAPI cases
+        self.__run_webapi_test(latest_dir)
+
+        # run core manual cases
+        self.__run_core_manual()
+
+    def __run_core_auto(self):
+        """ core auto cases run"""
+        self.core_auto_files.sort()
+        for core_auto_file in self.core_auto_files:
+            temp_test_xml = os.path.splitext(core_auto_file)[0]
+            temp_test_xml = os.path.splitext(temp_test_xml)[0]
+            temp_test_xml = os.path.splitext(temp_test_xml)[0]
+            temp_test_xml += ".auto"
+            # print identical xml file name
+            if self.current_test_xml != temp_test_xml:
+                time.sleep(3)
+                LOGGER.info("\n[ testing xml: %s.xml ]" % temp_test_xml)
+                self.current_test_xml = temp_test_xml
+            self.__run_with_commodule(core_auto_file)
+
+    def __run_core_manual(self):
+        """ core manual cases run """
+        self.core_manual_files.sort()
+        for core_manual_file in self.core_manual_files:
+            temp_test_xml = os.path.splitext(core_manual_file)[0]
+            temp_test_xml = os.path.splitext(temp_test_xml)[0]
+            temp_test_xml = os.path.splitext(temp_test_xml)[0]
+            temp_test_xml += ".manual"
+            # print identical xml file name
+            if self.current_test_xml != temp_test_xml:
+                time.sleep(3)
+                LOGGER.info("\n[ testing xml: %s.xml ]" % temp_test_xml)
+                self.current_test_xml = temp_test_xml
+            if self.non_active:
+                self.skip_all_manual = True
+            else:
+                self.__run_with_commodule(core_manual_file)
+
+    def __run_webapi_test(self, latest_dir):
+        """ run webAPI test"""
+        if self.bdryrun:
+            LOGGER.info("[ WRTLauncher mode does not support dryrun ]")
+            return True
+
+        list_auto = []
+        list_manual = []
+        for i in self.exe_sequence:
+            if i[-4::1] == "auto":
+                list_auto.append(i)
+            if i[-6::1] == "manual":
+                list_manual.append(i)
+        list_auto.sort()
+        list_manual.sort()
+        self.exe_sequence = []
+        self.exe_sequence.extend(list_auto)
+        self.exe_sequence.extend(list_manual)
+
+        for webapi_total_file in self.exe_sequence:
+            for webapi_file in self.testsuite_dict[webapi_total_file]:
+                # print identical xml file name
+                if self.current_test_xml != \
+                        JOIN(latest_dir, webapi_total_file):
+                    time.sleep(3)
+                    LOGGER.info("\n[ testing xml: %s.xml ]\n"
+                                % JOIN(latest_dir, webapi_total_file))
+                    self.current_test_xml = JOIN(latest_dir, webapi_total_file)
+
+                self.__run_with_commodule(webapi_file)
+
+    def __run_with_commodule(self, webapi_file):
+        """run_with_commodule,Initialization,check status,get result"""
+        try:
+            # prepare test set list
+            test_xml_set_list = self.__split_xml_to_set(webapi_file)
+            # create temporary parameter
+            for test_xml_set in test_xml_set_list:
+                LOGGER.info("\n[ run set: %s ]" % test_xml_set)
+                # prepare the test JSON
+                self.__prepare_external_test_json(test_xml_set)
+
+                # init test here
+                init_status = self.__init_com_module(test_xml_set)
+                if not init_status:
+                    continue
+                # send set JSON Data to com_module
+                self.testworker.run_test(
+                    self.session_id, self.set_parameters)
+                while True:
+                    time.sleep(1)
+                    # check the test status ,if the set finished,get
+                    # the set_result,and finalize_test
+                    if self.__check_test_status():
+                        set_result = self.testworker.get_test_result(
+                            self.session_id)
+                        # write_result to set_xml
+                        self.__write_set_result(
+                            test_xml_set, set_result)
+                        # shut down server
+                        self.finalize_test(self.session_id)
+                        break
+        except IOError as error:
+            LOGGER.error(
+                "[ Error: fail to run webapi test xml, error: %s ]" % error)
+
+    def __split_xml_to_set(self, webapi_file):
+        """split xml by <set>"""
+
+        LOGGER.debug("[ split xml: %s by <set> ]" % webapi_file)
+        LOGGER.debug("[ this might take some time, please wait ]")
+        set_number = 1
+        test_xml_set_list = []
+        self.resultfiles.discard(webapi_file)
+        test_xml_temp = etree.parse(webapi_file)
+        for test_xml_temp_suite in test_xml_temp.iter('suite'):
+            while set_number <= len(test_xml_temp_suite.findall('set')):
+                copy_url = os.path.splitext(webapi_file)[0]
+                copy_url += "_set_%s.xml" % set_number
+                copyfile(webapi_file, copy_url)
+                test_xml_set_list.append(copy_url)
+                self.resultfiles.add(copy_url)
+                set_number += 1
+        time.sleep(3)
+        set_number -= 1
+        LOGGER.info("[ total set number is: %s ]" % set_number)
+
+        # only keep one set in each xml file and remove empty set
+        test_xml_set_list_empty = []
+        if len(test_xml_set_list) > 1:
+            test_xml_set_list.reverse()
+        for test_xml_set in test_xml_set_list:
+            test_xml_set_tmp = etree.parse(test_xml_set)
+            set_keep_number = 1
+            # LOGGER.debug("[ process set: %s ]" % test_xml_set)
+            for temp_suite in test_xml_set_tmp.iter('suite'):
+                for test_xml_set_temp_set in temp_suite.findall('set'):
+                    if set_keep_number != set_number:
+                        temp_suite.remove(test_xml_set_temp_set)
+                    else:
+                        if not test_xml_set_temp_set.iter('testcase'):
+                            test_xml_set_list_empty.append(test_xml_set)
+                    set_keep_number += 1
+            set_number -= 1
+            test_xml_set_tmp.write(test_xml_set)
+        for empty_set in test_xml_set_list_empty:
+            LOGGER.debug("[ remove empty set: %s ]" % empty_set)
+            test_xml_set_list.remove(empty_set)
+            self.resultfiles.discard(empty_set)
+        if len(test_xml_set_list) > 1:
+            test_xml_set_list.reverse()
+        return test_xml_set_list
+
+    def merge_resultfile(self, start_time, latest_dir):
+        """ merge_result_file """
+        mergefile = mktemp(suffix='.xml', prefix='tests.', dir=latest_dir)
+        #LOGGER.info("\nmergefile: %s ]" % mergefile)
+        mergefile = os.path.splitext(mergefile)[0]
+        #LOGGER.info("\nmergefile: %s ]" % mergefile)
+        mergefile = os.path.splitext(mergefile)[0]
+        #LOGGER.info("\nmergefile: %s ]" % mergefile)
+        mergefile = "%s.result" % BASENAME(mergefile)
+        #LOGGER.info("\nmergefile: %s ]" % mergefile)
+        mergefile = "%s.xml" % mergefile
+        #LOGGER.info("\nmergefile: %s ]" % mergefile)
+        mergefile = JOIN(latest_dir, mergefile)
+        #LOGGER.info("\nmergefile: %s ]" % mergefile)
+        end_time = datetime.today().strftime("%Y-%m-%d_%H_%M_%S")
+        LOGGER.info("\n[ test complete at time: %s ]" % end_time)
+        LOGGER.debug("[ start merging test result xml files, "\
+            "this might take some time, please wait ]")
+        LOGGER.debug("[ merge result files into %s ]" % mergefile)
+        root = etree.Element('test_definition')
+        root.tail = "\n"
+        totals = set()
+
+        # merge result files
+        resultfiles = self.resultfiles
+        totals = self.__merge_result(resultfiles, totals)
+
+        for total in totals:
+            result_xml = etree.parse(total)
+            for suite in result_xml.iter('suite'):
+                if suite.iter('testcase'):
+                    suite.tail = "\n"
+                    root.append(suite)
+        # print test summary
+        self.__print_summary()
+        # generate actual xml file
+        LOGGER.info("[ generate result xml: %s ]" % mergefile)
+        if self.skip_all_manual:
+            LOGGER.info("[ some results of core manual cases are N/A,"
+                        "please refer to the above result file ]")
+        LOGGER.info("[ merge complete, write to the result file,"
+                    " this might take some time, please wait ]")
+        # get useful info for xml
+        # add environment node
+        # add summary node
+        root.insert(0, get_summary(start_time, end_time))
+        root.insert(0, self.__get_environment())
+        # add XSL support to testkit-lite
+        declaration_text = """<?xml version="1.0" encoding="UTF-8"?>\n"""
+        #LOGGER.info("\nmergefile: %s ]" % mergefile)
+        try:
+            with open(mergefile, 'w') as output:
+                output.write(declaration_text)
+            with open(mergefile, 'ab') as output:
+                tree =etree.ElementTree(element=root)
+                tree.write(output, xml_declaration=False, encoding='utf-8')
+        except IOError as error:
+            LOGGER.error(
+                "[ Error: merge result file failed, error: %s ]" % error)
+        # change &lt;![CDATA[]]&gt; to <![CDATA[]]>
+        replace_cdata(mergefile)
+        # copy result to -o option
+        try:
+            if self.resultfile:
+                if os.path.splitext(self.resultfile)[-1] == '.xml':
+                    if not os.path.exists(os.path.dirname(self.resultfile)):
+                        if len(os.path.dirname(self.resultfile)) > 0:
+                            os.makedirs(os.path.dirname(self.resultfile))
+                    LOGGER.info("[ copy result xml to output file:"
+                                " %s ]" % self.resultfile)
+                    copyfile(mergefile, self.resultfile)
+                else:
+                    LOGGER.info(
+                        "[ Please specify and xml file for result output,"
+                        " not:%s ]" % self.resultfile)
+
+                for root, dirs, files in os.walk(latest_dir):
+                    for afile in files:
+                        if os.path.splitext(afile)[-1] == '.dlog':
+                            LOGGER.info("[ copy result dlog to output file:"
+                                    " %s ]" % afile)
+                            dlogfile = os.path.join(root, afile)
+                            finalName = afile
+                            rerunString = self.resultfile.split('.')[-2]
+                            if(rerunString == 'rerun'):
+                                extraNames = afile.split('.')
+                                extraName = ""
+                                if not extraNames[1].isdigit():
+                                        extraName = extraNames[1] + '.'
+                                for i in range(2, len(extraNames)-1):
+                                        extraName += extraNames[i]+'.'
+                                finalName = self.resultfile.split('/')[-1].split('.')[0]+"."+extraName[:-1]+"_rerun_"+str(datetime.now())+".dlog"
+                            destdfile = os.path.join(\
+                            os.path.dirname(self.resultfile), finalName)
+                            print(("destdfile = "+destdfile))
+                            copyfile(dlogfile, destdfile)
+#                 for afile in os.listdir(os.path.dirname(self.resultfile)):
+#                      if ".dlog" in afile and "tct" not in afile:
+#                              os.remove(afile)
+
+        except IOError as error:
+            LOGGER.error("[ Error: fail to copy the result file to: %s,"
+                         " please check if you have created its parent directory,"
+                         " error: %s ]" % (self.resultfile, error))
+
+    def __merge_result(self, setresultfiles, totals):
+        """ merge set result to total"""
+        resultfiles = setresultfiles
+        for resultfile in resultfiles:
+            totalfile = os.path.splitext(resultfile)[0]
+            totalfile = os.path.splitext(totalfile)[0]
+            totalfile = os.path.splitext(totalfile)[0]
+            totalfile = "%s.total" % totalfile
+            totalfile = "%s.xml" % totalfile
+            total_xml = etree.parse(totalfile)
+            # LOGGER.info("|--[ merge webapi result file: %s ]" % resultfile)
+            result_xml = etree.parse(resultfile)
+            for total_suite in total_xml.iter('suite'):
+                for total_set in total_suite.iter('set'):
+                    for result_suite in result_xml.iter('suite'):
+                        for result_set in result_suite.iter('set'):
+                            # when total xml and result xml have same suite
+                            # name and set name
+                            self.__merge_result_by_name(\
+                                    result_set, total_set, \
+                                    result_suite, total_suite)
+            total_xml.write(totalfile)
+            totals.add(totalfile)
+        return totals
+
+    def __merge_result_by_name(
+            self, result_set, total_set, result_suite, total_suite):
+        ''' merge result select by name'''
+        if result_set.get('name') == total_set.get('name') \
+                and result_suite.get('name') == total_suite.get('name'):
+            if result_set.get('set_debug_msg'):
+                total_set.set("set_debug_msg", result_set.get('set_debug_msg'))
+            # set cases that doesn't have result in result \
+            # set to N/A
+            # append cases from result set to total set
+            result_case_iterator = result_set.iter(
+                'testcase')
+            if result_case_iterator:
+                # LOGGER.info("----[ suite: %s, set: %s, time: %s ]"
+                #% (result_suite.get('name'), result_set.get('name'),
+                #    datetime.today().strftime("%Y-%m-%d_%H_%M_%S")))
+                for result_case in result_case_iterator:
+                    try:
+                        if self.skip_tc and str(self.skip_tc).find(result_case.get('id')) > -1:
+                            continue
+                        self.__count_result(result_case)
+                        total_set.append(result_case)
+                    except IOError as error:
+                        LOGGER.error("[ Error: fail to append %s, error: %s ]"
+                                     % (result_case.get('id'), error))
+
+    def __count_result(self, result_case):
+        """ record the pass,failed,block,N/A case number"""
+
+        if not result_case.get('result'):
+            result_case.set('result', 'N/A')
+            # add empty result node structure for N/A case
+            resinfo_elm = etree.Element('result_info')
+            res_elm = etree.Element('actual_result')
+            start_elm = etree.Element('start')
+            end_elm = etree.Element('end')
+            stdout_elm = etree.Element('stdout')
+            stderr_elm = etree.Element('stderr')
+            resinfo_elm.append(res_elm)
+            resinfo_elm.append(start_elm)
+            resinfo_elm.append(end_elm)
+            resinfo_elm.append(stdout_elm)
+            resinfo_elm.append(stderr_elm)
+            result_case.append(resinfo_elm)
+            res_elm.text = 'N/A'
+        if result_case.get('result') == "PASS":
+            self.testresult_dict["pass"] += 1
+        if result_case.get('result') == "FAIL":
+            self.testresult_dict["fail"] += 1
+        if result_case.get('result') == "BLOCK":
+            self.testresult_dict["block"] += 1
+        if result_case.get('result') == "N/A":
+            self.testresult_dict["not_run"] += 1
+
+    def __get_environment(self):
+        """ get environment """
+        device_info = self.connector.get_device_info()
+        build_info = self.connector.get_buildinfo(self.tizenV)
+
+        # add environment node
+        environment = etree.Element('environment')
+        environment.attrib['device_id'] = device_info['device_id']
+        environment.attrib['device_model'] = device_info["device_model"]
+        environment.attrib['device_name'] = device_info["device_name"]
+        environment.attrib['build_id'] = device_info['build_id']
+        LOGGER.info("Build Id Extracted From Device is: " + str(environment.attrib['build_id']))
+        environment.attrib['host'] = platform.platform()
+        environment.attrib['resolution'] = device_info["resolution"]
+        environment.attrib['screen_size'] = device_info["screen_size"]
+        environment.attrib['device_model'] = build_info['model']
+        environment.attrib['manufacturer'] = build_info['manufacturer']
+        other = etree.Element('other')
+        other.text = ""
+        environment.append(other)
+        environment.tail = "\n"
+
+        return environment
+
+    def __print_summary(self):
+        """ print test summary infomation"""
+        LOGGER.info("[ test summary ]")
+        total_case_number = int(self.testresult_dict["pass"]) \
+            + int(self.testresult_dict["fail"]) \
+            + int(self.testresult_dict["block"]) \
+            + int(self.testresult_dict["not_run"])
+        LOGGER.info("  [ total case number: %s ]" % (total_case_number))
+        if total_case_number == 0:
+            LOGGER.info("[Warning: found 0 case from the result files, "
+                        "if it's not right, please check the test xml files, "
+                        "or the filter values ]")
+        else:
+            LOGGER.info("  [ pass rate: %.2f%% ]" % (float(
+                self.testresult_dict["pass"]) * 100 / int(total_case_number)))
+            LOGGER.info("  [ PASS case number: %s ]" %
+                        self.testresult_dict["pass"])
+            LOGGER.info("  [ FAIL case number: %s ]" %
+                        self.testresult_dict["fail"])
+            LOGGER.info("  [ BLOCK case number: %s ]" %
+                        self.testresult_dict["block"])
+            LOGGER.info("  [ N/A case number: %s ]" %
+                        self.testresult_dict["not_run"])
+
+    def __prepare_external_test_json(self, resultfile):
+        """Run external test"""
+        parameters = {}
+        xml_set_tmp = resultfile
+        # split set_xml by <case> get case parameters
+        LOGGER.debug("[ split xml: %s by <case> ]" % xml_set_tmp)
+        LOGGER.debug("[ this might take some time, please wait ]")
+        try:
+            parse_tree = etree.parse(xml_set_tmp)
+            root_em = parse_tree.getroot()
+            case_tmp = []
+            for tset in root_em.iter('set'):
+                case_order = 1
+                parameters.setdefault(
+                    "casecount", str(len(tset.findall('testcase')))
+                )
+                parameters.setdefault("current_set_name", xml_set_tmp)
+
+                for tcase in tset.iter('testcase'):
+                    if self.skip_tc and str(self.skip_tc).find(tcase.get('id')) > -1:
+                        continue
+
+                    case_detail_tmp = {}
+                    step_tmp = []
+                    parameters.setdefault(
+                        "exetype", tcase.get('execution_type')
+                    )
+
+                    parameters.setdefault("type", tcase.get('type'))
+                    case_detail_tmp.setdefault("case_id", tcase.get('id'))
+                    case_detail_tmp.setdefault("purpose", tcase.get('purpose'))
+                    case_detail_tmp.setdefault("order", str(case_order))
+                    case_detail_tmp.setdefault("onload_delay", "3")
+
+                    if tcase.find('description/test_script_entry') is not None:
+                        tc_entry = tcase.find(
+                            'description/test_script_entry').text
+                        if not tc_entry:
+                            tc_entry = ""
+
+                        tc_entry = tc_entry.replace(DEVICE_SUITE_TARGET_30_STR,DEVICE_SUITE_TARGET_30)
+                        tc_entry = tc_entry.replace(DEVICE_EXECUTION_MODE_30_STR,DEVICE_EXECUTION_MODE_30)
+
+                        case_detail_tmp["entry"] = self.test_prefix + tc_entry
+                        if tcase.find(
+                                'description/test_script_entry')\
+                                        .get('timeout'):
+                            case_detail_tmp["timeout"] = tcase.find(
+                                'description/test_script_entry'
+                            ).get('timeout')
+                        if tcase.find(
+                            'description/test_script_entry'
+                        ).get('test_script_expected_result'):
+                            case_detail_tmp["expected_result"] = tcase.find(
+                                'description/test_script_entry'
+                            ).get('test_script_expected_result')
+                    for this_step in tcase.iter("step"):
+                        step_detail_tmp = {}
+                        step_detail_tmp.setdefault("order", "1")
+                        step_detail_tmp["order"] = str(this_step.get('order'))
+
+                        if this_step.find("step_desc") is not None:
+                            text = this_step.find("step_desc").text
+                            if text is not None:
+                                step_detail_tmp["step_desc"] = text
+
+                        if this_step.find("expected") is not None:
+                            text = this_step.find("expected").text
+                            if text is not None:
+                                step_detail_tmp["expected"] = text
+
+                        step_tmp.append(step_detail_tmp)
+
+                    case_detail_tmp['steps'] = step_tmp
+
+                    if tcase.find('description/pre_condition') is not None:
+                        text = tcase.find('description/pre_condition').text
+                        if text is not None:
+                            case_detail_tmp["pre_condition"] = text
+
+                    if tcase.find('description/post_condition') is not None:
+                        text = tcase.find('description/post_condition').text
+                        if text is not None:
+                            case_detail_tmp['post_condition'] = text
+
+                    if tcase.get('onload_delay') is not None:
+                        case_detail_tmp[
+                            'onload_delay'] = tcase.get('onload_delay')
+                    # Check performance test
+                    if tcase.find('measurement') is not None:
+                        measures = tcase.iter('measurement')
+                        measures_array = []
+                        for measure in measures:
+                            measure_json = {}
+                            measure_json['name'] = measure.get('name')
+                            measure_json['file'] = measure.get('file')
+                            measures_array.append(measure_json)
+                        case_detail_tmp['measures'] = measures_array
+                    case_tmp.append(case_detail_tmp)
+                    case_order += 1
+            parameters.setdefault("cases", case_tmp)
+            if self.bdryrun:
+                parameters.setdefault("dryrun", True)
+            self.set_parameters = parameters
+
+        except IOError as error:
+            LOGGER.error("[ Error: fail to prepare cases parameters, "
+                         "error: %s ]\n" % error)
+            return False
+        return True
+
+    def apply_filter(self, root_em):
+        """ apply filter """
+        rules = self.filter_rules
+        for tsuite in root_em.findall('suite'):
+            if rules.get('suite'):
+                if tsuite.get('name') not in rules['suite']:
+                    root_em.remove(tsuite)
+            for tset in tsuite.findall('set'):
+                if rules.get('set'):
+                    if tset.get('name') not in rules['set']:
+                        tsuite.remove(tset)
+
+            for tsuite in root_em.findall('suite'):
+                for tset in tsuite.findall('set'):
+                    # if there are capabilities ,do filter
+                    if self.has_capability:
+                        tset_status = self.__apply_capability_filter_set(tset)
+                        if not tset_status:
+                            tsuite.remove(tset)
+                            continue
+                    for tcase in tset.findall('testcase'):
+                        if not self.__apply_filter_case_check(tcase):
+                            tset.remove(tcase)
+
+    def __apply_filter_case_check(self, tcase):
+        """filter cases"""
+        rules = self.filter_rules
+        for key in rules.keys():
+            if key in ["suite", "set"]:
+                continue
+
+            #suhee.yoo : priority filter
+            if key in ["priority"]:
+                if not tcase.get(key):
+                    return False
+
+            # Check attribute
+            t_val = tcase.get(key)
+            if t_val:
+                if not t_val in rules[key]:
+                    return False
+            else:
+                # Check sub-element
+                items = tcase.iter(key)
+                if items:
+                    t_val = []
+                    for i in items:
+                        t_val.append(i.text)
+                    if len(set(rules[key]) & set(t_val)) == 0:
+                        return False
+        return True
+
+    def __apply_capability_filter_set(self, tset):
+        """ check the set required capability with  self.capabilities """
+
+        for tcaps in tset.iter('capabilities'):
+            for tcap in tcaps.iter('capability'):
+                capname = None
+                capvalue = None
+                capname = tcap.get('name').lower()
+                if tcap.find('value') is not None:
+                    capvalue = tcap.find('value').text
+
+                if capname in self.capabilities:
+                    if capvalue is not None:
+                        if capvalue != self.capabilities[capname]:
+                            # if capability value is not equal ,remove the case
+                            return False
+                else:
+                    # if does not hava this capability ,remove case
+                    return False
+        return True
+
+    # sdx@kooltux.org: parse measures returned by test script
+    # and insert in XML result
+    # see xsd/test_definition.xsd: measurementType
+    _MEASURE_ATTRIBUTES = ['name', 'value', 'unit',
+                           'target', 'failure', 'power']
+
+    def __insert_measures(self, case, buf, pattern="###[MEASURE]###"):
+        """ get measures """
+        measures = self.__extract_measures(buf, pattern)
+        for measure in measures:
+            m_elm = etree.Element('measurement')
+            for key in measure:
+                m_elm.attrib[key] = measure[key]
+            case.append(m_elm)
+
+    def __extract_measures(self, buf, pattern):
+        """
+        This function extracts lines from <buf> containing the defined
+        <pattern>. For each line containing the pattern, it extracts the
+        string to the end of line Then it splits the content in multiple
+        fields using the defined separator <field_sep> and maps the fields
+        to measurement attributes defined in xsd. Finally, a list containing
+        all measurement objects found in input buffer is returned
+        """
+        out = []
+        for line in buf.split("\n"):
+            pos = line.find(pattern)
+            if pos < 0:
+                continue
+
+            measure = {}
+            elts = collections.deque(line[pos + len(pattern):].split(':'))
+            for k in self._MEASURE_ATTRIBUTES:
+                if len(elts) == 0:
+                    measure[k] = ''
+                else:
+                    measure[k] = elts.popleft()
+
+            # don't accept unnamed measure
+            if measure['name'] != '':
+                out.append(measure)
+        return out
+
+    def __init_com_module(self, testxml):
+        """
+            send init test to com_module
+            if webapi test,com_module will start testkit-stub
+            else com_module send the test case to devices
+        """
+        starup_prms = self.__prepare_starup_parameters(testxml)
+        # init stub and get the session_id
+        session_id = self.testworker.init_test(starup_prms)
+        if session_id == None:
+            LOGGER.error("[ Error: Initialization Error]")
+            return False
+        else:
+            self.set_session_id(session_id)
+            return True
+
+    def __prepare_starup_parameters(self, testxml):
+        """ prepare_starup_parameters """
+
+        starup_parameters = {}
+        LOGGER.info("[ prepare_startup_parameters ]")
+        try:
+            parse_tree = etree.parse(testxml)
+            tsuite = next(parse_tree.getroot().iter('suite'))
+            tset = next(parse_tree.getroot().iter('set'))
+            if tset.get("launcher") is not None:
+                starup_parameters['test-launcher'] = tset.get("launcher")
+            else:
+                starup_parameters['test-launcher'] = tsuite.get("launcher")
+            starup_parameters['testsuite-name'] = tsuite.get("name")
+            starup_parameters['testset-name'] = tset.get("name")
+            starup_parameters['stub-name'] = self.stub_name
+            if self.external_test is not None:
+                starup_parameters['external-test'] = self.external_test
+            starup_parameters['debug'] = self.debug
+            starup_parameters['test_prefix'] = self.test_prefix
+            if self.rerun:
+                starup_parameters['rerun'] = self.rerun
+            if len(self.capabilities) > 0:
+                starup_parameters['capability'] = self.capabilities
+            if self.tizenV is not None:
+                starup_parameters['tizen-version'] = self.tizenV
+            if self.stub_port is not None:
+                starup_parameters['stub-port'] = self.stub_port
+
+        except IOError as error:
+            LOGGER.error(
+                "[ Error: prepare startup parameters, error: %s ]" % error)
+        return starup_parameters
+
+    def __check_test_status(self):
+        '''
+            get_test_status from com_module
+            check the status
+            if end ,return ture; else return False
+        '''
+        # check test running or end
+        # if the status id end return True ,else return False
+
+        session_status = self.testworker.get_test_status(self.session_id)
+        # session_status["finished"] == "0" is running
+        # session_status["finished"] == "1" is end
+        if not session_status == None:
+            if session_status["finished"] == "0":
+                progress_msg_list = session_status["msg"]
+                for line in progress_msg_list:
+                    LOGGER.info(line)
+                return False
+            elif session_status["finished"] == "1":
+                return True
+        else:
+            LOGGER.error("[ session status error ,pls finalize test ]\n")
+            # return True to finished this set  ,becasue server error
+            return True
+
+    def finalize_test(self, sessionid):
+        '''shut_down testkit-stub'''
+        try:
+            self.testworker.finalize_test(sessionid)
+        except Exception as error:
+            LOGGER.error("[ Error: fail to close webapi http server, "
+                         "error: %s ]" % error)
+
+    def get_capability(self, file_name):
+        """get_capability from file """
+
+        capability_xml = file_name
+        capabilities = {}
+        try:
+            parse_tree = etree.parse(capability_xml)
+            root_em = parse_tree.getroot()
+            for tcap in root_em.iter('capability'):
+                capability = get_capability_form_node(tcap)
+                capabilities = dict(capabilities, **capability)
+
+            self.set_capability(capabilities)
+            return True
+        except IOError as error:
+            LOGGER.error(
+                "[ Error: fail to parse capability xml, error: %s ]" % error)
+            return False
+
+    def __write_set_result(self, testxmlfile, result):
+        '''
+            get the result JSON form com_module,
+            write them to orignal testxmlfile
+
+        '''
+        # write the set_result to set_xml
+        set_result_xml = testxmlfile
+        # covert JOSN to python dict string
+        set_result = result
+        if 'resultfile' in set_result:
+            self.__write_file_result(set_result_xml, set_result)
+        else:
+            write_json_result(set_result_xml, set_result)
+
+    def __write_file_result(self, set_result_xml, set_result):
+        """write xml result file"""
+        result_file = set_result['resultfile']
+        try:
+            if self.rerun:
+                LOGGER.info("[ Web UI FW Unit Test Does not support rerun.\
+                      Result should be N/A ]\n")
+            else:
+                test_tree = etree.parse(set_result_xml)
+                test_em = test_tree.getroot()
+                result_tree = etree.parse(result_file)
+                result_em = result_tree.getroot()
+                dubug_file = os.path.basename(set_result_xml)
+                dubug_file = os.path.splitext(dubug_file)[0] + '.dlog'
+                for result_suite in result_em.iter('suite'):
+                    for result_set in result_suite.iter('set'):
+                        for test_suite in test_em.iter('suite'):
+                            for test_set in test_suite.iter('set'):
+                                if result_set.get('name') == \
+                                        test_set.get('name'):
+                                    result_set.set("set_debug_msg", dubug_file)
+                                    test_suite.remove(test_set)
+                                    test_suite.append(result_set)
+                test_tree.write(set_result_xml)
+                os.remove(result_file)
+            LOGGER.info("[ cases result saved to resultfile ]\n")
+        except OSError as error:
+            traceback.print_exc()
+            LOGGER.error(
+                "[ Error: fail to write cases result, error: %s ]\n" % error)
+
+
+def get_capability_form_node(capability_em):
+    ''' splite capability key and value form element tree'''
+    tmp_key = ''
+    capability = {}
+    tcap = capability_em
+    if tcap.get("name"):
+        tmp_key = tcap.get("name").lower()
+
+    if tcap.get("type").lower() == 'boolean':
+        if tcap.get("support").lower() == 'true':
+            capability[tmp_key] = True
+
+    if tcap.get("type").lower() == 'integer':
+        if tcap.get("support").lower() == 'true':
+            if tcap.iter(
+                    "value") and tcap.find("value").text is not None:
+                capability[tmp_key] = int(tcap.find("value").text)
+
+    if tcap.get("type").lower() == 'string':
+        if tcap.get("support").lower() == 'true':
+            if tcap.iter(
+                    "value") and tcap.find("value").text is not None:
+                capability[tmp_key] = tcap.find("value").text
+
+    return capability
+
+
+def get_version_info():
+    """
+        get testkit tool version ,just read the version in VERSION file
+        VERSION file must put in /opt/testkit/lite_native/
+    """
+    try:
+        config = configparser.ConfigParser()
+        if platform.system() == "Linux":
+            config.read('/opt/testkit/lite_native/VERSION')
+        else:
+            version_file = os.path.join(sys.path[0], 'VERSION')
+            config.read(version_file)
+        version = config.get('public_version', 'version')
+        return version
+    except KeyError as error:
+        LOGGER.error(
+            "[ Error: fail to parse version info, error: %s ]\n" % error)
+        return ""
+
+
+def replace_cdata(file_name):
+    """ replace some character"""
+    try:
+        abs_path = mktemp()
+        new_file = open(abs_path, 'w')
+        old_file = open(file_name)
+        for line in old_file:
+            line_temp = line.replace('&lt;![CDATA', '<![CDATA')
+            new_file.write(line_temp.replace(']]&gt;', ']]>'))
+        new_file.close()
+        old_file.close()
+        remove(file_name)
+        move(abs_path, file_name)
+    except IOError as error:
+        LOGGER.error("[ Error: fail to replace cdata in the result file, "
+                     "error: %s ]\n" % error)
+
+
+def extract_notes(buf, pattern):
+    """util func to split lines in buffer, search for pattern on each line
+    then concatenate remaining content in output buffer"""
+    out = ""
+    for line in buf.split("\n"):
+        pos = line.find(pattern)
+        if pos >= 0:
+            out += line[pos + len(pattern):] + "\n"
+    return out
+
+# sdx@kooltux.org: parse notes in buffer and insert them in XML result
+
+
+def insert_notes(case, buf, pattern="###[NOTE]###"):
+    """ insert notes"""
+    desc = case.find('description')
+    if desc is None:
+        return
+
+    notes_elm = desc.find('notes')
+    if notes_elm is None:
+        notes_elm = etree.Element('notes')
+        desc.append(notes_elm)
+    if notes_elm.text is None:
+        notes_elm.text = extract_notes(buf, pattern)
+    else:
+        notes_elm.text += "\n" + extract_notes(buf, pattern)
+
+
+def get_summary(start_time, end_time):
+    """ set summary node """
+    summary = etree.Element('summary')
+    summary.attrib['test_plan_name'] = "Empty test_plan_name"
+    start_at = etree.Element('start_at')
+    start_at.text = start_time
+    end_at = etree.Element('end_at')
+    end_at.text = end_time
+    summary.append(start_at)
+    summary.append(end_at)
+    summary.tail = "\n  "
+    return summary
+
+
+def write_json_result(set_result_xml, set_result):
+    ''' fetch result form JSON'''
+
+    case_results = set_result["cases"]
+    try:
+        parse_tree = etree.parse(set_result_xml)
+        root_em = parse_tree.getroot()
+        dubug_file = os.path.basename(set_result_xml)
+        dubug_file = os.path.splitext(dubug_file)[0] + '.dlog'
+        for tset in root_em.iter('set'):
+            tset.set("set_debug_msg", dubug_file)
+            for tcase in tset.iter('testcase'):
+                for case_result in case_results:
+                    if tcase.get("id") == case_result['case_id']:
+                        tcase.set('result', case_result['result'].upper())
+                        # Check performance test
+                        if tcase.find('measurement') is not None:
+                            for measurement in tcase.iter(
+                                    'measurement'):
+                                if 'measures' in case_result:
+                                    m_results = case_result['measures']
+                                    for m_result in m_results:
+                                        if measurement.get('name') == \
+                                                m_result['name'] and 'value' in m_result:
+                                            measurement.set(
+                                                'value', m_result[
+                                                    'value'])
+                        if tcase.find("./result_info") is not None:
+                            tcase.remove(tcase.find("./result_info"))
+                        result_info = etree.SubElement(tcase, "result_info")
+                        actual_result = etree.SubElement(
+                            result_info, "actual_result")
+                        actual_result.text = case_result['result'].upper()
+
+                        start = etree.SubElement(result_info, "start")
+                        end = etree.SubElement(result_info, "end")
+                        stdout = etree.SubElement(result_info, "stdout")
+                        stderr = etree.SubElement(result_info, "stderr")
+                        if 'start_at' in case_result:
+                            start.text = case_result['start_at']
+                        if 'end_at' in case_result:
+                            end.text = case_result['end_at']
+                        if 'stdout' in case_result:
+                            stdout.text = str2xmlstr(case_result['stdout'])
+                        if 'stderr' in case_result:
+                            stderr.text = str2xmlstr(case_result['stderr'])
+        parse_tree.write(set_result_xml)
+
+        LOGGER.info("[ cases result saved to resultfile ]\n")
+    except IOError as error:
+        traceback.print_exc()
+        LOGGER.error(
+            "[ Error: fail to write cases result, error: %s ]\n" % error)
+
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/engines/default/runner.pyc b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/engines/default/runner.pyc
new file mode 100644 (file)
index 0000000..697e3cf
Binary files /dev/null and b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/engines/default/runner.pyc differ
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/engines/default/worker.py b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/engines/default/worker.py
new file mode 100644 (file)
index 0000000..12bb97e
--- /dev/null
@@ -0,0 +1,661 @@
+#!/usr/bin/python
+#
+# Copyright (C) 2012 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+# MA  02110-1301, USA.
+#
+# Authors:
+#           Chengtao,Liu  <chengtaox.liu@intel.com>
+""" The implementation test worker"""
+
+import os
+import time
+import threading
+import uuid
+import configparser
+
+from datetime import datetime
+from commodule.log import LOGGER
+from commodule.httprequest import get_url, http_request
+
+TCT_CONFIG_FILE = "/opt/tools/TCT_CONFIG"
+tct_parser = configparser.ConfigParser()
+tct_parser.read(TCT_CONFIG_FILE)
+
+DEVICE_SUITE_TARGET_24 = tct_parser.get('DEVICE', 'DEVICE_SUITE_TARGET_24')
+DEVICE_SUITE_TARGET_30 = tct_parser.get('DEVICE', 'DEVICE_SUITE_TARGET_30')
+
+CNT_RETRY = 10
+DATE_FORMAT_STR = "%Y-%m-%d %H:%M:%S"
+UIFW_MAX_TIME = 300
+UIFW_MAX_WRITE_TIME = 10
+UIFW_RESULT = os.path.join(DEVICE_SUITE_TARGET_24, "Documents/tcresult")
+UIFW_SET_NUM = 0
+LAUNCH_ERROR = 1
+BLOCK_ERROR = 3
+
+
+class TestSetResut(object):
+
+    """ test result """
+
+    _progress = "execute case: %s # %s...(%s)"
+    _mutex = threading.Lock()
+
+    def __init__(self, testsuite_name="", testset_name=""):
+        self._suite_name = testsuite_name
+        self._set_name = testset_name
+        self._result = {"cases": []}
+        self._finished = 0
+
+    def set_status(self, flag=0):
+        """set finished tag"""
+        self._mutex.acquire()
+        self._finished = flag
+        self._mutex.release()
+
+    def get_status(self):
+        """return finished tag"""
+        self._mutex.acquire()
+        flag = self._finished
+        self._mutex.release()
+        return flag
+
+    def set_result(self, tresult):
+        """set cases result to result buffer"""
+        self._mutex.acquire()
+        self._result = tresult
+        self._mutex.release()
+
+    def extend_result(self, cases_result=None, print_out=True):
+        """update cases result to the result buffer"""
+        self._mutex.acquire()
+        if cases_result is not None:
+            self._result["cases"].extend(cases_result)
+
+        if print_out:
+            for case_it in cases_result:
+                LOGGER.info(self._progress %
+                            (self._suite_name, case_it['case_id'], \
+                                    case_it['result']))
+                if case_it['result'].lower() in ['fail', 'block'] \
+                        and 'stdout' in case_it:
+                    LOGGER.info(case_it['stdout'])
+        self._mutex.release()
+
+    def get_result(self):
+        """get cases result from the result buffer"""
+        self._mutex.acquire()
+        result = self._result
+        self._mutex.release()
+        return result
+
+
+def _print_dlog(dlog_file):
+    if os.path.exists(dlog_file):
+        LOGGER.info('[ start of dlog message ]')
+        readbuff = file(dlog_file, "r")
+        for line in readbuff.readlines():
+            LOGGER.info(line.strip('\n'))
+        LOGGER.info('[ end of dlog message ]')
+
+
+def _core_test_exec(conn, test_set_name, exetype, cases_queue, result_obj, \
+        tizen_version):
+    """function for running core tests"""
+    exetype = exetype.lower()
+    total_count = len(cases_queue)
+    current_idx = 0
+    manual_skip_all = False
+    result_list = []
+    for test_case in cases_queue:
+        if result_obj.get_status() == 1:
+            break
+
+        current_idx += 1
+        core_cmd = ""
+        if "entry" in test_case:
+            core_cmd = test_case["entry"]
+        else:
+            LOGGER.info(
+                "[ Warnning: test script is empty,"
+                " please check your test xml file ]")
+            continue
+        expected_result = test_case.get('expected_result', '0')
+        time_out = int(test_case.get('timeout', '90'))
+        measures = test_case.get('measures', [])
+        retmeasures = []
+
+        LOGGER.info("\n[%s:%s] TestCase: %s\n"
+                    "TestEntry: %s"
+                    % (current_idx, total_count, test_case['case_id'], core_cmd))
+        strtime = datetime.now().strftime(DATE_FORMAT_STR)
+        LOGGER.info("start: %s" % strtime)
+        test_case["start_at"] = strtime
+        if exetype == 'auto':
+            return_code, stdout, stderr = conn.shell_cmd_ext(
+                core_cmd, time_out, False)
+
+            if return_code is not None and return_code != "timeout":
+                test_case["result"] = "pass" if str(
+                    return_code) == expected_result else "fail"
+                test_case["stdout"] = stdout
+                test_case["stderr"] = stderr
+                for item in measures:
+                    ind = item['name']
+                    fname = item['file']
+                    if fname is None:
+                        continue
+                    tmpname = os.path.expanduser("~") + os.sep + "mea_tmp"
+                    if conn.download_file(fname, tmpname):
+                        try:
+                            config = configparser.ConfigParser()
+                            config.read(tmpname)
+                            item['value'] = config.get(ind, 'value')
+                            retmeasures.append(item)
+                            os.remove(tmpname)
+                        except IOError as error:
+                            LOGGER.error(
+                                "[ Error: fail to parse value,"
+                                " error:%s ]\n" % error)
+                test_case["measures"] = retmeasures
+            else:
+                test_case["result"] = "BLOCK"
+                test_case["stdout"] = stdout
+                test_case["stderr"] = stderr
+        elif exetype == 'manual':
+            # handle manual core cases
+            try:
+                # LOGGER.infopre-condition info
+                if "pre_condition" in test_case:
+                    LOGGER.info("\n****\nPre-condition: %s\n ****\n"
+                                % test_case['pre_condition'])
+                # LOGGER.infostep info
+                if "steps" in test_case:
+                    for step in test_case['steps']:
+                        LOGGER.info(
+                            "********************\n"
+                            "Step Order: %s" % step['order'])
+                        LOGGER.info("Step Desc: %s" % step['step_desc'])
+                        LOGGER.info(
+                            "Expected: %s\n********************\n"
+                            % step['expected'])
+                if manual_skip_all:
+                    test_case["result"] = "N/A"
+                else:
+                    while True:
+                        test_result = input(
+                            '[ please input case result ]'
+                            ' (p^PASS, f^FAIL, b^BLOCK, n^Next, d^Done):')
+                        if test_result.lower() == 'p':
+                            test_case["result"] = "PASS"
+                            break
+                        elif test_result.lower() == 'f':
+                            test_case["result"] = "FAIL"
+                            break
+                        elif test_result.lower() == 'b':
+                            test_case["result"] = "BLOCK"
+                            break
+                        elif test_result.lower() == 'n':
+                            test_case["result"] = "N/A"
+                            break
+                        elif test_result.lower() == 'd':
+                            manual_skip_all = True
+                            test_case["result"] = "N/A"
+                            break
+                        else:
+                            LOGGER.info(
+                                "[ Warnning: you input: '%s' is invalid,"
+                                " please try again ]" % test_result)
+            except IOError as error:
+                LOGGER.info(
+                    "[ Error: fail to get core manual test step,"
+                    " error: %s ]\n" % error)
+        strtime = datetime.now().strftime(DATE_FORMAT_STR)
+        LOGGER.info("end : %s" % strtime)
+        test_case["end_at"] = strtime
+        LOGGER.info("execute case: %s" % test_case["result"])
+        result_list.append(test_case)
+
+    result_obj.extend_result(result_list, False)
+    result_obj.set_status(1)
+
+
+def _web_test_exec(conn, server_url, test_web_app, exetype, cases_queue, \
+        result_obj, tizen_version):
+    """function for running web tests"""
+    exetype = exetype.lower()
+    test_set_finished = False
+    err_cnt = 0
+    relaunch_cnt = 0
+    for test_group in cases_queue:
+        if test_set_finished:
+            break
+
+        ret = http_request(
+            get_url(server_url, "/set_testcase"), "POST", test_group, 30)
+        if ret is None:
+            LOGGER.error(
+                "[ set testcases timeout, please check device! ]")
+            result_obj.set_status(1)
+            break
+
+        if not conn.launch_app(test_web_app):
+            result_obj.set_status(1)
+            break
+
+        while True:
+            if result_obj.get_status() == 1:
+                test_set_finished = True
+                break
+            ret = http_request(
+                get_url(server_url, "/check_server_status"), "GET", {})
+            if ret is None:
+                err_cnt += 1
+                LOGGER.info("/check_server_status : %s " % ret)
+                if err_cnt >= CNT_RETRY:
+                    LOGGER.error(
+                        "[ check server status time out, \
+                                please check device! ]")
+                    test_set_finished = True
+                    result_obj.set_status(1)
+                    break
+            else:
+                result_cases = ret.get("cases")
+                error_code = ret.get("error_code")
+                if error_code is not None:
+                    if not conn.launch_app(test_web_app):
+                        test_set_finished = True
+                        result_obj.set_status(1)
+                        break
+                    if error_code == LAUNCH_ERROR:
+                        LOGGER.error("[ERROR : test app no response, hang or not launched!]")
+                        relaunch_cnt += 1
+                        if relaunch_cnt >= 3:
+                            test_set_finished = True
+                            result_obj.set_status(1)
+                            break
+                    elif error_code == BLOCK_ERROR:
+                        relaunch_cnt = 0
+                else:
+                    err_cnt = 0
+                    relaunch_cnt = 0
+
+                if result_cases is not None and len(result_cases):
+                    result_obj.extend_result(result_cases)
+                elif exetype == 'manual':
+                    LOGGER.info(
+                        "[ please execute manual cases ]\r\n")
+
+                if ret["finished"] == 1:
+                    test_set_finished = True
+                    result_obj.set_status(1)
+                    break
+                elif ret["block_finished"] == 1:
+                    break
+            time.sleep(2)
+
+
+def _webuifw_test_exec(conn, test_web_app, test_session, test_set_name, \
+        exetype, cases_queue, result_obj):
+    """function for running webuifw tests"""
+    global UIFW_SET_NUM
+    UIFW_SET_NUM = UIFW_SET_NUM + 1
+    set_UIFW_RESULT = UIFW_RESULT + "_" + str(UIFW_SET_NUM) + ".xml"
+    result_obj.set_status(0)
+    result_obj.set_result({"resultfile": ""})
+    ls_cmd = "ls -l %s" % set_UIFW_RESULT
+    sz_cmd = "du -hk %s " % set_UIFW_RESULT
+    time_out = UIFW_MAX_TIME
+    rm_cmd = "rm " + os.path.join(DEVICE_SUITE_TARGET_24, "Documents/tcresult*.xml")
+
+    if exetype == "auto":
+        conn.shell_cmd(rm_cmd)
+        UIFW_SET_NUM = 1
+        LOGGER.info('[webuifw] start test executing')
+        if not conn.launch_app(test_web_app):
+            LOGGER.info("[ launch test app \"%s\" failed! ]" \
+                    % str(test_web_app))
+            result_obj.set_result({"resultfile": ""})
+            result_obj.set_status(1)
+
+    result_file = os.path.expanduser("~") + os.sep + test_session + "_uifw.xml"
+
+    while time_out > 0:
+        LOGGER.info('[webuifw] waiting for test completed...')
+        exit_code, ret = conn.shell_cmd(ls_cmd)
+        if not 'No such file or directory' in ret[0]:
+            exit_code, ret = conn.shell_cmd(sz_cmd)
+            f_size = int(ret[0].split("\t")[0])
+            if f_size > 0:
+                break
+            if time_out > UIFW_MAX_WRITE_TIME:
+                time_out = UIFW_MAX_WRITE_TIME
+        time.sleep(2)
+        time_out -= 2
+
+    LOGGER.info('[webuifw] end test executing')
+    if conn.download_file(set_UIFW_RESULT, result_file):
+        result_obj.set_result({"resultfile": result_file})
+    for test_case in cases_queue:
+        LOGGER.info("[webuifw] execute case: %s # %s" %
+                    (test_set_name, test_case['case_id']))
+    result_obj.set_status(1)
+
+
+class TestWorker(object):
+
+    """Test executor for testkit-lite"""
+
+    def __init__(self, client=None):
+        super(TestWorker, self).__init__()
+        self.conn = client
+        self.tizen_version = ""
+        self.server_url = None
+        self.result_obj = None
+        self.opts = dict({'block_size': 300,
+                          'test_type': None,
+                          'auto_iu': False,
+                          'fuzzy_match': False,
+                          'self_exec': False,
+                          'self_repeat': False,
+                          'debug_mode': False
+                          })
+
+    def set_TizenVersion(self, tizenversion):
+        self.tizen_version = tizenversion
+
+    def __init_test_stub(self, stub_app, stub_port, debug_opt):
+        # init testkit-stub deamon process
+        timecnt = 0
+        blaunched = False
+        while timecnt < CNT_RETRY:
+            if not self.conn.check_process(stub_app):
+                LOGGER.info(\
+                        "[ no stub process activated, now try to launch %s ]"\
+                        % stub_app)
+                self.conn.launch_stub(stub_app, stub_port, debug_opt)
+                timecnt += 1
+            else:
+                blaunched = True
+                break
+
+        if not blaunched:
+            LOGGER.info("[ launch stub process failed! ]")
+            return False
+
+        if self.server_url is None:
+            self.server_url = self.conn.get_server_url(stub_port)
+
+        timecnt = 0
+        blaunched = False
+        while timecnt < CNT_RETRY:
+            ret = http_request(get_url(
+                self.server_url, "/check_server_status"), "GET", {})
+            if ret is None:
+                LOGGER.info("[ check server status, not ready yet! ]")
+                timecnt += 1
+                time.sleep(1)
+            else:
+                blaunched = True
+                break
+        return blaunched
+
+    def __init_webtest_opt(self, params):
+        """init the test runtime, mainly process the star up of test stub"""
+        if params is None:
+            return None
+
+        session_id = str(uuid.uuid1())
+        cmdline = ""
+        debug_opt = ""
+        stub_app = params.get('stub-name', 'testkit-stub')
+        stub_port = params.get('stub-port', '8000')
+        test_launcher = params.get('external-test', '')
+        testsuite_name = params.get('testsuite-name', '')
+        testset_name = params.get('testset-name', '')
+        capability_opt = params.get("capability", None)
+        client_cmds = params.get('test-launcher', '').strip().split()
+        wrt_tag = client_cmds[1] if len(client_cmds) > 1 else ""
+        self.opts['fuzzy_match'] = fuzzy_match = wrt_tag.find('z') != -1
+        self.opts['auto_iu'] = auto_iu = wrt_tag.find('iu') != -1
+        self.opts['self_exec'] = wrt_tag.find('a') != -1
+        self.opts['self_repeat'] = wrt_tag.find('r') != -1
+        self.opts['debug_mode'] = params.get("debug", False)
+
+        test_opt = self.conn.get_launcher_opt(
+            test_launcher, testsuite_name, testset_name, fuzzy_match, auto_iu)
+        if test_opt is None:
+            LOGGER.info("[ init the test options, get failed ]")
+            return None
+
+        # to be removed in later version
+        test_opt["suite_id"] = test_opt["test_app_id"]
+        self.opts.update(test_opt)
+
+        # uifw, this suite don't need stub
+        if self.opts['self_exec'] or self.opts['self_repeat']:
+            self.opts['test_type'] = "jqunit"
+            return session_id
+
+        # enable debug information
+        if self.opts['debug_mode']:
+            debug_opt = '--debug'
+
+        if self.__init_test_stub(stub_app, stub_port, debug_opt):
+            ret = http_request(get_url(
+                self.server_url, "/init_test"), "POST", test_opt)
+            if ret is None:
+                LOGGER.info("[ init test suite failed! ]")
+                return None
+            elif "error_code" in ret:
+                LOGGER.info("[ init test suite, "
+                            "get error code %d ! ]" % ret["error_code"])
+                return None
+
+            if capability_opt is not None:
+                ret = http_request(get_url(self.server_url,
+                                           "/set_capability"),
+                                   "POST", capability_opt)
+            return session_id
+        else:
+            LOGGER.info("[ Init test failed ! ]")
+            return None
+
+    def init_test(self, params):
+        """init the test envrionment"""
+        self.opts['testset_name'] = params.get('testset-name', '')
+        self.opts['testsuite_name'] = params.get('testsuite-name', '')
+        if params.get('test-launcher') is not None:
+            self.opts['test_type'] = "webapi"
+            return self.__init_webtest_opt(params)
+        else:
+            self.opts['test_type'] = "coreapi"
+            return str(uuid.uuid1())
+
+    def __run_core_test(self, sessionid, test_set_name, exetype, cases):
+        """
+            process the execution for core api test
+        """
+        self.opts['async_th'] = threading.Thread(
+            target=_core_test_exec,
+            args=(
+                self.conn, test_set_name, exetype, cases, self.result_obj,\
+                        self.tizen_version)
+        )
+        self.opts['async_th'].start()
+        return True
+
+    def __run_jqt_test(self, sessionid, test_set_name, cases):
+        """
+            process the execution for Qunit testing
+        """
+        exetype = "auto" if self.opts['self_exec'] else ""
+        self.opts['async_th'] = threading.Thread(
+            target=_webuifw_test_exec,
+            args=(
+                self.conn, self.opts['test_app_id'], sessionid, test_set_name,\
+                        exetype, cases, self.result_obj)
+        )
+        self.opts['async_th'].start()
+        return True
+
+    def __run_web_test(self, sessionid, test_set_name, exetype, ctype, cases):
+        """
+            process the execution for web api test
+            may be splitted to serveral blocks,
+            with the unit size defined by block_size
+        """
+        case_count = len(cases)
+        blknum = 0
+        if case_count % self.opts['block_size'] == 0:
+            blknum = case_count / self.opts['block_size']
+        else:
+            blknum = case_count / self.opts['block_size'] + 1
+
+        idx = 1
+        test_set_queues = []
+        while idx <= blknum:
+            block_data = {}
+            block_data["exetype"] = exetype
+            block_data["type"] = ctype
+            block_data["totalBlk"] = str(blknum)
+            block_data["currentBlk"] = str(idx)
+            block_data["casecount"] = str(case_count)
+            start = (idx - 1) * self.opts['block_size']
+            if idx == blknum:
+                end = case_count
+            else:
+                end = idx * self.opts['block_size']
+            block_data["cases"] = cases[start:end]
+            test_set_queues.append(block_data)
+            idx += 1
+        self.opts['async_th'] = threading.Thread(
+            target=_web_test_exec,
+            args=(
+                self.conn, self.server_url, self.opts['test_app_id'], exetype,\
+                        test_set_queues, self.result_obj, self.tizen_version)
+        )
+        self.opts['async_th'].start()
+        return True
+
+    def run_test(self, sessionid, test_set):
+        """
+            process the execution for a test set
+        """
+        if sessionid is None:
+            return False
+
+        if not "cases" in test_set:
+            return False
+
+        # start debug trace thread
+        dlogfile = test_set['current_set_name'].replace('.xml', '.dlog')
+        self.opts['dlog_file'] = dlogfile
+        self.conn.start_debug(dlogfile)
+        time.sleep(1)
+
+        self.result_obj = TestSetResut(
+            self.opts['testsuite_name'], self.opts['testset_name'])
+
+        cases, exetype, ctype = test_set[
+            "cases"], test_set["exetype"], test_set["type"]
+
+        devid = self.conn.get_devid()
+        if self.conn.is_NE_mode() or (devid and devid.find('None') > -1):
+            result_list = []
+            for case in cases:
+                test_case = {}
+                test_case['case_id'] = case['case_id']
+                test_case['result'] = 'N/A'
+                if devid.find('None') > -1:
+                    test_case['stdout'] = "target not found"
+                else:
+                    issue_num = int(self.conn.is_NE_mode())
+                    err_msg = "precondition failed "
+                    if issue_num == 1:
+                        err_msg += "(not connected to wifi)"
+                    elif issue_num == 2:
+                        err_msg += "(not set email account)"
+                    elif issue_num == 3:
+                        err_msg += "(not available device network)"
+                    elif issue_num == 4:
+                        err_msg += "(not enable bluetooth)"
+                    elif issue_num == 5:
+                        err_msg += "(not enable nfc)"
+                    elif issue_num == 6:
+                        err_msg += "(not available sim card)"
+                    test_case['stdout'] = err_msg
+
+                result_list.append(test_case)
+
+            self.result_obj.extend_result(result_list)
+            self.result_obj.set_status(1)
+            return True
+
+        if self.opts['test_type'] == "webapi":
+            return self.__run_web_test(sessionid, \
+                    self.opts['testset_name'], exetype, ctype, cases)
+        elif self.opts['test_type'] == "coreapi":
+            return self.__run_core_test(sessionid, \
+                    self.opts['testset_name'], exetype, cases)
+        elif self.opts['test_type'] == "jqunit":
+            return self.__run_jqt_test(sessionid, \
+                    self.opts['testset_name'], cases)
+        else:
+            LOGGER.info("[ unsupported test suite type ! ]")
+            return False
+
+    def get_test_status(self, sessionid):
+        """poll the test task status"""
+        if sessionid is None:
+            return None
+        result = {}
+        result["msg"] = []
+        result["finished"] = str(self.result_obj.get_status())
+        return result
+
+    def get_test_result(self, sessionid):
+        """get the test result for a test set """
+        result = {}
+        if sessionid is None:
+            return result
+
+        result = self.result_obj.get_result()
+        return result
+
+    def finalize_test(self, sessionid):
+        """clear the test stub and related resources"""
+        if sessionid is None:
+            return False
+
+        self.result_obj.set_status(1)
+
+        # stop test app
+        if self.opts['test_type'] == "webapi":
+            self.conn.kill_app(self.opts['test_app_id'])
+            # uninstall test app
+            if self.opts['auto_iu']:
+                self.conn.uninstall_app(self.opts['test_app_id'])
+
+        # stop debug thread
+        self.conn.stop_debug()
+
+        # add dlog output for debug
+        if self.opts['debug_mode']:
+            _print_dlog(self.opts['dlog_file'])
+
+        return True
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/engines/default/worker.pyc b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/engines/default/worker.pyc
new file mode 100644 (file)
index 0000000..7633909
Binary files /dev/null and b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/testkitlite/engines/default/worker.pyc differ
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/web/Makefile.am b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/web/Makefile.am
new file mode 100644 (file)
index 0000000..7c6dc85
--- /dev/null
@@ -0,0 +1,22 @@
+# Copyright (C) 2012 Intel Corporation
+# 
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+#
+# Authors:
+#              Zhang, Huihui <huihuix.zhang@intel.com>
+#              Wendong,Sui  <weidongx.sun@intel.com>
+
+testkitwebdir = /opt/testkit/web
+dist_testkitweb_DATA = *.html *.js
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/web/index.html b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/web/index.html
new file mode 100644 (file)
index 0000000..ffe4019
--- /dev/null
@@ -0,0 +1,1148 @@
+<!doctype html>
+<!--
+# Copyright (C) 2012 Intel Corporation
+# 
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+#
+# Authors:
+#              Wang, Jing <jing.j.wang@intel.com>
+#              Tang, Shaofeng  <shaofeng.tang@intel.com>
+-->
+<head>
+<meta name="viewport" content="width=device-width">
+<script src="jquery.js"></script>
+<script>
+       var iTest = 0;
+
+       var Tests;
+       var statusNode;
+       var oTestFrame;
+       var statusFrame;
+       var frmset;
+       var xmldoc;
+
+       var startTime;
+       var defTime = 2000;
+       var timeout;
+       var winCloseTimeout = 5000;
+       var blockCheckTime = 10;
+
+       var server = "http://127.0.0.1:8000";
+       var need_ajax = true;
+
+       var hidestatus;
+       var ttestsuite;
+       var tpriority;
+       var tstatus;
+       var ttype;
+       var tcategory;
+       var texecutiontype;
+
+       var manualcaseslist;
+
+       var cursuite;
+       var curset;
+
+       var last_test_page = "";
+       var current_page_uri = "";
+
+       var activetest = true;
+
+       var manualcases = function() {
+               this.casesid = "";
+               this.index = 0;
+               this.result = "";
+       };
+
+       function getTestPageParam(uri, param) {
+               var uri_local = uri;
+               var iLen = param.length;
+               var iStart = uri_local.indexOf(param);
+               if (iStart == -1)
+                       return "";
+               iStart += iLen + 1;
+               var iEnd = uri_local.indexOf("&", iStart);
+               if (iEnd == -1)
+                       return uri_local.substring(iStart);
+
+               return uri_local.substring(iStart, iEnd);
+       }
+
+       function Parm(data, name) {
+               var p;
+               ts = $(data).find(name);
+               if (ts) {
+                       t = $(ts).get(0);
+                       if (t)
+                               p = $(t).text().trim();
+               }
+
+               if (p) {
+                       var rawVal = decodeURI(p);
+                       if (rawVal.indexOf(',') < 0)
+                               p = rawVal;
+                       else
+                               p = rawVal.split(',');
+               }
+
+               return p;
+       }
+
+       function getParms() {
+               var parms = new Array();
+               var str = location.search.substring(1);
+               var items = str.split('&');
+               for ( var i = 0; i < items.length; i++) {
+                       var pos = items[i].indexOf('=');
+                       if (pos > 0) {
+                               var key = items[i].substring(0, pos);
+                               var val = items[i].substring(pos + 1);
+                               if (!parms[key]) {
+                                       var rawVal = decodeURI(val);
+                                       if (rawVal.indexOf(',') < 0)
+                                               parms[key] = rawVal;
+                                       else
+                                               parms[key] = rawVal.split(',');
+                               }
+                       }
+               }
+
+               ttestsuite = parms["testsuite"];
+               tpriority = parms["priority"];
+               hidestatus = parms["hidestatus"];
+               tstatus = parms["status"];
+               ttype = parms["type"];
+               tcategory = parms["category"];
+               texecutiontype = parms["execution_type"];
+               if (need_ajax) {
+                       $.ajax({
+                               async : false,
+                               type : "GET",
+                               url : server + "/get_params",
+                               dataType : "xml",
+                               success : function(data) {
+                                       hidestatus = Parm(data, 'hidestatus');
+                               },
+                               error : function(x, t, e) {
+                                       print_error_log("getParms", e);
+                               }
+                       });
+               }
+       }
+
+       function runTestsuite_nofilter(xml) {
+               xmldoc = xml;
+               Tests = $(xml).find("testcase");
+               doTest();
+       }
+
+       function runTestsuite(xml) {
+               xmldoc = xml;
+               $(xml).find("testcase").each(
+                               function() {
+                                       var v, vType;
+                                       v = $(this).attr('execution_type');
+
+                                       if (texecutiontype && texecutiontype == "manual")
+                                               vType = "manual";
+                                       else if (texecutiontype && texecutiontype == "auto")
+                                               vType = "auto";
+                                       else if (!texecutiontype)
+                                               vType = [ "auto", "manual" ];
+                                       else
+                                               vType = "auto";
+
+                                       if (v != vType && $.inArray(v, vType) < 0)
+                                               $(this).remove();
+                                       v = $(this).attr('priority');
+                                       if (tpriority && v != tpriority
+                                                       && $.inArray(v, tpriority) < 0)
+                                               $(this).remove();
+                                       v = $(this).attr('status');
+                                       if (tstatus && v != tstatus && $.inArray(v, tstatus) < 0)
+                                               $(this).remove();
+                                       v = $(this).attr('type');
+                                       if (ttype && v != ttype && $.inArray(v, ttype) < 0)
+                                               $(this).remove();
+                                       var categories = $(this).find("categories > category");
+                                       if (categories.length > 0 && tcategory) {
+                                               var i;
+                                               var found = false;
+                                               for (i = 0; i < categories.length; i++) {
+                                                       var category = $(categories).get(i);
+                                                       if ($(category).text().trim() != tcategory
+                                                                       && $.inArray($(category).text().trim(),
+                                                                                       tcategory) < 0) {
+                                                               found = true;
+                                                               break;
+                                                       }
+                                               }
+                                               if (!found)
+                                                       $(this).remove();
+                                       }
+
+                                       $(this).attr('result', "N/A");
+                               });
+               Tests = $(xml).find("testcase");
+               xmldoc = xml;
+               save_result();
+               doTest();
+       }
+
+       function precheck_init() {
+               server_url = "http://127.0.0.1:8000/check_server";
+               $.ajax({
+                       async : false,
+                       url : server_url,
+                       type : "GET",
+                       success : init_test,
+                       error : function(x, t, e) {
+                               print_error_log("can't find a http server",
+                                               "run widget in the standalone mode");
+                               need_ajax = false;
+                               init();
+                       }
+               });
+       }
+
+       function init() {
+               getParms();
+
+               oTestFrame = document.getElementById('testframe');
+               if (!oTestFrame)
+                       return;
+
+               statusFrame = document.getElementById('statusframe');
+               if (!statusFrame)
+                       return;
+
+               var statusWin = statusFrame.contentWindow;
+               if (!statusWin)
+                       return;
+
+               statusNode = statusWin.document.createElement("div");
+               if (!statusNode)
+                       return;
+               statusWin.document.body.appendChild(statusNode);
+
+               frmset = $($('#main')).get(0);
+               if (!frmset)
+                       return;
+
+               if (hidestatus && hidestatus == "1")
+                       $(frmset).attr('rows', "0, *");
+               if (need_ajax) {
+                       $.ajax({
+                               async : false,
+                               type : "GET",
+                               url : server + '/get_testsuite',
+                               dataType : "xml",
+                               success : runTestsuite_nofilter,
+                               error : function(x, t, e) {
+                                       print_error_log("init", e);
+                               }
+                       });
+               }
+               if (!xmldoc) {
+                       if (!ttestsuite) {
+                               ttestsuite = 'tests.xml';
+                       }
+                       $.ajax({
+                               async : false,
+                               type : "GET",
+                               url : ttestsuite,
+                               dataType : "xml",
+                               success : runTestsuite,
+                               error : function(x, t, e) {
+                                       print_error_log("init", e);
+                               }
+                       });
+               }
+       }
+
+       function escape_html(s) {
+               return s.replace(/\&/g, "&amp;").replace(/</g, "&lt;").replace(/"/g,
+                               "&quot;").replace(/'/g, "&#39;");
+       }
+
+       function check_timeout(time) {
+               if (time == 11) {
+                       report('BLOCK', "Time is out");
+               }
+               sleep_time = time * 50;
+               setTimeout("CheckResult('yes', " + time + ")", sleep_time);
+       }
+
+       function CheckResult(need_check_block, sleep_time) {
+               var message = "";
+               var total_num = "";
+               var locator_key = "";
+               var value = "";
+
+               var oTestWin = oTestFrame.contentWindow;
+               var oTestDoc = oTestWin.document;
+               var case_uri = current_page_uri;
+
+               try {
+                       if (oTestWin.document.readyState == "complete") {
+                               total_num = getTestPageParam(case_uri, "total_num");
+                               locator_key = getTestPageParam(case_uri, "locator_key");
+                               value = getTestPageParam(case_uri, "value");
+
+                               oPass = $(oTestDoc).find(".pass");
+                               oFail = $(oTestDoc).find(".fail");
+
+                               // Test page has parameters
+                               if (total_num != "" && locator_key != "" && value != "") {
+                                       if (locator_key == "id") {
+                                               var results;
+                                               var passes;
+                                               var fails;
+
+                                               var oRes = $(oTestDoc).find("table#results");
+                                               if (oRes) {
+                                                       results = $(oRes).find('tr');
+                                                       passes = $(oRes).find('tr.pass');
+                                                       fails = $(oRes).find('tr.fail');
+                                               }
+
+                                               if (passes.length + fails.length == total_num) {
+                                                       var i = 1;
+                                                       for (i = 1; i <= total_num; i++) {
+                                                               if (i.toString() != value) {
+                                                                       continue;
+                                                               }
+                                                               var rest = results[i].childNodes[0].textContent;
+                                                               var desc = results[i].childNodes[1].textContent;
+                                                               var msg = results[i].childNodes[2].textContent;
+                                                               if (rest && rest.toUpperCase() == "PASS")
+                                                                       report('PASS', msg);
+                                                               else
+                                                                       report('FAIL', msg);
+                                                               break;
+                                                       }
+                                               } else {
+                                                       var i;
+                                                       for (i = 0; i < fails.length; i++) {
+                                                               var desccell = fails[i].childNodes[1];
+                                                               if (desccell)
+                                                                       message += "\n###Test Start###\n"
+                                                                                       + desccell.textContent
+                                                                                       + "\n###Test End###\n";
+                                                               var msgcell = fails[i].childNodes[2];
+                                                               if (msgcell)
+                                                                       message += "###Error1 Start###\n"
+                                                                                       + msgcell.textContent
+                                                                                       + "\n###Error1 End###";
+                                                       }
+                                                       report('FAIL', message);
+                                               }
+                                       } else if (locator_key == "test_name") {
+                                               // Place holder
+                                       } else if (locator_key == "msg") {
+                                               // Place holder
+                                       } else {
+                                               alert("Unknown locator key");
+                                       }
+                               } else if (oPass.length > 0 && oFail.length == 0) {
+                                       if (oTestWin.resultdiv)
+                                               message = oTestWin.resultdiv.innerHTML;
+                                       report('PASS', message);
+                               } else if (oFail.length > 0) {
+                                       var oRes = $($(oTestDoc).find("table#results")).get(0);
+                                       // Get error log
+                                       if (oRes) {
+                                               var fails = $(oRes).find('tr.fail');
+                                               var i;
+                                               for (i = 0; i < fails.length; i++) {
+                                                       var desccell = fails[i].childNodes[1];
+                                                       if (desccell)
+                                                               message += "\n###Test Start###\n"
+                                                                               + desccell.textContent + "\n###Test End###\n";
+                                                       var msgcell = fails[i].childNodes[2];
+                                                       if (msgcell)
+                                                               message += "###Error2 Start###\n"
+                                                                               + msgcell.textContent
+                                                                               + "\n###Error2 End###";
+                                               }
+                                       }
+                                       report('FAIL', message);
+                               } else // oFail.length==0 && oPass.length==0
+                               if (need_check_block == 'yes') {
+                                       next_sleep_time = sleep_time + 1;
+                                       check_timeout(next_sleep_time);
+                                       return;
+                               }
+                       } else // not complete
+                       if (need_check_block == 'yes') {
+                               next_sleep_time = sleep_time + 1;
+                               check_timeout(next_sleep_time);
+                               return;
+                       }
+               } catch (e) {
+                       report('BLOCK', e);
+               }
+       }
+
+       function report(result, log) {
+
+               if (iTest >= Tests.length)
+                       return;
+               $(Tests[iTest]).attr('result', result);
+               var doc = $.parseXML("<result_info>" + "<actual_result>" + result
+                               + "</actual_result>" + "<start>" + startTime + "</start>"
+                               + "<end>" + new Date() + "</end>" + "<stdout>"
+                               + escape_html(log) + "</stdout>" + "</result_info>");
+               $(Tests[iTest]).append(doc.documentElement);
+
+               statusNode.innerHTML = "Test #" + (iTest + 1) + "/" + Tests.length
+                               + "(" + result + ") " + current_page_uri;
+
+               try {
+                       var starts = log.indexOf('value:');
+                       var stops = log.lastIndexOf(',');
+                       var resultinfo = log.substring(starts + 6, stops);
+                       $(Tests[iTest]).find("measurement").attr('value', resultinfo);
+               } catch (e) {
+               }
+
+               iTest++;
+
+               if (activetest) {
+                       doTest();
+               } else {
+                       activetest = true;
+               }
+       }
+
+       function doTest() {
+               while (iTest < Tests.length) {
+                       if ($(Tests[iTest]).attr('execution_type') != 'auto') {
+                               iTest++;
+                               continue;
+                       }
+                       var ts = $(Tests[iTest]).find('test_script_entry');
+                       if (ts.length == 0) {
+                               iTest++;
+                               continue;
+                       }
+                       var it = $(ts).get(0);
+                       var tstr = $(it).attr('timeout');
+                       if (!tstr)
+                               timeout = 8 * defTime;
+                       else {
+                               var t;
+                               try {
+                                       t = parseInt(tstr) * 1000;
+                               } catch (e) {
+                                       t = 8 * defTime;
+                               }
+                               timeout = t;
+                       }
+
+                       pset = $(Tests[iTest]).parent().attr('name');
+                       psuite = $(Tests[iTest]).parent().parent().attr('name');
+
+                       startTime = new Date();
+
+                       current_page_uri = $(it).text();
+                       var index = current_page_uri.indexOf("?");
+                       var test_page = "";
+                       if (need_ajax) {
+                               var svr = server + "/test_hint";
+                               $.ajax({
+                                       async : false,
+                                       type : "POST",
+                                       url : svr,
+                                       data : {
+                                               suite : psuite,
+                                               set : pset,
+                                               testcase : current_page_uri
+                                       },
+                                       error : function(x, t, e) {
+                                               print_error_log("doTest", e);
+                                       }
+                               });
+                       }
+                       if (index >= 0)
+                               test_page = current_page_uri.substring(0, index);
+                       else
+                               test_page = current_page_uri;
+
+                       // Don't load the same test page again
+                       if (test_page == last_test_page) {
+                               print_error_log("test page url is the same as the last one",
+                                               test_page);
+                               activetest = false;
+                               CheckResult('yes', 0);
+                               continue;
+                       }
+
+                       if ((current_page_uri.indexOf("2DTransforms") != -1)
+                                       || (current_page_uri.indexOf("3DTransforms") != -1)) {
+                               oTestFrame.height = 500000 + "px";
+                       } else {
+                               oTestFrame.height = 2500 + "px";
+                       }
+                       oTestFrame.src = current_page_uri;
+                       last_test_page = test_page;
+                       if (oTestFrame.attachEvent) {
+                               oTestFrame.attachEvent("onload", function() {
+                                       CheckResult('yes', 0);
+                               });
+                       } else {
+                               oTestFrame.onload = function() {
+                                       CheckResult('yes', 0);
+                               };
+                       }
+                       return;
+               }
+               doManualTest();
+       }
+
+       function doManualTest() {
+               manualcaseslist = new Array();
+               var iTemp1 = 0, iTemp2 = 0;
+               while (iTemp1 < Tests.length) {
+                       if ($(Tests[iTemp1]).attr('execution_type') == 'manual') {
+                               parent.document.getElementById("statusframe").height = 385 + "px";
+                               manualcaseslist[iTemp2] = new manualcases();
+                               manualcaseslist[iTemp2].casesid = $(Tests[iTemp1]).attr('id');
+                               manualcaseslist[iTemp2].index = iTemp1;
+                               manualcaseslist[iTemp2].result = $(Tests[iTemp1])
+                                               .attr('result');
+                               iTemp2++;
+                       }
+                       iTemp1++;
+               }
+               if (iTemp2 > 0) {
+                       winCloseTimeout = 50000;
+                       statusFrame.src = "./manualharness.html";
+                       $(frmset).attr('rows', "100,*");
+               } else if (iTest == Tests.length) {
+                       setTimeout("PublishResult()", 2000);
+               }
+               oTestFrame.src = '';
+       }
+
+       function PublishResult() {
+               $(frmset).attr('rows', "0, *");
+               results = oTestFrame.contentWindow;
+               var resultXML;
+               resultXML = "<title>HTML5 Test Result XML</title>";
+               resultXML += "<head> <style type='text/css'>\
+html {font-family:DejaVu Sans, Bitstream Vera Sans, Arial, Sans;}\
+section#summary {margin-bottom:1em;}\
+table#results {\
+    border-collapse:collapse;\
+    table-layout:fixed;\
+    width:80%;\
+}\
+table#results th:first-child,\
+table#results td:first-child {\
+    width:40%;\
+}\
+table#results th:last-child,\
+table#results td:last-child {\
+    width:30%;\
+}\
+table#results th {\
+    padding:0;\
+    padding-bottom:0.5em;\
+    text-align:left;\
+    border-bottom:medium solid black;\
+}\
+table#results td {\
+    padding:1em;\
+    padding-bottom:0.5em;\
+    border-bottom:thin solid black;\
+}\
+</style><head>";
+
+               resultXML += "<section id='summary'>";
+               resultXML += "<h2>Summary</h2>";
+               var ipass = $(xmldoc).find("testcase[result='PASS']").length;
+               var failList = $(xmldoc).find("testcase[result='FAIL']");
+               var ifail = failList.length;
+               resultXML += "<h3>Total:" + Tests.length
+                               + " Pass:<span style='color:green;'>" + ipass
+                               + "</span> Fail:<span style='color:red;'>" + ifail
+                               + "</span></h3>";
+               resultXML += "</section>";
+
+               resultXML += "<p><table id='results'> <tr> <th> TestSet </th> <th> Pass </th> <th> Fail </th></tr>";
+               var Sets = $(xmldoc).find("set");
+               var i = 0;
+               for (i = 0; i < Sets.length; i++) {
+                       ipass = $(Sets[i]).find("testcase[result='PASS']").length;
+                       ifail = $(Sets[i]).find("testcase[result='FAIL']").length;
+                       resultXML += "<tr>";
+                       resultXML += "<td>" + $(Sets[i]).attr('name') + "</td>";
+                       resultXML += "<td style='color:green;'>" + ipass
+                                       + "</td><td style='color:red;'>" + ifail + "</td>";
+                       resultXML += "</tr>";
+               }
+               resultXML += "</table>";
+
+               if (ifail > 0) {
+                       resultXML += "<section id='failedlist'>";
+                       resultXML += "<h2>Fails</h2>";
+                       resultXML += "<ul>";
+                       for (i = 0; i < failList.length; i++) {
+                               var ts = $(failList[i]).find("test_script_entry");
+                               if (ts.length > 0) {
+                                       var t = ts.get(0);
+                                       resultXML += "<li style='color:red;'>" + $(t).text()
+                                                       + "</li>";
+                               }
+                       }
+                       resultXML += "</ul>";
+                       resultXML += "</section>";
+               }
+
+               resultXML += "<h2>Details</h2>";
+               resultXML += "<form method='post' id='resultform'> <textarea id='results' style='width: 80%; height: 90%;' name='filecontent' disabled='disabled'>"
+                               + save_result() + "</textarea></form>";
+               setTimeout("window.open('','_self','');window.close()", winCloseTimeout);
+               results.document.writeln(resultXML);
+       }
+
+       function save_result() {
+               var svr = server + "/save_result";
+               var testid = (new Date()).getTime();
+               var contents = (new XMLSerializer()).serializeToString(xmldoc);
+               if (need_ajax) {
+                       $.ajax({
+                               async : false,
+                               type : "POST",
+                               url : svr,
+                               data : {
+                                       filename : testid,
+                                       filecontent : contents
+                               },
+                               error : function(x, t, e) {
+                                       print_error_log("doTest", e);
+                               }
+                       });
+               }
+               return contents;
+       }
+       // merge code from application.js
+       function init_test() {
+               var session_id = Math.round(Math.random() * 10000);
+               init_message_frame();
+               save_session_id(session_id);
+               sync_session_id(session_id);
+               start_test();
+       }
+
+       function init_message_frame() {
+               messageFrame = document.getElementById('messageframe');
+               messageWin = messageFrame.contentWindow;
+               messageNode = messageWin.document.getElementById('message_div');
+               if (null == messageNode) {
+                       messageNode = messageWin.document.createElement("div");
+                       messageNode.id = "message_div";
+                       messageWin.document.body.appendChild(messageNode);
+                       messageNode.innerHTML = "Message Area";
+               }
+               return messageNode;
+       }
+
+       function print_error_log(command, message) {
+               messageFrame = document.getElementById('messageframe');
+               messageFrame.height = 160 + "px";
+               messageNode = init_message_frame();
+               messageNode.innerHTML = "Message Area<div id=\"log_title\"></div><br/>Command: <div id=\"log_command\">"
+                               + command
+                               + "</div><br/>Message: <div id=\"log_message\">"
+                               + message + "</div>";
+       }
+
+       function save_session_id(session_id) {
+               statusFrame = document.getElementById('statusframe');
+               statusFrame.height = 270 + "px";
+               statusWin = statusFrame.contentWindow;
+               sessionIdNode = statusWin.document.getElementById('session_id_div');
+               if (null == sessionIdNode) {
+                       sessionIdNode = statusWin.document.createElement("div");
+                       sessionIdNode.id = "session_id_div";
+                       statusWin.document.body.appendChild(sessionIdNode);
+                       sessionIdNode.innerHTML = "Session ID: <div id=\"session_id\">"
+                                       + session_id
+                                       + "</div><br/><div id=\"execution_progress\"></div><br/>";
+               }
+       }
+
+       function sync_session_id(session_id) {
+               var server_url = server + "/init_session_id";
+               server_url += "?session_id=" + session_id;
+               $.ajax({
+                       async : false,
+                       url : server_url,
+                       type : "GET",
+                       error : function(x, t, e) {
+                               print_error_log("sync_session_id", e);
+                       }
+               });
+       }
+
+       function get_session_id() {
+               statusFrame = document.getElementById('statusframe');
+               statusWin = statusFrame.contentWindow;
+               sessionIdNode = statusWin.document.getElementById('session_id');
+               return sessionIdNode.innerHTML;
+       }
+
+       function close_window(){
+               //for tct-webgl-nonw3c-tests run by tizen-tool emulator html,window.parent.close() no function,must call window.close, why?
+               if(window.parent != window.self){
+                       window.open('','_self','');
+                       window.close();
+                       window.parent.onbeforeunload = null;
+                       window.parent.close();
+               }
+               else{
+                       window.open('','_self','');
+                       window.close();
+               }
+       }
+       function start_test() {
+               try {
+                       var task = ask_test_task();
+               } catch (e) {
+                       print_error_log("start_test_ask_test_task", e);
+               }
+               try {
+                       if (task == 1) {
+                               print_error_log("start_test_execute_test_task",
+                                               "Invalid session");
+                       } else if (task == -1) {
+                               print_error_log("restart client process activated",
+                                               "this window will be closed in 2sec");
+                               close_window();
+                               //setTimeout("window.open('','_self','');window.close()", 2000);
+                       } else if (task == null) {
+                               print_error_log(
+                                               "get auto case failed, client will be restarted later",
+                                               "this window will be closed in 2sec");
+                               close_window();
+                               //setTimeout("window.open('','_self','');window.close()", 2000);
+                       } else if (task != 0) {
+                               var progress = check_execution_progress();
+                               execute_test_task(task, progress);
+                       } else {
+                               execute_manual_test();
+                       }
+               } catch (e) {
+                       print_error_log("start_test_execute_test_task", e);
+               }
+       }
+
+       function ask_generate_xml() {
+               var server_url = server + "/generate_xml";
+               $.ajax({
+                       async : false,
+                       url : server_url,
+                       type : "GET",
+                       error : function(x, t, e) {
+                               print_error_log("ask_generate_xml", e);
+                       }
+               });
+               close_window();
+               //setTimeout("window.open('','_self','');window.close()", winCloseTimeout);
+       }
+
+       function extract_all_manual() {
+               var server_url = server + "/manual_cases";
+               var tasks = null;
+               $.ajax({
+                       async : false,
+                       url : server_url,
+                       type : "GET",
+                       dataType : "text",
+                       success : function(txt) {
+                               task = $.parseJSON(txt);
+                               if (0 == task.none) {
+                                       task = null;
+                               }
+                       },
+                       error : function(x, t, e) {
+                               print_error_log("extract_all_manual", e);
+                       }
+               });
+               return task;
+       }
+
+       function ask_test_task() {
+               var server_url = server + "/auto_test_task";
+               var task = null;
+               session_id = get_session_id();
+               server_url += "?session_id=" + session_id;
+               $.ajax({
+                       async : false,
+                       url : server_url,
+                       type : "GET",
+                       dataType : "text",
+                       success : function(txt) {
+                               task = $.parseJSON(txt);
+                               if (task.none == 0) {
+                                       task = 0;
+                               }
+                               if (task.invalid == 0) {
+                                       task = 1;
+                               }
+                               if (task.stop == 0) {
+                                       task = -1;
+                               }
+                       },
+                       error : function(x, t, e) {
+                               print_error_log("ask_test_task", e);
+                       }
+               });
+               return task;
+       }
+
+       function check_execution_progress() {
+               var server_url = server + "/check_execution_progress";
+               var progress = null;
+               session_id = get_session_id();
+               server_url += "?session_id=" + session_id;
+               $.ajax({
+                       async : false,
+                       url : server_url,
+                       type : "GET",
+                       dataType : "text",
+                       success : function(txt) {
+                               progress = $.parseJSON(txt);
+                       },
+                       error : function(x, t, e) {
+                               print_error_log("check_execution_progress", e);
+                       }
+               });
+               return progress;
+       }
+
+       function ask_next_step() {
+               var server_url = server + "/ask_next_step";
+               var next_step = null;
+               session_id = get_session_id();
+               server_url += "?session_id=" + session_id;
+               $.ajax({
+                       async : false,
+                       url : server_url,
+                       type : "GET",
+                       dataType : "text",
+                       success : function(txt) {
+                               next_step = $.parseJSON(txt);
+                       },
+                       error : function(x, t, e) {
+                               print_error_log("ask_next_step", e);
+                       }
+               });
+               return next_step;
+       }
+
+       function init_status_frame() {
+               statusFrame = document.getElementById('statusframe');
+               statusWin = statusFrame.contentWindow;
+               statusNode = statusWin.document.getElementById('status_div');
+               if (null == statusNode) {
+                       statusNode = statusWin.document.createElement("div");
+                       statusNode.id = "status_div";
+                       statusWin.document.body.appendChild(statusNode);
+               }
+               return statusNode;
+       }
+
+       function execute_test_task(json_task, json_progress) {
+               try {
+                       oTestFrame = document.getElementById('testframe');
+                       statusNode = init_status_frame();
+                       // update execution progress
+                       statusFrame = document.getElementById('statusframe');
+                       statusWin = statusFrame.contentWindow;
+                       progressNode = statusWin.document
+                                       .getElementById('execution_progress');
+                       progressNode.innerHTML = "Total:" + json_progress.total
+                                       + ", Current:" + json_progress.current;
+                       // update case info
+                       statusNode.innerHTML = "Test Purpose:<div id=\"test_purpose_div\">"
+                                       + json_task.purpose
+                                       + "</div><br/>Test Entry:<div id=\"test_entry_div\">"
+                                       + json_task.entry
+                                       + "</div><br/>Last Test Result:<div id=\"test_result_div\">"
+                                       + json_progress.last_test_result + "</div>";
+                       current_page_uri = json_task.entry;
+                       case_id_str = json_task.case_id;
+                       var index = current_page_uri.indexOf("?");
+                       var test_page = "";
+                       if (index >= 0)
+                               test_page = current_page_uri.substring(0, index);
+                       else
+                               test_page = current_page_uri;
+                       // Get how many times to check BLOCK result
+                       if (json_task.onload_delay) {
+                               calculate_block_check_time(parseInt(json_task.onload_delay) * 1000);
+                       } else {
+                               print_error_log("execute_test_task",
+                                               "can't get attribute onload_delay from task: "
+                                                               + json_task.purpose);
+                       }
+                       // Don't load the same test page again
+                       if (test_page == last_test_page) {
+                               print_error_log("test page url is the same as the last one",
+                                               test_page);
+                               extract_case_result('yes', 0);
+                               return;
+                       }
+                       if ((current_page_uri.indexOf("2DTransforms") != -1)
+                                       || (current_page_uri.indexOf("3DTransforms") != -1)) {
+                               oTestFrame.height = 500000 + "px";
+                       } else {
+                               oTestFrame.height = 2500 + "px";
+                       }
+                       oTestFrame.src = current_page_uri;
+                       last_test_page = test_page;
+                       if (oTestFrame.attachEvent) {
+                               oTestFrame.attachEvent("onload", function() {
+                                       extract_case_result('yes', 0);
+                               });
+                       } else {
+                               oTestFrame.onload = function() {
+                                       extract_case_result('yes', 0);
+                               };
+                       }
+               } catch (e) {
+                       print_error_log("execute_test_task", e);
+               }
+       }
+
+       function calculate_block_check_time(onload_delay) {
+               blockCheckTime = Math.ceil((Math.sqrt(onload_delay * 4 + 25) - 5) / 10);
+       }
+
+       function check_block_result_again(time) {
+               sleep_time = time * 50;
+               if (time == blockCheckTime) {
+                       setTimeout("extract_case_result('no', " + time + ")", sleep_time);
+                       return;
+               }
+               setTimeout("extract_case_result('yes', " + time + ")", sleep_time);
+       }
+
+       function extract_case_result(need_check_block, sleep_time) {
+               oTestFrame = document.getElementById('testframe');
+               var oTestWin = oTestFrame.contentWindow;
+               var oTestDoc = oTestFrame.contentWindow.document;
+               var result = "BLOCK";
+               var case_msg = "";
+
+               oPass = $(oTestDoc).find(".pass");
+               oFail = $(oTestDoc).find(".fail");
+               case_uri = current_page_uri;
+
+               total_num = getTestPageParam(case_uri, "total_num");
+               locator_key = getTestPageParam(case_uri, "locator_key");
+               value = getTestPageParam(case_uri, "value");
+
+               if (total_num != "" && locator_key != "" && value != "") {
+                       if (locator_key == "id") {
+                               var results;
+                               var passes;
+                               var fails;
+
+                               var oRes = $(oTestDoc).find("table#results");
+                               if (oRes) {
+                                       results = $(oRes).find('tr');
+                                       passes = $(oRes).find('tr.pass');
+                                       fails = $(oRes).find('tr.fail');
+                               }
+                               if (passes.length + fails.length == total_num) {
+                                       var i = 1;
+                                       for (i = 1; i <= total_num; i++) {
+                                               if (i.toString() != value) {
+                                                       continue;
+                                               }
+                                               var rest = results[i].childNodes[0].textContent;
+                                               var desc = results[i].childNodes[1].textContent;
+                                               case_msg = results[i].childNodes[2].textContent;                                        
+                                               if (rest && rest.toUpperCase() == "PASS") {
+                                                       result = "PASS";
+                                               } else {
+                                                       result = "FAIL";
+                                               }
+                                               break;
+                                       }
+                               } else {
+                                       if (need_check_block == 'yes') {
+                                               next_sleep_time = sleep_time + 1;
+                                               check_block_result_again(next_sleep_time);
+                                               return;
+                                       }
+                                       else{
+                                               var i;
+                                               for (i = 0; i < fails.length; i++) {
+                                                       var desccell = fails[i].childNodes[1];
+                                                       if (desccell) {
+                                                               case_msg += "\n###Test Start###\n" + desccell.textContent
+                                                                               + "\n###Test End###\n";
+                                                       }
+                                                       var msgcell = fails[i].childNodes[2];
+                                                       if (msgcell) {
+                                                               case_msg += "###Error1 Start###\n"
+                                                                               + msgcell.textContent + "\n###Error1 End###";
+                                                       }
+                                               }
+                                               result = "FAIL";
+                                       }
+
+                               }
+                       }
+               } else if (oPass.length > 0 && oFail.length == 0) {
+                       if (oTestWin.resultdiv) {
+                               case_msg = oTestWin.resultdiv.innerHTML;
+                       }
+                       result = "PASS";
+               } else if (oFail.length > 0) {
+                       var oRes = $($(oTestDoc).find("table#results")).get(0);
+                       // Get error log
+                       if (oRes) {
+                               var fails = $(oRes).find('tr.fail');
+                               var i;
+                               for (i = 0; i < fails.length; i++) {
+                                       var desccell = fails[i].childNodes[1];
+                                       if (desccell) {
+                                               case_msg += "\n###Test Start###\n" + desccell.textContent
+                                                               + "\n###Test End###\n";
+                                       }
+                                       var msgcell = fails[i].childNodes[2];
+                                       if (msgcell) {
+                                               case_msg += "###Error2 Start###\n" + msgcell.textContent
+                                                               + "\n###Error2 End###";                                         
+                                       }
+                               }
+                       }
+                       result = "FAIL";
+               } else {
+                       if (need_check_block == 'yes') {
+                               next_sleep_time = sleep_time + 1;
+                               check_block_result_again(next_sleep_time);
+                               return;
+                       }
+               }
+               var next_step = ask_next_step();
+               commit_test_result(result, case_msg);
+               if (next_step.step == "continue") {
+                       start_test();
+               } else {
+                       print_error_log("memory collection process activated",
+                                       "this window will be closed in 2sec");
+                       close_window();
+                       //setTimeout("window.open('','_self','');window.close()", 2000);
+               }
+       }
+
+       var manual_test_step = function() {
+               this.order = 0;
+               this.desc = "";
+               this.expected = "";
+       };
+
+       var manual_cases = function() {
+               this.casesid = "";
+               this.index = 0;
+               this.result = "";
+               this.entry = "";
+               this.pre_con = "";
+               this.post_con = "";
+               this.purpose = "";
+               this.steps = new Array();
+       };
+
+       function execute_manual_test() {
+               manualcaseslist = new Array();
+               tasks = extract_all_manual();
+               if (tasks != null){
+                       for ( var i = 0; i < tasks.length; i++) {
+                               if (parent.document.getElementById("statusframe"))
+                                       parent.document.getElementById("statusframe").height = 385 + "px";
+                               manualcaseslist[i] = new manual_cases();
+                               manualcaseslist[i].casesid = tasks[i].case_id;
+                               manualcaseslist[i].index = i;
+                               manualcaseslist[i].entry = tasks[i].entry;
+                               manualcaseslist[i].pre_con = tasks[i].pre_condition;
+                               manualcaseslist[i].post_con = tasks[i].post_condition;
+                               manualcaseslist[i].purpose = tasks[i].purpose;
+
+                               if (tasks[i].steps != undefined) {
+                                       for ( var j = 0; j < tasks[i].steps.length; j++) {
+                                               this_manual_step = new manual_test_step();
+                                               this_manual_step.order = parseInt(tasks[i].steps[j].order);
+                                               this_manual_step.desc = tasks[i].steps[j].step_desc;
+                                               this_manual_step.expected = tasks[i].steps[j].expected;
+                                               manualcaseslist[i].steps[this_manual_step.order - 1] = this_manual_step;
+                                       }
+                               }
+                       }
+                       if (tasks.length > 0) {
+                               statusFrame.src = "./manual_harness.html";
+                               $($($('#main')).get(0)).attr('rows', "100,*");
+                       }
+                       oTestFrame = document.getElementById('testframe');
+                       oTestFrame.src = '';
+               }
+               else {
+                       // No manual cases, generate the result.
+                       ask_generate_xml();
+               }
+       }
+
+       function commit_test_result(result, msg) {
+               statusFrame = document.getElementById('statusframe');
+               purposeNode = statusWin.document.getElementById('test_purpose_div');
+               session_id = get_session_id();
+               var purpose_str = purposeNode.innerHTML
+               var server_url = server + "/commit_result";
+               $.ajax({
+                       async : false,
+                       url : server_url,
+                       type : "POST",
+                       data : {
+                               "case_id" : case_id_str,
+                               "purpose" : purpose_str,
+                               "result" : result,
+                               "msg" : "[Message]" + msg,
+                               "session_id" : session_id
+                       },
+                       dataType : "json",
+                       beforeSend : function(x) {
+                               if (x && x.overrideMimeType) {
+                                       x.overrideMimeType("application/j-son;charset=UTF-8");
+                               }
+                       },
+                       error : function(x, t, e) {
+                               print_error_log("commit_test_result", e);
+                       }
+               });
+       }
+</script>
+</head>
+<body id="main" onload='precheck_init()'>
+       <iframe frameborder="1" height="30px" width="100%" id="messageframe"></iframe>
+       <iframe frameborder="1" height="30px" width="100%" id="statusframe"></iframe>
+       <iframe frameborder="1" height="2500px" width="100%" id="testframe" allowFullScreen="true" mozAllowFullScreen="true" webkitAllowFullscreen="true"></iframe>
+</body>
+</html>
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/web/jquery.js b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/web/jquery.js
new file mode 100644 (file)
index 0000000..eda55db
--- /dev/null
@@ -0,0 +1,9300 @@
+/*!
+ * jQuery JavaScript Library v1.7
+ * http://jquery.com/
+ *
+ * Copyright 2011, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2011, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Thu Nov 3 16:18:21 2011 -0400
+ */
+(function( window, undefined ) {
+
+// Use the correct document accordingly with window argument (sandbox)
+var document = window.document,
+       navigator = window.navigator,
+       location = window.location;
+var jQuery = (function() {
+
+// Define a local copy of jQuery
+var jQuery = function( selector, context ) {
+               // The jQuery object is actually just the init constructor 'enhanced'
+               return new jQuery.fn.init( selector, context, rootjQuery );
+       },
+
+       // Map over jQuery in case of overwrite
+       _jQuery = window.jQuery,
+
+       // Map over the $ in case of overwrite
+       _$ = window.$,
+
+       // A central reference to the root jQuery(document)
+       rootjQuery,
+
+       // A simple way to check for HTML strings or ID strings
+       // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+       quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
+
+       // Check if a string has a non-whitespace character in it
+       rnotwhite = /\S/,
+
+       // Used for trimming whitespace
+       trimLeft = /^\s+/,
+       trimRight = /\s+$/,
+
+       // Check for digits
+       rdigit = /\d/,
+
+       // Match a standalone tag
+       rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
+
+       // JSON RegExp
+       rvalidchars = /^[\],:{}\s]*$/,
+       rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
+       rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
+       rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
+
+       // Useragent RegExp
+       rwebkit = /(webkit)[ \/]([\w.]+)/,
+       ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
+       rmsie = /(msie) ([\w.]+)/,
+       rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
+
+       // Matches dashed string for camelizing
+       rdashAlpha = /-([a-z]|[0-9])/ig,
+       rmsPrefix = /^-ms-/,
+
+       // Used by jQuery.camelCase as callback to replace()
+       fcamelCase = function( all, letter ) {
+               return ( letter + "" ).toUpperCase();
+       },
+
+       // Keep a UserAgent string for use with jQuery.browser
+       userAgent = navigator.userAgent,
+
+       // For matching the engine and version of the browser
+       browserMatch,
+
+       // The deferred used on DOM ready
+       readyList,
+
+       // The ready event handler
+       DOMContentLoaded,
+
+       // Save a reference to some core methods
+       toString = Object.prototype.toString,
+       hasOwn = Object.prototype.hasOwnProperty,
+       push = Array.prototype.push,
+       slice = Array.prototype.slice,
+       trim = String.prototype.trim,
+       indexOf = Array.prototype.indexOf,
+
+       // [[Class]] -> type pairs
+       class2type = {};
+
+jQuery.fn = jQuery.prototype = {
+       constructor: jQuery,
+       init: function( selector, context, rootjQuery ) {
+               var match, elem, ret, doc;
+
+               // Handle $(""), $(null), or $(undefined)
+               if ( !selector ) {
+                       return this;
+               }
+
+               // Handle $(DOMElement)
+               if ( selector.nodeType ) {
+                       this.context = this[0] = selector;
+                       this.length = 1;
+                       return this;
+               }
+
+               // The body element only exists once, optimize finding it
+               if ( selector === "body" && !context && document.body ) {
+                       this.context = document;
+                       this[0] = document.body;
+                       this.selector = selector;
+                       this.length = 1;
+                       return this;
+               }
+
+               // Handle HTML strings
+               if ( typeof selector === "string" ) {
+                       // Are we dealing with HTML string or an ID?
+                       if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
+                               // Assume that strings that start and end with <> are HTML and skip the regex check
+                               match = [ null, selector, null ];
+
+                       } else {
+                               match = quickExpr.exec( selector );
+                       }
+
+                       // Verify a match, and that no context was specified for #id
+                       if ( match && (match[1] || !context) ) {
+
+                               // HANDLE: $(html) -> $(array)
+                               if ( match[1] ) {
+                                       context = context instanceof jQuery ? context[0] : context;
+                                       doc = ( context ? context.ownerDocument || context : document );
+
+                                       // If a single string is passed in and it's a single tag
+                                       // just do a createElement and skip the rest
+                                       ret = rsingleTag.exec( selector );
+
+                                       if ( ret ) {
+                                               if ( jQuery.isPlainObject( context ) ) {
+                                                       selector = [ document.createElement( ret[1] ) ];
+                                                       jQuery.fn.attr.call( selector, context, true );
+
+                                               } else {
+                                                       selector = [ doc.createElement( ret[1] ) ];
+                                               }
+
+                                       } else {
+                                               ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
+                                               selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes;
+                                       }
+
+                                       return jQuery.merge( this, selector );
+
+                               // HANDLE: $("#id")
+                               } else {
+                                       elem = document.getElementById( match[2] );
+
+                                       // Check parentNode to catch when Blackberry 4.6 returns
+                                       // nodes that are no longer in the document #6963
+                                       if ( elem && elem.parentNode ) {
+                                               // Handle the case where IE and Opera return items
+                                               // by name instead of ID
+                                               if ( elem.id !== match[2] ) {
+                                                       return rootjQuery.find( selector );
+                                               }
+
+                                               // Otherwise, we inject the element directly into the jQuery object
+                                               this.length = 1;
+                                               this[0] = elem;
+                                       }
+
+                                       this.context = document;
+                                       this.selector = selector;
+                                       return this;
+                               }
+
+                       // HANDLE: $(expr, $(...))
+                       } else if ( !context || context.jquery ) {
+                               return ( context || rootjQuery ).find( selector );
+
+                       // HANDLE: $(expr, context)
+                       // (which is just equivalent to: $(context).find(expr)
+                       } else {
+                               return this.constructor( context ).find( selector );
+                       }
+
+               // HANDLE: $(function)
+               // Shortcut for document ready
+               } else if ( jQuery.isFunction( selector ) ) {
+                       return rootjQuery.ready( selector );
+               }
+
+               if ( selector.selector !== undefined ) {
+                       this.selector = selector.selector;
+                       this.context = selector.context;
+               }
+
+               return jQuery.makeArray( selector, this );
+       },
+
+       // Start with an empty selector
+       selector: "",
+
+       // The current version of jQuery being used
+       jquery: "1.7",
+
+       // The default length of a jQuery object is 0
+       length: 0,
+
+       // The number of elements contained in the matched element set
+       size: function() {
+               return this.length;
+       },
+
+       toArray: function() {
+               return slice.call( this, 0 );
+       },
+
+       // Get the Nth element in the matched element set OR
+       // Get the whole matched element set as a clean array
+       get: function( num ) {
+               return num == null ?
+
+                       // Return a 'clean' array
+                       this.toArray() :
+
+                       // Return just the object
+                       ( num < 0 ? this[ this.length + num ] : this[ num ] );
+       },
+
+       // Take an array of elements and push it onto the stack
+       // (returning the new matched element set)
+       pushStack: function( elems, name, selector ) {
+               // Build a new jQuery matched element set
+               var ret = this.constructor();
+
+               if ( jQuery.isArray( elems ) ) {
+                       push.apply( ret, elems );
+
+               } else {
+                       jQuery.merge( ret, elems );
+               }
+
+               // Add the old object onto the stack (as a reference)
+               ret.prevObject = this;
+
+               ret.context = this.context;
+
+               if ( name === "find" ) {
+                       ret.selector = this.selector + ( this.selector ? " " : "" ) + selector;
+               } else if ( name ) {
+                       ret.selector = this.selector + "." + name + "(" + selector + ")";
+               }
+
+               // Return the newly-formed element set
+               return ret;
+       },
+
+       // Execute a callback for every element in the matched set.
+       // (You can seed the arguments with an array of args, but this is
+       // only used internally.)
+       each: function( callback, args ) {
+               return jQuery.each( this, callback, args );
+       },
+
+       ready: function( fn ) {
+               // Attach the listeners
+               jQuery.bindReady();
+
+               // Add the callback
+               readyList.add( fn );
+
+               return this;
+       },
+
+       eq: function( i ) {
+               return i === -1 ?
+                       this.slice( i ) :
+                       this.slice( i, +i + 1 );
+       },
+
+       first: function() {
+               return this.eq( 0 );
+       },
+
+       last: function() {
+               return this.eq( -1 );
+       },
+
+       slice: function() {
+               return this.pushStack( slice.apply( this, arguments ),
+                       "slice", slice.call(arguments).join(",") );
+       },
+
+       map: function( callback ) {
+               return this.pushStack( jQuery.map(this, function( elem, i ) {
+                       return callback.call( elem, i, elem );
+               }));
+       },
+
+       end: function() {
+               return this.prevObject || this.constructor(null);
+       },
+
+       // For internal use only.
+       // Behaves like an Array's method, not like a jQuery method.
+       push: push,
+       sort: [].sort,
+       splice: [].splice
+};
+
+// Give the init function the jQuery prototype for later instantiation
+jQuery.fn.init.prototype = jQuery.fn;
+
+jQuery.extend = jQuery.fn.extend = function() {
+       var options, name, src, copy, copyIsArray, clone,
+               target = arguments[0] || {},
+               i = 1,
+               length = arguments.length,
+               deep = false;
+
+       // Handle a deep copy situation
+       if ( typeof target === "boolean" ) {
+               deep = target;
+               target = arguments[1] || {};
+               // skip the boolean and the target
+               i = 2;
+       }
+
+       // Handle case when target is a string or something (possible in deep copy)
+       if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
+               target = {};
+       }
+
+       // extend jQuery itself if only one argument is passed
+       if ( length === i ) {
+               target = this;
+               --i;
+       }
+
+       for ( ; i < length; i++ ) {
+               // Only deal with non-null/undefined values
+               if ( (options = arguments[ i ]) != null ) {
+                       // Extend the base object
+                       for ( name in options ) {
+                               src = target[ name ];
+                               copy = options[ name ];
+
+                               // Prevent never-ending loop
+                               if ( target === copy ) {
+                                       continue;
+                               }
+
+                               // Recurse if we're merging plain objects or arrays
+                               if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
+                                       if ( copyIsArray ) {
+                                               copyIsArray = false;
+                                               clone = src && jQuery.isArray(src) ? src : [];
+
+                                       } else {
+                                               clone = src && jQuery.isPlainObject(src) ? src : {};
+                                       }
+
+                                       // Never move original objects, clone them
+                                       target[ name ] = jQuery.extend( deep, clone, copy );
+
+                               // Don't bring in undefined values
+                               } else if ( copy !== undefined ) {
+                                       target[ name ] = copy;
+                               }
+                       }
+               }
+       }
+
+       // Return the modified object
+       return target;
+};
+
+jQuery.extend({
+       noConflict: function( deep ) {
+               if ( window.$ === jQuery ) {
+                       window.$ = _$;
+               }
+
+               if ( deep && window.jQuery === jQuery ) {
+                       window.jQuery = _jQuery;
+               }
+
+               return jQuery;
+       },
+
+       // Is the DOM ready to be used? Set to true once it occurs.
+       isReady: false,
+
+       // A counter to track how many items to wait for before
+       // the ready event fires. See #6781
+       readyWait: 1,
+
+       // Hold (or release) the ready event
+       holdReady: function( hold ) {
+               if ( hold ) {
+                       jQuery.readyWait++;
+               } else {
+                       jQuery.ready( true );
+               }
+       },
+
+       // Handle when the DOM is ready
+       ready: function( wait ) {
+               // Either a released hold or an DOMready/load event and not yet ready
+               if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) {
+                       // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+                       if ( !document.body ) {
+                               return setTimeout( jQuery.ready, 1 );
+                       }
+
+                       // Remember that the DOM is ready
+                       jQuery.isReady = true;
+
+                       // If a normal DOM Ready event fired, decrement, and wait if need be
+                       if ( wait !== true && --jQuery.readyWait > 0 ) {
+                               return;
+                       }
+
+                       // If there are functions bound, to execute
+                       readyList.fireWith( document, [ jQuery ] );
+
+                       // Trigger any bound ready events
+                       if ( jQuery.fn.trigger ) {
+                               jQuery( document ).trigger( "ready" ).unbind( "ready" );
+                       }
+               }
+       },
+
+       bindReady: function() {
+               if ( readyList ) {
+                       return;
+               }
+
+               readyList = jQuery.Callbacks( "once memory" );
+
+               // Catch cases where $(document).ready() is called after the
+               // browser event has already occurred.
+               if ( document.readyState === "complete" ) {
+                       // Handle it asynchronously to allow scripts the opportunity to delay ready
+                       return setTimeout( jQuery.ready, 1 );
+               }
+
+               // Mozilla, Opera and webkit nightlies currently support this event
+               if ( document.addEventListener ) {
+                       // Use the handy event callback
+                       document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+
+                       // A fallback to window.onload, that will always work
+                       window.addEventListener( "load", jQuery.ready, false );
+
+               // If IE event model is used
+               } else if ( document.attachEvent ) {
+                       // ensure firing before onload,
+                       // maybe late but safe also for iframes
+                       document.attachEvent( "onreadystatechange", DOMContentLoaded );
+
+                       // A fallback to window.onload, that will always work
+                       window.attachEvent( "onload", jQuery.ready );
+
+                       // If IE and not a frame
+                       // continually check to see if the document is ready
+                       var toplevel = false;
+
+                       try {
+                               toplevel = window.frameElement == null;
+                       } catch(e) {}
+
+                       if ( document.documentElement.doScroll && toplevel ) {
+                               doScrollCheck();
+                       }
+               }
+       },
+
+       // See test/unit/core.js for details concerning isFunction.
+       // Since version 1.3, DOM methods and functions like alert
+       // aren't supported. They return false on IE (#2968).
+       isFunction: function( obj ) {
+               return jQuery.type(obj) === "function";
+       },
+
+       isArray: Array.isArray || function( obj ) {
+               return jQuery.type(obj) === "array";
+       },
+
+       // A crude way of determining if an object is a window
+       isWindow: function( obj ) {
+               return obj && typeof obj === "object" && "setInterval" in obj;
+       },
+
+       isNumeric: function( obj ) {
+               return obj != null && rdigit.test( obj ) && !isNaN( obj );
+       },
+
+       type: function( obj ) {
+               return obj == null ?
+                       String( obj ) :
+                       class2type[ toString.call(obj) ] || "object";
+       },
+
+       isPlainObject: function( obj ) {
+               // Must be an Object.
+               // Because of IE, we also have to check the presence of the constructor property.
+               // Make sure that DOM nodes and window objects don't pass through, as well
+               if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
+                       return false;
+               }
+
+               try {
+                       // Not own constructor property must be Object
+                       if ( obj.constructor &&
+                               !hasOwn.call(obj, "constructor") &&
+                               !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
+                               return false;
+                       }
+               } catch ( e ) {
+                       // IE8,9 Will throw exceptions on certain host objects #9897
+                       return false;
+               }
+
+               // Own properties are enumerated firstly, so to speed up,
+               // if last one is own, then all properties are own.
+
+               var key;
+               for ( key in obj ) {}
+
+               return key === undefined || hasOwn.call( obj, key );
+       },
+
+       isEmptyObject: function( obj ) {
+               for ( var name in obj ) {
+                       return false;
+               }
+               return true;
+       },
+
+       error: function( msg ) {
+               throw msg;
+       },
+
+       parseJSON: function( data ) {
+               if ( typeof data !== "string" || !data ) {
+                       return null;
+               }
+
+               // Make sure leading/trailing whitespace is removed (IE can't handle it)
+               data = jQuery.trim( data );
+
+               // Attempt to parse using the native JSON parser first
+               if ( window.JSON && window.JSON.parse ) {
+                       return window.JSON.parse( data );
+               }
+
+               // Make sure the incoming data is actual JSON
+               // Logic borrowed from http://json.org/json2.js
+               if ( rvalidchars.test( data.replace( rvalidescape, "@" )
+                       .replace( rvalidtokens, "]" )
+                       .replace( rvalidbraces, "")) ) {
+
+                       return ( new Function( "return " + data ) )();
+
+               }
+               jQuery.error( "Invalid JSON: " + data );
+       },
+
+       // Cross-browser xml parsing
+       parseXML: function( data ) {
+               var xml, tmp;
+               try {
+                       if ( window.DOMParser ) { // Standard
+                               tmp = new DOMParser();
+                               xml = tmp.parseFromString( data , "text/xml" );
+                       } else { // IE
+                               xml = new ActiveXObject( "Microsoft.XMLDOM" );
+                               xml.async = "false";
+                               xml.loadXML( data );
+                       }
+               } catch( e ) {
+                       xml = undefined;
+               }
+               if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
+                       jQuery.error( "Invalid XML: " + data );
+               }
+               return xml;
+       },
+
+       noop: function() {},
+
+       // Evaluates a script in a global context
+       // Workarounds based on findings by Jim Driscoll
+       // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
+       globalEval: function( data ) {
+               if ( data && rnotwhite.test( data ) ) {
+                       // We use execScript on Internet Explorer
+                       // We use an anonymous function so that context is window
+                       // rather than jQuery in Firefox
+                       ( window.execScript || function( data ) {
+                               window[ "eval" ].call( window, data );
+                       } )( data );
+               }
+       },
+
+       // Convert dashed to camelCase; used by the css and data modules
+       // Microsoft forgot to hump their vendor prefix (#9572)
+       camelCase: function( string ) {
+               return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+       },
+
+       nodeName: function( elem, name ) {
+               return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
+       },
+
+       // args is for internal usage only
+       each: function( object, callback, args ) {
+               var name, i = 0,
+                       length = object.length,
+                       isObj = length === undefined || jQuery.isFunction( object );
+
+               if ( args ) {
+                       if ( isObj ) {
+                               for ( name in object ) {
+                                       if ( callback.apply( object[ name ], args ) === false ) {
+                                               break;
+                                       }
+                               }
+                       } else {
+                               for ( ; i < length; ) {
+                                       if ( callback.apply( object[ i++ ], args ) === false ) {
+                                               break;
+                                       }
+                               }
+                       }
+
+               // A special, fast, case for the most common use of each
+               } else {
+                       if ( isObj ) {
+                               for ( name in object ) {
+                                       if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
+                                               break;
+                                       }
+                               }
+                       } else {
+                               for ( ; i < length; ) {
+                                       if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {
+                                               break;
+                                       }
+                               }
+                       }
+               }
+
+               return object;
+       },
+
+       // Use native String.trim function wherever possible
+       trim: trim ?
+               function( text ) {
+                       return text == null ?
+                               "" :
+                               trim.call( text );
+               } :
+
+               // Otherwise use our own trimming functionality
+               function( text ) {
+                       return text == null ?
+                               "" :
+                               text.toString().replace( trimLeft, "" ).replace( trimRight, "" );
+               },
+
+       // results is for internal usage only
+       makeArray: function( array, results ) {
+               var ret = results || [];
+
+               if ( array != null ) {
+                       // The window, strings (and functions) also have 'length'
+                       // The extra typeof function check is to prevent crashes
+                       // in Safari 2 (See: #3039)
+                       // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
+                       var type = jQuery.type( array );
+
+                       if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {
+                               push.call( ret, array );
+                       } else {
+                               jQuery.merge( ret, array );
+                       }
+               }
+
+               return ret;
+       },
+
+       inArray: function( elem, array, i ) {
+               var len;
+
+               if ( array ) {
+                       if ( indexOf ) {
+                               return indexOf.call( array, elem, i );
+                       }
+
+                       len = array.length;
+                       i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
+
+                       for ( ; i < len; i++ ) {
+                               // Skip accessing in sparse arrays
+                               if ( i in array && array[ i ] === elem ) {
+                                       return i;
+                               }
+                       }
+               }
+
+               return -1;
+       },
+
+       merge: function( first, second ) {
+               var i = first.length,
+                       j = 0;
+
+               if ( typeof second.length === "number" ) {
+                       for ( var l = second.length; j < l; j++ ) {
+                               first[ i++ ] = second[ j ];
+                       }
+
+               } else {
+                       while ( second[j] !== undefined ) {
+                               first[ i++ ] = second[ j++ ];
+                       }
+               }
+
+               first.length = i;
+
+               return first;
+       },
+
+       grep: function( elems, callback, inv ) {
+               var ret = [], retVal;
+               inv = !!inv;
+
+               // Go through the array, only saving the items
+               // that pass the validator function
+               for ( var i = 0, length = elems.length; i < length; i++ ) {
+                       retVal = !!callback( elems[ i ], i );
+                       if ( inv !== retVal ) {
+                               ret.push( elems[ i ] );
+                       }
+               }
+
+               return ret;
+       },
+
+       // arg is for internal usage only
+       map: function( elems, callback, arg ) {
+               var value, key, ret = [],
+                       i = 0,
+                       length = elems.length,
+                       // jquery objects are treated as arrays
+                       isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
+
+               // Go through the array, translating each of the items to their
+               if ( isArray ) {
+                       for ( ; i < length; i++ ) {
+                               value = callback( elems[ i ], i, arg );
+
+                               if ( value != null ) {
+                                       ret[ ret.length ] = value;
+                               }
+                       }
+
+               // Go through every key on the object,
+               } else {
+                       for ( key in elems ) {
+                               value = callback( elems[ key ], key, arg );
+
+                               if ( value != null ) {
+                                       ret[ ret.length ] = value;
+                               }
+                       }
+               }
+
+               // Flatten any nested arrays
+               return ret.concat.apply( [], ret );
+       },
+
+       // A global GUID counter for objects
+       guid: 1,
+
+       // Bind a function to a context, optionally partially applying any
+       // arguments.
+       proxy: function( fn, context ) {
+               if ( typeof context === "string" ) {
+                       var tmp = fn[ context ];
+                       context = fn;
+                       fn = tmp;
+               }
+
+               // Quick check to determine if target is callable, in the spec
+               // this throws a TypeError, but we will just return undefined.
+               if ( !jQuery.isFunction( fn ) ) {
+                       return undefined;
+               }
+
+               // Simulated bind
+               var args = slice.call( arguments, 2 ),
+                       proxy = function() {
+                               return fn.apply( context, args.concat( slice.call( arguments ) ) );
+                       };
+
+               // Set the guid of unique handler to the same of original handler, so it can be removed
+               proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
+
+               return proxy;
+       },
+
+       // Mutifunctional method to get and set values to a collection
+       // The value/s can optionally be executed if it's a function
+       access: function( elems, key, value, exec, fn, pass ) {
+               var length = elems.length;
+
+               // Setting many attributes
+               if ( typeof key === "object" ) {
+                       for ( var k in key ) {
+                               jQuery.access( elems, k, key[k], exec, fn, value );
+                       }
+                       return elems;
+               }
+
+               // Setting one attribute
+               if ( value !== undefined ) {
+                       // Optionally, function values get executed if exec is true
+                       exec = !pass && exec && jQuery.isFunction(value);
+
+                       for ( var i = 0; i < length; i++ ) {
+                               fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
+                       }
+
+                       return elems;
+               }
+
+               // Getting an attribute
+               return length ? fn( elems[0], key ) : undefined;
+       },
+
+       now: function() {
+               return ( new Date() ).getTime();
+       },
+
+       // Use of jQuery.browser is frowned upon.
+       // More details: http://docs.jquery.com/Utilities/jQuery.browser
+       uaMatch: function( ua ) {
+               ua = ua.toLowerCase();
+
+               var match = rwebkit.exec( ua ) ||
+                       ropera.exec( ua ) ||
+                       rmsie.exec( ua ) ||
+                       ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||
+                       [];
+
+               return { browser: match[1] || "", version: match[2] || "0" };
+       },
+
+       sub: function() {
+               function jQuerySub( selector, context ) {
+                       return new jQuerySub.fn.init( selector, context );
+               }
+               jQuery.extend( true, jQuerySub, this );
+               jQuerySub.superclass = this;
+               jQuerySub.fn = jQuerySub.prototype = this();
+               jQuerySub.fn.constructor = jQuerySub;
+               jQuerySub.sub = this.sub;
+               jQuerySub.fn.init = function init( selector, context ) {
+                       if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
+                               context = jQuerySub( context );
+                       }
+
+                       return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
+               };
+               jQuerySub.fn.init.prototype = jQuerySub.fn;
+               var rootjQuerySub = jQuerySub(document);
+               return jQuerySub;
+       },
+
+       browser: {}
+});
+
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
+       class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
+
+browserMatch = jQuery.uaMatch( userAgent );
+if ( browserMatch.browser ) {
+       jQuery.browser[ browserMatch.browser ] = true;
+       jQuery.browser.version = browserMatch.version;
+}
+
+// Deprecated, use jQuery.browser.webkit instead
+if ( jQuery.browser.webkit ) {
+       jQuery.browser.safari = true;
+}
+
+// IE doesn't match non-breaking spaces with \s
+if ( rnotwhite.test( "\xA0" ) ) {
+       trimLeft = /^[\s\xA0]+/;
+       trimRight = /[\s\xA0]+$/;
+}
+
+// All jQuery objects should point back to these
+rootjQuery = jQuery(document);
+
+// Cleanup functions for the document ready method
+if ( document.addEventListener ) {
+       DOMContentLoaded = function() {
+               document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+               jQuery.ready();
+       };
+
+} else if ( document.attachEvent ) {
+       DOMContentLoaded = function() {
+               // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+               if ( document.readyState === "complete" ) {
+                       document.detachEvent( "onreadystatechange", DOMContentLoaded );
+                       jQuery.ready();
+               }
+       };
+}
+
+// The DOM ready check for Internet Explorer
+function doScrollCheck() {
+       if ( jQuery.isReady ) {
+               return;
+       }
+
+       try {
+               // If IE is used, use the trick by Diego Perini
+               // http://javascript.nwbox.com/IEContentLoaded/
+               document.documentElement.doScroll("left");
+       } catch(e) {
+               setTimeout( doScrollCheck, 1 );
+               return;
+       }
+
+       // and execute any waiting functions
+       jQuery.ready();
+}
+
+// Expose jQuery as an AMD module, but only for AMD loaders that
+// understand the issues with loading multiple versions of jQuery
+// in a page that all might call define(). The loader will indicate
+// they have special allowances for multiple jQuery versions by
+// specifying define.amd.jQuery = true. Register as a named module,
+// since jQuery can be concatenated with other files that may use define,
+// but not use a proper concatenation script that understands anonymous
+// AMD modules. A named AMD is safest and most robust way to register.
+// Lowercase jquery is used because AMD module names are derived from
+// file names, and jQuery is normally delivered in a lowercase file name.
+if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
+       define( "jquery", [], function () { return jQuery; } );
+}
+
+return jQuery;
+
+})();
+
+
+// String to Object flags format cache
+var flagsCache = {};
+
+// Convert String-formatted flags into Object-formatted ones and store in cache
+function createFlags( flags ) {
+       var object = flagsCache[ flags ] = {},
+               i, length;
+       flags = flags.split( /\s+/ );
+       for ( i = 0, length = flags.length; i < length; i++ ) {
+               object[ flags[i] ] = true;
+       }
+       return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ *     flags:  an optional list of space-separated flags that will change how
+ *                     the callback list behaves
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible flags:
+ *
+ *     once:                   will ensure the callback list can only be fired once (like a Deferred)
+ *
+ *     memory:                 will keep track of previous values and will call any callback added
+ *                                     after the list has been fired right away with the latest "memorized"
+ *                                     values (like a Deferred)
+ *
+ *     unique:                 will ensure a callback can only be added once (no duplicate in the list)
+ *
+ *     stopOnFalse:    interrupt callings when a callback returns false
+ *
+ */
+jQuery.Callbacks = function( flags ) {
+
+       // Convert flags from String-formatted to Object-formatted
+       // (we check in cache first)
+       flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {};
+
+       var // Actual callback list
+               list = [],
+               // Stack of fire calls for repeatable lists
+               stack = [],
+               // Last fire value (for non-forgettable lists)
+               memory,
+               // Flag to know if list is currently firing
+               firing,
+               // First callback to fire (used internally by add and fireWith)
+               firingStart,
+               // End of the loop when firing
+               firingLength,
+               // Index of currently firing callback (modified by remove if needed)
+               firingIndex,
+               // Add one or several callbacks to the list
+               add = function( args ) {
+                       var i,
+                               length,
+                               elem,
+                               type,
+                               actual;
+                       for ( i = 0, length = args.length; i < length; i++ ) {
+                               elem = args[ i ];
+                               type = jQuery.type( elem );
+                               if ( type === "array" ) {
+                                       // Inspect recursively
+                                       add( elem );
+                               } else if ( type === "function" ) {
+                                       // Add if not in unique mode and callback is not in
+                                       if ( !flags.unique || !self.has( elem ) ) {
+                                               list.push( elem );
+                                       }
+                               }
+                       }
+               },
+               // Fire callbacks
+               fire = function( context, args ) {
+                       args = args || [];
+                       memory = !flags.memory || [ context, args ];
+                       firing = true;
+                       firingIndex = firingStart || 0;
+                       firingStart = 0;
+                       firingLength = list.length;
+                       for ( ; list && firingIndex < firingLength; firingIndex++ ) {
+                               if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) {
+                                       memory = true; // Mark as halted
+                                       break;
+                               }
+                       }
+                       firing = false;
+                       if ( list ) {
+                               if ( !flags.once ) {
+                                       if ( stack && stack.length ) {
+                                               memory = stack.shift();
+                                               self.fireWith( memory[ 0 ], memory[ 1 ] );
+                                       }
+                               } else if ( memory === true ) {
+                                       self.disable();
+                               } else {
+                                       list = [];
+                               }
+                       }
+               },
+               // Actual Callbacks object
+               self = {
+                       // Add a callback or a collection of callbacks to the list
+                       add: function() {
+                               if ( list ) {
+                                       var length = list.length;
+                                       add( arguments );
+                                       // Do we need to add the callbacks to the
+                                       // current firing batch?
+                                       if ( firing ) {
+                                               firingLength = list.length;
+                                       // With memory, if we're not firing then
+                                       // we should call right away, unless previous
+                                       // firing was halted (stopOnFalse)
+                                       } else if ( memory && memory !== true ) {
+                                               firingStart = length;
+                                               fire( memory[ 0 ], memory[ 1 ] );
+                                       }
+                               }
+                               return this;
+                       },
+                       // Remove a callback from the list
+                       remove: function() {
+                               if ( list ) {
+                                       var args = arguments,
+                                               argIndex = 0,
+                                               argLength = args.length;
+                                       for ( ; argIndex < argLength ; argIndex++ ) {
+                                               for ( var i = 0; i < list.length; i++ ) {
+                                                       if ( args[ argIndex ] === list[ i ] ) {
+                                                               // Handle firingIndex and firingLength
+                                                               if ( firing ) {
+                                                                       if ( i <= firingLength ) {
+                                                                               firingLength--;
+                                                                               if ( i <= firingIndex ) {
+                                                                                       firingIndex--;
+                                                                               }
+                                                                       }
+                                                               }
+                                                               // Remove the element
+                                                               list.splice( i--, 1 );
+                                                               // If we have some unicity property then
+                                                               // we only need to do this once
+                                                               if ( flags.unique ) {
+                                                                       break;
+                                                               }
+                                                       }
+                                               }
+                                       }
+                               }
+                               return this;
+                       },
+                       // Control if a given callback is in the list
+                       has: function( fn ) {
+                               if ( list ) {
+                                       var i = 0,
+                                               length = list.length;
+                                       for ( ; i < length; i++ ) {
+                                               if ( fn === list[ i ] ) {
+                                                       return true;
+                                               }
+                                       }
+                               }
+                               return false;
+                       },
+                       // Remove all callbacks from the list
+                       empty: function() {
+                               list = [];
+                               return this;
+                       },
+                       // Have the list do nothing anymore
+                       disable: function() {
+                               list = stack = memory = undefined;
+                               return this;
+                       },
+                       // Is it disabled?
+                       disabled: function() {
+                               return !list;
+                       },
+                       // Lock the list in its current state
+                       lock: function() {
+                               stack = undefined;
+                               if ( !memory || memory === true ) {
+                                       self.disable();
+                               }
+                               return this;
+                       },
+                       // Is it locked?
+                       locked: function() {
+                               return !stack;
+                       },
+                       // Call all callbacks with the given context and arguments
+                       fireWith: function( context, args ) {
+                               if ( stack ) {
+                                       if ( firing ) {
+                                               if ( !flags.once ) {
+                                                       stack.push( [ context, args ] );
+                                               }
+                                       } else if ( !( flags.once && memory ) ) {
+                                               fire( context, args );
+                                       }
+                               }
+                               return this;
+                       },
+                       // Call all the callbacks with the given arguments
+                       fire: function() {
+                               self.fireWith( this, arguments );
+                               return this;
+                       },
+                       // To know if the callbacks have already been called at least once
+                       fired: function() {
+                               return !!memory;
+                       }
+               };
+
+       return self;
+};
+
+
+
+
+var // Static reference to slice
+       sliceDeferred = [].slice;
+
+jQuery.extend({
+
+       Deferred: function( func ) {
+               var doneList = jQuery.Callbacks( "once memory" ),
+                       failList = jQuery.Callbacks( "once memory" ),
+                       progressList = jQuery.Callbacks( "memory" ),
+                       state = "pending",
+                       lists = {
+                               resolve: doneList,
+                               reject: failList,
+                               notify: progressList
+                       },
+                       promise = {
+                               done: doneList.add,
+                               fail: failList.add,
+                               progress: progressList.add,
+
+                               state: function() {
+                                       return state;
+                               },
+
+                               // Deprecated
+                               isResolved: doneList.fired,
+                               isRejected: failList.fired,
+
+                               then: function( doneCallbacks, failCallbacks, progressCallbacks ) {
+                                       deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks );
+                                       return this;
+                               },
+                               always: function() {
+                                       return deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments );
+                               },
+                               pipe: function( fnDone, fnFail, fnProgress ) {
+                                       return jQuery.Deferred(function( newDefer ) {
+                                               jQuery.each( {
+                                                       done: [ fnDone, "resolve" ],
+                                                       fail: [ fnFail, "reject" ],
+                                                       progress: [ fnProgress, "notify" ]
+                                               }, function( handler, data ) {
+                                                       var fn = data[ 0 ],
+                                                               action = data[ 1 ],
+                                                               returned;
+                                                       if ( jQuery.isFunction( fn ) ) {
+                                                               deferred[ handler ](function() {
+                                                                       returned = fn.apply( this, arguments );
+                                                                       if ( returned && jQuery.isFunction( returned.promise ) ) {
+                                                                               returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify );
+                                                                       } else {
+                                                                               newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
+                                                                       }
+                                                               });
+                                                       } else {
+                                                               deferred[ handler ]( newDefer[ action ] );
+                                                       }
+                                               });
+                                       }).promise();
+                               },
+                               // Get a promise for this deferred
+                               // If obj is provided, the promise aspect is added to the object
+                               promise: function( obj ) {
+                                       if ( obj == null ) {
+                                               obj = promise;
+                                       } else {
+                                               for ( var key in promise ) {
+                                                       obj[ key ] = promise[ key ];
+                                               }
+                                       }
+                                       return obj;
+                               }
+                       },
+                       deferred = promise.promise({}),
+                       key;
+
+               for ( key in lists ) {
+                       deferred[ key ] = lists[ key ].fire;
+                       deferred[ key + "With" ] = lists[ key ].fireWith;
+               }
+
+               // Handle state
+               deferred.done( function() {
+                       state = "resolved";
+               }, failList.disable, progressList.lock ).fail( function() {
+                       state = "rejected";
+               }, doneList.disable, progressList.lock );
+
+               // Call given func if any
+               if ( func ) {
+                       func.call( deferred, deferred );
+               }
+
+               // All done!
+               return deferred;
+       },
+
+       // Deferred helper
+       when: function( firstParam ) {
+               var args = sliceDeferred.call( arguments, 0 ),
+                       i = 0,
+                       length = args.length,
+                       pValues = new Array( length ),
+                       count = length,
+                       pCount = length,
+                       deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ?
+                               firstParam :
+                               jQuery.Deferred(),
+                       promise = deferred.promise();
+               function resolveFunc( i ) {
+                       return function( value ) {
+                               args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
+                               if ( !( --count ) ) {
+                                       deferred.resolveWith( deferred, args );
+                               }
+                       };
+               }
+               function progressFunc( i ) {
+                       return function( value ) {
+                               pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
+                               deferred.notifyWith( promise, pValues );
+                       };
+               }
+               if ( length > 1 ) {
+                       for ( ; i < length; i++ ) {
+                               if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) {
+                                       args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) );
+                               } else {
+                                       --count;
+                               }
+                       }
+                       if ( !count ) {
+                               deferred.resolveWith( deferred, args );
+                       }
+               } else if ( deferred !== firstParam ) {
+                       deferred.resolveWith( deferred, length ? [ firstParam ] : [] );
+               }
+               return promise;
+       }
+});
+
+
+
+
+jQuery.support = (function() {
+
+       var div = document.createElement( "div" ),
+               documentElement = document.documentElement,
+               all,
+               a,
+               select,
+               opt,
+               input,
+               marginDiv,
+               support,
+               fragment,
+               body,
+               testElementParent,
+               testElement,
+               testElementStyle,
+               tds,
+               events,
+               eventName,
+               i,
+               isSupported;
+
+       // Preliminary tests
+       div.setAttribute("className", "t");
+       div.innerHTML = "   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/><nav></nav>";
+
+
+       all = div.getElementsByTagName( "*" );
+       a = div.getElementsByTagName( "a" )[ 0 ];
+
+       // Can't get basic test support
+       if ( !all || !all.length || !a ) {
+               return {};
+       }
+
+       // First batch of supports tests
+       select = document.createElement( "select" );
+       opt = select.appendChild( document.createElement("option") );
+       input = div.getElementsByTagName( "input" )[ 0 ];
+
+       support = {
+               // IE strips leading whitespace when .innerHTML is used
+               leadingWhitespace: ( div.firstChild.nodeType === 3 ),
+
+               // Make sure that tbody elements aren't automatically inserted
+               // IE will insert them into empty tables
+               tbody: !div.getElementsByTagName( "tbody" ).length,
+
+               // Make sure that link elements get serialized correctly by innerHTML
+               // This requires a wrapper element in IE
+               htmlSerialize: !!div.getElementsByTagName( "link" ).length,
+
+               // Get the style information from getAttribute
+               // (IE uses .cssText instead)
+               style: /top/.test( a.getAttribute("style") ),
+
+               // Make sure that URLs aren't manipulated
+               // (IE normalizes it by default)
+               hrefNormalized: ( a.getAttribute( "href" ) === "/a" ),
+
+               // Make sure that element opacity exists
+               // (IE uses filter instead)
+               // Use a regex to work around a WebKit issue. See #5145
+               opacity: /^0.55/.test( a.style.opacity ),
+
+               // Verify style float existence
+               // (IE uses styleFloat instead of cssFloat)
+               cssFloat: !!a.style.cssFloat,
+
+               // Make sure unknown elements (like HTML5 elems) are handled appropriately
+               unknownElems: !!div.getElementsByTagName( "nav" ).length,
+
+               // Make sure that if no value is specified for a checkbox
+               // that it defaults to "on".
+               // (WebKit defaults to "" instead)
+               checkOn: ( input.value === "on" ),
+
+               // Make sure that a selected-by-default option has a working selected property.
+               // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
+               optSelected: opt.selected,
+
+               // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
+               getSetAttribute: div.className !== "t",
+
+               // Tests for enctype support on a form(#6743)
+               enctype: !!document.createElement("form").enctype,
+
+               // Will be defined later
+               submitBubbles: true,
+               changeBubbles: true,
+               focusinBubbles: false,
+               deleteExpando: true,
+               noCloneEvent: true,
+               inlineBlockNeedsLayout: false,
+               shrinkWrapBlocks: false,
+               reliableMarginRight: true
+       };
+
+       // Make sure checked status is properly cloned
+       input.checked = true;
+       support.noCloneChecked = input.cloneNode( true ).checked;
+
+       // Make sure that the options inside disabled selects aren't marked as disabled
+       // (WebKit marks them as disabled)
+       select.disabled = true;
+       support.optDisabled = !opt.disabled;
+
+       // Test to see if it's possible to delete an expando from an element
+       // Fails in Internet Explorer
+       try {
+               delete div.test;
+       } catch( e ) {
+               support.deleteExpando = false;
+       }
+
+       if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
+               div.attachEvent( "onclick", function() {
+                       // Cloning a node shouldn't copy over any
+                       // bound event handlers (IE does this)
+                       support.noCloneEvent = false;
+               });
+               div.cloneNode( true ).fireEvent( "onclick" );
+       }
+
+       // Check if a radio maintains its value
+       // after being appended to the DOM
+       input = document.createElement("input");
+       input.value = "t";
+       input.setAttribute("type", "radio");
+       support.radioValue = input.value === "t";
+
+       input.setAttribute("checked", "checked");
+       div.appendChild( input );
+       fragment = document.createDocumentFragment();
+       fragment.appendChild( div.lastChild );
+
+       // WebKit doesn't clone checked state correctly in fragments
+       support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+       div.innerHTML = "";
+
+       // Figure out if the W3C box model works as expected
+       div.style.width = div.style.paddingLeft = "1px";
+
+       // We don't want to do body-related feature tests on frameset
+       // documents, which lack a body. So we use
+       // document.getElementsByTagName("body")[0], which is undefined in
+       // frameset documents, while document.body isn’t. (7398)
+       body = document.getElementsByTagName("body")[ 0 ];
+       // We use our own, invisible, body unless the body is already present
+       // in which case we use a div (#9239)
+       testElement = document.createElement( body ? "div" : "body" );
+       testElementStyle = {
+               visibility: "hidden",
+               width: 0,
+               height: 0,
+               border: 0,
+               margin: 0,
+               background: "none"
+       };
+       if ( body ) {
+               jQuery.extend( testElementStyle, {
+                       position: "absolute",
+                       left: "-999px",
+                       top: "-999px"
+               });
+       }
+       for ( i in testElementStyle ) {
+               testElement.style[ i ] = testElementStyle[ i ];
+       }
+       testElement.appendChild( div );
+       testElementParent = body || documentElement;
+       testElementParent.insertBefore( testElement, testElementParent.firstChild );
+
+       // Check if a disconnected checkbox will retain its checked
+       // value of true after appended to the DOM (IE6/7)
+       support.appendChecked = input.checked;
+
+       support.boxModel = div.offsetWidth === 2;
+
+       if ( "zoom" in div.style ) {
+               // Check if natively block-level elements act like inline-block
+               // elements when setting their display to 'inline' and giving
+               // them layout
+               // (IE < 8 does this)
+               div.style.display = "inline";
+               div.style.zoom = 1;
+               support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 );
+
+               // Check if elements with layout shrink-wrap their children
+               // (IE 6 does this)
+               div.style.display = "";
+               div.innerHTML = "<div style='width:4px;'></div>";
+               support.shrinkWrapBlocks = ( div.offsetWidth !== 2 );
+       }
+
+       div.innerHTML = "<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";
+       tds = div.getElementsByTagName( "td" );
+
+       // Check if table cells still have offsetWidth/Height when they are set
+       // to display:none and there are still other visible table cells in a
+       // table row; if so, offsetWidth/Height are not reliable for use when
+       // determining if an element has been hidden directly using
+       // display:none (it is still safe to use offsets if a parent element is
+       // hidden; don safety goggles and see bug #4512 for more information).
+       // (only IE 8 fails this test)
+       isSupported = ( tds[ 0 ].offsetHeight === 0 );
+
+       tds[ 0 ].style.display = "";
+       tds[ 1 ].style.display = "none";
+
+       // Check if empty table cells still have offsetWidth/Height
+       // (IE < 8 fail this test)
+       support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
+       div.innerHTML = "";
+
+       // Check if div with explicit width and no margin-right incorrectly
+       // gets computed margin-right based on width of container. For more
+       // info see bug #3333
+       // Fails in WebKit before Feb 2011 nightlies
+       // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+       if ( document.defaultView && document.defaultView.getComputedStyle ) {
+               marginDiv = document.createElement( "div" );
+               marginDiv.style.width = "0";
+               marginDiv.style.marginRight = "0";
+               div.appendChild( marginDiv );
+               support.reliableMarginRight =
+                       ( parseInt( ( document.defaultView.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0;
+       }
+
+       // Technique from Juriy Zaytsev
+       // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/
+       // We only care about the case where non-standard event systems
+       // are used, namely in IE. Short-circuiting here helps us to
+       // avoid an eval call (in setAttribute) which can cause CSP
+       // to go haywire. See: https://developer.mozilla.org/en/Security/CSP
+       if ( div.attachEvent ) {
+               for( i in {
+                       submit: 1,
+                       change: 1,
+                       focusin: 1
+               } ) {
+                       eventName = "on" + i;
+                       isSupported = ( eventName in div );
+                       if ( !isSupported ) {
+                               div.setAttribute( eventName, "return;" );
+                               isSupported = ( typeof div[ eventName ] === "function" );
+                       }
+                       support[ i + "Bubbles" ] = isSupported;
+               }
+       }
+
+       // Run fixed position tests at doc ready to avoid a crash
+       // related to the invisible body in IE8
+       jQuery(function() {
+               var container, outer, inner, table, td, offsetSupport,
+                       conMarginTop = 1,
+                       ptlm = "position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",
+                       vb = "visibility:hidden;border:0;",
+                       style = "style='" + ptlm + "border:5px solid #000;padding:0;'",
+                       html = "<div " + style + "><div></div></div>" +
+                                                       "<table " + style + " cellpadding='0' cellspacing='0'>" +
+                                                       "<tr><td></td></tr></table>";
+
+               // Reconstruct a container
+               body = document.getElementsByTagName("body")[0];
+               if ( !body ) {
+                       // Return for frameset docs that don't have a body
+                       // These tests cannot be done
+                       return;
+               }
+
+               container = document.createElement("div");
+               container.style.cssText = vb + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px";
+               body.insertBefore( container, body.firstChild );
+
+               // Construct a test element
+               testElement = document.createElement("div");
+               testElement.style.cssText = ptlm + vb;
+
+               testElement.innerHTML = html;
+               container.appendChild( testElement );
+               outer = testElement.firstChild;
+               inner = outer.firstChild;
+               td = outer.nextSibling.firstChild.firstChild;
+
+               offsetSupport = {
+                       doesNotAddBorder: ( inner.offsetTop !== 5 ),
+                       doesAddBorderForTableAndCells: ( td.offsetTop === 5 )
+               };
+
+               inner.style.position = "fixed";
+               inner.style.top = "20px";
+
+               // safari subtracts parent border width here which is 5px
+               offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 );
+               inner.style.position = inner.style.top = "";
+
+               outer.style.overflow = "hidden";
+               outer.style.position = "relative";
+
+               offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 );
+               offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop );
+
+               body.removeChild( container );
+               testElement = container = null;
+
+               jQuery.extend( support, offsetSupport );
+       });
+
+       testElement.innerHTML = "";
+       testElementParent.removeChild( testElement );
+
+       // Null connected elements to avoid leaks in IE
+       testElement = fragment = select = opt = body = marginDiv = div = input = null;
+
+       return support;
+})();
+
+// Keep track of boxModel
+jQuery.boxModel = jQuery.support.boxModel;
+
+
+
+
+var rbrace = /^(?:\{.*\}|\[.*\])$/,
+       rmultiDash = /([A-Z])/g;
+
+jQuery.extend({
+       cache: {},
+
+       // Please use with caution
+       uuid: 0,
+
+       // Unique for each copy of jQuery on the page
+       // Non-digits removed to match rinlinejQuery
+       expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
+
+       // The following elements throw uncatchable exceptions if you
+       // attempt to add expando properties to them.
+       noData: {
+               "embed": true,
+               // Ban all objects except for Flash (which handle expandos)
+               "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
+               "applet": true
+       },
+
+       hasData: function( elem ) {
+               elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
+               return !!elem && !isEmptyDataObject( elem );
+       },
+
+       data: function( elem, name, data, pvt /* Internal Use Only */ ) {
+               if ( !jQuery.acceptData( elem ) ) {
+                       return;
+               }
+
+               var privateCache, thisCache, ret,
+                       internalKey = jQuery.expando,
+                       getByName = typeof name === "string",
+
+                       // We have to handle DOM nodes and JS objects differently because IE6-7
+                       // can't GC object references properly across the DOM-JS boundary
+                       isNode = elem.nodeType,
+
+                       // Only DOM nodes need the global jQuery cache; JS object data is
+                       // attached directly to the object so GC can occur automatically
+                       cache = isNode ? jQuery.cache : elem,
+
+                       // Only defining an ID for JS objects if its cache already exists allows
+                       // the code to shortcut on the same path as a DOM node with no cache
+                       id = isNode ? elem[ jQuery.expando ] : elem[ jQuery.expando ] && jQuery.expando,
+                       isEvents = name === "events";
+
+               // Avoid doing any more work than we need to when trying to get data on an
+               // object that has no data at all
+               if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) {
+                       return;
+               }
+
+               if ( !id ) {
+                       // Only DOM nodes need a new unique ID for each element since their data
+                       // ends up in the global cache
+                       if ( isNode ) {
+                               elem[ jQuery.expando ] = id = ++jQuery.uuid;
+                       } else {
+                               id = jQuery.expando;
+                       }
+               }
+
+               if ( !cache[ id ] ) {
+                       cache[ id ] = {};
+
+                       // Avoids exposing jQuery metadata on plain JS objects when the object
+                       // is serialized using JSON.stringify
+                       if ( !isNode ) {
+                               cache[ id ].toJSON = jQuery.noop;
+                       }
+               }
+
+               // An object can be passed to jQuery.data instead of a key/value pair; this gets
+               // shallow copied over onto the existing cache
+               if ( typeof name === "object" || typeof name === "function" ) {
+                       if ( pvt ) {
+                               cache[ id ] = jQuery.extend( cache[ id ], name );
+                       } else {
+                               cache[ id ].data = jQuery.extend( cache[ id ].data, name );
+                       }
+               }
+
+               privateCache = thisCache = cache[ id ];
+
+               // jQuery data() is stored in a separate object inside the object's internal data
+               // cache in order to avoid key collisions between internal data and user-defined
+               // data.
+               if ( !pvt ) {
+                       if ( !thisCache.data ) {
+                               thisCache.data = {};
+                       }
+
+                       thisCache = thisCache.data;
+               }
+
+               if ( data !== undefined ) {
+                       thisCache[ jQuery.camelCase( name ) ] = data;
+               }
+
+               // Users should not attempt to inspect the internal events object using jQuery.data,
+               // it is undocumented and subject to change. But does anyone listen? No.
+               if ( isEvents && !thisCache[ name ] ) {
+                       return privateCache.events;
+               }
+
+               // Check for both converted-to-camel and non-converted data property names
+               // If a data property was specified
+               if ( getByName ) {
+
+                       // First Try to find as-is property data
+                       ret = thisCache[ name ];
+
+                       // Test for null|undefined property data
+                       if ( ret == null ) {
+
+                               // Try to find the camelCased property
+                               ret = thisCache[ jQuery.camelCase( name ) ];
+                       }
+               } else {
+                       ret = thisCache;
+               }
+
+               return ret;
+       },
+
+       removeData: function( elem, name, pvt /* Internal Use Only */ ) {
+               if ( !jQuery.acceptData( elem ) ) {
+                       return;
+               }
+
+               var thisCache, i, l,
+
+                       // Reference to internal data cache key
+                       internalKey = jQuery.expando,
+
+                       isNode = elem.nodeType,
+
+                       // See jQuery.data for more information
+                       cache = isNode ? jQuery.cache : elem,
+
+                       // See jQuery.data for more information
+                       id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
+
+               // If there is already no cache entry for this object, there is no
+               // purpose in continuing
+               if ( !cache[ id ] ) {
+                       return;
+               }
+
+               if ( name ) {
+
+                       thisCache = pvt ? cache[ id ] : cache[ id ].data;
+
+                       if ( thisCache ) {
+
+                               // Support space separated names
+                               if ( jQuery.isArray( name ) ) {
+                                       name = name;
+                               } else if ( name in thisCache ) {
+                                       name = [ name ];
+                               } else {
+
+                                       // split the camel cased version by spaces
+                                       name = jQuery.camelCase( name );
+                                       if ( name in thisCache ) {
+                                               name = [ name ];
+                                       } else {
+                                               name = name.split( " " );
+                                       }
+                               }
+
+                               for ( i = 0, l = name.length; i < l; i++ ) {
+                                       delete thisCache[ name[i] ];
+                               }
+
+                               // If there is no data left in the cache, we want to continue
+                               // and let the cache object itself get destroyed
+                               if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
+                                       return;
+                               }
+                       }
+               }
+
+               // See jQuery.data for more information
+               if ( !pvt ) {
+                       delete cache[ id ].data;
+
+                       // Don't destroy the parent cache unless the internal data object
+                       // had been the only thing left in it
+                       if ( !isEmptyDataObject(cache[ id ]) ) {
+                               return;
+                       }
+               }
+
+               // Browsers that fail expando deletion also refuse to delete expandos on
+               // the window, but it will allow it on all other JS objects; other browsers
+               // don't care
+               // Ensure that `cache` is not a window object #10080
+               if ( jQuery.support.deleteExpando || !cache.setInterval ) {
+                       delete cache[ id ];
+               } else {
+                       cache[ id ] = null;
+               }
+
+               // We destroyed the cache and need to eliminate the expando on the node to avoid
+               // false lookups in the cache for entries that no longer exist
+               if ( isNode ) {
+                       // IE does not allow us to delete expando properties from nodes,
+                       // nor does it have a removeAttribute function on Document nodes;
+                       // we must handle all of these cases
+                       if ( jQuery.support.deleteExpando ) {
+                               delete elem[ jQuery.expando ];
+                       } else if ( elem.removeAttribute ) {
+                               elem.removeAttribute( jQuery.expando );
+                       } else {
+                               elem[ jQuery.expando ] = null;
+                       }
+               }
+       },
+
+       // For internal use only.
+       _data: function( elem, name, data ) {
+               return jQuery.data( elem, name, data, true );
+       },
+
+       // A method for determining if a DOM node can handle the data expando
+       acceptData: function( elem ) {
+               if ( elem.nodeName ) {
+                       var match = jQuery.noData[ elem.nodeName.toLowerCase() ];
+
+                       if ( match ) {
+                               return !(match === true || elem.getAttribute("classid") !== match);
+                       }
+               }
+
+               return true;
+       }
+});
+
+jQuery.fn.extend({
+       data: function( key, value ) {
+               var parts, attr, name,
+                       data = null;
+
+               if ( typeof key === "undefined" ) {
+                       if ( this.length ) {
+                               data = jQuery.data( this[0] );
+
+                               if ( this[0].nodeType === 1 && !jQuery._data( this[0], "parsedAttrs" ) ) {
+                                       attr = this[0].attributes;
+                                       for ( var i = 0, l = attr.length; i < l; i++ ) {
+                                               name = attr[i].name;
+
+                                               if ( name.indexOf( "data-" ) === 0 ) {
+                                                       name = jQuery.camelCase( name.substring(5) );
+
+                                                       dataAttr( this[0], name, data[ name ] );
+                                               }
+                                       }
+                                       jQuery._data( this[0], "parsedAttrs", true );
+                               }
+                       }
+
+                       return data;
+
+               } else if ( typeof key === "object" ) {
+                       return this.each(function() {
+                               jQuery.data( this, key );
+                       });
+               }
+
+               parts = key.split(".");
+               parts[1] = parts[1] ? "." + parts[1] : "";
+
+               if ( value === undefined ) {
+                       data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
+
+                       // Try to fetch any internally stored data first
+                       if ( data === undefined && this.length ) {
+                               data = jQuery.data( this[0], key );
+                               data = dataAttr( this[0], key, data );
+                       }
+
+                       return data === undefined && parts[1] ?
+                               this.data( parts[0] ) :
+                               data;
+
+               } else {
+                       return this.each(function() {
+                               var $this = jQuery( this ),
+                                       args = [ parts[0], value ];
+
+                               $this.triggerHandler( "setData" + parts[1] + "!", args );
+                               jQuery.data( this, key, value );
+                               $this.triggerHandler( "changeData" + parts[1] + "!", args );
+                       });
+               }
+       },
+
+       removeData: function( key ) {
+               return this.each(function() {
+                       jQuery.removeData( this, key );
+               });
+       }
+});
+
+function dataAttr( elem, key, data ) {
+       // If nothing was found internally, try to fetch any
+       // data from the HTML5 data-* attribute
+       if ( data === undefined && elem.nodeType === 1 ) {
+
+               var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
+
+               data = elem.getAttribute( name );
+
+               if ( typeof data === "string" ) {
+                       try {
+                               data = data === "true" ? true :
+                               data === "false" ? false :
+                               data === "null" ? null :
+                               jQuery.isNumeric( data ) ? parseFloat( data ) :
+                                       rbrace.test( data ) ? jQuery.parseJSON( data ) :
+                                       data;
+                       } catch( e ) {}
+
+                       // Make sure we set the data so it isn't changed later
+                       jQuery.data( elem, key, data );
+
+               } else {
+                       data = undefined;
+               }
+       }
+
+       return data;
+}
+
+// checks a cache object for emptiness
+function isEmptyDataObject( obj ) {
+       for ( var name in obj ) {
+
+               // if the public data object is empty, the private is still empty
+               if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
+                       continue;
+               }
+               if ( name !== "toJSON" ) {
+                       return false;
+               }
+       }
+
+       return true;
+}
+
+
+
+
+function handleQueueMarkDefer( elem, type, src ) {
+       var deferDataKey = type + "defer",
+               queueDataKey = type + "queue",
+               markDataKey = type + "mark",
+               defer = jQuery._data( elem, deferDataKey );
+       if ( defer &&
+               ( src === "queue" || !jQuery._data(elem, queueDataKey) ) &&
+               ( src === "mark" || !jQuery._data(elem, markDataKey) ) ) {
+               // Give room for hard-coded callbacks to fire first
+               // and eventually mark/queue something else on the element
+               setTimeout( function() {
+                       if ( !jQuery._data( elem, queueDataKey ) &&
+                               !jQuery._data( elem, markDataKey ) ) {
+                               jQuery.removeData( elem, deferDataKey, true );
+                               defer.fire();
+                       }
+               }, 0 );
+       }
+}
+
+jQuery.extend({
+
+       _mark: function( elem, type ) {
+               if ( elem ) {
+                       type = ( type || "fx" ) + "mark";
+                       jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 );
+               }
+       },
+
+       _unmark: function( force, elem, type ) {
+               if ( force !== true ) {
+                       type = elem;
+                       elem = force;
+                       force = false;
+               }
+               if ( elem ) {
+                       type = type || "fx";
+                       var key = type + "mark",
+                               count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 );
+                       if ( count ) {
+                               jQuery._data( elem, key, count );
+                       } else {
+                               jQuery.removeData( elem, key, true );
+                               handleQueueMarkDefer( elem, type, "mark" );
+                       }
+               }
+       },
+
+       queue: function( elem, type, data ) {
+               var q;
+               if ( elem ) {
+                       type = ( type || "fx" ) + "queue";
+                       q = jQuery._data( elem, type );
+
+                       // Speed up dequeue by getting out quickly if this is just a lookup
+                       if ( data ) {
+                               if ( !q || jQuery.isArray(data) ) {
+                                       q = jQuery._data( elem, type, jQuery.makeArray(data) );
+                               } else {
+                                       q.push( data );
+                               }
+                       }
+                       return q || [];
+               }
+       },
+
+       dequeue: function( elem, type ) {
+               type = type || "fx";
+
+               var queue = jQuery.queue( elem, type ),
+                       fn = queue.shift(),
+                       hooks = {};
+
+               // If the fx queue is dequeued, always remove the progress sentinel
+               if ( fn === "inprogress" ) {
+                       fn = queue.shift();
+               }
+
+               if ( fn ) {
+                       // Add a progress sentinel to prevent the fx queue from being
+                       // automatically dequeued
+                       if ( type === "fx" ) {
+                               queue.unshift( "inprogress" );
+                       }
+
+                       jQuery._data( elem, type + ".run", hooks );
+                       fn.call( elem, function() {
+                               jQuery.dequeue( elem, type );
+                       }, hooks );
+               }
+
+               if ( !queue.length ) {
+                       jQuery.removeData( elem, type + "queue " + type + ".run", true );
+                       handleQueueMarkDefer( elem, type, "queue" );
+               }
+       }
+});
+
+jQuery.fn.extend({
+       queue: function( type, data ) {
+               if ( typeof type !== "string" ) {
+                       data = type;
+                       type = "fx";
+               }
+
+               if ( data === undefined ) {
+                       return jQuery.queue( this[0], type );
+               }
+               return this.each(function() {
+                       var queue = jQuery.queue( this, type, data );
+
+                       if ( type === "fx" && queue[0] !== "inprogress" ) {
+                               jQuery.dequeue( this, type );
+                       }
+               });
+       },
+       dequeue: function( type ) {
+               return this.each(function() {
+                       jQuery.dequeue( this, type );
+               });
+       },
+       // Based off of the plugin by Clint Helfers, with permission.
+       // http://blindsignals.com/index.php/2009/07/jquery-delay/
+       delay: function( time, type ) {
+               time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
+               type = type || "fx";
+
+               return this.queue( type, function( next, hooks ) {
+                       var timeout = setTimeout( next, time );
+                       hooks.stop = function() {
+                               clearTimeout( timeout );
+                       };
+               });
+       },
+       clearQueue: function( type ) {
+               return this.queue( type || "fx", [] );
+       },
+       // Get a promise resolved when queues of a certain type
+       // are emptied (fx is the type by default)
+       promise: function( type, object ) {
+               if ( typeof type !== "string" ) {
+                       object = type;
+                       type = undefined;
+               }
+               type = type || "fx";
+               var defer = jQuery.Deferred(),
+                       elements = this,
+                       i = elements.length,
+                       count = 1,
+                       deferDataKey = type + "defer",
+                       queueDataKey = type + "queue",
+                       markDataKey = type + "mark",
+                       tmp;
+               function resolve() {
+                       if ( !( --count ) ) {
+                               defer.resolveWith( elements, [ elements ] );
+                       }
+               }
+               while( i-- ) {
+                       if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) ||
+                                       ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) ||
+                                               jQuery.data( elements[ i ], markDataKey, undefined, true ) ) &&
+                                       jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) {
+                               count++;
+                               tmp.add( resolve );
+                       }
+               }
+               resolve();
+               return defer.promise();
+       }
+});
+
+
+
+
+var rclass = /[\n\t\r]/g,
+       rspace = /\s+/,
+       rreturn = /\r/g,
+       rtype = /^(?:button|input)$/i,
+       rfocusable = /^(?:button|input|object|select|textarea)$/i,
+       rclickable = /^a(?:rea)?$/i,
+       rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
+       getSetAttribute = jQuery.support.getSetAttribute,
+       nodeHook, boolHook, fixSpecified;
+
+jQuery.fn.extend({
+       attr: function( name, value ) {
+               return jQuery.access( this, name, value, true, jQuery.attr );
+       },
+
+       removeAttr: function( name ) {
+               return this.each(function() {
+                       jQuery.removeAttr( this, name );
+               });
+       },
+
+       prop: function( name, value ) {
+               return jQuery.access( this, name, value, true, jQuery.prop );
+       },
+
+       removeProp: function( name ) {
+               name = jQuery.propFix[ name ] || name;
+               return this.each(function() {
+                       // try/catch handles cases where IE balks (such as removing a property on window)
+                       try {
+                               this[ name ] = undefined;
+                               delete this[ name ];
+                       } catch( e ) {}
+               });
+       },
+
+       addClass: function( value ) {
+               var classNames, i, l, elem,
+                       setClass, c, cl;
+
+               if ( jQuery.isFunction( value ) ) {
+                       return this.each(function( j ) {
+                               jQuery( this ).addClass( value.call(this, j, this.className) );
+                       });
+               }
+
+               if ( value && typeof value === "string" ) {
+                       classNames = value.split( rspace );
+
+                       for ( i = 0, l = this.length; i < l; i++ ) {
+                               elem = this[ i ];
+
+                               if ( elem.nodeType === 1 ) {
+                                       if ( !elem.className && classNames.length === 1 ) {
+                                               elem.className = value;
+
+                                       } else {
+                                               setClass = " " + elem.className + " ";
+
+                                               for ( c = 0, cl = classNames.length; c < cl; c++ ) {
+                                                       if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) {
+                                                               setClass += classNames[ c ] + " ";
+                                                       }
+                                               }
+                                               elem.className = jQuery.trim( setClass );
+                                       }
+                               }
+                       }
+               }
+
+               return this;
+       },
+
+       removeClass: function( value ) {
+               var classNames, i, l, elem, className, c, cl;
+
+               if ( jQuery.isFunction( value ) ) {
+                       return this.each(function( j ) {
+                               jQuery( this ).removeClass( value.call(this, j, this.className) );
+                       });
+               }
+
+               if ( (value && typeof value === "string") || value === undefined ) {
+                       classNames = ( value || "" ).split( rspace );
+
+                       for ( i = 0, l = this.length; i < l; i++ ) {
+                               elem = this[ i ];
+
+                               if ( elem.nodeType === 1 && elem.className ) {
+                                       if ( value ) {
+                                               className = (" " + elem.className + " ").replace( rclass, " " );
+                                               for ( c = 0, cl = classNames.length; c < cl; c++ ) {
+                                                       className = className.replace(" " + classNames[ c ] + " ", " ");
+                                               }
+                                               elem.className = jQuery.trim( className );
+
+                                       } else {
+                                               elem.className = "";
+                                       }
+                               }
+                       }
+               }
+
+               return this;
+       },
+
+       toggleClass: function( value, stateVal ) {
+               var type = typeof value,
+                       isBool = typeof stateVal === "boolean";
+
+               if ( jQuery.isFunction( value ) ) {
+                       return this.each(function( i ) {
+                               jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
+                       });
+               }
+
+               return this.each(function() {
+                       if ( type === "string" ) {
+                               // toggle individual class names
+                               var className,
+                                       i = 0,
+                                       self = jQuery( this ),
+                                       state = stateVal,
+                                       classNames = value.split( rspace );
+
+                               while ( (className = classNames[ i++ ]) ) {
+                                       // check each className given, space seperated list
+                                       state = isBool ? state : !self.hasClass( className );
+                                       self[ state ? "addClass" : "removeClass" ]( className );
+                               }
+
+                       } else if ( type === "undefined" || type === "boolean" ) {
+                               if ( this.className ) {
+                                       // store className if set
+                                       jQuery._data( this, "__className__", this.className );
+                               }
+
+                               // toggle whole className
+                               this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
+                       }
+               });
+       },
+
+       hasClass: function( selector ) {
+               var className = " " + selector + " ",
+                       i = 0,
+                       l = this.length;
+               for ( ; i < l; i++ ) {
+                       if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
+                               return true;
+                       }
+               }
+
+               return false;
+       },
+
+       val: function( value ) {
+               var hooks, ret, isFunction,
+                       elem = this[0];
+
+               if ( !arguments.length ) {
+                       if ( elem ) {
+                               hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ];
+
+                               if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
+                                       return ret;
+                               }
+
+                               ret = elem.value;
+
+                               return typeof ret === "string" ?
+                                       // handle most common string cases
+                                       ret.replace(rreturn, "") :
+                                       // handle cases where value is null/undef or number
+                                       ret == null ? "" : ret;
+                       }
+
+                       return undefined;
+               }
+
+               isFunction = jQuery.isFunction( value );
+
+               return this.each(function( i ) {
+                       var self = jQuery(this), val;
+
+                       if ( this.nodeType !== 1 ) {
+                               return;
+                       }
+
+                       if ( isFunction ) {
+                               val = value.call( this, i, self.val() );
+                       } else {
+                               val = value;
+                       }
+
+                       // Treat null/undefined as ""; convert numbers to string
+                       if ( val == null ) {
+                               val = "";
+                       } else if ( typeof val === "number" ) {
+                               val += "";
+                       } else if ( jQuery.isArray( val ) ) {
+                               val = jQuery.map(val, function ( value ) {
+                                       return value == null ? "" : value + "";
+                               });
+                       }
+
+                       hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ];
+
+                       // If set returns undefined, fall back to normal setting
+                       if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
+                               this.value = val;
+                       }
+               });
+       }
+});
+
+jQuery.extend({
+       valHooks: {
+               option: {
+                       get: function( elem ) {
+                               // attributes.value is undefined in Blackberry 4.7 but
+                               // uses .value. See #6932
+                               var val = elem.attributes.value;
+                               return !val || val.specified ? elem.value : elem.text;
+                       }
+               },
+               select: {
+                       get: function( elem ) {
+                               var value, i, max, option,
+                                       index = elem.selectedIndex,
+                                       values = [],
+                                       options = elem.options,
+                                       one = elem.type === "select-one";
+
+                               // Nothing was selected
+                               if ( index < 0 ) {
+                                       return null;
+                               }
+
+                               // Loop through all the selected options
+                               i = one ? index : 0;
+                               max = one ? index + 1 : options.length;
+                               for ( ; i < max; i++ ) {
+                                       option = options[ i ];
+
+                                       // Don't return options that are disabled or in a disabled optgroup
+                                       if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
+                                                       (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
+
+                                               // Get the specific value for the option
+                                               value = jQuery( option ).val();
+
+                                               // We don't need an array for one selects
+                                               if ( one ) {
+                                                       return value;
+                                               }
+
+                                               // Multi-Selects return an array
+                                               values.push( value );
+                                       }
+                               }
+
+                               // Fixes Bug #2551 -- select.val() broken in IE after form.reset()
+                               if ( one && !values.length && options.length ) {
+                                       return jQuery( options[ index ] ).val();
+                               }
+
+                               return values;
+                       },
+
+                       set: function( elem, value ) {
+                               var values = jQuery.makeArray( value );
+
+                               jQuery(elem).find("option").each(function() {
+                                       this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
+                               });
+
+                               if ( !values.length ) {
+                                       elem.selectedIndex = -1;
+                               }
+                               return values;
+                       }
+               }
+       },
+
+       attrFn: {
+               val: true,
+               css: true,
+               html: true,
+               text: true,
+               data: true,
+               width: true,
+               height: true,
+               offset: true
+       },
+
+       attr: function( elem, name, value, pass ) {
+               var ret, hooks, notxml,
+                       nType = elem.nodeType;
+
+               // don't get/set attributes on text, comment and attribute nodes
+               if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+                       return undefined;
+               }
+
+               if ( pass && name in jQuery.attrFn ) {
+                       return jQuery( elem )[ name ]( value );
+               }
+
+               // Fallback to prop when attributes are not supported
+               if ( !("getAttribute" in elem) ) {
+                       return jQuery.prop( elem, name, value );
+               }
+
+               notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+               // All attributes are lowercase
+               // Grab necessary hook if one is defined
+               if ( notxml ) {
+                       name = name.toLowerCase();
+                       hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
+               }
+
+               if ( value !== undefined ) {
+
+                       if ( value === null ) {
+                               jQuery.removeAttr( elem, name );
+                               return undefined;
+
+                       } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
+                               return ret;
+
+                       } else {
+                               elem.setAttribute( name, "" + value );
+                               return value;
+                       }
+
+               } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {
+                       return ret;
+
+               } else {
+
+                       ret = elem.getAttribute( name );
+
+                       // Non-existent attributes return null, we normalize to undefined
+                       return ret === null ?
+                               undefined :
+                               ret;
+               }
+       },
+
+       removeAttr: function( elem, value ) {
+               var propName, attrNames, name, l,
+                       i = 0;
+
+               if ( elem.nodeType === 1 ) {
+                       attrNames = ( value || "" ).split( rspace );
+                       l = attrNames.length;
+
+                       for ( ; i < l; i++ ) {
+                               name = attrNames[ i ].toLowerCase();
+                               propName = jQuery.propFix[ name ] || name;
+
+                               // See #9699 for explanation of this approach (setting first, then removal)
+                               jQuery.attr( elem, name, "" );
+                               elem.removeAttribute( getSetAttribute ? name : propName );
+
+                               // Set corresponding property to false for boolean attributes
+                               if ( rboolean.test( name ) && propName in elem ) {
+                                       elem[ propName ] = false;
+                               }
+                       }
+               }
+       },
+
+       attrHooks: {
+               type: {
+                       set: function( elem, value ) {
+                               // We can't allow the type property to be changed (since it causes problems in IE)
+                               if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
+                                       jQuery.error( "type property can't be changed" );
+                               } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
+                                       // Setting the type on a radio button after the value resets the value in IE6-9
+                                       // Reset value to it's default in case type is set after value
+                                       // This is for element creation
+                                       var val = elem.value;
+                                       elem.setAttribute( "type", value );
+                                       if ( val ) {
+                                               elem.value = val;
+                                       }
+                                       return value;
+                               }
+                       }
+               },
+               // Use the value property for back compat
+               // Use the nodeHook for button elements in IE6/7 (#1954)
+               value: {
+                       get: function( elem, name ) {
+                               if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
+                                       return nodeHook.get( elem, name );
+                               }
+                               return name in elem ?
+                                       elem.value :
+                                       null;
+                       },
+                       set: function( elem, value, name ) {
+                               if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
+                                       return nodeHook.set( elem, value, name );
+                               }
+                               // Does not return so that setAttribute is also used
+                               elem.value = value;
+                       }
+               }
+       },
+
+       propFix: {
+               tabindex: "tabIndex",
+               readonly: "readOnly",
+               "for": "htmlFor",
+               "class": "className",
+               maxlength: "maxLength",
+               cellspacing: "cellSpacing",
+               cellpadding: "cellPadding",
+               rowspan: "rowSpan",
+               colspan: "colSpan",
+               usemap: "useMap",
+               frameborder: "frameBorder",
+               contenteditable: "contentEditable"
+       },
+
+       prop: function( elem, name, value ) {
+               var ret, hooks, notxml,
+                       nType = elem.nodeType;
+
+               // don't get/set properties on text, comment and attribute nodes
+               if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+                       return undefined;
+               }
+
+               notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+               if ( notxml ) {
+                       // Fix name and attach hooks
+                       name = jQuery.propFix[ name ] || name;
+                       hooks = jQuery.propHooks[ name ];
+               }
+
+               if ( value !== undefined ) {
+                       if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
+                               return ret;
+
+                       } else {
+                               return ( elem[ name ] = value );
+                       }
+
+               } else {
+                       if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
+                               return ret;
+
+                       } else {
+                               return elem[ name ];
+                       }
+               }
+       },
+
+       propHooks: {
+               tabIndex: {
+                       get: function( elem ) {
+                               // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
+                               // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
+                               var attributeNode = elem.getAttributeNode("tabindex");
+
+                               return attributeNode && attributeNode.specified ?
+                                       parseInt( attributeNode.value, 10 ) :
+                                       rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
+                                               0 :
+                                               undefined;
+                       }
+               }
+       }
+});
+
+// Add the tabIndex propHook to attrHooks for back-compat (different case is intentional)
+jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex;
+
+// Hook for boolean attributes
+boolHook = {
+       get: function( elem, name ) {
+               // Align boolean attributes with corresponding properties
+               // Fall back to attribute presence where some booleans are not supported
+               var attrNode,
+                       property = jQuery.prop( elem, name );
+               return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
+                       name.toLowerCase() :
+                       undefined;
+       },
+       set: function( elem, value, name ) {
+               var propName;
+               if ( value === false ) {
+                       // Remove boolean attributes when set to false
+                       jQuery.removeAttr( elem, name );
+               } else {
+                       // value is true since we know at this point it's type boolean and not false
+                       // Set boolean attributes to the same name and set the DOM property
+                       propName = jQuery.propFix[ name ] || name;
+                       if ( propName in elem ) {
+                               // Only set the IDL specifically if it already exists on the element
+                               elem[ propName ] = true;
+                       }
+
+                       elem.setAttribute( name, name.toLowerCase() );
+               }
+               return name;
+       }
+};
+
+// IE6/7 do not support getting/setting some attributes with get/setAttribute
+if ( !getSetAttribute ) {
+
+       fixSpecified = {
+               name: true,
+               id: true
+       };
+
+       // Use this for any attribute in IE6/7
+       // This fixes almost every IE6/7 issue
+       nodeHook = jQuery.valHooks.button = {
+               get: function( elem, name ) {
+                       var ret;
+                       ret = elem.getAttributeNode( name );
+                       return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ?
+                               ret.nodeValue :
+                               undefined;
+               },
+               set: function( elem, value, name ) {
+                       // Set the existing or create a new attribute node
+                       var ret = elem.getAttributeNode( name );
+                       if ( !ret ) {
+                               ret = document.createAttribute( name );
+                               elem.setAttributeNode( ret );
+                       }
+                       return ( ret.nodeValue = value + "" );
+               }
+       };
+
+       // Apply the nodeHook to tabindex
+       jQuery.attrHooks.tabindex.set = nodeHook.set;
+
+       // Set width and height to auto instead of 0 on empty string( Bug #8150 )
+       // This is for removals
+       jQuery.each([ "width", "height" ], function( i, name ) {
+               jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+                       set: function( elem, value ) {
+                               if ( value === "" ) {
+                                       elem.setAttribute( name, "auto" );
+                                       return value;
+                               }
+                       }
+               });
+       });
+
+       // Set contenteditable to false on removals(#10429)
+       // Setting to empty string throws an error as an invalid value
+       jQuery.attrHooks.contenteditable = {
+               get: nodeHook.get,
+               set: function( elem, value, name ) {
+                       if ( value === "" ) {
+                               value = "false";
+                       }
+                       nodeHook.set( elem, value, name );
+               }
+       };
+}
+
+
+// Some attributes require a special call on IE
+if ( !jQuery.support.hrefNormalized ) {
+       jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
+               jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+                       get: function( elem ) {
+                               var ret = elem.getAttribute( name, 2 );
+                               return ret === null ? undefined : ret;
+                       }
+               });
+       });
+}
+
+if ( !jQuery.support.style ) {
+       jQuery.attrHooks.style = {
+               get: function( elem ) {
+                       // Return undefined in the case of empty string
+                       // Normalize to lowercase since IE uppercases css property names
+                       return elem.style.cssText.toLowerCase() || undefined;
+               },
+               set: function( elem, value ) {
+                       return ( elem.style.cssText = "" + value );
+               }
+       };
+}
+
+// Safari mis-reports the default selected property of an option
+// Accessing the parent's selectedIndex property fixes it
+if ( !jQuery.support.optSelected ) {
+       jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
+               get: function( elem ) {
+                       var parent = elem.parentNode;
+
+                       if ( parent ) {
+                               parent.selectedIndex;
+
+                               // Make sure that it also works with optgroups, see #5701
+                               if ( parent.parentNode ) {
+                                       parent.parentNode.selectedIndex;
+                               }
+                       }
+                       return null;
+               }
+       });
+}
+
+// IE6/7 call enctype encoding
+if ( !jQuery.support.enctype ) {
+       jQuery.propFix.enctype = "encoding";
+}
+
+// Radios and checkboxes getter/setter
+if ( !jQuery.support.checkOn ) {
+       jQuery.each([ "radio", "checkbox" ], function() {
+               jQuery.valHooks[ this ] = {
+                       get: function( elem ) {
+                               // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
+                               return elem.getAttribute("value") === null ? "on" : elem.value;
+                       }
+               };
+       });
+}
+jQuery.each([ "radio", "checkbox" ], function() {
+       jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
+               set: function( elem, value ) {
+                       if ( jQuery.isArray( value ) ) {
+                               return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
+                       }
+               }
+       });
+});
+
+
+
+
+var rnamespaces = /\.(.*)$/,
+       rformElems = /^(?:textarea|input|select)$/i,
+       rperiod = /\./g,
+       rspaces = / /g,
+       rescape = /[^\w\s.|`]/g,
+       rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/,
+       rhoverHack = /\bhover(\.\S+)?/,
+       rkeyEvent = /^key/,
+       rmouseEvent = /^(?:mouse|contextmenu)|click/,
+       rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,
+       quickParse = function( selector ) {
+               var quick = rquickIs.exec( selector );
+               if ( quick ) {
+                       //   0  1    2   3
+                       // [ _, tag, id, class ]
+                       quick[1] = ( quick[1] || "" ).toLowerCase();
+                       quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" );
+               }
+               return quick;
+       },
+       quickIs = function( elem, m ) {
+               return (
+                       (!m[1] || elem.nodeName.toLowerCase() === m[1]) &&
+                       (!m[2] || elem.id === m[2]) &&
+                       (!m[3] || m[3].test( elem.className ))
+               );
+       },
+       hoverHack = function( events ) {
+               return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
+       };
+
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
+
+       add: function( elem, types, handler, data, selector ) {
+
+               var elemData, eventHandle, events,
+                       t, tns, type, namespaces, handleObj,
+                       handleObjIn, quick, handlers, special;
+
+               // Don't attach events to noData or text/comment nodes (allow plain objects tho)
+               if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {
+                       return;
+               }
+
+               // Caller can pass in an object of custom data in lieu of the handler
+               if ( handler.handler ) {
+                       handleObjIn = handler;
+                       handler = handleObjIn.handler;
+               }
+
+               // Make sure that the handler has a unique ID, used to find/remove it later
+               if ( !handler.guid ) {
+                       handler.guid = jQuery.guid++;
+               }
+
+               // Init the element's event structure and main handler, if this is the first
+               events = elemData.events;
+               if ( !events ) {
+                       elemData.events = events = {};
+               }
+               eventHandle = elemData.handle;
+               if ( !eventHandle ) {
+                       elemData.handle = eventHandle = function( e ) {
+                               // Discard the second event of a jQuery.event.trigger() and
+                               // when an event is called after a page has unloaded
+                               return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
+                                       jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
+                                       undefined;
+                       };
+                       // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
+                       eventHandle.elem = elem;
+               }
+
+               // Handle multiple events separated by a space
+               // jQuery(...).bind("mouseover mouseout", fn);
+               types = hoverHack(types).split( " " );
+               for ( t = 0; t < types.length; t++ ) {
+
+                       tns = rtypenamespace.exec( types[t] ) || [];
+                       type = tns[1];
+                       namespaces = ( tns[2] || "" ).split( "." ).sort();
+
+                       // If event changes its type, use the special event handlers for the changed type
+                       special = jQuery.event.special[ type ] || {};
+
+                       // If selector defined, determine special event api type, otherwise given type
+                       type = ( selector ? special.delegateType : special.bindType ) || type;
+
+                       // Update special based on newly reset type
+                       special = jQuery.event.special[ type ] || {};
+
+                       // handleObj is passed to all event handlers
+                       handleObj = jQuery.extend({
+                               type: type,
+                               origType: tns[1],
+                               data: data,
+                               handler: handler,
+                               guid: handler.guid,
+                               selector: selector,
+                               namespace: namespaces.join(".")
+                       }, handleObjIn );
+
+                       // Delegated event; pre-analyze selector so it's processed quickly on event dispatch
+                       if ( selector ) {
+                               handleObj.quick = quickParse( selector );
+                               if ( !handleObj.quick && jQuery.expr.match.POS.test( selector ) ) {
+                                       handleObj.isPositional = true;
+                               }
+                       }
+
+                       // Init the event handler queue if we're the first
+                       handlers = events[ type ];
+                       if ( !handlers ) {
+                               handlers = events[ type ] = [];
+                               handlers.delegateCount = 0;
+
+                               // Only use addEventListener/attachEvent if the special events handler returns false
+                               if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+                                       // Bind the global event handler to the element
+                                       if ( elem.addEventListener ) {
+                                               elem.addEventListener( type, eventHandle, false );
+
+                                       } else if ( elem.attachEvent ) {
+                                               elem.attachEvent( "on" + type, eventHandle );
+                                       }
+                               }
+                       }
+
+                       if ( special.add ) {
+                               special.add.call( elem, handleObj );
+
+                               if ( !handleObj.handler.guid ) {
+                                       handleObj.handler.guid = handler.guid;
+                               }
+                       }
+
+                       // Add to the element's handler list, delegates in front
+                       if ( selector ) {
+                               handlers.splice( handlers.delegateCount++, 0, handleObj );
+                       } else {
+                               handlers.push( handleObj );
+                       }
+
+                       // Keep track of which events have ever been used, for event optimization
+                       jQuery.event.global[ type ] = true;
+               }
+
+               // Nullify elem to prevent memory leaks in IE
+               elem = null;
+       },
+
+       global: {},
+
+       // Detach an event or set of events from an element
+       remove: function( elem, types, handler, selector ) {
+
+               var elemData = jQuery.hasData( elem ) && jQuery._data( elem ),
+                       t, tns, type, namespaces, origCount,
+                       j, events, special, handle, eventType, handleObj;
+
+               if ( !elemData || !(events = elemData.events) ) {
+                       return;
+               }
+
+               // Once for each type.namespace in types; type may be omitted
+               types = hoverHack( types || "" ).split(" ");
+               for ( t = 0; t < types.length; t++ ) {
+                       tns = rtypenamespace.exec( types[t] ) || [];
+                       type = tns[1];
+                       namespaces = tns[2];
+
+                       // Unbind all events (on this namespace, if provided) for the element
+                       if ( !type ) {
+                               namespaces = namespaces? "." + namespaces : "";
+                               for ( j in events ) {
+                                       jQuery.event.remove( elem, j + namespaces, handler, selector );
+                               }
+                               return;
+                       }
+
+                       special = jQuery.event.special[ type ] || {};
+                       type = ( selector? special.delegateType : special.bindType ) || type;
+                       eventType = events[ type ] || [];
+                       origCount = eventType.length;
+                       namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
+
+                       // Only need to loop for special events or selective removal
+                       if ( handler || namespaces || selector || special.remove ) {
+                               for ( j = 0; j < eventType.length; j++ ) {
+                                       handleObj = eventType[ j ];
+
+                                       if ( !handler || handler.guid === handleObj.guid ) {
+                                               if ( !namespaces || namespaces.test( handleObj.namespace ) ) {
+                                                       if ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) {
+                                                               eventType.splice( j--, 1 );
+
+                                                               if ( handleObj.selector ) {
+                                                                       eventType.delegateCount--;
+                                                               }
+                                                               if ( special.remove ) {
+                                                                       special.remove.call( elem, handleObj );
+                                                               }
+                                                       }
+                                               }
+                                       }
+                               }
+                       } else {
+                               // Removing all events
+                               eventType.length = 0;
+                       }
+
+                       // Remove generic event handler if we removed something and no more handlers exist
+                       // (avoids potential for endless recursion during removal of special event handlers)
+                       if ( eventType.length === 0 && origCount !== eventType.length ) {
+                               if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
+                                       jQuery.removeEvent( elem, type, elemData.handle );
+                               }
+
+                               delete events[ type ];
+                       }
+               }
+
+               // Remove the expando if it's no longer used
+               if ( jQuery.isEmptyObject( events ) ) {
+                       handle = elemData.handle;
+                       if ( handle ) {
+                               handle.elem = null;
+                       }
+
+                       // removeData also checks for emptiness and clears the expando if empty
+                       // so use it instead of delete
+                       jQuery.removeData( elem, [ "events", "handle" ], true );
+               }
+       },
+
+       // Events that are safe to short-circuit if no handlers are attached.
+       // Native DOM events should not be added, they may have inline handlers.
+       customEvent: {
+               "getData": true,
+               "setData": true,
+               "changeData": true
+       },
+
+       trigger: function( event, data, elem, onlyHandlers ) {
+               // Don't do events on text and comment nodes
+               if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {
+                       return;
+               }
+
+               // Event object or event type
+               var type = event.type || event,
+                       namespaces = [],
+                       cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType;
+
+               if ( type.indexOf( "!" ) >= 0 ) {
+                       // Exclusive events trigger only for the exact event (no namespaces)
+                       type = type.slice(0, -1);
+                       exclusive = true;
+               }
+
+               if ( type.indexOf( "." ) >= 0 ) {
+                       // Namespaced trigger; create a regexp to match event type in handle()
+                       namespaces = type.split(".");
+                       type = namespaces.shift();
+                       namespaces.sort();
+               }
+
+               if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
+                       // No jQuery handlers for this event type, and it can't have inline handlers
+                       return;
+               }
+
+               // Caller can pass in an Event, Object, or just an event type string
+               event = typeof event === "object" ?
+                       // jQuery.Event object
+                       event[ jQuery.expando ] ? event :
+                       // Object literal
+                       new jQuery.Event( type, event ) :
+                       // Just the event type (string)
+                       new jQuery.Event( type );
+
+               event.type = type;
+               event.isTrigger = true;
+               event.exclusive = exclusive;
+               event.namespace = namespaces.join( "." );
+               event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
+               ontype = type.indexOf( ":" ) < 0 ? "on" + type : "";
+
+               // triggerHandler() and global events don't bubble or run the default action
+               if ( onlyHandlers || !elem ) {
+                       event.preventDefault();
+               }
+
+               // Handle a global trigger
+               if ( !elem ) {
+
+                       // TODO: Stop taunting the data cache; remove global events and always attach to document
+                       cache = jQuery.cache;
+                       for ( i in cache ) {
+                               if ( cache[ i ].events && cache[ i ].events[ type ] ) {
+                                       jQuery.event.trigger( event, data, cache[ i ].handle.elem, true );
+                               }
+                       }
+                       return;
+               }
+
+               // Clean up the event in case it is being reused
+               event.result = undefined;
+               if ( !event.target ) {
+                       event.target = elem;
+               }
+
+               // Clone any incoming data and prepend the event, creating the handler arg list
+               data = data != null ? jQuery.makeArray( data ) : [];
+               data.unshift( event );
+
+               // Allow special events to draw outside the lines
+               special = jQuery.event.special[ type ] || {};
+               if ( special.trigger && special.trigger.apply( elem, data ) === false ) {
+                       return;
+               }
+
+               // Determine event propagation path in advance, per W3C events spec (#9951)
+               // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
+               eventPath = [[ elem, special.bindType || type ]];
+               if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
+
+                       bubbleType = special.delegateType || type;
+                       old = null;
+                       for ( cur = elem.parentNode; cur; cur = cur.parentNode ) {
+                               eventPath.push([ cur, bubbleType ]);
+                               old = cur;
+                       }
+
+                       // Only add window if we got to document (e.g., not plain obj or detached DOM)
+                       if ( old && old === elem.ownerDocument ) {
+                               eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);
+                       }
+               }
+
+               // Fire handlers on the event path
+               for ( i = 0; i < eventPath.length; i++ ) {
+
+                       cur = eventPath[i][0];
+                       event.type = eventPath[i][1];
+
+                       handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
+                       if ( handle ) {
+                               handle.apply( cur, data );
+                       }
+                       handle = ontype && cur[ ontype ];
+                       if ( handle && jQuery.acceptData( cur ) ) {
+                               handle.apply( cur, data );
+                       }
+
+                       if ( event.isPropagationStopped() ) {
+                               break;
+                       }
+               }
+               event.type = type;
+
+               // If nobody prevented the default action, do it now
+               if ( !event.isDefaultPrevented() ) {
+
+                       if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
+                               !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
+
+                               // Call a native DOM method on the target with the same name name as the event.
+                               // Can't use an .isFunction() check here because IE6/7 fails that test.
+                               // Don't do default actions on window, that's where global variables be (#6170)
+                               // IE<9 dies on focus/blur to hidden element (#1486)
+                               if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {
+
+                                       // Don't re-trigger an onFOO event when we call its FOO() method
+                                       old = elem[ ontype ];
+
+                                       if ( old ) {
+                                               elem[ ontype ] = null;
+                                       }
+
+                                       // Prevent re-triggering of the same event, since we already bubbled it above
+                                       jQuery.event.triggered = type;
+                                       elem[ type ]();
+                                       jQuery.event.triggered = undefined;
+
+                                       if ( old ) {
+                                               elem[ ontype ] = old;
+                                       }
+                               }
+                       }
+               }
+
+               return event.result;
+       },
+
+       dispatch: function( event ) {
+
+               // Make a writable jQuery.Event from the native event object
+               event = jQuery.event.fix( event || window.event );
+
+               var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []),
+                       delegateCount = handlers.delegateCount,
+                       args = [].slice.call( arguments, 0 ),
+                       run_all = !event.exclusive && !event.namespace,
+                       specialHandle = ( jQuery.event.special[ event.type ] || {} ).handle,
+                       handlerQueue = [],
+                       i, j, cur, ret, selMatch, matched, matches, handleObj, sel, hit, related;
+
+               // Use the fix-ed jQuery.Event rather than the (read-only) native event
+               args[0] = event;
+               event.delegateTarget = this;
+
+               // Determine handlers that should run if there are delegated events
+               // Avoid disabled elements in IE (#6911) and non-left-click bubbling in Firefox (#3861)
+               if ( delegateCount && !event.target.disabled && !(event.button && event.type === "click") ) {
+
+                       for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {
+                               selMatch = {};
+                               matches = [];
+                               for ( i = 0; i < delegateCount; i++ ) {
+                                       handleObj = handlers[ i ];
+                                       sel = handleObj.selector;
+                                       hit = selMatch[ sel ];
+
+                                       if ( handleObj.isPositional ) {
+                                               // Since .is() does not work for positionals; see http://jsfiddle.net/eJ4yd/3/
+                                               hit = ( hit || (selMatch[ sel ] = jQuery( sel )) ).index( cur ) >= 0;
+                                       } else if ( hit === undefined ) {
+                                               hit = selMatch[ sel ] = ( handleObj.quick ? quickIs( cur, handleObj.quick ) : jQuery( cur ).is( sel ) );
+                                       }
+                                       if ( hit ) {
+                                               matches.push( handleObj );
+                                       }
+                               }
+                               if ( matches.length ) {
+                                       handlerQueue.push({ elem: cur, matches: matches });
+                               }
+                       }
+               }
+
+               // Add the remaining (directly-bound) handlers
+               if ( handlers.length > delegateCount ) {
+                       handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });
+               }
+
+               // Run delegates first; they may want to stop propagation beneath us
+               for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {
+                       matched = handlerQueue[ i ];
+                       event.currentTarget = matched.elem;
+
+                       for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {
+                               handleObj = matched.matches[ j ];
+
+                               // Triggered event must either 1) be non-exclusive and have no namespace, or
+                               // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
+                               if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {
+
+                                       event.data = handleObj.data;
+                                       event.handleObj = handleObj;
+
+                                       ret = ( specialHandle || handleObj.handler ).apply( matched.elem, args );
+
+                                       if ( ret !== undefined ) {
+                                               event.result = ret;
+                                               if ( ret === false ) {
+                                                       event.preventDefault();
+                                                       event.stopPropagation();
+                                               }
+                                       }
+                               }
+                       }
+               }
+
+               return event.result;
+       },
+
+       // Includes some event props shared by KeyEvent and MouseEvent
+       // *** attrChange attrName relatedNode srcElement  are not normalized, non-W3C, deprecated, will be removed in 1.8 ***
+       props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
+
+       fixHooks: {},
+
+       keyHooks: {
+               props: "char charCode key keyCode".split(" "),
+               filter: function( event, original ) {
+
+                       // Add which for key events
+                       if ( event.which == null ) {
+                               event.which = original.charCode != null ? original.charCode : original.keyCode;
+                       }
+
+                       return event;
+               }
+       },
+
+       mouseHooks: {
+               props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement wheelDelta".split(" "),
+               filter: function( event, original ) {
+                       var eventDoc, doc, body,
+                               button = original.button,
+                               fromElement = original.fromElement;
+
+                       // Calculate pageX/Y if missing and clientX/Y available
+                       if ( event.pageX == null && original.clientX != null ) {
+                               eventDoc = event.target.ownerDocument || document;
+                               doc = eventDoc.documentElement;
+                               body = eventDoc.body;
+
+                               event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
+                               event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );
+                       }
+
+                       // Add relatedTarget, if necessary
+                       if ( !event.relatedTarget && fromElement ) {
+                               event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
+                       }
+
+                       // Add which for click: 1 === left; 2 === middle; 3 === right
+                       // Note: button is not normalized, so don't use it
+                       if ( !event.which && button !== undefined ) {
+                               event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
+                       }
+
+                       return event;
+               }
+       },
+
+       fix: function( event ) {
+               if ( event[ jQuery.expando ] ) {
+                       return event;
+               }
+
+               // Create a writable copy of the event object and normalize some properties
+               var i, prop,
+                       originalEvent = event,
+                       fixHook = jQuery.event.fixHooks[ event.type ] || {},
+                       copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
+
+               event = jQuery.Event( originalEvent );
+
+               for ( i = copy.length; i; ) {
+                       prop = copy[ --i ];
+                       event[ prop ] = originalEvent[ prop ];
+               }
+
+               // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)
+               if ( !event.target ) {
+                       event.target = originalEvent.srcElement || document;
+               }
+
+               // Target should not be a text node (#504, Safari)
+               if ( event.target.nodeType === 3 ) {
+                       event.target = event.target.parentNode;
+               }
+
+               // For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8)
+               if ( event.metaKey === undefined ) {
+                       event.metaKey = event.ctrlKey;
+               }
+
+               return fixHook.filter? fixHook.filter( event, originalEvent ) : event;
+       },
+
+       special: {
+               ready: {
+                       // Make sure the ready event is setup
+                       setup: jQuery.bindReady
+               },
+
+               focus: {
+                       delegateType: "focusin",
+                       noBubble: true
+               },
+               blur: {
+                       delegateType: "focusout",
+                       noBubble: true
+               },
+
+               beforeunload: {
+                       setup: function( data, namespaces, eventHandle ) {
+                               // We only want to do this special case on windows
+                               if ( jQuery.isWindow( this ) ) {
+                                       this.onbeforeunload = eventHandle;
+                               }
+                       },
+
+                       teardown: function( namespaces, eventHandle ) {
+                               if ( this.onbeforeunload === eventHandle ) {
+                                       this.onbeforeunload = null;
+                               }
+                       }
+               }
+       },
+
+       simulate: function( type, elem, event, bubble ) {
+               // Piggyback on a donor event to simulate a different one.
+               // Fake originalEvent to avoid donor's stopPropagation, but if the
+               // simulated event prevents default then we do the same on the donor.
+               var e = jQuery.extend(
+                       new jQuery.Event(),
+                       event,
+                       { type: type,
+                               isSimulated: true,
+                               originalEvent: {}
+                       }
+               );
+               if ( bubble ) {
+                       jQuery.event.trigger( e, null, elem );
+               } else {
+                       jQuery.event.dispatch.call( elem, e );
+               }
+               if ( e.isDefaultPrevented() ) {
+                       event.preventDefault();
+               }
+       }
+};
+
+// Some plugins are using, but it's undocumented/deprecated and will be removed.
+// The 1.7 special event interface should provide all the hooks needed now.
+jQuery.event.handle = jQuery.event.dispatch;
+
+jQuery.removeEvent = document.removeEventListener ?
+       function( elem, type, handle ) {
+               if ( elem.removeEventListener ) {
+                       elem.removeEventListener( type, handle, false );
+               }
+       } :
+       function( elem, type, handle ) {
+               if ( elem.detachEvent ) {
+                       elem.detachEvent( "on" + type, handle );
+               }
+       };
+
+jQuery.Event = function( src, props ) {
+       // Allow instantiation without the 'new' keyword
+       if ( !(this instanceof jQuery.Event) ) {
+               return new jQuery.Event( src, props );
+       }
+
+       // Event object
+       if ( src && src.type ) {
+               this.originalEvent = src;
+               this.type = src.type;
+
+               // Events bubbling up the document may have been marked as prevented
+               // by a handler lower down the tree; reflect the correct value.
+               this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
+                       src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
+
+       // Event type
+       } else {
+               this.type = src;
+       }
+
+       // Put explicitly provided properties onto the event object
+       if ( props ) {
+               jQuery.extend( this, props );
+       }
+
+       // Create a timestamp if incoming event doesn't have one
+       this.timeStamp = src && src.timeStamp || jQuery.now();
+
+       // Mark it as fixed
+       this[ jQuery.expando ] = true;
+};
+
+function returnFalse() {
+       return false;
+}
+function returnTrue() {
+       return true;
+}
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+       preventDefault: function() {
+               this.isDefaultPrevented = returnTrue;
+
+               var e = this.originalEvent;
+               if ( !e ) {
+                       return;
+               }
+
+               // if preventDefault exists run it on the original event
+               if ( e.preventDefault ) {
+                       e.preventDefault();
+
+               // otherwise set the returnValue property of the original event to false (IE)
+               } else {
+                       e.returnValue = false;
+               }
+       },
+       stopPropagation: function() {
+               this.isPropagationStopped = returnTrue;
+
+               var e = this.originalEvent;
+               if ( !e ) {
+                       return;
+               }
+               // if stopPropagation exists run it on the original event
+               if ( e.stopPropagation ) {
+                       e.stopPropagation();
+               }
+               // otherwise set the cancelBubble property of the original event to true (IE)
+               e.cancelBubble = true;
+       },
+       stopImmediatePropagation: function() {
+               this.isImmediatePropagationStopped = returnTrue;
+               this.stopPropagation();
+       },
+       isDefaultPrevented: returnFalse,
+       isPropagationStopped: returnFalse,
+       isImmediatePropagationStopped: returnFalse
+};
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+jQuery.each({
+       mouseenter: "mouseover",
+       mouseleave: "mouseout"
+}, function( orig, fix ) {
+       jQuery.event.special[ orig ] = jQuery.event.special[ fix ] = {
+               delegateType: fix,
+               bindType: fix,
+
+               handle: function( event ) {
+                       var target = this,
+                               related = event.relatedTarget,
+                               handleObj = event.handleObj,
+                               selector = handleObj.selector,
+                               oldType, ret;
+
+                       // For a real mouseover/out, always call the handler; for
+                       // mousenter/leave call the handler if related is outside the target.
+                       // NB: No relatedTarget if the mouse left/entered the browser window
+                       if ( !related || handleObj.origType === event.type || (related !== target && !jQuery.contains( target, related )) ) {
+                               oldType = event.type;
+                               event.type = handleObj.origType;
+                               ret = handleObj.handler.apply( this, arguments );
+                               event.type = oldType;
+                       }
+                       return ret;
+               }
+       };
+});
+
+// IE submit delegation
+if ( !jQuery.support.submitBubbles ) {
+
+       jQuery.event.special.submit = {
+               setup: function() {
+                       // Only need this for delegated form submit events
+                       if ( jQuery.nodeName( this, "form" ) ) {
+                               return false;
+                       }
+
+                       // Lazy-add a submit handler when a descendant form may potentially be submitted
+                       jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
+                               // Node name check avoids a VML-related crash in IE (#9807)
+                               var elem = e.target,
+                                       form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
+                               if ( form && !form._submit_attached ) {
+                                       jQuery.event.add( form, "submit._submit", function( event ) {
+                                               // Form was submitted, bubble the event up the tree
+                                               if ( this.parentNode ) {
+                                                       jQuery.event.simulate( "submit", this.parentNode, event, true );
+                                               }
+                                       });
+                                       form._submit_attached = true;
+                               }
+                       });
+                       // return undefined since we don't need an event listener
+               },
+
+               teardown: function() {
+                       // Only need this for delegated form submit events
+                       if ( jQuery.nodeName( this, "form" ) ) {
+                               return false;
+                       }
+
+                       // Remove delegated handlers; cleanData eventually reaps submit handlers attached above
+                       jQuery.event.remove( this, "._submit" );
+               }
+       };
+}
+
+// IE change delegation and checkbox/radio fix
+if ( !jQuery.support.changeBubbles ) {
+
+       jQuery.event.special.change = {
+
+               setup: function() {
+
+                       if ( rformElems.test( this.nodeName ) ) {
+                               // IE doesn't fire change on a check/radio until blur; trigger it on click
+                               // after a propertychange. Eat the blur-change in special.change.handle.
+                               // This still fires onchange a second time for check/radio after blur.
+                               if ( this.type === "checkbox" || this.type === "radio" ) {
+                                       jQuery.event.add( this, "propertychange._change", function( event ) {
+                                               if ( event.originalEvent.propertyName === "checked" ) {
+                                                       this._just_changed = true;
+                                               }
+                                       });
+                                       jQuery.event.add( this, "click._change", function( event ) {
+                                               if ( this._just_changed ) {
+                                                       this._just_changed = false;
+                                                       jQuery.event.simulate( "change", this, event, true );
+                                               }
+                                       });
+                               }
+                               return false;
+                       }
+                       // Delegated event; lazy-add a change handler on descendant inputs
+                       jQuery.event.add( this, "beforeactivate._change", function( e ) {
+                               var elem = e.target;
+
+                               if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) {
+                                       jQuery.event.add( elem, "change._change", function( event ) {
+                                               if ( this.parentNode && !event.isSimulated ) {
+                                                       jQuery.event.simulate( "change", this.parentNode, event, true );
+                                               }
+                                       });
+                                       elem._change_attached = true;
+                               }
+                       });
+               },
+
+               handle: function( event ) {
+                       var elem = event.target;
+
+                       // Swallow native change events from checkbox/radio, we already triggered them above
+                       if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
+                               return event.handleObj.handler.apply( this, arguments );
+                       }
+               },
+
+               teardown: function() {
+                       jQuery.event.remove( this, "._change" );
+
+                       return rformElems.test( this.nodeName );
+               }
+       };
+}
+
+// Create "bubbling" focus and blur events
+if ( !jQuery.support.focusinBubbles ) {
+       jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+
+               // Attach a single capturing handler while someone wants focusin/focusout
+               var attaches = 0,
+                       handler = function( event ) {
+                               jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
+                       };
+
+               jQuery.event.special[ fix ] = {
+                       setup: function() {
+                               if ( attaches++ === 0 ) {
+                                       document.addEventListener( orig, handler, true );
+                               }
+                       },
+                       teardown: function() {
+                               if ( --attaches === 0 ) {
+                                       document.removeEventListener( orig, handler, true );
+                               }
+                       }
+               };
+       });
+}
+
+jQuery.fn.extend({
+
+       on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
+               var origFn, type;
+
+               // Types can be a map of types/handlers
+               if ( typeof types === "object" ) {
+                       // ( types-Object, selector, data )
+                       if ( typeof selector !== "string" ) {
+                               // ( types-Object, data )
+                               data = selector;
+                               selector = undefined;
+                       }
+                       for ( type in types ) {
+                               this.on( type, selector, data, types[ type ], one );
+                       }
+                       return this;
+               }
+
+               if ( data == null && fn == null ) {
+                       // ( types, fn )
+                       fn = selector;
+                       data = selector = undefined;
+               } else if ( fn == null ) {
+                       if ( typeof selector === "string" ) {
+                               // ( types, selector, fn )
+                               fn = data;
+                               data = undefined;
+                       } else {
+                               // ( types, data, fn )
+                               fn = data;
+                               data = selector;
+                               selector = undefined;
+                       }
+               }
+               if ( fn === false ) {
+                       fn = returnFalse;
+               } else if ( !fn ) {
+                       return this;
+               }
+
+               if ( one === 1 ) {
+                       origFn = fn;
+                       fn = function( event ) {
+                               // Can use an empty set, since event contains the info
+                               jQuery().off( event );
+                               return origFn.apply( this, arguments );
+                       };
+                       // Use same guid so caller can remove using origFn
+                       fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
+               }
+               return this.each( function() {
+                       jQuery.event.add( this, types, fn, data, selector );
+               });
+       },
+       one: function( types, selector, data, fn ) {
+               return this.on.call( this, types, selector, data, fn, 1 );
+       },
+       off: function( types, selector, fn ) {
+               if ( types && types.preventDefault && types.handleObj ) {
+                       // ( event )  dispatched jQuery.Event
+                       var handleObj = types.handleObj;
+                       jQuery( types.delegateTarget ).off(
+                               handleObj.namespace? handleObj.type + "." + handleObj.namespace : handleObj.type,
+                               handleObj.selector,
+                               handleObj.handler
+                       );
+                       return this;
+               }
+               if ( typeof types === "object" ) {
+                       // ( types-object [, selector] )
+                       for ( var type in types ) {
+                               this.off( type, selector, types[ type ] );
+                       }
+                       return this;
+               }
+               if ( selector === false || typeof selector === "function" ) {
+                       // ( types [, fn] )
+                       fn = selector;
+                       selector = undefined;
+               }
+               if ( fn === false ) {
+                       fn = returnFalse;
+               }
+               return this.each(function() {
+                       jQuery.event.remove( this, types, fn, selector );
+               });
+       },
+
+       bind: function( types, data, fn ) {
+               return this.on( types, null, data, fn );
+       },
+       unbind: function( types, fn ) {
+               return this.off( types, null, fn );
+       },
+
+       live: function( types, data, fn ) {
+               jQuery( this.context ).on( types, this.selector, data, fn );
+               return this;
+       },
+       die: function( types, fn ) {
+               jQuery( this.context ).off( types, this.selector || "**", fn );
+               return this;
+       },
+
+       delegate: function( selector, types, data, fn ) {
+               return this.on( types, selector, data, fn );
+       },
+       undelegate: function( selector, types, fn ) {
+               // ( namespace ) or ( selector, types [, fn] )
+               return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector, fn );
+       },
+
+       trigger: function( type, data ) {
+               return this.each(function() {
+                       jQuery.event.trigger( type, data, this );
+               });
+       },
+       triggerHandler: function( type, data ) {
+               if ( this[0] ) {
+                       return jQuery.event.trigger( type, data, this[0], true );
+               }
+       },
+
+       toggle: function( fn ) {
+               // Save reference to arguments for access in closure
+               var args = arguments,
+                       guid = fn.guid || jQuery.guid++,
+                       i = 0,
+                       toggler = function( event ) {
+                               // Figure out which function to execute
+                               var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
+                               jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
+
+                               // Make sure that clicks stop
+                               event.preventDefault();
+
+                               // and execute the function
+                               return args[ lastToggle ].apply( this, arguments ) || false;
+                       };
+
+               // link all the functions, so any of them can unbind this click handler
+               toggler.guid = guid;
+               while ( i < args.length ) {
+                       args[ i++ ].guid = guid;
+               }
+
+               return this.click( toggler );
+       },
+
+       hover: function( fnOver, fnOut ) {
+               return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+       }
+});
+
+jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
+       "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
+       "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
+
+       // Handle event binding
+       jQuery.fn[ name ] = function( data, fn ) {
+               if ( fn == null ) {
+                       fn = data;
+                       data = null;
+               }
+
+               return arguments.length > 0 ?
+                       this.bind( name, data, fn ) :
+                       this.trigger( name );
+       };
+
+       if ( jQuery.attrFn ) {
+               jQuery.attrFn[ name ] = true;
+       }
+
+       if ( rkeyEvent.test( name ) ) {
+               jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;
+       }
+
+       if ( rmouseEvent.test( name ) ) {
+               jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;
+       }
+});
+
+
+
+/*!
+ * Sizzle CSS Selector Engine
+ *  Copyright 2011, The Dojo Foundation
+ *  Released under the MIT, BSD, and GPL Licenses.
+ *  More information: http://sizzlejs.com/
+ */
+(function(){
+
+var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
+       expando = "sizcache" + (Math.random() + '').replace('.', ''),
+       done = 0,
+       toString = Object.prototype.toString,
+       hasDuplicate = false,
+       baseHasDuplicate = true,
+       rBackslash = /\\/g,
+       rReturn = /\r\n/g,
+       rNonWord = /\W/;
+
+// Here we check if the JavaScript engine is using some sort of
+// optimization where it does not always call our comparision
+// function. If that is the case, discard the hasDuplicate value.
+//   Thus far that includes Google Chrome.
+[0, 0].sort(function() {
+       baseHasDuplicate = false;
+       return 0;
+});
+
+var Sizzle = function( selector, context, results, seed ) {
+       results = results || [];
+       context = context || document;
+
+       var origContext = context;
+
+       if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
+               return [];
+       }
+       
+       if ( !selector || typeof selector !== "string" ) {
+               return results;
+       }
+
+       var m, set, checkSet, extra, ret, cur, pop, i,
+               prune = true,
+               contextXML = Sizzle.isXML( context ),
+               parts = [],
+               soFar = selector;
+       
+       // Reset the position of the chunker regexp (start from head)
+       do {
+               chunker.exec( "" );
+               m = chunker.exec( soFar );
+
+               if ( m ) {
+                       soFar = m[3];
+               
+                       parts.push( m[1] );
+               
+                       if ( m[2] ) {
+                               extra = m[3];
+                               break;
+                       }
+               }
+       } while ( m );
+
+       if ( parts.length > 1 && origPOS.exec( selector ) ) {
+
+               if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
+                       set = posProcess( parts[0] + parts[1], context, seed );
+
+               } else {
+                       set = Expr.relative[ parts[0] ] ?
+                               [ context ] :
+                               Sizzle( parts.shift(), context );
+
+                       while ( parts.length ) {
+                               selector = parts.shift();
+
+                               if ( Expr.relative[ selector ] ) {
+                                       selector += parts.shift();
+                               }
+                               
+                               set = posProcess( selector, set, seed );
+                       }
+               }
+
+       } else {
+               // Take a shortcut and set the context if the root selector is an ID
+               // (but not if it'll be faster if the inner selector is an ID)
+               if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
+                               Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
+
+                       ret = Sizzle.find( parts.shift(), context, contextXML );
+                       context = ret.expr ?
+                               Sizzle.filter( ret.expr, ret.set )[0] :
+                               ret.set[0];
+               }
+
+               if ( context ) {
+                       ret = seed ?
+                               { expr: parts.pop(), set: makeArray(seed) } :
+                               Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
+
+                       set = ret.expr ?
+                               Sizzle.filter( ret.expr, ret.set ) :
+                               ret.set;
+
+                       if ( parts.length > 0 ) {
+                               checkSet = makeArray( set );
+
+                       } else {
+                               prune = false;
+                       }
+
+                       while ( parts.length ) {
+                               cur = parts.pop();
+                               pop = cur;
+
+                               if ( !Expr.relative[ cur ] ) {
+                                       cur = "";
+                               } else {
+                                       pop = parts.pop();
+                               }
+
+                               if ( pop == null ) {
+                                       pop = context;
+                               }
+
+                               Expr.relative[ cur ]( checkSet, pop, contextXML );
+                       }
+
+               } else {
+                       checkSet = parts = [];
+               }
+       }
+
+       if ( !checkSet ) {
+               checkSet = set;
+       }
+
+       if ( !checkSet ) {
+               Sizzle.error( cur || selector );
+       }
+
+       if ( toString.call(checkSet) === "[object Array]" ) {
+               if ( !prune ) {
+                       results.push.apply( results, checkSet );
+
+               } else if ( context && context.nodeType === 1 ) {
+                       for ( i = 0; checkSet[i] != null; i++ ) {
+                               if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {
+                                       results.push( set[i] );
+                               }
+                       }
+
+               } else {
+                       for ( i = 0; checkSet[i] != null; i++ ) {
+                               if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
+                                       results.push( set[i] );
+                               }
+                       }
+               }
+
+       } else {
+               makeArray( checkSet, results );
+       }
+
+       if ( extra ) {
+               Sizzle( extra, origContext, results, seed );
+               Sizzle.uniqueSort( results );
+       }
+
+       return results;
+};
+
+Sizzle.uniqueSort = function( results ) {
+       if ( sortOrder ) {
+               hasDuplicate = baseHasDuplicate;
+               results.sort( sortOrder );
+
+               if ( hasDuplicate ) {
+                       for ( var i = 1; i < results.length; i++ ) {
+                               if ( results[i] === results[ i - 1 ] ) {
+                                       results.splice( i--, 1 );
+                               }
+                       }
+               }
+       }
+
+       return results;
+};
+
+Sizzle.matches = function( expr, set ) {
+       return Sizzle( expr, null, null, set );
+};
+
+Sizzle.matchesSelector = function( node, expr ) {
+       return Sizzle( expr, null, null, [node] ).length > 0;
+};
+
+Sizzle.find = function( expr, context, isXML ) {
+       var set, i, len, match, type, left;
+
+       if ( !expr ) {
+               return [];
+       }
+
+       for ( i = 0, len = Expr.order.length; i < len; i++ ) {
+               type = Expr.order[i];
+               
+               if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
+                       left = match[1];
+                       match.splice( 1, 1 );
+
+                       if ( left.substr( left.length - 1 ) !== "\\" ) {
+                               match[1] = (match[1] || "").replace( rBackslash, "" );
+                               set = Expr.find[ type ]( match, context, isXML );
+
+                               if ( set != null ) {
+                                       expr = expr.replace( Expr.match[ type ], "" );
+                                       break;
+                               }
+                       }
+               }
+       }
+
+       if ( !set ) {
+               set = typeof context.getElementsByTagName !== "undefined" ?
+                       context.getElementsByTagName( "*" ) :
+                       [];
+       }
+
+       return { set: set, expr: expr };
+};
+
+Sizzle.filter = function( expr, set, inplace, not ) {
+       var match, anyFound,
+               type, found, item, filter, left,
+               i, pass,
+               old = expr,
+               result = [],
+               curLoop = set,
+               isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );
+
+       while ( expr && set.length ) {
+               for ( type in Expr.filter ) {
+                       if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
+                               filter = Expr.filter[ type ];
+                               left = match[1];
+
+                               anyFound = false;
+
+                               match.splice(1,1);
+
+                               if ( left.substr( left.length - 1 ) === "\\" ) {
+                                       continue;
+                               }
+
+                               if ( curLoop === result ) {
+                                       result = [];
+                               }
+
+                               if ( Expr.preFilter[ type ] ) {
+                                       match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
+
+                                       if ( !match ) {
+                                               anyFound = found = true;
+
+                                       } else if ( match === true ) {
+                                               continue;
+                                       }
+                               }
+
+                               if ( match ) {
+                                       for ( i = 0; (item = curLoop[i]) != null; i++ ) {
+                                               if ( item ) {
+                                                       found = filter( item, match, i, curLoop );
+                                                       pass = not ^ found;
+
+                                                       if ( inplace && found != null ) {
+                                                               if ( pass ) {
+                                                                       anyFound = true;
+
+                                                               } else {
+                                                                       curLoop[i] = false;
+                                                               }
+
+                                                       } else if ( pass ) {
+                                                               result.push( item );
+                                                               anyFound = true;
+                                                       }
+                                               }
+                                       }
+                               }
+
+                               if ( found !== undefined ) {
+                                       if ( !inplace ) {
+                                               curLoop = result;
+                                       }
+
+                                       expr = expr.replace( Expr.match[ type ], "" );
+
+                                       if ( !anyFound ) {
+                                               return [];
+                                       }
+
+                                       break;
+                               }
+                       }
+               }
+
+               // Improper expression
+               if ( expr === old ) {
+                       if ( anyFound == null ) {
+                               Sizzle.error( expr );
+
+                       } else {
+                               break;
+                       }
+               }
+
+               old = expr;
+       }
+
+       return curLoop;
+};
+
+Sizzle.error = function( msg ) {
+       throw "Syntax error, unrecognized expression: " + msg;
+};
+
+/**
+ * Utility function for retreiving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+var getText = Sizzle.getText = function( elem ) {
+    var i, node,
+               nodeType = elem.nodeType,
+               ret = "";
+
+       if ( nodeType ) {
+               if ( nodeType === 1 ) {
+                       // Use textContent || innerText for elements
+                       if ( typeof elem.textContent === 'string' ) {
+                               return elem.textContent;
+                       } else if ( typeof elem.innerText === 'string' ) {
+                               // Replace IE's carriage returns
+                               return elem.innerText.replace( rReturn, '' );
+                       } else {
+                               // Traverse it's children
+                               for ( elem = elem.firstChild; elem; elem = elem.nextSibling) {
+                                       ret += getText( elem );
+                               }
+                       }
+               } else if ( nodeType === 3 || nodeType === 4 ) {
+                       return elem.nodeValue;
+               }
+       } else {
+
+               // If no nodeType, this is expected to be an array
+               for ( i = 0; (node = elem[i]); i++ ) {
+                       // Do not traverse comment nodes
+                       if ( node.nodeType !== 8 ) {
+                               ret += getText( node );
+                       }
+               }
+       }
+       return ret;
+};
+
+var Expr = Sizzle.selectors = {
+       order: [ "ID", "NAME", "TAG" ],
+
+       match: {
+               ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
+               CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
+               NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
+               ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,
+               TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
+               CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,
+               POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
+               PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
+       },
+
+       leftMatch: {},
+
+       attrMap: {
+               "class": "className",
+               "for": "htmlFor"
+       },
+
+       attrHandle: {
+               href: function( elem ) {
+                       return elem.getAttribute( "href" );
+               },
+               type: function( elem ) {
+                       return elem.getAttribute( "type" );
+               }
+       },
+
+       relative: {
+               "+": function(checkSet, part){
+                       var isPartStr = typeof part === "string",
+                               isTag = isPartStr && !rNonWord.test( part ),
+                               isPartStrNotTag = isPartStr && !isTag;
+
+                       if ( isTag ) {
+                               part = part.toLowerCase();
+                       }
+
+                       for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
+                               if ( (elem = checkSet[i]) ) {
+                                       while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
+
+                                       checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
+                                               elem || false :
+                                               elem === part;
+                               }
+                       }
+
+                       if ( isPartStrNotTag ) {
+                               Sizzle.filter( part, checkSet, true );
+                       }
+               },
+
+               ">": function( checkSet, part ) {
+                       var elem,
+                               isPartStr = typeof part === "string",
+                               i = 0,
+                               l = checkSet.length;
+
+                       if ( isPartStr && !rNonWord.test( part ) ) {
+                               part = part.toLowerCase();
+
+                               for ( ; i < l; i++ ) {
+                                       elem = checkSet[i];
+
+                                       if ( elem ) {
+                                               var parent = elem.parentNode;
+                                               checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
+                                       }
+                               }
+
+                       } else {
+                               for ( ; i < l; i++ ) {
+                                       elem = checkSet[i];
+
+                                       if ( elem ) {
+                                               checkSet[i] = isPartStr ?
+                                                       elem.parentNode :
+                                                       elem.parentNode === part;
+                                       }
+                               }
+
+                               if ( isPartStr ) {
+                                       Sizzle.filter( part, checkSet, true );
+                               }
+                       }
+               },
+
+               "": function(checkSet, part, isXML){
+                       var nodeCheck,
+                               doneName = done++,
+                               checkFn = dirCheck;
+
+                       if ( typeof part === "string" && !rNonWord.test( part ) ) {
+                               part = part.toLowerCase();
+                               nodeCheck = part;
+                               checkFn = dirNodeCheck;
+                       }
+
+                       checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML );
+               },
+
+               "~": function( checkSet, part, isXML ) {
+                       var nodeCheck,
+                               doneName = done++,
+                               checkFn = dirCheck;
+
+                       if ( typeof part === "string" && !rNonWord.test( part ) ) {
+                               part = part.toLowerCase();
+                               nodeCheck = part;
+                               checkFn = dirNodeCheck;
+                       }
+
+                       checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML );
+               }
+       },
+
+       find: {
+               ID: function( match, context, isXML ) {
+                       if ( typeof context.getElementById !== "undefined" && !isXML ) {
+                               var m = context.getElementById(match[1]);
+                               // Check parentNode to catch when Blackberry 4.6 returns
+                               // nodes that are no longer in the document #6963
+                               return m && m.parentNode ? [m] : [];
+                       }
+               },
+
+               NAME: function( match, context ) {
+                       if ( typeof context.getElementsByName !== "undefined" ) {
+                               var ret = [],
+                                       results = context.getElementsByName( match[1] );
+
+                               for ( var i = 0, l = results.length; i < l; i++ ) {
+                                       if ( results[i].getAttribute("name") === match[1] ) {
+                                               ret.push( results[i] );
+                                       }
+                               }
+
+                               return ret.length === 0 ? null : ret;
+                       }
+               },
+
+               TAG: function( match, context ) {
+                       if ( typeof context.getElementsByTagName !== "undefined" ) {
+                               return context.getElementsByTagName( match[1] );
+                       }
+               }
+       },
+       preFilter: {
+               CLASS: function( match, curLoop, inplace, result, not, isXML ) {
+                       match = " " + match[1].replace( rBackslash, "" ) + " ";
+
+                       if ( isXML ) {
+                               return match;
+                       }
+
+                       for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
+                               if ( elem ) {
+                                       if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) {
+                                               if ( !inplace ) {
+                                                       result.push( elem );
+                                               }
+
+                                       } else if ( inplace ) {
+                                               curLoop[i] = false;
+                                       }
+                               }
+                       }
+
+                       return false;
+               },
+
+               ID: function( match ) {
+                       return match[1].replace( rBackslash, "" );
+               },
+
+               TAG: function( match, curLoop ) {
+                       return match[1].replace( rBackslash, "" ).toLowerCase();
+               },
+
+               CHILD: function( match ) {
+                       if ( match[1] === "nth" ) {
+                               if ( !match[2] ) {
+                                       Sizzle.error( match[0] );
+                               }
+
+                               match[2] = match[2].replace(/^\+|\s*/g, '');
+
+                               // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
+                               var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec(
+                                       match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
+                                       !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
+
+                               // calculate the numbers (first)n+(last) including if they are negative
+                               match[2] = (test[1] + (test[2] || 1)) - 0;
+                               match[3] = test[3] - 0;
+                       }
+                       else if ( match[2] ) {
+                               Sizzle.error( match[0] );
+                       }
+
+                       // TODO: Move to normal caching system
+                       match[0] = done++;
+
+                       return match;
+               },
+
+               ATTR: function( match, curLoop, inplace, result, not, isXML ) {
+                       var name = match[1] = match[1].replace( rBackslash, "" );
+                       
+                       if ( !isXML && Expr.attrMap[name] ) {
+                               match[1] = Expr.attrMap[name];
+                       }
+
+                       // Handle if an un-quoted value was used
+                       match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" );
+
+                       if ( match[2] === "~=" ) {
+                               match[4] = " " + match[4] + " ";
+                       }
+
+                       return match;
+               },
+
+               PSEUDO: function( match, curLoop, inplace, result, not ) {
+                       if ( match[1] === "not" ) {
+                               // If we're dealing with a complex expression, or a simple one
+                               if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
+                                       match[3] = Sizzle(match[3], null, null, curLoop);
+
+                               } else {
+                                       var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
+
+                                       if ( !inplace ) {
+                                               result.push.apply( result, ret );
+                                       }
+
+                                       return false;
+                               }
+
+                       } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
+                               return true;
+                       }
+                       
+                       return match;
+               },
+
+               POS: function( match ) {
+                       match.unshift( true );
+
+                       return match;
+               }
+       },
+       
+       filters: {
+               enabled: function( elem ) {
+                       return elem.disabled === false && elem.type !== "hidden";
+               },
+
+               disabled: function( elem ) {
+                       return elem.disabled === true;
+               },
+
+               checked: function( elem ) {
+                       return elem.checked === true;
+               },
+               
+               selected: function( elem ) {
+                       // Accessing this property makes selected-by-default
+                       // options in Safari work properly
+                       if ( elem.parentNode ) {
+                               elem.parentNode.selectedIndex;
+                       }
+                       
+                       return elem.selected === true;
+               },
+
+               parent: function( elem ) {
+                       return !!elem.firstChild;
+               },
+
+               empty: function( elem ) {
+                       return !elem.firstChild;
+               },
+
+               has: function( elem, i, match ) {
+                       return !!Sizzle( match[3], elem ).length;
+               },
+
+               header: function( elem ) {
+                       return (/h\d/i).test( elem.nodeName );
+               },
+
+               text: function( elem ) {
+                       var attr = elem.getAttribute( "type" ), type = elem.type;
+                       // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) 
+                       // use getAttribute instead to test this case
+                       return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null );
+               },
+
+               radio: function( elem ) {
+                       return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type;
+               },
+
+               checkbox: function( elem ) {
+                       return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type;
+               },
+
+               file: function( elem ) {
+                       return elem.nodeName.toLowerCase() === "input" && "file" === elem.type;
+               },
+
+               password: function( elem ) {
+                       return elem.nodeName.toLowerCase() === "input" && "password" === elem.type;
+               },
+
+               submit: function( elem ) {
+                       var name = elem.nodeName.toLowerCase();
+                       return (name === "input" || name === "button") && "submit" === elem.type;
+               },
+
+               image: function( elem ) {
+                       return elem.nodeName.toLowerCase() === "input" && "image" === elem.type;
+               },
+
+               reset: function( elem ) {
+                       var name = elem.nodeName.toLowerCase();
+                       return (name === "input" || name === "button") && "reset" === elem.type;
+               },
+
+               button: function( elem ) {
+                       var name = elem.nodeName.toLowerCase();
+                       return name === "input" && "button" === elem.type || name === "button";
+               },
+
+               input: function( elem ) {
+                       return (/input|select|textarea|button/i).test( elem.nodeName );
+               },
+
+               focus: function( elem ) {
+                       return elem === elem.ownerDocument.activeElement;
+               }
+       },
+       setFilters: {
+               first: function( elem, i ) {
+                       return i === 0;
+               },
+
+               last: function( elem, i, match, array ) {
+                       return i === array.length - 1;
+               },
+
+               even: function( elem, i ) {
+                       return i % 2 === 0;
+               },
+
+               odd: function( elem, i ) {
+                       return i % 2 === 1;
+               },
+
+               lt: function( elem, i, match ) {
+                       return i < match[3] - 0;
+               },
+
+               gt: function( elem, i, match ) {
+                       return i > match[3] - 0;
+               },
+
+               nth: function( elem, i, match ) {
+                       return match[3] - 0 === i;
+               },
+
+               eq: function( elem, i, match ) {
+                       return match[3] - 0 === i;
+               }
+       },
+       filter: {
+               PSEUDO: function( elem, match, i, array ) {
+                       var name = match[1],
+                               filter = Expr.filters[ name ];
+
+                       if ( filter ) {
+                               return filter( elem, i, match, array );
+
+                       } else if ( name === "contains" ) {
+                               return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0;
+
+                       } else if ( name === "not" ) {
+                               var not = match[3];
+
+                               for ( var j = 0, l = not.length; j < l; j++ ) {
+                                       if ( not[j] === elem ) {
+                                               return false;
+                                       }
+                               }
+
+                               return true;
+
+                       } else {
+                               Sizzle.error( name );
+                       }
+               },
+
+               CHILD: function( elem, match ) {
+                       var first, last,
+                               doneName, parent, cache,
+                               count, diff,
+                               type = match[1],
+                               node = elem;
+
+                       switch ( type ) {
+                               case "only":
+                               case "first":
+                                       while ( (node = node.previousSibling) )  {
+                                               if ( node.nodeType === 1 ) { 
+                                                       return false; 
+                                               }
+                                       }
+
+                                       if ( type === "first" ) { 
+                                               return true; 
+                                       }
+
+                                       node = elem;
+
+                               case "last":
+                                       while ( (node = node.nextSibling) )      {
+                                               if ( node.nodeType === 1 ) { 
+                                                       return false; 
+                                               }
+                                       }
+
+                                       return true;
+
+                               case "nth":
+                                       first = match[2];
+                                       last = match[3];
+
+                                       if ( first === 1 && last === 0 ) {
+                                               return true;
+                                       }
+                                       
+                                       doneName = match[0];
+                                       parent = elem.parentNode;
+       
+                                       if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) {
+                                               count = 0;
+                                               
+                                               for ( node = parent.firstChild; node; node = node.nextSibling ) {
+                                                       if ( node.nodeType === 1 ) {
+                                                               node.nodeIndex = ++count;
+                                                       }
+                                               } 
+
+                                               parent[ expando ] = doneName;
+                                       }
+                                       
+                                       diff = elem.nodeIndex - last;
+
+                                       if ( first === 0 ) {
+                                               return diff === 0;
+
+                                       } else {
+                                               return ( diff % first === 0 && diff / first >= 0 );
+                                       }
+                       }
+               },
+
+               ID: function( elem, match ) {
+                       return elem.nodeType === 1 && elem.getAttribute("id") === match;
+               },
+
+               TAG: function( elem, match ) {
+                       return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match;
+               },
+               
+               CLASS: function( elem, match ) {
+                       return (" " + (elem.className || elem.getAttribute("class")) + " ")
+                               .indexOf( match ) > -1;
+               },
+
+               ATTR: function( elem, match ) {
+                       var name = match[1],
+                               result = Sizzle.attr ?
+                                       Sizzle.attr( elem, name ) :
+                                       Expr.attrHandle[ name ] ?
+                                       Expr.attrHandle[ name ]( elem ) :
+                                       elem[ name ] != null ?
+                                               elem[ name ] :
+                                               elem.getAttribute( name ),
+                               value = result + "",
+                               type = match[2],
+                               check = match[4];
+
+                       return result == null ?
+                               type === "!=" :
+                               !type && Sizzle.attr ?
+                               result != null :
+                               type === "=" ?
+                               value === check :
+                               type === "*=" ?
+                               value.indexOf(check) >= 0 :
+                               type === "~=" ?
+                               (" " + value + " ").indexOf(check) >= 0 :
+                               !check ?
+                               value && result !== false :
+                               type === "!=" ?
+                               value !== check :
+                               type === "^=" ?
+                               value.indexOf(check) === 0 :
+                               type === "$=" ?
+                               value.substr(value.length - check.length) === check :
+                               type === "|=" ?
+                               value === check || value.substr(0, check.length + 1) === check + "-" :
+                               false;
+               },
+
+               POS: function( elem, match, i, array ) {
+                       var name = match[2],
+                               filter = Expr.setFilters[ name ];
+
+                       if ( filter ) {
+                               return filter( elem, i, match, array );
+                       }
+               }
+       }
+};
+
+var origPOS = Expr.match.POS,
+       fescape = function(all, num){
+               return "\\" + (num - 0 + 1);
+       };
+
+for ( var type in Expr.match ) {
+       Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );
+       Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );
+}
+
+var makeArray = function( array, results ) {
+       array = Array.prototype.slice.call( array, 0 );
+
+       if ( results ) {
+               results.push.apply( results, array );
+               return results;
+       }
+       
+       return array;
+};
+
+// Perform a simple check to determine if the browser is capable of
+// converting a NodeList to an array using builtin methods.
+// Also verifies that the returned array holds DOM nodes
+// (which is not the case in the Blackberry browser)
+try {
+       Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
+
+// Provide a fallback method if it does not work
+} catch( e ) {
+       makeArray = function( array, results ) {
+               var i = 0,
+                       ret = results || [];
+
+               if ( toString.call(array) === "[object Array]" ) {
+                       Array.prototype.push.apply( ret, array );
+
+               } else {
+                       if ( typeof array.length === "number" ) {
+                               for ( var l = array.length; i < l; i++ ) {
+                                       ret.push( array[i] );
+                               }
+
+                       } else {
+                               for ( ; array[i]; i++ ) {
+                                       ret.push( array[i] );
+                               }
+                       }
+               }
+
+               return ret;
+       };
+}
+
+var sortOrder, siblingCheck;
+
+if ( document.documentElement.compareDocumentPosition ) {
+       sortOrder = function( a, b ) {
+               if ( a === b ) {
+                       hasDuplicate = true;
+                       return 0;
+               }
+
+               if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
+                       return a.compareDocumentPosition ? -1 : 1;
+               }
+
+               return a.compareDocumentPosition(b) & 4 ? -1 : 1;
+       };
+
+} else {
+       sortOrder = function( a, b ) {
+               // The nodes are identical, we can exit early
+               if ( a === b ) {
+                       hasDuplicate = true;
+                       return 0;
+
+               // Fallback to using sourceIndex (in IE) if it's available on both nodes
+               } else if ( a.sourceIndex && b.sourceIndex ) {
+                       return a.sourceIndex - b.sourceIndex;
+               }
+
+               var al, bl,
+                       ap = [],
+                       bp = [],
+                       aup = a.parentNode,
+                       bup = b.parentNode,
+                       cur = aup;
+
+               // If the nodes are siblings (or identical) we can do a quick check
+               if ( aup === bup ) {
+                       return siblingCheck( a, b );
+
+               // If no parents were found then the nodes are disconnected
+               } else if ( !aup ) {
+                       return -1;
+
+               } else if ( !bup ) {
+                       return 1;
+               }
+
+               // Otherwise they're somewhere else in the tree so we need
+               // to build up a full list of the parentNodes for comparison
+               while ( cur ) {
+                       ap.unshift( cur );
+                       cur = cur.parentNode;
+               }
+
+               cur = bup;
+
+               while ( cur ) {
+                       bp.unshift( cur );
+                       cur = cur.parentNode;
+               }
+
+               al = ap.length;
+               bl = bp.length;
+
+               // Start walking down the tree looking for a discrepancy
+               for ( var i = 0; i < al && i < bl; i++ ) {
+                       if ( ap[i] !== bp[i] ) {
+                               return siblingCheck( ap[i], bp[i] );
+                       }
+               }
+
+               // We ended someplace up the tree so do a sibling check
+               return i === al ?
+                       siblingCheck( a, bp[i], -1 ) :
+                       siblingCheck( ap[i], b, 1 );
+       };
+
+       siblingCheck = function( a, b, ret ) {
+               if ( a === b ) {
+                       return ret;
+               }
+
+               var cur = a.nextSibling;
+
+               while ( cur ) {
+                       if ( cur === b ) {
+                               return -1;
+                       }
+
+                       cur = cur.nextSibling;
+               }
+
+               return 1;
+       };
+}
+
+// Check to see if the browser returns elements by name when
+// querying by getElementById (and provide a workaround)
+(function(){
+       // We're going to inject a fake input element with a specified name
+       var form = document.createElement("div"),
+               id = "script" + (new Date()).getTime(),
+               root = document.documentElement;
+
+       form.innerHTML = "<a name='" + id + "'/>";
+
+       // Inject it into the root element, check its status, and remove it quickly
+       root.insertBefore( form, root.firstChild );
+
+       // The workaround has to do additional checks after a getElementById
+       // Which slows things down for other browsers (hence the branching)
+       if ( document.getElementById( id ) ) {
+               Expr.find.ID = function( match, context, isXML ) {
+                       if ( typeof context.getElementById !== "undefined" && !isXML ) {
+                               var m = context.getElementById(match[1]);
+
+                               return m ?
+                                       m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ?
+                                               [m] :
+                                               undefined :
+                                       [];
+                       }
+               };
+
+               Expr.filter.ID = function( elem, match ) {
+                       var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
+
+                       return elem.nodeType === 1 && node && node.nodeValue === match;
+               };
+       }
+
+       root.removeChild( form );
+
+       // release memory in IE
+       root = form = null;
+})();
+
+(function(){
+       // Check to see if the browser returns only elements
+       // when doing getElementsByTagName("*")
+
+       // Create a fake element
+       var div = document.createElement("div");
+       div.appendChild( document.createComment("") );
+
+       // Make sure no comments are found
+       if ( div.getElementsByTagName("*").length > 0 ) {
+               Expr.find.TAG = function( match, context ) {
+                       var results = context.getElementsByTagName( match[1] );
+
+                       // Filter out possible comments
+                       if ( match[1] === "*" ) {
+                               var tmp = [];
+
+                               for ( var i = 0; results[i]; i++ ) {
+                                       if ( results[i].nodeType === 1 ) {
+                                               tmp.push( results[i] );
+                                       }
+                               }
+
+                               results = tmp;
+                       }
+
+                       return results;
+               };
+       }
+
+       // Check to see if an attribute returns normalized href attributes
+       div.innerHTML = "<a href='#'></a>";
+
+       if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
+                       div.firstChild.getAttribute("href") !== "#" ) {
+
+               Expr.attrHandle.href = function( elem ) {
+                       return elem.getAttribute( "href", 2 );
+               };
+       }
+
+       // release memory in IE
+       div = null;
+})();
+
+if ( document.querySelectorAll ) {
+       (function(){
+               var oldSizzle = Sizzle,
+                       div = document.createElement("div"),
+                       id = "__sizzle__";
+
+               div.innerHTML = "<p class='TEST'></p>";
+
+               // Safari can't handle uppercase or unicode characters when
+               // in quirks mode.
+               if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
+                       return;
+               }
+       
+               Sizzle = function( query, context, extra, seed ) {
+                       context = context || document;
+
+                       // Only use querySelectorAll on non-XML documents
+                       // (ID selectors don't work in non-HTML documents)
+                       if ( !seed && !Sizzle.isXML(context) ) {
+                               // See if we find a selector to speed up
+                               var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query );
+                               
+                               if ( match && (context.nodeType === 1 || context.nodeType === 9) ) {
+                                       // Speed-up: Sizzle("TAG")
+                                       if ( match[1] ) {
+                                               return makeArray( context.getElementsByTagName( query ), extra );
+                                       
+                                       // Speed-up: Sizzle(".CLASS")
+                                       } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {
+                                               return makeArray( context.getElementsByClassName( match[2] ), extra );
+                                       }
+                               }
+                               
+                               if ( context.nodeType === 9 ) {
+                                       // Speed-up: Sizzle("body")
+                                       // The body element only exists once, optimize finding it
+                                       if ( query === "body" && context.body ) {
+                                               return makeArray( [ context.body ], extra );
+                                               
+                                       // Speed-up: Sizzle("#ID")
+                                       } else if ( match && match[3] ) {
+                                               var elem = context.getElementById( match[3] );
+
+                                               // Check parentNode to catch when Blackberry 4.6 returns
+                                               // nodes that are no longer in the document #6963
+                                               if ( elem && elem.parentNode ) {
+                                                       // Handle the case where IE and Opera return items
+                                                       // by name instead of ID
+                                                       if ( elem.id === match[3] ) {
+                                                               return makeArray( [ elem ], extra );
+                                                       }
+                                                       
+                                               } else {
+                                                       return makeArray( [], extra );
+                                               }
+                                       }
+                                       
+                                       try {
+                                               return makeArray( context.querySelectorAll(query), extra );
+                                       } catch(qsaError) {}
+
+                               // qSA works strangely on Element-rooted queries
+                               // We can work around this by specifying an extra ID on the root
+                               // and working up from there (Thanks to Andrew Dupont for the technique)
+                               // IE 8 doesn't work on object elements
+                               } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
+                                       var oldContext = context,
+                                               old = context.getAttribute( "id" ),
+                                               nid = old || id,
+                                               hasParent = context.parentNode,
+                                               relativeHierarchySelector = /^\s*[+~]/.test( query );
+
+                                       if ( !old ) {
+                                               context.setAttribute( "id", nid );
+                                       } else {
+                                               nid = nid.replace( /'/g, "\\$&" );
+                                       }
+                                       if ( relativeHierarchySelector && hasParent ) {
+                                               context = context.parentNode;
+                                       }
+
+                                       try {
+                                               if ( !relativeHierarchySelector || hasParent ) {
+                                                       return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra );
+                                               }
+
+                                       } catch(pseudoError) {
+                                       } finally {
+                                               if ( !old ) {
+                                                       oldContext.removeAttribute( "id" );
+                                               }
+                                       }
+                               }
+                       }
+               
+                       return oldSizzle(query, context, extra, seed);
+               };
+
+               for ( var prop in oldSizzle ) {
+                       Sizzle[ prop ] = oldSizzle[ prop ];
+               }
+
+               // release memory in IE
+               div = null;
+       })();
+}
+
+(function(){
+       var html = document.documentElement,
+               matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector;
+
+       if ( matches ) {
+               // Check to see if it's possible to do matchesSelector
+               // on a disconnected node (IE 9 fails this)
+               var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ),
+                       pseudoWorks = false;
+
+               try {
+                       // This should fail with an exception
+                       // Gecko does not error, returns false instead
+                       matches.call( document.documentElement, "[test!='']:sizzle" );
+       
+               } catch( pseudoError ) {
+                       pseudoWorks = true;
+               }
+
+               Sizzle.matchesSelector = function( node, expr ) {
+                       // Make sure that attribute selectors are quoted
+                       expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");
+
+                       if ( !Sizzle.isXML( node ) ) {
+                               try { 
+                                       if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {
+                                               var ret = matches.call( node, expr );
+
+                                               // IE 9's matchesSelector returns false on disconnected nodes
+                                               if ( ret || !disconnectedMatch ||
+                                                               // As well, disconnected nodes are said to be in a document
+                                                               // fragment in IE 9, so check for that
+                                                               node.document && node.document.nodeType !== 11 ) {
+                                                       return ret;
+                                               }
+                                       }
+                               } catch(e) {}
+                       }
+
+                       return Sizzle(expr, null, null, [node]).length > 0;
+               };
+       }
+})();
+
+(function(){
+       var div = document.createElement("div");
+
+       div.innerHTML = "<div class='test e'></div><div class='test'></div>";
+
+       // Opera can't find a second classname (in 9.6)
+       // Also, make sure that getElementsByClassName actually exists
+       if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
+               return;
+       }
+
+       // Safari caches class attributes, doesn't catch changes (in 3.2)
+       div.lastChild.className = "e";
+
+       if ( div.getElementsByClassName("e").length === 1 ) {
+               return;
+       }
+       
+       Expr.order.splice(1, 0, "CLASS");
+       Expr.find.CLASS = function( match, context, isXML ) {
+               if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
+                       return context.getElementsByClassName(match[1]);
+               }
+       };
+
+       // release memory in IE
+       div = null;
+})();
+
+function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+       for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+               var elem = checkSet[i];
+
+               if ( elem ) {
+                       var match = false;
+
+                       elem = elem[dir];
+
+                       while ( elem ) {
+                               if ( elem[ expando ] === doneName ) {
+                                       match = checkSet[elem.sizset];
+                                       break;
+                               }
+
+                               if ( elem.nodeType === 1 && !isXML ){
+                                       elem[ expando ] = doneName;
+                                       elem.sizset = i;
+                               }
+
+                               if ( elem.nodeName.toLowerCase() === cur ) {
+                                       match = elem;
+                                       break;
+                               }
+
+                               elem = elem[dir];
+                       }
+
+                       checkSet[i] = match;
+               }
+       }
+}
+
+function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+       for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+               var elem = checkSet[i];
+
+               if ( elem ) {
+                       var match = false;
+                       
+                       elem = elem[dir];
+
+                       while ( elem ) {
+                               if ( elem[ expando ] === doneName ) {
+                                       match = checkSet[elem.sizset];
+                                       break;
+                               }
+
+                               if ( elem.nodeType === 1 ) {
+                                       if ( !isXML ) {
+                                               elem[ expando ] = doneName;
+                                               elem.sizset = i;
+                                       }
+
+                                       if ( typeof cur !== "string" ) {
+                                               if ( elem === cur ) {
+                                                       match = true;
+                                                       break;
+                                               }
+
+                                       } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
+                                               match = elem;
+                                               break;
+                                       }
+                               }
+
+                               elem = elem[dir];
+                       }
+
+                       checkSet[i] = match;
+               }
+       }
+}
+
+if ( document.documentElement.contains ) {
+       Sizzle.contains = function( a, b ) {
+               return a !== b && (a.contains ? a.contains(b) : true);
+       };
+
+} else if ( document.documentElement.compareDocumentPosition ) {
+       Sizzle.contains = function( a, b ) {
+               return !!(a.compareDocumentPosition(b) & 16);
+       };
+
+} else {
+       Sizzle.contains = function() {
+               return false;
+       };
+}
+
+Sizzle.isXML = function( elem ) {
+       // documentElement is verified for cases where it doesn't yet exist
+       // (such as loading iframes in IE - #4833) 
+       var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
+
+       return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+var posProcess = function( selector, context, seed ) {
+       var match,
+               tmpSet = [],
+               later = "",
+               root = context.nodeType ? [context] : context;
+
+       // Position selectors must be done after the filter
+       // And so must :not(positional) so we move all PSEUDOs to the end
+       while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
+               later += match[0];
+               selector = selector.replace( Expr.match.PSEUDO, "" );
+       }
+
+       selector = Expr.relative[selector] ? selector + "*" : selector;
+
+       for ( var i = 0, l = root.length; i < l; i++ ) {
+               Sizzle( selector, root[i], tmpSet, seed );
+       }
+
+       return Sizzle.filter( later, tmpSet );
+};
+
+// EXPOSE
+// Override sizzle attribute retrieval
+Sizzle.attr = jQuery.attr;
+Sizzle.selectors.attrMap = {};
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[":"] = jQuery.expr.filters;
+jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+
+
+})();
+
+
+var runtil = /Until$/,
+       rparentsprev = /^(?:parents|prevUntil|prevAll)/,
+       // Note: This RegExp should be improved, or likely pulled from Sizzle
+       rmultiselector = /,/,
+       isSimple = /^.[^:#\[\.,]*$/,
+       slice = Array.prototype.slice,
+       POS = jQuery.expr.match.POS,
+       // methods guaranteed to produce a unique set when starting from a unique set
+       guaranteedUnique = {
+               children: true,
+               contents: true,
+               next: true,
+               prev: true
+       };
+
+jQuery.fn.extend({
+       find: function( selector ) {
+               var self = this,
+                       i, l;
+
+               if ( typeof selector !== "string" ) {
+                       return jQuery( selector ).filter(function() {
+                               for ( i = 0, l = self.length; i < l; i++ ) {
+                                       if ( jQuery.contains( self[ i ], this ) ) {
+                                               return true;
+                                       }
+                               }
+                       });
+               }
+
+               var ret = this.pushStack( "", "find", selector ),
+                       length, n, r;
+
+               for ( i = 0, l = this.length; i < l; i++ ) {
+                       length = ret.length;
+                       jQuery.find( selector, this[i], ret );
+
+                       if ( i > 0 ) {
+                               // Make sure that the results are unique
+                               for ( n = length; n < ret.length; n++ ) {
+                                       for ( r = 0; r < length; r++ ) {
+                                               if ( ret[r] === ret[n] ) {
+                                                       ret.splice(n--, 1);
+                                                       break;
+                                               }
+                                       }
+                               }
+                       }
+               }
+
+               return ret;
+       },
+
+       has: function( target ) {
+               var targets = jQuery( target );
+               return this.filter(function() {
+                       for ( var i = 0, l = targets.length; i < l; i++ ) {
+                               if ( jQuery.contains( this, targets[i] ) ) {
+                                       return true;
+                               }
+                       }
+               });
+       },
+
+       not: function( selector ) {
+               return this.pushStack( winnow(this, selector, false), "not", selector);
+       },
+
+       filter: function( selector ) {
+               return this.pushStack( winnow(this, selector, true), "filter", selector );
+       },
+
+       is: function( selector ) {
+               return !!selector && ( 
+                       typeof selector === "string" ?
+                               // If this is a positional selector, check membership in the returned set
+                               // so $("p:first").is("p:last") won't return true for a doc with two "p".
+                               POS.test( selector ) ? 
+                                       jQuery( selector, this.context ).index( this[0] ) >= 0 :
+                                       jQuery.filter( selector, this ).length > 0 :
+                               this.filter( selector ).length > 0 );
+       },
+
+       closest: function( selectors, context ) {
+               var ret = [], i, l, cur = this[0];
+               
+               // Array (deprecated as of jQuery 1.7)
+               if ( jQuery.isArray( selectors ) ) {
+                       var level = 1;
+
+                       while ( cur && cur.ownerDocument && cur !== context ) {
+                               for ( i = 0; i < selectors.length; i++ ) {
+
+                                       if ( jQuery( cur ).is( selectors[ i ] ) ) {
+                                               ret.push({ selector: selectors[ i ], elem: cur, level: level });
+                                       }
+                               }
+
+                               cur = cur.parentNode;
+                               level++;
+                       }
+
+                       return ret;
+               }
+
+               // String
+               var pos = POS.test( selectors ) || typeof selectors !== "string" ?
+                               jQuery( selectors, context || this.context ) :
+                               0;
+
+               for ( i = 0, l = this.length; i < l; i++ ) {
+                       cur = this[i];
+
+                       while ( cur ) {
+                               if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
+                                       ret.push( cur );
+                                       break;
+
+                               } else {
+                                       cur = cur.parentNode;
+                                       if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) {
+                                               break;
+                                       }
+                               }
+                       }
+               }
+
+               ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
+
+               return this.pushStack( ret, "closest", selectors );
+       },
+
+       // Determine the position of an element within
+       // the matched set of elements
+       index: function( elem ) {
+
+               // No argument, return index in parent
+               if ( !elem ) {
+                       return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;
+               }
+
+               // index in selector
+               if ( typeof elem === "string" ) {
+                       return jQuery.inArray( this[0], jQuery( elem ) );
+               }
+
+               // Locate the position of the desired element
+               return jQuery.inArray(
+                       // If it receives a jQuery object, the first element is used
+                       elem.jquery ? elem[0] : elem, this );
+       },
+
+       add: function( selector, context ) {
+               var set = typeof selector === "string" ?
+                               jQuery( selector, context ) :
+                               jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
+                       all = jQuery.merge( this.get(), set );
+
+               return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
+                       all :
+                       jQuery.unique( all ) );
+       },
+
+       andSelf: function() {
+               return this.add( this.prevObject );
+       }
+});
+
+// A painfully simple check to see if an element is disconnected
+// from a document (should be improved, where feasible).
+function isDisconnected( node ) {
+       return !node || !node.parentNode || node.parentNode.nodeType === 11;
+}
+
+jQuery.each({
+       parent: function( elem ) {
+               var parent = elem.parentNode;
+               return parent && parent.nodeType !== 11 ? parent : null;
+       },
+       parents: function( elem ) {
+               return jQuery.dir( elem, "parentNode" );
+       },
+       parentsUntil: function( elem, i, until ) {
+               return jQuery.dir( elem, "parentNode", until );
+       },
+       next: function( elem ) {
+               return jQuery.nth( elem, 2, "nextSibling" );
+       },
+       prev: function( elem ) {
+               return jQuery.nth( elem, 2, "previousSibling" );
+       },
+       nextAll: function( elem ) {
+               return jQuery.dir( elem, "nextSibling" );
+       },
+       prevAll: function( elem ) {
+               return jQuery.dir( elem, "previousSibling" );
+       },
+       nextUntil: function( elem, i, until ) {
+               return jQuery.dir( elem, "nextSibling", until );
+       },
+       prevUntil: function( elem, i, until ) {
+               return jQuery.dir( elem, "previousSibling", until );
+       },
+       siblings: function( elem ) {
+               return jQuery.sibling( elem.parentNode.firstChild, elem );
+       },
+       children: function( elem ) {
+               return jQuery.sibling( elem.firstChild );
+       },
+       contents: function( elem ) {
+               return jQuery.nodeName( elem, "iframe" ) ?
+                       elem.contentDocument || elem.contentWindow.document :
+                       jQuery.makeArray( elem.childNodes );
+       }
+}, function( name, fn ) {
+       jQuery.fn[ name ] = function( until, selector ) {
+               var ret = jQuery.map( this, fn, until ),
+                       // The variable 'args' was introduced in
+                       // https://github.com/jquery/jquery/commit/52a0238
+                       // to work around a bug in Chrome 10 (Dev) and should be removed when the bug is fixed.
+                       // http://code.google.com/p/v8/issues/detail?id=1050
+                       args = slice.call(arguments);
+
+               if ( !runtil.test( name ) ) {
+                       selector = until;
+               }
+
+               if ( selector && typeof selector === "string" ) {
+                       ret = jQuery.filter( selector, ret );
+               }
+
+               ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
+
+               if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
+                       ret = ret.reverse();
+               }
+
+               return this.pushStack( ret, name, args.join(",") );
+       };
+});
+
+jQuery.extend({
+       filter: function( expr, elems, not ) {
+               if ( not ) {
+                       expr = ":not(" + expr + ")";
+               }
+
+               return elems.length === 1 ?
+                       jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
+                       jQuery.find.matches(expr, elems);
+       },
+
+       dir: function( elem, dir, until ) {
+               var matched = [],
+                       cur = elem[ dir ];
+
+               while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
+                       if ( cur.nodeType === 1 ) {
+                               matched.push( cur );
+                       }
+                       cur = cur[dir];
+               }
+               return matched;
+       },
+
+       nth: function( cur, result, dir, elem ) {
+               result = result || 1;
+               var num = 0;
+
+               for ( ; cur; cur = cur[dir] ) {
+                       if ( cur.nodeType === 1 && ++num === result ) {
+                               break;
+                       }
+               }
+
+               return cur;
+       },
+
+       sibling: function( n, elem ) {
+               var r = [];
+
+               for ( ; n; n = n.nextSibling ) {
+                       if ( n.nodeType === 1 && n !== elem ) {
+                               r.push( n );
+                       }
+               }
+
+               return r;
+       }
+});
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, keep ) {
+
+       // Can't pass null or undefined to indexOf in Firefox 4
+       // Set to 0 to skip string check
+       qualifier = qualifier || 0;
+
+       if ( jQuery.isFunction( qualifier ) ) {
+               return jQuery.grep(elements, function( elem, i ) {
+                       var retVal = !!qualifier.call( elem, i, elem );
+                       return retVal === keep;
+               });
+
+       } else if ( qualifier.nodeType ) {
+               return jQuery.grep(elements, function( elem, i ) {
+                       return ( elem === qualifier ) === keep;
+               });
+
+       } else if ( typeof qualifier === "string" ) {
+               var filtered = jQuery.grep(elements, function( elem ) {
+                       return elem.nodeType === 1;
+               });
+
+               if ( isSimple.test( qualifier ) ) {
+                       return jQuery.filter(qualifier, filtered, !keep);
+               } else {
+                       qualifier = jQuery.filter( qualifier, filtered );
+               }
+       }
+
+       return jQuery.grep(elements, function( elem, i ) {
+               return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
+       });
+}
+
+
+
+
+function createSafeFragment( document ) {
+       var list = nodeNames.split( " " ),
+       safeFrag = document.createDocumentFragment();
+
+       if ( safeFrag.createElement ) {
+               while ( list.length ) {
+                       safeFrag.createElement(
+                               list.pop()
+                       );
+               }
+       }
+       return safeFrag;
+}
+
+var nodeNames = "abbr article aside audio canvas datalist details figcaption figure footer " +
+               "header hgroup mark meter nav output progress section summary time video",
+       rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
+       rleadingWhitespace = /^\s+/,
+       rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
+       rtagName = /<([\w:]+)/,
+       rtbody = /<tbody/i,
+       rhtml = /<|&#?\w+;/,
+       rnoInnerhtml = /<(?:script|style)/i,
+       rnocache = /<(?:script|object|embed|option|style)/i,
+       rnoshimcache = new RegExp("<(?:" + nodeNames.replace(" ", "|") + ")", "i"),
+       // checked="checked" or checked
+       rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+       rscriptType = /\/(java|ecma)script/i,
+       rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)/,
+       wrapMap = {
+               option: [ 1, "<select multiple='multiple'>", "</select>" ],
+               legend: [ 1, "<fieldset>", "</fieldset>" ],
+               thead: [ 1, "<table>", "</table>" ],
+               tr: [ 2, "<table><tbody>", "</tbody></table>" ],
+               td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
+               col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
+               area: [ 1, "<map>", "</map>" ],
+               _default: [ 0, "", "" ]
+       },
+       safeFragment = createSafeFragment( document );
+
+wrapMap.optgroup = wrapMap.option;
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+// IE can't serialize <link> and <script> tags normally
+if ( !jQuery.support.htmlSerialize ) {
+       wrapMap._default = [ 1, "div<div>", "</div>" ];
+}
+
+jQuery.fn.extend({
+       text: function( text ) {
+               if ( jQuery.isFunction(text) ) {
+                       return this.each(function(i) {
+                               var self = jQuery( this );
+
+                               self.text( text.call(this, i, self.text()) );
+                       });
+               }
+
+               if ( typeof text !== "object" && text !== undefined ) {
+                       return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
+               }
+
+               return jQuery.text( this );
+       },
+
+       wrapAll: function( html ) {
+               if ( jQuery.isFunction( html ) ) {
+                       return this.each(function(i) {
+                               jQuery(this).wrapAll( html.call(this, i) );
+                       });
+               }
+
+               if ( this[0] ) {
+                       // The elements to wrap the target around
+                       var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
+
+                       if ( this[0].parentNode ) {
+                               wrap.insertBefore( this[0] );
+                       }
+
+                       wrap.map(function() {
+                               var elem = this;
+
+                               while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
+                                       elem = elem.firstChild;
+                               }
+
+                               return elem;
+                       }).append( this );
+               }
+
+               return this;
+       },
+
+       wrapInner: function( html ) {
+               if ( jQuery.isFunction( html ) ) {
+                       return this.each(function(i) {
+                               jQuery(this).wrapInner( html.call(this, i) );
+                       });
+               }
+
+               return this.each(function() {
+                       var self = jQuery( this ),
+                               contents = self.contents();
+
+                       if ( contents.length ) {
+                               contents.wrapAll( html );
+
+                       } else {
+                               self.append( html );
+                       }
+               });
+       },
+
+       wrap: function( html ) {
+               return this.each(function() {
+                       jQuery( this ).wrapAll( html );
+               });
+       },
+
+       unwrap: function() {
+               return this.parent().each(function() {
+                       if ( !jQuery.nodeName( this, "body" ) ) {
+                               jQuery( this ).replaceWith( this.childNodes );
+                       }
+               }).end();
+       },
+
+       append: function() {
+               return this.domManip(arguments, true, function( elem ) {
+                       if ( this.nodeType === 1 ) {
+                               this.appendChild( elem );
+                       }
+               });
+       },
+
+       prepend: function() {
+               return this.domManip(arguments, true, function( elem ) {
+                       if ( this.nodeType === 1 ) {
+                               this.insertBefore( elem, this.firstChild );
+                       }
+               });
+       },
+
+       before: function() {
+               if ( this[0] && this[0].parentNode ) {
+                       return this.domManip(arguments, false, function( elem ) {
+                               this.parentNode.insertBefore( elem, this );
+                       });
+               } else if ( arguments.length ) {
+                       var set = jQuery(arguments[0]);
+                       set.push.apply( set, this.toArray() );
+                       return this.pushStack( set, "before", arguments );
+               }
+       },
+
+       after: function() {
+               if ( this[0] && this[0].parentNode ) {
+                       return this.domManip(arguments, false, function( elem ) {
+                               this.parentNode.insertBefore( elem, this.nextSibling );
+                       });
+               } else if ( arguments.length ) {
+                       var set = this.pushStack( this, "after", arguments );
+                       set.push.apply( set, jQuery(arguments[0]).toArray() );
+                       return set;
+               }
+       },
+
+       // keepData is for internal use only--do not document
+       remove: function( selector, keepData ) {
+               for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
+                       if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
+                               if ( !keepData && elem.nodeType === 1 ) {
+                                       jQuery.cleanData( elem.getElementsByTagName("*") );
+                                       jQuery.cleanData( [ elem ] );
+                               }
+
+                               if ( elem.parentNode ) {
+                                       elem.parentNode.removeChild( elem );
+                               }
+                       }
+               }
+
+               return this;
+       },
+
+       empty: function() {
+               for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
+                       // Remove element nodes and prevent memory leaks
+                       if ( elem.nodeType === 1 ) {
+                               jQuery.cleanData( elem.getElementsByTagName("*") );
+                       }
+
+                       // Remove any remaining nodes
+                       while ( elem.firstChild ) {
+                               elem.removeChild( elem.firstChild );
+                       }
+               }
+
+               return this;
+       },
+
+       clone: function( dataAndEvents, deepDataAndEvents ) {
+               dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
+               deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
+
+               return this.map( function () {
+                       return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
+               });
+       },
+
+       html: function( value ) {
+               if ( value === undefined ) {
+                       return this[0] && this[0].nodeType === 1 ?
+                               this[0].innerHTML.replace(rinlinejQuery, "") :
+                               null;
+
+               // See if we can take a shortcut and just use innerHTML
+               } else if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
+                       (jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&
+                       !wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) {
+
+                       value = value.replace(rxhtmlTag, "<$1></$2>");
+
+                       try {
+                               for ( var i = 0, l = this.length; i < l; i++ ) {
+                                       // Remove element nodes and prevent memory leaks
+                                       if ( this[i].nodeType === 1 ) {
+                                               jQuery.cleanData( this[i].getElementsByTagName("*") );
+                                               this[i].innerHTML = value;
+                                       }
+                               }
+
+                       // If using innerHTML throws an exception, use the fallback method
+                       } catch(e) {
+                               this.empty().append( value );
+                       }
+
+               } else if ( jQuery.isFunction( value ) ) {
+                       this.each(function(i){
+                               var self = jQuery( this );
+
+                               self.html( value.call(this, i, self.html()) );
+                       });
+
+               } else {
+                       this.empty().append( value );
+               }
+
+               return this;
+       },
+
+       replaceWith: function( value ) {
+               if ( this[0] && this[0].parentNode ) {
+                       // Make sure that the elements are removed from the DOM before they are inserted
+                       // this can help fix replacing a parent with child elements
+                       if ( jQuery.isFunction( value ) ) {
+                               return this.each(function(i) {
+                                       var self = jQuery(this), old = self.html();
+                                       self.replaceWith( value.call( this, i, old ) );
+                               });
+                       }
+
+                       if ( typeof value !== "string" ) {
+                               value = jQuery( value ).detach();
+                       }
+
+                       return this.each(function() {
+                               var next = this.nextSibling,
+                                       parent = this.parentNode;
+
+                               jQuery( this ).remove();
+
+                               if ( next ) {
+                                       jQuery(next).before( value );
+                               } else {
+                                       jQuery(parent).append( value );
+                               }
+                       });
+               } else {
+                       return this.length ?
+                               this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
+                               this;
+               }
+       },
+
+       detach: function( selector ) {
+               return this.remove( selector, true );
+       },
+
+       domManip: function( args, table, callback ) {
+               var results, first, fragment, parent,
+                       value = args[0],
+                       scripts = [];
+
+               // We can't cloneNode fragments that contain checked, in WebKit
+               if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
+                       return this.each(function() {
+                               jQuery(this).domManip( args, table, callback, true );
+                       });
+               }
+
+               if ( jQuery.isFunction(value) ) {
+                       return this.each(function(i) {
+                               var self = jQuery(this);
+                               args[0] = value.call(this, i, table ? self.html() : undefined);
+                               self.domManip( args, table, callback );
+                       });
+               }
+
+               if ( this[0] ) {
+                       parent = value && value.parentNode;
+
+                       // If we're in a fragment, just use that instead of building a new one
+                       if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
+                               results = { fragment: parent };
+
+                       } else {
+                               results = jQuery.buildFragment( args, this, scripts );
+                       }
+
+                       fragment = results.fragment;
+
+                       if ( fragment.childNodes.length === 1 ) {
+                               first = fragment = fragment.firstChild;
+                       } else {
+                               first = fragment.firstChild;
+                       }
+
+                       if ( first ) {
+                               table = table && jQuery.nodeName( first, "tr" );
+
+                               for ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) {
+                                       callback.call(
+                                               table ?
+                                                       root(this[i], first) :
+                                                       this[i],
+                                               // Make sure that we do not leak memory by inadvertently discarding
+                                               // the original fragment (which might have attached data) instead of
+                                               // using it; in addition, use the original fragment object for the last
+                                               // item instead of first because it can end up being emptied incorrectly
+                                               // in certain situations (Bug #8070).
+                                               // Fragments from the fragment cache must always be cloned and never used
+                                               // in place.
+                                               results.cacheable || ( l > 1 && i < lastIndex ) ?
+                                                       jQuery.clone( fragment, true, true ) :
+                                                       fragment
+                                       );
+                               }
+                       }
+
+                       if ( scripts.length ) {
+                               jQuery.each( scripts, evalScript );
+                       }
+               }
+
+               return this;
+       }
+});
+
+function root( elem, cur ) {
+       return jQuery.nodeName(elem, "table") ?
+               (elem.getElementsByTagName("tbody")[0] ||
+               elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
+               elem;
+}
+
+function cloneCopyEvent( src, dest ) {
+
+       if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
+               return;
+       }
+
+       var type, i, l,
+               oldData = jQuery._data( src ),
+               curData = jQuery._data( dest, oldData ),
+               events = oldData.events;
+
+       if ( events ) {
+               delete curData.handle;
+               curData.events = {};
+
+               for ( type in events ) {
+                       for ( i = 0, l = events[ type ].length; i < l; i++ ) {
+                               jQuery.event.add( dest, type + ( events[ type ][ i ].namespace ? "." : "" ) + events[ type ][ i ].namespace, events[ type ][ i ], events[ type ][ i ].data );
+                       }
+               }
+       }
+
+       // make the cloned public data object a copy from the original
+       if ( curData.data ) {
+               curData.data = jQuery.extend( {}, curData.data );
+       }
+}
+
+function cloneFixAttributes( src, dest ) {
+       var nodeName;
+
+       // We do not need to do anything for non-Elements
+       if ( dest.nodeType !== 1 ) {
+               return;
+       }
+
+       // clearAttributes removes the attributes, which we don't want,
+       // but also removes the attachEvent events, which we *do* want
+       if ( dest.clearAttributes ) {
+               dest.clearAttributes();
+       }
+
+       // mergeAttributes, in contrast, only merges back on the
+       // original attributes, not the events
+       if ( dest.mergeAttributes ) {
+               dest.mergeAttributes( src );
+       }
+
+       nodeName = dest.nodeName.toLowerCase();
+
+       // IE6-8 fail to clone children inside object elements that use
+       // the proprietary classid attribute value (rather than the type
+       // attribute) to identify the type of content to display
+       if ( nodeName === "object" ) {
+               dest.outerHTML = src.outerHTML;
+
+       } else if ( nodeName === "input" && (src.type === "checkbox" || src.type === "radio") ) {
+               // IE6-8 fails to persist the checked state of a cloned checkbox
+               // or radio button. Worse, IE6-7 fail to give the cloned element
+               // a checked appearance if the defaultChecked value isn't also set
+               if ( src.checked ) {
+                       dest.defaultChecked = dest.checked = src.checked;
+               }
+
+               // IE6-7 get confused and end up setting the value of a cloned
+               // checkbox/radio button to an empty string instead of "on"
+               if ( dest.value !== src.value ) {
+                       dest.value = src.value;
+               }
+
+       // IE6-8 fails to return the selected option to the default selected
+       // state when cloning options
+       } else if ( nodeName === "option" ) {
+               dest.selected = src.defaultSelected;
+
+       // IE6-8 fails to set the defaultValue to the correct value when
+       // cloning other types of input fields
+       } else if ( nodeName === "input" || nodeName === "textarea" ) {
+               dest.defaultValue = src.defaultValue;
+       }
+
+       // Event data gets referenced instead of copied if the expando
+       // gets copied too
+       dest.removeAttribute( jQuery.expando );
+}
+
+jQuery.buildFragment = function( args, nodes, scripts ) {
+       var fragment, cacheable, cacheresults, doc,
+       first = args[ 0 ];
+
+       // nodes may contain either an explicit document object,
+       // a jQuery collection or context object.
+       // If nodes[0] contains a valid object to assign to doc
+       if ( nodes && nodes[0] ) {
+               doc = nodes[0].ownerDocument || nodes[0];
+       }
+
+  // Ensure that an attr object doesn't incorrectly stand in as a document object
+       // Chrome and Firefox seem to allow this to occur and will throw exception
+       // Fixes #8950
+       if ( !doc.createDocumentFragment ) {
+               doc = document;
+       }
+
+       // Only cache "small" (1/2 KB) HTML strings that are associated with the main document
+       // Cloning options loses the selected state, so don't cache them
+       // IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
+       // Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
+       // Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501
+       if ( args.length === 1 && typeof first === "string" && first.length < 512 && doc === document &&
+               first.charAt(0) === "<" && !rnocache.test( first ) &&
+               (jQuery.support.checkClone || !rchecked.test( first )) &&
+               (!jQuery.support.unknownElems && rnoshimcache.test( first )) ) {
+
+               cacheable = true;
+
+               cacheresults = jQuery.fragments[ first ];
+               if ( cacheresults && cacheresults !== 1 ) {
+                       fragment = cacheresults;
+               }
+       }
+
+       if ( !fragment ) {
+               fragment = doc.createDocumentFragment();
+               jQuery.clean( args, doc, fragment, scripts );
+       }
+
+       if ( cacheable ) {
+               jQuery.fragments[ first ] = cacheresults ? fragment : 1;
+       }
+
+       return { fragment: fragment, cacheable: cacheable };
+};
+
+jQuery.fragments = {};
+
+jQuery.each({
+       appendTo: "append",
+       prependTo: "prepend",
+       insertBefore: "before",
+       insertAfter: "after",
+       replaceAll: "replaceWith"
+}, function( name, original ) {
+       jQuery.fn[ name ] = function( selector ) {
+               var ret = [],
+                       insert = jQuery( selector ),
+                       parent = this.length === 1 && this[0].parentNode;
+
+               if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
+                       insert[ original ]( this[0] );
+                       return this;
+
+               } else {
+                       for ( var i = 0, l = insert.length; i < l; i++ ) {
+                               var elems = ( i > 0 ? this.clone(true) : this ).get();
+                               jQuery( insert[i] )[ original ]( elems );
+                               ret = ret.concat( elems );
+                       }
+
+                       return this.pushStack( ret, name, insert.selector );
+               }
+       };
+});
+
+function getAll( elem ) {
+       if ( typeof elem.getElementsByTagName !== "undefined" ) {
+               return elem.getElementsByTagName( "*" );
+
+       } else if ( typeof elem.querySelectorAll !== "undefined" ) {
+               return elem.querySelectorAll( "*" );
+
+       } else {
+               return [];
+       }
+}
+
+// Used in clean, fixes the defaultChecked property
+function fixDefaultChecked( elem ) {
+       if ( elem.type === "checkbox" || elem.type === "radio" ) {
+               elem.defaultChecked = elem.checked;
+       }
+}
+// Finds all inputs and passes them to fixDefaultChecked
+function findInputs( elem ) {
+       var nodeName = ( elem.nodeName || "" ).toLowerCase();
+       if ( nodeName === "input" ) {
+               fixDefaultChecked( elem );
+       // Skip scripts, get other children
+       } else if ( nodeName !== "script" && typeof elem.getElementsByTagName !== "undefined" ) {
+               jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
+       }
+}
+
+jQuery.extend({
+       clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+               var clone = elem.cloneNode(true),
+                               srcElements,
+                               destElements,
+                               i;
+
+               if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
+                               (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
+                       // IE copies events bound via attachEvent when using cloneNode.
+                       // Calling detachEvent on the clone will also remove the events
+                       // from the original. In order to get around this, we use some
+                       // proprietary methods to clear the events. Thanks to MooTools
+                       // guys for this hotness.
+
+                       cloneFixAttributes( elem, clone );
+
+                       // Using Sizzle here is crazy slow, so we use getElementsByTagName
+                       // instead
+                       srcElements = getAll( elem );
+                       destElements = getAll( clone );
+
+                       // Weird iteration because IE will replace the length property
+                       // with an element if you are cloning the body and one of the
+                       // elements on the page has a name or id of "length"
+                       for ( i = 0; srcElements[i]; ++i ) {
+                               // Ensure that the destination node is not null; Fixes #9587
+                               if ( destElements[i] ) {
+                                       cloneFixAttributes( srcElements[i], destElements[i] );
+                               }
+                       }
+               }
+
+               // Copy the events from the original to the clone
+               if ( dataAndEvents ) {
+                       cloneCopyEvent( elem, clone );
+
+                       if ( deepDataAndEvents ) {
+                               srcElements = getAll( elem );
+                               destElements = getAll( clone );
+
+                               for ( i = 0; srcElements[i]; ++i ) {
+                                       cloneCopyEvent( srcElements[i], destElements[i] );
+                               }
+                       }
+               }
+
+               srcElements = destElements = null;
+
+               // Return the cloned set
+               return clone;
+       },
+
+       clean: function( elems, context, fragment, scripts ) {
+               var checkScriptType;
+
+               context = context || document;
+
+               // !context.createElement fails in IE with an error but returns typeof 'object'
+               if ( typeof context.createElement === "undefined" ) {
+                       context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
+               }
+
+               var ret = [], j;
+
+               for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+                       if ( typeof elem === "number" ) {
+                               elem += "";
+                       }
+
+                       if ( !elem ) {
+                               continue;
+                       }
+
+                       // Convert html string into DOM nodes
+                       if ( typeof elem === "string" ) {
+                               if ( !rhtml.test( elem ) ) {
+                                       elem = context.createTextNode( elem );
+                               } else {
+                                       // Fix "XHTML"-style tags in all browsers
+                                       elem = elem.replace(rxhtmlTag, "<$1></$2>");
+
+                                       // Trim whitespace, otherwise indexOf won't work as expected
+                                       var tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase(),
+                                               wrap = wrapMap[ tag ] || wrapMap._default,
+                                               depth = wrap[0],
+                                               div = context.createElement("div");
+
+                                       // Append wrapper element to unknown element safe doc fragment
+                                       if ( context === document ) {
+                                               // Use the fragment we've already created for this document
+                                               safeFragment.appendChild( div );
+                                       } else {
+                                               // Use a fragment created with the owner document
+                                               createSafeFragment( context ).appendChild( div );
+                                       }
+
+                                       // Go to html and back, then peel off extra wrappers
+                                       div.innerHTML = wrap[1] + elem + wrap[2];
+
+                                       // Move to the right depth
+                                       while ( depth-- ) {
+                                               div = div.lastChild;
+                                       }
+
+                                       // Remove IE's autoinserted <tbody> from table fragments
+                                       if ( !jQuery.support.tbody ) {
+
+                                               // String was a <table>, *may* have spurious <tbody>
+                                               var hasBody = rtbody.test(elem),
+                                                       tbody = tag === "table" && !hasBody ?
+                                                               div.firstChild && div.firstChild.childNodes :
+
+                                                               // String was a bare <thead> or <tfoot>
+                                                               wrap[1] === "<table>" && !hasBody ?
+                                                                       div.childNodes :
+                                                                       [];
+
+                                               for ( j = tbody.length - 1; j >= 0 ; --j ) {
+                                                       if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
+                                                               tbody[ j ].parentNode.removeChild( tbody[ j ] );
+                                                       }
+                                               }
+                                       }
+
+                                       // IE completely kills leading whitespace when innerHTML is used
+                                       if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
+                                               div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
+                                       }
+
+                                       elem = div.childNodes;
+                               }
+                       }
+
+                       // Resets defaultChecked for any radios and checkboxes
+                       // about to be appended to the DOM in IE 6/7 (#8060)
+                       var len;
+                       if ( !jQuery.support.appendChecked ) {
+                               if ( elem[0] && typeof (len = elem.length) === "number" ) {
+                                       for ( j = 0; j < len; j++ ) {
+                                               findInputs( elem[j] );
+                                       }
+                               } else {
+                                       findInputs( elem );
+                               }
+                       }
+
+                       if ( elem.nodeType ) {
+                               ret.push( elem );
+                       } else {
+                               ret = jQuery.merge( ret, elem );
+                       }
+               }
+
+               if ( fragment ) {
+                       checkScriptType = function( elem ) {
+                               return !elem.type || rscriptType.test( elem.type );
+                       };
+                       for ( i = 0; ret[i]; i++ ) {
+                               if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
+                                       scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
+
+                               } else {
+                                       if ( ret[i].nodeType === 1 ) {
+                                               var jsTags = jQuery.grep( ret[i].getElementsByTagName( "script" ), checkScriptType );
+
+                                               ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
+                                       }
+                                       fragment.appendChild( ret[i] );
+                               }
+                       }
+               }
+
+               return ret;
+       },
+
+       cleanData: function( elems ) {
+               var data, id,
+                       cache = jQuery.cache,
+                       special = jQuery.event.special,
+                       deleteExpando = jQuery.support.deleteExpando;
+
+               for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+                       if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
+                               continue;
+                       }
+
+                       id = elem[ jQuery.expando ];
+
+                       if ( id ) {
+                               data = cache[ id ];
+
+                               if ( data && data.events ) {
+                                       for ( var type in data.events ) {
+                                               if ( special[ type ] ) {
+                                                       jQuery.event.remove( elem, type );
+
+                                               // This is a shortcut to avoid jQuery.event.remove's overhead
+                                               } else {
+                                                       jQuery.removeEvent( elem, type, data.handle );
+                                               }
+                                       }
+
+                                       // Null the DOM reference to avoid IE6/7/8 leak (#7054)
+                                       if ( data.handle ) {
+                                               data.handle.elem = null;
+                                       }
+                               }
+
+                               if ( deleteExpando ) {
+                                       delete elem[ jQuery.expando ];
+
+                               } else if ( elem.removeAttribute ) {
+                                       elem.removeAttribute( jQuery.expando );
+                               }
+
+                               delete cache[ id ];
+                       }
+               }
+       }
+});
+
+function evalScript( i, elem ) {
+       if ( elem.src ) {
+               jQuery.ajax({
+                       url: elem.src,
+                       async: false,
+                       dataType: "script"
+               });
+       } else {
+               jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "/*$0*/" ) );
+       }
+
+       if ( elem.parentNode ) {
+               elem.parentNode.removeChild( elem );
+       }
+}
+
+
+
+
+var ralpha = /alpha\([^)]*\)/i,
+       ropacity = /opacity=([^)]*)/,
+       // fixed for IE9, see #8346
+       rupper = /([A-Z]|^ms)/g,
+       rnumpx = /^-?\d+(?:px)?$/i,
+       rnum = /^-?\d/,
+       rrelNum = /^([\-+])=([\-+.\de]+)/,
+
+       cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+       cssWidth = [ "Left", "Right" ],
+       cssHeight = [ "Top", "Bottom" ],
+       curCSS,
+
+       getComputedStyle,
+       currentStyle;
+
+jQuery.fn.css = function( name, value ) {
+       // Setting 'undefined' is a no-op
+       if ( arguments.length === 2 && value === undefined ) {
+               return this;
+       }
+
+       return jQuery.access( this, name, value, true, function( elem, name, value ) {
+               return value !== undefined ?
+                       jQuery.style( elem, name, value ) :
+                       jQuery.css( elem, name );
+       });
+};
+
+jQuery.extend({
+       // Add in style property hooks for overriding the default
+       // behavior of getting and setting a style property
+       cssHooks: {
+               opacity: {
+                       get: function( elem, computed ) {
+                               if ( computed ) {
+                                       // We should always get a number back from opacity
+                                       var ret = curCSS( elem, "opacity", "opacity" );
+                                       return ret === "" ? "1" : ret;
+
+                               } else {
+                                       return elem.style.opacity;
+                               }
+                       }
+               }
+       },
+
+       // Exclude the following css properties to add px
+       cssNumber: {
+               "fillOpacity": true,
+               "fontWeight": true,
+               "lineHeight": true,
+               "opacity": true,
+               "orphans": true,
+               "widows": true,
+               "zIndex": true,
+               "zoom": true
+       },
+
+       // Add in properties whose names you wish to fix before
+       // setting or getting the value
+       cssProps: {
+               // normalize float css property
+               "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
+       },
+
+       // Get and set the style property on a DOM Node
+       style: function( elem, name, value, extra ) {
+               // Don't set styles on text and comment nodes
+               if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
+                       return;
+               }
+
+               // Make sure that we're working with the right name
+               var ret, type, origName = jQuery.camelCase( name ),
+                       style = elem.style, hooks = jQuery.cssHooks[ origName ];
+
+               name = jQuery.cssProps[ origName ] || origName;
+
+               // Check if we're setting a value
+               if ( value !== undefined ) {
+                       type = typeof value;
+
+                       // convert relative number strings (+= or -=) to relative numbers. #7345
+                       if ( type === "string" && (ret = rrelNum.exec( value )) ) {
+                               value = ( +( ret[1] + 1) * +ret[2] ) + parseFloat( jQuery.css( elem, name ) );
+                               // Fixes bug #9237
+                               type = "number";
+                       }
+
+                       // Make sure that NaN and null values aren't set. See: #7116
+                       if ( value == null || type === "number" && isNaN( value ) ) {
+                               return;
+                       }
+
+                       // If a number was passed in, add 'px' to the (except for certain CSS properties)
+                       if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
+                               value += "px";
+                       }
+
+                       // If a hook was provided, use that value, otherwise just set the specified value
+                       if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {
+                               // Wrapped to prevent IE from throwing errors when 'invalid' values are provided
+                               // Fixes bug #5509
+                               try {
+                                       style[ name ] = value;
+                               } catch(e) {}
+                       }
+
+               } else {
+                       // If a hook was provided get the non-computed value from there
+                       if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
+                               return ret;
+                       }
+
+                       // Otherwise just get the value from the style object
+                       return style[ name ];
+               }
+       },
+
+       css: function( elem, name, extra ) {
+               var ret, hooks;
+
+               // Make sure that we're working with the right name
+               name = jQuery.camelCase( name );
+               hooks = jQuery.cssHooks[ name ];
+               name = jQuery.cssProps[ name ] || name;
+
+               // cssFloat needs a special treatment
+               if ( name === "cssFloat" ) {
+                       name = "float";
+               }
+
+               // If a hook was provided get the computed value from there
+               if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {
+                       return ret;
+
+               // Otherwise, if a way to get the computed value exists, use that
+               } else if ( curCSS ) {
+                       return curCSS( elem, name );
+               }
+       },
+
+       // A method for quickly swapping in/out CSS properties to get correct calculations
+       swap: function( elem, options, callback ) {
+               var old = {};
+
+               // Remember the old values, and insert the new ones
+               for ( var name in options ) {
+                       old[ name ] = elem.style[ name ];
+                       elem.style[ name ] = options[ name ];
+               }
+
+               callback.call( elem );
+
+               // Revert the old values
+               for ( name in options ) {
+                       elem.style[ name ] = old[ name ];
+               }
+       }
+});
+
+// DEPRECATED, Use jQuery.css() instead
+jQuery.curCSS = jQuery.css;
+
+jQuery.each(["height", "width"], function( i, name ) {
+       jQuery.cssHooks[ name ] = {
+               get: function( elem, computed, extra ) {
+                       var val;
+
+                       if ( computed ) {
+                               if ( elem.offsetWidth !== 0 ) {
+                                       return getWH( elem, name, extra );
+                               } else {
+                                       jQuery.swap( elem, cssShow, function() {
+                                               val = getWH( elem, name, extra );
+                                       });
+                               }
+
+                               return val;
+                       }
+               },
+
+               set: function( elem, value ) {
+                       if ( rnumpx.test( value ) ) {
+                               // ignore negative width and height values #1599
+                               value = parseFloat( value );
+
+                               if ( value >= 0 ) {
+                                       return value + "px";
+                               }
+
+                       } else {
+                               return value;
+                       }
+               }
+       };
+});
+
+if ( !jQuery.support.opacity ) {
+       jQuery.cssHooks.opacity = {
+               get: function( elem, computed ) {
+                       // IE uses filters for opacity
+                       return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
+                               ( parseFloat( RegExp.$1 ) / 100 ) + "" :
+                               computed ? "1" : "";
+               },
+
+               set: function( elem, value ) {
+                       var style = elem.style,
+                               currentStyle = elem.currentStyle,
+                               opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
+                               filter = currentStyle && currentStyle.filter || style.filter || "";
+
+                       // IE has trouble with opacity if it does not have layout
+                       // Force it by setting the zoom level
+                       style.zoom = 1;
+
+                       // if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
+                       if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" ) {
+
+                               // Setting style.filter to null, "" & " " still leave "filter:" in the cssText
+                               // if "filter:" is present at all, clearType is disabled, we want to avoid this
+                               // style.removeAttribute is IE Only, but so apparently is this code path...
+                               style.removeAttribute( "filter" );
+
+                               // if there there is no filter style applied in a css rule, we are done
+                               if ( currentStyle && !currentStyle.filter ) {
+                                       return;
+                               }
+                       }
+
+                       // otherwise, set new filter values
+                       style.filter = ralpha.test( filter ) ?
+                               filter.replace( ralpha, opacity ) :
+                               filter + " " + opacity;
+               }
+       };
+}
+
+jQuery(function() {
+       // This hook cannot be added until DOM ready because the support test
+       // for it is not run until after DOM ready
+       if ( !jQuery.support.reliableMarginRight ) {
+               jQuery.cssHooks.marginRight = {
+                       get: function( elem, computed ) {
+                               // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+                               // Work around by temporarily setting element display to inline-block
+                               var ret;
+                               jQuery.swap( elem, { "display": "inline-block" }, function() {
+                                       if ( computed ) {
+                                               ret = curCSS( elem, "margin-right", "marginRight" );
+                                       } else {
+                                               ret = elem.style.marginRight;
+                                       }
+                               });
+                               return ret;
+                       }
+               };
+       }
+});
+
+if ( document.defaultView && document.defaultView.getComputedStyle ) {
+       getComputedStyle = function( elem, name ) {
+               var ret, defaultView, computedStyle;
+
+               name = name.replace( rupper, "-$1" ).toLowerCase();
+
+               if ( !(defaultView = elem.ownerDocument.defaultView) ) {
+                       return undefined;
+               }
+
+               if ( (computedStyle = defaultView.getComputedStyle( elem, null )) ) {
+                       ret = computedStyle.getPropertyValue( name );
+                       if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
+                               ret = jQuery.style( elem, name );
+                       }
+               }
+
+               return ret;
+       };
+}
+
+if ( document.documentElement.currentStyle ) {
+       currentStyle = function( elem, name ) {
+               var left, rsLeft, uncomputed,
+                       ret = elem.currentStyle && elem.currentStyle[ name ],
+                       style = elem.style;
+
+               // Avoid setting ret to empty string here
+               // so we don't default to auto
+               if ( ret === null && style && (uncomputed = style[ name ]) ) {
+                       ret = uncomputed;
+               }
+
+               // From the awesome hack by Dean Edwards
+               // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
+
+               // If we're not dealing with a regular pixel number
+               // but a number that has a weird ending, we need to convert it to pixels
+               if ( !rnumpx.test( ret ) && rnum.test( ret ) ) {
+
+                       // Remember the original values
+                       left = style.left;
+                       rsLeft = elem.runtimeStyle && elem.runtimeStyle.left;
+
+                       // Put in the new values to get a computed value out
+                       if ( rsLeft ) {
+                               elem.runtimeStyle.left = elem.currentStyle.left;
+                       }
+                       style.left = name === "fontSize" ? "1em" : ( ret || 0 );
+                       ret = style.pixelLeft + "px";
+
+                       // Revert the changed values
+                       style.left = left;
+                       if ( rsLeft ) {
+                               elem.runtimeStyle.left = rsLeft;
+                       }
+               }
+
+               return ret === "" ? "auto" : ret;
+       };
+}
+
+curCSS = getComputedStyle || currentStyle;
+
+function getWH( elem, name, extra ) {
+
+       // Start with offset property
+       var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
+               which = name === "width" ? cssWidth : cssHeight;
+
+       if ( val > 0 ) {
+               if ( extra !== "border" ) {
+                       jQuery.each( which, function() {
+                               if ( !extra ) {
+                                       val -= parseFloat( jQuery.css( elem, "padding" + this ) ) || 0;
+                               }
+                               if ( extra === "margin" ) {
+                                       val += parseFloat( jQuery.css( elem, extra + this ) ) || 0;
+                               } else {
+                                       val -= parseFloat( jQuery.css( elem, "border" + this + "Width" ) ) || 0;
+                               }
+                       });
+               }
+
+               return val + "px";
+       }
+
+       // Fall back to computed then uncomputed css if necessary
+       val = curCSS( elem, name, name );
+       if ( val < 0 || val == null ) {
+               val = elem.style[ name ] || 0;
+       }
+       // Normalize "", auto, and prepare for extra
+       val = parseFloat( val ) || 0;
+
+       // Add padding, border, margin
+       if ( extra ) {
+               jQuery.each( which, function() {
+                       val += parseFloat( jQuery.css( elem, "padding" + this ) ) || 0;
+                       if ( extra !== "padding" ) {
+                               val += parseFloat( jQuery.css( elem, "border" + this + "Width" ) ) || 0;
+                       }
+                       if ( extra === "margin" ) {
+                               val += parseFloat( jQuery.css( elem, extra + this ) ) || 0;
+                       }
+               });
+       }
+
+       return val + "px";
+}
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+       jQuery.expr.filters.hidden = function( elem ) {
+               var width = elem.offsetWidth,
+                       height = elem.offsetHeight;
+
+               return ( width === 0 && height === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
+       };
+
+       jQuery.expr.filters.visible = function( elem ) {
+               return !jQuery.expr.filters.hidden( elem );
+       };
+}
+
+
+
+
+var r20 = /%20/g,
+       rbracket = /\[\]$/,
+       rCRLF = /\r?\n/g,
+       rhash = /#.*$/,
+       rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
+       rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
+       // #7653, #8125, #8152: local protocol detection
+       rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,
+       rnoContent = /^(?:GET|HEAD)$/,
+       rprotocol = /^\/\//,
+       rquery = /\?/,
+       rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
+       rselectTextarea = /^(?:select|textarea)/i,
+       rspacesAjax = /\s+/,
+       rts = /([?&])_=[^&]*/,
+       rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,
+
+       // Keep a copy of the old load method
+       _load = jQuery.fn.load,
+
+       /* Prefilters
+        * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
+        * 2) These are called:
+        *    - BEFORE asking for a transport
+        *    - AFTER param serialization (s.data is a string if s.processData is true)
+        * 3) key is the dataType
+        * 4) the catchall symbol "*" can be used
+        * 5) execution will start with transport dataType and THEN continue down to "*" if needed
+        */
+       prefilters = {},
+
+       /* Transports bindings
+        * 1) key is the dataType
+        * 2) the catchall symbol "*" can be used
+        * 3) selection will start with transport dataType and THEN go to "*" if needed
+        */
+       transports = {},
+
+       // Document location
+       ajaxLocation,
+
+       // Document location segments
+       ajaxLocParts,
+
+       // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
+       allTypes = ["*/"] + ["*"];
+
+// #8138, IE may throw an exception when accessing
+// a field from window.location if document.domain has been set
+try {
+       ajaxLocation = location.href;
+} catch( e ) {
+       // Use the href attribute of an A element
+       // since IE will modify it given document.location
+       ajaxLocation = document.createElement( "a" );
+       ajaxLocation.href = "";
+       ajaxLocation = ajaxLocation.href;
+}
+
+// Segment location into parts
+ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
+
+// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
+function addToPrefiltersOrTransports( structure ) {
+
+       // dataTypeExpression is optional and defaults to "*"
+       return function( dataTypeExpression, func ) {
+
+               if ( typeof dataTypeExpression !== "string" ) {
+                       func = dataTypeExpression;
+                       dataTypeExpression = "*";
+               }
+
+               if ( jQuery.isFunction( func ) ) {
+                       var dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ),
+                               i = 0,
+                               length = dataTypes.length,
+                               dataType,
+                               list,
+                               placeBefore;
+
+                       // For each dataType in the dataTypeExpression
+                       for ( ; i < length; i++ ) {
+                               dataType = dataTypes[ i ];
+                               // We control if we're asked to add before
+                               // any existing element
+                               placeBefore = /^\+/.test( dataType );
+                               if ( placeBefore ) {
+                                       dataType = dataType.substr( 1 ) || "*";
+                               }
+                               list = structure[ dataType ] = structure[ dataType ] || [];
+                               // then we add to the structure accordingly
+                               list[ placeBefore ? "unshift" : "push" ]( func );
+                       }
+               }
+       };
+}
+
+// Base inspection function for prefilters and transports
+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,
+               dataType /* internal */, inspected /* internal */ ) {
+
+       dataType = dataType || options.dataTypes[ 0 ];
+       inspected = inspected || {};
+
+       inspected[ dataType ] = true;
+
+       var list = structure[ dataType ],
+               i = 0,
+               length = list ? list.length : 0,
+               executeOnly = ( structure === prefilters ),
+               selection;
+
+       for ( ; i < length && ( executeOnly || !selection ); i++ ) {
+               selection = list[ i ]( options, originalOptions, jqXHR );
+               // If we got redirected to another dataType
+               // we try there if executing only and not done already
+               if ( typeof selection === "string" ) {
+                       if ( !executeOnly || inspected[ selection ] ) {
+                               selection = undefined;
+                       } else {
+                               options.dataTypes.unshift( selection );
+                               selection = inspectPrefiltersOrTransports(
+                                               structure, options, originalOptions, jqXHR, selection, inspected );
+                       }
+               }
+       }
+       // If we're only executing or nothing was selected
+       // we try the catchall dataType if not done already
+       if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
+               selection = inspectPrefiltersOrTransports(
+                               structure, options, originalOptions, jqXHR, "*", inspected );
+       }
+       // unnecessary when only executing (prefilters)
+       // but it'll be ignored by the caller in that case
+       return selection;
+}
+
+// A special extend for ajax options
+// that takes "flat" options (not to be deep extended)
+// Fixes #9887
+function ajaxExtend( target, src ) {
+       var key, deep,
+               flatOptions = jQuery.ajaxSettings.flatOptions || {};
+       for ( key in src ) {
+               if ( src[ key ] !== undefined ) {
+                       ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
+               }
+       }
+       if ( deep ) {
+               jQuery.extend( true, target, deep );
+       }
+}
+
+jQuery.fn.extend({
+       load: function( url, params, callback ) {
+               if ( typeof url !== "string" && _load ) {
+                       return _load.apply( this, arguments );
+
+               // Don't do a request if no elements are being requested
+               } else if ( !this.length ) {
+                       return this;
+               }
+
+               var off = url.indexOf( " " );
+               if ( off >= 0 ) {
+                       var selector = url.slice( off, url.length );
+                       url = url.slice( 0, off );
+               }
+
+               // Default to a GET request
+               var type = "GET";
+
+               // If the second parameter was provided
+               if ( params ) {
+                       // If it's a function
+                       if ( jQuery.isFunction( params ) ) {
+                               // We assume that it's the callback
+                               callback = params;
+                               params = undefined;
+
+                       // Otherwise, build a param string
+                       } else if ( typeof params === "object" ) {
+                               params = jQuery.param( params, jQuery.ajaxSettings.traditional );
+                               type = "POST";
+                       }
+               }
+
+               var self = this;
+
+               // Request the remote document
+               jQuery.ajax({
+                       url: url,
+                       type: type,
+                       dataType: "html",
+                       data: params,
+                       // Complete callback (responseText is used internally)
+                       complete: function( jqXHR, status, responseText ) {
+                               // Store the response as specified by the jqXHR object
+                               responseText = jqXHR.responseText;
+                               // If successful, inject the HTML into all the matched elements
+                               if ( jqXHR.isResolved() ) {
+                                       // #4825: Get the actual response in case
+                                       // a dataFilter is present in ajaxSettings
+                                       jqXHR.done(function( r ) {
+                                               responseText = r;
+                                       });
+                                       // See if a selector was specified
+                                       self.html( selector ?
+                                               // Create a dummy div to hold the results
+                                               jQuery("<div>")
+                                                       // inject the contents of the document in, removing the scripts
+                                                       // to avoid any 'Permission Denied' errors in IE
+                                                       .append(responseText.replace(rscript, ""))
+
+                                                       // Locate the specified elements
+                                                       .find(selector) :
+
+                                               // If not, just inject the full result
+                                               responseText );
+                               }
+
+                               if ( callback ) {
+                                       self.each( callback, [ responseText, status, jqXHR ] );
+                               }
+                       }
+               });
+
+               return this;
+       },
+
+       serialize: function() {
+               return jQuery.param( this.serializeArray() );
+       },
+
+       serializeArray: function() {
+               return this.map(function(){
+                       return this.elements ? jQuery.makeArray( this.elements ) : this;
+               })
+               .filter(function(){
+                       return this.name && !this.disabled &&
+                               ( this.checked || rselectTextarea.test( this.nodeName ) ||
+                                       rinput.test( this.type ) );
+               })
+               .map(function( i, elem ){
+                       var val = jQuery( this ).val();
+
+                       return val == null ?
+                               null :
+                               jQuery.isArray( val ) ?
+                                       jQuery.map( val, function( val, i ){
+                                               return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+                                       }) :
+                                       { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+               }).get();
+       }
+});
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
+       jQuery.fn[ o ] = function( f ){
+               return this.bind( o, f );
+       };
+});
+
+jQuery.each( [ "get", "post" ], function( i, method ) {
+       jQuery[ method ] = function( url, data, callback, type ) {
+               // shift arguments if data argument was omitted
+               if ( jQuery.isFunction( data ) ) {
+                       type = type || callback;
+                       callback = data;
+                       data = undefined;
+               }
+
+               return jQuery.ajax({
+                       type: method,
+                       url: url,
+                       data: data,
+                       success: callback,
+                       dataType: type
+               });
+       };
+});
+
+jQuery.extend({
+
+       getScript: function( url, callback ) {
+               return jQuery.get( url, undefined, callback, "script" );
+       },
+
+       getJSON: function( url, data, callback ) {
+               return jQuery.get( url, data, callback, "json" );
+       },
+
+       // Creates a full fledged settings object into target
+       // with both ajaxSettings and settings fields.
+       // If target is omitted, writes into ajaxSettings.
+       ajaxSetup: function( target, settings ) {
+               if ( settings ) {
+                       // Building a settings object
+                       ajaxExtend( target, jQuery.ajaxSettings );
+               } else {
+                       // Extending ajaxSettings
+                       settings = target;
+                       target = jQuery.ajaxSettings;
+               }
+               ajaxExtend( target, settings );
+               return target;
+       },
+
+       ajaxSettings: {
+               url: ajaxLocation,
+               isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
+               global: true,
+               type: "GET",
+               contentType: "application/x-www-form-urlencoded",
+               processData: true,
+               async: true,
+               /*
+               timeout: 0,
+               data: null,
+               dataType: null,
+               username: null,
+               password: null,
+               cache: null,
+               traditional: false,
+               headers: {},
+               */
+
+               accepts: {
+                       xml: "application/xml, text/xml",
+                       html: "text/html",
+                       text: "text/plain",
+                       json: "application/json, text/javascript",
+                       "*": allTypes
+               },
+
+               contents: {
+                       xml: /xml/,
+                       html: /html/,
+                       json: /json/
+               },
+
+               responseFields: {
+                       xml: "responseXML",
+                       text: "responseText"
+               },
+
+               // List of data converters
+               // 1) key format is "source_type destination_type" (a single space in-between)
+               // 2) the catchall symbol "*" can be used for source_type
+               converters: {
+
+                       // Convert anything to text
+                       "* text": window.String,
+
+                       // Text to html (true = no transformation)
+                       "text html": true,
+
+                       // Evaluate text as a json expression
+                       "text json": jQuery.parseJSON,
+
+                       // Parse text as xml
+                       "text xml": jQuery.parseXML
+               },
+
+               // For options that shouldn't be deep extended:
+               // you can add your own custom options here if
+               // and when you create one that shouldn't be
+               // deep extended (see ajaxExtend)
+               flatOptions: {
+                       context: true,
+                       url: true
+               }
+       },
+
+       ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
+       ajaxTransport: addToPrefiltersOrTransports( transports ),
+
+       // Main method
+       ajax: function( url, options ) {
+
+               // If url is an object, simulate pre-1.5 signature
+               if ( typeof url === "object" ) {
+                       options = url;
+                       url = undefined;
+               }
+
+               // Force options to be an object
+               options = options || {};
+
+               var // Create the final options object
+                       s = jQuery.ajaxSetup( {}, options ),
+                       // Callbacks context
+                       callbackContext = s.context || s,
+                       // Context for global events
+                       // It's the callbackContext if one was provided in the options
+                       // and if it's a DOM node or a jQuery collection
+                       globalEventContext = callbackContext !== s &&
+                               ( callbackContext.nodeType || callbackContext instanceof jQuery ) ?
+                                               jQuery( callbackContext ) : jQuery.event,
+                       // Deferreds
+                       deferred = jQuery.Deferred(),
+                       completeDeferred = jQuery.Callbacks( "once memory" ),
+                       // Status-dependent callbacks
+                       statusCode = s.statusCode || {},
+                       // ifModified key
+                       ifModifiedKey,
+                       // Headers (they are sent all at once)
+                       requestHeaders = {},
+                       requestHeadersNames = {},
+                       // Response headers
+                       responseHeadersString,
+                       responseHeaders,
+                       // transport
+                       transport,
+                       // timeout handle
+                       timeoutTimer,
+                       // Cross-domain detection vars
+                       parts,
+                       // The jqXHR state
+                       state = 0,
+                       // To know if global events are to be dispatched
+                       fireGlobals,
+                       // Loop variable
+                       i,
+                       // Fake xhr
+                       jqXHR = {
+
+                               readyState: 0,
+
+                               // Caches the header
+                               setRequestHeader: function( name, value ) {
+                                       if ( !state ) {
+                                               var lname = name.toLowerCase();
+                                               name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
+                                               requestHeaders[ name ] = value;
+                                       }
+                                       return this;
+                               },
+
+                               // Raw string
+                               getAllResponseHeaders: function() {
+                                       return state === 2 ? responseHeadersString : null;
+                               },
+
+                               // Builds headers hashtable if needed
+                               getResponseHeader: function( key ) {
+                                       var match;
+                                       if ( state === 2 ) {
+                                               if ( !responseHeaders ) {
+                                                       responseHeaders = {};
+                                                       while( ( match = rheaders.exec( responseHeadersString ) ) ) {
+                                                               responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
+                                                       }
+                                               }
+                                               match = responseHeaders[ key.toLowerCase() ];
+                                       }
+                                       return match === undefined ? null : match;
+                               },
+
+                               // Overrides response content-type header
+                               overrideMimeType: function( type ) {
+                                       if ( !state ) {
+                                               s.mimeType = type;
+                                       }
+                                       return this;
+                               },
+
+                               // Cancel the request
+                               abort: function( statusText ) {
+                                       statusText = statusText || "abort";
+                                       if ( transport ) {
+                                               transport.abort( statusText );
+                                       }
+                                       done( 0, statusText );
+                                       return this;
+                               }
+                       };
+
+               // Callback for when everything is done
+               // It is defined here because jslint complains if it is declared
+               // at the end of the function (which would be more logical and readable)
+               function done( status, nativeStatusText, responses, headers ) {
+
+                       // Called once
+                       if ( state === 2 ) {
+                               return;
+                       }
+
+                       // State is "done" now
+                       state = 2;
+
+                       // Clear timeout if it exists
+                       if ( timeoutTimer ) {
+                               clearTimeout( timeoutTimer );
+                       }
+
+                       // Dereference transport for early garbage collection
+                       // (no matter how long the jqXHR object will be used)
+                       transport = undefined;
+
+                       // Cache response headers
+                       responseHeadersString = headers || "";
+
+                       // Set readyState
+                       jqXHR.readyState = status > 0 ? 4 : 0;
+
+                       var isSuccess,
+                               success,
+                               error,
+                               statusText = nativeStatusText,
+                               response = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined,
+                               lastModified,
+                               etag;
+
+                       // If successful, handle type chaining
+                       if ( status >= 200 && status < 300 || status === 304 ) {
+
+                               // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+                               if ( s.ifModified ) {
+
+                                       if ( ( lastModified = jqXHR.getResponseHeader( "Last-Modified" ) ) ) {
+                                               jQuery.lastModified[ ifModifiedKey ] = lastModified;
+                                       }
+                                       if ( ( etag = jqXHR.getResponseHeader( "Etag" ) ) ) {
+                                               jQuery.etag[ ifModifiedKey ] = etag;
+                                       }
+                               }
+
+                               // If not modified
+                               if ( status === 304 ) {
+
+                                       statusText = "notmodified";
+                                       isSuccess = true;
+
+                               // If we have data
+                               } else {
+
+                                       try {
+                                               success = ajaxConvert( s, response );
+                                               statusText = "success";
+                                               isSuccess = true;
+                                       } catch(e) {
+                                               // We have a parsererror
+                                               statusText = "parsererror";
+                                               error = e;
+                                       }
+                               }
+                       } else {
+                               // We extract error from statusText
+                               // then normalize statusText and status for non-aborts
+                               error = statusText;
+                               if ( !statusText || status ) {
+                                       statusText = "error";
+                                       if ( status < 0 ) {
+                                               status = 0;
+                                       }
+                               }
+                       }
+
+                       // Set data for the fake xhr object
+                       jqXHR.status = status;
+                       jqXHR.statusText = "" + ( nativeStatusText || statusText );
+
+                       // Success/Error
+                       if ( isSuccess ) {
+                               deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
+                       } else {
+                               deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
+                       }
+
+                       // Status-dependent callbacks
+                       jqXHR.statusCode( statusCode );
+                       statusCode = undefined;
+
+                       if ( fireGlobals ) {
+                               globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
+                                               [ jqXHR, s, isSuccess ? success : error ] );
+                       }
+
+                       // Complete
+                       completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
+
+                       if ( fireGlobals ) {
+                               globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
+                               // Handle the global AJAX counter
+                               if ( !( --jQuery.active ) ) {
+                                       jQuery.event.trigger( "ajaxStop" );
+                               }
+                       }
+               }
+
+               // Attach deferreds
+               deferred.promise( jqXHR );
+               jqXHR.success = jqXHR.done;
+               jqXHR.error = jqXHR.fail;
+               jqXHR.complete = completeDeferred.add;
+
+               // Status-dependent callbacks
+               jqXHR.statusCode = function( map ) {
+                       if ( map ) {
+                               var tmp;
+                               if ( state < 2 ) {
+                                       for ( tmp in map ) {
+                                               statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
+                                       }
+                               } else {
+                                       tmp = map[ jqXHR.status ];
+                                       jqXHR.then( tmp, tmp );
+                               }
+                       }
+                       return this;
+               };
+
+               // Remove hash character (#7531: and string promotion)
+               // Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
+               // We also use the url parameter if available
+               s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
+
+               // Extract dataTypes list
+               s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( rspacesAjax );
+
+               // Determine if a cross-domain request is in order
+               if ( s.crossDomain == null ) {
+                       parts = rurl.exec( s.url.toLowerCase() );
+                       s.crossDomain = !!( parts &&
+                               ( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] ||
+                                       ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
+                                               ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
+                       );
+               }
+
+               // Convert data if not already a string
+               if ( s.data && s.processData && typeof s.data !== "string" ) {
+                       s.data = jQuery.param( s.data, s.traditional );
+               }
+
+               // Apply prefilters
+               inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
+
+               // If request was aborted inside a prefiler, stop there
+               if ( state === 2 ) {
+                       return false;
+               }
+
+               // We can fire global events as of now if asked to
+               fireGlobals = s.global;
+
+               // Uppercase the type
+               s.type = s.type.toUpperCase();
+
+               // Determine if request has content
+               s.hasContent = !rnoContent.test( s.type );
+
+               // Watch for a new set of requests
+               if ( fireGlobals && jQuery.active++ === 0 ) {
+                       jQuery.event.trigger( "ajaxStart" );
+               }
+
+               // More options handling for requests with no content
+               if ( !s.hasContent ) {
+
+                       // If data is available, append data to url
+                       if ( s.data ) {
+                               s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
+                               // #9682: remove data so that it's not used in an eventual retry
+                               delete s.data;
+                       }
+
+                       // Get ifModifiedKey before adding the anti-cache parameter
+                       ifModifiedKey = s.url;
+
+                       // Add anti-cache in url if needed
+                       if ( s.cache === false ) {
+
+                               var ts = jQuery.now(),
+                                       // try replacing _= if it is there
+                                       ret = s.url.replace( rts, "$1_=" + ts );
+
+                               // if nothing was replaced, add timestamp to the end
+                               s.url = ret + ( ( ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
+                       }
+               }
+
+               // Set the correct header, if data is being sent
+               if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
+                       jqXHR.setRequestHeader( "Content-Type", s.contentType );
+               }
+
+               // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+               if ( s.ifModified ) {
+                       ifModifiedKey = ifModifiedKey || s.url;
+                       if ( jQuery.lastModified[ ifModifiedKey ] ) {
+                               jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] );
+                       }
+                       if ( jQuery.etag[ ifModifiedKey ] ) {
+                               jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] );
+                       }
+               }
+
+               // Set the Accepts header for the server, depending on the dataType
+               jqXHR.setRequestHeader(
+                       "Accept",
+                       s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
+                               s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
+                               s.accepts[ "*" ]
+               );
+
+               // Check for headers option
+               for ( i in s.headers ) {
+                       jqXHR.setRequestHeader( i, s.headers[ i ] );
+               }
+
+               // Allow custom headers/mimetypes and early abort
+               if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
+                               // Abort if not done already
+                               jqXHR.abort();
+                               return false;
+
+               }
+
+               // Install callbacks on deferreds
+               for ( i in { success: 1, error: 1, complete: 1 } ) {
+                       jqXHR[ i ]( s[ i ] );
+               }
+
+               // Get transport
+               transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
+
+               // If no transport, we auto-abort
+               if ( !transport ) {
+                       done( -1, "No Transport" );
+               } else {
+                       jqXHR.readyState = 1;
+                       // Send global event
+                       if ( fireGlobals ) {
+                               globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
+                       }
+                       // Timeout
+                       if ( s.async && s.timeout > 0 ) {
+                               timeoutTimer = setTimeout( function(){
+                                       jqXHR.abort( "timeout" );
+                               }, s.timeout );
+                       }
+
+                       try {
+                               state = 1;
+                               transport.send( requestHeaders, done );
+                       } catch (e) {
+                               // Propagate exception as error if not done
+                               if ( state < 2 ) {
+                                       done( -1, e );
+                               // Simply rethrow otherwise
+                               } else {
+                                       jQuery.error( e );
+                               }
+                       }
+               }
+
+               return jqXHR;
+       },
+
+       // Serialize an array of form elements or a set of
+       // key/values into a query string
+       param: function( a, traditional ) {
+               var s = [],
+                       add = function( key, value ) {
+                               // If value is a function, invoke it and return its value
+                               value = jQuery.isFunction( value ) ? value() : value;
+                               s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
+                       };
+
+               // Set traditional to true for jQuery <= 1.3.2 behavior.
+               if ( traditional === undefined ) {
+                       traditional = jQuery.ajaxSettings.traditional;
+               }
+
+               // If an array was passed in, assume that it is an array of form elements.
+               if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
+                       // Serialize the form elements
+                       jQuery.each( a, function() {
+                               add( this.name, this.value );
+                       });
+
+               } else {
+                       // If traditional, encode the "old" way (the way 1.3.2 or older
+                       // did it), otherwise encode params recursively.
+                       for ( var prefix in a ) {
+                               buildParams( prefix, a[ prefix ], traditional, add );
+                       }
+               }
+
+               // Return the resulting serialization
+               return s.join( "&" ).replace( r20, "+" );
+       }
+});
+
+function buildParams( prefix, obj, traditional, add ) {
+       if ( jQuery.isArray( obj ) ) {
+               // Serialize array item.
+               jQuery.each( obj, function( i, v ) {
+                       if ( traditional || rbracket.test( prefix ) ) {
+                               // Treat each array item as a scalar.
+                               add( prefix, v );
+
+                       } else {
+                               // If array item is non-scalar (array or object), encode its
+                               // numeric index to resolve deserialization ambiguity issues.
+                               // Note that rack (as of 1.0.0) can't currently deserialize
+                               // nested arrays properly, and attempting to do so may cause
+                               // a server error. Possible fixes are to modify rack's
+                               // deserialization algorithm or to provide an option or flag
+                               // to force array serialization to be shallow.
+                               buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v, traditional, add );
+                       }
+               });
+
+       } else if ( !traditional && obj != null && typeof obj === "object" ) {
+               // Serialize object item.
+               for ( var name in obj ) {
+                       buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+               }
+
+       } else {
+               // Serialize scalar item.
+               add( prefix, obj );
+       }
+}
+
+// This is still on the jQuery object... for now
+// Want to move this to jQuery.ajax some day
+jQuery.extend({
+
+       // Counter for holding the number of active queries
+       active: 0,
+
+       // Last-Modified header cache for next request
+       lastModified: {},
+       etag: {}
+
+});
+
+/* Handles responses to an ajax request:
+ * - sets all responseXXX fields accordingly
+ * - finds the right dataType (mediates between content-type and expected dataType)
+ * - returns the corresponding response
+ */
+function ajaxHandleResponses( s, jqXHR, responses ) {
+
+       var contents = s.contents,
+               dataTypes = s.dataTypes,
+               responseFields = s.responseFields,
+               ct,
+               type,
+               finalDataType,
+               firstDataType;
+
+       // Fill responseXXX fields
+       for ( type in responseFields ) {
+               if ( type in responses ) {
+                       jqXHR[ responseFields[type] ] = responses[ type ];
+               }
+       }
+
+       // Remove auto dataType and get content-type in the process
+       while( dataTypes[ 0 ] === "*" ) {
+               dataTypes.shift();
+               if ( ct === undefined ) {
+                       ct = s.mimeType || jqXHR.getResponseHeader( "content-type" );
+               }
+       }
+
+       // Check if we're dealing with a known content-type
+       if ( ct ) {
+               for ( type in contents ) {
+                       if ( contents[ type ] && contents[ type ].test( ct ) ) {
+                               dataTypes.unshift( type );
+                               break;
+                       }
+               }
+       }
+
+       // Check to see if we have a response for the expected dataType
+       if ( dataTypes[ 0 ] in responses ) {
+               finalDataType = dataTypes[ 0 ];
+       } else {
+               // Try convertible dataTypes
+               for ( type in responses ) {
+                       if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
+                               finalDataType = type;
+                               break;
+                       }
+                       if ( !firstDataType ) {
+                               firstDataType = type;
+                       }
+               }
+               // Or just use first one
+               finalDataType = finalDataType || firstDataType;
+       }
+
+       // If we found a dataType
+       // We add the dataType to the list if needed
+       // and return the corresponding response
+       if ( finalDataType ) {
+               if ( finalDataType !== dataTypes[ 0 ] ) {
+                       dataTypes.unshift( finalDataType );
+               }
+               return responses[ finalDataType ];
+       }
+}
+
+// Chain conversions given the request and the original response
+function ajaxConvert( s, response ) {
+
+       // Apply the dataFilter if provided
+       if ( s.dataFilter ) {
+               response = s.dataFilter( response, s.dataType );
+       }
+
+       var dataTypes = s.dataTypes,
+               converters = {},
+               i,
+               key,
+               length = dataTypes.length,
+               tmp,
+               // Current and previous dataTypes
+               current = dataTypes[ 0 ],
+               prev,
+               // Conversion expression
+               conversion,
+               // Conversion function
+               conv,
+               // Conversion functions (transitive conversion)
+               conv1,
+               conv2;
+
+       // For each dataType in the chain
+       for ( i = 1; i < length; i++ ) {
+
+               // Create converters map
+               // with lowercased keys
+               if ( i === 1 ) {
+                       for ( key in s.converters ) {
+                               if ( typeof key === "string" ) {
+                                       converters[ key.toLowerCase() ] = s.converters[ key ];
+                               }
+                       }
+               }
+
+               // Get the dataTypes
+               prev = current;
+               current = dataTypes[ i ];
+
+               // If current is auto dataType, update it to prev
+               if ( current === "*" ) {
+                       current = prev;
+               // If no auto and dataTypes are actually different
+               } else if ( prev !== "*" && prev !== current ) {
+
+                       // Get the converter
+                       conversion = prev + " " + current;
+                       conv = converters[ conversion ] || converters[ "* " + current ];
+
+                       // If there is no direct converter, search transitively
+                       if ( !conv ) {
+                               conv2 = undefined;
+                               for ( conv1 in converters ) {
+                                       tmp = conv1.split( " " );
+                                       if ( tmp[ 0 ] === prev || tmp[ 0 ] === "*" ) {
+                                               conv2 = converters[ tmp[1] + " " + current ];
+                                               if ( conv2 ) {
+                                                       conv1 = converters[ conv1 ];
+                                                       if ( conv1 === true ) {
+                                                               conv = conv2;
+                                                       } else if ( conv2 === true ) {
+                                                               conv = conv1;
+                                                       }
+                                                       break;
+                                               }
+                                       }
+                               }
+                       }
+                       // If we found no converter, dispatch an error
+                       if ( !( conv || conv2 ) ) {
+                               jQuery.error( "No conversion from " + conversion.replace(" "," to ") );
+                       }
+                       // If found converter is not an equivalence
+                       if ( conv !== true ) {
+                               // Convert with 1 or 2 converters accordingly
+                               response = conv ? conv( response ) : conv2( conv1(response) );
+                       }
+               }
+       }
+       return response;
+}
+
+
+
+
+var jsc = jQuery.now(),
+       jsre = /(\=)\?(&|$)|\?\?/i;
+
+// Default jsonp settings
+jQuery.ajaxSetup({
+       jsonp: "callback",
+       jsonpCallback: function() {
+               return jQuery.expando + "_" + ( jsc++ );
+       }
+});
+
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+       var inspectData = s.contentType === "application/x-www-form-urlencoded" &&
+               ( typeof s.data === "string" );
+
+       if ( s.dataTypes[ 0 ] === "jsonp" ||
+               s.jsonp !== false && ( jsre.test( s.url ) ||
+                               inspectData && jsre.test( s.data ) ) ) {
+
+               var responseContainer,
+                       jsonpCallback = s.jsonpCallback =
+                               jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,
+                       previous = window[ jsonpCallback ],
+                       url = s.url,
+                       data = s.data,
+                       replace = "$1" + jsonpCallback + "$2";
+
+               if ( s.jsonp !== false ) {
+                       url = url.replace( jsre, replace );
+                       if ( s.url === url ) {
+                               if ( inspectData ) {
+                                       data = data.replace( jsre, replace );
+                               }
+                               if ( s.data === data ) {
+                                       // Add callback manually
+                                       url += (/\?/.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback;
+                               }
+                       }
+               }
+
+               s.url = url;
+               s.data = data;
+
+               // Install callback
+               window[ jsonpCallback ] = function( response ) {
+                       responseContainer = [ response ];
+               };
+
+               // Clean-up function
+               jqXHR.always(function() {
+                       // Set callback back to previous value
+                       window[ jsonpCallback ] = previous;
+                       // Call if it was a function and we have a response
+                       if ( responseContainer && jQuery.isFunction( previous ) ) {
+                               window[ jsonpCallback ]( responseContainer[ 0 ] );
+                       }
+               });
+
+               // Use data converter to retrieve json after script execution
+               s.converters["script json"] = function() {
+                       if ( !responseContainer ) {
+                               jQuery.error( jsonpCallback + " was not called" );
+                       }
+                       return responseContainer[ 0 ];
+               };
+
+               // force json dataType
+               s.dataTypes[ 0 ] = "json";
+
+               // Delegate to script
+               return "script";
+       }
+});
+
+
+
+
+// Install script dataType
+jQuery.ajaxSetup({
+       accepts: {
+               script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
+       },
+       contents: {
+               script: /javascript|ecmascript/
+       },
+       converters: {
+               "text script": function( text ) {
+                       jQuery.globalEval( text );
+                       return text;
+               }
+       }
+});
+
+// Handle cache's special case and global
+jQuery.ajaxPrefilter( "script", function( s ) {
+       if ( s.cache === undefined ) {
+               s.cache = false;
+       }
+       if ( s.crossDomain ) {
+               s.type = "GET";
+               s.global = false;
+       }
+});
+
+// Bind script tag hack transport
+jQuery.ajaxTransport( "script", function(s) {
+
+       // This transport only deals with cross domain requests
+       if ( s.crossDomain ) {
+
+               var script,
+                       head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
+
+               return {
+
+                       send: function( _, callback ) {
+
+                               script = document.createElement( "script" );
+
+                               script.async = "async";
+
+                               if ( s.scriptCharset ) {
+                                       script.charset = s.scriptCharset;
+                               }
+
+                               script.src = s.url;
+
+                               // Attach handlers for all browsers
+                               script.onload = script.onreadystatechange = function( _, isAbort ) {
+
+                                       if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
+
+                                               // Handle memory leak in IE
+                                               script.onload = script.onreadystatechange = null;
+
+                                               // Remove the script
+                                               if ( head && script.parentNode ) {
+                                                       head.removeChild( script );
+                                               }
+
+                                               // Dereference the script
+                                               script = undefined;
+
+                                               // Callback if not abort
+                                               if ( !isAbort ) {
+                                                       callback( 200, "success" );
+                                               }
+                                       }
+                               };
+                               // Use insertBefore instead of appendChild  to circumvent an IE6 bug.
+                               // This arises when a base node is used (#2709 and #4378).
+                               head.insertBefore( script, head.firstChild );
+                       },
+
+                       abort: function() {
+                               if ( script ) {
+                                       script.onload( 0, 1 );
+                               }
+                       }
+               };
+       }
+});
+
+
+
+
+var // #5280: Internet Explorer will keep connections alive if we don't abort on unload
+       xhrOnUnloadAbort = window.ActiveXObject ? function() {
+               // Abort all pending requests
+               for ( var key in xhrCallbacks ) {
+                       xhrCallbacks[ key ]( 0, 1 );
+               }
+       } : false,
+       xhrId = 0,
+       xhrCallbacks;
+
+// Functions to create xhrs
+function createStandardXHR() {
+       try {
+               return new window.XMLHttpRequest();
+       } catch( e ) {}
+}
+
+function createActiveXHR() {
+       try {
+               return new window.ActiveXObject( "Microsoft.XMLHTTP" );
+       } catch( e ) {}
+}
+
+// Create the request object
+// (This is still attached to ajaxSettings for backward compatibility)
+jQuery.ajaxSettings.xhr = window.ActiveXObject ?
+       /* Microsoft failed to properly
+        * implement the XMLHttpRequest in IE7 (can't request local files),
+        * so we use the ActiveXObject when it is available
+        * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
+        * we need a fallback.
+        */
+       function() {
+               return !this.isLocal && createStandardXHR() || createActiveXHR();
+       } :
+       // For all other browsers, use the standard XMLHttpRequest object
+       createStandardXHR;
+
+// Determine support properties
+(function( xhr ) {
+       jQuery.extend( jQuery.support, {
+               ajax: !!xhr,
+               cors: !!xhr && ( "withCredentials" in xhr )
+       });
+})( jQuery.ajaxSettings.xhr() );
+
+// Create transport if the browser can provide an xhr
+if ( jQuery.support.ajax ) {
+
+       jQuery.ajaxTransport(function( s ) {
+               // Cross domain only allowed if supported through XMLHttpRequest
+               if ( !s.crossDomain || jQuery.support.cors ) {
+
+                       var callback;
+
+                       return {
+                               send: function( headers, complete ) {
+
+                                       // Get a new xhr
+                                       var xhr = s.xhr(),
+                                               handle,
+                                               i;
+
+                                       // Open the socket
+                                       // Passing null username, generates a login popup on Opera (#2865)
+                                       if ( s.username ) {
+                                               xhr.open( s.type, s.url, s.async, s.username, s.password );
+                                       } else {
+                                               xhr.open( s.type, s.url, s.async );
+                                       }
+
+                                       // Apply custom fields if provided
+                                       if ( s.xhrFields ) {
+                                               for ( i in s.xhrFields ) {
+                                                       xhr[ i ] = s.xhrFields[ i ];
+                                               }
+                                       }
+
+                                       // Override mime type if needed
+                                       if ( s.mimeType && xhr.overrideMimeType ) {
+                                               xhr.overrideMimeType( s.mimeType );
+                                       }
+
+                                       // X-Requested-With header
+                                       // For cross-domain requests, seeing as conditions for a preflight are
+                                       // akin to a jigsaw puzzle, we simply never set it to be sure.
+                                       // (it can always be set on a per-request basis or even using ajaxSetup)
+                                       // For same-domain requests, won't change header if already provided.
+                                       if ( !s.crossDomain && !headers["X-Requested-With"] ) {
+                                               headers[ "X-Requested-With" ] = "XMLHttpRequest";
+                                       }
+
+                                       // Need an extra try/catch for cross domain requests in Firefox 3
+                                       try {
+                                               for ( i in headers ) {
+                                                       xhr.setRequestHeader( i, headers[ i ] );
+                                               }
+                                       } catch( _ ) {}
+
+                                       // Do send the request
+                                       // This may raise an exception which is actually
+                                       // handled in jQuery.ajax (so no try/catch here)
+                                       xhr.send( ( s.hasContent && s.data ) || null );
+
+                                       // Listener
+                                       callback = function( _, isAbort ) {
+
+                                               var status,
+                                                       statusText,
+                                                       responseHeaders,
+                                                       responses,
+                                                       xml;
+
+                                               // Firefox throws exceptions when accessing properties
+                                               // of an xhr when a network error occured
+                                               // http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
+                                               try {
+
+                                                       // Was never called and is aborted or complete
+                                                       if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
+
+                                                               // Only called once
+                                                               callback = undefined;
+
+                                                               // Do not keep as active anymore
+                                                               if ( handle ) {
+                                                                       xhr.onreadystatechange = jQuery.noop;
+                                                                       if ( xhrOnUnloadAbort ) {
+                                                                               delete xhrCallbacks[ handle ];
+                                                                       }
+                                                               }
+
+                                                               // If it's an abort
+                                                               if ( isAbort ) {
+                                                                       // Abort it manually if needed
+                                                                       if ( xhr.readyState !== 4 ) {
+                                                                               xhr.abort();
+                                                                       }
+                                                               } else {
+                                                                       status = xhr.status;
+                                                                       responseHeaders = xhr.getAllResponseHeaders();
+                                                                       responses = {};
+                                                                       xml = xhr.responseXML;
+
+                                                                       // Construct response list
+                                                                       if ( xml && xml.documentElement /* #4958 */ ) {
+                                                                               responses.xml = xml;
+                                                                       }
+                                                                       responses.text = xhr.responseText;
+
+                                                                       // Firefox throws an exception when accessing
+                                                                       // statusText for faulty cross-domain requests
+                                                                       try {
+                                                                               statusText = xhr.statusText;
+                                                                       } catch( e ) {
+                                                                               // We normalize with Webkit giving an empty statusText
+                                                                               statusText = "";
+                                                                       }
+
+                                                                       // Filter status for non standard behaviors
+
+                                                                       // If the request is local and we have data: assume a success
+                                                                       // (success with no data won't get notified, that's the best we
+                                                                       // can do given current implementations)
+                                                                       if ( !status && s.isLocal && !s.crossDomain ) {
+                                                                               status = responses.text ? 200 : 404;
+                                                                       // IE - #1450: sometimes returns 1223 when it should be 204
+                                                                       } else if ( status === 1223 ) {
+                                                                               status = 204;
+                                                                       }
+                                                               }
+                                                       }
+                                               } catch( firefoxAccessException ) {
+                                                       if ( !isAbort ) {
+                                                               complete( -1, firefoxAccessException );
+                                                       }
+                                               }
+
+                                               // Call complete if needed
+                                               if ( responses ) {
+                                                       complete( status, statusText, responses, responseHeaders );
+                                               }
+                                       };
+
+                                       // if we're in sync mode or it's in cache
+                                       // and has been retrieved directly (IE6 & IE7)
+                                       // we need to manually fire the callback
+                                       if ( !s.async || xhr.readyState === 4 ) {
+                                               callback();
+                                       } else {
+                                               handle = ++xhrId;
+                                               if ( xhrOnUnloadAbort ) {
+                                                       // Create the active xhrs callbacks list if needed
+                                                       // and attach the unload handler
+                                                       if ( !xhrCallbacks ) {
+                                                               xhrCallbacks = {};
+                                                               jQuery( window ).unload( xhrOnUnloadAbort );
+                                                       }
+                                                       // Add to list of active xhrs callbacks
+                                                       xhrCallbacks[ handle ] = callback;
+                                               }
+                                               xhr.onreadystatechange = callback;
+                                       }
+                               },
+
+                               abort: function() {
+                                       if ( callback ) {
+                                               callback(0,1);
+                                       }
+                               }
+                       };
+               }
+       });
+}
+
+
+
+
+var elemdisplay = {},
+       iframe, iframeDoc,
+       rfxtypes = /^(?:toggle|show|hide)$/,
+       rfxnum = /^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,
+       timerId,
+       fxAttrs = [
+               // height animations
+               [ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
+               // width animations
+               [ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
+               // opacity animations
+               [ "opacity" ]
+       ],
+       fxNow;
+
+jQuery.fn.extend({
+       show: function( speed, easing, callback ) {
+               var elem, display;
+
+               if ( speed || speed === 0 ) {
+                       return this.animate( genFx("show", 3), speed, easing, callback );
+
+               } else {
+                       for ( var i = 0, j = this.length; i < j; i++ ) {
+                               elem = this[ i ];
+
+                               if ( elem.style ) {
+                                       display = elem.style.display;
+
+                                       // Reset the inline display of this element to learn if it is
+                                       // being hidden by cascaded rules or not
+                                       if ( !jQuery._data(elem, "olddisplay") && display === "none" ) {
+                                               display = elem.style.display = "";
+                                       }
+
+                                       // Set elements which have been overridden with display: none
+                                       // in a stylesheet to whatever the default browser style is
+                                       // for such an element
+                                       if ( display === "" && jQuery.css(elem, "display") === "none" ) {
+                                               jQuery._data( elem, "olddisplay", defaultDisplay(elem.nodeName) );
+                                       }
+                               }
+                       }
+
+                       // Set the display of most of the elements in a second loop
+                       // to avoid the constant reflow
+                       for ( i = 0; i < j; i++ ) {
+                               elem = this[ i ];
+
+                               if ( elem.style ) {
+                                       display = elem.style.display;
+
+                                       if ( display === "" || display === "none" ) {
+                                               elem.style.display = jQuery._data( elem, "olddisplay" ) || "";
+                                       }
+                               }
+                       }
+
+                       return this;
+               }
+       },
+
+       hide: function( speed, easing, callback ) {
+               if ( speed || speed === 0 ) {
+                       return this.animate( genFx("hide", 3), speed, easing, callback);
+
+               } else {
+                       var elem, display,
+                               i = 0,
+                               j = this.length;
+
+                       for ( ; i < j; i++ ) {
+                               elem = this[i];
+                               if ( elem.style ) {
+                                       display = jQuery.css( elem, "display" );
+
+                                       if ( display !== "none" && !jQuery._data( elem, "olddisplay" ) ) {
+                                               jQuery._data( elem, "olddisplay", display );
+                                       }
+                               }
+                       }
+
+                       // Set the display of the elements in a second loop
+                       // to avoid the constant reflow
+                       for ( i = 0; i < j; i++ ) {
+                               if ( this[i].style ) {
+                                       this[i].style.display = "none";
+                               }
+                       }
+
+                       return this;
+               }
+       },
+
+       // Save the old toggle function
+       _toggle: jQuery.fn.toggle,
+
+       toggle: function( fn, fn2, callback ) {
+               var bool = typeof fn === "boolean";
+
+               if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {
+                       this._toggle.apply( this, arguments );
+
+               } else if ( fn == null || bool ) {
+                       this.each(function() {
+                               var state = bool ? fn : jQuery(this).is(":hidden");
+                               jQuery(this)[ state ? "show" : "hide" ]();
+                       });
+
+               } else {
+                       this.animate(genFx("toggle", 3), fn, fn2, callback);
+               }
+
+               return this;
+       },
+
+       fadeTo: function( speed, to, easing, callback ) {
+               return this.filter(":hidden").css("opacity", 0).show().end()
+                                       .animate({opacity: to}, speed, easing, callback);
+       },
+
+       animate: function( prop, speed, easing, callback ) {
+               var optall = jQuery.speed( speed, easing, callback );
+
+               if ( jQuery.isEmptyObject( prop ) ) {
+                       return this.each( optall.complete, [ false ] );
+               }
+
+               // Do not change referenced properties as per-property easing will be lost
+               prop = jQuery.extend( {}, prop );
+
+               function doAnimation() {
+                       // XXX 'this' does not always have a nodeName when running the
+                       // test suite
+
+                       if ( optall.queue === false ) {
+                               jQuery._mark( this );
+                       }
+
+                       var opt = jQuery.extend( {}, optall ),
+                               isElement = this.nodeType === 1,
+                               hidden = isElement && jQuery(this).is(":hidden"),
+                               name, val, p, e,
+                               parts, start, end, unit,
+                               method;
+
+                       // will store per property easing and be used to determine when an animation is complete
+                       opt.animatedProperties = {};
+
+                       for ( p in prop ) {
+
+                               // property name normalization
+                               name = jQuery.camelCase( p );
+                               if ( p !== name ) {
+                                       prop[ name ] = prop[ p ];
+                                       delete prop[ p ];
+                               }
+
+                               val = prop[ name ];
+
+                               // easing resolution: per property > opt.specialEasing > opt.easing > 'swing' (default)
+                               if ( jQuery.isArray( val ) ) {
+                                       opt.animatedProperties[ name ] = val[ 1 ];
+                                       val = prop[ name ] = val[ 0 ];
+                               } else {
+                                       opt.animatedProperties[ name ] = opt.specialEasing && opt.specialEasing[ name ] || opt.easing || 'swing';
+                               }
+
+                               if ( val === "hide" && hidden || val === "show" && !hidden ) {
+                                       return opt.complete.call( this );
+                               }
+
+                               if ( isElement && ( name === "height" || name === "width" ) ) {
+                                       // Make sure that nothing sneaks out
+                                       // Record all 3 overflow attributes because IE does not
+                                       // change the overflow attribute when overflowX and
+                                       // overflowY are set to the same value
+                                       opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];
+
+                                       // Set display property to inline-block for height/width
+                                       // animations on inline elements that are having width/height animated
+                                       if ( jQuery.css( this, "display" ) === "inline" &&
+                                                       jQuery.css( this, "float" ) === "none" ) {
+
+                                               // inline-level elements accept inline-block;
+                                               // block-level elements need to be inline with layout
+                                               if ( !jQuery.support.inlineBlockNeedsLayout || defaultDisplay( this.nodeName ) === "inline" ) {
+                                                       this.style.display = "inline-block";
+
+                                               } else {
+                                                       this.style.zoom = 1;
+                                               }
+                                       }
+                               }
+                       }
+
+                       if ( opt.overflow != null ) {
+                               this.style.overflow = "hidden";
+                       }
+
+                       for ( p in prop ) {
+                               e = new jQuery.fx( this, opt, p );
+                               val = prop[ p ];
+
+                               if ( rfxtypes.test( val ) ) {
+
+                                       // Tracks whether to show or hide based on private
+                                       // data attached to the element
+                                       method = jQuery._data( this, "toggle" + p ) || ( val === "toggle" ? hidden ? "show" : "hide" : 0 );
+                                       if ( method ) {
+                                               jQuery._data( this, "toggle" + p, method === "show" ? "hide" : "show" );
+                                               e[ method ]();
+                                       } else {
+                                               e[ val ]();
+                                       }
+
+                               } else {
+                                       parts = rfxnum.exec( val );
+                                       start = e.cur();
+
+                                       if ( parts ) {
+                                               end = parseFloat( parts[2] );
+                                               unit = parts[3] || ( jQuery.cssNumber[ p ] ? "" : "px" );
+
+                                               // We need to compute starting value
+                                               if ( unit !== "px" ) {
+                                                       jQuery.style( this, p, (end || 1) + unit);
+                                                       start = ( (end || 1) / e.cur() ) * start;
+                                                       jQuery.style( this, p, start + unit);
+                                               }
+
+                                               // If a +=/-= token was provided, we're doing a relative animation
+                                               if ( parts[1] ) {
+                                                       end = ( (parts[ 1 ] === "-=" ? -1 : 1) * end ) + start;
+                                               }
+
+                                               e.custom( start, end, unit );
+
+                                       } else {
+                                               e.custom( start, val, "" );
+                                       }
+                               }
+                       }
+
+                       // For JS strict compliance
+                       return true;
+               }
+
+               return optall.queue === false ?
+                       this.each( doAnimation ) :
+                       this.queue( optall.queue, doAnimation );
+       },
+
+       stop: function( type, clearQueue, gotoEnd ) {
+               if ( typeof type !== "string" ) {
+                       gotoEnd = clearQueue;
+                       clearQueue = type;
+                       type = undefined;
+               }
+               if ( clearQueue && type !== false ) {
+                       this.queue( type || "fx", [] );
+               }
+
+               return this.each(function() {
+                       var i,
+                               hadTimers = false,
+                               timers = jQuery.timers,
+                               data = jQuery._data( this );
+
+                       // clear marker counters if we know they won't be
+                       if ( !gotoEnd ) {
+                               jQuery._unmark( true, this );
+                       }
+
+                       function stopQueue( elem, data, i ) {
+                               var hooks = data[ i ];
+                               jQuery.removeData( elem, i, true );
+                               hooks.stop( gotoEnd );
+                       }
+
+                       if ( type == null ) {
+                               for ( i in data ) {
+                                       if ( data[ i ].stop && i.indexOf(".run") === i.length - 4 ) {
+                                               stopQueue( this, data, i );
+                                       }
+                               }
+                       } else if ( data[ i = type + ".run" ] && data[ i ].stop ){
+                               stopQueue( this, data, i );
+                       }
+
+                       for ( i = timers.length; i--; ) {
+                               if ( timers[ i ].elem === this && (type == null || timers[ i ].queue === type) ) {
+                                       if ( gotoEnd ) {
+
+                                               // force the next step to be the last
+                                               timers[ i ]( true );
+                                       } else {
+                                               timers[ i ].saveState();
+                                       }
+                                       hadTimers = true;
+                                       timers.splice( i, 1 );
+                               }
+                       }
+
+                       // start the next in the queue if the last step wasn't forced
+                       // timers currently will call their complete callbacks, which will dequeue
+                       // but only if they were gotoEnd
+                       if ( !( gotoEnd && hadTimers ) ) {
+                               jQuery.dequeue( this, type );
+                       }
+               });
+       }
+
+});
+
+// Animations created synchronously will run synchronously
+function createFxNow() {
+       setTimeout( clearFxNow, 0 );
+       return ( fxNow = jQuery.now() );
+}
+
+function clearFxNow() {
+       fxNow = undefined;
+}
+
+// Generate parameters to create a standard animation
+function genFx( type, num ) {
+       var obj = {};
+
+       jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice( 0, num )), function() {
+               obj[ this ] = type;
+       });
+
+       return obj;
+}
+
+// Generate shortcuts for custom animations
+jQuery.each({
+       slideDown: genFx( "show", 1 ),
+       slideUp: genFx( "hide", 1 ),
+       slideToggle: genFx( "toggle", 1 ),
+       fadeIn: { opacity: "show" },
+       fadeOut: { opacity: "hide" },
+       fadeToggle: { opacity: "toggle" }
+}, function( name, props ) {
+       jQuery.fn[ name ] = function( speed, easing, callback ) {
+               return this.animate( props, speed, easing, callback );
+       };
+});
+
+jQuery.extend({
+       speed: function( speed, easing, fn ) {
+               var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
+                       complete: fn || !fn && easing ||
+                               jQuery.isFunction( speed ) && speed,
+                       duration: speed,
+                       easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
+               };
+
+               opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
+                       opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
+
+               // normalize opt.queue - true/undefined/null -> "fx"
+               if ( opt.queue == null || opt.queue === true ) {
+                       opt.queue = "fx";
+               }
+
+               // Queueing
+               opt.old = opt.complete;
+
+               opt.complete = function( noUnmark ) {
+                       if ( jQuery.isFunction( opt.old ) ) {
+                               opt.old.call( this );
+                       }
+
+                       if ( opt.queue ) {
+                               jQuery.dequeue( this, opt.queue );
+                       } else if ( noUnmark !== false ) {
+                               jQuery._unmark( this );
+                       }
+               };
+
+               return opt;
+       },
+
+       easing: {
+               linear: function( p, n, firstNum, diff ) {
+                       return firstNum + diff * p;
+               },
+               swing: function( p, n, firstNum, diff ) {
+                       return ( ( -Math.cos( p*Math.PI ) / 2 ) + 0.5 ) * diff + firstNum;
+               }
+       },
+
+       timers: [],
+
+       fx: function( elem, options, prop ) {
+               this.options = options;
+               this.elem = elem;
+               this.prop = prop;
+
+               options.orig = options.orig || {};
+       }
+
+});
+
+jQuery.fx.prototype = {
+       // Simple function for setting a style value
+       update: function() {
+               if ( this.options.step ) {
+                       this.options.step.call( this.elem, this.now, this );
+               }
+
+               ( jQuery.fx.step[ this.prop ] || jQuery.fx.step._default )( this );
+       },
+
+       // Get the current size
+       cur: function() {
+               if ( this.elem[ this.prop ] != null && (!this.elem.style || this.elem.style[ this.prop ] == null) ) {
+                       return this.elem[ this.prop ];
+               }
+
+               var parsed,
+                       r = jQuery.css( this.elem, this.prop );
+               // Empty strings, null, undefined and "auto" are converted to 0,
+               // complex values such as "rotate(1rad)" are returned as is,
+               // simple values such as "10px" are parsed to Float.
+               return isNaN( parsed = parseFloat( r ) ) ? !r || r === "auto" ? 0 : r : parsed;
+       },
+
+       // Start an animation from one number to another
+       custom: function( from, to, unit ) {
+               var self = this,
+                       fx = jQuery.fx;
+
+               this.startTime = fxNow || createFxNow();
+               this.end = to;
+               this.now = this.start = from;
+               this.pos = this.state = 0;
+               this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? "" : "px" );
+
+               function t( gotoEnd ) {
+                       return self.step( gotoEnd );
+               }
+
+               t.queue = this.options.queue;
+               t.elem = this.elem;
+               t.saveState = function() {
+                       if ( self.options.hide && jQuery._data( self.elem, "fxshow" + self.prop ) === undefined ) {
+                               jQuery._data( self.elem, "fxshow" + self.prop, self.start );
+                       }
+               };
+
+               if ( t() && jQuery.timers.push(t) && !timerId ) {
+                       timerId = setInterval( fx.tick, fx.interval );
+               }
+       },
+
+       // Simple 'show' function
+       show: function() {
+               var dataShow = jQuery._data( this.elem, "fxshow" + this.prop );
+
+               // Remember where we started, so that we can go back to it later
+               this.options.orig[ this.prop ] = dataShow || jQuery.style( this.elem, this.prop );
+               this.options.show = true;
+
+               // Begin the animation
+               // Make sure that we start at a small width/height to avoid any flash of content
+               if ( dataShow !== undefined ) {
+                       // This show is picking up where a previous hide or show left off
+                       this.custom( this.cur(), dataShow );
+               } else {
+                       this.custom( this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur() );
+               }
+
+               // Start by showing the element
+               jQuery( this.elem ).show();
+       },
+
+       // Simple 'hide' function
+       hide: function() {
+               // Remember where we started, so that we can go back to it later
+               this.options.orig[ this.prop ] = jQuery._data( this.elem, "fxshow" + this.prop ) || jQuery.style( this.elem, this.prop );
+               this.options.hide = true;
+
+               // Begin the animation
+               this.custom( this.cur(), 0 );
+       },
+
+       // Each step of an animation
+       step: function( gotoEnd ) {
+               var p, n, complete,
+                       t = fxNow || createFxNow(),
+                       done = true,
+                       elem = this.elem,
+                       options = this.options;
+
+               if ( gotoEnd || t >= options.duration + this.startTime ) {
+                       this.now = this.end;
+                       this.pos = this.state = 1;
+                       this.update();
+
+                       options.animatedProperties[ this.prop ] = true;
+
+                       for ( p in options.animatedProperties ) {
+                               if ( options.animatedProperties[ p ] !== true ) {
+                                       done = false;
+                               }
+                       }
+
+                       if ( done ) {
+                               // Reset the overflow
+                               if ( options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {
+
+                                       jQuery.each( [ "", "X", "Y" ], function( index, value ) {
+                                               elem.style[ "overflow" + value ] = options.overflow[ index ];
+                                       });
+                               }
+
+                               // Hide the element if the "hide" operation was done
+                               if ( options.hide ) {
+                                       jQuery( elem ).hide();
+                               }
+
+                               // Reset the properties, if the item has been hidden or shown
+                               if ( options.hide || options.show ) {
+                                       for ( p in options.animatedProperties ) {
+                                               jQuery.style( elem, p, options.orig[ p ] );
+                                               jQuery.removeData( elem, "fxshow" + p, true );
+                                               // Toggle data is no longer needed
+                                               jQuery.removeData( elem, "toggle" + p, true );
+                                       }
+                               }
+
+                               // Execute the complete function
+                               // in the event that the complete function throws an exception
+                               // we must ensure it won't be called twice. #5684
+
+                               complete = options.complete;
+                               if ( complete ) {
+
+                                       options.complete = false;
+                                       complete.call( elem );
+                               }
+                       }
+
+                       return false;
+
+               } else {
+                       // classical easing cannot be used with an Infinity duration
+                       if ( options.duration == Infinity ) {
+                               this.now = t;
+                       } else {
+                               n = t - this.startTime;
+                               this.state = n / options.duration;
+
+                               // Perform the easing function, defaults to swing
+                               this.pos = jQuery.easing[ options.animatedProperties[this.prop] ]( this.state, n, 0, 1, options.duration );
+                               this.now = this.start + ( (this.end - this.start) * this.pos );
+                       }
+                       // Perform the next step of the animation
+                       this.update();
+               }
+
+               return true;
+       }
+};
+
+jQuery.extend( jQuery.fx, {
+       tick: function() {
+               var timer,
+                       timers = jQuery.timers,
+                       i = 0;
+
+               for ( ; i < timers.length; i++ ) {
+                       timer = timers[ i ];
+                       // Checks the timer has not already been removed
+                       if ( !timer() && timers[ i ] === timer ) {
+                               timers.splice( i--, 1 );
+                       }
+               }
+
+               if ( !timers.length ) {
+                       jQuery.fx.stop();
+               }
+       },
+
+       interval: 13,
+
+       stop: function() {
+               clearInterval( timerId );
+               timerId = null;
+       },
+
+       speeds: {
+               slow: 600,
+               fast: 200,
+               // Default speed
+               _default: 400
+       },
+
+       step: {
+               opacity: function( fx ) {
+                       jQuery.style( fx.elem, "opacity", fx.now );
+               },
+
+               _default: function( fx ) {
+                       if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
+                               fx.elem.style[ fx.prop ] = fx.now + fx.unit;
+                       } else {
+                               fx.elem[ fx.prop ] = fx.now;
+                       }
+               }
+       }
+});
+
+// Adds width/height step functions
+// Do not set anything below 0
+jQuery.each([ "width", "height" ], function( i, prop ) {
+       jQuery.fx.step[ prop ] = function( fx ) {
+               jQuery.style( fx.elem, prop, Math.max(0, fx.now) );
+       };
+});
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+       jQuery.expr.filters.animated = function( elem ) {
+               return jQuery.grep(jQuery.timers, function( fn ) {
+                       return elem === fn.elem;
+               }).length;
+       };
+}
+
+// Try to restore the default display value of an element
+function defaultDisplay( nodeName ) {
+
+       if ( !elemdisplay[ nodeName ] ) {
+
+               var body = document.body,
+                       elem = jQuery( "<" + nodeName + ">" ).appendTo( body ),
+                       display = elem.css( "display" );
+               elem.remove();
+
+               // If the simple way fails,
+               // get element's real default display by attaching it to a temp iframe
+               if ( display === "none" || display === "" ) {
+                       // No iframe to use yet, so create it
+                       if ( !iframe ) {
+                               iframe = document.createElement( "iframe" );
+                               iframe.frameBorder = iframe.width = iframe.height = 0;
+                       }
+
+                       body.appendChild( iframe );
+
+                       // Create a cacheable copy of the iframe document on first call.
+                       // IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML
+                       // document to it; WebKit & Firefox won't allow reusing the iframe document.
+                       if ( !iframeDoc || !iframe.createElement ) {
+                               iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;
+                               iframeDoc.write( ( document.compatMode === "CSS1Compat" ? "<!doctype html>" : "" ) + "<html><body>" );
+                               iframeDoc.close();
+                       }
+
+                       elem = iframeDoc.createElement( nodeName );
+
+                       iframeDoc.body.appendChild( elem );
+
+                       display = jQuery.css( elem, "display" );
+                       body.removeChild( iframe );
+               }
+
+               // Store the correct default display
+               elemdisplay[ nodeName ] = display;
+       }
+
+       return elemdisplay[ nodeName ];
+}
+
+
+
+
+var rtable = /^t(?:able|d|h)$/i,
+       rroot = /^(?:body|html)$/i;
+
+if ( "getBoundingClientRect" in document.documentElement ) {
+       jQuery.fn.offset = function( options ) {
+               var elem = this[0], box;
+
+               if ( options ) {
+                       return this.each(function( i ) {
+                               jQuery.offset.setOffset( this, options, i );
+                       });
+               }
+
+               if ( !elem || !elem.ownerDocument ) {
+                       return null;
+               }
+
+               if ( elem === elem.ownerDocument.body ) {
+                       return jQuery.offset.bodyOffset( elem );
+               }
+
+               try {
+                       box = elem.getBoundingClientRect();
+               } catch(e) {}
+
+               var doc = elem.ownerDocument,
+                       docElem = doc.documentElement;
+
+               // Make sure we're not dealing with a disconnected DOM node
+               if ( !box || !jQuery.contains( docElem, elem ) ) {
+                       return box ? { top: box.top, left: box.left } : { top: 0, left: 0 };
+               }
+
+               var body = doc.body,
+                       win = getWindow(doc),
+                       clientTop  = docElem.clientTop  || body.clientTop  || 0,
+                       clientLeft = docElem.clientLeft || body.clientLeft || 0,
+                       scrollTop  = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop  || body.scrollTop,
+                       scrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft,
+                       top  = box.top  + scrollTop  - clientTop,
+                       left = box.left + scrollLeft - clientLeft;
+
+               return { top: top, left: left };
+       };
+
+} else {
+       jQuery.fn.offset = function( options ) {
+               var elem = this[0];
+
+               if ( options ) {
+                       return this.each(function( i ) {
+                               jQuery.offset.setOffset( this, options, i );
+                       });
+               }
+
+               if ( !elem || !elem.ownerDocument ) {
+                       return null;
+               }
+
+               if ( elem === elem.ownerDocument.body ) {
+                       return jQuery.offset.bodyOffset( elem );
+               }
+
+               var computedStyle,
+                       offsetParent = elem.offsetParent,
+                       prevOffsetParent = elem,
+                       doc = elem.ownerDocument,
+                       docElem = doc.documentElement,
+                       body = doc.body,
+                       defaultView = doc.defaultView,
+                       prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
+                       top = elem.offsetTop,
+                       left = elem.offsetLeft;
+
+               while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
+                       if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) {
+                               break;
+                       }
+
+                       computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
+                       top  -= elem.scrollTop;
+                       left -= elem.scrollLeft;
+
+                       if ( elem === offsetParent ) {
+                               top  += elem.offsetTop;
+                               left += elem.offsetLeft;
+
+                               if ( jQuery.support.doesNotAddBorder && !(jQuery.support.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {
+                                       top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
+                                       left += parseFloat( computedStyle.borderLeftWidth ) || 0;
+                               }
+
+                               prevOffsetParent = offsetParent;
+                               offsetParent = elem.offsetParent;
+                       }
+
+                       if ( jQuery.support.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
+                               top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
+                               left += parseFloat( computedStyle.borderLeftWidth ) || 0;
+                       }
+
+                       prevComputedStyle = computedStyle;
+               }
+
+               if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
+                       top  += body.offsetTop;
+                       left += body.offsetLeft;
+               }
+
+               if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) {
+                       top  += Math.max( docElem.scrollTop, body.scrollTop );
+                       left += Math.max( docElem.scrollLeft, body.scrollLeft );
+               }
+
+               return { top: top, left: left };
+       };
+}
+
+jQuery.offset = {
+
+       bodyOffset: function( body ) {
+               var top = body.offsetTop,
+                       left = body.offsetLeft;
+
+               if ( jQuery.support.doesNotIncludeMarginInBodyOffset ) {
+                       top  += parseFloat( jQuery.css(body, "marginTop") ) || 0;
+                       left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
+               }
+
+               return { top: top, left: left };
+       },
+
+       setOffset: function( elem, options, i ) {
+               var position = jQuery.css( elem, "position" );
+
+               // set position first, in-case top/left are set even on static elem
+               if ( position === "static" ) {
+                       elem.style.position = "relative";
+               }
+
+               var curElem = jQuery( elem ),
+                       curOffset = curElem.offset(),
+                       curCSSTop = jQuery.css( elem, "top" ),
+                       curCSSLeft = jQuery.css( elem, "left" ),
+                       calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
+                       props = {}, curPosition = {}, curTop, curLeft;
+
+               // need to be able to calculate position if either top or left is auto and position is either absolute or fixed
+               if ( calculatePosition ) {
+                       curPosition = curElem.position();
+                       curTop = curPosition.top;
+                       curLeft = curPosition.left;
+               } else {
+                       curTop = parseFloat( curCSSTop ) || 0;
+                       curLeft = parseFloat( curCSSLeft ) || 0;
+               }
+
+               if ( jQuery.isFunction( options ) ) {
+                       options = options.call( elem, i, curOffset );
+               }
+
+               if ( options.top != null ) {
+                       props.top = ( options.top - curOffset.top ) + curTop;
+               }
+               if ( options.left != null ) {
+                       props.left = ( options.left - curOffset.left ) + curLeft;
+               }
+
+               if ( "using" in options ) {
+                       options.using.call( elem, props );
+               } else {
+                       curElem.css( props );
+               }
+       }
+};
+
+
+jQuery.fn.extend({
+
+       position: function() {
+               if ( !this[0] ) {
+                       return null;
+               }
+
+               var elem = this[0],
+
+               // Get *real* offsetParent
+               offsetParent = this.offsetParent(),
+
+               // Get correct offsets
+               offset       = this.offset(),
+               parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
+
+               // Subtract element margins
+               // note: when an element has margin: auto the offsetLeft and marginLeft
+               // are the same in Safari causing offset.left to incorrectly be 0
+               offset.top  -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
+               offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
+
+               // Add offsetParent borders
+               parentOffset.top  += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
+               parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
+
+               // Subtract the two offsets
+               return {
+                       top:  offset.top  - parentOffset.top,
+                       left: offset.left - parentOffset.left
+               };
+       },
+
+       offsetParent: function() {
+               return this.map(function() {
+                       var offsetParent = this.offsetParent || document.body;
+                       while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
+                               offsetParent = offsetParent.offsetParent;
+                       }
+                       return offsetParent;
+               });
+       }
+});
+
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( ["Left", "Top"], function( i, name ) {
+       var method = "scroll" + name;
+
+       jQuery.fn[ method ] = function( val ) {
+               var elem, win;
+
+               if ( val === undefined ) {
+                       elem = this[ 0 ];
+
+                       if ( !elem ) {
+                               return null;
+                       }
+
+                       win = getWindow( elem );
+
+                       // Return the scroll offset
+                       return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] :
+                               jQuery.support.boxModel && win.document.documentElement[ method ] ||
+                                       win.document.body[ method ] :
+                               elem[ method ];
+               }
+
+               // Set the scroll offset
+               return this.each(function() {
+                       win = getWindow( this );
+
+                       if ( win ) {
+                               win.scrollTo(
+                                       !i ? val : jQuery( win ).scrollLeft(),
+                                        i ? val : jQuery( win ).scrollTop()
+                               );
+
+                       } else {
+                               this[ method ] = val;
+                       }
+               });
+       };
+});
+
+function getWindow( elem ) {
+       return jQuery.isWindow( elem ) ?
+               elem :
+               elem.nodeType === 9 ?
+                       elem.defaultView || elem.parentWindow :
+                       false;
+}
+
+
+
+
+// Create width, height, innerHeight, innerWidth, outerHeight and outerWidth methods
+jQuery.each([ "Height", "Width" ], function( i, name ) {
+
+       var type = name.toLowerCase();
+
+       // innerHeight and innerWidth
+       jQuery.fn[ "inner" + name ] = function() {
+               var elem = this[0];
+               return elem ?
+                       elem.style ?
+                       parseFloat( jQuery.css( elem, type, "padding" ) ) :
+                       this[ type ]() :
+                       null;
+       };
+
+       // outerHeight and outerWidth
+       jQuery.fn[ "outer" + name ] = function( margin ) {
+               var elem = this[0];
+               return elem ?
+                       elem.style ?
+                       parseFloat( jQuery.css( elem, type, margin ? "margin" : "border" ) ) :
+                       this[ type ]() :
+                       null;
+       };
+
+       jQuery.fn[ type ] = function( size ) {
+               // Get window width or height
+               var elem = this[0];
+               if ( !elem ) {
+                       return size == null ? null : this;
+               }
+
+               if ( jQuery.isFunction( size ) ) {
+                       return this.each(function( i ) {
+                               var self = jQuery( this );
+                               self[ type ]( size.call( this, i, self[ type ]() ) );
+                       });
+               }
+
+               if ( jQuery.isWindow( elem ) ) {
+                       // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
+                       // 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat
+                       var docElemProp = elem.document.documentElement[ "client" + name ],
+                               body = elem.document.body;
+                       return elem.document.compatMode === "CSS1Compat" && docElemProp ||
+                               body && body[ "client" + name ] || docElemProp;
+
+               // Get document width or height
+               } else if ( elem.nodeType === 9 ) {
+                       // Either scroll[Width/Height] or offset[Width/Height], whichever is greater
+                       return Math.max(
+                               elem.documentElement["client" + name],
+                               elem.body["scroll" + name], elem.documentElement["scroll" + name],
+                               elem.body["offset" + name], elem.documentElement["offset" + name]
+                       );
+
+               // Get or set width or height on the element
+               } else if ( size === undefined ) {
+                       var orig = jQuery.css( elem, type ),
+                               ret = parseFloat( orig );
+
+                       return jQuery.isNumeric( ret ) ? ret : orig;
+
+               // Set the width or height on the element (default to pixels if value is unitless)
+               } else {
+                       return this.css( type, typeof size === "string" ? size : size + "px" );
+               }
+       };
+
+});
+
+
+// Expose jQuery to the global object
+window.jQuery = window.$ = jQuery;
+})( window );
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/web/manual_harness.html b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/web/manual_harness.html
new file mode 100644 (file)
index 0000000..63a4c61
--- /dev/null
@@ -0,0 +1,312 @@
+<!--
+# Copyright (C) 2012 Intel Corporation
+# 
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+#
+# Authors:
+#              Zhang, Huihui <huihuix.zhang@intel.com>
+#              Wendong,Sui  <weidongx.sun@intel.com>
+-->
+<!doctype html>
+<html>
+<head>
+<style type="text/css">
+body {
+        margin: 0px;
+}
+
+div#manualharness {
+        box-sizing:border-box;
+        width:100%;
+        border:0px;
+        text-align: left;
+        background: teal;
+        color: white;
+}
+
+textarea#casesinfo{
+        width: 99%;
+        font-size: 20px;
+}
+input,lable,select{
+       font-size: 25px;
+}
+</style>
+<script src="jquery.js"></script>
+<script>
+var iTestsManual = 0;
+
+function fillCasesInfo(){
+        oTestFrame = window.parent.document.getElementById('testframe');
+       oTestFrame.src = '';
+       document.getElementById("caseslist").options[iTestsManual].selected=true;
+       if(window.parent.manualcaseslist[iTestsManual].result == "PASS"){
+               document.getElementById("passradio").checked=true;
+                document.getElementById("passradio").tag=1;
+               document.getElementById("failradio").checked=false;
+                document.getElementById("failradio").tag=0;
+                document.getElementById("blockradio").checked=false;
+                document.getElementById("blockradio").tag=0;
+       } else if(window.parent.manualcaseslist[iTestsManual].result == "FAIL"){
+               document.getElementById("passradio").checked=false;
+                document.getElementById("passradio").tag=0;
+                document.getElementById("failradio").checked=true;
+                document.getElementById("failradio").tag=1;
+                document.getElementById("blockradio").checked=false;
+                document.getElementById("blockradio").tag=0;
+       } else if(window.parent.manualcaseslist[iTestsManual].result == "BLOCK"){
+                document.getElementById("passradio").checked=false;
+                document.getElementById("passradio").tag=0;
+                document.getElementById("failradio").checked=false;
+                document.getElementById("failradio").tag=0;
+                document.getElementById("blockradio").checked=true;
+                document.getElementById("blockradio").tag=1;
+        }else {
+               document.getElementById("passradio").checked=false;
+                document.getElementById("passradio").tag=0;
+                document.getElementById("failradio").checked=false;
+                document.getElementById("failradio").tag=0;
+                document.getElementById("blockradio").checked=false;
+                document.getElementById("blockradio").tag=0;
+       }
+
+       var scriptPathText = window.parent.manualcaseslist[iTestsManual].entry;
+       if(scriptPathText != undefined && scriptPathText.trim().length > 0){
+               document.getElementById("runbutton").disabled = false;
+       }else {
+               document.getElementById("runbutton").disabled = true;
+       }
+       
+       document.getElementById("casesinfo").value="";
+        document.getElementById("casesinfo").value+="Descriptions: "+window.parent.manualcaseslist[iTestsManual].purpose +"\n";
+        var preC = window.parent.manualcaseslist[iTestsManual].pre_con;
+        if (preC && preC.length > 0){
+                document.getElementById("casesinfo").value+= "PreCondition: "+preC+"\n";
+        }
+
+        var posC = window.parent.manualcaseslist[iTestsManual].post_con;
+        if (posC && posC.length > 0){
+                document.getElementById("casesinfo").value+= "PostCondition: "+posC+"\n";
+        }
+
+        var steps = window.parent.manualcaseslist[iTestsManual].steps;
+        if(steps.length > 0){
+            for(var i=0; i<steps.length; i++){
+                document.getElementById("casesinfo").value+= "Step-"+steps[i].order+": "+steps[i].desc+"\n";
+                document.getElementById("casesinfo").value+= "Expected"+": "+steps[i].expected+"\n";
+            }
+        }
+}
+
+function initManual(){
+        for(var i = 0; i < window.parent.manualcaseslist.length; i++){
+            var id_temp = window.parent.manualcaseslist[i].casesid;
+            if(id_temp.length > 32){
+                var prefix = id_temp.substring(0,9);
+                var postfix = id_temp.substring(15);
+                var item = new Option(prefix + " ... " + postfix, window.parent.manualcaseslist[i].index);
+            } else {
+                var item = new Option(window.parent.manualcaseslist[i].casesid, window.parent.manualcaseslist[i].index);
+            }
+            document.getElementById("caseslist").options.add(item);
+        }
+       fillCasesInfo();
+}
+
+function runTest(){
+       var scriptPathText = window.parent.manualcaseslist[iTestsManual].entry;
+       if(scriptPathText){
+               window.parent.document.getElementById('testframe').src = scriptPathText;
+       }
+}
+
+function nextTest(){
+       submitTest();
+       iTestsManual++;
+       if(iTestsManual >= window.parent.manualcaseslist.length)
+               iTestsManual=0;
+       fillCasesInfo();
+}
+
+function prevTest(){
+       submitTest();
+        iTestsManual--;
+        if(iTestsManual < 0)
+                iTestsManual = window.parent.manualcaseslist.length - 1;
+       fillCasesInfo();
+}
+
+function submitTest(){
+       var iResult="N/A";
+       var optionsColor="white";
+       if(document.getElementById("passradio").tag == 1){
+               iResult="PASS";
+               optionsColor="greenyellow";
+       } else if(document.getElementById("failradio").tag == 1){
+               iResult="FAIL";
+               optionsColor="orangered";
+       } else if(document.getElementById("blockradio").tag == 1){
+                iResult="BLOCK";
+                optionsColor="gray";
+        }
+       window.parent.manualcaseslist[iTestsManual].result = iResult;
+       document.getElementById("caseslist").options[iTestsManual].style.backgroundColor = optionsColor;
+
+       var server_url = "http://127.0.0.1:8000/commit_manual_result";
+        jQuery.ajax({
+          async: false,
+          url: server_url,
+          type: "POST",
+          data: {"case_id": window.parent.manualcaseslist[iTestsManual].casesid,"purpose": window.parent.manualcaseslist[iTestsManual].purpose, "result": iResult},
+          dataType: "json",
+          beforeSend: function(x) {
+            if (x && x.overrideMimeType) {
+              x.overrideMimeType("application/json;charset=UTF-8");
+            }
+          },
+          success: function(result) {
+          }
+        });
+}
+
+function completeTest(){
+       window.parent.ask_generate_xml();
+}
+
+function passRadio()
+{
+       var radio = document.getElementById("passradio");
+       if (radio.tag==1){
+               radio.checked=false;
+               radio.tag=0;
+       }else{
+               radio.checked=true;
+               radio.tag=1;
+               document.getElementById("failradio").checked=false;
+                document.getElementById("failradio").tag=0;
+                document.getElementById("blockradio").checked=false;
+                document.getElementById("blockradio").tag=0;
+       }
+}
+
+function failRadio()
+{
+        var radio = document.getElementById("failradio");
+        if (radio.tag==1){
+                radio.checked=false;
+                radio.tag=0;
+        }else{
+                radio.checked=true;
+                radio.tag=1;
+                document.getElementById("passradio").checked=false;
+                document.getElementById("passradio").tag=0;
+                document.getElementById("blockradio").checked=false;
+                document.getElementById("blockradio").tag=0;
+
+        }
+}
+
+function blockRadio()
+{
+        var radio = document.getElementById("blockradio");
+        if (radio.tag==1){
+                radio.checked=false;
+                radio.tag=0;
+        }else{
+                radio.checked=true;
+                radio.tag=1;
+                document.getElementById("passradio").checked=false;
+                document.getElementById("passradio").tag=0;
+                document.getElementById("failradio").checked=false;
+                document.getElementById("failradio").tag=0;
+        }
+}
+
+function listUpdate(){
+       iTestsManual = document.getElementById("caseslist").selectedIndex;
+       fillCasesInfo();
+}
+
+function passLabel(){
+        var radio = document.getElementById("passradio");
+        if (radio.tag==1){
+                radio.checked=false;
+                radio.tag=0;
+        }else{
+                radio.checked=true;
+                radio.tag=1;
+                document.getElementById("failradio").checked=false;
+                document.getElementById("failradio").tag=0;
+                document.getElementById("blockradio").checked=false;
+                document.getElementById("blockradio").tag=0;
+        }
+}
+
+function failLabel(){
+       var radio = document.getElementById("failradio");
+        if (radio.tag==1){
+                radio.checked=false;
+                radio.tag=0;
+        }else{
+                radio.checked=true;
+                radio.tag=1;
+                document.getElementById("passradio").checked=false;
+                document.getElementById("passradio").tag=0;
+                document.getElementById("blockradio").checked=false;
+                document.getElementById("blockradio").tag=0;
+        }
+}
+
+function blockLabel(){
+        var radio = document.getElementById("blockradio");
+        if (radio.tag==1){
+                radio.checked=false;
+                radio.tag=0;
+        }else{
+                radio.checked=true;
+                radio.tag=1;
+                document.getElementById("passradio").checked=false;
+                document.getElementById("passradio").tag=0;
+                document.getElementById("failradio").checked=false;
+                document.getElementById("failradio").tag=0;
+        }
+}
+
+</script>
+</head>
+<body onload="initManual()">
+<div id="manualharness" >
+<input type="button" style="width:13%" id="prevbutton" value="< Prev" onclick="prevTest()"/>
+<select id="caseslist" style="width:59%" onchange="listUpdate()">
+</select>
+<input type="button" style="width:13%" id="nextbutton" value="Next >" onclick="nextTest()"/>
+<input type="button" style="width:12%" id="runbutton" value="Run" onclick="runTest()"/>
+</div>
+<div width=100%>
+<textarea id="casesinfo" rows=8 disabled='disabled' />
+</textarea>
+</div>
+<div style="width:100%;text-align:right;background-color:#cccccc;">
+<input type="radio" id="passradio" value="Pass" onclick="passRadio()"/><label style="font-size:25px" onclick="passLabel()">Pass</label>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<input type="radio" id="failradio" value="Fail" onclick="failRadio()"/><label style="font-size:25px" onclick="failLabel()">Fail</label>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<input type="radio" id="blockradio" value="Block" onclick="blockRadio()"/><label style="font-size:25px" onclick="blockLabel()">Block</label>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<input type="button" style="width:12%" id="submitbutton" value="Save" onclick="submitTest()"/>
+<input type="button" style="width:12%" id="completebutton" value="Done" onclick="completeTest()"/><br>
+</div>
+</body>
+</html>
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/web/manualharness.html b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/web/manualharness.html
new file mode 100644 (file)
index 0000000..6ca25b5
--- /dev/null
@@ -0,0 +1,318 @@
+<!--
+# Copyright (C) 2012 Intel Corporation
+# 
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+#
+# Authors:
+#              Zhang, Huihui <huihuix.zhang@intel.com>
+#              Wendong,Sui  <weidongx.sun@intel.com>
+-->
+<!doctype html>
+<html>
+<head>
+<style type="text/css">
+body {
+        margin: 0px;
+}
+
+div#manualharness {
+       box-sizing:border-box;
+       width:100%;
+       border:0px;
+       text-align: left;
+       background: teal;
+       color: white;
+}
+
+textarea#casesinfo{
+        width: 99%;
+        font-size: 20px;
+}
+
+input,lable,select{
+       font-size: 25px;
+}
+
+</style>
+<script src="jquery.js"></script>
+<script>
+var iTestsManual = 0;
+
+function fillCasesInfo(){
+       window.parent.oTestFrame.src = '';
+       document.getElementById("caseslist").options[iTestsManual].selected=true;
+       if(window.parent.manualcaseslist[iTestsManual].result == "PASS"){
+                document.getElementById("passradio").checked=true;
+                document.getElementById("passradio").tag=1;
+                document.getElementById("failradio").checked=false;
+                document.getElementById("failradio").tag=0;
+                document.getElementById("blockradio").checked=false;
+                document.getElementById("blockradio").tag=0;
+       } else if(window.parent.manualcaseslist[iTestsManual].result == "FAIL"){
+                document.getElementById("passradio").checked=false;
+                document.getElementById("passradio").tag=0;
+                document.getElementById("failradio").checked=true;
+                document.getElementById("failradio").tag=1;
+                document.getElementById("blockradio").checked=false;
+                document.getElementById("blockradio").tag=0;
+       } else if(window.parent.manualcaseslist[iTestsManual].result == "BLOCK"){
+                document.getElementById("passradio").checked=false;
+                document.getElementById("passradio").tag=0;
+                document.getElementById("failradio").checked=false;
+                document.getElementById("failradio").tag=0;
+                document.getElementById("blockradio").checked=true;
+                document.getElementById("blockradio").tag=1;
+        } else {
+                document.getElementById("passradio").checked=false;
+                document.getElementById("passradio").tag=0;
+                document.getElementById("failradio").checked=false;
+                document.getElementById("failradio").tag=0;
+                document.getElementById("blockradio").checked=false;
+                document.getElementById("blockradio").tag=0;
+       }
+
+       var scriptPathText = $(window.parent.Tests[window.parent.manualcaseslist[iTestsManual].index]).find('test_script_entry').get(0);
+       if(scriptPathText){
+               if($(scriptPathText).text().trim() == "")
+                       document.getElementById("runbutton").disabled = true;
+               else
+                       document.getElementById("runbutton").disabled = false;
+       }else {
+               document.getElementById("runbutton").disabled = true;
+       }
+       
+       document.getElementById("casesinfo").value="";
+        document.getElementById("casesinfo").value+="Descriptions: "+$(window.parent.Tests[window.parent.manualcaseslist[iTestsManual].index]).attr('purpose')+"\n";
+        var preC = $(window.parent.Tests[window.parent.manualcaseslist[iTestsManual].index]).find('pre_condition');
+        if (preC && preC.length > 0){
+                var preCText = $(window.parent.Tests[window.parent.manualcaseslist[iTestsManual].index]).find('pre_condition').get(0);
+                document.getElementById("casesinfo").value+= "PreCondition: "+$(preCText).text().trim()+"\n";
+        }
+
+        var posC = $(window.parent.Tests[window.parent.manualcaseslist[iTestsManual].index]).find('post_condition');
+        if (posC && posC.length > 0){
+                var posCText = $(posC).get(0);
+                document.getElementById("casesinfo").value+= "PostCondition: "+$(posCText).text().trim()+"\n";
+        }
+        var stepInfo = $(window.parent.Tests[window.parent.manualcaseslist[iTestsManual].index]).find('step_desc');
+        var stepExp = $(window.parent.Tests[window.parent.manualcaseslist[iTestsManual].index]).find('expected');
+        for(var j=0;j<stepInfo.length;j++){
+               var stepsnum = j + 1;
+               if(stepInfo){
+                       var stepInfoText = $(stepInfo[j]).get(0);
+                       document.getElementById("casesinfo").value+= "Step-"+stepsnum+": "+$(stepInfoText).text().trim()+"\n";
+               }
+               if(stepExp){
+                       var stepExpText = $(stepExp[j]).get(0);
+                       document.getElementById("casesinfo").value+= "Expected"+": "+$(stepExpText).text().trim()+"\n";
+               }
+        }
+}
+
+function initManual(){
+        for(var i = 0; i < window.parent.manualcaseslist.length; i++){
+                var id_temp = window.parent.manualcaseslist[i].casesid;
+                if(window.parent.manualcaseslist[i].casesid.length > 32){
+                        var prefix = id_temp.substring(0,9);
+                        var postfix = id_temp.substring(15);
+                        var item = new Option(prefix + " ... " + postfix, window.parent.manualcaseslist[i].index);
+                } else {
+                        var item = new Option(window.parent.manualcaseslist[i].casesid, window.parent.manualcaseslist[i].index);
+                }
+                document.getElementById("caseslist").options.add(item);
+        }
+        fillCasesInfo();
+}
+
+function runTest(){
+       var scriptPathText = $(window.parent.Tests[window.parent.manualcaseslist[iTestsManual].index]).find('test_script_entry').get(0);
+       if(scriptPathText){
+               window.parent.oTestFrame.src = $(scriptPathText).text().trim();
+       }
+}
+
+function nextTest(){
+       submitTest();
+       iTestsManual++;
+       if(iTestsManual >= window.parent.manualcaseslist.length)
+               iTestsManual=0;
+       fillCasesInfo();
+}
+
+function prevTest(){
+       submitTest();
+        iTestsManual--;
+        if(iTestsManual < 0)
+                iTestsManual = window.parent.manualcaseslist.length - 1;
+       fillCasesInfo();
+}
+
+function submitTest(){
+       if (window.parent.manualcaseslist[iTestsManual].index >= window.parent.Tests.length)
+               return;
+       var iResult="N/A";
+       var optionsColor="white";
+       if(document.getElementById("passradio").tag == 1){
+                iResult="PASS";
+                optionsColor="greenyellow";
+       } else if(document.getElementById("failradio").tag == 1){
+                iResult="FAIL";
+                optionsColor="orangered";
+       } else if(document.getElementById("blockradio").tag == 1){
+                iResult="BLOCK";
+                optionsColor="gray";
+        }
+
+       window.parent.manualcaseslist[iTestsManual].result = iResult;
+       document.getElementById("caseslist").options[iTestsManual].style.backgroundColor = optionsColor;
+
+       $(window.parent.Tests[window.parent.manualcaseslist[iTestsManual].index]).attr('result', iResult);
+       if($(window.parent.Tests[window.parent.manualcaseslist[iTestsManual].index]).find('result_info').length > 0)
+               $(window.parent.Tests[window.parent.manualcaseslist[iTestsManual].index]).find('result_info').remove();
+
+       var doc=$.parseXML("<result_info>" + "<actual_result>" + iResult +"</actual_result>" + "<start>" + "</start>" + "<end>" + "</end>" + "<stdout>" + "</stdout>" + "</result_info>");
+       $(window.parent.Tests[window.parent.manualcaseslist[iTestsManual].index]).append(doc.documentElement);
+
+//     window.parent.statusNode.innerHTML =  "Test #" + (window.parent.manualcaseslist[iTestsManual].index+1) + "/" + window.parent.Tests.length + "(" + iResult + ") " + window.parent.oTestFrame.src;
+}
+
+function completeTest(){
+       window.parent.PublishResult();
+}
+
+function passRadio()
+{
+       var radio = document.getElementById("passradio");
+       if (radio.tag==1){
+                radio.checked=false;
+                radio.tag=0;
+       }else{
+                radio.checked=true;
+                radio.tag=1;
+                document.getElementById("failradio").checked=false;
+                document.getElementById("failradio").tag=0;
+                document.getElementById("blockradio").checked=false;
+                document.getElementById("blockradio").tag=0;
+       }
+}
+
+function failRadio()
+{
+        var radio = document.getElementById("failradio");
+        if (radio.tag==1){
+                radio.checked=false;
+                radio.tag=0;
+        }else{
+                radio.checked=true;
+                radio.tag=1;
+                document.getElementById("passradio").checked=false;
+                document.getElementById("passradio").tag=0;
+                document.getElementById("blockradio").checked=false;
+                document.getElementById("blockradio").tag=0;
+        }
+}
+
+function blockRadio()
+{
+        var radio = document.getElementById("blockradio");
+        if (radio.tag==1){
+                radio.checked=false;
+                radio.tag=0;
+        }else{
+                radio.checked=true;
+                radio.tag=1;
+                document.getElementById("passradio").checked=false;
+                document.getElementById("passradio").tag=0;
+                document.getElementById("failradio").checked=false;
+                document.getElementById("failradio").tag=0;
+        }
+}
+
+function listUpdate(){
+       iTestsManual = document.getElementById("caseslist").selectedIndex;
+       fillCasesInfo();
+}
+
+function passLabel(){
+        var radio = document.getElementById("passradio");
+        if (radio.tag==1){
+                radio.checked=false;
+                radio.tag=0;
+        }else{
+                radio.checked=true;
+                radio.tag=1;
+                document.getElementById("failradio").checked=false;
+                document.getElementById("failradio").tag=0;
+                document.getElementById("blockradio").checked=false;
+                document.getElementById("blockradio").tag=0;
+        }
+}
+
+function failLabel(){
+       var radio = document.getElementById("failradio");
+        if (radio.tag==1){
+                radio.checked=false;
+                radio.tag=0;
+        }else{
+                radio.checked=true;
+                radio.tag=1;
+                document.getElementById("passradio").checked=false;
+                document.getElementById("passradio").tag=0;
+                document.getElementById("blockradio").checked=false;
+                document.getElementById("blockradio").tag=0;
+        }
+}
+
+function blockLabel(){
+        var radio = document.getElementById("blockradio");
+        if (radio.tag==1){
+                radio.checked=false;
+                radio.tag=0;
+        }else{
+                radio.checked=true;
+                radio.tag=1;
+                document.getElementById("passradio").checked=false;
+                document.getElementById("passradio").tag=0;
+                document.getElementById("failradio").checked=false;
+                document.getElementById("failradio").tag=0;
+        }
+}
+
+</script>
+</head>
+<body onload="initManual()">
+<div id="manualharness" >
+<input type="button" style="width:13%" id="prevbutton" value="< Prev" onclick="prevTest()"/>
+<select id="caseslist" style="width:59%" onchange="listUpdate()">
+</select>
+<input type="button" style="width:13%" id="nextbutton" value="Next >" onclick="nextTest()"/>
+<input type="button" style="width:12%" id="runbutton" value="Run" onclick="runTest()"/>
+</div>
+<div width=100%>
+<textarea id="casesinfo" rows=8 disabled='disabled' />
+</textarea>
+</div>
+<div style="width:100%;text-align:right;background-color:#cccccc;">
+<input type="radio" id="passradio" value="Pass" onclick="passRadio()"/><label style="font-size:25px" onclick="passLabel()">Pass</label>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<input type="radio" id="failradio" value="Fail" onclick="failRadio()"/><label style="font-size:25px" onclick="failLabel()">Fail</label>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<input type="radio" id="blockradio" value="Block" onclick="blockRadio()"/><label style="font-size:25px" onclick="blockLabel()">Block</label>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<input type="button" style="width:12%" id="submitbutton" value="Save" onclick="submitTest()"/>
+<input type="button" style="width:12%" id="completebutton" value="Done" onclick="completeTest()"/><br>
+</div>
+</body>
+</html>
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/xsd/Makefile.am b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/xsd/Makefile.am
new file mode 100644 (file)
index 0000000..e438102
--- /dev/null
@@ -0,0 +1,22 @@
+# Copyright (C) 2012 Intel Corporation
+# 
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+#
+# Authors:
+#              Zhang, Huihui <huihuix.zhang@intel.com>
+#              Wendong,Sui  <weidongx.sun@intel.com>
+
+testkitxsddir = /opt/testkit/lite2.4/xsd
+dist_testkitxsd_DATA = *.js *.xsl *.css *.png *.txt *.xml *.xsd release-notes
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/xsd/application.js b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/xsd/application.js
new file mode 100644 (file)
index 0000000..72e2a78
--- /dev/null
@@ -0,0 +1,44 @@
+function getScrollTop(){
+    return f_scrollTop();
+}
+
+function f_scrollTop() {
+       return f_filterResults (
+               $(window) ? $(window).scrollTop() : 0,
+               document.documentElement ? document.documentElement.scrollTop : 0,
+               document.body ? document.body.scrollTop : 0
+       );
+}
+function f_filterResults(n_win, n_docel, n_body) {
+       var n_result = n_win ? n_win : 0;
+       if (n_docel && (!n_result || (n_result > n_docel)))
+               n_result = n_docel;
+       return n_body && (!n_result || (n_result > n_body)) ? n_body : n_result;
+}
+
+function setScrollTop(){
+    $(window) ? $(window).scrollTop(0): 0;
+       document.documentElement ? document.documentElement.scrollTop = 0 :0;
+       document.body ? document.body.scrollTop = 0 : 0;
+} 
+
+function goTopEx(){
+    $node = $('#goTopBtn');
+       if(getScrollTop() > 0){
+                   $node.show();
+       }else{
+                   $node.hide();
+       }
+       
+    $(window).scroll(function(){
+           if(getScrollTop() > 0){
+                   $node.show();
+           }else{
+                   $node.hide();
+           }
+    });
+       
+    $node.click(function(){
+               setScrollTop();
+    });
+}
\ No newline at end of file
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/xsd/back_top.png b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/xsd/back_top.png
new file mode 100644 (file)
index 0000000..19cbd76
Binary files /dev/null and b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/xsd/back_top.png differ
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/xsd/jquery.min.js b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/xsd/jquery.min.js
new file mode 100644 (file)
index 0000000..198b3ff
--- /dev/null
@@ -0,0 +1,4 @@
+/*! jQuery v1.7.1 jquery.com | jquery.org/license */
+(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>"),cm.close();d=cm.createElement(a),cm.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cl)}ck[a]=e}return ck[a]}function cu(a,b){var c={};f.each(cq.concat.apply([],cq.slice(0,b)),function(){c[this]=a});return c}function ct(){cr=b}function cs(){setTimeout(ct,0);return cr=f.now()}function cj(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ci(){try{return new a.XMLHttpRequest}catch(b){}}function cc(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function cb(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function ca(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bE.test(a)?d(a,e):ca(a+"["+(typeof e=="object"||f.isArray(e)?b:"")+"]",e,c,d)});else if(!c&&b!=null&&typeof b=="object")for(var e in b)ca(a+"["+e+"]",b[e],c,d);else d(a,b)}function b_(a,c){var d,e,g=f.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((g[d]?a:e||(e={}))[d]=c[d]);e&&f.extend(!0,a,e)}function b$(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bT,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=b$(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=b$(a,c,d,e,"*",g));return l}function bZ(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bP),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bC(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?bx:by,g=0,h=e.length;if(d>0){if(c!=="border")for(;g<h;g++)c||(d-=parseFloat(f.css(a,"padding"+e[g]))||0),c==="margin"?d+=parseFloat(f.css(a,c+e[g]))||0:d-=parseFloat(f.css(a,"border"+e[g]+"Width"))||0;return d+"px"}d=bz(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0;if(c)for(;g<h;g++)d+=parseFloat(f.css(a,"padding"+e[g]))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+e[g]+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+e[g]))||0);return d+"px"}function bp(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bf,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bo(a){var b=c.createElement("div");bh.appendChild(b),b.innerHTML=a.outerHTML;return b.firstChild}function bn(a){var b=(a.nodeName||"").toLowerCase();b==="input"?bm(a):b!=="script"&&typeof a.getElementsByTagName!="undefined"&&f.grep(a.getElementsByTagName("input"),bm)}function bm(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bl(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bk(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bj(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c,d,e,g=f._data(a),h=f._data(b,g),i=g.events;if(i){delete h.handle,h.events={};for(c in i)for(d=0,e=i[c].length;d<e;d++)f.event.add(b,c+(i[c][d].namespace?".":"")+i[c][d].namespace,i[c][d],i[c][d].data)}h.data&&(h.data=f.extend({},h.data))}}function bi(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function U(a){var b=V.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function T(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=f.grep(a,function(a){return a.nodeType===1});if(O.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c<d;c++)b[a[c]]=!0;return b}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)break;return a},trim:G?function(a){return a==null?"":G.call(a)}:function(a){return a==null?"":(a+"").replace(k,"").replace(l,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d==="string"||d==="function"||d==="regexp"||e.isWindow(a)?E.call(c,a):e.merge(c,a)}return c},inArray:function(a,b,c){var d;if(b){if(H)return H.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length=="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j=="number"&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c=="string"){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=function(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h){var i=a.length;if(typeof c=="object"){for(var j in c)e.access(a,j,c[j],f,g,d);return a}if(d!==b){f=!h&&f&&e.isFunction(d);for(var k=0;k<i;k++)g(a[k],c,f?d.call(a[k],k,g(a[k],c)):d,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf("compatible")<0&&u.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},browser:{}}),e.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){I["[object "+b+"]"]=b.toLowerCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&&(e.browser.safari=!0),j.test(" ")&&(k=/^[\s\xA0]+/,l=/[\s\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener("DOMContentLoaded",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",B),e.ready())});return e}(),g={};f.Callbacks=function(a){a=a?g[a]||h(a):{};var c=[],d=[],e,i,j,k,l,m=function(b){var d,e,g,h,i;for(d=0,e=b.length;d<e;d++)g=b[d],h=f.type(g),h==="array"?m(g):h==="function"&&(!a.unique||!o.has(g))&&c.push(g)},n=function(b,f){f=f||[],e=!a.memory||[b,f],i=!0,l=j||0,j=0,k=c.length;for(;c&&l<k;l++)if(c[l].apply(b,f)===!1&&a.stopOnFalse){e=!0;break}i=!1,c&&(a.once?e===!0?o.disable():c=[]:d&&d.length&&(e=d.shift(),o.fireWith(e[0],e[1])))},o={add:function(){if(c){var a=c.length;m(arguments),i?k=c.length:e&&e!==!0&&(j=a,n(e[0],e[1]))}return this},remove:function(){if(c){var b=arguments,d=0,e=b.length;for(;d<e;d++)for(var f=0;f<c.length;f++)if(b[d]===c[f]){i&&f<=k&&(k--,f<=l&&l--),c.splice(f--,1);if(a.unique)break}}return this},has:function(a){if(c){var b=0,d=c.length;for(;b<d;b++)if(a===c[b])return!0}return!1},empty:function(){c=[];return this},disable:function(){c=d=e=b;return this},disabled:function(){return!c},lock:function(){d=b,(!e||e===!0)&&o.disable();return this},locked:function(){return!d},fireWith:function(b,c){d&&(i?a.once||d.push([b,c]):(!a.once||!e)&&n(b,c));return this},fire:function(){o.fireWith(this,arguments);return this},fired:function(){return!!e}};return o};var i=[].slice;f.extend({Deferred:function(a){var b=f.Callbacks("once memory"),c=f.Callbacks("once memory"),d=f.Callbacks("memory"),e="pending",g={resolve:b,reject:c,notify:d},h={done:b.add,fail:c.add,progress:d.add,state:function(){return e},isResolved:b.fired,isRejected:c.fired,then:function(a,b,c){i.done(a).fail(b).progress(c);return this},always:function(){i.done.apply(i,arguments).fail.apply(i,arguments);return this},pipe:function(a,b,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[b,"reject"],progress:[c,"notify"]},function(a,b){var c=b[0],e=b[1],g;f.isFunction(c)?i[a](function(){g=c.apply(this,arguments),g&&f.isFunction(g.promise)?g.promise().then(d.resolve,d.reject,d.notify):d[e+"With"](this===i?d:this,[g])}):i[a](d[e])})}).promise()},promise:function(a){if(a==null)a=h;else for(var b in h)a[b]=h[b];return a}},i=h.promise({}),j;for(j in g)i[j]=g[j].fire,i[j+"With"]=g[j].fireWith;i.done(function(){e="resolved"},c.disable,d.lock).fail(function(){e="rejected"},b.disable,d.lock),a&&a.call(i,i);return i},when:function(a){function m(a){return function(b){e[a]=arguments.length>1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c<d;c++)b[c]&&b[c].promise&&f.isFunction(b[c].promise)?b[c].promise().then(l(c),j.reject,m(c)):--g;g||j.resolveWith(j,b)}else j!==a&&j.resolveWith(j,d?[a]:[]);return k}}),f.support=function(){var b,d,e,g,h,i,j,k,l,m,n,o,p,q=c.createElement("div"),r=c.documentElement;q.setAttribute("className","t"),q.innerHTML="   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",d=q.getElementsByTagName("*"),e=q.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=q.getElementsByTagName("input")[0],b={leadingWhitespace:q.firstChild.nodeType===3,tbody:!q.getElementsByTagName("tbody").length,htmlSerialize:!!q.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:q.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete q.test}catch(s){b.deleteExpando=!1}!q.addEventListener&&q.attachEvent&&q.fireEvent&&(q.attachEvent("onclick",function(){b.noCloneEvent=!1}),q.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),q.appendChild(i),k=c.createDocumentFragment(),k.appendChild(q.lastChild),b.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,k.removeChild(i),k.appendChild(q),q.innerHTML="",a.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",q.style.width="2px",q.appendChild(j),b.reliableMarginRight=(parseInt((a.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(q.attachEvent)for(o in{submit:1,change:1,focusin:1})n="on"+o,p=n in q,p||(q.setAttribute(n,"return;"),p=typeof q[n]=="function"),b[o+"Bubbles"]=p;k.removeChild(q),k=g=h=j=q=i=null,f(function(){var a,d,e,g,h,i,j,k,m,n,o,r=c.getElementsByTagName("body")[0];!r||(j=1,k="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",m="visibility:hidden;border:0;",n="style='"+k+"border:5px solid #000;padding:0;'",o="<div "+n+"><div></div></div>"+"<table "+n+" cellpadding='0' cellspacing='0'>"+"<tr><td></td></tr></table>",a=c.createElement("div"),a.style.cssText=m+"width:0;height:0;position:static;top:0;margin-top:"+j+"px",r.insertBefore(a,r.firstChild),q=c.createElement("div"),a.appendChild(q),q.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>",l=q.getElementsByTagName("td"),p=l[0].offsetHeight===0,l[0].style.display="",l[1].style.display="none",b.reliableHiddenOffsets=p&&l[0].offsetHeight===0,q.innerHTML="",q.style.width=q.style.paddingLeft="1px",f.boxModel=b.boxModel=q.offsetWidth===2,typeof q.style.zoom!="undefined"&&(q.style.display="inline",q.style.zoom=1,b.inlineBlockNeedsLayout=q.offsetWidth===2,q.style.display="",q.innerHTML="<div style='width:4px;'></div>",b.shrinkWrapBlocks=q.offsetWidth!==2),q.style.cssText=k+m,q.innerHTML=o,d=q.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,i={doesNotAddBorder:e.offsetTop!==5,doesAddBorderForTableAndCells:h.offsetTop===5},e.style.position="fixed",e.style.top="20px",i.fixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",i.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,i.doesNotIncludeMarginInBodyOffset=r.offsetTop!==j,r.removeChild(a),q=a=null,f.extend(b,i))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e<g;e++)delete d[b[e]];if(!(c?m:f.isEmptyObject)(d))return}}if(!c){delete j[k].data;if(!m(j[k]))return}f.support.deleteExpando||!j.setInterval?delete j[k]:j[k]=null,i&&(f.support.deleteExpando?delete a[h]:a.removeAttribute?a.removeAttribute(h):a[h]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d,e,g,h=null;if(typeof a=="undefined"){if(this.length){h=f.data(this[0]);if(this[0].nodeType===1&&!f._data(this[0],"parsedAttrs")){e=this[0].attributes;for(var i=0,j=e.length;i<j;i++)g=e[i].name,g.indexOf("data-")===0&&(g=f.camelCase(g.substring(5)),l(this[0],g,h[g]));f._data(this[0],"parsedAttrs",!0)}}return h}if(typeof a=="object")return this.each(function(){f.data(this,a)});d=a.split("."),d[1]=d[1]?"."+d[1]:"";if(c===b){h=this.triggerHandler("getData"+d[1]+"!",[d[0]]),h===b&&this.length&&(h=f.data(this[0],a),h=l(this[0],a,h));return h===b&&d[1]?this.data(d[0]):h}return this.each(function(){var b=f(this),e=[d[0],c];b.triggerHandler("setData"+d[1]+"!",e),f.data(this,a,c),b.triggerHandler("changeData"+d[1]+"!",e)})},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){typeof a!="string"&&(c=a,a="fx");if(c===b)return f.queue(this[0],a);return this.each(function(){var b=f.queue(this,a,c);a==="fx"&&b[0]!=="inprogress"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!="string"&&(c=a,a=b),a=a||"fx";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+"defer",j=a+"queue",k=a+"mark",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f.Callbacks("once memory"),!0))h++,l.add(m);m();return d.promise()}});var o=/[\n\t\r]/g,p=/\s+/,q=/\r/g,r=/^(?:button|input)$/i,s=/^(?:button|input|object|select|textarea)$/i,t=/^a(?:rea)?$/i,u=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,v=f.support.getSetAttribute,w,x,y;f.fn.extend({attr:function(a,b){return f.access(this,a,b,!0,f.attr)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,a,b,!0,f.prop)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{g=" "+e.className+" ";for(h=0,i=b.length;h<i;h++)~g.indexOf(" "+b[h]+" ")||(g+=b[h]+" ");e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(p);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(" "+g.className+" ").replace(o," ");for(i=0,j=c.length;i<j;i++)h=h.replace(" "+c[i]+" "," ");g.className=f.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c==="string"){var e,g=0,h=f(this),i=b,j=a.split(p);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&f._data(this,"__className__",this.className),this.className=this.className||a===!1?"":f._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c<d;c++)if(this[c].nodeType===1&&(" "+this[c].className+" ").replace(o," ").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c<d;c++){e=i[c];if(e.selected&&(f.support.optDisabled?!e.disabled:e.getAttribute("disabled")===null)&&(!e.parentNode.disabled||!f.nodeName(e.parentNode,"optgroup"))){b=f(e).val();if(j)return b;h.push(b)}}if(j&&!h.length&&i.length)return f(i[g]).val();return h},set:function(a,b){var c=f.makeArray(b);f(a).find("option").each(function(){this.selected=f.inArray(f(this).val(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;h<g;h++)e=d[h],e&&(c=f.propFix[e]||e,f.attr(a,e,""),a.removeAttribute(v?e:c),u.test(e)&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(r.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(w&&f.nodeName(a,"button"))return w.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(w&&f.nodeName(a,"button"))return w.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e,g,h,i=a.nodeType;if(!!a&&i!==3&&i!==8&&i!==2){h=i!==1||!f.isXMLDoc(a),h&&(c=f.propFix[c]||c,g=f.propHooks[c]);return d!==b?g&&"set"in g&&(e=g.set(a,d,c))!==b?e:a[c]=d:g&&"get"in g&&(e=g.get(a,c))!==null?e:a[c]}},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):s.test(a.nodeName)||t.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabindex=f.propHooks.tabIndex,x={get:function(a,c){var d,e=f.prop(a,c);return e===!0||typeof e!="boolean"&&(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},v||(y={name:!0,id:!0},w=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&(y[c]?d.nodeValue!=="":d.specified)?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+""}},f.attrHooks.tabindex.set=w.set,f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})}),f.attrHooks.contenteditable={get:w.get,set:function(a,b,c){b===""&&(b="false"),w.set(a,b,c)}}),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.enctype||(f.propFix.enctype="encoding"),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/\bhover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};
+f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k<c.length;k++){l=A.exec(c[k])||[],m=l[1],n=(l[2]||"").split(".").sort(),s=f.event.special[m]||{},m=(g?s.delegateType:s.bindType)||m,s=f.event.special[m]||{},o=f.extend({type:m,origType:l[1],data:e,handler:d,guid:d.guid,selector:g,quick:G(g),namespace:n.join(".")},p),r=j[m];if(!r){r=j[m]=[],r.delegateCount=0;if(!s.setup||s.setup.call(a,e,n,i)===!1)a.addEventListener?a.addEventListener(m,i,!1):a.attachEvent&&a.attachEvent("on"+m,i)}s.add&&(s.add.call(a,o),o.handler.guid||(o.handler.guid=d.guid)),g?r.splice(r.delegateCount++,0,o):r.push(o),f.event.global[m]=!0}a=null}},global:{},remove:function(a,b,c,d,e){var g=f.hasData(a)&&f._data(a),h,i,j,k,l,m,n,o,p,q,r,s;if(!!g&&!!(o=g.events)){b=f.trim(I(b||"")).split(" ");for(h=0;h<b.length;h++){i=A.exec(b[h])||[],j=k=i[1],l=i[2];if(!j){for(j in o)f.event.remove(a,j+b[h],c,d,!0);continue}p=f.event.special[j]||{},j=(d?p.delegateType:p.bindType)||j,r=o[j]||[],m=r.length,l=l?new RegExp("(^|\\.)"+l.split(".").sort().join("\\.(?:.*\\.)?")+"(\\.|$)"):null;for(n=0;n<r.length;n++)s=r[n],(e||k===s.origType)&&(!c||c.guid===s.guid)&&(!l||l.test(s.namespace))&&(!d||d===s.selector||d==="**"&&s.selector)&&(r.splice(n--,1),s.selector&&r.delegateCount--,p.remove&&p.remove.call(a,s));r.length===0&&m!==r.length&&((!p.teardown||p.teardown.call(a,l)===!1)&&f.removeEvent(a,j,g.handle),delete o[j])}f.isEmptyObject(o)&&(q=g.handle,q&&(q.elem=null),f.removeData(a,["events","handle"],!0))}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){if(!e||e.nodeType!==3&&e.nodeType!==8){var h=c.type||c,i=[],j,k,l,m,n,o,p,q,r,s;if(E.test(h+f.event.triggered))return;h.indexOf("!")>=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;l<r.length&&!c.isPropagationStopped();l++)m=r[l][0],c.type=r[l][1],q=(f._data(m,"events")||{})[c.type]&&f._data(m,"handle"),q&&q.apply(m,d),q=o&&m[o],q&&f.acceptData(m)&&q.apply(m,d)===!1&&c.preventDefault();c.type=h,!g&&!c.isDefaultPrevented()&&(!p._default||p._default.apply(e.ownerDocument,d)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)&&o&&e[h]&&(h!=="focus"&&h!=="blur"||c.target.offsetWidth!==0)&&!f.isWindow(e)&&(n=e[o],n&&(e[o]=null),f.event.triggered=h,e[h](),f.event.triggered=b,n&&(e[o]=n));return c.result}},dispatch:function(c){c=f.event.fix(c||a.event);var d=(f._data(this,"events")||{})[c.type]||[],e=d.delegateCount,g=[].slice.call(arguments,0),h=!c.exclusive&&!c.namespace,i=[],j,k,l,m,n,o,p,q,r,s,t;g[0]=c,c.delegateTarget=this;if(e&&!c.target.disabled&&(!c.button||c.type!=="click")){m=f(this),m.context=this.ownerDocument||this;for(l=c.target;l!=this;l=l.parentNode||this){o={},q=[],m[0]=l;for(j=0;j<e;j++)r=d[j],s=r.selector,o[s]===b&&(o[s]=r.quick?H(l,r.quick):m.is(s)),o[s]&&q.push(r);q.length&&i.push({elem:l,matches:q})}}d.length>e&&i.push({elem:this,matches:d.slice(e)});for(j=0;j<i.length&&!c.isPropagationStopped();j++){p=i[j],c.currentTarget=p.elem;for(k=0;k<p.matches.length&&!c.isImmediatePropagationStopped();k++){r=p.matches[k];if(h||!c.namespace&&!r.namespace||c.namespace_re&&c.namespace_re.test(r.namespace))c.data=r.data,c.handleObj=r,n=((f.event.special[r.origType]||{}).handle||r.handler).apply(p.elem,g),n!==b&&(c.result=n,n===!1&&(c.preventDefault(),c.stopPropagation()))}}return c.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode);return a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,d){var e,f,g,h=d.button,i=d.fromElement;a.pageX==null&&d.clientX!=null&&(e=a.target.ownerDocument||c,f=e.documentElement,g=e.body,a.pageX=d.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=d.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?d.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0);return a}},fix:function(a){if(a[f.expando])return a;var d,e,g=a,h=f.event.fixHooks[a.type]||{},i=h.props?this.props.concat(h.props):this.props;a=f.Event(g);for(d=i.length;d;)e=i[--d],a[e]=g[e];a.target||(a.target=g.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey===b&&(a.metaKey=a.ctrlKey);return h.filter?h.filter(a,g):a},special:{ready:{setup:f.bindReady},load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}},simulate:function(a,b,c,d){var e=f.extend(new f.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?f.event.trigger(e,null,b):f.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},f.event.handle=f.event.dispatch,f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},f.Event=function(a,b){if(!(this instanceof f.Event))return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?K:J):this.type=a,b&&f.extend(this,b),this.timeStamp=a&&a.timeStamp||f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=K;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=K;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=K,this.stopPropagation()},isDefaultPrevented:J,isPropagationStopped:J,isImmediatePropagationStopped:J},f.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){f.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c=this,d=a.relatedTarget,e=a.handleObj,g=e.selector,h;if(!d||d!==c&&!f.contains(c,d))a.type=e.origType,h=e.handler.apply(this,arguments),a.type=b;return h}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(){if(f.nodeName(this,"form"))return!1;f.event.add(this,"click._submit keypress._submit",function(a){var c=a.target,d=f.nodeName(c,"input")||f.nodeName(c,"button")?c.form:b;d&&!d._submit_attached&&(f.event.add(d,"submit._submit",function(a){this.parentNode&&!a.isTrigger&&f.event.simulate("submit",this.parentNode,a,!0)}),d._submit_attached=!0)})},teardown:function(){if(f.nodeName(this,"form"))return!1;f.event.remove(this,"._submit")}}),f.support.changeBubbles||(f.event.special.change={setup:function(){if(z.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")f.event.add(this,"propertychange._change",function(a){a.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),f.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1,f.event.simulate("change",this,a,!0))});return!1}f.event.add(this,"beforeactivate._change",function(a){var b=a.target;z.test(b.nodeName)&&!b._change_attached&&(f.event.add(b,"change._change",function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&f.event.simulate("change",this.parentNode,a,!0)}),b._change_attached=!0)})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!=="radio"&&b.type!=="checkbox")return a.handleObj.handler.apply(this,arguments)},teardown:function(){f.event.remove(this,"._change");return z.test(this.nodeName)}}),f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){var d=0,e=function(a){f.event.simulate(b,a.target,f.event.fix(a),!0)};f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.fn.extend({on:function(a,c,d,e,g){var h,i;if(typeof a=="object"){typeof c!="string"&&(d=c,c=b);for(i in a)this.on(i,c,d,a[i],g);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typeof c=="string"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=J;else if(!e)return this;g===1&&(h=e,e=function(a){f().off(a);return h.apply(this,arguments)},e.guid=h.guid||(h.guid=f.guid++));return this.each(function(){f.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on.call(this,a,b,c,d,1)},off:function(a,c,d){if(a&&a.preventDefault&&a.handleObj){var e=a.handleObj;f(a.delegateTarget).off(e.namespace?e.type+"."+e.namespace:e.type,e.selector,e.handler);return this}if(typeof a=="object"){for(var g in a)this.off(g,c,a[g]);return this}if(c===!1||typeof c=="function")d=c,c=b;d===!1&&(d=J);return this.each(function(){f.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){f(this.context).on(a,this.selector,b,c);return this},die:function(a,b){f(this.context).off(a,this.selector||"**",b);return this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length==1?this.off(a,"**"):this.off(b,a,c)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f._data(this,"lastToggle"+a.guid)||0)%d;f._data(this,"lastToggle"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),f.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){f.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}if(j.nodeType===1){g||(j[d]=c,j.sizset=h);if(typeof b!="string"){if(j===b){k=!0;break}}else if(m.filter(b,[j]).length>0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}j.nodeType===1&&!g&&(j[d]=c,j.sizset=h);if(j.nodeName.toLowerCase()===b){k=j;break}j=j[a]}e[h]=k}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},m.matches=function(a,b){return m(a,null,null,b)},m.matchesSelector=function(a,b){return m(b,null,null,[a]).length>0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e<f;e++){h=o.order[e];if(g=o.leftMatch[h].exec(a)){i=g[1],g.splice(1,1);if(i.substr(i.length-1)!=="\\"){g[1]=(g[1]||"").replace(j,""),d=o.find[h](g,b,c);if(d!=null){a=a.replace(o.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},m.filter=function(a,c,d,e){var f,g,h,i,j,k,l,n,p,q=a,r=[],s=c,t=c&&c[0]&&m.isXML(c[0]);while(a&&c.length){for(h in o.filter)if((f=o.leftMatch[h].exec(a))!=null&&f[2]){k=o.filter[h],l=f[1],g=!1,f.splice(1,1);if(l.substr(l.length-1)==="\\")continue;s===r&&(r=[]);if(o.preFilter[h]){f=o.preFilter[h](f,s,d,r,e,t);if(!f)g=i=!0;else if(f===!0)continue}if(f)for(n=0;(j=s[n])!=null;n++)j&&(i=k(j,f,n,s),p=e^i,d&&i!=null?p?g=!0:s[n]=!1:p&&(r.push(j),g=!0));if(i!==b){d||(s=r),a=a.replace(o.match[h],"");if(!g)return[];break}}if(a===q)if(g==null)m.error(a);else break;q=a}return s},m.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)};var n=m.getText=function(a){var b,c,d=a.nodeType,e="";if(d){if(d===1||d===9){if(typeof a.textContent=="string")return a.textContent;if(typeof a.innerText=="string")return a.innerText.replace(k,"");for(a=a.firstChild;a;a=a.nextSibling)e+=n(a)}else if(d===3||d===4)return a.nodeValue}else for(b=0;c=a[b];b++)c.nodeType!==8&&(e+=n(c));return e},o=m.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b=="string",d=c&&!l.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&m.filter(b,a,!0)},">":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&m.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("parentNode",b,f,a,d,c)},"~":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("previousSibling",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(j,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}m.error(e)},CHILD:function(a,b){var c,e,f,g,h,i,j,k=b[1],l=a;switch(k){case"only":case"first":while(l=l.previousSibling)if(l.nodeType===1)return!1;if(k==="first")return!0;l=a;case"last":while(l=l.nextSibling)if(l.nodeType===1)return!1;return!0;case"nth":c=b[2],e=b[3];if(c===1&&e===0)return!0;f=b[0],g=a.parentNode;if(g&&(g[d]!==f||!a.nodeIndex)){i=0;for(l=g.firstChild;l;l=l.nextSibling)l.nodeType===1&&(l.nodeIndex=++i);g[d]=f}j=a.nodeIndex-e;return c===0?j===0:j%c===0&&j/c>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var u,v;c.documentElement.compareDocumentPosition?u=function(a,b){if(a===b){h=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(u=function(a,b){if(a===b){h=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],g=a.parentNode,i=b.parentNode,j=g;if(g===i)return v(a,b);if(!g)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return v(e[k],f[k]);return k===c?v(a,f[k],-1):v(e[k],b,1)},v=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h<i;h++)m(a,g[h],e,c);return m.filter(f,e)};m.attr=f.attr,m.selectors.attrMap={},f.find=m,f.expr=m.selectors,f.expr[":"]=f.expr.filters,f.unique=m.uniqueSort,f.text=m.getText,f.isXMLDoc=m.isXML,f.contains=m.contains}();var L=/Until$/,M=/^(?:parents|prevUntil|prevAll)/,N=/,/,O=/^.[^:#\[\.,]*$/,P=Array.prototype.slice,Q=f.expr.match.POS,R={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!="string")return f(a).filter(function(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack("","find",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(T(this,a,!1),"not",a)},filter:function(a){return this.pushStack(T(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?Q.test(a)?f(a,this.context).index(this[0])>=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d<a.length;d++)f(g).is(a[d])&&c.push({selector:a[d],elem:g,level:h});g=g.parentNode,h++}return c}var i=Q.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d<e;d++){g=this[d];while(g){if(i?i.index(g)>-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/<tbody/i,_=/<|&#?\w+;/,ba=/<(?:script|style)/i,bb=/<(?:script|object|embed|option|style)/i,bc=new RegExp("<(?:"+V+")","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*<!(?:\[CDATA\[|\-\-)/,bg={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div<div>","</div>"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function()
+{for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1></$2>");try{for(var c=0,d=this.length;c<d;c++)this[c].nodeType===1&&(f.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(e){this.empty().append(a)}}else f.isFunction(a)?this.each(function(b){var c=f(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bd.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bi(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,bp)}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i,j=a[0];b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof j=="string"&&j.length<512&&i===c&&j.charAt(0)==="<"&&!bb.test(j)&&(f.support.checkClone||!bd.test(j))&&(f.support.html5Clone||!bc.test(j))&&(g=!0,h=f.fragments[j],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[j]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||!bc.test("<"+a.nodeName)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1></$2>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");b===c?bh.appendChild(o):U(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]==="<table>"&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i<r;i++)bn(k[i]);else bn(k);k.nodeType?h.push(k):h=f.merge(h,k)}if(d){g=function(a){return!a.type||be.test(a.type)};for(j=0;h[j];j++)if(e&&f.nodeName(h[j],"script")&&(!h[j].type||h[j].type.toLowerCase()==="text/javascript"))e.push(h[j].parentNode?h[j].parentNode.removeChild(h[j]):h[j]);else{if(h[j].nodeType===1){var s=f.grep(h[j].getElementsByTagName("script"),g);h.splice.apply(h,[j+1,0].concat(s))}d.appendChild(h[j])}}return h},cleanData:function(a){var b,c,d=f.cache,e=f.event.special,g=f.support.deleteExpando;for(var h=0,i;(i=a[h])!=null;h++){if(i.nodeName&&f.noData[i.nodeName.toLowerCase()])continue;c=i[f.expando];if(c){b=d[c];if(b&&b.events){for(var j in b.events)e[j]?f.event.remove(i,j):f.removeEvent(i,j,b.handle);b.handle&&(b.handle.elem=null)}g?delete i[f.expando]:i.removeAttribute&&i.removeAttribute(f.expando),delete d[c]}}}});var bq=/alpha\([^)]*\)/i,br=/opacity=([^)]*)/,bs=/([A-Z]|^ms)/g,bt=/^-?\d+(?:px)?$/i,bu=/^-?\d/,bv=/^([\-+])=([\-+.\de]+)/,bw={position:"absolute",visibility:"hidden",display:"block"},bx=["Left","Right"],by=["Top","Bottom"],bz,bA,bB;f.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return f.access(this,a,c,!0,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)})},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bz(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bv.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(bz)return bz(a,c)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]}}),f.curCSS=f.css,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){var e;if(c){if(a.offsetWidth!==0)return bC(a,b,d);f.swap(a,bw,function(){e=bC(a,b,d)});return e}},set:function(a,b){if(!bt.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return br.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bq,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bq.test(g)?g.replace(bq,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,b){var c,d,e;b=b.replace(bs,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b)));return c}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bt.test(f)&&bu.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f||0,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bD=/%20/g,bE=/\[\]$/,bF=/\r?\n/g,bG=/#.*$/,bH=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bI=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bJ=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bK=/^(?:GET|HEAD)$/,bL=/^\/\//,bM=/\?/,bN=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bO=/^(?:select|textarea)/i,bP=/\s+/,bQ=/([?&])_=[^&]*/,bR=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bS=f.fn.load,bT={},bU={},bV,bW,bX=["*/"]+["*"];try{bV=e.href}catch(bY){bV=c.createElement("a"),bV.href="",bV=bV.href}bW=bR.exec(bV.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bS)return bS.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("<div>").append(c.replace(bN,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bO.test(this.nodeName)||bI.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bF,"\r\n")}}):{name:b.name,value:c.replace(bF,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b_(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b_(a,b);return a},ajaxSettings:{url:bV,isLocal:bJ.test(bW[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bX},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bZ(bT),ajaxTransport:bZ(bU),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?cb(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cc(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bH.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bG,"").replace(bL,bW[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bP),d.crossDomain==null&&(r=bR.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bW[1]&&r[2]==bW[2]&&(r[3]||(r[1]==="http:"?80:443))==(bW[3]||(bW[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),b$(bT,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bK.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bM.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bQ,"$1_="+x);d.url=y+(y===d.url?(bM.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bX+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=b$(bU,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)ca(g,a[g],c,e);return d.join("&").replace(bD,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cd=f.now(),ce=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cd++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ce.test(b.url)||e&&ce.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ce,l),b.url===j&&(e&&(k=k.replace(ce,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cf=a.ActiveXObject?function(){for(var a in ch)ch[a](0,1)}:!1,cg=0,ch;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ci()||cj()}:ci,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cf&&delete ch[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cg,cf&&(ch||(ch={},f(a).unload(cf)),ch[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var ck={},cl,cm,cn=/^(?:toggle|show|hide)$/,co=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cp,cq=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cr;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cu("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d.style&&(e=d.style.display,!f._data(d,"olddisplay")&&e==="none"&&(e=d.style.display=""),e===""&&f.css(d,"display")==="none"&&f._data(d,"olddisplay",cv(d.nodeName)));for(g=0;g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===""||e==="none")d.style.display=f._data(d,"olddisplay")||""}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(cu("hide",3),a,b,c);var d,e,g=0,h=this.length;for(;g<h;g++)d=this[g],d.style&&(e=f.css(d,"display"),e!=="none"&&!f._data(d,"olddisplay")&&f._data(d,"olddisplay",e));for(g=0;g<h;g++)this[g].style&&(this[g].style.display="none");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a=="boolean";f.isFunction(a)&&f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(":hidden");f(this)[b?"show":"hide"]()}):this.animate(cu("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){function g(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=c&&f(this).is(":hidden"),g,h,i,j,k,l,m,n,o;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&&(a[g]=a[i],delete a[i]),h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||"swing";if(h==="hide"&&d||h==="show"&&!d)return b.complete.call(this);c&&(g==="height"||g==="width")&&(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,"display")==="inline"&&f.css(this,"float")==="none"&&(!f.support.inlineBlockNeedsLayout||cv(this.nodeName)==="inline"?this.style.display="inline-block":this.style.zoom=1))}b.overflow!=null&&(this.style.overflow="hidden");for(i in a)j=new f.fx(this,b,i),h=a[i],cn.test(h)?(o=f._data(this,"toggle"+i)||(h==="toggle"?d?"show":"hide":0),o?(f._data(this,"toggle"+i,o==="show"?"hide":"show"),j[o]()):j[h]()):(k=co.exec(h),l=j.cur(),k?(m=parseFloat(k[2]),n=k[3]||(f.cssNumber[i]?"":"px"),n!=="px"&&(f.style(this,i,(m||1)+n),l=(m||1)/j.cur()*l,f.style(this,i,l+n)),k[1]&&(m=(k[1]==="-="?-1:1)*m+l),j.custom(l,m,n)):j.custom(l,h,""));return!0}var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return e.queue===!1?this.each(g):this.queue(e.queue,g)},stop:function(a,c,d){typeof a!="string"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||"fx",[]);return this.each(function(){function h(a,b,c){var e=b[c];f.removeData(a,c,!0),e.stop(d)}var b,c=!1,e=f.timers,g=f._data(this);d||f._unmark(!0,this);if(a==null)for(b in g)g[b]&&g[b].stop&&b.indexOf(".run")===b.length-4&&h(this,g,b);else g[b=a+".run"]&&g[b].stop&&h(this,g,b);for(b=e.length;b--;)e[b].elem===this&&(a==null||e[b].queue===a)&&(d?e[b](!0):e[b].saveState(),c=!0,e.splice(b,1));(!d||!c)&&f.dequeue(this,a)})}}),f.each({slideDown:cu("show",1),slideUp:cu("hide",1),slideToggle:cu("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&typeof a=="object"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,duration:a,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue="fx";d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue?f.dequeue(this,d.queue):a!==!1&&f._unmark(this)};return d},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,c,d){function h(a){return e.step(a)}var e=this,g=f.fx;this.startTime=cr||cs(),this.end=c,this.now=this.start=a,this.pos=this.state=0,this.unit=d||this.unit||(f.cssNumber[this.prop]?"":"px"),h.queue=this.options.queue,h.elem=this.elem,h.saveState=function(){e.options.hide&&f._data(e.elem,"fxshow"+e.prop)===b&&f._data(e.elem,"fxshow"+e.prop,e.start)},h()&&f.timers.push(h)&&!cp&&(cp=setInterval(g.tick,g.interval))},show:function(){var a=f._data(this.elem,"fxshow"+this.prop);this.options.orig[this.prop]=a||f.style(this.elem,this.prop),this.options.show=!0,a!==b?this.custom(this.cur(),a):this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f._data(this.elem,"fxshow"+this.prop)||f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b,c,d,e=cr||cs(),g=!0,h=this.elem,i=this.options;if(a||e>=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&b[c]===a&&b.splice(c--,1);b.length||f.fx.stop()},interval:13,stop:function(){clearInterval(cp),cp=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=a.now+a.unit:a.elem[a.prop]=a.now}}}),f.each(["width","height"],function(a,b){f.fx.step[b]=function(a){f.style(a.elem,b,Math.max(0,a.now)+a.unit)}}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var cw=/^t(?:able|d|h)$/i,cx=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?f.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(d){}var e=b.ownerDocument,g=e.documentElement;if(!c||!f.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=e.body,i=cy(e),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||f.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||f.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:f.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);var c,d=b.offsetParent,e=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(f.support.fixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===d&&(l+=b.offsetTop,m+=b.offsetLeft,f.support.doesNotAddBorder&&(!f.support.doesAddBorderForTableAndCells||!cw.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),e=d,d=b.offsetParent),f.support.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;f.support.fixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},f.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.support.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cy(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cy(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,d,"padding")):this[d]():null},f.fn["outer"+c]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,d,a?"margin":"border")):this[d]():null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNumeric(j)?j:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window);
\ No newline at end of file
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/xsd/readme.txt b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/xsd/readme.txt
new file mode 100644 (file)
index 0000000..a87a6d0
--- /dev/null
@@ -0,0 +1,53 @@
+= XSLT style for Test Case and Test Result =
+
+== Files structure ==
+
+        readme.txt
+        test_definition.xsd   //The schema of test definition
+        tests.css             // CSS style for showing test cases and results
+        testresult.xsl
+        testcase.xsl
+        tests.xml             //example of test cases
+        result.xml            //example of test result
+        
+ == Applying the style ==
+ === Update in definition and result XML ===
+ For applying this style for the definition XML of test cases, please add below statement before the root element of XML (the tag "test_definition").
+ <?xml-stylesheet type="text/xsl"  href="./testcase.xsl"?>
+ as below: 
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl"  href="./testcase.xsl"?>
+<test_definition>
+
+For applying this style for the test-result XML, please add below statement before the root element of XML (the tag "test_definition").
+<?xml-stylesheet type="text/xsl"  href="./testresult.xsl"?>
+
+as below:
+
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl"  href="./testresult.xsl"?>
+<test_definition>
+
+=== Deploy XSLT and CSS style ===
+
+For our test package, below 3 files should be added in each test package. 
+
+        tests.css  
+        testresult.xsl
+        testcase.xsl
+        
+For instance, add them under the test package "webapi-tizen-alarm-tests".
+ Â©Â¸Â©Â¤webapi-tizen-alarm-tests
+             Â©Â¸Â©Â¤...
+             Â©Â¸Â©Â¤...
+             Â©Â¸tests.css  
+             Â©Â¸testresult.xsl
+             Â©Â¸testcase.xsl
+             Â©Â¸tests.xml
+             Â©Â¸...
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/xsd/release-notes b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/xsd/release-notes
new file mode 100644 (file)
index 0000000..30e97e8
--- /dev/null
@@ -0,0 +1,86 @@
+-- version 1.0.1-2 --
+
+ adding 2 new case types "compliance" and "user_experience"
+-- version 1.0.1-3 --
+ Add a new sub-element "spec" (type: string) under the "testcase" element.
+-- version 1.0.1-4 --
+  
+ Add 2 new priority "P3" and "P4"
+-- version 1.0.1-5 --
+ Add a new root "test_definition", and the element "suite" has been move into it as children elements.
+-- version 1.0.1-6 --
+ A new optional attribute "launcher" is added in the element "testdefinition" for supporting identifying which kind of test suites the XML is designed for
+
+-- version 1.0.1-7 --
+The Xslt related files are merged into this repo. 
+including 
+
+        tests.css             // CSS style for showing test cases and results
+        testresult.xsl
+        testcase.xsl
+        tests.xml             //example of test cases
+        result.xml            //example of test result
+        application.js        //Javascript for "back to top"
+        jquery.min.js         //JQuery
+        back_top.png          //image for "back to top"
+
+Modification in Schema:
+
+1\ the optional attribute "launcher" is moved into suite, not in "testdefinition" element any longer.
+
+2\ "spec" element is removed. and a new "specs" structure is added as below
+
+                                <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" usage="true" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+All spec-related infomation are re-organized as XML element and attributes.
+
+In Xslt, 
+
+1\ a float image "Back to top" is available on right-bottom for scrolling to top.
+
+2\ html anchor is adder for scrolling back to suite summary table, and case detail tables.
+
+-- version 1.0.1-8 --
+1\ For more flexible, rename the attribute "method_or_attribute" to "element_name".
+2\ Add a new attribute "element_type" to describe the type of the corresponding specification item
+
+related example and Xlst is also updated for above.
+
+-- version 1.0.1-9 --
+1\ add an attribute "cts_version" in the element "environment/BuildInfoType" for saving the version of CTS tool
+2\ add an attribute "file" in "measurement/simpleMeasurementType"
+3\ update the result XSLt for showing cts_version
+4\ update the result XSLt for showing Â¡Â°Test Blocked¡± instead of "Test N/A"
+5\ add a summary table for showing all FAIL cases.
+
+
+-- version 1.0.2-1 --
+1\ add a new int optional attribute "onload_delay" with default "3"
+
+-- version 1.0.2-2 --
+1\ Add a new sub element "capabilities" under the element "testcase"
+2\ Add a new boolean attribute "check_unsupport_error" in the element "testcase"
+
+-- version 1.0.2-3 --
+1\ Move the sub element "capabilities" from the element "testcase" to the element "set"
+
+
+-- version 1.0.2-4 --
+1\ Add a unique limitation for suite name
+2\ Add a new optional attribute "launcher" in set 
+
+
+-- version 1.0.2-5 --
+1\ Add a attribute "set_debug_msg" in set for recording the name of log file.
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/xsd/result.xml b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/xsd/result.xml
new file mode 100644 (file)
index 0000000..6d4e873
--- /dev/null
@@ -0,0 +1,1736 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<test_definition name="http://tempuri.org" type=""
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:noNamespaceSchemaLocation="test_definition.xsd">
+       <environment device_id="generic/sdk/generic:4.0.4/MR1/302030:eng/test-keys"
+               device_model="unknown" device_name="MR8" firmware_version="4.0.4"
+               host="zhongqing-dev.sh.intel.com (Linux - 2.6.38.6-26.rc1.fc15.i686)"
+               os_version="4.0.4" resolution="1280*800" screen_size="250*150" cts_version="2.3.0-3">
+               <other> Here is a Long String for testing ~~~~~~~~~~~~~~~~~~~
+               Here is a Long String for testing ~~~~~~~~~~~~~~~~~~~
+               Here is a Long String for testing ~~~~~~~~~~~~~~~~~~~
+               </other>
+       </environment>
+       <summary test_plan_name="tmp_test_1">
+               <start_at>Fri Jul 13 04:04:59 CST 2012</start_at>
+               <end_at>Fri Jul 13 05:01:53 CST 2012</end_at>
+       </summary>
+       <suite name="webapi-tizen-alarm-tests" type="">
+               <set name="Alarm1">
+                       <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"
+                               id="Alarm_AlarmRelative_constructor_delay" priority="P1"
+                               purpose="check AlarmRelative attribute when create with delay"
+                               status="approved" type="compliance" result="PASS">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>check AlarmRelative create constructor with delay
+                                                       </step_desc>
+                                                       <expected>AlarmRelative create succeed with constructor with
+                                                               delay
+                                                       </expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_constructor_delay.htm
+                                       </test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" usage="true" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                               <result_info>
+                                       <actual_result>PASS</actual_result>
+                                       <start>Sat Jan 01 2000 13:43:44 GMT+0900 (KST)</start>
+                                       <end>Sat Jan 01 2000 13:43:46 GMT+0900 (KST)</end>
+                                       <stdout />
+                               </result_info>
+                       </testcase>
+                       <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"
+                               id="Alarm_AlarmManager_get" priority="P1"
+                               purpose="check AlarmManager method removeAll: without input attribute"
+                               status="approved" type="compliance" result="BLOCK">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>check AlarmManager method get: default check
+                                                       </step_desc>
+                                                       <expected>AlarmManager method get: default check succeed
+                                                       </expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_get.htm
+                                       </test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" usage="true" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                               <result_info>
+                                       <actual_result>BLOCK</actual_result>
+                                       <start>Sat Jan 01 2000 13:43:46 GMT+0900 (KST)</start>
+                                       <end>Sat Jan 01 2000 13:44:02 GMT+0900 (KST)</end>
+                                       <stdout>Test time out</stdout>
+                               </result_info>
+                       </testcase>
+                       <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"
+                               id="Alarm_AlarmAbsolute_attri_date_01" priority="P1"
+                               purpose="check AlarmAbsolute attribute when create with date"
+                               status="approved" type="compliance">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>check AlarmAbsolute attribute when create with date
+                                                       </step_desc>
+                                                       <expected>AlarmAbsolute attribute return correct value when
+                                                               create with date
+                                                       </expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_attri_date.htm?total_num=3&amp;locator_key=id&amp;value=1
+                                       </test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" usage="true" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                               <result_info>
+                                       <actual_result>N/R</actual_result>
+                                       <start>Sat Jan 01 2000 13:44:02 GMT+0900 (KST)</start>
+                                       <end>Sat Jan 01 2000 13:44:05 GMT+0900 (KST)</end>
+                                       <stdout />
+                               </result_info>
+                       </testcase>
+                       <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"
+                               id="Alarm_AlarmManager_add_rel" priority="P1"
+                               purpose="check AlarmManager method add: add relative alarm" status="approved"
+                               type="compliance" result="FAIL">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>check AlarmManager method add: add relative alarm
+                                                       </step_desc>
+                                                       <expected>AlarmManager method add: add relative alarm succeed
+                                                       </expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_add_rel.htm
+                                       </test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" usage="true" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                               <result_info>
+                                       <actual_result>FAIL</actual_result>
+                                       <start>Sat Jan 01 2000 13:44:05 GMT+0900 (KST)</start>
+                                       <end>Sat Jan 01 2000 13:44:21 GMT+0900 (KST)</end>
+                                       <stdout>Test time out</stdout>
+                               </result_info>
+                       </testcase>
+                       <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"
+                               id="Alarm_AlarmRelative_attri_delay_02" priority="P1"
+                               purpose="check AlarmAbsolute attribute when create with period"
+                               status="approved" type="compliance" result="FAIL">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>check AlarmRelative attribute when create with delay
+                                                       </step_desc>
+                                                       <expected>AlarmRelative attribute return correct value when
+                                                               create succeed with with delay
+                                                       </expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_attri_delay.htm?total_num=2&amp;locator_key=id&amp;value=2
+                                       </test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" usage="true" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                               <result_info>
+                                       <actual_result>FAIL</actual_result>
+                                       <start>Sat Jan 01 2000 13:44:21 GMT+0900 (KST)</start>
+                                       <end>Sat Jan 01 2000 13:44:23 GMT+0900 (KST)</end>
+                                       <stdout />
+                               </result_info>
+                       </testcase>
+                       <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"
+                               id="Alarm_AlarmManager_getAll" priority="P1"
+                               purpose="check AlarmManager method getAll: default check" status="approved"
+                               type="compliance" result="FAIL">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>check AlarmManager method getAll: default check
+                                                       </step_desc>
+                                                       <expected>AlarmManager method getAll: default check succeed
+                                                       </expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_getAll.htm
+                                       </test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" usage="true" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                               <result_info>
+                                       <actual_result>FAIL</actual_result>
+                                       <start>Sat Jan 01 2000 13:44:23 GMT+0900 (KST)</start>
+                                       <end>Sat Jan 01 2000 13:44:39 GMT+0900 (KST)</end>
+                                       <stdout>Test time out</stdout>
+                               </result_info>
+                       </testcase>
+                       <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"
+                               id="Alarm_AlarmAbsolute_attri_date_03" priority="P1"
+                               purpose="check AlarmAbsolute attribute when create with date"
+                               status="approved" type="compliance" result="Blocked">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>check AlarmAbsolute attribute when create with date
+                                                       </step_desc>
+                                                       <expected>AlarmAbsolute attribute return correct value when
+                                                               create with date
+                                                       </expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_attri_date.htm?total_num=3&amp;locator_key=id&amp;value=3
+                                       </test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" usage="true" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                               <result_info>
+                                       <actual_result>FAIL</actual_result>
+                                       <start>Sat Jan 01 2000 13:44:39 GMT+0900 (KST)</start>
+                                       <end>Sat Jan 01 2000 13:44:41 GMT+0900 (KST)</end>
+                                       <stdout />
+                               </result_info>
+                       </testcase>
+                       <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"
+                               id="Alarm_AlarmAbsolute_getNextScheduledDate_date" priority="P1"
+                               purpose="check AlarmAbsolute method getNextScheduledDate when create with date"
+                               status="approved" type="compliance" result="FAIL">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>check AlarmAbsolute method getNextScheduledDate when
+                                                               create with date
+                                                       </step_desc>
+                                                       <expected>AlarmAbsolute method getNextScheduledDate return
+                                                               correct value when create with date
+                                                       </expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_getNextScheduledDate_date.htm
+                                       </test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" usage="true" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                               <result_info>
+                                       <actual_result>FAIL</actual_result>
+                                       <start>Sat Jan 01 2000 13:44:41 GMT+0900 (KST)</start>
+                                       <end>Sat Jan 01 2000 13:44:57 GMT+0900 (KST)</end>
+                                       <stdout>Test time out</stdout>
+                               </result_info>
+                       </testcase>
+                       <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"
+                               id="Alarm_AlarmAbsolute_constructor_date" priority="P1"
+                               purpose="check AlarmAbsolute create constructor with date" status="approved"
+                               type="compliance" result="FAIL">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>check AlarmAbsolute create constructor with date
+                                                       </step_desc>
+                                                       <expected>AlarmAbsolute create succeed with constructor with date
+                                                       </expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_constructor_date.htm
+                                       </test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" usage="true" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                               <result_info>
+                                       <actual_result>FAIL</actual_result>
+                                       <start>Sat Jan 01 2000 13:44:57 GMT+0900 (KST)</start>
+                                       <end>Sat Jan 01 2000 13:45:13 GMT+0900 (KST)</end>
+                                       <stdout>Test time out</stdout>
+                               </result_info>
+                       </testcase>
+                       <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"
+                               id="Alarm_AlarmRelative_getRemainingSeconds_delay" priority="P1"
+                               purpose="check AlarmRelative method getNextScheduleddelay when create with delay"
+                               status="approved" type="compliance" result="FAIL">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>check AlarmRelative method getNextScheduleddelay when
+                                                               create with delay
+                                                       </step_desc>
+                                                       <expected>AlarmRelative method getNextScheduleddelay return
+                                                               correct value when create succeed with with delay
+                                                       </expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_getRemainingSeconds_delay.htm
+                                       </test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" usage="true" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                               <result_info>
+                                       <actual_result>FAIL</actual_result>
+                                       <start>Sat Jan 01 2000 13:45:13 GMT+0900 (KST)</start>
+                                       <end>Sat Jan 01 2000 13:45:30 GMT+0900 (KST)</end>
+                                       <stdout>Test time out</stdout>
+                               </result_info>
+                       </testcase>
+                       <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"
+                               id="Alarm_AlarmRelative_attri_delay_01" priority="P1"
+                               purpose="check AlarmAbsolute attribute when create with period"
+                               status="approved" type="compliance" result="FAIL">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>check AlarmRelative attribute when create with delay
+                                                       </step_desc>
+                                                       <expected>AlarmRelative attribute return correct value when
+                                                               create succeed with with delay
+                                                       </expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_attri_delay.htm?total_num=2&amp;locator_key=id&amp;value=1
+                                       </test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" usage="true" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                               <result_info>
+                                       <actual_result>FAIL</actual_result>
+                                       <start>Sat Jan 01 2000 13:45:30 GMT+0900 (KST)</start>
+                                       <end>Sat Jan 01 2000 13:45:32 GMT+0900 (KST)</end>
+                                       <stdout />
+                               </result_info>
+                       </testcase>
+                       <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"
+                               id="Alarm_AlarmManager_add_abs" priority="P1"
+                               purpose="check AlarmManager method add: add absolute alarm" status="approved"
+                               type="compliance" result="FAIL">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>check AlarmManager method add: add absolute alarm
+                                                       </step_desc>
+                                                       <expected>AlarmManager method add: add absolute alarm succeed
+                                                       </expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_add_abs.htm
+                                       </test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" usage="true" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                               <result_info>
+                                       <actual_result>FAIL</actual_result>
+                                       <start>Sat Jan 01 2000 13:45:32 GMT+0900 (KST)</start>
+                                       <end>Sat Jan 01 2000 13:45:48 GMT+0900 (KST)</end>
+                                       <stdout>Test time out</stdout>
+                               </result_info>
+                       </testcase>
+                       <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"
+                               id="Alarm_AlarmAbsolute_attri_date_02" priority="P1"
+                               purpose="check AlarmAbsolute attribute when create with date"
+                               status="approved" type="compliance" result="FAIL">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>check AlarmAbsolute attribute when create with date
+                                                       </step_desc>
+                                                       <expected>AlarmAbsolute attribute return correct value when
+                                                               create with date
+                                                       </expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_attri_date.htm?total_num=3&amp;locator_key=id&amp;value=2
+                                       </test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" usage="true" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                               <result_info>
+                                       <actual_result>FAIL</actual_result>
+                                       <start>Sat Jan 01 2000 13:45:48 GMT+0900 (KST)</start>
+                                       <end>Sat Jan 01 2000 13:45:50 GMT+0900 (KST)</end>
+                                       <stdout />
+                               </result_info>
+                       </testcase>
+                       <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"
+                               id="Alarm_AlarmManager_removeAll" priority="P1"
+                               purpose="check AlarmManager method removeAll: default check" status="approved"
+                               type="compliance" result="FAIL">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>check AlarmManager method removeAll: default check
+                                                       </step_desc>
+                                                       <expected>AlarmManager method removeAll: default check succeed
+                                                       </expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_removeAll.htm
+                                       </test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" usage="true" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                               <result_info>
+                                       <actual_result>FAIL</actual_result>
+                                       <start>Sat Jan 01 2000 13:45:50 GMT+0900 (KST)</start>
+                                       <end>Sat Jan 01 2000 13:46:06 GMT+0900 (KST)</end>
+                                       <stdout>Test time out</stdout>
+                               </result_info>
+                       </testcase>
+                       <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"
+                               id="Alarm_AlarmManager_remove" priority="P1"
+                               purpose="check AlarmManager method remove: default check" status="approved"
+                               type="compliance" result="FAIL">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>check AlarmManager method remove: default check
+                                                       </step_desc>
+                                                       <expected>AlarmManager method remove: default check succeed
+                                                       </expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_remove.htm
+                                       </test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" usage="true" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                               <result_info>
+                                       <actual_result>FAIL</actual_result>
+                                       <start>Sat Jan 01 2000 13:46:06 GMT+0900 (KST)</start>
+                                       <end>Sat Jan 01 2000 13:46:22 GMT+0900 (KST)</end>
+                                       <stdout>Test time out</stdout>
+                               </result_info>
+                       </testcase>
+                       <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"
+                               id="Alarm_AlarmManagerObject_exist" priority="P1"
+                               purpose="check AlarmManagerObject existance" status="approved" type="compliance"
+                               result="FAIL">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>check AlarmManagerObject exist</step_desc>
+                                                       <expected>AlarmManagerObject exist</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry test_script_expected_result="">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManagerObject_exist.htm
+                                       </test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" usage="true" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                               <result_info>
+                                       <actual_result>FAIL</actual_result>
+                                       <start>Sat Jan 01 2000 13:46:22 GMT+0900 (KST)</start>
+                                       <end>Sat Jan 01 2000 13:46:38 GMT+0900 (KST)</end>
+                                       <stdout>Test time out</stdout>
+                               </result_info>
+                       </testcase>
+                       <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"
+                               id="Alarm_AlarmManager_const_check_01" priority="P1"
+                               purpose="Check AlarmManager constants:PERIOD_MINUTE" status="approved"
+                               type="compliance" result="FAIL">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>Check AlarmManager constants:</step_desc>
+                                                       <expected>AlarmManager constants value is correct:</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_const_check.htm?total_num=4&amp;locator_key=id&amp;value=1
+                                       </test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" usage="true" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                               <result_info>
+                                       <actual_result>FAIL</actual_result>
+                                       <start>Sat Jan 01 2000 13:46:38 GMT+0900 (KST)</start>
+                                       <end>Sat Jan 01 2000 13:46:40 GMT+0900 (KST)</end>
+                                       <stdout>Can't find variable: tizen</stdout>
+                               </result_info>
+                       </testcase>
+                       <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"
+                               id="Alarm_AlarmManager_const_check_02" priority="P1"
+                               purpose="Check AlarmManager constants:PERIOD_HOUR" status="approved"
+                               type="compliance" result="FAIL">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>Check AlarmManager constants:</step_desc>
+                                                       <expected>AlarmManager constants value is correct:</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_const_check.htm?total_num=4&amp;locator_key=id&amp;value=2
+                                       </test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" usage="true" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                               <result_info>
+                                       <actual_result>FAIL</actual_result>
+                                       <start>Sat Jan 01 2000 13:46:40 GMT+0900 (KST)</start>
+                                       <end>Sat Jan 01 2000 13:46:42 GMT+0900 (KST)</end>
+                                       <stdout>Can't find variable: tizen</stdout>
+                               </result_info>
+                       </testcase>
+                       <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"
+                               id="Alarm_AlarmManager_const_check_03" priority="P1"
+                               purpose="Check AlarmManager constants:PERIOD_DAY" status="approved"
+                               type="compliance" result="FAIL">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>Check AlarmManager constants:</step_desc>
+                                                       <expected>AlarmManager constants value is correct:</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_const_check.htm?total_num=4&amp;locator_key=id&amp;value=3
+                                       </test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" usage="true" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                               <result_info>
+                                       <actual_result>FAIL</actual_result>
+                                       <start>Sat Jan 01 2000 13:46:42 GMT+0900 (KST)</start>
+                                       <end>Sat Jan 01 2000 13:46:44 GMT+0900 (KST)</end>
+                                       <stdout>Can't find variable: tizen</stdout>
+                               </result_info>
+                       </testcase>
+                       <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"
+                               id="Alarm_AlarmManager_const_check_04" priority="P1"
+                               purpose="Check AlarmManager constants:PERIOD_WEEK" status="approved"
+                               type="compliance" result="FAIL">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>Check AlarmManager constants:</step_desc>
+                                                       <expected>AlarmManager constants value is correct:</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_const_check.htm?total_num=4&amp;locator_key=id&amp;value=4
+                                       </test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" usage="true" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                               <result_info>
+                                       <actual_result>FAIL</actual_result>
+                                       <start>Sat Jan 01 2000 13:46:44 GMT+0900 (KST)</start>
+                                       <end>Sat Jan 01 2000 13:46:46 GMT+0900 (KST)</end>
+                                       <stdout>Can't find variable: tizen</stdout>
+                               </result_info>
+                       </testcase>
+               </set>
+               <set name="Alarm">
+                       <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"
+                               id="Alarm_AlarmRelative_constructor_delay" priority="P1"
+                               purpose="check AlarmRelative attribute when create with delay"
+                               status="approved" type="compliance" result="PASS">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>check AlarmRelative create constructor with delay
+                                                       </step_desc>
+                                                       <expected>AlarmRelative create succeed with constructor with
+                                                               delay
+                                                       </expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_constructor_delay.htm
+                                       </test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" usage="true" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                               <result_info>
+                                       <actual_result>PASS</actual_result>
+                                       <start>Sat Jan 01 2000 13:43:44 GMT+0900 (KST)</start>
+                                       <end>Sat Jan 01 2000 13:43:46 GMT+0900 (KST)</end>
+                                       <stdout />
+                               </result_info>
+                       </testcase>
+                       <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"
+                               id="Alarm_AlarmManager_get" priority="P1"
+                               purpose="check AlarmManager method removeAll: without input attribute"
+                               status="approved" type="compliance" result="FAIL">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>check AlarmManager method get: default check
+                                                       </step_desc>
+                                                       <expected>AlarmManager method get: default check succeed
+                                                       </expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_get.htm
+                                       </test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" usage="true" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                               <result_info>
+                                       <actual_result>FAIL</actual_result>
+                                       <start>Sat Jan 01 2000 13:43:46 GMT+0900 (KST)</start>
+                                       <end>Sat Jan 01 2000 13:44:02 GMT+0900 (KST)</end>
+                                       <stdout>Test time out</stdout>
+                               </result_info>
+                       </testcase>
+                       <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"
+                               id="Alarm_AlarmAbsolute_attri_date_01" priority="P1"
+                               purpose="check AlarmAbsolute attribute when create with date"
+                               status="approved" type="compliance" result="FAIL">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>check AlarmAbsolute attribute when create with date
+                                                       </step_desc>
+                                                       <expected>AlarmAbsolute attribute return correct value when
+                                                               create with date
+                                                       </expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_attri_date.htm?total_num=3&amp;locator_key=id&amp;value=1
+                                       </test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" usage="true" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                               <result_info>
+                                       <actual_result>FAIL</actual_result>
+                                       <start>Sat Jan 01 2000 13:44:02 GMT+0900 (KST)</start>
+                                       <end>Sat Jan 01 2000 13:44:05 GMT+0900 (KST)</end>
+                                       <stdout />
+                               </result_info>
+                       </testcase>
+                       <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"
+                               id="Alarm_AlarmManager_add_rel" priority="P1"
+                               purpose="check AlarmManager method add: add relative alarm" status="approved"
+                               type="compliance" result="FAIL">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>check AlarmManager method add: add relative alarm
+                                                       </step_desc>
+                                                       <expected>AlarmManager method add: add relative alarm succeed
+                                                       </expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_add_rel.htm
+                                       </test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" usage="true" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                               <result_info>
+                                       <actual_result>FAIL</actual_result>
+                                       <start>Sat Jan 01 2000 13:44:05 GMT+0900 (KST)</start>
+                                       <end>Sat Jan 01 2000 13:44:21 GMT+0900 (KST)</end>
+                                       <stdout>Test time out</stdout>
+                               </result_info>
+                       </testcase>
+                       <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"
+                               id="Alarm_AlarmRelative_attri_delay_02" priority="P1"
+                               purpose="check AlarmAbsolute attribute when create with period"
+                               status="approved" type="compliance" result="FAIL">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>check AlarmRelative attribute when create with delay
+                                                       </step_desc>
+                                                       <expected>AlarmRelative attribute return correct value when
+                                                               create succeed with with delay
+                                                       </expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_attri_delay.htm?total_num=2&amp;locator_key=id&amp;value=2
+                                       </test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" usage="true" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                               <result_info>
+                                       <actual_result>FAIL</actual_result>
+                                       <start>Sat Jan 01 2000 13:44:21 GMT+0900 (KST)</start>
+                                       <end>Sat Jan 01 2000 13:44:23 GMT+0900 (KST)</end>
+                                       <stdout />
+                               </result_info>
+                       </testcase>
+               </set>
+       </suite>
+       <suite name="webapi-tizen-alarm-tests1" type="">
+               <set name="Alarm4">
+                       <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"
+                               id="Alarm_AlarmRelative_constructor_delay" priority="P1"
+                               purpose="check AlarmRelative attribute when create with delay"
+                               status="approved" type="compliance" result="PASS">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>check AlarmRelative create constructor with delay
+                                                       </step_desc>
+                                                       <expected>AlarmRelative create succeed with constructor with
+                                                               delay
+                                                       </expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_constructor_delay.htm
+                                       </test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" usage="true" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                               <result_info>
+                                       <actual_result>PASS</actual_result>
+                                       <start>Sat Jan 01 2000 13:43:44 GMT+0900 (KST)</start>
+                                       <end>Sat Jan 01 2000 13:43:46 GMT+0900 (KST)</end>
+                                       <stdout />
+                               </result_info>
+                       </testcase>
+                       <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"
+                               id="Alarm_AlarmManager_get" priority="P1"
+                               purpose="check AlarmManager method removeAll: without input attribute"
+                               status="approved" type="compliance" result="FAIL">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>check AlarmManager method get: default check
+                                                       </step_desc>
+                                                       <expected>AlarmManager method get: default check succeed
+                                                       </expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_get.htm
+                                       </test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" usage="true" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                               <result_info>
+                                       <actual_result>FAIL</actual_result>
+                                       <start>Sat Jan 01 2000 13:43:46 GMT+0900 (KST)</start>
+                                       <end>Sat Jan 01 2000 13:44:02 GMT+0900 (KST)</end>
+                                       <stdout>Test time out</stdout>
+                               </result_info>
+                       </testcase>
+                       <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"
+                               id="Alarm_AlarmAbsolute_attri_date_01" priority="P1"
+                               purpose="check AlarmAbsolute attribute when create with date"
+                               status="approved" type="compliance" result="FAIL">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>check AlarmAbsolute attribute when create with date
+                                                       </step_desc>
+                                                       <expected>AlarmAbsolute attribute return correct value when
+                                                               create with date
+                                                       </expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_attri_date.htm?total_num=3&amp;locator_key=id&amp;value=1
+                                       </test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" usage="true" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                               <result_info>
+                                       <actual_result>FAIL</actual_result>
+                                       <start>Sat Jan 01 2000 13:44:02 GMT+0900 (KST)</start>
+                                       <end>Sat Jan 01 2000 13:44:05 GMT+0900 (KST)</end>
+                                       <stdout />
+                               </result_info>
+                       </testcase>
+                       <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"
+                               id="Alarm_AlarmManager_add_rel" priority="P1"
+                               purpose="check AlarmManager method add: add relative alarm" status="approved"
+                               type="compliance" result="FAIL">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>check AlarmManager method add: add relative alarm
+                                                       </step_desc>
+                                                       <expected>AlarmManager method add: add relative alarm succeed
+                                                       </expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_add_rel.htm
+                                       </test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" usage="true" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                               <result_info>
+                                       <actual_result>FAIL</actual_result>
+                                       <start>Sat Jan 01 2000 13:44:05 GMT+0900 (KST)</start>
+                                       <end>Sat Jan 01 2000 13:44:21 GMT+0900 (KST)</end>
+                                       <stdout>Test time out</stdout>
+                               </result_info>
+                       </testcase>
+                       <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"
+                               id="Alarm_AlarmRelative_attri_delay_02" priority="P1"
+                               purpose="check AlarmAbsolute attribute when create with period"
+                               status="approved" type="compliance" result="FAIL">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>check AlarmRelative attribute when create with delay
+                                                       </step_desc>
+                                                       <expected>AlarmRelative attribute return correct value when
+                                                               create succeed with with delay
+                                                       </expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_attri_delay.htm?total_num=2&amp;locator_key=id&amp;value=2
+                                       </test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" usage="true" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                               <result_info>
+                                       <actual_result>FAIL</actual_result>
+                                       <start>Sat Jan 01 2000 13:44:21 GMT+0900 (KST)</start>
+                                       <end>Sat Jan 01 2000 13:44:23 GMT+0900 (KST)</end>
+                                       <stdout />
+                               </result_info>
+                       </testcase>
+                       <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"
+                               id="Alarm_AlarmManager_getAll" priority="P1"
+                               purpose="check AlarmManager method getAll: default check" status="approved"
+                               type="compliance" result="FAIL">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>check AlarmManager method getAll: default check
+                                                       </step_desc>
+                                                       <expected>AlarmManager method getAll: default check succeed
+                                                       </expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_getAll.htm
+                                       </test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" usage="true" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                               <result_info>
+                                       <actual_result>FAIL</actual_result>
+                                       <start>Sat Jan 01 2000 13:44:23 GMT+0900 (KST)</start>
+                                       <end>Sat Jan 01 2000 13:44:39 GMT+0900 (KST)</end>
+                                       <stdout>Test time out</stdout>
+                               </result_info>
+                       </testcase>
+                       <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"
+                               id="Alarm_AlarmAbsolute_attri_date_03" priority="P1"
+                               purpose="check AlarmAbsolute attribute when create with date"
+                               status="approved" type="compliance" result="FAIL">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>check AlarmAbsolute attribute when create with date
+                                                       </step_desc>
+                                                       <expected>AlarmAbsolute attribute return correct value when
+                                                               create with date
+                                                       </expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_attri_date.htm?total_num=3&amp;locator_key=id&amp;value=3
+                                       </test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" usage="true" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                               <result_info>
+                                       <actual_result>FAIL</actual_result>
+                                       <start>Sat Jan 01 2000 13:44:39 GMT+0900 (KST)</start>
+                                       <end>Sat Jan 01 2000 13:44:41 GMT+0900 (KST)</end>
+                                       <stdout />
+                               </result_info>
+                       </testcase>
+                       <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"
+                               id="Alarm_AlarmAbsolute_getNextScheduledDate_date" priority="P1"
+                               purpose="check AlarmAbsolute method getNextScheduledDate when create with date"
+                               status="approved" type="compliance" result="FAIL">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>check AlarmAbsolute method getNextScheduledDate when
+                                                               create with date
+                                                       </step_desc>
+                                                       <expected>AlarmAbsolute method getNextScheduledDate return
+                                                               correct value when create with date
+                                                       </expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_getNextScheduledDate_date.htm
+                                       </test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" usage="true" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                               <result_info>
+                                       <actual_result>FAIL</actual_result>
+                                       <start>Sat Jan 01 2000 13:44:41 GMT+0900 (KST)</start>
+                                       <end>Sat Jan 01 2000 13:44:57 GMT+0900 (KST)</end>
+                                       <stdout>Test time out</stdout>
+                               </result_info>
+                       </testcase>
+                       <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"
+                               id="Alarm_AlarmAbsolute_constructor_date" priority="P1"
+                               purpose="check AlarmAbsolute create constructor with date" status="approved"
+                               type="compliance" result="FAIL">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>check AlarmAbsolute create constructor with date
+                                                       </step_desc>
+                                                       <expected>AlarmAbsolute create succeed with constructor with date
+                                                       </expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_constructor_date.htm
+                                       </test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" usage="true" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                               <result_info>
+                                       <actual_result>FAIL</actual_result>
+                                       <start>Sat Jan 01 2000 13:44:57 GMT+0900 (KST)</start>
+                                       <end>Sat Jan 01 2000 13:45:13 GMT+0900 (KST)</end>
+                                       <stdout>Test time out</stdout>
+                               </result_info>
+                       </testcase>
+                       <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"
+                               id="Alarm_AlarmRelative_getRemainingSeconds_delay" priority="P1"
+                               purpose="check AlarmRelative method getNextScheduleddelay when create with delay"
+                               status="approved" type="compliance" result="FAIL">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>check AlarmRelative method getNextScheduleddelay when
+                                                               create with delay
+                                                       </step_desc>
+                                                       <expected>AlarmRelative method getNextScheduleddelay return
+                                                               correct value when create succeed with with delay
+                                                       </expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_getRemainingSeconds_delay.htm
+                                       </test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" usage="true" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                               <result_info>
+                                       <actual_result>FAIL</actual_result>
+                                       <start>Sat Jan 01 2000 13:45:13 GMT+0900 (KST)</start>
+                                       <end>Sat Jan 01 2000 13:45:30 GMT+0900 (KST)</end>
+                                       <stdout>Test time out</stdout>
+                               </result_info>
+                       </testcase>
+                       <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"
+                               id="Alarm_AlarmRelative_attri_delay_01" priority="P1"
+                               purpose="check AlarmAbsolute attribute when create with period"
+                               status="approved" type="compliance" result="FAIL">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>check AlarmRelative attribute when create with delay
+                                                       </step_desc>
+                                                       <expected>AlarmRelative attribute return correct value when
+                                                               create succeed with with delay
+                                                       </expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_attri_delay.htm?total_num=2&amp;locator_key=id&amp;value=1
+                                       </test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" usage="true" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                               <result_info>
+                                       <actual_result>FAIL</actual_result>
+                                       <start>Sat Jan 01 2000 13:45:30 GMT+0900 (KST)</start>
+                                       <end>Sat Jan 01 2000 13:45:32 GMT+0900 (KST)</end>
+                                       <stdout />
+                               </result_info>
+                       </testcase>
+                       <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"
+                               id="Alarm_AlarmManager_add_abs" priority="P1"
+                               purpose="check AlarmManager method add: add absolute alarm" status="approved"
+                               type="compliance" result="FAIL">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>check AlarmManager method add: add absolute alarm
+                                                       </step_desc>
+                                                       <expected>AlarmManager method add: add absolute alarm succeed
+                                                       </expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_add_abs.htm
+                                       </test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" usage="true" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                               <result_info>
+                                       <actual_result>FAIL</actual_result>
+                                       <start>Sat Jan 01 2000 13:45:32 GMT+0900 (KST)</start>
+                                       <end>Sat Jan 01 2000 13:45:48 GMT+0900 (KST)</end>
+                                       <stdout>Test time out</stdout>
+                               </result_info>
+                       </testcase>
+                       <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"
+                               id="Alarm_AlarmAbsolute_attri_date_02" priority="P1"
+                               purpose="check AlarmAbsolute attribute when create with date"
+                               status="approved" type="compliance" result="FAIL">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>check AlarmAbsolute attribute when create with date
+                                                       </step_desc>
+                                                       <expected>AlarmAbsolute attribute return correct value when
+                                                               create with date
+                                                       </expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_attri_date.htm?total_num=3&amp;locator_key=id&amp;value=2
+                                       </test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" usage="true" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                               <result_info>
+                                       <actual_result>FAIL</actual_result>
+                                       <start>Sat Jan 01 2000 13:45:48 GMT+0900 (KST)</start>
+                                       <end>Sat Jan 01 2000 13:45:50 GMT+0900 (KST)</end>
+                                       <stdout />
+                               </result_info>
+                       </testcase>
+                       <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"
+                               id="Alarm_AlarmManager_removeAll" priority="P1"
+                               purpose="check AlarmManager method removeAll: default check" status="approved"
+                               type="compliance" result="FAIL">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>check AlarmManager method removeAll: default check
+                                                       </step_desc>
+                                                       <expected>AlarmManager method removeAll: default check succeed
+                                                       </expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_removeAll.htm
+                                       </test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" usage="true" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                               <result_info>
+                                       <actual_result>FAIL</actual_result>
+                                       <start>Sat Jan 01 2000 13:45:50 GMT+0900 (KST)</start>
+                                       <end>Sat Jan 01 2000 13:46:06 GMT+0900 (KST)</end>
+                                       <stdout>Test time out</stdout>
+                               </result_info>
+                       </testcase>
+                       <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"
+                               id="Alarm_AlarmManager_remove" priority="P1"
+                               purpose="check AlarmManager method remove: default check" status="approved"
+                               type="compliance" result="FAIL">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>check AlarmManager method remove: default check
+                                                       </step_desc>
+                                                       <expected>AlarmManager method remove: default check succeed
+                                                       </expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_remove.htm
+                                       </test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" usage="true" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                               <result_info>
+                                       <actual_result>FAIL</actual_result>
+                                       <start>Sat Jan 01 2000 13:46:06 GMT+0900 (KST)</start>
+                                       <end>Sat Jan 01 2000 13:46:22 GMT+0900 (KST)</end>
+                                       <stdout>Test time out</stdout>
+                               </result_info>
+                       </testcase>
+                       <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"
+                               id="Alarm_AlarmManagerObject_exist" priority="P1"
+                               purpose="check AlarmManagerObject existance" status="approved" type="compliance"
+                               result="FAIL">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>check AlarmManagerObject exist</step_desc>
+                                                       <expected>AlarmManagerObject exist</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry test_script_expected_result="">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManagerObject_exist.htm
+                                       </test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" usage="true" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                               <result_info>
+                                       <actual_result>FAIL</actual_result>
+                                       <start>Sat Jan 01 2000 13:46:22 GMT+0900 (KST)</start>
+                                       <end>Sat Jan 01 2000 13:46:38 GMT+0900 (KST)</end>
+                                       <stdout>Test time out</stdout>
+                               </result_info>
+                       </testcase>
+                       <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"
+                               id="Alarm_AlarmManager_const_check_01" priority="P1"
+                               purpose="Check AlarmManager constants:PERIOD_MINUTE" status="approved"
+                               type="compliance" result="FAIL">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>Check AlarmManager constants:</step_desc>
+                                                       <expected>AlarmManager constants value is correct:</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_const_check.htm?total_num=4&amp;locator_key=id&amp;value=1
+                                       </test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" usage="true" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                               <result_info>
+                                       <actual_result>FAIL</actual_result>
+                                       <start>Sat Jan 01 2000 13:46:38 GMT+0900 (KST)</start>
+                                       <end>Sat Jan 01 2000 13:46:40 GMT+0900 (KST)</end>
+                                       <stdout>Can't find variable: tizen</stdout>
+                               </result_info>
+                       </testcase>
+                       <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"
+                               id="Alarm_AlarmManager_const_check_02" priority="P1"
+                               purpose="Check AlarmManager constants:PERIOD_HOUR" status="approved"
+                               type="compliance" result="FAIL">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>Check AlarmManager constants:</step_desc>
+                                                       <expected>AlarmManager constants value is correct:</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_const_check.htm?total_num=4&amp;locator_key=id&amp;value=2
+                                       </test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" usage="true" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                               <result_info>
+                                       <actual_result>FAIL</actual_result>
+                                       <start>Sat Jan 01 2000 13:46:40 GMT+0900 (KST)</start>
+                                       <end>Sat Jan 01 2000 13:46:42 GMT+0900 (KST)</end>
+                                       <stdout>Can't find variable: tizen</stdout>
+                               </result_info>
+                       </testcase>
+                       <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"
+                               id="Alarm_AlarmManager_const_check_03" priority="P1"
+                               purpose="Check AlarmManager constants:PERIOD_DAY" status="approved"
+                               type="compliance" result="FAIL">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>Check AlarmManager constants:</step_desc>
+                                                       <expected>AlarmManager constants value is correct:</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_const_check.htm?total_num=4&amp;locator_key=id&amp;value=3
+                                       </test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" usage="true" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                               <result_info>
+                                       <actual_result>FAIL</actual_result>
+                                       <start>Sat Jan 01 2000 13:46:42 GMT+0900 (KST)</start>
+                                       <end>Sat Jan 01 2000 13:46:44 GMT+0900 (KST)</end>
+                                       <stdout>Can't find variable: tizen</stdout>
+                               </result_info>
+                       </testcase>
+                       <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"
+                               id="Alarm_AlarmManager_const_check_04" priority="P1"
+                               purpose="Check AlarmManager constants:PERIOD_WEEK" status="approved"
+                               type="compliance" result="FAIL">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>Check AlarmManager constants:</step_desc>
+                                                       <expected>AlarmManager constants value is correct:</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_const_check.htm?total_num=4&amp;locator_key=id&amp;value=4
+                                       </test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" usage="true" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                               <result_info>
+                                       <actual_result>FAIL</actual_result>
+                                       <start>Sat Jan 01 2000 13:46:44 GMT+0900 (KST)</start>
+                                       <end>Sat Jan 01 2000 13:46:46 GMT+0900 (KST)</end>
+                                       <stdout>Can't find variable: tizen</stdout>
+                               </result_info>
+                       </testcase>
+               </set>
+               <set name="Alarm3">
+                       <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"
+                               id="Alarm_AlarmRelative_constructor_delay" priority="P1"
+                               purpose="check AlarmRelative attribute when create with delay"
+                               status="approved" type="compliance" result="PASS">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>check AlarmRelative create constructor with delay
+                                                       </step_desc>
+                                                       <expected>AlarmRelative create succeed with constructor with
+                                                               delay
+                                                       </expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_constructor_delay.htm
+                                       </test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" usage="true" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                               <result_info>
+                                       <actual_result>PASS</actual_result>
+                                       <start>Sat Jan 01 2000 13:43:44 GMT+0900 (KST)</start>
+                                       <end>Sat Jan 01 2000 13:43:46 GMT+0900 (KST)</end>
+                                       <stdout />
+                               </result_info>
+                       </testcase>
+                       <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"
+                               id="Alarm_AlarmManager_get" priority="P1"
+                               purpose="check AlarmManager method removeAll: without input attribute"
+                               status="approved" type="compliance" result="FAIL">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>check AlarmManager method get: default check
+                                                       </step_desc>
+                                                       <expected>AlarmManager method get: default check succeed
+                                                       </expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_get.htm
+                                       </test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" usage="true" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                               <result_info>
+                                       <actual_result>FAIL</actual_result>
+                                       <start>Sat Jan 01 2000 13:43:46 GMT+0900 (KST)</start>
+                                       <end>Sat Jan 01 2000 13:44:02 GMT+0900 (KST)</end>
+                                       <stdout>Test time out</stdout>
+                               </result_info>
+                       </testcase>
+                       <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"
+                               id="Alarm_AlarmAbsolute_attri_date_01" priority="P1"
+                               purpose="check AlarmAbsolute attribute when create with date"
+                               status="approved" type="compliance" result="FAIL">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>check AlarmAbsolute attribute when create with date
+                                                       </step_desc>
+                                                       <expected>AlarmAbsolute attribute return correct value when
+                                                               create with date
+                                                       </expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_attri_date.htm?total_num=3&amp;locator_key=id&amp;value=1
+                                       </test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" usage="true" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                               <result_info>
+                                       <actual_result>FAIL</actual_result>
+                                       <start>Sat Jan 01 2000 13:44:02 GMT+0900 (KST)</start>
+                                       <end>Sat Jan 01 2000 13:44:05 GMT+0900 (KST)</end>
+                                       <stdout />
+                               </result_info>
+                       </testcase>
+                       <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"
+                               id="Alarm_AlarmManager_add_rel" priority="P1"
+                               purpose="check AlarmManager method add: add relative alarm" status="approved"
+                               type="compliance" result="FAIL">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>check AlarmManager method add: add relative alarm
+                                                       </step_desc>
+                                                       <expected>AlarmManager method add: add relative alarm succeed
+                                                       </expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_add_rel.htm
+                                       </test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" usage="true" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                               <result_info>
+                                       <actual_result>FAIL</actual_result>
+                                       <start>Sat Jan 01 2000 13:44:05 GMT+0900 (KST)</start>
+                                       <end>Sat Jan 01 2000 13:44:21 GMT+0900 (KST)</end>
+                                       <stdout>Test time out</stdout>
+                               </result_info>
+                       </testcase>
+                       <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"
+                               id="Alarm_AlarmRelative_attri_delay_02" priority="P1"
+                               purpose="check AlarmAbsolute attribute when create with period"
+                               status="approved" type="compliance" result="FAIL">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>check AlarmRelative attribute when create with delay
+                                                       </step_desc>
+                                                       <expected>AlarmRelative attribute return correct value when
+                                                               create succeed with with delay
+                                                       </expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_attri_delay.htm?total_num=2&amp;locator_key=id&amp;value=2
+                                       </test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" usage="true" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                               <result_info>
+                                       <actual_result>FAIL</actual_result>
+                                       <start>Sat Jan 01 2000 13:44:21 GMT+0900 (KST)</start>
+                                       <end>Sat Jan 01 2000 13:44:23 GMT+0900 (KST)</end>
+                                       <stdout />
+                               </result_info>
+                       </testcase>
+               </set>
+       </suite>
+</test_definition>
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/xsd/test_definition.xsd b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/xsd/test_definition.xsd
new file mode 100644 (file)
index 0000000..9653308
--- /dev/null
@@ -0,0 +1,383 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+       <xs:element name="suite">
+
+
+               <xs:complexType>
+
+                       <xs:sequence minOccurs="1" maxOccurs="unbounded">
+                               <xs:element ref="set" minOccurs="0" maxOccurs="unbounded"></xs:element>
+                       </xs:sequence>
+
+                       <xs:attributeGroup ref="set_attribute_group"></xs:attributeGroup>
+                       <xs:attribute name="launcher" type="xs:string"></xs:attribute>
+               </xs:complexType>
+               <xs:unique name="uniqueSetName">
+                       <xs:selector xpath=".//set" />
+                       <xs:field xpath="@name" />
+               </xs:unique>
+       </xs:element>
+
+       <xs:element name="set">
+
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="capabilities" type="CapabilitiesType"
+                                       minOccurs="0" maxOccurs="1">
+                               </xs:element>
+                               <xs:sequence minOccurs="1" maxOccurs="unbounded">
+                                       <xs:element ref="testcase" minOccurs="0"
+                                               maxOccurs="unbounded">
+                                       </xs:element>
+                               </xs:sequence>
+                       </xs:sequence>
+
+
+
+                       <xs:attributeGroup ref="set_attribute_group"></xs:attributeGroup>
+                       <xs:attribute name="launcher" type="xs:string"></xs:attribute>
+                       <xs:attribute name="set_debug_msg" type="xs:string"></xs:attribute>
+               </xs:complexType>
+               <xs:unique name="uniqueCaseName">
+                       <xs:selector xpath=".//testcase" />
+                       <xs:field xpath="@id" />
+               </xs:unique>
+       </xs:element>
+
+       <xs:element name="testcase">
+               <xs:complexType>
+                       <xs:sequence minOccurs="1">
+                               <xs:element ref="description"></xs:element>
+                               <xs:element name="categories" type="categories"
+                                       minOccurs="0" maxOccurs="1">
+                               </xs:element>
+                               <xs:element name="measurement" type="measurementType"
+                                       minOccurs="0" maxOccurs="unbounded">
+                               </xs:element>
+                               <xs:element name="series" type="seriesType" minOccurs="0"
+                                       maxOccurs="unbounded">
+                               </xs:element>
+                               <xs:element name="specs" type="specsType" minOccurs="0"
+                                       maxOccurs="1">
+                               </xs:element>
+                               <xs:element name="result_info" type="result_info_type"
+                                       minOccurs="0">
+                               </xs:element>
+                       </xs:sequence>
+
+                       <xs:attributeGroup ref="case_attribute_group"></xs:attributeGroup>
+               </xs:complexType>
+       </xs:element>
+
+       <xs:element name="steps">
+               <xs:complexType>
+                       <xs:sequence minOccurs="0" maxOccurs="unbounded">
+                               <xs:element ref="step"></xs:element>
+                       </xs:sequence>
+               </xs:complexType>
+               <xs:unique name="uniqueStepName">
+                       <xs:selector xpath=".//step" />
+                       <xs:field xpath="@order" />
+               </xs:unique>
+       </xs:element>
+
+       <xs:attributeGroup name="set_attribute_group">
+
+               <xs:attribute name="name" type="xs:anyURI" use="required"></xs:attribute>
+               <xs:attribute name="type" type="xs:string"></xs:attribute>
+       </xs:attributeGroup>
+
+       <xs:attributeGroup name="case_attribute_group">
+
+               <xs:attribute name="id" use="required">
+                       <xs:simpleType>
+                               <xs:restriction base="xs:string">
+                                       <xs:minLength value="1"></xs:minLength>
+                                       <xs:whiteSpace value="collapse"></xs:whiteSpace>
+                               </xs:restriction>
+                       </xs:simpleType>
+               </xs:attribute>
+
+               <xs:attribute name="priority" type="priority_simple_type"
+                       use="required">
+               </xs:attribute>
+
+               <xs:attribute name="execution_type" type="execution_type_simple_type"
+                       use="required">
+               </xs:attribute>
+
+               <xs:attribute name="component" type="xs:string"></xs:attribute>
+
+               <xs:attribute name="requirement_ref" type="xs:anyURI"
+                       use="optional">
+               </xs:attribute>
+
+               <xs:attribute name="status" type="status_type" use="required"></xs:attribute>
+
+               <xs:attribute name="type" type="case_type_type" use="required">
+               </xs:attribute>
+               <xs:attribute name="purpose" type="xs:string"></xs:attribute>
+               <xs:attribute name="result" type="xs:string"></xs:attribute>
+               <xs:attribute name="onload_delay" type="xs:int" use="optional"
+                       default="3">
+               </xs:attribute>
+       </xs:attributeGroup>
+
+       <xs:simpleType name="priority_simple_type">
+               <xs:restriction base="xs:string">
+
+                       <xs:enumeration value="P0"></xs:enumeration>
+
+                       <xs:enumeration value="P1"></xs:enumeration>
+
+                       <xs:enumeration value="P2"></xs:enumeration>
+
+                       <xs:enumeration value="P3"></xs:enumeration>
+
+                       <xs:enumeration value="P4"></xs:enumeration>
+
+               </xs:restriction>
+       </xs:simpleType>
+
+       <xs:simpleType name="execution_type_simple_type">
+               <xs:restriction base="xs:string">
+
+                       <xs:enumeration value="auto"></xs:enumeration>
+
+                       <xs:enumeration value="manual"></xs:enumeration>
+               </xs:restriction>
+       </xs:simpleType>
+
+       <xs:simpleType name="status_type">
+               <xs:restriction base="xs:string">
+
+                       <xs:enumeration value="designed"></xs:enumeration>
+
+                       <xs:enumeration value="ready"></xs:enumeration>
+
+                       <xs:enumeration value="approved"></xs:enumeration>
+               </xs:restriction>
+       </xs:simpleType>
+
+       <xs:simpleType name="case_type_type">
+               <xs:restriction base="xs:string">
+
+                       <xs:enumeration value="functional_positive"></xs:enumeration>
+
+                       <xs:enumeration value="functional_negative"></xs:enumeration>
+
+                       <xs:enumeration value="security"></xs:enumeration>
+
+                       <xs:enumeration value="performance"></xs:enumeration>
+
+                       <xs:enumeration value="reliability"></xs:enumeration>
+
+                       <xs:enumeration value="portability"></xs:enumeration>
+
+                       <xs:enumeration value="maintainability"></xs:enumeration>
+
+                       <xs:enumeration value="compliance"></xs:enumeration>
+
+                       <xs:enumeration value="user_experience"></xs:enumeration>
+
+                       <xs:enumeration value="undefined"></xs:enumeration>
+               </xs:restriction>
+       </xs:simpleType>
+
+
+       <xs:element name="purpose" type="xs:anySimpleType"></xs:element>
+
+       <xs:element name="notes" type="xs:string"></xs:element>
+
+       <xs:element name="pre_condition" type="xs:string"></xs:element>
+
+       <xs:element name="post_condition" type="xs:string"></xs:element>
+
+       <xs:element name="description">
+
+               <xs:complexType>
+
+                       <xs:sequence minOccurs="1" maxOccurs="unbounded">
+
+                               <xs:choice minOccurs="0" maxOccurs="1">
+                                       <xs:element ref="notes"></xs:element>
+                               </xs:choice>
+
+                               <xs:choice minOccurs="0" maxOccurs="1">
+                                       <xs:element ref="pre_condition"></xs:element>
+                               </xs:choice>
+
+                               <xs:choice minOccurs="0" maxOccurs="1">
+                                       <xs:element ref="post_condition"></xs:element>
+                               </xs:choice>
+
+                               <xs:element ref="steps" minOccurs="1" maxOccurs="1"></xs:element>
+
+                               <xs:choice minOccurs="0" maxOccurs="1">
+                                       <xs:element ref="test_script_entry"></xs:element>
+                               </xs:choice>
+
+
+                       </xs:sequence>
+
+               </xs:complexType>
+       </xs:element>
+
+       <xs:element name="step">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:element name="step_desc" type="xs:string"></xs:element>
+                               <xs:element name="expected" type="xs:string"></xs:element>
+                       </xs:sequence>
+                       <xs:attribute name="order" type="xs:int"></xs:attribute>
+               </xs:complexType>
+       </xs:element>
+
+       <xs:element name="test_script_entry">
+               <xs:complexType>
+                       <xs:simpleContent>
+                               <xs:extension base="xs:string">
+                                       <xs:attribute name="test_script_expected_result" type="xs:string"
+                                               default="0">
+                                       </xs:attribute>
+                                       <xs:attribute name="timeout" type="xs:int" default="90">
+                                       </xs:attribute>
+                               </xs:extension>
+                       </xs:simpleContent>
+               </xs:complexType>
+       </xs:element>
+
+       <xs:complexType name="result_info_type">
+               <xs:sequence minOccurs="0">
+                       <xs:element name="actual_result" type="xs:string"></xs:element>
+                       <xs:element name="start" type="xs:string"></xs:element>
+                       <xs:element name="end" type="xs:string"></xs:element>
+                       <xs:element name="stdout" type="xs:string" minOccurs="0"></xs:element>
+                       <xs:element name="stderr" type="xs:string" minOccurs="0"></xs:element>
+               </xs:sequence>
+       </xs:complexType>
+
+       <xs:complexType name="measurementType">
+               <xs:attribute name="name" type="xs:string"></xs:attribute>
+               <xs:attribute name="value" type="xs:string"></xs:attribute>
+               <xs:attribute name="unit" type="xs:string"></xs:attribute>
+               <xs:attribute name="target" type="xs:string"></xs:attribute>
+               <xs:attribute name="failure" type="xs:string"></xs:attribute>
+               <xs:attribute name="power" type="xs:string"></xs:attribute>
+       </xs:complexType>
+
+       <xs:complexType name="seriesType">
+               <xs:sequence>
+                       <xs:element name="measurement" type="simpleMeasurementType"
+                               minOccurs="1" maxOccurs="unbounded"></xs:element>
+               </xs:sequence>
+               <xs:attribute name="name" type="xs:string"></xs:attribute>
+               <xs:attribute name="group" type="xs:string"></xs:attribute>
+               <xs:attribute name="unit" type="xs:string"></xs:attribute>
+               <xs:attribute name="interval" type="xs:string"></xs:attribute>
+               <xs:attribute name="interval_unit" type="xs:string"></xs:attribute>
+               <xs:attribute name="power" type="xs:string"></xs:attribute>
+       </xs:complexType>
+
+       <xs:complexType name="simpleMeasurementType">
+               <xs:attribute name="value" type="xs:string"></xs:attribute>
+               <xs:attribute name="file" type="xs:string"></xs:attribute>
+       </xs:complexType>
+
+
+       <xs:complexType name="categories">
+               <xs:sequence>
+                       <xs:element name="category" type="xs:string" maxOccurs="unbounded"
+                               minOccurs="0"></xs:element>
+               </xs:sequence>
+       </xs:complexType>
+
+       <xs:element name="test_definition">
+               <xs:complexType>
+                       <xs:sequence minOccurs="1" maxOccurs="unbounded">
+                               <xs:element name="environment" type="BuildInfoType"
+                                       minOccurs="0">
+                               </xs:element>
+                               <xs:element name="summary" type="summaryType" minOccurs="0">
+                               </xs:element>
+                               <xs:element ref="suite" minOccurs="1" maxOccurs="unbounded">
+                               </xs:element>
+                       </xs:sequence>
+               </xs:complexType>
+               <xs:unique name="uniqueSuiteName">
+                       <xs:selector xpath=".//suite" />
+                       <xs:field xpath="@name" />
+               </xs:unique>
+       </xs:element>
+
+
+
+       <xs:complexType name="BuildInfoType">
+               <xs:sequence>
+                       <xs:element name="other" type="xs:string"></xs:element>
+               </xs:sequence>
+               <xs:attribute name="device_name" type="xs:string"></xs:attribute>
+               <xs:attribute name="device_model" type="xs:string"></xs:attribute>
+               <xs:attribute name="os_version" type="xs:string"></xs:attribute>
+               <xs:attribute name="device_id" type="xs:string"></xs:attribute>
+               <xs:attribute name="firmware_version" type="xs:string"></xs:attribute>
+               <xs:attribute name="screen_size" type="xs:string"></xs:attribute>
+               <xs:attribute name="resolution" type="xs:string"></xs:attribute>
+               <xs:attribute name="host" type="xs:string"></xs:attribute>
+               <xs:attribute name="cts_version" type="xs:string"></xs:attribute>
+               <xs:attribute name="build_id" type="xs:string"></xs:attribute>
+       </xs:complexType>
+
+
+       <xs:complexType name="summaryType">
+               <xs:sequence>
+                       <xs:element name="start_at" type="xs:string"></xs:element>
+                       <xs:element name="end_at" type="xs:string"></xs:element>
+               </xs:sequence>
+               <xs:attribute name="test_plan_name" type="xs:string"></xs:attribute>
+       </xs:complexType>
+
+
+       <xs:complexType name="specsType">
+               <xs:sequence>
+                       <xs:element name="spec" type="specType" maxOccurs="unbounded"></xs:element>
+               </xs:sequence>
+       </xs:complexType>
+
+       <xs:complexType name="specType">
+               <xs:sequence>
+                       <xs:element name="spec_assertion" type="spec_assertionType"></xs:element>
+                       <xs:element name="spec_url" type="xs:string"></xs:element>
+                       <xs:element name="spec_statement" type="xs:string"></xs:element>
+               </xs:sequence>
+       </xs:complexType>
+
+       <xs:complexType name="spec_assertionType">
+               <xs:attribute name="category" type="xs:string" use="required"></xs:attribute>
+               <xs:attribute name="section" type="xs:string" use="required"></xs:attribute>
+               <xs:attribute name="specification" type="xs:string" use="required">
+               </xs:attribute>
+               <xs:attribute name="interface" type="xs:string" use="required">
+               </xs:attribute>
+               <xs:attribute name="element_name" type="xs:string" use="optional">
+               </xs:attribute>
+               <xs:attribute name="usage" type="xs:boolean" default="false"></xs:attribute>
+               <xs:attribute name="element_type" type="xs:string"></xs:attribute>
+       </xs:complexType>
+
+       <xs:complexType name="CapabilitiesType">
+               <xs:sequence>
+                       <xs:element name="capability" type="CapabilityType"
+                               minOccurs="1" maxOccurs="unbounded"></xs:element>
+               </xs:sequence>
+       </xs:complexType>
+
+       <xs:complexType name="CapabilityType">
+               <xs:sequence minOccurs="0">
+                       <xs:element name="value" type="xs:string"></xs:element>
+               </xs:sequence>
+               <xs:attribute name="name" type="xs:string" use="required"></xs:attribute>
+       </xs:complexType>
+</xs:schema>
+
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/xsd/testcase.xsl b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/xsd/testcase.xsl
new file mode 100644 (file)
index 0000000..c25a6c6
--- /dev/null
@@ -0,0 +1,216 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet version="1.0"
+       xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+       <xsl:output method="html" version="1.0" encoding="UTF-8"
+               indent="yes" />
+       <xsl:template match="/">
+               <html>
+                       <STYLE type="text/css">
+                               @import "tests.css";
+                       </STYLE>
+                       <head>
+                               <script type="text/javascript" src="jquery.min.js" />
+                       </head>
+                       <body>
+                               <div id="testcasepage">
+                                       <div id="title">
+                                               <table>
+                                                       <tr>
+                                                               <td>
+                                                                       <h1>Test Cases</h1>
+                                                               </td>
+                                                       </tr>
+                                               </table>
+                                       </div>
+                                       <div id="suites">
+                                               <a name="contents"></a>
+                                               <table>
+                                                       <tr>
+                                                               <th>Test Suite</th>
+                                                               <th>Total</th>
+                                                               <th>Auto</th>
+                                                               <th>Manual</th>
+                                                       </tr>
+                                                       <tr>
+                                                               <td>
+                                                                       Total
+                                                               </td>
+                                                               <td>
+                                                                       <xsl:value-of select="count(test_definition/suite/set//testcase)" />
+                                                               </td>
+                                                               <td>
+                                                                       <xsl:value-of
+                                                                               select="count(test_definition/suite/set//testcase[@execution_type = 'auto'])" />
+                                                               </td>
+                                                               <td>
+                                                                       <xsl:value-of
+                                                                               select="count(test_definition/suite/set//testcase[@execution_type != 'auto'])" />
+                                                               </td>
+                                                       </tr>
+                                                       <xsl:for-each select="test_definition/suite">
+                                                               <tr>
+                                                                       <td>
+                                                                               <a>
+                                                                                       <xsl:attribute name="href">
+                                                                                      #<xsl:value-of
+                                                                                               select="@name" />
+                                                                                   </xsl:attribute>
+                                                                                       <xsl:value-of select="@name" />
+                                                                               </a>
+                                                                       </td>
+                                                                       <td>
+                                                                               <xsl:value-of select="count(set//testcase)" />
+                                                                       </td>
+                                                                       <td>
+                                                                               <xsl:value-of select="count(set/testcase[@execution_type = 'auto'])" />
+                                                                       </td>
+                                                                       <td>
+                                                                               <xsl:value-of select="count(set/testcase[@execution_type != 'auto'])" />
+                                                                       </td>
+                                                               </tr>
+                                                       </xsl:for-each>
+                                               </table>
+                                       </div>
+                                       <div id="title">
+                                               <table>
+                                                       <tr>
+                                                               <td class="title">
+                                                                       <h1>Detailed Test Cases</h1>
+                                                               </td>
+                                                       </tr>
+                                               </table>
+                                       </div>
+                                       <div id="cases">
+                                               <xsl:for-each select="test_definition/suite">
+                                                       <xsl:sort select="@name" />
+                                                       <div id="btc">
+                                                               <a href="#contents">Back to Contents</a>
+                                                       </div>
+                                                       <div id="suite_title">
+                                                               Test Suite:
+                                                               <xsl:value-of select="@name" />
+                                                               <a>
+                                                                       <xsl:attribute name="name">
+                                                                     <xsl:value-of
+                                                                               select="@name" />
+                                                                  </xsl:attribute>
+                                                               </a>
+                                                       </div>
+                                                       <table>
+                                                               <tr>
+                                                                       <th>Case_ID</th>
+                                                                       <th>Purpose</th>
+                                                                       <th>Type</th>
+                                                                       <th>Component</th>
+                                                                       <th>Execution Type</th>
+                                                                       <th>Description</th>
+                                                                       <th>Specification</th>
+                                                               </tr>
+                                                               <xsl:for-each select=".//set">
+                                                                       <xsl:sort select="@name" />
+                                                                       <tr>
+                                                                               <td colspan="7">
+                                                                                       Test Set:
+                                                                                       <xsl:value-of select="@name" />
+                                                                               </td>
+                                                                       </tr>
+                                                                       <xsl:for-each select=".//testcase">
+                                                                               <!-- xsl:sort select="@id" /> -->
+                                                                               <tr>
+                                                                                       <td>
+                                                                                               <xsl:value-of select="@id" />
+                                                                                       </td>
+                                                                                       <td>
+                                                                                               <xsl:value-of select="@purpose" />
+                                                                                       </td>
+                                                                                       <td>
+                                                                                               <xsl:value-of select="@type" />
+                                                                                       </td>
+                                                                                       <td>
+                                                                                               <xsl:value-of select="@component" />
+                                                                                       </td>
+                                                                                       <td>
+                                                                                               <xsl:value-of select="@execution_type" />
+                                                                                       </td>
+                                                                                       <td>
+                                                                                               <p>
+                                                                                                       Pre_condition:
+                                                                                                       <xsl:value-of select=".//description/pre_condition" />
+                                                                                               </p>
+                                                                                               <p>
+                                                                                                       Post_condition:
+                                                                                                       <xsl:value-of select=".//description/post_condition" />
+                                                                                               </p>
+                                                                                               <p>
+                                                                                                       Test Script Entry:
+                                                                                                       <xsl:value-of select=".//description/test_script_entry" />
+                                                                                               </p>
+                                                                                               <p>
+                                                                                                       Steps:
+                                                                                                       <p />
+                                                                                                       <xsl:for-each select=".//description/steps/step">
+                                                                                                               <xsl:sort select="@order" />
+                                                                                                               Step
+                                                                                                               <xsl:value-of select="@order" />
+                                                                                                               :
+                                                                                                               <xsl:value-of select="./step_desc" />
+                                                                                                               ;
+                                                                                                               <p />
+                                                                                                               Expected Result:
+                                                                                                               <xsl:value-of select="./expected" />
+                                                                                                               <p />
+                                                                                                       </xsl:for-each>
+                                                                                               </p>
+                                                                                       </td>
+                                                                                       <td>
+                                                                                               <xsl:for-each select=".//specs/spec">
+                                                                                                       <b>[Spec_Assertion]:</b>
+                                                                                                       <br />
+                                                                                                       [Category]:
+                                                                                                       <xsl:value-of select="./spec_assertion/@category" />
+                                                                                                       <br />
+                                                                                                       [Section]:
+                                                                                                       <xsl:value-of select="./spec_assertion/@section" />
+                                                                                                       <br />
+                                                                                                       [Specification]:
+                                                                                                       <xsl:value-of select="./spec_assertion/@specification" />
+                                                                                                       <br />
+                                                                                                       [Interface]:
+                                                                                                       <xsl:value-of select="./spec_assertion/@interface" />
+                                                                                                       <br />
+                                                                                                       <xsl:choose>
+                                                                                                               <xsl:when test="./spec_assertion/@element_name">
+                                                                                                                       [<xsl:value-of select="./spec_assertion/@element_type" />]:
+                                                                                                                       <xsl:value-of select="./spec_assertion/@element_name" />
+                                                                                                                       <br />
+                                                                                                               </xsl:when>
+                                                                                                       </xsl:choose>
+
+                                                                                                       [URL]:
+                                                                                                       <xsl:value-of select="./spec_url" />
+                                                                                                       <br />
+                                                                                                       [Statement]:
+                                                                                                       <xsl:value-of select="./spec_statement" />
+                                                                                                       <br />
+                                                                                               </xsl:for-each>
+                                                                                       </td>
+                                                                               </tr>
+                                                                       </xsl:for-each>
+                                                               </xsl:for-each>
+                                                       </table>
+                                               </xsl:for-each>
+                                       </div>
+                               </div>
+                               <div id="goTopBtn">
+                                       <img border="0" src="./back_top.png" />
+                               </div>
+                               <script type="text/javascript" src="application.js" />
+                               <script language="javascript" type="text/javascript">
+                                       $(document).ready(function(){
+                                       goTopEx();
+                                       });
+                               </script>
+                       </body>
+               </html>
+       </xsl:template>
+</xsl:stylesheet>
\ No newline at end of file
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/xsd/testresult.xsl b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/xsd/testresult.xsl
new file mode 100644 (file)
index 0000000..c20a914
--- /dev/null
@@ -0,0 +1,522 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet version="1.0"
+       xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+       <xsl:output method="html" version="1.0" encoding="UTF-8"
+               indent="yes" />
+       <xsl:template match="/">
+               <html>
+                       <STYLE type="text/css">
+                               @import "tests.css";
+                       </STYLE>
+                       <head>
+                               <script type="text/javascript" src="jquery.min.js" />
+                       </head>
+                       <body>
+                               <div id="testcasepage">
+                                       <div id="title">
+                                               <table>
+                                                       <tr>
+                                                               <td>
+                                                                       <h1>Test Report</h1>
+                                                               </td>
+                                                       </tr>
+                                               </table>
+                                       </div>
+                                       <div id="device">
+                                               <table>
+                                                       <tr>
+                                                               <th colspan="2">Device Information</th>
+                                                       </tr>
+                                                       <tr>
+                                                               <td>Device Name</td>
+                                                               <td>
+                                                                       <xsl:choose>
+                                                                               <xsl:when test="test_definition/environment/@device_name">
+                                                                                       <xsl:if test="test_definition/environment/@device_name = ''">
+                                                                                               N/A
+                                                                                       </xsl:if>
+                                                                                       <xsl:value-of select="test_definition/environment/@device_name" />
+                                                                               </xsl:when>
+                                                                               <xsl:otherwise>
+                                                                                       N/A
+                                                                               </xsl:otherwise>
+                                                                       </xsl:choose>
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <td>Device Model</td>
+                                                               <td>
+                                                                       <xsl:choose>
+                                                                               <xsl:when test="test_definition/environment/@device_model">
+                                                                                       <xsl:if test="test_definition/environment/@device_model = ''">
+                                                                                               N/A
+                                                                                       </xsl:if>
+                                                                                       <xsl:value-of select="test_definition/environment/@device_model" />
+                                                                               </xsl:when>
+                                                                               <xsl:otherwise>
+                                                                                       N/A
+                                                                               </xsl:otherwise>
+                                                                       </xsl:choose>
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <td>OS Version</td>
+                                                               <td>
+                                                                       <xsl:choose>
+                                                                               <xsl:when test="test_definition/environment/@os_version">
+                                                                                       <xsl:if test="test_definition/environment/@os_version = ''">
+                                                                                               N/A
+                                                                                       </xsl:if>
+                                                                                       <xsl:value-of select="test_definition/environment/@os_version" />
+                                                                               </xsl:when>
+                                                                               <xsl:otherwise>
+                                                                                       N/A
+                                                                               </xsl:otherwise>
+                                                                       </xsl:choose>
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <td>Device ID</td>
+                                                               <td>
+                                                                       <xsl:choose>
+                                                                               <xsl:when test="test_definition/environment/@device_id">
+                                                                                       <xsl:if test="test_definition/environment/@device_id = ''">
+                                                                                               N/A
+                                                                                       </xsl:if>
+                                                                                       <xsl:value-of select="test_definition/environment/@device_id" />
+                                                                               </xsl:when>
+                                                                               <xsl:otherwise>
+                                                                                       N/A
+                                                                               </xsl:otherwise>
+                                                                       </xsl:choose>
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <td>Firmware Version</td>
+                                                               <td>
+                                                                       <xsl:choose>
+                                                                               <xsl:when test="test_definition/environment/@firmware_version">
+                                                                                       <xsl:if test="test_definition/environment/@firmware_version = ''">
+                                                                                               N/A
+                                                                                       </xsl:if>
+                                                                                       <xsl:value-of select="test_definition/environment/@firmware_version" />
+                                                                               </xsl:when>
+                                                                               <xsl:otherwise>
+                                                                                       N/A
+                                                                               </xsl:otherwise>
+                                                                       </xsl:choose>
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <td>Build ID</td>
+                                                               <td>
+                                                                       <xsl:choose>
+                                                                               <xsl:when test="test_definition/environment/@build_id">
+                                                                                       <xsl:if test="test_definition/environment/@build_id = ''">
+                                                                                               N/A
+                                                                                       </xsl:if>
+                                                                                       <xsl:value-of select="test_definition/environment/@build_id" />
+                                                                               </xsl:when>
+                                                                               <xsl:otherwise>
+                                                                                       N/A
+                                                                               </xsl:otherwise>
+                                                                       </xsl:choose>
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <td>Screen Size</td>
+                                                               <td>
+                                                                       <xsl:choose>
+                                                                               <xsl:when test="test_definition/environment/@screen_size">
+                                                                                       <xsl:if test="test_definition/environment/@screen_size = ''">
+                                                                                               N/A
+                                                                                       </xsl:if>
+                                                                                       <xsl:value-of select="test_definition/environment/@screen_size" />
+                                                                               </xsl:when>
+                                                                               <xsl:otherwise>
+                                                                                       N/A
+                                                                               </xsl:otherwise>
+                                                                       </xsl:choose>
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <td>Resolution</td>
+                                                               <td>
+                                                                       <xsl:choose>
+                                                                               <xsl:when test="test_definition/environment/@resolution">
+                                                                                       <xsl:if test="test_definition/environment/@resolution = ''">
+                                                                                               N/A
+                                                                                       </xsl:if>
+                                                                                       <xsl:value-of select="test_definition/environment/@resolution" />
+                                                                               </xsl:when>
+                                                                               <xsl:otherwise>
+                                                                                       N/A
+                                                                               </xsl:otherwise>
+                                                                       </xsl:choose>
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <td>Host Info</td>
+                                                               <td>
+                                                                       <xsl:choose>
+                                                                               <xsl:when test="test_definition/environment/@host">
+                                                                                       <xsl:if test="test_definition/environment/@host = ''">
+                                                                                               N/A
+                                                                                       </xsl:if>
+                                                                                       <xsl:value-of select="test_definition/environment/@host" />
+                                                                               </xsl:when>
+                                                                               <xsl:otherwise>
+                                                                                       N/A
+                                                                               </xsl:otherwise>
+                                                                       </xsl:choose>
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <td>CTS Version</td>
+                                                               <td>
+                                                                       <xsl:choose>
+                                                                               <xsl:when test="test_definition/environment/@cts_version">
+                                                                                       <xsl:if test="test_definition/environment/@cts_version = ''">
+                                                                                               N/A
+                                                                                       </xsl:if>
+                                                                                       <xsl:value-of select="test_definition/environment/@cts_version" />
+                                                                               </xsl:when>
+                                                                               <xsl:otherwise>
+                                                                                       N/A
+                                                                               </xsl:otherwise>
+                                                                       </xsl:choose>
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <td>Others</td>
+                                                               <td>
+                                                                       <xsl:if test="test_definition/environment/other = ''">
+                                                                               N/A
+                                                                       </xsl:if>
+                                                                       <xsl:call-template name="br-replace">
+                                                                               <xsl:with-param name="word"
+                                                                                       select="test_definition/environment/other" />
+                                                                       </xsl:call-template>
+                                                               </td>
+                                                       </tr>
+                                               </table>
+                                       </div>
+
+                                       <div id="summary">
+                                               <table>
+                                                       <tr>
+                                                               <th colspan="2">Test Summary</th>
+                                                       </tr>
+                                                       <tr>
+                                                               <td>Test Plan Name</td>
+                                                               <td>
+                                                                       <xsl:value-of select="test_definition/summary/@test_plan_name" />
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <td>Tests Total</td>
+                                                               <td>
+                                                                       <xsl:value-of select="count(test_definition//suite/set/testcase)" />
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <td>Test Passed</td>
+                                                               <td>
+                                                                       <xsl:value-of
+                                                                               select="count(test_definition//suite/set/testcase[@result = 'PASS'])" />
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <td>Test Failed</td>
+                                                               <td>
+                                                                       <xsl:value-of
+                                                                               select="count(test_definition//suite/set/testcase[@result = 'FAIL'])" />
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <td>Test Block</td>
+                                                               <td>
+                                                                       <xsl:value-of
+                                                                               select="count(test_definition//suite/set/testcase[@result = 'BLOCK'])" />
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <td>Test Not Run</td>
+                                                               <td>
+                                                                       <xsl:value-of
+                                                                               select="count(test_definition//suite/set/testcase) - count(test_definition//suite/set/testcase[@result = 'PASS']) - count(test_definition//suite/set/testcase[@result = 'FAIL']) - count(test_definition//suite/set/testcase[@result = 'BLOCK'])" />
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <td>Start time</td>
+                                                               <td>
+                                                                       <xsl:value-of select="test_definition/summary/start_at" />
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <td>End time</td>
+                                                               <td>
+                                                                       <xsl:value-of select="test_definition/summary/end_at" />
+                                                               </td>
+                                                       </tr>
+                                               </table>
+                                       </div>
+
+
+                                       <div id="suite_summary">
+                                               <div id="title">
+                                                       <a name="contents"></a>
+                                                       <table>
+                                                               <tr>
+                                                                       <td class="title">
+                                                                               <h1>Test Summary by Suite</h1>
+                                                                       </td>
+                                                               </tr>
+                                                       </table>
+                                               </div>
+                                               <table>
+                                                       <tr>
+                                                               <th>Suite</th>
+                                                               <th>Passed</th>
+                                                               <th>Failed</th>
+                                                               <th>Blocked</th>
+                                                               <th>Not Run</th>
+                                                               <th>Total</th>
+                                                       </tr>
+                                                       <xsl:for-each select="test_definition/suite">
+                                                               <xsl:sort select="@name" />
+                                                               <tr>
+                                                                       <td>
+                                                                               <a>
+                                                                                       <xsl:attribute name="href">
+                                                                                      #<xsl:value-of
+                                                                                               select="@name" />
+                                                                                   </xsl:attribute>
+                                                                                       <xsl:value-of select="@name" />
+                                                                               </a>
+                                                                       </td>
+                                                                       <td>
+                                                                               <xsl:value-of select="count(set//testcase[@result = 'PASS'])" />
+                                                                       </td>
+                                                                       <td>
+                                                                               <xsl:value-of select="count(set//testcase[@result = 'FAIL'])" />
+                                                                       </td>
+                                                                       <td>
+                                                                               <xsl:value-of select="count(set//testcase[@result = 'BLOCK'])" />
+                                                                       </td>
+                                                                       <td>
+                                                                               <xsl:value-of
+                                                                                       select="count(set//testcase) - count(set//testcase[@result = 'PASS']) - count(set//testcase[@result = 'FAIL']) - count(set//testcase[@result = 'BLOCK'])" />
+                                                                       </td>
+                                                                       <td>
+                                                                               <xsl:value-of select="count(set//testcase)" />
+                                                                       </td>
+                                                               </tr>
+                                                       </xsl:for-each>
+                                               </table>
+                                       </div>
+
+                                       <div id="fail_cases">
+                                               <div id="title">
+                                                       <table>
+                                                               <tr>
+                                                                       <td class="title">
+                                                                               <h1 align="center">
+                                                                                       Test Failures (
+                                                                                       <xsl:value-of
+                                                                                               select="count(test_definition/suite/set//testcase[@result = 'FAIL'])" />
+                                                                                       )
+                                                                               </h1>
+                                                                       </td>
+                                                               </tr>
+                                                       </table>
+                                               </div>
+                                               <xsl:for-each select="test_definition/suite">
+                                                       <xsl:sort select="@name" />
+                                                       <div id="btc">
+                                                               <a href="#contents">Back to Contents</a>
+                                                       </div>
+                                                       <div id="suite_title">
+                                                               Test Suite:
+                                                               <xsl:value-of select="@name" />
+                                                               <a>
+                                                                       <xsl:attribute name="name">
+                                          <xsl:value-of
+                                                                               select="@name" />
+                                    </xsl:attribute>
+                                                               </a>
+                                                       </div>
+                                                       <table>
+                                                               <tr>
+                                                                       <th>Case_ID</th>
+                                                                       <th>Purpose</th>
+                                                                       <th>Result</th>
+                                                                       <th>Stdout</th>
+                                                               </tr>
+                                                               <xsl:for-each select=".//set">
+                                                                       <xsl:sort select="@name" />
+                                                                       <tr>
+                                                                               <td colspan="4">
+                                                                                       Test Set:
+                                                                                       <xsl:value-of select="@name" />
+                                                                               </td>
+                                                                       </tr>
+                                                                       <xsl:for-each select=".//testcase">
+                                                                               <xsl:sort select="@id" />
+                                                                               <xsl:choose>
+                                                                                       <xsl:when test="@result">
+                                                                                               <xsl:if test="@result = 'FAIL'">
+
+                                                                                                       <tr>
+                                                                                                               <td>
+                                                                                                                       <xsl:value-of select="@id" />
+                                                                                                               </td>
+                                                                                                               <td>
+                                                                                                                       <xsl:value-of select="@purpose" />
+                                                                                                               </td>
+
+
+                                                                                                               <td class="red_rate">
+                                                                                                                       <xsl:value-of select="@result" />
+                                                                                                               </td>
+
+                                                                                                               <td>
+                                                                                                                       <xsl:value-of select=".//result_info/stdout" />
+                                                                                                                       <xsl:if test=".//result_info/stdout = ''">
+                                                                                                                               N/A
+                                                                                                                       </xsl:if>
+                                                                                                               </td>
+                                                                                                       </tr>
+                                                                                               </xsl:if>
+                                                                                       </xsl:when>
+                                                                               </xsl:choose>
+                                                                       </xsl:for-each>
+                                                               </xsl:for-each>
+                                                       </table>
+                                               </xsl:for-each>
+                                       </div>
+
+                                       <div id="cases">
+                                               <div id="title">
+                                                       <table>
+                                                               <tr>
+                                                                       <td class="title">
+                                                                               <h1 align="center">Detailed Test Results</h1>
+                                                                       </td>
+                                                               </tr>
+                                                       </table>
+                                               </div>
+                                               <xsl:for-each select="test_definition/suite">
+                                                       <xsl:sort select="@name" />
+                                                       <div id="btc">
+                                                               <a href="#contents">Back to Contents</a>
+                                                       </div>
+                                                       <div id="suite_title">
+                                                               Test Suite:
+                                                               <xsl:value-of select="@name" />
+                                                               <a>
+                                                                       <xsl:attribute name="name">
+                                                                     <xsl:value-of
+                                                                               select="@name" />
+                                                                  </xsl:attribute>
+                                                               </a>
+                                                       </div>
+                                                       <table>
+                                                               <tr>
+                                                                       <th>Case_ID</th>
+                                                                       <th>Purpose</th>
+                                                                       <th>Result</th>
+                                                                       <th>Stdout</th>
+                                                               </tr>
+                                                               <xsl:for-each select=".//set">
+                                                                       <xsl:sort select="@name" />
+                                                                       <tr>
+                                                                               <td colspan="4">
+                                                                                       Test Set:
+                                                                                       <xsl:value-of select="@name" />
+                                                                               </td>
+                                                                       </tr>
+                                                                       <xsl:for-each select=".//testcase">
+                                                                               <xsl:sort select="@id" />
+                                                                               <tr>
+                                                                                       <td>
+                                                                                               <xsl:value-of select="@id" />
+                                                                                       </td>
+                                                                                       <td>
+                                                                                               <xsl:value-of select="@purpose" />
+                                                                                       </td>
+
+                                                                                       <xsl:choose>
+                                                                                               <xsl:when test="@result">
+                                                                                                       <xsl:if test="@result = 'FAIL'">
+                                                                                                               <td class="red_rate">
+                                                                                                                       <xsl:value-of select="@result" />
+                                                                                                               </td>
+                                                                                                       </xsl:if>
+                                                                                                       <xsl:if test="@result = 'PASS'">
+                                                                                                               <td class="green_rate">
+                                                                                                                       <xsl:value-of select="@result" />
+                                                                                                               </td>
+                                                                                                       </xsl:if>
+                                                                                                       <xsl:if test="@result = 'BLOCK' ">
+                                                                                                               <td>
+                                                                                                                       BLOCK
+                                                                                                               </td>
+                                                                                                       </xsl:if>
+                                                                                                       <xsl:if test="@result != 'BLOCK' and @result != 'FAIL' and @result != 'PASS' ">
+                                                                                                               <td>
+                                                                                                                       Not Run
+                                                                                                               </td>
+                                                                                                       </xsl:if>
+                                                                                               </xsl:when>
+                                                                                               <xsl:otherwise>
+                                                                                                       <td>
+
+                                                                                                       </td>
+                                                                                               </xsl:otherwise>
+                                                                                       </xsl:choose>
+                                                                                       <td>
+                                                                                               <xsl:value-of select=".//result_info/stdout" />
+                                                                                               <xsl:if test=".//result_info/stdout = ''">
+                                                                                                       N/A
+                                                                                               </xsl:if>
+                                                                                       </td>
+                                                                               </tr>
+                                                                       </xsl:for-each>
+                                                               </xsl:for-each>
+                                                       </table>
+                                               </xsl:for-each>
+                                       </div>
+                               </div>
+                               <div id="goTopBtn">
+                                       <img border="0" src="./back_top.png" />
+                               </div>
+                               <script type="text/javascript" src="application.js" />
+                               <script language="javascript" type="text/javascript">
+                                       $(document).ready(function(){
+                                       goTopEx();
+                                       });
+                               </script>
+                       </body>
+               </html>
+       </xsl:template>
+       <xsl:template name="br-replace">
+               <xsl:param name="word" />
+               <xsl:variable name="cr">
+                       <xsl:text>
+</xsl:text>
+               </xsl:variable>
+               <xsl:choose>
+                       <xsl:when test="contains($word,$cr)">
+                               <xsl:value-of select="substring-before($word,$cr)" />
+                               <br />
+                               <xsl:call-template name="br-replace">
+                                       <xsl:with-param name="word" select="substring-after($word,$cr)" />
+                               </xsl:call-template>
+                       </xsl:when>
+                       <xsl:otherwise>
+                               <xsl:value-of select="$word" />
+                       </xsl:otherwise>
+               </xsl:choose>
+       </xsl:template>
+</xsl:stylesheet>
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/xsd/tests.css b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/xsd/tests.css
new file mode 100644 (file)
index 0000000..45d0432
--- /dev/null
@@ -0,0 +1,123 @@
+@charset "UTF-8";
+/* CSS Document */
+#testcasepage div,#testcasepage h1,#testcasepage p,#testcasepage table,#testcasepage tr,#testcasepage th,#testcasepage td
+       {
+       margin: 0;
+       padding: 0;
+       border: 0;
+       font-weight: inherit;
+       font-style: inherit;
+       font-size: 0.96em;
+       font-family: arial;
+       vertical-align: baseline;
+}
+
+#testcasepage p {
+       text-align: left;
+}
+
+#suite_title {
+       text-align: left;
+}
+
+#btc {
+       text-align: right;
+}
+
+#testcasepage table {
+       border-collapse: separate;
+       border-spacing: 0;
+       margin-bottom: 1.4em;
+       vertical-align: middle;
+}
+
+#testcasepage th,#testcasepage td {
+       text-align: left;
+       font-weight: normal;
+       padding: 4px 10px 4px 5px;
+       vertical-align: middle;
+}
+
+#cases table {
+       width: 101%;
+}
+
+#fail_cases table {
+       width: 101%;
+}
+
+#title table {
+       width: 101%;
+}
+
+#device table {
+       width: 50%;
+}
+
+#summary table {
+       width: 50%;
+}
+
+#testcasepage th {
+       border-bottom: 1px solid #000;
+       background-color: #AAAAAA;
+       border-left: 1px solid #000;
+       border-top: 1px solid #000;
+       color: #000;
+       font-weight: bold;
+       vertical-align: bottom;
+}
+
+#testcasepage th:last-child,#testcasepage td:last-child {
+       border-right: 1px solid #000;
+}
+
+#testcasepage td {
+       border-left: 1px solid;
+       font-weight: normal;
+       border-bottom: 1px solid;
+}
+
+#testcasepage td.yellow_rate {
+       background-color: #ffcc00;
+}
+
+#testcasepage td.green_rate {
+       background-color: #33cc33;
+}
+
+#testcasepage td.dgreen_rate {
+       background-color: #339933;
+}
+
+#testcasepage td.red_rate {
+       background-color: #FF3333;
+}
+
+#title table,#title tr,#title td {
+       border-left: none;
+       border-bottom: none;
+       text-align: center;
+}
+
+#title td:last-child {
+       border-right: none;
+}
+
+#testcasepage h1 {
+       font-size: 2em;
+       font-family: Arial, sans-serif;
+       font-weight: bold;
+       line-height: 1;
+       color: #000;
+       margin-bottom: 0.75em;
+       padding-top: 0.25em;
+       font-weight: bold;
+}
+
+#goTopBtn {
+       right: 0px;
+       bottom: 0px;
+       position: fixed; +position: absolute;
+       top: expression(parseInt(document.body.scrollTop)+document.body.clientHeight-40);
+}
\ No newline at end of file
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/xsd/tests.xml b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_native/xsd/tests.xml
new file mode 100644 (file)
index 0000000..eab8498
--- /dev/null
@@ -0,0 +1,1336 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl"  href="testcase.xsl"?>
+<test_definition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:noNamespaceSchemaLocation="test_definition.xsd">
+       <suite name="webapi-w3c-widget-tests">
+               <set name="WidgetPackaging">
+                       <testcase
+                               purpose="Tests the user agent's ability to process files with no file extension. "
+                               type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"
+                               execution_type="auto" priority="P3" id="dm">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/dm</step_desc>
+                                                       <expected> 
+       To pass, the user agent start file of the widget must be index.htm</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/dm</test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" element_name="constructor" element_type="method" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Tizen" specification="Tizen Packaging and XML Configuration"
+                                                       interface="Tizen" usage="true" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                       </testcase>
+                       <testcase
+                               purpose="Tests the user agent's ability to process files with a file extension other than .wgt."
+                               type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"
+                               execution_type="manual" priority="P3" id="dn">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/dn.test</step_desc>
+                                                       <expected> 
+       To pass, the user agent start file of the widget must be index.htm</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/dn.test</test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" usage="true" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                       </testcase>
+                       <testcase purpose="Test the ability of the UA to verify a zip archive."
+                               type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"
+                               execution_type="manual" priority="P3" id="do">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/split.wgt.001</step_desc>
+                                                       <expected> 
+       To pass, the user agent must treat this as an invalid widget (archive is spanned).</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/split.wgt.001</test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" element_name="constructor" element_type="method" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                       </testcase>
+                       <testcase
+                               purpose="Test the user agent's ability to get a widget over HTTP and respect the application/widget mimetype. The server from which this test is served from has been set up to label the 'test' resource as an 'application/widget'."
+                               type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"
+                               execution_type="manual" priority="P3" id="z3">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/z3</step_desc>
+                                                       <expected> 
+       To pass, a user agent must correctly process this resource as a widget because of the 'application/widget' mimetype (i.e., not only because of sniffing).</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/z3</test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" element_name="constructor" element_type="method" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                       </testcase>
+                       <testcase
+                               purpose="Test the user agent's ability to get a widget over HTTP and respect the 'application/widget' mimetype. The server from which this test is served from has been set up to label the 'test.html' resource as an 'application/widget'."
+                               type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"
+                               execution_type="manual" priority="P3" id="z4">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/z4.html</step_desc>
+                                                       <expected> 
+       To pass, a user agent must correctly process this resource as a widget because of the 'application/widget' mimetype (i.e., not only via sniffing).</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/z4.html</test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" element_name="constructor" element_type="method" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                       </testcase>
+                       <testcase
+                               purpose="Tests that an empty defaultlocale attribute is ignored (and does not cause the widget to be treated as invalid)."
+                               type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"
+                               execution_type="manual" priority="P3" id="dlocignore00">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/dlocignore00.wgt</step_desc>
+                                                       <expected> 
+       To pass, the widget must simply run..</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/dlocignore00.wgt</test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" element_name="constructor" element_type="method" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                       </testcase>
+                       <testcase
+                               purpose="Tests that the user agent applies rule for getting a single attribute value to the defaultlocale attribute."
+                               type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"
+                               execution_type="manual" priority="P3" id="dlocignore01">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-001.wgt</step_desc>
+                                                       <expected> To pass, the name of the widget must be the value PASS..</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-001.wgt</test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" element_name="constructor" element_type="method" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                       </testcase>
+                       <testcase
+                               purpose="Test that the user agent matches obscure, yet valid, language tags."
+                               type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"
+                               execution_type="manual" priority="P3" id="dlocignore02">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-002.wgt</step_desc>
+                                                       <expected> To pass, the widgets description must be the value PASS..</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-002.wgt</test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" element_name="constructor" element_type="method" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                       </testcase>
+                       <testcase
+                               purpose="Tests that a language tag already part of the UA's locales list is ignored when it is repeated for defaultlocale attribute."
+                               type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"
+                               execution_type="manual" priority="P3" id="dlocignore03">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-003.wgt</step_desc>
+                                                       <expected> 
+       To pass, the specified value should not be added twice to the locales list of the UA..</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-003.wgt</test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" element_name="constructor" element_type="method" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                       </testcase>
+                       <testcase
+                               purpose="Tests that the default locale is added to the end of the user agent's locale list 
+       (and does not override the default language, which is assumed to be 'en')."
+                               type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"
+                               execution_type="manual" priority="P3" id="dlocignore04">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-004.wgt</step_desc>
+                                                       <expected> 
+       To pass, the name of the widget must be PASS..</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-004.wgt</test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" element_name="constructor" element_type="method" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                       </testcase>
+                       <testcase
+                               purpose="Tests that the value of defaultlocale is also used to in folder-based localization."
+                               type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"
+                               execution_type="manual" priority="P3" id="dlocuse00">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-000.wgt</step_desc>
+                                                       <expected>
+               To pass, the index.html of the folder 'locales/esx-al/' should be loaded and say PASS..</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-000.wgt</test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" element_name="constructor" element_type="method" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                       </testcase>
+                       <testcase
+                               purpose="Tests that the value of defaultlocale works in conjunction to xml:lang on the widget element."
+                               type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"
+                               execution_type="manual" priority="P3" id="dlocuse01">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/dlocuse01.wgt</step_desc>
+                                                       <expected>
+               To pass, the name of the widget must be PASS..</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/dlocuse01.wgt</test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" element_name="constructor" element_type="method" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                       </testcase>
+                       <testcase
+                               purpose="Tests that the UA rejects configuration documents that don't have
+       correct widget element at the root."
+                               type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"
+                               execution_type="manual" priority="P3" id="aa">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/aa.wgt</step_desc>
+                                                       <expected> To pass, the UA must treat this as an
+       invalid widget (the root element is not widget)..</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/aa.wgt</test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" element_name="constructor" element_type="method" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                       </testcase>
+                       <testcase
+                               purpose="Tests that the UA rejects configuration documents that don't have correct
+       widget element at the root."
+                               type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"
+                               execution_type="manual" priority="P3" id="ab">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ab.wgt</step_desc>
+                                                       <expected> To pass, the UA must treat this as an invalid widget (the namespace is wrong)..</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ab.wgt</test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" element_name="constructor" element_type="method" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                       </testcase>
+                       <testcase
+                               purpose="Tests that the UA rejects configuration documents that don't have correct widget
+       element at the root."
+                               type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"
+                               execution_type="manual" priority="P3" id="ac">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ac.wgt</step_desc>
+                                                       <expected>To pass, the UA must treat this as an invalid widget (the namespace is missing)..</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ac.wgt</test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" element_name="constructor" element_type="method" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                       </testcase>
+                       <testcase
+                               purpose="Test that a user agent correctly processes a author element."
+                               type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"
+                               execution_type="manual" priority="P3" id="af">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/af.wgt</step_desc>
+                                                       <expected>
+       To pass, the author name must be the string "PASS"..</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/af.wgt</test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" element_name="constructor" element_type="method" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                       </testcase>
+                       <testcase
+                               purpose="Test that a user agent correctly applies the Rule for Getting Text Content with Normalized White Space."
+                               type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"
+                               execution_type="manual" priority="P3" id="ag">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ag.wgt</step_desc>
+                                                       <expected>
+       To pass, the widget author must be the string "P A S S" (i.e., white space collapsed to single space)..</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ag.wgt</test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" element_name="constructor" element_type="method" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                       </testcase>
+                       <testcase
+                               purpose="Test that a user agent correctly applies the Rule for Getting Text Content with Normalized White Space."
+                               type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"
+                               execution_type="manual" priority="P3" id="ah">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ah.wgt</step_desc>
+                                                       <expected>
+       To pass, the author name must be the string "PASS" (i.e., all white space collapsed to single space, spaces at start/end trimmed)..</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ah.wgt</test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" element_name="constructor" element_type="method" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                       </testcase>
+                       <testcase
+                               purpose="Test that a user agent correctly applies the rule for getting a single attribute value."
+                               type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"
+                               execution_type="manual" priority="P3" id="ai">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ai.wgt</step_desc>
+                                                       <expected>
+       To pass, the author email must be the string "PASS"..</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ai.wgt</test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" element_name="constructor" element_type="method" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                       </testcase>
+                       <testcase
+                               purpose="Test that a user agent correctly applies the rule for getting a single attribute value and the Rule for Getting Text Content with Normalized White Space."
+                               type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"
+                               execution_type="manual" priority="P3" id="aj">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/aj.wgt</step_desc>
+                                                       <expected>
+       To pass, the author name must be the string "PASS"..</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/aj.wgt</test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" element_name="constructor" element_type="method" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                       </testcase>
+                       <testcase
+                               purpose="Test that a user agent correctly applies the rule for getting a single attribute value and the Rule for Getting Text Content with Normalized White Space."
+                               type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"
+                               execution_type="manual" priority="P3" id="ak">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ak.wgt</step_desc>
+                                                       <expected>
+       To pass, the author name must be the string "PASS"..</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ak.wgt</test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" element_name="constructor" element_type="method" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                       </testcase>
+                       <testcase
+                               purpose="Test the ability of the user agent to handle an empty author element."
+                               type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"
+                               execution_type="manual" priority="P3" id="al">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/al.wgt</step_desc>
+                                                       <expected>
+       To pass, the author name must be an empty string..</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/al.wgt</test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" element_name="constructor" element_type="method" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                       </testcase>
+                       <testcase
+                               purpose="Test the ability of the user agent to correctly process the author href attribute."
+                               type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"
+                               execution_type="manual" priority="P3" id="am">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/am.wgt</step_desc>
+                                                       <expected>
+       To pass, the value of author href must be "PASS:PASS"..</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/am.wgt</test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" element_name="constructor" element_type="method" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                       </testcase>
+                       <testcase
+                               purpose="Test the ability of the user agent to correctly process the author href attribute."
+                               type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"
+                               execution_type="manual" priority="P3" id="an">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/an.wgt</step_desc>
+                                                       <expected>
+       To pass, the value of author href must be ignored..</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/an.wgt</test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" element_name="constructor" element_type="method" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                       </testcase>
+                       <testcase
+                               purpose="Test that a user agent correctly processes a name element."
+                               type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"
+                               execution_type="manual" priority="P3" id="ao">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ao.wgt</step_desc>
+                                                       <expected>
+       To pass, the widget name must be the string "PASS"..</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ao.wgt</test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" element_name="constructor" element_type="method" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                       </testcase>
+                       <testcase
+                               purpose="Test that a user agent correctly applies the Rule for Getting Text Content with Normalized White Space."
+                               type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"
+                               execution_type="manual" priority="P3" id="ap">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ap.wgt</step_desc>
+                                                       <expected>
+       To pass, the widget name must be the string "P A S S" (i.e., white space collapsed to single space)..</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ap.wgt</test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" element_name="constructor" element_type="method" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                       </testcase>
+                       <testcase
+                               purpose="Test that a user agent correctly applies the Rule for Getting Text Content with Normalized White Space."
+                               type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"
+                               execution_type="manual" priority="P3" id="aq">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/aq.wgt</step_desc>
+                                                       <expected>
+       To pass, the widget name must be the string "PASS" (i.e., all white space collapsed to single space, spaces at front/back trimmed)..</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/aq.wgt</test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" element_name="constructor" element_type="method" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                       </testcase>
+                       <testcase
+                               purpose="Test that a user agent correctly applies the rule for getting a single attribute value."
+                               type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"
+                               execution_type="manual" priority="P3" id="ar">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ar.wgt</step_desc>
+                                                       <expected>
+       To pass, the widget short name must be the string "PASS"..</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ar.wgt</test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" element_name="constructor" element_type="method" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                       </testcase>
+                       <testcase
+                               purpose="Test that a user agent correctly applies the rule for getting a single attribute value and
+       the Rule for Getting Text Content with Normalized White Space."
+                               type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"
+                               execution_type="manual" priority="P3" id="as">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/as.wgt</step_desc>
+                                                       <expected>
+       To pass, the widget short name must be the string "PASS" and the widget name must be "PASS"..</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/as.wgt</test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" element_name="constructor" element_type="method" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                       </testcase>
+                       <testcase
+                               purpose="Test that a user agent correctly applies the rule for getting a single attribute value and
+       the Rule for Getting Text Content with Normalized White Space."
+                               type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"
+                               execution_type="manual" priority="P3" id="at">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/at.wgt</step_desc>
+                                                       <expected>
+       To pass, the widget short name must be the string "PASS" and the widget name must be "PASS"..</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/at.wgt</test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" element_name="constructor" element_type="method" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                       </testcase>
+                       <testcase
+                               purpose="Test that a user agent correctly processes the short attribute."
+                               type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"
+                               execution_type="manual" priority="P3" id="au">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/au.wgt</step_desc>
+                                                       <expected>
+       To pass, the widget short name must be an empty string..</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/au.wgt</test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" element_name="constructor" element_type="method" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                       </testcase>
+                       <testcase
+                               purpose="Test the ability of the user agent to handle an empty name element."
+                               type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"
+                               execution_type="manual" priority="P3" id="av">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/av.wgt</step_desc>
+                                                       <expected>
+       To pass, the widget name must be an empty string..</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/av.wgt</test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" element_name="constructor" element_type="method" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                       </testcase>
+                       <testcase
+                               purpose="Test that a user agent correctly processes a name element with xml:lang attribute."
+                               type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"
+                               execution_type="manual" priority="P3" id="oa">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/oa.wgt</step_desc>
+                                                       <expected>
+       To pass, the widget name must be the string "PASS"..</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/oa.wgt</test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" element_name="constructor" element_type="method" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                       </testcase>
+                       <testcase
+                               purpose="Test that the user agent does not attempt to load a default start file when a custom start file has been declared."
+                               type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"
+                               execution_type="manual" priority="P3" id="aw">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/aw.wgt</step_desc>
+                                                       <expected>
+       To pass, the widget start file must point to "pass.html" and the icons list must contain a pointer to "icon.png" at the root of the widget..</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/aw.wgt</test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" element_name="constructor" element_type="method" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                       </testcase>
+                       <testcase purpose="Test the UA's ability process the height attribute."
+                               type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"
+                               execution_type="manual" priority="P3" id="ax">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ax.wgt</step_desc>
+                                                       <expected>
+       To pass, the widget height must be either the numeric value 123 or a value greater than 0..</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ax.wgt</test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" element_name="constructor" element_type="method" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                       </testcase>
+                       <testcase purpose="Test the UA's ability process the height attribute."
+                               type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"
+                               execution_type="manual" priority="P3" id="ay">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ay.wgt</step_desc>
+                                                       <expected>
+       To pass, the user agent must ignore the value of the height attribute (the value is composed of characters)..</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ay.wgt</test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" element_name="constructor" element_type="method" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                       </testcase>
+                       <testcase purpose="Test the UA's ability process the height attribute."
+                               type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"
+                               execution_type="manual" priority="P3" id="az">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/az.wgt</step_desc>
+                                                       <expected>
+       To pass, the widget height must be the numeric value 100 or a value greater than 0 (resulting from rule for parsing a non-negative integer)..</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/az.wgt</test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" element_name="constructor" element_type="method" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                       </testcase>
+                       <testcase purpose="Test the UA's ability process the height attribute."
+                               type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"
+                               execution_type="manual" priority="P3" id="a1">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a1.wgt</step_desc>
+                                                       <expected>
+       To pass, the widget height must be the numeric value 123 or a value greater than 0 (resulting from rule for parsing a non-negative integer)..</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a1.wgt</test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" element_name="constructor" element_type="method" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                       </testcase>
+                       <testcase purpose="Test the UA's ability process the height attribute."
+                               type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"
+                               execution_type="manual" priority="P3" id="a2">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a2.wgt</step_desc>
+                                                       <expected>
+       To pass, the widget height must be ignored (the value is an empty string, hence it would be ignored)..</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a2.wgt</test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" element_name="constructor" element_type="method" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                       </testcase>
+                       <testcase purpose="Test the UA's ability process the height attribute."
+                               type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"
+                               execution_type="manual" priority="P3" id="a3">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a3.wgt</step_desc>
+                                                       <expected>
+       To pass, the widget height must be ignored (the value is a sequence of space characters, hence it would be ignored)..</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a3.wgt</test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" element_name="constructor" element_type="method" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                       </testcase>
+                       <testcase purpose="Test the UA's ability process the height attribute."
+                               type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"
+                               execution_type="manual" priority="P3" id="a4">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a4.wgt</step_desc>
+                                                       <expected>
+       To pass, the widget height must be ignored (the value is an empty string)..</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a4.wgt</test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" element_name="constructor" element_type="method" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                       </testcase>
+                       <testcase
+                               purpose="Test that the UA skips preference elements without a name attribute."
+                               type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"
+                               execution_type="manual" priority="P3" id="a5">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a5.wgt</step_desc>
+                                                       <expected>
+       To pass, widget preferences must remain an empty list (i.e., the preference is skipped)..</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a5.wgt</test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" element_name="constructor" element_type="method" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                       </testcase>
+                       <testcase
+                               purpose="Test that the UA skips preference element already defined."
+                               type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"
+                               execution_type="manual" priority="P3" id="a6">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a6.wgt</step_desc>
+                                                       <expected>
+       To pass, widget preference must contain one preference whose name is "PASS" and whose value is "PASS" and whose readonly attr value must be "false"..</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a6.wgt</test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" element_name="constructor" element_type="method" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                       </testcase>
+                       <testcase
+                               purpose="Test that the UA does a case sensitive comparison on the value of the readonly attribute."
+                               type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"
+                               execution_type="manual" priority="P3" id="a7">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a7.wgt</step_desc>
+                                                       <expected>
+       To pass, widget preference must contain one preference whose name is "PASS" and whose value is "PASS" and whose readonly attr value must be "false"..</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a7.wgt</test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" element_name="constructor" element_type="method" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                       </testcase>
+                       <testcase
+                               purpose="Test that the UA does a case sensitive comparison on the value of the readonly attribute."
+                               type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"
+                               execution_type="manual" priority="P3" id="a8">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a8.wgt</step_desc>
+                                                       <expected>
+       To pass, widget preference must contain one preference whose name is "PASS" and whose value is "PASS" and whose readonly attr value must be "true"..</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a8.wgt</test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" element_name="constructor" element_type="method" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                       </testcase>
+                       <testcase
+                               purpose="Test that the UA sets the readonly attribute to false by default."
+                               type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"
+                               execution_type="manual" priority="P3" id="a9">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a9.wgt</step_desc>
+                                                       <expected>
+       To pass, widget preference must contain one preference whose name is "PASS" and whose value is "PASS" and whose readonly attr value must be "false"..</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a9.wgt</test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" element_name="constructor" element_type="method" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                       </testcase>
+                       <testcase
+                               purpose="Test that the UA skips multiple preference element already defined."
+                               type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"
+                               execution_type="manual" priority="P3" id="ba">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ba.wgt</step_desc>
+                                                       <expected>
+       To pass, widget preference must contain one preference whose name is "a" and whose value is "a" and whose readonly attr value must be "false"..</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ba.wgt</test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" element_name="constructor" element_type="method" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                       </testcase>
+                       <testcase
+                               purpose="Test the UA's ability store preferences whose name vary only in case."
+                               type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"
+                               execution_type="manual" priority="P3" id="bb">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/bb.wgt</step_desc>
+                                                       <expected>
+       To pass, widget preference must contain two preferences: 1 must have a name "a" and whose value is "a" and whose readonly attr value must be "false". 2 must have a name "A" and whose value is "b" and whose readonly attribute value must be "false"..</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/bb.wgt</test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" element_name="constructor" element_type="method" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                       </testcase>
+                       <testcase
+                               purpose="Tests that the UA applies the rule for getting a single attribute value to name, value, and readonly attributes."
+                               type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"
+                               execution_type="manual" priority="P3" id="bc">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/bc.wgt</step_desc>
+                                                       <expected>
+       To pass, widget preference must contain one preference whose name is "PASS" and whose value is "PASS" and whose readonly attr value must be "false"..</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/bc.wgt</test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" element_name="constructor" element_type="method" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                       </testcase>
+                       <testcase
+                               purpose="Test to make sure that the UA only checks the root of the widget for config files, and not in an arbitrary folder."
+                               type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"
+                               execution_type="manual" priority="P3" id="bg">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/bg.wgt</step_desc>
+                                                       <expected>
+       To pass, the user agent must treat this widget as an invalid widget (config file is not at the root)..</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/bg.wgt</test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" element_name="constructor" element_type="method" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                       </testcase>
+                       <testcase
+                               purpose="Test to make sure that the UA only checks the root of the widget for config files, and not in a locale folder."
+                               type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"
+                               execution_type="manual" priority="P3" id="bh">
+                               <description>
+                                       <pre_condition />
+                                       <post_condition />
+                                       <steps>
+                                               <step order="1">
+                                                       <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/bh.wgt</step_desc>
+                                                       <expected>
+       To pass, the user agent must treat this widget as an invalid widget (config file is not at the root, but in locale folder)..</expected>
+                                               </step>
+                                       </steps>
+                                       <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/bh.wgt</test_script_entry>
+                               </description>
+                               <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" element_name="constructor" element_type="method" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+                       </testcase>
+               </set>
+       </suite>
+</test_definition>
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/CONFIG b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/CONFIG
new file mode 100644 (file)
index 0000000..e6b6d74
--- /dev/null
@@ -0,0 +1,8 @@
+[LOGGING]
+log_level=INFO
+
+[EXTENSION]
+crosswalk=--external-extensions-path=/usr/lib/tizen-extensions-crosswalk
+
+[TIZEN]
+tizen_user=app
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/LICENSE b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/LICENSE
new file mode 100644 (file)
index 0000000..6d45519
--- /dev/null
@@ -0,0 +1,340 @@
+                   GNU GENERAL PUBLIC LICENSE
+                      Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                       51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                           Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                   GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                           NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                    END OF TERMS AND CONDITIONS
+
+           How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/README.md b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/README.md
new file mode 100644 (file)
index 0000000..1ced010
--- /dev/null
@@ -0,0 +1,125 @@
+## Dependency:
+
+1. python2.7
+2. python-setuptools python-support python-pip
+   1. Ubuntu
+      `sudo apt-get install python-setuptools python-support python-pip`
+   2. Fedora(RHEL)
+      `sudo yum install python-setuptools python-support python-pip`
+   3. openSUSE(TIZEN)
+      `sudo zypper install python-setuptools python-support python-pip`
+3. python-requests(>=1.1)
+   `sudo pip install requests`
+
+## How to build Debian package:
+
+Host with Ubuntu OS recommended.
+
+Run the command below to build from source code and get Debian package:
+
+`dpkg-buildpackage`
+
+## How to build RPM package:
+
+Host with Fedora OS recommended.
+
+Run the command below to build from source code and get RPM package:
+
+```
+make -C packaging/
+rpmbuild -tb packaging/testkit-lite_<version>.tar.gz --nodeps
+```
+
+Host with Ubuntu OS, we need to add a workaround to support the RPM build:
+
+`rpmbuild --define 'python_sitelib /usr/lib/python2.7/site-packages' -tb packaging/testkit-lite_<version>.tar.gz --nodeps`
+
+## How to install:
+
+Install testkit lite from source code:
+
+`sudo python setup.py install --record /var/log/testkit-lite.files`
+
+Install testkit lite from debian build:
+
+`sudo dpkg -i ../testkit-lite_<version>_all.deb`
+
+## How to uninstall:
+
+Uninstall testkit-lite installed with `setup.py install`:
+
+`cat /var/log/testkit-lite.files | sudo xargs rm -rf`
+
+Uninstall testkit-lite installed with `debian`:
+
+`sudo dpkg -r testkit-lite`
+
+## How to use:
+
+1. You can run case on target:
+   1. For web test cases:
+
+   `testkit-lite -f device:"<somewhere>/<package_name>/tests.xml" -e 'WRTLauncher <package_name>'`
+
+   2. For native test cases:
+
+     `testkit-lite -f device:"<somewhere>/<package_name>/tests.xml"`
+
+2. You can run case in single mode :
+   1. For web test cases:
+
+      `testkit-lite -f "<somewhere>/<package_name>/tests.xml" -e 'WRTLauncher <package_name>' --comm localhost`
+
+   2. For native test cases:
+
+      `testkit-lite -f "<somewhere>/<package_name>/tests.xml" --comm localhost`
+
+3. You can select on parser engine to simply conduct one or more `tests.xml` on target:
+
+   `testkit-lite -f device:"<somewhere>/<package_name1>/tests.xml ... <somewhere>/<package_namen>/tests.xml" -e 'WRTLauncher <package_name1> ... <package_namen>'`
+
+4. If you want to execute both auto and manual tests:
+
+   `testkit-lite -f device:"<somewhere>/<package_name>/tests.xml"`
+
+5. If you just want to execute manual tests:
+
+   `testkit-lite -f device:"<somewhere>/<package_name>/tests.xml" -M`
+
+6. If you just want to execute auto tests:
+
+   `testkit-lite -f device:"<somewhere>/<package_name>/tests.xml" -A`
+
+7. If you want to save test result to another file, by default it'll be under `/opt/testkit/lite/latest`:
+
+   `testkit-lite -f device:"<somewhere>/<package_name>/tests.xml" -o <somewhere>/xxx.xml`
+
+8. If you want to choose some filters:
+
+   `testkit-lite -f device:"<somewhere>/<package_name>/tests.xml" --status level1 --type type1 ...`
+
+9. If you want to run test according capability:
+
+   `testkit-lite -f device:"<somewhere>/<package_name>/tests.xml" --capability capability.xml`
+
+10. At last, you can freely compose the above parameters together:
+
+    `testkit-lite -f <somewhere1>/tests.xml <somewhere2>/tests.xml -A --priority P1 --type type1 ...`
+
+## Get Results:
+
+Test report will be generated as tests.result.xml.The result will be under `/opt/testkit/lite/latest` after execution, you can also check the history results in `/opt/testkit/lite/yyyy-mm-dd-HH:MM:SS.NNNNNN`.
+
+## View Results:
+
+Test report can be viewed in HTML format, so the data in the xml result file looks more human friendly.
+
+Please follow the following steps to view test report:
+
+1. Copy files: `application.js back_top.png jquery.min.js testresult.xsl tests.css` under directory `/opt/testkit/lite/xsd/`
+2. Put the files from step 1) under the same directory as the xml result file
+3. Open xml result file with a web browser(IE, Chrome or Firefox)
+
+## Known Issues:
+
+N/A
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/VERSION b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/VERSION
new file mode 100644 (file)
index 0000000..3e1feef
--- /dev/null
@@ -0,0 +1,4 @@
+[public_version]
+version=TESTKIT2_3.0
+[internal_version]
+version=TESTKIT2_3.0.1-151106
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/debian/changelog b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/debian/changelog
new file mode 100644 (file)
index 0000000..c9a8298
--- /dev/null
@@ -0,0 +1,5 @@
+testkit-lite (3.1.12) unstable; urgency=low
+
+  * Public Release.
+
+ -- Shaofeng Tang <shaofeng.tang@intel.com>  Fri, 21 Feb 2014 11:13:11 +0800
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/debian/compat b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/debian/compat
new file mode 100644 (file)
index 0000000..45a4fb7
--- /dev/null
@@ -0,0 +1 @@
+8
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/debian/control b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/debian/control
new file mode 100644 (file)
index 0000000..4190c6f
--- /dev/null
@@ -0,0 +1,16 @@
+Source: testkit-lite
+Section: utils
+Priority: standard
+Maintainer: Cathy Shen <cathy.shen@intel.com>
+Build-Depends: debhelper (>= 8.0.0), python-setuptools, python-support (>= 0.8.4)
+Standards-Version: 3.9.3
+Homepage: https://github.com/testkit/testkit-lite
+#Vcs-Git: git://git.debian.org/collab-maint/testkit-manager.git
+#Vcs-Browser: http://git.debian.org/?p=collab-maint/testkit-manager.git;a=summary
+
+Package: testkit-lite
+Architecture: all
+Depends: ${misc:Depends}, ${python:Depends}, python-dbus, python-gobject, python-gtk2
+XB-Python-Version: ${python:Versions}
+Description: Test runner for test execution.
+
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/debian/copyright b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/debian/copyright
new file mode 100644 (file)
index 0000000..71edd1c
--- /dev/null
@@ -0,0 +1,27 @@
+Format: http://dep.debian.net/deps/dep5
+Source: https://github.com/testkit/testkit-lite
+
+Files: *
+Copyright: 2012-2013 Intel Corp. 
+License: GPL-2.0
+
+Files: debian/*
+Copyright: 2012-2013 Intel Corp.
+License: GPL-2.0
+
+License: GPL-2.0
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 2 of the License
+ .
+ This package is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ GNU General Public License for more details.
+ .
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ .
+ On Debian systems, the complete text of the GNU General
+ Public License version 3 can be found in "/usr/share/common-licenses/GPL-3".
+
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/debian/docs b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/debian/docs
new file mode 100644 (file)
index 0000000..e845566
--- /dev/null
@@ -0,0 +1 @@
+README
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/debian/files b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/debian/files
new file mode 100644 (file)
index 0000000..666bfc2
--- /dev/null
@@ -0,0 +1 @@
+testkit-lite_3.1.12_all.deb utils standard
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/debian/postinst b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/debian/postinst
new file mode 100644 (file)
index 0000000..6c118f8
--- /dev/null
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+# Set permissions
+mkdir -p /opt/testkit/lite_web_csharp/test_packages
+chmod ugo+rwx -R /opt/testkit/lite_web_csharp
+ln -fs /usr/share/pyshared/testkitlite /usr/lib/python2.7/dist-packages/testkitlite
+
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/debian/rules b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/debian/rules
new file mode 100644 (file)
index 0000000..abde6ef
--- /dev/null
@@ -0,0 +1,5 @@
+#!/usr/bin/make -f
+
+%:
+       dh $@
+
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/doc/Makefile.am b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/doc/Makefile.am
new file mode 100644 (file)
index 0000000..801ce6f
--- /dev/null
@@ -0,0 +1,18 @@
+# Copyright (C) 2012 Intel Corporation
+# 
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# Authors:
+#              Zhang, Huihui <huihuix.zhang@intel.com>
+#              Wendong,Sui  <weidongx.sun@intel.com>
+
+testkitdocdir = /opt/testkit/lite_web_csharp/doc
+dist_testkitdoc_DATA = testkit-lite_user_guide_for_tct.pdf
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/doc/test_definition_schema.pdf b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/doc/test_definition_schema.pdf
new file mode 100644 (file)
index 0000000..2c8b267
Binary files /dev/null and b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/doc/test_definition_schema.pdf differ
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/doc/testkit-lite_tutorial.pdf b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/doc/testkit-lite_tutorial.pdf
new file mode 100644 (file)
index 0000000..fec9b26
Binary files /dev/null and b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/doc/testkit-lite_tutorial.pdf differ
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/doc/testkit-lite_user_guide.pdf b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/doc/testkit-lite_user_guide.pdf
new file mode 100644 (file)
index 0000000..bab774e
Binary files /dev/null and b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/doc/testkit-lite_user_guide.pdf differ
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/packaging/Makefile b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/packaging/Makefile
new file mode 100644 (file)
index 0000000..24da850
--- /dev/null
@@ -0,0 +1,21 @@
+PKG_NAME := testkit-lite
+SPECFILE = $(addsuffix .spec, $(PKG_NAME))
+PKG_VERSION := $(shell grep '^Version: ' $(SPECFILE)|awk '{print $$2}')
+
+TARBALL := $(PKG_NAME)_$(PKG_VERSION).tar.gz
+
+dsc: $(TARBALL)
+               $(eval MD5=$(shell md5sum $(TARBALL) | sed "s/  / $(shell stat -c '%s' $(TARBALL)) /"))
+                       @sed  -i 's/^Version:.*/Version: $(PKG_VERSION)/' $(PKG_NAME).dsc
+                       @sed  -i 's/ [a-f0-9]\+ [0-9]\+ $(PKG_NAME).*tar.*/ $(MD5)/' $(PKG_NAME).dsc
+
+$(TARBALL):
+               cd "$$(git rev-parse --show-toplevel)" \
+                       && git archive --prefix $(PKG_NAME)-$(PKG_VERSION)/ HEAD \
+                       | gzip > "$(CURDIR)/$(TARBALL)"
+
+clean:
+               rm -f $(PKG_NAME)*.tar.gz
+
+all: clean dsc
+
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/packaging/testkit-lite.dsc b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/packaging/testkit-lite.dsc
new file mode 100644 (file)
index 0000000..cfd7043
--- /dev/null
@@ -0,0 +1,11 @@
+Source: testkit-lite
+Section: utils
+Priority: standard
+Maintainer: Lei Yang <lei.a.yang@intel.com>
+Build-Depends: debhelper (>= 8.0.0), python-setuptools, python-support (>= 0.8.4)
+Standards-Version: 3.9.2
+Homepage: https://github.com/testkit/testkit-manager
+Version: 3.1.12
+Files:
+ e3b0bfd4442c7301aa9982201c6ebd3b 1398131 testkit-lite_3.1.11.tar.gz
+
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/packaging/testkit-lite.spec b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/packaging/testkit-lite.spec
new file mode 100644 (file)
index 0000000..2cd756f
--- /dev/null
@@ -0,0 +1,52 @@
+Summary: TCT-Lite
+Name: testkit-lite
+Version: 3.1.12
+Release: 1
+License: GPLv2
+Group: Applications/System
+Source: %{name}_%{version}.tar.gz
+
+BuildRequires: python-distribute
+
+%{!?python_sitelib: %define python_sitelib %(python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")}
+
+%description
+testkit-lite is a test runner with command-line interface.It has the following functions 
+1. Accepts .xml test case descriptor files as input. 
+2. drives automatic test execution. 
+3. provide multiple options to meet various test requirements. 
+
+%prep
+%setup -q
+
+%build
+
+%install
+python setup.py install --prefix=%{_prefix} --root=%{buildroot}
+# remove tests
+rm -rf %{buildroot}/%{python_sitelib}/tests
+
+%clean
+rm -rf %{buildroot}
+
+%post
+# Set permissions
+chmod ugo+rwx /opt/testkit/lite_web_csharp
+
+%files
+%{python_sitelib}/testkitlite/*
+%{python_sitelib}/testkit_lite-*.egg-info/*
+/etc/dbus-1/system.d/com.intel.testkit.conf
+/opt/testkit/lite_web_csharp/VERSION
+/opt/testkit/lite_web_csharp/commodule/CONFIG
+/opt/testkit/lite_web_csharp/mh.html
+%{_bindir}/testkit-lite
+%{_bindir}/testkit-lite-dbus
+%defattr(-,root,root)
+
+%doc
+/opt/testkit/lite_web_csharp/testkit-lite_user_guide.pdf
+/opt/testkit/lite_web_csharp/testkit-lite_tutorial.pdf
+/opt/testkit/lite_web_csharp/test_definition_schema.pdf
+
+%changelog
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/resource/mh.html b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/resource/mh.html
new file mode 100644 (file)
index 0000000..4617c18
--- /dev/null
@@ -0,0 +1,76 @@
+<html>
+<head>
+<title>Web Manual Test Harness</title>
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<style type="text/css">
+body { font-family:Verdana; font-size:14px; margin:0;}
+#container-div {border: 0;margin:0 auto; width:100%;}
+#sidebar-left {border: 0;float:left; width:6px; height:100%;}
+#sidebar-right {border: 0;float:right; width:6px; height:100%;}
+#content-div {border: 0;margin:0 7px !important; height:100%;}
+.button {display:inline-block;min-width: 30px; max-width: 100px; margin-top: 3px;margin-bottom: 3px;padding: 3px}
+#back-bt, #forward-bt {max-width: 20px;}
+#case-info-area {border 0;text-align:left;}
+#test-entry, #refer-test-entry {font-size: 10px;color: red}
+#test-entry-area, #refer-test-entry-area {font-size: 10px;}
+#run-test-area, #result-area {text-align:right; margin:0 auto;padding:0;}
+iframe {border: 1px solid black;width: 100%; height: 600px;}
+</style>
+<script>
+function run_test(){
+    document.getElementById("test-area").src = document.getElementById("test-entry").textContent;
+};
+
+function run_refer_test(){
+    document.getElementById("test-area").src = document.getElementById("refer-test-entry").textContent;
+};
+
+function result_handler(){
+    try{
+        window.stop();
+    } catch(e) {
+        document.execCommand('Stop');
+    }
+    window.stop();
+    document.getElementById("case-info-area").className = this.name
+};
+
+function init_mh(){
+    document.getElementById("case-info-area").className = "READY";
+    document.getElementById("run-test-bt").addEventListener("click", run_test, false);
+    document.getElementById("run-refer-test-bt").addEventListener("click", run_refer_test, false);
+    document.getElementById("back-bt").addEventListener("click", result_handler, false);
+    document.getElementById("pass-bt").addEventListener("click", result_handler, false);
+    document.getElementById("fail-bt").addEventListener("click", result_handler, false);
+    document.getElementById("block-bt").addEventListener("click", result_handler, false);
+    document.getElementById("forward-bt").addEventListener("click", result_handler, false);
+    document.getElementById("done-bt").addEventListener("click", result_handler, false);
+};
+</script>
+</head>
+<body onload="init_mh()">
+<div id="container-div">
+    <div id="sidebar-left"></div>
+    <div id="sidebar-right"></div>
+    <div id="content-div">
+        <div id="run-test-area">
+            <input type="button" id="back-bt" name="BACK" class="button" value="<"></input>
+            <input type="button" id="run-test-bt" class="button" value="Run Test"></input>
+            <input type="button" id="run-refer-test-bt" class="button" value="Run Refer Test"></input>
+            <input type="button" id="forward-bt" name="FORWARD" class="button" value=">"></input>
+        </div>
+        <div id=result-area>
+                <input type="button" id="pass-bt" name="PASS" class="button" value="PASS"></input>
+                <input type="button" id="fail-bt" name="FAIL" class="button" value="FAIL"></input>
+                <input type="button" id="block-bt" name="BLOCK" class="button" value="BLOCK"></input>
+                <input type="button" id="done-bt" name="DONE" class="button" value="DONE"></input>
+        </div>
+        <div id="case-info-area">
+            <div id="test-entry-area">Test Entry: <span id="test-entry">http://www.baidu.com</span></div>
+            <div id="refer-test-entry-area">Refer Test Entry: <span id="refer-test-entry">http://www.sina.com</span></div>
+        </div>
+        <iframe id="test-area"></iframe>
+    </div>
+</div>
+</body>
+</html>
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/setup.py b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/setup.py
new file mode 100644 (file)
index 0000000..182f9d4
--- /dev/null
@@ -0,0 +1,52 @@
+#!/usr/bin/python
+#
+# Copyright (C) 2012 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# Authors:
+#              Yuanyuan,Zou  <yuanyuanx.zou@intel.com>
+
+from setuptools import setup, find_packages
+import os
+from stat import ST_MODE, S_ISDIR
+from distutils.command.install_data import install_data
+
+
+class post_install_cmd(install_data):
+    def run (self):
+        install_data.run(self)
+        if os.name == 'posix':
+            for path in ['/opt/testkit/lite_web_csharp','/opt/testkit/lite_web_csharp/commodule/']:
+                try:
+                    mode = os.stat(path)[ST_MODE]
+                    mode |= 066
+                    os.chmod(path, mode)
+                except OSError as err:
+                    pass
+
+
+setup(
+    name = "testkit-lite",
+    description = "Test runner for test execution",
+    url = "https://github.com/testkit/testkit-lite",
+    author = "Shaofeng Tang",
+    author_email = "shaofeng.tang@intel.com",
+    version = "3.1.12",
+    include_package_data = True,
+    data_files = [('/opt/testkit/lite_web_csharp', ['VERSION', 'doc/testkit-lite_user_guide.pdf', 'doc/testkit-lite_tutorial.pdf', 'doc/test_definition_schema.pdf']),
+                  ('/opt/testkit/lite_web_csharp/commodule/', ['CONFIG']),
+                  ('/opt/testkit/lite_web_csharp', ['resource/mh.html']),
+                  ('/etc/dbus-1/system.d/', ['dbus/com.intel.testkit.conf'])],
+    scripts = ('testkit-lite', 'dbus/testkit-lite-dbus'),
+    packages = find_packages(),
+    cmdclass = {'install_data': post_install_cmd},
+)
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/temp/temp b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/temp/temp
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkit-lite b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkit-lite
new file mode 100644 (file)
index 0000000..f4530ec
--- /dev/null
@@ -0,0 +1,636 @@
+#!/usr/bin/env python3
+#
+# Copyright (C) 2012 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# Authors:
+#              Jing,Wang  <jing.j.wang@intel.com>
+#              Yuanyuan,Zou  <yuanyuanx.zou@intel.com>
+""" testkit lite tools"""
+
+import os
+import sys
+import traceback
+import platform
+import signal
+import configparser
+import re
+import xml.etree.ElementTree as etree
+from optparse import OptionParser, make_option
+from datetime import datetime
+import json
+
+from testkitlite.util.errors import TestCaseNotFoundException, TestEngineException
+
+
+os.environ["DBUS_SESSION_BUS_ADDRESS"]='unix:path=/run/dbus/system_bus_socket'
+os.environ["DISPLAY"]=':0.0'
+
+try:
+    # import logger
+    from testkitlite.util.log import LOGGER
+except ImportError as err:
+    print("[ Error: loading logging failed, error: %s ]\n" % err)
+    print("try to run command " \
+        "'export PYTHONPATH=/usr/local/lib/python2.7/dist-packages' or " \
+        "'export PYTHONPATH=/usr/local/lib/python2.7/site-packages' to resolve module missed issue")
+    sys.exit(1)
+
+
+# get platform version info
+OS_VER = platform.system()
+JOIN = os.path.join
+EXISTS = os.path.exists
+DIRNAME = os.path.dirname
+BASENAME = os.path.basename
+ABSPATH = os.path.abspath
+SPLIT = os.path.split
+ISLINK = os.path.islink
+
+TESTKIT_DIR = "/opt/testkit/lite_web_csharp"
+if not OS_VER == "Linux" and not OS_VER == "Darwin":
+    TESTKIT_DIR = DIRNAME(ABSPATH(__file__))
+    sys.path += [JOIN(TESTKIT_DIR)]
+    TESTKIT_DIR = JOIN(TESTKIT_DIR, "results")
+
+LOG_DIR = TESTKIT_DIR
+TEST_PACKAGES_DIR = JOIN(TESTKIT_DIR, "test_packages")
+COMMON_FILTERS = {
+    "suite": [],
+    "set": [],
+    "priority": [],
+    "id": [],
+    "type": [],
+    "status": [],
+    "component": [],
+    "set_type": []}
+down_status = False
+remote_test = False
+can_merge_result = False
+device_id = ""
+device_locked = False
+RUNNER = None
+
+# detect version option
+if "--version" in sys.argv:
+    try:
+        CONFIG = configparser.ConfigParser()
+        if platform.system() == "Linux":
+            CONFIG.read('/opt/testkit/lite_web_csharp/VERSION')
+        else:
+            VERSION_FILE = JOIN(sys.path[0], 'VERSION')
+            CONFIG.read(VERSION_FILE)
+        VERSION = CONFIG.get('public_version', 'version')
+        LOGGER.info("V%s" % VERSION)
+        sys.exit()
+    except configparser.Error as err:
+        LOGGER.error(
+            "[ Error: fail to parse version info, error: %s ]\n" % err)
+        sys.exit(1)
+
+# detect internal version option
+if "--internal-version" in sys.argv:
+    try:
+        CONFIG = configparser.ConfigParser()
+        if platform.system() == "Linux":
+            CONFIG.read('/opt/testkit/lite_web_csharp/VERSION')
+        else:
+            VERSION_FILE = JOIN(sys.path[0], 'VERSION')
+            CONFIG.read(VERSION_FILE)
+        VERSION = CONFIG.get('internal_version', 'version')
+        print(VERSION)
+        sys.exit()
+    except configparser.Error as err:
+        print("[ Error: fail to parse version info, error: %s ]\n" % err)
+        sys.exit(1)
+#try:
+#    CONFIG = ConfigParser.ConfigParser()
+#    CONFIG.read('/opt/testkit/lite3.0/commodule/CONFIG')
+#    tizen = CONFIG.get('TIZEN_USER','tizen_user')
+#    if tizen:
+#        os.environ['TIZEN_USER'] = tizen
+#except:
+#    pass   
+
+def varnarg(option, opt_str, value, parser):
+    """ parser srg"""
+    value = []
+    import re
+    for arg in parser.rargs:
+        if re.search('^--.+', arg) or \
+                re.search('^-[\D]', arg):
+            break
+        value.append(arg)
+
+    del parser.rargs[:len(value)]
+    setattr(parser.values, option.dest, value)
+
+def unlock_and_exit(exit_code=signal.SIGINT):
+    if device_locked:
+        release_device_lock(device_id)
+    sys.exit(exit_code)
+
+def final_clean_test():
+    try:
+        if RUNNER is not None:
+            if RUNNER.session_id:
+                RUNNER.finalize_test(RUNNER.session_id)
+            if can_merge_result:
+                RUNNER.merge_resultfile(START_TIME, CURRENT_LOG_DIR)
+            if down_status:
+                clean_testxml(OPTIONS.testxml, remote_test)
+    except (KeyboardInterrupt, Exception) as err:
+        pass
+
+def sig_exit_handler(*args):
+    final_clean_test()
+    LOGGER.info("\n[ exiting testkit-lite on system signal ]\n")
+    unlock_and_exit()
+
+if platform.system() == "Linux":
+    signal.signal(signal.SIGTSTP, sig_exit_handler)
+signal.signal(signal.SIGTERM, sig_exit_handler)
+try:
+    OPTION_LIST = [
+        make_option("-f", "--testxml", dest="testxml",
+                    action="callback", callback=varnarg,
+                    help="Specify the path of test definition file (tests.xml)."
+                    " If run more one test package,just list the all the path "
+                    " of \"tests.xml\" and separate with a whitespace"),
+        make_option("-D", "--dryrun", dest="bdryrun",
+                    action="store_true",
+                    help="Dry-run the selected test cases"),
+        make_option("-M", "--manual-only", dest="bmanualonly",
+                    action="store_true",
+                    help="Enable only manual tests"),
+        make_option("-A", "--auto-only", dest="bautoonly",
+                    action="store_true",
+                    help="Enable only auto tests"),
+        make_option("-o", "--output", dest="resultfile",
+                    help="Specify output file for result xml. \
+                    If more than one testxml provided, \
+                    results will be merged together to this output file"),
+        make_option("-e", dest="exttest", action="store",
+                    help="Launch external test with a launcher,\
+                         supports browser or other web-runtime"),
+        make_option("-k", "--worker", dest="worker", action="store",
+                    help="Specify a test engine for execution, use value 'default' by default"),
+       # make_option("-p", "--target-platform", dest="targetplatform",
+       #             action="store",
+       #             help="specify special test target platform, e.g. xw_android, chrome_ubuntu"),
+       # make_option("--webdriver-url", dest="wdurl", action="store",
+       #             help="specify special web driver listening url"),
+        make_option("--version", dest="version_info", action="store_true",
+                    help="Show version information"),
+        make_option("--internal-version", dest="internal_version_info",
+                    action="store_true",
+                    help="Show internal version information"),
+        make_option("--deviceid", dest="device_serial", action="store",
+                    help="set device serial information"),
+        make_option("--testprefix", dest="test_prefix", action="store",
+                    help="set prefix for test case entry"),
+        make_option("--testenvs", dest="test_env", action="store",
+                    help="set environs for test case execution, use ';' to separator multi option"),
+        make_option("--comm", dest="commodule", action="store",
+                    help="set commodule by default,"
+                    "set \"localhost\" for local web testing"),
+        make_option("--capability", dest="capability", action="store",
+                    help="set platform for sepecfic device capability"),
+        make_option("--debug", dest="debug", action="store_true",
+                    help="run in debug mode,more log information print out"),
+        make_option("--rerun", dest="rerun", action="store_true",
+                    help="check if rerun test mode"),
+        make_option("--non-active", dest="non_active", action="store_true",
+                    help="Disable the ability to set the result of \
+                    core manual cases from the console"),
+       # make_option("-d", "--debugip", dest="debugip", action="store",
+       #             help="specify tizen xwalk debug ip "),
+        make_option("--init-script", dest="initscript", action="store",
+                   help="init script before script"),
+        make_option("--post-script", dest="postscript", action="store",
+                   help="post script"),
+        make_option('--disable-dlog', dest="disabledlog", action="store_true",
+                   help="disable dlog information"),
+       # make_option('--user', dest="user", action="store",
+       #            help="setting test user")
+        make_option("--tizen-version", dest="tizenversion", action="callback", callback=varnarg, help="set tizen version infomation"),
+        make_option("--skip-tc", dest="skip_tc", action="callback", callback=varnarg, help ="Specify the testcase id for exclude from the test"),
+        make_option("--stub-port", dest="stubport", action="callback", callback=varnarg, help = "set testkit-stub port number"),
+        make_option("--tc-timeout", dest="tc_timeout", action="callback", callback=varnarg, help ="Specify the timeout for one TC"),
+    ]
+
+    OPTION_LIST.extend([
+        make_option("--%s" % flt,
+                    dest="w%s" % flt, action="callback", callback=varnarg,
+                    help="Select the specified filter-rules : %s" % flt)
+        for flt in COMMON_FILTERS])
+
+    try:
+        # untrusted behaviour of %%prog
+        USAGE = "%%prog [options] -f [prefix:]\"<somewhere/test.xml>\" \n\
+forms:    %%prog  -f [prefix:]\"<somewhere>/test.xml\" \n\
+          %%prog  -f [prefix:]\"<somewhere>/test.xml\" -D\n\
+          %%prog  -f [prefix:]\"<somewhere>/test.xml\" -A\n\
+          %%prog  -f [prefix:]\"<somewhere>/test.xml\" -M\n\
+          %%prog  -f [prefix:]\"<somewhere>/test.xml\" --set <set_name>\n\
+          %%prog  -f [prefix:]\"<somewhere>/test.xml\" --type <type_name>\n\
+          %%prog  -f [prefix:]\"<somewhere>/test.xml\" --status <status_name>\n\
+          %%prog  -f [prefix:]\"<somewhere>/test.xml\" --priority <priority_value>\n\
+          %%prog  -f [prefix:]\"<somewhere>/test.xml\" --component <component_name>\n\
+          %%prog  -f [prefix:]\"<somewhere>/test.xml\" --id <case_id>\n\
+          %%prog  -f [prefix:]\"<somewhere>/test.xml\" --capability <capability_file> --comm <comm_type>\n\
+          %%prog  -f [prefix:]\"<somewhere>/test.xml\" --comm <comm_type>\n\
+          %%prog  -f [prefix:]\"<somewhere>/test1.xml <somewhere>/test2.xml <somewhere>/test3.xml\" \n\
+          %%prog  -f [prefix:]\"<somewhere>/test1.xml <somewhere>/test2.xml <somewhere>/test3.xml --testenvs 'wd-url=...;wd-debugip=...'\" \n\
+exmaples of \"prefix\" usage: \n\
+    run a web test with a test definition (XML file) from device side: \n\
+          %%prog -f device:\"/opt/usr/media/tct/opt/tct-websocket-w3c-tests/tests.xml\" -A \n\
+    run a web test with a test definition (XML file) from localhost: \n\
+          %%prog -f \"/opt/usr/media/tct/opt/tct-websocket-w3c-tests/tests.xml\" -A \n\
+exmaples of \"-e\" usage: \n\
+    run a web test package with TIZEN web-runtime, launcher provided in tests.xml, so \"-e\" is omitted: \n\
+          %%prog -f device:\"/opt/usr/media/tct/opt/tct-websocket-w3c-tests/tests.xml\" -A \n\
+    run a web test package with chrome browser: \n\
+          %%prog -f \"/usr/share/webapi-webkit-tests/tests.xml\" -e \
+'google-chrome --allow-file-access-from-files --disable-web-security --start-maximized --user-data-dir=/home/test/data /home/test/webrunner/index.html' -A --comm localhost \n\
+\n\
+Note: \n\
+          1) Proxy settings should be disabled when execute webapi packages\n\
+          2) TestLog is stored to %s/latest\n\
+          3) %%prog enables both auto and manual tests by default\n\
+          4) Obviously -A and -M are conflict options\n\
+          5) -e option does not support -D mode\n\
+          6) The test cases' order in the result files might be arbitrary,\
+when running same tests.xml with same options. This is caused \
+by python's API 'iter' from module 'xml.etree.ElementTree'\n\
+          7) run command 'testkit-lite', \
+it might not be able to locate module 'testkitlite.engines.\
+default.runner', \
+run command 'export PYTHONPATH=/usr/local/lib/python2.7/dist-packages' or \
+run command 'export PYTHONPATH=/usr/local/lib/python2.7/site-packages' \
+to resolve this issue" % (LOG_DIR)
+    except Exception:
+        USAGE = None
+
+    # detect non-params
+    if len(sys.argv) == 1:
+        sys.argv.append("-h")
+
+    PARSERS = OptionParser(option_list=OPTION_LIST, usage=USAGE)
+    (OPTIONS, ARGS) = PARSERS.parse_args()
+    # init test engine here
+    from testkitlite.util.connector import ConnectorBuilder
+    from testkitlite.util.process import get_device_lock, release_device_lock, clean_testxml
+    from testkitlite.util.session import TestSession
+    from testkitlite.util.errors import TestCaseNotFoundException, TestEngineException
+
+    #execute_type
+    exec_types = ["auto","manual"]
+    if OPTIONS.bautoonly and OPTIONS.bmanualonly:
+        raise ValueError("-A and -M are conflict")
+    elif OPTIONS.bautoonly:
+        exec_types.remove("manual")
+    elif OPTIONS.bmanualonly:
+        exec_types.remove("auto")
+
+    if OPTIONS.worker and OPTIONS.worker != 'webdriver':
+        raise ValueError('-k is just service for webdriver, you can not set it ,using default')
+
+    debugip = None
+    if OPTIONS.test_env:
+        #envs = OPTIONS.test_env.replace(';',' ').split(' ')
+        envs = OPTIONS.test_env.split(';')
+        for env_t in envs:
+            env_t = env_t.strip()
+            if not env_t:
+                continue
+            k, v = env_t.split('=')
+            if 'app_launcher' in v:
+                os.environ[k.strip()] = "app_launcher -s"
+            else:
+                os.environ[k.strip()] = v.strip()
+            if k.strip() == "wd-debugip":
+               debugip = v.strip()
+    if 'TIZEN_USER' not in os.environ:
+        try:
+            CONFIG = configparser.ConfigParser()
+            CONFIG.read('/opt/testkit/lite_web_csharp/commodule/CONFIG')
+            tizen = CONFIG.get('TIZEN','tizen_user')
+            if tizen:
+                os.environ['TIZEN_USER'] = tizen
+        except:
+            pass
+    # connector options
+    conn_opt = {}
+    #conn_opt['commodule'] = OPTIONS.commodule or "tizenmobile"
+    conn_opt['commodule'] = OPTIONS.commodule or "localhost"
+    conn_opt['deviceid'] = OPTIONS.device_serial
+    CONNECTOR = ConnectorBuilder(conn_opt).get_connector()
+    if CONNECTOR == None:
+        sys.exit(1)
+
+    device_id = CONNECTOR.get_device_info()['device_id']
+    os.environ['DEVICE_ID'] = device_id
+    if not OPTIONS.non_active:
+        device_locked = get_device_lock(device_id)
+        if not device_locked:
+            LOGGER.error("[ Error: Failed to get device for current session... ]\n")
+            sys.exit(1)
+
+    #modify at 2014.09.11
+    targetplatform = None
+    #debugip = None
+    if OPTIONS.exttest and OPTIONS.worker and OPTIONS.worker.upper() == 'WEBDRIVER':
+        if conn_opt['commodule'] == 'localhost':
+            targetplatform = "chrome_ubuntu"
+            os.environ['targetplatform'] = targetplatform
+        elif conn_opt['commodule'] == 'tizenmobile':
+            targetplatform = "xw_tizen"
+            os.environ['targetplatform'] = targetplatform
+        elif conn_opt['commodule'] == 'androidmobile':
+            targetplatform = "xw_android"
+            os.environ['targetplatform'] = targetplatform
+    # process test environ
+    if OPTIONS.test_env:
+        #envs = OPTIONS.test_env.replace(';',' ').split(' ')
+        envs = OPTIONS.test_env.split(';')
+        for env_t in envs:
+            env_t = env_t.strip()
+            if not env_t:
+                continue
+            k, v = env_t.split('=')
+            if 'app_launcher' in v:
+                os.environ[k.strip()] = "app_launcher -s"
+            else:
+                os.environ[k.strip()] = v.strip()
+
+    # load profile for wedrvier
+    if targetplatform:
+        webdriver_vars = {}
+        exec('from testkitlite.capability.%s import initCapability' % targetplatform)
+        if targetplatform.upper().find('TIZEN') >= 0:
+            if not debugip:
+                raise ValueError("For tizen xwalk, option --debugip is needed!")
+            webdriver_vars = initCapability('TEST_APP_ID', debugip)
+        elif targetplatform.upper().find('ANDROID') >= 0:
+            webdriver_vars = initCapability('TEST_PKG_NAME', 'TEST_ACTIVITY_NAME')
+        else:
+            webdriver_vars = initCapability()
+        os.environ['WEBDRIVER_VARS'] = json.dumps(webdriver_vars)
+
+    # process test environ
+   # if OPTIONS.test_env:
+   #     envs = OPTIONS.test_env.replace(';',' ').split(' ')
+   #     for env_t in envs:
+   #         env_t = env_t.strip()
+   #         if not env_t:
+   #             continue
+   #         k, v = env_t.split('=')
+   #         os.environ[k.strip()] = v.strip()
+    if OPTIONS.initscript:
+        os.environ['initscript'] = OPTIONS.initscript
+    if OPTIONS.postscript:
+        os.environ['postscript'] = OPTIONS.postscript
+    # load test defintion files
+    if "device:" in OPTIONS.testxml[0]:
+        if not CONNECTOR.is_support_remote():
+            raise ValueError("For '%s' mode, please test file without prefix 'device:' " % conn_opt['commodule'])
+
+        remote_test = True
+        try:
+            if not EXISTS(TEST_PACKAGES_DIR):
+                os.makedirs(TEST_PACKAGES_DIR)
+        except OSError as err:
+            LOGGER.error("[ Error: "
+                "can't create test package directory: %s, error: %s ]\n" %
+                        (TEST_PACKAGES_DIR, err))
+            unlock_and_exit()
+        REMOTE_TESTLITS = OPTIONS.testxml[0]
+        REMOTE_TESTLITS = REMOTE_TESTLITS.split(':')[1]
+        TESTLISTARRARY = REMOTE_TESTLITS.split()
+        LOCALARRY = []
+
+        for remote_file in TESTLISTARRARY:
+            tmp_remote_file = SPLIT(remote_file)
+            tmp_remote_folder = BASENAME(tmp_remote_file[0])
+            tmp_remote_test_xml = JOIN(
+                tmp_remote_folder, tmp_remote_file[1])
+            local_test_package = JOIN(
+                TEST_PACKAGES_DIR, tmp_remote_test_xml)
+            down_status = CONNECTOR.download_file(remote_file, local_test_package)
+            if not down_status:
+                LOGGER.error("Failed to get test file '%s' from device"
+                             % remote_file)
+                unlock_and_exit()
+            LOCALARRY.append(local_test_package)
+        OPTIONS.testxml = LOCALARRY
+    else:
+        if len(OPTIONS.testxml) == 1:
+            i, start, end = 0, 0, 0
+            LOCAL_TESTLISTS = []
+            temp_xml = OPTIONS.testxml[0]
+            while(i < len(temp_xml)):
+                tmp = temp_xml[i:len(temp_xml)]
+                if ".xml" in tmp:
+                    index = tmp.index(".xml") + 4 + i
+                    end = index
+                    i = index + 1
+                    LOCAL_TESTLISTS.append(temp_xml[start:end])
+                    start = index + 1
+                else:
+                    LOGGER.error("No xml found")
+                    break
+            OPTIONS.testxml = LOCAL_TESTLISTS
+
+
+    # load test engine
+    if OPTIONS.worker:
+        os.environ['WORKER'] = OPTIONS.worker
+
+    workername = OPTIONS.worker or 'default'
+    try:
+        exec("from testkitlite.engines.%s import TestWorker" % workername)
+    except Exception as error:
+        raise TestEngineException(workername)
+    WORKER = TestWorker(CONNECTOR)
+
+    # create runner
+    RUNNER = TestSession(CONNECTOR, WORKER)
+    # apply all options
+    RUNNER.set_global_parameters(OPTIONS)
+
+    if OPTIONS.tizenversion is None:
+        LOGGER.error("[ Error : input your tizen version ]\n")
+        sys.exit(1)
+    else :
+        tizenver = OPTIONS.tizenversion[0]
+        VER_PATTERN = "^tizen_web_\d.\d|^tizen_native_\d.\d|^tizen_csharp_\d.\d"
+        pa = re.compile(VER_PATTERN, re.I)
+        ma = pa.match(tizenver)
+        if ma is None:
+             LOGGER.error("A required \"/opt/tct/"+tizenver+" could not be found.\n")
+             sys.exit(1)
+
+        RUNNER.set_tizenversion(tizenver)
+
+    if OPTIONS.stubport is not None:
+        port = OPTIONS.stubport[0]
+        RUNNER.set_stubport(port)
+
+    if OPTIONS.skip_tc is not None:
+        RUNNER.set_skip_tc(OPTIONS.skip_tc)
+
+    # set capability
+    if not RUNNER.get_capability(OPTIONS.capability):
+        unlock_and_exit()
+    # apply filter
+    WFILTERS = {}
+    for flt in COMMON_FILTERS:
+        if eval('OPTIONS.w%s' % flt):
+            WFILTERS[flt] = eval('OPTIONS.w%s' % flt)
+    RUNNER.add_filter_rules(**WFILTERS)
+
+    if not OPTIONS.testxml:
+        LOGGER.error("[ Error: not specify a test xml... ]\n")
+        unlock_and_exit()
+    # 1) prepare log dir
+    if OS_VER == "Linux" or OS_VER == "Darwin":
+        SESSION = datetime.today().isoformat('-') + str(os.getpid()) + "_session"
+    else:
+        SESSION = datetime.today().strftime("%Y-%m-%d_%H_%M_%S") + \
+                str(os.getpid()) + "_session"
+    CURRENT_LOG_DIR = JOIN(LOG_DIR, SESSION)
+    LATEST_DIR = JOIN(LOG_DIR, "latest")
+    try:
+        if EXISTS(LATEST_DIR):
+            os.remove(LATEST_DIR)
+        if ISLINK(LATEST_DIR):
+            os.remove(LATEST_DIR)
+        os.makedirs(CURRENT_LOG_DIR)
+        if os.name == "posix":
+            os.symlink(CURRENT_LOG_DIR, LATEST_DIR)
+    except IOError as err:
+        LOGGER.error("[ Error: create session log directory: "
+                     "%s failed, error: %s ]\n" % (CURRENT_LOG_DIR, err))
+    except OSError as err:
+        LOGGER.error("error : %s" % err)
+    finally:
+        if not EXISTS(CURRENT_LOG_DIR):
+            os.makedirs(CURRENT_LOG_DIR)
+
+    # 2) prepare run test
+    # run more than one tests.xml
+    # 1. run all auto cases from the xmls
+    # 2. run all manual cases from the xmls
+    TESTXMLS = set(OPTIONS.testxml)
+    for t in TESTXMLS:
+        if EXISTS(t):
+            filename = t
+            filename = os.path.splitext(filename)[0]
+            if OS_VER == "Linux" or OS_VER == "Darwin":
+                if not filename.startswith('/'):
+                    LOGGER.error("[ Error:"
+                          " xml file %s should start with '/' ]" % filename)
+                    unlock_and_exit()
+                file_items = filename.split('/')
+            else:
+                file_items = re.split(r'[/\\]+', filename)
+            if len(file_items) < 2 or file_items[-2] == "" or file_items[-1] == "":
+                LOGGER.error("[ Error:"
+                      " unable to find package name from %s ]" % t)
+                unlock_and_exit()
+            filename = file_items[-2] + '_' + file_items[-1]
+            filename = "%s.total" % BASENAME(filename)
+            resultfile = "%s.xml" % filename
+            resultfile = JOIN(CURRENT_LOG_DIR, resultfile)
+            try:
+                ep = etree.parse(t)
+                suiteparent = ep.getroot()
+            except etree.ParseError:
+                LOGGER.error("[ Error: no case found in testxml, "
+                             "pls check the test package ]\n")
+                unlock_and_exit()
+            no_test_definition = 1
+            for tf in ep.iter('test_definition'):
+                no_test_definition = 0
+            if no_test_definition:
+                suiteparent = etree.Element('test_definition')
+                suiteparent.tail = "\n"
+                for suite in ep.iter('suite'):
+                    suite.tail = "\n"
+                    suiteparent.append(suite)
+            WFILTERS['execution_type'] = exec_types
+            RUNNER.add_filter_rules(**WFILTERS)
+            RUNNER.apply_filter(suiteparent)
+            # merge duplicated test set under suite node
+            tset_list = set()
+            for suite in ep.findall('suite'):
+                for tset in suite.findall('set'):
+                    for testcase in tset.findall('testcase'):
+                        tset.remove(testcase)
+                    if tset.get('name') in tset_list:
+                        suite.remove(tset)
+                    else:
+                        tset_list.add(tset.get('name'))
+            try:
+                with open(resultfile, 'wb') as output:
+                    tree = etree.ElementTree(element=suiteparent)
+                    tree.write(output)
+            except IOError as err:
+                LOGGER.error(
+                    "[ Error: create filtered total result file: %s failed, "
+                    "error: %s ]\n" % (resultfile, err))
+        else:
+            LOGGER.error("[ test xml file '%s' not found ]" % t)
+            unlock_and_exit()
+
+    for t in TESTXMLS:
+        for e_type in exec_types:
+            try:
+                WFILTERS['execution_type'] = [e_type]
+                RUNNER.add_filter_rules(**WFILTERS)
+                RUNNER.prepare_run(t, resultdir=CURRENT_LOG_DIR)
+            except IOError as err:
+                LOGGER.error("[ Error: prepare_run test xml: "
+                  "%s from testkit-lite failed, error: %s ]\n" % (t, err))
+
+    START_TIME = datetime.today().strftime("%Y-%m-%d_%H_%M_%S")
+    try:
+        can_merge_result = True
+        RUNNER.run_case(CURRENT_LOG_DIR)
+    except TestCaseNotFoundException as err:
+        LOGGER.info("\n[ Error: exiting testkit-lite on error: %s ]\n" % err)
+        unlock_and_exit()
+    except Exception as err:
+        clean_testxml(TESTXMLS, remote_test)
+        traceback.print_exc()
+        LOGGER.error("[ Error: run test failed, error: %s ]\n" % err)
+
+    try:
+        RUNNER.merge_resultfile(START_TIME, CURRENT_LOG_DIR)
+        clean_testxml(TESTXMLS, remote_test)
+        LOGGER.info("[ all tasks for testkit lite are accomplished, goodbye ]")
+        unlock_and_exit(0)
+    except Exception as err:
+        traceback.print_exc()
+        clean_testxml(TESTXMLS,remote_test)
+        LOGGER.error("[ Error: merge result failed, error: %s ]\n" % err)
+        unlock_and_exit()
+except (TestEngineException, KeyboardInterrupt) as err:
+    final_clean_test()
+    LOGGER.info("\n[ exiting testkit-lite on user cancel ]\n")
+    unlock_and_exit()
+except Exception as err:
+    final_clean_test()
+    LOGGER.error("\n[ Error: exiting testkit-lite due to critical error: %s ]\n" % err)
+    traceback.print_exc()
+    unlock_and_exit()
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkit-merge b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkit-merge
new file mode 100644 (file)
index 0000000..c4dfdf5
--- /dev/null
@@ -0,0 +1,51 @@
+#!/usr/bin/env python3
+#
+# Copyright (C) 2014 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# Authors: 
+#          Nicolas Zingile <n.zingile@gmail.com>
+
+import argparse
+from testkitmerge.merger import *
+
+def main():
+    argparser = argparse.ArgumentParser(description='Tool to merge testkit result xml files')
+    argparser.add_argument('-f', '--files', help='list of testkit xml result files', nargs='+')
+    argparser.add_argument('-o', '--outdir',  help='output directory of final result file', required=True)
+    argparser.add_argument('-n', '--name', help ='name of the final result file', default='result.xml')
+    args = argparser.parse_args()
+    print(args)
+
+    parser = etree.XMLParser(strip_cdata=False)
+    sourcexmltree = None
+    resultxmltree = None
+
+    for resultxml in args.files:
+       if not os.path.isfile(resultxml):
+           print("Error: the file '" + resultxml + "'doesn't exist !")
+           exit(1)
+       if not resultxml.endswith('.xml'):
+           print("Error: '" + resultxml + "' is not an xml file !")
+           exit(1)
+    for index in range(len(args.files)):
+       sourcexmltree =  etree.parse(args.files[index], parser)
+       resultxmltree = merge_testkitxml(sourcexmltree, resultxmltree)
+       
+    resultxmltree.write(os.path.join(args.outdir, args.name), pretty_print=True, encoding='utf8', method='xml', xml_declaration=True)
+
+if __name__ == "__main__":
+    main()
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/Makefile.am b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/Makefile.am
new file mode 100644 (file)
index 0000000..5a462d8
--- /dev/null
@@ -0,0 +1,20 @@
+# Copyright (C) 2012 Intel Corporation
+# 
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# Authors:
+#              Zhang, Huihui <huihuix.zhang@intel.com>
+#              Wendong,Sui  <weidongx.sun@intel.com>
+
+SUBDIRS = common engines
+
+testkitlitedir = /usr/lib/python2.7/dist-packages/testkitlite
+dist_testkitlite_SCRIPTS = __init__.py
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/__init__.py b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/__init__.py
new file mode 100644 (file)
index 0000000..8b13789
--- /dev/null
@@ -0,0 +1 @@
+
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/capability/Makefile.am b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/capability/Makefile.am
new file mode 100644 (file)
index 0000000..18f2503
--- /dev/null
@@ -0,0 +1,18 @@
+# Copyright (C) 2012 Intel Corporation
+# 
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# Authors:
+#              Zhang, Huihui <huihuix.zhang@intel.com>
+#              Wendong,Sui  <weidongx.sun@intel.com>
+
+testkitlitecapdir = /usr/lib/python2.7/dist-packages/testkitlite/capability
+dist_testkitlitecap_SCRIPTS = *.py
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/capability/__init__.py b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/capability/__init__.py
new file mode 100644 (file)
index 0000000..8b13789
--- /dev/null
@@ -0,0 +1 @@
+
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/capability/chrome_ubuntu.py b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/capability/chrome_ubuntu.py
new file mode 100644 (file)
index 0000000..2cc6277
--- /dev/null
@@ -0,0 +1,3 @@
+def initCapability(test_app=None, test_ext=None):
+    capability = {'chrome.binary': '/usr/bin/chromium-browser'}
+    return {'webdriver_url': 'http://127.0.0.1:9515', 'desired_capabilities': capability, 'test_prefix': 'file:///'}
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/capability/xw_android.py b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/capability/xw_android.py
new file mode 100644 (file)
index 0000000..5a3f984
--- /dev/null
@@ -0,0 +1,3 @@
+def initCapability(test_name=None, test_ext=None, webdriver_url='http://127.0.0.1:9515', test_prefix='file:///android_asset/www/'):
+    capability = {'xwalkOptions': {'androidPackage':test_name, 'androidActivity': test_ext}}
+    return {'webdriver_url': webdriver_url, 'desired_capabilities': capability, 'test_prefix': test_prefix }
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/capability/xw_tizen.py b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/capability/xw_tizen.py
new file mode 100644 (file)
index 0000000..7d11d53
--- /dev/null
@@ -0,0 +1,8 @@
+def initCapability(test_app=None, test_ext=None, webdriver_url='http://127.0.0.1:9515', test_prefix=''):
+    capability = {'xwalkOptions': {
+                     'tizenDebuggerAddress':  test_ext,
+                     'tizenAppId': test_app
+                     }
+                 }
+#    print capability
+    return {'webdriver_url':webdriver_url , 'desired_capabilities': capability, 'test_prefix': test_prefix}
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/commodule/CONFIG b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/commodule/CONFIG
new file mode 100644 (file)
index 0000000..e6b6d74
--- /dev/null
@@ -0,0 +1,8 @@
+[LOGGING]
+log_level=INFO
+
+[EXTENSION]
+crosswalk=--external-extensions-path=/usr/lib/tizen-extensions-crosswalk
+
+[TIZEN]
+tizen_user=app
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/commodule/Makefile.am b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/commodule/Makefile.am
new file mode 100644 (file)
index 0000000..9edbd3e
--- /dev/null
@@ -0,0 +1,18 @@
+# Copyright (C) 2012 Intel Corporation
+# 
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# Authors:
+#              Yuanyuan,Zou  <yuanyuanx.zou@intel.com>
+
+
+commoduleimpldir = /usr/lib/python2.7/dist-packages/commodule
+dist_commoduleimpl_SCRIPTS = *.py
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/commodule/__init__.py b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/commodule/__init__.py
new file mode 100644 (file)
index 0000000..8b13789
--- /dev/null
@@ -0,0 +1 @@
+
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/commodule/androidmobile.py b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/commodule/androidmobile.py
new file mode 100644 (file)
index 0000000..06e20e7
--- /dev/null
@@ -0,0 +1,329 @@
+#!/usr/bin/python
+#
+# Copyright (C) 2012 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# Authors:
+#           Chengtao,Liu  <chengtaox.liu@intel.com>
+
+""" The implementation of Android communication driver"""
+
+import os
+import time
+import socket
+import threading
+import re
+
+from testkitlite.util.log import LOGGER
+from testkitlite.util.autoexec import shell_command, shell_command_ext
+from testkitlite.util.killall import killall
+from testkitlite.util.errors import InvalidDeviceException
+
+
+os.environ['TEST_PLATFORM'] = 'android'
+os.environ['CONNECT_TYPE'] = 'adb'
+LOCAL_HOST_NS = "127.0.0.1"
+APP_QUERY_STR = "adb -s %s shell ps | grep %s | awk '{print $2}' "
+APK_INSTALL = "adb -s %s shell pm install %s"
+APK_UNINSTALL = "adb -s %s shell pm uninstall %s"
+APK_LIST = "adb -s %s shell pm list packages |grep '%s'|cut -d ':' -f2"
+APP_NONBLOCK_STR = "adb -s %s shell '%s' &"
+APP_START = "adb -s %s shell am start -n %s"
+APP_STOP = "adb -s %s shell am force-stop %s"
+XWALK_APP_STR = "org.xwalk.%s/.%sActivity"
+
+
+LOGCAT_CLEAR = "adb -s %s shell logcat -c"
+LOGCAT_START = "adb -s %s shell logcat -v time"
+DMESG_CLEAR = "adb -s %s shell dmesg -c"
+DMESG_START = "adb -s %s shell cat /proc/kmsg"
+
+
+def debug_trace(cmdline, logfile):
+    global debug_flag, metux
+    wbuffile = open(logfile, "w")
+    import subprocess
+    exit_code = None
+    proc = subprocess.Popen(args=cmdline,
+                            shell=True,
+                            stdout=wbuffile,
+                            stderr=None)
+    while True:
+        exit_code = proc.poll()
+        if exit_code is not None:
+            break
+        time.sleep(0.5)
+        metux.acquire()
+        proc_flag = debug_flag
+        metux.release()
+        if not proc_flag:
+            break
+    wbuffile.close()
+    if exit_code is None:
+        killall(proc.pid)
+
+
+def _get_device_ids():
+    """get android device list of ids"""
+    result = []
+    exit_code, ret = shell_command("adb devices")
+    for line in ret:
+        if str.find(line, "\tdevice") != -1:
+            result.append(line.split("\t")[0])
+    return result
+
+
+class AndroidMobile:
+
+    """ Implementation for transfer data
+        between Host and Android Mobile Device
+    """
+
+    def __init__(self, device_id=None):
+        self.deviceid = device_id
+        self.support_remote = True
+
+    def is_support_remote(self):
+        return self.support_remote
+
+    def shell_cmd(self, cmd="", timeout=15):
+        cmdline = "adb -s %s shell %s" % (self.deviceid, cmd)
+        return shell_command(cmdline, timeout)
+
+    def check_process(self, process_name):
+        exit_code, ret = shell_command(
+            APP_QUERY_STR % (self.deviceid, process_name))
+        return len(ret)
+
+    def kill_stub(self):
+        #add this function to avoid webdriver issue, yangx.zhou@intel.com,2015.01.15
+        wgt_name = "testkit.stub/.TestkitStub"
+        pkg_name = wgt_name.split('/')[0]
+        cmdline = APP_STOP % (self.deviceid, pkg_name)
+        exit_code, ret = shell_command(cmdline)
+
+
+    def launch_stub(self, stub_app, stub_port="8000", debug_opt=""):
+       # self.kill_stub()
+        wgt_name = "testkit.stub/.TestkitStub"
+       # pkg_name = wgt_name.split('/')[0]
+       # cmdline = APP_STOP % (self.deviceid, pkg_name)
+       # exit_code, ret = shell_command(cmdline)
+        cmdline = APP_START % (self.deviceid, wgt_name)
+        debug_ext = " -e debug on" if debug_opt != "" else " -e debug off"
+        port_ext = " -e port " + stub_port
+        exit_code, ret = shell_command(cmdline + port_ext + debug_ext)
+        time.sleep(2)
+        return True
+
+    def shell_cmd_ext(self,
+                      cmd="",
+                      timeout=None,
+                      boutput=False,
+                      stdout_file=None,
+                      stderr_file=None,
+                      callbk=None):
+        cmdline = "adb -s %s shell '%s; echo returncode=$?'" % (
+            self.deviceid, cmd)
+        return shell_command_ext(cmdline, timeout, boutput, stdout_file, stderr_file, callbk)
+
+    def get_device_info(self):
+        """get android device inforamtion"""
+        device_info = {}
+        device_info["device_id"] = self.deviceid
+        device_info["resolution"] = "N/A"
+        device_info["screen_size"] = "N/A"
+        device_info["device_model"] = "N/A"
+        device_info["device_name"] = "N/A"
+        device_info["os_version"] = "N/A"
+        device_info["build_id"] = "N/A"
+        return device_info
+
+    def download_file(self, remote_path, local_path):
+        """download file from device"""
+        cmd = "adb -s %s pull %s %s" % (self.deviceid, remote_path, local_path)
+        exit_code, ret = shell_command(cmd)
+        if exit_code != 0:
+            error = ret[0].strip('\r\n') if len(ret) else "sdb shell timeout"
+            LOGGER.info("[ Download file \"%s\" failed, error: %s ]"
+                        % (remote_path, error))
+            return False
+        else:
+            return True
+
+    def upload_file(self, remote_path, local_path):
+        """upload file to device"""
+        cmd = "adb -s %s push %s %s" % (self.deviceid, local_path, remote_path)
+        exit_code, ret = shell_command(cmd)
+        if exit_code != 0:
+            error = ret[0].strip('\r\n') if len(ret) else "sdb shell timeout"
+            LOGGER.info("[ Upload file \"%s\" failed,"
+                        " get error: %s ]" % (local_path, error))
+            return False
+        else:
+            return True
+
+    def get_launcher_opt(self, test_launcher, test_ext, test_widget, test_suite, test_set):
+        """get test option dict """
+        test_opt = {}
+        test_opt["suite_name"] = test_suite
+        test_opt["launcher"] = test_launcher
+        if test_launcher.find('xwalk') >= 0:
+            if test_widget is not None and test_widget != "":
+                test_suite = test_widget
+            test_suite = test_suite.replace('-', '_')
+            test_opt["test_app_id"] = XWALK_APP_STR % (test_suite, test_suite)
+        else:
+            test_opt["test_app_id"] = test_launcher
+        return test_opt
+
+    def get_server_url(self, remote_port="8000"):
+        """forward request a host tcp port to targe tcp port"""
+        if remote_port is None:
+            return None
+
+        os.environ['no_proxy'] = LOCAL_HOST_NS
+        host = LOCAL_HOST_NS
+        inner_port = 9000
+        time_out = 2
+        bflag = False
+        while True:
+            sock_inner = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+            sock_inner.settimeout(time_out)
+            try:
+                sock_inner.bind((host, inner_port))
+                sock_inner.close()
+                bflag = False
+            except socket.error as error:
+                if error.errno == 98 or error.errno == 13:
+                    bflag = True
+            if bflag:
+                inner_port += 1
+            else:
+                break
+        host_port = str(inner_port)
+        cmd = "adb -s %s forward tcp:%s tcp:%s" % \
+            (self.deviceid, host_port, remote_port)
+        exit_code, ret = shell_command(cmd)
+        url_forward = "http://%s:%s" % (host, host_port)
+        return url_forward
+
+    def install_package(self, pkgpath):
+        """install a package on android device:
+        push package and install with shell command
+        """
+        cmd = APK_INSTALL % (self.deviceid, pkgpath)
+        exit_code, ret = shell_command(cmd)
+        return ret
+
+    def uninstall_package(self, pkgname):
+        """install a package on android device:
+        push package and install with shell command
+        """
+        cmd = APK_UNINSTALL % (self.deviceid, pkgname)
+        exit_code, ret = shell_command(cmd)
+        return ret
+
+    def get_installed_package(self):
+        """get list of installed package from device"""
+        cmd = APK_LIST % self.deviceid
+        exit_code, ret = shell_command(cmd)
+        return ret
+
+    def start_debug(self, dlogfile):
+        global debug_flag, metux
+        debug_flag = True
+        metux = threading.Lock()
+        logcat_cmd = LOGCAT_CLEAR % self.deviceid
+        exit_code, ret = shell_command(logcat_cmd)
+        dmesg_cmd = DMESG_CLEAR % self.deviceid
+        exit_code, ret = shell_command(logcat_cmd)
+        logcat_cmd = LOGCAT_START % self.deviceid
+        dmesg_cmd = DMESG_START % self.deviceid
+        threading.Thread(target=debug_trace, args=(logcat_cmd, dlogfile+'.logcat')).start()
+        threading.Thread(target=debug_trace, args=(dmesg_cmd, dlogfile+'.dmesg')).start()
+
+    def stop_debug(self):
+        global debug_flag, metux
+        metux.acquire()
+        debug_flag = False
+        metux.release()
+
+    def launch_app(self, wgt_name):
+        blauched = False
+        if wgt_name.find('xwalk') != -1:
+            timecnt = 0
+            blauched = False
+            pkg_name, actv_name = wgt_name.split('/')
+            actv_name = actv_name.strip('.')
+            cmdline = APP_STOP % (self.deviceid, pkg_name)
+            exit_code, ret = shell_command(cmdline)
+            cmdline = APP_START % (self.deviceid, wgt_name)
+            exit_code, ret = shell_command(cmdline)
+            if len(ret) > 1:
+                # remove Activity to retry
+                actv_name = actv_name.replace('Activity', '')
+                LOGGER.info("[ Retry to launch app: %s ]" % (pkg_name + '/.' + actv_name))
+                cmdline = APP_START % (self.deviceid, pkg_name + '/.' + actv_name)
+                exit_code, ret = shell_command(cmdline)
+            if len(ret) > 1:
+                # use capitalize to retry
+                tmps = actv_name.split('_')
+                actv_name = ''.join([it.capitalize() for it in tmps if it])
+                LOGGER.info("[ Retry to launch app: %s ]" % (pkg_name + '/.' + actv_name + 'Activity'))
+                cmdline = APP_START % (self.deviceid, pkg_name + '/.' + actv_name + 'Activity')
+                exit_code, ret = shell_command(cmdline)
+                if len(ret) > 1:
+                    # remove Activity
+                    LOGGER.info("[ Retry to launch app: %s ]" % (pkg_name + '/.' + actv_name))
+                    cmdline = APP_START % (self.deviceid, pkg_name + '/.' + actv_name)
+                    exit_code, ret = shell_command(cmdline)
+
+            blauched = True
+            time.sleep(3)
+        else:
+            cmdline = APP_NONBLOCK_STR % (self.deviceid, wgt_name)
+            exit_code, ret = shell_command(cmdline)
+            time.sleep(3)
+            cmd = APP_QUERY_STR % (self.deviceid, wgt_name)
+            exit_code, ret = shell_command(cmd)
+            if ret and len(ret):
+                blauched = True
+        return blauched
+
+    def kill_app(self, wgt_name):
+        pkg_name = wgt_name.split('/')[0]
+        cmdline = APP_STOP % (self.deviceid, pkg_name)
+        exit_code, ret = shell_command(cmdline)        
+        return True
+
+    install_app = install_package
+    uninstall_app = uninstall_package
+
+    def get_buildinfo(self):
+        """ get builf info"""
+        build_info = {}
+        build_info['buildid'] = ''
+        build_info['manufacturer'] = ''
+        build_info['model'] = ''
+        return build_info
+
+
+def get_target_conn(device_id=None):
+    """ Get connection for Test Target"""
+    if device_id is None:
+        dev_list = _get_device_ids()
+        if len(dev_list):
+            device_id = dev_list[0]
+        else:
+            raise InvalidDeviceException('No android device found!')
+    return AndroidMobile(device_id)
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/commodule/localhost.py b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/commodule/localhost.py
new file mode 100644 (file)
index 0000000..dd77568
--- /dev/null
@@ -0,0 +1,166 @@
+#!/usr/bin/python
+#
+# Copyright (C) 2012 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# Authors:
+#           Chengtao,Liu  <chengtaox.liu@intel.com>
+
+""" The implementation of local host communication"""
+
+import os
+import time
+import socket
+import re
+from shutil import copyfile
+
+from testkitlite.util.log import LOGGER
+from testkitlite.util.autoexec import shell_command, shell_command_ext
+
+
+HOST_NS = "127.0.0.1"
+os.environ['no_proxy'] = HOST_NS
+os.environ['TEST_PLATFORM'] = 'localhost'
+if 'CONNECT_TYPE' not in os.environ:
+    os.environ['CONNECT_TYPE'] = 'local'
+APP_QUERY_STR = "ps aux | grep %s | grep -v grep"
+
+
+class LocalHost:
+
+    """ Implementation for transfer data
+        between Host and Tizen PC
+    """
+
+    def __init__(self):
+        self.deviceid = os.environ.get('TEST_PLATFORM','')
+        #self.deviceid = "localhost"
+        self.support_remote = False
+
+    def is_support_remote(self):
+        return self.support_remote
+
+    def shell_cmd(self, cmd="", timeout=15):
+        return shell_command(cmd, timeout)
+
+    def check_process(self, process_name):
+        exit_code, ret = shell_command(APP_QUERY_STR % process_name)
+        return len(ret)
+
+    def kill_stub(self):
+        #add this fucntion to avoid webdriver issue if it running on device, yangx.zhou@intel.com
+        cmdline = "ps -aux | grep testkit-stub | grep -v grep | awk '{ print $2 }'"
+        exit_code, ret = self.shell_cmd(cmdline)
+        if exit_code == 0 and len(ret) >0:
+            cmdline = "kill -9 %s" %ret[0]
+            exit_code, ret = self.shell_cmd(cmdline)
+        
+
+    def launch_stub(self, stub_app, stub_port="8000", debug_opt=""):
+        cmdline = "%s --port:%s %s" % (stub_app, stub_port, debug_opt)
+        exit_code, ret = self.shell_cmd(cmdline)
+        time.sleep(2)
+
+    def check_widget_process(self, wgt_name):
+        return True
+
+    def shell_cmd_ext(self,
+                      cmd="",
+                      timeout=None,
+                      boutput=False,
+                      stdout_file=None,
+                      stderr_file=None):
+        return shell_command_ext(cmd, timeout, boutput, stdout_file, stderr_file)
+
+    def get_device_ids(self):
+        """
+            get device list of ids
+        """
+        return []
+
+    def get_device_info(self):
+        """
+            get tizen device inforamtion
+        """
+        device_info = {}
+        device_info["device_id"] = self.deviceid
+        device_info["resolution"] = "N/A"
+        device_info["screen_size"] = "N/A"
+        device_info["device_model"] = "N/A"
+        device_info["device_name"] = "N/A"
+        device_info["os_version"] = "N/A"
+        device_info["build_id"] = "N/A"
+        return device_info
+
+    def get_server_url(self, remote_port="8000"):
+        """get server url"""
+        url_forward = "http://%s:%s" % (HOST_NS, remote_port)
+        return url_forward
+
+    def install_package(self, pkgpath):
+        """
+           install a package on tizen device
+        """
+        cmd = "rpm -ivh %s" % pkgpath
+        exit_code, ret = shell_command(cmd)
+        return ret
+
+    def get_installed_package(self):
+        """get list of installed package from device"""
+        cmd = "rpm -qa | grep tct"
+        exit_code, ret = shell_command(cmd)
+        return ret
+
+    def download_file(self, remote_path, local_path):
+        """download file"""
+        # copyfile(remote_path, local_path)
+        # return True
+        return False
+
+    def upload_file(self, remote_path, local_path):
+        """upload file"""
+        # copyfile(local_path, remote_path)
+        return False
+
+    def get_launcher_opt(self, test_launcher, test_ext, test_widget, test_suite, test_set):
+        """get test option dict """
+        test_opt = {}
+        test_opt["suite_name"] = test_suite
+        test_opt["launcher"] = test_launcher
+        test_opt["test_app_id"] = test_launcher
+        return test_opt
+
+    def launch_app(self, wgt_name):
+        exit_code, ret = shell_command(wgt_name + '&')
+        return True
+
+    def kill_app(self, wgt_name):
+        return True
+
+    def start_debug(self, dlogfile):
+        pass
+
+    def stop_debug(self):
+        pass
+
+    def get_buildinfo(self):
+        """ get builf info"""
+        build_info = {}
+        build_info['buildid'] = ''
+        build_info['manufacturer'] = ''
+        build_info['model'] = ''
+        return build_info
+
+
+def get_target_conn():
+    """ Get connection for Test Target"""
+    return LocalHost()
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/commodule/tizenivi.py b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/commodule/tizenivi.py
new file mode 100644 (file)
index 0000000..5ed6558
--- /dev/null
@@ -0,0 +1,489 @@
+#!/usr/bin/python
+#
+# Copyright (C) 2012 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# Authors:
+#           Chengtao,Liu  <chengtaox.liu@intel.com>
+
+""" The implementation of tizen IVI communication"""
+
+import os
+import time
+import socket
+import threading
+import configparser
+import re
+import sys
+from shutil import copyfile
+from testkitlite.util.log import LOGGER
+from testkitlite.util.autoexec import shell_command, shell_command_ext
+from testkitlite.util.killall import killall
+from testkitlite.util.errors import InvalidDeviceException
+
+try:
+    import paramiko
+except ImportError as err:
+    LOGGER.info("Failed to import 'paramiko' module, please check your installation:")
+    LOGGER.info("  You can use 'sudo pip install paramiko' to install the module!")
+    sys.exit(1)
+
+TCT_CONFIG_FILE = "/opt/tools/TCT_CONFIG"
+tct_parser = configparser.ConfigParser()
+tct_parser.read(TCT_CONFIG_FILE)
+
+DEVICE_SUITE_TARGET_30 = tct_parser.get('DEVICE', 'DEVICE_SUITE_TARGET_30')
+
+
+HOST_NS = "127.0.0.1"
+os.environ['no_proxy'] = HOST_NS
+os.environ['TEST_PLATFORM'] = 'tizen'
+os.environ['CONNECT_TYPE'] = 'ssh'
+TIZEN_USER = os.environ.get('TIZEN_USER', 'owner')
+#print 'debug', os.environ.get('TIZEN_USER','')
+
+# common constants
+RPM_INSTALL = "ssh %s rpm -ivh %s"
+RPM_UNINSTALL = "ssh %s rpm -e %s"
+RPM_LIST = "ssh %s rpm -qa | grep tct"
+APP_QUERY_STR = "ssh %s \"ps aux |grep '%s'|grep -v grep\"|awk '{print $2}'"
+APP_KILL_STR = "ssh %s kill -9 %s"
+APP_NONBLOCK_STR = "ssh %s \"%s &\""
+SSH_COMMAND_RTN = "ssh %s \"%s\"; echo returncode=$?"
+#SSH_COMMAND_APP = "ssh %s \"su - app -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/5000/dbus/user_bus_socket; %s'\";echo returncode=$?"
+SSH_COMMAND_APP = "ssh %s \"su - %s -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%s/dbus/user_bus_socket; %s'\";echo returncode=$?"
+
+# wrt-launcher constants
+WRT_MAIN = "wrt-launcher"
+WRT_QUERY_STR = "ssh %s \"wrt-launcher -l|grep '%s'|grep -v grep\"|awk '{print $2\":\"$NF}'"
+WRT_START_STR = "ssh %s 'wrt-launcher -s %s; echo returncode=$?'"
+WRT_STOP_STR = "ssh %s wrt-launcher -k %s"
+WRT_INSTALL_STR = "ssh %s wrt-installer -i %s"
+WRT_UNINSTL_STR = "ssh %s wrt-installer -un %s"
+WRT_LOCATION = os.path.join(DEVICE_SUITE_TARGET_30, "tct/opt/%s/%s.wgt")
+
+# crosswalk constants
+#XWALK_MAIN = "xwalkctl"
+#XWALK_MAIN = "open_app"
+XWALK_MAIN = os.environ.get("Launcher","app_launcher -s")
+if XWALK_MAIN =='app_launcher':
+    XWALK_MAIN = 'app_launcher -s '
+#XWALK_QUERY_STR = "ssh %s \"su - app -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/5000/dbus/user_bus_socket;xwalkctl' \"| grep -w %s | awk '{print $(NF-1)}'"
+XWALK_QUERY_STR = "ssh %s \"su - %s -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%s/dbus/user_bus_socket;app_launcher -l' \"| grep -w %s | awk '{print $2}'"
+#XWALK_START_STR = "ssh %s \"su - app -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/5000/dbus/user_bus_socket;launch_app %s' & \""
+XWALK_START_STR = "ssh %s \"su - %s -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%s/dbus/user_bus_socket;%s %s' & \""
+#XWALK_INSTALL_STR = "ssh %s \"su - app -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/5000/dbus/user_bus_socket;xwalkctl --install %s' \""
+XWALK_INSTALL_STR = "ssh %s \"su - %s -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%s/dbus/user_bus_socket;pkgcmd -i -t %s -p  %s -q' \""
+#XWALK_UNINSTL_STR = "ssh %s \"su - app -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/5000/dbus/user_bus_socket;xwalkctl --uninstall %s' \""
+XWALK_UNINSTL_STR = "ssh %s \"su - %s -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%s/dbus/user_bus_socket;pkgcmd -u -t wgt -q -n %s' \""
+XWALK_LOCATION = os.path.join(DEVICE_SUITE_TARGET_30, "tct/opt/%s/%s.wgt")
+
+XWALK_QUERY_ID = "ssh %s 'id -u %s'"
+
+class SSH_Handler:
+    """
+    long connection with login
+    """
+
+    def __init__(self, host='127.0.0.1', username='root', password='tizen', port=22):
+        self._ssh = paramiko.SSHClient()
+        self._ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
+        self._ssh.connect(host, port, username, password)
+
+    def ssh_command(self, cmd='whoami'):
+        stdin, stdout, stderr = self._ssh.exec_command(cmd)
+        return stdout.readlines()
+
+    def close(self):
+        if self._ssh is not None:
+            self._ssh.close()
+
+
+class tizenIVI:
+
+    """ Implementation for transfer data
+        between Host and IVI/PC on SSH connection
+    """
+
+    def __init__(self, deviceid="root@127.0.0.1"):
+        self.deviceid = deviceid
+        remotes = deviceid.split('@')
+        self._ssh = SSH_Handler(remotes[1], remotes[0])
+        self._wrt = False
+        self._xwalk = False
+        self.support_remote = True
+        self._get_user_id()
+
+    def _get_user_id(self):
+        if TIZEN_USER.lower() == 'owner':
+            self.port = '5000'
+        else:
+            cmdline = XWALK_QUERY_ID % (self.deviceid, TIZEN_USER)
+            exit_code, ret = shell_command(cmdline)
+            if exit_code == -1:
+                LOGGER.info("[ can not get user id ]")
+            if len(ret) > 0 :
+                self.port = ret[0].strip('\r\n')
+
+
+    def is_support_remote(self):
+        return self.support_remote
+
+    def shell_cmd(self, cmd="", timeout=15):
+        cmd = "ssh %s %s" % (self.deviceid, cmd)
+        return shell_command(cmd, timeout)
+
+    def check_process(self, process_name):
+        exit_code, ret = shell_command(APP_QUERY_STR % (self.deviceid, process_name))
+        return len(ret)
+
+    def kill_stub(self):
+        #add this function to avoid webdriver issue if stub runnning on device, yangx.zhou@intel.com
+        cmdline = "ps -aux | grep testkit-stub | grep -v grep | awk '{ print $2 }'"
+        ret_lines = self._ssh.ssh_command(cmdline)
+        if len(ret_lines) > 0:
+            cmdline = "kill -9 %s" %ret_lines[0]
+            ret_lines = self._ssh.ssh_command(cmdline)
+
+    def launch_stub(self, stub_app, stub_port="8000", debug_opt=""):
+        #self.kill_stub() 
+        cmdline = "%s --port:%s %s" % (stub_app, stub_port, debug_opt)
+        ret_lines = self._ssh.ssh_command(cmdline)
+        time.sleep(2)
+
+    def shell_cmd_ext(self,
+                      cmd="",
+                      timeout=None,
+                      boutput=False,
+                      stdout_file=None,
+                      stderr_file=None):
+        #if cmd.startswith('app_user@'):
+        usr = TIZEN_USER + '_user@'
+        if cmd.startswith(usr):
+            cmdline = SSH_COMMAND_APP % (self.deviceid, TIZEN_USER, self.port,  cmd[9:])
+        else:
+            cmdline = SSH_COMMAND_RTN % (self.deviceid, cmd)
+        return shell_command_ext(cmdline, timeout, boutput, stdout_file, stderr_file)
+
+    def shell_cmd_host(self,
+                       cmd="",
+                       timeout=None,
+                       boutput=False,
+                       stdout_file=None,
+                       stderr_file=None):
+        cmd = cmd.replace("$deviceid", self.deviceid)
+        return shell_command_ext(cmd, timeout, boutput, stdout_file, stderr_file)
+
+    def get_device_ids(self):
+        """
+            get device list of ids
+        """
+        return ['localhost']
+
+    def get_device_info(self):
+        """
+            get tizenivi device inforamtion
+        """
+        device_info = {}
+        resolution_str = ""
+        screen_size_str = ""
+        device_model_str = ""
+        device_name_str = ""
+        build_id_str = ""
+        os_version_str = ""
+
+        # get resolution and screen size
+        exit_code, ret = shell_command("ssh %s xrandr" % self.deviceid)
+        pattern = re.compile("connected (\d+)x(\d+).* (\d+mm) x (\d+mm)")
+        for line in ret:
+            match = pattern.search(line)
+            if match:
+                resolution_str = "%s x %s" % (match.group(1), match.group(2))
+                screen_size_str = "%s x %s" % (match.group(3), match.group(4))
+
+        # get architecture
+        exit_code, ret = shell_command("ssh %s uname -m" % self.deviceid)
+        if len(ret) > 0:
+            device_model_str = ret[0]
+
+        # get hostname
+        exit_code, ret = shell_command("ssh %s uname -n" % self.deviceid)
+        if len(ret) > 0:
+            device_name_str = ret[0]
+
+        # get os version
+        exit_code, ret = shell_command("ssh %s cat /etc/issue" % self.deviceid)
+        for line in ret:
+            if len(line) > 1:
+                os_version_str = "%s %s" % (os_version_str, line)
+
+        # get build id
+        exit_code, ret = shell_command("ssh %s cat /etc/tizen-release" % self.deviceid)
+        for line in ret:
+            if line.find("BUILD_ID=") != -1:
+                build_id_str = line.split('=')[1].strip('\"\r\n')
+
+        os_version_str = os_version_str[0:-1]
+        device_info["device_id"] = self.deviceid
+        device_info["resolution"] = resolution_str
+        device_info["screen_size"] = screen_size_str
+        device_info["device_model"] = device_model_str
+        device_info["device_name"] = device_name_str
+        device_info["os_version"] = os_version_str
+        device_info["build_id"] = build_id_str
+        return device_info
+
+    def get_server_url(self, remote_port="8000"):
+        """get server url"""
+        remote_ip = self.deviceid
+        remote_ip = remote_ip.split('@')[1]
+        os.environ['no_proxy'] = remote_ip
+        url_forward = "http://%s:%s" % (remote_ip, remote_port)
+        return url_forward
+
+    def install_package(self, pkgpath):
+        """
+           install a package on tizenivi device
+        """
+        cmd = RPM_INSTALL % (self.deviceid, pkgpath)
+        exit_code, ret = shell_command(cmd)
+        return ret
+
+    def install_package(self, pkgname):
+        """
+           install a package on tizenivi device
+        """
+        cmd = RPM_UNINSTALL % (self.deviceid, pkgname)
+        exit_code, ret = shell_command(cmd)
+        return ret
+
+    def get_installed_package(self):
+        """get list of installed package from device"""
+        cmd = RPM_LIST % (self.deviceid)
+        exit_code, ret = shell_command(cmd)
+        return ret
+
+    def download_file(self, remote_path, local_path):
+        """download file"""
+        local_path_dir = os.path.dirname(local_path)
+        if not os.path.exists(local_path_dir):
+            os.makedirs(local_path_dir)
+        cmd = "scp %s:%s %s" % (self.deviceid, remote_path, local_path)
+        exit_code, ret = shell_command(cmd)
+        if not os.path.exists(local_path):
+            return False
+        return True
+
+    def upload_file(self, remote_path, local_path):
+        """upload file"""
+        cmd = "scp %s %s:%s" % (local_path, self.deviceid, remote_path)
+        exit_code, ret = shell_command(cmd)
+        return True
+
+    def _get_wrt_app(self, test_suite, test_set, fuzzy_match, auto_iu):
+        test_app_id = None
+        if auto_iu:
+            test_wgt = test_set
+            test_wgt_path = WRT_LOCATION % (test_suite, test_wgt)
+            if not self.install_app(test_wgt_path):
+                LOGGER.info("[ failed to install widget \"%s\" in target ]"
+                            % test_wgt)
+                return None
+        else:
+            test_wgt = test_suite
+
+        # check if widget installed already
+        cmd = WRT_QUERY_STR % (test_wgt)
+        exit_code, ret = shell_command(cmd)
+        if exit_code == -1:
+            return None
+        for line in ret:
+            items = line.split(':')
+            if len(items) < 1:
+                continue
+            if (fuzzy_match and items[0].find(test_wgt) != -1) or items[0] == test_wgt:
+                test_app_id = items[1].strip('\r\n')
+                break
+
+        if test_app_id is None:
+            LOGGER.info("[ test widget \"%s\" not found in target ]"
+                        % test_wgt)
+            return None
+
+        return test_app_id
+
+    def _get_xwalk_app(self, test_suite, test_set, fuzzy_match, auto_iu):
+        test_app_id = None
+        if auto_iu:
+            test_wgt = test_set
+            test_wgt_path = XWALK_LOCATION % (test_suite, test_wgt)
+            if not self.install_app(test_wgt_path):
+                LOGGER.info("[ failed to install widget \"%s\" in target ]"
+                            % test_wgt)
+                return None
+        else:
+            test_wgt = test_suite
+
+        # check if widget installed already
+        cmd = XWALK_QUERY_STR % (self.deviceid,TIZEN_USER, self.port,  test_wgt)
+        exit_code, ret = shell_command(cmd)
+        if exit_code == -1:
+            return None
+        for line in ret:
+            test_app_id = line.strip('\r\n')
+
+        if test_app_id is None:
+            LOGGER.info("[ test widget \"%s\" not found in target ]"
+                        % test_wgt)
+            return None
+
+        return test_app_id
+
+    def get_launcher_opt(self, test_launcher, test_ext, test_widget, test_suite, test_set):
+        """
+        get test option dict
+        """
+        test_opt = {}
+        self._wrt = False
+        self._xwalk = False
+        app_id = None
+        test_opt["suite_name"] = test_suite
+        test_opt["launcher"] = test_launcher
+        if test_widget is not None and test_widget != "":
+            test_suite = test_widget
+        if test_launcher.find('WRTLauncher') >= 0:
+            self._wrt = True
+            test_opt["launcher"] = WRT_MAIN
+            client_cmds = test_launcher.strip().split()
+            wrt_tag = client_cmds[1] if len(client_cmds) > 1 else ""
+            test_opt['fuzzy_match'] = fuzzy_match = wrt_tag.find('z') != -1
+            test_opt['auto_iu'] = auto_iu = wrt_tag.find('iu') != -1
+            test_opt['self_exec'] = wrt_tag.find('a') != -1
+            test_opt['self_repeat'] = wrt_tag.find('r') != -1
+            app_id = self._get_wrt_app(test_suite, test_set, fuzzy_match, auto_iu)
+        elif test_launcher.find('xwalk') >= 0 and len(test_launcher) <= 16:
+            self._xwalk = True
+            test_opt["launcher"] = XWALK_MAIN
+            client_cmds = test_launcher.strip().split()
+            xpk_tag = client_cmds[1] if len(client_cmds) > 1 else ""
+            test_opt['fuzzy_match'] = fuzzy_match = xpk_tag.find('z') != -1
+            test_opt['auto_iu'] = auto_iu = xpk_tag.find('iu') != -1
+            test_opt['self_exec'] = xpk_tag.find('a') != -1
+            test_opt['self_repeat'] = xpk_tag.find('r') != -1
+            app_id = self._get_xwalk_app(test_suite, test_set, fuzzy_match, auto_iu)
+        else:
+            app_id = test_launcher
+
+        if app_id is None:
+            return None
+        test_opt["test_app_id"] = app_id
+        return test_opt
+
+    def start_debug(self, dlogfile):
+        global debug_flag, metux
+        debug_flag = True
+
+    def stop_debug(self):
+        global debug_flag
+        debug_flag = False
+
+    def launch_app(self, wgt_name):
+        blauched = False
+        if self._wrt:
+            timecnt = 0
+            cmdline = WRT_STOP_STR % (self.deviceid, wgt_name)
+            exit_code, ret = shell_command(cmdline)
+            cmdline = WRT_START_STR % (self.deviceid, wgt_name)
+            while timecnt < 3:
+                exit_code, ret_out, ret_err = shell_command_ext(cmdline, 30)
+                if exit_code == "0":
+                    blauched = True
+                    break
+                timecnt += 1
+                time.sleep(3)
+        elif self._xwalk:
+            cmd = APP_QUERY_STR % (self.deviceid, wgt_name)
+            exit_code, ret = shell_command(cmd)
+            for line in ret:
+                cmd = APP_KILL_STR % (self.deviceid, line.strip('\r\n'))
+                exit_code, ret = shell_command(cmd)
+            cmdline = XWALK_START_STR % (self.deviceid,TIZEN_USER, self.port, XWALK_MAIN,  wgt_name)
+            exit_code, ret = shell_command(cmdline)
+            time.sleep(3)
+            blauched = True
+        else:
+            cmdline = APP_NONBLOCK_STR % (self.deviceid, wgt_name)
+            exit_code, ret = shell_command(cmdline)
+            time.sleep(3)
+            cmd = APP_QUERY_STR % (self.deviceid, wgt_name)
+            exit_code, ret = shell_command(cmd)
+            if ret and len(ret):
+                blauched = True
+
+        return blauched
+
+    def kill_app(self, wgt_name):
+        if self._wrt:
+            cmdline = WRT_STOP_STR % (self.deviceid, wgt_name)
+            exit_code, ret = shell_command(cmdline)
+        elif self._xwalk:
+            cmd = APP_QUERY_STR % (self.deviceid, wgt_name)
+            exit_code, ret = shell_command(cmd)
+            for line in ret:
+                cmd = APP_KILL_STR % (line.strip('\r\n'))
+                exit_code, ret = shell_command(cmd)
+        return True
+
+    def install_app(self, wgt_path="", timeout=90):
+        if self._wrt:
+            cmd = WRT_INSTALL_STR % (self.deviceid, wgt_path)
+        elif self._xwalk:
+            if len(wgt_path)>0:
+                ext = wgt_path.split('.')[1]
+            cmd = XWALK_INSTALL_STR % (self.deviceid,TIZEN_USER, self.port,ext,  wgt_path)
+        else:
+            return True
+        exit_code, ret = shell_command(cmd, timeout)
+        if exit_code == -1:
+            cmd = APP_QUERY_STR % (self.deviceid, wgt_path)
+            exit_code, ret = shell_command(cmd)
+            for line in ret:
+                cmd = APP_KILL_STR % (self.deviceid, line.strip('\r\n'))
+                exit_code, ret = shell_command(cmd)
+            return False
+        else:
+            return True
+
+    def uninstall_app(self, wgt_name):
+        if self._wrt:
+            cmd = WRT_UNINSTL_STR % (self.deviceid, wgt_name)
+        elif self._xwalk:
+            cmd = XWALK_UNINSTL_STR % (self.deviceid, TIZEN_USER, self.port, wgt_name)
+        else:
+            return True
+        exit_code, ret = shell_command(cmd)
+        return True
+
+    def get_buildinfo(self):
+        """ get builf info"""
+        build_info = {}
+        build_info['buildid'] = ''
+        build_info['manufacturer'] = ''
+        build_info['model'] = ''
+        return build_info
+
+
+def get_target_conn(deviceid=None):
+    """ Get connection for Test Target"""
+    if deviceid is None or '@' not in deviceid:
+        raise InvalidDeviceException('deviceid("username@ip") required by SSH connection!')
+    return tizenIVI(deviceid)
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/commodule/tizenlocal.py b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/commodule/tizenlocal.py
new file mode 100644 (file)
index 0000000..d0356c2
--- /dev/null
@@ -0,0 +1,434 @@
+#!/usr/bin/python
+#
+# Copyright (C) 2012 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# Authors:
+#           Chengtao,Liu  <chengtaox.liu@intel.com>
+
+""" The implementation of tizen localhost communication"""
+
+import os
+import time
+import socket
+import threading
+import re
+from shutil import copyfile
+
+from testkitlite.util.log import LOGGER
+from testkitlite.util.autoexec import shell_command, shell_command_ext
+from testkitlite.util.killall import killall
+
+HOST_NS = "127.0.0.1"
+os.environ['no_proxy'] = HOST_NS
+os.environ['TEST_PLATFORM'] = 'tizen'
+os.environ['CONNECT_TYPE'] = 'local'
+RPM_INSTALL = "rpm -ivh %s"
+RPM_UNINSTALL = "rpm -e %s"
+RPM_LIST = "rpm -qa | grep tct | grep -v grep"
+APP_QUERY_STR = "ps aux |grep '%s'|grep -v grep|awk '{print $2}'"
+APP_KILL_STR = "kill -9 %s"
+APP_NONBLOCK_STR = "%s &"
+
+# wrt-launcher constants
+WRT_MAIN = "wrt-launcher"
+WRT_QUERY_STR = "wrt-launcher -l | grep '%s'|awk '{print $2\":\"$NF}'"
+WRT_START_STR = "wrt-launcher -s %s"
+WRT_STOP_STR = "wrt-launcher -k %s"
+WRT_INSTALL_STR = "wrt-installer -i %s"
+WRT_UNINSTL_STR = "wrt-installer -un %s"
+WRT_LOCATION = "/opt/usr/media/tct/opt/%s/%s.wgt"
+
+# crosswalk constants
+#XWALK_MAIN = "xwalkctl"
+XWALK_MAIN = os.environ.get("Launcher","app_launcher -s")
+if XWALK_MAIN == 'app_launcher':
+    XWALK_MAIN = "app_launcher -s "
+#XWALK_MAIN = "open_app"
+#XWALK_QUERY_STR = "ail_list | grep -w %s | awk '{print $(NF-1)}'"
+XWALK_QUERY_STR = "app_launcher -l | grep -w %s | awk '{print $2}'"
+#XWALK_START_STR = "xwalk-launcher %s &"
+XWALK_START_STR = "%s %s &"
+#XWALK_INSTALL_STR = "xwalkctl --install %s"
+XWALK_INSTALL_STR = "pkgcmd --install -t %s -p %s -q"
+XWALK_UNINSTL_STR = "pkgcmd -u -t wgt -q  -n %s"
+#XWALK_UNINSTL_STR = "xwalkctl --uninstall %s"
+XWALK_LOCATION = "/opt/usr/media/tct/opt/%s/%s.wgt"
+DLOG_CLEAR = "dlogutil -c"
+DLOG_WRT = "dlogutil WRT:D -v threadtime"
+TIZEN_USER = os.environ.get('TIZEN_USER','app')
+
+def debug_trace(cmdline, logfile):
+    global debug_flag, metux
+    wbuffile = open(logfile, "w")
+    import subprocess
+    exit_code = None
+    proc = subprocess.Popen(args=cmdline,
+                            shell=True,
+                            stdout=wbuffile,
+                            stderr=None)
+    while True:
+        exit_code = proc.poll()
+        if exit_code is not None:
+            break
+        time.sleep(0.5)
+        metux.acquire()
+        proc_flag = debug_flag
+        metux.release()
+        if not proc_flag:
+            break
+    wbuffile.close()
+    if exit_code is None:
+        killall(proc.pid)
+
+
+class tizenHost:
+
+    """ Implementation for transfer data on TIZEN localhost
+    """
+
+    def __init__(self):
+        self.deviceid = "localhost"
+        self._wrt = False
+        self._xwalk = False
+        self.support_remote = False
+
+    def is_support_remote(self):
+        return self.support_remote
+
+    def shell_cmd(self, cmd="", timeout=15):
+        return shell_command(cmd, timeout)
+
+    def check_process(self, process_name):
+        exit_code, ret = shell_command(APP_QUERY_STR % process_name)
+        return len(ret)
+    
+    def kill_stub(self):
+        #add this function to avoid webdriver issue if stub exists, yangx.zhou@intel.com
+        cmdline = "ps -aux | grep testkit-stub | grep -v grep | awk '{ print $2}'"
+        exit_code, ret = self.shell_cmd(cmdline)
+        if exit_code == 0 and len(ret) > 0:
+            cmdline = "kill -9 %s" %ret[0]
+            exit_code, ret = self.shell_cmd(cmdline)
+        time.sleep(1)
+
+    def launch_stub(self, stub_app, stub_port="8000", debug_opt=""):
+        self.kill_stub()
+        cmdline = "%s --port:%s %s" % (stub_app, stub_port, debug_opt)
+        exit_code, ret = self.shell_cmd(cmdline)
+        time.sleep(2)
+
+    def shell_cmd_ext(self,
+                      cmd="",
+                      timeout=None,
+                      boutput=False,
+                      stdout_file=None,
+                      stderr_file=None):
+        usr = TIZEN_USER + '_user@'
+        if cmd.startswith(usr):
+            cmd = cmd[9:]
+        return shell_command_ext(cmd, timeout, boutput, stdout_file, stderr_file)
+
+    def get_device_ids(self):
+        """
+            get device list of ids
+        """
+        return ['localhost']
+
+    def get_device_info(self):
+        """
+            get tizenpc device inforamtion
+        """
+        device_info = {}
+        resolution_str = ""
+        screen_size_str = ""
+        device_model_str = ""
+        device_name_str = ""
+        build_id_str = ""
+        os_version_str = ""
+
+        # get resolution and screen size
+        exit_code, ret = shell_command("xrandr")
+        pattern = re.compile("connected (\d+)x(\d+).* (\d+mm) x (\d+mm)")
+        for line in ret:
+            match = pattern.search(line)
+            if match:
+                resolution_str = "%s x %s" % (match.group(1), match.group(2))
+                screen_size_str = "%s x %s" % (match.group(3), match.group(4))
+
+        # get architecture
+        exit_code, ret = shell_command("uname -m")
+        if len(ret) > 0:
+            device_model_str = ret[0]
+
+        # get hostname
+        exit_code, ret = shell_command("uname -n")
+        if len(ret) > 0:
+            device_name_str = ret[0]
+
+        # get os version
+        exit_code, ret = shell_command("cat /etc/issue")
+        for line in ret:
+            if len(line) > 1:
+                os_version_str = "%s %s" % (os_version_str, line)
+
+        # get build id
+        exit_code, ret = shell_command("cat /etc/tizen-release")
+        for line in ret:
+            if line.find("BUILD_ID=") != -1:
+                build_id_str = line.split('=')[1].strip('\"\r\n')
+
+        os_version_str = os_version_str[0:-1]
+        device_info["device_id"] = self.deviceid
+        device_info["resolution"] = resolution_str
+        device_info["screen_size"] = screen_size_str
+        device_info["device_model"] = device_model_str
+        device_info["device_name"] = device_name_str
+        device_info["os_version"] = os_version_str
+        device_info["build_id"] = build_id_str
+        return device_info
+
+    def get_server_url(self, remote_port="8000"):
+        """get server url"""
+        url_forward = "http://%s:%s" % (HOST_NS, remote_port)
+        return url_forward
+
+    def install_package(self, pkgpath):
+        """
+           install a package on tizenpc device
+        """
+        cmd = RPM_INSTALL % pkgpath
+        exit_code, ret = shell_command(cmd)
+        return ret
+
+    def install_package(self, pkgname):
+        """
+           install a package on tizenpc device
+        """
+        cmd = RPM_UNINSTALL % pkgname
+        exit_code, ret = shell_command(cmd)
+        return ret
+
+    def get_installed_package(self):
+        """get list of installed package from device"""
+        cmd = RPM_LIST
+        exit_code, ret = shell_command(cmd)
+        return ret
+
+    def download_file(self, remote_path, local_path):
+        """download file"""
+        copyfile(remote_path, local_path)
+        return True
+
+    def upload_file(self, remote_path, local_path):
+        """upload file"""
+        copyfile(local_path, remote_path)
+        return True
+
+    def _get_wrt_app(self, test_suite, test_set, fuzzy_match, auto_iu):
+        test_app_id = None
+        if auto_iu:
+            test_wgt = test_set
+            test_wgt_path = WRT_LOCATION % (test_suite, test_wgt)
+            if not self.install_app(test_wgt_path):
+                LOGGER.info("[ failed to install widget \"%s\" in target ]"
+                            % test_wgt)
+                return None
+        else:
+            test_wgt = test_suite
+
+        # check if widget installed already
+        cmd = WRT_QUERY_STR % (test_wgt)
+        exit_code, ret = shell_command(cmd)
+        if exit_code == -1:
+            return None
+        for line in ret:
+            items = line.split(':')
+            if len(items) < 1:
+                continue
+            if (fuzzy_match and items[0].find(test_wgt) != -1) or items[0] == test_wgt:
+                test_app_id = items[1].strip('\r\n')
+                break
+
+        if test_app_id is None:
+            LOGGER.info("[ test widget \"%s\" not found in target ]"
+                        % test_wgt)
+            return None
+
+        return test_app_id
+
+    def _get_xwalk_app(self, test_suite, test_set, fuzzy_match, auto_iu):
+        test_app_id = None
+        if auto_iu:
+            test_wgt = test_set
+            test_wgt_path = XWALK_LOCATION % (test_suite, test_wgt)
+            if not self.install_app(test_wgt_path):
+                LOGGER.info("[ failed to install widget \"%s\" in target ]"
+                            % test_wgt)
+                return None
+        else:
+            test_wgt = test_suite
+
+        # check if widget installed already
+        cmd = XWALK_QUERY_STR % (test_wgt)
+        exit_code, ret = shell_command(cmd)
+        if exit_code == -1:
+            return None
+        for line in ret:
+            test_app_id = line.strip('\r\n')
+
+        if test_app_id is None:
+            LOGGER.info("[ test widget \"%s\" not found in target ]"
+                        % test_wgt)
+            return None
+
+        return test_app_id
+
+    def get_launcher_opt(self, test_launcher, test_ext, test_widget, test_suite, test_set):
+        """
+        get test option dict
+        """
+        test_opt = {}
+        self._wrt = False
+        self._xwalk = False
+        app_id = None
+        test_opt["suite_name"] = test_suite
+        test_opt["launcher"] = test_launcher
+        if test_widget is not None and test_widget != "":
+            test_suite = test_widget
+        if test_launcher.find('WRTLauncher') >= 0:
+            self._wrt = True
+            test_opt["launcher"] = WRT_MAIN
+            client_cmds = test_launcher.strip().split()
+            wrt_tag = client_cmds[1] if len(client_cmds) > 1 else ""
+            test_opt['fuzzy_match'] = fuzzy_match = wrt_tag.find('z') != -1
+            test_opt['auto_iu'] = auto_iu = wrt_tag.find('iu') != -1
+            test_opt['self_exec'] = wrt_tag.find('a') != -1
+            test_opt['self_repeat'] = wrt_tag.find('r') != -1
+            app_id = self._get_wrt_app(test_suite, test_set, fuzzy_match, auto_iu)
+        elif test_launcher.find('xwalk') >= 0 and len(test_launcher) <= 16:
+            self._xwalk = True
+            test_opt["launcher"] = XWALK_MAIN
+            client_cmds = test_launcher.strip().split()
+            xpk_tag = client_cmds[1] if len(client_cmds) > 1 else ""
+            test_opt['fuzzy_match'] = fuzzy_match = xpk_tag.find('z') != -1
+            test_opt['auto_iu'] = auto_iu = xpk_tag.find('iu') != -1
+            test_opt['self_exec'] = xpk_tag.find('a') != -1
+            test_opt['self_repeat'] = xpk_tag.find('r') != -1
+            app_id = self._get_xwalk_app(test_suite, test_set, fuzzy_match, auto_iu)
+        else:
+            app_id = test_launcher
+
+        if app_id is None:
+            return None
+        test_opt["test_app_id"] = app_id
+        return test_opt
+
+    def start_debug(self, dlogfile):
+        global debug_flag, metux
+        debug_flag = True
+        metux = threading.Lock()
+
+    def stop_debug(self):
+        global debug_flag, metux
+        metux.acquire()
+        debug_flag = False
+        metux.release()
+
+    def launch_app(self, wgt_name):
+        blauched = False
+        if self._wrt:
+            timecnt = 0
+            cmdline = WRT_STOP_STR % (wgt_name)
+            exit_code, ret = shell_command(cmdline)
+            cmdline = WRT_START_STR % (wgt_name)
+            while timecnt < 3:
+                exit_code, ret_out, ret_err = shell_command_ext(cmdline, 30)
+                if exit_code == "0":
+                    blauched = True
+                    break
+                timecnt += 1
+                time.sleep(3)
+        elif self._xwalk:
+            cmd = APP_QUERY_STR % (wgt_name)
+            exit_code, ret = shell_command(cmd)
+            for line in ret:
+                cmd = APP_KILL_STR % (line.strip('\r\n'))
+                exit_code, ret = shell_command(cmd)
+            cmdline = XWALK_START_STR % (XWALK_MAIN, wgt_name)
+            exit_code, ret = shell_command(cmdline)
+            time.sleep(3)
+            blauched = True
+        else:
+            cmdline = APP_NONBLOCK_STR % (wgt_name)
+            exit_code, ret = shell_command(cmdline)
+            time.sleep(3)
+            cmd = APP_QUERY_STR % (wgt_name)
+            exit_code, ret = shell_command(cmd)
+            if ret and len(ret):
+                blauched = True
+
+        return blauched
+
+    def kill_app(self, wgt_name):
+        if self._wrt:
+            cmdline = WRT_STOP_STR % (wgt_name)
+            exit_code, ret = shell_command(cmdline)
+        elif self._xwalk:
+            cmd = APP_QUERY_STR % (wgt_name)
+            exit_code, ret = shell_command(cmd)
+            for line in ret:
+                cmd = APP_KILL_STR % (line.strip('\r\n'))
+                exit_code, ret = shell_command(cmd)
+        return True
+
+    def install_app(self, wgt_path="", timeout=90):
+        if self._wrt:
+            cmd = WRT_INSTALL_STR % (wgt_path)
+        elif self._xwalk:
+            ext = wgt_path.split(".")[1]
+            cmd = XWALK_INSTALL_STR % (ext, wgt_path)
+        else:
+            return True
+        exit_code, ret = shell_command(cmd, timeout)
+        if exit_code == -1:
+            cmd = APP_QUERY_STR % (wgt_path)
+            exit_code, ret = shell_command(cmd)
+            for line in ret:
+                cmd = APP_KILL_STR % (line.strip('\r\n'))
+                exit_code, ret = shell_command(cmd)
+            return False
+        else:
+            return True
+
+    def uninstall_app(self, wgt_name):
+        if self._wrt:
+            cmd = WRT_UNINSTL_STR % (wgt_name)
+        elif self._xwalk:
+            cmd = XWALK_UNINSTL_STR % (wgt_name)
+        else:
+            return True
+        exit_code, ret = shell_command(cmd)
+        return True
+
+    def get_buildinfo(self):
+        """ get builf info"""
+        build_info = {}
+        build_info['buildid'] = ''
+        build_info['manufacturer'] = ''
+        build_info['model'] = ''
+        return build_info
+
+
+def get_target_conn():
+    """ Get connection for Test Target"""
+    return tizenHost()
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/commodule/tizenmobile.py b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/commodule/tizenmobile.py
new file mode 100644 (file)
index 0000000..8ec0122
--- /dev/null
@@ -0,0 +1,638 @@
+#!/usr/bin/python
+#
+# Copyright (C) 2012 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# Authors:
+#           Chengtao,Liu  <chengtaox.liu@intel.com>
+
+""" The implementation of TIZEN mobile communication"""
+
+import os
+import time
+import socket
+import threading
+import re
+import shutil
+import configparser
+import xml.etree.ElementTree as etree
+import platform
+
+from testkitlite.util.log import LOGGER
+from testkitlite.util.autoexec import shell_command, shell_command_ext
+from testkitlite.util.killall import killall
+from testkitlite.util.errors import InvalidDeviceException
+
+EXISTS = os.path.exists
+
+
+TCT_CONFIG_FILE = "/opt/tools/TCT_CONFIG"
+tct_parser = configparser.ConfigParser()
+tct_parser.read(TCT_CONFIG_FILE)
+
+DEVICE_SUITE_TARGET_30 = tct_parser.get('DEVICE', 'DEVICE_SUITE_TARGET_30')
+DEVICE_USER_30 = tct_parser.get('DEVICE', 'DEVICE_EXECUTION_MODE_30')
+
+os.environ['TEST_PLATFORM'] = 'tizen'
+os.environ['CONNECT_TYPE'] = 'sdb'
+LOCAL_HOST_NS = "127.0.0.1"
+BUILD_INFO_FILE = os.path.join(DEVICE_SUITE_TARGET_30,'Documents/tct/buildinfo.xml')
+RPM_INSTALL = "sdb -s %s shell rpm -ivh %s"
+RPM_UNINSTALL = "sdb -s %s shell rpm -e %s"
+RPM_LIST = "sdb -s %s shell \"rpm -qa|grep tct\""
+
+APP_QUERY_STR = "sdb -s %s shell \"ps aux|grep '%s'|grep -v grep\"|awk '{print $2}'"
+STUB_KILL_STR = "sdb -s %s shell \"ps aux|grep '%s'|grep -v grep\"|awk '{print $2}'|xargs kill -9"
+APP_KILL_STR = "sdb -s %s shell kill -9 %s"
+APP_NONBLOCK_STR = "sdb -s %s shell '%s' &"
+SDB_COMMAND = "sdb -s %s shell '%s'"
+SDB_COMMAND_RTN = "sdb -s %s shell '%s; echo returncode=$?'"
+#SDB_COMMAND_APP = "sdb -s %s shell su - app -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/5000/dbus/user_bus_socket;%s;echo returncode=$?'"
+#SDB_COMMAND_APP = "sdb -s %s shell su - %s -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%s/dbus/user_bus_socket;%s;echo returncode=$?'"
+SDB_COMMAND_APP = """sdb -s %s shell 'su - %s -c "export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%s/dbus/user_bus_socket;%s";echo returncode=$?'"""
+
+# wrt-launcher constants
+
+WRT_MAIN = "wrt-launcher"
+WRT_QUERY_STR = "sdb -s %s shell wrt-launcher -l | grep '%s'|awk '{print $2\":\"$NF}'"
+WRT_START_STR = "sdb -s %s shell 'wrt-launcher -s %s; echo returncode=$?'"
+WRT_STOP_STR = "sdb -s %s shell wrt-launcher -k %s"
+WRT_INSTALL_STR = "sdb -s %s shell wrt-installer -i %s"
+WRT_UNINSTL_STR = "sdb -s %s shell wrt-installer -un %s"
+WRT_LOCATION = os.path.join(DEVICE_SUITE_TARGET_30, "tct/opt/%s/%s.wgt")
+WRT_SMACK_STR = "sdb -s %s shell 'echo \"User::Shell User::Pkg::%s rwx\" | smackload'"
+WRT_SMACK_REV_STR = "sdb -s %s shell 'echo \"User::Pkg::%s User::Shell rwx\" | smackload'"
+#default user is changed "app" to "owner"
+#jh0219.han@samsung.com
+
+# crosswalk constants
+#XWALK_MAIN = "xwalkctl"
+#XWALK_MAIN = "open_app"
+XWALK_MAIN = os.environ.get("Launcher","app_launcher -s")
+if XWALK_MAIN == 'app_launcher':
+    XWALK_MAIN = 'app_launcher -s '
+#XWALK_QUERY_STR = "sdb -s %s shell su - app -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/5000/dbus/user_bus_socket;ail_list' | grep -w %s | awk '{print $(NF-1)}'"
+XWALK_QUERY_STR = "sdb -s %s shell su - %s -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%s/dbus/user_bus_socket;app_launcher -l' | grep -w %s | awk '{print $2}'"
+#XWALK_QUERY_STR = "sdb -s %s shell su - app -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/5000/dbus/user_bus_socket;xwalkctl' | grep -w %s | awk '{print $(NF-1)}'"
+#XWALK_START_STR = "sdb -s %s shell su - app -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/5000/dbus/user_bus_socket;launch_app %s' &"
+XWALK_START_STR = "sdb -s %s shell su - %s -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%s/dbus/user_bus_socket;%s %s' &"
+#XWALK_START_STR = "sdb -s %s shell su - %s -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%s/dbus/user_bus_socket;xwalk-launcher %s' &"
+XWALK_INSTALL_STR = "sdb -s %s shell su - %s -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%s/dbus/user_bus_socket;pkgcmd -i -t %s -p  %s -q'"
+#XWALK_INSTALL_STR = "sdb -s %s shell su - app -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/5000/dbus/user_bus_socket;xwalkctl --install %s'"
+XWALK_UNINSTL_STR = "sdb -s %s shell su - %s -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%s/dbus/user_bus_socket;pkgcmd -u -t wgt -q -n %s'"
+#XWALK_UNINSTL_STR = "sdb -s %s shell su - app -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/5000/dbus/user_bus_socket;xwalkctl --uninstall %s'"
+XWALK_LOCATION = os.path.join(DEVICE_SUITE_TARGET_30, "tct/opt/%s/%s.wgt")
+#default user is changed "app" to "owner"
+#jh0219.han@samsung.com
+
+# redefine constants for windows
+if platform.system() == "Windows":
+    APP_QUERY_STR = 'sdb -s %s shell "ps aux|grep %s|grep -v grep |awk \'{print $2}\'"'
+    SDB_COMMAND = 'sdb -s %s shell "%s"'
+    SDB_COMMAND_RTN = 'sdb -s %s shell "%s; echo returncode=$?"'
+    SDB_COMMAND_APP = 'sdb -s %s shell \"su - %s -c \"export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%s/dbus/user_bus_socket;%s\";echo returncode=$?\"'
+    WRT_START_STR = 'sdb -s %s shell "wrt-launcher -s %s; echo returncode=$?"'
+    XWALK_QUERY_STR = 'sdb -s %s shell su - %s -c "export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%s/dbus/user_bus_socket;app_launcher -l | grep -w %s | awk \'{print \$2}\'"'
+
+XWALK_QUERY_ID = "sdb -s %s shell  'id -u %s'"
+
+temp_tuser = DEVICE_USER_30.split('/')
+
+if not temp_tuser:
+    TIZEN_USER = 'owner'
+else:
+    TIZEN_USER = temp_tuser[0]
+
+LOGGER.debug('testkit-lite current user : %s' % str(TIZEN_USER))
+
+#TIZEN_USER = os.environ.get('TIZEN_USER','owner').strip()
+#default user is changed "app" to "owner"
+#jh0219.han@samsung.com
+
+#print os.environ['tizen_user']
+# dlog constants
+DLOG_CLEAR = "sdb -s %s shell dlogutil -c"
+DLOG_WRT = "sdb -s %s shell dlogutil -v threadtime"
+
+def debug_trace(cmdline, logfile):
+    global debug_flag, metux
+    wbuffile = open(logfile, "w")
+    LOGGER.info("our log file is " + str(logfile))
+    import subprocess
+    exit_code = None
+    proc = subprocess.Popen(args=cmdline,
+                            shell=True,
+                            stdout=wbuffile,
+                            stderr=None)
+    while True:
+        exit_code = proc.poll()
+        if exit_code is not None:
+            break
+        time.sleep(0.5)
+        metux.acquire()
+        proc_flag = debug_flag
+        metux.release()
+        if not proc_flag:
+            break
+    wbuffile.close()
+    if exit_code is None:
+        killall(proc.pid)
+
+
+def _get_device_ids():
+    """get tizen device list of ids"""
+    result = []
+    exit_code, ret = shell_command("sdb start-server")
+    exit_code, ret = shell_command("sdb devices")
+    for line in ret:
+        if str.find(line, "\tdevice") != -1:
+            result.append(line.split("\t")[0])
+    return result
+
+class TizenMobile:
+
+    """
+    Implementation for transfer data
+    between Host and Tizen Mobile Device
+    """
+
+    def __init__(self, device_id=None):
+        self.deviceid = device_id
+        self.is_NE = 0
+        if self.deviceid and str(self.deviceid).find('NE') > -1:
+            self.is_NE = int(self.deviceid.split(':')[1].split('_')[0])
+            self.deviceid = self.deviceid.split('_')[1]
+        self._wrt = False
+        self._xwalk = False
+        self.support_remote = True
+        self.get_user_id()
+
+#default user is changed "app" to "owner"
+#jh0219.han@samsung.com
+
+    def is_NE_mode(self):
+        return self.is_NE
+
+    def get_devid(self):
+        return self.deviceid
+
+    def get_user_id(self):
+        if TIZEN_USER == 'owner':
+            self.port = '5000'
+        else:
+            cmdline = XWALK_QUERY_ID % (self.deviceid, TIZEN_USER)
+            exit_code, ret = shell_command(cmdline)
+            if exit_code == -1:
+                LOGGER.info("[ can not get user id ]")
+            if len(ret) >0 :
+                self.port = ret[0]
+
+    def is_support_remote(self):
+        return self.support_remote
+
+    def shell_cmd(self, cmd="", timeout=15):
+        cmdline = SDB_COMMAND % (self.deviceid, cmd)
+        return shell_command(cmdline, timeout)
+
+    def check_process(self, process_name):
+        exit_code, ret = shell_command(
+            APP_QUERY_STR % (self.deviceid, process_name))
+        return len(ret)
+
+    def kill_stub(self):
+        #add this function to avoid webdriver issue if stub exists running on device,yangx.zhou@intel.com
+        cmdline = "ps -aux | grep testkit-stub | grep -v grep | awk '{ print $2 }'"
+        exit_code, ret = self.shell_cmd(cmdline)
+        if exit_code == 0 and len(ret) >0:
+            cmdline = "kill -9 %s" %ret[0]
+            exit_code, ret = self.shell_cmd(cmdline)
+
+    def launch_stub(self, stub_app, stub_port, debug_opt=""):
+        #block OTCIS-3781
+        #self.kill_stub()
+        cmdline = "/opt/home/developer/%s --port:%s %s; sleep 2s" % \
+                (stub_app, stub_port, debug_opt)
+
+        exit_code, ret = self.shell_cmd(cmdline)
+        time.sleep(2)
+
+    def shell_cmd_ext(self,
+                      cmd="",
+                      timeout=None,
+                      boutput=False,
+                      stdout_file=None,
+                      stderr_file=None):
+        #if cmd.startswith('app_user@'):
+        #jh0219.han@samsung.com
+        #modified considering multi_user
+        usr = TIZEN_USER + '_user@'
+        usr_len = len(usr)
+        if cmd.startswith(usr):
+            cmdline = SDB_COMMAND_APP % (self.deviceid,TIZEN_USER, self.port, cmd[usr_len:])
+        else:
+            cmdline = SDB_COMMAND_RTN % (self.deviceid, cmd)
+        return shell_command_ext(cmdline, timeout, boutput, stdout_file, stderr_file)
+
+    def get_device_info(self):
+        """get tizen device inforamtion"""
+        device_info = {}
+        resolution_str = ""
+        screen_size_str = ""
+        device_model_str = ""
+        device_name_str = ""
+        build_id_str = ""
+        os_version_str = ""
+
+        # get resolution and screen size
+        exit_code, ret = shell_command(
+            "sdb -s %s shell xrandr" % self.deviceid)
+        pattern = re.compile("connected (\d+)x(\d+).* (\d+mm) x (\d+mm)")
+        for line in ret:
+            match = pattern.search(line)
+            if match:
+                resolution_str = "%s x %s" % (match.group(1), match.group(2))
+                screen_size_str = "%s x %s" % (match.group(3), match.group(4))
+
+        # get architecture
+        exit_code, ret = shell_command(
+            "sdb -s %s shell cat /etc/info.ini" % self.deviceid)
+        for line in ret:
+            if line.find("Model=") != -1:
+                device_model_str = str(line.split('=')[1]).replace(";","")
+                break
+
+        # get hostname
+        exit_code, ret = shell_command(
+            "sdb -s %s shell uname -n" % self.deviceid)
+        if len(ret) > 0:
+            device_name_str = ret[0]
+
+        # get os version
+        exit_code, ret = shell_command(
+            "sdb -s %s shell cat /etc/issue" % self.deviceid)
+        for line in ret:
+            if len(line) > 1:
+                os_version_str = "%s %s" % (os_version_str, line)
+
+        # get build id
+        exit_code, ret = shell_command(
+            "sdb -s %s shell cat /etc/tizen-release" % self.deviceid)
+        for line in ret:
+            if line.find("BUILD_ID=") != -1:
+                build_id_str = line.split('=')[1].strip('\"\r\n')
+
+        os_version_str = os_version_str[0:-1]
+        device_info["device_id"] = self.deviceid
+        device_info["resolution"] = resolution_str
+        device_info["screen_size"] = screen_size_str
+        device_info["device_model"] = device_model_str
+        device_info["device_name"] = device_name_str
+        device_info["os_version"] = os_version_str
+        device_info["build_id"] = build_id_str
+        return device_info
+
+    def get_server_url(self, remote_port="8000"):
+        """forward request a host tcp port to targe tcp port"""
+        if remote_port is None:
+            return None
+
+        os.environ['no_proxy'] = LOCAL_HOST_NS
+        host = LOCAL_HOST_NS
+        inner_port = 9000
+        time_out = 2
+        bflag = False
+        while True:
+            sock_inner = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+            sock_inner.settimeout(time_out)
+            try:
+                sock_inner.bind((host, inner_port))
+                sock_inner.close()
+                bflag = False
+            except socket.error as error:
+                if error.errno == 98 or error.errno == 13:
+                    bflag = True
+            if bflag:
+                inner_port += 1
+            else:
+                break
+        host_port = str(inner_port)
+        cmd = "sdb -s %s forward tcp:%s tcp:%s" % \
+            (self.deviceid, host_port, remote_port)
+        exit_code, ret = shell_command(cmd)
+        url_forward = "http://%s:%s" % (host, host_port)
+        return url_forward
+
+    def download_file(self, remote_path, local_path):
+        """download file from device"""
+        local_path_dir = os.path.dirname(local_path)
+        if not os.path.exists(local_path_dir):
+            os.makedirs(local_path_dir)
+        filename = os.path.basename(remote_path)
+        cmd = "sdb -s %s pull %s %s" % (
+            self.deviceid, remote_path, local_path_dir)
+        exit_code, ret = shell_command(cmd)
+        if exit_code != 0:
+            error = ret[0].strip('\r\n') if len(ret) else "sdb shell timeout"
+            LOGGER.info("[ Download file \"%s\" failed, error: %s ]"
+                        % (remote_path, error))
+            return False
+        else:
+            src_path = os.path.join(local_path_dir, filename)
+            if src_path != local_path:
+                shutil.move(src_path, local_path)
+            return True
+
+    def upload_file(self, remote_path, local_path):
+        """upload file to device"""
+        cmd = "sdb -s %s push %s %s" % (self.deviceid, local_path, remote_path)
+        exit_code, ret = shell_command(cmd)
+        if exit_code != 0:
+            error = ret[0].strip('\r\n') if len(ret) else "sdb shell timeout"
+            LOGGER.info("[ Upload file \"%s\" failed,"
+                        " get error: %s ]" % (local_path, error))
+            return False
+        else:
+            return True
+
+    def _get_wrt_app(self, test_suite, test_set, fuzzy_match, auto_iu):
+        test_app_id = None
+        if auto_iu:
+            test_wgt = test_set
+            test_wgt_path = WRT_LOCATION % (test_suite, test_wgt)
+            if not self.install_app(test_wgt_path):
+                LOGGER.info("[ failed to install widget \"%s\" in target ]"
+                            % test_wgt)
+                return None
+        else:
+            test_wgt = test_suite
+
+        # check if widget installed already
+        cmd = WRT_QUERY_STR % (self.deviceid, test_wgt)
+        exit_code, ret = shell_command(cmd)
+        if exit_code == -1:
+            return None
+        for line in ret:
+            items = line.split(':')
+            if len(items) < 1:
+                continue
+            if (fuzzy_match and items[0].find(test_wgt) != -1) or items[0] == test_wgt:
+                test_app_id = items[1].strip('\r\n')
+                break
+
+        if test_app_id is None:
+            LOGGER.info("[ test widget \"%s\" not found in target ]"
+                        % test_wgt)
+            return None
+
+        return test_app_id
+
+    def _get_xwalk_app(self, test_suite, test_set, fuzzy_match, auto_iu):
+        test_app_id = None
+        if auto_iu:
+            test_wgt = test_set
+            test_wgt_path = XWALK_LOCATION % (test_suite, test_wgt)
+
+            if not self.install_app(test_wgt_path):
+                LOGGER.info("[ failed to install widget \"%s\" in target ]"
+                            % test_wgt)
+                return None
+        else:
+            test_wgt = test_suite
+
+        # check if widget installed already
+        cmd = XWALK_QUERY_STR % (self.deviceid, TIZEN_USER, self.port, test_wgt)
+        exit_code, ret = shell_command(cmd)
+        if exit_code == -1:
+            return None
+        for line in ret:
+            test_app_id = line.strip('\r\n')
+        if test_app_id is None:
+            LOGGER.info("[ test widget \"%s\" not found in target ]"
+                        % test_wgt)
+            return None
+
+        return test_app_id
+
+    def get_launcher_opt(self, test_launcher, test_ext, test_widget, test_suite, test_set):
+        """
+        get test option dict
+        """
+        test_opt = {}
+        self._wrt = False
+        self._xwalk = False
+        app_id = None
+        test_opt["suite_name"] = test_suite
+        test_opt["launcher"] = test_launcher
+        if test_widget is not None and test_widget != "":
+            test_suite = test_widget
+        if test_launcher.find('WRTLauncher') >= 0:
+            self._wrt = True
+            test_opt["launcher"] = WRT_MAIN
+            client_cmds = test_launcher.strip().split()
+            wrt_tag = client_cmds[1] if len(client_cmds) > 1 else ""
+            test_opt['fuzzy_match'] = fuzzy_match = wrt_tag.find('z') != -1
+            test_opt['auto_iu'] = auto_iu = wrt_tag.find('iu') != -1
+            test_opt['self_exec'] = wrt_tag.find('a') != -1
+            test_opt['self_repeat'] = wrt_tag.find('r') != -1
+            app_id = self._get_wrt_app(test_suite, test_set, fuzzy_match, auto_iu)
+        elif test_launcher.find('xwalk') >= 0 and len(test_launcher) <= 16:
+            self._xwalk = True
+            test_opt["launcher"] = XWALK_MAIN
+            client_cmds = test_launcher.strip().split()
+            xpk_tag = client_cmds[1] if len(client_cmds) > 1 else ""
+            test_opt['fuzzy_match'] = fuzzy_match = xpk_tag.find('z') != -1
+            test_opt['auto_iu'] = auto_iu = xpk_tag.find('iu') != -1
+            test_opt['self_exec'] = xpk_tag.find('a') != -1
+            test_opt['self_repeat'] = xpk_tag.find('r') != -1
+            app_id = self._get_xwalk_app(test_suite, test_set, fuzzy_match, auto_iu)
+        else:
+            app_id = test_launcher
+
+        if app_id is None:
+            return None
+        length = len(app_id) - 1
+        #test_opt["test_app_id"] = '''%s''' % app_id[1:length]
+        test_opt["test_app_id"] = app_id
+        print(app_id)
+        cmd_app_id = app_id.split('.')[0]
+        cmd1 = WRT_SMACK_STR % (self.deviceid, cmd_app_id[1:])
+        cmd2 = WRT_SMACK_REV_STR % (self.deviceid, cmd_app_id[1:])
+        print(cmd1)
+        print(cmd2)
+
+        shell_command(cmd1)
+        shell_command(cmd2)
+
+        return test_opt
+
+    def install_package(self, pkgpath):
+        """install a package on tizen device:
+        push package and install with shell command
+        """
+        cmd = RPM_INSTALL % (self.deviceid, pkgpath)
+        exit_code, ret = shell_command(cmd)
+        return ret
+
+    def uninstall_package(self, pkgname):
+        """install a package on tizen device:
+        push package and install with shell command
+        """
+        cmd = RPM_UNINSTALL % (self.deviceid, pkgname)
+        exit_code, ret = shell_command(cmd)
+        return ret
+
+    def get_installed_package(self):
+        """get list of installed package from device"""
+        cmd = RPM_LIST % self.deviceid
+        exit_code, ret = shell_command(cmd)
+        return ret
+
+    def start_debug(self, dlogfile):
+        global debug_flag, metux
+        if self.is_NE_mode(): 
+            return
+        debug_flag = True
+        metux = threading.Lock()
+        cmdline = DLOG_CLEAR % self.deviceid
+        exit_code, ret = shell_command(cmdline)
+        cmdline = DLOG_WRT % self.deviceid
+        th = threading.Thread(target=debug_trace, args=(cmdline, dlogfile+'.dlog'))
+        th.setDaemon(True)
+        th.start()        
+
+    def stop_debug(self):
+        global debug_flag, metux
+        if self.is_NE_mode(): 
+            return
+        metux.acquire()
+        debug_flag = False
+        metux.release()
+
+    def launch_app(self, wgt_name):
+        blauched = False
+        if self._wrt:
+            timecnt = 0
+            cmdline = WRT_STOP_STR % (self.deviceid, wgt_name)
+            exit_code, ret = shell_command(cmdline)
+            cmdline = WRT_START_STR % (self.deviceid, wgt_name)
+            while timecnt < 3:
+                exit_code, ret_out, ret_err = shell_command_ext(cmdline, 30)
+                if exit_code == "0":
+                    blauched = True
+                    break
+                timecnt += 1
+                time.sleep(3)
+        elif self._xwalk:
+            cmd = APP_QUERY_STR % (self.deviceid, wgt_name)
+            exit_code, ret = shell_command(cmd)
+            for line in ret:
+                cmd = APP_KILL_STR % (self.deviceid, line.strip('\r\n'))
+                exit_code, ret = shell_command(cmd)
+            cmdline = XWALK_START_STR % (self.deviceid, TIZEN_USER, self.port, XWALK_MAIN, wgt_name)
+            exit_code, ret = shell_command(cmdline)
+            time.sleep(3)
+            blauched = True
+        else:
+            cmdline = APP_NONBLOCK_STR % (self.deviceid, wgt_name)
+            exit_code, ret = shell_command(cmdline)
+            time.sleep(3)
+            cmd = APP_QUERY_STR % (self.deviceid, wgt_name)
+            exit_code, ret = shell_command(cmd)
+            if ret and len(ret):
+                blauched = True
+
+        return blauched
+
+    def kill_app(self, wgt_name):
+        if self._wrt:
+            cmdline = WRT_STOP_STR % (self.deviceid, wgt_name)
+            exit_code, ret = shell_command(cmdline)
+        elif self._xwalk:
+            cmd = APP_QUERY_STR % (self.deviceid, wgt_name)
+            exit_code, ret = shell_command(cmd)
+            for line in ret:
+                cmd = APP_KILL_STR % (self.deviceid, line.strip('\r\n'))
+                exit_code, ret = shell_command(cmd)
+        return True
+
+    def install_app(self, wgt_path="", timeout=90):
+        if self._wrt:
+            cmd = WRT_INSTALL_STR % (self.deviceid, wgt_path)
+        elif self._xwalk:
+            if len(wgt_path):
+                 ext = wgt_path.split(".")[1]
+            cmd = XWALK_INSTALL_STR % (self.deviceid, TIZEN_USER, self.port, ext, wgt_path)
+        else:
+            return True
+        exit_code, ret = shell_command(cmd, timeout)
+        if exit_code == -1:
+            cmd = APP_QUERY_STR % (self.deviceid, wgt_path)
+            exit_code, ret = shell_command(cmd)
+            for line in ret:
+                cmd = APP_KILL_STR % (self.deviceid, line.strip('\r\n'))
+                exit_code, ret = shell_command(cmd)
+            return False
+        else:
+            return True
+
+    def uninstall_app(self, wgt_name):
+        if self._wrt:
+            cmd = WRT_UNINSTL_STR % (self.deviceid, TIZEN_USER, self.port,  wgt_name)
+        elif self._xwalk:
+            cmd = XWALK_UNINSTL_STR % (self.deviceid, TIZEN_USER,self.port,  wgt_name)
+        else:
+            return True
+        exit_code, ret = shell_command(cmd)
+        return True
+
+    def get_buildinfo(self, _tizenV):
+        """ get builf info"""
+        device_file = DEVICE_SUITE_TARGET_30 + '/Documents/tct/buildinfo.xml'
+
+        buildinfo_file = '/opt/testkit/lite_web_csharp/' + self.deviceid + '/buildinfo.xml'
+        build_info = {}
+        build_info['buildid'] = ''
+        build_info['manufacturer'] = ''
+        build_info['model'] = ''
+
+        if self.download_file(device_file, buildinfo_file) \
+            and EXISTS(buildinfo_file):
+            root = etree.parse(buildinfo_file).getroot()
+            for element in root.findall("buildinfo"):
+                if element is not None:
+                    if element.get("name").lower() == 'buildversion':
+                        child = etree.Element.getchildren(element)
+                        if child and child[0].text:
+                            buildid = child[0].text
+                            build_info['buildid'] = buildid
+                    if element.get("name").lower() == 'manufacturer':
+                        child = etree.Element.getchildren(element)
+                        if child and child[0].text:
+                            manufacturer = child[0].text
+                            build_info['manufacturer'] = manufacturer
+                    if element.get("name").lower() == 'model':
+                        child = etree.Element.getchildren(element)
+                        if child and child[0].text:
+                            model = child[0].text
+                            build_info['model'] = model
+            os.remove(buildinfo_file)
+        return build_info
+
+def get_target_conn(device_id=None):
+    """ Get connection for Test Target"""
+    if device_id is None:
+        dev_list = _get_device_ids()
+        if len(dev_list):
+            device_id = dev_list[0]
+        else:
+            raise InvalidDeviceException('No TIZEN device found!')
+    return TizenMobile(device_id)
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/engines/Makefile.am b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/engines/Makefile.am
new file mode 100644 (file)
index 0000000..16d6aaf
--- /dev/null
@@ -0,0 +1,18 @@
+# Copyright (C) 2012 Intel Corporation
+# 
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# Authors:
+#              Zhang, Huihui <huihuix.zhang@intel.com>
+#              Wendong,Sui  <weidongx.sun@intel.com>
+
+testkitliteenginesdir = /usr/lib/python2.7/dist-packages/testkitlite/engines
+dist_testkitliteengines_SCRIPTS = *.py
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/engines/__init__.py b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/engines/__init__.py
new file mode 100644 (file)
index 0000000..8b13789
--- /dev/null
@@ -0,0 +1 @@
+
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/engines/androidunit.py b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/engines/androidunit.py
new file mode 100644 (file)
index 0000000..267e4b2
--- /dev/null
@@ -0,0 +1,183 @@
+#!/usr/bin/python
+#
+# Copyright (C) 2012 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# Authors:
+#           Chengtao,Liu  <chengtaox.liu@intel.com>
+""" The implementation of pyunit test engine"""
+
+import os
+import time
+import sys
+import threading
+import uuid
+import io
+import unittest
+from unittest import TestResult
+from datetime import datetime
+from testkitlite.util.log import LOGGER
+from testkitlite.util.result import TestSetResut
+
+
+ANDROID_UNIT_STATUS = "INSTRUMENTATION_STATUS:"
+ANDROID_UNIT_STATUS_CODE = "INSTRUMENTATION_STATUS_CODE:"
+ANDROID_UNIT_STATUS_LEN = len(ANDROID_UNIT_STATUS)
+ANDROID_UNIT_STATUS_CODE_LEN = len(ANDROID_UNIT_STATUS_CODE)
+ANDROID_UNIT_START = "am instrument -r -w -e class %s %s/android.test.InstrumentationTestRunner"
+DATE_FORMAT_STR = "%Y-%m-%d %H:%M:%S"
+result_buffer = None
+
+
+def _case_create(case_class, case_id, purpose, status, message):
+    _case = dict()
+    _case['case_class'] = case_class
+    _case['case_id'] = case_id
+    _case['purpose'] = case_id
+    _case['start_at'] = datetime.now().strftime(DATE_FORMAT_STR)
+    if status == '-2':
+        _case['result'] = 'FAIL'
+    elif status == '0':
+        _case['result'] = 'PASS'
+    _case['stdout'] = '[message]' + message
+    _case['end_at'] = datetime.now().strftime(DATE_FORMAT_STR)
+    return _case
+
+
+def _adunit_lines_handler(outstr):
+    """android unittest result wrapper"""
+    lines = outstr.split('\r\n')
+    results = []
+    b_stack = False
+    case_class=case_id = purpose = result = message = ''
+    for line in lines:
+        #print 'debug', line
+        if line.startswith(ANDROID_UNIT_STATUS):
+            content = line[ANDROID_UNIT_STATUS_LEN:].strip()
+            if content.startswith('class='):
+                case_class = content[content.find('class=')+6:]
+            elif content.startswith('test='):
+                result = message = ''
+                b_stack = False
+                case_id = content[content.find('test=')+5:]
+                purpose = case_id
+            elif content.startswith('stack='):
+                message = content[content.find('stack=')+6:]
+                b_stack = True
+        elif line.startswith(ANDROID_UNIT_STATUS_CODE):
+            status = line[ANDROID_UNIT_STATUS_CODE_LEN:].strip()
+            if status != '1': # FAIL / PASS
+                results.append(_case_create(case_class, case_id, purpose, status, message))
+               # print 'debug', results 
+        else:
+            if b_stack:
+                message += line
+    result_buffer.extend_result(results)
+
+
+def _adunit_test_exec(conn, test_session, test_set_path, result_obj):
+    """function for running core tests"""
+    global result_buffer
+    result_buffer = result_obj
+    result_obj.set_status(0)
+    for tc in test_set_path['cases']:
+   # LOGGER.info('[ android unit test, entry: %s ]' % test_set_path)
+   # test_cmd = ANDROID_UNIT_START % (test_set_path, '.'.join(test_set_path.split('.')[:-1]))
+   # _code, _out, _error = conn.shell_cmd_ext(cmd=test_cmd, timeout=None, boutput=True, callbk=_adunit_lines_handler)
+   # result_obj.set_status(1)
+        LOGGER.info('[ android unit test, entry: %s ]' % tc['entry'])
+        test_cmd = ANDROID_UNIT_START % (tc['entry'], '.'.join(tc['entry'].split('.')[:-1]))
+        _code, _out, _error = conn.shell_cmd_ext(cmd=test_cmd, timeout=None, boutput=True, callbk=_adunit_lines_handler)
+    result_obj.set_status(1)
+
+class TestWorker(object):
+
+    """Test executor for testkit-lite"""
+
+    def __init__(self, conn):
+        super(TestWorker, self).__init__()
+        self.conn = conn
+        self.server_url = None
+        self.result_obj = None
+        self.opts = dict({'block_size': 300,
+                          'test_type': None,
+                          'auto_iu': False,
+                          'fuzzy_match': False,
+                          'self_exec': False,
+                          'self_repeat': False,
+                          'debug_mode': False
+                          })
+
+    def init_test(self, params):
+        """init the test envrionment"""
+        self.opts['testset_name'] = params.get('testset-name', '')
+        self.opts['testsuite_name'] = params.get('testsuite-name', '')
+        self.opts['debug_log_base'] = params.get("debug-log-base", '')
+        return str(uuid.uuid1())
+
+    def run_test(self, sessionid, test_set):
+        """
+            process the execution for a test set
+        """
+        #print 'debug', test_set
+        if sessionid is None:
+            return False
+        disabledlog = os.environ.get("disabledlog","")
+        # start debug trace thread
+        if len(disabledlog) > 1:
+            pass
+        else:
+            self.conn.start_debug(self.opts['debug_log_base'])
+        time.sleep(1)
+        self.result_obj = TestSetResut(
+            self.opts['testsuite_name'], self.opts['testset_name'])
+        self.opts['async_th'] = threading.Thread(
+            target=_adunit_test_exec,
+            args=(self.conn, sessionid, test_set, self.result_obj)
+        )
+       # self.opts['async_th'] = threading.Thread(
+       #     target=_adunit_test_exec,
+       #     args=(self.conn, sessionid, test_set['test_set_src'], self.result_obj)
+       # )
+        self.opts['async_th'].start()
+        return True
+
+    def get_test_status(self, sessionid):
+        """poll the test task status"""
+        if sessionid is None:
+            return None
+        result = {}
+        result["msg"] = []
+        result["finished"] = str(self.result_obj.get_status())
+        return result
+
+    def get_test_result(self, sessionid):
+        """get the test result for a test set """
+        result = {}
+        if sessionid is None:
+            return result
+
+        result = self.result_obj.get_result()
+        return result
+
+    def finalize_test(self, sessionid):
+        """clear the test stub and related resources"""
+        if sessionid is None:
+            return False
+
+        if self.result_obj is not None:
+            self.result_obj.set_status(1)
+
+        # stop debug thread
+        self.conn.stop_debug()
+
+        return True
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/engines/default.py b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/engines/default.py
new file mode 100644 (file)
index 0000000..df19e11
--- /dev/null
@@ -0,0 +1,653 @@
+#!/usr/bin/python
+#
+# Copyright (C) 2012 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# Authors:
+#           Chengtao,Liu  <chengtaox.liu@intel.com>
+""" The implementation of default test engine"""
+
+import os
+import time
+import threading
+import uuid
+import configparser
+
+from datetime import datetime
+from testkitlite.util.log import LOGGER
+from testkitlite.util.httprequest import get_url, http_request
+from testkitlite.util.result import TestSetResut
+
+TCT_CONFIG_FILE = "/opt/tools/TCT_CONFIG"
+tct_parser = configparser.ConfigParser()
+tct_parser.read(TCT_CONFIG_FILE)
+
+DEVICE_SUITE_TARGET_30 = tct_parser.get('DEVICE', 'DEVICE_SUITE_TARGET_30')
+
+CNT_RETRY = 10
+DATE_FORMAT_STR = "%Y-%m-%d %H:%M:%S"
+UIFW_MAX_TIME = 300
+UIFW_MAX_WRITE_TIME = 10
+UIFW_RESULT = os.path.join(DEVICE_SUITE_TARGET_30, "Documents/tcresult")
+UIFW_SET_NUM = 0
+LAUNCH_ERROR = 1
+BLOCK_ERROR = 3
+FILES_ROOT = os.path.expanduser("~") + os.sep
+
+
+def _core_test_exec(conn, test_session, test_set_name, exetype, \
+        cases_queue, result_obj):
+    """function for running core tests"""
+    exetype = exetype.lower()
+    total_count = len(cases_queue)
+    current_idx = 0
+    manual_skip_all = False
+    result_list = []
+    stdout_file = FILES_ROOT + test_session + "_stdout.log"
+    stderr_file = FILES_ROOT + test_session + "_stderr.log"
+    initscript = os.environ.get('initscript', '')
+    postscript = os.environ.get('postscript', '')
+    for test_case in cases_queue:
+        if result_obj.get_status() == 1:
+            break
+
+        current_idx += 1
+        core_cmd = ""
+        if "entry" in test_case:
+            core_cmd = test_case["entry"]
+        else:
+            LOGGER.info(
+                "[ Warnning: test script is empty,"
+                " please check your test xml file ]")
+            continue
+        expected_result = test_case.get('expected_result', '0')
+        time_out = int(test_case.get('timeout', '90'))
+        location = test_case.get('location', 'device')
+        measures = test_case.get('measures', [])
+        retmeasures = []
+        os.environ['CASE_ID'] = test_case['case_id']
+
+        LOGGER.info("\n[%s:%s] TestCase: %s\n"
+                    "TestEntry: %s"
+                    % (current_idx, total_count, test_case['case_id'], core_cmd))
+
+        strtime = datetime.now().strftime(DATE_FORMAT_STR)
+        LOGGER.info("start: %s" % strtime)
+        test_case["start_at"] = strtime
+        if exetype == 'auto':
+            return_code, stdout, stderr = -1, [], []
+            if location == 'host':
+                if len(initscript) > 1:
+                    return_code, stdout, stderr = \
+                            conn.shell_cmd_host(initscript, time_out, False, \
+                            stdout_file, stderr_file)
+
+                    if return_code is not None and return_code != "timeout":
+                        LOGGER.info('init script ok')
+                    else:
+                        LOGGER.info('init script fail')
+                return_code, stdout, stderr = -1, [], []
+                return_code, stdout, stderr = \
+                        conn.shell_cmd_host(core_cmd, time_out, False, \
+                        stdout_file, stderr_file)
+            else:
+                if len(initscript) > 1:
+                    return_code, stdout, stderr = \
+                            conn.shell_cmd_ext(initscript, time_out, False, \
+                            stdout_file, stderr_file)
+                    if return_code is not None and return_code != "timeout":
+                        LOGGER.info('init script ok')
+                    else:
+                        LOGGER.info('init script fail')
+                return_code, stdout, stderr = -1, [], []
+                return_code, stdout, stderr = \
+                        conn.shell_cmd_ext(core_cmd, time_out, False, \
+                        stdout_file, stderr_file)
+            print('return ', return_code, stdout, stderr)
+            if return_code is not None and return_code != "timeout":
+                test_case["result"] = "pass" if str(
+                    return_code) == expected_result else "fail"
+                test_case["stdout"] = stdout
+                test_case["stderr"] = stderr
+                for item in measures:
+                    ind = item['name']
+                    fname = item['file']
+                    if fname is None:
+                        continue
+                    tmpname = FILES_ROOT + test_session + "_mea_tmp"
+                    if conn.download_file(fname, tmpname):
+                        try:
+                            config = configparser.ConfigParser()
+                            config.read(tmpname)
+                            item['value'] = config.get(ind, 'value')
+                            retmeasures.append(item)
+                            os.remove(tmpname)
+                        except IOError as error:
+                            LOGGER.error(
+                                "[ Error: fail to parse value,"
+                                " error:%s ]\n" % error)
+                test_case["measures"] = retmeasures
+            else:
+                test_case["result"] = "BLOCK"
+                test_case["stdout"] = stdout
+                test_case["stderr"] = stderr
+        elif exetype == 'manual':
+            # handle manual core cases
+            try:
+                # LOGGER.infopre-condition info
+                if "pre_condition" in test_case:
+                    LOGGER.info("\n****\nPre-condition: %s\n ****\n"
+                                % test_case['pre_condition'])
+                # LOGGER.infostep info
+                if "steps" in test_case:
+                    for step in test_case['steps']:
+                        LOGGER.info(
+                            "********************\n"
+                            "Step Order: %s" % step['order'])
+                        LOGGER.info("Step Desc: %s" % step['step_desc'])
+                        LOGGER.info(
+                            "Expected: %s\n********************\n"
+                            % step['expected'])
+                if manual_skip_all:
+                    test_case["result"] = "N/A"
+                else:
+                    while True:
+                        test_result = input(
+                            '[ please input case result ]'
+                            ' (p^PASS, f^FAIL, b^BLOCK, n^Next, d^Done):')
+                        if test_result.lower() == 'p':
+                            test_case["result"] = "PASS"
+                            break
+                        elif test_result.lower() == 'f':
+                            test_case["result"] = "FAIL"
+                            break
+                        elif test_result.lower() == 'b':
+                            test_case["result"] = "BLOCK"
+                            break
+                        elif test_result.lower() == 'n':
+                            test_case["result"] = "N/A"
+                            break
+                        elif test_result.lower() == 'd':
+                            manual_skip_all = True
+                            test_case["result"] = "N/A"
+                            break
+                        else:
+                            LOGGER.info(
+                                "[ Warnning: you input: '%s' is invalid,"
+                                " please try again ]" % test_result)
+            except IOError as error:
+                LOGGER.info(
+                    "[ Error: fail to get core manual test step,"
+                    " error: %s ]\n" % error)
+        strtime = datetime.now().strftime(DATE_FORMAT_STR)
+        LOGGER.info("end : %s" % strtime)
+        test_case["end_at"] = strtime
+        LOGGER.info("execute case: %s" % test_case["result"])
+        result_list.append(test_case)
+        if len(postscript) > 1:
+            if location == 'host':
+                return_code, stdout, stderr = \
+                        conn.shell_cmd_host(postscript, time_out, False, \
+                        stdout_file, stderr_file)
+                if return_code is not None and return_code != "timeout":
+                    LOGGER.info('post script ok')
+                else:
+                    LOGGER.info('post script fail')
+
+            else:
+                if postscript is not None or postscript is not '':
+                    return_code, stdout, stderr = \
+                            conn.shell_cmd_ext(postscript, time_out, False, \
+                            stdout_file, stderr_file)
+                    if return_code is not None and return_code != "timeout":
+                        LOGGER.info('post script ok')
+                    else:
+                        LOGGER.info('post script fail')
+
+    result_obj.extend_result(result_list, False)
+    result_obj.set_status(1)
+
+
+def _web_test_exec(conn, server_url, test_web_app, exetype, \
+        cases_queue, result_obj):
+    """function for running web tests"""
+    exetype = exetype.lower()
+    test_set_finished = False
+    err_cnt = 0
+    for test_group in cases_queue:
+        if test_set_finished:
+            break
+
+        ret = http_request(
+            get_url(server_url, "/set_testcase"), "POST", test_group, 30)
+        if ret is None:
+            LOGGER.error(
+                "[ set testcases timeout, please check device! ]")
+            result_obj.set_status(1)
+            break
+
+        if not conn.launch_app(test_web_app):
+            LOGGER.error("[ ERROR: launch test app %s failed! ]" \
+                    % test_web_app)
+            result_obj.set_status(1)
+            break
+
+        while True:
+            if result_obj.get_status() == 1:
+                test_set_finished = True
+                break
+            ret = http_request(
+                get_url(server_url, "/check_server_status"), "GET", {})
+            if ret is None:
+                LOGGER.error(
+                    "[ ERROR: get server status timeout, please check device! ]")
+                err_cnt += 1
+            else:
+                result_cases = ret.get("cases")
+                error_code = ret.get("error_code")
+                if error_code is not None:
+                    if not conn.launch_app(test_web_app):
+                        test_set_finished = True
+                        result_obj.set_status(1)
+                        break
+                    if error_code == LAUNCH_ERROR:
+                        LOGGER.error("[ERROR : test app no response, hang or not launched!]")
+                        test_set_finished = True
+                        result_obj.set_status(1)
+                        break
+                    elif error_code == BLOCK_ERROR:
+                        LOGGER.error("[ ERROR: test case block issue! ]")
+                        err_cnt += 1
+                else:
+                    err_cnt = 0
+
+                if result_cases is not None and len(result_cases):
+                    result_obj.extend_result(result_cases)
+                elif exetype == 'manual':
+                    LOGGER.info(
+                        "[ please execute manual cases ]\r\n")
+
+                if ret["finished"] == 1:
+                    test_set_finished = True
+                    result_obj.set_status(1)
+                    break
+                elif ret["block_finished"] == 1:
+                    break
+
+            if err_cnt >= CNT_RETRY:
+                LOGGER.error(
+                    "[error: get too many errors, stop current set]")
+                test_set_finished = True
+                result_obj.set_status(1)
+                break
+            time.sleep(2)
+
+
+def _webuifw_test_exec(conn, test_web_app, test_session, test_set_name, \
+        exetype, cases_queue, result_obj):
+    """function for running webuifw tests"""
+    global UIFW_SET_NUM
+    UIFW_SET_NUM = UIFW_SET_NUM + 1
+    set_UIFW_RESULT = UIFW_RESULT + "_" + str(UIFW_SET_NUM) + ".xml"
+    result_obj.set_status(0)
+    result_obj.set_result({"resultfile": ""})
+    ls_cmd = "ls -l %s" % set_UIFW_RESULT
+    sz_cmd = "du -hk %s " % set_UIFW_RESULT
+    time_out = UIFW_MAX_TIME
+    rm_cmd = "rm " + os.path.join(DEVICE_SUITE_TARGET_30, "Documents/tcresult*.xml")
+    #jh0219.han@samsung.com
+    if exetype == "auto":
+        conn.shell_cmd(rm_cmd)
+        UIFW_SET_NUM = 1
+        LOGGER.info('[webuifw] start test executing')
+        if not conn.launch_app(test_web_app):
+            LOGGER.info("[ launch test app \"%s\" failed! ]" % test_web_app)
+            result_obj.set_result({"resultfile": ""})
+            result_obj.set_status(1)
+
+    result_file = FILES_ROOT + test_session + "_uifw.xml"
+
+    while time_out > 0:
+        LOGGER.info('[webuifw] waiting for test completed...')
+        exit_code, ret = conn.shell_cmd(ls_cmd)
+        if not 'No such file or directory' in ret[0]:
+            exit_code, ret = conn.shell_cmd(sz_cmd)
+            f_size = int(ret[0].split("\t")[0])
+            if f_size > 0:
+                break
+            if time_out > UIFW_MAX_WRITE_TIME:
+                time_out = UIFW_MAX_WRITE_TIME
+        time.sleep(2)
+        time_out -= 2
+
+    LOGGER.info('[webuifw] end test executing')
+    if conn.download_file(set_UIFW_RESULT, result_file):
+        result_obj.set_result({"resultfile": result_file})
+    for test_case in cases_queue:
+        LOGGER.info("[webuifw] execute case: %s # %s" %
+                    (test_set_name, test_case['case_id']))
+    result_obj.set_status(1)
+
+
+class TestWorker(object):
+
+    """Test executor for testkit-lite"""
+
+    def __init__(self, conn):
+        super(TestWorker, self).__init__()
+        self.conn = conn
+        self.server_url = None
+        self.result_obj = None
+
+        self.opts = dict({'block_size': 300,
+                          'test_type': None,
+                          'auto_iu': False,
+                          'fuzzy_match': False,
+                          'self_exec': False,
+                          'self_repeat': False,
+                          'debug_mode': False
+                          })
+
+    def set_TizenVersion(self, tizenversion):
+        print("")
+
+    def __init_test_stub(self, stub_app, stub_port, debug_opt):
+        # init testkit-stub deamon process
+        timecnt = 0
+        blaunched = False
+        while timecnt < CNT_RETRY:
+            #print 'stub_app' ,stub_app
+            if not self.conn.check_process(stub_app):
+                LOGGER.info("[ no stub process activated, now try to launch %s ]" % stub_app)
+                self.conn.launch_stub(stub_app, stub_port, debug_opt)
+                timecnt += 1
+            else:
+                blaunched = True
+                break
+
+        if not blaunched:
+            LOGGER.info("[ launch stub process failed! ]")
+            return False
+
+        if self.server_url is None:
+            self.server_url = self.conn.get_server_url(stub_port)
+
+        timecnt = 0
+        blaunched = False
+        while timecnt < CNT_RETRY:
+            ret = http_request(get_url(
+                self.server_url, "/check_server_status"), "GET", {})
+            if ret is None:
+                LOGGER.info("[ check server status, not ready yet! ]")
+                timecnt += 1
+                time.sleep(1)
+            else:
+                blaunched = True
+                break
+        return blaunched
+
+    def __init_webtest_opt(self, params):
+        """init the test runtime, mainly process the star up of test stub"""
+        if params is None:
+            return None
+
+        session_id = str(uuid.uuid1())
+        stub_app = params.get('stub-name', 'testkit-stub')
+        stub_port = params.get('stub-port', '8000')
+        testsuite_name = params.get('testsuite-name', '')
+        testset_name = params.get('testset-name', '')
+        capability_opt = params.get("capability", None)
+        test_launcher = params.get('test-launcher', '')
+        test_extension = params.get('test-extension', None)
+        test_widget = params.get('test-widget', None)
+ #      jh0219.han@samsung.com //in
+        client_cmds = params.get('test-launcher', '').strip().split()
+        wrt_tag = client_cmds[1] if len(client_cmds) > 1 else ""
+        self.opts['self_exec'] = wrt_tag.find('a') != -1
+        self.opts['self_repeat'] = wrt_tag.find('r') != -1
+ #      jh0219.han@samsung.com //out
+ #       LOGGER.info("[f*: %s ]" % str(params))
+        test_opt = self.conn.get_launcher_opt(
+            test_launcher, test_extension, test_widget, \
+                    testsuite_name, testset_name)
+        if test_opt is None:
+            LOGGER.info("[ init the test launcher, get failed ]")
+            return None
+        LOGGER.info("[ test launcher: %s ]" % test_opt["launcher"])
+        LOGGER.info("[ test app: %s ]" % test_opt["test_app_id"])
+        self.opts.update(test_opt)
+        self.opts['debug_mode'] = params.get("debug", False)
+
+        # uifw, this suite don't need stub
+        if self.opts['self_exec'] or self.opts['self_repeat']:
+            self.opts['test_type'] = "jqunit"
+            return session_id
+
+        # enable debug information
+        stub_debug_opt = "--debug" if self.opts['debug_mode'] else ""
+
+        # suite_id to be removed in later version
+        test_opt["suite_id"] = test_opt["test_app_id"]
+        if self.__init_test_stub(stub_app, stub_port, stub_debug_opt):
+            ret = http_request(get_url(
+                self.server_url, "/init_test"), "POST", test_opt)
+            if ret is None:
+                LOGGER.info("[ init test suite failed! ]")
+                return None
+            elif "error_code" in ret:
+                LOGGER.info("[ init test suite, "
+                            "get error code %d ! ]" % ret["error_code"])
+                return None
+
+            if capability_opt is not None:
+                ret = http_request(get_url(self.server_url,
+                                           "/set_capability"),
+                                   "POST", capability_opt)
+            return session_id
+        else:
+            LOGGER.info("[ Init test failed ! ]")
+            return None
+
+    def init_test(self, params):
+        """init the test envrionment"""
+        self.opts['testset_name'] = params.get('testset-name', '')
+        self.opts['testsuite_name'] = params.get('testsuite-name', '')
+        self.opts['debug_log_base'] = params.get("debug-log-base", '')
+        if params.get('test-launcher') is not None:
+            self.opts['test_type'] = "webapi"
+            return self.__init_webtest_opt(params)
+        elif params.get('set_type') in ['ref', 'js']:
+            self.opts['test_type'] = "webapi"
+            params['test-launcher'] = "xwalk"
+            return self.__init_webtest_opt(params)
+        else:
+            self.opts['test_type'] = "coreapi"
+            return str(uuid.uuid1())
+
+    def __run_core_test(self, sessionid, test_set_name, exetype, cases):
+        """
+            process the execution for core api test
+        """
+        self.opts['async_th'] = threading.Thread(
+            target=_core_test_exec,
+            args=(
+                self.conn, sessionid, test_set_name, exetype, \
+                        cases, self.result_obj)
+        )
+        self.opts['async_th'].start()
+        return True
+
+    def __run_jqt_test(self, sessionid, test_set_name, cases):
+        """
+            process the execution for Qunit testing
+        """
+        exetype = "auto" if self.opts['self_exec'] else ""
+        self.opts['async_th'] = threading.Thread(
+            target=_webuifw_test_exec,
+            args=(
+                self.conn, self.opts['test_app_id'], sessionid, \
+                        test_set_name, exetype, cases, self.result_obj)
+        )
+        self.opts['async_th'].start()
+        return True
+
+    def __run_web_test(self, sessionid, test_set_name, exetype, ctype, cases):
+        """
+            process the execution for web api test
+            may be splitted to serveral blocks,
+            with the unit size defined by block_size
+        """
+        #print 'web test'
+        case_count = len(cases)
+        blknum = 0
+        if case_count % self.opts['block_size'] == 0:
+            blknum = case_count / self.opts['block_size']
+        else:
+            blknum = case_count / self.opts['block_size'] + 1
+
+        idx = 1
+        test_set_queues = []
+        while idx <= blknum:
+            block_data = {}
+            block_data["exetype"] = exetype
+            block_data["type"] = ctype
+            block_data["totalBlk"] = str(blknum)
+            block_data["currentBlk"] = str(idx)
+            block_data["casecount"] = str(case_count)
+            start = (idx - 1) * self.opts['block_size']
+            if idx == blknum:
+                end = case_count
+            else:
+                end = idx * self.opts['block_size']
+            block_data["cases"] = cases[start:end]
+            test_set_queues.append(block_data)
+            idx += 1
+        self.opts['async_th'] = threading.Thread(
+            target=_web_test_exec,
+            args=(
+                self.conn, self.server_url, self.opts['test_app_id'], \
+                        exetype, test_set_queues, self.result_obj)
+        )
+        self.opts['async_th'].start()
+        return True
+
+    def run_test(self, sessionid, test_set):
+        """
+            process the execution for a test set
+        """
+        if sessionid is None:
+            return False
+
+        if not "cases" in test_set:
+            return False
+        disabledlog = os.environ.get('disabledlog', '')
+        cases, exetype, ctype = test_set[
+            "cases"], test_set["exetype"], test_set["type"]
+        #print 'exetype', exetype
+        if len(cases) == 0:
+            return False
+        # start debug trace thread
+        if disabledlog == 'True':
+            pass
+        else:
+            self.conn.start_debug(self.opts['debug_log_base'])
+        time.sleep(1)
+
+        self.result_obj = TestSetResut(
+            self.opts['testsuite_name'], self.opts['testset_name'])
+
+        devid = self.conn.get_devid()
+        if self.conn.is_NE_mode() or (devid and devid.find('None') > -1):
+            result_list = []
+            for case in cases:
+                test_case = {}
+                test_case['case_id'] = case['case_id']
+                test_case['result'] = 'N/A'
+                if devid.find('None') > -1:
+                    test_case['stdout'] = "target not found"
+                else:
+                    issue_num = int(self.conn.is_NE_mode())
+                    err_msg = "precondition failed "
+                    if issue_num == 1:
+                        err_msg += "(not connected to wifi)"
+                    elif issue_num == 2:
+                        err_msg += "(not set email account)"
+                    elif issue_num == 3:
+                        err_msg += "(not available device network)"
+                    elif issue_num == 4:
+                        err_msg += "(not enable bluetooth)"
+                    elif issue_num == 5:
+                        err_msg += "(not enable nfc)"
+                    elif issue_num == 6:
+                        err_msg += "(not available sim card)"
+                    test_case['stdout'] = err_msg
+  
+                result_list.append(test_case)
+
+            self.result_obj.extend_result(result_list)
+            self.result_obj.set_status(1)
+            return True
+        
+        if self.opts['test_type'] == "webapi":
+            if ctype == 'ref':
+                exetype = 'manual'
+            return self.__run_web_test(sessionid, \
+                    self.opts['testset_name'], exetype, ctype, cases)
+        elif self.opts['test_type'] == "coreapi":
+            return self.__run_core_test(sessionid, \
+                    self.opts['testset_name'], exetype, cases)
+        #elif self.opts['test_type'] == "jqunit":
+        elif self.opts['test_type'] in ["jqunit", 'pyunit']:
+            return self.__run_jqt_test(sessionid, \
+                    self.opts['testset_name'], cases)
+        else:
+            LOGGER.info("[ unsupported test suite type ! ]")
+            return False
+
+    def get_test_status(self, sessionid):
+        """poll the test task status"""
+        if sessionid is None:
+            return None
+        result = {}
+        result["msg"] = []
+        result["finished"] = str(self.result_obj.get_status())
+        return result
+
+    def get_test_result(self, sessionid):
+        """get the test result for a test set """
+        result = {}
+        if sessionid is None:
+            return result
+
+        result = self.result_obj.get_result()
+        return result
+
+    def finalize_test(self, sessionid):
+        """clear the test stub and related resources"""
+        if sessionid is None:
+            return False
+
+        if self.result_obj is not None:
+            self.result_obj.set_status(1)
+
+        # stop test app
+        if self.opts['test_type'] == "webapi":
+            self.conn.kill_app(self.opts['test_app_id'])
+            # uninstall test app
+            if self.opts['auto_iu']:
+                self.conn.uninstall_app(\
+                        self.opts['test_app_id'].split('.')[0][1:])
+
+        # stop debug thread
+        self.conn.stop_debug()
+
+        return True
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/engines/pyunit.py b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/engines/pyunit.py
new file mode 100644 (file)
index 0000000..2cadf0c
--- /dev/null
@@ -0,0 +1,179 @@
+#!/usr/bin/python
+#
+# Copyright (C) 2012 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# Authors:
+#           Chengtao,Liu  <chengtaox.liu@intel.com>
+""" The implementation of pyunit test engine"""
+
+import os
+import time
+import sys
+import threading
+import uuid
+import io
+import unittest
+from unittest import TestResult
+from datetime import datetime
+from testkitlite.util.log import LOGGER
+from testkitlite.util.result import TestSetResut
+
+
+DATE_FORMAT_STR = "%Y-%m-%d %H:%M:%S"
+result_buffer = None
+class LiteTestResult(TestResult):
+
+    """Python unittest result wrapper"""
+
+    def startTest(self, test):
+        super(LiteTestResult, self).startTest(test)
+        self._case = {}
+        case_full_id = test.id()
+        self._case['case_id'] = case_full_id.split('.')[-1]
+        self._case['purpose'] = case_full_id
+        self._case['start_at'] = datetime.now().strftime(DATE_FORMAT_STR)
+
+    def stopTest(self, test):
+        self._case['end_at'] = datetime.now().strftime(DATE_FORMAT_STR)
+        super(LiteTestResult, self).stopTest(test)
+        if result_buffer is not None:
+            result_buffer.extend_result([self._case])
+
+    def addSuccess(self, test):
+        super(LiteTestResult, self).addSuccess(test)
+        self._case['result'] = 'PASS'
+
+    def addError(self, test, err):
+        super(LiteTestResult, self).addError(test, err)
+        _, _exc_str = self.errors[-1]
+        self._case['result'] = 'BLOCK'
+        self._case['stdout'] = '[message]' + _exc_str
+
+    def addFailure(self, test, err):
+        super(LiteTestResult, self).addFailure(test, err)
+        _, _exc_str = self.failures[-1]
+        self._case['result'] = 'FAIL'
+        self._case['stdout'] = '[message]' + _exc_str
+
+
+def _pyunit_test_exec(test_session, cases, result_obj):
+    """function for running core tests"""
+    global result_buffer
+    result_buffer = result_obj
+    result_obj.set_status(0)
+    total = unittest.TestSuite()
+    for tc in cases['cases']:
+        if tc['entry'].find(os.sep) != -1:
+            arr = tc['entry'].split(os.sep)
+            path = tc['entry'][:tc['entry'].rindex(os.sep)]
+            case = arr[-1]
+        else:
+            path = os.getcwd()
+            case = tc['entry']
+        try:
+            tests = unittest.TestLoader().discover(path, pattern='''%s''' %case)
+            total.addTest(tests)
+           # unittest.TextTestRunner(resultclass=LiteTestResult, buffer=True).run(tests)
+        except ImportError as error:
+            pass
+    try:
+        unittest.TextTestRunner(resultclass=LiteTestResult, buffer=True).run(total)
+    except ImportError as error:
+        pass
+
+    #result_obj.extend_result(resultclass)
+    result_obj.set_status(1)
+
+
+class TestWorker(object):
+
+    """Test executor for testkit-lite"""
+
+    def __init__(self, conn):
+        super(TestWorker, self).__init__()
+        self.conn = conn
+        self.server_url = None
+        self.result_obj = None
+        self.opts = dict({'block_size': 300,
+                          'test_type': None,
+                          'auto_iu': False,
+                          'fuzzy_match': False,
+                          'self_exec': False,
+                          'self_repeat': False,
+                          'debug_mode': False
+                          })
+
+    def init_test(self, params):
+        """init the test envrionment"""
+        self.opts['testset_name'] = params.get('testset-name', '')
+        self.opts['testsuite_name'] = params.get('testsuite-name', '')
+        self.opts['debug_log_base'] = params.get("debug-log-base", '')
+        return str(uuid.uuid1())
+
+    def run_test(self, sessionid, test_set):
+        """
+            process the execution for a test set
+        """
+        if sessionid is None:
+            return False
+        disabledlog = os.environ.get("disabledlog","")
+        # start debug trace thread
+        if len(disabledlog) > 0 :
+            pass
+        else:
+            self.conn.start_debug(self.opts['debug_log_base'])
+        time.sleep(1)
+        self.result_obj = TestSetResut(
+            self.opts['testsuite_name'], self.opts['testset_name'])
+       # self.opts['async_th'] = threading.Thread(
+       #     target=_pyunit_test_exec,
+       #     args=(sessionid, test_set['test_set_src'], test_set,  self.result_obj)
+       # )
+        self.opts['async_th'] = threading.Thread(
+            target=_pyunit_test_exec,
+            args=(sessionid, test_set, self.result_obj)
+        )
+        self.opts['async_th'].start()
+        return True
+
+    def get_test_status(self, sessionid):
+        """poll the test task status"""
+        if sessionid is None:
+            return None
+        result = {}
+        result["msg"] = []
+        result["finished"] = str(self.result_obj.get_status())
+        return result
+
+    def get_test_result(self, sessionid):
+        """get the test result for a test set """
+        result = {}
+        if sessionid is None:
+            return result
+
+        result = self.result_obj.get_result()
+        return result
+
+    def finalize_test(self, sessionid):
+        """clear the test stub and related resources"""
+        if sessionid is None:
+            return False
+
+        if self.result_obj is not None:
+            self.result_obj.set_status(1)
+
+        # stop debug thread
+        self.conn.stop_debug()
+
+        return True
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/engines/test_executer.py b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/engines/test_executer.py
new file mode 100644 (file)
index 0000000..4707e2f
--- /dev/null
@@ -0,0 +1,575 @@
+import os
+import re
+import time
+import sys
+import _thread
+import threading
+import socket
+import json
+import hashlib
+import signal
+import logging
+import subprocess
+import configparser
+from testkitlite.util import tr_utils
+from testkitlite.util.log import LOGGER as g_logger
+from urllib.parse import urlparse
+
+try:
+    from selenium.webdriver.remote.webdriver import WebDriver
+    from selenium.webdriver.support.ui import WebDriverWait
+except ImportError as err:
+    g_logger.info("Failed to import 'selenium' module, please check your installation:")
+    g_logger.info("  You can use 'sudo pip install selenium' to install the module!")
+    raise ImportError
+
+TE = None
+EXE_LOCK = threading.Lock()
+DEFAULT_TIMEOUT = 90
+REF_SET_TYPE = 'ref'
+JS_SET_TYPE = 'js'
+SCRIPT_SET_TYPE = 'script'
+STR_PASS = 'PASS'
+STR_FAIL = 'FAIL'
+STR_BLOCK = 'BLOCK'
+STR_NOTRUN = 'n/a'
+DEFAULT_WD_URL = 'http://127.0.0.1:9515'
+MH_FILE = "/opt/testkit/lite_web_csharp/mh.html"
+
+
+class TestExecuter:
+
+    def __init__(self, test_env=None):
+        self.runner_proc = test_env['runner_proc']
+        self.exe_thread = None
+        self.exe_status = 'READY'
+        self.tests_json = ''
+        self.target_platform = test_env['target_platform']
+        self.web_driver = None
+        self.wd_url = test_env.get("wd_url", '') or DEFAULT_WD_URL
+        self.suite_name = test_env['suite_name']
+        self.set_type = test_env['set_type']
+        self.set_exetype = test_env['set_exetype']
+        self.test_prefix = ''
+        self.exe_socket_file = test_env['exe_socket_file']
+        self.exe_socket_buff_size = test_env['exe_socket_buff_size']
+        self.exe_socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
+        self.exe_socket.connect(self.exe_socket_file)
+        self.TE_LOG = g_logger
+        self.debugip = test_env.get("debugip", '')
+        self.appid = test_env.get("appid", '')
+        signal.signal(signal.SIGINT, self.__exitHandler)
+        signal.signal(signal.SIGTERM, self.__exitHandler)
+
+    def __exitHandler(self, a, b):
+        if self.web_driver:
+            self.web_driver.quit()
+            self.web_driver = None
+        with EXE_LOCK:
+            self.exe_status = 'DONE'
+
+    def __updateTestPrefix(self):
+        if self.target_platform.upper().find('ANDROID') >= 0:
+            url_components = urlparse(self.web_driver.current_url)
+            if url_components.scheme == 'http':
+                self.test_prefix = '%s://%s/' % (url_components.scheme,
+                                                 url_components.netloc)
+        elif self.target_platform.upper().find('TIZEN') >=0:
+            url_components = urlparse(self.web_driver.current_url)
+            self.test_prefix = '%s://%s/' % (url_components.scheme,
+                               url_components.netloc)
+            
+
+
+    def __initWebDriver(self):
+        from selenium import webdriver
+        self.TE_LOG.info('init web driver')
+        if self.web_driver:
+            self.web_driver.quit()
+            self.web_driver = None
+
+        test_app = test_ext = ''
+        driver_env = {}
+        try:
+            exec('from testkitlite.capability.%s import initCapability' % self.target_platform)
+            if self.target_platform.upper().find('TIZEN') >= 0:
+                test_app = self.appid
+                test_ext = self.debugip
+                capa = {'xwalkOptions': {'tizenAppId': test_app[1:-1], 'tizenDebuggerAddress': test_ext}}
+            elif self.target_platform.upper().find('ANDROID') >= 0:
+                test_app, test_ext = self.appid.split('/')
+                driver_env = initCapability(test_app, test_ext)
+                capa = driver_env['desired_capabilities']
+            driver_env = initCapability(test_app, test_ext)
+            self.test_prefix = driver_env['test_prefix']
+            self.web_driver = WebDriver(self.wd_url, capa)
+            url_compon = urlparse(self.web_driver.current_url)
+            self.__updateTestPrefix()
+            return True
+        except Exception as e:
+            if self.target_platform.upper().find('ANDROID') >= 0:
+                try:
+                    test_ext = test_ext.strip('.').replace('Activity', '')
+                    tmps = test_ext.split('_')
+                    actv_name = ''.join([it.capitalize() for it in tmps if it])
+                    test_ext = '.%sActivity' % actv_name
+                    self.TE_LOG.info('activity : %s' %test_ext)
+                    driver_env = initCapability(test_app, test_ext)
+                    self.web_driver = WebDriver(self.wd_url, driver_env['desired_capabilities'])
+                    self.__updateTestPrefix()
+                    return True
+                except Exception as e:
+                    try:
+                        test_app, test_ext = self.appid.split('/')
+                        test_ext = test_ext.replace('Activity', '')
+                        self.TE_LOG.info('activity : %s' %test_ext)
+                        driver_env = initCapability(test_app, test_ext)
+                        self.web_driver = WebDriver(self.wd_url, driver_env['desired_capabilities'])
+                        self.__updateTestPrefix()
+                        return True
+                    except Exception as e: 
+                        self.TE_LOG.error('Retry to init Web Driver get failed: %s' % e)
+                        return False
+            else:
+                self.TE_LOG.error('Init Web Driver failed: %s' % e)
+                return False
+
+    def __talkWithRunnerRecv(self):
+        try:
+            exe_data = self.exe_socket.recv(self.exe_socket_buff_size)
+            if exe_data is None:
+                return (None, None)
+            exe_json = json.loads(exe_data)
+            command = exe_json['COMMAND']
+            data = exe_json['DATA']
+        except Exception as e:
+            self.TE_LOG.debug('Receive data failed, %s' % e)
+            time.sleep(2)
+            return (None, None)
+        return (command, data)
+
+    def __talkWithRunnerSend(self, data=None):
+        try:
+            self.exe_socket.send(json.dumps(data))
+        except Exception as e:
+            self.TE_LOG.debug('Send data failed, %s' % e)
+            time.sleep(2)
+            return False
+        return True
+
+    def __initWebManualHarness(self):
+        if self.target_platform.upper().find('CHROME') >= 0:
+            self.web_driver.get('%s%s' % (self.test_prefix, MH_FILE))
+        else:
+            self.web_driver.get('%s/index.html' % self.test_prefix)
+
+        try:
+            harness_page_file = open(MH_FILE)
+            harness_page_raw = harness_page_file.read()
+            harness_page_file.close()
+        except Exception as e:
+            self.TE_LOG.debug('Read manual harness file failed: %s' % e)
+            return False
+        harness_page_raw = harness_page_raw.replace(
+            '\n', '').replace('"', '\\"').replace("'", "\\'")
+        self.web_driver.execute_script(
+            "document.write(\"%s\")" % harness_page_raw)
+        self.web_driver.execute_script("document.close()")
+        self.web_driver.execute_script("init_mh()")
+
+        return True
+
+    def __runWebManualTests(self):
+        if not self.__initWebManualHarness():
+            self.TE_LOG.error(
+                'Init web manual harness failed, exit from executer')
+            return False
+
+        case_num = len(self.tests_json['cases'])
+        i_case = 0
+        while True:
+            try:
+                if i_case >= (case_num - 1):
+                    i_case = case_num - 1
+                    self.web_driver.execute_script(
+                        "document.getElementById(\"forward-bt\").disabled=\"true\"")
+                else:
+                    self.web_driver.execute_script(
+                        "document.getElementById(\"forward-bt\").disabled=\"\"")
+
+                if i_case <= 0:
+                    i_case = 0
+                    self.web_driver.execute_script(
+                        "document.getElementById(\"back-bt\").disabled=\"true\"")
+                else:
+                    self.web_driver.execute_script(
+                        "document.getElementById(\"back-bt\").disabled=\"\"")
+
+                if self.set_type == REF_SET_TYPE:
+                    self.web_driver.execute_script(
+                        "document.getElementById(\"test-entry\").textContent=\"%s%s\"" % (self.test_prefix, self.tests_json['cases'][i_case]['entry']))
+                    self.web_driver.execute_script(
+                        "document.getElementById(\"refer-test-entry\").textContent=\"%s%s\"" % (self.test_prefix, self.tests_json['cases'][i_case]['refer_entry']))
+                    self.web_driver.execute_script(
+                        "document.getElementById(\"run-refer-test-bt\").style.display=\"\"")
+                    self.web_driver.execute_script(
+                        "document.getElementById(\"refer-test-entry-area\").style.display=\"\"")
+                elif self.set_type == JS_SET_TYPE:
+                    self.web_driver.execute_script(
+                        "document.getElementById(\"test-entry\").textContent=\"%s%s\"" % (self.test_prefix, self.tests_json['cases'][i_case]['entry']))
+                    self.web_driver.execute_script(
+                        "document.getElementById(\"run-refer-test-bt\").style.display=\"none\"")
+                    self.web_driver.execute_script(
+                        "document.getElementById(\"refer-test-entry-area\").style.display=\"none\"")
+
+                WebDriverWait(self.web_driver, 3600).until(lambda strdiff: self.web_driver.execute_script(
+                    "return document.getElementById(\"case-info-area\").className") != "READY")
+                i_case_status = self.web_driver.find_element_by_id(
+                    "case-info-area").get_attribute("class")
+                self.web_driver.execute_script(
+                    "document.getElementById(\"case-info-area\").className = \"READY\"")
+                if i_case_status in [STR_PASS, STR_FAIL, STR_BLOCK]:
+                    self.tests_json['cases'][i_case]['result'] = i_case_status
+                    i_case = i_case + 1
+                elif i_case_status == "FORWARD":
+                    i_case = i_case + 1
+                elif i_case_status == "BACK":
+                    i_case = i_case - 1
+                else:
+                    break
+            except Exception as e:
+                self.tests_json['cases'][i_case]['result'] = STR_BLOCK
+                self.TE_LOG.error("Run %s: failed: %s, exit from executer" %
+                                  (self.tests_json['cases'][i_case]['case_id'], e))
+                break
+
+    def __checkPageNotFound(self, page_url=None):
+        try:
+            if self.web_driver.current_url.find('data:text/html,chromewebdata') >= 0:
+                self.TE_LOG.debug("Page not found: %s" %
+                              self.web_driver.current_url)
+                return False
+            else:
+                return True
+        except Exception as e:
+            self.TE_LOG.error("Failed to get current url")
+            return False
+
+    def __runRefTests(self, haha=None, kkkk=None):
+        for i_case in self.tests_json['cases']:
+            with EXE_LOCK:
+                if self.exe_status == 'DONE':
+                    return False
+
+            i_case['start_at'] = time.strftime(
+                "%Y-%m-%d %H:%M:%S", time.localtime())
+            try:
+                i_case_timeout = i_case['timeout']
+            except Exception as e:
+                i_case_timeout = DEFAULT_TIMEOUT
+
+            i_page_url = '%s%s' % (self.test_prefix, i_case['entry'])
+            try:
+                self.web_driver.set_page_load_timeout(i_case_timeout)
+                self.web_driver.implicitly_wait(i_case['onload_delay'])
+                self.web_driver.get(i_page_url)
+            except Exception as e:
+                i_case['result'] = STR_BLOCK
+                self.TE_LOG.info(
+                    "Cases %s: blocked by %s" % (i_case['case_id'], e))
+                i_case['end_at'] = time.strftime(
+                    "%Y-%m-%d %H:%M:%S", time.localtime())
+                continue
+
+            if not self.__checkPageNotFound(i_page_url):
+                i_case['result'] = STR_BLOCK
+                self.TE_LOG.info(
+                    "Cases %s: blocked, page not found" % i_case['case_id'])
+                i_case['end_at'] = time.strftime(
+                    "%Y-%m-%d %H:%M:%S", time.localtime())
+                i_case['stdout'] = "page not found"
+                continue
+
+            try:
+                test01_md5 = hashlib.md5(
+                    self.web_driver.get_screenshot_as_base64()).hexdigest().upper()
+            except Exception as e:
+                i_case['result'] = STR_BLOCK
+                self.TE_LOG.info(
+                    "Cases %s: blocked by %s" % (i_case['case_id'], e))
+                i_case['end_at'] = time.strftime(
+                    "%Y-%m-%d %H:%M:%S", time.localtime())
+                continue
+
+            try:
+                i_refer_case_timeout = i_case['refer_timeout']
+            except Exception as e:
+                i_refer_case_timeout = DEFAULT_TIMEOUT
+
+            i_ref_page_url = '%s%s' % (self.test_prefix, i_case['refer_entry'])
+            try:
+                self.web_driver.set_page_load_timeout(i_refer_case_timeout)
+                self.web_driver.implicitly_wait(i_case['onload_delay'])
+                self.web_driver.get(i_ref_page_url)
+            except Exception as e:
+                i_case['result'] = STR_BLOCK
+                self.TE_LOG.info(
+                    "Cases %s: blocked by %s" % (i_case['case_id'], e))
+                i_case['end_at'] = time.strftime(
+                    "%Y-%m-%d %H:%M:%S", time.localtime())
+                continue
+
+            if not self.__checkPageNotFound(i_ref_page_url):
+                i_case['result'] = STR_BLOCK
+                self.TE_LOG.info(
+                    "Cases %s: blocked, ref page not found" % i_case['case_id'])
+                i_case['end_at'] = time.strftime(
+                    "%Y-%m-%d %H:%M:%S", time.localtime())
+                continue
+
+            try:
+                test02_md5 = hashlib.md5(
+                    self.web_driver.get_screenshot_as_base64()).hexdigest().upper()
+            except Exception as e:
+                i_case['result'] = STR_BLOCK
+                self.TE_LOG.info(
+                    "Cases %s: blocked by %s" % (i_case['case_id'], e))
+                i_case['end_at'] = time.strftime(
+                    "%Y-%m-%d %H:%M:%S", time.localtime())
+                continue
+
+            if test01_md5 == test02_md5:
+                i_case['result'] = STR_PASS
+            else:
+                i_case['result'] = STR_FAIL
+
+    def __getCaseIndex(self, url):
+        try:
+            value_pos = url.rindex('value')
+            if value_pos == -1:
+                return 0
+            eq_value = url[value_pos:]
+            eq_index = eq_value.index('=')
+            if eq_index == -1:
+                return 0
+            sub_value = eq_value[eq_index + 1:]
+            if sub_value is not None:
+                return sub_value
+        except Exception as e:
+            return 0
+
+    def __checkUrlSame(self, pre_url, url):
+        try:
+            if pre_url == '' or url == '':
+                return False
+
+            index_pre_url = pre_url.index('?')
+            if index_pre_url == -1:
+                return False
+            ab_pre_url = pre_url[0:index_pre_url]
+
+            index_url = url.index('?')
+            if index_url == -1:
+                return False
+            ab_url = url[0:index_url]
+            if ab_pre_url == ab_url:
+                return True
+            else:
+                return False
+        except Exception:
+            return False
+
+    def __runJSTests(self, haha=None, kkkk=None):
+        element_index = -1
+        for i_case in self.tests_json['cases']:
+            element_index += 1
+            with EXE_LOCK:
+                if self.exe_status == 'DONE':
+                    return False
+            i_case['start_at'] = time.strftime(
+                "%Y-%m-%d %H:%M:%S", time.localtime())
+            try:
+                sub_index = 0
+                url_equal = False
+                if element_index:
+                    pre_url = self.tests_json['cases'][
+                        element_index - 1]['entry']
+                    url_equal = self.__checkUrlSame(pre_url, i_case['entry'])
+                i_case_timeout = i_case['timeout']
+            except Exception as e:
+                i_case_timeout = DEFAULT_TIMEOUT
+            #self.test_prefix = '/home/app/.config/xwalk-service/applications/css3backgr.WebAPICSS3BackgroundsTests'
+            i_page_url = '%s%s' % (self.test_prefix, i_case['entry'])
+            try:
+                self.web_driver.set_page_load_timeout(i_case_timeout)
+                sub_index = self.__getCaseIndex(i_case['entry'])
+                if not url_equal:
+                    self.web_driver.implicitly_wait(i_case['onload_delay'])
+                    self.web_driver.get(i_page_url)
+            except Exception as e:
+                print('exception')
+                i_case['result'] = STR_BLOCK
+                self.TE_LOG.debug(
+                    "Cases %s: blocked by %s" % (i_case['case_id'], e))
+                i_case['end_at'] = time.strftime(
+                    "%Y-%m-%d %H:%M:%S", time.localtime())
+                continue
+
+            if not self.__checkPageNotFound(i_page_url):
+                i_case['result'] = STR_BLOCK
+                self.TE_LOG.info(
+                    "Cases %s: blocked, page not found" % i_case['case_id'])
+                i_case['end_at'] = time.strftime(
+                    "%Y-%m-%d %H:%M:%S", time.localtime())
+                i_case['stdout'] = "page not found"
+                continue
+
+            try:
+                if sub_index:
+                    sub_index = int(sub_index) - 1
+                table = self.web_driver.find_element_by_xpath(
+                    "//table[@id='results']")
+                tr = table.find_elements_by_xpath(".//tbody/tr")[sub_index]
+                sub_result = tr.find_elements_by_xpath(".//td")[0].text
+                error_message = tr.find_elements_by_xpath(".//td")[2].text
+                if sub_result.upper() == 'PASS':
+                    i_case['result'] = STR_PASS
+                elif sub_result.upper() == 'FAIL':
+                    i_case['result'] = STR_FAIL
+                    i_case['stdout'] = error_message
+                else:
+                    i_case['result'] = STR_BLOCK
+                i_case['end_at'] = time.strftime(
+                    "%Y-%m-%d %H:%M:%S", time.localtime())
+            except Exception as e:
+                try:
+                    result = self.web_driver.find_element_by_class_name('pass')
+                except:
+                    i_case['result'] = STR_FAIL
+                else:    
+                    if result.text == STR_FAIL:
+                        i_case['result'] = STR_FAIL
+                    elif result.text == STR_PASS:
+                        i_case['result'] = STR_PASS
+                    else:
+                        i_case['result'] = STR_BLOCK
+                i_case['end_at'] = time.strftime(
+                    "%Y-%m-%d %H:%M:%S", time.localtime())
+
+    def __runScriptTests(self, haha=None, kkkk=None):
+        for i_case in self.tests_json['cases']:
+            with EXE_LOCK:
+                if self.exe_status == 'DONE':
+                    return False
+            try:
+                i_case_timeout = int(i_case['timeout'])
+            except Exception as e:
+                i_case_timeout = DEFAULT_TIMEOUT
+
+            try:
+                i_case_proc = subprocess.Popen(
+                    args="%s" % i_case['entry'], shell=True)
+                i_case_pre_time = time.time()
+                while True:
+                    i_case_exit_code = i_case_proc.poll()
+                    i_case_elapsed_time = time.time() - i_case_pre_time
+                    if i_case_exit_code == None:
+                        if i_case_elapsed_time >= i_case_timeout:
+                            tr_utils.KillAllProcesses(ppid=i_case_proc.pid)
+                            i_case['result'] = STR_BLOCK
+                            self.TE_LOG.debug(
+                                "Run %s timeout" % i_case['case_id'])
+                            break
+                    elif str(i_case_exit_code) == str(i_case['expected_result']):
+                        i_case['result'] = STR_PASS
+                        break
+                    else:
+                        i_case['result'] = STR_FAIL
+                        break
+                    time.sleep(1)
+            except Exception as e:
+                i_case['result'] = STR_BLOCK
+                self.TE_LOG.error(
+                    "Run %s: failed: %s, exit from executer" % (i_case['case_id'], e))
+                break
+
+    def __runTests(self, haha=None, kkkk=None):
+        for i_case in self.tests_json['cases']:
+            i_case['result'] = STR_NOTRUN
+        if self.set_exetype == "manual":
+            self.__runWebManualTests()
+        elif self.set_type == REF_SET_TYPE:
+            self.__runRefTests()
+        elif self.set_type == JS_SET_TYPE:
+            self.__runJSTests()
+        elif self.set_type == SCRIPT_SET_TYPE:
+            self.__runScriptTests()
+
+        with EXE_LOCK:
+            self.exe_status = 'DONE'
+
+        return True
+
+    def runTestsExecuter(self):
+        if not self.set_type in [REF_SET_TYPE, JS_SET_TYPE, SCRIPT_SET_TYPE]:
+            self.TE_LOG.error(
+                "Unsupported set type %s, exit from executer" % self.set_type)
+            return False
+
+        if self.set_type in [REF_SET_TYPE, JS_SET_TYPE]:
+            try:
+                if not self.__initWebDriver():
+                    if self.web_driver:
+                        self.web_driver.quit()
+                        self.web_driver = None
+                    self.TE_LOG.error("Exit from executer")
+                    return False
+            except Exception as e:
+                if self.web_driver:
+                    self.web_driver.quit()
+                self.TE_LOG.error(
+                    "Init Web Driver failed: %s, exit from executer" % e)
+                return False
+
+        while True:
+            if not tr_utils.pidExists(self.runner_proc):
+                if self.set_type in [REF_SET_TYPE, JS_SET_TYPE]:
+                    if self.web_driver:
+                        self.web_driver.quit()
+                        self.web_driver = None
+                self.TE_LOG.debug('Can not find runner, exit from executer')
+                return False
+            exe_command, exe_data = self.__talkWithRunnerRecv()
+            if exe_command == 'GET_STATUS':
+                with EXE_LOCK:
+                    self.__talkWithRunnerSend(
+                        {'COMMAND': exe_command, 'DATA': self.exe_status})
+            elif exe_command == 'TESTS':
+                with EXE_LOCK:
+                    self.exe_status = 'RUNNING'
+                self.tests_json = exe_data['data']
+                self.exe_thread = _thread.start_new_thread(
+                    self.__runTests, (1, 2))
+                self.__talkWithRunnerSend(
+                    {'COMMAND': exe_command, 'DATA': 'OK'})
+            elif exe_command == 'GET_RESULTS':
+                if not self.__talkWithRunnerSend({'COMMAND': exe_command, 'DATA': self.tests_json}):
+                    continue
+                with EXE_LOCK:
+                    self.exe_status = 'READY'
+            elif exe_command == 'TERMINAL':
+                if self.web_driver:
+                    self.web_driver.quit()
+                    self.web_driver = None
+                with EXE_LOCK:
+                    self.exe_status = 'DONE'
+                self.__talkWithRunnerSend(
+                    {'COMMAND': exe_command, 'DATA': 'OK'})
+            else:
+                continue
+
+    def EndExecuter(self):
+        if self.web_driver:
+            self.web_driver.quit()
+            self.web_driver = None
+            return True
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/engines/webdriver.py b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/engines/webdriver.py
new file mode 100644 (file)
index 0000000..cfe1391
--- /dev/null
@@ -0,0 +1,338 @@
+
+#!/usr/bin/python
+#
+# Copyright (C) 2012 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# Authors:
+#           Chengtao,Liu  <chengtaox.liu@intel.com>
+""" The implementation of default test engine"""
+import os
+import time
+import sys
+import json
+import socket
+import shutil
+import uuid
+import threading
+import re
+import configparser
+from datetime import datetime
+from tempfile import mktemp
+import xml.etree.ElementTree as etree
+from testkitlite.engines import test_executer
+from shutil import copyfile
+from testkitlite.util import tr_utils
+from testkitlite.util.log import LOGGER
+from testkitlite.util.result import TestSetResut
+
+EXECUTER_POLLING_INTERVAL = 2
+CNT_RETRY = 10
+
+
+def initExecuter(test_env=None):
+    TE = test_executer.TestExecuter(test_env)
+    TE.runTestsExecuter()
+
+
+def _run_webdrvier_test(self, cases, result_obj):
+    """
+        process the execution for web api test
+        may be splitted to serveral blocks,
+        with the unit size defined by block_size
+    """
+    case_count = len(cases)
+    blknum = 0
+    if case_count % self.opts['block_size'] == 0:
+        blknum = case_count / self.opts['block_size']
+    else:
+        blknum = case_count / self.opts['block_size'] + 1
+
+    idx = 1
+    test_set_queues = []
+    while idx <= blknum:
+        block_data = {}
+        start = (idx - 1) * self.opts['block_size']
+        if idx == blknum:
+            end = case_count
+        else:
+            end = idx * self.opts['block_size']
+        block_data = cases[start:end]
+        for tc in block_data:
+            tc.pop('purpose')
+        test_set_queues.append({'cases': block_data})
+        idx += 1
+
+    self.testcases = []
+    get_result = False
+    abort_from_set = False
+
+    for section_json in test_set_queues:
+        if result_obj.get_status() == 1:
+            break
+        LOGGER.info("Load a new section for testing, please wait ...")
+        get_result = False
+        while True:
+            if result_obj.get_status() == 1:
+                break
+            exe_command, exe_data = self.talkWithEXE(
+                'GET_STATUS', '', 0)
+            if exe_command == 'GET_STATUS':
+                if exe_data == 'READY':
+                    exe_command, exe_data = self.talkWithEXE(
+                        'TESTS', {'data': section_json}, 0)
+                    if exe_command != 'TESTS' or exe_data != 'OK':
+                        LOGGER.debug('Send tests failed')
+                        result_obj.set_status(1)
+                        break
+                    continue
+                elif exe_data == 'RUNNING':
+                    time.sleep(EXECUTER_POLLING_INTERVAL)
+                    continue
+                elif exe_data == 'DONE':
+                    exe_command, exe_data = self.talkWithEXE(
+                        'GET_RESULTS', '', 0)
+                    if exe_data is not None and len(exe_data):
+                        result_obj.extend_result(exe_data['cases'])
+                    get_result = True
+                    break
+                elif exe_data == 'ERROR':
+                    LOGGER.error('Executer got error')
+                    get_result = True
+                    result_obj.set_status(1)
+                    break
+            else:
+                abort_from_set = True
+                result_obj.set_status(1)
+                break
+        if abort_from_set:
+            LOGGER.error('Exit from current set execution')
+            return
+    ### normally exit
+    result_obj.set_status(1)
+    exe_command, exe_data = self.talkWithEXE(
+        'TERMINAL', '', 1)
+
+
+class TestWorker(object):
+
+    """Test executor for testkit-lite"""
+
+    def __init__(self, conn):
+        super(TestWorker, self).__init__()
+        self.conn = conn
+        self.server_url = None
+        self.result_obj = None
+        self.opts = dict({'block_size': 10,
+                          'test_type': None,
+                          'exe_socket_buff_size': 20480,
+                          'runner_proc': os.getpid(),
+                          })
+        self.testcases = []
+        self.runner_proc = self.opts['runner_proc']
+        self.exe_socket_file = os.path.expanduser(
+            "~") + os.sep + str(self.runner_proc) + '.socket'
+        self.exe_proc = None
+        self.exe_socket = None
+        self.exe_socket_connect = None
+
+    def init_test(self, params):
+        """init the test envrionment"""
+        self.opts['testset_name'] = params.get('testset-name', '')
+        self.opts['suite_name'] = params.get('testsuite-name', '')
+        self.opts['debug_log_base'] = params.get("debug-log-base", '')
+        self.opts['wd_url'] = params.get("wd_url", '')
+        self.opts['target_platform'] = params.get("target_platform", '')
+        self.opts['set_type'] = params.get("set_type", '')
+        self.opts['set_exetype'] = params.get("set_exetype", '')
+        self.opts['session_dir'] = params.get("session_dir", '')
+        self.opts['log_debug'] = params.get("log_debug", '')
+        self.opts['exe_socket_file'] = self.exe_socket_file
+        test_launcher = params.get('test-launcher', None) or 'xwalk'
+        test_extension = params.get('test-extension', None)
+        test_widget = params.get('test-widget', None)
+        #kill stub
+        self.conn.kill_stub()
+        # get app id from commodule
+        _opts = self.conn.get_launcher_opt(test_launcher, test_extension, test_widget, self.opts['suite_name'], self.opts['testset_name'])
+        self.opts['appid'] = _opts.get("test_app_id", '') if _opts else ''
+        #self.opts['debugip'] = params.get("debugip", '')
+        self.opts['debugip'] = os.environ.get("wd-debugip", '')
+
+        if not self.__exitExecuter():
+            LOGGER.debug('__exitExecuter failed')
+            return None
+
+        if self.__initExecuterSocket():
+            time.sleep(EXECUTER_POLLING_INTERVAL)
+            if (not self.exe_proc) or (not tr_utils.pidExists(self.exe_proc)):
+                LOGGER.debug('Executer not existing')
+                return None
+            else:
+                timecnt = 0
+                blaunched = False
+                while timecnt < CNT_RETRY:
+                    exe_command, exe_data = self.talkWithEXE(
+                        'GET_STATUS', '', 0)
+                    if exe_command == 'GET_STATUS':
+                        if exe_data == 'READY':
+                            blaunched = True
+                            break
+                    else:
+                        timecnt += 1
+                if not blaunched:
+                    LOGGER.info("[ launch webdriver failed! ]")
+                    return None
+                else:
+                    return str(uuid.uuid1())
+
+    def __initExecuter(self):
+        try:
+            new_proc = os.fork()
+
+            if new_proc == 0:
+                initExecuter(self.opts)
+                sys.exit(0)
+            else:
+                self.exe_proc = new_proc
+                LOGGER.debug('Runner Proc: %s, Executer Proc: %s' %
+                          (self.runner_proc, self.exe_proc))
+                return True
+        except OSError as e:
+            return False
+
+    def __exitExecuter(self):
+        if self.exe_socket:
+            self.exe_socket_connect.close()
+            self.exe_socket.close()
+        self.exe_socket = None
+        try:
+            os.remove(self.exe_socket_file)
+        except Exception as e:
+            pass
+
+        if self.exe_proc and tr_utils.pidExists(self.exe_proc):
+            if not tr_utils.KillAllProcesses(self.exe_proc):
+                return False
+        self.exe_proc = None
+        return True
+
+    def __initExecuterSocket(self):
+        if not self.exe_socket:
+            try:
+                os.remove(self.exe_socket_file)
+            except OSError:
+                pass
+            try:
+                self.exe_socket = socket.socket(
+                    socket.AF_UNIX, socket.SOCK_STREAM)
+                self.exe_socket.bind(self.exe_socket_file)
+                self.exe_socket.listen(1)
+            except Exception as e:
+                LOGGER.error('Setup socket failed')
+                return False
+            if not self.__initExecuter():
+                LOGGER.error('Init Executer failed')
+                if self.exe_proc and tr_utils.pidExists(self.exe_proc):
+                    killProcGroup(self.exe_proc)
+                self.exe_proc = None
+                self.exe_socket.close()
+                self.exe_socket = None
+                return False
+            self.exe_socket_connect, addr = self.exe_socket.accept()
+        return True
+
+    def talkWithEXE(self, command=None, data=None, recv_timeout=None):
+        # LOGGER.debug('Start send: %s, %s' % (command, data))
+        try:
+            if self.exe_socket is None:
+                return (None, None)
+            self.exe_socket.settimeout(recv_timeout)
+            self.exe_socket_connect.send(
+                json.dumps({'COMMAND': command, 'DATA': data}))
+            exe_data = self.exe_socket_connect.recv(
+                self.opts['exe_socket_buff_size'])
+            if not exe_data:
+                return (None, None)
+            exe_json = json.loads(exe_data)
+            if exe_json['COMMAND']:
+                command = exe_json['COMMAND']
+            if exe_json['DATA']:
+                data = exe_json['DATA']
+        except Exception as e:
+            LOGGER.error('Talk with executer failed: %s, kill executer' % e)
+            self.__exitExecuter()
+            return (None, None)
+
+        return (command, data)
+
+    def __saveSectionToSetJSON(self, testcases, exe_data):
+        if exe_data:
+            for i_case in exe_data['cases']:
+                testcases.append(i_case)
+
+        return testcases
+
+    def run_test(self, sessionid, test_set):
+        """
+            process the execution for a test set
+        """
+        if sessionid is None:
+            return False
+
+        if not "cases" in test_set:
+            return False
+
+        if len(test_set["cases"]) == 0:
+            return False
+
+        self.result_obj = TestSetResut(
+            self.opts['suite_name'], self.opts['testset_name'])
+        cases, exetype, ctype = test_set[
+            "cases"], test_set["exetype"], test_set["type"]
+
+        self.opts['async_th'] = threading.Thread(
+            target=_run_webdrvier_test,
+            args=(self, cases, self.result_obj)
+        )
+        self.opts['async_th'].start()
+        return True
+
+    def get_test_status(self, sessionid):
+        """poll the test task status"""
+        if sessionid is None:
+            return None
+        result = {}
+        result["msg"] = []
+        result["finished"] = str(self.result_obj.get_status())
+        return result
+
+    def get_test_result(self, sessionid):
+        """get the test result for a test set """
+        result = {}
+        if sessionid is None:
+            return result
+
+        result = self.result_obj.get_result()
+        return result
+
+    def finalize_test(self, sessionid):
+        """clear the test stub and related resources"""
+        if sessionid is None:
+            return False
+
+        if self.result_obj is not None:
+            self.result_obj.set_status(1)
+
+        # remove socketfile
+
+        return True
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/util/CONFIG b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/util/CONFIG
new file mode 100644 (file)
index 0000000..e6b6d74
--- /dev/null
@@ -0,0 +1,8 @@
+[LOGGING]
+log_level=INFO
+
+[EXTENSION]
+crosswalk=--external-extensions-path=/usr/lib/tizen-extensions-crosswalk
+
+[TIZEN]
+tizen_user=app
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/util/Makefile.am b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/util/Makefile.am
new file mode 100644 (file)
index 0000000..dd646f7
--- /dev/null
@@ -0,0 +1,18 @@
+# Copyright (C) 2012 Intel Corporation
+# 
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# Authors:
+#              Zhang, Huihui <huihuix.zhang@intel.com>
+#              Wendong,Sui  <weidongx.sun@intel.com>
+
+testkitliteutildir = /usr/lib/python2.7/dist-packages/testkitlite/util
+dist_testkitliteutil_SCRIPTS = *.py
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/util/__init__.py b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/util/__init__.py
new file mode 100644 (file)
index 0000000..8b13789
--- /dev/null
@@ -0,0 +1 @@
+
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/util/autoexec.py b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/util/autoexec.py
new file mode 100644 (file)
index 0000000..92c0e7b
--- /dev/null
@@ -0,0 +1,132 @@
+#!/usr/bin/python
+#
+# Copyright (C) 2012 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# Authors:
+#              Liu,chengtao <chengtaox.liu@intel.com>
+""" The shell command executor module"""
+
+import os
+import sys
+import time
+import subprocess
+
+from .log import LOGGER
+from testkitlite.util.killall import killall
+from testkitlite.util.str2 import str2str
+
+
+def shell_command(cmd, timeout=15):
+    """shell communication for quick return in sync mode"""
+    proc = subprocess.Popen(cmd,
+                            shell=True,
+                            stdout=subprocess.PIPE,
+                            stderr=subprocess.PIPE)
+    time_cnt = 0
+    exit_code = None
+    result = []
+    while time_cnt < timeout:
+        exit_code = proc.poll()
+        if not exit_code is None:
+            break
+        time_cnt += 0.2
+        time.sleep(0.2)
+
+    if exit_code is None:
+        killall(proc.pid)
+        exit_code = -1
+        result = []
+    elif not cmd.endswith('&'):
+        while True:
+            line = proc.stdout.readline().decode('utf-8')
+            if not line or line.find('daemon started') >= 0:
+                break
+            result.append(line)
+    return [exit_code, result]
+
+
+def shell_command_ext(cmd="",
+                      timeout=None,
+                      boutput=False,
+                      stdout_file=None,
+                      stderr_file=None,
+                      callbk=None):
+    """shell executor, return [exitcode, stdout/stderr]
+       timeout: None means unlimited timeout
+       boutput: specify whether print output during the command running
+    """
+    if stdout_file is None:
+        stdout_file = os.path.expanduser("~") + os.sep + "shell_stdout"
+
+    if stderr_file is None:
+        stderr_file = os.path.expanduser("~") + os.sep + "shell_stderr"
+
+    exit_code = None
+    wbuffile1 = open(stdout_file, "wb")
+    wbuffile2 = open(stderr_file, "wb")
+    rbuffile1 = open(stdout_file, "r")
+    rbuffile2 = open(stderr_file, "r")
+    cmd_open = subprocess.Popen(args=cmd,
+                                shell=True,
+                                stdout=wbuffile1,
+                                stderr=wbuffile2)
+    rbuffile1.seek(0)
+    rbuffile2.seek(0)
+
+    def print_log():
+        """print the stdout to terminate"""
+        if callbk and callable(callbk):
+            callbk(rbuffile1.read())
+        else:
+            sys.stdout.write(rbuffile1.read())
+            sys.stdout.write(rbuffile2.read())
+            sys.stdout.flush()
+
+    while True:
+        exit_code = cmd_open.poll()
+        if exit_code is not None:
+            break
+        if boutput:
+            print_log()
+        if timeout is not None:
+            timeout -= 0.1
+            if timeout <= 0:
+                exit_code = "timeout"
+                killall(cmd_open.pid)
+                time.sleep(3)
+                break
+        time.sleep(0.1)
+
+    if boutput:
+        print_log()
+    rbuffile1.seek(0)
+    rbuffile2.seek(0)
+    try:
+        stdout_log = str2str(rbuffile1.read()).decode("utf-8")
+    except:
+        LOGGER.info("Cannot decode bytes using utf-8, hence using latin-1 decoder")
+        stdout_log = str2str(rbuffile1.read()).decode("latin-1")
+    stderr_log = str2str(rbuffile2.read()).decode("utf-8")
+    if 'returncode=' in stdout_log:
+        index = stdout_log.find('returncode=') + 11
+        exit_code = str(stdout_log[index:]).strip('\r\n')
+    stdout_log = '<![CDATA[' + stdout_log + ']]>'
+    stderr_log = '<![CDATA[' + stderr_log + ']]>'
+
+    wbuffile1.close()
+    wbuffile2.close()
+    rbuffile1.close()
+    rbuffile2.close()
+    os.remove(stdout_file)
+    os.remove(stderr_file)
+    return [exit_code, stdout_log, stderr_log]
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/util/config.py b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/util/config.py
new file mode 100644 (file)
index 0000000..6fc2f50
--- /dev/null
@@ -0,0 +1,45 @@
+#!/usr/bin/python
+#
+# Copyright (C) 2013 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# Authors:
+#              Liu,chengtao <liux.chengtao@intel.com>
+"""General Config Class"""
+
+import os
+import configparser
+from configparser import NoOptionError, NoSectionError
+
+CONFIG_FILE = "/opt/testkit/lite_web_csharp/testkitlite/commodule/CONFIG"
+cfg = configparser.ConfigParser()
+if os.path.exists(CONFIG_FILE):
+    cfg.read(CONFIG_FILE)
+else:
+    cfg.read(os.path.join(os.getcwd(), "CONFIG"))
+
+
+class Config:
+
+    LOG_LEVEL = cfg.get('LOGGING', 'log_level')
+
+    @staticmethod
+    def get_extension(extension_name):
+        ret = ""
+        try:
+            if extension_name is not None:
+                ret = cfg.get('EXTENSION', extension_name)
+        except (NoOptionError, NoSectionError) as error:
+            pass
+        except IOError as error:
+            pass
+        return ret
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/util/connector.py b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/util/connector.py
new file mode 100644 (file)
index 0000000..73dda7c
--- /dev/null
@@ -0,0 +1,47 @@
+#!/usr/bin/python
+#
+# Copyright (C) 2013 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# Authors:
+#              Liu,chengtao <chengtaox.liu@intel.com>
+"""Test connector for test instance and target instance"""
+
+from testkitlite.util.log import LOGGER
+from ..commodule.tizenmobile import get_target_conn as tizenmobile_conn
+from ..commodule.localhost import get_target_conn as localhost_conn
+
+class ConnectorBuilder:
+
+    """Communication module for test host and test remote"""
+
+    def __init__(self, config):
+        self.conn = None
+        if "commodule" in config:
+            try:
+                #exec("from testkitlite.commodule.%s import get_target_conn" % config[
+                 #   "commodule"])
+                if config["commodule"]=="tizenmobile":
+                    get_target_conn = tizenmobile_conn
+                else:
+                    get_target_conn = localhost_conn
+                device_no = config.get('deviceid', None)
+                if device_no is not None:
+                    self.conn = get_target_conn(device_no)
+                else:
+                    self.conn = get_target_conn()
+            except Exception as error:
+                LOGGER.error("[ Error: Initialize commodule failed: '%s']\n" % error)
+
+    def get_connector(self):
+        """list the handler instance"""
+        return self.conn
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/util/errors.py b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/util/errors.py
new file mode 100644 (file)
index 0000000..7475dc7
--- /dev/null
@@ -0,0 +1,50 @@
+#!/usr/bin/python
+#
+# Copyright (C) 2013 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# Authors:
+#              Liu,chengtao <liux.chengtao@intel.com>
+""" The definition of exceptions"""
+
+
+class InvalidDeviceException(Exception):
+    """ 
+    Device_Id not defined / Invalid Exception
+    """
+    __data = ""
+    def __init__(self, data):
+        self.__data = data
+
+    def __str__(self):
+        return self.__data
+
+class TestCaseNotFoundException(Exception):
+    """
+    Test case not found Exception
+    """
+    __data = ""
+    def __init__(self, data):
+        self.__data = data
+
+    def __str__(self):
+        return self.__data
+
+class TestEngineException(Exception):
+    """
+    Test case not found Exception
+    """
+    def __init__(self, name):
+        self.__engine = name
+
+    def __str__(self):
+        return "Failed to load test engine '%s'" % self.__engine
\ No newline at end of file
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/util/httprequest.py b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/util/httprequest.py
new file mode 100644 (file)
index 0000000..9069fe3
--- /dev/null
@@ -0,0 +1,58 @@
+#!/usr/bin/python
+#
+# Copyright (C) 2012 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# Authors:
+#           Liu,chengtao <chengtaox.liu@intel.com>
+""" The http request process module"""
+
+import json
+from testkitlite.util.log import LOGGER
+
+try:
+    import requests
+except ImportError as err:
+    LOGGER.info("Failed to import 'requests' module, please check your installation:")
+    LOGGER.info("  You can use 'sudo pip install requests' to install the module!")
+    raise ImportError
+
+def get_url(baseurl, api):
+    """get full url string"""
+    return "%s%s" % (baseurl, api)
+
+
+def http_request(url, rtype="POST", data=None, time_out=30):
+    """
+    http request to the device http server
+    """
+    result = None
+    if rtype == "POST":
+        headers = {'content-type': 'application/json'}
+        try:
+            ret = requests.post(url, data=json.dumps(
+                data), headers=headers, timeout=time_out)
+
+            if ret:
+                result = ret.json()
+        except Exception as error:
+            LOGGER.error(str(error))
+            pass
+    elif rtype == "GET":
+        try:
+            ret = requests.get(url, params=data, timeout=time_out)
+            if ret:
+                result = ret.json()
+        except Exception as error:
+            LOGGER.error(str(error))
+            pass
+    return result
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/util/killall.py b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/util/killall.py
new file mode 100644 (file)
index 0000000..32309cc
--- /dev/null
@@ -0,0 +1,70 @@
+#!/usr/bin/python
+#
+# Copyright (C) 2012 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# Authors:
+#              Zhang, Huihui <huihuix.zhang@intel.com>
+#              Wendong,Sui  <weidongx.sun@intel.com>
+""" The process kill for os"""
+
+import os
+import platform
+import signal
+import re
+import ctypes
+
+
+def killall(ppid):
+    """Kill all children process by parent process ID"""
+    os_ver = platform.system()
+    try:
+        if os_ver == "Linux" or os_ver == "Darwin":
+            ppid = str(ppid)
+            pidgrp = []
+            if not ppid.isdigit():
+                return
+            def getchildpids(ppid):
+                """Return a list of children process"""
+                command = "ps -ef | awk '{if ($3 == %s) print $2;}'" % str(
+                    ppid)
+                pids = os.popen(command).read()
+                pids = pids.split()
+                return pids
+
+            pidgrp.extend(getchildpids(ppid))
+            for pid in pidgrp:
+                pidgrp.extend(getchildpids(pid))
+            # Insert self process ID to PID group list
+            pidgrp.insert(0, ppid)
+            while len(pidgrp) > 0:
+                pid = pidgrp.pop()
+                try:
+                    os.kill(int(pid), signal.SIGKILL)
+                except OSError as error:
+                    pattern = re.compile('No such process')
+                    match = pattern.search(str(error))
+                    if not match:
+                        print("[ Error: fail to kill pid: %s," \
+                            " error: %s ]\n" % (int(pid), error))
+        # kill for windows platform
+        else:
+            kernel32 = ctypes.windll.kernel32
+            handle = kernel32.OpenProcess(1, 0, int(ppid))
+            kernel32.TerminateProcess(handle, 0)
+    except OSError as error:
+        pattern = re.compile('No such process')
+        match = pattern.search(str(error))
+        if not match:
+            print("[ Error: fail to kill pid: %s, error: %s ]\n" \
+                % (int(ppid), error))
+    return None
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/util/log.py b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/util/log.py
new file mode 100644 (file)
index 0000000..cf51f96
--- /dev/null
@@ -0,0 +1,101 @@
+#!/usr/bin/python
+#
+# Copyright (C) 2013 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# Authors:
+#              Liu,chengtao <liux.chengtao@intel.com>
+"""General Implementation"""
+
+import threading
+import logging
+import logging.handlers
+import sys
+import os
+
+# logger levels
+LEVELS = {"CRITICAL": 50,
+          "ERROR": 40,
+          "WARNING": 30,
+          "INFO": 20,
+          "DEBUG": 10,
+          "NOTSET": 0
+          }
+
+
+class Logger:
+
+    """General Logger Class"""
+    _instance = None
+    _mutex = threading.Lock()
+
+    def __init__(self, level="DEBUG", format_str="%(message)s"):
+        """Generate root logger"""
+        self._logger = logging.getLogger("TCT")
+        self._level = LEVELS[level]
+        self._logger.setLevel(LEVELS[level])
+        self._formatter = logging.Formatter(format_str)
+        self.add_print_logger()
+
+    def add_print_logger(self, level="INFO"):
+        """Generate console writer [StreamHandler]"""
+        writer = logging.StreamHandler(sys.stdout)
+        writer.setLevel(LEVELS[level])
+        writer.setFormatter(self._formatter)
+        self._logger.addHandler(writer)
+
+    @staticmethod
+    def get_logger(level="DEBUG", format_str="%(message)s"):
+        """sinlgeton of Logger"""
+        if Logger._instance is None:
+            Logger._mutex.acquire()
+            if Logger._instance is None:
+                Logger._instance = Logger(level, format_str)
+            else:
+                pass
+            Logger._mutex.release()
+        return Logger._instance
+
+    def debug(self, msg):
+        """debug level message"""
+        if msg is not None:
+            sys.stdout.write(msg + '\r\n')
+            sys.stdout.flush()
+
+    def info(self, msg):
+        """info level message"""
+        if msg is not None:
+            if (type(msg) == bytes):
+                sys.stdout.write(msg.decode('utf-8') + '\r\n')
+            else:
+                sys.stdout.write(msg + '\r\n')
+            sys.stdout.flush()
+
+    def warning(self, msg):
+        """warning level message"""
+        if msg is not None:
+            self._logger.warning(msg)
+
+    def error(self, msg):
+        """error level message"""
+        if msg is not None:
+            sys.stdout.write(msg + '\r\n')
+            sys.stdout.flush()
+
+    def critical(self, msg):
+        """critical level message"""
+        if msg is not None:
+            self._logger.critical(msg)
+
+from .config import Config
+
+LOGGER = Logger.get_logger(level=Config.LOG_LEVEL)
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/util/process.py b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/util/process.py
new file mode 100644 (file)
index 0000000..5000bae
--- /dev/null
@@ -0,0 +1,99 @@
+#!/usr/bin/python
+#
+# Copyright (C) 2012 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# Authors:
+#              Yuanyuan,Zou  <yuanyuanx.zou@intel.com>
+
+""" kill testkit-lite """
+import os
+import re
+import platform
+if not platform.system() == "Windows":
+    import dbus
+
+import time
+from testkitlite.util.log import LOGGER
+from testkitlite.util.killall import killall
+from testkitlite.util.autoexec import shell_command
+
+DEVICE_DBUS = "testkit-lite-dbus"
+DEVICE_WHITE_LIST = ['localhost', '127.0.0.1']
+
+
+def kill_testkit_lite(pid_file):
+    """ kill testkit lite"""
+    try:
+        with open(pid_file, "r") as pidfile:
+            pid = pidfile.readline().rstrip("\n")
+            if pid:
+                killall(pid)
+    except IOError as error:
+        pattern = re.compile('No such file or directory|No such process')
+        match = pattern.search(str(error))
+        if not match:
+            LOGGER.info("[ Error: fail to kill existing testkit-lite, "\
+                "error: %s ]\n" % error)
+    return None
+
+def launch_dbus_deamon():
+    exit_code, ret = shell_command(DEVICE_DBUS + '&')
+    time.sleep(3)
+
+def get_device_lock(device_id):
+    if not OS_VER == "Windows":
+        LOGGER.debug("method using dbus is not implemented on windows")
+        return True
+
+    """ set device lock for current testkit lite"""
+    if device_id in DEVICE_WHITE_LIST:
+        return True
+    bus = dbus.SessionBus()
+    try:
+        device_service = bus.get_object('com.intel.testkit', '/com/intel/testkit/devices')
+    except Exception as error:
+        launch_dbus_deamon()
+        device_service = bus.get_object('com.intel.testkit', '/com/intel/testkit/devices')
+
+    try:
+        ret = device_service.addDevice(device_id)
+        return bool(ret)
+    except Exception as error:
+        return False
+
+def release_device_lock(device_id):
+    if not OS_VER == "Linux" and not OS_VER == "Darwin":
+        LOGGER.debug("method using dbus is not implemented on windows")
+        return True
+
+    """ kill testkit lite"""
+    if device_id in DEVICE_WHITE_LIST:
+        return True
+    bus = dbus.SessionBus()
+    try:
+        device_service = bus.get_object('com.intel.testkit', '/com/intel/testkit/devices')
+        ret = device_service.removeDevice(device_id)
+        return True
+    except Exception as error:
+        return False
+
+def clean_testxml(testxmls,remote_test):
+    """clean all test xmls"""
+    if remote_test:
+        EXISTS = os.path.exists
+        for testxml in testxmls:
+            if EXISTS(testxml):
+                fd_name = os.path.dirname(testxml)
+                os.remove(testxml)
+                os.rmdir(fd_name)
+    return None
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/util/result.py b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/util/result.py
new file mode 100644 (file)
index 0000000..1f9f0ba
--- /dev/null
@@ -0,0 +1,76 @@
+#!/usr/bin/python
+#
+# Copyright (C) 2012 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# Authors:
+#           Chengtao,Liu  <chengtaox.liu@intel.com>
+""" The implementation test result"""
+
+import threading
+from testkitlite.util.log import LOGGER
+from testkitlite.util.str2 import str2str
+
+
+class TestSetResut(object):
+
+    """ test result """
+
+    _progress = "execute case: %s # %s...(%s)"
+    _mutex = threading.Lock()
+
+    def __init__(self, testsuite_name="", testset_name=""):
+        self._suite_name = testsuite_name
+        self._set_name = testset_name
+        self._result = {"cases": []}
+        self._finished = 0
+
+    def set_status(self, flag=0):
+        """set finished tag"""
+        self._mutex.acquire()
+        self._finished = flag
+        self._mutex.release()
+
+    def get_status(self):
+        """return finished tag"""
+        self._mutex.acquire()
+        flag = self._finished
+        self._mutex.release()
+        return flag
+
+    def set_result(self, tresult):
+        """set cases result to result buffer"""
+        self._mutex.acquire()
+        self._result = tresult
+        self._mutex.release()
+
+    def extend_result(self, cases_result=None, print_out=True):
+        """update cases result to the result buffer"""
+        self._mutex.acquire()
+        if cases_result is not None:
+            self._result["cases"].extend(cases_result)
+
+        if print_out:
+            for case_it in cases_result:
+                LOGGER.info(self._progress %
+                            (self._suite_name, case_it['case_id'], case_it['result']))
+                if case_it['result'].lower() in ['fail', 'block'] and 'stdout' in case_it:
+                    LOGGER.info(str2str(case_it['stdout']))
+        self._mutex.release()
+
+    def get_result(self):
+        """get cases result from the result buffer"""
+        self._mutex.acquire()
+        result = self._result
+        self._mutex.release()
+    
+        return result
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/util/session.py b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/util/session.py
new file mode 100644 (file)
index 0000000..8bedd1d
--- /dev/null
@@ -0,0 +1,1635 @@
+#!/usr/bin/env python3
+#
+# Copyright (C) 2012 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# Authors:
+#              Zhang, Huihui <huihuix.zhang@intel.com>
+#              Wendong,Sui  <weidongx.sun@intel.com>
+#              Yuanyuan,Zou  <zouyuanx@intel.com>
+""" prepare run , split xml ,run case , merge result """
+import traceback
+import os
+import platform
+import time
+import sys
+from datetime import datetime
+from shutil import copyfile
+import xml.etree.ElementTree as etree
+import configparser
+from tempfile import mktemp
+from shutil import move
+from os import remove
+import copy
+import re
+from testkitlite.util.log import LOGGER
+from testkitlite.util.str2 import str2xmlstr
+from testkitlite.util.errors import TestCaseNotFoundException
+from testkitlite.util.errors import TestEngineException
+
+if platform.system().startswith("Linux"):
+    import fcntl
+if platform.system().startswith("Windows"):
+    import win32con
+    import win32file
+    import pywintypes
+
+
+
+
+
+JOIN = os.path.join
+DIRNAME = os.path.dirname
+BASENAME = os.path.basename
+EXISTS = os.path.exists
+ABSPATH = os.path.abspath
+
+# test constants
+OPT_LAUNCHER = 'test-launcher'
+OPT_EXTENSION = 'test-extension'
+OPT_DEBUG_LOG = 'debug-log-base'
+OPT_CAPABILITY = 'capability'
+OPT_DEBUG = 'debug'
+OPT_RERUN = 'rerun'
+OPT_WIDGET = 'test-widget'
+OPT_STUB = 'stub-name'
+OPT_STUB_PORT = 'stub-port'
+OPT_SUITE = 'testsuite-name'
+OPT_SET = 'testset-name'
+OPT_test_set_src = 'test-set-src'
+
+TCT_CONFIG_FILE = "/opt/tools/TCT_CONFIG"
+tct_parser = configparser.ConfigParser()
+tct_parser.read(TCT_CONFIG_FILE)
+
+DEVICE_SUITE_TARGET_30 = tct_parser.get('DEVICE', 'DEVICE_SUITE_TARGET_30')
+DEVICE_EXECUTION_MODE_30 = tct_parser.get('DEVICE', 'DEVICE_EXECUTION_MODE_30')
+DEVICE_SUITE_TARGET_30_STR = "{DEVICE_SUITE_TARGET_30}"
+DEVICE_EXECUTION_MODE_30_STR = "{DEVICE_EXECUTION_MODE_30}"
+
+class TestSession:
+
+    """
+    Parse the testdefinition.xml files.
+    Apply filter for each run.
+    Conduct tests execution.
+    """
+
+    def __init__(self, connector, worker):
+        """ init all self parameters here """
+        # dryrun
+        self.bdryrun = False
+        # non_active
+        self.non_active = False
+        # result file
+        self.resultfile = None
+        # external test
+        self.external_test = None
+        # filter rules
+        self.filter_rules = None
+        self.debug = False
+        self.resultfiles = set()
+        self.core_auto_files = []
+        self.core_manual_files = []
+        self.unit_test_files = []
+        self.skip_all_manual = False
+        self.testsuite_dict = {}
+        self.exe_sequence = []
+        self.testresult_dict = {"pass": 0, "fail": 0,
+                                "block": 0, "not_run": 0}
+        self.current_test_xml = "none"
+        self.first_run = True
+        self.deviceid = None
+        self.session_id = None
+        self.set_parameters = {}
+        self.connector = connector
+        self.stub_name = "testkit-stub"
+        self.testworker = worker
+        self.capabilities = {}
+        self.has_capability = False
+        self.rerun = False
+        self.test_prefix = ""
+        self.filter_ok = False
+        #self.wdurl = ""
+        #self.debugip =  ""
+        self.targetplatform =  ""
+        self.system = platform.system()
+        self.tizenV = None
+        self.stub_port = "8000"
+        self.skip_tc = None
+
+    def set_global_parameters(self, options):
+        "get all options "
+        # apply dryrun
+        if options.bdryrun:
+            self.bdryrun = options.bdryrun
+        # Disable set the result of core manual cases from the console
+        if options.non_active:
+            self.non_active = options.non_active
+        # apply user specify test result file
+        if options.resultfile:
+            self.resultfile = options.resultfile
+        # set the external test
+        if options.exttest:
+            self.external_test = options.exttest
+        if options.debug:
+            self.debug = options.debug
+        if options.rerun:
+            self.rerun = options.rerun
+        if options.test_prefix:
+            self.test_prefix = options.test_prefix
+        if options.device_serial:
+            self.deviceid = options.device_serial
+        if options.tc_timeout:
+            self.tc_timeout = options.tc_timeout[0]
+        else:
+            self.tc_timeout = None
+        if options.worker:
+            self.worker_name = options.worker
+        else:
+            self.worker_name = None
+        LOGGER.info("TIMEOUT : "+str(self.tc_timeout))
+        #if options.targetplatform:
+        self.targetplatform = os.environ.get("targetplatform",'')
+        #modify the wdurl value, yangx.zhou@intel.com, 2014.09.18
+        #if options.wdurl:
+        #    self.wdurl = options.wdurl
+        #if options.debugip:
+        #    self.debugip = options.debugip
+
+    def add_filter_rules(self, **kargs):
+        """
+        kargs:  key:values - "":["",]
+        """
+        self.filter_rules = kargs
+
+    def set_session_id(self, session_id):
+        """ set the set test session id which is get form com_module """
+        self.session_id = session_id
+
+    def set_stubport(self, stubport):
+        self.stub_port = stubport
+
+    def set_tizenversion(self, tizenversion):
+        self.tizenV = tizenversion
+        self.testworker.set_TizenVersion(self.tizenV)
+
+    def set_skip_tc(self, skip_tc):
+        self.skip_tc = skip_tc
+
+    def set_capability(self, capabilities):
+        """ set capabilitys  """
+        self.capabilities = capabilities
+        self.has_capability = True
+
+    def prepare_run(self, testxmlfile, resultdir=None):
+        """
+        testxmlfile: target testxml file
+        execdir and resultdir: should be the absolute path since TestSession
+        is the common lib
+        """
+        # resultdir is set to current directory by default
+        if not resultdir:
+            resultdir = os.getcwd()
+        self.session_dir = resultdir
+        try:
+            filename = testxmlfile
+            filename = os.path.splitext(filename)[0]
+            os_ver = platform.system()
+            if os_ver == "Linux" or os_ver == "Darwin":
+                file_items = filename.split('/')
+            else:
+                file_items = re.split(r'[/\\]+', filename)
+            if len(file_items) < 2 or file_items[-2] == "" or file_items[-1] == "":
+                return False
+            filename = file_items[-2] + '_' + file_items[-1]
+            if self.filter_rules["execution_type"] == ["manual"]:
+                resultfile = "%s.manual.xml" % filename
+            else:
+                resultfile = "%s.auto.xml" % filename
+            resultfile = JOIN(resultdir, resultfile)
+            if not EXISTS(resultdir):
+                os.mkdir(resultdir)
+            LOGGER.info("[ analysis test xml file: %s ]" % resultfile)
+            self.__prepare_result_file(testxmlfile, resultfile)
+            self.__split_test_xml(resultfile, resultdir)
+        except IOError as error:
+            LOGGER.error(error)
+            return False
+        return True
+
+    def __split_test_xml(self, resultfile, resultdir):
+        """ split_test_xml into auto and manual"""
+        setfind = etree.parse(resultfile).iter('set')
+        if setfind:
+            test_file_name = "%s" % BASENAME(resultfile)
+            test_file_name = os.path.splitext(test_file_name)[0]
+            self.__splite_external_test(
+                resultfile, test_file_name, resultdir)
+
+    def __splite_external_test(self, resultfile, test_file_name, resultdir):
+        """select external_test"""
+        testsuite_dict_value_list = []
+        testsuite_dict_add_flag = 0
+        filename_diff = 1
+
+        parser = etree.parse(resultfile)
+        for tsuite in parser.iter('suite'):
+            root = etree.Element('test_definition')
+            suitefilename = os.path.splitext(resultfile)[0]
+            suitefilename += ".suite_%s.xml" % filename_diff
+            suitefilename = JOIN(resultdir, suitefilename)
+            tsuite.tail = "\n"
+            root.append(tsuite)
+            try:
+                with open(suitefilename, 'wb') as output:
+                    tree = etree.ElementTree(element=root)
+                    tree.write(output)
+            except IOError as error:
+                LOGGER.error("[ Error: create filtered result file: %s failed,\
+                 error: %s ]" % (suitefilename, error))
+            case_suite_find = etree.parse(
+                suitefilename).iter('testcase')
+            if case_suite_find:
+                #add by yangx.zhou@intel.com. 2014.09.12
+                if(tsuite.find('set') != None):
+                    set_type = tsuite.find('set').get('type')
+                    if set_type == 'script' or set_type == 'pyunit' or set_type == 'androidunit':
+                        if set_type  == 'script':
+                            self.external_test = None
+                        if self.filter_rules["execution_type"] == ["auto"]:
+                            self.core_auto_files.append(suitefilename)
+                        else:
+                            self.core_manual_files.append(suitefilename)
+                        self.resultfiles.add(suitefilename)
+
+                    #if tsuite.get('launcher'):
+                    elif set_type in ['js', 'ref','wrt', 'qunit']:
+                    #elif set_type in ['js','wrt', 'qunit']:
+                        testsuite_dict_value_list.append(suitefilename)
+                        if testsuite_dict_add_flag == 0:
+                            self.exe_sequence.append(test_file_name)
+                        testsuite_dict_add_flag = 1
+                        self.resultfiles.add(suitefilename)
+
+                    #elif set_type =='ref' and self.worker_name == "webdriver":
+                    #     testsuite_dict_value_list.append(suitefilename)
+                    #     if testsuite_dict_add_flag == 0:
+                    #         self.exe_sequence.append(test_file_name)
+                    #     testsuite_dict_add_flag = 1
+                    #     self.resultfiles.add(suitefilename)
+
+                    else:
+                        if self.filter_rules["execution_type"] == ["auto"]:
+                            self.core_auto_files.append(suitefilename)
+                        else:
+                            self.core_manual_files.append(suitefilename)
+                        self.resultfiles.add(suitefilename)
+            else:
+                self.unit_test_files.append(suitefilename)
+                self.resultfiles.add(suitefilename)
+
+            filename_diff += 1
+        if testsuite_dict_add_flag:
+            self.testsuite_dict[test_file_name] = testsuite_dict_value_list
+
+    def __prepare_result_file(self, testxmlfile, resultfile):
+        """ write the test_xml content to resultfile"""
+        try:
+            parse_tree = etree.parse(testxmlfile)
+            suiteparent = parse_tree.getroot()
+            no_test_definition = 1
+            if parse_tree.iter('test_definition'):
+                no_test_definition = 0
+            if no_test_definition:
+                suiteparent = etree.Element('test_definition')
+                suiteparent.tail = "\n"
+                for suite in parse_tree.iter('suite'):
+                    suite.tail = "\n"
+                    suiteparent.append(suite)
+            self.apply_filter(suiteparent)
+            try:
+                with open(resultfile, 'wb') as output:
+                    tree = etree.ElementTree(element=suiteparent)
+                    tree.write(output)
+            except IOError as error:
+                LOGGER.error("[ Error: create filtered result file: %s failed,\
+                    error: %s ]" % (resultfile, error))
+        except IOError as error:
+            LOGGER.error(error)
+            return False
+
+    def run_case(self, latest_dir):
+        """ run case """
+        # case not found
+        case_ids = self.filter_rules.get('id')
+        #print 'disable dlog', self.disabledlog
+        if case_ids and not self.filter_ok:
+            raise TestCaseNotFoundException('Test case %s not found!' % case_ids)
+
+        # run core auto cases
+        self.__run_core_auto()
+
+        # run webAPI cases
+        self.__run_webapi_test(latest_dir)
+
+        # run core manual cases
+        self.__run_core_manual()
+
+        # run unit test cases
+        self.__run_unit_test()
+
+    def __run_core_auto(self):
+        """ core auto cases run"""
+        self.core_auto_files.sort()
+        for core_auto_file in self.core_auto_files:
+            temp_test_xml = os.path.splitext(core_auto_file)[0]
+            temp_test_xml = os.path.splitext(temp_test_xml)[0]
+            temp_test_xml = os.path.splitext(temp_test_xml)[0]
+            temp_test_xml += ".auto"
+            # print identical xml file name
+            if self.current_test_xml != temp_test_xml:
+                time.sleep(3)
+                LOGGER.info("\n[ testing xml: %s.xml ]" % temp_test_xml)
+                self.current_test_xml = temp_test_xml
+            self.__run_with_worker(core_auto_file)
+
+    def __run_core_manual(self):
+        """ core manual cases run """
+        self.core_manual_files.sort()
+        for core_manual_file in self.core_manual_files:
+            temp_test_xml = os.path.splitext(core_manual_file)[0]
+            temp_test_xml = os.path.splitext(temp_test_xml)[0]
+            temp_test_xml = os.path.splitext(temp_test_xml)[0]
+            temp_test_xml += ".manual"
+            # print identical xml file name
+            if self.current_test_xml != temp_test_xml:
+                time.sleep(3)
+                LOGGER.info("\n[ testing xml: %s.xml ]" % temp_test_xml)
+                self.current_test_xml = temp_test_xml
+            if self.non_active:
+                self.skip_all_manual = True
+            else:
+                self.__run_with_worker(core_manual_file)
+
+    def __run_unit_test(self):
+        """ unit test cases run """
+        for ut_file in self.unit_test_files:
+            temp_test_xml = os.path.splitext(ut_file)[0]
+            temp_test_xml = os.path.splitext(temp_test_xml)[0]
+            temp_test_xml = os.path.splitext(temp_test_xml)[0]
+            temp_test_xml += ".auto"
+            # print identical xml file name
+            if self.current_test_xml != temp_test_xml:
+                time.sleep(3)
+                LOGGER.info("\n[ testing xml: %s.xml ]" % temp_test_xml)
+                self.current_test_xml = temp_test_xml
+                self.__run_with_worker(ut_file)
+
+    def __run_webapi_test(self, latest_dir):
+        """ run webAPI test"""
+        if self.bdryrun:
+            LOGGER.info("[ Web Test mode does not support dryrun ]")
+            return True
+
+        list_auto = []
+        list_manual = []
+        for i in self.exe_sequence:
+            if i[-4::1] == "auto":
+                list_auto.append(i)
+            if i[-6::1] == "manual":
+                list_manual.append(i)
+        list_auto.sort()
+        list_manual.sort()
+        self.exe_sequence = []
+        self.exe_sequence.extend(list_auto)
+        self.exe_sequence.extend(list_manual)
+
+        for webapi_total_file in self.exe_sequence:
+            for webapi_file in self.testsuite_dict[webapi_total_file]:
+                # print identical xml file name
+                if self.current_test_xml != JOIN(latest_dir, webapi_total_file):
+                    time.sleep(3)
+                    LOGGER.info("\n[ testing xml: %s.xml ]\n"
+                                % JOIN(latest_dir, webapi_total_file))
+                    self.current_test_xml = JOIN(latest_dir, webapi_total_file)
+
+                self.__run_with_worker(webapi_file)
+
+    def __run_with_worker(self, suite_test_xml):
+        """run_with_commodule,Initialization,check status,get result"""
+        try:
+            # prepare test set list
+            test_xml_set_list = self.__split_xml_to_set(suite_test_xml)
+            # create temporary parameter
+            for test_xml_set in test_xml_set_list:
+                LOGGER.info("\n[ run set: %s ]" % test_xml_set)
+                # prepare the test JSON
+                self.__prepare_external_test_json(test_xml_set)
+
+                # init test here
+                init_status = self.__init_com_module(test_xml_set)
+                if not init_status:
+                    continue
+                # send set JSON Data to com_module
+               # if not self.worker_name and self.set_parameters['type'] == 'ref':
+               #     continue
+               # else:
+                u_ret = self.testworker.run_test(self.session_id, self.set_parameters)
+                if not u_ret:
+                    continue
+                while True:
+                    time.sleep(1)
+                    # check the test status ,if the set finished,get
+                    # the set_result,and finalize_test
+                    if self.__check_test_status():
+                        set_result = self.testworker.get_test_result(
+                            self.session_id)
+                        # write_result to set_xml
+                        self.__write_set_result(
+                            test_xml_set, set_result)
+                        # shut down server
+                        self.finalize_test(self.session_id)
+                        break
+        except IOError as error:
+            LOGGER.error(
+                "[ Error: fail to run webapi test xml, error: %s ]" % error)
+
+    def __split_xml_to_set(self, webapi_file):
+        """split xml by <set>"""
+
+        LOGGER.debug("[ split xml: %s by <set> ]" % webapi_file)
+        LOGGER.debug("[ this might take some time, please wait ]")
+        set_number = 1
+        test_xml_set_list = []
+        self.resultfiles.discard(webapi_file)
+        test_xml_temp = etree.parse(webapi_file)
+        for test_xml_temp_suite in test_xml_temp.iter('suite'):
+            while set_number <= len(test_xml_temp_suite.findall('set')):
+                #print 'debug',test_xml_temp_suite.find('set')[set_number].get('type')
+                copy_url = os.path.splitext(webapi_file)[0]
+                copy_url += "_set_%s.xml" % set_number
+                copyfile(webapi_file, copy_url)
+                test_xml_set_list.append(copy_url)
+                self.resultfiles.add(copy_url)
+                set_number += 1
+        time.sleep(3)
+        set_number -= 1
+        LOGGER.info("[ total set number is: %s ]" % set_number)
+
+        # only keep one set in each xml file and remove empty set
+        test_xml_set_list_empty = []
+        if len(test_xml_set_list) > 1:
+            test_xml_set_list.reverse()
+        for test_xml_set in test_xml_set_list:
+            test_xml_set_tmp = etree.parse(test_xml_set)
+            set_keep_number = 1
+            for temp_suite in test_xml_set_tmp.findall('suite'):
+                for test_xml_set_temp_set in temp_suite.findall('set'):
+                    if set_keep_number != set_number:
+                        temp_suite.remove(test_xml_set_temp_set)
+                    else:
+                        if not test_xml_set_temp_set.iter('testcase'):
+                            test_xml_set_list_empty.append(test_xml_set)
+                    set_keep_number += 1
+            set_number -= 1
+            test_xml_set_tmp.write(test_xml_set)
+        for empty_set in test_xml_set_list_empty:
+            LOGGER.debug("[ remove empty set: %s ]" % empty_set)
+            test_xml_set_list.remove(empty_set)
+            self.resultfiles.discard(empty_set)
+        if len(test_xml_set_list) > 1:
+            test_xml_set_list.reverse()
+        return test_xml_set_list
+
+    def lock(self, fl):
+        try:
+            if self.system.startswith("Linux"):
+            #if self.system.startswith("Linux"):
+                fcntl.flock(fl, fcntl.LOCK_EX)
+            else:
+                hfile = win32file._get_osfhandle(fl.fileno())
+                ov = pywintypes.OVERLAPPED()
+                win32file.LockFileEx(hfile, win32con.LOCKFILE_EXCLUSIVE_LOCK, 0, -0x10000, ov)
+        except:
+            print(traceback.print_exc())
+            return False
+        else:
+            return True
+
+    def release(self, fl):
+        if self.system.startswith("Linux"):
+            fcntl.flock(fl, fcntl.LOCK_UN)
+        elif self.system.startswith("Windows"):
+            hfile = win32file._get_osfhandle(fl.fileno())
+            win32file.UnlockFileEx(hfile, 0, -0x10000, pywintypes.OVERLAPPED())        
+
+    def merge_resultfile(self, start_time, latest_dir):
+        """ merge_result_file """
+        mergefile = mktemp(suffix='.xml', prefix='tests.', dir=latest_dir)
+        mergefile = os.path.splitext(mergefile)[0]
+        mergefile = os.path.splitext(mergefile)[0]
+        mergefile = "%s.result" % BASENAME(mergefile)
+        mergefile = "%s.xml" % mergefile
+        mergefile = JOIN(latest_dir, mergefile)
+        end_time = datetime.today().strftime("%Y-%m-%d_%H_%M_%S")
+        LOGGER.info("\n[ test complete at time: %s ]" % end_time)
+        LOGGER.debug("[ start merging test result xml files, "\
+            "this might take some time, please wait ]")
+        LOGGER.debug("[ merge result files into %s ]" % mergefile)
+        root = etree.Element('test_definition')
+        root.tail = "\n"
+        totals = set()
+
+        # merge result files
+        resultfiles = self.resultfiles
+        totals = self.__merge_result(resultfiles, totals)
+        for total in totals:
+            result_xml = etree.parse(total)
+            for suite in result_xml.iter('suite'):
+                if suite.iter('testcase'):
+                    suite.tail = "\n"
+                    root.append(suite)
+
+        # print test summary
+        self.__print_summary()
+        # generate actual xml file
+        LOGGER.info("[ generate result xml: %s ]" % mergefile)
+        if self.skip_all_manual:
+            LOGGER.info("[ some results of core manual cases are N/A,"
+                        "please refer to the above result file ]")
+        LOGGER.info("[ merge complete, write to the result file,"
+                    " this might take some time, please wait ]")
+        # get useful info for xml
+        # add environment node
+        # add summary node
+        root.insert(0, get_summary(start_time, end_time))
+        root.insert(0, self.__get_environment())
+        # add XSL support to testkit-lite
+        declaration_text = """<?xml version="1.0" encoding="UTF-8"?>\n"""
+        try:
+            with open(mergefile, 'w') as output:
+                output.write(declaration_text)
+            with open(mergefile, 'ab') as output:
+                tree = etree.ElementTree(element=root)
+                tree.write(output, xml_declaration=False, encoding='utf-8')
+        except IOError as error:
+            LOGGER.error(
+                "[ Error: merge result file failed, error: %s ]" % error)
+        # change &lt;![CDATA[]]&gt; to <![CDATA[]]>
+        replace_cdata(mergefile)
+        # copy result to -o option
+        self._final_merge(mergefile)
+
+    def _final_merge(self, mergefile):
+        try:
+            if self.resultfile:
+                if os.path.splitext(self.resultfile)[-1] == '.xml':
+                    if not EXISTS(os.path.dirname(self.resultfile)):
+                        if len(os.path.dirname(self.resultfile)) > 0:
+                            os.makedirs(os.path.dirname(self.resultfile))
+                    LOGGER.info("[ copy result xml to output file: %s ]" % self.resultfile)
+                    copyfile(mergefile, self.resultfile)
+                else:
+                    LOGGER.info(
+                        "[ Please specify and xml file for result output,"
+                        " not:%s ]" % self.resultfile)
+        except IOError as error:
+            LOGGER.error("[ Error: fail to copy the result file to: %s,"
+                         " please check if you have created its parent directory,"
+                         " error: %s ]" % (self.resultfile, error))
+    '''
+                    if not EXISTS(self.resultfile):
+                        if not EXISTS(DIRNAME(self.resultfile)):
+                            if len(DIRNAME(self.resultfile)) > 0:
+                                os.makedirs(DIRNAME(self.resultfile))
+                        LOGGER.info("[ copy result xml to output file:"
+                                    " %s ]" % self.resultfile)
+                        copyfile(mergefile, self.resultfile)
+
+                    else:
+                        suite_total = {}
+                        #print 'result file path : ' , self.resultfile
+                        xml_element_tree = etree.parse(self.resultfile).getroot()
+                        for suite in xml_element_tree.getiterator('suite'):
+                            suite_name = suite.get('name').strip()
+                            #print suite_name,'suite_name'
+                            if suite_name:
+                                if suite_name not in suite_total.keys():
+                                    suite_total[suite_name] = []
+                                    for set in suite.getiterator('set'):
+                                        set_name = set.get('name').strip()
+                                        if set_name:
+                                                                       suite_total['%s' %suite_name].append(set_name)
+    
+                        if xml_element_tree is not None:
+                            #f = open(self.resultfile, 'w')
+                            while True:
+                                    #self.lock(f)
+                                f = open(self.resultfile, 'w')
+                                if  self.lock(f):
+                                    time.sleep(1)
+                                                                   #pass
+
+                                    root = etree.parse(mergefile).getroot()
+                                    for suite in root.getiterator('suite'):
+                                        suite_name = suite.get('name').strip()
+                                        if suite_name in suite_total.keys():
+                                            for set in suite.getiterator('set'):
+                                                set_name = set.get('name').strip()
+                                                if set_name in suite_total[suite_name]:
+                                                 #   for testcase in set.getiterator('testcase'):
+                                                    for dest_suite in xml_element_tree.getiterator('suite'):
+                                                        if cmp(dest_suite.get('name').strip(),suite_name) ==0:
+                                                            for dest_set in dest_suite.getiterator('set'):
+                                                                if cmp(dest_set.get('name').strip(),set_name) == 0:  
+                                                    #xml_element_tree.find(suite).find(set).append(testcase)
+                                                                    for testcase in set.getiterator('testcase'):
+                                                                        dest_set.append(testcase)
+                                                else:
+                                                    for dest_suite in xml_element_tree.getiterator('suite'):
+                                                        if cmp(dest_suite.get('name').strip(),suite_name) ==0:
+                                                            dest_suite.append(set)
+                                                            suite_total[suite_name].append(set_name)
+                                        else:
+                                            xml_element_tree.append(suite)
+                                            suite_total[suite_name] = []
+                                            for set in suite.getiterator('set'):
+                                                if set.get('name'):
+                                                    suite_total[suite_name].append(set.get('name'))
+                                   try:
+                                           f.write(etree.tostring(xml_element_tree))
+                                   except:
+                                           self.release(f)
+                                           LOGGER.Warning("[ can not write to result file:" " %s]" %self.resultfile)
+                                           break
+                                    else:
+                                        self.release(f)
+                                        f.close()
+                                        try:
+                                            root = etree.parse(self.resultfile).getroot()
+                                        except:
+                                            break
+                                        else:
+                                            self.testresult_dict = {"pass":0 , "fail":0, "block":0, "not_run": 0}
+                                            for result_testcase in root.getiterator("testcase"):
+                                                if result_testcase.get("result") == "PASS":
+                                                    self.testresult_dict["pass"] += 1
+                                                if result_testcase.get("result") == "FAIL":
+                                                    self.testresult_dict["fail"] += 1
+                                                if result_testcase.get("result") == "BLOCK":
+                                                    self.testresult_dict["block"] += 1
+                                                if result_testcase.get("result").lower() == "NOT_RUN":
+                                                    self.testresult_dict["not_run"] += 1
+                                            self.__print_summary()      
+                                            break
+                                else:
+                                    time.sleep(1)
+                                    self.lock(f)
+    '''
+
+    def __merge_result(self, setresultfiles, totals):
+        """ merge set result to total"""
+        resultfiles = setresultfiles
+        for resultfile in resultfiles:
+            totalfile = os.path.splitext(resultfile)[0]
+            totalfile = os.path.splitext(totalfile)[0]
+            totalfile = os.path.splitext(totalfile)[0]
+            totalfile = "%s.total" % totalfile
+            totalfile = "%s.xml" % totalfile
+            total_xml = etree.parse(totalfile)
+            # LOGGER.info("|--[ merge webapi result file: %s ]" % resultfile)
+            result_xml = etree.parse(resultfile)
+            root = result_xml.getroot()
+            for total_suite in total_xml.iter('suite'):
+                for total_set in total_suite.iter('set'):
+                    for result_suite in result_xml.iter('suite'):
+                        for result_set in result_suite.iter('set'):
+                            # when total xml and result xml have same suite, set
+                           # print result_set.get('type'),'debug',resultfile
+                            if result_set.get('type') =='pyunit':
+                                for test_case in result_set.iter('testcase'):
+                                    #print test_case.find('description/test_script_entry').text
+                                    if (test_case.find('description/test_script_entry') is not None) and test_case.find('description/test_script_entry').text:
+                                        result_set.remove(test_case)
+                                self.__merge_result_by_name(
+                                    result_set, total_set, result_suite, total_suite)
+                            else:
+                                self.__merge_result_by_name(
+                                    result_set, total_set, result_suite, total_suite)
+            total_xml.write(totalfile)
+            totals.add(totalfile)
+        return totals
+
+    def __merge_result_by_name(
+            self, result_set, total_set, result_suite, total_suite):
+        ''' merge result select by name'''
+        if result_set.get('name') == total_set.get('name') \
+                and result_suite.get('name') == total_suite.get('name'):
+            if result_set.get('set_debug_msg'):
+                total_set.set("set_debug_msg", result_set.get('set_debug_msg'))
+            result_case_iterator = result_set.iter(
+                'testcase')
+            if result_case_iterator:
+                for result_case in result_case_iterator:
+                    try:
+                        if self.skip_tc and str(self.skip_tc).find(result_case.get('id')) > -1:
+                            continue
+                        self.__count_result(result_case)
+                        total_set.append(result_case)
+                    except IOError as error:
+                        LOGGER.error("[ Error: fail to append %s, error: %s ]"
+                                     % (result_case.get('id'), error))
+    def __count_result(self, result_case):
+        """ record the pass,failed,block,N/A case number"""
+        if not result_case.get('result'):
+            result_case.set('result', 'N/A')
+            # add empty result node structure for N/A case
+            resinfo_elm = etree.Element('result_info')
+            res_elm = etree.Element('actual_result')
+            start_elm = etree.Element('start')
+            end_elm = etree.Element('end')
+            stdout_elm = etree.Element('stdout')
+            stderr_elm = etree.Element('stderr')
+            resinfo_elm.append(res_elm)
+            resinfo_elm.append(start_elm)
+            resinfo_elm.append(end_elm)
+            resinfo_elm.append(stdout_elm)
+            resinfo_elm.append(stderr_elm)
+            result_case.append(resinfo_elm)
+            res_elm.text = 'N/A'
+        if result_case.get('result') == "PASS":
+            self.testresult_dict["pass"] += 1
+        if result_case.get('result') == "FAIL":
+            self.testresult_dict["fail"] += 1
+        if result_case.get('result') == "BLOCK":
+            self.testresult_dict["block"] += 1
+        if result_case.get('result') == "N/A":
+            self.testresult_dict["not_run"] += 1
+
+    def __get_environment(self):
+        """ get environment """
+        device_info = self.connector.get_device_info()
+        build_infos = self.connector.get_buildinfo(self.tizenV)
+        # add environment node
+        environment = etree.Element('environment')
+        environment.attrib['device_id'] = device_info["device_id"]
+        environment.attrib['device_model'] = device_info["device_model"]
+        environment.attrib['device_name'] = device_info["device_name"]
+        environment.attrib['host'] = platform.platform()
+        environment.attrib['lite_version'] = get_version_info()
+        environment.attrib['resolution'] = device_info["resolution"]
+        environment.attrib['screen_size'] = device_info["screen_size"]
+        environment.attrib['build_id'] = device_info['build_id']
+        LOGGER.info("Build Id Extracted From Device is: " + str(environment.attrib['build_id']))
+        environment.attrib['manufacturer'] = build_infos['manufacturer']
+        other = etree.Element('other')
+        other.text = ""
+        environment.append(other)
+        environment.tail = "\n"
+
+        return environment
+
+    def __print_summary(self):
+        """ print test summary infomation"""
+        LOGGER.info("[ test summary ]")
+        total_case_number = int(self.testresult_dict["pass"]) \
+            + int(self.testresult_dict["fail"]) \
+            + int(self.testresult_dict["block"]) \
+            + int(self.testresult_dict["not_run"])
+        #LOGGER.info("  [ total case number: %s ]" % (total_case_number))
+        if total_case_number == 0:
+            LOGGER.info("[Warning: found 0 case from the result files, "
+                        "if it's not right, please check the test xml files, "
+                        "or the filter values ]")
+        else:
+            LOGGER.info("  [ total case number: %s ]" % (total_case_number))
+            LOGGER.info("  [ pass rate: %.2f%% ]" % (float(
+                self.testresult_dict["pass"]) * 100 / int(total_case_number)))
+            LOGGER.info("  [ PASS case number: %s ]" %
+                        self.testresult_dict["pass"])
+            LOGGER.info("  [ FAIL case number: %s ]" %
+                        self.testresult_dict["fail"])
+            LOGGER.info("  [ BLOCK case number: %s ]" %
+                        self.testresult_dict["block"])
+            LOGGER.info("  [ N/A case number: %s ]" %
+                        self.testresult_dict["not_run"])
+
+    def __prepare_external_test_json(self, resultfile):
+        """Run external test"""
+        parameters = {}
+        xml_set_tmp = resultfile
+        # split set_xml by <case> get case parameters
+        LOGGER.debug("[ split xml: %s by <case> ]" % xml_set_tmp)
+        LOGGER.debug("[ this might take some time, please wait ]")
+        try:
+            parse_tree = etree.parse(xml_set_tmp)
+            root_em = parse_tree.getroot()
+            #tsuite = next(root_em.iter('suite'))[0]
+            case_tmp = []
+            #parameters.setdefault("suite_name", tsuite.get('name'))
+            LOGGER.debug("[rootem start]")
+            for tset in root_em.iter('set'):
+                case_order = 1
+                parameters.setdefault("casecount", str(len(tset.findall('testcase'))))
+                parameters.setdefault("current_set_name", xml_set_tmp)
+                parameters.setdefault("name", tset.get('name'))
+                parameters.setdefault("type", tset.get('type'))
+                parameters.setdefault("exetype", '')
+                #add test set location, yangx.zhou@intel.com
+                parameters.setdefault("location", '')
+                if tset.get("location") is not None:
+                    parameters["location"] = tset.get("location")
+
+               # if tset.get("test_set_src") is not None:
+               #     set_entry = self.test_prefix + tset.get("test_set_src")
+               #     parameters.setdefault("test_set_src", set_entry)
+
+                for tcase in tset.iter('testcase'):
+                    if self.skip_tc and str(self.skip_tc).find(tcase.get('id')) > -1:
+                        continue
+
+                    case_detail_tmp = {}
+                    step_tmp = []
+                    parameters["exetype"] = tcase.get('execution_type')
+                    case_detail_tmp.setdefault("case_id", tcase.get('id'))
+                    case_detail_tmp.setdefault("purpose", tcase.get('purpose'))
+                    case_detail_tmp.setdefault("order", str(case_order))
+                    case_detail_tmp.setdefault("onload_delay", "3")
+                    if self.tc_timeout is not None:
+                        case_detail_tmp.setdefault("timeout", self.tc_timeout)
+                    if parameters["location"] != '':
+                        case_detail_tmp.setdefault("location", parameters["location"])
+                    else:
+                        case_detail_tmp.setdefault("location", "device")
+
+                    if tcase.find('description/test_script_entry') is not None:
+                        tc_entry = tcase.find(
+                            'description/test_script_entry').text
+                        if not tc_entry:
+                            tc_entry = ""
+
+                        tc_entry = tc_entry.replace(DEVICE_SUITE_TARGET_30_STR,DEVICE_SUITE_TARGET_30)
+                        tc_entry = tc_entry.replace(DEVICE_EXECUTION_MODE_30_STR,DEVICE_EXECUTION_MODE_30)
+
+                        case_detail_tmp["entry"] = self.test_prefix + tc_entry
+                        #if case_detail_tmp["timeout"] is None:
+                        if tcase.find(
+                            'description/test_script_entry').get('timeout'):
+                            case_detail_tmp["timeout"] = tcase.find(
+                                'description/test_script_entry'
+                            ).get('timeout')
+                        if tcase.find(
+                            'description/test_script_entry'
+                        ).get('test_script_expected_result'):
+                            case_detail_tmp["expected_result"] = tcase.find(
+                                'description/test_script_entry'
+                            ).get('test_script_expected_result')
+                        if tcase.find(
+                            'description/test_script_entry'
+                        ).get('location'):
+                            case_detail_tmp["location"] = tcase.find(
+                                'description/test_script_entry'
+                            ).get('location')
+                    tc_refer_entry = ""
+                    if tcase.find('description/refer_test_script_entry') is not None:
+                        tc_refer_entry = tcase.find(
+                            'description/refer_test_script_entry').text
+
+                    case_detail_tmp["refer_entry"] = tc_refer_entry
+
+                    if tcase.find('description/refer_test_script_entry')is not None:
+                        case_detail_tmp["refer_timeout"] = tcase.find(
+                            'description/refer_test_script_entry').get('timeout')
+                    if tcase.find('description/refer_test_script_entry')is not None:
+                        case_detail_tmp["refer_expected_result"] = tcase.find(
+                            'description/refer_test_script_entry').get('test_script_expected_result')
+                    if tcase.find('description/refer_test_script_entry') is not None:
+                        case_detail_tmp["refer_location"] = tcase.find(
+                            'description/refer_test_script_entry').get('location')
+
+                    if tcase.iter("step"):
+                        for this_step in tcase.iter("step"):
+                            step_detail_tmp = {}
+                            step_detail_tmp.setdefault("order", "1")
+                            step_detail_tmp["order"] = str(
+                                this_step.get('order'))
+
+                            if this_step.find("step_desc") is not None:
+                                text = this_step.find("step_desc").text
+                                if text is not None:
+                                    step_detail_tmp["step_desc"] = text
+
+                            if this_step.find("expected") is not None:
+                                text = this_step.find("expected").text
+                                if text is not None:
+                                    step_detail_tmp["expected"] = text
+
+                            step_tmp.append(step_detail_tmp)
+
+                    case_detail_tmp['steps'] = step_tmp
+
+                    if tcase.find('description/pre_condition') is not None:
+                        text = tcase.find('description/pre_condition').text
+                        if text is not None:
+                            case_detail_tmp["pre_condition"] = text
+
+                    if tcase.find('description/post_condition') is not None:
+                        text = tcase.find('description/post_condition').text
+                        if text is not None:
+                            case_detail_tmp['post_condition'] = text
+
+                    if tcase.get('onload_delay') is not None:
+                        case_detail_tmp[
+                            'onload_delay'] = tcase.get('onload_delay')
+                    # Check performance test
+                    if tcase.find('measurement') is not None:
+                        measures = tcase.iter('measurement')
+                        measures_array = []
+                        for measure in measures:
+                            measure_json = {}
+                            measure_json['name'] = measure.get('name')
+                            measure_json['file'] = measure.get('file')
+                            measures_array.append(measure_json)
+                        case_detail_tmp['measures'] = measures_array
+                    case_tmp.append(case_detail_tmp)
+                    case_order += 1
+            parameters.setdefault("cases", case_tmp)
+            if self.bdryrun:
+                parameters.setdefault("dryrun", True)
+            self.set_parameters = parameters
+
+            #add by yangx.zhou@intel.com, 2014.09.11 
+           # if self.worker_name !=None and self.worker_name == 'webdriver':
+           #     value = 'webdriver'
+            value = None
+            if parameters['type']!= None and self.worker_name == None:
+           #     if parameters['type'] == 'script':
+           #         value = 'default'
+                if parameters['type'] == 'androidunit':
+                    value = 'androidunit'
+                    #value ='default'
+                elif parameters['type'] == 'pyunit' :
+                    value = 'pyunit'
+                elif parameters['type'] == 'qunit':
+                    value = 'default'
+            if value != None:
+                try:
+                    exec("from testkitlite.engines.%s import TestWorker" %value)
+                    LOGGER.info("TestWorker is %s" %value)
+                except Exception as error:
+                    #print 'path: ',  os.getcwd()
+                    raise TestEngineException(value)
+                else:
+                    self.testworker = TestWorker(self.connector)
+        except IOError as error:
+            LOGGER.error("[ Error: fail to prepare cases parameters, "
+                         "error: %s ]\n" % error)
+            return False
+        return True
+
+    def apply_filter(self, root_em):
+        """ apply filter """
+        rules = self.filter_rules
+        for tsuite in root_em.iter('suite'):
+            if rules.get('suite'):
+                if tsuite.get('name') not in rules['suite']:
+                    root_em.remove(tsuite)
+            for tset in tsuite.iter('set'):
+                if rules.get('set'):
+                    if tset.get('name') not in rules['set']:
+                        tsuite.remove(tset)
+
+            for tsuite in root_em.findall('suite'):
+                for tset in tsuite.findall('set'):
+                    # if there are capabilities ,do filter
+                    if self.has_capability:
+                        tset_status = self.__apply_capability_filter_set(tset)
+                        if not tset_status:
+                            tsuite.remove(tset)
+                            continue
+                    for tcase in tset.findall('testcase'):
+                        if not self.__apply_filter_case_check(tcase):
+                            tset.remove(tcase)
+                        else:
+                            self.filter_ok = True
+
+    def __apply_filter_case_check(self, tcase):
+        """filter cases"""
+        rules = self.filter_rules
+        for key in rules.keys():
+            if key in ["suite", "set"]:
+                continue
+            # Check attribute
+            t_val = tcase.get(key)
+            if t_val:
+                if not t_val in rules[key]:
+                    return False
+            else:
+                # Check sub-element
+                items = tcase.iter(key)
+                if items:
+                    t_val = []
+                    for i in items:
+                        t_val.append(i.text)
+                    if len(set(rules[key]) & set(t_val)) == 0:
+                        return False
+                else:
+                    return False
+        return True
+
+    def __apply_capability_filter_set(self, tset):
+        """ check the set required capability with  self.capabilities """
+
+        for tcaps in tset.iter('capabilities'):
+            for tcap in tcaps.iter('capability'):
+                capname = None
+                capvalue = None
+                capname = tcap.get('name').lower()
+                if tcap.find('value') is not None:
+                    capvalue = tcap.find('value').text
+
+                if capname in self.capabilities:
+                    if capvalue is not None:
+                        if capvalue != self.capabilities[capname]:
+                            # if capability value is not equal ,remove the case
+                            return False
+                else:
+                    # if does not hava this capability ,remove case
+                    return False
+        return True
+
+    # sdx@kooltux.org: parse measures returned by test script
+    # and insert in XML result
+    # see xsd/test_definition.xsd: measurementType
+    _MEASURE_ATTRIBUTES = ['name', 'value', 'unit',
+                           'target', 'failure', 'power']
+
+    def __insert_measures(self, case, buf, pattern="###[MEASURE]###"):
+        """ get measures """
+        measures = self.__extract_measures(buf, pattern)
+        for measure in measures:
+            m_elm = etree.Element('measurement')
+            for key in measure:
+                m_elm.attrib[key] = measure[key]
+            case.append(m_elm)
+
+    def __extract_measures(self, buf, pattern):
+        """
+        This function extracts lines from <buf> containing the defined
+        <pattern>. For each line containing the pattern, it extracts the
+        string to the end of line Then it splits the content in multiple
+        fields using the defined separator <field_sep> and maps the fields
+        to measurement attributes defined in xsd. Finally, a list containing
+        all measurement objects found in input buffer is returned
+        """
+        out = []
+        for line in buf.split("\n"):
+            pos = line.find(pattern)
+            if pos < 0:
+                continue
+
+            measure = {}
+            elts = collections.deque(line[pos + len(pattern):].split(':'))
+            for k in self._MEASURE_ATTRIBUTES:
+                if len(elts) == 0:
+                    measure[k] = ''
+                else:
+                    measure[k] = elts.popleft()
+
+            # don't accept unnamed measure
+            if measure['name'] != '':
+                out.append(measure)
+        return out
+
+    def __init_com_module(self, testxml):
+        """
+            send init test to com_module
+            if webapi test,com_module will start testkit-stub
+            else com_module send the test case to devices
+        """
+        starup_prms = self.__prepare_starup_parameters(testxml)
+        # init stub and get the session_id
+        session_id = self.testworker.init_test(starup_prms)
+        if session_id == None:
+            LOGGER.error("[ Error: Initialization Error]")
+            return False
+        else:
+            self.set_session_id(session_id)
+            return True
+
+    def __prepare_starup_parameters(self, testxml):
+        """ prepare_starup_parameters """
+
+        starup_parameters = {}
+        LOGGER.info("[ preparing for startup options ]")
+        try:
+            parse_tree = etree.parse(testxml)
+#            tsuite = parse_tree.getroot().iter('suite')[1]
+#            tset = parse_tree.getroot().iter('set')[1]
+            tsuite = next(parse_tree.getroot().iter('suite'))
+            tset = next(parse_tree.getroot().iter('set'))
+            if tset.get("launcher") is not None:
+                 starup_parameters[OPT_LAUNCHER] = tset.get("launcher")
+            else:
+                 starup_parameters[OPT_LAUNCHER] = tsuite.get("launcher")
+
+
+            if self.external_test is not None:
+                starup_parameters[OPT_LAUNCHER] = self.external_test
+                starup_parameters[OPT_EXTENSION] = self.external_test.split(' ')[0]
+
+            tp = tset.get('type')
+
+            if tp == "wrt":
+                starup_parameters[OPT_LAUNCHER] = "xwalk -iu"
+                starup_parameters[OPT_EXTENSION] = "xwalk"
+            elif tp in ['js','qunit', 'ref']:
+                starup_parameters[OPT_LAUNCHER] = "xwalk"
+ #          jh0219.han@samsung.com //in
+            elif tp == "uifw":
+                starup_parameters[OPT_LAUNCHER] = "xwalk -a"
+            elif tp == "uifwr":
+                starup_parameters[OPT_LAUNCHER] = "xwalk -r"
+ #          jh0219.han@samsung.com //out               
+            #print starup_parameters[OPT_LAUNCHER],'debug'    
+           # if self.external_test is not None:
+           #     starup_parameters[OPT_LAUNCHER] = self.external_test
+           #     starup_parameters[OPT_EXTENSION] = self.external_test.split(' ')[0]
+
+            if tsuite.get("extension") is not None:
+                starup_parameters[OPT_EXTENSION] = tsuite.get("extension")
+            if tsuite.get("widget") is not None:
+                starup_parameters[OPT_WIDGET] = tsuite.get("widget")
+            starup_parameters[OPT_SUITE] = tsuite.get("name")
+            starup_parameters[OPT_SET] = tset.get("name")
+            starup_parameters[OPT_STUB] = self.stub_name
+            starup_parameters[OPT_STUB_PORT] = self.stub_port
+            starup_parameters['tizen-version'] =self.tizenV
+
+           # if self.external_test is not None and \
+           # starup_parameters[OPT_LAUNHER].find(self.external_test) == -1:
+           # if self.external_test is not None:
+           #     starup_parameters[OPT_LAUNCHER] = self.external_test
+           #     starup_parameters[OPT_EXTENSION] = self.external_test.split(' ')[0]
+            #print     starup_parameters[OPT_LAUNCHER]
+            starup_parameters[OPT_DEBUG] = self.debug
+            if self.resultfile:
+                debug_dir = DIRNAME(self.resultfile)
+                debug_name = os.path.splitext(BASENAME(self.resultfile))[0]
+                if not EXISTS(debug_dir):
+                    os.makedirs(debug_dir)
+            else:
+                debug_dir = DIRNAME(testxml)
+                debug_name = os.path.splitext(BASENAME(testxml))[0]
+            starup_parameters[OPT_DEBUG_LOG] = JOIN(debug_dir, debug_name)
+            self.debug_log_file = starup_parameters[OPT_DEBUG_LOG] + '.dlog'
+            if self.rerun:
+                starup_parameters[OPT_RERUN] = self.rerun
+            if len(self.capabilities) > 0:
+                starup_parameters[OPT_CAPABILITY] = self.capabilities
+            # for webdriver
+            starup_parameters['target_platform'] = self.targetplatform
+            #starup_parameters['debugip'] = self.debugip
+            #starup_parameters['wd_url'] = self.wdurl
+            starup_parameters['set_type'] = self.set_parameters['type']
+            starup_parameters['set_exetype'] = self.set_parameters['exetype']
+            starup_parameters['session_dir'] = self.session_dir
+            starup_parameters['log_debug'] = self.debug
+            
+        except IOError as error:
+            LOGGER.error(
+                "[ Error: prepare starup parameters, error: %s ]" % error)
+        return starup_parameters
+
+    def __check_test_status(self):
+        '''
+            get_test_status from com_module
+            check the status
+            if end ,return ture; else return False
+        '''
+        # check test running or end
+        # if the status id end return True ,else return False
+        session_status = self.testworker.get_test_status(self.session_id)
+        if not session_status == None:
+            if session_status["finished"] == "0":
+                progress_msg_list = session_status["msg"]
+                for line in progress_msg_list:
+                    LOGGER.info(line)
+                return False
+            elif session_status["finished"] == "1":
+                return True
+        else:
+            LOGGER.error("[ session status error ,pls finalize test ]\n")
+            # return True to finished this set  ,becasue server error
+            return True
+
+    def finalize_test(self, sessionid):
+        '''shut_down testkit-stub'''
+        try:
+            self.testworker.finalize_test(sessionid)
+        except Exception as error:
+            LOGGER.error("[ Error: fail to close webapi http server, "
+                         "error: %s ]" % error)
+
+    def get_capability(self, file_name):
+        """get_capability from file """
+        if file_name is None:
+            return True
+        capability_xml = file_name
+        capabilities = {}
+        try:
+            parse_tree = etree.parse(capability_xml)
+            root_em = parse_tree.getroot()
+            for tcap in root_em.iter('capability'):
+                capability = get_capability_form_node(tcap)
+                capabilities = dict(capabilities, **capability)
+
+            self.set_capability(capabilities)
+            return True
+        except IOError as error:
+            LOGGER.error(
+                "[ Error: fail to parse capability xml, error: %s ]" % error)
+            return False
+
+    def __write_set_result(self, testxmlfile, result):
+        """
+            get the result JSON form com_module,
+            write them to orignal testxmlfile
+        """
+        #print 'debug', set_result
+        # write the set_result to set_xml
+        set_result_xml = testxmlfile
+        # covert JOSN to python dict string
+        set_result = result
+        if 'resultfile' in set_result:
+            write_file_result(set_result_xml, set_result, self.debug_log_file)
+        else:
+            write_json_result(set_result_xml, set_result, self.debug_log_file)
+
+
+def get_capability_form_node(capability_em):
+    ''' splite capability key and value form element tree'''
+    tmp_key = ''
+    capability = {}
+    tcap = capability_em
+    if tcap.get("name"):
+        tmp_key = tcap.get("name").lower()
+
+    if tcap.get("type").lower() == 'boolean':
+        if tcap.get("support").lower() == 'true':
+            capability[tmp_key] = True
+
+    if tcap.get("type").lower() == 'integer':
+        if tcap.get("support").lower() == 'true':
+            if tcap.iter(
+                    "value") and tcap.find("value").text is not None:
+                capability[tmp_key] = int(tcap.find("value").text)
+
+    if tcap.get("type").lower() == 'string':
+        if tcap.get("support").lower() == 'true':
+            if tcap.iter(
+                    "value") and tcap.find("value").text is not None:
+                capability[tmp_key] = tcap.find("value").text
+
+    return capability
+
+
+def get_version_info():
+    """
+        get testkit tool version ,just read the version in VERSION file
+        VERSION file must put in /opt/testkit/lite_web_csharp/
+    """
+    try:
+        config = configparser.ConfigParser()
+        if platform.system() == "Linux":
+            config.read('/opt/testkit/lite_web_csharp/VERSION')
+        else:
+            version_file = os.path.join(sys.path[0], 'VERSION')
+            config.read(version_file)
+        version = config.get('public_version', 'version')
+        return version
+    except KeyError as error:
+        LOGGER.error(
+            "[ Error: fail to parse version info, error: %s ]\n" % error)
+        return ""
+
+
+def replace_cdata(file_name):
+    """ replace some character"""
+    try:
+        abs_path = mktemp()
+        new_file = open(abs_path, 'w')
+        old_file = open(file_name)
+        for line in old_file:
+            line_temp = line.replace('&lt;![CDATA', '<![CDATA')
+            new_file.write(line_temp.replace(']]&gt;', ']]>'))
+        new_file.close()
+        old_file.close()
+        remove(file_name)
+        move(abs_path, file_name)
+    except IOError as error:
+        LOGGER.error("[ Error: fail to replace cdata in the result file, "
+                     "error: %s ]\n" % error)
+
+
+def extract_notes(buf, pattern):
+    """util func to split lines in buffer, search for pattern on each line
+    then concatenate remaining content in output buffer"""
+    out = ""
+    for line in buf.split("\n"):
+        pos = line.find(pattern)
+        if pos >= 0:
+            out += line[pos + len(pattern):] + "\n"
+    return out
+
+# sdx@kooltux.org: parse notes in buffer and insert them in XML result
+
+
+def insert_notes(case, buf, pattern="###[NOTE]###"):
+    """ insert notes"""
+    desc = case.find('description')
+    if desc is None:
+        return
+
+    notes_elm = desc.find('notes')
+    if notes_elm is None:
+        notes_elm = etree.Element('notes')
+        desc.append(notes_elm)
+    if notes_elm.text is None:
+        notes_elm.text = extract_notes(buf, pattern)
+    else:
+        notes_elm.text += "\n" + extract_notes(buf, pattern)
+
+
+def get_summary(start_time, end_time):
+    """ set summary node """
+    summary = etree.Element('summary')
+    summary.attrib['test_plan_name'] = "Empty test_plan_name"
+    start_at = etree.Element('start_at')
+    start_at.text = start_time
+    end_at = etree.Element('end_at')
+    end_at.text = end_time
+    summary.append(start_at)
+    summary.append(end_at)
+    summary.tail = "\n  "
+    return summary
+
+
+def write_file_result(set_result_xml, set_result, debug_log_file):
+    """write xml result file"""
+    result_file = set_result['resultfile']
+    try:
+        test_tree = etree.parse(set_result_xml)
+        test_em = test_tree.getroot()
+        result_tree = etree.parse(result_file)
+        result_em = result_tree.getroot()
+        dubug_file = BASENAME(debug_log_file)
+        for result_suite in result_em.findall('suite'):
+            for result_set in result_suite.findall('set'):
+                for test_suite in test_em.findall('suite'):
+                    for test_set in test_suite.findall('set'):
+                        if result_set.get('name') == \
+                                test_set.get('name'):
+                            result_set.set("set_debug_msg", dubug_file)
+                            test_suite.remove(test_set)
+                            test_suite.append(result_set)
+        test_tree.write(set_result_xml)
+        os.remove(result_file)
+        LOGGER.info("[ cases result saved to resultfile ]\n")
+    except OSError as error:
+        traceback.print_exc()
+        LOGGER.error(
+            "[ Error: fail to write cases result, error: %s ]\n" % error)
+
+
+def __expand_subcases(tset, tcase, sub_num, result_msg, detail=None):
+    sub_case_result = result_msg.split("[assert]")[1:]
+    if not detail: 
+        for i in range(sub_num):
+            sub_case = copy.deepcopy(tcase)
+            sub_case.set("id", "/".join([tcase.get("id"), str(i+1)]))
+            sub_case.set("purpose", "/".join([tcase.get("purpose"), str(i+1)]))
+            sub_case.remove(sub_case.find("./result_info"))
+            result_info = etree.SubElement(sub_case, "result_info")
+            actual_result = etree.SubElement(result_info, "actual_result")
+            stdout = etree.SubElement(result_info, "stdout")
+            if i < len(sub_case_result):
+                sub_info = sub_case_result[i].split('[message]')
+                #print sub_info
+                sub_case.set("result", sub_info[0].upper())
+                actual_result.text = sub_info[0].upper()
+                stdout.text = sub_info[1]
+            else:
+                sub_case.set("result", "")
+                actual_result.text = ""
+                stdout.text = ""
+            tset.append(sub_case)
+    else:
+        for i in range(sub_num):
+            print('debug', detail[i], i)
+            sub_case = copy.deepcopy(tcase)
+            sub_case.set("id", "/".join([tcase.get("id"), str(i+1)]))
+            sub_case.set("purpose", "/".join([tcase.get("purpose"), str(i+1)]))
+            sub_case.remove(sub_case.find("./result_info"))
+            result_info = etree.SubElement(sub_case, "result_info")
+            actual_result = etree.SubElement(result_info, "actual_result")
+            stdout = etree.SubElement(result_info, "stdout")
+            #add 1392 co 1395,1396 --1399 tab  
+            if i > len(detail) -1:
+                sub_info = detail[i]['stdout'].split('[message]')
+                sub_case.set("result", "BLOCK")
+                actual_result.text = "BLOCK"
+            else:
+                sub_case.set("result", detail[i]['result'])
+                actual_result.text = detail[i]['result'].upper()
+                #actual_result.text = sub_info[0].upper()
+                stdout.text = detail[i]['stdout']
+            #stdout.text = sub_info[1]
+           # else:
+           #     sub_case.set("result", "")
+           #     actual_result.text = ""
+           #     stdout.text = ""
+            tset.append(sub_case)
+
+    tset.remove(tcase)
+
+
+def __write_by_create(tset, case_results, cm):
+    for case_result in case_results:
+        tcase = etree.Element('testcase')
+        tcase.set('id', case_result['case_id'])
+        tcase.set('purpose', case_result['purpose'])
+        tcase.set('result', case_result['result'].upper())
+        tcase.set('component',cm)
+        result_info = etree.SubElement(tcase, "result_info")
+        actual_result = etree.SubElement(result_info, "actual_result")
+        actual_result.text = case_result['result'].upper()
+        start = etree.SubElement(result_info, "start")
+        end = etree.SubElement(result_info, "end")
+        stdout = etree.SubElement(result_info, "stdout")
+        stderr = etree.SubElement(result_info, "stderr")
+        if 'start_at' in case_result:
+            start.text = case_result['start_at']
+        if 'end_at' in case_result:
+            end.text = case_result['end_at']
+        if 'stdout' in case_result:
+            stdout.text = str2xmlstr(case_result['stdout'])
+        if 'stderr' in case_result:
+            stderr.text = str2xmlstr(case_result['stderr'])
+        tset.append(tcase)
+
+
+def __write_by_caseid(tset, case_results):
+    #tset.set("set_debug_msg", "N/A")
+    for tcase in tset.findall('testcase'):
+        for case_result in case_results:
+            if tcase.get("id") == case_result['case_id']:
+                tcase.set('result', case_result['result'].upper())
+                # Check performance test
+                if tcase.find('measurement') is not None:
+                    for measurement in tcase.findall(
+                            'measurement'):
+                        if 'measures' in case_result:
+                            m_results = case_result['measures']
+                            for m_result in m_results:
+                                if measurement.get('name') == \
+                                        m_result['name'] and 'value' in m_result:
+                                    measurement.set(
+                                        'value', m_result[
+                                            'value'])
+                if tcase.find("./result_info") is not None:
+                    tcase.remove(tcase.find("./result_info"))
+                result_info = etree.SubElement(tcase, "result_info")
+                actual_result = etree.SubElement(
+                    result_info, "actual_result")
+                actual_result.text = case_result['result'].upper()
+                start = etree.SubElement(result_info, "start")
+                end = etree.SubElement(result_info, "end")
+                stdout = etree.SubElement(result_info, "stdout")
+                stderr = etree.SubElement(result_info, "stderr")
+                if 'start_at' in case_result:
+                    start.text = case_result['start_at']
+                if 'end_at' in case_result:
+                    end.text = case_result['end_at']
+                if 'stdout' in case_result:
+                    stdout.text = str2xmlstr(case_result['stdout'])
+                if 'stderr' in case_result:
+                    stderr.text = str2xmlstr(case_result['stderr'])
+                if tcase.get("subcase") is not None:
+                    #print 'subcase', tcase.get('subcase')
+                    sub_num = int(tcase.get("subcase"))
+                    result_msg = case_result['stdout']
+                    __expand_subcases(tset, tcase, sub_num, result_msg)
+
+def __write_by_class(tset, case_results):
+    tset.set("set_debug_msg", "N/A")
+    for tcase in tset.findall('testcase'):
+        #for key in case_results.keys():
+        sub_no = int(tcase.get('subcase'))
+        text = tcase.find('description/test_script_entry').text
+        if text in case_results:
+           # tcase.set('result', case_result['result'].upper())
+            if tcase.find("./result_info") is not None:
+                tcase.remove(tcase.find("./result_info"))
+            result_info = etree.SubElement(tcase, "result_info")
+            if sub_no == len(case_results[text]):
+                for case_result in case_results[text]:
+                    actual_result = etree.SubElement(
+                        result_info, "actual_result")
+                    actual_result.text = case_result['result'].upper()
+                    start = etree.SubElement(result_info, "start")
+                    end = etree.SubElement(result_info, "end")
+                    stdout = etree.SubElement(result_info, "stdout")
+                    stderr = etree.SubElement(result_info, "stderr")
+                    if 'start_at' in case_result:
+                        start.text = case_result['start_at']
+                    if 'end_at' in case_result:
+                        end.text = case_result['end_at']
+                    if 'stdout' in case_result:
+                        stdout.text = str2xmlstr(case_result['stdout'])
+                    if 'stderr' in case_result:
+                        stderr.text = str2xmlstr(case_result['stderr'])
+            else:
+                for case_result in case_results[text]:
+                    actual_result = etree.SubElement(
+                        result_info, "actual_result")
+                    actual_result.text = case_result['result'].upper()
+                    start = etree.SubElement(result_info, "start")
+                    end = etree.SubElement(result_info, "end")
+                    stdout = etree.SubElement(result_info, "stdout")
+                    stderr = etree.SubElement(result_info, "stderr")
+                    if 'start_at' in case_result:
+                        start.text = case_result['start_at']
+                    if 'end_at' in case_result:
+                        end.text = case_result['end_at']
+                    if 'stdout' in case_result:
+                        stdout.text = str2xmlstr(case_result['stdout'])
+                    if 'stderr' in case_result:
+                        stderr.text = str2xmlstr(case_result['stderr'])
+                for i in range(sub_no - len(case_results[text])):
+                    case_result = case_results[text][-1]
+                    actual_result = etree.SubElement(
+                        result_info, "actual_result")
+                    actual_result.text = case_result['result'].upper()
+                    start = etree.SubElement(result_info, "start")
+                    end = etree.SubElement(result_info, "end")
+                    stdout = etree.SubElement(result_info, "stdout")
+                    stderr = etree.SubElement(result_info, "stderr")
+                    if 'start_at' in case_result:
+                        start.text = case_result['start_at']
+                    if 'end_at' in case_result:
+                        end.text = case_result['end_at']
+                    if 'stdout' in case_result:
+                        stdout.text = str2xmlstr(case_result['stdout'])
+                    if 'stderr' in case_result:
+                        stderr.text = str2xmlstr(case_result['stderr'])
+
+            if tcase.get("subcase") is not None:
+                sub_num = int(tcase.get("subcase"))
+                result_msg = case_result['stdout']
+                __expand_subcases(tset, tcase, sub_num, result_msg, case_results[text])
+
+def sort_result(case_results):
+    total = dict()
+    for result in case_results:
+        if result['case_class'] in total:
+            total[result['case_class']].append(result)
+        else:
+            total[result['case_class']] = [result]
+    return total
+
+def write_json_result(set_result_xml, set_result, debug_log_file):
+    ''' fetch result form JSON'''
+    case_results = set_result["cases"]
+    try:
+        parse_tree = etree.parse(set_result_xml)
+        #print 'debug tree', debug_log_file
+        root_em = parse_tree.getroot()
+        dubug_file = BASENAME(debug_log_file)
+        for tset in root_em.iter('set'):
+            tset.set("set_debug_msg", dubug_file)
+            if tset.get('type') == 'pyunit':
+                cm = tset.find('testcase').get('component')
+                __write_by_create(tset, case_results, cm)
+            elif tset.get('type') == 'androidunit':
+                total = sort_result(case_results)
+                __write_by_class(tset, total)
+            else:
+                __write_by_caseid(tset, case_results)
+        parse_tree.write(set_result_xml)
+        LOGGER.info("[ cases result saved to resultfile ]\n")
+    except IOError as error:
+        traceback.print_exc()
+        LOGGER.error(
+            "[ Error: fail to write cases result, error: %s ]\n" % error)
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/util/str2.py b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/util/str2.py
new file mode 100644 (file)
index 0000000..585286f
--- /dev/null
@@ -0,0 +1,65 @@
+#!/usr/bin/python
+#
+# Copyright (C) 2012 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# Authors:
+#              Zhang, Huihui <huihuix.zhang@intel.com>
+#              Wendong,Sui  <weidongx.sun@intel.com>
+""" string convertor"""
+
+import string
+
+
+def str2str(src):
+    """string to printable string"""
+    if isinstance(src, str):
+        return src.encode("utf8")
+
+    if isinstance(src, str):
+        accept = string.punctuation + string.letters + string.digits + ' \r\n'
+        return [x for x in src if x in accept]
+
+    return ""
+
+
+def str2val(src):
+    """string to program value"""
+    ret = None
+    try:
+        ret = eval(str2str(src))
+    except:
+        pass
+    return ret
+
+
+def str2bool(src):
+    """string to boolean"""
+    if "TRUE" == str2str(src).upper():
+        return True
+    if "FALSE" == str2str(src).upper():
+        return False
+    return None
+
+
+def str2number(src):
+    """string to boolean"""
+    val = str2val(str2str(src))
+    if type(val) in [int, float]:
+        return val
+    else:
+        return None
+
+
+def str2xmlstr(src):
+    """string to xml string value"""
+    return src.replace('\n', '\\n')
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/util/tr_utils.py b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitlite/util/tr_utils.py
new file mode 100644 (file)
index 0000000..a3ce9bf
--- /dev/null
@@ -0,0 +1,53 @@
+import os
+import signal
+import sys
+import logging
+
+LOG = logging.getLogger("TestRunner")
+
+
+def pidExists(pid):
+    if pid < 0:
+        return False
+    try:
+        os.kill(pid, 0)
+    except OSError as e:
+        return False
+    else:
+        return True
+
+
+def IsWindows():
+    return sys.platform == 'cygwin' or sys.platform.startswith('win')
+
+
+def KillAllProcesses(ppid=None):
+    if IsWindows():
+        subprocess.check_call("TASKKILL /F /PID %s /T" % ppid)
+    else:
+        ppid = str(ppid)
+        pidgrp = []
+
+        def GetChildPids(ppid):
+            command = "ps -ef | awk '{if ($3 ==%s) print $2;}'" % str(ppid)
+            pids = os.popen(command).read()
+            pids = pids.split()
+
+            return pids
+
+        pidgrp.extend(GetChildPids(ppid))
+        for pid in pidgrp:
+            pidgrp.extend(GetChildPids(pid))
+
+        pidgrp.insert(0, ppid)
+        while len(pidgrp) > 0:
+            pid = pidgrp.pop()
+            try:
+                os.kill(int(pid), signal.SIGKILL)
+                return True
+            except OSError:
+                try:
+                    os.popen("kill -9 %d" % int(pid))
+                    return True
+                except:
+                    return False
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitmerge/__init__.py b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitmerge/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitmerge/merger.py b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/testkitmerge/merger.py
new file mode 100644 (file)
index 0000000..ae3dd1e
--- /dev/null
@@ -0,0 +1,275 @@
+#!/usr/bin/python
+#
+# Copyright (C) 2014 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# Authors: 
+#           Nicolas Zingile <n.zingile@gmail.com>
+
+"""Merger module for testkit xml files"""
+
+from lxml import etree
+import os
+
+#------------------------- Global variables -------------------------#
+
+TESTDEFATTRS  = {}
+TESTDEFCHILDS = {"environment" : False, "summary" : False, "suite" : False}
+ENVATTRS      = {"build_id" : False, "device_id" : False, "device_model" : False,
+               "device_name" : False, "host" : False, "lite_version" : False,
+               "manufacturer" : False, "resolution" : False, "screen_size" : False}
+ENVCHILDS     = {"other" : False}
+SUMATTRS      = {"test_plan_name" : False}
+SUMCHILDS     = {"start_at" : True, "end_at" : True}
+SUITEATTRS    = {"name" : True, "launcher" : False,'category':None,'extension':None}
+SUITECHILDS   = {"set" : True}
+SETATTRS      = {"name" : True, "set_debug_msg" : False,'type':None}
+SETCHILDS     = {"testcase" : False,'capabilities':False}
+TCATTRS       = {"component" : True, "execution_type" : True, "id" :True,
+               "name" : False, "priority" : True, "purpose" : True,"onload_delay":None,
+                "result" : True, "status" : True, "type" : True}
+TCCHILDS      = {"description" : False ,"result_info":False}
+
+DESCATTRS     ={}
+DESCCHILDS    = {"test_script_entry": True,"refer_test_script_entry":False,"pre_condition" : False, "post_condition" : False, "steps" : False}
+RESULTCHILD = {'actual_result':True,'start':False,'end':False,'stdout':False}
+RESINFOATTRS  = {}
+RESINFOCHILDS = {"actual_result" : True, "start" :False, "end" : False,
+               "stdout" : False, "stderr" : False}
+
+class ElementError(Exception):
+    """Custom class to handle the merging exceptions"""
+    pass
+
+def check_element(element, attrdico, childsdico):
+    """Checks a node of the testkit result xml tree.
+
+    Allows to verify the integrity of a testkit result xml node.
+    Check if element contains allowed attributes and if the value of
+    those attributes is filled if it should be.
+    Check if the child nodes of element are allowed and if so, checks
+    if the child node contains text if it should.
+
+    Args:
+       element : Element to check
+       attrdico: A dict that contains information on attributes of element
+               keys: String - allowed attributes of the element
+               values: Booleans indicating if the keys should be filled
+       childsdico: A dict that contains information on sub elements of element
+               keys: String - allowed sub elements of element
+               values: Booleans indicating if the keys should contain text
+    Returns:
+
+    Raises:
+       ElementError
+    """
+    for attrname, attrvalue in list(element.attrib.items()):
+        if attrname in list(attrdico.keys()):
+            if not attrvalue and attrdico.get(attrname):
+                raise ElementError("Attribute '" + attrname + "' of element '" + element.tag
+                + "' is not defined")
+        else:
+            raise ElementError("Attribute '" + attrname + "' is not authorized as an attribute of the '" + element.tag + "' element")
+    for child in list(element):
+        if (child.tag not in list(childsdico.keys())):
+            raise ElementError("Element '" + child.tag + " should not be a child element of '" + element.tag + "'")
+       elif (not child.text and childsdico.get(child.tag)):
+            raise ElementError("The element '" + child.tag + "' should contain some text")
+
+def create_xmltree():
+    """Creates an ElementTree object.
+    Args:
+
+    Return:
+       An ElementTree object that represents en empty testkit result xml file.
+    """
+    root = etree.Element("test_definition")
+    xmltree = etree.ElementTree(root)
+    print("xml tree created !")
+    
+    return xmltree
+
+def create_envandsum(srcxmltree, destxmltree):
+    """Creates the environment and the summary nodes of
+    an ElementTree object.
+
+    Copy the environment and the summary nodes of srcxmltree in 
+    the destxmltree. The destxmltree only contains the root element.
+
+    Args:
+       srcxmltree: Source xmltree from where we want to copy some nodes.
+       destxmltree: Destination xmltree to augment with some nodes.
+
+    Returns:
+       An ElementTree that partially represents a testkit result xml file.
+    """
+    testdef = destxmltree.getroot()
+    environment = srcxmltree.find("/environment")
+    summary = srcxmltree.find("/summary")
+    testdef.append(environment)
+    testdef.append(summary)
+
+    return destxmltree
+
+def check_testdefinition(xmltree):
+    """Checks the test_definition node of a testkit result xml.
+
+    Checkis that all the sub elements of the test_definition node are present
+    and that integrity of that sub elements is good.
+
+    Args:
+       xmltree: An ElementTree that represents a testkit result xml tree.
+
+    Returns:
+
+    Raises:
+       ElementError
+    """
+    testdef = xmltree.getroot()
+    check_element(testdef, TESTDEFATTRS, TESTDEFCHILDS)
+    environment = testdef.find("./environment")
+    summary = testdef.find("summary")
+    if environment is not None:
+        check_element(environment, ENVATTRS, ENVCHILDS)
+    else:
+       raise ElementError("Element 'test_definition' should contain an 'environment' element")
+    if summary is not None:
+        check_element(summary, SUMATTRS, SUMCHILDS)
+    else:
+       raise ElementError("Element 'test_definition' should contain a 'summary' element")
+    for asuite in testdef.findall("./suite"):
+       check_suite(asuite)
+           
+def check_suite(eltsuite):
+    """Checks the integrity of a suite element.
+
+    Args:
+       eltsuite: A suite element to check
+
+    Returns:
+    """
+    check_element(eltsuite, SUITEATTRS, SUITECHILDS) 
+    for child in list(eltsuite):
+       check_set(child)
+
+def check_set(eltset):
+    """Checks the integrity of a set element.
+
+    Args:
+       eltset: A set element to check.
+
+    Returns:
+    """
+    check_element(eltset, SETATTRS, SETCHILDS)
+    for child in list (eltset):
+       check_testcase(child)
+
+def check_testcase(eltcase):
+    """Checks the integrity of a testcase element.
+
+    Also verify that the result of the eltcase is present and consistent
+
+    Args:
+       eltcase: A testcase element to check
+
+    Returns:
+
+    Raises:
+       ElementError
+    """
+    try:
+       result = eltcase.get("result")
+       actual_result = eltcase.find("./result_info/actual_result").text
+       allowed_results = ["PASS", "FAIL", "N/A","BLOCK","TIMEOUT"]
+    except AttributeError:
+       raise ElementError("result of the testcase is not valid !")
+    if result not in allowed_results or result != actual_result:
+       raise ElementError("The testcase '" + eltcase.get("id") + "' doesn't have a consistent result")
+    check_element(eltcase, TCATTRS, TCCHILDS)
+    for child in list (eltcase):
+       if child.tag == "description":
+          # print "-- checking description node"
+           check_element(child, DESCATTRS, DESCCHILDS)
+       elif child.tag == "result_info":
+         #  print "-- checking result_info node"
+           check_element(child, RESINFOATTRS, RESINFOCHILDS)
+       #elif child.tag == "categories":
+       #    pass
+       else:
+           raise ElementError("Element '" + child.tag + "' is not allowed")
+
+def solve_conflicts(sourcecase, destcase):
+    """Selects a result when same testcase is encountered in both source and destination
+    testkit xml files.
+
+    The result is chosen according to the following priority : FAIL > N/A > PASS.
+
+    Args:
+       sourcecase: A testcase element of the source testkit xml result file
+       destcase: A testcase element of the destination testkit xml result file
+
+    Returns:
+    """
+    srcresult = sourcecase.get('result')
+    destresult = destcase.get('result')
+    if (srcresult == destresult) or (destresult == 'FAIL') \
+    or (srcresult == 'PASS' and destresult == 'N/A'):
+       pass
+    else:
+       destcase.set('result', srcresult)
+       destcase.find('./result_info/actual_result').text = srcresult
+
+def merge_testkitxml (sourcexmltree, destxmltree=None):
+    """Merge two testkit xml result files.
+
+    Merge the information of sourcexmltree in destxmltree. If destxmltree is
+    not definded, creates a new ElementTree and copy all the information of
+    sourcexmltree in it.
+
+    Args:
+       sourcexmltree: The source ElementTree object that represents the 
+               testkit result xml source file
+       destxmltree: The destination ElementTree object that represents the 
+               testkit result xml destination file
+    Returns:
+       An ElementTree that represents the result of the merging of the sourcexmltree
+       and destxmltree
+    """
+    print("## Checking source xml file ...")
+    check_testdefinition(sourcexmltree)
+    print("source xml file is correct. Ok\n")
+    if destxmltree is None:
+        print("Destination xml file doesn't exist... will be created")
+        destxmltree = create_xmltree()
+        create_envandsum(sourcexmltree, destxmltree)
+    for asuite in sourcexmltree.iter('suite'):
+        destsuite = destxmltree.find("/suite[@name='" + asuite.get('name') + "']")
+        if destsuite is not None:
+            for aset in asuite.iter('set'):
+                destset = destsuite.find("./set[@name='" + aset.get('name') + "']")
+                if destset is not None:
+                    for acase in aset.iter('testcase'):
+                        destcase = destset.find("./testcase[@id='" + acase.get('id') + "']")
+                        if destcase is not None:
+                           solve_conflicts(acase, destcase)
+                        else:
+                            destset.append(acase)
+               else:
+                    destsuite.append(aset)
+        else:
+            destxmltree.getroot().append(asuite)
+
+    return destxmltree
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/xsd/Makefile.am b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/xsd/Makefile.am
new file mode 100644 (file)
index 0000000..0c9c212
--- /dev/null
@@ -0,0 +1,22 @@
+# Copyright (C) 2012 Intel Corporation
+# 
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+#
+# Authors:
+#              Zhang, Huihui <huihuix.zhang@intel.com>
+#              Wendong,Sui  <weidongx.sun@intel.com>
+
+testkitxsddir = /opt/testkit/lite_web_csharp/xsd
+dist_testkitxsd_DATA = *.js *.xsl *.css *.png *.txt *.xml *.xsd release-notes
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/xsd/application.js b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/xsd/application.js
new file mode 100644 (file)
index 0000000..964aa19
--- /dev/null
@@ -0,0 +1,47 @@
+function getScrollTop() {
+  return f_scrollTop();
+}
+
+function f_scrollTop() {
+  return f_filterResults (
+    $(window) ? $(window).scrollTop() : 0,
+    document.documentElement ? document.documentElement.scrollTop : 0,
+    document.body ? document.body.scrollTop : 0
+  );
+}
+
+function f_filterResults(n_win, n_docel, n_body) {
+  var n_result = n_win ? n_win : 0;
+  if (n_docel && (!n_result || (n_result > n_docel)))
+    n_result = n_docel;
+  return n_body && (!n_result || (n_result > n_body)) ? n_body : n_result;
+}
+
+function setScrollTop() {
+  $(window) ? $(window).scrollTop(0): 0;
+  document.documentElement ? document.documentElement.scrollTop = 0 :0;
+  document.body ? document.body.scrollTop = 0 : 0;
+}
+
+function goTopEx() {
+  $node = $('#goTopBtn');
+
+  if (getScrollTop() > 0) {
+    $node.show();
+  } else {
+    $node.hide();
+  }
+
+  $(window).scroll(function () {
+    if (getScrollTop() > 0) {
+      $node.show();
+    } else {
+      $node.hide();
+    }
+  });
+
+  $node.click(function () {
+    setScrollTop();
+  });
+}
+
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/xsd/back_top.png b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/xsd/back_top.png
new file mode 100644 (file)
index 0000000..19cbd76
Binary files /dev/null and b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/xsd/back_top.png differ
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/xsd/jquery.min.js b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/xsd/jquery.min.js
new file mode 100644 (file)
index 0000000..198b3ff
--- /dev/null
@@ -0,0 +1,4 @@
+/*! jQuery v1.7.1 jquery.com | jquery.org/license */
+(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>"),cm.close();d=cm.createElement(a),cm.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cl)}ck[a]=e}return ck[a]}function cu(a,b){var c={};f.each(cq.concat.apply([],cq.slice(0,b)),function(){c[this]=a});return c}function ct(){cr=b}function cs(){setTimeout(ct,0);return cr=f.now()}function cj(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ci(){try{return new a.XMLHttpRequest}catch(b){}}function cc(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function cb(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function ca(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bE.test(a)?d(a,e):ca(a+"["+(typeof e=="object"||f.isArray(e)?b:"")+"]",e,c,d)});else if(!c&&b!=null&&typeof b=="object")for(var e in b)ca(a+"["+e+"]",b[e],c,d);else d(a,b)}function b_(a,c){var d,e,g=f.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((g[d]?a:e||(e={}))[d]=c[d]);e&&f.extend(!0,a,e)}function b$(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bT,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=b$(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=b$(a,c,d,e,"*",g));return l}function bZ(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bP),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bC(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?bx:by,g=0,h=e.length;if(d>0){if(c!=="border")for(;g<h;g++)c||(d-=parseFloat(f.css(a,"padding"+e[g]))||0),c==="margin"?d+=parseFloat(f.css(a,c+e[g]))||0:d-=parseFloat(f.css(a,"border"+e[g]+"Width"))||0;return d+"px"}d=bz(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0;if(c)for(;g<h;g++)d+=parseFloat(f.css(a,"padding"+e[g]))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+e[g]+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+e[g]))||0);return d+"px"}function bp(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bf,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bo(a){var b=c.createElement("div");bh.appendChild(b),b.innerHTML=a.outerHTML;return b.firstChild}function bn(a){var b=(a.nodeName||"").toLowerCase();b==="input"?bm(a):b!=="script"&&typeof a.getElementsByTagName!="undefined"&&f.grep(a.getElementsByTagName("input"),bm)}function bm(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bl(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bk(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bj(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c,d,e,g=f._data(a),h=f._data(b,g),i=g.events;if(i){delete h.handle,h.events={};for(c in i)for(d=0,e=i[c].length;d<e;d++)f.event.add(b,c+(i[c][d].namespace?".":"")+i[c][d].namespace,i[c][d],i[c][d].data)}h.data&&(h.data=f.extend({},h.data))}}function bi(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function U(a){var b=V.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function T(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=f.grep(a,function(a){return a.nodeType===1});if(O.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c<d;c++)b[a[c]]=!0;return b}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)break;return a},trim:G?function(a){return a==null?"":G.call(a)}:function(a){return a==null?"":(a+"").replace(k,"").replace(l,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d==="string"||d==="function"||d==="regexp"||e.isWindow(a)?E.call(c,a):e.merge(c,a)}return c},inArray:function(a,b,c){var d;if(b){if(H)return H.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length=="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j=="number"&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c=="string"){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=function(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h){var i=a.length;if(typeof c=="object"){for(var j in c)e.access(a,j,c[j],f,g,d);return a}if(d!==b){f=!h&&f&&e.isFunction(d);for(var k=0;k<i;k++)g(a[k],c,f?d.call(a[k],k,g(a[k],c)):d,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf("compatible")<0&&u.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},browser:{}}),e.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){I["[object "+b+"]"]=b.toLowerCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&&(e.browser.safari=!0),j.test(" ")&&(k=/^[\s\xA0]+/,l=/[\s\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener("DOMContentLoaded",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",B),e.ready())});return e}(),g={};f.Callbacks=function(a){a=a?g[a]||h(a):{};var c=[],d=[],e,i,j,k,l,m=function(b){var d,e,g,h,i;for(d=0,e=b.length;d<e;d++)g=b[d],h=f.type(g),h==="array"?m(g):h==="function"&&(!a.unique||!o.has(g))&&c.push(g)},n=function(b,f){f=f||[],e=!a.memory||[b,f],i=!0,l=j||0,j=0,k=c.length;for(;c&&l<k;l++)if(c[l].apply(b,f)===!1&&a.stopOnFalse){e=!0;break}i=!1,c&&(a.once?e===!0?o.disable():c=[]:d&&d.length&&(e=d.shift(),o.fireWith(e[0],e[1])))},o={add:function(){if(c){var a=c.length;m(arguments),i?k=c.length:e&&e!==!0&&(j=a,n(e[0],e[1]))}return this},remove:function(){if(c){var b=arguments,d=0,e=b.length;for(;d<e;d++)for(var f=0;f<c.length;f++)if(b[d]===c[f]){i&&f<=k&&(k--,f<=l&&l--),c.splice(f--,1);if(a.unique)break}}return this},has:function(a){if(c){var b=0,d=c.length;for(;b<d;b++)if(a===c[b])return!0}return!1},empty:function(){c=[];return this},disable:function(){c=d=e=b;return this},disabled:function(){return!c},lock:function(){d=b,(!e||e===!0)&&o.disable();return this},locked:function(){return!d},fireWith:function(b,c){d&&(i?a.once||d.push([b,c]):(!a.once||!e)&&n(b,c));return this},fire:function(){o.fireWith(this,arguments);return this},fired:function(){return!!e}};return o};var i=[].slice;f.extend({Deferred:function(a){var b=f.Callbacks("once memory"),c=f.Callbacks("once memory"),d=f.Callbacks("memory"),e="pending",g={resolve:b,reject:c,notify:d},h={done:b.add,fail:c.add,progress:d.add,state:function(){return e},isResolved:b.fired,isRejected:c.fired,then:function(a,b,c){i.done(a).fail(b).progress(c);return this},always:function(){i.done.apply(i,arguments).fail.apply(i,arguments);return this},pipe:function(a,b,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[b,"reject"],progress:[c,"notify"]},function(a,b){var c=b[0],e=b[1],g;f.isFunction(c)?i[a](function(){g=c.apply(this,arguments),g&&f.isFunction(g.promise)?g.promise().then(d.resolve,d.reject,d.notify):d[e+"With"](this===i?d:this,[g])}):i[a](d[e])})}).promise()},promise:function(a){if(a==null)a=h;else for(var b in h)a[b]=h[b];return a}},i=h.promise({}),j;for(j in g)i[j]=g[j].fire,i[j+"With"]=g[j].fireWith;i.done(function(){e="resolved"},c.disable,d.lock).fail(function(){e="rejected"},b.disable,d.lock),a&&a.call(i,i);return i},when:function(a){function m(a){return function(b){e[a]=arguments.length>1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c<d;c++)b[c]&&b[c].promise&&f.isFunction(b[c].promise)?b[c].promise().then(l(c),j.reject,m(c)):--g;g||j.resolveWith(j,b)}else j!==a&&j.resolveWith(j,d?[a]:[]);return k}}),f.support=function(){var b,d,e,g,h,i,j,k,l,m,n,o,p,q=c.createElement("div"),r=c.documentElement;q.setAttribute("className","t"),q.innerHTML="   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",d=q.getElementsByTagName("*"),e=q.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=q.getElementsByTagName("input")[0],b={leadingWhitespace:q.firstChild.nodeType===3,tbody:!q.getElementsByTagName("tbody").length,htmlSerialize:!!q.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:q.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete q.test}catch(s){b.deleteExpando=!1}!q.addEventListener&&q.attachEvent&&q.fireEvent&&(q.attachEvent("onclick",function(){b.noCloneEvent=!1}),q.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),q.appendChild(i),k=c.createDocumentFragment(),k.appendChild(q.lastChild),b.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,k.removeChild(i),k.appendChild(q),q.innerHTML="",a.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",q.style.width="2px",q.appendChild(j),b.reliableMarginRight=(parseInt((a.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(q.attachEvent)for(o in{submit:1,change:1,focusin:1})n="on"+o,p=n in q,p||(q.setAttribute(n,"return;"),p=typeof q[n]=="function"),b[o+"Bubbles"]=p;k.removeChild(q),k=g=h=j=q=i=null,f(function(){var a,d,e,g,h,i,j,k,m,n,o,r=c.getElementsByTagName("body")[0];!r||(j=1,k="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",m="visibility:hidden;border:0;",n="style='"+k+"border:5px solid #000;padding:0;'",o="<div "+n+"><div></div></div>"+"<table "+n+" cellpadding='0' cellspacing='0'>"+"<tr><td></td></tr></table>",a=c.createElement("div"),a.style.cssText=m+"width:0;height:0;position:static;top:0;margin-top:"+j+"px",r.insertBefore(a,r.firstChild),q=c.createElement("div"),a.appendChild(q),q.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>",l=q.getElementsByTagName("td"),p=l[0].offsetHeight===0,l[0].style.display="",l[1].style.display="none",b.reliableHiddenOffsets=p&&l[0].offsetHeight===0,q.innerHTML="",q.style.width=q.style.paddingLeft="1px",f.boxModel=b.boxModel=q.offsetWidth===2,typeof q.style.zoom!="undefined"&&(q.style.display="inline",q.style.zoom=1,b.inlineBlockNeedsLayout=q.offsetWidth===2,q.style.display="",q.innerHTML="<div style='width:4px;'></div>",b.shrinkWrapBlocks=q.offsetWidth!==2),q.style.cssText=k+m,q.innerHTML=o,d=q.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,i={doesNotAddBorder:e.offsetTop!==5,doesAddBorderForTableAndCells:h.offsetTop===5},e.style.position="fixed",e.style.top="20px",i.fixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",i.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,i.doesNotIncludeMarginInBodyOffset=r.offsetTop!==j,r.removeChild(a),q=a=null,f.extend(b,i))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e<g;e++)delete d[b[e]];if(!(c?m:f.isEmptyObject)(d))return}}if(!c){delete j[k].data;if(!m(j[k]))return}f.support.deleteExpando||!j.setInterval?delete j[k]:j[k]=null,i&&(f.support.deleteExpando?delete a[h]:a.removeAttribute?a.removeAttribute(h):a[h]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d,e,g,h=null;if(typeof a=="undefined"){if(this.length){h=f.data(this[0]);if(this[0].nodeType===1&&!f._data(this[0],"parsedAttrs")){e=this[0].attributes;for(var i=0,j=e.length;i<j;i++)g=e[i].name,g.indexOf("data-")===0&&(g=f.camelCase(g.substring(5)),l(this[0],g,h[g]));f._data(this[0],"parsedAttrs",!0)}}return h}if(typeof a=="object")return this.each(function(){f.data(this,a)});d=a.split("."),d[1]=d[1]?"."+d[1]:"";if(c===b){h=this.triggerHandler("getData"+d[1]+"!",[d[0]]),h===b&&this.length&&(h=f.data(this[0],a),h=l(this[0],a,h));return h===b&&d[1]?this.data(d[0]):h}return this.each(function(){var b=f(this),e=[d[0],c];b.triggerHandler("setData"+d[1]+"!",e),f.data(this,a,c),b.triggerHandler("changeData"+d[1]+"!",e)})},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){typeof a!="string"&&(c=a,a="fx");if(c===b)return f.queue(this[0],a);return this.each(function(){var b=f.queue(this,a,c);a==="fx"&&b[0]!=="inprogress"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!="string"&&(c=a,a=b),a=a||"fx";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+"defer",j=a+"queue",k=a+"mark",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f.Callbacks("once memory"),!0))h++,l.add(m);m();return d.promise()}});var o=/[\n\t\r]/g,p=/\s+/,q=/\r/g,r=/^(?:button|input)$/i,s=/^(?:button|input|object|select|textarea)$/i,t=/^a(?:rea)?$/i,u=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,v=f.support.getSetAttribute,w,x,y;f.fn.extend({attr:function(a,b){return f.access(this,a,b,!0,f.attr)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,a,b,!0,f.prop)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{g=" "+e.className+" ";for(h=0,i=b.length;h<i;h++)~g.indexOf(" "+b[h]+" ")||(g+=b[h]+" ");e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(p);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(" "+g.className+" ").replace(o," ");for(i=0,j=c.length;i<j;i++)h=h.replace(" "+c[i]+" "," ");g.className=f.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c==="string"){var e,g=0,h=f(this),i=b,j=a.split(p);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&f._data(this,"__className__",this.className),this.className=this.className||a===!1?"":f._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c<d;c++)if(this[c].nodeType===1&&(" "+this[c].className+" ").replace(o," ").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c<d;c++){e=i[c];if(e.selected&&(f.support.optDisabled?!e.disabled:e.getAttribute("disabled")===null)&&(!e.parentNode.disabled||!f.nodeName(e.parentNode,"optgroup"))){b=f(e).val();if(j)return b;h.push(b)}}if(j&&!h.length&&i.length)return f(i[g]).val();return h},set:function(a,b){var c=f.makeArray(b);f(a).find("option").each(function(){this.selected=f.inArray(f(this).val(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;h<g;h++)e=d[h],e&&(c=f.propFix[e]||e,f.attr(a,e,""),a.removeAttribute(v?e:c),u.test(e)&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(r.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(w&&f.nodeName(a,"button"))return w.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(w&&f.nodeName(a,"button"))return w.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e,g,h,i=a.nodeType;if(!!a&&i!==3&&i!==8&&i!==2){h=i!==1||!f.isXMLDoc(a),h&&(c=f.propFix[c]||c,g=f.propHooks[c]);return d!==b?g&&"set"in g&&(e=g.set(a,d,c))!==b?e:a[c]=d:g&&"get"in g&&(e=g.get(a,c))!==null?e:a[c]}},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):s.test(a.nodeName)||t.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabindex=f.propHooks.tabIndex,x={get:function(a,c){var d,e=f.prop(a,c);return e===!0||typeof e!="boolean"&&(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},v||(y={name:!0,id:!0},w=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&(y[c]?d.nodeValue!=="":d.specified)?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+""}},f.attrHooks.tabindex.set=w.set,f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})}),f.attrHooks.contenteditable={get:w.get,set:function(a,b,c){b===""&&(b="false"),w.set(a,b,c)}}),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.enctype||(f.propFix.enctype="encoding"),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/\bhover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};
+f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k<c.length;k++){l=A.exec(c[k])||[],m=l[1],n=(l[2]||"").split(".").sort(),s=f.event.special[m]||{},m=(g?s.delegateType:s.bindType)||m,s=f.event.special[m]||{},o=f.extend({type:m,origType:l[1],data:e,handler:d,guid:d.guid,selector:g,quick:G(g),namespace:n.join(".")},p),r=j[m];if(!r){r=j[m]=[],r.delegateCount=0;if(!s.setup||s.setup.call(a,e,n,i)===!1)a.addEventListener?a.addEventListener(m,i,!1):a.attachEvent&&a.attachEvent("on"+m,i)}s.add&&(s.add.call(a,o),o.handler.guid||(o.handler.guid=d.guid)),g?r.splice(r.delegateCount++,0,o):r.push(o),f.event.global[m]=!0}a=null}},global:{},remove:function(a,b,c,d,e){var g=f.hasData(a)&&f._data(a),h,i,j,k,l,m,n,o,p,q,r,s;if(!!g&&!!(o=g.events)){b=f.trim(I(b||"")).split(" ");for(h=0;h<b.length;h++){i=A.exec(b[h])||[],j=k=i[1],l=i[2];if(!j){for(j in o)f.event.remove(a,j+b[h],c,d,!0);continue}p=f.event.special[j]||{},j=(d?p.delegateType:p.bindType)||j,r=o[j]||[],m=r.length,l=l?new RegExp("(^|\\.)"+l.split(".").sort().join("\\.(?:.*\\.)?")+"(\\.|$)"):null;for(n=0;n<r.length;n++)s=r[n],(e||k===s.origType)&&(!c||c.guid===s.guid)&&(!l||l.test(s.namespace))&&(!d||d===s.selector||d==="**"&&s.selector)&&(r.splice(n--,1),s.selector&&r.delegateCount--,p.remove&&p.remove.call(a,s));r.length===0&&m!==r.length&&((!p.teardown||p.teardown.call(a,l)===!1)&&f.removeEvent(a,j,g.handle),delete o[j])}f.isEmptyObject(o)&&(q=g.handle,q&&(q.elem=null),f.removeData(a,["events","handle"],!0))}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){if(!e||e.nodeType!==3&&e.nodeType!==8){var h=c.type||c,i=[],j,k,l,m,n,o,p,q,r,s;if(E.test(h+f.event.triggered))return;h.indexOf("!")>=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;l<r.length&&!c.isPropagationStopped();l++)m=r[l][0],c.type=r[l][1],q=(f._data(m,"events")||{})[c.type]&&f._data(m,"handle"),q&&q.apply(m,d),q=o&&m[o],q&&f.acceptData(m)&&q.apply(m,d)===!1&&c.preventDefault();c.type=h,!g&&!c.isDefaultPrevented()&&(!p._default||p._default.apply(e.ownerDocument,d)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)&&o&&e[h]&&(h!=="focus"&&h!=="blur"||c.target.offsetWidth!==0)&&!f.isWindow(e)&&(n=e[o],n&&(e[o]=null),f.event.triggered=h,e[h](),f.event.triggered=b,n&&(e[o]=n));return c.result}},dispatch:function(c){c=f.event.fix(c||a.event);var d=(f._data(this,"events")||{})[c.type]||[],e=d.delegateCount,g=[].slice.call(arguments,0),h=!c.exclusive&&!c.namespace,i=[],j,k,l,m,n,o,p,q,r,s,t;g[0]=c,c.delegateTarget=this;if(e&&!c.target.disabled&&(!c.button||c.type!=="click")){m=f(this),m.context=this.ownerDocument||this;for(l=c.target;l!=this;l=l.parentNode||this){o={},q=[],m[0]=l;for(j=0;j<e;j++)r=d[j],s=r.selector,o[s]===b&&(o[s]=r.quick?H(l,r.quick):m.is(s)),o[s]&&q.push(r);q.length&&i.push({elem:l,matches:q})}}d.length>e&&i.push({elem:this,matches:d.slice(e)});for(j=0;j<i.length&&!c.isPropagationStopped();j++){p=i[j],c.currentTarget=p.elem;for(k=0;k<p.matches.length&&!c.isImmediatePropagationStopped();k++){r=p.matches[k];if(h||!c.namespace&&!r.namespace||c.namespace_re&&c.namespace_re.test(r.namespace))c.data=r.data,c.handleObj=r,n=((f.event.special[r.origType]||{}).handle||r.handler).apply(p.elem,g),n!==b&&(c.result=n,n===!1&&(c.preventDefault(),c.stopPropagation()))}}return c.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode);return a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,d){var e,f,g,h=d.button,i=d.fromElement;a.pageX==null&&d.clientX!=null&&(e=a.target.ownerDocument||c,f=e.documentElement,g=e.body,a.pageX=d.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=d.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?d.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0);return a}},fix:function(a){if(a[f.expando])return a;var d,e,g=a,h=f.event.fixHooks[a.type]||{},i=h.props?this.props.concat(h.props):this.props;a=f.Event(g);for(d=i.length;d;)e=i[--d],a[e]=g[e];a.target||(a.target=g.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey===b&&(a.metaKey=a.ctrlKey);return h.filter?h.filter(a,g):a},special:{ready:{setup:f.bindReady},load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}},simulate:function(a,b,c,d){var e=f.extend(new f.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?f.event.trigger(e,null,b):f.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},f.event.handle=f.event.dispatch,f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},f.Event=function(a,b){if(!(this instanceof f.Event))return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?K:J):this.type=a,b&&f.extend(this,b),this.timeStamp=a&&a.timeStamp||f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=K;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=K;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=K,this.stopPropagation()},isDefaultPrevented:J,isPropagationStopped:J,isImmediatePropagationStopped:J},f.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){f.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c=this,d=a.relatedTarget,e=a.handleObj,g=e.selector,h;if(!d||d!==c&&!f.contains(c,d))a.type=e.origType,h=e.handler.apply(this,arguments),a.type=b;return h}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(){if(f.nodeName(this,"form"))return!1;f.event.add(this,"click._submit keypress._submit",function(a){var c=a.target,d=f.nodeName(c,"input")||f.nodeName(c,"button")?c.form:b;d&&!d._submit_attached&&(f.event.add(d,"submit._submit",function(a){this.parentNode&&!a.isTrigger&&f.event.simulate("submit",this.parentNode,a,!0)}),d._submit_attached=!0)})},teardown:function(){if(f.nodeName(this,"form"))return!1;f.event.remove(this,"._submit")}}),f.support.changeBubbles||(f.event.special.change={setup:function(){if(z.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")f.event.add(this,"propertychange._change",function(a){a.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),f.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1,f.event.simulate("change",this,a,!0))});return!1}f.event.add(this,"beforeactivate._change",function(a){var b=a.target;z.test(b.nodeName)&&!b._change_attached&&(f.event.add(b,"change._change",function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&f.event.simulate("change",this.parentNode,a,!0)}),b._change_attached=!0)})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!=="radio"&&b.type!=="checkbox")return a.handleObj.handler.apply(this,arguments)},teardown:function(){f.event.remove(this,"._change");return z.test(this.nodeName)}}),f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){var d=0,e=function(a){f.event.simulate(b,a.target,f.event.fix(a),!0)};f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.fn.extend({on:function(a,c,d,e,g){var h,i;if(typeof a=="object"){typeof c!="string"&&(d=c,c=b);for(i in a)this.on(i,c,d,a[i],g);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typeof c=="string"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=J;else if(!e)return this;g===1&&(h=e,e=function(a){f().off(a);return h.apply(this,arguments)},e.guid=h.guid||(h.guid=f.guid++));return this.each(function(){f.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on.call(this,a,b,c,d,1)},off:function(a,c,d){if(a&&a.preventDefault&&a.handleObj){var e=a.handleObj;f(a.delegateTarget).off(e.namespace?e.type+"."+e.namespace:e.type,e.selector,e.handler);return this}if(typeof a=="object"){for(var g in a)this.off(g,c,a[g]);return this}if(c===!1||typeof c=="function")d=c,c=b;d===!1&&(d=J);return this.each(function(){f.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){f(this.context).on(a,this.selector,b,c);return this},die:function(a,b){f(this.context).off(a,this.selector||"**",b);return this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length==1?this.off(a,"**"):this.off(b,a,c)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f._data(this,"lastToggle"+a.guid)||0)%d;f._data(this,"lastToggle"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),f.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){f.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}if(j.nodeType===1){g||(j[d]=c,j.sizset=h);if(typeof b!="string"){if(j===b){k=!0;break}}else if(m.filter(b,[j]).length>0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}j.nodeType===1&&!g&&(j[d]=c,j.sizset=h);if(j.nodeName.toLowerCase()===b){k=j;break}j=j[a]}e[h]=k}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},m.matches=function(a,b){return m(a,null,null,b)},m.matchesSelector=function(a,b){return m(b,null,null,[a]).length>0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e<f;e++){h=o.order[e];if(g=o.leftMatch[h].exec(a)){i=g[1],g.splice(1,1);if(i.substr(i.length-1)!=="\\"){g[1]=(g[1]||"").replace(j,""),d=o.find[h](g,b,c);if(d!=null){a=a.replace(o.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},m.filter=function(a,c,d,e){var f,g,h,i,j,k,l,n,p,q=a,r=[],s=c,t=c&&c[0]&&m.isXML(c[0]);while(a&&c.length){for(h in o.filter)if((f=o.leftMatch[h].exec(a))!=null&&f[2]){k=o.filter[h],l=f[1],g=!1,f.splice(1,1);if(l.substr(l.length-1)==="\\")continue;s===r&&(r=[]);if(o.preFilter[h]){f=o.preFilter[h](f,s,d,r,e,t);if(!f)g=i=!0;else if(f===!0)continue}if(f)for(n=0;(j=s[n])!=null;n++)j&&(i=k(j,f,n,s),p=e^i,d&&i!=null?p?g=!0:s[n]=!1:p&&(r.push(j),g=!0));if(i!==b){d||(s=r),a=a.replace(o.match[h],"");if(!g)return[];break}}if(a===q)if(g==null)m.error(a);else break;q=a}return s},m.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)};var n=m.getText=function(a){var b,c,d=a.nodeType,e="";if(d){if(d===1||d===9){if(typeof a.textContent=="string")return a.textContent;if(typeof a.innerText=="string")return a.innerText.replace(k,"");for(a=a.firstChild;a;a=a.nextSibling)e+=n(a)}else if(d===3||d===4)return a.nodeValue}else for(b=0;c=a[b];b++)c.nodeType!==8&&(e+=n(c));return e},o=m.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b=="string",d=c&&!l.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&m.filter(b,a,!0)},">":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&m.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("parentNode",b,f,a,d,c)},"~":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("previousSibling",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(j,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}m.error(e)},CHILD:function(a,b){var c,e,f,g,h,i,j,k=b[1],l=a;switch(k){case"only":case"first":while(l=l.previousSibling)if(l.nodeType===1)return!1;if(k==="first")return!0;l=a;case"last":while(l=l.nextSibling)if(l.nodeType===1)return!1;return!0;case"nth":c=b[2],e=b[3];if(c===1&&e===0)return!0;f=b[0],g=a.parentNode;if(g&&(g[d]!==f||!a.nodeIndex)){i=0;for(l=g.firstChild;l;l=l.nextSibling)l.nodeType===1&&(l.nodeIndex=++i);g[d]=f}j=a.nodeIndex-e;return c===0?j===0:j%c===0&&j/c>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var u,v;c.documentElement.compareDocumentPosition?u=function(a,b){if(a===b){h=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(u=function(a,b){if(a===b){h=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],g=a.parentNode,i=b.parentNode,j=g;if(g===i)return v(a,b);if(!g)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return v(e[k],f[k]);return k===c?v(a,f[k],-1):v(e[k],b,1)},v=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h<i;h++)m(a,g[h],e,c);return m.filter(f,e)};m.attr=f.attr,m.selectors.attrMap={},f.find=m,f.expr=m.selectors,f.expr[":"]=f.expr.filters,f.unique=m.uniqueSort,f.text=m.getText,f.isXMLDoc=m.isXML,f.contains=m.contains}();var L=/Until$/,M=/^(?:parents|prevUntil|prevAll)/,N=/,/,O=/^.[^:#\[\.,]*$/,P=Array.prototype.slice,Q=f.expr.match.POS,R={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!="string")return f(a).filter(function(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack("","find",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(T(this,a,!1),"not",a)},filter:function(a){return this.pushStack(T(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?Q.test(a)?f(a,this.context).index(this[0])>=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d<a.length;d++)f(g).is(a[d])&&c.push({selector:a[d],elem:g,level:h});g=g.parentNode,h++}return c}var i=Q.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d<e;d++){g=this[d];while(g){if(i?i.index(g)>-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/<tbody/i,_=/<|&#?\w+;/,ba=/<(?:script|style)/i,bb=/<(?:script|object|embed|option|style)/i,bc=new RegExp("<(?:"+V+")","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*<!(?:\[CDATA\[|\-\-)/,bg={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div<div>","</div>"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function()
+{for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1></$2>");try{for(var c=0,d=this.length;c<d;c++)this[c].nodeType===1&&(f.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(e){this.empty().append(a)}}else f.isFunction(a)?this.each(function(b){var c=f(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bd.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bi(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,bp)}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i,j=a[0];b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof j=="string"&&j.length<512&&i===c&&j.charAt(0)==="<"&&!bb.test(j)&&(f.support.checkClone||!bd.test(j))&&(f.support.html5Clone||!bc.test(j))&&(g=!0,h=f.fragments[j],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[j]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||!bc.test("<"+a.nodeName)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1></$2>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");b===c?bh.appendChild(o):U(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]==="<table>"&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i<r;i++)bn(k[i]);else bn(k);k.nodeType?h.push(k):h=f.merge(h,k)}if(d){g=function(a){return!a.type||be.test(a.type)};for(j=0;h[j];j++)if(e&&f.nodeName(h[j],"script")&&(!h[j].type||h[j].type.toLowerCase()==="text/javascript"))e.push(h[j].parentNode?h[j].parentNode.removeChild(h[j]):h[j]);else{if(h[j].nodeType===1){var s=f.grep(h[j].getElementsByTagName("script"),g);h.splice.apply(h,[j+1,0].concat(s))}d.appendChild(h[j])}}return h},cleanData:function(a){var b,c,d=f.cache,e=f.event.special,g=f.support.deleteExpando;for(var h=0,i;(i=a[h])!=null;h++){if(i.nodeName&&f.noData[i.nodeName.toLowerCase()])continue;c=i[f.expando];if(c){b=d[c];if(b&&b.events){for(var j in b.events)e[j]?f.event.remove(i,j):f.removeEvent(i,j,b.handle);b.handle&&(b.handle.elem=null)}g?delete i[f.expando]:i.removeAttribute&&i.removeAttribute(f.expando),delete d[c]}}}});var bq=/alpha\([^)]*\)/i,br=/opacity=([^)]*)/,bs=/([A-Z]|^ms)/g,bt=/^-?\d+(?:px)?$/i,bu=/^-?\d/,bv=/^([\-+])=([\-+.\de]+)/,bw={position:"absolute",visibility:"hidden",display:"block"},bx=["Left","Right"],by=["Top","Bottom"],bz,bA,bB;f.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return f.access(this,a,c,!0,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)})},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bz(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bv.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(bz)return bz(a,c)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]}}),f.curCSS=f.css,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){var e;if(c){if(a.offsetWidth!==0)return bC(a,b,d);f.swap(a,bw,function(){e=bC(a,b,d)});return e}},set:function(a,b){if(!bt.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return br.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bq,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bq.test(g)?g.replace(bq,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,b){var c,d,e;b=b.replace(bs,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b)));return c}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bt.test(f)&&bu.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f||0,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bD=/%20/g,bE=/\[\]$/,bF=/\r?\n/g,bG=/#.*$/,bH=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bI=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bJ=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bK=/^(?:GET|HEAD)$/,bL=/^\/\//,bM=/\?/,bN=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bO=/^(?:select|textarea)/i,bP=/\s+/,bQ=/([?&])_=[^&]*/,bR=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bS=f.fn.load,bT={},bU={},bV,bW,bX=["*/"]+["*"];try{bV=e.href}catch(bY){bV=c.createElement("a"),bV.href="",bV=bV.href}bW=bR.exec(bV.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bS)return bS.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("<div>").append(c.replace(bN,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bO.test(this.nodeName)||bI.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bF,"\r\n")}}):{name:b.name,value:c.replace(bF,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b_(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b_(a,b);return a},ajaxSettings:{url:bV,isLocal:bJ.test(bW[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bX},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bZ(bT),ajaxTransport:bZ(bU),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?cb(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cc(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bH.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bG,"").replace(bL,bW[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bP),d.crossDomain==null&&(r=bR.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bW[1]&&r[2]==bW[2]&&(r[3]||(r[1]==="http:"?80:443))==(bW[3]||(bW[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),b$(bT,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bK.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bM.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bQ,"$1_="+x);d.url=y+(y===d.url?(bM.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bX+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=b$(bU,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)ca(g,a[g],c,e);return d.join("&").replace(bD,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cd=f.now(),ce=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cd++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ce.test(b.url)||e&&ce.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ce,l),b.url===j&&(e&&(k=k.replace(ce,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cf=a.ActiveXObject?function(){for(var a in ch)ch[a](0,1)}:!1,cg=0,ch;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ci()||cj()}:ci,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cf&&delete ch[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cg,cf&&(ch||(ch={},f(a).unload(cf)),ch[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var ck={},cl,cm,cn=/^(?:toggle|show|hide)$/,co=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cp,cq=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cr;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cu("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d.style&&(e=d.style.display,!f._data(d,"olddisplay")&&e==="none"&&(e=d.style.display=""),e===""&&f.css(d,"display")==="none"&&f._data(d,"olddisplay",cv(d.nodeName)));for(g=0;g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===""||e==="none")d.style.display=f._data(d,"olddisplay")||""}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(cu("hide",3),a,b,c);var d,e,g=0,h=this.length;for(;g<h;g++)d=this[g],d.style&&(e=f.css(d,"display"),e!=="none"&&!f._data(d,"olddisplay")&&f._data(d,"olddisplay",e));for(g=0;g<h;g++)this[g].style&&(this[g].style.display="none");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a=="boolean";f.isFunction(a)&&f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(":hidden");f(this)[b?"show":"hide"]()}):this.animate(cu("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){function g(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=c&&f(this).is(":hidden"),g,h,i,j,k,l,m,n,o;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&&(a[g]=a[i],delete a[i]),h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||"swing";if(h==="hide"&&d||h==="show"&&!d)return b.complete.call(this);c&&(g==="height"||g==="width")&&(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,"display")==="inline"&&f.css(this,"float")==="none"&&(!f.support.inlineBlockNeedsLayout||cv(this.nodeName)==="inline"?this.style.display="inline-block":this.style.zoom=1))}b.overflow!=null&&(this.style.overflow="hidden");for(i in a)j=new f.fx(this,b,i),h=a[i],cn.test(h)?(o=f._data(this,"toggle"+i)||(h==="toggle"?d?"show":"hide":0),o?(f._data(this,"toggle"+i,o==="show"?"hide":"show"),j[o]()):j[h]()):(k=co.exec(h),l=j.cur(),k?(m=parseFloat(k[2]),n=k[3]||(f.cssNumber[i]?"":"px"),n!=="px"&&(f.style(this,i,(m||1)+n),l=(m||1)/j.cur()*l,f.style(this,i,l+n)),k[1]&&(m=(k[1]==="-="?-1:1)*m+l),j.custom(l,m,n)):j.custom(l,h,""));return!0}var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return e.queue===!1?this.each(g):this.queue(e.queue,g)},stop:function(a,c,d){typeof a!="string"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||"fx",[]);return this.each(function(){function h(a,b,c){var e=b[c];f.removeData(a,c,!0),e.stop(d)}var b,c=!1,e=f.timers,g=f._data(this);d||f._unmark(!0,this);if(a==null)for(b in g)g[b]&&g[b].stop&&b.indexOf(".run")===b.length-4&&h(this,g,b);else g[b=a+".run"]&&g[b].stop&&h(this,g,b);for(b=e.length;b--;)e[b].elem===this&&(a==null||e[b].queue===a)&&(d?e[b](!0):e[b].saveState(),c=!0,e.splice(b,1));(!d||!c)&&f.dequeue(this,a)})}}),f.each({slideDown:cu("show",1),slideUp:cu("hide",1),slideToggle:cu("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&typeof a=="object"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,duration:a,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue="fx";d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue?f.dequeue(this,d.queue):a!==!1&&f._unmark(this)};return d},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,c,d){function h(a){return e.step(a)}var e=this,g=f.fx;this.startTime=cr||cs(),this.end=c,this.now=this.start=a,this.pos=this.state=0,this.unit=d||this.unit||(f.cssNumber[this.prop]?"":"px"),h.queue=this.options.queue,h.elem=this.elem,h.saveState=function(){e.options.hide&&f._data(e.elem,"fxshow"+e.prop)===b&&f._data(e.elem,"fxshow"+e.prop,e.start)},h()&&f.timers.push(h)&&!cp&&(cp=setInterval(g.tick,g.interval))},show:function(){var a=f._data(this.elem,"fxshow"+this.prop);this.options.orig[this.prop]=a||f.style(this.elem,this.prop),this.options.show=!0,a!==b?this.custom(this.cur(),a):this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f._data(this.elem,"fxshow"+this.prop)||f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b,c,d,e=cr||cs(),g=!0,h=this.elem,i=this.options;if(a||e>=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&b[c]===a&&b.splice(c--,1);b.length||f.fx.stop()},interval:13,stop:function(){clearInterval(cp),cp=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=a.now+a.unit:a.elem[a.prop]=a.now}}}),f.each(["width","height"],function(a,b){f.fx.step[b]=function(a){f.style(a.elem,b,Math.max(0,a.now)+a.unit)}}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var cw=/^t(?:able|d|h)$/i,cx=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?f.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(d){}var e=b.ownerDocument,g=e.documentElement;if(!c||!f.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=e.body,i=cy(e),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||f.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||f.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:f.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);var c,d=b.offsetParent,e=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(f.support.fixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===d&&(l+=b.offsetTop,m+=b.offsetLeft,f.support.doesNotAddBorder&&(!f.support.doesAddBorderForTableAndCells||!cw.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),e=d,d=b.offsetParent),f.support.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;f.support.fixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},f.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.support.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cy(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cy(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,d,"padding")):this[d]():null},f.fn["outer"+c]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,d,a?"margin":"border")):this[d]():null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNumeric(j)?j:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window);
\ No newline at end of file
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/xsd/readme.md b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/xsd/readme.md
new file mode 100644 (file)
index 0000000..687f28e
--- /dev/null
@@ -0,0 +1,59 @@
+# XSLT style for Test Case and Test Result
+
+## File structure
+
+- readme.txt
+- test_definition.xsd   // The schema of test definition
+- tests.css             // CSS style for showing test cases and results
+- testresult.xsl
+- testcase.xsl
+- tests.xml             //example of test cases
+- result.xml            //example of test result
+
+## Applying the style
+
+### Update in definition and result XML
+
+To apply this style for the definition XML of test cases, please add below statement before the root element of XML (the tag "test_definition").
+
+`<?xml-stylesheet type="text/xsl"  href="./testcase.xsl"?>`
+
+... such as:
+
+```
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl"  href="./testcase.xsl"?>
+<test_definition>
+```
+
+To apply this style for the test-result XML, please add below statement before the root element of XML (the tag "test_definition").
+
+`<?xml-stylesheet type="text/xsl"  href="./testresult.xsl"?>`
+
+... such as:
+
+```
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl"  href="./testresult.xsl"?>
+<test_definition>
+```
+
+### Deploy XSLT and CSS style
+
+Please add at least the 3 files into each test package.
+
+- tests.css
+- testresult.xsl
+- testcase.xsl
+
+... such as:
+
+```
+tct-alarm-tizen-tests/
+|-- ...
+|-- testcase.xsl
+|-- testresult.xsl
+|-- tests.css
+|-- ...
+```
+
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/xsd/release-notes b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/xsd/release-notes
new file mode 100644 (file)
index 0000000..30e97e8
--- /dev/null
@@ -0,0 +1,86 @@
+-- version 1.0.1-2 --
+
+ adding 2 new case types "compliance" and "user_experience"
+-- version 1.0.1-3 --
+ Add a new sub-element "spec" (type: string) under the "testcase" element.
+-- version 1.0.1-4 --
+  
+ Add 2 new priority "P3" and "P4"
+-- version 1.0.1-5 --
+ Add a new root "test_definition", and the element "suite" has been move into it as children elements.
+-- version 1.0.1-6 --
+ A new optional attribute "launcher" is added in the element "testdefinition" for supporting identifying which kind of test suites the XML is designed for
+
+-- version 1.0.1-7 --
+The Xslt related files are merged into this repo. 
+including 
+
+        tests.css             // CSS style for showing test cases and results
+        testresult.xsl
+        testcase.xsl
+        tests.xml             //example of test cases
+        result.xml            //example of test result
+        application.js        //Javascript for "back to top"
+        jquery.min.js         //JQuery
+        back_top.png          //image for "back to top"
+
+Modification in Schema:
+
+1\ the optional attribute "launcher" is moved into suite, not in "testdefinition" element any longer.
+
+2\ "spec" element is removed. and a new "specs" structure is added as below
+
+                                <specs>
+                                       <spec>
+                                               <spec_assertion category="Tizen Device API Specifications"
+                                                       section="Widget" specification="Widget Packaging and XML Configuration"
+                                                       interface="Widget" usage="true" />
+                                               <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+                                               <spec_statement>spec_statement</spec_statement>
+                                       </spec>
+                               </specs>
+All spec-related infomation are re-organized as XML element and attributes.
+
+In Xslt, 
+
+1\ a float image "Back to top" is available on right-bottom for scrolling to top.
+
+2\ html anchor is adder for scrolling back to suite summary table, and case detail tables.
+
+-- version 1.0.1-8 --
+1\ For more flexible, rename the attribute "method_or_attribute" to "element_name".
+2\ Add a new attribute "element_type" to describe the type of the corresponding specification item
+
+related example and Xlst is also updated for above.
+
+-- version 1.0.1-9 --
+1\ add an attribute "cts_version" in the element "environment/BuildInfoType" for saving the version of CTS tool
+2\ add an attribute "file" in "measurement/simpleMeasurementType"
+3\ update the result XSLt for showing cts_version
+4\ update the result XSLt for showing Â¡Â°Test Blocked¡± instead of "Test N/A"
+5\ add a summary table for showing all FAIL cases.
+
+
+-- version 1.0.2-1 --
+1\ add a new int optional attribute "onload_delay" with default "3"
+
+-- version 1.0.2-2 --
+1\ Add a new sub element "capabilities" under the element "testcase"
+2\ Add a new boolean attribute "check_unsupport_error" in the element "testcase"
+
+-- version 1.0.2-3 --
+1\ Move the sub element "capabilities" from the element "testcase" to the element "set"
+
+
+-- version 1.0.2-4 --
+1\ Add a unique limitation for suite name
+2\ Add a new optional attribute "launcher" in set 
+
+
+-- version 1.0.2-5 --
+1\ Add a attribute "set_debug_msg" in set for recording the name of log file.
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/xsd/result.xml b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/xsd/result.xml
new file mode 100644 (file)
index 0000000..948eee9
--- /dev/null
@@ -0,0 +1,1481 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<test_definition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="http://tempuri.org" type="" xsi:noNamespaceSchemaLocation="test_definition.xsd">
+  <environment device_id="generic/sdk/generic:4.0.4/MR1/302030:eng/test-keys" device_model="unknown" device_name="MR8" firmware_version="4.0.4" host="zhongqing-dev.sh.intel.com (Linux - 2.6.38.6-26.rc1.fc15.i686)" os_version="4.0.4" resolution="1280*800" screen_size="250*150" cts_version="2.3.0-3">
+    <other> Here is a Long String for testing ~~~~~~~~~~~~~~~~~~~
+    Here is a Long String for testing ~~~~~~~~~~~~~~~~~~~
+    Here is a Long String for testing ~~~~~~~~~~~~~~~~~~~
+    </other>
+  </environment>
+  <summary test_plan_name="tmp_test_1">
+    <start_at>Fri Jul 13 04:04:59 CST 2012</start_at>
+    <end_at>Fri Jul 13 05:01:53 CST 2012</end_at>
+  </summary>
+  <suite name="webapi-tizen-alarm-tests" type="">
+    <set name="Alarm1">
+      <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmRelative_constructor_delay" priority="P1" purpose="check AlarmRelative attribute when create with delay" status="approved" type="compliance" result="PASS">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>check AlarmRelative create constructor with delay
+              </step_desc>
+              <expected>AlarmRelative create succeed with constructor with
+                delay
+              </expected>
+            </step>
+          </steps>
+          <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_constructor_delay.htm
+          </test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+        <result_info>
+          <actual_result>PASS</actual_result>
+          <start>Sat Jan 01 2000 13:43:44 GMT+0900 (KST)</start>
+          <end>Sat Jan 01 2000 13:43:46 GMT+0900 (KST)</end>
+          <stdout/>
+        </result_info>
+      </testcase>
+      <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_get" priority="P1" purpose="check AlarmManager method removeAll: without input attribute" status="approved" type="compliance" result="BLOCK">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>check AlarmManager method get: default check
+              </step_desc>
+              <expected>AlarmManager method get: default check succeed
+              </expected>
+            </step>
+          </steps>
+          <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_get.htm
+          </test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+        <result_info>
+          <actual_result>BLOCK</actual_result>
+          <start>Sat Jan 01 2000 13:43:46 GMT+0900 (KST)</start>
+          <end>Sat Jan 01 2000 13:44:02 GMT+0900 (KST)</end>
+          <stdout>Test time out</stdout>
+        </result_info>
+      </testcase>
+      <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmAbsolute_attri_date_01" priority="P1" purpose="check AlarmAbsolute attribute when create with date" status="approved" type="compliance">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>check AlarmAbsolute attribute when create with date
+              </step_desc>
+              <expected>AlarmAbsolute attribute return correct value when
+                create with date
+              </expected>
+            </step>
+          </steps>
+          <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_attri_date.htm?total_num=3&amp;locator_key=id&amp;value=1
+          </test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+        <result_info>
+          <actual_result>N/R</actual_result>
+          <start>Sat Jan 01 2000 13:44:02 GMT+0900 (KST)</start>
+          <end>Sat Jan 01 2000 13:44:05 GMT+0900 (KST)</end>
+          <stdout/>
+        </result_info>
+      </testcase>
+      <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_add_rel" priority="P1" purpose="check AlarmManager method add: add relative alarm" status="approved" type="compliance" result="FAIL">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>check AlarmManager method add: add relative alarm
+              </step_desc>
+              <expected>AlarmManager method add: add relative alarm succeed
+              </expected>
+            </step>
+          </steps>
+          <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_add_rel.htm
+          </test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+        <result_info>
+          <actual_result>FAIL</actual_result>
+          <start>Sat Jan 01 2000 13:44:05 GMT+0900 (KST)</start>
+          <end>Sat Jan 01 2000 13:44:21 GMT+0900 (KST)</end>
+          <stdout>Test time out</stdout>
+        </result_info>
+      </testcase>
+      <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmRelative_attri_delay_02" priority="P1" purpose="check AlarmAbsolute attribute when create with period" status="approved" type="compliance" result="FAIL">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>check AlarmRelative attribute when create with delay
+              </step_desc>
+              <expected>AlarmRelative attribute return correct value when
+                create succeed with with delay
+              </expected>
+            </step>
+          </steps>
+          <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_attri_delay.htm?total_num=2&amp;locator_key=id&amp;value=2
+          </test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+        <result_info>
+          <actual_result>FAIL</actual_result>
+          <start>Sat Jan 01 2000 13:44:21 GMT+0900 (KST)</start>
+          <end>Sat Jan 01 2000 13:44:23 GMT+0900 (KST)</end>
+          <stdout/>
+        </result_info>
+      </testcase>
+      <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_getAll" priority="P1" purpose="check AlarmManager method getAll: default check" status="approved" type="compliance" result="FAIL">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>check AlarmManager method getAll: default check
+              </step_desc>
+              <expected>AlarmManager method getAll: default check succeed
+              </expected>
+            </step>
+          </steps>
+          <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_getAll.htm
+          </test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+        <result_info>
+          <actual_result>FAIL</actual_result>
+          <start>Sat Jan 01 2000 13:44:23 GMT+0900 (KST)</start>
+          <end>Sat Jan 01 2000 13:44:39 GMT+0900 (KST)</end>
+          <stdout>Test time out</stdout>
+        </result_info>
+      </testcase>
+      <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmAbsolute_attri_date_03" priority="P1" purpose="check AlarmAbsolute attribute when create with date" status="approved" type="compliance" result="Blocked">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>check AlarmAbsolute attribute when create with date
+              </step_desc>
+              <expected>AlarmAbsolute attribute return correct value when
+                create with date
+              </expected>
+            </step>
+          </steps>
+          <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_attri_date.htm?total_num=3&amp;locator_key=id&amp;value=3
+          </test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+        <result_info>
+          <actual_result>FAIL</actual_result>
+          <start>Sat Jan 01 2000 13:44:39 GMT+0900 (KST)</start>
+          <end>Sat Jan 01 2000 13:44:41 GMT+0900 (KST)</end>
+          <stdout/>
+        </result_info>
+      </testcase>
+      <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmAbsolute_getNextScheduledDate_date" priority="P1" purpose="check AlarmAbsolute method getNextScheduledDate when create with date" status="approved" type="compliance" result="FAIL">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>check AlarmAbsolute method getNextScheduledDate when
+                create with date
+              </step_desc>
+              <expected>AlarmAbsolute method getNextScheduledDate return
+                correct value when create with date
+              </expected>
+            </step>
+          </steps>
+          <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_getNextScheduledDate_date.htm
+          </test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+        <result_info>
+          <actual_result>FAIL</actual_result>
+          <start>Sat Jan 01 2000 13:44:41 GMT+0900 (KST)</start>
+          <end>Sat Jan 01 2000 13:44:57 GMT+0900 (KST)</end>
+          <stdout>Test time out</stdout>
+        </result_info>
+      </testcase>
+      <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmAbsolute_constructor_date" priority="P1" purpose="check AlarmAbsolute create constructor with date" status="approved" type="compliance" result="FAIL">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>check AlarmAbsolute create constructor with date
+              </step_desc>
+              <expected>AlarmAbsolute create succeed with constructor with date
+              </expected>
+            </step>
+          </steps>
+          <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_constructor_date.htm
+          </test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+        <result_info>
+          <actual_result>FAIL</actual_result>
+          <start>Sat Jan 01 2000 13:44:57 GMT+0900 (KST)</start>
+          <end>Sat Jan 01 2000 13:45:13 GMT+0900 (KST)</end>
+          <stdout>Test time out</stdout>
+        </result_info>
+      </testcase>
+      <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmRelative_getRemainingSeconds_delay" priority="P1" purpose="check AlarmRelative method getNextScheduleddelay when create with delay" status="approved" type="compliance" result="FAIL">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>check AlarmRelative method getNextScheduleddelay when
+                create with delay
+              </step_desc>
+              <expected>AlarmRelative method getNextScheduleddelay return
+                correct value when create succeed with with delay
+              </expected>
+            </step>
+          </steps>
+          <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_getRemainingSeconds_delay.htm
+          </test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+        <result_info>
+          <actual_result>FAIL</actual_result>
+          <start>Sat Jan 01 2000 13:45:13 GMT+0900 (KST)</start>
+          <end>Sat Jan 01 2000 13:45:30 GMT+0900 (KST)</end>
+          <stdout>Test time out</stdout>
+        </result_info>
+      </testcase>
+      <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmRelative_attri_delay_01" priority="P1" purpose="check AlarmAbsolute attribute when create with period" status="approved" type="compliance" result="FAIL">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>check AlarmRelative attribute when create with delay
+              </step_desc>
+              <expected>AlarmRelative attribute return correct value when
+                create succeed with with delay
+              </expected>
+            </step>
+          </steps>
+          <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_attri_delay.htm?total_num=2&amp;locator_key=id&amp;value=1
+          </test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+        <result_info>
+          <actual_result>FAIL</actual_result>
+          <start>Sat Jan 01 2000 13:45:30 GMT+0900 (KST)</start>
+          <end>Sat Jan 01 2000 13:45:32 GMT+0900 (KST)</end>
+          <stdout/>
+        </result_info>
+      </testcase>
+      <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_add_abs" priority="P1" purpose="check AlarmManager method add: add absolute alarm" status="approved" type="compliance" result="FAIL">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>check AlarmManager method add: add absolute alarm
+              </step_desc>
+              <expected>AlarmManager method add: add absolute alarm succeed
+              </expected>
+            </step>
+          </steps>
+          <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_add_abs.htm
+          </test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+        <result_info>
+          <actual_result>FAIL</actual_result>
+          <start>Sat Jan 01 2000 13:45:32 GMT+0900 (KST)</start>
+          <end>Sat Jan 01 2000 13:45:48 GMT+0900 (KST)</end>
+          <stdout>Test time out</stdout>
+        </result_info>
+      </testcase>
+      <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmAbsolute_attri_date_02" priority="P1" purpose="check AlarmAbsolute attribute when create with date" status="approved" type="compliance" result="FAIL">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>check AlarmAbsolute attribute when create with date
+              </step_desc>
+              <expected>AlarmAbsolute attribute return correct value when
+                create with date
+              </expected>
+            </step>
+          </steps>
+          <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_attri_date.htm?total_num=3&amp;locator_key=id&amp;value=2
+          </test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+        <result_info>
+          <actual_result>FAIL</actual_result>
+          <start>Sat Jan 01 2000 13:45:48 GMT+0900 (KST)</start>
+          <end>Sat Jan 01 2000 13:45:50 GMT+0900 (KST)</end>
+          <stdout/>
+        </result_info>
+      </testcase>
+      <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_removeAll" priority="P1" purpose="check AlarmManager method removeAll: default check" status="approved" type="compliance" result="FAIL">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>check AlarmManager method removeAll: default check
+              </step_desc>
+              <expected>AlarmManager method removeAll: default check succeed
+              </expected>
+            </step>
+          </steps>
+          <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_removeAll.htm
+          </test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+        <result_info>
+          <actual_result>FAIL</actual_result>
+          <start>Sat Jan 01 2000 13:45:50 GMT+0900 (KST)</start>
+          <end>Sat Jan 01 2000 13:46:06 GMT+0900 (KST)</end>
+          <stdout>Test time out</stdout>
+        </result_info>
+      </testcase>
+      <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_remove" priority="P1" purpose="check AlarmManager method remove: default check" status="approved" type="compliance" result="FAIL">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>check AlarmManager method remove: default check
+              </step_desc>
+              <expected>AlarmManager method remove: default check succeed
+              </expected>
+            </step>
+          </steps>
+          <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_remove.htm
+          </test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+        <result_info>
+          <actual_result>FAIL</actual_result>
+          <start>Sat Jan 01 2000 13:46:06 GMT+0900 (KST)</start>
+          <end>Sat Jan 01 2000 13:46:22 GMT+0900 (KST)</end>
+          <stdout>Test time out</stdout>
+        </result_info>
+      </testcase>
+      <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManagerObject_exist" priority="P1" purpose="check AlarmManagerObject existance" status="approved" type="compliance" result="FAIL">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>check AlarmManagerObject exist</step_desc>
+              <expected>AlarmManagerObject exist</expected>
+            </step>
+          </steps>
+          <test_script_entry test_script_expected_result="">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManagerObject_exist.htm
+          </test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+        <result_info>
+          <actual_result>FAIL</actual_result>
+          <start>Sat Jan 01 2000 13:46:22 GMT+0900 (KST)</start>
+          <end>Sat Jan 01 2000 13:46:38 GMT+0900 (KST)</end>
+          <stdout>Test time out</stdout>
+        </result_info>
+      </testcase>
+      <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_const_check_01" priority="P1" purpose="Check AlarmManager constants:PERIOD_MINUTE" status="approved" type="compliance" result="FAIL">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>Check AlarmManager constants:</step_desc>
+              <expected>AlarmManager constants value is correct:</expected>
+            </step>
+          </steps>
+          <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_const_check.htm?total_num=4&amp;locator_key=id&amp;value=1
+          </test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+        <result_info>
+          <actual_result>FAIL</actual_result>
+          <start>Sat Jan 01 2000 13:46:38 GMT+0900 (KST)</start>
+          <end>Sat Jan 01 2000 13:46:40 GMT+0900 (KST)</end>
+          <stdout>Can't find variable: tizen</stdout>
+        </result_info>
+      </testcase>
+      <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_const_check_02" priority="P1" purpose="Check AlarmManager constants:PERIOD_HOUR" status="approved" type="compliance" result="FAIL">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>Check AlarmManager constants:</step_desc>
+              <expected>AlarmManager constants value is correct:</expected>
+            </step>
+          </steps>
+          <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_const_check.htm?total_num=4&amp;locator_key=id&amp;value=2
+          </test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+        <result_info>
+          <actual_result>FAIL</actual_result>
+          <start>Sat Jan 01 2000 13:46:40 GMT+0900 (KST)</start>
+          <end>Sat Jan 01 2000 13:46:42 GMT+0900 (KST)</end>
+          <stdout>Can't find variable: tizen</stdout>
+        </result_info>
+      </testcase>
+      <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_const_check_03" priority="P1" purpose="Check AlarmManager constants:PERIOD_DAY" status="approved" type="compliance" result="FAIL">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>Check AlarmManager constants:</step_desc>
+              <expected>AlarmManager constants value is correct:</expected>
+            </step>
+          </steps>
+          <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_const_check.htm?total_num=4&amp;locator_key=id&amp;value=3
+          </test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+        <result_info>
+          <actual_result>FAIL</actual_result>
+          <start>Sat Jan 01 2000 13:46:42 GMT+0900 (KST)</start>
+          <end>Sat Jan 01 2000 13:46:44 GMT+0900 (KST)</end>
+          <stdout>Can't find variable: tizen</stdout>
+        </result_info>
+      </testcase>
+      <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_const_check_04" priority="P1" purpose="Check AlarmManager constants:PERIOD_WEEK" status="approved" type="compliance" result="FAIL">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>Check AlarmManager constants:</step_desc>
+              <expected>AlarmManager constants value is correct:</expected>
+            </step>
+          </steps>
+          <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_const_check.htm?total_num=4&amp;locator_key=id&amp;value=4
+          </test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+        <result_info>
+          <actual_result>FAIL</actual_result>
+          <start>Sat Jan 01 2000 13:46:44 GMT+0900 (KST)</start>
+          <end>Sat Jan 01 2000 13:46:46 GMT+0900 (KST)</end>
+          <stdout>Can't find variable: tizen</stdout>
+        </result_info>
+      </testcase>
+    </set>
+    <set name="Alarm">
+      <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmRelative_constructor_delay" priority="P1" purpose="check AlarmRelative attribute when create with delay" status="approved" type="compliance" result="PASS">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>check AlarmRelative create constructor with delay
+              </step_desc>
+              <expected>AlarmRelative create succeed with constructor with
+                delay
+              </expected>
+            </step>
+          </steps>
+          <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_constructor_delay.htm
+          </test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+        <result_info>
+          <actual_result>PASS</actual_result>
+          <start>Sat Jan 01 2000 13:43:44 GMT+0900 (KST)</start>
+          <end>Sat Jan 01 2000 13:43:46 GMT+0900 (KST)</end>
+          <stdout/>
+        </result_info>
+      </testcase>
+      <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_get" priority="P1" purpose="check AlarmManager method removeAll: without input attribute" status="approved" type="compliance" result="FAIL">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>check AlarmManager method get: default check
+              </step_desc>
+              <expected>AlarmManager method get: default check succeed
+              </expected>
+            </step>
+          </steps>
+          <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_get.htm
+          </test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+        <result_info>
+          <actual_result>FAIL</actual_result>
+          <start>Sat Jan 01 2000 13:43:46 GMT+0900 (KST)</start>
+          <end>Sat Jan 01 2000 13:44:02 GMT+0900 (KST)</end>
+          <stdout>Test time out</stdout>
+        </result_info>
+      </testcase>
+      <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmAbsolute_attri_date_01" priority="P1" purpose="check AlarmAbsolute attribute when create with date" status="approved" type="compliance" result="FAIL">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>check AlarmAbsolute attribute when create with date
+              </step_desc>
+              <expected>AlarmAbsolute attribute return correct value when
+                create with date
+              </expected>
+            </step>
+          </steps>
+          <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_attri_date.htm?total_num=3&amp;locator_key=id&amp;value=1
+          </test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+        <result_info>
+          <actual_result>FAIL</actual_result>
+          <start>Sat Jan 01 2000 13:44:02 GMT+0900 (KST)</start>
+          <end>Sat Jan 01 2000 13:44:05 GMT+0900 (KST)</end>
+          <stdout/>
+        </result_info>
+      </testcase>
+      <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_add_rel" priority="P1" purpose="check AlarmManager method add: add relative alarm" status="approved" type="compliance" result="FAIL">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>check AlarmManager method add: add relative alarm
+              </step_desc>
+              <expected>AlarmManager method add: add relative alarm succeed
+              </expected>
+            </step>
+          </steps>
+          <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_add_rel.htm
+          </test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+        <result_info>
+          <actual_result>FAIL</actual_result>
+          <start>Sat Jan 01 2000 13:44:05 GMT+0900 (KST)</start>
+          <end>Sat Jan 01 2000 13:44:21 GMT+0900 (KST)</end>
+          <stdout>Test time out</stdout>
+        </result_info>
+      </testcase>
+      <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmRelative_attri_delay_02" priority="P1" purpose="check AlarmAbsolute attribute when create with period" status="approved" type="compliance" result="FAIL">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>check AlarmRelative attribute when create with delay
+              </step_desc>
+              <expected>AlarmRelative attribute return correct value when
+                create succeed with with delay
+              </expected>
+            </step>
+          </steps>
+          <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_attri_delay.htm?total_num=2&amp;locator_key=id&amp;value=2
+          </test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+        <result_info>
+          <actual_result>FAIL</actual_result>
+          <start>Sat Jan 01 2000 13:44:21 GMT+0900 (KST)</start>
+          <end>Sat Jan 01 2000 13:44:23 GMT+0900 (KST)</end>
+          <stdout/>
+        </result_info>
+      </testcase>
+    </set>
+  </suite>
+  <suite name="webapi-tizen-alarm-tests1" type="">
+    <set name="Alarm4">
+      <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmRelative_constructor_delay" priority="P1" purpose="check AlarmRelative attribute when create with delay" status="approved" type="compliance" result="PASS">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>check AlarmRelative create constructor with delay
+              </step_desc>
+              <expected>AlarmRelative create succeed with constructor with
+                delay
+              </expected>
+            </step>
+          </steps>
+          <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_constructor_delay.htm
+          </test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+        <result_info>
+          <actual_result>PASS</actual_result>
+          <start>Sat Jan 01 2000 13:43:44 GMT+0900 (KST)</start>
+          <end>Sat Jan 01 2000 13:43:46 GMT+0900 (KST)</end>
+          <stdout/>
+        </result_info>
+      </testcase>
+      <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_get" priority="P1" purpose="check AlarmManager method removeAll: without input attribute" status="approved" type="compliance" result="FAIL">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>check AlarmManager method get: default check
+              </step_desc>
+              <expected>AlarmManager method get: default check succeed
+              </expected>
+            </step>
+          </steps>
+          <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_get.htm
+          </test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+        <result_info>
+          <actual_result>FAIL</actual_result>
+          <start>Sat Jan 01 2000 13:43:46 GMT+0900 (KST)</start>
+          <end>Sat Jan 01 2000 13:44:02 GMT+0900 (KST)</end>
+          <stdout>Test time out</stdout>
+        </result_info>
+      </testcase>
+      <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmAbsolute_attri_date_01" priority="P1" purpose="check AlarmAbsolute attribute when create with date" status="approved" type="compliance" result="FAIL">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>check AlarmAbsolute attribute when create with date
+              </step_desc>
+              <expected>AlarmAbsolute attribute return correct value when
+                create with date
+              </expected>
+            </step>
+          </steps>
+          <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_attri_date.htm?total_num=3&amp;locator_key=id&amp;value=1
+          </test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+        <result_info>
+          <actual_result>FAIL</actual_result>
+          <start>Sat Jan 01 2000 13:44:02 GMT+0900 (KST)</start>
+          <end>Sat Jan 01 2000 13:44:05 GMT+0900 (KST)</end>
+          <stdout/>
+        </result_info>
+      </testcase>
+      <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_add_rel" priority="P1" purpose="check AlarmManager method add: add relative alarm" status="approved" type="compliance" result="FAIL">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>check AlarmManager method add: add relative alarm
+              </step_desc>
+              <expected>AlarmManager method add: add relative alarm succeed
+              </expected>
+            </step>
+          </steps>
+          <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_add_rel.htm
+          </test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+        <result_info>
+          <actual_result>FAIL</actual_result>
+          <start>Sat Jan 01 2000 13:44:05 GMT+0900 (KST)</start>
+          <end>Sat Jan 01 2000 13:44:21 GMT+0900 (KST)</end>
+          <stdout>Test time out</stdout>
+        </result_info>
+      </testcase>
+      <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmRelative_attri_delay_02" priority="P1" purpose="check AlarmAbsolute attribute when create with period" status="approved" type="compliance" result="FAIL">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>check AlarmRelative attribute when create with delay
+              </step_desc>
+              <expected>AlarmRelative attribute return correct value when
+                create succeed with with delay
+              </expected>
+            </step>
+          </steps>
+          <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_attri_delay.htm?total_num=2&amp;locator_key=id&amp;value=2
+          </test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+        <result_info>
+          <actual_result>FAIL</actual_result>
+          <start>Sat Jan 01 2000 13:44:21 GMT+0900 (KST)</start>
+          <end>Sat Jan 01 2000 13:44:23 GMT+0900 (KST)</end>
+          <stdout/>
+        </result_info>
+      </testcase>
+      <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_getAll" priority="P1" purpose="check AlarmManager method getAll: default check" status="approved" type="compliance" result="FAIL">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>check AlarmManager method getAll: default check
+              </step_desc>
+              <expected>AlarmManager method getAll: default check succeed
+              </expected>
+            </step>
+          </steps>
+          <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_getAll.htm
+          </test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+        <result_info>
+          <actual_result>FAIL</actual_result>
+          <start>Sat Jan 01 2000 13:44:23 GMT+0900 (KST)</start>
+          <end>Sat Jan 01 2000 13:44:39 GMT+0900 (KST)</end>
+          <stdout>Test time out</stdout>
+        </result_info>
+      </testcase>
+      <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmAbsolute_attri_date_03" priority="P1" purpose="check AlarmAbsolute attribute when create with date" status="approved" type="compliance" result="FAIL">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>check AlarmAbsolute attribute when create with date
+              </step_desc>
+              <expected>AlarmAbsolute attribute return correct value when
+                create with date
+              </expected>
+            </step>
+          </steps>
+          <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_attri_date.htm?total_num=3&amp;locator_key=id&amp;value=3
+          </test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+        <result_info>
+          <actual_result>FAIL</actual_result>
+          <start>Sat Jan 01 2000 13:44:39 GMT+0900 (KST)</start>
+          <end>Sat Jan 01 2000 13:44:41 GMT+0900 (KST)</end>
+          <stdout/>
+        </result_info>
+      </testcase>
+      <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmAbsolute_getNextScheduledDate_date" priority="P1" purpose="check AlarmAbsolute method getNextScheduledDate when create with date" status="approved" type="compliance" result="FAIL">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>check AlarmAbsolute method getNextScheduledDate when
+                create with date
+              </step_desc>
+              <expected>AlarmAbsolute method getNextScheduledDate return
+                correct value when create with date
+              </expected>
+            </step>
+          </steps>
+          <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_getNextScheduledDate_date.htm
+          </test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+        <result_info>
+          <actual_result>FAIL</actual_result>
+          <start>Sat Jan 01 2000 13:44:41 GMT+0900 (KST)</start>
+          <end>Sat Jan 01 2000 13:44:57 GMT+0900 (KST)</end>
+          <stdout>Test time out</stdout>
+        </result_info>
+      </testcase>
+      <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmAbsolute_constructor_date" priority="P1" purpose="check AlarmAbsolute create constructor with date" status="approved" type="compliance" result="FAIL">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>check AlarmAbsolute create constructor with date
+              </step_desc>
+              <expected>AlarmAbsolute create succeed with constructor with date
+              </expected>
+            </step>
+          </steps>
+          <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_constructor_date.htm
+          </test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+        <result_info>
+          <actual_result>FAIL</actual_result>
+          <start>Sat Jan 01 2000 13:44:57 GMT+0900 (KST)</start>
+          <end>Sat Jan 01 2000 13:45:13 GMT+0900 (KST)</end>
+          <stdout>Test time out</stdout>
+        </result_info>
+      </testcase>
+      <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmRelative_getRemainingSeconds_delay" priority="P1" purpose="check AlarmRelative method getNextScheduleddelay when create with delay" status="approved" type="compliance" result="FAIL">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>check AlarmRelative method getNextScheduleddelay when
+                create with delay
+              </step_desc>
+              <expected>AlarmRelative method getNextScheduleddelay return
+                correct value when create succeed with with delay
+              </expected>
+            </step>
+          </steps>
+          <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_getRemainingSeconds_delay.htm
+          </test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+        <result_info>
+          <actual_result>FAIL</actual_result>
+          <start>Sat Jan 01 2000 13:45:13 GMT+0900 (KST)</start>
+          <end>Sat Jan 01 2000 13:45:30 GMT+0900 (KST)</end>
+          <stdout>Test time out</stdout>
+        </result_info>
+      </testcase>
+      <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmRelative_attri_delay_01" priority="P1" purpose="check AlarmAbsolute attribute when create with period" status="approved" type="compliance" result="FAIL">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>check AlarmRelative attribute when create with delay
+              </step_desc>
+              <expected>AlarmRelative attribute return correct value when
+                create succeed with with delay
+              </expected>
+            </step>
+          </steps>
+          <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_attri_delay.htm?total_num=2&amp;locator_key=id&amp;value=1
+          </test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+        <result_info>
+          <actual_result>FAIL</actual_result>
+          <start>Sat Jan 01 2000 13:45:30 GMT+0900 (KST)</start>
+          <end>Sat Jan 01 2000 13:45:32 GMT+0900 (KST)</end>
+          <stdout/>
+        </result_info>
+      </testcase>
+      <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_add_abs" priority="P1" purpose="check AlarmManager method add: add absolute alarm" status="approved" type="compliance" result="FAIL">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>check AlarmManager method add: add absolute alarm
+              </step_desc>
+              <expected>AlarmManager method add: add absolute alarm succeed
+              </expected>
+            </step>
+          </steps>
+          <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_add_abs.htm
+          </test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+        <result_info>
+          <actual_result>FAIL</actual_result>
+          <start>Sat Jan 01 2000 13:45:32 GMT+0900 (KST)</start>
+          <end>Sat Jan 01 2000 13:45:48 GMT+0900 (KST)</end>
+          <stdout>Test time out</stdout>
+        </result_info>
+      </testcase>
+      <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmAbsolute_attri_date_02" priority="P1" purpose="check AlarmAbsolute attribute when create with date" status="approved" type="compliance" result="FAIL">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>check AlarmAbsolute attribute when create with date
+              </step_desc>
+              <expected>AlarmAbsolute attribute return correct value when
+                create with date
+              </expected>
+            </step>
+          </steps>
+          <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_attri_date.htm?total_num=3&amp;locator_key=id&amp;value=2
+          </test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+        <result_info>
+          <actual_result>FAIL</actual_result>
+          <start>Sat Jan 01 2000 13:45:48 GMT+0900 (KST)</start>
+          <end>Sat Jan 01 2000 13:45:50 GMT+0900 (KST)</end>
+          <stdout/>
+        </result_info>
+      </testcase>
+      <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_removeAll" priority="P1" purpose="check AlarmManager method removeAll: default check" status="approved" type="compliance" result="FAIL">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>check AlarmManager method removeAll: default check
+              </step_desc>
+              <expected>AlarmManager method removeAll: default check succeed
+              </expected>
+            </step>
+          </steps>
+          <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_removeAll.htm
+          </test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+        <result_info>
+          <actual_result>FAIL</actual_result>
+          <start>Sat Jan 01 2000 13:45:50 GMT+0900 (KST)</start>
+          <end>Sat Jan 01 2000 13:46:06 GMT+0900 (KST)</end>
+          <stdout>Test time out</stdout>
+        </result_info>
+      </testcase>
+      <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_remove" priority="P1" purpose="check AlarmManager method remove: default check" status="approved" type="compliance" result="FAIL">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>check AlarmManager method remove: default check
+              </step_desc>
+              <expected>AlarmManager method remove: default check succeed
+              </expected>
+            </step>
+          </steps>
+          <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_remove.htm
+          </test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+        <result_info>
+          <actual_result>FAIL</actual_result>
+          <start>Sat Jan 01 2000 13:46:06 GMT+0900 (KST)</start>
+          <end>Sat Jan 01 2000 13:46:22 GMT+0900 (KST)</end>
+          <stdout>Test time out</stdout>
+        </result_info>
+      </testcase>
+      <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManagerObject_exist" priority="P1" purpose="check AlarmManagerObject existance" status="approved" type="compliance" result="FAIL">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>check AlarmManagerObject exist</step_desc>
+              <expected>AlarmManagerObject exist</expected>
+            </step>
+          </steps>
+          <test_script_entry test_script_expected_result="">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManagerObject_exist.htm
+          </test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+        <result_info>
+          <actual_result>FAIL</actual_result>
+          <start>Sat Jan 01 2000 13:46:22 GMT+0900 (KST)</start>
+          <end>Sat Jan 01 2000 13:46:38 GMT+0900 (KST)</end>
+          <stdout>Test time out</stdout>
+        </result_info>
+      </testcase>
+      <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_const_check_01" priority="P1" purpose="Check AlarmManager constants:PERIOD_MINUTE" status="approved" type="compliance" result="FAIL">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>Check AlarmManager constants:</step_desc>
+              <expected>AlarmManager constants value is correct:</expected>
+            </step>
+          </steps>
+          <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_const_check.htm?total_num=4&amp;locator_key=id&amp;value=1
+          </test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+        <result_info>
+          <actual_result>FAIL</actual_result>
+          <start>Sat Jan 01 2000 13:46:38 GMT+0900 (KST)</start>
+          <end>Sat Jan 01 2000 13:46:40 GMT+0900 (KST)</end>
+          <stdout>Can't find variable: tizen</stdout>
+        </result_info>
+      </testcase>
+      <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_const_check_02" priority="P1" purpose="Check AlarmManager constants:PERIOD_HOUR" status="approved" type="compliance" result="FAIL">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>Check AlarmManager constants:</step_desc>
+              <expected>AlarmManager constants value is correct:</expected>
+            </step>
+          </steps>
+          <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_const_check.htm?total_num=4&amp;locator_key=id&amp;value=2
+          </test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+        <result_info>
+          <actual_result>FAIL</actual_result>
+          <start>Sat Jan 01 2000 13:46:40 GMT+0900 (KST)</start>
+          <end>Sat Jan 01 2000 13:46:42 GMT+0900 (KST)</end>
+          <stdout>Can't find variable: tizen</stdout>
+        </result_info>
+      </testcase>
+      <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_const_check_03" priority="P1" purpose="Check AlarmManager constants:PERIOD_DAY" status="approved" type="compliance" result="FAIL">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>Check AlarmManager constants:</step_desc>
+              <expected>AlarmManager constants value is correct:</expected>
+            </step>
+          </steps>
+          <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_const_check.htm?total_num=4&amp;locator_key=id&amp;value=3
+          </test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+        <result_info>
+          <actual_result>FAIL</actual_result>
+          <start>Sat Jan 01 2000 13:46:42 GMT+0900 (KST)</start>
+          <end>Sat Jan 01 2000 13:46:44 GMT+0900 (KST)</end>
+          <stdout>Can't find variable: tizen</stdout>
+        </result_info>
+      </testcase>
+      <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_const_check_04" priority="P1" purpose="Check AlarmManager constants:PERIOD_WEEK" status="approved" type="compliance" result="FAIL">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>Check AlarmManager constants:</step_desc>
+              <expected>AlarmManager constants value is correct:</expected>
+            </step>
+          </steps>
+          <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_const_check.htm?total_num=4&amp;locator_key=id&amp;value=4
+          </test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+        <result_info>
+          <actual_result>FAIL</actual_result>
+          <start>Sat Jan 01 2000 13:46:44 GMT+0900 (KST)</start>
+          <end>Sat Jan 01 2000 13:46:46 GMT+0900 (KST)</end>
+          <stdout>Can't find variable: tizen</stdout>
+        </result_info>
+      </testcase>
+    </set>
+    <set name="Alarm3">
+      <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmRelative_constructor_delay" priority="P1" purpose="check AlarmRelative attribute when create with delay" status="approved" type="compliance" result="PASS">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>check AlarmRelative create constructor with delay
+              </step_desc>
+              <expected>AlarmRelative create succeed with constructor with
+                delay
+              </expected>
+            </step>
+          </steps>
+          <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_constructor_delay.htm
+          </test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+        <result_info>
+          <actual_result>PASS</actual_result>
+          <start>Sat Jan 01 2000 13:43:44 GMT+0900 (KST)</start>
+          <end>Sat Jan 01 2000 13:43:46 GMT+0900 (KST)</end>
+          <stdout/>
+        </result_info>
+      </testcase>
+      <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_get" priority="P1" purpose="check AlarmManager method removeAll: without input attribute" status="approved" type="compliance" result="FAIL">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>check AlarmManager method get: default check
+              </step_desc>
+              <expected>AlarmManager method get: default check succeed
+              </expected>
+            </step>
+          </steps>
+          <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_get.htm
+          </test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+        <result_info>
+          <actual_result>FAIL</actual_result>
+          <start>Sat Jan 01 2000 13:43:46 GMT+0900 (KST)</start>
+          <end>Sat Jan 01 2000 13:44:02 GMT+0900 (KST)</end>
+          <stdout>Test time out</stdout>
+        </result_info>
+      </testcase>
+      <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmAbsolute_attri_date_01" priority="P1" purpose="check AlarmAbsolute attribute when create with date" status="approved" type="compliance" result="FAIL">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>check AlarmAbsolute attribute when create with date
+              </step_desc>
+              <expected>AlarmAbsolute attribute return correct value when
+                create with date
+              </expected>
+            </step>
+          </steps>
+          <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_attri_date.htm?total_num=3&amp;locator_key=id&amp;value=1
+          </test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+        <result_info>
+          <actual_result>FAIL</actual_result>
+          <start>Sat Jan 01 2000 13:44:02 GMT+0900 (KST)</start>
+          <end>Sat Jan 01 2000 13:44:05 GMT+0900 (KST)</end>
+          <stdout/>
+        </result_info>
+      </testcase>
+      <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_add_rel" priority="P1" purpose="check AlarmManager method add: add relative alarm" status="approved" type="compliance" result="FAIL">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>check AlarmManager method add: add relative alarm
+              </step_desc>
+              <expected>AlarmManager method add: add relative alarm succeed
+              </expected>
+            </step>
+          </steps>
+          <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_add_rel.htm
+          </test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+        <result_info>
+          <actual_result>FAIL</actual_result>
+          <start>Sat Jan 01 2000 13:44:05 GMT+0900 (KST)</start>
+          <end>Sat Jan 01 2000 13:44:21 GMT+0900 (KST)</end>
+          <stdout>Test time out</stdout>
+        </result_info>
+      </testcase>
+      <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmRelative_attri_delay_02" priority="P1" purpose="check AlarmAbsolute attribute when create with period" status="approved" type="compliance" result="FAIL">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>check AlarmRelative attribute when create with delay
+              </step_desc>
+              <expected>AlarmRelative attribute return correct value when
+                create succeed with with delay
+              </expected>
+            </step>
+          </steps>
+          <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_attri_delay.htm?total_num=2&amp;locator_key=id&amp;value=2
+          </test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+        <result_info>
+          <actual_result>FAIL</actual_result>
+          <start>Sat Jan 01 2000 13:44:21 GMT+0900 (KST)</start>
+          <end>Sat Jan 01 2000 13:44:23 GMT+0900 (KST)</end>
+          <stdout/>
+        </result_info>
+      </testcase>
+    </set>
+  </suite>
+</test_definition>
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/xsd/test_definition.xsd b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/xsd/test_definition.xsd
new file mode 100644 (file)
index 0000000..f47b778
--- /dev/null
@@ -0,0 +1,263 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+  <xs:element name="suite">
+    <xs:complexType>
+      <xs:sequence minOccurs="1" maxOccurs="unbounded">
+        <xs:element ref="set" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+      <xs:attributeGroup ref="set_attribute_group"/>
+      <xs:attribute name="launcher" type="xs:string"/>
+    </xs:complexType>
+    <xs:unique name="uniqueSetName">
+      <xs:selector xpath=".//set"/>
+      <xs:field xpath="@name"/>
+    </xs:unique>
+  </xs:element>
+  <xs:element name="set">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element name="capabilities" type="CapabilitiesType" minOccurs="0" maxOccurs="1"/>
+        <xs:sequence minOccurs="1" maxOccurs="unbounded">
+          <xs:element ref="testcase" minOccurs="0" maxOccurs="unbounded"/>
+        </xs:sequence>
+      </xs:sequence>
+      <xs:attributeGroup ref="set_attribute_group"/>
+      <xs:attribute name="launcher" type="xs:string"/>
+      <xs:attribute name="set_debug_msg" type="xs:string"/>
+    </xs:complexType>
+    <xs:unique name="uniqueCaseName">
+      <xs:selector xpath=".//testcase"/>
+      <xs:field xpath="@id"/>
+    </xs:unique>
+  </xs:element>
+  <xs:element name="testcase">
+    <xs:complexType>
+      <xs:sequence minOccurs="1">
+        <xs:element ref="description"/>
+        <xs:element name="categories" type="categories" minOccurs="0" maxOccurs="1"/>
+        <xs:element name="measurement" type="measurementType" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element name="series" type="seriesType" minOccurs="0" maxOccurs="unbounded"/>
+        <xs:element name="specs" type="specsType" minOccurs="0" maxOccurs="1"/>
+        <xs:element name="result_info" type="result_info_type" minOccurs="0"/>
+      </xs:sequence>
+      <xs:attributeGroup ref="case_attribute_group"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="steps">
+    <xs:complexType>
+      <xs:sequence minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="step"/>
+      </xs:sequence>
+    </xs:complexType>
+    <xs:unique name="uniqueStepName">
+      <xs:selector xpath=".//step"/>
+      <xs:field xpath="@order"/>
+    </xs:unique>
+  </xs:element>
+  <xs:attributeGroup name="set_attribute_group">
+    <xs:attribute name="name" type="xs:anyURI" use="required"/>
+    <xs:attribute name="type" type="xs:string"/>
+  </xs:attributeGroup>
+  <xs:attributeGroup name="case_attribute_group">
+    <xs:attribute name="id" use="required">
+      <xs:simpleType>
+        <xs:restriction base="xs:string">
+          <xs:minLength value="1"/>
+          <xs:whiteSpace value="collapse"/>
+        </xs:restriction>
+      </xs:simpleType>
+    </xs:attribute>
+    <xs:attribute name="priority" type="priority_simple_type" use="required"/>
+    <xs:attribute name="execution_type" type="execution_type_simple_type" use="required"/>
+    <xs:attribute name="component" type="xs:string"/>
+    <xs:attribute name="requirement_ref" type="xs:anyURI" use="optional"/>
+    <xs:attribute name="status" type="status_type" use="required"/>
+    <xs:attribute name="type" type="case_type_type" use="required"/>
+    <xs:attribute name="purpose" type="xs:string"/>
+    <xs:attribute name="result" type="xs:string"/>
+    <xs:attribute name="onload_delay" type="xs:int" use="optional" default="3"/>
+  </xs:attributeGroup>
+  <xs:simpleType name="priority_simple_type">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="P0"/>
+      <xs:enumeration value="P1"/>
+      <xs:enumeration value="P2"/>
+      <xs:enumeration value="P3"/>
+      <xs:enumeration value="P4"/>
+    </xs:restriction>
+  </xs:simpleType>
+  <xs:simpleType name="execution_type_simple_type">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="auto"/>
+      <xs:enumeration value="manual"/>
+    </xs:restriction>
+  </xs:simpleType>
+  <xs:simpleType name="status_type">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="designed"/>
+      <xs:enumeration value="ready"/>
+      <xs:enumeration value="approved"/>
+    </xs:restriction>
+  </xs:simpleType>
+  <xs:simpleType name="case_type_type">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="functional_positive"/>
+      <xs:enumeration value="functional_negative"/>
+      <xs:enumeration value="security"/>
+      <xs:enumeration value="performance"/>
+      <xs:enumeration value="reliability"/>
+      <xs:enumeration value="portability"/>
+      <xs:enumeration value="maintainability"/>
+      <xs:enumeration value="compliance"/>
+      <xs:enumeration value="user_experience"/>
+      <xs:enumeration value="undefined"/>
+    </xs:restriction>
+  </xs:simpleType>
+  <xs:element name="purpose" type="xs:anySimpleType"/>
+  <xs:element name="notes" type="xs:string"/>
+  <xs:element name="pre_condition" type="xs:string"/>
+  <xs:element name="post_condition" type="xs:string"/>
+  <xs:element name="description">
+    <xs:complexType>
+      <xs:sequence minOccurs="1" maxOccurs="unbounded">
+        <xs:choice minOccurs="0" maxOccurs="1">
+          <xs:element ref="notes"/>
+        </xs:choice>
+        <xs:choice minOccurs="0" maxOccurs="1">
+          <xs:element ref="pre_condition"/>
+        </xs:choice>
+        <xs:choice minOccurs="0" maxOccurs="1">
+          <xs:element ref="post_condition"/>
+        </xs:choice>
+        <xs:element ref="steps" minOccurs="1" maxOccurs="1"/>
+        <xs:choice minOccurs="0" maxOccurs="1">
+          <xs:element ref="test_script_entry"/>
+        </xs:choice>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="step">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element name="step_desc" type="xs:string"/>
+        <xs:element name="expected" type="xs:string"/>
+      </xs:sequence>
+      <xs:attribute name="order" type="xs:int"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="test_script_entry">
+    <xs:complexType>
+      <xs:simpleContent>
+        <xs:extension base="xs:string">
+          <xs:attribute name="test_script_expected_result" type="xs:string" default="0"/>
+          <xs:attribute name="timeout" type="xs:int" default="90"/>
+          <xs:attribute name="location" type="xs:string" default="device"/>
+        </xs:extension>
+      </xs:simpleContent>
+    </xs:complexType>
+  </xs:element>
+  <xs:complexType name="result_info_type">
+    <xs:sequence minOccurs="0">
+      <xs:element name="actual_result" type="xs:string"/>
+      <xs:element name="start" type="xs:string"/>
+      <xs:element name="end" type="xs:string"/>
+      <xs:element name="stdout" type="xs:string" minOccurs="0"/>
+      <xs:element name="stderr" type="xs:string" minOccurs="0"/>
+    </xs:sequence>
+  </xs:complexType>
+  <xs:complexType name="measurementType">
+    <xs:attribute name="name" type="xs:string"/>
+    <xs:attribute name="value" type="xs:string"/>
+    <xs:attribute name="unit" type="xs:string"/>
+    <xs:attribute name="target" type="xs:string"/>
+    <xs:attribute name="failure" type="xs:string"/>
+    <xs:attribute name="power" type="xs:string"/>
+  </xs:complexType>
+  <xs:complexType name="seriesType">
+    <xs:sequence>
+      <xs:element name="measurement" type="simpleMeasurementType" minOccurs="1" maxOccurs="unbounded"/>
+    </xs:sequence>
+    <xs:attribute name="name" type="xs:string"/>
+    <xs:attribute name="group" type="xs:string"/>
+    <xs:attribute name="unit" type="xs:string"/>
+    <xs:attribute name="interval" type="xs:string"/>
+    <xs:attribute name="interval_unit" type="xs:string"/>
+    <xs:attribute name="power" type="xs:string"/>
+  </xs:complexType>
+  <xs:complexType name="simpleMeasurementType">
+    <xs:attribute name="value" type="xs:string"/>
+    <xs:attribute name="file" type="xs:string"/>
+  </xs:complexType>
+  <xs:complexType name="categories">
+    <xs:sequence>
+      <xs:element name="category" type="xs:string" maxOccurs="unbounded" minOccurs="0"/>
+    </xs:sequence>
+  </xs:complexType>
+  <xs:element name="test_definition">
+    <xs:complexType>
+      <xs:sequence minOccurs="1" maxOccurs="unbounded">
+        <xs:element name="environment" type="BuildInfoType" minOccurs="0"/>
+        <xs:element name="summary" type="summaryType" minOccurs="0"/>
+        <xs:element ref="suite" minOccurs="1" maxOccurs="unbounded"/>
+      </xs:sequence>
+    </xs:complexType>
+    <xs:unique name="uniqueSuiteName">
+      <xs:selector xpath=".//suite"/>
+      <xs:field xpath="@name"/>
+    </xs:unique>
+  </xs:element>
+  <xs:complexType name="BuildInfoType">
+    <xs:sequence>
+      <xs:element name="other" type="xs:string"/>
+    </xs:sequence>
+    <xs:attribute name="device_name" type="xs:string"/>
+    <xs:attribute name="device_model" type="xs:string"/>
+    <xs:attribute name="os_version" type="xs:string"/>
+    <xs:attribute name="device_id" type="xs:string"/>
+    <xs:attribute name="firmware_version" type="xs:string"/>
+    <xs:attribute name="screen_size" type="xs:string"/>
+    <xs:attribute name="resolution" type="xs:string"/>
+    <xs:attribute name="host" type="xs:string"/>
+    <xs:attribute name="cts_version" type="xs:string"/>
+    <xs:attribute name="build_id" type="xs:string"/>
+  </xs:complexType>
+  <xs:complexType name="summaryType">
+    <xs:sequence>
+      <xs:element name="start_at" type="xs:string"/>
+      <xs:element name="end_at" type="xs:string"/>
+    </xs:sequence>
+    <xs:attribute name="test_plan_name" type="xs:string"/>
+  </xs:complexType>
+  <xs:complexType name="specsType">
+    <xs:sequence>
+      <xs:element name="spec" type="specType" maxOccurs="unbounded"/>
+    </xs:sequence>
+  </xs:complexType>
+  <xs:complexType name="specType">
+    <xs:sequence>
+      <xs:element name="spec_assertion" type="spec_assertionType"/>
+      <xs:element name="spec_url" type="xs:string"/>
+      <xs:element name="spec_statement" type="xs:string"/>
+    </xs:sequence>
+  </xs:complexType>
+  <xs:complexType name="spec_assertionType">
+    <xs:attribute name="category" type="xs:string" use="required"/>
+    <xs:attribute name="section" type="xs:string" use="required"/>
+    <xs:attribute name="specification" type="xs:string" use="required"/>
+    <xs:attribute name="interface" type="xs:string" use="required"/>
+    <xs:attribute name="element_name" type="xs:string" use="optional"/>
+    <xs:attribute name="usage" type="xs:boolean" default="false"/>
+    <xs:attribute name="element_type" type="xs:string"/>
+  </xs:complexType>
+  <xs:complexType name="CapabilitiesType">
+    <xs:sequence>
+      <xs:element name="capability" type="CapabilityType" minOccurs="1" maxOccurs="unbounded"/>
+    </xs:sequence>
+  </xs:complexType>
+  <xs:complexType name="CapabilityType">
+    <xs:sequence minOccurs="0">
+      <xs:element name="value" type="xs:string"/>
+    </xs:sequence>
+    <xs:attribute name="name" type="xs:string" use="required"/>
+  </xs:complexType>
+</xs:schema>
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/xsd/testcase.xsl b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/xsd/testcase.xsl
new file mode 100644 (file)
index 0000000..fb32685
--- /dev/null
@@ -0,0 +1,200 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+  <xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes"/>
+  <xsl:template match="/">
+    <html>
+      <STYLE type="text/css">
+        @import "tests.css";
+      </STYLE>
+      <head>
+        <script type="text/javascript" src="jquery.min.js"/>
+      </head>
+      <body>
+        <div id="testcasepage">
+          <div id="title">
+            <table>
+              <tr>
+                <td>
+                  <h1>Test Cases</h1>
+                </td>
+              </tr>
+            </table>
+          </div>
+          <div id="suites">
+            <a name="contents"/>
+            <table>
+              <tr>
+                <th>Test Suite</th>
+                <th>Total</th>
+                <th>Auto</th>
+                <th>Manual</th>
+              </tr>
+              <tr>
+                <td>
+                  Total
+                </td>
+                <td>
+                  <xsl:value-of select="count(test_definition/suite/set//testcase)"/>
+                </td>
+                <td>
+                  <xsl:value-of select="count(test_definition/suite/set//testcase[@execution_type = 'auto'])"/>
+                </td>
+                <td>
+                  <xsl:value-of select="count(test_definition/suite/set//testcase[@execution_type != 'auto'])"/>
+                </td>
+              </tr>
+              <xsl:for-each select="test_definition/suite">
+                <tr>
+                  <td>
+                    <a>
+                      <xsl:attribute name="href">
+                        #<xsl:value-of select="@name"/>
+                      </xsl:attribute>
+                      <xsl:value-of select="@name"/>
+                    </a>
+                  </td>
+                  <td>
+                    <xsl:value-of select="count(set//testcase)"/>
+                  </td>
+                  <td>
+                    <xsl:value-of select="count(set/testcase[@execution_type = 'auto'])"/>
+                  </td>
+                  <td>
+                    <xsl:value-of select="count(set/testcase[@execution_type != 'auto'])"/>
+                  </td>
+                </tr>
+              </xsl:for-each>
+            </table>
+          </div>
+          <div id="title">
+            <table>
+              <tr>
+                <td class="title">
+                  <h1>Detailed Test Cases</h1>
+                </td>
+              </tr>
+            </table>
+          </div>
+          <div id="cases">
+            <xsl:for-each select="test_definition/suite">
+              <xsl:sort select="@name"/>
+              <div id="btc">
+                <a href="#contents">Back to Contents</a>
+              </div>
+              <div id="suite_title">
+                Test Suite:
+                <xsl:value-of select="@name"/>
+                <a><xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute></a>
+              </div>
+              <table>
+                <tr>
+                  <th>Case_ID</th>
+                  <th>Purpose</th>
+                  <th>Type</th>
+                  <th>Component</th>
+                  <th>Execution Type</th>
+                  <th>Description</th>
+                  <th>Specification</th>
+                </tr>
+                <xsl:for-each select=".//set">
+                  <xsl:sort select="@name"/>
+                  <tr>
+                    <td colspan="7">
+                      Test Set:
+                      <xsl:value-of select="@name"/>
+                    </td>
+                  </tr>
+                  <xsl:for-each select=".//testcase">
+                    <!-- xsl:sort select="@id" /> -->
+                    <tr>
+                      <td>
+                        <xsl:value-of select="@id"/>
+                      </td>
+                      <td>
+                        <xsl:value-of select="@purpose"/>
+                      </td>
+                      <td>
+                        <xsl:value-of select="@type"/>
+                      </td>
+                      <td>
+                        <xsl:value-of select="@component"/>
+                      </td>
+                      <td>
+                        <xsl:value-of select="@execution_type"/>
+                      </td>
+                      <td>
+                        <p>
+                          Pre_condition:
+                          <xsl:value-of select=".//description/pre_condition"/>
+                        </p>
+                        <p>
+                          Post_condition:
+                          <xsl:value-of select=".//description/post_condition"/>
+                        </p>
+                        <p>
+                          Test Script Entry:
+                          <xsl:value-of select=".//description/test_script_entry"/>
+                        </p>
+                        <p>
+                          Steps:
+                          <p/>
+                          <xsl:for-each select=".//description/steps/step"><xsl:sort select="@order"/>
+                            Step
+                            <xsl:value-of select="@order"/>
+                            :
+                            <xsl:value-of select="./step_desc"/>
+                            ;
+                            <p/>
+                            Expected Result:
+                            <xsl:value-of select="./expected"/>
+                            <p/>
+                          </xsl:for-each>
+                        </p>
+                      </td>
+                      <td>
+                        <xsl:for-each select=".//specs/spec"><b>[Spec_Assertion]:</b><br/>
+                          [Category]:
+                          <xsl:value-of select="./spec_assertion/@category"/>
+                          <br/>
+                          [Section]:
+                          <xsl:value-of select="./spec_assertion/@section"/>
+                          <br/>
+                          [Specification]:
+                          <xsl:value-of select="./spec_assertion/@specification"/>
+                          <br/>
+                          [Interface]:
+                          <xsl:value-of select="./spec_assertion/@interface"/>
+                          <br/>
+                          <xsl:choose><xsl:when test="./spec_assertion/@element_name">
+                              [<xsl:value-of select="./spec_assertion/@element_type"/>]:
+                              <xsl:value-of select="./spec_assertion/@element_name"/>
+                              <br/>
+                            </xsl:when></xsl:choose>
+                          [URL]:
+                          <xsl:value-of select="./spec_url"/>
+                          <br/>
+                          [Statement]:
+                          <xsl:value-of select="./spec_statement"/>
+                          <br/>
+                        </xsl:for-each>
+                      </td>
+                    </tr>
+                  </xsl:for-each>
+                </xsl:for-each>
+              </table>
+            </xsl:for-each>
+          </div>
+        </div>
+        <div id="goTopBtn">
+          <img border="0" src="./back_top.png"/>
+        </div>
+        <script type="text/javascript" src="application.js"/>
+        <script language="javascript" type="text/javascript">
+          $(document).ready(function(){
+            goTopEx();
+          });
+        </script>
+      </body>
+    </html>
+  </xsl:template>
+</xsl:stylesheet>
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/xsd/testresult.xsl b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/xsd/testresult.xsl
new file mode 100644 (file)
index 0000000..c5199c0
--- /dev/null
@@ -0,0 +1,491 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+  <xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes"/>
+  <xsl:template match="/">
+    <html>
+      <STYLE type="text/css">
+        @import "tests.css";
+      </STYLE>
+      <head>
+        <script type="text/javascript" src="jquery.min.js"/>
+      </head>
+      <body>
+        <div id="testcasepage">
+          <div id="title">
+            <table>
+              <tr>
+                <td>
+                  <h1>Test Report</h1>
+                </td>
+              </tr>
+            </table>
+          </div>
+          <div id="device">
+            <table>
+              <tr>
+                <th colspan="2">Device Information</th>
+              </tr>
+              <tr>
+                <td>Device Name</td>
+                <td>
+                  <xsl:choose>
+                    <xsl:when test="test_definition/environment/@device_name">
+                      <xsl:if test="test_definition/environment/@device_name = ''">
+                        N/A
+                      </xsl:if>
+                      <xsl:value-of select="test_definition/environment/@device_name"/>
+                    </xsl:when>
+                    <xsl:otherwise>
+                      N/A
+                    </xsl:otherwise>
+                  </xsl:choose>
+                </td>
+              </tr>
+              <tr>
+                <td>Device Model</td>
+                <td>
+                  <xsl:choose>
+                    <xsl:when test="test_definition/environment/@device_model">
+                      <xsl:if test="test_definition/environment/@device_model = ''">
+                        N/A
+                      </xsl:if>
+                      <xsl:value-of select="test_definition/environment/@device_model"/>
+                    </xsl:when>
+                    <xsl:otherwise>
+                      N/A
+                    </xsl:otherwise>
+                  </xsl:choose>
+                </td>
+              </tr>
+              <tr>
+                <td>OS Version</td>
+                <td>
+                  <xsl:choose>
+                    <xsl:when test="test_definition/environment/@os_version">
+                      <xsl:if test="test_definition/environment/@os_version = ''">
+                        N/A
+                      </xsl:if>
+                      <xsl:value-of select="test_definition/environment/@os_version"/>
+                    </xsl:when>
+                    <xsl:otherwise>
+                      N/A
+                    </xsl:otherwise>
+                  </xsl:choose>
+                </td>
+              </tr>
+              <tr>
+                <td>Device ID</td>
+                <td>
+                  <xsl:choose>
+                    <xsl:when test="test_definition/environment/@device_id">
+                      <xsl:if test="test_definition/environment/@device_id = ''">
+                        N/A
+                      </xsl:if>
+                      <xsl:value-of select="test_definition/environment/@device_id"/>
+                    </xsl:when>
+                    <xsl:otherwise>
+                      N/A
+                    </xsl:otherwise>
+                  </xsl:choose>
+                </td>
+              </tr>
+              <tr>
+                <td>Firmware Version</td>
+                <td>
+                  <xsl:choose>
+                    <xsl:when test="test_definition/environment/@firmware_version">
+                      <xsl:if test="test_definition/environment/@firmware_version = ''">
+                        N/A
+                      </xsl:if>
+                      <xsl:value-of select="test_definition/environment/@firmware_version"/>
+                    </xsl:when>
+                    <xsl:otherwise>
+                      N/A
+                    </xsl:otherwise>
+                  </xsl:choose>
+                </td>
+              </tr>
+              <tr>
+                <td>Build ID</td>
+                <td>
+                  <xsl:choose>
+                    <xsl:when test="test_definition/environment/@build_id">
+                      <xsl:if test="test_definition/environment/@build_id = ''">
+                        N/A
+                      </xsl:if>
+                      <xsl:value-of select="test_definition/environment/@build_id"/>
+                    </xsl:when>
+                    <xsl:otherwise>
+                      N/A
+                    </xsl:otherwise>
+                  </xsl:choose>
+                </td>
+              </tr>
+              <tr>
+                <td>Screen Size</td>
+                <td>
+                  <xsl:choose>
+                    <xsl:when test="test_definition/environment/@screen_size">
+                      <xsl:if test="test_definition/environment/@screen_size = ''">
+                        N/A
+                      </xsl:if>
+                      <xsl:value-of select="test_definition/environment/@screen_size"/>
+                    </xsl:when>
+                    <xsl:otherwise>
+                      N/A
+                    </xsl:otherwise>
+                  </xsl:choose>
+                </td>
+              </tr>
+              <tr>
+                <td>Resolution</td>
+                <td>
+                  <xsl:choose>
+                    <xsl:when test="test_definition/environment/@resolution">
+                      <xsl:if test="test_definition/environment/@resolution = ''">
+                        N/A
+                      </xsl:if>
+                      <xsl:value-of select="test_definition/environment/@resolution"/>
+                    </xsl:when>
+                    <xsl:otherwise>
+                      N/A
+                    </xsl:otherwise>
+                  </xsl:choose>
+                </td>
+              </tr>
+              <tr>
+                <td>Host Info</td>
+                <td>
+                  <xsl:choose>
+                    <xsl:when test="test_definition/environment/@host">
+                      <xsl:if test="test_definition/environment/@host = ''">
+                        N/A
+                      </xsl:if>
+                      <xsl:value-of select="test_definition/environment/@host"/>
+                    </xsl:when>
+                    <xsl:otherwise>
+                      N/A
+                    </xsl:otherwise>
+                  </xsl:choose>
+                </td>
+              </tr>
+              <tr>
+                <td>CTS Version</td>
+                <td>
+                  <xsl:choose>
+                    <xsl:when test="test_definition/environment/@cts_version">
+                      <xsl:if test="test_definition/environment/@cts_version = ''">
+                        N/A
+                      </xsl:if>
+                      <xsl:value-of select="test_definition/environment/@cts_version"/>
+                    </xsl:when>
+                    <xsl:otherwise>
+                      N/A
+                    </xsl:otherwise>
+                  </xsl:choose>
+                </td>
+              </tr>
+              <tr>
+                <td>Others</td>
+                <td>
+                  <xsl:if test="test_definition/environment/other = ''">
+                    N/A
+                  </xsl:if>
+                  <xsl:call-template name="br-replace">
+                    <xsl:with-param name="word" select="test_definition/environment/other"/>
+                  </xsl:call-template>
+                </td>
+              </tr>
+            </table>
+          </div>
+          <div id="summary">
+            <table>
+              <tr>
+                <th colspan="2">Test Summary</th>
+              </tr>
+              <tr>
+                <td>Test Plan Name</td>
+                <td>
+                  <xsl:value-of select="test_definition/summary/@test_plan_name"/>
+                </td>
+              </tr>
+              <tr>
+                <td>Tests Total</td>
+                <td>
+                  <xsl:value-of select="count(test_definition//suite/set/testcase)"/>
+                </td>
+              </tr>
+              <tr>
+                <td>Test Passed</td>
+                <td>
+                  <xsl:value-of select="count(test_definition//suite/set/testcase[@result = 'PASS'])"/>
+                </td>
+              </tr>
+              <tr>
+                <td>Test Failed</td>
+                <td>
+                  <xsl:value-of select="count(test_definition//suite/set/testcase[@result = 'FAIL'])"/>
+                </td>
+              </tr>
+              <tr>
+                <td>Test Block</td>
+                <td>
+                  <xsl:value-of select="count(test_definition//suite/set/testcase[@result = 'BLOCK'])"/>
+                </td>
+              </tr>
+              <tr>
+                <td>Test Not Run</td>
+                <td>
+                  <xsl:value-of select="count(test_definition//suite/set/testcase) - count(test_definition//suite/set/testcase[@result = 'PASS']) - count(test_definition//suite/set/testcase[@result = 'FAIL']) - count(test_definition//suite/set/testcase[@result = 'BLOCK'])"/>
+                </td>
+              </tr>
+              <tr>
+                <td>Start time</td>
+                <td>
+                  <xsl:value-of select="test_definition/summary/start_at"/>
+                </td>
+              </tr>
+              <tr>
+                <td>End time</td>
+                <td>
+                  <xsl:value-of select="test_definition/summary/end_at"/>
+                </td>
+              </tr>
+            </table>
+          </div>
+          <div id="suite_summary">
+            <div id="title">
+              <a name="contents"/>
+              <table>
+                <tr>
+                  <td class="title">
+                    <h1>Test Summary by Suite</h1>
+                  </td>
+                </tr>
+              </table>
+            </div>
+            <table>
+              <tr>
+                <th>Suite</th>
+                <th>Passed</th>
+                <th>Failed</th>
+                <th>Blocked</th>
+                <th>Not Run</th>
+                <th>Total</th>
+              </tr>
+              <xsl:for-each select="test_definition/suite">
+                <xsl:sort select="@name"/>
+                <tr>
+                  <td>
+                    <a>
+                      <xsl:attribute name="href">
+                        #<xsl:value-of select="@name"/>
+                      </xsl:attribute>
+                      <xsl:value-of select="@name"/>
+                    </a>
+                  </td>
+                  <td>
+                    <xsl:value-of select="count(set//testcase[@result = 'PASS'])"/>
+                  </td>
+                  <td>
+                    <xsl:value-of select="count(set//testcase[@result = 'FAIL'])"/>
+                  </td>
+                  <td>
+                    <xsl:value-of select="count(set//testcase[@result = 'BLOCK'])"/>
+                  </td>
+                  <td>
+                    <xsl:value-of select="count(set//testcase) - count(set//testcase[@result = 'PASS']) - count(set//testcase[@result = 'FAIL']) - count(set//testcase[@result = 'BLOCK'])"/>
+                  </td>
+                  <td>
+                    <xsl:value-of select="count(set//testcase)"/>
+                  </td>
+                </tr>
+              </xsl:for-each>
+            </table>
+          </div>
+          <div id="fail_cases">
+            <div id="title">
+              <table>
+                <tr>
+                  <td class="title">
+                    <h1 align="center">
+                      Test Failures (
+                        <xsl:value-of select="count(test_definition/suite/set//testcase[@result = 'FAIL'])"/>
+                      )
+                    </h1>
+                  </td>
+                </tr>
+              </table>
+            </div>
+            <xsl:for-each select="test_definition/suite">
+              <xsl:sort select="@name"/>
+              <div id="btc">
+                <a href="#contents">Back to Contents</a>
+              </div>
+              <div id="suite_title">
+                Test Suite:
+                <xsl:value-of select="@name"/>
+                <a><xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute></a>
+              </div>
+              <table>
+                <tr>
+                  <th>Case_ID</th>
+                  <th>Purpose</th>
+                  <th>Result</th>
+                  <th>Stdout</th>
+                </tr>
+                <xsl:for-each select=".//set">
+                  <xsl:sort select="@name"/>
+                  <tr>
+                    <td colspan="4">
+                      Test Set:
+                      <xsl:value-of select="@name"/>
+                    </td>
+                  </tr>
+                  <xsl:for-each select=".//testcase">
+                    <xsl:sort select="@id"/>
+                    <xsl:choose>
+                      <xsl:when test="@result">
+                        <xsl:if test="@result = 'FAIL'">
+                          <tr>
+                            <td>
+                              <xsl:value-of select="@id"/>
+                            </td>
+                            <td>
+                              <xsl:value-of select="@purpose"/>
+                            </td>
+                            <td class="red_rate">
+                              <xsl:value-of select="@result"/>
+                            </td>
+                            <td>
+                              <xsl:value-of select=".//result_info/stdout"/>
+                              <xsl:if test=".//result_info/stdout = ''">
+                                N/A
+                              </xsl:if>
+                            </td>
+                          </tr>
+                        </xsl:if>
+                      </xsl:when>
+                    </xsl:choose>
+                  </xsl:for-each>
+                </xsl:for-each>
+              </table>
+            </xsl:for-each>
+          </div>
+          <div id="cases">
+            <div id="title">
+              <table>
+                <tr>
+                  <td class="title">
+                    <h1 align="center">Detailed Test Results</h1>
+                  </td>
+                </tr>
+              </table>
+            </div>
+            <xsl:for-each select="test_definition/suite">
+              <xsl:sort select="@name"/>
+              <div id="btc">
+                <a href="#contents">Back to Contents</a>
+              </div>
+              <div id="suite_title">
+                Test Suite:
+                <xsl:value-of select="@name"/>
+                <a><xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute></a>
+              </div>
+              <table>
+                <tr>
+                  <th>Case_ID</th>
+                  <th>Purpose</th>
+                  <th>Result</th>
+                  <th>Stdout</th>
+                </tr>
+                <xsl:for-each select=".//set">
+                  <xsl:sort select="@name"/>
+                  <tr>
+                    <td colspan="4">
+                      Test Set:
+                      <xsl:value-of select="@name"/>
+                    </td>
+                  </tr>
+                  <xsl:for-each select=".//testcase">
+                    <xsl:sort select="@id"/>
+                    <tr>
+                      <td>
+                        <xsl:value-of select="@id"/>
+                      </td>
+                      <td>
+                        <xsl:value-of select="@purpose"/>
+                      </td>
+                      <xsl:choose>
+                        <xsl:when test="@result">
+                          <xsl:if test="@result = 'FAIL'">
+                            <td class="red_rate">
+                              <xsl:value-of select="@result"/>
+                            </td>
+                          </xsl:if>
+                          <xsl:if test="@result = 'PASS'">
+                            <td class="green_rate">
+                              <xsl:value-of select="@result"/>
+                            </td>
+                          </xsl:if>
+                          <xsl:if test="@result = 'BLOCK' ">
+                            <td>
+                              BLOCK
+                            </td>
+                          </xsl:if>
+                          <xsl:if test="@result != 'BLOCK' and @result != 'FAIL' and @result != 'PASS' ">
+                            <td>
+                              Not Run
+                            </td>
+                          </xsl:if>
+                        </xsl:when>
+                        <xsl:otherwise>
+                          <td>
+                          </td>
+                        </xsl:otherwise>
+                      </xsl:choose>
+                      <td>
+                        <xsl:value-of select=".//result_info/stdout"/>
+                        <xsl:if test=".//result_info/stdout = ''">
+                          N/A
+                        </xsl:if>
+                      </td>
+                    </tr>
+                  </xsl:for-each>
+                </xsl:for-each>
+              </table>
+            </xsl:for-each>
+          </div>
+        </div>
+        <div id="goTopBtn">
+          <img border="0" src="./back_top.png"/>
+        </div>
+        <script type="text/javascript" src="application.js"/>
+        <script language="javascript" type="text/javascript">
+          $(document).ready(function(){
+            goTopEx();
+          });
+        </script>
+      </body>
+    </html>
+  </xsl:template>
+  <xsl:template name="br-replace">
+    <xsl:param name="word"/>
+    <xsl:variable name="cr">
+      <xsl:text>
+      </xsl:text>
+    </xsl:variable>
+    <xsl:choose>
+      <xsl:when test="contains($word,$cr)">
+        <xsl:value-of select="substring-before($word,$cr)"/>
+        <br/>
+        <xsl:call-template name="br-replace">
+          <xsl:with-param name="word" select="substring-after($word,$cr)"/>
+        </xsl:call-template>
+      </xsl:when>
+      <xsl:otherwise>
+        <xsl:value-of select="$word"/>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:template>
+</xsl:stylesheet>
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/xsd/tests.css b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/xsd/tests.css
new file mode 100644 (file)
index 0000000..135fa57
--- /dev/null
@@ -0,0 +1,132 @@
+@charset "UTF-8";
+/* CSS Document */
+#testcasepage div,
+#testcasepage h1,
+#testcasepage p,
+#testcasepage table,
+#testcasepage tr,
+#testcasepage th,
+#testcasepage td {
+  margin: 0;
+  padding: 0;
+  border: 0;
+  font-weight: inherit;
+  font-style: inherit;
+  font-size: 0.96em;
+  font-family: arial;
+  vertical-align: baseline;
+}
+
+#testcasepage p {
+  text-align: left;
+}
+
+#suite_title {
+  text-align: left;
+}
+
+#btc {
+  text-align: right;
+}
+
+#testcasepage table {
+  border-collapse: separate;
+  border-spacing: 0;
+  margin-bottom: 1.4em;
+  vertical-align: middle;
+}
+
+#testcasepage th,
+#testcasepage td {
+  text-align: left;
+  font-weight: normal;
+  padding: 4px 10px 4px 5px;
+  vertical-align: middle;
+}
+
+#cases table {
+  width: 101%;
+}
+
+#fail_cases table {
+  width: 101%;
+}
+
+#title table {
+  width: 101%;
+}
+
+#device table {
+  width: 50%;
+}
+
+#summary table {
+  width: 50%;
+}
+
+#testcasepage th {
+  border-bottom: 1px solid #000;
+  background-color: #AAAAAA;
+  border-left: 1px solid #000;
+  border-top: 1px solid #000;
+  color: #000;
+  font-weight: bold;
+  vertical-align: bottom;
+}
+
+#testcasepage th:last-child,
+#testcasepage td:last-child {
+  border-right: 1px solid #000;
+}
+
+#testcasepage td {
+  border-left: 1px solid;
+  font-weight: normal;
+  border-bottom: 1px solid;
+}
+
+#testcasepage td.yellow_rate {
+  background-color: #ffcc00;
+}
+
+#testcasepage td.green_rate {
+  background-color: #33cc33;
+}
+
+#testcasepage td.dgreen_rate {
+  background-color: #339933;
+}
+
+#testcasepage td.red_rate {
+  background-color: #FF3333;
+}
+
+#title table,
+#title tr,
+#title td {
+  border-left: none;
+  border-bottom: none;
+  text-align: center;
+}
+
+#title td:last-child {
+  border-right: none;
+}
+
+#testcasepage h1 {
+  font-size: 2em;
+  font-family: Arial, sans-serif;
+  font-weight: bold;
+  line-height: 1;
+  color: #000;
+  margin-bottom: 0.75em;
+  padding-top: 0.25em;
+  font-weight: bold;
+}
+
+#goTopBtn {
+  right: 0px;
+  bottom: 0px;
+  position: fixed; +position: absolute;
+  top: expression(parseInt(document.body.scrollTop) + document.body.clientHeight - 40);
+}
diff --git a/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/xsd/tests.xml b/release/csharp-tct_7.5_dotnet/tct-tools_r4_rc1/testkitlite_web_csharp/xsd/tests.xml
new file mode 100644 (file)
index 0000000..aedf930
--- /dev/null
@@ -0,0 +1,1033 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl"  href="testcase.xsl"?>
+<test_definition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="test_definition.xsd">
+  <suite name="webapi-w3c-widget-tests">
+    <set name="WidgetPackaging">
+      <testcase purpose="Tests the user agent's ability to process files with no file extension. " type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="auto" priority="P3" id="dm">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/dm</step_desc>
+              <expected>To pass, the user agent start file of the widget must be index.htm</expected>
+            </step>
+          </steps>
+          <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/dm</test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Tizen" specification="Tizen Packaging and XML Configuration" interface="Tizen" usage="true"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+      </testcase>
+      <testcase purpose="Tests the user agent's ability to process files with a file extension other than .wgt." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="dn">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/dn.test</step_desc>
+              <expected>To pass, the user agent start file of the widget must be index.htm</expected>
+            </step>
+          </steps>
+          <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/dn.test</test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+      </testcase>
+      <testcase purpose="Test the ability of the UA to verify a zip archive." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="do">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/split.wgt.001</step_desc>
+              <expected>To pass, the user agent must treat this as an invalid widget (archive is spanned).</expected>
+            </step>
+          </steps>
+          <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/split.wgt.001</test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+      </testcase>
+      <testcase purpose="Test the user agent's ability to get a widget over HTTP and respect the application/widget mimetype. The server from which this test is served from has been set up to label the 'test' resource as an 'application/widget'." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="z3">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/z3</step_desc>
+              <expected>To pass, a user agent must correctly process this resource as a widget because of the 'application/widget' mimetype (i.e., not only because of sniffing).</expected>
+            </step>
+          </steps>
+          <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/z3</test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+      </testcase>
+      <testcase purpose="Test the user agent's ability to get a widget over HTTP and respect the 'application/widget' mimetype. The server from which this test is served from has been set up to label the 'test.html' resource as an 'application/widget'." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="z4">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/z4.html</step_desc>
+              <expected>To pass, a user agent must correctly process this resource as a widget because of the 'application/widget' mimetype (i.e., not only via sniffing).</expected>
+            </step>
+          </steps>
+          <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/z4.html</test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+      </testcase>
+      <testcase purpose="Tests that an empty defaultlocale attribute is ignored (and does not cause the widget to be treated as invalid)." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="dlocignore00">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/dlocignore00.wgt</step_desc>
+              <expected>To pass, the widget must simply run..</expected>
+            </step>
+          </steps>
+          <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/dlocignore00.wgt</test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+      </testcase>
+      <testcase purpose="Tests that the user agent applies rule for getting a single attribute value to the defaultlocale attribute." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="dlocignore01">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-001.wgt</step_desc>
+              <expected> To pass, the name of the widget must be the value PASS..</expected>
+            </step>
+          </steps>
+          <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-001.wgt</test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+      </testcase>
+      <testcase purpose="Test that the user agent matches obscure, yet valid, language tags." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="dlocignore02">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-002.wgt</step_desc>
+              <expected> To pass, the widgets description must be the value PASS..</expected>
+            </step>
+          </steps>
+          <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-002.wgt</test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+      </testcase>
+      <testcase purpose="Tests that a language tag already part of the UA's locales list is ignored when it is repeated for defaultlocale attribute." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="dlocignore03">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-003.wgt</step_desc>
+              <expected>To pass, the specified value should not be added twice to the locales list of the UA..</expected>
+            </step>
+          </steps>
+          <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-003.wgt</test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+      </testcase>
+      <testcase purpose="Tests that the default locale is added to the end of the user agent's locale list   (and does not override the default language, which is assumed to be 'en')." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="dlocignore04">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-004.wgt</step_desc>
+              <expected>To pass, the name of the widget must be PASS..</expected>
+            </step>
+          </steps>
+          <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-004.wgt</test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+      </testcase>
+      <testcase purpose="Tests that the value of defaultlocale is also used to in folder-based localization." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="dlocuse00">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-000.wgt</step_desc>
+              <expected>To pass, the index.html of the folder 'locales/esx-al/' should be loaded and say PASS..</expected>
+            </step>
+          </steps>
+          <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-000.wgt</test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+      </testcase>
+      <testcase purpose="Tests that the value of defaultlocale works in conjunction to xml:lang on the widget element." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="dlocuse01">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/dlocuse01.wgt</step_desc>
+              <expected>To pass, the name of the widget must be PASS..</expected>
+            </step>
+          </steps>
+          <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/dlocuse01.wgt</test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+      </testcase>
+      <testcase purpose="Tests that the UA rejects configuration documents that don't have  correct widget element at the root." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="aa">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/aa.wgt</step_desc>
+              <expected> To pass, the UA must treat this as an invalid widget (the root element is not widget)..</expected>
+            </step>
+          </steps>
+          <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/aa.wgt</test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+      </testcase>
+      <testcase purpose="Tests that the UA rejects configuration documents that don't have correct  widget element at the root." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="ab">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ab.wgt</step_desc>
+              <expected> To pass, the UA must treat this as an invalid widget (the namespace is wrong)..</expected>
+            </step>
+          </steps>
+          <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ab.wgt</test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+      </testcase>
+      <testcase purpose="Tests that the UA rejects configuration documents that don't have correct widget  element at the root." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="ac">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ac.wgt</step_desc>
+              <expected>To pass, the UA must treat this as an invalid widget (the namespace is missing)..</expected>
+            </step>
+          </steps>
+          <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ac.wgt</test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+      </testcase>
+      <testcase purpose="Test that a user agent correctly processes a author element." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="af">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/af.wgt</step_desc>
+              <expected>To pass, the author name must be the string "PASS"..</expected>
+            </step>
+          </steps>
+          <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/af.wgt</test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+      </testcase>
+      <testcase purpose="Test that a user agent correctly applies the Rule for Getting Text Content with Normalized White Space." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="ag">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ag.wgt</step_desc>
+              <expected>To pass, the widget author must be the string "P A S S" (i.e., white space collapsed to single space)..</expected>
+            </step>
+          </steps>
+          <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ag.wgt</test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+      </testcase>
+      <testcase purpose="Test that a user agent correctly applies the Rule for Getting Text Content with Normalized White Space." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="ah">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ah.wgt</step_desc>
+              <expected>To pass, the author name must be the string "PASS" (i.e., all white space collapsed to single space, spaces at start/end trimmed)..</expected>
+            </step>
+          </steps>
+          <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ah.wgt</test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+      </testcase>
+      <testcase purpose="Test that a user agent correctly applies the rule for getting a single attribute value." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="ai">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ai.wgt</step_desc>
+              <expected>To pass, the author email must be the string "PASS"..</expected>
+            </step>
+          </steps>
+          <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ai.wgt</test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+      </testcase>
+      <testcase purpose="Test that a user agent correctly applies the rule for getting a single attribute value and the Rule for Getting Text Content with Normalized White Space." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="aj">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/aj.wgt</step_desc>
+              <expected>To pass, the author name must be the string "PASS"..</expected>
+            </step>
+          </steps>
+          <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/aj.wgt</test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+      </testcase>
+      <testcase purpose="Test that a user agent correctly applies the rule for getting a single attribute value and the Rule for Getting Text Content with Normalized White Space." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="ak">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ak.wgt</step_desc>
+              <expected>To pass, the author name must be the string "PASS"..</expected>
+            </step>
+          </steps>
+          <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ak.wgt</test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+      </testcase>
+      <testcase purpose="Test the ability of the user agent to handle an empty author element." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="al">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/al.wgt</step_desc>
+              <expected>To pass, the author name must be an empty string..</expected>
+            </step>
+          </steps>
+          <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/al.wgt</test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+      </testcase>
+      <testcase purpose="Test the ability of the user agent to correctly process the author href attribute." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="am">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/am.wgt</step_desc>
+              <expected>To pass, the value of author href must be "PASS:PASS"..</expected>
+            </step>
+          </steps>
+          <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/am.wgt</test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+      </testcase>
+      <testcase purpose="Test the ability of the user agent to correctly process the author href attribute." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="an">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/an.wgt</step_desc>
+              <expected>To pass, the value of author href must be ignored..</expected>
+            </step>
+          </steps>
+          <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/an.wgt</test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+      </testcase>
+      <testcase purpose="Test that a user agent correctly processes a name element." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="ao">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ao.wgt</step_desc>
+              <expected>To pass, the widget name must be the string "PASS"..</expected>
+            </step>
+          </steps>
+          <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ao.wgt</test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+      </testcase>
+      <testcase purpose="Test that a user agent correctly applies the Rule for Getting Text Content with Normalized White Space." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="ap">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ap.wgt</step_desc>
+              <expected>To pass, the widget name must be the string "P A S S" (i.e., white space collapsed to single space)..</expected>
+            </step>
+          </steps>
+          <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ap.wgt</test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+      </testcase>
+      <testcase purpose="Test that a user agent correctly applies the Rule for Getting Text Content with Normalized White Space." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="aq">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/aq.wgt</step_desc>
+              <expected>To pass, the widget name must be the string "PASS" (i.e., all white space collapsed to single space, spaces at front/back trimmed)..</expected>
+            </step>
+          </steps>
+          <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/aq.wgt</test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+      </testcase>
+      <testcase purpose="Test that a user agent correctly applies the rule for getting a single attribute value." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="ar">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ar.wgt</step_desc>
+              <expected>To pass, the widget short name must be the string "PASS"..</expected>
+            </step>
+          </steps>
+          <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ar.wgt</test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+      </testcase>
+      <testcase purpose="Test that a user agent correctly applies the rule for getting a single attribute value and  the Rule for Getting Text Content with Normalized White Space." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="as">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/as.wgt</step_desc>
+              <expected>To pass, the widget short name must be the string "PASS" and the widget name must be "PASS"..</expected>
+            </step>
+          </steps>
+          <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/as.wgt</test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+      </testcase>
+      <testcase purpose="Test that a user agent correctly applies the rule for getting a single attribute value and  the Rule for Getting Text Content with Normalized White Space." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="at">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/at.wgt</step_desc>
+              <expected>To pass, the widget short name must be the string "PASS" and the widget name must be "PASS"..</expected>
+            </step>
+          </steps>
+          <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/at.wgt</test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+      </testcase>
+      <testcase purpose="Test that a user agent correctly processes the short attribute." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="au">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/au.wgt</step_desc>
+              <expected>To pass, the widget short name must be an empty string..</expected>
+            </step>
+          </steps>
+          <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/au.wgt</test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+      </testcase>
+      <testcase purpose="Test the ability of the user agent to handle an empty name element." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="av">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/av.wgt</step_desc>
+              <expected>To pass, the widget name must be an empty string..</expected>
+            </step>
+          </steps>
+          <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/av.wgt</test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+      </testcase>
+      <testcase purpose="Test that a user agent correctly processes a name element with xml:lang attribute." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="oa">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/oa.wgt</step_desc>
+              <expected>To pass, the widget name must be the string "PASS"..</expected>
+            </step>
+          </steps>
+          <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/oa.wgt</test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+      </testcase>
+      <testcase purpose="Test that the user agent does not attempt to load a default start file when a custom start file has been declared." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="aw">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/aw.wgt</step_desc>
+              <expected>To pass, the widget start file must point to "pass.html" and the icons list must contain a pointer to "icon.png" at the root of the widget..</expected>
+            </step>
+          </steps>
+          <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/aw.wgt</test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+      </testcase>
+      <testcase purpose="Test the UA's ability process the height attribute." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="ax">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ax.wgt</step_desc>
+              <expected>To pass, the widget height must be either the numeric value 123 or a value greater than 0..</expected>
+            </step>
+          </steps>
+          <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ax.wgt</test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+      </testcase>
+      <testcase purpose="Test the UA's ability process the height attribute." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="ay">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ay.wgt</step_desc>
+              <expected>To pass, the user agent must ignore the value of the height attribute (the value is composed of characters)..</expected>
+            </step>
+          </steps>
+          <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ay.wgt</test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+      </testcase>
+      <testcase purpose="Test the UA's ability process the height attribute." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="az">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/az.wgt</step_desc>
+              <expected>To pass, the widget height must be the numeric value 100 or a value greater than 0 (resulting from rule for parsing a non-negative integer)..</expected>
+            </step>
+          </steps>
+          <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/az.wgt</test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+      </testcase>
+      <testcase purpose="Test the UA's ability process the height attribute." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="a1">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a1.wgt</step_desc>
+              <expected>To pass, the widget height must be the numeric value 123 or a value greater than 0 (resulting from rule for parsing a non-negative integer)..</expected>
+            </step>
+          </steps>
+          <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a1.wgt</test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+      </testcase>
+      <testcase purpose="Test the UA's ability process the height attribute." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="a2">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a2.wgt</step_desc>
+              <expected>To pass, the widget height must be ignored (the value is an empty string, hence it would be ignored)..</expected>
+            </step>
+          </steps>
+          <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a2.wgt</test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+      </testcase>
+      <testcase purpose="Test the UA's ability process the height attribute." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="a3">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a3.wgt</step_desc>
+              <expected>To pass, the widget height must be ignored (the value is a sequence of space characters, hence it would be ignored)..</expected>
+            </step>
+          </steps>
+          <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a3.wgt</test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+      </testcase>
+      <testcase purpose="Test the UA's ability process the height attribute." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="a4">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a4.wgt</step_desc>
+              <expected>To pass, the widget height must be ignored (the value is an empty string)..</expected>
+            </step>
+          </steps>
+          <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a4.wgt</test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+      </testcase>
+      <testcase purpose="Test that the UA skips preference elements without a name attribute." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="a5">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a5.wgt</step_desc>
+              <expected>To pass, widget preferences must remain an empty list (i.e., the preference is skipped)..</expected>
+            </step>
+          </steps>
+          <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a5.wgt</test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+      </testcase>
+      <testcase purpose="Test that the UA skips preference element already defined." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="a6">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a6.wgt</step_desc>
+              <expected>To pass, widget preference must contain one preference whose name is "PASS" and whose value is "PASS" and whose readonly attr value must be "false"..</expected>
+            </step>
+          </steps>
+          <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a6.wgt</test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+      </testcase>
+      <testcase purpose="Test that the UA does a case sensitive comparison on the value of the readonly attribute." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="a7">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a7.wgt</step_desc>
+              <expected>To pass, widget preference must contain one preference whose name is "PASS" and whose value is "PASS" and whose readonly attr value must be "false"..</expected>
+            </step>
+          </steps>
+          <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a7.wgt</test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+      </testcase>
+      <testcase purpose="Test that the UA does a case sensitive comparison on the value of the readonly attribute." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="a8">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a8.wgt</step_desc>
+              <expected>To pass, widget preference must contain one preference whose name is "PASS" and whose value is "PASS" and whose readonly attr value must be "true"..</expected>
+            </step>
+          </steps>
+          <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a8.wgt</test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+      </testcase>
+      <testcase purpose="Test that the UA sets the readonly attribute to false by default." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="a9">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a9.wgt</step_desc>
+              <expected>To pass, widget preference must contain one preference whose name is "PASS" and whose value is "PASS" and whose readonly attr value must be "false"..</expected>
+            </step>
+          </steps>
+          <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a9.wgt</test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+      </testcase>
+      <testcase purpose="Test that the UA skips multiple preference element already defined." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="ba">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ba.wgt</step_desc>
+              <expected>To pass, widget preference must contain one preference whose name is "a" and whose value is "a" and whose readonly attr value must be "false"..</expected>
+            </step>
+          </steps>
+          <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ba.wgt</test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+      </testcase>
+      <testcase purpose="Test the UA's ability store preferences whose name vary only in case." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="bb">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/bb.wgt</step_desc>
+              <expected>To pass, widget preference must contain two preferences: 1 must have a name "a" and whose value is "a" and whose readonly attr value must be "false". 2 must have a name "A" and whose value is "b" and whose readonly attribute value must be "false"..</expected>
+            </step>
+          </steps>
+          <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/bb.wgt</test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+      </testcase>
+      <testcase purpose="Tests that the UA applies the rule for getting a single attribute value to name, value, and readonly attributes." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="bc">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/bc.wgt</step_desc>
+              <expected>To pass, widget preference must contain one preference whose name is "PASS" and whose value is "PASS" and whose readonly attr value must be "false"..</expected>
+            </step>
+          </steps>
+          <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/bc.wgt</test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+      </testcase>
+      <testcase purpose="Test to make sure that the UA only checks the root of the widget for config files, and not in an arbitrary folder." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="bg">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/bg.wgt</step_desc>
+              <expected>To pass, the user agent must treat this widget as an invalid widget (config file is not at the root)..</expected>
+            </step>
+          </steps>
+          <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/bg.wgt</test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+      </testcase>
+      <testcase purpose="Test to make sure that the UA only checks the root of the widget for config files, and not in a locale folder." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="bh">
+        <description>
+          <pre_condition/>
+          <post_condition/>
+          <steps>
+            <step order="1">
+              <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/bh.wgt</step_desc>
+              <expected>To pass, the user agent must treat this widget as an invalid widget (config file is not at the root, but in locale folder)..</expected>
+            </step>
+          </steps>
+          <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/bh.wgt</test_script_entry>
+        </description>
+        <specs>
+          <spec>
+            <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+            <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+            <spec_statement>spec_statement</spec_statement>
+          </spec>
+        </specs>
+      </testcase>
+    </set>
+  </suite>
+</test_definition>