diff --git a/.gitignore b/.gitignore index e90fa9c..5479997 100644 --- a/.gitignore +++ b/.gitignore @@ -1,12 +1,12 @@ # Touch SDK -/example/touch/ +/examples/touch/ # Generated directories .ux-ant-cache/ .sass-cache/ .sencha_backup/ -/example/archive -/example/build +/examples/archive +/examples/build # Generated files /application/resources/css/ diff --git a/.sencha/package/build-impl.xml b/.sencha/package/build-impl.xml new file mode 100644 index 0000000..e242abd --- /dev/null +++ b/.sencha/package/build-impl.xml @@ -0,0 +1,358 @@ + + + + + + + + Using Sencha Cmd from ${cmd.dir} for ${ant.file} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.sencha/package/build.properties b/.sencha/package/build.properties new file mode 100644 index 0000000..83e7e5f --- /dev/null +++ b/.sencha/package/build.properties @@ -0,0 +1,8 @@ +# ============================================================================= +# This file provides an override point for default variables defined in +# defaults.properties. +# +# IMPORTANT - Sencha Cmd will merge your changes with its own during upgrades. +# To avoid potential merge conflicts avoid making large, sweeping changes to +# this file. +# ============================================================================= diff --git a/.sencha/package/codegen.json b/.sencha/package/codegen.json new file mode 100644 index 0000000..fe00b59 --- /dev/null +++ b/.sencha/package/codegen.json @@ -0,0 +1,118 @@ +{ + "sources": { + "package.json.tpl.merge": { + "12322b2f0769f491000df8ec0e012dd2d78a7eaf": "eJx1zrEKwjAQgOG9TxE6S9HV2VFcFBdxONJrDW1y8XIRSum7m2pTJzMd/3cHGQuVXunAYrlX5ei79pTmqdx8QQa/wiXNK2hGEOLZwJEbLMWQLURrgYfZzg9iUTksXqOA6bE+YNBsvBhy8+6RXKvqX1PUKA+6gxbz5Qs5LNu7altt19+Q9SDXP9oQW5BPzqknDX0qwhGXxPiMhjGkersXU/EGNatRVA\u003d\u003d" + }, + "theme.html.tpl.merge": { + "79ec5194c052d6cc313e842c4e2763fa562c7b70": "eJydVE1vEzEQve+vmO4JEF6nhQNKd3MJRYCQqEg4cHS8k9jFay/2JE1U9b/X3l1KWoKIYln74Tdv3vh55PLs/dfp/Mf1FShqzCQrzxjLAGDq2p3XK0XwQr6Ei9H5BYuPNwXM0Eol4JOVRcZYJAw8haKeJCaUpMng5GpL8HkGc4UNwkfhLYZQ8h7r4xokEWWpZfhrrTdVPnWW0BKb71rMQfZ/VU64JZ5kLiFK+4BUfZ9/YO/ySdYnGmqGL07UIIwBnxJ6rMFo+zOAsDUE6XVLoYtLdXfEBMdgU+WBdgaDQqQcKMoPqjKEHJTHZZXjVjStwaJb4kOCPus+40ZsRL+aQ/CyyouCx3kXsW9orgWpex6/WY2L9aq4Cfmk5H388SkXzlEgL9pn/ANukEKYGS3RRz89HrbhCEmPtkb/f73kfiOsXmKgwXjlPMn1CZq9c3Emvyj1EVuIgDyIEPhwHPy32IlWHqXxuIUTReQ6kGsOmtf1XZ8pjeJW1ysklnpfaBtP7e4RS6MRfqXtGM5H7fbyCRKJpMbwdvQX0rqgSbvIip0uSG/wKe426JfG3Y5ho4NemD34PvtT2ZaFro8YxRqQXv8TgVfPinatkJp2ser9zN32+bD/ku/dHwtX76JR3Ssh3QXzACi8aeE\u003d" + }, + "build.properties.merge": { + "8b81315dbe73ce9c08478f4c1d2df84f456efcf5": "eJytkEtOxEAMRPdzipKyhbkBCzQrFnzE5AKetJNYdOzI3UnE7XGA3GC8K5f9/GnwdM84NWhHKeglM2a3VRIXkMJWdg+B2UQrenMk7mnJFSu50C1HXWREOUEUAfr3yzk4M3sVLudTE8bL68f7Z/v81uIRV9ZuJFymhE1yxsQ+ML5tcUReh6BuUkdILbBNkRYXHbDMg1P6BaI10GqSYrXKWoUOSmfaZ+mi88+f6GvvzRTmA8rGPO/6mFMtYPW4fiff97U/al6C1w\u003d\u003d" + }, + "config.rb.tpl.merge": { + "33f446bd02c3fd24eb27891582eff6a2e789796b": "eJxLLi2KT8ksUrBVcMvMSdUDMvMSc1M14uPdPH1c4+M1ufJLSwpKS+KLSypzUoGqrPJSi0tSU7gALskTcA\u003d\u003d" + }, + "all.scss.merge": { + "da39a3ee5e6b4b0d3255bfef95601890afd80709": "eJwDAAAAAAE\u003d" + }, + "custom.js.merge": { + "199e99bbd15c3c0415569425cb21e77c95e9042a": "eJxlj0FOxDAMRfdziq9ZwUjTHIAlYslquIAncdtA4lSxC8PtSdoREmIV6f/4+dmdDjjhbY6KMSZGeycWrmQcQAqCGlWLMmEpUQzXb1xY/Ex4zgFnRMNXTAlSWseovCTybbbUDl6XsJHa1FH3sYX8B03cqqlS4OPQ//2V8CQ7K5fPriEBNjPU17gYjCZE6UnmYbacfj/GsaUNslUIhbVzu5lwq/2qVjIohGixCCVkkjiyWrOFzqWaXw0sViPr0IRYGVQ7yq+55X2HdObg7meo45udt4XnKyk7Je0Z5SWxqyyB6/Cu/Uh3ODj3crNhN28ar/f1D49P/7rLXUd7+QPuPI9g" + }, + "testing.properties.merge": { + "e65f969c42eb4f355c850fc58fea852582f20db8": "eJyVkUFywyAQBO9+xVb5oIutH/gX+QCCkbUOAooFOf59FsmqpHKKOFEwOzM0Z7r9f53O9DGx0Mge5DBygFDKMSEX1m0VOBpepLqhsndXnpPvv2Z/oefEdiKdLRNoMAJqdyqMI5lAJiXP1hSOQbbZ5msh0mskmuOvnDHHWY32JjbmDEkxOCqxBai6K5DC4d693RAWzjHMCOVCkmB5ZLhW9EWdINjJtBJv9T7cU0vXsk/2rWwxn9AisHA6AooLcgNhqi8riYXdimAn0P+07vXsCOuD8rNimLWaiDKkmBrK7UOUyR0B2RRQdzXedyp+CMVaUi0rQn3ninMxvurPspjBQ/54jjHvYLbHycGKG5Fm2SIf0u/ut9M3l43NIg\u003d\u003d" + }, + "sencha.cfg.tpl.merge": { + "6d1982cce48163a98dc46012d1d0cdfa209fbda6": "eJzFVdFq2zAUfc9XXNzBWmicvg0GgXZlD9vDWsge96LIcqJFljRJTuqN/vuOJNvJmqbbYLASim1dnXPuuVdXZ/R5LUizRpCpKeDZMr5hK0FT8mvTqooaFvg6LRUxriDrjBUudCQ1lbM+vvzqjZ6cTYbXGDr/YTerT3h4nEzORiKPEEHB0G4tE7D0A+lrT4ubxYK4cQ5xRle+TPsqUbNWBdoy1UalgCveP4SCGsG0BwYLSWEtlfBZl2fez7zjdM50NbxvmbvoE+IKH1IwwOLehOeMCXuVJX3QZLDoaGdc5S8Ta2mZFqq8j/+hgFkIMADZc85SxCxFlJ57X2I5WmDIh06Jkbx2piGmuz3lJXkRsimwaKmY3kBFnb/gl75cZsk6hmTAY12daSE6FtC2IduaUj1QiT3PKR1rGAPLUdkc4bmOWUn0jJumYVMvLHMsiIqU9CE2Um1UJZxHiYXbZ4uaykqkinoBpOF702LXUpB4sEpyGVSH0G+tdECMJggo56qt8IrSRt5lK1V1KDVBWRbW81df2qurN++GhUq6x5js3yrHo9kK5yAYPXij1L63YimAFtloJ7ECgSu5RTkYBbaKW4ue/m6AKPpuBztrg0ELSs6U6oAzpgroldAi62EWbbXs8pGEcULz/ogCQkkdPYlBOHdv4cMZEc1m1z0WXT/lP7BqTOtZq8bVp4ZlY/qKpnYqYGvRFzWd0xzsBXN8jRRq42hxu1gAKHuXjul+nHxkW7bgTtowdkLrsa/PGsmhG2CU0UdNCebTxe7b+w8SwDjw/ykDUL+cAQLGDCL5UeuQbKxxITUOTkkkTFmls4GehHjRp3jELsJv/EPADCRpJJwwEv3XT3BDVsWZXsQuXbM8zeMdkqQUZNqAGXQoIp9f0D2rIK0OV0bPlpznRgcmMfDFA2us+sXhc3+R6nV4nxxS9lv8SdYh4EVi3y6n/S4/HscBhu40yoI7SubWKWqH4YmbY1OkeZEv1tDZX4QBEtfkaV0DHXTN/+kfNN1i8uIGus83ukROU7pPteRpRX5P3mISCWV2B8MHNWdbgzwb4VZplhtdoxQBM19iLmqxg3eYJT5un/wEixPeXA\u003d\u003d" + } + }, + "targets": { + ".sencha/package/testing.properties": { + "source": "testing.properties.merge", + "version": "e65f969c42eb4f355c850fc58fea852582f20db8", + "parameters": { + "pkgName": "Ext.ux.AccordionList", + "senchadir": ".sencha", + "touchRelPath": "../${touch.dir}", + "extRelPath": "../${ext.dir}", + "pkgType": "code" + } + }, + ".sencha/package/build.properties": { + "source": "build.properties.merge", + "version": "8b81315dbe73ce9c08478f4c1d2df84f456efcf5", + "parameters": { + "pkgName": "Ext.ux.AccordionList", + "senchadir": ".sencha", + "touchRelPath": "../${touch.dir}", + "extRelPath": "../${ext.dir}", + "pkgType": "code" + } + }, + "package.json": { + "source": "package.json.tpl.merge", + "version": "12322b2f0769f491000df8ec0e012dd2d78a7eaf", + "parameters": { + "pkgName": "Ext.ux.AccordionList", + "senchadir": ".sencha", + "touchRelPath": "../${touch.dir}", + "extRelPath": "../${ext.dir}", + "pkgType": "code" + } + }, + "sass/example/theme.html": { + "source": "theme.html.tpl.merge", + "version": "79ec5194c052d6cc313e842c4e2763fa562c7b70", + "parameters": { + "pkgName": "Ext.ux.AccordionList", + "senchadir": ".sencha", + "touchRelPath": "../${touch.dir}", + "extRelPath": "../${ext.dir}", + "pkgType": "code" + } + }, + "sass/example/custom.js": { + "source": "custom.js.merge", + "version": "199e99bbd15c3c0415569425cb21e77c95e9042a", + "parameters": { + "pkgName": "Ext.ux.AccordionList", + "senchadir": ".sencha", + "touchRelPath": "../${touch.dir}", + "extRelPath": "../${ext.dir}", + "pkgType": "code" + } + }, + "sass/etc/all.scss": { + "source": "all.scss.merge", + "version": "da39a3ee5e6b4b0d3255bfef95601890afd80709", + "parameters": { + "pkgName": "Ext.ux.AccordionList", + "senchadir": ".sencha", + "touchRelPath": "../${touch.dir}", + "extRelPath": "../${ext.dir}", + "pkgType": "code" + } + }, + "sass/config.rb": { + "source": "config.rb.tpl.merge", + "version": "33f446bd02c3fd24eb27891582eff6a2e789796b", + "parameters": { + "pkgName": "Ext.ux.AccordionList", + "senchadir": ".sencha", + "touchRelPath": "../${touch.dir}", + "extRelPath": "../${ext.dir}", + "pkgType": "code" + } + }, + ".sencha/package/sencha.cfg": { + "source": "sencha.cfg.tpl.merge", + "version": "6d1982cce48163a98dc46012d1d0cdfa209fbda6", + "parameters": { + "pkgName": "Ext.ux.AccordionList", + "senchadir": ".sencha", + "touchRelPath": "../${touch.dir}", + "extRelPath": "../${ext.dir}", + "pkgType": "code" + } + } + } +} \ No newline at end of file diff --git a/.sencha/package/defaults.properties b/.sencha/package/defaults.properties new file mode 100644 index 0000000..dab58b1 --- /dev/null +++ b/.sencha/package/defaults.properties @@ -0,0 +1,155 @@ +# ============================================================================= +# This file defines properties used by build-impl.xml and the associated +# *-impl.xml files (sass-impl.xml, js-impl.xml, etc.), which are the core of +# the applications build process. +# +# IMPORTANT - This file is not modifiable by a package, and will be overwritten +# during each app upgrade. Please use build.properties for defining package +# customizations to these properties. +# ============================================================================= + +# =========================================== +# properties defining various directory +# locations +# =========================================== +build.dir=${package.build.dir} +build.resources.dir=${build.dir}/resources +package.resources.dir=${package.dir}/resources +package.sass.dir=${package.dir}/sass +package.licenses.dir=${package.dir}/licenses + +# =========================================== +# definitions of various file name patterns +# used for output artifacts +# =========================================== +build.name.prefix=${build.dir}/${package.name} +build.name.css.prefix=${build.resources.dir}/${package.name} +build.name.ruby=config.rb + +build.debug.suffix=-debug +build.all.suffix=-all +build.rtl.suffix=-rtl + +build.all.debug.suffix=${build.all.suffix}${build.debug.suffix} +build.all.rtl.suffix=${build.all.suffix}${build.rtl.suffix} +build.all.rtl.debug.suffix=${build.all.suffix}${build.rtl.suffix}${build.debug.suffix} + +# =========================================== +# define the output js file names for dev, +# debug, and compressed (no suffix) +# =========================================== +build.all.js=${build.name.prefix}.js +build.all.debug.js=${build.name.prefix}${build.debug.suffix}.js + +# =========================================== +# output file names for the scss files +# =========================================== +build.all.scss=${build.name.prefix}${build.all.debug.suffix}.scss +build.all.rtl.scss=${build.name.prefix}${build.all.rtl.debug.suffix}.scss + +# =========================================== +# output file names for the css files +# generated from the scss files by running +# a compass compilation +# =========================================== +build.all.css.debug.prefix=${package.name}${build.all.debug.suffix} +build.all.css.debug=${build.resources.dir}/${build.all.css.debug.prefix}.css +build.all.rtl.css.debug.prefix=${package.name}${build.all.rtl.debug.suffix} +build.all.rtl.css.debug=${build.resources.dir}/${build.all.rtl.css.debug.prefix}.css +build.all.css.prefix=${package.name}${build.all.suffix} +build.all.css=${build.resources.dir}/${build.all.css.prefix}.css +build.all.rtl.css.prefix=${package.name}${build.all.rtl.suffix} +build.all.rtl.css=${build.resources.dir}/${build.all.rtl.css.prefix}.css + +build.all.ruby=${build.dir}/${build.name.ruby} + +# =========================================== +# options to pass to the 'sencha fs slice' command +# =========================================== +build.slice.options= + +# =========================================== +# preprocessor options used when generating +# concatenated js output files +# =========================================== +build.compile.js.debug.options=debug:true +build.compile.js.options=debug:false + +# enables / disables removing text references from +# package js build files +build.remove.references=false + +# This property can be modified to change general build options +# such as excluding files from the set. The format expects newlines +# for each argument, for example: +# +# build.operations=\ +# exclude\n \ +# -namespace=Ext\n +# +# NOTE: modifications to build.operations are intended to be +# placed in an override of the "-after-init" target, where it +# can be calculated based on other +# ant properties +# +# build.operations= + +# =========================================== +# compression option used to generate '-all' +# js output file +# =========================================== +build.compile.js.compress=+yui + +# =========================================== +# selector count threshold to use when +# splitting a single css file into multiple +# css files (IE selector limit workaround) +# =========================================== +build.css.selector.limit=4095 + +# controls the ruby command used to execute compass. a full path +# to ruby may be specified rather than allowing the system shell +# to resolve the command +build.ruby.path=ruby + +# controls the working directory of the child compass process +# and the output location for the .sass-cache folder +compass.working.dir=${build.dir} + +# enables / disables console highlighting for compass +compass.compile.boring=false + +# enables / disables forced rebuilds for compass +compass.compile.force=true + +# enables / disables stack traces in compass failure output +compass.compile.trace=true + +# =========================================== +# Options for sub-packages + +# Set to true/1 to enable build.version inheritance by sub-pacakges +build.subpkgs.inherit.version=0 + +# =========================================== +# theme slicing example page settings +# =========================================== +package.example.dir=${package.dir}/sass/example +package.example.base=${build.all.rtl.css.debug.prefix} +package.example.css.rel=resources/${package.example.base}.css +package.example.css=${build.dir}/${package.example.css.rel} +package.example.scss=${build.dir}/${package.example.base}.scss +package.example.theme.html=${package.example.dir}/theme.html + +bootstrap.base.path=${package.example.dir} +bootstrap.example.js=${package.example.dir}/bootstrap.js + + +# =========================================== +# options controlling output packaging +# operations for output '.pkg' file +# =========================================== +pkg.build.dir=${workspace.build.dir}/${package.name} +pkg.file.name=${package.name}.pkg +pkg.includes=**/* +pkg.excludes=package.json diff --git a/.sencha/package/find-cmd-impl.xml b/.sencha/package/find-cmd-impl.xml new file mode 100644 index 0000000..55d6826 --- /dev/null +++ b/.sencha/package/find-cmd-impl.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + source ~/.bash_profile; sencha which -p cmd.dir -o '$cmddir$' + + + + + + \ No newline at end of file diff --git a/.sencha/package/init-impl.xml b/.sencha/package/init-impl.xml new file mode 100644 index 0000000..ce77788 --- /dev/null +++ b/.sencha/package/init-impl.xml @@ -0,0 +1,250 @@ + + + + + + + + + + + + + + + + + + + Switch package version to ${build.version} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.sencha/package/js-impl.xml b/.sencha/package/js-impl.xml new file mode 100644 index 0000000..50e6992 --- /dev/null +++ b/.sencha/package/js-impl.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.sencha/package/plugin.xml b/.sencha/package/plugin.xml new file mode 100644 index 0000000..d57eba8 --- /dev/null +++ b/.sencha/package/plugin.xml @@ -0,0 +1,32 @@ + + + + + + diff --git a/.sencha/package/resources-impl.xml b/.sencha/package/resources-impl.xml new file mode 100644 index 0000000..19e2d48 --- /dev/null +++ b/.sencha/package/resources-impl.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + Merging resources from base package ${base.path} + + + + + + + + + + + + + + + + Merging resources from current package ${package.resources.dir} + + + + + \ No newline at end of file diff --git a/.sencha/package/sass-impl.xml b/.sencha/package/sass-impl.xml new file mode 100644 index 0000000..d86e2d6 --- /dev/null +++ b/.sencha/package/sass-impl.xml @@ -0,0 +1,114 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.sencha/package/sencha.cfg b/.sencha/package/sencha.cfg new file mode 100644 index 0000000..ffb918a --- /dev/null +++ b/.sencha/package/sencha.cfg @@ -0,0 +1,60 @@ +# The name of the package - should match the "name" property in ./package.json +# +package.name=Ext.ux.AccordionList + +# The namespace to which this package's SASS corresponds. The default value of +# "Ext" means that the files in ./sass/src (and ./sass/var) match classes in +# the Ext" root namespace. In other words, "Ext.panel.Panel" maps to +# ./sass/src/panel/Panel.scss. +# +# To style classes from any namespace, set this to blank. If this is blank, +# then to style "Ext.panel.Panel" you would put SASS in +# ./sass/src/Ext/panel/Panel.scss. +# +package.sass.namespace=Ext + +# This is the comma-separated list of folders where classes reside. These +# classes must be explicitly required to be included in the build. +# +package.classpath=${package.dir}/src + +# This is the comma-separated list of folders of overrides. All files in this +# path will be given a tag of "packageOverrides" which is automatically +# required in generated apps by the presence of this line in app.js: +# +# //@require @packageOverrides +# +package.overrides=${package.dir}/overrides + +# This is the folder where SASS "src" resides. This is searched for SCSS +# files that match the JavaScript classes used by the application. +# +package.sass.srcpath=${package.dir}/sass/src + +# This is the folder where SASS "vars" resides. This is searched for SCSS +# files that match the JavaScript classes used by the application. +# +package.sass.varpath=${package.dir}/sass/var + +# This file is automatically imported into the SASS build before "vars". +# +package.sass.etcpath=${package.dir}/sass/etc/all.scss + +# This is the folder in which to place "sencha packaage build" output. +# +package.build.dir=${package.dir}/build + +# The folder that contains example application(s) for this package. +# +package.examples.dir=${package.dir}/examples + +# The folder that contains sub-packages of this package. Only valid for "framework" +# package type. +# +package.subpkgs.dir=${package.dir}/packages + +#============================================================================== +# Custom Properties - Place customizations below this line to avoid merge +# conflicts with newer versions + +package.cmd.version=4.0.1.45 diff --git a/.sencha/package/slice-impl.xml b/.sencha/package/slice-impl.xml new file mode 100644 index 0000000..8ca45dc --- /dev/null +++ b/.sencha/package/slice-impl.xml @@ -0,0 +1,111 @@ + + + + +/** + * This file is generated by Sencha Cmd and should NOT be edited. It is + * provided to support globbing requires, custom xtypes, and other + * metadata-driven class system features + */ + + + + + + + + + + + +/* + * This file is generated by Sencha Cmd and should NOT be edited. It redirects + * to the most recently built CSS file for the application to allow theme.html + * to load properly for image slicing (required to support non-CSS3 browsers + * such as IE9 and below). + */ +@import '${package.example.css.path}'; + + + + + + Capture theme image to ${build.dir}/theme-capture.png + + + + + + + Slicing theme images to ${build.resources.dir} + + + + + + + + + + \ No newline at end of file diff --git a/.sencha/package/sub-builds.xml b/.sencha/package/sub-builds.xml new file mode 100644 index 0000000..90f648e --- /dev/null +++ b/.sencha/package/sub-builds.xml @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + package + upgrade + + + + + + + + + + Building example in @{example-dir} + + + + + + + + + Upgrading example in @{example-dir} + + + app + upgrade + + + + + + + + + + Cleaning example in @{example-dir} + + + + + \ No newline at end of file diff --git a/.sencha/package/testing.properties b/.sencha/package/testing.properties new file mode 100644 index 0000000..60749a3 --- /dev/null +++ b/.sencha/package/testing.properties @@ -0,0 +1,17 @@ +# =========================================== +# This file defines properties used by +# build-impl.xml, which is the base impl +# of an applications build process. The +# properties from this file correspond to the +# 'testing' build environment, specified +# by 'sencha app build testing'. These will +# take precedence over defaults provided by +# build.properties. +# =========================================== + +# =========================================== +# compression option used to generate '-all' +# js output file. this value disables +# compression for testing builds +# =========================================== +build.compile.js.compress= diff --git a/README.md b/README.md index 13336e0..ba1c606 100644 --- a/README.md +++ b/README.md @@ -6,9 +6,7 @@ Collapsible List with Ext.data.TreeStore. You can expand and collapse contents b This component was introduced at [Sencha Insight #6](http://us6.campaign-archive2.com/?u=35c628e5bf74b167e4791ffb8&id=f36913f231) -[![1](image1.png)](https://raw.github.com/kawanoshinobu/Ext.ux.AccordionList/master/image1.png) - -[![2](image2.png)](https://raw.github.com/kawanoshinobu/Ext.ux.AccordionList/master/image2.png) +[![1](eyecatch.png)](https://raw.github.com/kawanoshinobu/Ext.ux.AccordionList/master/resources/eyecatch.png) ## Demo @@ -44,31 +42,35 @@ If you use default design, import _accordionlist.scss and include accordionlist @import 'stylesheets/accordionlist'; @include accordionlist; -Before build with Sencha Cmd, you must define "${add.dir}/ux" to sencha.cfg: +Before build with Sencha Cmd, you must define "${add.dir}/../src/ux" to sencha.cfg: - app.classpath=${app.dir}/app.js,${app.dir}/ux,${app.dir}/app + app.classpath=${app.dir}/app.js,${app.dir}/../src/ux,${app.dir}/app ### Example Execute the following command in the sources root directory - sencha ant -f project.xml initialize + sencha ant -f build.xml initialize And compile .scss file. - compass compile example/resources/sass/ + compass compile examples/resources/sass/ Then to place example directory to server's application directory. -## Test +## Integrate into Sencha Architect -You can execute Jasmine and PhantomJS based unit test. +If you want to use AccordionList with Architect, please install ‘Ext.ux.AccordionList.aux’ file of `architect` directory. Then you will find this component at Toolbox section. Please drag component to design area, that’s all. -Example command line: +AccordionList creates lists instance dynamically, so you cannot see the preview, but able to define some config by config section. - phantomjs test/run-jasmine.js http://localhost:3333/Ext.ux.AccordionList/test/SpecRunner.html +[![2](architect.png)](https://raw.github.com/kawanoshinobu/Ext.ux.AccordionList/master/resources/architect.png) + +## Test -You will need to run the tests from a web server because XHR's cannot be made from the file:// protocol +You can execute Siesta based unit test. To run the test, install this project into where the web server can serve your apps, and access to http://localhost/Ext.ux.AccordionList/tests from browser. + +[![3](siesta.png)](https://raw.github.com/kawanoshinobu/Ext.ux.AccordionList/master/resources/siesta.png) ## useComponents @@ -122,18 +124,27 @@ That's ok. Accordion List appears components bound items. You can check it at ex ## Version -1.0.1 +1.1.0 ## Change log -[2013-06-15] **v1.0.1** KAWANO Shinobu (kawanoshinobu) +[2013-11-27] **v1.1.0** Shinobu Kawano (kawanoshinobu) + +* Add paging and pull refresh feature +* Add bind component feature +* Add grouping and index bar feature +* Add indent feature +* Add some config to integrate into Sencha Architect +* change test tool, Jasmine to Siesta + +[2013-06-15] **v1.0.1** Shinobu Kawano (kawanoshinobu) * Add singleMode feature * Add animation feature * Add showCount feature * Add new example (decorate) -[2013-05-05] **v1.0.0** KAWANO Shinobu (kawanoshinobu) +[2013-05-05] **v1.0.0** Shinobu Kawano (kawanoshinobu) * Update for Sencha Touch 2.2 * Refactoring code diff --git a/architect/AccordionList.js b/architect/AccordionList.js new file mode 100644 index 0000000..9ee56bc --- /dev/null +++ b/architect/AccordionList.js @@ -0,0 +1,126 @@ +{ + "className" : "Ext.ux.AccordionList", + "classAlias": "widget.accordionlist", + "inherits" : "container", + "autoName" : "MyAccordionList", + "noSetup" : true, + + "toolbox" : { + "name" : "AccordionList", + "category": "Views", + "groups" : ["Views"] + }, + + //add custom configs + configs : [ + { + name : 'store', + type : 'object', + hidden : false, + initialValue: 'YourTreeStoreInstance', + merge : false + }, + { + name : 'displayField', + type : 'string', + hidden : false, + initialValue: 'text', + merge : false + }, + { + name : 'headerOpenTpl', + type : 'string', + hidden : false, + initialValue: '
{0}
', + merge : false + }, + { + name : 'headerCloseTpl', + type : 'string', + hidden : false, + initialValue: '
{0}
', + merge : false + }, + { + name : 'contentItemTpl', + type : 'string', + hidden : false, + initialValue: '{0}', + merge : false + }, + { + name : 'listConfig', + type : 'object', + hidden : false, + initialValue: null, + merge : false + }, + { + name : 'defaultExpanded', + type : 'boolean', + hidden : false, + initialValue: false, + merge : false + }, + { + name : 'useSelectedHighlights', + type : 'boolean', + hidden : false, + initialValue: true, + merge : false + }, + { + name : 'singleMode', + type : 'boolean', + hidden : false, + initialValue: false, + merge : false + }, + { + name : 'animation', + type : 'boolean', + hidden : false, + initialValue: false, + merge : false + }, + { + name : 'showCount', + type : 'boolean', + hidden : false, + initialValue: false, + merge : false + }, + { + name : 'indent', + type : 'boolean', + hidden : false, + initialValue: false, + merge : false + }, + { + name : 'useComponents', + type : 'boolean', + hidden : false, + initialValue: false, + merge : false + }, + { + name : 'defaultType', + type : 'string', + hidden : false, + initialValue: '', + merge : false + }, + { + name : 'indexBar', + type : 'object', + hidden : false, + initialValue: null, + merge : false + } + ], + + //define listeners + listeners : [], + +} diff --git a/architect/AccordionListItem.js b/architect/AccordionListItem.js new file mode 100644 index 0000000..02c795c --- /dev/null +++ b/architect/AccordionListItem.js @@ -0,0 +1,41 @@ +{ + "className" : "Ext.ux.AccordionListItem", + "classAlias": "widget.accordionlistitem", + "inherits" : "Ext.dataview.component.ListItem", + "autoName" : "MyAccordionListItem", + "noSetup" : true, + + "toolbox" : { + "name" : "AccordionListItem", + "category": "Views", + "groups" : ["Views"] + }, + + //add custom configs + configs : [ + { + name : 'headerDataMap', + type : 'object', + hidden : false, + initialValue: {}, + merge : false + }, + { + name : 'contentDataMap', + type : 'object', + hidden : false, + initialValue: {}, + merge : false + }, + { + name : 'indent', + type : 'boolean', + hidden : false, + initialValue: false, + merge : false + } + ], + + //define listeners + listeners : [] +} diff --git a/architect/Ext.ux.AccordionList.aux b/architect/Ext.ux.AccordionList.aux new file mode 100644 index 0000000..9e1cd99 Binary files /dev/null and b/architect/Ext.ux.AccordionList.aux differ diff --git a/build.xml b/build.xml new file mode 100644 index 0000000..e12c26b --- /dev/null +++ b/build.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/example/.sencha/app/build-impl.xml b/example/.sencha/app/build-impl.xml deleted file mode 100644 index 82fdea2..0000000 --- a/example/.sencha/app/build-impl.xml +++ /dev/null @@ -1,390 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Using Sencha Cmd from ${cmd.dir} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - The Touch SDK currently supports 'production', 'testing', 'package', and 'native' builds not ${args.environment} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/example/.sencha/app/codegen.json b/example/.sencha/app/codegen.json deleted file mode 100644 index f91b694..0000000 --- a/example/.sencha/app/codegen.json +++ /dev/null @@ -1,101 +0,0 @@ -{ - "sources": { - "app.js.tpl.merge": { - "ca53c51d7615eb8c49850c488900745110fd6a2d": "eJzdV99z2jgQfuev2OEmY9NwhlCatiSkuWvzwEzTdK65m7nJ5EGxBaiRJZ8k8+MY7m+/lWSDCfghM3kKD4C9u59W37eSVqsjlmZSme8kfiQTGsYyjTQV8ZREuWG8dbTuvGkAfm6nTMOYcQr4O6GCKmJoAkQkkGeJ+/+whB8uFD6nSQR/yxxiIoAmzIDZhBPt8ASlCcaMpYKlzBWQLOMsJoZJ0YaH3EZQTV2whjnjHKZkRsFIeKCQUjVxAzqo7aAwn1IBOFxGFSKnGmKZ0DJdhAZD9KMGncdTTGRjEBPMZ+7AUgzguo2BwijJOVUaMMcZo3PtZuuGULkQNqrpubLZIw0TRRLajBoOaJRQwvkS0CwmVNvMtyTMZc4TOxPOUlbymEpt0KIet+ZECurQmACJjCjIOIkRLSyn8HmbZyuC0bjKBrIvpPFsOZYdVJmQHdKSuxXTktW29Dm+MyWTPEbBoOkRkJIxamSaOBFiLKDDc85WTjtFRbXkqFNKRG6nHzXedBqNTge+3MC3m1v4cvX16vYKfvVcJEzR2LCZKypF/8nx2ddEZRaZL03HoGUnQrjLwhkuC+vNjCrFEqrtYOcJfcgnF42rhYm+StREYU1jiZtpuHIpB2gJBhCsxoqk1IJa47qjVRy0vccKJf2GxrX1w/9BY906s9idAtyhV6q2gBYYM6iGt305FAnrAdy55zKN6JpqjRP4XS4CZ7hvN85NxoGNh00EuXb12LyoFOfgbnW0wZgRnlMdeQsMIRznInalHvp3LVhtnO3HshvOiMKMDPrf3beRYWVsrA+INM7JhEE7aGEx4OvuGf6ce6+IUzEx0zM4PmZPkV2djkPnd8fuD5k9EybKco1aWK5gAGWAJfip87pR/4RAuRL2Zxu3boUFIxvu4BiCoIA+WjtukYNhM60y6zUXTrHVHYQLJhK6gOEQFrHMhWnBJ0TBZJEWuF+fdxDmYqOXe6qq9pfdLgpot3Wg7Pui+U1lRzP36hmSOf/Xo5jjrU6wWYXUF9brh5G4Ngts7R4OKuZNu5L5d8/QzAe8HtE8eXWq6Sq1Lyxb5fArBqgc2wcFrB7rOypWDM+QshL1evSssFonarxH/Aso6xsdhB5UKAjevbcnsO0rcoWdT8c66M4Iv6NMTIrj2nm+79V5/scykjx1Pznp1/lf9hZ73v1ab4dehriIdXHoM23t37HJkdhla5oMwKicFlZtUME8G6V4/O9M+W2vu+ifdnfHK7w7hTH6me3kd9rvLj72amIK4x5hpx8WJ91u/3BQad2L6tv3vbqowrrH37u3p4tet/vhcNjGvM/7R2vo18WV5n3yOcHFPR1AucbD6sqyHSnVWMNLe9GAX7DsbaeIPf1IJLajwzVPOU2pMJsY262N+TIMDjgHrSjxeCEul+owI8EMI5z9S91IKcFW3p5kO7D23LPXsIgkSWhfxIpiSx5u+0jXLETXGB20igVZTlSKP/0NrGaursvUE7v3jZlKw53doPnbtoUFj9Ns73q4q1+l08WbmIafOV5W8BKCYuhxbi86DxQvRuVd0N128HqDD+iHzbnGwAj+oByJAyHnn56Msskc735GilFyeJuEjR23liEES6qDuh1zjluQnEdc+rQj5QYPn7FdlkS73v9/HBJaGw\u003d\u003d" - }, - "app.json.tpl.merge": { - "8d16c615fb2f1cb40ed794158d6ac3192a168b97": "eJzFWFtv00gUfu+vGEUrAVUaP+1LtSB1SxHdLQWRon0AHib2cTwwnjFzSRpV+e/7zfgSO2kLKYhaquxmPOd+vu+Mbw4YruTwMN7ZIbsqiPGqkiLlTmj1xDLFS7IVT2nMvKWMzVZsSiotODvVZclVxpxmc1JkuCOWSm4t2UZcEu+jIGJ0zEY34WE9Gh/cpjUXkljFXRHkuULYLTtyo5Vjr6/eXLBMp74k5cbMkMT6gvp7Jl+sVlHc0AqhMrp+7Ur5DkqCOfGHSYFf7jCJz6yWHl59eH9xm1VMKJbRgqSugjmM1ELAyto0MaFj7Og2G692BLTKIGqlvWFLmrGZ0UtLhmXeCDXvyx8zmsxhd+FcdZwkUqdcFtq6pFxBZtJzZ9II3jgDvQsuPTE8KKIMiVwWpNjMCxkzaAi+IpDRjmHkM6oIslUqyDKRM+Hw9jcvsIXB0gWZIysyiiK8Sbvsw13uGDfElMY9xYoVM2R5IXidbruyjkpWGe10quVkmDBvJNKkvJS76bkQ1jGdMy4l+4cv+DQ1ooISFJ+zIS8h8kbMC2TlmlIf06VNRqZVws54WsAX6A9JwersC6WOLUUowVCQWkq9DDnItSm5O243xutm8F+0t2rqKtwTpxMbbUI5jliSsHdNaQfHxyGMMX91HBDR0sOhGf1YRfeUGiq1C93lDLI7uKD06dsqeM7ls52d913YecReUs69RDRhiUf+c6FQNU9zLi2tnoVfrZhDNON9V5aFQFiXAnmBN6muBGX7655WlIp8VTuFWMVI1KFCRFjt9I7CUGYw6269I19lPEZrlJF0fPSrogWTz/Oo30bLoXzcMzpap5VcBduk5qH9tAqQCvzcWxdjKUoXIoSKfRejP3Xa8DkhU07IWnXX8ABrNads8gCv2jghrKR4aF4d+h39ccQFQCqssjqqoU02Pj9EV45WH7GSuIIMPLeC22oqEbgatjahrX2zu6m+Pppp7awzvNrujp9K9bnKAjRSqMM++JcaxsUcd3i5mjC2r3jwjq0r226KuqtopDziAjXAnQGEU2R+BWxDV+RkoHb/hmvwsmPxDnPA7yInIFOdW6RApEbXJWy2WSZe6yGGA/yO2ceDVtfNQV9zh5g3ucFksNTma0DJdWLjgHHktE+Lv1wlAQHPR1LMDIenz5+zJ4D9J6MXR7j9lWD9RQDZ8VD2bv679fX4ewbVAdgWOQMMyhZrx4GPetVQkx0SFkegIWkGDkzR8HhR4a9LY4cPGypuAtfp3EasjRPx6fP91Hg6nd7KiUKl0ttH4MQge5LaR6LEBzf+IxLiI/Hhz4Tqd7Hhz5BhZDSUNSZtrQCnwPHl/m7+Fnr8Zex4H1CHnvwBpO5m/AQbktCIYeMWTu6PWR9snRHunQasAFIlymNzqgwpnnRk9DSeAv8cHMXiKx1fPevhKk40NbYOHcbm07AHZm587UyqzWqhNKBWh6CnJ6evz9ibk8vzV2fTK5yA0s1Rrqegjmqj4eMwQL2jWrfwebyXFZdnV/+9ff/v/eoVuUCquwYcPljvq5OLi79PTr+jGJgoZzyNmj/Hn9e7ST+7BjlvTo0DqAJ7abDMhhiHyes2DVzrVaco0f/9wuyvgYrvWLKOG+er0V11+ipUVdIbu8IXDVSdQ5pN9AAMoE1TeXBlFbiyP7LZccdrgCSRwf+5l9zgmFqZcECGbVvfLaLEoaOfPk3sQv1xp50vOwPbLyrWBbPCTAA1C6G9DcfuzMckNqZN2GWgkTjJBIMRJxdG27YPO5CNANMFoVXa+vWVqjBhOJ7WcyP0VIDZRkocOvIaGi1ed0tCqGrI2PKcm7QA77ffa5p/b/lY80GJb556iAFLsw3g9nCi+YjFg/cg8Ov40oAzvtLKdvPQZZhyAhQFELGF9pjQFIZ+0yBrj1u2Pl6ILA62Plp2nq1HB+uD/wH6R1ds" - }, - "packager.json.tpl.merge": { - "79175610d9330cc0582cd66bb8103f2e24409b4a": "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\u003d" - }, - "app.scss.tpl.merge": { - "3d3f6b023c31a4e49cd626dd27cff9474aff32d7": "eJx9kL1uAyEQhHs/xXRnS8nRx40lK0Xq8wusYc8QceyJH5/99gHsOh3MDLMfqxQuljGL97K5cEPeBN4FTnDLKjEjV9vwTMVnTBy0JVykaNuMhUf8zHhKAUXGtThvaslOKRACb6/MByIvcud+AwXTO8mY9jBCtoDzNEECsqyQudtXStzl/Wadtq3SJZCPTOYJF7Qvhk09vEpoXcffVCtm5/kw7k5v+iF15M/ckNX7H8Pxf1+R9zXTZp5LyrJAi2HcpG7FcuRx7N73g5bVV60il9SXV8GdrhSLe7jw1UKnN2rX90NJHIfD8Q/mSX+o" - }, - "config.rb.tpl.merge": { - "e254e92dd21bc9ecb27f3b8251d67dfbc79fa1af": "eJxlkMFOwzAMhu95Cqs7bEiQB0DaCTGEtAPiBSIrddtAG5c4ASrEu+N00kDjYtl/7O+PvYEHypAHgjYk8pnTohVWKQh4jl3oS8IcOEIXRgL6DJIFQjQ6AHs4qGg1jTjRzrnD4/HeuStjNnBkbFeyUPQD3mQufoAuaeMHp1fAknlSssdxXKwZa/tKe+EQd4q8hq2123P8Oo8+YR6+q5RIuCRPUgu1mjRbve94mlEuFhAjqrlZp/XjamD8b3nh3FjbaNSGZgU+01vRAwHGBbBtQ+XhqPyTzzyWPkSBgRJZEybsSdyfA/0Dn1qUzSXPJTvJix53D7eVqGsJtYbie0gcJ4q5vsyJ2+KrsfkBl52Ucw\u003d\u003d" - } - }, - "targets": { - "app.js": { - "source": "app.js.tpl.merge", - "version": "ca53c51d7615eb8c49850c488900745110fd6a2d", - "parameters": { - "appName": "22", - "frameworkPath": "touch", - "appModels": "", - "appControllers": "", - "appStores": "", - "appViews": "Main" - } - }, - "app.json": { - "source": "app.json.tpl.merge", - "version": "8d16c615fb2f1cb40ed794158d6ac3192a168b97", - "parameters": { - "appName": "22", - "senchadir": ".sencha", - "frameworkPath": "touch", - "frameworkName": "touch", - "appModels": "", - "name": "22", - "library": "core", - "appControllers": "", - "appStores": "", - "appViews": "", - "uniqueId": "a5873a36-71ae-49fa-b93d-c11b8c4d8e99" - } - }, - "packager.json": { - "source": "packager.json.tpl.merge", - "version": "79175610d9330cc0582cd66bb8103f2e24409b4a", - "parameters": { - "appName": "22", - "senchadir": ".sencha", - "frameworkPath": "touch", - "frameworkName": "touch", - "appModels": "", - "name": "22", - "library": "core", - "appControllers": "", - "appStores": "", - "appViews": "", - "uniqueId": "a5873a36-71ae-49fa-b93d-c11b8c4d8e99" - } - }, - "resources/sass/app.scss": { - "source": "app.scss.tpl.merge", - "version": "3d3f6b023c31a4e49cd626dd27cff9474aff32d7", - "parameters": { - "appName": "22", - "senchadir": ".sencha", - "frameworkPath": "touch", - "frameworkName": "touch", - "appModels": "", - "name": "22", - "library": "core", - "appControllers": "", - "appStores": "", - "appViews": "", - "uniqueId": "a5873a36-71ae-49fa-b93d-c11b8c4d8e99" - } - }, - "resources/sass/config.rb": { - "source": "config.rb.tpl.merge", - "version": "e254e92dd21bc9ecb27f3b8251d67dfbc79fa1af", - "parameters": { - "appName": "22", - "senchadir": ".sencha", - "frameworkPath": "touch", - "frameworkName": "touch", - "appModels": "", - "name": "22", - "library": "core", - "appControllers": "", - "appStores": "", - "appViews": "", - "uniqueId": "a5873a36-71ae-49fa-b93d-c11b8c4d8e99" - } - } - } -} \ No newline at end of file diff --git a/example/.sencha/app/sencha.cfg b/example/.sencha/app/sencha.cfg deleted file mode 100644 index 0dfbaa8..0000000 --- a/example/.sencha/app/sencha.cfg +++ /dev/null @@ -1,11 +0,0 @@ -#Sat, 04 May 2013 12:38:17 +0900 -app.name=22 - -app.framework=touch - -app.classpath=../src/ux,${app.dir}/app.js,${app.dir}/app - -app.build.dir=${workspace.build.dir}/${app.name} - -app.cmd.version=3.1.1.274 -app.id=a5873a36-71ae-49fa-b93d-c11b8c4d8e99 diff --git a/example/resources/css/app.css b/example/resources/css/app.css deleted file mode 100644 index c39f6ed..0000000 --- a/example/resources/css/app.css +++ /dev/null @@ -1 +0,0 @@ -html,body{position:relative;width:100%;height:100%}.x-fullscreen{position:absolute !important}.x-body{position:relative;z-index:0}.x-inner,.x-body{width:100%;height:100%}.x-sized{position:relative}.x-innerhtml{width:100%}.x-layout-box{display:flex;display:-webkit-box;display:-ms-flexbox}.x-layout-box.x-horizontal{-webkit-box-orient:horizontal !important;-ms-flex-direction:row !important;flex-direction:row !important}.x-layout-box.x-horizontal>.x-layout-box-item.x-flexed{min-width:0 !important}.x-layout-box.x-vertical{-webkit-box-orient:vertical !important;-ms-flex-direction:column !important;flex-direction:column !important}.x-layout-box.x-vertical>.x-layout-box-item.x-flexed{min-height:0 !important}.x-layout-box>.x-layout-box-item{display:flex !important;display:-webkit-box !important;display:-ms-flexbox !important}.x-layout-box.x-align-start{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.x-layout-box.x-align-center{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.x-layout-box.x-align-end{-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end}.x-layout-box.x-align-stretch{-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch}.x-layout-box.x-pack-start{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.x-layout-box.x-pack-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.x-layout-box.x-pack-end{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.x-layout-box.x-pack-justify{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.x-layout-box-item.x-sized>.x-inner,.x-layout-box-item.x-sized>.x-body,.x-layout-box-item.x-sized>.x-dock-outer{width:auto;height:auto;position:absolute;top:0;right:0;bottom:0;left:0}.x-webkit .x-layout-box.x-horizontal>.x-layout-box-item.x-flexed{width:0 !important}.x-webkit .x-layout-box.x-vertical>.x-layout-box-item.x-flexed{height:0 !important}.x-firefox .x-stretched.x-dock-horizontal>.x-dock-body{width:0}.x-firefox .x-stretched.x-dock-vertical>.x-dock-body{height:0}.x-firefox .x-container .x-dock-horizontal.x-unsized .x-dock-body{-webkit-box-flex:1;-ms-flex:1 0 0px;flex:1 0 0px;min-height:0;min-width:0}.x-firefox .x-has-height>.x-dock.x-unsized.x-dock-vertical>.x-dock-body{height:0}.x-layout-card{position:relative;overflow:hidden}.x-layout-card-perspective{-webkit-perspective:1000px;-ms-perspective:1000px;perspective:1000px}.x-layout-card-item-container{width:auto;height:auto;position:absolute;top:0;right:0;bottom:0;left:0}.x-layout-card-item{position:absolute;top:0;right:0;bottom:0;left:0;position:absolute !important}.x-dock{display:flex;display:-webkit-box;display:-ms-flexbox}.x-dock>.x-dock-body{overflow:hidden}.x-dock.x-sized,.x-dock.x-sized>.x-dock-body>*,.x-dock.x-sized>.x-dock-body>.x-body>.x-inner{width:auto;height:auto;position:absolute;top:0;right:0;bottom:0;left:0}.x-dock.x-sized>.x-dock-body{position:relative;display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;min-height:0;min-width:0}.x-dock.x-unsized,.x-dock.x-stretched{height:100%}.x-dock.x-unsized>.x-dock-body,.x-dock.x-stretched>.x-dock-body{position:relative;display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column;min-height:0;min-width:0}.x-dock.x-unsized>.x-dock-body>*,.x-dock.x-stretched>.x-dock-body>*{-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;min-height:0;min-width:0}.x-dock.x-dock-vertical{-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column}.x-dock.x-dock-horizontal{-webkit-box-orient:horizontal !important;-ms-flex-direction:row !important;flex-direction:row !important}.x-dock.x-dock-horizontal>.x-dock-item{display:flex;display:-webkit-box;display:-ms-flexbox}.x-dock.x-dock-horizontal>.x-dock-item.x-sized>.x-inner,.x-dock.x-dock-horizontal>.x-dock-item.x-sized>.x-body{width:auto;height:auto;position:absolute;top:0;right:0;bottom:0;left:0}.x-dock.x-dock-horizontal>.x-dock-item.x-unsized{-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column}.x-dock.x-dock-horizontal>.x-dock-item.x-unsized>*{-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;min-height:0;min-width:0}.x-ie .x-stretched.x-dock-horizontal>.x-dock-body{width:0}.x-ie .x-stretched.x-dock-vertical>.x-dock-body{height:0}.x-ie .x-has-width>.x-dock.x-unsized.x-dock-horizontal>.x-dock-body{width:0}.x-ie .x-has-height>.x-dock.x-unsized.x-dock-vertical>.x-dock-body{height:0}.x-stretched.x-container{display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column}.x-stretched.x-container>.x-inner,.x-stretched.x-container>.x-body,.x-stretched.x-container>.x-body>.x-inner{display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column;min-height:0px}.x-layout-fit.x-stretched>.x-layout-fit-item{display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;min-height:0;min-width:0}.x-layout-fit{position:relative}.x-layout-fit-item.x-sized{position:absolute;top:0;right:0;bottom:0;left:0}.x-layout-fit-item.x-unsized{width:100%;height:100%}.x-ie .x-stretched>.x-inner,.x-ie .x-stretched>.x-body{min-height:inherit}.x-center,.x-centered{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.x-center>*,.x-centered>*{position:relative}.x-center>.x-floating,.x-centered>.x-floating{position:relative !important}.x-floating{position:absolute !important}.x-layout-float{overflow:hidden}.x-layout-float>.x-layout-float-item{float:left}.x-layout-float.x-direction-right>.x-layout-float-item{float:right}@-webkit-keyframes x-paint-monitor-helper{from{zoom:1}to{zoom:1}}@keyframes x-paint-monitor-helper{from{zoom:1}to{zoom:1}}.x-paint-monitored{position:relative}.x-paint-monitor{width:0 !important;height:0 !important;visibility:hidden}.x-paint-monitor.cssanimation{-webkit-animation-duration:0.0001ms;-webkit-animation-name:x-paint-monitor-helper;animation-duration:0.0001ms;animation-name:x-paint-monitor-helper}.x-paint-monitor.overflowchange{overflow:hidden}.x-paint-monitor.overflowchange::after{content:'';display:block;width:1px !important;height:1px !important}.x-size-monitored{position:relative}.x-size-monitors{position:absolute;left:0;top:0;width:100%;height:100%;visibility:hidden;overflow:hidden}.x-size-monitors>*{width:100%;height:100%;overflow:hidden}.x-size-monitors.scroll>*.shrink::after{content:'';display:block;width:200%;height:200%;min-width:1px;min-height:1px}.x-size-monitors.scroll>*.expand::after{content:'';display:block;width:100000px;height:100000px}.x-size-monitors.overflowchanged>*.shrink>*{width:100%;height:100%}.x-size-monitors.overflowchanged>*.expand>*{width:200%;height:200%}.x-size-change-detector{visibility:hidden;position:absolute;left:0;top:0;z-index:-1;width:100%;height:100%;overflow:hidden}.x-size-change-detector>*{visibility:hidden}.x-size-change-detector-shrink>*{width:200%;height:200%}.x-size-change-detector-expand>*{width:100000px;height:100000px}.x-translatable{position:absolute !important;top:500000px !important;left:500000px !important;overflow:visible !important;z-index:1}.x-translatable-hboxfix{position:absolute;min-width:100%;top:0;left:0}.x-translatable-hboxfix>.x-translatable{position:relative !important}.x-translatable-container{overflow:hidden;width:auto;height:auto;position:absolute;top:0;right:0;bottom:0;left:0}.x-translatable-container::before{content:'';display:block;width:1000000px;height:1000000px;visibility:hidden}.x-button{display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-align:center;-ms-flex-align:center;align-items:center;background-color:#eee;border:1px solid #ccc;position:relative;overflow:hidden;z-index:1}.x-button .x-button-icon{position:relative;background-repeat:no-repeat;background-position:center}.x-button .x-button-icon.x-shown{display:block}.x-button .x-button-icon.x-hidden{display:none}.x-iconalign-left,.x-icon-align-right{-webkit-box-orient:horizontal;-ms-flex-direction:row;flex-direction:row}.x-iconalign-top,.x-iconalign-bottom{-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column}.x-iconalign-bottom,.x-iconalign-right{-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.x-iconalign-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.x-button-label,.x-badge,.x-hasbadge .x-badge{-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;-webkit-box-align:center;-ms-flex-align:center;align-items:center;white-space:nowrap;text-overflow:ellipsis;text-align:center;display:block;overflow:hidden}.x-badge{background-color:#ccc;border:1px solid #aaa;z-index:2;position:absolute !important;width:auto;font-size:.6em;right:0;top:0;max-width:95%;display:inline-block}html,body{font-family:"Helvetica Neue", HelveticaNeue, "Helvetica-Neue", Helvetica, "BBAlpha Sans", sans-serif;font-weight:normal;-webkit-text-size-adjust:none;margin:0;cursor:default}body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;padding:0}table{border-collapse:collapse;border-spacing:0}fieldset,img{border:0}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal}li{list-style:none}caption,th{text-align:left}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}q:before,q:after{content:''}abbr,acronym{border:0;font-variant:normal}sup{vertical-align:text-top}sub{vertical-align:text-bottom}input,textarea,select{font-family:inherit;font-size:inherit;font-weight:inherit}*:focus{outline:none}body.x-desktop{overflow:hidden}@-ms-viewport{width:device-width}*,*:after,*:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-touch-callout:none;-webkit-user-drag:none;-webkit-user-select:none;-ms-user-select:none;-ms-touch-action:none;-moz-user-select:-moz-none}input,textarea{-webkit-user-select:text;-ms-user-select:auto;-moz-user-select:text}.x-hidden-visibility{visibility:hidden !important}.x-hidden-display,.x-field-hidden{display:none !important}.x-hidden-offsets{position:absolute !important;left:-10000em;top:-10000em;visibility:hidden}.x-html{-webkit-user-select:auto;-webkit-touch-callout:inherit;-ms-user-select:auto;line-height:1.5;color:#333;font-size:.8em;padding:1.2em}.x-html body{line-height:1.5;font-family:"Helvetica Neue",Arial,Helvetica,sans-serif;color:#333;font-size:75%}.x-html h1,.x-html h2,.x-html h3,.x-html h4,.x-html h5,.x-html h6{font-weight:normal;color:#222}.x-html h1 img,.x-html h2 img,.x-html h3 img,.x-html h4 img,.x-html h5 img,.x-html h6 img{margin:0}.x-html h1{font-size:3em;line-height:1;margin-bottom:0.50em}.x-html h2{font-size:2em;margin-bottom:0.75em}.x-html h3{font-size:1.5em;line-height:1;margin-bottom:1.00em}.x-html h4{font-size:1.2em;line-height:1.25;margin-bottom:1.25em}.x-html h5{font-size:1em;font-weight:bold;margin-bottom:1.50em}.x-html h6{font-size:1em;font-weight:bold}.x-html p{margin:0 0 1.5em}.x-html p .left{display:inline;float:left;margin:1.5em 1.5em 1.5em 0;padding:0}.x-html p .right{display:inline;float:right;margin:1.5em 0 1.5em 1.5em;padding:0}.x-html a{text-decoration:underline;color:#06c}.x-html a:visited{color:#004c99}.x-html a:focus{color:#09f}.x-html a:hover{color:#09f}.x-html a:active{color:#bf00ff}.x-html blockquote{margin:1.5em;color:#666;font-style:italic}.x-html strong,.x-html dfn{font-weight:bold}.x-html em,.x-html dfn{font-style:italic}.x-html sup,.x-html sub{line-height:0}.x-html abbr,.x-html acronym{border-bottom:1px dotted #666666}.x-html address{margin:0 0 1.5em;font-style:italic}.x-html del{color:#666}.x-html pre{margin:1.5em 0;white-space:pre}.x-html pre,.x-html code,.x-html tt{font:1em "andale mono","lucida console",monospace;line-height:1.5}.x-html li ul,.x-html li ol{margin:0}.x-html ul,.x-html ol{margin:0 1.5em 1.5em 0;padding-left:1.5em}.x-html ul{list-style-type:disc}.x-html ol{list-style-type:decimal}.x-html dl{margin:0 0 1.5em 0}.x-html dl dt{font-weight:bold}.x-html dd{margin-left:1.5em}.x-html table{margin-bottom:1.4em;width:100%}.x-html th{font-weight:bold}.x-html thead th{background:#c3d9ff}.x-html th,.x-html td,.x-html caption{padding:4px 10px 4px 5px}.x-html table.striped tr:nth-child(even) td,.x-html table tr.even td{background:#e5ecf9}.x-html tfoot{font-style:italic}.x-html caption{background:#eee}.x-html .quiet{color:#666}.x-html .loud{color:#111}.x-html ul li{list-style-type:circle}.x-html ol li{list-style-type:decimal}@-webkit-keyframes x-loading-spinner-rotate{0%{-webkit-transform:rotate(0deg)}8.32%{-webkit-transform:rotate(0deg)}8.33%{-webkit-transform:rotate(30deg)}16.65%{-webkit-transform:rotate(30deg)}16.66%{-webkit-transform:rotate(60deg)}24.99%{-webkit-transform:rotate(60deg)}25%{-webkit-transform:rotate(90deg)}33.32%{-webkit-transform:rotate(90deg)}33.33%{-webkit-transform:rotate(120deg)}41.65%{-webkit-transform:rotate(120deg)}41.66%{-webkit-transform:rotate(150deg)}49.99%{-webkit-transform:rotate(150deg)}50%{-webkit-transform:rotate(180deg)}58.32%{-webkit-transform:rotate(180deg)}58.33%{-webkit-transform:rotate(210deg)}66.65%{-webkit-transform:rotate(210deg)}66.66%{-webkit-transform:rotate(240deg)}74.99%{-webkit-transform:rotate(240deg)}75%{-webkit-transform:rotate(270deg)}83.32%{-webkit-transform:rotate(270deg)}83.33%{-webkit-transform:rotate(300deg)}91.65%{-webkit-transform:rotate(300deg)}91.66%{-webkit-transform:rotate(330deg)}100%{-webkit-transform:rotate(330deg)}}@keyframes x-loading-spinner-rotate{0%{-ms-transform:rotate(0deg)}8.32%{-ms-transform:rotate(0deg)}8.33%{-ms-transform:rotate(30deg)}16.65%{-ms-transform:rotate(30deg)}16.66%{-ms-transform:rotate(60deg)}24.99%{-ms-transform:rotate(60deg)}25%{-ms-transform:rotate(90deg)}33.32%{-ms-transform:rotate(90deg)}33.33%{-ms-transform:rotate(120deg)}41.65%{-ms-transform:rotate(120deg)}41.66%{-ms-transform:rotate(150deg)}49.99%{-ms-transform:rotate(150deg)}50%{-ms-transform:rotate(180deg)}58.32%{-ms-transform:rotate(180deg)}58.33%{-ms-transform:rotate(210deg)}66.65%{-ms-transform:rotate(210deg)}66.66%{-ms-transform:rotate(240deg)}74.99%{-ms-transform:rotate(240deg)}75%{-ms-transform:rotate(270deg)}83.32%{-ms-transform:rotate(270deg)}83.33%{-ms-transform:rotate(300deg)}91.65%{-ms-transform:rotate(300deg)}91.66%{-ms-transform:rotate(330deg)}100%{-ms-transform:rotate(330deg)}}@font-face{font-family:"Pictos";src:url('data:application/x-font-woff;base64,d09GRgABAAAAADJoAA0AAAAAR2QAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAABMAAAABwAAAAcWF3wvkdERUYAAAFMAAAAHQAAACAAkQAET1MvMgAAAWwAAABIAAAAYIMUf1ljbWFwAAABtAAAAKkAAAFKznYCbGdhc3AAAAJgAAAACAAAAAj//wADZ2x5ZgAAAmgAACuvAAA9aCcOMcFoZWFkAAAuGAAAADEAAAA29KtLLWhoZWEAAC5MAAAAHgAAACQGhQMnaG10eAAALmwAAAEzAAABkElMDS1sb2NhAAAvoAAAAMoAAADKAij1am1heHAAADBsAAAAHgAAACAAvATkbmFtZQAAMIwAAAEyAAADaDtfCVNwb3N0AAAxwAAAAKYAAADtXH4MXwAAAAEAAAAAxtQumQAAAADIj74XAAAAAMj6BA142mNgZGBg4ANiCQYQYGJgBMJkIGYB8xgACIsAlgAAAHjaY2BiVmKcwMDKwMK0h6mLgYGhB0Iz3mUwYvjFgAqYkTkFlUXFDA4MCgz/md79ZwNKmjBsAQozguSYpjKtBVIKDIwAh2YNZHjaY2BgYGaAYBkGRgYQcAHyGMF8FgYNIM0GpBkZmBjqGP7//w/kK4Do/4//J0PVAwEjGwOcw8gEJJgYUAFQkpmFlY2dg5OLm4eXj19AUEhYRFRMXEJSSlpGVk5eQVFJWUVVTV1DU0tbR1dP38DQyNjE1MzcwtLK2sbWzt7B0cnZxdXN3cPTy9vH188/IDAoOCQ0LDwiMio6JjYuPiGRgVYgiUh1AHjTHZwAAAAAAAAB//8AAnjadXsJgBvFlXa/qj50Sy31MYdGGkmj7vHMeMYjqdX2jGfG53h8cNhgbINvY7ANDtiY08SYK0A4HSDYEBKuQFggwG4AGwxZQjAJ5NzdJCSBJBzJJhDC7iaY3azVs++1NNjkzz8adVdXVVe9evXe996rKglcGBz/ET+bPSeEBV1oFoSiIRdyecuFasnkpWrFKuRlzXBThRRfV6yM1W4dKxeh2nFmx1IzmzWNbHZ6y2UtZw6vWDHMjOHh2pPtPdlsT/uNUPG+J+AfEyrjf+QWe0hoEkqCkBoWXT0v60q5ZOiqJndD3nLUYmWY/53sSgWinbO3Hz9rQDw52dKSfCvZAgdilDO7kfObVAvkZp5+5mifdPeqjdCS8jzKBqb8vUwJ6ZGFzvEb2Is43g6hIswRThZOF3YIAhjdgP3SyB21kLdGoDoITsW/lbJgtEG5ZBb18hBU+sBC8uIg61LFziF3kGCjnCtVHfgU8dVyqn4fbOQXyn/zzF4MqlNCSm1cCVUUScwGkwsjUyLJ15ORSnReMuid4kWCkeRdyYgcgbGE94cVSiikwDlKyHtFCYcVnS6X1FNYcDpdDL/K27HadynB3IDcG5ulhfoj2KQ6EkuKYloLhSLYYnJ3goUVr8N/4WBI8a72Uzux9Q31+7F59bTPPwPn81Q2U+CCIsQFUygLU5F/BXsQlIIrlwxNzluVjsY9Zeiawn2+2hz5WqnzM+dWyyXu5swcfHx24tKnkpvgm1MnTZo6CboHOjsHOv/czJYrzd6aSIotvj2mabEnWpQkfCzJLcoFVa93MmyF1jlz5vyh06/t/8PTSguXvV82x8MwT0trLfPjTd7b//Qs0iwK7eOX8A1svzADZ3uXcC3Sq8mKiaTRZNnWELiY+NSzZSsFP1VxkWSz6tp+sozE48U0+DCKh43KEQfbVGS86i5qAyhl2zTKpRFKcLOUEU0DW8Wmepld6AVnGKRhMI0Ys6p8w8KZ4XBUv02PhpkcCbFwxKB0+BSrR0xG4vFIUuzOz2fN4XgsvLu55Z7PbHt2aO7qtde1NQWvZZETWpWFC5XcafHozmAh2tJkdgR3xr+qKEYm32GpgUAgEg40jU6Ki+EEqF4t1RMJB63uphDoJ9zQt1ZUo/F4VJWSoEqN5KnTV4mRiL5Xj0TEpVM/A5COK8oY33C69/lJF8294OSlIhx3RWDaMkO5LGCsHQyeu0BkXFy4A94BUY4kmhNKUyAYMLMBADUcSVynRcLhns6I0UM4AII6/hP2GrsZcUaAsl7QC07BKTtl+PFf/3oI/+F2uv5V8OcrOv4DfhnrwrqmYAvYQBHRqKQrecfKK/YwEKMrBatDKWplxbY6RCWv2261QyTUUiB4/JvHgwvul9ynlv723aUwFbZ4P97CDrCpbJP3e+8PmzDnIpgBI96VLQtaRq4/3q/tfmPp0JBfGbY8Q1UXLKCKFy5d6sWam0cElPjJ4//IzmPPCjGhVbBoHGpOLTso1AxVmttVx4dLXTOVFCa7WV5uA2YdV3t24aXLRHH5ztva2610q53LPT7cw6XuYTjTWwhP7V526aXLvNYbtWLastJW8ibYuLt7eLh7t4+fzeNP8hXYZ5vQhT2WEIoKjou8m2ifaMgRDQDHEsCuXn7plo6O4R4m9QwfV9sPey5dzr1aLme3ppEA9uzO5bvb8tFKz9BQz25vATy9e/nO2uhNSINtp4vaTf6c2eOvsrfYVf6cKaZiK7Zru6bL3nrppTsn/uG9l76976WX9n2bHpDezvEL+LnsBUQHF9toNxJyu5WQiFzERVQiuiPZPk7S3Rj0B+Xfq1hOCFGFDKw8fNh74DC7W49fHNeN+CS6XJTQ9cRFcUPHR8MvYC9QrcOw8lt+Bcyh7GMq1F8XAkjXxfws9ryQEBxhrjBfOE5YLCwVVvg0kub7WmrZllORjrLRMKtkkjTFIK12S9UylhMAVIv+S/QKZjj2CKBAo1TaplPWc/hFPinQBqf+pXdw2+rNG1dtH+pnPwrvv/yK/REu600zV0lioGvS5C6mMGnVDFOXvFqzlOgKR22Yqp9nv9g6p3Xm2tr7a7rTs1vZ8x89tmnZeUPlKdO3rdr0WG2SfcX+/VfYvcGEvHKmqjFEDtFIzlglx29MZWMhG9sBmX0UTK1Zs7B1TnqnhX/3t85O+/LUOX4u34byFCRrj6xP4CCsRBVozLn6jJA1g+9//fDhrz+OrN2bTnnXptLpFFyUSrNnP/Ye+PhjWPmxN2ZTpq21tgqkG67wY34JXIvtJlE7hBSxjUxAtb1uC5wJo+BUbi1WnUXVKszFyyIHdtKtCtdWixY9U5FVr2EV63jQOf4E38IOot4lBQMRgRBELehKzimoCCI5s6CXi8h27qCFLuuYo/sJlT311FPXek889RS8vnPz5to7cPZ111Vn1x6YWWXNl3n/6lz7PEy+7P43nF9u3Vpbe+2V7uUvv3xO0vU+Qj61jr/JV7PdgkZ6V8xCDJBPdjdzzW5iUanqIvQMQl1UlD4YRhcB5Zhdaaf7rj/hhpchzGbvuqycvnnj9M3fqVy2q5S5eePQ5jyVLr7+0L2drdPnfvuGXbtOv8l9btcutvHmaVPs9NDooesZ6l16/Hz2ffRR8thzGdnY3pC6IciyOBuCunQapC9l9kTbd723X3315kSw/25dv7s/qZy04/wHdmTez9z83VdvuvlVOGFe6W5du7s0upztOGnJjh1LMnU5OJ+fg/oQFHKfkoMqeTjk3+ANrxp6P6iRLrxG8vAYysOzsuzKSeXP8cTyRNyV5evjRoumsucbinjYew1Lq7L8lwRWSFSVpHxDPF63ARGB8+PZZpI81yLvinyrklu/awr45tcIhU4KtYauxS+ch5eTQiFvuClntzd9GErT0zWhEOwIhZZgmTfU1ITtDo6Ps/9B+WAod0EYZC/UZrGD3r3efZgzKAD7CHlJ/orgIlimEC8HQf46yN5fgT1bG6Vvnb5BgbHD2A5HvmMtdrg2lz3HUFn8su38BrYMPSABnCg4kgoPwW+9Vu82uPfpP/8Xithv/TZiwja+hp3i19Mng15U4S9eC/wOzgIb6z39tNfa0MMdiJMHkarQUZyEyfAJ9AGDx73F7GCDr94lr79etwdn8QB7WehEHBOKJuFoXdMIh3AKHZdQturSsw9dGYQhDTTThy0U17zMvrK5Sf0vcI934T8TzZth44kipvmJG72DLG2YrTzbkzn9jESzGLBd12YB1pw4I6D+aPkN6XCccmKR9I3LfqTC/0ohSQqgx5FBjsXG/x3ndiX6hFlhOtmLGFMQTrvBKSN4pkYAr27ZMRWHQDOVR8TFGrKCXkDJrbrDgJd6MXR3ibGwlAz2t2/cODiYu7qnPRGqtJ/y+OOnTJ3ReouZK3Sn5g23nbhgw4aWXFtJutZePG/5448vh/t6pHhESiid50Kn7v2iLx8LdLHVt31heacKTYY5OXXccNMMONdIlqQ97TNg5a23nlqfdz7+JixmFwsYIaRc1S445/3qV+fCnb+unf6rXxO2TRdG+W4ULgUtYZzmVdFRPHSO0uSaCDu7R478L5fm12768FfeBtj5RPPZ8OxWrwaW94vDhw7VMSw2fh7y523sIyakcfYaPRVR7u1qxXYkdEnRtalYtuNmgGcgMfG8i4h5YOHCfKEATSuPyw+Ojg7mjlu16oIbb7wgt+HCC0+HvT6lmdI3+menl6fZgpX7emblL7zhwjyb2XMXrJr1nvf792bOmvrKH1+Z6mM1yd52tNFBjMpOOFb7U1XfqVVkUyaDl6o6jec4mDg//ofcX99g+tOHH0Qi3SQkbEwjfB/NxuNf//jjV1MprS2toYHSUm3tV4QmWaP9HblMsDfEVCURiiqxTCCsRIJiMIz+aCQgAYSXB4KRWEaNsRcmDE1tTXIgqapoZzQVTmqyBgr5SFiTlwUgJMoiY6GwFo0kAmIgxBNJrcVIiQkxHGlJJGIxI6X6utY6fgO8xb6Jc9fqj1bXuNzfC8x3m9TSJ/beALbyyteamhftunKl2DV9elf39Onsm1eddpY3v+Q8AHOrK6/0fjC9u16CfEyPX8TXog63ITrMw5ZN2ULUbABbBr2BagNLCUVBzvdBL7imTKA3UgdarGL42Ceg5wpkH22wYHDU2thxi2VtsM6ybung7aOhxC3B1uCGUOiWBDxpbbH2FMT2ucGjmfpceqFYrL2Q7oyBHcOr9/MYdI+2i5h9dnGDhe1stOZqyVuC+EYLvuJdWizuKWy0RrXELaHQBmxpTyI82s6x37MseClNDXSmY2DF6nF8Uhjjy1hRKAq9OFKcfYznelkfZDhijW25VVTvquvbKRyRTasGtHzAfhVLR+zR88aOu/r4qeGwlBoYWFKc0a5HlaTzFSW2evaMldIZv021tFitLeC2mpmpM2zkr65zJRFQYq0zusOKWgoGktLs1ctG+i9stagq6mwHCvJmNldoR2oygAiIAlzIdSOHnQb6oaD6Rhlnm/dOXTeHyeAlgc1dN9mS5/RZuexF88/8AgwlTyrPWQewfnTycUYi1TenecbxezaFhAkbuRXh/9O+rD/BE1Yyf8wMa417acKyUT0bqTv1o4+8Bw8zIxzeGg5nI7nw2fjdGs6Fs34OZYb9jMjZ+MVM9uxh78GPPoJTvxNpj1DlYytixt/JJL3OCHP4OpbCqKkgdCPFpQzLgh4T/YlyhnnqGFGvNkJ0uHzX1esX63ogfdqqa44mvz2wePHAtMWLsxXLqhRZqm/27CYzEMweP70fk2ZTEJOD3kG/zrSBxa9hpWKFeOaMf559DnVCoqiBbK3qAmJlQf0NPFh7/BFY773zKDt45Afsc4/UUuwfHvUYyZeBvN6O9pB4XeJn88/z+/kh/jP+Jn+L/zv/kB8W7xcfEZ8RXxa/K/5A/BfxZ+Ib4m+OmRNF1soIQ1q/YWbAzVcLiFtOuWI5eTnv4FyV3DxJqZKXOWFa3s5bGEFWMUc20c2X9ZKrlWUTbyV6LBtOxUGt1JBTcXT99LyCH6tgl1C8KEqwSw5asbKLNjevaFhQkSm7YKFylxASewEfKgXMy/di6FQyXL1qlDXbMg3sF0vRl5QLMegjTQLqx3KmQ9UxB1jVKSmGk3eq1JXhomnIkG10jKqrIfoiwlpOCdFCK2Pftk+WVbbcMkp9ntB5GDBULtE7hp6XC3rJUDBuwVG5aE7cXnRjFWMEUE5LZsEgKi3ZREhHGs0SNW9X7Uq5alVLrkH5jqFjP04JWVLSyRktKHIGTDuPOFNykX8WMciRdUPPQBnHWK6gfcgbZt406EWLqMY2rTxeUBuraN1cjerJ/SUHP/hWhuPb6AUgrfhmQUPGWMgWHZ1smhcdm9LxjbyuFEagjHNawA8qW5yR+ckTI/UM07XCFJyTCs5FwSqgNBAkULkvGiUDiUM+WsjGEWYoeSJbM5SyU5KpHLmEjEfIQvrdaj/RU6KYDxNZKJtYI8sQ48rIKRybbmJtoywTU5BrJYfkLg4a0q75M4pETVGwYSTQxDSqHBHcBiRIWAcFr4RGFKtg/TZwKya9oyOlJnK/UnasqoPGHye1j5YTccZ9y1LF/HLFRaS1nQpOZC9zkLc0hw6KAf6TZGEJKrlFKqDLSD6KHAqng+LUi/JWKVj9yCILBYtggAIZLMUm8evYFZIazPJ1QtaROD3PMYdksIRigy/aJHCK7GAH6ALYWsH32vHFQrWMnibKWIkaMZGmiuEaCvEHvQkFmYsqhTNXUWQXB4Kyg19kdd4tG26pH6lEpuIsK9R9CZ1HZK2M3DCr6OVaBXQjkeeuhvzU0e3QiMvI4LJZ11PMyhMzdXJWkHbkZoMtlV4oV/w0Wl+kEzlkIduIWVgT2ZL3mUMcQQZXSKer5Yazg3peRakpV8s+mperKK3ICx37RWL0AbLyyOAyCTTKBbLbMCmtyEXN1ey8WyqTfCOliDlkE7JQQBtftlF4UALyZbeky/i1FDOvFRQEAE2quPLR9Y9nAdBuiRACDphURLyLjHNAZ4lJTJZGICiKuoxFEmMKY0zEAh7CK2eciSL+i4EIV0QZy0HCqxRgIarDGZOxThTfAcVvXQSsj3EHF7E5GRuQReyJnrAivoMtcFBErgBSFA9TeyKWBhnVDOKbnF7GNxhAAK8S3olYxoNMweaZCXIMSVMjzAAJsxM8KWEJl8EfngJ91yz63Dp8B3gARyhyQA+PKGNBJBaIUinM6hwBFpQVGiUERBpNCLtEHkgsgG9hhqiExTDSEpTBfxGZg8qIpDJiIZd8XnLsB0cvE9VAHIEG2WEIRSR8H/sNIBHAJUkiKrmMw6B/5tdFBkCQOIdPIiYiRKXEYzTuAF38VmUZu6+PA6LIIyZBRMFu/AmQaIoi/vhBlJBeSiKN1KI/aKrD5IAkgYRMJScZ/AFSfSB6kSQu4kUhuaA3/I5EZCBrRQokzOQoHsQXjjVFmlSsSvIQkHFeozjrWBLh2LISDNBs4jQjV6hVpBV7CisBBqHcKzcsuakPu0FaRBaiEfE6w5DauayZelaQDF9UOPUSxMRtIOGkIemi4g8QX7EZcRzlDakDhd7mEZGGrYCBaVEiftLoONW7B/irzO8IaGoMWjODbXJIlohL2EcQYr6Y0Ft+o/gXVyAVJ2GWaPLAb04UZZnzMERDIVBCPCgGiBd1mUcisCuRdIDaQOqlIASiKIiBUEJmgWBD/Jgky8TZEBLkbeDUr0qcBxYQUUQKRHiUuIfMZVlRwqkHi/vjSSBZn8VGnm2E9GWag4AYpon21QfqMo58Ih1kkvfPp56VCqLsIxVIqeITh+rCJVQi7g8Uo3N8G6cJx6iIESkSQ+6HxaBIvA/6QkdDi5DIY7uAQCKGSOTxJZwcH0a4zCPYnVKX0STy35ctHH7IFySSeRw0Igiw+kcWA3VtQZEh+eMhRuqEcBQNiNxXDRwYaS3xViJ9njrjNKwtkxb68kmi66sEdUFdohCHFCQvRAoS9qVfIuoh7DftDyTuq7ooh+pSzUizRJSJIAFPlPuIhQ8k1yQ4vuCjNJEukJBFSQIJZmgCcYzIklBdLRkyF2VURncMAigGARoaI+FnMRVll/olWSVFp26wH4mgkxSSKzJhGUlYCCbEEOryjwMOBugtTliE/ElKoUiMY/MI1ViBwBfxIkA8wykWiSsyCg5xihNrRKorBovBGIlBMiHmxEAUZy4oSZwrnKlIDdITDUk+OEkEQkBQz6JJrigipRQsBjQTDFkJhOTBEGcxbgbmLLrh0IIRFlbjNDilLi4oN2Eg1kscq2f8eeYEuDIJiE8oiqOySfJHzH0Moj8+mYbpaw+yWQLCXgmBhFQWAgkm+zCJlwgKuYb8ieIQlSApSpTkeidKdJi4ihTgJ9Yky9iRrxaKGPMVNRAMYRMBtD/hcFBENuJ0JoMxWQzLMd/oEOqh6KuiKHGSvTBiN00k0QkcJUvyzYwvc0lOQs1JTMIBHiO8xlHGsdwlHKC6ZDSkiK8W/sRzXyqwRgsNeAc+1deP9PG7+SL2j7SSB2rBKWC0UwgC+/qTe5/ZB1+Cu8D0Pvf++3AJ3OVtpBhpyvgTfAe7AWOkqCAU/TVJXuZFXjbLfMeRg3ez0J5Dm73Vm17uv+I97xAMwH3eapgF3vNrBX8PNjZ+IT8RYyUZ308IKYyemv0dGillumAXua3YKdN2dVuyTcUx+YmXLPFu6l58Se2NJbAN7/d/7eU330/DEF2ZccmSLtiGhb9Y0u3dtOSS+2HLnOQJS0/809zU8UsX+3FwbPxi7O85QRPSghAEvb8bHBymLftbuhRhd1CsjzE/S8Lw12D37qHO7q1f+tIvvuTdtaBSWeDAGu9bX7t891Dsrjfuuusz3eEK5dJYJD/GPpc97+8mN9VXFyaiOqG9mrDa5QQ0QtUq7cPWw9csVM1Gl8bRFdM8iAcOeEcOwMiZt37hR7fe2pGbmxEDQ+dAl/V4osnMNzV9skztmftB3r/f+yvsvBVr/ujWf8gVO+EzQzJvH32sCWvmm+rrdtPGPX4ZKyOvVaGF1sqLUKT9+2IfFKvlXMmUFMjlbUDOk12gLX5+qfchqNxbNdbhfRAS2dtiyPugAybVMmjAtS1nQSpw5D1QvQ95O8jvBRSvL3BoIPM+Y+9nvJ8imC1b5n3MWPI976+BAPxYIToUjKt/wi9gX8a5LgqThMlCv+AI0+qrWf6hg1xh4ngBLX1gyN2Googf2ljLcb3gSPg1/W8O0zmHr1AjEfXs2q/mpcsRdWVEZZfU7uyfZyjzWP5Pv4Y3D+CfV4A3vQL7ckStbVMjTgu8pUbWqJHaZrZxQcmbDc97FcVgxV//Olssbi8W9xaL5xUbezZTxsf5dnYlrQwj3zK+ZqgFf8fUPwJBoZa/F4juslRWC3z76Pl9tX+rzKn+sH3undFkMropqqpR74tz54LnAYzT9+rFnckWVW1JRjzAGWkRgK9mBzEVFCKoCaaQre/KOrxo2pKS8hf7JTPnmq4p12VVYz+8ubb1SXZmquw99NAWlxVrv4QDA96JZ87aaXk9mUxPBv7DUwG+/8H3rr56hvc+DHtr4PLbXzi368l5PEMVfJ3Ija/j3Si3WVppqa9A+ds0GPtg7KTU92cwpMCYYxhYfW78uWIPD81913vh3dEhzVFVri3f94t9sFzjSdX5CS2iWCxYvWPpvb/97b1L91axPOWox1+w9c47t55/fLKipbh3g9UCd7RYVou3uaW+NjdJEPhWdh6iAcmnQ7scOYqOlIIKkpNXYjwOlWFxBBz2pU21IsxDfF1Wncve8F45tdy/uLddljtHjj9uRNM2Lxv1/srCCKP2dO8VmPqv12G0X8yHI9WVg71NCcZ2Ed4lx6/lsxAP5tPJGYzEZIqlTb2+LtwNVmNNzA87K9hrlXIoTSEV7SZVHT+8MujIBMZNmGUafCCETlV0P/ohi9F3T0FCe4HH2FPJpB4KiGNouA6E5HAgqETiv5MlZbYoRTUtypVZiiT/LhiOwdXhaDQuhi6GiCh+EI7EQwmI3cX5nTFgajiuxP4oIpZfoijReCwU5BJ6ax/GlCQ6PKL6oUSBjI/lveM7fTzSaHclDrZrcztlk+hkoWhKJu8fuW/lSOzh34xc9ETKqqaegF+OeDd+7cCM0+6fcdvD3o0j8MvHNcdKPX7RyFtfw/baxt/h67C9TmwvA1lAzaPjTsPM9Tli1VfUMxiy0pp6hrH/7nU4P3IQwlp3W+TkU/tzNpphnt19WRZ9vpCVL61YeqfWH4udcgoLGEYmKk2xgvnT02PKlELknHMihb7AWHqtFbD6J/a0uvgu5tB4wFVtR5845lQh9DJ0duv777ekPJZqaUmBl2qBe87xRs6BM/3nJ+kq+HsGA+PP8dsRf9qEDtqBJSn7VEumkjt6FioIJvQrrmkr7J9XjpU9rTw2VoY/qsoKbympNvwxmkSMXH+V9+WXRnas6K4+tcr7k1/ng/IYOzUZ9VJYDVS/xshLW1Zc6dsKlG5+OsugtqfQVnQIU3xU6UUQQUnndHXcsmrZetkpmP4GdMHfF8sdk+anz4pWZzmxN27KVaNnnbM/9617NxyX6e7OZLu64AO8ZPGBZbwVbYVCGzzk7Su0fWOn9+7kzQNXve6XZRp18E78lcZ38VH2AqIcgpFNAmO2csXm8PCeXYuN3vvWPnL3lTuG3Ovg996ZLy7S7DtuhXdq98Pd3o2Jf/QW1/W3MP5Zvh5xLOjvLqm5CShBsnMqfAHOe937wes/O7zv596NbI13877XX9+39/XVP98H2+tznMS5OYV9xd9zVHP0DjwP+7wzvaXsK957BxDDtvs2ZNr4Wt6GfkMrzmBZGBFmCxuELcecY6EN7E/f9YKulf1zGbQN5K8XYZp2vI/Jxz7VIvHXdmk9yaE9rKq/PmU3jk/ohqvYODUFdmhZLb2ic2xSZdJYJ34nnVtIqWqq8AP8Yur79SfWUdsL1VG3o6gUrKZ0rnukq61dyZcmV2bOP7uinJYdYbNrbeyd3gKtr/bmaS0Hr3Z+Z3tc3anG2/0vpevPtQhjNe/Q5FKsEjNUlPmKlEvHK/GOdMkAbZFW6fFeJz4qyMeFdT5KaESIj1/xNsFeeHQu6AfA8G6qz9f08XXsA5yvdkJeoIWrGM9bbpV2w2x1mOGQaW2RdsOKaPX8PRH2gdHclAq0jE0fzkrxkaGLiy3G2N6NGPSEM+vytZeXNifVZja995SltzMxIibVKYz1xsJws5xs5yY3TTOKERgsP/JD3q82Nzd0+xD7H7iR9qtdJ6cPshcOvfIK2t7B8dv5Z9h3fP9Q8/e8bEXNKSYCQM61XQdBLaeiy6KYRdWE0t41oK/ZC59b472/Zu+yZfiorfYKeMdnuGTfWir1Llnj/XHNHcvuqGd7P6ZqoK/1+RFH/7AVdWCFsF4Q/GMetBYpHz1UY+cnXMU2NJWmQZuJE+4jol+56vrbNr6wyIpmYE653oytFLJAO0uoEIK/XIlOH/u3rrY2HUPfruJJC+alYosXndhpY5ijZzJdbcFStG9du8ivrcRSalOTaoRfYNDeOTipa7Azy+H5sEG5eti5Rs6dMKnUC97DWcPMtvfc0taVgQ7T1XsmG05rO2Sok0AgHcyyO9avjqhm3kyONYWcfNfgYFfOCSmzzSTmqZF/vlNszrQzUYcjdPo16/s/5fHr+Ea0kRJqdRR9RwEkVSqqoOJ3MjqKqqTC92Gvt8k7Ay70fgAnQ4/3E+/f2G7v++y5bbUnt29nJ9RugWdO8ebBPScvWeJFYP9Sb8yf94LAEAfn0onauufRzRw6NtWwu8Yg07u58/d2wth4r7t2TvBQZlFEVvYEzMCegBxdlDmEAc6cdT2WNHuKnaF9sT0wnFpSnrP2vmjosRD+R+8DWD+nd5GZTPTNbppx/J4zQ/4+8vkoZ3R2OPXJzmoDZuuAAdUizRm5xq99/aOP/PMjvz9wxelL4OnB2vX7rzjzRG/BIHvu8GP1Qm/VFfsHvAWLN+INnjlJqOPrdczy+Yj4WgYEB+vFL3vsw3vYc94/eB1wBdIxFW32xT5++hFKqoQyVqDtGLUkGklMso5CshFETL39yG1wD9u2/d6Hofybq+AeeMp77emZK2fiP3zl1iO337ttOzx/1a+91x5+BpxveCN+Ud0GtiEJ6+A2HOs04TS0gXphiPyaumdTMhsWHI25WaRjehXU/wk7f8y+uXzUDzi2fKI4w/i6O8RyKCJB9IyoGI9pHQUxpUPt5DuYnpJyHVosLkK4UkY8iAcd2N/cxphX4m0tcm+pNanLoN6QRHcile7v7yj0QXcmkQ23FcWenkmZkB0X4ykW0DBo6SvgPcA0zLFDGSoXi5lQR6Q9Gm4NBPr6eDgd4S26pDvRbocPDXFnUryqSVq6HoPmcO43o18zTZglLBSuF24XvkJY6B+Ko10t3wmmg68wgjyqA8HECVqM4ibcnjgQGJRL/racgq9zW0al93dezMbOMh1CIASwG3hCBxJ8XJHpXJ7iH9RTKN04nUAHSsqlomaS8Lu2DHnFP/3iWvzE5uZQRhYVdzsT4/Gxsflj8bjIzh1QuNIWamkJtfGAPHBuvWzhKJVtmyYHeFvGNB7UtOmdXau7O4fmzrEjUpMWlgOBRCIQUEKpZiUUCIWVnG3llHAoEJGaU1SqJoJBMZJIS5FjSr28+VVNf9CES+ZglNzbhw3Cw3P2zkkDO2dASaTl5mY5nSAKIT1622iawXlVP7tFwuyp24B5/zIye9aMSV2ru7zDX9W0r5pvK0G1RY6oqXbsIpmMyM1J9IHFREIUlWCyWY4kkx2FDrStYcUwQopfctuMWZMm90zumTQbBk2/FaFxNuQ89H+fQ10y/XM8n5wNMWOINP4pTZqPlNsHtAPjH5KvnxJpHBKhXXCaEYRq+J5/aOzjj9/JdrSa0GZH462cJaXYJJH3yrISb141mWPzGu+WQ0HVXINQ0DhFdgV0NTVnJ6XNmOpN4qIlxtIgKdGDze3JSGRaF58sZgNy/OlMpjkcGiAbZIw/zJex64RNwo9IM03d1yZ/h55b9Tik6jrDMMJQ6xy3cRlBTdQMzdD9XViFto3QdOuYoCFkuX+Wu1oXwb76QG0jywxTKxqkr7QJibFPnNU3nfx7H/Syik09VNBZqhJ/6GBEoxHeCI389uucMq0+ZtmVgmM7PhL4xwcYnw0pKZKbUb6ldFxfrhhmnIv1XaD6ihYtLkJanCayZtpnoFVUAFERQ9M6p+vZdm1GROZciq4HHumz29ndybD3uh3kIu2U1DeT6kvqjMnYCr0/0Q41xKkhe0gf1j9pRwxN6cxSO3AMYb/Hhgo9yebe/Ei5vGhKrljVwmoyEk8ByNQUrS/XLzJLS1P9Rd3m+pogLalRSTAaVwMR6gz7UsORUDgVWS+H9dScKZEM9qfDj+1KPBFuikSMeqv++jStf3P5/2kToF4cDv/dVk11ZrnRKv5Zkz6hnGxNFuPadWz9UVsWhyD0inULavQPi2zPigsrLS3eK94rYqwjbVyw4tSNKTHe1zeLrd+4tX9Ta9r7DkwVY729s7NbN56lS+rkXAMvp6Jy7fDPFir+ufaC0Ie9kLOOnhvQ9xjrmfr/pMFkq2r3N74yHdVutelA96fu7ODV3m+vvtp79+qr2cGJXO93E3W8dyfyGrHDIs4xJkjTuTY1Bg2XDN0T/8Rrfexqucg5nHbFypUzO/LePbByxkxMFvIMnmbPnlTzKmMLNi2IQuVkT63MX+BUFkQZbKJxBzFuPI9fieOOC3QupVXI4shtoZdOL078EGYiiJSQG1JBL9sUvqF9LKILbuMzJ9hxChLFGzmdfTywZMlA7Yd0ZSfXxhnU/rCW/i7AFD2NG/igx4bWspNjOuYc/KR2/8CSfzn/S9uvwc92ffvnz/c+H9PPP1+PLTm/HkcNjL/NL2Xbkc6/pW0Q3PpPV/iGcCwWPvIfdLXaws1fbg6nWS4eqv2Zclg0FB80jEGc5eD4BfxEtI8Bf2VKwIB4GijuNLzbGB0rNsvs8ypvz98CO5u9q5h258Z9rIg5C95pgp0tmLNh3+n7CNcy499FmbwG410M6DHKqps8hKFc3q66OeIJuoAKkUoT5q+x9AIdAfXDe76u0hkvR/TJcyuTvZ90FTItoC3Y3DfjIYzKf9p/hp3npURnZawCXy2P3dM1K9xtB+Rwe3Nva7J584L3pdEp51bGSj1hzqye8KzuD8rz55eFxvrXPr4B7UTcX3MbAVUr5HTbbQP6KVQxDmqlnHNMBWcsL+vsp02n7fb4I4/Auwmj9jo+QO2RR7x0wgCj6TTvyO6zH330PNlI3Nt0GoiXnf0IPpiJej/a+PV8nr8ek6Zfp+kTDoZvk/yj+1Z9GbjEp5haKt1u/nLBysufeQbYM32nnXHLGWfcIprZtlTK/OUUynvm8lMXrqLcMxrnIM9p+K89n/Zfk42156JBaF3wj+4VJn4PRGEMfA+d2cfQvvWAuH+/d+QAk2PBJkkWJelF2heWFLlXCfm+rX9wupY/UK/YEYrZMuOX0xb7u4okhZQXBZSS6eM/5ZexCz/5XVUWtaSbMIKWMGmPINlYvxQbd+FvfmvFMdJMOQV9Op995HlWq83f1tHS0tEMb/m32nc7mps7Wpjm31a/+7Wt7MLamlFm1N6DW1v8TP/q/fSYB5jjPQdzvT9ecEF9Llyhg+9kO1CLi39HQypltHkodOjbHv3lIF8fisdDR/5E18fAFI0QjDSHm95YuGXLwgVbtrDJsZDXSaoDr4diMCUYNaaAt3DzF7ds+eJmXyfd8Uf4+exhQSfvkuJrf1nRrdp0xAots8jPT7z56PDAys19QS4vD8w9JZB449FHEbhvvO6NlKKsCUtRUZx1gn3BvGvf1FIPUmyWH78IYzM6+66jVl1Ivy9y3CxT+sDNNw7FOBULlLzix6h2xc1AY2GjWq6SzEmVaqWX2/T7L8P3MkgqLd90+z7oCAyLFBnUBYdOjtDhDzo7RHdF7mcxtv761aFNxdF1yebmZKq52fvhejk0r71pwYWgjiSKbfMjQ3G+4KIEfB54INqc4KGmXwQSTPquBOHkpLE0569iSg2GvuVvDQPniR5I2HKKpcbUoKzJOVHUeEa8cH53/PSQvP76udam0Opqc6reH6xaz0bjFy3AzkJjmY7U9CRcvKA18zEPptMd2UzQ+HlbErAzFl7bxsRXOQ/zb8myGA1GY0pbsCinIvp8nP5cQmsRsY9/KqF8tI9f6q91LhXW+JEp/cyH3CMccv0HBf4T/RCIuFLPQt74T4RYmK7n4Av4MAykanSStp6FL5jSUclaGIxGg5cGZWkskpiTSG5R0P+ERHBdMIH3uLJZi89JRMYkGetQRSMyFsac1Oa/qbclmZgTD49FDO8/R5YvHxlevhzOnChmkcCWFDYenSdJwc9SM58NStK8CLWzJRBhn7Qjq1tSn+6uQVc8tUWV/3v5pStWXLrc96/z4+vZN33cLNBel4T+pUkjs2nZHAzuDzPvP9V/hkpwj05iiY5m5+HJvP6EHY978YR3X5wF4ARzCqxOJDwlKVOGyhLd8RR/3vhNLBbtbInGrJyJ9RNeIgGr4/o670mTHfDuT8THZRlWq9oLRqwnqrKRaGc02tIZjdXtYHj8VvYh+5m/nphDWMkB+7Cxjgjd9QWxRqxwAT/L9x16KFZI0fk2a8L0+BHw0d8UFf1feflw4df42x8cPc3pxCmsHFi8SY95D8R0PcYmT1uyZJr3gF+wS2vkwsqYBk2J1NzFA3+hks2bKfcvMX3zkoE/k5nHi3f5n+OaFqdLfTxX4HgO0XgQTcs4nnBjPQ8m19dJPx37KL6ncvRXGU7B9Xd16XdGSrkPnLJ+9ITWogf3nLvw3Fvu22Pvsr9Y+ySC8Vb9/qFrrnno97bdddtt/weKnOiWAHjaY2BkYGAAYn/ZBMN4fpuvDNzML4AiDCd+sfDCaeb/PsxTmR4BuRwMTCBRABIICg8AAAB42mNgZGBgevefjYGBeQ8DEDBPZWBkQAUpAFpTA7MAAHjaLVBNK4RRGD3vPWma8MqEYsaYd0Z5CY2MfG7sWWI1MsXSwkqz8BWlfDWSz82ULGyQNCUs/BALOxtLK1k493Lr9Nzuc855nnu8L7jjTQq68xqjLCBnPhFyBU3cRsq8oZ57qDVl9LCIZkbRwTP1j4Rz4R6DLKkWETcfSPBU93nUmG95ZYU+4cLBd7pAHsvwvV2QDxiTzlcv9H4Q18wElxDjIdp5LO4akuYVA05XQCOvkOWs+Av/Xo8Y5p36l3rfRwsnEKh2ckoem+jlKlpZ0ewnjGjXgHlUcQMZ1Rinpc0jwoh2yIlj/96FOu3fr/9meILQdItfwpDz2ZHezlxULuto463eQ/m8yPtGmEGUB0hyS7w5NLgcnuVt8ykLFaQ1O2XekVY21TY/V63n+F/+vzVQRI0AAAAAAAAAAAAAAAAwAHgBGAFyAjQCSgKWAtADDgMoA3QD+AQkBFIEjATKBPwFNgViBXAFhgWUBagFvAXYBiQGggaSBrQG+gdyB54IFAhcCI4I5gkoCUQPog+6D9oQEhBAEJAQ1BEsEV4RnBHiEhoSiBKwEvATFBNWE6ATwhPiE/YUhhSaFN4U6hUiFawV2hYeFlAWYhaWFxwYCBhkGYYZtBoAGjAahhqsGtAbHBtQG34bxBwWHFAceh0mHbgeCh4eHnIehh60HrQetAAAeNpjYGRgYEhhecggxgACTEDMyAAScwDzGQAlIAGlAAB42uVSS0rEQBB9yURBkfEKfQFzAFeiLmUcNDC4nGR6YiCmJYkGQXDrCTyAO6/g2Wbhq/6MEfEEpujqV1XvVVc3AXCIT0SQb+wTTOkniJI97qeMHJbq3OOYFvCE+SuPE+YD3sEGmce7iKPA38cmCpwCaTzzeIWD+NljjWn86vGa+TePS+L3eVX0plMLna9N0+MDCudoqRmIFqhQo4NBg2PGg7WU3R1jGNVTnm9whxdahltWOiqcX3LdU2PQU1dYv7L9NHLOJPre8hqbD9rGMiXn+MJsuZ/hmqZwstUeES3ZWTP7QLXsl5jhAjecTPEdNR65Wl+TrqU9QdtsZWPFTmHy76lc3BELT6av8bS9kfBzLnen9J/fPvuzw+8XSPnXu46GDJmx5PQ1b9L+qIzwF/y2jGwAAHjabc1XN4IBAIDhp89eyd6VzLKJZGRkbyEzcY6/6Mafo9O155z3+hWo+v227D9flUICNWrVqdegUZNmLVq1CWsX0aFTl249evXpN2DQkGEjomLiRiWMGTdh0pRpSSkzZs2Zt2DRUuW9Im3Vmox1WRs2bdmWs2PXnn15Bw4dOXbi1JlzFy5duXbjVsGdew+KHj159uLVm5J3ZR8+/YSCIF/4A0JgFjIAAA==') format('woff'), url('data:font/truetype;base64,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AQIFAw4BAQQCCAEBBAIBAQMDAgYGAgECAgEBAQICAQ0DAQICBQEMBwIFAgICBgMCBQQCBAQMAQMBAQEBBAUBAwkBAwEBAgEDAgIBBAICBgECBgMCBQIGCAUFAQUIAQMFAQELAQEGAQIDAQEBBAEBAQMCBgIEAwQGAgQHAgMDAQIGAQIBAQICAQQBBQECGwQCAQUDAQIDAgcFCAMBBgMEAwQEBAMDAQIDAwUCAgEIBgIKAQ0EBAIGAwQMAwELAQcJCAIDAgYDAQcBBwYDBAYCAgUBAwEBCwcIAgEKIceMUo4vBwIDBQUBBAIKAgEBAQMBAQMCBQIDAgJFAhkBAgEBBwQHAgoBAQUCAwMDAQIJAQUClAEFBQsCCAEDBAcBBAUBAwMBAScCBgEDAwIEAQIBBQEHAgMCAgMMBAMBAQIHARYCAgMEBQQCAgEBBAEBAwYBAwOgAQPKAgMBAQMCAQUCAQEWAgcCBQFxBgoGBQEDAgICCQEJAQ4EAgEBAQQCAgECBAECAQEBAQ8HARMPAgECAQUEAQMFAQIBAQQBBAQGBgMDCwENCgoBBwoDCQQIBAQDAwQEAgECAQIDAgEDAwQCBAEEAQIEAQMDAwUJAQgNAQMICAoQBgIICQYBAgICAQUCBQYGAQUBAgoDAQH+YwMEAgEBEQQHAgMBAggEBQUGIwICAQENAQcBBwIBCAIfBAUGAgEBJgMEAgIBARABAQF9AgICuvb+pPb2AVwzAwMFAggECwIBBAIECQIBAgECBgECAgIEBwECAQMEAgX+wFprEwkCCQIBAwgEBAMHAgQBBAEHAQMDBQoEAQMEAQIBAQIIAgEEAgYCAgMFAQcEDAUMDgIKAQsECQQBAgkBCQICAQEBAQIDAgwDAQQDBAcBAQEKAQQKAQIBBwQCBgkBBQEFAQECAwYDDAMEAgcBAgIBAQESAgMEAwEBAQQJAQgKAQICAQQDBgIEBgYBBAYFAQIBAgECAQIGBAgBAwMCAgEDAQsDAgYCAwoCAgcEAQIGBQ0IBAMCAgIBAQIIBAICCQIEAgECBQQCAQM4QFsBAwEGAgcCBgIBAQICBAEBAQIBAQECAQICAQIDBAMCBAMKBwEKAQoDAQICCwICAQQCBQEBAQEBCwIHBAECAQEBAQIPCAQBAgMEBgoCAQUDAQICAgYGAgQFAgEJAwECAQ0DAQMCBgQBCQMC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') format('truetype'), url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/Pgo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiID4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8bWV0YWRhdGE+ClRoaXMgaXMgYSBjdXN0b20gU1ZHIHdlYmZvbnQgZ2VuZXJhdGVkIGJ5IEZvbnQgU3F1aXJyZWwuCkRlc2lnbmVyICAgIDogRHJldyBXaWxzb24KRm91bmRyeSAgICAgOiBEcmV3IFdpbHNvbgpGb3VuZHJ5IFVSTCA6IGh0dHBwaWN0b3NkcmV3d2lsc29uY29tCjwvbWV0YWRhdGE+CjxkZWZzPgo8Zm9udCBpZD0id2ViZm9udEl5Zlpic2VGIiBob3Jpei1hZHYteD0iOTIwIiA+Cjxmb250LWZhY2UgdW5pdHMtcGVyLWVtPSIxMDAwIiBhc2NlbnQ9Ijc1MCIgZGVzY2VudD0iLTI1MCIgLz4KPG1pc3NpbmctZ2x5cGggaG9yaXotYWR2LXg9IjUwMCIgLz4KPGdseXBoIHVuaWNvZGU9IiAiICBob3Jpei1hZHYteD0iNTAwIiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4MDk7IiBob3Jpei1hZHYteD0iNTAwIiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4YTA7IiBob3Jpei1hZHYteD0iNTAwIiAvPgo8Z2x5cGggdW5pY29kZT0iISIgaG9yaXotYWR2LXg9IjkzNiIgZD0iTTg2NSAxMDNxMzcgLTYyIDExIC0xMDYuNXQtOTggLTQ0LjVoLTYyMXEtNzIgMCAtOTcuNSA0NC41dDExLjUgMTA2LjVsMzEwIDUzNHEzNiA2MiA4Ny41IDYydDg3LjUgLTYyek00NzEgNDZxMjMgMCAzOC41IDE2dDE1LjUgMzh0LTE1LjUgMzcuNXQtMzguNSAxNS41cS0yMiAwIC0zNy41IC0xNS41dC0xNS41IC0zNy41dDE1LjUgLTM4dDM3LjUgLTE2ek01MDkgMTg3bDI2IDMwOGgtMTI3bDI2IC0zMDhoNzV6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4MjI7IiBob3Jpei1hZHYteD0iODY1IiBkPSJNNTIgMjg5cTEgNjUgNy41IDExNXQyNi41IDEwMS41dDUzLjUgODYuNXQ5MC41IDU4LjV0MTM1IDI4LjV2LTE1N3EtNjYgMCAtOTUgLTQ2LjV0LTI5IC0xNDcuNWwtNCAtMWg4NHExOCAwIDMxIC0xM3QxMyAtMzJ2LTI1OHEwIC0xOCAtMTMgLTMxdC0zMSAtMTNoLTIyNXEtMTggMCAtMzEgMTN0LTEzIDMxdjI1OHY3ek00OTMgMjg5cTAgNjUgNyAxMTV0MjcgMTAxLjV0NTMuNSA4Ni41dDkwLjUgNTguNXQxMzUgMjguNXYtMTU3IHEtNjcgMCAtOTYgLTQ2LjV0LTI5IC0xNDcuNWwtNCAtMWg4NHExOCAwIDMxIC0xM3QxMyAtMzJ2LTI1OHEwIC0xOCAtMTMgLTMxdC0zMSAtMTNoLTIyNHEtMTkgMCAtMzIgMTN0LTEzIDMxdjI1OHEwIDUgMSA3eiIgLz4KPGdseXBoIHVuaWNvZGU9IiMiIGhvcml6LWFkdi14PSI3NDgiIGQ9Ik03MDUgNDgycTkgLTE0IC04IC0xNGgtNDh2LTU2N3EwIC03IC01IC0xMnQtMTIgLTVoLTUxM3EtNyAwIC0xMiA1dC01IDEydjU2N2gtNTJxLTcgMCAtOS41IDR0MS41IDEwbDMxIDQ2cTkgMTQgMjcgMTRoNzV2NjZxMCAyMCAxMiAzMGw0OCA0OXExMiAxMiAzMCAxMmgyMTZxMTggMCAzMCAtMTJsNTIgLTUycTEzIC0xMyAxMyAtMzB2LTYzaDcxcTE4IDAgMjcgLTE0ek0yNDggNTQ2di00aDI1NHY0djI4cTAgMjAgLTEyIDMwbC05IDEwIHEtMTIgMTIgLTMwIDEyaC0xNTVxLTE4IDAgLTMwIC0xMmwtNiAtNnEtMTIgLTEyIC0xMiAtMzB2LTMyek01NzYgNDUwcTAgMTYgLTE2IDE4aC0yNzloLTg5cS03IDAgLTEyIC01LjV0LTUgLTEyLjV2LTQ3NnEwIC03IDUgLTEydDEyIC01aDM2N3E3IDAgMTIgNXQ1IDEydjQ3NnpNMjYzIDQxOHE3IDAgMTIuNSAtNXQ1LjUgLTEydi0zNzlxMCAtNyAtNS41IC0xMnQtMTIuNSAtNWgtMjFxLTcgMCAtMTIuNSA1dC01LjUgMTJ2Mzc5cTAgNyA1LjUgMTIgdDEyLjUgNWgyMXpNMzY0IDVxLTcgMCAtMTIuNSA1dC01LjUgMTJ2Mzc5cTAgNyA1LjUgMTJ0MTIuNSA1aDIxcTcgMCAxMiAtNXQ1IC0xMnYtMzc5cTAgLTcgLTUgLTEydC0xMiAtNWgtMjF6TTQ4NSA1cS03IDAgLTEyIDV0LTUgMTJ2Mzc5cTAgNyA1IDEydDEyIDVoMjJxNyAwIDEyIC01dDUgLTEydi0zNzlxMCAtNyAtNSAtMTJ0LTEyIC01aC0yMnoiIC8+CjxnbHlwaCB1bmljb2RlPSIkIiBob3Jpei1hZHYteD0iODkzIiBkPSJNNTAzIDI4M2gtMTA4bC0xNiA2OGgxMjR2LTY4ek02ODQgMzUxbC0xOCAtNjhoLTEwNGwxIDY4aDEyMXpNNDAwIDExOHEyOCAwIDQ4LjUgLTIwdDIwLjUgLTQ5dC0yMC41IC00OXQtNDguNSAtMjB0LTQ4LjUgMjB0LTIwLjUgNDl0MjAuNSA0OXQ0OC41IDIwek02NTkgMTE4cTI5IDAgNDkgLTIwdDIwIC00OXQtMjAgLTQ5dC00OSAtMjB0LTQ5IDIwdC0yMCA0OXQyMCA0OXQ0OSAyMHpNODMzIDUxNnEyNSAtNyAyNSAtMzNxMCAtMyAtMiAtOSBsLTg4IC0yOTNxLTcgLTI1IC0zMiAtMjVoLTQxN3EtMTIgMCAtMjEuNSA3LjV0LTExLjUgMTguNWwtODEgMzI3aC0xNDlxLTE0IDAgLTI0IDEwdC0xMCAyNHQxMCAyNHQyNCAxMGgxNzZxMjYgMCAzMyAtMjZsMTggLTczaDUwM2w1IDE1cTYgMjQgMzIgMjRxNyAwIDEwIC0xek03MTIgMjMxbDU0IDE3OWgtNDY2bDQ1IC0xODZoMzY1eiIgLz4KPGdseXBoIHVuaWNvZGU9IiUiIGhvcml6LWFkdi14PSI5MDMiIGQ9Ik04NjcgMjc3cTAgLTc5IC0zNy41IC0xNDl0LTEwMi41IC0xMTdsMTEgLTk2di00cTAgLTE3IC0xMSAtMzBxLTEzIC0xNSAtMzQgLTE1aC0xNDhxLTIxIDAgLTM0IDE1cS0xMSAxMyAtMTEgMzB2NWwyIDE4cS02IC0xIC0xOCAtMWgtMTBsMiAtMTd2LTVxMCAtMTcgLTExIC0zMHEtMTIgLTE1IC0zNCAtMTVoLTE0OHEtMjEgMCAtMzQgMTVxLTExIDEzIC0xMSAzMHY1bDExIDkwcS04NiA2MCAtMTI0IDE1M2wtNDQgLTRoLTRxLTE4IDAgLTMwIDEyIHEtMTUgMTIgLTE1IDMzdjE1MnEwIDIxIDE1IDMzcTEyIDEyIDMwIDEyaDRsNDMgLTRxMzQgODUgMTA3IDE0MWwtMiAxMTB2MXYxcTAgMjggMjUgNDNxMTEgNyAyNiA3cTE0IDAgMjUgLTdsMTI4IC03MnEyNSAzIDUxIDNxMTYwIDAgMjcwIC05OXExMTMgLTEwMCAxMTMgLTI0NHpNNjgxIDQ3cTYxIDQxIDk1LjUgMTAxdDM0LjUgMTI5cTAgMTE4IC05NCAyMDJxLTk2IDg1IC0yMzMgODVxLTI5IDAgLTUzIC00bC05IC0xbC0xMzYgNzdsMiAtMTMwIGwtMTIgLThxLTc5IC01NyAtMTA2IC0xNDRsLTcgLTIybC03NSA3di0xMjdsNzUgOGw3IC0yMnEzMyAtOTYgMTI0IC0xNTVsMTUgLTlsLTEzIC0xMTJoMTIzbC05IDc0bDM1IC00cTEzIC0yIDM5IC0ycTI0IDAgNDcgM2wzNiA0bC05IC03NWgxMjNsLTE1IDExNnpNNTAxIDUyMWw3IC0xcTcgMCAxOCAtMnQyNiAtNXQzMiAtOXQzNSAtMTR0MzcgLTIwLjV0MzYgLTI4LjVxOCAtNyA4IC0xOXQtOCAtMjBxLTggLTkgLTIwIC05cS0xMSAwIC0xOSA4IHEtMjQgMjMgLTU5IDM4LjV0LTU1LjUgMTkuNXQtMzUuNSA1aC00cS0xMSAxIC0xOSA5LjV0LTggMTkuNXExIDEyIDkuNSAyMHQxOS41IDh6TTIzMSAzODRxMTkgMjAgNDEgMjZ0MzQgLTVxMTEgLTExIDYuNSAtMzN0LTIzLjUgLTQydC00MC41IC0yNnQtMzMuNSA1dC03IDMzdDIzIDQyeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeDI2OyIgaG9yaXotYWR2LXg9IjczMiIgZD0iTTQ2NSA0MDVoMjUwdi0xOThoLTI1MHYtMjUwaC0xOTh2MjUwaC0yNTB2MTk4aDI1MHYyNTBoMTk4di0yNTB6IiAvPgo8Z2x5cGggdW5pY29kZT0iJyIgaG9yaXotYWR2LXg9IjkwOCIgZD0iTTI2NSAxMzlxNzggNzggMTg4LjUgNzh0MTg4LjUgLTc4cTEgMCAxIC0xbC01NSAtNTVxLTEgMCAtMSAxcS01NSA1NSAtMTMzIDU1dC0xMzMgLTU1ek0xNDAgMjY0cTg1IDg1IDE5OS41IDExNS41dDIyOC41IDB0MTk5IC0xMTUuNWwxIC0xbC01NiAtNTZxMCAxIC0xIDFxLTEwNiAxMDYgLTI1Ny41IDEwNi41dC0yNTcuNSAtMTA1LjV6TTg5MyAzOTJxMCAtMiAyIC0ybC01NiAtNTZsLTIgMnEtMTA0IDEwNCAtMjQ0IDE0MXQtMjc5LjUgMCB0LTI0My41IC0xNDFxLTEgMCAtMSAtMWwtNTYgNTZsMSAxcTEyMCAxMTkgMjgwIDE2MS41dDMxOS41IDB0Mjc5LjUgLTE2MS41ek0zOTIgMTNxMjYgMjUgNjMgMjV0NjMgLTI1bC02MyAtNjN6IiAvPgo8Z2x5cGggdW5pY29kZT0iKCIgaG9yaXotYWR2LXg9IjY3MSIgZD0iTTU1MCAzNTloNzd2LTQzN2gtNTgydjQzN2g3NXYxMjhxMCA4NyA2MiAxNDl0MTQ5IDYyaDRoNHE4OCAwIDE0OS41IC02MnQ2MS41IC0xNDl2LTEyOHpNNDAyIDJsLTMyIDE0MXEzMiAyMCAzMiA1N3EwIDI4IC0xOSA0N3QtNDcgMTlxLTI3IDAgLTQ2LjUgLTE5dC0xOS41IC00N3EwIC0zOCAzMyAtNTZsLTMzIC0xNDJoMTMyek00NDUgMzU5djEyOHEwIDQzIC0zMSA3NHQtNzUgMzFoLTNoLTVxLTQzIDAgLTc0IC0zMXQtMzEgLTc0di0xMjggaDIxOXoiIC8+CjxnbHlwaCB1bmljb2RlPSIpIiBob3Jpei1hZHYteD0iODg5IiBkPSJNNjQ1IDY5OHE4OCAwIDE1MCAtNjEuNXQ2MiAtMTQ5LjV2LTEyOGgtMTA2djI5bDM2IDM0djEzaC0zNnY1MnEwIDQ0IC0zMSA3NC41dC03NSAzMC41aC0yaC01cS00NCAwIC03NSAtMzAuNXQtMzEgLTc0LjV2LTEyOGg3N3YtNDM4aC01ODR2NDM4aDQwMXYxMjhxMCA4OCA2MiAxNDkuNXQxNTAgNjEuNWgzaDR6TTM4MiAwbC0zMyAxNDJxMzMgMjAgMzMgNTdxMCAyOCAtMTkuNSA0Ny41dC00Ni41IDE5LjVxLTI4IDAgLTQ3LjUgLTE5LjUgdC0xOS41IC00Ny41cTAgLTM3IDMzIC01N2wtMzMgLTE0MmgxMzN6IiAvPgo8Z2x5cGggdW5pY29kZT0iKiIgaG9yaXotYWR2LXg9Ijc3NyIgZD0iTTczNyA0OTBsLTE5NSAtMTk1bDE5NSAtMTk2bC0xNTQgLTE1M2wtMTk1IDE5NWwtMTk1IC0xOTVsLTE1NCAxNTNsMTk1IDE5NmwtMTk1IDE5NWwxNTQgMTU0bDE5NSAtMTk1bDE5NSAxOTV6IiAvPgo8Z2x5cGggdW5pY29kZT0iKyIgZD0iTTQ2MCA3MDJxMTc0IDAgMjk3IC0xMjN0MTIzIC0yOTd0LTEyMyAtMjk3dC0yOTcgLTEyM3QtMjk3IDEyM3QtMTIzIDI5N3QxMjMgMjk3dDI5NyAxMjN6TTcwOSAyNjJ2NDFxMCAxNSAtMTAuNSAyNS41dC0yNS41IDEwLjVoLTEyMXEtMTUgMCAtMjUuNSAxMXQtMTAuNSAyNnYxMjFxMCAxNSAtMTEgMjUuNXQtMjYgMTAuNWgtNDFxLTE1IDAgLTI1LjUgLTEwLjV0LTEwLjUgLTI1LjV2LTEyMXEwIC0xNSAtMTEgLTI2dC0yNiAtMTFoLTEyMCBxLTE2IDAgLTI2LjUgLTEwLjV0LTEwLjUgLTI1LjV2LTQxcTAgLTE1IDEwLjUgLTI2dDI2LjUgLTExaDEyMHExNSAwIDI2IC0xMC41dDExIC0yNS41di0xMjFxMCAtMTUgMTAuNSAtMjUuNXQyNS41IC0xMC41aDQxcTE1IDAgMjYgMTAuNXQxMSAyNS41djEyMXEwIDE1IDEwLjUgMjUuNXQyNS41IDEwLjVoMTIxcTE1IDAgMjUuNSAxMXQxMC41IDI2eiIgLz4KPGdseXBoIHVuaWNvZGU9IiwiIGhvcml6LWFkdi14PSI5MTUiIGQ9Ik00NTggNzAxcTE3MyAwIDI5NSAtMTIyLjV0MTIyIC0yOTUuNXEwIC0xMDQgLTQ2IC0xOTFxLTU5IC0xMTUgLTE3MiAtMTc2cS05NCAtNTEgLTE5OSAtNTFxLTEwMSAwIC0xOTQgNDhxLTExNCA2MCAtMTc1IDE3M3EtNDkgOTMgLTQ5IDE5N3EwIDE3MyAxMjIuNSAyOTUuNXQyOTUuNSAxMjIuNXpNNzYwIDIwM3ExMSA0MSAxMSA4MHEwIDEzMCAtOTIgMjIydC0yMjEgOTJxLTEzMCAwIC0yMjIgLTkydC05MiAtMjIycTAgLTM5IDEyIC04NSBxMyAtOSA5IC0yNXEyMSA2IDQ1IDZxNjUgMCAxMTEuNSAtNDZ0NDYuNSAtMTExcTAgLTE3IC01IC0zN3E0IC0yIDEyIC00cTQyIC0xMSA4MyAtMTFxNDUgMCA4NyAxMnEyIDAgNS41IDJ0NS41IDJxLTUgMjIgLTUgNDBxMCA2NCA0Ni41IDExMC41dDExMC41IDQ2LjVxMjMgMCA0NCAtNnE1IDE1IDggMjZ6TTQ5OCAzMzNxMjUgLTE5IDI1IC01MHEwIC0xNCAtNSAtMjRxLTE2IC0zOSAtNTggLTM5cS0xMSAwIC0yNCA1cS0zOSAxNiAtMzkgNTggcTAgMSAwLjUgNHQwLjUgNWwtNTYgMjQ1bDIxIDl6TTQ3OCA1NjV2LTk1aC0zOXY5NWgzOXpNNjMyIDQ5MGwyNyAtMjdsLTY4IC02OGwtMjcgMjh6TTYyOSAzMDB2MzhoOTZ2LTM4aC05NnpNMTkyIDMwMHYzOGg5NXYtMzhoLTk1ek0yNDQgNDYzbDI4IDI3bDY3IC02N2wtMjcgLTI4eiIgLz4KPGdseXBoIHVuaWNvZGU9Ii0iIGhvcml6LWFkdi14PSI5MjEiIGQ9Ik00NjEgNjk4cTE3NCAwIDI5NyAtMTIzLjV0MTIzIC0yOTcuNXQtMTIzIC0yOTcuNXQtMjk3IC0xMjMuNXEtMTc1IDAgLTI5OCAxMjMuNXQtMTIzIDI5Ny41dDEyMyAyOTcuNXQyOTggMTIzLjV6TTY5NCAyNTh2MzlxMCAxOSAtMTQgMzN0LTMzIDE0aC0zNzZxLTE5IDAgLTMzIC0xNHQtMTQgLTMzdi0zOXEwIC0yMCAxNCAtMzMuNXQzMyAtMTMuNWgzNzZxMTkgMCAzMyAxMy41dDE0IDMzLjV6IiAvPgo8Z2x5cGggdW5pY29kZT0iLiIgaG9yaXotYWR2LXg9Ijk0NSIgZD0iTTE0NyAzOTJxMzcgMCA2NCAtMjd0MjcgLTY0cTAgLTM4IC0yNi41IC02NXQtNjQuNSAtMjd0LTY1IDI3dC0yNyA2NXQyNyA2NC41dDY1IDI2LjV6TTQ3MiAzOTJxMzggMCA2NSAtMjYuNXQyNyAtNjQuNXQtMjcgLTY1dC02NSAtMjd0LTY0LjUgMjd0LTI2LjUgNjVxMCAzNyAyNi41IDY0dDY0LjUgMjd6TTc5OCAzOTJxMzggMCA2NSAtMjYuNXQyNyAtNjQuNXQtMjcgLTY1dC02NSAtMjd0LTY1IDI3dC0yNyA2NXEwIDM3IDI3IDY0dDY1IDI3eiAiIC8+CjxnbHlwaCB1bmljb2RlPSIvIiBob3Jpei1hZHYteD0iOTEyIiBkPSJNNjkzIDUzN2gxODF2LTEyN3YtMzAxaC0xODF2LTUzbC0xMzYgLTEzNmgtMzM2djE4OWgtMTgxdjMwMXYxMjdoMTgxdjE2M2g0NzJ2LTE2M3pNODE2IDQ4MGgtMTA1di01M2gxMDV2NTN6TTI3NSA2NDZ2LTEwOWgzNjR2MTA5aC0zNjR6TTUwMiAtMjZ2MTM2aDEzN3YxMzF2NTVoNTR2LTEyOWg2N3YxOTdoLTYwNHYtMTk3aDY1djExMXYxOGg1NHYtNTV2LTI2N2gyMjd6IiAvPgo8Z2x5cGggdW5pY29kZT0iMCIgaG9yaXotYWR2LXg9Ijg4OSIgZD0iTTY0MyAxNjFsMzkgLTQwbDI4IC0yN3EtNDcgLTYwIC0xMTYuNSAtOTQuNXQtMTQ4LjUgLTM0LjVxLTE0MCAwIC0yMzguNSA5OHQtOTkuNSAyMzhoLTExaC0yaC02N2wxMjYgMTI2bDEyNyAtMTI2aC01MWgtMjhxMCAtMTAwIDcxLjUgLTE3MXQxNzIuNSAtNzFxNjAgMCAxMTIuNSAyNy41dDg1LjUgNzQuNXpNODEwIDMwMWg1MmwtMTI3IC0xMjZsLTEyNiAxMjZoNTBoMzB2MnEwIDEwMSAtNzEuNSAxNzIuNXQtMTcyLjUgNzEuNSBxLTYxIDAgLTExMy41IC0yOC41dC04Ni41IC03Ni41bC0zOSAzOWwtMjggMjhxNDcgNjEgMTE2LjUgOTZ0MTUwLjUgMzVxMTM5IDAgMjM4IC05OXQ5OSAtMjM4di0yaDI4eiIgLz4KPGdseXBoIHVuaWNvZGU9IjEiIGhvcml6LWFkdi14PSI3NDMiIGQ9Ik02ODggMjM1aDI5di0zMHEwIC0xNDMgLTEwMC41IC0yNDMuNXQtMjQzLjUgLTEwMC41dC0yNDQgMTAxdC0xMDEgMjQzcTAgMTQzIDEwMSAyNDR0MjQ0IDEwMXExNiAwIDI1IC0xdjc5djcxbDQ5IC01MGwxNTcgLTE1N2wyMSAtMjFsLTIxIC0yMGwtMTU3IC0xNTdsLTQ5IC01MHY3MHY4OHEtMTggMiAtMjUgMnEtODMgMCAtMTQxIC01OHQtNTggLTE0MXEwIC04MiA1OC41IC0xNDB0MTQwLjUgLTU4dDE0MCA1OHQ1OCAxNDB2MzBoMzBoODd6ICIgLz4KPGdseXBoIHVuaWNvZGU9IjIiIGhvcml6LWFkdi14PSI5MTkiIGQ9Ik00NTkgNzAxcTE3NCAwIDI5NyAtMTIzdDEyMyAtMjk3dC0xMjMgLTI5N3QtMjk3IC0xMjNxLTE3MyAwIC0yOTYgMTIzdC0xMjMgMjk3dDEyMyAyOTd0Mjk2IDEyM3pNNzI4IDM5MnE2IDYgNiAxNXQtNiAxNmwtNTUgNTRxLTYgNiAtMTUgNnQtMTYgLTZsLTI0MyAtMjQ0cS0xNSAtMTYgLTMxIDBsLTg4IDg4cS0xNiAxNiAtMzEgMGwtNTUgLTU0cS02IC03IC02IC0xNnQ2IC0xNWwxMzkgLTE0MHExNSAtMTUgMzcgLTE1aDI2cTIwIDAgMzcgMTV6ICIgLz4KPGdseXBoIHVuaWNvZGU9IjMiIGhvcml6LWFkdi14PSI4NjgiIGQ9Ik0yMiAyMzlxLTEwIDEwIC0xMCAyNHQxMCAyNGw4MyA4M3ExMCAxMCAyMy41IDEwdDIzLjUgLTEwbDEzNiAtMTM1cTEwIC0xMCAyMy41IC0xMHQyMy41IDEwbDM3MSAzNzJxMTAgMTAgMjMuNSAxMHQyMy41IC0xMGw4MyAtODJxMTAgLTEwIDEwIC0yMy41dC0xMCAtMjMuNWwtNDUwIC00NTFxLTI0IC0yNCAtNTcgLTI0aC0zOXEtMzIgMCAtNTYgMjR6IiAvPgo8Z2x5cGggdW5pY29kZT0iNCIgaG9yaXotYWR2LXg9Ijc2MiIgZD0iTTU5IDcwMGw3MDIgLTM1MWwtNzAyIC0zNTB2NzAxeiIgLz4KPGdseXBoIHVuaWNvZGU9IjUiIGhvcml6LWFkdi14PSI4MTYiIGQ9Ik01OSAxdjY5OGgyNjJ2LTY5OGgtMjYyek00OTUgNjk5aDI2MnYtNjk4aC0yNjJ2Njk4eiIgLz4KPGdseXBoIHVuaWNvZGU9IjYiIGhvcml6LWFkdi14PSI4MTciIGQ9Ik03NTggMmgtNjk5djY5OGg2OTl2LTY5OHoiIC8+CjxnbHlwaCB1bmljb2RlPSI3IiBob3Jpei1hZHYteD0iOTIyIiBkPSJNNDIzIDQxN3YxODJsNDg1IC0yNDNsLTQ4NSAtMjQydjE4MWwtMzY0IC0xODF2NDg1eiIgLz4KPGdseXBoIHVuaWNvZGU9IjgiIGhvcml6LWFkdi14PSI5MjIiIGQ9Ik01MDAgMjk1di0xODJsLTQ4NiAyNDNsNDg2IDI0MnYtMTgybDM2MyAxODJ2LTQ4NXoiIC8+CjxnbHlwaCB1bmljb2RlPSI5IiBkPSJNNDYwIDcwMHExNzQgMCAyOTcgLTEyM3QxMjMgLTI5N3QtMTIzIC0yOTd0LTI5NyAtMTIzdC0yOTcgMTIzdC0xMjMgMjk3dDEyMyAyOTd0Mjk3IDEyM3pNMjk4IDY0bDQzMSAyMTZsLTQzMSAyMTZ2LTQzMnoiIC8+CjxnbHlwaCB1bmljb2RlPSI6IiBob3Jpei1hZHYteD0iODAxIiBkPSJNNjcxIDEwMGwxMDUgLTEwMnEwIC0xNiAtMTIgLTI4LjV0LTI5IC0xMi41aC0yNDJxMSAtNCAxIC0xMnEwIC0zOSAtMjcuNSAtNjYuNXQtNjYuNSAtMjcuNXQtNjYuNSAyNy41dC0yNy41IDY2LjVxMCAyIDAuNSA2dDAuNSA2aC0yNDFxLTE2IDAgLTI4LjUgMTIuNXQtMTIuNSAyOC41bDEwNSAxMDJxLTEgOCAtMSAyNXYyMDhxMCA4OCA1MC41IDE1OHQxMzAuNSA5OHEtNCAxMSAtNCAyNnEwIDM5IDI3LjUgNjYuNXQ2Ni41IDI3LjUgdDY2LjUgLTI3LjV0MjcuNSAtNjYuNXEwIC0xNCAtMyAtMjZxODAgLTI4IDEzMC41IC05OC41dDUwLjUgLTE1Ny41di0yMDhxMCAtMTcgLTEgLTI1ek0zNDggNjE1cTAgLTUgMiAtMTVxMjggNSA1MCA1cTIzIDAgNTAgLTVxMyA4IDMgMTVxMCAyMiAtMTUuNSAzN3QtMzcuNSAxNXQtMzcgLTE1dC0xNSAtMzd6IiAvPgo8Z2x5cGggdW5pY29kZT0iOyIgaG9yaXotYWR2LXg9Ijg4NyIgZD0iTTI5OSA0MThsLTQyIC00NHEtNCAtNSAtMTEgLTEyLjVsLTEyLjUgLTEzLjVsLTEwLjUgLTExcS0xOCAxNiAtMjcgMjNxLTQ5IDQwIC04MSA0MGgtMTAxdjExMmgxMDFxNTkgLTEgMTE4IC00MXEzMyAtMjEgNjYgLTUzek0zOTkgMTU2bDQ0IDQ3bDMyIDM0cTE2IC0xNCAyNiAtMjJxNTIgLTQyIDg0IC00MGg4NnY5NGwxNzUgLTE0OGwtMTc1IC0xNDZ2ODhoLTg2cS01NiAwIC0xMjAgNDBxLTI3IDE3IC02NiA1M3pNNTgyIDQwMCBxLTIzIDAgLTU2IC0yMnEtMzUgLTIzIC03OCAtNjhxLTE5IC0xOSAtNTQuNSAtNTcuNWwtNjYuNSAtNjkuNXQtNjAgLTU1cS04MCAtNjQgLTE1NCAtNjVoLTk5djExMmg5OXEyNiAwIDU5IDIycTI5IDE4IDc5IDY4cTUgNSA3MyA3Ny41dDEwNyAxMDQuNXE4MSA2NCAxNTIgNjVoODh2OTJsMTc1IC0xNDdsLTE3NSAtMTQ3djkwaC04OGgtMXoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3gzYzsiIGhvcml6LWFkdi14PSIzOTUiIGQ9Ik0xMTUgNDEwbDIyMiAyMjN2LTY2OGwtMjIyIDIyMmgtMTEydjIyM2gxMTJ6IiAvPgo8Z2x5cGggdW5pY29kZT0iPSIgaG9yaXotYWR2LXg9Ijk0NyIgZD0iTTg5NiAzNzl2LTE3NmwtNjMgLTI1di0xMDhoLTc3M3Y0NDJoNzczdi0xMDl6TTc2MCAxNDR2Mjk0aC02MjZ2LTI5NGg2MjZ6TTM3MyAzOTBsMjIyIC0xOThoLTQxM3YxOThoMTkxeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeDNlOyIgaG9yaXotYWR2LXg9Ijg4OSIgZD0iTTEyNiA0MDhsMjIyIDIyM3YtNjY4bC0yMjIgMjIyaC0xMTJ2MjIzaDExMnpNNDM0IDQzOHE3NSAtNTAgNzUgLTE0MHQtNzUgLTEzOWwtMzQgNjdxMzUgMjggMzUgNzJ0LTM1IDcydjJ6TTY4MCAyOThxMCAtOTIgLTQ2IC0xNjguNXQtMTIzIC0xMjAuNWwtMzQgNjZxNTkgMzQgOTQgOTMuNXQzNSAxMjkuNXQtMzUgMTI5LjV0LTk0IDkzLjV2MmwzMyA2NXE3NyAtNDQgMTIzLjUgLTEyMS41dDQ2LjUgLTE2OC41ek01ODcgNzM4IHExMTggLTY2IDE4OC41IC0xODN0NzAuNSAtMjU3dC03MC41IC0yNTd0LTE4OC41IC0xODJsLTMzIDY2cTk5IDU2IDE1OC41IDE1NS41dDU5LjUgMjE3LjV0LTU5LjUgMjE3LjV0LTE1OS41IDE1NS41eiIgLz4KPGdseXBoIHVuaWNvZGU9Ij8iIGhvcml6LWFkdi14PSI5MjIiIGQ9Ik00NjEgNzAycTE3NSAwIDI5OCAtMTIzLjV0MTIzIC0yOTcuNXQtMTIzIC0yOTcuNXQtMjk4IC0xMjMuNXEtMTc0IDAgLTI5Ny41IDEyMy41dC0xMjMuNSAyOTcuNXQxMjMuNSAyOTcuNXQyOTcuNSAxMjMuNXpNNDg5IDI5cTE5IDE4IDE5IDQ3dC0xOSA0N3EtMjAgMTcgLTQ5IDE3cS0yOCAwIC00OCAtMTdxLTIwIC0yMCAtMTggLTQ3cS0yIC0yNyAxOCAtNDdxMTkgLTE3IDQ4IC0xN3EzMiAwIDQ5IDE3ek02MDIgMzUxcTEwIDI0IDEwIDYyIHEwIDU4IC00MSA5M3EtMzggMzQgLTEwOCAzNHEtNDkgMCAtODUgLTEycS0zMyAtMTEgLTYzIC0zMWwtOSAtNmw0NiAtODdsMTAgOHEyIDEgMTkgMTFxNyA0IDIzIDEwcTEwIDQgMjMgNnE3IDIgMjEgMnEzMCAwIDM4IC0xMHExMSAtMTEgMTEgLTMxcTAgLTEzIC03IC0yNXEtMTIgLTE2IC0yMSAtMjRxLTQgLTQgLTguNSAtOGwtMTAgLTl0LTkuNSAtOHEtMTcgLTE2IC0zMCAtMzRxLTEyIC0yMCAtMjAgLTQ2cS01IC0yMiAtNSAtNDEgcTAgLTQgMC41IC0xMnQwLjUgLTEybDEgLTExaDExaDg4djEycTAgMjYgOCA0MnE5IDE2IDIxIDMwcTE0IDE0IDI5IDI1dDMyIDMwcTE0IDE3IDI1IDQyeiIgLz4KPGdseXBoIHVuaWNvZGU9IkAiIGhvcml6LWFkdi14PSI1MDgiIGQ9Ik0yNTggNzAzcTkyIDAgMTU3LjUgLTY2dDY1LjUgLTE1N3EwIC0xMDcgLTIwMyAtNTQ2bC0yNCAtNTBsLTYzIDEzNXQtMTAxIDI0NC41dC02MyAyMTYuNXEwIDkyIDY1LjUgMTU3LjV0MTU3LjUgNjUuNWg0aDR6TTI1NCAzOTdxNDIgMCA3MiAzMHQzMCA3M3EwIDQyIC0zMCA3MnQtNzIgMzBxLTQzIDAgLTczIC0zMHQtMzAgLTcycTAgLTQzIDMwIC03M3Q3MyAtMzB6IiAvPgo8Z2x5cGggdW5pY29kZT0iQSIgaG9yaXotYWR2LXg9Ijg5MyIgZD0iTTMxNSAyOTlsNzAgLTcwcS0zOCAtMzIgLTg4LjUgLTMwdC04Ni41IDM4bC0xNDQgMTQ0cS0zOCAzNyAtMzggOTF0MzggOTFsOTkgOTlxMzggMzggOTEuNSAzOHQ5MS41IC0zOGwxNDQgLTE0NHEzNiAtMzYgMzcuNSAtODYuNXQtMzAuNSAtODguNWwtNzAgNjlxMTAgMjAgLTYgMzhsLTE0NCAxNDRxLTkgOSAtMjIuNSA5dC0yMi41IC05bC05OSAtOTlxLTEwIC0xMCAtMTAgLTIzdDEwIC0yM2wxNDQgLTE0NHExNiAtMTYgMzYgLTZ6TTcyOCAtOTkgcS0zOCAtMzcgLTkxIC0zN3QtOTEgMzdsLTE0NSAxNDVxLTM1IDM1IC0zNyA4NS41dDMwIDg4LjVsNjkgLTcwcS05IC0yMCA3IC0zNmwxNDQgLTE0NHE5IC0xMCAyMi41IC0xMHQyMi41IDEwbDk5IDk5cTEwIDkgMTAgMjIuNXQtMTAgMjIuNWwtMTQ0IDE0NXEtMTYgMTYgLTM3IDVsLTY5IDcwcTM4IDMyIDg4LjUgMzAuNXQ4Ni41IC0zNy41bDE0NCAtMTQ0cTM3IC0zOCAzNyAtOTEuNXQtMzcgLTkxLjV6TTI2MyA0NjVxMTQgMTQgMzQgMTQgdDM0IC0xNGwyOTUgLTI5NXExNCAtMTQgMTQgLTM0dC0xNCAtMzR0LTM0IC0xNHQtMzQgMTRsLTI5NSAyOTRxLTE0IDE0IC0xNCAzNC41dDE0IDM0LjV6IiAvPgo8Z2x5cGggdW5pY29kZT0iQiIgaG9yaXotYWR2LXg9Ijg4MSIgZD0iTTczNCAzMTFxLTE0IC0yNyAtNDIgLTUwcS0xMiAtMzAgLTMxLjUgLTU4dC01NC41IC02MHQtOTIuNSAtNTEuNXQtMTI5LjUgLTE5LjVxLTc3IDAgLTE0My41IDIxdC0xMDUuNSA1MXQtNjcgNjB0LTM5IDUxbC0xMSAyMXE1IC0zIDE0LjUgLTYuNXQzOC41IC0xMS41dDU4IC0xMnQ3MCAtMC41dDc4IDE3LjVxLTY0IDI3IC05NiA5MXEtMjEgNDMgLTggNTRxNyA3IDI1IC0xMHE1MyAtNTAgMjEyIC00MXE3IDggMjEgMjZ2NXEwIDY3IDQ3IDExNCB0MTE0IDQ3cTY0IDAgMTEwIC00My41dDUxIC0xMDYuNWwxMDIgLTQ5ek02MjYgNDY5cS0xOSAwIC0zMiAtMTMuNXQtMTMgLTMyLjV0MTMgLTMydDMyIC0xM3QzMi41IDEzdDEzLjUgMzJ0LTEzIDMyLjV0LTMzIDEzLjV6IiAvPgo8Z2x5cGggdW5pY29kZT0iQyIgaG9yaXotYWR2LXg9IjkxMyIgZD0iTTc3MSAzMTdxNDYgLTE4IDc0IC01OS41dDI4IC05Mi41cTAgLTY4IC00OC41IC0xMTYuNXQtMTE2LjUgLTQ4LjVxLTIgMCAtNSAwLjV0LTQgMC41aC00OTRoLTFoLTJxLTY5IDEgLTExNy41IDUwdC00OC41IDExOXEwIDQ1IDIyLjUgODMuNXQ2MC41IDYwLjVxLTYgMTYgLTYgMzVxMCA0NyAzNCA4MXQ4MSAzNHEzOCAwIDcxIC0yNXEzMSA2NCA5MSAxMDN0MTMzIDM5cTEwMyAwIDE3NiAtNzIuNXQ3MyAtMTc2LjVxMCAtMTAgLTEgLTE1eiIgLz4KPGdseXBoIHVuaWNvZGU9IkQiIGhvcml6LWFkdi14PSI5MTciIGQ9Ik00NTkgNjk4cTE3MyAwIDI5NS41IC0xMjN0MTIyLjUgLTI5NnQtMTIyLjUgLTI5NS41dC0yOTUuNSAtMTIyLjV0LTI5NiAxMjIuNXQtMTIzIDI5NS41dDEyMyAyOTZ0Mjk2IDEyM3pNNTc0IDI1MnEtMTEgMTIgLTExIDI4dDExIDI4bDEwOSAxMDhxMTEgMTIgMTEgMjguNXQtMTEgMjcuNWwtMzEgMzFxLTEyIDExIC0yOC41IDExdC0yNy41IC0xMWwtMTA4IC0xMDlxLTEyIC0xMSAtMjguNSAtMTF0LTI3LjUgMTFsLTEwOSAxMDkgcS0xMSAxMSAtMjcuNSAxMXQtMjcuNSAtMTFsLTMxIC0zMXEtMTEgLTExIC0xMSAtMjcuNXQxMSAtMjguNWwxMDkgLTEwOHExMSAtMTIgMTEgLTI4dC0xMSAtMjhsLTEwOSAtMTA4cS0xMSAtMTIgLTExIC0yOC41dDExIC0yNy41bDMxIC0zMXExMSAtMTEgMjcuNSAtMTF0MjcuNSAxMWwxMDkgMTA5cTExIDExIDI3LjUgMTF0MjguNSAtMTFsMTA4IC0xMDlxMTEgLTExIDI3LjUgLTExdDI4LjUgMTFsMzEgMzFxMTEgMTEgMTEgMjcuNXQtMTEgMjguNXogIiAvPgo8Z2x5cGggdW5pY29kZT0iRSIgaG9yaXotYWR2LXg9Ijg5NSIgZD0iTTQ0OCA1MzFxNjMgMCAxMjkuNSAtMjMuNXQxMTUuNSAtNTd0ODkuNSAtNjd0NjEuNSAtNTcuNWwyMSAtMjN2LThsLTIyIC0yNC41dC01OS41IC01NC41dC05MiAtNjl0LTExNCAtNTQuNXQtMTMwLjUgLTI0LjV0LTEyOS41IDIzLjV0LTExNS41IDU3dC04OS41IDY3dC02MS41IDU2LjVsLTIxIDI0djlsMjIgMjQuNXQ1OS41IDU0LjV0OTIgNjguNXQxMTQgNTR0MTMwLjUgMjQuNXpNNDQ2IDE1OHE1OCAwIDk4LjUgNDAuNXQ0MC41IDk4LjUgcTAgNTcgLTQwLjUgOTcuNXQtOTguNSA0MC41cS01NyAwIC05Ny41IC00MC41dC00MC41IC05Ny41cTAgLTU4IDQwLjUgLTk4LjV0OTcuNSAtNDAuNXpNNDQ2IDM2MXEyNiAwIDQ1IC0xOXQxOSAtNDV0LTE5IC00NC41dC00NSAtMTguNXQtNDQuNSAxOC41dC0xOC41IDQ0LjV0MTguNSA0NXQ0NC41IDE5eiIgLz4KPGdseXBoIHVuaWNvZGU9IkYiIGhvcml6LWFkdi14PSI3MDQiIGQ9Ik0yMjQgNzAwaDQyMnYtODE4aC01OTN2NjQ2bDE3MSAxNzF2MXpNNTc4IC01MHY2ODJoLTI4NXYtMTcyaC0xNzJ2LTUxMGg0NTd6IiAvPgo8Z2x5cGggdW5pY29kZT0iRyIgZD0iTTQ2MCA2OThxMTc0IDAgMjk3IC0xMjN0MTIzIC0yOTd0LTEyMyAtMjk3dC0yOTcgLTEyM3QtMjk3IDEyM3QtMTIzIDI5N3QxMjMgMjk3dDI5NyAxMjN6TTczOCA0MDFsLTEgLTNxLTEgLTMgLTEgLTUuNXQyIC0yLjVxMCAtMiAzIC02dDMgLTh2LTExcTEgLTIgNSAtM3ExIC00IDYgLTV0NiAzcS0zIDAgLTIuNSA0LjV0LTAuNSA0LjVxMCAyIC0xIDNxLTIgMiAtMiAzaDdxMCAyIC0yIDV0LTIgNHEtMSAwIC0yLjUgLTF0LTIgLTF0LTAuNSAyIHQtNCA2bC0yIDdxMyAwIDYgMXEtMSAwIDQgMnEtMSAxIC0yIDRxLTIgNCAtNyAycS0yIDAgLTUgLTIuNXQtNSAtMi41ek03MzUgODFxNjMgOTAgNjMgMTk3cTAgMTkgLTEgMjhxLTkgMCAtMTMgMnEtNCAwIC0xNC41IDQuNXQtMTYuNSAyLjVxMCAxIC0xIDFxMiAzIC01IDExcS01IDQgLTcgMHEtMiAtMyA1IC0xMHEwIC0yIDIgLTZxMiAtMSAxIC0zdC0xIC0zcTQgMCA1IDdxMCAtMSAxIC0xcS0yIC0zIDEgLTZ2LTVxMTAgMCAxNCAxMCBxMSAwIDEgLTJ0MSAtM3EzIC0zIDIgLTV0MiAtMnEyIC0xIDIgMXYycTQgLTIgNCAtNnQtNCAtNnEwIC0xIC0xIC0zdC0xIC00cTAgLTYgLTQgLThsLTQgLTJxLTQgLTMgLTggLTUuNXQtNCAtMy41cS0xMiAwIC0xNSAtN3EtNyAwIC0xMSAtNHEtNiAwIC04LjUgNnQtNC41IDZsLTIgNXExIDAgLTEuNSA2bC01LjUgMTN0LTMgOWwtNSAxMHEtMiAxIC03IDEycS04IDQgLTEwIDEzcTEwIDAgMTAgNHEtMSAwIC0yIDFxLTIgMiAxIDJsMyA5IHEwIDEgMSA1LjV0MSA2LjVxLTIgMCAtOCAtMnEwIC0xIC0xLjUgLTAuNXQtMy41IDAuNWwtMyAxcTAgMSAtNi41IDB0LTguNSAycS0yIDIgLTQgMTRxLTEgMyAtOCAzcS0zIDEgLTMuNSAtMXQwLjUgLTVsMSAtNHEyIDAgLTIgLTdxLTEgLTEgLTEgLTJxLTQgMSAtNiA2dC00IDZxLTEgNCAtMyA0cTAgMTAgLTEgMTBsLTMgMXEtNCAyIC01IDNxLTIgMCAtNS41IDMuNXQtNi41IDUuNXQtNCAwbDMgLTZxMiAwIDUgLTQuNXQ3IC0zLjV2LTUgcTMgMSA0LjUgLTEuNXQyLjUgLTIuNXEwIC0xIC0zIDBxLTQgMiAtMyAtMXEyIC02IC00IC05cTAgMTIgLTMgMTJxLTIgMyAtNyA1dC02IDRxLTEgMCAtMy41IDMuNXQtNC41IDQuNXEtMiAtMiAtNSAtMnEtMSAtMiAtNC41IC0yLjV0LTcuNSAwLjVsLTMgMXEtNyAtMTggLTggLTIwcS0xIC0zIC0zIC01dC0zIC01cTAgLTEgLTcuNSAtMS41dC03LjUgLTEuNXEtMTEgNCAtMTEgMTN2NXQxIDl0MSA2bDIgLTJoMy41aDQuNXQzLjUgMXQxLjUgMiBxNCAwIDMgLTRxOSAtMyA5IDNxLTIgMCAtMiAycTMgNCAyIDd0LTQgNnQtMyA0bC00IDRxOSAtNiAxMSAtMXEwIDEgLTEgM3YxcTIgLTIgMy41IC0yLjV0Mi41IDEuNXEyIDEgMyAzdjZxMyAtNCA0LjUgMHQyLjUgNXEwIC0zIDMgMHEyIDIgMyAycTEgMiA1IDIuNXQ1IDMuNXEtMyAxIC0zIDEycTIgMCA0LjUgMS41dDMuNSAxLjV0MiAtMnEwIC02IDEgLTZxNCAyIDQgNXEtMiAwIC01IDEwcS0zIDAgLTUgLTJxLTMgMCAtNy41IDF0LTYuNSAxIHEtNyA3IC02IDdxLTIgNCAyIDVoMnEwIDIgMTEuNSA1dDEyLjUgOHEtNiAwIDggMTNxMTAgOCAxNCA4cTEgMCA5LjUgMmwxNC41IDMuNXQ4IC0wLjVxMjIgMCAyMiAtMnExIDAgMy41IC0xdDQgLTEuNXQzLjUgMC41cTMgMiAxMSAtMnQ4IC04cS0zIDAgLTEyIC0xdC0xNCAtMXYtMnEyIDAgNS41IC00LjV0Mi41IC02LjVxMyAwIDYgMnQ0IDJxMCAtMiAxIC0zcTMgLTIgNCAzbC0xIDRxMSAyIDQuNSAyLjV0NC41IDMuNXEtNDcgNTYgLTExNC41IDg4IHQtMTQzLjUgMzJxLTEzNCAwIC0yMzEgLTkxcTEgLTEgNSAybDIgMXEwIC02IDEgLThsMyAtN3E4IDAgOSAtMmgtNXExIC02IC0zIC00cS0zIDEgLTQgMXEwIDEgLTMgMnQtNSAwdDAgLTVxMSAwIDIgLTF0MyAtMnEyIDAgNi41IC0xdDYuNSAtMnEyIDAgNSAwLjV0NCAwLjVxMiAxIDMgMnQtMSAycTEgMiAtNCA0cTAgMSAxMSAxcTIgMiAxLjUgMy41dDAuNSAzLjV0NCAydDQgM3E0IC0yIDUgLTZxMSAwIDMgLTNxOSAtMTAgOSAtM3E2IC0xIDYgLTExIHE3IDEgNyAxMXEtMSAwIC0xIDNoNHEyIC0xIDIgMXExIDAgMSAtMmg4di0xMXEwIC0yIC0yIC0zdC0zIC0xbC0yIC0xcS0zIC00IC0xLjUgLTV0Ni41IC0zLjV0NiAtMy41bC04IDFxLTEgMCAtNC41IC0wLjV0LTYgLTF0LTQuNSAwLjVxNSAwIDcgMTFxLTggMiAtMTEgLTVxLTEgLTQgLTQgLTMuNXQtNCAtMS41bC0yIC0xcS0zIC0xIC01IC0xLjV0LTIgMC41cS03IC0yIC03IC0xN3ExMSAtOCAxMSAtMTJxNCAtMSA5LjUgLTJ0OC41IC0xIHExIC0zIDQgLTNxMCAtNCA5IC00cTAgNiA2IC00cTEgLTIgMSAtM3EtMSAwIDAgLTIuNXQzIC01LjVxLTIgMCAtMSAtMXEyIC0yIDUuNSAtMXQzLjUgM3EtMiAwIC0yIDZxLTYgNiAxIDhxMCAtNCA2IDFxMiAyIC0xIDNxMiA5IDAgMTJxLTEgMSAtMi41IDF0LTIuNSAycTQgMSAxIDE0aDVxMiAwIDUuNSAtMS41dDUuNSAtMXQzIDMuNXEzIC0yIDQuNSAtNXQ0LjUgMXEwIC0xIDQgLTUuNXQ1IC00LjVxMCAtMyAyIC0zbC0xIC0ycTcgMCA3IDEgcTYgMCA2IDhxMSAwIDIuNSAtM2wzIC02dDIuNSAtM2wyLjUgLTIuNWwzIC0zdDIuNSAtM3QxIC0yLjVxMiAtMiAyIC01cTEgMCAyIDJxMyAzIDMgLTFxMiAwIDQuNSAtMi41dDIuNSAtMy41cS0yIDAgLTEuNSAtMnQtMC41IC0ycTAgLTEgLTExIC0xcS0xIC01IC02IC02dC0xMSAwLjV0LTExIC0wLjVxLTQgLTIgLTkuNSAtOC41dC01LjUgLTEwLjVxMyAwIDcuNSAzLjV0Ni41IDQuNXEyIDAgMTAgNHEwIC0xIDEgLTF2LTFxLTYgMCAtMiAtNyBxMSAtMSAxIC0ycTMgLTUgOCAtNXEwIC0xIC0yLjUgLTF0LTIuNSAtMmwtNSAtM2gtNmwxIDFsMSAxaDN2NHEtMyAwIC02IC0xLjV0LTUgLTEuNXEtNCAtNCAtNiAtNHEtMiAtMTAgLTYgLTEybC0yIC0xbC00IC0ybC0yIC0ybC0yIC0ycS0xIC0yIC0yIC01cS0zIC03IC0zIC05cS0xIDAgLTMuNSAtNS41dC02LjUgLTUuNXEtMSAtMiAtNS41IC02dC00LjUgLTEwcTEgLTEgMS41IC00dDEuNSAtNi41dDEgLTQuNXEwIC04IC00IC04bC0yIDN0LTEgMyBxMCA0IC00IDEycTAgMiAtNC41IDEuNXQtNS41IC0wLjVxLTEgMyAtMTMgM3EwIC0xIDEgLTJ0MSAtM3EtNiAtMiAtNyAtMnEtMiAwIC00LjUgMi41dC01LjUgMS41cS0xNCAtMiAtMTQgLTE2cS0xIDAgLTEgLTguNXQxIC04LjVxMCAtMiAyIC02dDIgLTVxMiAwIDYgLTR0NSAtNHExIC00IDUgLTRsMiAxbDIgNHEtMyAxIC0xLjUgMy41dDMuNSAzLjVxMCAtMiA2IDJsNiAybDIgMnExIC0zIC0xIC00cS0yIDAgLTMgLTNsLTEgLTIgcS0xIC0yIC0yIC01dC0xIC01dDEgLTQuNXQwIC00LjVoMTN2M3EzIDAgMi41IC02LjV0MS41IC02LjVxMCAtMiAxIC02dDEgLTVxNSAtMyA0IC04cTEyIDAgMTIgM3E3IDAgNSAtN3E1IDAgNiAzdDEgNS41dDIgMi41cTAgMyAyIDFsNiAzbDMgMnEyIC0xIDIgLTJxNSAwIDkgNHEyIDAgNCAtNXQ2IC01cTEyIDAgMTMgMXEzIC0yIDMgLTNxMSAwIDIgLTFsMSAtMWgxbDQgLTRxMCAtMiAyLjUgLTN0Mi41IC0ybDEgLTFsMyAtMmw5IC0zcTEgMyA0IDAgcTEgLTEgMiAtMWwyIC0ycTEgLTEgNCAtN3EyIC0yIDQgLTExcS0xIDAgLTEgLThsNCAtMXEyIDAgMiAycTIgMCA1IC0ydDQgLTJxLTIgLTIgMSAtMy41dDMgMi41cTMgMCAzIC0xMXEyIDAgNC41IDEuNXQ0LjUgMS41cTYgMCA2IDFxOCAtMiAxMyAtOHE1IC01IDUuNSAtMTR0LTQuNSAtMTRsLTggLTEwcTAgLTEyIC0xIC0xMnEwIC0xNCAtMyAtMTRxMCAtMyAtMi41IC03dC0zLjUgLTZxLTEgLTEgLTYuNSAtNC41dC02LjUgLTUuNSBxLTEgMCAtNCAtMXQtNCAtMWwtMiAtM3EtMyAtMyAtMiAtM3EwIC0xIC0wLjUgLTcuNXQtMS41IC04LjVxLTQgLTIgLTMgLTRxLTEgMCAtMS41IC0xdC0zLjUgLTFxLTIgMCAtNSAtMi41dC0zIC01LjVxLTIgLTggLTYgLTExbC0zIC0ycS00IC0yIC00IC00di04cS02IDAgLTggLTRxLTQgMCAtMTEgLTRxMCAtNCAtMiAtNHEwIC00IC0zIC0zdC00IDBxMiAwIDIgLTZxMCAtMSAtNiAtOWwtMSAtMnEtMiAtMyAtMyAtM3EwIC0xIC0wLjUgLTQgdC0wLjUgLTV2LTNsMiAycTAgMSAyIC0xcS0xIC0yIC0zIC00dC0zIC01cS01IDAgLTUgLThxMCAtMiAxIC0ycTAgLTEgMiAtNWwtMjcgOXEwIDM3IDQgMzdxMCA5IDIgOXYxNHEtMSAyIDEuNSA2LjV0Mi41IDYuNXEzIDEgMy41IDEwdDAuNSAxN3QyIDhxMCA0IDEuNSAyMC41dC0wLjUgMjAuNWwtNyA4cS01IDAgLTkgNi41dC00IDEyLjVxLTMgOSAtMyAxMHExIDAgLTIgNC41dC02IDkuNWwtNCA1cS0zIDMgLTMgNC41dDIgNXQyIDYuNSBxLTQgMiAtMiAxMC41dDUgOC41cTAgMyAzIDRxMSAtMyAzIC0ycTMgMyAwIDV2MTNxMCAxMCAtNSAxMHEtMiAwIC00IC01cS0xIDEgLTUgMS41dC03IDJ0LTMgNC41cTIgNiAtOCAxMXExIDQgLTUuNSA4LjV0LTEwLjUgNC41cTAgMSAtMiAxLjV0LTIgMS41cS0yIDAgLTUgM3QtNiAzcS00IDAgLTEwIDIuNXQtOSAyLjVxLTEgMiAtNi41IDN0LTYuNSAzcS03IDAgLTcgMTNxMCAxOCAtOSAxOHEwIDMgLTQgNi41dC02IDMuNXEtMyA3IC01IDcgcTAgNCAtNiA5cS0zIDIgLTMgMHEtMSAtMiAyLjUgLTUuNXQzLjUgLTUuNXExIDAgOCAtMTNxNiAtMTAgMyAtMTFxLTQgLTEgLTEwIDhxLTIgNCAtMiA2cS0yIDEgLTQuNSA2LjV0LTIuNSA3LjVxLTEgMSAtMi41IDR0LTIuNSA2bC0xIDJxMCAxMCAtMTEgMTBsLTcgOXEwIDEwIC04IDEzcTAgMiAtMSA5dDAgMTBxMCAyMyAtMTAgMzFxLTMzIC02OCAtMzMgLTE0NHEwIC0xNDAgOTkuNSAtMjM5dDIzOS41IC05OXE4MiAwIDE1MyAzN3QxMTggMTAwIHEtNyAtMiAtOSA5cS0zIDE3IDIgMzJxNSAtMiA2IDBxLTQgMSAtMiA2cTEwIC03IDEwIDJsLTIgMnEwIDIgMSAzdDEuNSAwLjV0MC41IC0yLjVxMyAwIDMuNSA0LjV0MS41IDUuNXEwIC0xMSAzIC0xMnEyIC0yIC0wLjUgLTQuNXQtMi41IC0zLjVxLTIgLTEgLTIgLTZoLTNxMCAtMyAtMSAtOC41dC0xIC03LjVxLTIgMCAtMiAtMTZ6TTY2NiAzODNxMiAtMSAyIC00cTI1IDAgMjUgM3ExIC0yIDIgLTN0MiAycTEgMCA0LjUgLTN0Ny41IC0ybDcgNCBsLTIgMXEwIDYgLTUgOS41dC02IDQuNXEtMSAwIC0zLjUgMXQtNC41IDFxLTMgMiAtNiAtMXEtMyAtMiAtMyAwcS0xIDIgLTMgMnEwIDggLTkgN3EtMSAtMyAtMy41IC03dC0zLjUgLTcuNXQtMSAtNy41ek01MTggNDkxcTAgLTUgLTEgLTVxLTUgLTMgLTEwIC0zaC0xMXEtMiAwIC0xMCAycTAgMSAxIDJxMyA0IC0xIDRxNyAzIDggM3YtMXYtNHEwIC0xIDIgLTAuNXQ0LjUgMXQzLjUgMS41cTMgMCA2IDFxMSAxIDEuNSAwLjV0MC41IC0zLjV6IE01NTEgNDQ0cTAgMiAtMSA0dC0xIDRxMCAzIDMgMi41dDQgMy41cTMgLTEgMCAtM3YtNHEyIDAgNCAydDMgMnEtMiAtNyAtMSAtOHE1IC01IDQgLTZxNyAwIDUgLTExcTMgMCAzIDNxMiAtMSAyIC0yLjV0LTIgLTEuNXEtMyAtNSAtMTUgLTVxMCA2IC00IDNxLTMgLTEgLTIgNHExIDIgMSAzcS0yIDEgNSAycS0xIDggLTggOHpNNTM2IDQyOHEtMiAyIDAgOHEtMyAxIDEgMmw1IDJxLTQgMCAtMiA0aDJxMSAtMiAyIC0xaDRxMSAtMSAwIC0zIHEtMyAtMTIgLTEyIC0xMnpNNTUxIDQyMnExIDAgMSAxaDNxMCAtMiAtMS41IC0ydC0yLjUgMXpNMzkyIDQwMXExIDEgNCAzcTAgLTMgLTQgLTN6TTU5OCAzODhxMiAwIC0xIC02cS0xIDIgLTIgNXEzIDAgMyAxek01OTggMzgwcTIgMCAxLjUgLTQuNXQtNS41IC0zLjVxMCA3IDIgN2wxIC0ycTEgMSAxIDN6TTYyMCAzNjVxMCAtNCAtMSAtNC41dC00LjUgMS41dC01LjUgMmg1cTEgLTEgNiAxek03MjggMjQwcTYgMCA2IDFxMTAgMCAxNiAzIHEwIC00IC0yLjUgLTkuNXQtMS41IC05LjVxLTMgMCAtMyAtNWwtMiAtMnEtMiAtMyAtNCAtNHEwIC0yIC05IC0xMXEtMSAtMiAtNS41IC02LjV0LTUuNSAtNi41cS0xNCAtMTQgLTEwIC0xNHEwIC0yNCAyIC0yNGwxIC02cTEgLTYgMSAtMTB0LTEgLTVxMCAtMyAtMiAtNy41dC0yIC02LjVsLTIgLTFsLTMgLTNxLTIgMCAtNCAtMy41dC0zIC0zLjVxMCAtNCAtMSAtMTF0LTEgLTExbC0xIC00bC0yIC02bC0xIC00cS0xNSAtOCAtMTUgLTE3IHEtNyAtMTAgLTggLTEycS0xOSAwIC0xOSAtNGgtMTVxMCAyIC0xIDZ0LTEgN3EtMSAwIC0yIDMuNXQtMiAzLjVxMCAxIC0yLjUgNi41dC00LjUgMTF0LTEgNS41cTAgOSAtMyA5cTAgNCAtMi41IDExdC0yLjUgMTBxLTEgMCAtMiA0dC0xLjUgNy41dDAuNSA0LjVxMCA0IDQgMjJxMSA5IC0zIDIzcS00IDAgLTQgNnEtNiA0IC02IDE1cTYgNiAzIDIwcS0zIDEgLTE0IDFxLTEgMyAtNy41IDR0LTE2LjUgMGwtMTAgLTFxLTEgLTIgLTQuNSAtMS41IHQtOC41IDIuNXQtNSAzcS0zIDAgLTcuNSA0LjV0LTQuNSA4LjVxLTQgMSAtOCA5LjV0LTQgMTIuNXEtNCA0IDAgOXEwIDMgLTMgMTJxMCAyIDEuNSA0dDEuNSA0cTAgMTEgNCAxOXEwIDEgMiA0dDIgNHEyIDMgMyAzcTIgMSAzIDNxMiAxIDUgNXEyIDMgMyA0cTMgMSAwIDRxNCAwIDQgMTBxMiAzIDYgM2wxIDFxNCA1IDUgNXEyIDMgNiAzcTEgLTEgMi41IC0xdDQuNSAxbDMgMXE1IDcgMTQgN3ExIDIgNSAxLjV0MTAuNSAtMS41dDcuNSAtMXYyIHEzIC0xIDcgLTEwdDQgLTEyaDhxMCAtNCAxMCAtNHExNiAwIDE2IDZxNiAwIDYgLTZoNnQ4LjUgLTAuNXQ3LjUgLTJ0MiAtMi41cTIgMCA0IC0zdDMgLTNxMCAtMyAyLjUgLTguNXQ0LjUgLTUuNXEwIC04IDUgLTExcTYgLTE0IDEyIC0xOHEtMSAtMiAxLjUgLTZ0Mi41IC01cTEgLTYgMyAtN3EwIC00IDUgLTExLjV0OCAtNy41cTAgLTEgLTEgLTJ0MiAtMnpNMzEyIDI5NnEwIC0zIDMgMHEwIC00IC00IC0ycS0yIDAgLTEgM3ExIDAgMiAtMXogTTMyOCAyOTdxNCAtMSA3LjUgLTMuNXQ1LjUgLTIuNXEzIC0zIDMuNSAtNHQtMS41IC0ycS04IC0yIC0xMiA1cS01IDAgLTEwIDVxNiAwIDcgMnpNMzYyIDI4M2wyIC0xcTIgLTIgMyAtNGwxIC0xaC0xM3EtMSAtMSAtNC41IC0xdC00LjUgMmg3bC0yIDRxMSAwIDUgLTF0NiAtMXYzek0zMzEgMjc4cTQgMCA0IC0zcS01IDAgLTQgM3pNMzM2IDI3NWwyIDNxMSAwIDEgLTJxLTEgLTEgLTMgLTF6TTM3NiAyNzhxMyAwIDMgLTFxLTQgMiAtMyAxeiBNMzczIDI3OGwyIC0xcS0xIDAgLTEgLTAuNXQtMSAtMC41djJ6TTM1NyAyNTBxMSAxIDEgMmwxIC0xcTAgLTEgLTIgLTF6TTc0MCAxMzRxMCAyIDIgM3oiIC8+CjxnbHlwaCB1bmljb2RlPSJIIiBob3Jpei1hZHYteD0iODY1IiBkPSJNNjg2IDI3OXYtMzc4aC0xNzd2MjM1aC0xNTJ2LTIzNWgtMTgzdjM3OGgtMTUzbDQxMiA0MTFsNDExIC00MTFoLTE1OHoiIC8+CjxnbHlwaCB1bmljb2RlPSJJIiBob3Jpei1hZHYteD0iOTMyIiBkPSJNODg0IDIzNHYtMzE0aC04MzZ2MzE0bDE1NyA0MThoNTIyek01ODIgMjM0aDE5OGwtMTA1IDMyMmwtNDE4IDFsLTEwNCAtMzIzaDE5N2w0OSAtOTZoMTMweiIgLz4KPGdseXBoIHVuaWNvZGU9IkoiIGhvcml6LWFkdi14PSI4NjIiIGQ9Ik04NDggNTM0bC0xMjIgLTEyMmw4MiAtODJsLTM3MCAtNDJsNDMgMzY5bDgxIC04MWwxMjIgMTIyek0xMzYgMTQ4bC04MiA4MmwzNjkgNDNsLTQzIC0zNzBsLTgxIDgybC0xMjIgLTEyMmwtMTYzIDE2M3pNMTgyIDM4OGwxOTcgLTY4bC0yMjEgMTh6TTM5MyA0MTd2LTg1bC0yOCA4MHpNNjgyIDE3NGwtMTk3IDY5bDIyMSAtMTl6TTQ3MSAxNDZ2ODVsMjggLTgxeiIgLz4KPGdseXBoIHVuaWNvZGU9IksiIGhvcml6LWFkdi14PSI4NjkiIGQ9Ik01MzAgMzUxbDMxOCAtMzE4di0xNjh2MGgtMTY4aC0xdjEyOWgtMTI4djEyOGgtMTI4bC02MSA2MXEtNDAgLTE0IC04MyAtMTRxLTEwOSAwIC0xODcgNzcuNXQtNzggMTg3LjV0NzggMTg3LjV0MTg3IDc3LjV0MTg3IC03Ny41dDc4IC0xODcuNXEwIC00MyAtMTQgLTgzek0yMjQgNDAycTM3IDAgNjMgMjZ0MjYgNjN0LTI2IDYzdC02MyAyNnQtNjMuNSAtMjZ0LTI2LjUgLTYzdDI2LjUgLTYzdDYzLjUgLTI2eiIgLz4KPGdseXBoIHVuaWNvZGU9IkwiIGQ9Ik00NjAgNzAxcTE3NCAwIDI5NyAtMTIzdDEyMyAtMjk3dC0xMjMgLTI5N3QtMjk3IC0xMjN0LTI5NyAxMjN0LTEyMyAyOTd0MTIzIDI5N3QyOTcgMTIzek00NjAgLTM0cTEzMCAwIDIyMi41IDkydDkyLjUgMjIzdC05Mi41IDIyM3QtMjIyLjUgOTJ0LTIyMi41IC05MnQtOTIuNSAtMjIzdDkyLjUgLTIyM3QyMjIuNSAtOTJ6TTQ2NCA1MjlxMTAzIDAgMTc2LjUgLTczLjV0NzMuNSAtMTc3LjV0LTczIC0xNzcuNXQtMTc3IC03My41IHQtMTc3LjUgNzMuNXQtNzMuNSAxNzcuNXQ3My41IDE3Ny41dDE3Ny41IDczLjV6TTM5NiAzNTlxMzMgMzMgMTAyIDcwbC0zMCA0MHEtNCAxIC0xMiAxcS02MSAwIC0xMTYuNSAtNTV0LTU1LjUgLTExNnEwIC02IDEgLTlsNDIgLTMycTM4IDcwIDY5IDEwMXpNNTQwIDE1NXExNiAwIDI4IDEydDEyIDI5dC0xMS41IDI5dC0yOC41IDEydC0yOSAtMTJ0LTEyIC0yOXQxMiAtMjl0MjkgLTEyeiIgLz4KPGdseXBoIHVuaWNvZGU9Ik0iIGhvcml6LWFkdi14PSI5NTIiIGQ9Ik04OTIgMzJsLTI3MyAyNjJsMjczIDIzNHEzIC04IDMgLTE1di00NjVxMCAtOCAtMyAtMTZ6TTQ3NiAyMzhsLTcyIDU4bC0zNiAzMGwtMjc1IDIzNXExMCAyIDE0IDJoNzM4cTQgMCAxNCAtMmwtMjc1IC0yMzVsLTM2IC0zMHpNODQ1IC0yaC03MzhxLTUgMCAtMTMgMmwyNzYgMjY1bDEwNiAtODdsMTA3IDg3bDI3NSAtMjY1cS04IC0yIC0xMyAtMnpNNjAgNTI4bDI3MyAtMjM0bC0yNzMgLTI2MnEtMyA4IC0zIDE2djQ2NXEwIDcgMyAxNXoiIC8+CjxnbHlwaCB1bmljb2RlPSJOIiBob3Jpei1hZHYteD0iOTQzIiBkPSJNODU3IDY3MHExNyAwIDIzIC02dDYgLTIzdi02NTVxMCAtMTcgLTYgLTIzdC0yMyAtNmgtMTA4aC01NDZoLTcxcS0yOCAwIC01My41IDI2LjV0LTI1LjUgNTIuNXY0ODFxMCAxNyA2IDIzdDIzIDZoOTJ2OTVxMCAxNyA2IDIzdDIzIDZoNjU0ek04MzcgN3Y2MTNoLTYxNHYtNzR2LTUwdi00NDVoLTQ5djQ0NWgtNzF2LTQ2MHEwIC03IDExIC0xOHQxOCAtMTFoNzFoNTQ2aDg4ek01MTEgNTU2di0yMjNoLTIyM3YyMjNoMjIzek03NjUgNTI1di0zNyBoLTE4NXYzN2gxODV6TTc2NSA0MTF2LTM3aC0xODV2MzdoMTg1ek03NjUgMjU5di0zN2gtNDc3djM3aDQ3N3pNNzY1IDE0NHYtMzdoLTQ3N3YzN2g0Nzd6IiAvPgo8Z2x5cGggdW5pY29kZT0iTyIgaG9yaXotYWR2LXg9IjkzMCIgZD0iTTg4MiA1MTB2LTUxMWgtNzB2NTExaDcwek02OTUgNTEwaDQ3di01MTFoLTU1NnY1MTFoNTJxNjggMTMzIDEyMiAxMzNoMjA3cTMyIDAgNjYuNSAtNDAuNXQ2MS41IC05Mi41ek01MTQgNTIycTEzIDAgMjIgOXQ5IDIydC05IDIxLjV0LTIyIDguNWgtMTA0cS0xMyAwIC0yMS41IC04LjV0LTguNSAtMjEuNXQ4LjUgLTIydDIxLjUgLTloMTA0ek00OCA1MTBoNjl2LTUxMWgtNjl2NTExeiIgLz4KPGdseXBoIHVuaWNvZGU9IlAiIGhvcml6LWFkdi14PSI5MDkiIGQ9Ik03MTkgNDk2aDE0M3YtNDk1aC02NTl2MWwtMTc3IDQ2MWw2MTUgMjM3ek02NjAgNDk2bC01MSAxMzNsLTM0NSAtMTMzaDM5NnpNOTcgNDMybDEwNiAtMjc3djMxOHpNMjU4IDU2aDU0OXYzODVoLTU0OXYtMzg1ek02OTkgMjkybDU4IC0xOTBoLTQzMmwxMDMgMTEybDY2IC00MmwxMjMgMTc3bDM4IC03MXpNMzc5IDI3NXEtMjIgMCAtMzcgMTV0LTE1IDM3dDE1IDM3dDM3IDE1dDM3IC0xNXQxNSAtMzd0LTE1IC0zN3QtMzcgLTE1eiIgLz4KPGdseXBoIHVuaWNvZGU9IlEiIGhvcml6LWFkdi14PSI4NDQiIGQ9Ik02ODEgNTIxcTYxIC01NCA5NS41IC0xMjkuNXQzNC41IC0xNjAuNXEwIC0xNjEgLTExNCAtMjc1LjV0LTI3NSAtMTE0LjV0LTI3NSAxMTQuNXQtMTE0IDI3NS41cTAgODUgMzUgMTYxdDk2IDEzMHEyMCAxNyA0Ni41IDE1LjV0NDMuNSAtMjEuNXExNyAtMTkgMTUuNSAtNDUuNXQtMjEuNSAtNDMuNXEtODggLTc4IC04OCAtMTk2cTAgLTEwOSA3Ni41IC0xODZ0MTg1LjUgLTc3dDE4NS41IDc3dDc3LjUgMTg2cTAgMTE3IC04OCAxOTUgcS0yMCAxOCAtMjEuNSA0NHQxNi41IDQ2cTE3IDE5IDQzLjUgMjAuNXQ0NS41IC0xNS41ek00MjMgMTY2cS0yNiAwIC00NC41IDE5dC0xOC41IDQ1djQwN3EwIDI2IDE4LjUgNDV0NDQuNSAxOXQ0NSAtMTl0MTkgLTQ1di00MDdxMCAtMjYgLTE5IC00NXQtNDUgLTE5eiIgLz4KPGdseXBoIHVuaWNvZGU9IlIiIGhvcml6LWFkdi14PSI5MDkiIGQ9Ik02NjggMTA1djg3bDEwNCA3MHYtMjYyaC03MzF2NTIzaDMyN3EtMiAtMSAtNi41IC0zdC02LjUgLTNxLTg3IC0zOSAtMTQxIC05OWgtNjl2LTMxM2g1MjN6TTg3NyA0MTdsLTMxMyAtMjExdjEzN3EtOTAgMCAtMTQxIC03cS00OSAtNiAtODkuNSAtMjF0LTYzLjUgLTMzLjV0LTM5IC0zNS41dC0yMiAtMjhsLTYgLTEycTAgNTQgMjAgMTAwdDUxLjUgNzUuNXQ3MC41IDUyLjV0NzcuNSAzNXQ3MCAyMHQ1MS41IDEwbDIwIDJ2MTI2eiIgLz4KPGdseXBoIHVuaWNvZGU9IlMiIGhvcml6LWFkdi14PSI4NTMiIGQ9Ik04MjYgMzg5cTEwIC0xMSA4IC0yNHEwIC0xMyAtMTAgLTI4cS0zIC00IC0xNiAtMTRsLTE4NCAtMTIxcS0yIC0xIC01LjUgLTd0LTIuNSAtMTB2LTRsODEgLTIzN3E0IC0xMSA0IC0yM3EwIC0xNSAtNyAtMjVxLTExIC0xNiAtMzAgLTE2aC0xcS0xNiAxIC0zNiAxNWwtMTkwIDE1NXEtMyAzIC0xMCAzdC05IC0zbC0xODEgLTE1NHEtMTggLTE0IC0zNiAtMTVxLTIxIC0yIC0zMSAxNXEtOCAxMSAtOCAyNnEwIDcgNCAyMWw3MiAyMzZ2NCBxMSA1IC0yIDExdC02IDdsLTE4NSAxMjJxLTEwIDcgLTE2IDE0cS0xMSAxMyAtMTEgMjhxMCAxNCA4IDI0cTkgOSAxNiAxMnExMiA1IDI3IDVoMjMwcTYgMCAxMSA0cTcgNSA3IDEwbDY3IDIzOXE0IDE0IDkgMjFxMTMgMTggMzMgMTlxMjAgLTEgMzMgLTE5cTMgLTQgMTAgLTIxbDY2IC0yMzlxMCAtNSA3IC0xMHE1IC00IDExIC00aDIzMHE5IDAgMjAgLTNxMTQgLTQgMjMgLTE0eiIgLz4KPGdseXBoIHVuaWNvZGU9IlQiIGhvcml6LWFkdi14PSI4OTkiIGQ9Ik04MTcgMTg1bDYzIC02NGwtMTYyIC05MWwtOTIgLTE2M2wtNjMgNjRsMTQgMTQ4bC0xNjkgMTY5bC0yMjQgLTM3MWwtNjMgNjNsMTIwIDQ3NWwtMTc2IDE3NXEtMTkgMjAgLTE5IDQ2LjV0MTkgNDUuNXQ0NiAxOXQ0NiAtMTlsMTc2IC0xNzVsNDc1IDEyMGw2MyAtNjNsLTM3MSAtMjI1bDE2OCAtMTY4eiIgLz4KPGdseXBoIHVuaWNvZGU9IlUiIGhvcml6LWFkdi14PSI4OTQiIGQ9Ik03NjAgMTU0cTQ2IC0yMCA3Mi41IC00NC41dDI5LjUgLTM4LjVsMyAtMTR2LTg2aC04MzZ2ODZxMCAyIDAuNSA2dDYgMTV0MTUuNSAyMnQzMS41IDI2dDUwLjUgMjhxMTIgNSA1NCAyOXQ4NyA0M3Q5NCAyOHEtMzMgMzQgLTcyIDEzNHEtMTEgMjggLTExIDEwMHEwIDcgLTEgMzF0LTAuNSA0MS41dDMuNSAyOS41cTMxIDExMSAxNTkgMTExcTEyNyAwIDE1OCAtMTExcTQgLTEyIDQuNSAtMjkuNXQtMSAtNDF0LTEuNSAtMzEuNSBxMCAtNzIgLTEwIC0xMDBxLTM4IC05NiAtNzIgLTEzNHE1MCAtOCA5NC41IC0yN3Q4NyAtNDMuNXQ1NC41IC0yOS41eiIgLz4KPGdseXBoIHVuaWNvZGU9IlYiIGhvcml6LWFkdi14PSI5NDkiIGQ9Ik02NTkgNDE2bDIzNSAxMTF2LTQ0OWwtMjM1IDExMXYxdi0xMDNxMCAtMTkgLTEzIC0zMnQtMzIgLTEzaC01MTBxLTE5IDAgLTMyIDEzdC0xMyAzMnY0MzNxMCAxOSAxMyAzMnQzMiAxM2g1MTBxMTkgMCAzMiAtMTN0MTMgLTMydi0xMDR6IiAvPgo8Z2x5cGggdW5pY29kZT0iVyIgaG9yaXotYWR2LXg9Ijk1NCIgZD0iTTcwNCA1NHYxODFsOTIgOTN2LTI3NHEwIC01MSAtMzYgLTg3dC04NyAtMzZoLTQ5MnEtNTEgMCAtODcgMzZ0LTM2IDg3djQ5M3EwIDUxIDM2IDg3dDg3IDM2aDQ5MnExNyAwIDI0IC0ybC04OSAtOTBoLTQyN3EtMTMgMCAtMjIgLTl0LTkgLTIydi00OTNxMCAtMTMgOSAtMjJ0MjIgLTloNDkycTEzIDAgMjIgOXQ5IDIyek00MzEgMzE0bDM1NCAzNTRsMTMyIC0xMzJsLTM1NCAtMzU0djBsLTE5NSAtNjNsNjMgMTk1djB6TTU0NyAyMDggbC04OSA4OWwtNDMgLTEzMXoiIC8+CjxnbHlwaCB1bmljb2RlPSJYIiBob3Jpei1hZHYteD0iOTIxIiBkPSJNODY4IDU0MnYtNDIzaC02NnEtMTMgMjkgLTQwIDQ2LjV0LTYwIDE3LjV0LTU5LjUgLTE3LjV0LTQwLjUgLTQ2LjVoLTIyMHY0MjNoNDg2ek0yNDAgMTgzcS0zMyAwIC02MCAtMTcuNXQtNDAgLTQ2LjVoLTEwN3YxODBsMTExIDEyM2gxODR2LTI4NHEtMzMgNDUgLTg4IDQ1ek0xMDEgMjg4di01OGgxNjF2MTMyaC05OXpNMjQwIDE0NnEzMCAwIDUxLjUgLTIxdDIxLjUgLTUycTAgLTMwIC0yMS41IC01MS41dC01MS41IC0yMS41IHEtMzEgMCAtNTIgMjEuNXQtMjEgNTEuNXEwIDMxIDIxIDUydDUyIDIxek03MDIgMTQ2cTMxIDAgNTIgLTIxdDIxIC01MnEwIC0zMCAtMjEgLTUxLjV0LTUyIC0yMS41cS0zMCAwIC01MS41IDIxLjV0LTIxLjUgNTEuNXEwIDMxIDIxLjUgNTJ0NTEuNSAyMXoiIC8+CjxnbHlwaCB1bmljb2RlPSJZIiBob3Jpei1hZHYteD0iODYxIiBkPSJNNDI1IDQ4OGwtMTQ1IC00MDlsLTEyNiAxOTNsLTgxIC03NmwtMjIgLTIwbC00NiAzOWwxNjIgMTUxbDk2IC0xNDdsMTcxIDQ4M2wxNTcgLTYwNWwxMzEgNDEzbDExNiAtMzcxbC02MSAtMTZsLTU1IDE3OGwtMTM3IC00MzF6IiAvPgo8Z2x5cGggdW5pY29kZT0iWiIgaG9yaXotYWR2LXg9Ijg5NyIgZD0iTTQwMiA2MDd2LTM2OWgzNzFxMCAtMTUzIC0xMDggLTI2MXQtMjYxIC0xMDh0LTI2MSAxMDh0LTEwOCAyNjFxMCAxNTIgMTA3LjUgMjYwdDI1OS41IDEwOXpNNDk2IDcwMHExNTMgMCAyNjEuNSAtMTA4LjV0MTA4LjUgLTI2MS41aC0zNzF2MzcwaDF6IiAvPgo8Z2x5cGggdW5pY29kZT0iWyIgaG9yaXotYWR2LXg9Ijg2MSIgZD0iTTQ0NSA2NzF2LTI3OGg0MDl2LTE4NWgtNDA5di0yNzdsLTQyNyAzNzB6IiAvPgo8Z2x5cGggdW5pY29kZT0iXCIgaG9yaXotYWR2LXg9Ijg1NCIgZD0iTTcxMCA1NzloODd2LTczOWgtNzQwdjczOWg4OXY0NnEwIDM1IDIwIDU0dDU2IDE5dDU2LjUgLTE5LjV0MjAuNSAtNTMuNXYtNDZoNTJ2NDZxMCAzNCAyMC41IDUzLjV0NTYuNSAxOS41dDU2IC0xOXQyMCAtNTR2LTQ2aDUydjQ2cTAgMzQgMjAuNSA1My41dDU2LjUgMTkuNXQ1Ni41IC0xOS41dDIwLjUgLTUzLjV2LTQ2ek01OTggNjI1di0xMjNxMCAtMzIgMzUgLTMycTE5IDAgMjcuNSA3LjV0OC41IDI0LjV2MTIzcTAgMTcgLTguNSAyNC41IHQtMjcuNSA3LjVxLTM1IDAgLTM1IC0zMnpNMzkyIDYyNXYtMTIzcTAgLTE3IDguNSAtMjQuNXQyNy41IC03LjVxMzUgMCAzNSAzMnYxMjNxMCAzMiAtMzUgMzJxLTE5IDAgLTI3LjUgLTcuNXQtOC41IC0yNC41ek0xODcgNjI1di0xMjNxMCAtMzIgMzUgLTMycTE5IDAgMjcuNSA3LjV0OC41IDI0LjV2MTIzcTAgMTcgLTguNSAyNC41dC0yNy41IDcuNXEtMzUgMCAtMzUgLTMyek03MzUgLTk5djUxNGgtNjE2di01MTRoNjE2ek00MjkgOTkgcTAgLTQ1IC0zNSAtNzB0LTkwIC0yNXEtMzYgMCAtNzMgMTRsNyA1MnEzNSAtMTQgNzMgLTE0cTI0IDAgMzggMTF0MTQgMjhxMCAyMiAtMTYuNSAzMi41dC01OS41IDEyLjV2NTJxNjMgNSA2MyAzOHEwIDI4IC00MiAyOHEtMjkgMCAtNjEgLTE1bC03IDUycTM0IDE1IDg0IDE1cTQ1IDAgNzEgLTE4dDI2IC00NnEwIC01MCAtNjUgLTcydi0xcTczIC0yMCA3MyAtNzR6TTUzNyAyMjlsLTUyIC0yMGwtNyA1Mmw5MSA0NGgzMXYtMjk2aC02M3YyMjB6ICIgLz4KPGdseXBoIHVuaWNvZGU9Il0iIGhvcml6LWFkdi14PSI4NjEiIGQ9Ik00MTUgLTY5djI3N2gtNDA4djE4NWg0MDh2Mjc4bDQyOCAtMzcweiIgLz4KPGdseXBoIHVuaWNvZGU9Il4iIGhvcml6LWFkdi14PSI3NzUiIGQ9Ik03NDkgNTcycTIyIC00NiAtMyAtMTMycS0yNCAtODUgLTUgLTIzNHEtOCAtMiAtMjEgLTR0LTQ5IC04dC02NiAtOHQtNjEgLTJ0LTQ2LjUgOXQtMTAuNSAyNnExNSA0OCAtNDggNDZxLTYxIC0yIC0xODIgLTQ4cS0zNyAtMTQgLTYzIC0zdjM5OXEyMiA2IDU4IDE1dDExMiAyNXQxMjYuNSAxNC41dDUwLjUgLTI0LjVxMCAtMyAtMiAtMTQuNXQtMy41IC0yM3QtMS41IC0yM3Q1IC0xOHQxNiAtNS41cTMwIDQgNzguNSA3dDgyLjUgNHogTTE0NSA2NTh2LTgxN2gtODV2ODE3cTAgMTcgMTIuNSAyOS41dDMwLjUgMTIuNXExNyAwIDI5LjUgLTEyLjV0MTIuNSAtMjkuNXoiIC8+CjxnbHlwaCB1bmljb2RlPSJfIiBob3Jpei1hZHYteD0iODIwIiBkPSJNNTkgMTk4djE5OWg3MDJ2LTE5OWgtNzAyeiIgLz4KPGdseXBoIHVuaWNvZGU9ImAiIGhvcml6LWFkdi14PSI5MzYiIGQ9Ik0zMDYgMzc4bC0xNTIgMTUzbC05NSAtOTZ2Mjc3aDI3N2wtOTUgLTk1bDE1MiAtMTUyek03ODMgNzVsOTUgOTV2LTI3NmgtMjc3bDk1IDk1bC0xNTIgMTUxbDg3IDg3ek02MzEgMzc4bC04NyA4N2wxNTIgMTUybC05NSA5NWgyNzZ2LTI3N2wtOTQgOTV6TTMwNiAyMjdsODcgLTg3bC0xNTIgLTE1Mmw5NSAtOTVsLTI3NyAxdjI3N2w5NSAtOTZ6IiAvPgo8Z2x5cGggdW5pY29kZT0iYSIgaG9yaXotYWR2LXg9IjgxMCIgZD0iTTc0NSAxNDRxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV0LTE0LjUgLTM2dC0zNS41IC0xNXEtMiAwIC02IDAuNXQtNiAwLjVxLTQyIC0zNiAtNzkgLTU5cS04MyAtNTUgLTE1NyAtNzZxLTcxIC00NCAtOTAgLTQ0cS0xNCAwIC05NSA0NXEtNzYgMjIgLTE1NiA3NXEtNDAgMjcgLTc5IDU5cS0yIDAgLTUuNSAtMC41dC01LjUgLTAuNXEtMjEgMCAtMzYgMTV0LTE1IDM2dDE1IDM1LjV0MzYgMTQuNXQzNS41IC0xNC41dDE0LjUgLTM1LjV2LTggcTkgLTggMzQgLTIydDM4IC0yM3E0NyAtMzEgMTQ0IC0zM2wzMiAxNTFxNCA5OCA3IDE5MmgtMTM2bC01MiAxMnEtMTQgLTE3IC0zMyAtMTdxLTE3IDAgLTI5IDExLjV0LTEyIDI4LjV0MTIgMjguNXQyOSAxMS41cTIyIDAgMzMgLTE4aDE5MHEyIDcyIDMgOTZxLTMyIDEwIC01MiAzNi41dC0yMCA2MC41cTAgNDIgMjkuNSA3MS41dDcwLjUgMjkuNXE0MiAwIDcxLjUgLTI5LjV0MjkuNSAtNzEuNXEwIC0zMyAtMjAgLTU5LjV0LTUxIC0zNi41IHEwIC03IDEuNSAtNDAuNWwyLjUgLTU2LjVoMTg5cTExIDE4IDMzIDE4cTE3IDAgMjkgLTExLjV0MTIgLTI4LjV0LTEyIC0yOC41dC0yOSAtMTEuNXEtMjEgMCAtMzIgMTdsLTUzIC0xMmgtMTM1bDYgLTE5MmwzMyAtMTU0cTc5IC00IDEyMCAyMXE1MCAzMCA5NiA2MnEtMSAyIC0xIDZxMCAyMSAxNSAzNS41dDM2IDE0LjV6TTM1MSA2MDFxMCAtMjIgMTUuNSAtMzcuNXQzNy41IC0xNS41cTIzIDAgMzguNSAxNS41dDE1LjUgMzcuNXQtMTYgMzcuNSB0LTM4IDE1LjV0LTM3LjUgLTE1LjV0LTE1LjUgLTM3LjV6IiAvPgo8Z2x5cGggdW5pY29kZT0iYiIgaG9yaXotYWR2LXg9IjkxOSIgZD0iTTQ2MSA2OTlsNDA4IC0xMTN2LTU5MWwtNDA4IC0xMTRsLTQxMCAxMTR2NTkxek00MjYgLTM4djQzOWwtMzA2IDg2di00NDF6TTQ2MCA0NjJsMzAwIDg0bC0yOTkgODJsLTMwMCAtODJ6TTgwMSA0NnY0NDBsLTMwNyAtODV2LTQ0MHoiIC8+CjxnbHlwaCB1bmljb2RlPSJjIiBob3Jpei1hZHYteD0iOTA4IiBkPSJNNzY3IDMxOHE0NiAtMTkgNzMuNSAtNjB0MjcuNSAtOTJxMCAtNjggLTQ4IC0xMTZ0LTExNiAtNDhoLTloLTE5OHYxNjJoMzBoNzZxMTIgMCAxNSA2LjV0LTQgMTYuNWwtMTQ1IDE3M3EtOCAxMCAtMTkuNSAxMHQtMTkuNSAtMTBsLTE0NSAtMTczcS04IC0xMCAtNSAtMTYuNXQxNiAtNi41aDc2aDMwdi0xNjJoLTE5OGgtMWgtMWgtMnYxcS02OCAxIC0xMTYuNSA1MHQtNDguNSAxMTdxMCA0NiAyMiA4NHQ2MCA2MXEtNSAxOCAtNSAzNCBxMCA0NyAzMy41IDgwLjV0ODEuNSAzMy41cTM5IDAgNjkgLTI0cTMxIDY0IDkxIDEwM3QxMzMgMzlxMTAzIDAgMTc1LjUgLTcyLjV0NzIuNSAtMTc1LjVxMCAtMTAgLTEgLTE1eiIgLz4KPGdseXBoIHVuaWNvZGU9ImQiIGhvcml6LWFkdi14PSI5MTgiIGQ9Ik00NTkgNjk5cTE3NCAwIDI5Ni41IC0xMjN0MTIyLjUgLTI5NnEwIC0xNzQgLTEyMi41IC0yOTYuNXQtMjk2LjUgLTEyMi41cS0xNzMgMCAtMjk2IDEyMi41dC0xMjMgMjk2LjVxMCAxNzMgMTIzIDI5NnQyOTYgMTIzek03NzQgMjgwcTAgMTMwIC05Mi41IDIyMnQtMjIyLjUgOTJxLTEwMCAwIC0xODIgLTU4bDQzOCAtNDM4cTU5IDgxIDU5IDE4MnpNMTQ1IDI4MHEwIC0xMzAgOTIgLTIyMnQyMjIgLTkycTEwMyAwIDE4MyA1OGwtNDM4IDQzOSBxLTU5IC04MyAtNTkgLTE4M3oiIC8+CjxnbHlwaCB1bmljb2RlPSJlIiBob3Jpei1hZHYteD0iNTU2IiBkPSJNNTUwIDY5OWwtMTkzIC0zNDJoMTU4bC01MTAgLTQ3NmwyMzkgMzg2aC0xNjB6IiAvPgo8Z2x5cGggdW5pY29kZT0iZiIgaG9yaXotYWR2LXg9IjkxMiIgZD0iTTU2IDQxNXExNDkgMCAyNzUgLTczLjV0MjAwIC0xOTkuNXQ3NSAtMjc1aC0xNjBxLTIgMTYxIC0xMTUgMjc0cS0xMTQgMTE0IC0yNzUgMTE0djE2MHpNNTYgNzAwcTE2OSAwIDMyMi41IC02NnQyNjUuNSAtMTc3LjV0MTc4IC0yNjZ0NjcgLTMyMy41aC0xNjBxLTEgMTgzIC05MS41IDMzNy41dC0yNDUgMjQ0LjV0LTMzNi41IDkwdjE2MXpNMTY3IDkwcTQ2IDAgNzguNSAtMzIuNXQzMi41IC03OC41dC0zMi41IC03OC41dC03OC41IC0zMi41IHQtNzguNSAzMi41dC0zMi41IDc4LjV0MzIuNSA3OC41dDc4LjUgMzIuNXoiIC8+CjxnbHlwaCB1bmljb2RlPSJnIiBob3Jpei1hZHYteD0iODk0IiBkPSJNODY1IDM2di0zNWgtMTUxdjQ3djFxLTQgNDMgLTU1IDczcS0xMCAxNiAtMjIgNDdxLTUgMTEgLTUgNDBxMCAzNyAxIDQxcTEzIDQ0IDY0IDQ0dDY0IC00NHYtNDFxMCAtMzAgLTQgLTQwcS0xNSAtMzkgLTI5IC01NHEyMCAtNCAzOCAtMTEuNXQzNS41IC0xN3QyMS41IC0xMS41cTE5IC04IDI5LjUgLTE4dDExLjUgLTE1ek0xODAgNDl2LTF2LTQ3aC0xNTF2MzVxMCAyIDEgNnQxMS41IDE0dDI5LjUgMThxNSAyIDIxLjUgMTJ0MzQuNSAxNy41IHQzOCAxMS41cS0xNCAxNSAtMjkgNTRxLTQgMTAgLTQgNDBxMCAzNyAxIDQxcTExIDQ0IDYzIDQ0cTUxIDAgNjQgLTQ0cTEgLTQgMSAtNDFxMCAtMzAgLTQgLTQwcS0xNSAtMzYgLTI0IC00OHEtNTMgLTMyIC01MyAtNzJ6TTYyMCAxMDJxMjUgLTExIDM5LjUgLTI0LjV0MTYuNSAtMjEuNWwyIC04di00N2gtNDYydjQ3cTAgMyAxLjUgOC41dDE2IDE5LjV0NDAuNSAyNnE2IDMgMjkgMTZ0NDggMjMuNXQ1MiAxNS41cS0xOCAyMSAtMzkgNzQgcS02IDEzIC02IDU2cTAgNTMgMSA1NnExNyA2MSA4NyA2MXQ4OCAtNjFxMSAtMyAxIC01NnEwIC00MSAtNiAtNTZxLTIxIC01NCAtNDAgLTc0cTI4IC01IDUyLjUgLTE1dDQ5IC0yNHQyOS41IC0xNnoiIC8+CjxnbHlwaCB1bmljb2RlPSJoIiBob3Jpei1hZHYteD0iOTA2IiBkPSJNODQ4IDQyNXEyNSAtNjggMjUgLTE0NHQtMjUgLTE0NHEtMTAgLTI4IC00MCAtMjhxLTYgMCAtMTAgMWwtNyAycS01NSAtMTExIC0xNjkgLTE2OWwyIC03cTQgLTE2IC0zLjUgLTMwdC0yMi41IC0yMHEtNzIgLTI1IC0xNDQgLTI1cS03MyAwIC0xNDUgMjVxLTE1IDYgLTIyLjUgMjB0LTMuNSAzMGwyIDdxLTExMiA1NSAtMTcwIDE2OWwtNyAtMnEtMyAtMSAtMTAgLTFxLTI5IDAgLTM5IDI4cS0yNiA3MCAtMjYgMTQ0dDI2IDE0NCBxMTAgMjggMzkgMjhxMyAwIDExIC0ybDYgLTFxNTggMTE1IDE3MCAxNjlsLTIgN3EtNCAxNiAzLjUgMzB0MjIuNSAyMHE3MiAyNSAxNDQgMjVxNzUgMCAxNDUgLTI2cTE1IC01IDIyLjUgLTE5dDMuNSAtMzBsLTIgLTdxMTEzIC01NiAxNzAgLTE2OWw2IDFxOCAyIDExIDJxMjkgMCAzOSAtMjh6TTgwOCAxNTFxMjMgNjMgMjMgMTMwcTAgNjYgLTIyIDEzMGwtMTY2IC00MXEyMCAtNDIgMjAgLTg5dC0yMCAtODl6TTU4MyAtNzRsLTQwIDE2NSBxLTQyIC0yMCAtODkgLTIwdC05MCAyMGwtNDAgLTE2NXE2MSAtMjMgMTMwIC0yM3E2OCAwIDEyOSAyM3pNNTYxIDEyOXExMiAtNyAxNyAtMTZxMjQgMTcgNDQgNDNxLTExIDYgLTE3IDE4cS04IDE3IDAgMzZxMTYgMzIgMTYgNzFxMCAzOCAtMTYgNzFxLTggMTggMCAzNnE3IDEyIDE3IDE4cS0xOSAyNSAtNDQgNDNxLTcgLTEyIC0xNyAtMTZxLTggLTQgLTE4IC00cS0xMSAwIC0xOCA0cS0zMyAxNiAtNzIgMTZxLTM4IDAgLTcxIC0xNiBxLTcgLTQgLTE4IC00cS0xMCAwIC0xOCA0cS0xMiA3IC0xNyAxNnEtMjUgLTE4IC00NCAtNDNxMTEgLTYgMTcgLTE4cTggLTE4IDAgLTM2cS0xNyAtMzYgLTE3IC03MXEwIC0zNiAxNiAtNzFxOSAtMTkgMCAtMzZxLTQgLTExIC0xNiAtMThxMTYgLTIyIDQ0IC00NHE1IDEwIDE3IDE3cTggNCAxOCA0cTExIDAgMTggLTRxMzMgLTE2IDcyIC0xNnEzOCAwIDcxIDE2cTcgNCAxOCA0cTEwIDAgMTggLTR6TTc1IDI4MXEwIC02NCAyMyAtMTMwbDE2NSA0MSBxLTIwIDQ1IC0yMCA4OXEwIDQ1IDIxIDg5bC0xNjYgNDFxLTIzIC02NyAtMjMgLTEzMHpNNDUzIDY1OXEtNjggMCAtMTI5IC0yM2w0MCAtMTY1cTQzIDIwIDg5IDIwcTQ3IDAgOTAgLTIwbDQwIDE2NXEtNjEgMjMgLTEzMCAyM3oiIC8+CjxnbHlwaCB1bmljb2RlPSJpIiBkPSJNNDYwIDY5OXExNzQgMCAyOTcgLTEyM3QxMjMgLTI5N3QtMTIzIC0yOTd0LTI5NyAtMTIzcS0xNzMgMCAtMjk2LjUgMTIzdC0xMjMuNSAyOTd0MTIzLjUgMjk3dDI5Ni41IDEyM3pNNTE0IDU2OXEtMzEgLTEgLTQ5IC0yMnQtMTggLTQ1cTAgLTI1IDEzLjUgLTQwLjV0MzYuNSAtMTUuNWgxcTI5IDAgNDguNSAyMC41dDE5LjUgNDguNXEwIDIzIC0xMyAzN3EtMTUgMTcgLTM5IDE3ek01NjUgOThsMyAzbC0yIDRsLTE4IDM4bC01IC00IHEtMTQgLTE0IC0zNC41IC0yOHQtMjQuNSAtMTV2NXEwIDcgMyAyMGw0NiAxODhxNiAyNSA2IDU3cTAgMTggLTYgMzBxLTcgMTIgLTIyIDEycS0yNSAwIC03MS41IC0yOC41dC05MS41IC03MC41bC0zIC0zbDE2IC00NWw2IDRxMzUgMzEgNTUgMzlxMCAtNiAtMyAtMjFsLTQzIC0xODJxLTYgLTMwIC02IC02MHEwIC0yNSAxMCAtMzZxOSAtMTAgMjYgLTEwcTIzIDAgNzAuNSAyOXQ4OC41IDc0eiIgLz4KPGdseXBoIHVuaWNvZGU9ImoiIGhvcml6LWFkdi14PSI4NzciIGQ9Ik04MzUgMjMydi0xbDEgLTF2LTFxMTkgLTM1IDE5IC03OXEwIC0xOCAtNSAtNDNxLTEyIC00NiAtNDUgLTgwbC02NCAtNjNxLTUxIC01MSAtMTIzIC01MXQtMTIyIDUxbC03NyA3NmwtNDcgNDhsLTMzIDMzcS0zNyAzNyAtNDggOTFxLTIgMjAgLTIgMzFxMCAxNyAzIDM1bDMgMTJxNCAxNSAxNCAzNHYxcTEgMSAyLjUgNGwyLjUgNWwxIDJsMSAxcTEgMSAyLjUgMy41dDIuNSAzLjV2MWwyIDJxMSAxIDMgMy41dDMgMy41djFsMiAybDQgNHQ0IDUgbDI4IDI4bDQgLTVsNTcgLTU2cTAgLTEgMiAtM3QyIC0zdDEgLTMuNXQxIC0zLjVsLTI1IC0yNXEtMSAtMSAtMyAtMy41dC00IC00LjVxMCAtMSAtMSAtMnYtMXEtMiAtMiAtNCAtNnEtMSAwIC0xIC0xdC0xIC0ydC0xLjUgLTMuNXQtMC41IC0zLjVsLTEgLTF2LTJxLTQgLTkgLTQgLTIycTAgLTE1IDcgLTMycTQgLTggMTQgLTIwbDU3IC01N2w0MCAtMzlsNjAgLTYxcTIxIC0yMSA1MiAtMjFxMzIgMCA1MiAyMWw2NCA2NHExMiAxMiAxOCAyOSBxMyAxMSAzIDIzcTAgMTAgLTMgMjFxLTUgMTkgLTE4IDMxbC05OCA5OHExIDYgMSAxN3EwIDIxIC0zIDQwcS0xMiA2OCAtNTkgMTE2cTM5IC0xMiA3MSAtNDJsMiAtMmwxNTcgLTE1N3ExOCAtMTggMjkgLTM5cTAgLTEgMSAtMXpNNTM4IDQ0MXEzOSAtMzkgNDggLTkxcTMgLTE1IDMgLTMxcTAgLTExIC00IC0zNWwtMyAtMTJxLTMgLTEyIC0xMyAtMzRsLTEgLTFxLTEgLTEgLTIuNSAtNGwtMi41IC01bC0xIC0ybC0xIC0xcS0yIC00IC01IC03IGwtMSAtMXEtMSAtMSAtMSAtMnEtMyAtMyAtNSAtN2wtMSAtMWwtMiAtMnEtMiAtMyAtOCAtOWwtMjggLTI4bC00IDVsLTU3IDU2cS0xIDEgLTIgM3QtMiAzdC0xIDMuNXQtMSAzLjVsMjUgMjVxMSAxIDMgMy41dDQgNC41cTAgMSAwLjUgMXQwLjUgMXYxcTIgMiA0IDZsMSAxcTEgMSAxIDJxMiA0IDMgN3YxcTAgMSAxIDJxMyAxMSAzIDIycTAgMTUgLTcgMzJxLTQgOCAtMTQgMjBsLTU3IDU3bC0zOSAzOWwtNjEgNjFxLTIxIDIxIC01MiAyMSB0LTUyIC0yMWwtNjQgLTY0cS0xMiAtMTIgLTE4IC0yOXEtMyAtMTEgLTMgLTIzcTAgLTEwIDMgLTIxcTUgLTE5IDE4IC0zMWw5OCAtOThxLTEgLTYgLTEgLTE3cTAgLTIzIDQgLTQwcTEwIC02NSA1OCAtMTE2cS00MCAxMiAtNzEgNDJsLTIgMmwtMTU3IDE1N3EtMTggMTggLTI5IDM5cTAgMSAtMSAxdjFsLTEgMXYxcS0xOSAzOCAtMTkgNzlxMCAxOCA1IDQzcTEyIDQ2IDQ1IDgwbDY0IDYzcTUxIDUxIDEyMyA1MXQxMjIgLTUxbDc3IC03NiBsNDcgLTQ4eiIgLz4KPGdseXBoIHVuaWNvZGU9ImsiIGhvcml6LWFkdi14PSI4OTYiIGQ9Ik02NTcgNjEwcTg5IDAgMTQ4LjUgLTUwLjV0NTkuNSAtMTU5LjVxMCAtNDkgLTI2IC0xMDF0LTUyIC03OWwtMjYgLTI4bC0zMTMgLTMxMmwtMzEzIDMxMmwtMTEgMTF0LTI1IDMwdC0zMiA0NnQtMjUgNTYuNXQtMTEgNjQuNXEwIDEwOSA1OSAxNTkuNXQxNDggNTAuNXE5MCAwIDE5MSAtMTA3bDE5IC0yMXE0IDUgMTEuNSAxMy41dDMxIDMxdDQ3IDM5dDU2LjUgMzAuNXQ2MyAxNHoiIC8+CjxnbHlwaCB1bmljb2RlPSJsIiBob3Jpei1hZHYteD0iOTQyIiBkPSJNMjc5IDcwMGg2MDV2LTEzM2gtNjA1djEzM3pNMjc5IDI4NHYxMzNoNjA1di0xMzNoLTYwNXpNMjc5IDB2MTMzaDYwNXYtMTMzaC02MDV6TTEyMiA3MDBxMjggMCA0Ny41IC0xOS41dDE5LjUgLTQ2LjVxMCAtMjggLTE5LjUgLTQ3LjV0LTQ3LjUgLTE5LjVxLTI3IDAgLTQ2LjUgMTkuNXQtMTkuNSA0Ny41cTAgMjcgMTkuNSA0Ni41dDQ2LjUgMTkuNXpNMTIyIDQxOHEyOCAwIDQ3LjUgLTE5LjV0MTkuNSAtNDcuNXEwIC0yNyAtMTkuNSAtNDYuNSB0LTQ3LjUgLTE5LjVxLTI3IDAgLTQ2LjUgMTkuNXQtMTkuNSA0Ni41cTAgMjggMTkuNSA0Ny41dDQ2LjUgMTkuNXpNMTIyIDEzNHEyOCAwIDQ3LjUgLTE5LjV0MTkuNSAtNDYuNXEwIC0yOCAtMTkuNSAtNDcuNXQtNDcuNSAtMTkuNXEtMjcgMCAtNDYuNSAxOS41dC0xOS41IDQ3LjVxMCAyNyAxOS41IDQ2LjV0NDYuNSAxOS41eiIgLz4KPGdseXBoIHVuaWNvZGU9Im0iIGhvcml6LWFkdi14PSI4MDgiIGQ9Ik03NzEgNjk4di04M3YtNTE0cS0xIC01MiAtNDYuNSAtODh0LTExMC41IC0zNnQtMTExIDM3dC00NiA4OXQ0NiA4OXQxMTEgMzdxMzYgMCA3MCAtMTN2MzA4bC0zNTIgLTg0di00OTVxLTEgLTUyIC00NyAtODguNXQtMTEwIC0zNi41cS02NSAwIC0xMTEgMzd0LTQ2IDkwcTAgNTIgNDYgODl0MTExIDM3cTM1IDAgNjkgLTEzdjUxM2gybDQzOCAxMDR6IiAvPgo8Z2x5cGggdW5pY29kZT0ibiIgaG9yaXotYWR2LXg9Ijk1NiIgZD0iTTc1OSA3MDBxNTggMCA5OSAtNDF0NDEgLTk5di01NjFxMCAtNTggLTQxIC05OXQtOTkgLTQxaC01NjFxLTU4IDAgLTk5IDQxdC00MSA5OXY1NjFxMCA1OCA0MSA5OXQ5OSA0MWg1NjF6TTc5NCA0OTBoLTUxM3YtMTE3aDUxM3YxMTd6TTI1OSAyMTdoLTk2di0xMTRoOTZ2MTE0ek0xNjMgMjM4aDk2djExNGgtOTZ2LTExNHpNMjgxIDIxN3YtMTE0aDUxM3YxMTRoLTUxM3pNMjgxIDIzOGg1MTN2MTE0aC01MTN2LTExNHpNMjU5IDQ5MGgtOTYgdi0xMTdoOTZ2MTE3ek0xNjMgLTFxMCAtMTQgMTAuNSAtMjQuNXQyNC41IC0xMC41aDYxdjExN2gtOTZ2LTgyek03NTkgLTM2cTE0IDAgMjQuNSAxMC41dDEwLjUgMjQuNXY4MmgtNTEzdi0xMTdoNDc4eiIgLz4KPGdseXBoIHVuaWNvZGU9Im8iIGhvcml6LWFkdi14PSI5NDEiIGQ9Ik04NjcgNTQ1cTExIDAgMTggLTcuNXQ3IC0xNy41di01MjVxMCAtMTEgLTcgLTE4dC0xOCAtN2gtNzg0cS0xMSAwIC0xOCA3dC03IDE4djUyNXEwIDEwIDcgMTcuNXQxOCA3LjVoMzhsMjkgNTlxMTEgMjIgMzYgMjJoMTU4cTI1IDAgMzYgLTIybDI4IC01OWg0NTl6IiAvPgo8Z2x5cGggdW5pY29kZT0icCIgaG9yaXotYWR2LXg9Ijg1NSIgZD0iTTU0MiA1NDlsMTUzIC0xNTNsLTQ2MCAtNDYwdjB2MGwtMjI2IC03NGw3MyAyMjd2MHYwek0xODggNjVsMzc5IDM3OWwtMjUgMjZsLTM4MCAtMzgwek02OTQgNzAxbDE1NCAtMTUzbC0xMDEgLTEwMGwtMTUzIDE1M3oiIC8+CjxnbHlwaCB1bmljb2RlPSJxIiBob3Jpei1hZHYteD0iOTEwIiBkPSJNODY1IDE2MHEwIC00MiAtMjYgLTc1dC02NiAtNDRxMTUgLTQzIDY2IC04MnExMiAtOCAtOSAtMTRxLTQ1IC0xMSAtMTE0IDIxcS01MiAyNSAtOTcgNzFoLTI5OXEtNDIgMCAtNzcgMjdxMzAgMTggNTYgNDNoMjc2cTc0IDAgMTI2LjUgNTIuNXQ1Mi41IDEyNi41djIzNXE0NyAtNSA3OSAtNDB0MzIgLTgzdi0yMzh6TTY5OCAyODZxMCAtNTIgLTM2IC04OHQtODcgLTM2aC0yOThxLTQ5IC01MCAtMTAwIC03MnQtOTAgLTIycS0zNCAwIC0zNCAxMSBxMCAzIDMgNXE1MCAzOCA2NiA4MnEtNDAgMTEgLTY2IDQ0dC0yNiA3NnYyMzdxMCA1MSAzNiA4Ny41dDg4IDM2LjVoNDIxcTUxIDAgODcgLTM2LjV0MzYgLTg3LjV2LTIzN3oiIC8+CjxnbHlwaCB1bmljb2RlPSJyIiBob3Jpei1hZHYteD0iOTAwIiBkPSJNNzI2IDI3OGwyNCAyNGw5MSA5MXYtMjYwcTAgLTEyOCAtMTI4IC0xMjhoLTUwOXYtMTA4bC0xNzEgMTcybDE3MSAxNzJ2LTExNXYtNmg0ODRxMTYgMCAyNyAxMXQxMSAyN3YxMjB6TTE3NCAzMTlsLTI0IC0yNGwtOTEgLTkxdjI2MHEwIDEyNyAxMjggMTI3aDUwOXYxMDhsMTcxIC0xNzFsLTE3MSAtMTcydjExNXY2aC00ODRxLTE2IDAgLTI3IC0xMS41dC0xMSAtMjcuNXYtMTE5eiIgLz4KPGdseXBoIHVuaWNvZGU9InMiIGhvcml6LWFkdi14PSI4NjQiIGQ9Ik04MTYgNHEyMyAtMjMgMjMgLTU0cTAgLTI5IC0yMCAtNDhxLTE5IC0xOSAtNDcgLTE5cS0zMiAwIC01NSAyM2wtMjE5IDIxOXEtNzQgLTQ4IC0xNjYgLTQ4cS0xMjkgMCAtMjIwLjUgOTEuNXQtOTEuNSAyMjAuNXQ5MS41IDIyMC41dDIyMC41IDkxLjV0MjIwLjUgLTkxLjV0OTEuNSAtMjIwLjVxMCAtOTAgLTQ3IC0xNjV6TTUwNiAzODlxMCA3MiAtNTEgMTIzdC0xMjMgNTF0LTEyMyAtNTF0LTUxIC0xMjN0NTEgLTEyM3QxMjMgLTUxIHQxMjMgNTF0NTEgMTIzeiIgLz4KPGdseXBoIHVuaWNvZGU9InQiIGhvcml6LWFkdi14PSI5MTkiIGQ9Ik00NjAgNjk5cTE3MyAwIDI5NiAtMTIzdDEyMyAtMjk2cTAgLTE3NCAtMTIzIC0yOTd0LTI5NiAtMTIzcS0xNzQgMCAtMjk3IDEyM3QtMTIzIDI5N3EwIDE3MyAxMjMgMjk2dDI5NyAxMjN6TTQ2MCAtMzVxMTMwIDAgMjIyIDkyLjV0OTIgMjIyLjV0LTkyIDIyMnQtMjIyIDkydC0yMjIuNSAtOTJ0LTkyLjUgLTIyMnQ5Mi41IC0yMjIuNXQyMjIuNSAtOTIuNXpNNjYzIDE4NnExNCAtMTAgNSAtMjRsLTI0IC0zOXEtNSAtNiAtMTEgLThoLTQgcS01IDAgLTEwIDNsLTE5MyAxMjlxLTEgMSAtMi41IDJ0LTIuNSAxcS01IDcgLTUgMTN2MjI4cTAgNyA1IDEycTcgNSAxMyA1aDQ2cTcgMCAxMiAtNXQ1IC0xMnYtMTkzeiIgLz4KPGdseXBoIHVuaWNvZGU9InUiIGhvcml6LWFkdi14PSI5NTUiIGQ9Ik02MCA2MzFoODM1di02NzNoLTgzNXY2NzN6TTgyNSAyOHY1MzRoLTY5NXYtNTM0aDY5NXpNMjI1IDQzMXEtMTggMCAtMzEgMTN0LTEzIDMxdDEzIDMwLjV0MzEgMTIuNXQzMC41IC0xMi41dDEyLjUgLTMwLjV0LTEyLjUgLTMxdC0zMC41IC0xM3pNNzMxIDQzMXEtMTggMCAtMzEgMTN0LTEzIDMxdDEzIDMwLjV0MzEgMTIuNXQzMC41IC0xMi41dDEyLjUgLTMwLjV0LTEyLjUgLTMxdC0zMC41IC0xM3pNMjI1IDE1OXExOCAwIDMwLjUgLTEzIHQxMi41IC0zMXQtMTIuNSAtMzAuNXQtMzAuNSAtMTIuNXQtMzEgMTIuNXQtMTMgMzAuNXQxMyAzMXQzMSAxM3pNNzMxIDE1OXExOCAwIDMwLjUgLTEzdDEyLjUgLTMxdC0xMi41IC0zMC41dC0zMC41IC0xMi41dC0zMSAxMi41dC0xMyAzMC41dDEzIDMxdDMxIDEzek01OTMgNDU3di0zMjVoLTIyOHYzMjVoMjI4ek01MzMgMTgxdjExOGgtMTA5di0xMThoMTA5eiIgLz4KPGdseXBoIHVuaWNvZGU9InYiIGhvcml6LWFkdi14PSI5NDUiIGQ9Ik04NjYgNTU3cTEwIDAgMTcuNSAtN3Q3LjUgLTE3di00NzJxMCAtMTEgLTcuNSAtMTh0LTE3LjUgLTdoLTc4NnEtMTAgMCAtMTcuNSA3dC03LjUgMTh2NDcycTAgMTAgNy41IDE3dDE3LjUgN2gxNzNxMCAxIDEgMWwyMyA0OHE0IDkgMTUgMTUuNXQyMSA2LjVoMzE5cTI1IDAgMzYgLTIybDI0IC00OHYtMWgxNzR6TTQ3MiAxMjBxNzUgMCAxMjggNTIuNXQ1MyAxMjcuNXQtNTMgMTI4dC0xMjggNTNxLTc0IDAgLTEyNyAtNTN0LTUzIC0xMjggdDUzIC0xMjcuNXQxMjcgLTUyLjV6IiAvPgo8Z2x5cGggdW5pY29kZT0idyIgaG9yaXotYWR2LXg9IjkyNyIgZD0iTTg4NSAzOTdxMTYgLTEzNyAtOTQuNSAtMjQ3dC0yODIuNSAtMTI5cS02MiAtNyAtMTIwIDBxLTkyIC05NSAtMTk3IC0xMDZxLTQ3IC01IC01NiA4cS0zIDQgMyA4cTg4IDY2IDgwIDE0NXEtNjkgMzkgLTExMiA5OHQtNTEgMTMwcS0xNiAxMzYgOTQgMjQ2LjV0MjgyIDEzMC41cTE3MiAxOSAzMDQuNSAtNjR0MTQ5LjUgLTIyMHoiIC8+CjxnbHlwaCB1bmljb2RlPSJ4IiBob3Jpei1hZHYteD0iOTQ5IiBkPSJNNTI2IDEwMHEyIDEwIDIgMTZsOTggOThsMTM5IC0xMzlsOTQgLTY5bDEwIC0zOGwtMTA0IC0xMDRsLTM3IDEwbC03MCA5NHpNNzU1IDIycS0xOCAwIC0zMC41IC0xMi41dC0xMi41IC0zMS41cTAgLTE4IDEyLjUgLTMwLjV0MzAuNSAtMTIuNXExOSAwIDMxLjUgMTIuNXQxMi41IDMwLjVxMCAxOSAtMTIuNSAzMS41dC0zMS41IDEyLjV6TTQ2OSAzNzFsLTk4IC05OHEtNiAwIC0xNiAtMmwtNzEgNzBxLTMyIC0xNSAtNTYgLTE1IHEtNzQgMCAtMTMzLjUgNjB0LTYwLjUgMTM0cTAgMSAxNyAxOHE2MyAtNjMgNzEgLTY4dDQ1IC01cTI5IDAgNjUuNSAzNnQzNi41IDY2cTAgMzYgLTYgNDUuNXQtNjcgNjkuNXExNSAxOCAxOCAxOHE3NCAxIDEzNCAtNTkuNXQ2MCAtMTM0LjVxMCAtMjcgLTE2IC01N3pNNzg2IDIwMnEwIDMgMC41IDcuNXQwLjUgMTguNXQtMS41IDI4dC01LjUgMzJ0LTEwLjUgMzMuNXQtMTkgMzAuNXQtMjguNSAyNGgtM3EtMTAgMCAtMzQgLTIybC0yMTggLTIxNyBxOCAtMjkgLTggLTQ3cS0yIC0xIC03IC02bC0yMDEgLTIwMXEtNSAtNSAtNiAtN3EtMTEgLTExIC0yOSAtMTFxLTQxIDAgLTc3IDQ4dC04IDc3cTMgMiA2IDZsMjAyIDIwMnE1IDMgNiA2cTExIDExIDI4IDExcTkgMCAxOSAtM2wxOTQgMTk0bDQgNnE0IDYgNS41IDh0NSA4LjV0NC41IDExdDEuNSAxMXQtMSAxMy41dC00LjUgMTRxLTE2IDI5IC02MCAzOGgtMXEtMTYgMCAtNTUgMzdsLTYgNnEtMTkgMTkgLTIwIDI1dDE4IDI3bDcyIDczIHExNyAxNyAyNiAxN3E2IDAgMjYgLTIwbDYgLTZxMzMgLTMzIDM3IC00OXE0IC0yMCAyNCAtNDZxMyAtNCAxOCAtNHQxOSAtNGwxMTkgLTExOXE3MyAtNzMgMzAgLTI1MmwtMTUgLTUweiIgLz4KPGdseXBoIHVuaWNvZGU9InkiIGhvcml6LWFkdi14PSI4OTciIGQ9Ik04NDMgMzU5cTkgLTEgMTUuNSAtOXQ2LjUgLTE3di05N3EwIC05IC02LjUgLTE3dC0xNS41IC05bC0xMjQgLTIzcS05IC0yIC0xMiAtOHQyIC0xNGw3MiAtMTA2cTEyIC0xOSAtNCAtMzVsLTY4IC02OHEtMTYgLTE2IC0zNCAtM2wtMTA2IDcxcS03IDUgLTE0LjUgMi41dC04LjUgLTExLjVsLTIzIC0xMjVxLTEgLTkgLTkgLTE1LjV0LTE3IC02LjVoLTk3cS05IDAgLTE3IDYuNXQtOSAxNS41bC0yMyAxMjVxLTEgOSAtOC41IDExLjUgdC0xNC41IC0yLjVsLTEwNSAtNzFxLTIwIC0xMiAtMzUgM2wtNjggNjhxLTE2IDE2IC00IDM1bDcyIDEwNnE1IDggMiAxNHQtMTIgOGwtMTI0IDIzcS05IDEgLTE1LjUgOXQtNi41IDE3djk3cTAgOSA2LjUgMTd0MTUuNSA5bDEyNCAyM3EyMiA2IDEwIDIzbC03MiAxMDZxLTExIDE5IDQgMzRsNjggNjhxMTYgMTYgMzUgNGwxMDUgLTcycTcgLTUgMTQuNSAtMnQ4LjUgMTJsMjMgMTI0cTEgOSA5IDE1LjV0MTcgNi41aDk3cTkgMCAxNyAtNi41IHQ5IC0xNS41bDIzIC0xMjRxMSAtOSA4LjUgLTEydDE0LjUgMmwxMDYgNzJxMTggMTIgMzQgLTRsNjggLTY4cTE1IC0xNSA0IC0zNGwtNzIgLTEwNnEtMTIgLTE3IDEwIC0yM3pNNDQ4IDEzNHE2MyAwIDEwNyA0NHQ0NCAxMDZ0LTQ0IDEwNi41dC0xMDcgNDQuNXEtNjIgMCAtMTA2IC00NC41dC00NCAtMTA2LjV0NDQgLTEwNnQxMDYgLTQ0eiIgLz4KPGdseXBoIHVuaWNvZGU9InoiIGhvcml6LWFkdi14PSI3MzYiIGQ9Ik00MzMgLTMzcTM0IDAgNTUgMjNsMTc2IDE3NmwzOSAtMzlxMTUgLTE1IDAgLTMxbC0yNTQgLTI1NHEtMTUgLTE2IC0zMSAwbC0zNTAgMzUwcS0xNSAxNSAtMTcgMzZsLTggOTdsMzM1IC0zMzVxMjMgLTIzIDU1IC0yM3pNMzUzIDY2NGwzNTAgLTM0OXExNiAtMTYgMCAtMzFsLTI1NCAtMjU1cS03IC02IC0xNiAtNnQtMTUgNmwtMzUwIDM1MHEtMTUgMTcgLTE3IDM3bC0xNyAxOTBxLTIgMjIgMTQgMzZsNDMgNDRxMTUgMTMgMzQgMTNoMyBsMTg5IC0xN3EyMiAtMiAzNiAtMTh6TTExNSA2MTdxLTE0IC0xMyAtMTQgLTMzdDE0IC0zM3ExMyAtMTMgMzMgLTEzdDMzIDEzdDEzIDMzdC0xMyAzM3EtMTQgMTQgLTMzIDE0dC0zMyAtMTR6IiAvPgo8Z2x5cGggdW5pY29kZT0ieyIgaG9yaXotYWR2LXg9Ijc2MiIgZD0iTTc1MSAyOTloLTI3OHYtNDA4aC0xODV2NDA4aC0yNzdsMzcwIDQyOHoiIC8+CjxnbHlwaCB1bmljb2RlPSJ8IiBob3Jpei1hZHYteD0iOTE1IiBkPSJNMTgyIDI4MHEtMyAtMTYgLTMgLTM1di02OXEtNTggMCAtOTguNSA0MC41dC00MC41IDk4LjV2MjQ0cTAgNTggNDAuNSA5OC41dDk4LjUgNDAuNWgzNDhxNTggMCA5OC41IC00MC41dDQwLjUgLTk4LjV2LTEwNWgtMTA0djEwNXEwIDE0IC0xMC41IDI0LjV0LTI0LjUgMTAuNWgtMzQ4cS0xNCAwIC0yNC41IC0xMC41dC0xMC41IC0yNC41di0yNDRxMCAtMTQgMTAuNSAtMjQuNXQyNC41IC0xMC41aDN6TTczNiAzODVxNTcgMCA5OCAtNDEgdDQxIC05OXYtMjQzcTAgLTU4IC00MSAtOTl0LTk4IC00MWgtMzQ4cS01OCAwIC05OC41IDQxdC00MC41IDk5djI0M3EwIDU4IDQwLjUgOTl0OTguNSA0MWgzNDh6TTc3MCAydjI0M3EwIDE1IC0xMCAyNXQtMjQgMTBoLTM0OHEtMTQgMCAtMjQuNSAtMTB0LTEwLjUgLTI1di0yNDNxMCAtMTUgMTAuNSAtMjV0MjQuNSAtMTBoMzQ4cTE0IDAgMjQgMTB0MTAgMjV6IiAvPgo8Z2x5cGggdW5pY29kZT0ifSIgaG9yaXotYWR2LXg9Ijc2MiIgZD0iTTExIDMwMWgyNzd2NDA5aDE4NXYtNDA5aDI3OGwtMzcwIC00Mjd6IiAvPgo8Z2x5cGggdW5pY29kZT0ifiIgZD0iTTQ2MCA2OTlxMTc0IDAgMjk3IC0xMjN0MTIzIC0yOTd0LTEyMyAtMjk3dC0yOTcgLTEyM3QtMjk3IDEyM3QtMTIzIDI5N3QxMjMgMjk3dDI5NyAxMjN6TTYyOCAzNHYyMzJoLTE2NmwxNDUgMTY3aC0xMTJ2MTM1aC03NXYtMTM1aC0xMTJsMTQ0IC0xNjdoLTE2MnYtMjMyaDE0NWwtMzkgLTM5aDEyNmwtMzkgMzloMTQ1ek0zMzMgNzZ2MTQ4aDI1M3YtMTQ4aC0yNTN6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZmY7IiBob3Jpei1hZHYteD0iODMzIiAvPgo8Z2x5cGggaG9yaXotYWR2LXg9IjUwMCIgLz4KPC9mb250Pgo8L2RlZnM+PC9zdmc+IA==') format('svg')}.x-tab .x-button-icon:before,.x-button .x-button-icon:before{font-family:"Pictos"}.x-img.x-img-image{text-align:center}.x-img.x-img-image img{width:auto;height:100%}.x-img.x-img-background{background-repeat:no-repeat;background-position:center;background-size:auto 100%}.x-map{background-color:#edeae2}.x-map *{-webkit-box-sizing:content-box;box-sizing:content-box}.x-mask-map{background:transparent !important}.x-map-container{position:absolute !important;top:0;left:0;right:0;bottom:0}.x-mask{min-width:8.5em;position:absolute;top:0;left:0;bottom:0;right:0;height:100%;z-index:10;display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;background:rgba(0,0,0,0.3) center center no-repeat}.x-mask.x-mask-gray{background-color:rgba(0,0,0,0.5)}.x-mask.x-mask-transparent{background-color:transparent}.x-mask .x-mask-inner{position:relative;background:rgba(0,0,0,0.25);color:#fff;text-align:center;padding:.4em;font-size:.95em;font-weight:bold}.x-mask .x-loading-spinner-outer{display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:100%;min-width:8em;height:8em}.x-mask.x-indicator-hidden .x-mask-inner{padding-bottom:0 !important}.x-mask.x-indicator-hidden .x-loading-spinner-outer{display:none}.x-mask.x-indicator-hidden .x-mask-message{position:relative;bottom:.25em}.x-mask .x-mask-message{position:absolute;bottom:1.7em;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;max-width:13em;min-width:8em}.x-mask.x-has-message .x-mask-inner{padding-bottom:2em}.x-mask.x-has-message .x-loading-spinner-outer{height:7.5em}.x-ie .x-mask[visibility='visible'] ~ div:not(.x-mask) .x-input-el,.x-ie .x-mask[visibility='visible'] ~ div:not(.x-panel) .x-input-el,.x-ie .x-mask[visibility='visible'] ~ div:not(.x-floating) .x-input-el,.x-ie .x-mask[visibility='visible'] ~ div:not(.x-center) .x-input-el,.x-ie .x-mask[visibility='visible'] ~ div:not(.x-msgbox) .x-input-el,.x-ie .x-mask:not(.x-item-hidden) ~ div:not(.x-mask) .x-input-el,.x-ie .x-mask:not(.x-item-hidden) ~ div:not(.x-panel) .x-input-el,.x-ie .x-mask:not(.x-item-hidden) ~ div:not(.x-floating) .x-input-el,.x-ie .x-mask:not(.x-item-hidden) ~ div:not(.x-center) .x-input-el,.x-ie .x-mask:not(.x-item-hidden) ~ div:not(.x-msgbox) .x-input-el{visibility:collapse}.x-video{height:100%;width:100%;background-color:#000}.x-video>*{height:100%;width:100%;position:absolute}.x-video-ghost{-webkit-background-size:100% auto;background:#000 url() center center no-repeat}audio{width:100%}.x-msgbox{min-width:15em;max-width:20em;max-height:90%;margin:6px;border:1px solid #ccc}.x-msgbox .x-docking-vertical{overflow:hidden}.x-msgbox .x-toolbar.x-docked-top{border-bottom:0}.x-msgbox .x-toolbar.x-docked-bottom{border-top:0}.x-ie .x-msgbox .x-dock.x-dock-horizontal.x-unsized>.x-dock-body{-webkit-box-flex:1;-ms-flex:1 0 0px;flex:1 0 0px}.x-msgbox-text{text-align:center}.x-msgbox-buttons .x-button{min-width:4.5em}.x-panel,.x-msgbox{position:relative}.x-panel.x-floating,.x-msgbox,.x-form.x-floating{padding:6px;background-color:#ccc}.x-panel.x-floating .x-panel-inner,.x-panel.x-floating>.x-body,.x-msgbox .x-panel-inner,.x-msgbox>.x-body,.x-form.x-floating .x-panel-inner,.x-form.x-floating>.x-body{z-index:1;background-color:#fff}.x-panel.x-floating>.x-dock,.x-msgbox>.x-dock,.x-form.x-floating>.x-dock{z-index:1}.x-panel.x-floating>.x-dock.x-sized,.x-msgbox>.x-dock.x-sized,.x-form.x-floating>.x-dock.x-sized{margin:6px}.x-sheet,.x-sheet-action{height:auto}.x-toolbar{position:relative;background-color:#eee;min-height:2.6em}.x-toolbar.x-docked-top{border-bottom:1px solid}.x-toolbar.x-docked-bottom{border-top:1px solid}.x-toolbar.x-docked-left{width:50px;height:auto;border-right:1px solid}.x-toolbar.x-docked-right{width:50px;height:auto;border-left:1px solid}.x-title{font-size:1.2em;text-align:center;font-weight:bold;max-width:100%}.x-title .x-innerhtml{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.x-navigation-bar .x-container{overflow:visible}.x-toolbar-inner .x-field .x-component-outer{-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto}.x-ie .x-toolbar-inner{height:100% !important}.x-carousel-inner{position:relative;overflow:hidden}.x-carousel-item,.x-carousel-item>*{position:absolute !important;width:100%;height:100%}.x-carousel-indicator{-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.x-carousel-indicator span{display:block;width:10px;height:10px;margin:3px;background-color:#eee}.x-carousel-indicator span.x-carousel-indicator-active{background-color:#ccc}.x-carousel-indicator-horizontal{width:100%}.x-carousel-indicator-vertical{-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column;height:100%}.x-android-3 .x-surface-wrap,.x-android-3 .x-surface-wrap>*{-webkit-perspective:1}.x-draw-component{position:relative}.x-draw-component .x-inner{overflow:hidden}.x-surface{position:absolute}.x-chart-watermark{opacity:0.5;z-index:9;right:0;bottom:0;background:rgba(0,0,0,0.5);color:white;padding:4px 6px;font-family:"Helvetica";font-size:12px;position:absolute;border-top-left-radius:4px;white-space:nowrap;-webkit-border-top-left-radius:4px}.x-legend .x-legend-inner .x-legend-container{-webkit-border-radius:5px;-moz-border-radius:5px;-ms-border-radius:5px;-o-border-radius:5px;border-radius:5px;border:1px solid #ccc;background:#fff}.x-legend .x-legend-inner .x-legend-container .x-legend-item{padding:0.8em 1em 0.8em 1.8em;color:#333;background:rgba(255,255,255,0);max-width:20em;min-width:0;font-size:14px;line-height:14px;font-weight:bold;white-space:nowrap;position:relative}.x-legend .x-legend-inner .x-legend-container .x-legend-item .x-legend-inactive{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=30);opacity:0.3}.x-legend .x-legend-inner .x-legend-container .x-legend-item .x-legend-item-marker{position:absolute;width:0.8em;height:0.8em;-webkit-border-radius:0.4em;-moz-border-radius:0.4em;-ms-border-radius:0.4em;-o-border-radius:0.4em;border-radius:0.4em;-webkit-box-shadow:rgba(255,255,255,0.3) 0 1px 0,rgba(0,0,0,0.4) 0 1px 0 inset;-moz-box-shadow:rgba(255,255,255,0.3) 0 1px 0,rgba(0,0,0,0.4) 0 1px 0 inset;box-shadow:rgba(255,255,255,0.3) 0 1px 0,rgba(0,0,0,0.4) 0 1px 0 inset;left:.7em;top:1em}.x-legend.x-docked-top .x-legend-item,.x-legend.x-docked-bottom .x-legend-item{border-right:1px solid rgba(204,204,204,0.5)}.x-legend.x-docked-top .x-legend-item:last-child,.x-legend.x-docked-bottom .x-legend-item:last-child{border-right:0}.x-legend.x-docked-left .x-legend-inner,.x-legend.x-docked-right .x-legend-inner{display:-webkit-box;-webkit-box-align:center;-webkit-box-pack:center}.x-chart-toolbar{position:absolute;z-index:9;display:-webkit-box;display:-moz-box;display:-ms-box;display:box;padding:.6em}.x-chart-toolbar .x-button{margin:.2em}.x-chart-toolbar[data-side=left],.x-chart-toolbar[data-side=right]{top:0;-webkit-box-orient:vertical;-moz-box-orient:vertical;-ms-box-orient:vertical;box-orient:vertical}.x-chart-toolbar[data-side=left]{left:0}.x-chart-toolbar[data-side=right]{right:0}.x-chart-toolbar[data-side=top],.x-chart-toolbar[data-side=bottom]{-webkit-box-orient:horizontal;-moz-box-orient:horizontal;-ms-box-orient:horizontal;box-orient:horizontal;right:0}.x-chart-toolbar[data-side=top]{top:0}.x-chart-toolbar[data-side=bottom]{bottom:0;-webkit-box-orient:horizontal;-moz-box-orient:horizontal;-ms-box-orient:horizontal;box-orient:horizontal}.x-tab .x-button-icon.list:before,.x-button .x-button-icon.list:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"l"}.x-tab .x-button-icon.expand:before,.x-button .x-button-icon.expand:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"`"}.x-dataview-inlineblock .x-dataview-item,.x-dataview-inlineblock .x-data-item{display:inline-block !important}.x-dataview-nowrap .x-dataview-container{white-space:nowrap !important}.x-dataview-nowrap .x-container.x-dataview{white-space:nowrap !important}.x-list{overflow:hidden}.x-list .x-scroll-scroller{max-width:100%}.x-list .x-list-inner{width:100% !important}.x-list.x-list-indexed .x-list-disclosure{margin-right:50px}.x-list .x-item-selected .x-list-disclosure{background-color:#fff}.x-list .x-list-scrolldock-hidden{display:none}.x-list .x-list-item{position:absolute !important;left:0;top:0;width:100%}.x-list .x-list-item.x-item-pressed.x-list-item-tpl,.x-list .x-list-item.x-item-pressed .x-dock-horizontal{background-color:#ddd}.x-list .x-list-item>.x-dock{height:auto}.x-list .x-list-item .x-dock-horizontal{border-top:1px solid #ccc}.x-list .x-list-item.x-item-selected .x-dock-horizontal,.x-list .x-list-item.x-item-selected.x-list-item-tpl{background-color:#ccc}.x-list .x-list-item .x-list-item-body,.x-list .x-list-item.x-list-item-tpl .x-innerhtml{padding:5px}.x-list .x-list-item.x-list-item-relative{position:relative !important}.x-list .x-list-header{background-color:#eee;border-top:1px solid #ccc;border-bottom:1px solid #ccc;font-weight:bold}.x-list .x-list-header.x-list-item-relative{position:relative !important}.x-list .x-list-disclosure{margin:5px 15px 5px 0;overflow:visible;width:20px;height:20px;border:1px solid #ccc;background-color:#eee}.x-list .x-list-item-tpl .x-list-disclosure{position:absolute;right:0px;top:0px}.x-list .x-list-emptytext{text-align:center;pointer-events:none;font-size:#333333;display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.x-list.x-list-indexed .x-list-disclosure{margin-right:35px}.x-list .x-list-scrolldockitem{position:absolute !important;left:0;top:0;width:100%}.x-ie .x-list-grouped .x-translatable-container .x-list-item:before,.x-ie .x-list-grouped .x-translatable-container .x-list-header:before{content:". .";color:transparent;position:absolute;left:0px;word-spacing:3000px;opacity:0}.x-list-header{position:absolute;left:0;width:100%;z-index:2 !important}.x-ios .x-list-header{-webkit-transform:translate3d(0, 0, 0);-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-o-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}.x-list-grouped .x-list-item.x-list-header-wrap .x-dock-horizontal,.x-list-grouped .x-list-item-tpl.x-list-header-wrap{border-top:0}.x-list-inlineblock .x-list-item{display:inline-block !important}.x-list-nowrap .x-list-inner{width:auto}.x-list-nowrap .x-list-container{white-space:nowrap !important}.x-indexbar-wrapper{-webkit-box-pack:end !important;-ms-flex-pack:end !important;justify-content:flex-end !important;pointer-events:none}.x-indexbar{pointer-events:auto;z-index:2;min-height:0 !important;height:auto !important;-webkit-box-flex:0 !important;-ms-flex:0 0 auto !important;flex:0 0 auto !important}.x-indexbar>div{font-size:0.6em;text-align:center;line-height:1.1em;font-weight:bold;display:block}.x-indexbar-vertical{width:15px;-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column;margin-right:15px}.x-indexbar-horizontal{height:15px;-webkit-box-orient:horizontal;-ms-flex-direction:row;flex-direction:row}.x-phone.x-landscape .x-indexbar>div{font-size:0.38em;line-height:1em}.x-indexbar-pressed{background-color:#ccc}.x-form-label{display:none !important}.x-form-label span{font-weight:bold}.x-form-label-nowrap .x-form-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.x-field{display:flex;display:-webkit-box;display:-ms-flexbox}.x-field .x-field-input{position:relative;min-width:3.7em}.x-field .x-field-input,.x-field .x-input-el{width:100%}.x-field.x-field-labeled .x-form-label{display:block !important}.x-field .x-component-outer{position:relative}.x-label-align-left,.x-label-align-right{-webkit-box-orient:horizontal !important;-ms-flex-direction:row !important;flex-direction:row !important}.x-label-align-left .x-component-outer,.x-label-align-right .x-component-outer{-webkit-box-flex:1;-ms-flex:1 0 0px;flex:1 0 0px}.x-label-align-right{-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.x-label-align-top,.x-label-align-bottom{-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column}.x-label-align-bottom{-webkit-box-direction:reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}.x-input-el{display:block}.x-field-mask{width:auto;height:auto;position:absolute;top:0;right:0;bottom:0;left:0}.x-ie .x-field.x-field-text .x-field-mask,.x-ie .x-field.x-field-textarea .x-field-mask,.x-ie .x-field.x-field-search .x-field-mask{z-index:-1}.x-field-required .x-form-label:after{content:"*";display:inline}.x-spinner .x-component-outer{display:flex;display:-webkit-box;display:-ms-flexbox}.x-spinner .x-component-outer>*{width:auto}.x-spinner .x-field-input{-webkit-box-flex:1;-ms-flex:1 0 0px;flex:1 0 0px}.x-spinner .x-field-input .x-input-el{width:100%;text-align:center}.x-spinner .x-field-input input::-webkit-outer-spin-button,.x-spinner .x-field-input input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.x-spinner .x-spinner-button{text-align:center;border:1px solid #ccc !important;background-color:#eee}.x-spinner.x-field-grouped-buttons .x-input-el{text-align:left}.x-select-overlay .x-list-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}.x-field-number input::-webkit-outer-spin-button,.x-field-number input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.x-field-input .x-clear-icon{display:none;width:10px;height:10px;background-color:#ccc;position:absolute;top:50%;right:0}.x-field-clearable .x-clear-icon{display:block}.x-field-clearable .x-field-input{padding-right:10px}.x-android .x-input-el{-webkit-text-fill-color:#000}.x-android .x-empty .x-input-el{-webkit-text-fill-color:#A9A9A9}.x-android .x-item-disabled .x-input-el{-webkit-text-fill-color:#b3b3b3}.x-form-fieldset .x-form-fieldset-inner{border:1px solid #ccc;overflow:hidden}.x-form-fieldset .x-dock .x-dock-body{-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto}.x-form-fieldset-title{font-weight:bold}.x-form-fieldset-title .x-innerhtml{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.x-form-fieldset-instructions{text-align:center}.x-ie .x-field-select .x-field-mask{z-index:3}.x-sheet.x-picker{padding:0}.x-sheet.x-picker .x-sheet-inner{background-color:#fff;overflow:hidden}.x-sheet.x-picker .x-sheet-inner .x-picker-slot .x-body{border-left:1px solid #999999;border-right:1px solid #ACACAC}.x-sheet.x-picker .x-sheet-inner .x-picker-slot.x-first .x-body{border-left:0}.x-sheet.x-picker .x-sheet-inner .x-picker-slot.x-last .x-body{border-left:0;border-right:0}.x-picker-slot .x-scroll-view{z-index:2;position:relative}.x-picker-mask{position:absolute;top:0;left:0;right:0;bottom:0;z-index:3;display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;pointer-events:none}.x-picker-slot-title{position:relative;z-index:2}.x-picker-slot-title>div{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-weight:bold}.x-picker-slot .x-dataview-inner{width:100% !important}.x-picker-slot .x-dataview-item{vertical-align:middle;height:30px;line-height:30px}.x-picker-slot .x-dataview-item.x-item-selected{font-weight:bold}.x-picker-slot .x-picker-item{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.x-ie .x-picker-item{cursor:default}.x-ie .x-picker-item::before{content:". .";color:transparent;position:absolute;left:0px;word-spacing:3000px}.x-picker-right{text-align:right}.x-picker-center{text-align:center}.x-picker-left{text-align:left}.x-list-paging .x-loading-spinner{display:none;margin:auto}.x-list-paging .x-list-paging-msg{text-align:center;clear:both}.x-list-paging.x-loading .x-loading-spinner{display:block}.x-list-paging.x-loading .x-list-paging-msg{display:none}.x-list-pullrefresh{display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-orient:horizontal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;position:absolute;top:-5em;left:0;width:100%;height:4.5em}.x-list-pullrefresh .x-loading-spinner{display:none}.x-list-pullrefresh-arrow{width:2.5em;height:4.5em;background-color:#bbb}.x-list-pullrefresh-wrap{width:20em;font-size:0.7em}.x-list-pullrefresh-message{font-weight:bold;font-size:1.3em;text-align:center}.x-list-pullrefresh-updated{text-align:center}.x-list-pullrefresh-loading *.x-loading-spinner{display:block}.x-list-pullrefresh-loading .x-list-pullrefresh-arrow{display:none}.x-android-2 .x-list-pullrefresh-loading *.x-loading-spinner{display:none}.x-slider,.x-toggle{position:relative;height:16px;min-height:0;min-width:0}.x-slider>*,.x-toggle>*{position:absolute;width:100%;height:100%}.x-thumb{position:absolute;height:16px;width:10px;border:1px solid #ccc;background-color:#ddd}.x-slider:before{content:'';position:absolute;width:auto;height:8px;top:4px;left:0;right:0;margin:0 5px;background-color:#eee}.x-toggle{border:1px solid #ccc;width:30px;overflow:hidden;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}.x-toggle-on{background-color:#eee}.x-tab{z-index:1;overflow:visible !important;background-color:#eee;border:1px solid #ccc}.x-tabbar{border-color:#ccc;border-style:solid;border-width:0;background-color:#eee}.x-tabbar.x-docked-top{border-bottom-width:1px}.x-tabbar.x-docked-top .x-tab .x-button-icon{position:relative}.x-tabbar.x-docked-top .x-tab .x-button-icon.x-shown{display:inline-block}.x-tabbar.x-docked-top .x-tab .x-button-icon.x-hidden{display:none}.x-tabbar.x-docked-bottom{border-top-width:1px}.x-tabbar.x-docked-bottom .x-tab .x-button-icon{display:block;position:relative}.x-tabbar.x-docked-bottom .x-tab .x-button-icon.x-shown{visibility:visible}.x-tabbar.x-docked-bottom .x-tab .x-button-icon.x-hidden{visibility:hidden}.x-tab{position:relative;min-width:3.3em}.x-table-inner{display:table !important;width:100% !important;height:100% !important}.x-table-inner.x-fixed-layout{table-layout:fixed !important}.x-table-row{display:table-row !important}.x-table-cell{display:table-cell !important;vertical-align:middle}.x-scroll-view{position:relative;display:block;overflow:hidden}.x-scroll-container{position:absolute;width:100%;height:100%}.x-scroll-scroller{position:absolute;min-width:100%;min-height:100%;width:auto !important;height:auto !important}.x-scroll-stretcher{position:absolute;visibility:hidden}.x-scroll-bar-grid-wrapper{position:absolute;width:100%;height:100%}.x-scroll-bar-grid{display:table;width:100%;height:100%}.x-scroll-bar-grid>*{display:table-row}.x-scroll-bar-grid>*>*{display:table-cell}.x-scroll-bar-grid>:first-child>:first-child{width:100%;height:100%}.x-scroll-bar-grid>:first-child>:nth-child(2){padding:3px 3px 0 0}.x-scroll-bar-grid>:nth-child(2)>:first-child{padding:0 0 3px 3px}.x-scroll-bar{position:relative;overflow:hidden}.x-scroll-bar-stretcher{position:absolute;visibility:hidden;width:100%;height:100%}.x-scroll-bar-x{width:100%}.x-scroll-bar-x>.x-scroll-bar-stretcher{width:300%}.x-scroll-bar-x.active{height:6px}.x-scroll-bar-y{height:100%}.x-scroll-bar-y>.x-scroll-bar-stretcher{height:300%}.x-scroll-bar-y.active{width:6px}.x-scroll-indicator{background:#333;position:absolute;z-index:3}.x-scroll-indicator-x{height:100%}.x-scroll-indicator-y{width:100%}.x-scroll-indicator.rounded{background:none}.x-scroll-indicator.rounded>*{position:absolute;background-color:#333}.x-scroll-indicator.rounded>:nth-child(2){-webkit-transform-origin:0% 0%;background:none;content:url(data:image/bmp;base64,Qk08AAAAAAAAADYAAAAoAAAAAQAAAAEAAAABABAAAAAAAAYAAAASCwAAEgsAAAAAAAAAAAAAxhgAAAAA)}.x-scroll-indicator.rounded.x-scroll-indicator-light>*{background-color:#eee}.x-scroll-indicator.rounded.x-scroll-indicator-light>:nth-child(2){content:url(data:image/bmp;base64,Qk08AAAAAAAAADYAAAAoAAAAAQAAAAEAAAABABAAAAAAAAYAAAASCwAAEgsAAAAAAAAAAAAAvXcAAAAA)}.x-scroll-indicator.rounded.x-scroll-indicator-y>*{width:100%}.x-scroll-indicator.rounded.x-scroll-indicator-y>:first-child{height:3px;-moz-border-radius-topleft:3px;-webkit-border-top-left-radius:3px;-ms-border-top-left-radius:3px;-o-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-topright:3px;-webkit-border-top-right-radius:3px;-ms-border-top-right-radius:3px;-o-border-top-right-radius:3px;border-top-right-radius:3px}.x-scroll-indicator.rounded.x-scroll-indicator-y>:nth-child(2){height:1px}.x-scroll-indicator.rounded.x-scroll-indicator-y>:last-child{height:3px;-moz-border-radius-bottomleft:3px;-webkit-border-bottom-left-radius:3px;-ms-border-bottom-left-radius:3px;-o-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-moz-border-radius-bottomright:3px;-webkit-border-bottom-right-radius:3px;-ms-border-bottom-right-radius:3px;-o-border-bottom-right-radius:3px;border-bottom-right-radius:3px}.x-scroll-indicator.rounded.x-scroll-indicator-x>*{height:100%}.x-scroll-indicator.rounded.x-scroll-indicator-x>:first-child{width:3px;-moz-border-radius-topleft:3px;-webkit-border-top-left-radius:3px;-ms-border-top-left-radius:3px;-o-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-webkit-border-bottom-left-radius:3px;-ms-border-bottom-left-radius:3px;-o-border-bottom-left-radius:3px;border-bottom-left-radius:3px}.x-scroll-indicator.rounded.x-scroll-indicator-x>:nth-child(2){width:1px}.x-scroll-indicator.rounded.x-scroll-indicator-x>:last-child{width:3px;-moz-border-radius-topright:3px;-webkit-border-top-right-radius:3px;-ms-border-top-right-radius:3px;-o-border-top-right-radius:3px;border-top-right-radius:3px;-moz-border-radius-bottomright:3px;-webkit-border-bottom-right-radius:3px;-ms-border-bottom-right-radius:3px;-o-border-bottom-right-radius:3px;border-bottom-right-radius:3px}.x-list-light .x-scroll-indicator,.x-dataview-light .x-scroll-indicator{background:#fff}.x-ios .x-scroll-scroller{-webkit-transform:translate3d(0, 0, 0)}.x-ie .x-scroll-bar-y{position:absolute;margin-left:-5px}html,body{font-family:"Helvetica Neue",HelveticaNeue,"Helvetica-Neue",Helvetica,"BBAlpha Sans",sans-serif}.x-ios.x-tablet .x-landscape *{-webkit-text-stroke:1px transparent}body{font-size:104%}body.x-android.x-phone{font-size:116%}body.x-ios.x-phone{font-size:114%}body.x-desktop{font-size:114%}.x-layout-card-item{background:#eee}.x-loading-spinner{font-size:250%;height:1em;width:1em;position:relative;-webkit-transform-origin:0.5em 0.5em;transform-origin:0.5em 0.5em}.x-loading-spinner>span,.x-loading-spinner>span:before,.x-loading-spinner>span:after{display:block;position:absolute;width:0.1em;height:0.25em;top:0;-webkit-transform-origin:0.05em 0.5em;transform-origin:0.05em 0.5em;content:" "}.x-loading-spinner>span{left:50%;margin-left:-0.05em}.x-loading-spinner>span.x-loading-top{background-color:rgba(170,170,170,0.99)}.x-loading-spinner>span.x-loading-top::after{background-color:rgba(170,170,170,0.9)}.x-loading-spinner>span.x-loading-left::before{background-color:rgba(170,170,170,0.8)}.x-loading-spinner>span.x-loading-left{background-color:rgba(170,170,170,0.7)}.x-loading-spinner>span.x-loading-left::after{background-color:rgba(170,170,170,0.6)}.x-loading-spinner>span.x-loading-bottom::before{background-color:rgba(170,170,170,0.5)}.x-loading-spinner>span.x-loading-bottom{background-color:rgba(170,170,170,0.4)}.x-loading-spinner>span.x-loading-bottom::after{background-color:rgba(170,170,170,0.35)}.x-loading-spinner>span.x-loading-right::before{background-color:rgba(170,170,170,0.3)}.x-loading-spinner>span.x-loading-right{background-color:rgba(170,170,170,0.25)}.x-loading-spinner>span.x-loading-right::after{background-color:rgba(170,170,170,0.2)}.x-loading-spinner>span.x-loading-top::before{background-color:rgba(170,170,170,0.15)}.x-loading-spinner>span.x-loading-top{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg)}.x-loading-spinner>span.x-loading-right{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg)}.x-loading-spinner>span.x-loading-bottom{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg)}.x-loading-spinner>span.x-loading-left{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg)}.x-loading-spinner>span::before{-webkit-transform:rotate(30deg);-moz-transform:rotate(30deg);-ms-transform:rotate(30deg)}.x-loading-spinner>span::after{-webkit-transform:rotate(-30deg);-moz-transform:rotate(-30deg);-ms-transform:rotate(-30deg)}.x-loading-spinner{-webkit-animation-name:x-loading-spinner-rotate;-webkit-animation-duration:.5s;-webkit-animation-iteration-count:infinite;-webkit-animation-timing-function:linear;animation-name:x-loading-spinner-rotate;animation-duration:.5s;animation-timing-function:linear;animation-iteration-count:infinite}html,body{font-family:"Helvetica Neue",HelveticaNeue,"Helvetica-Neue",Helvetica,"BBAlpha Sans",sans-serif}.x-ios.x-tablet .x-landscape *{-webkit-text-stroke:1px transparent}body{font-size:104%}body.x-android.x-phone{font-size:116%}body.x-ios.x-phone{font-size:114%}body.x-desktop{font-size:114%}.x-layout-card-item{background:#eee}.x-button{-webkit-background-clip:padding;-moz-background-clip:padding;background-clip:padding-box;-webkit-border-radius:0.4em;-moz-border-radius:0.4em;-ms-border-radius:0.4em;-o-border-radius:0.4em;border-radius:0.4em;min-height:1.8em;padding:.3em .6em}.x-button,.x-toolbar .x-button{border:1px solid #999;border-top-color:#a6a6a6;background-color:#ccc;color:#000}.x-button.x-button-back:before,.x-button.x-button-forward:before,.x-toolbar .x-button.x-button-back:before,.x-toolbar .x-button.x-button-forward:before{background:#999}.x-button,.x-button.x-button-back:after,.x-button.x-button-forward:after,.x-toolbar .x-button,.x-toolbar .x-button.x-button-back:after,.x-toolbar .x-button.x-button-forward:after{background-image:none;background-color:#ccc;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #f2f2f2), color-stop(3%, #d9d9d9), color-stop(100%, #bfbfbf));background-image:-webkit-linear-gradient(top, #f2f2f2,#d9d9d9 3%,#bfbfbf);background-image:-moz-linear-gradient(top, #f2f2f2,#d9d9d9 3%,#bfbfbf);background-image:-o-linear-gradient(top, #f2f2f2,#d9d9d9 3%,#bfbfbf);background-image:-ms-linear-gradient(top, #f2f2f2,#d9d9d9 3%,#bfbfbf);background-image:linear-gradient(top, #f2f2f2,#d9d9d9 3%,#bfbfbf)}.x-button.x-button-pressing,.x-button.x-button-pressing:after,.x-button.x-button-pressed,.x-button.x-button-pressed:after,.x-button.x-button-active,.x-button.x-button-active:after,.x-toolbar .x-button.x-button-pressing,.x-toolbar .x-button.x-button-pressing:after,.x-toolbar .x-button.x-button-pressed,.x-toolbar .x-button.x-button-pressed:after,.x-toolbar .x-button.x-button-active,.x-toolbar .x-button.x-button-active:after{background-image:none;background-color:#c4c4c4;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ababab), color-stop(10%, #b8b8b8), color-stop(65%, #c4c4c4), color-stop(100%, #c6c6c6));background-image:-webkit-linear-gradient(top, #ababab,#b8b8b8 10%,#c4c4c4 65%,#c6c6c6);background-image:-moz-linear-gradient(top, #ababab,#b8b8b8 10%,#c4c4c4 65%,#c6c6c6);background-image:-o-linear-gradient(top, #ababab,#b8b8b8 10%,#c4c4c4 65%,#c6c6c6);background-image:-ms-linear-gradient(top, #ababab,#b8b8b8 10%,#c4c4c4 65%,#c6c6c6);background-image:linear-gradient(top, #ababab,#b8b8b8 10%,#c4c4c4 65%,#c6c6c6)}.x-button .x-button-icon{width:1.5em;height:1.5em}.x-button .x-button-icon:before{font-size:1.6em;line-height:1em}.x-button.x-item-disabled .x-button-label,.x-button.x-item-disabled .x-badge,.x-button.x-item-disabled .x-hasbadge .x-badge,.x-hasbadge .x-button.x-item-disabled .x-badge,.x-button.x-item-disabled .x-button-icon{opacity:.5}.x-button-round,.x-button.x-button-action-round,.x-button.x-button-confirm-round,.x-button.x-button-decline-round{-webkit-border-radius:0.9em;-moz-border-radius:0.9em;-ms-border-radius:0.9em;-o-border-radius:0.9em;border-radius:0.9em}.x-ie .x-button{height:0px}.x-ie .x-button .x-button-label,.x-ie .x-button .x-badge,.x-ie .x-button .x-hasbadge .x-badge,.x-hasbadge .x-ie .x-button .x-badge{overflow:visible}.x-iconalign-left .x-button-label,.x-iconalign-left .x-badge,.x-iconalign-left .x-hasbadge .x-badge,.x-hasbadge .x-iconalign-left .x-badge{margin-left:.6em}.x-iconalign-right .x-button-label,.x-iconalign-right .x-badge,.x-iconalign-right .x-hasbadge .x-badge,.x-hasbadge .x-iconalign-right .x-badge{margin-right:.6em}.x-iconalign-top,.x-iconalign-bottom{padding-top:.2em !important;padding-bottom:.2em !important}.x-button-label,.x-badge,.x-hasbadge .x-badge{font-weight:bold;line-height:1.2em}.x-toolbar .x-button{margin:6px .2em;padding:0 .6em}.x-toolbar .x-button .x-button-label,.x-toolbar .x-button .x-badge,.x-toolbar .x-button .x-hasbadge .x-badge,.x-hasbadge .x-toolbar .x-button .x-badge{font-size:.7em}.x-toolbar .x-button .x-button-label,.x-toolbar .x-button .x-badge,.x-toolbar .x-button .x-hasbadge .x-badge,.x-hasbadge .x-toolbar .x-button .x-badge,.x-toolbar .x-button .x-hasbadge .x-badge{line-height:1.6em}.x-toolbar .x-button .x-button-icon:before{font-size:1.3em;line-height:1.3em}.x-ie .x-toolbar .x-button .x-button-icon::before{font-size:.6em;line-height:1em}.x-button-small,.x-button.x-button-action-small,.x-button.x-button-confirm-small,.x-button.x-button-decline-small,.x-toolbar .x-button-small,.x-toolbar .x-button.x-button-action-small,.x-toolbar .x-button.x-button-confirm-small,.x-toolbar .x-button.x-button-decline-small{-webkit-border-radius:0.3em;-moz-border-radius:0.3em;-ms-border-radius:0.3em;-o-border-radius:0.3em;border-radius:0.3em;padding:.2em .4em;min-height:0}.x-button-small .x-button-label,.x-button.x-button-action-small .x-button-label,.x-button.x-button-confirm-small .x-button-label,.x-button.x-button-decline-small .x-button-label,.x-button-small .x-badge,.x-button.x-button-action-small .x-badge,.x-button.x-button-confirm-small .x-badge,.x-button.x-button-decline-small .x-badge,.x-button-small .x-hasbadge .x-badge,.x-hasbadge .x-button-small .x-badge,.x-button.x-button-action-small .x-hasbadge .x-badge,.x-hasbadge .x-button.x-button-action-small .x-badge,.x-button.x-button-confirm-small .x-hasbadge .x-badge,.x-hasbadge .x-button.x-button-confirm-small .x-badge,.x-button.x-button-decline-small .x-hasbadge .x-badge,.x-hasbadge .x-button.x-button-decline-small .x-badge,.x-toolbar .x-button-small .x-button-label,.x-toolbar .x-button.x-button-action-small .x-button-label,.x-toolbar .x-button.x-button-confirm-small .x-button-label,.x-toolbar .x-button.x-button-decline-small .x-button-label,.x-toolbar .x-button-small .x-badge,.x-toolbar .x-button.x-button-action-small .x-badge,.x-toolbar .x-button.x-button-confirm-small .x-badge,.x-toolbar .x-button.x-button-decline-small .x-badge,.x-toolbar .x-button-small .x-hasbadge .x-badge,.x-hasbadge .x-toolbar .x-button-small .x-badge,.x-toolbar .x-button.x-button-action-small .x-hasbadge .x-badge,.x-hasbadge .x-toolbar .x-button.x-button-action-small .x-badge,.x-toolbar .x-button.x-button-confirm-small .x-hasbadge .x-badge,.x-hasbadge .x-toolbar .x-button.x-button-confirm-small .x-badge,.x-toolbar .x-button.x-button-decline-small .x-hasbadge .x-badge,.x-hasbadge .x-toolbar .x-button.x-button-decline-small .x-badge{font-size:.6em}.x-button-small .x-button-icon,.x-button.x-button-action-small .x-button-icon,.x-button.x-button-confirm-small .x-button-icon,.x-button.x-button-decline-small .x-button-icon,.x-toolbar .x-button-small .x-button-icon,.x-toolbar .x-button.x-button-action-small .x-button-icon,.x-toolbar .x-button.x-button-confirm-small .x-button-icon,.x-toolbar .x-button.x-button-decline-small .x-button-icon{width:.75em;height:.75em}.x-button-forward,.x-button-back{position:relative;overflow:visible;height:1.7em;z-index:1}.x-webkit .x-button-forward:before,.x-webkit .x-button-forward:after,.x-webkit .x-button-back:before,.x-webkit .x-button-back:after{content:'';position:absolute;width:15px;height:auto;top:-2px;left:auto;bottom:-2px;z-index:2;-webkit-mask:4px 0 url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAABGCAYAAADb7SQ4AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAiNJREFUeNrEWb9LQlEUvj5BcHoQvMnVKXD1D3CLwqBJbHJsazQaWoSCxgbHJiMIAiNok6AhCDdXVycnJ8EQOgeOYaG+d39998KH+HyP753zzjnfd325xfdSgVeV8B6BScuEV0IRSbxHeCMk/AVFXCA8ScQKSXxPqK0fQBBfE5r/D+Y8VzUT9jb94DPimqRYIYkrhGcpKhhxIqTxrpNcExdlQJTTTnRJnCc8ykhUSOIOoZ71ZFfEZ4S2zgUu+rguxZRHEnPbfKRVsOtUl0RtYpOLTYljIS2Z3nVk2DY9SbNCEt8RDm0rUpe4La1jvXSqmtum72raZI24KuNQIYl/nSGSOJb0Jq61M0pxhjwK9304hUjHGSKILzc5Q5drUzttdYY+I97pDH1FzG0zNFUb04gTG4kzJS5kdYauiZtZnaFr4ooKsCIVaDHxKAQxt1NBnGIVHfGCcEQYh3jGU8KBfMKLiyM+lgzAq/qT0ArVTg+Ei1B9fEPoovV4fcfQd2HedScX39GprwGTNjJn0maTELN6IuSzECLB6T5x2eM66jQgnIeSxa60GnS3uL56tr7b1Ai0JPVwYi6yho2U2lgfKym19VxjMRHzEGbvS9K+RBPzetGVUpf29lZHSl2/DMnLvwh1ZMQrKW3Ic4fvJOZS6ZMQW5hpmpT63DvtlFLfm7bBNruM2C2yXb7y3U6ZpRS5P/4jpUjihRTbCJ3q1eL3GMMfAQYAJmB6SBO619IAAAAASUVORK5CYII=') no-repeat;-webkit-mask-size:15px 100%;overflow:hidden}.x-webkit .x-button-back,.x-webkit .x-toolbar .x-button-back{margin-left:0.772em;padding-left:.4em}.x-webkit .x-button-back:before,.x-webkit .x-toolbar .x-button-back:before{left:-15px}.x-webkit .x-button-back:after,.x-webkit .x-toolbar .x-button-back:after{left:-14px}.x-webkit .x-button-forward,.x-webkit .x-toolbar .x-button-forward{margin-right:0.782em;padding-right:.4em}.x-webkit .x-button-forward:before,.x-webkit .x-button-forward:after,.x-webkit .x-toolbar .x-button-forward:before,.x-webkit .x-toolbar .x-button-forward:after{-webkit-mask:-4px 0 url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAABGCAYAAADb7SQ4AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAXlJREFUaN7lmTFqAlEQhh8EhFSCYJXW1law9QAewMrWAwQWAmmtbPcGHiCQ1gPYCla2QsDKSsgmQecvFqImu2/fzry/2OLb9mt23vwz47Kvn5MwEFxM8DkLB6HHEIOd0GGIwUpoMcRgyRKDOUsMJizxpzBiiMFR6DPEeZl1GWKwFh4ZYvAmPDDEqmVWVQxmLPG3MGaIVcosVAz2whNDDDZCmyEG7yFlpiEGKUsMEpb4XKXMtMXeiVVb7J1YLcRgW1ZmVuLSxGopLkys1mLwwhL/mVhjie8Sayxx3kp7DPFVYo0tzhNriyEGU5Z40TjxtDE/F6WcDowHBE/msDFNImG0xZQRBAonDCvxhhH2vKZIZ9Ds+7EDfaWFnKZ4xhja5owxdcnYCAQv1p1Gi4sprn08cZbDt6ZYZasXIn5mLFHTjLCvVt1V+4rVt/M+4r3FPaJMbHaBKRKb3pyKxKZXtv/Er4yjZpRL6q042u34tzh4xV9H/FHnqBHKBQeEd6aqqwD6AAAAAElFTkSuQmCC') no-repeat;-webkit-mask-size:15px 100%}.x-webkit .x-button-forward:before,.x-webkit .x-toolbar .x-button-forward:before{right:-15px}.x-webkit .x-button-forward:after,.x-webkit .x-toolbar .x-button-forward:after{right:-14px}.x-button.x-button-plain,.x-toolbar .x-button.x-button-plain{background:none;border:0 none;min-height:0;text-shadow:none;line-height:auto;height:1.9em;padding:0 0.5em;-webkit-border-radius:none;-moz-border-radius:none;-ms-border-radius:none;-o-border-radius:none;border-radius:none}.x-button.x-button-plain>*,.x-toolbar .x-button.x-button-plain>*{overflow:visible}.x-button.x-button-plain.x-button-pressing,.x-button.x-button-plain.x-button-pressed,.x-toolbar .x-button.x-button-plain.x-button-pressing,.x-toolbar .x-button.x-button-plain.x-button-pressed{background:none;background-image:-webkit-gradient(radial, 50% 50%, 0, 50% 50%, 24, color-stop(0%, rgba(182,225,255,0.7)), color-stop(100%, rgba(182,225,255,0)));background-image:-webkit-radial-gradient(rgba(182,225,255,0.7),rgba(182,225,255,0) 24px);background-image:-moz-radial-gradient(rgba(182,225,255,0.7),rgba(182,225,255,0) 24px);background-image:-o-radial-gradient(rgba(182,225,255,0.7),rgba(182,225,255,0) 24px);background-image:-ms-radial-gradient(rgba(182,225,255,0.7),rgba(182,225,255,0) 24px);background-image:radial-gradient(rgba(182,225,255,0.7),rgba(182,225,255,0) 24px)}.x-segmentedbutton .x-button{margin:0;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0}.x-segmentedbutton .x-button.x-first{-moz-border-radius-topleft:0.4em;-webkit-border-top-left-radius:0.4em;-ms-border-top-left-radius:0.4em;-o-border-top-left-radius:0.4em;border-top-left-radius:0.4em;-moz-border-radius-bottomleft:0.4em;-webkit-border-bottom-left-radius:0.4em;-ms-border-bottom-left-radius:0.4em;-o-border-bottom-left-radius:0.4em;border-bottom-left-radius:0.4em}.x-segmentedbutton .x-button.x-last{-moz-border-radius-topright:0.4em;-webkit-border-top-right-radius:0.4em;-ms-border-top-right-radius:0.4em;-o-border-top-right-radius:0.4em;border-top-right-radius:0.4em;-moz-border-radius-bottomright:0.4em;-webkit-border-bottom-right-radius:0.4em;-ms-border-bottom-right-radius:0.4em;-o-border-bottom-right-radius:0.4em;border-bottom-right-radius:0.4em}.x-segmentedbutton .x-button:not(.x-first){border-left:0}.x-hasbadge{overflow:visible}.x-hasbadge .x-badge{border-color:#900;min-width:2em;line-height:1.2em;top:-0.2em;padding:.1em .3em;-webkit-background-clip:padding;-moz-background-clip:padding;background-clip:padding-box;color:#fcc;background-image:none;background-color:#c00;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ff1a1a), color-stop(3%, #e60000), color-stop(100%, #b30000));background-image:-webkit-linear-gradient(top, #ff1a1a,#e60000 3%,#b30000);background-image:-moz-linear-gradient(top, #ff1a1a,#e60000 3%,#b30000);background-image:-o-linear-gradient(top, #ff1a1a,#e60000 3%,#b30000);background-image:-ms-linear-gradient(top, #ff1a1a,#e60000 3%,#b30000);background-image:linear-gradient(top, #ff1a1a,#e60000 3%,#b30000);-webkit-border-radius:0.2em;-moz-border-radius:0.2em;-ms-border-radius:0.2em;-o-border-radius:0.2em;border-radius:0.2em;text-shadow:rgba(0,0,0,0.5) 0 -0.08em 0;-webkit-box-shadow:rgba(0,0,0,0.5) 0 0.1em 0.1em;-moz-box-shadow:rgba(0,0,0,0.5) 0 0.1em 0.1em;box-shadow:rgba(0,0,0,0.5) 0 0.1em 0.1em}.x-tab .x-button-icon.calendar:before,.x-button .x-button-icon.calendar:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"\005C"}.x-tab .x-button-icon.action:before,.x-button .x-button-icon.action:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"R"}.x-tab .x-button-icon.add:before,.x-button .x-button-icon.add:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"&"}.x-tab .x-button-icon.arrow_down:before,.x-button .x-button-icon.arrow_down:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"}"}.x-tab .x-button-icon.arrow_left:before,.x-button .x-button-icon.arrow_left:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"["}.x-tab .x-button-icon.arrow_right:before,.x-button .x-button-icon.arrow_right:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"]"}.x-tab .x-button-icon.arrow_up:before,.x-button .x-button-icon.arrow_up:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"{"}.x-tab .x-button-icon.compose:before,.x-button .x-button-icon.compose:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"W"}.x-tab .x-button-icon.delete:before,.x-button .x-button-icon.delete:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"*"}.x-tab .x-button-icon.organize:before,.x-button .x-button-icon.organize:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"I"}.x-tab .x-button-icon.refresh:before,.x-button .x-button-icon.refresh:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"1"}.x-tab .x-button-icon.reply:before,.x-button .x-button-icon.reply:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"R"}.x-tab .x-button-icon.search:before,.x-button .x-button-icon.search:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"s"}.x-tab .x-button-icon.settings:before,.x-button .x-button-icon.settings:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"y"}.x-tab .x-button-icon.star:before,.x-button .x-button-icon.star:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"S"}.x-tab .x-button-icon.trash:before,.x-button .x-button-icon.trash:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"#"}.x-tab .x-button-icon.maps:before,.x-button .x-button-icon.maps:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"@"}.x-tab .x-button-icon.locate:before,.x-button .x-button-icon.locate:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"@"}.x-tab .x-button-icon.home:before,.x-button .x-button-icon.home:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"H"}.x-tab .x-button-icon.bookmarks:before,.x-button .x-button-icon.bookmarks:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"I"}.x-tab .x-button-icon.download:before,.x-button .x-button-icon.download:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"~"}.x-tab .x-button-icon.favorites:before,.x-button .x-button-icon.favorites:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"S"}.x-tab .x-button-icon.info:before,.x-button .x-button-icon.info:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"i"}.x-tab .x-button-icon.more:before,.x-button .x-button-icon.more:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"."}.x-tab .x-button-icon.time:before,.x-button .x-button-icon.time:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"t"}.x-tab .x-button-icon.user:before,.x-button .x-button-icon.user:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"U"}.x-tab .x-button-icon.team:before,.x-button .x-button-icon.team:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"g"}.x-button.x-button-action,.x-toolbar .x-button.x-button-action,.x-button.x-button-action-round,.x-toolbar .x-button.x-button-action-round,.x-button.x-button-action-small,.x-toolbar .x-button.x-button-action-small{border:1px solid #002f50;border-top-color:#003e6a;background-color:#006bb6;color:#fff}.x-button.x-button-action.x-button-back:before,.x-button.x-button-action.x-button-forward:before,.x-toolbar .x-button.x-button-action.x-button-back:before,.x-toolbar .x-button.x-button-action.x-button-forward:before,.x-button.x-button-action-round.x-button-back:before,.x-button.x-button-action-round.x-button-forward:before,.x-toolbar .x-button.x-button-action-round.x-button-back:before,.x-toolbar .x-button.x-button-action-round.x-button-forward:before,.x-button.x-button-action-small.x-button-back:before,.x-button.x-button-action-small.x-button-forward:before,.x-toolbar .x-button.x-button-action-small.x-button-back:before,.x-toolbar .x-button.x-button-action-small.x-button-forward:before{background:#002f50}.x-button.x-button-action,.x-button.x-button-action.x-button-back:after,.x-button.x-button-action.x-button-forward:after,.x-toolbar .x-button.x-button-action,.x-toolbar .x-button.x-button-action.x-button-back:after,.x-toolbar .x-button.x-button-action.x-button-forward:after,.x-button.x-button-action-round,.x-button.x-button-action-round.x-button-back:after,.x-button.x-button-action-round.x-button-forward:after,.x-toolbar .x-button.x-button-action-round,.x-toolbar .x-button.x-button-action-round.x-button-back:after,.x-toolbar .x-button.x-button-action-round.x-button-forward:after,.x-button.x-button-action-small,.x-button.x-button-action-small.x-button-back:after,.x-button.x-button-action-small.x-button-forward:after,.x-toolbar .x-button.x-button-action-small,.x-toolbar .x-button.x-button-action-small.x-button-back:after,.x-toolbar .x-button.x-button-action-small.x-button-forward:after{background-image:none;background-color:#006bb6;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #0398ff), color-stop(3%, #007ad0), color-stop(100%, #005c9d));background-image:-webkit-linear-gradient(top, #0398ff,#007ad0 3%,#005c9d);background-image:-moz-linear-gradient(top, #0398ff,#007ad0 3%,#005c9d);background-image:-o-linear-gradient(top, #0398ff,#007ad0 3%,#005c9d);background-image:-ms-linear-gradient(top, #0398ff,#007ad0 3%,#005c9d);background-image:linear-gradient(top, #0398ff,#007ad0 3%,#005c9d)}.x-button.x-button-action.x-button-pressing,.x-button.x-button-action.x-button-pressing:after,.x-button.x-button-action.x-button-pressed,.x-button.x-button-action.x-button-pressed:after,.x-button.x-button-action.x-button-active,.x-button.x-button-action.x-button-active:after,.x-toolbar .x-button.x-button-action.x-button-pressing,.x-toolbar .x-button.x-button-action.x-button-pressing:after,.x-toolbar .x-button.x-button-action.x-button-pressed,.x-toolbar .x-button.x-button-action.x-button-pressed:after,.x-toolbar .x-button.x-button-action.x-button-active,.x-toolbar .x-button.x-button-action.x-button-active:after,.x-button.x-button-action-round.x-button-pressing,.x-button.x-button-action-round.x-button-pressing:after,.x-button.x-button-action-round.x-button-pressed,.x-button.x-button-action-round.x-button-pressed:after,.x-button.x-button-action-round.x-button-active,.x-button.x-button-action-round.x-button-active:after,.x-toolbar .x-button.x-button-action-round.x-button-pressing,.x-toolbar .x-button.x-button-action-round.x-button-pressing:after,.x-toolbar .x-button.x-button-action-round.x-button-pressed,.x-toolbar .x-button.x-button-action-round.x-button-pressed:after,.x-toolbar .x-button.x-button-action-round.x-button-active,.x-toolbar .x-button.x-button-action-round.x-button-active:after,.x-button.x-button-action-small.x-button-pressing,.x-button.x-button-action-small.x-button-pressing:after,.x-button.x-button-action-small.x-button-pressed,.x-button.x-button-action-small.x-button-pressed:after,.x-button.x-button-action-small.x-button-active,.x-button.x-button-action-small.x-button-active:after,.x-toolbar .x-button.x-button-action-small.x-button-pressing,.x-toolbar .x-button.x-button-action-small.x-button-pressing:after,.x-toolbar .x-button.x-button-action-small.x-button-pressed,.x-toolbar .x-button.x-button-action-small.x-button-pressed:after,.x-toolbar .x-button.x-button-action-small.x-button-active,.x-toolbar .x-button.x-button-action-small.x-button-active:after{background-image:none;background-color:#0062a7;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #004474), color-stop(10%, #00538d), color-stop(65%, #0062a7), color-stop(100%, #0064a9));background-image:-webkit-linear-gradient(top, #004474,#00538d 10%,#0062a7 65%,#0064a9);background-image:-moz-linear-gradient(top, #004474,#00538d 10%,#0062a7 65%,#0064a9);background-image:-o-linear-gradient(top, #004474,#00538d 10%,#0062a7 65%,#0064a9);background-image:-ms-linear-gradient(top, #004474,#00538d 10%,#0062a7 65%,#0064a9);background-image:linear-gradient(top, #004474,#00538d 10%,#0062a7 65%,#0064a9)}.x-button.x-button-confirm,.x-toolbar .x-button.x-button-confirm,.x-button.x-button-confirm-round,.x-toolbar .x-button.x-button-confirm-round,.x-button.x-button-confirm-small,.x-toolbar .x-button.x-button-confirm-small{border:1px solid #263501;border-top-color:#374e02;background-color:#6c9804;color:#fff}.x-button.x-button-confirm.x-button-back:before,.x-button.x-button-confirm.x-button-forward:before,.x-toolbar .x-button.x-button-confirm.x-button-back:before,.x-toolbar .x-button.x-button-confirm.x-button-forward:before,.x-button.x-button-confirm-round.x-button-back:before,.x-button.x-button-confirm-round.x-button-forward:before,.x-toolbar .x-button.x-button-confirm-round.x-button-back:before,.x-toolbar .x-button.x-button-confirm-round.x-button-forward:before,.x-button.x-button-confirm-small.x-button-back:before,.x-button.x-button-confirm-small.x-button-forward:before,.x-toolbar .x-button.x-button-confirm-small.x-button-back:before,.x-toolbar .x-button.x-button-confirm-small.x-button-forward:before{background:#263501}.x-button.x-button-confirm,.x-button.x-button-confirm.x-button-back:after,.x-button.x-button-confirm.x-button-forward:after,.x-toolbar .x-button.x-button-confirm,.x-toolbar .x-button.x-button-confirm.x-button-back:after,.x-toolbar .x-button.x-button-confirm.x-button-forward:after,.x-button.x-button-confirm-round,.x-button.x-button-confirm-round.x-button-back:after,.x-button.x-button-confirm-round.x-button-forward:after,.x-toolbar .x-button.x-button-confirm-round,.x-toolbar .x-button.x-button-confirm-round.x-button-back:after,.x-toolbar .x-button.x-button-confirm-round.x-button-forward:after,.x-button.x-button-confirm-small,.x-button.x-button-confirm-small.x-button-back:after,.x-button.x-button-confirm-small.x-button-forward:after,.x-toolbar .x-button.x-button-confirm-small,.x-toolbar .x-button.x-button-confirm-small.x-button-back:after,.x-toolbar .x-button.x-button-confirm-small.x-button-forward:after{background-image:none;background-color:#6c9804;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #a2e306), color-stop(3%, #7eb105), color-stop(100%, #5b7f03));background-image:-webkit-linear-gradient(top, #a2e306,#7eb105 3%,#5b7f03);background-image:-moz-linear-gradient(top, #a2e306,#7eb105 3%,#5b7f03);background-image:-o-linear-gradient(top, #a2e306,#7eb105 3%,#5b7f03);background-image:-ms-linear-gradient(top, #a2e306,#7eb105 3%,#5b7f03);background-image:linear-gradient(top, #a2e306,#7eb105 3%,#5b7f03)}.x-button.x-button-confirm.x-button-pressing,.x-button.x-button-confirm.x-button-pressing:after,.x-button.x-button-confirm.x-button-pressed,.x-button.x-button-confirm.x-button-pressed:after,.x-button.x-button-confirm.x-button-active,.x-button.x-button-confirm.x-button-active:after,.x-toolbar .x-button.x-button-confirm.x-button-pressing,.x-toolbar .x-button.x-button-confirm.x-button-pressing:after,.x-toolbar .x-button.x-button-confirm.x-button-pressed,.x-toolbar .x-button.x-button-confirm.x-button-pressed:after,.x-toolbar .x-button.x-button-confirm.x-button-active,.x-toolbar .x-button.x-button-confirm.x-button-active:after,.x-button.x-button-confirm-round.x-button-pressing,.x-button.x-button-confirm-round.x-button-pressing:after,.x-button.x-button-confirm-round.x-button-pressed,.x-button.x-button-confirm-round.x-button-pressed:after,.x-button.x-button-confirm-round.x-button-active,.x-button.x-button-confirm-round.x-button-active:after,.x-toolbar .x-button.x-button-confirm-round.x-button-pressing,.x-toolbar .x-button.x-button-confirm-round.x-button-pressing:after,.x-toolbar .x-button.x-button-confirm-round.x-button-pressed,.x-toolbar .x-button.x-button-confirm-round.x-button-pressed:after,.x-toolbar .x-button.x-button-confirm-round.x-button-active,.x-toolbar .x-button.x-button-confirm-round.x-button-active:after,.x-button.x-button-confirm-small.x-button-pressing,.x-button.x-button-confirm-small.x-button-pressing:after,.x-button.x-button-confirm-small.x-button-pressed,.x-button.x-button-confirm-small.x-button-pressed:after,.x-button.x-button-confirm-small.x-button-active,.x-button.x-button-confirm-small.x-button-active:after,.x-toolbar .x-button.x-button-confirm-small.x-button-pressing,.x-toolbar .x-button.x-button-confirm-small.x-button-pressing:after,.x-toolbar .x-button.x-button-confirm-small.x-button-pressed,.x-toolbar .x-button.x-button-confirm-small.x-button-pressed:after,.x-toolbar .x-button.x-button-confirm-small.x-button-active,.x-toolbar .x-button.x-button-confirm-small.x-button-active:after{background-image:none;background-color:#628904;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #3e5702), color-stop(10%, #507003), color-stop(65%, #628904), color-stop(100%, #648c04));background-image:-webkit-linear-gradient(top, #3e5702,#507003 10%,#628904 65%,#648c04);background-image:-moz-linear-gradient(top, #3e5702,#507003 10%,#628904 65%,#648c04);background-image:-o-linear-gradient(top, #3e5702,#507003 10%,#628904 65%,#648c04);background-image:-ms-linear-gradient(top, #3e5702,#507003 10%,#628904 65%,#648c04);background-image:linear-gradient(top, #3e5702,#507003 10%,#628904 65%,#648c04)}.x-button.x-button-decline,.x-toolbar .x-button.x-button-decline,.x-button.x-button-decline-round,.x-toolbar .x-button.x-button-decline-round,.x-button.x-button-decline-small,.x-toolbar .x-button.x-button-decline-small{border:1px solid #630303;border-top-color:#7c0303;background-color:#c70505;color:#fff}.x-button.x-button-decline.x-button-back:before,.x-button.x-button-decline.x-button-forward:before,.x-toolbar .x-button.x-button-decline.x-button-back:before,.x-toolbar .x-button.x-button-decline.x-button-forward:before,.x-button.x-button-decline-round.x-button-back:before,.x-button.x-button-decline-round.x-button-forward:before,.x-toolbar .x-button.x-button-decline-round.x-button-back:before,.x-toolbar .x-button.x-button-decline-round.x-button-forward:before,.x-button.x-button-decline-small.x-button-back:before,.x-button.x-button-decline-small.x-button-forward:before,.x-toolbar .x-button.x-button-decline-small.x-button-back:before,.x-toolbar .x-button.x-button-decline-small.x-button-forward:before{background:#630303}.x-button.x-button-decline,.x-button.x-button-decline.x-button-back:after,.x-button.x-button-decline.x-button-forward:after,.x-toolbar .x-button.x-button-decline,.x-toolbar .x-button.x-button-decline.x-button-back:after,.x-toolbar .x-button.x-button-decline.x-button-forward:after,.x-button.x-button-decline-round,.x-button.x-button-decline-round.x-button-back:after,.x-button.x-button-decline-round.x-button-forward:after,.x-toolbar .x-button.x-button-decline-round,.x-toolbar .x-button.x-button-decline-round.x-button-back:after,.x-toolbar .x-button.x-button-decline-round.x-button-forward:after,.x-button.x-button-decline-small,.x-button.x-button-decline-small.x-button-back:after,.x-button.x-button-decline-small.x-button-forward:after,.x-toolbar .x-button.x-button-decline-small,.x-toolbar .x-button.x-button-decline-small.x-button-back:after,.x-toolbar .x-button.x-button-decline-small.x-button-forward:after{background-image:none;background-color:#c70505;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #f91f1f), color-stop(3%, #e00606), color-stop(100%, #ae0404));background-image:-webkit-linear-gradient(top, #f91f1f,#e00606 3%,#ae0404);background-image:-moz-linear-gradient(top, #f91f1f,#e00606 3%,#ae0404);background-image:-o-linear-gradient(top, #f91f1f,#e00606 3%,#ae0404);background-image:-ms-linear-gradient(top, #f91f1f,#e00606 3%,#ae0404);background-image:linear-gradient(top, #f91f1f,#e00606 3%,#ae0404)}.x-button.x-button-decline.x-button-pressing,.x-button.x-button-decline.x-button-pressing:after,.x-button.x-button-decline.x-button-pressed,.x-button.x-button-decline.x-button-pressed:after,.x-button.x-button-decline.x-button-active,.x-button.x-button-decline.x-button-active:after,.x-toolbar .x-button.x-button-decline.x-button-pressing,.x-toolbar .x-button.x-button-decline.x-button-pressing:after,.x-toolbar .x-button.x-button-decline.x-button-pressed,.x-toolbar .x-button.x-button-decline.x-button-pressed:after,.x-toolbar .x-button.x-button-decline.x-button-active,.x-toolbar .x-button.x-button-decline.x-button-active:after,.x-button.x-button-decline-round.x-button-pressing,.x-button.x-button-decline-round.x-button-pressing:after,.x-button.x-button-decline-round.x-button-pressed,.x-button.x-button-decline-round.x-button-pressed:after,.x-button.x-button-decline-round.x-button-active,.x-button.x-button-decline-round.x-button-active:after,.x-toolbar .x-button.x-button-decline-round.x-button-pressing,.x-toolbar .x-button.x-button-decline-round.x-button-pressing:after,.x-toolbar .x-button.x-button-decline-round.x-button-pressed,.x-toolbar .x-button.x-button-decline-round.x-button-pressed:after,.x-toolbar .x-button.x-button-decline-round.x-button-active,.x-toolbar .x-button.x-button-decline-round.x-button-active:after,.x-button.x-button-decline-small.x-button-pressing,.x-button.x-button-decline-small.x-button-pressing:after,.x-button.x-button-decline-small.x-button-pressed,.x-button.x-button-decline-small.x-button-pressed:after,.x-button.x-button-decline-small.x-button-active,.x-button.x-button-decline-small.x-button-active:after,.x-toolbar .x-button.x-button-decline-small.x-button-pressing,.x-toolbar .x-button.x-button-decline-small.x-button-pressing:after,.x-toolbar .x-button.x-button-decline-small.x-button-pressed,.x-toolbar .x-button.x-button-decline-small.x-button-pressed:after,.x-toolbar .x-button.x-button-decline-small.x-button-active,.x-toolbar .x-button.x-button-decline-small.x-button-active:after{background-image:none;background-color:#b80505;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #860303), color-stop(10%, #9f0404), color-stop(65%, #b80505), color-stop(100%, #ba0505));background-image:-webkit-linear-gradient(top, #860303,#9f0404 10%,#b80505 65%,#ba0505);background-image:-moz-linear-gradient(top, #860303,#9f0404 10%,#b80505 65%,#ba0505);background-image:-o-linear-gradient(top, #860303,#9f0404 10%,#b80505 65%,#ba0505);background-image:-ms-linear-gradient(top, #860303,#9f0404 10%,#b80505 65%,#ba0505);background-image:linear-gradient(top, #860303,#9f0404 10%,#b80505 65%,#ba0505)}.x-panel.x-floating,.x-msgbox,.x-form.x-floating{-webkit-border-radius:0.3em;-moz-border-radius:0.3em;-ms-border-radius:0.3em;-o-border-radius:0.3em;border-radius:0.3em;-webkit-box-shadow:rgba(0,0,0,0.8) 0 0.2em 0.6em;-moz-box-shadow:rgba(0,0,0,0.8) 0 0.2em 0.6em;box-shadow:rgba(0,0,0,0.8) 0 0.2em 0.6em;background-image:none;background-color:#03111a}.x-panel.x-floating.x-floating-light,.x-msgbox.x-floating-light,.x-form.x-floating.x-floating-light{background-image:none;background-color:#1985d0}.x-panel.x-floating .x-panel-inner,.x-panel.x-floating>.x-body,.x-msgbox .x-panel-inner,.x-msgbox>.x-body,.x-form.x-floating .x-panel-inner,.x-form.x-floating>.x-body{-webkit-border-radius:0.3em;-moz-border-radius:0.3em;-ms-border-radius:0.3em;-o-border-radius:0.3em;border-radius:0.3em}.x-webkit .x-anchor{position:absolute;overflow:hidden}.x-webkit .x-anchor.x-anchor-top{margin-top:-0.68em;margin-left:-0.816em;width:1.631em;height:0.7em;-webkit-mask:0 0 url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAPCAYAAABut3YUAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAPZJREFUeNpi/PX7LwOFwAyIG6HseiA+Ra5BjBQ6xg+IVwAxJ5T/HYgjgHgTOYYxUeCQUiBeh+QQBih7HVSOLiHDDMSTgTiTgLrpQJwLxH9p5RhOaLT4EakeFF3RQPyF2o6RhkaBGYkheRmIPYH4KbXSjC4QnyTDIch6danhGCcgPgwNGXKBNNQMb0ocEwXE24GYn4FyADJjI76Ej88x7UC8FIjZGKgHQDlxGtRsZmISMMjy+dBQoSXYBC0gv+NyDD80xzgx0AeAqg4fIH6NHk0qQHyMjg6B1WvHYDkNFjIgwS1ALMowMOAjEAeBHINe2Q0U+AUQYACQ10C2QNhRogAAAABJRU5ErkJggg==') no-repeat;-webkit-mask-size:1.631em 0.7em;background-color:#03111a}.x-webkit .x-anchor.x-anchor-bottom{margin-left:-0.816em;width:1.631em;height:0.7em;-webkit-mask:0 0 url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAPCAYAAABut3YUAAAEJGlDQ1BJQ0MgUHJvZmlsZQAAOBGFVd9v21QUPolvUqQWPyBYR4eKxa9VU1u5GxqtxgZJk6XtShal6dgqJOQ6N4mpGwfb6baqT3uBNwb8AUDZAw9IPCENBmJ72fbAtElThyqqSUh76MQPISbtBVXhu3ZiJ1PEXPX6yznfOec7517bRD1fabWaGVWIlquunc8klZOnFpSeTYrSs9RLA9Sr6U4tkcvNEi7BFffO6+EdigjL7ZHu/k72I796i9zRiSJPwG4VHX0Z+AxRzNRrtksUvwf7+Gm3BtzzHPDTNgQCqwKXfZwSeNHHJz1OIT8JjtAq6xWtCLwGPLzYZi+3YV8DGMiT4VVuG7oiZpGzrZJhcs/hL49xtzH/Dy6bdfTsXYNY+5yluWO4D4neK/ZUvok/17X0HPBLsF+vuUlhfwX4j/rSfAJ4H1H0qZJ9dN7nR19frRTeBt4Fe9FwpwtN+2p1MXscGLHR9SXrmMgjONd1ZxKzpBeA71b4tNhj6JGoyFNp4GHgwUp9qplfmnFW5oTdy7NamcwCI49kv6fN5IAHgD+0rbyoBc3SOjczohbyS1drbq6pQdqumllRC/0ymTtej8gpbbuVwpQfyw66dqEZyxZKxtHpJn+tZnpnEdrYBbueF9qQn93S7HQGGHnYP7w6L+YGHNtd1FJitqPAR+hERCNOFi1i1alKO6RQnjKUxL1GNjwlMsiEhcPLYTEiT9ISbN15OY/jx4SMshe9LaJRpTvHr3C/ybFYP1PZAfwfYrPsMBtnE6SwN9ib7AhLwTrBDgUKcm06FSrTfSj187xPdVQWOk5Q8vxAfSiIUc7Z7xr6zY/+hpqwSyv0I0/QMTRb7RMgBxNodTfSPqdraz/sDjzKBrv4zu2+a2t0/HHzjd2Lbcc2sG7GtsL42K+xLfxtUgI7YHqKlqHK8HbCCXgjHT1cAdMlDetv4FnQ2lLasaOl6vmB0CMmwT/IPszSueHQqv6i/qluqF+oF9TfO2qEGTumJH0qfSv9KH0nfS/9TIp0Wboi/SRdlb6RLgU5u++9nyXYe69fYRPdil1o1WufNSdTTsp75BfllPy8/LI8G7AUuV8ek6fkvfDsCfbNDP0dvRh0CrNqTbV7LfEEGDQPJQadBtfGVMWEq3QWWdufk6ZSNsjG2PQjp3ZcnOWWing6noonSInvi0/Ex+IzAreevPhe+CawpgP1/pMTMDo64G0sTCXIM+KdOnFWRfQKdJvQzV1+Bt8OokmrdtY2yhVX2a+qrykJfMq4Ml3VR4cVzTQVz+UoNne4vcKLoyS+gyKO6EHe+75Fdt0Mbe5bRIf/wjvrVmhbqBN97RD1vxrahvBOfOYzoosH9bq94uejSOQGkVM6sN/7HelL4t10t9F4gPdVzydEOx83Gv+uNxo7XyL/FtFl8z9ZAHF4bBsrEwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAY9JREFUSA3FVbFKA0EQfbOXuzMgpLLyG2wVBEHSBSRFSvMNltZi5x9Y2kmqFKLY+QFpBStbK6uAJJe92xt3DkM2yV1yOYg5WG7nzcybx+wOS1GUtElRD+A6dvqRJmZGHMfHKbxnAh/sRg8NU0o7Sor7vj9Aqk4B+vh/MfQJVmd7tdpb1hlHQGMSmz4BTQfb5nagfe9iH/iWIllnnGrD0Pda1n50sO1sGU+B751PhUiRRTGCaRvUBdOdGFv5LHcQeB3LPXb5F4/J9UFrcwmiBztpwZyjskGGgavQV/d5FCvFSEKUJE3Fqm8FNfIIymM05JS7Yei9FOWsFSOJWuOIkb4S8WER0Sqcmb4IqhUEeF8Vl3dnluKFJDXqxDoGS861AGW564QITanOOPXq9h71QGg7WPFWJiawwwD8FAfNPKU6MwvHWKaAQbkX0ImDxPxNTCkhWa48B1VWFJvriTbJRCc8v0wiviqclYRMC8kjawWNZmLMSLCpf9P/pnfGPYlsL48ss7oVgyi9yd65pahywC+kjlEYVbHNjwAAAABJRU5ErkJggg==') no-repeat;-webkit-mask-size:1.631em 0.7em;background-color:#03111a}.x-webkit .x-anchor.x-anchor-left{margin-left:-0.666em;margin-top:-0.35em;height:1.631em;width:0.7em;-webkit-mask:0 0 url('data:image/png;base64,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') no-repeat;-webkit-mask-size:0.7em 1.631em;background-color:#03111a}.x-webkit .x-anchor.x-anchor-right{margin-top:-0.35em;height:1.631em;width:0.7em;-webkit-mask:0 0 url('data:image/png;base64,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') no-repeat;-webkit-mask-size:0.7em 1.631em;background-color:#03111a}.x-floating.x-panel-light:after{background-color:#1985d0}.x-sheet,.x-picker,.x-sheet-action{padding:0.7em;border-top:1px solid #092e47;background-image:none;background-color:rgba(3,17,26,0.9);background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, rgba(11,60,94,0.9)), color-stop(3%, rgba(6,31,49,0.9)), color-stop(100%, rgba(0,2,3,0.9)));background-image:-webkit-linear-gradient(top, rgba(11,60,94,0.9),rgba(6,31,49,0.9) 3%,rgba(0,2,3,0.9));background-image:-moz-linear-gradient(top, rgba(11,60,94,0.9),rgba(6,31,49,0.9) 3%,rgba(0,2,3,0.9));background-image:-o-linear-gradient(top, rgba(11,60,94,0.9),rgba(6,31,49,0.9) 3%,rgba(0,2,3,0.9));background-image:-ms-linear-gradient(top, rgba(11,60,94,0.9),rgba(6,31,49,0.9) 3%,rgba(0,2,3,0.9));background-image:linear-gradient(top, rgba(11,60,94,0.9),rgba(6,31,49,0.9) 3%,rgba(0,2,3,0.9));-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0}.x-sheet-inner>.x-button,.x-sheet-action-inner>.x-button{margin-bottom:0.5em}.x-sheet-inner>.x-button:last-child,.x-sheet-action-inner>.x-button:last-child{margin-bottom:0}.x-msgbox{margin:.5em;border:0.15em solid #1985d0;-webkit-box-shadow:rgba(0,0,0,0.4) 0 0.1em 0.5em;-moz-box-shadow:rgba(0,0,0,0.4) 0 0.1em 0.5em;box-shadow:rgba(0,0,0,0.4) 0 0.1em 0.5em;-webkit-border-radius:0.3em;-moz-border-radius:0.3em;-ms-border-radius:0.3em;-o-border-radius:0.3em;border-radius:0.3em}.x-msgbox .x-icon{margin:0 0.8em 0 0.5em;background:#fff;-webkit-mask-size:100%}.x-msgbox .x-msgbox-info{-webkit-mask-image:url('data:image/png;base64,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')}.x-msgbox .x-msgbox-warning{-webkit-mask-image:url('data:image/png;base64,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')}.x-msgbox .x-msgbox-question{-webkit-mask-image:url('data:image/png;base64,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')}.x-msgbox .x-msgbox-error{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAFGUlEQVRoBe2bzW8VVRxAeS0UMZggaARtGgtNU5pIRCMaEsPChrgh7FhCjHtdEBKNLvwjdOHShSHGmEiMiVFw4cL4EcFoolRSuqBiRDQqCLRS6znDzPP1dub1fbbzLv6S05m57829vzN3Pu+8VhYWFtZ0KyqVygbqHoA74QEYhnmojX4WpuFHuAZz5HSdaVei0mlhJBW7Hx6GJ+AheAwaiS/50rfwGXwNF8nPDdGx6JgwonvJ6hE4CI/DXdBOXGHlz+EEnEb803Yqq65rD7cDFSn4NvwKHh/dwLpt42A7ubpuS7I03Ad74C24DP9AN0Rr67QN27JN2+5rRb5pYRraBC+Bx9ZKiNZKO2+bM/AKbG5WuilhGtgNb4Jn0zCRlV42B3PZ3Yx0w8JUfAQmwcvKSssVtWcu5nSkUemGhKnwKFyE1diFi2SzcnMyt6ONSNcVphJvCl4ATxZZA2WdmqO59tcTLxRmRc/Ez8AvUFbJMC9zNefCM3g9YW8kvocyHbOhYLhsrua8t6iXc4VZYRQ+hJsQVlr2ZXM299E86SXCfNEb/tfhTyi7XFF+5q7DhlB6kTBfqMCzMA1FlfVKuQ66JM8LmXgoPM4XTsIs9IpYUZ466DKeyTr1TJwETztegg7BLhhICnv7jw66HErdEpuqMEvb4Um4O/kkjj+66KRbEokwW2AtS/tgBzgfS+ii077UsbpL30fhBNwLsYVOuum4pg9zz8xj4P7u2FNsoZNuY7q6S3twPwUx9i5aSeim44DC68CxKB/sYw3ddFyn8BBsg5hOVugsCt10HFJ4BGLuXfSS0HFE80HYmBQt/XOdIseJfwfvaDzBlTGy3JRyHNzngTB0HFR4KxSdnS/w2ctwFhxZKHO4t3q1eRV82gtDx60Kb4E7wk/T5d+YTnIPqnjpI73EmnNe6LjFrVJvN3VXya7VeZWUpiyV1ceciyK5Dhd9GGW5W+S2iv+Fg+72eKh3TARfX/XFZfO1h+eg6JLjbec8Z+nSS6c5/k2+/ZAXOs55WboEvqfJu/nYTvlznAHPM3UItMxh5w3BgwVJ6nhJYa+xVyFP2Gv0MYghdLzgVpmCP2IwWsZBxymFz8FlKP1xSo6thm46nlPYrp6EvyDW0E3HqwrPwinwRVSsoZuOs75l83R9Bn4G52MLnXQ7o6s9bMzAR+B+HlvopJuOt4ZpMb/CvF3ulogtdDqVOlbHpZX8DnzQd5QjltBFJ92SyHZpX6p5YB+HH2A++bS3/+igy/HULbGpCqdu7zP9BLxU9XrooItO/wX24SvTnXz6MXgjnj199NrU3HXYucQvLHCZOAzT0GuiWb7mfjjXLbfw1qD886zUiz97MGdzX5vrlldoGbEZ3gAfq7ItV/apuZpz4W8wFx2/oTwrOkh/Am5A2WXN0VwHQ4/a5brCaU+PUMm7UGZpczPHkVq5vPllhWuk3ymptLLmtqxs4pK3FfLKqND3Ni+Ct2rekK/2Lm4O5mJOm/JyzitrqIezFal4PTwNp+EmrJa0bZuDuazP8mtk2pRwViGNDMNr4BPISva2bdmmbQ9n+TQzbUk4a4BGJ8Azo/fh3RS3btuwrYms/Vambf8bD0O4jgM/CgfAXcyfFoT36BS1FIq6634A78FXSLb1YNO2MEkkgbiD9l63x2E/2Ptj0Ky8kmfhJPirWB/tZhD1/rjt6JhwbSbIe3LzBfQ22AV7YAfck+K8MQWOSIjzX8A38BNcQ9Lxto7Gv+RtOqJ9fOwKAAAAAElFTkSuQmCC')}.x-msgbox .x-title{font-size:.9em;line-height:1.4em}.x-msgbox .x-body{background:transparent !important}.x-msgbox .x-toolbar{background:transparent none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.x-msgbox .x-toolbar.x-docked-top{height:1.3em}.x-msgbox .x-field{min-height:2em;background:#fff;-webkit-border-radius:0.2em;-moz-border-radius:0.2em;-ms-border-radius:0.2em;-o-border-radius:0.2em;border-radius:0.2em}.x-msgbox .x-form-field{min-height:1.5em;padding-right:0 !important;-webkit-appearance:none}.x-msgbox .x-field-input{padding-right:2.2em}.x-msgbox-text{padding:6px 0;line-height:1.4em}.x-msgbox-buttons{padding:0.4em 0;height:auto}.x-msgbox-buttons .x-button-normal span{opacity:.7}.x-msgbox-dark .x-msgbox-text{color:rgba(190,224,247,0.9);text-shadow:rgba(0,0,0,0.5) 0 -0.08em 0}.x-msgbox-dark .x-msgbox-input{background-image:none;background-color:rgba(190,224,247,0.9);background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, rgba(144,202,242,0.9)), color-stop(10%, rgba(167,213,244,0.9)), color-stop(65%, rgba(190,224,247,0.9)), color-stop(100%, rgba(192,225,247,0.9)));background-image:-webkit-linear-gradient(top, rgba(144,202,242,0.9),rgba(167,213,244,0.9) 10%,rgba(190,224,247,0.9) 65%,rgba(192,225,247,0.9));background-image:-moz-linear-gradient(top, rgba(144,202,242,0.9),rgba(167,213,244,0.9) 10%,rgba(190,224,247,0.9) 65%,rgba(192,225,247,0.9));background-image:-o-linear-gradient(top, rgba(144,202,242,0.9),rgba(167,213,244,0.9) 10%,rgba(190,224,247,0.9) 65%,rgba(192,225,247,0.9));background-image:-ms-linear-gradient(top, rgba(144,202,242,0.9),rgba(167,213,244,0.9) 10%,rgba(190,224,247,0.9) 65%,rgba(192,225,247,0.9));background-image:linear-gradient(top, rgba(144,202,242,0.9),rgba(167,213,244,0.9) 10%,rgba(190,224,247,0.9) 65%,rgba(192,225,247,0.9));border:0.1em solid rgba(25,133,208,0.9)}.x-toolbar{padding:0 0.2em}.x-toolbar.x-docked-left{width:7em;padding:0.2em}.x-toolbar.x-docked-right{width:7em;padding:0.2em}.x-title{line-height:2.1em;font-size:1.2em;margin:0 0.3em;padding:0 .3em}.x-toolbar-dark{background-image:none;background-color:#1468a2;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #1e93e4), color-stop(3%, #1676b9), color-stop(100%, #11598c));background-image:-webkit-linear-gradient(top, #1e93e4,#1676b9 3%,#11598c);background-image:-moz-linear-gradient(top, #1e93e4,#1676b9 3%,#11598c);background-image:-o-linear-gradient(top, #1e93e4,#1676b9 3%,#11598c);background-image:-ms-linear-gradient(top, #1e93e4,#1676b9 3%,#11598c);background-image:linear-gradient(top, #1e93e4,#1676b9 3%,#11598c);border-color:#000}.x-toolbar-dark .x-title{color:#fff;text-shadow:rgba(0,0,0,0.5) 0 -0.08em 0}.x-toolbar-dark.x-docked-top{border-bottom-color:#000}.x-toolbar-dark.x-docked-bottom{border-top-color:#000}.x-toolbar-dark.x-docked-left{border-right-color:#000}.x-toolbar-dark.x-docked-right{border-left-color:#000}.x-toolbar-dark .x-button,.x-toolbar .x-toolbar-dark .x-button,.x-toolbar-dark .x-field-select .x-component-outer,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer,.x-toolbar-dark .x-field-select .x-component-outer:before,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer:before{border:1px solid #061f31;border-top-color:#092e47;background-color:#11598c;color:#fff}.x-toolbar-dark .x-button.x-button-back:before,.x-toolbar-dark .x-button.x-button-forward:before,.x-toolbar .x-toolbar-dark .x-button.x-button-back:before,.x-toolbar .x-toolbar-dark .x-button.x-button-forward:before,.x-toolbar-dark .x-field-select .x-component-outer.x-button-back:before,.x-toolbar-dark .x-field-select .x-component-outer.x-button-forward:before,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer.x-button-back:before,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer.x-button-forward:before,.x-toolbar-dark .x-field-select .x-component-outer:before.x-button-back:before,.x-toolbar-dark .x-field-select .x-component-outer:before.x-button-forward:before,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer:before.x-button-back:before,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer:before.x-button-forward:before{background:#061f31}.x-toolbar-dark .x-button,.x-toolbar-dark .x-button.x-button-back:after,.x-toolbar-dark .x-button.x-button-forward:after,.x-toolbar .x-toolbar-dark .x-button,.x-toolbar .x-toolbar-dark .x-button.x-button-back:after,.x-toolbar .x-toolbar-dark .x-button.x-button-forward:after,.x-toolbar-dark .x-field-select .x-component-outer,.x-toolbar-dark .x-field-select .x-component-outer.x-button-back:after,.x-toolbar-dark .x-field-select .x-component-outer.x-button-forward:after,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer.x-button-back:after,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer.x-button-forward:after,.x-toolbar-dark .x-field-select .x-component-outer:before,.x-toolbar-dark .x-field-select .x-component-outer:before.x-button-back:after,.x-toolbar-dark .x-field-select .x-component-outer:before.x-button-forward:after,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer:before,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer:before.x-button-back:after,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer:before.x-button-forward:after{background-image:none;background-color:#11598c;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #1985d0), color-stop(3%, #1468a2), color-stop(100%, #0e4b75));background-image:-webkit-linear-gradient(top, #1985d0,#1468a2 3%,#0e4b75);background-image:-moz-linear-gradient(top, #1985d0,#1468a2 3%,#0e4b75);background-image:-o-linear-gradient(top, #1985d0,#1468a2 3%,#0e4b75);background-image:-ms-linear-gradient(top, #1985d0,#1468a2 3%,#0e4b75);background-image:linear-gradient(top, #1985d0,#1468a2 3%,#0e4b75)}.x-toolbar-dark .x-button.x-button-pressing,.x-toolbar-dark .x-button.x-button-pressing:after,.x-toolbar-dark .x-button.x-button-pressed,.x-toolbar-dark .x-button.x-button-pressed:after,.x-toolbar-dark .x-button.x-button-active,.x-toolbar-dark .x-button.x-button-active:after,.x-toolbar .x-toolbar-dark .x-button.x-button-pressing,.x-toolbar .x-toolbar-dark .x-button.x-button-pressing:after,.x-toolbar .x-toolbar-dark .x-button.x-button-pressed,.x-toolbar .x-toolbar-dark .x-button.x-button-pressed:after,.x-toolbar .x-toolbar-dark .x-button.x-button-active,.x-toolbar .x-toolbar-dark .x-button.x-button-active:after,.x-toolbar-dark .x-field-select .x-component-outer.x-button-pressing,.x-toolbar-dark .x-field-select .x-component-outer.x-button-pressing:after,.x-toolbar-dark .x-field-select .x-component-outer.x-button-pressed,.x-toolbar-dark .x-field-select .x-component-outer.x-button-pressed:after,.x-toolbar-dark .x-field-select .x-component-outer.x-button-active,.x-toolbar-dark .x-field-select .x-component-outer.x-button-active:after,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer.x-button-pressing,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer.x-button-pressing:after,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer.x-button-pressed,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer.x-button-pressed:after,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer.x-button-active,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer.x-button-active:after,.x-toolbar-dark .x-field-select .x-component-outer:before.x-button-pressing,.x-toolbar-dark .x-field-select .x-component-outer:before.x-button-pressing:after,.x-toolbar-dark .x-field-select .x-component-outer:before.x-button-pressed,.x-toolbar-dark .x-field-select .x-component-outer:before.x-button-pressed:after,.x-toolbar-dark .x-field-select .x-component-outer:before.x-button-active,.x-toolbar-dark .x-field-select .x-component-outer:before.x-button-active:after,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer:before.x-button-pressing,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer:before.x-button-pressing:after,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer:before.x-button-pressed,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer:before.x-button-pressed:after,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer:before.x-button-active,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer:before.x-button-active:after{background-image:none;background-color:#0f517e;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #0a3351), color-stop(10%, #0c4267), color-stop(65%, #0f517e), color-stop(100%, #0f5280));background-image:-webkit-linear-gradient(top, #0a3351,#0c4267 10%,#0f517e 65%,#0f5280);background-image:-moz-linear-gradient(top, #0a3351,#0c4267 10%,#0f517e 65%,#0f5280);background-image:-o-linear-gradient(top, #0a3351,#0c4267 10%,#0f517e 65%,#0f5280);background-image:-ms-linear-gradient(top, #0a3351,#0c4267 10%,#0f517e 65%,#0f5280);background-image:linear-gradient(top, #0a3351,#0c4267 10%,#0f517e 65%,#0f5280)}.x-toolbar-dark .x-label,.x-toolbar-dark .x-form-label{font-weight:bold;color:#fff;text-shadow:rgba(0,0,0,0.5) 0 -0.08em 0}.x-toolbar-light{background-image:none;background-color:#1985d0;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #4ca9e9), color-stop(3%, #1e93e4), color-stop(100%, #1676b9));background-image:-webkit-linear-gradient(top, #4ca9e9,#1e93e4 3%,#1676b9);background-image:-moz-linear-gradient(top, #4ca9e9,#1e93e4 3%,#1676b9);background-image:-o-linear-gradient(top, #4ca9e9,#1e93e4 3%,#1676b9);background-image:-ms-linear-gradient(top, #4ca9e9,#1e93e4 3%,#1676b9);background-image:linear-gradient(top, #4ca9e9,#1e93e4 3%,#1676b9);border-color:#000}.x-toolbar-light .x-title{color:#fff;text-shadow:rgba(0,0,0,0.5) 0 -0.08em 0}.x-toolbar-light.x-docked-top{border-bottom-color:#000}.x-toolbar-light.x-docked-bottom{border-top-color:#000}.x-toolbar-light.x-docked-left{border-right-color:#000}.x-toolbar-light.x-docked-right{border-left-color:#000}.x-toolbar-light .x-button,.x-toolbar .x-toolbar-light .x-button,.x-toolbar-light .x-field-select .x-component-outer,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer,.x-toolbar-light .x-field-select .x-component-outer:before,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer:before{border:1px solid #0b3c5e;border-top-color:#0e4b75;background-color:#1676b9;color:#fff}.x-toolbar-light .x-button.x-button-back:before,.x-toolbar-light .x-button.x-button-forward:before,.x-toolbar .x-toolbar-light .x-button.x-button-back:before,.x-toolbar .x-toolbar-light .x-button.x-button-forward:before,.x-toolbar-light .x-field-select .x-component-outer.x-button-back:before,.x-toolbar-light .x-field-select .x-component-outer.x-button-forward:before,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer.x-button-back:before,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer.x-button-forward:before,.x-toolbar-light .x-field-select .x-component-outer:before.x-button-back:before,.x-toolbar-light .x-field-select .x-component-outer:before.x-button-forward:before,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer:before.x-button-back:before,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer:before.x-button-forward:before{background:#0b3c5e}.x-toolbar-light .x-button,.x-toolbar-light .x-button.x-button-back:after,.x-toolbar-light .x-button.x-button-forward:after,.x-toolbar .x-toolbar-light .x-button,.x-toolbar .x-toolbar-light .x-button.x-button-back:after,.x-toolbar .x-toolbar-light .x-button.x-button-forward:after,.x-toolbar-light .x-field-select .x-component-outer,.x-toolbar-light .x-field-select .x-component-outer.x-button-back:after,.x-toolbar-light .x-field-select .x-component-outer.x-button-forward:after,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer.x-button-back:after,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer.x-button-forward:after,.x-toolbar-light .x-field-select .x-component-outer:before,.x-toolbar-light .x-field-select .x-component-outer:before.x-button-back:after,.x-toolbar-light .x-field-select .x-component-outer:before.x-button-forward:after,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer:before,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer:before.x-button-back:after,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer:before.x-button-forward:after{background-image:none;background-color:#1676b9;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #359ee7), color-stop(3%, #1985d0), color-stop(100%, #1468a2));background-image:-webkit-linear-gradient(top, #359ee7,#1985d0 3%,#1468a2);background-image:-moz-linear-gradient(top, #359ee7,#1985d0 3%,#1468a2);background-image:-o-linear-gradient(top, #359ee7,#1985d0 3%,#1468a2);background-image:-ms-linear-gradient(top, #359ee7,#1985d0 3%,#1468a2);background-image:linear-gradient(top, #359ee7,#1985d0 3%,#1468a2)}.x-toolbar-light .x-button.x-button-pressing,.x-toolbar-light .x-button.x-button-pressing:after,.x-toolbar-light .x-button.x-button-pressed,.x-toolbar-light .x-button.x-button-pressed:after,.x-toolbar-light .x-button.x-button-active,.x-toolbar-light .x-button.x-button-active:after,.x-toolbar .x-toolbar-light .x-button.x-button-pressing,.x-toolbar .x-toolbar-light .x-button.x-button-pressing:after,.x-toolbar .x-toolbar-light .x-button.x-button-pressed,.x-toolbar .x-toolbar-light .x-button.x-button-pressed:after,.x-toolbar .x-toolbar-light .x-button.x-button-active,.x-toolbar .x-toolbar-light .x-button.x-button-active:after,.x-toolbar-light .x-field-select .x-component-outer.x-button-pressing,.x-toolbar-light .x-field-select .x-component-outer.x-button-pressing:after,.x-toolbar-light .x-field-select .x-component-outer.x-button-pressed,.x-toolbar-light .x-field-select .x-component-outer.x-button-pressed:after,.x-toolbar-light .x-field-select .x-component-outer.x-button-active,.x-toolbar-light .x-field-select .x-component-outer.x-button-active:after,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer.x-button-pressing,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer.x-button-pressing:after,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer.x-button-pressed,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer.x-button-pressed:after,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer.x-button-active,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer.x-button-active:after,.x-toolbar-light .x-field-select .x-component-outer:before.x-button-pressing,.x-toolbar-light .x-field-select .x-component-outer:before.x-button-pressing:after,.x-toolbar-light .x-field-select .x-component-outer:before.x-button-pressed,.x-toolbar-light .x-field-select .x-component-outer:before.x-button-pressed:after,.x-toolbar-light .x-field-select .x-component-outer:before.x-button-active,.x-toolbar-light .x-field-select .x-component-outer:before.x-button-active:after,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer:before.x-button-pressing,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer:before.x-button-pressing:after,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer:before.x-button-pressed,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer:before.x-button-pressed:after,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer:before.x-button-active,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer:before.x-button-active:after{background-image:none;background-color:#156eac;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #0f517e), color-stop(10%, #125f95), color-stop(65%, #156eac), color-stop(100%, #156fae));background-image:-webkit-linear-gradient(top, #0f517e,#125f95 10%,#156eac 65%,#156fae);background-image:-moz-linear-gradient(top, #0f517e,#125f95 10%,#156eac 65%,#156fae);background-image:-o-linear-gradient(top, #0f517e,#125f95 10%,#156eac 65%,#156fae);background-image:-ms-linear-gradient(top, #0f517e,#125f95 10%,#156eac 65%,#156fae);background-image:linear-gradient(top, #0f517e,#125f95 10%,#156eac 65%,#156fae)}.x-toolbar-light .x-label,.x-toolbar-light .x-form-label{font-weight:bold;color:#fff;text-shadow:rgba(0,0,0,0.5) 0 -0.08em 0}.x-toolbar-neutral{background-image:none;background-color:#e0e0e0;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(3%, #ededed), color-stop(100%, #d3d3d3));background-image:-webkit-linear-gradient(top, #ffffff,#ededed 3%,#d3d3d3);background-image:-moz-linear-gradient(top, #ffffff,#ededed 3%,#d3d3d3);background-image:-o-linear-gradient(top, #ffffff,#ededed 3%,#d3d3d3);background-image:-ms-linear-gradient(top, #ffffff,#ededed 3%,#d3d3d3);background-image:linear-gradient(top, #ffffff,#ededed 3%,#d3d3d3);border-color:#616161}.x-toolbar-neutral .x-title{color:#070707;text-shadow:rgba(255,255,255,0.25) 0 0.08em 0}.x-toolbar-neutral.x-docked-top{border-bottom-color:#616161}.x-toolbar-neutral.x-docked-bottom{border-top-color:#616161}.x-toolbar-neutral.x-docked-left{border-right-color:#616161}.x-toolbar-neutral.x-docked-right{border-left-color:#616161}.x-toolbar-neutral .x-button,.x-toolbar .x-toolbar-neutral .x-button,.x-toolbar-neutral .x-field-select .x-component-outer,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer,.x-toolbar-neutral .x-field-select .x-component-outer:before,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer:before{border:1px solid #a0a0a0;border-top-color:#adadad;background-color:#d3d3d3;color:#000}.x-toolbar-neutral .x-button.x-button-back:before,.x-toolbar-neutral .x-button.x-button-forward:before,.x-toolbar .x-toolbar-neutral .x-button.x-button-back:before,.x-toolbar .x-toolbar-neutral .x-button.x-button-forward:before,.x-toolbar-neutral .x-field-select .x-component-outer.x-button-back:before,.x-toolbar-neutral .x-field-select .x-component-outer.x-button-forward:before,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer.x-button-back:before,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer.x-button-forward:before,.x-toolbar-neutral .x-field-select .x-component-outer:before.x-button-back:before,.x-toolbar-neutral .x-field-select .x-component-outer:before.x-button-forward:before,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer:before.x-button-back:before,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer:before.x-button-forward:before{background:#a0a0a0}.x-toolbar-neutral .x-button,.x-toolbar-neutral .x-button.x-button-back:after,.x-toolbar-neutral .x-button.x-button-forward:after,.x-toolbar .x-toolbar-neutral .x-button,.x-toolbar .x-toolbar-neutral .x-button.x-button-back:after,.x-toolbar .x-toolbar-neutral .x-button.x-button-forward:after,.x-toolbar-neutral .x-field-select .x-component-outer,.x-toolbar-neutral .x-field-select .x-component-outer.x-button-back:after,.x-toolbar-neutral .x-field-select .x-component-outer.x-button-forward:after,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer.x-button-back:after,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer.x-button-forward:after,.x-toolbar-neutral .x-field-select .x-component-outer:before,.x-toolbar-neutral .x-field-select .x-component-outer:before.x-button-back:after,.x-toolbar-neutral .x-field-select .x-component-outer:before.x-button-forward:after,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer:before,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer:before.x-button-back:after,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer:before.x-button-forward:after{background-image:none;background-color:#d3d3d3;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #fafafa), color-stop(3%, #e0e0e0), color-stop(100%, #c7c7c7));background-image:-webkit-linear-gradient(top, #fafafa,#e0e0e0 3%,#c7c7c7);background-image:-moz-linear-gradient(top, #fafafa,#e0e0e0 3%,#c7c7c7);background-image:-o-linear-gradient(top, #fafafa,#e0e0e0 3%,#c7c7c7);background-image:-ms-linear-gradient(top, #fafafa,#e0e0e0 3%,#c7c7c7);background-image:linear-gradient(top, #fafafa,#e0e0e0 3%,#c7c7c7)}.x-toolbar-neutral .x-button.x-button-pressing,.x-toolbar-neutral .x-button.x-button-pressing:after,.x-toolbar-neutral .x-button.x-button-pressed,.x-toolbar-neutral .x-button.x-button-pressed:after,.x-toolbar-neutral .x-button.x-button-active,.x-toolbar-neutral .x-button.x-button-active:after,.x-toolbar .x-toolbar-neutral .x-button.x-button-pressing,.x-toolbar .x-toolbar-neutral .x-button.x-button-pressing:after,.x-toolbar .x-toolbar-neutral .x-button.x-button-pressed,.x-toolbar .x-toolbar-neutral .x-button.x-button-pressed:after,.x-toolbar .x-toolbar-neutral .x-button.x-button-active,.x-toolbar .x-toolbar-neutral .x-button.x-button-active:after,.x-toolbar-neutral .x-field-select .x-component-outer.x-button-pressing,.x-toolbar-neutral .x-field-select .x-component-outer.x-button-pressing:after,.x-toolbar-neutral .x-field-select .x-component-outer.x-button-pressed,.x-toolbar-neutral .x-field-select .x-component-outer.x-button-pressed:after,.x-toolbar-neutral .x-field-select .x-component-outer.x-button-active,.x-toolbar-neutral .x-field-select .x-component-outer.x-button-active:after,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer.x-button-pressing,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer.x-button-pressing:after,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer.x-button-pressed,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer.x-button-pressed:after,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer.x-button-active,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer.x-button-active:after,.x-toolbar-neutral .x-field-select .x-component-outer:before.x-button-pressing,.x-toolbar-neutral .x-field-select .x-component-outer:before.x-button-pressing:after,.x-toolbar-neutral .x-field-select .x-component-outer:before.x-button-pressed,.x-toolbar-neutral .x-field-select .x-component-outer:before.x-button-pressed:after,.x-toolbar-neutral .x-field-select .x-component-outer:before.x-button-active,.x-toolbar-neutral .x-field-select .x-component-outer:before.x-button-active:after,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer:before.x-button-pressing,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer:before.x-button-pressing:after,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer:before.x-button-pressed,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer:before.x-button-pressed:after,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer:before.x-button-active,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer:before.x-button-active:after{background-image:none;background-color:#ccc;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #b2b2b2), color-stop(10%, #bfbfbf), color-stop(65%, #cccccc), color-stop(100%, #cdcdcd));background-image:-webkit-linear-gradient(top, #b2b2b2,#bfbfbf 10%,#cccccc 65%,#cdcdcd);background-image:-moz-linear-gradient(top, #b2b2b2,#bfbfbf 10%,#cccccc 65%,#cdcdcd);background-image:-o-linear-gradient(top, #b2b2b2,#bfbfbf 10%,#cccccc 65%,#cdcdcd);background-image:-ms-linear-gradient(top, #b2b2b2,#bfbfbf 10%,#cccccc 65%,#cdcdcd);background-image:linear-gradient(top, #b2b2b2,#bfbfbf 10%,#cccccc 65%,#cdcdcd)}.x-toolbar-neutral .x-label,.x-toolbar-neutral .x-form-label{font-weight:bold;color:#070707;text-shadow:rgba(255,255,255,0.25) 0 0.08em 0}.x-toolbar.x-toolbar-neutral .x-toolbar-inner .x-button.x-button-pressing{background-image:-webkit-gradient(radial, 50% 50%, 0, 50% 50%, 24, color-stop(0%, rgba(122,191,239,0.7)), color-stop(100%, rgba(122,191,239,0)));background-image:-webkit-radial-gradient(rgba(122,191,239,0.7),rgba(122,191,239,0) 24px);background-image:-moz-radial-gradient(rgba(122,191,239,0.7),rgba(122,191,239,0) 24px);background-image:-o-radial-gradient(rgba(122,191,239,0.7),rgba(122,191,239,0) 24px);background-image:-ms-radial-gradient(rgba(122,191,239,0.7),rgba(122,191,239,0) 24px);background-image:radial-gradient(rgba(122,191,239,0.7),rgba(122,191,239,0) 24px)}.x-toolbar.x-toolbar-neutral .x-toolbar-inner .x-button.x-button-pressing .x-button-icon.x-button-mask{background-image:none;background-color:#fff;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #e6e6e6), color-stop(10%, #f2f2f2), color-stop(65%, #ffffff), color-stop(100%, #ffffff));background-image:-webkit-linear-gradient(top, #e6e6e6,#f2f2f2 10%,#ffffff 65%,#ffffff);background-image:-moz-linear-gradient(top, #e6e6e6,#f2f2f2 10%,#ffffff 65%,#ffffff);background-image:-o-linear-gradient(top, #e6e6e6,#f2f2f2 10%,#ffffff 65%,#ffffff);background-image:-ms-linear-gradient(top, #e6e6e6,#f2f2f2 10%,#ffffff 65%,#ffffff);background-image:linear-gradient(top, #e6e6e6,#f2f2f2 10%,#ffffff 65%,#ffffff)}.x-spinner .x-input-el,.x-field-select .x-input-el{-webkit-text-fill-color:#000;-webkit-opacity:1}.x-spinner.x-item-disabled .x-input-el,.x-field-select.x-item-disabled .x-input-el{-webkit-text-fill-color:currentcolor}.x-toolbar .x-field-select .x-input-el{-webkit-text-fill-color:#fff}.x-toolbar .x-field-select.x-item-disabled .x-input-el{-webkit-text-fill-color:rgba(255,255,255,0.6)}.x-toolbar .x-form-field-container{padding:0 .3em}.x-toolbar .x-slider-field .x-component-outer,.x-toolbar .x-toggle-field .x-component-outer{padding:0em .3em}.x-toolbar .x-field{width:13em;margin:.5em;min-height:0;border-bottom:0;background:transparent}.x-toolbar .x-field .x-clear-icon{background-size:50% 50%;right:-0.8em;margin-top:-1.06em}.x-toolbar .x-field-input{padding-right:1.6em !important}.x-toolbar .x-field-textarea .x-component-outer,.x-toolbar .x-field-text .x-component-outer,.x-toolbar .x-field-number .x-component-outer,.x-toolbar .x-field-search .x-component-outer{background-color:#fff;-webkit-border-radius:0.3em;-moz-border-radius:0.3em;-ms-border-radius:0.3em;-o-border-radius:0.3em;border-radius:0.3em;-webkit-box-shadow:rgba(0,0,0,0.5) 0 0.1em 0 inset,rgba(0,0,0,0.5) 0 -0.1em 0 inset,rgba(0,0,0,0.5) 0.1em 0 0 inset,rgba(0,0,0,0.5) -0.1em 0 0 inset,rgba(0,0,0,0.5) 0 0.15em 0.4em inset;-moz-box-shadow:rgba(0,0,0,0.5) 0 0.1em 0 inset,rgba(0,0,0,0.5) 0 -0.1em 0 inset,rgba(0,0,0,0.5) 0.1em 0 0 inset,rgba(0,0,0,0.5) -0.1em 0 0 inset,rgba(0,0,0,0.5) 0 0.15em 0.4em inset;box-shadow:rgba(0,0,0,0.5) 0 0.1em 0 inset,rgba(0,0,0,0.5) 0 -0.1em 0 inset,rgba(0,0,0,0.5) 0.1em 0 0 inset,rgba(0,0,0,0.5) -0.1em 0 0 inset,rgba(0,0,0,0.5) 0 0.15em 0.4em inset}.x-toolbar .x-form-label{background:transparent;border:0;padding:0;line-height:1.4em}.x-toolbar .x-form-field{height:1.6em;color:#6e6e6e;background:transparent;min-height:0;-webkit-appearance:none;padding:0em .3em;margin:0}.x-toolbar .x-form-field:focus{color:#000}.x-toolbar .x-field-select .x-component-outer,.x-toolbar .x-field-search .x-component-outer{-webkit-border-radius:0.8em;-moz-border-radius:0.8em;-ms-border-radius:0.8em;-o-border-radius:0.8em;border-radius:0.8em}.x-toolbar .x-field-search .x-field-input{background-position:.5em 50%}.x-toolbar .x-field-select{-webkit-box-shadow:none}.x-toolbar .x-field-select .x-form-field{height:1.4em}.x-toolbar .x-field-select{background:transparent}.x-toolbar .x-field-select .x-component-outer:after{right:.4em}.x-toolbar .x-field-select.x-item-disabled .x-component-outer:after{opacity:.6}.x-toolbar .x-field-select .x-component-outer:before{width:3em;border-left:none;-moz-border-radius-topright:0.8em;-webkit-border-top-right-radius:0.8em;-ms-border-top-right-radius:0.8em;-o-border-top-right-radius:0.8em;border-top-right-radius:0.8em;-moz-border-radius-bottomright:0.8em;-webkit-border-bottom-right-radius:0.8em;-ms-border-bottom-right-radius:0.8em;-o-border-bottom-right-radius:0.8em;border-bottom-right-radius:0.8em;-webkit-mask:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAABCAYAAACc0f2yAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADJJREFUeNpi/P//PwMjIyMbAwMDOxRzAjEXFHMDMQ8a5kXC6HLcSHo5kcwEmU9TABBgAOcTBAFcRiSpAAAAAElFTkSuQmCC');-webkit-mask-position:right top;-webkit-mask-repeat:repeat-y;-webkit-mask-size:3em 0.05em}.x-toolbar .x-field-select .x-input-text{color:#fff}.x-android .x-field-search .x-field-input{padding-left:.2em !important;padding-right:2.2em !important}.x-carousel-indicator span{width:0.5em;height:0.5em;-webkit-border-radius:0.25em;-moz-border-radius:0.25em;-ms-border-radius:0.25em;-o-border-radius:0.25em;border-radius:0.25em;margin:0.2em}.x-carousel-indicator-horizontal{height:1.5em}.x-carousel-indicator-vertical{width:1.5em}.x-carousel-indicator-light span{background-image:none;background-color:rgba(255,255,255,0.1)}.x-carousel-indicator-light span.x-carousel-indicator-active{background-image:none;background-color:rgba(255,255,255,0.3)}.x-carousel-indicator-dark span{background-image:none;background-color:rgba(0,0,0,0.1)}.x-carousel-indicator-dark span.x-carousel-indicator-active{background-image:none;background-color:rgba(0,0,0,0.3)}.x-form .x-scroll-container{background-color:#eee}.x-form-label{text-shadow:#fff 0 1px 1px;color:#333;text-shadow:rgba(255,255,255,0.25) 0 0.08em 0;padding:0.6em;background-color:#f7f7f7}.x-form-label span{font-size:.8em}.x-form-fieldset{margin:.5em .5em 1.5em}.x-form-fieldset .x-form-label{border-top:1px solid #fff}.x-form-fieldset .x-form-fieldset-inner{border:1px solid #ddd;background:#fff;padding:0;-webkit-border-radius:0.4em;-moz-border-radius:0.4em;-ms-border-radius:0.4em;-o-border-radius:0.4em;border-radius:0.4em}.x-form-fieldset .x-field{border-bottom:1px solid #ddd;background:transparent}.x-form-fieldset .x-field:first-child{-moz-border-radius-topleft:0.4em;-webkit-border-top-left-radius:0.4em;-ms-border-top-left-radius:0.4em;-o-border-top-left-radius:0.4em;border-top-left-radius:0.4em;-moz-border-radius-topright:0.4em;-webkit-border-top-right-radius:0.4em;-ms-border-top-right-radius:0.4em;-o-border-top-right-radius:0.4em;border-top-right-radius:0.4em}.x-form-fieldset .x-field:last-child{border-bottom:0;-moz-border-radius-bottomleft:0.4em;-webkit-border-bottom-left-radius:0.4em;-ms-border-bottom-left-radius:0.4em;-o-border-bottom-left-radius:0.4em;border-bottom-left-radius:0.4em;-moz-border-radius-bottomright:0.4em;-webkit-border-bottom-right-radius:0.4em;-ms-border-bottom-right-radius:0.4em;-o-border-bottom-right-radius:0.4em;border-bottom-right-radius:0.4em}.x-form-fieldset-title{text-shadow:#fff 0 1px 1px;color:#333;margin:1em 0.7em 0.3em;color:#333}.x-form-fieldset-instructions{text-shadow:#fff 0 1px 1px;color:#333;color:gray;margin:1em 0.7em 0.3em;font-size:.8em}.x-label-align-left:first-child .x-form-label{-moz-border-radius-topleft:0.4em;-webkit-border-top-left-radius:0.4em;-ms-border-top-left-radius:0.4em;-o-border-top-left-radius:0.4em;border-top-left-radius:0.4em}.x-label-align-left:last-child .x-form-label{-moz-border-radius-bottomleft:0.4em;-webkit-border-bottom-left-radius:0.4em;-ms-border-bottom-left-radius:0.4em;-o-border-bottom-left-radius:0.4em;border-bottom-left-radius:0.4em}.x-label-align-right:first-child .x-form-label{-moz-border-radius-topright:0.4em;-webkit-border-top-right-radius:0.4em;-ms-border-top-right-radius:0.4em;-o-border-top-right-radius:0.4em;border-top-right-radius:0.4em}.x-label-align-right:last-child{border-bottom:0}.x-label-align-right:last-child .x-form-label{-moz-border-radius-bottomright:0.4em;-webkit-border-bottom-right-radius:0.4em;-ms-border-bottom-right-radius:0.4em;-o-border-bottom-right-radius:0.4em;border-bottom-right-radius:0.4em}.x-label-align-top:first-child .x-form-label{-moz-border-radius-topleft:0.4em;-webkit-border-top-left-radius:0.4em;-ms-border-top-left-radius:0.4em;-o-border-top-left-radius:0.4em;border-top-left-radius:0.4em;-moz-border-radius-topright:0.4em;-webkit-border-top-right-radius:0.4em;-ms-border-top-right-radius:0.4em;-o-border-top-right-radius:0.4em;border-top-right-radius:0.4em}.x-label-align-bottom:last-child .x-form-label{-moz-border-radius-bottomleft:0.4em;-webkit-border-bottom-left-radius:0.4em;-ms-border-bottom-left-radius:0.4em;-o-border-bottom-left-radius:0.4em;border-bottom-left-radius:0.4em;-moz-border-radius-bottomright:0.4em;-webkit-border-bottom-right-radius:0.4em;-ms-border-bottom-right-radius:0.4em;-o-border-bottom-right-radius:0.4em;border-bottom-right-radius:0.4em}.x-field{min-height:2.5em;background:#fff}.x-field:last-child{border-bottom:0}.x-field-input .x-clear-icon{background:url('data:image/png;base64,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') no-repeat;background-position:center center;background-size:55% 55%;width:2.2em;height:2.2em;margin:.5em;margin-top:-1.1em;right:-0.5em}.x-field-clearable .x-field-input{padding-right:2.2em}.x-input-el{padding:.4em;min-height:2.5em;border-width:0;-webkit-appearance:none}.x-ie .x-input-el{background:transparent}.x-item-disabled .x-form-label,.x-item-disabled input,.x-item-disabled .x-input-el,.x-item-disabled .x-spinner-body,.x-item-disabled select,.x-item-disabled textarea,.x-item-disabled .x-field-clear-container{color:#b3b3b3;pointer-events:none}.x-item-disabled .x-form-label{color:#aaa}.x-item-disabled .x-form-label:after{color:#666 !important}.x-checkmark-base,.x-field-checkbox .x-field-mask::after,.x-field-radio .x-field-mask::after,.x-select-overlay .x-item-selected.x-list-item::after{position:absolute;top:0;right:10px;bottom:0;content:'3';font-family:'Pictos';font-size:1.6em;text-align:right;line-height:1.6em}.x-field-checkbox .x-field-mask::after,.x-field-radio .x-field-mask::after{color:#ddd}.x-input-checkbox,.x-input-radio{visibility:hidden}.x-input-el:checked+.x-field-mask::after{color:#006bb6}.x-item-disabled.x-field-checkbox .x-input-checkbox:checked+.x-field-mask::after{color:#84afcd}.x-field-radio .x-field-mask{position:absolute;top:0;right:0;bottom:0;left:0}.x-field-radio .x-field-mask::after{content:'';position:absolute;width:16px;height:16px;top:16px;left:auto;right:16px;background-color:#d0d0d0;-webkit-border-radius:16px;-moz-border-radius:16px;-ms-border-radius:16px;-o-border-radius:16px;border-radius:16px}.x-field-radio .x-field-mask::before{content:'';position:absolute;width:26px;height:26px;top:11px;left:auto;right:11px;background-color:#ddd;-webkit-border-radius:26px;-moz-border-radius:26px;-ms-border-radius:26px;-o-border-radius:26px;border-radius:26px}.x-input-radio:checked+.x-field-mask::after{background:#006bb6}.x-item-disabled.x-field-radio .x-input-radio:checked+.x-field-mask::after{background:#84afcd}.x-field-search .x-field-input{position:relative}.x-field-search .x-field-input:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"s"}.x-field-search .x-field-input:before{color:#ccc;top:.3em;left:.5em;font-size:1.1em;right:auto}.x-field-search .x-field-input .x-form-field{margin-left:1.35em}.x-webkit .x-selectmark-base,.x-webkit .x-field-select .x-component-outer:after,.x-field-select .x-webkit .x-component-outer:after{content:'';position:absolute;width:1em;height:1em;top:50%;left:auto;right:0.7em;-webkit-mask-size:1em;-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpGRTdGMTE3NDA3MjA2ODExOTJDQUMyNUQwRUE4NjdEQiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoxQTFBMDFDQ0I5NEYxMURGQUU1RjlGMEFERUNDQTVEMCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoyMkRCMDIxMkI5NEUxMURGQUU1RjlGMEFERUNDQTVEMCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IE1hY2ludG9zaCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjMwRTE0QzVBNDIyMjY4MTFCQ0ZCOTAzOTcwNzcyRkVCIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkZFN0YxMTc0MDcyMDY4MTE5MkNBQzI1RDBFQTg2N0RCIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+HfrH/AAAAeVJREFUeNrs2cFHBGEUAPA3zYqIiIhOnTpFRHSKrp26RqeuEV077R/QqWtE166dOkVERHRa9hQRnZalFcv0Hk/W1Mx+38z3vvlm5j3eZW+/9+abne+9KEkSaFPMQMtCwQpWsIIVrGAFK1jBClawgo2ik/4hiqJGwLKuvfpIc5xSkWqYr5hzU1s/mRNxXTPsJ+ZqluvXlwOmSj3XBDvG3M1rpAmYYoUrFzr4ZNqTawqm2MH8Dhh7ZXJUbcAUx4FinzBnJcAUl4FhP/jIgRSYKvkYCJaO2LbNv08RMMUy5nsA4COTLy0XYIqtil9iF6aflq7AwBWuAvuQ9ZKSBgNX2ieWjtKSzeXBNZgqfe8J+4W5aXtbcg0GrvibB/BhkeuhBJhigzsghT0veh+WAlMcCGHvMOMQwcCdcIntYy6WmXhIg2PuiAvsEHO97IhHGgzckb4D8L6LmZYPMHBnhiWwXVdDPF9g4A4Vwd66nFr6BAN3ygbbw1yoMzjmjplgB5hrrufSvsHAHesZDOD2JAbxVYCBOzfIAZ9JbR6qAgN3cPwP9kZy1VIlGLiTdluCmoOBO/pnS9Bk8DzmS3pL4BMcpZEe1qX0GI/atC4dQYXRMa1MU0IX4gpWsIIVrGAFK1jBCnYUPwIMAPUPAyFL+nRdAAAAAElFTkSuQmCC');margin-top:-0.5em}.x-field-select{position:relative;z-index:1}.x-field-select .x-component-outer:after{z-index:2;background-color:#ddd}.x-field-select .x-component-outer:before,.x-field-select .x-component-outer:after{pointer-events:none;position:absolute;display:block}.x-field-select .x-component-outer:before{z-index:1;content:'';position:absolute;width:4em;height:auto;top:0;left:auto;right:0;bottom:0;-moz-border-radius-topright:0.4em;-webkit-border-top-right-radius:0.4em;-ms-border-top-right-radius:0.4em;-o-border-top-right-radius:0.4em;border-top-right-radius:0.4em;-moz-border-radius-bottomright:0.4em;-webkit-border-bottom-right-radius:0.4em;-ms-border-bottom-right-radius:0.4em;-o-border-bottom-right-radius:0.4em;border-bottom-right-radius:0.4em;background-image:-webkit-gradient(linear, 0% 50%, 100% 50%, color-stop(0%, rgba(255,255,255,0)), color-stop(50%, #ffffff));background-image:-webkit-linear-gradient(left, rgba(255,255,255,0),#ffffff 50%);background-image:-moz-linear-gradient(left, rgba(255,255,255,0),#ffffff 50%);background-image:-o-linear-gradient(left, rgba(255,255,255,0),#ffffff 50%);background-image:-ms-linear-gradient(left, rgba(255,255,255,0),#ffffff 50%);background-image:linear-gradient(left, rgba(255,255,255,0),#ffffff 50%)}.x-select-overlay .x-list-item-label{height:2.6em}.x-select-overlay .x-item-selected .x-list-label{margin-right:2.6em}.x-select-overlay .x-item-selected.x-list-item::after{color:#ddd}.x-slider-field .x-component-outer,.x-toggle-field .x-component-outer{padding:0.6em}.x-spinner .x-field-input .x-input-el{-webkit-text-fill-color:#000}.x-spinner.x-item-disabled .x-input-el{-webkit-text-fill-color:#B3B3B3}.x-spinner.x-item-disabled .x-spinner-button{color:#aaa !important}.x-spinner.x-item-disabled .x-spinner-button,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button{border:1px solid #c4c4c4;border-top-color:#d0d0d0;background-color:#f7f7f7;color:#1e1e1e}.x-spinner.x-item-disabled .x-spinner-button.x-button-back:before,.x-spinner.x-item-disabled .x-spinner-button.x-button-forward:before,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-back:before,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-forward:before{background:#c4c4c4}.x-spinner.x-item-disabled .x-spinner-button,.x-spinner.x-item-disabled .x-spinner-button.x-button-back:after,.x-spinner.x-item-disabled .x-spinner-button.x-button-forward:after,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-back:after,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-forward:after{background-image:none;background-color:#f7f7f7;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(3%, #ffffff), color-stop(100%, #eaeaea));background-image:-webkit-linear-gradient(top, #ffffff,#ffffff 3%,#eaeaea);background-image:-moz-linear-gradient(top, #ffffff,#ffffff 3%,#eaeaea);background-image:-o-linear-gradient(top, #ffffff,#ffffff 3%,#eaeaea);background-image:-ms-linear-gradient(top, #ffffff,#ffffff 3%,#eaeaea);background-image:linear-gradient(top, #ffffff,#ffffff 3%,#eaeaea)}.x-spinner.x-item-disabled .x-spinner-button.x-button-pressing,.x-spinner.x-item-disabled .x-spinner-button.x-button-pressing:after,.x-spinner.x-item-disabled .x-spinner-button.x-button-pressed,.x-spinner.x-item-disabled .x-spinner-button.x-button-pressed:after,.x-spinner.x-item-disabled .x-spinner-button.x-button-active,.x-spinner.x-item-disabled .x-spinner-button.x-button-active:after,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-pressing,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-pressing:after,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-pressed,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-pressed:after,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-active,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-active:after{background-image:none;background-color:#efefef;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #d5d5d5), color-stop(10%, #e2e2e2), color-stop(65%, #efefef), color-stop(100%, #f0f0f0));background-image:-webkit-linear-gradient(top, #d5d5d5,#e2e2e2 10%,#efefef 65%,#f0f0f0);background-image:-moz-linear-gradient(top, #d5d5d5,#e2e2e2 10%,#efefef 65%,#f0f0f0);background-image:-o-linear-gradient(top, #d5d5d5,#e2e2e2 10%,#efefef 65%,#f0f0f0);background-image:-ms-linear-gradient(top, #d5d5d5,#e2e2e2 10%,#efefef 65%,#f0f0f0);background-image:linear-gradient(top, #d5d5d5,#e2e2e2 10%,#efefef 65%,#f0f0f0)}.x-spinner .x-spinner-button{margin-top:.25em;margin-bottom:.25em;width:2em;padding:.23em 0 .27em;font-weight:bold;text-align:center;border:1px solid #ddd !important;-webkit-border-radius:1em;-moz-border-radius:1em;-ms-border-radius:1em;-o-border-radius:1em;border-radius:1em}.x-spinner .x-spinner-button,.x-toolbar .x-spinner .x-spinner-button{border:1px solid #b7b7b7;border-top-color:#c4c4c4;background-color:#eaeaea;color:#111}.x-spinner .x-spinner-button.x-button-back:before,.x-spinner .x-spinner-button.x-button-forward:before,.x-toolbar .x-spinner .x-spinner-button.x-button-back:before,.x-toolbar .x-spinner .x-spinner-button.x-button-forward:before{background:#b7b7b7}.x-spinner .x-spinner-button,.x-spinner .x-spinner-button.x-button-back:after,.x-spinner .x-spinner-button.x-button-forward:after,.x-toolbar .x-spinner .x-spinner-button,.x-toolbar .x-spinner .x-spinner-button.x-button-back:after,.x-toolbar .x-spinner .x-spinner-button.x-button-forward:after{background-image:none;background-color:#eaeaea;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(3%, #f7f7f7), color-stop(100%, #dddddd));background-image:-webkit-linear-gradient(top, #ffffff,#f7f7f7 3%,#dddddd);background-image:-moz-linear-gradient(top, #ffffff,#f7f7f7 3%,#dddddd);background-image:-o-linear-gradient(top, #ffffff,#f7f7f7 3%,#dddddd);background-image:-ms-linear-gradient(top, #ffffff,#f7f7f7 3%,#dddddd);background-image:linear-gradient(top, #ffffff,#f7f7f7 3%,#dddddd)}.x-spinner .x-spinner-button.x-button-pressing,.x-spinner .x-spinner-button.x-button-pressing:after,.x-spinner .x-spinner-button.x-button-pressed,.x-spinner .x-spinner-button.x-button-pressed:after,.x-spinner .x-spinner-button.x-button-active,.x-spinner .x-spinner-button.x-button-active:after,.x-toolbar .x-spinner .x-spinner-button.x-button-pressing,.x-toolbar .x-spinner .x-spinner-button.x-button-pressing:after,.x-toolbar .x-spinner .x-spinner-button.x-button-pressed,.x-toolbar .x-spinner .x-spinner-button.x-button-pressed:after,.x-toolbar .x-spinner .x-spinner-button.x-button-active,.x-toolbar .x-spinner .x-spinner-button.x-button-active:after{background-image:none;background-color:#e2e2e2;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #c9c9c9), color-stop(10%, #d5d5d5), color-stop(65%, #e2e2e2), color-stop(100%, #e3e3e3));background-image:-webkit-linear-gradient(top, #c9c9c9,#d5d5d5 10%,#e2e2e2 65%,#e3e3e3);background-image:-moz-linear-gradient(top, #c9c9c9,#d5d5d5 10%,#e2e2e2 65%,#e3e3e3);background-image:-o-linear-gradient(top, #c9c9c9,#d5d5d5 10%,#e2e2e2 65%,#e3e3e3);background-image:-ms-linear-gradient(top, #c9c9c9,#d5d5d5 10%,#e2e2e2 65%,#e3e3e3);background-image:linear-gradient(top, #c9c9c9,#d5d5d5 10%,#e2e2e2 65%,#e3e3e3)}.x-spinner .x-spinner-button-down{margin-left:.25em}.x-spinner .x-spinner-button-up{margin-right:.25em}.x-spinner.x-field-grouped-buttons .x-spinner-button-down{margin-right:.5em}.x-android .x-spinner-button{padding:.40em 0 .11em !important}.x-ie .x-spinner .x-field-input .x-input-el:disabled{color:#000}.x-field-textarea textarea{min-height:6em;padding-top:.5em}.x-indexbar{padding:.3em 0;color:#155988}.x-indexbar-vertical{width:1.1em;margin-right:8px}.x-indexbar-horizontal{height:1.1em;margin-bottom:8px}.x-indexbar-pressed{-webkit-border-radius:0.55em;-moz-border-radius:0.55em;-ms-border-radius:0.55em;-o-border-radius:0.55em;border-radius:0.55em;background-color:rgba(143,155,163,0.8)}.x-list{background-color:#f7f7f7}.x-list .x-list-disclosure{position:relative;overflow:visible;border:0;-webkit-border-radius:32px;-moz-border-radius:32px;-ms-border-radius:32px;-o-border-radius:32px;border-radius:32px;background-image:none;background-color:#006bb6;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #0398ff), color-stop(3%, #007ad0), color-stop(100%, #005c9d));background-image:-webkit-linear-gradient(top, #0398ff,#007ad0 3%,#005c9d);background-image:-moz-linear-gradient(top, #0398ff,#007ad0 3%,#005c9d);background-image:-o-linear-gradient(top, #0398ff,#007ad0 3%,#005c9d);background-image:-ms-linear-gradient(top, #0398ff,#007ad0 3%,#005c9d);background-image:linear-gradient(top, #0398ff,#007ad0 3%,#005c9d);width:32px;height:32px;margin:7px 7px 0 0}.x-list .x-list-disclosure:before{position:absolute;top:0;right:0;bottom:0;left:0;content:']';font-family:'Pictos';color:#fff;font-size:24px;text-align:center;line-height:35px;text-shadow:0 0 0}.x-list.x-list-indexed .x-list-disclosure{margin-right:1.8em}.x-list .x-item-selected .x-list-disclosure{background:#fff none}.x-list .x-item-selected .x-list-disclosure:before{color:#006bb6}.x-list .x-list-item{color:#000}.x-list .x-list-item.x-item-pressed.x-list-item-tpl,.x-list .x-list-item.x-item-pressed .x-dock-horizontal{background:#b6e1ff none}.x-list .x-list-item.x-item-selected .x-dock-horizontal,.x-list .x-list-item.x-item-selected.x-list-item-tpl{background-image:none;background-color:#006bb6;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #0398ff), color-stop(3%, #007ad0), color-stop(100%, #005c9d));background-image:-webkit-linear-gradient(top, #0398ff,#007ad0 3%,#005c9d);background-image:-moz-linear-gradient(top, #0398ff,#007ad0 3%,#005c9d);background-image:-o-linear-gradient(top, #0398ff,#007ad0 3%,#005c9d);background-image:-ms-linear-gradient(top, #0398ff,#007ad0 3%,#005c9d);background-image:linear-gradient(top, #0398ff,#007ad0 3%,#005c9d);color:#fff}.x-list .x-list-item .x-list-item-body,.x-list .x-list-item.x-list-item-tpl .x-innerhtml{padding:12px 15px}.x-list-normal .x-list-header{background-image:none;background-color:#5ab5f5;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #a2d6f9), color-stop(3%, #72c0f6), color-stop(100%, #42abf4));background-image:-webkit-linear-gradient(top, #a2d6f9,#72c0f6 3%,#42abf4);background-image:-moz-linear-gradient(top, #a2d6f9,#72c0f6 3%,#42abf4);background-image:-o-linear-gradient(top, #a2d6f9,#72c0f6 3%,#42abf4);background-image:-ms-linear-gradient(top, #a2d6f9,#72c0f6 3%,#42abf4);background-image:linear-gradient(top, #a2d6f9,#72c0f6 3%,#42abf4);color:#0a6aac;text-shadow:rgba(255,255,255,0.25) 0 0.08em 0;border-top:1px solid #5ab5f5;border-bottom:1px solid #0d87dc;font-weight:bold;font-size:0.8em;padding:0.2em 1.02em}.x-list-normal .x-list-item.x-list-item-tpl,.x-list-normal .x-list-item .x-dock-horizontal{border-top:1px solid #dedede}.x-list-normal .x-list-item.x-list-item-tpl.x-list-footer-wrap,.x-list-normal .x-list-item.x-list-footer-wrap .x-dock-horizontal{border-bottom:1px solid #dedede}.x-list-normal .x-list-item.x-item-pressed.x-list-item-tpl,.x-list-normal .x-list-item.x-item-pressed .x-dock-horizontal{border-top-color:#b6e1ff;background-color:#b6e1ff}.x-list-normal .x-list-item.x-item-selected.x-list-item-tpl,.x-list-normal .x-list-item.x-item-selected .x-dock-horizontal{border-top-color:#006bb6}.x-list-round .x-scroll-view{background-color:#eee}.x-list-round .x-list-header-swap{padding-right:13px}.x-list-round .x-list-inner .x-scroll-container{top:13px;left:13px;bottom:13px;right:13px;width:auto !important;height:auto !important}.x-list-round .x-list-header{color:#777;font-size:1em;font-weight:bold;padding-left:26px;line-height:1.7em;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #eeeeee), color-stop(30%, rgba(238,238,238,0.9)), color-stop(100%, rgba(238,238,238,0.4)));background-image:-webkit-linear-gradient(top, #eeeeee,rgba(238,238,238,0.9) 30%,rgba(238,238,238,0.4));background-image:-moz-linear-gradient(top, #eeeeee,rgba(238,238,238,0.9) 30%,rgba(238,238,238,0.4));background-image:-o-linear-gradient(top, #eeeeee,rgba(238,238,238,0.9) 30%,rgba(238,238,238,0.4));background-image:-ms-linear-gradient(top, #eeeeee,rgba(238,238,238,0.9) 30%,rgba(238,238,238,0.4));background-image:linear-gradient(top, #eeeeee,rgba(238,238,238,0.9) 30%,rgba(238,238,238,0.4))}.x-list-round .x-list-container{padding:13px 13px 0 13px}.x-list-round .x-list-container .x-list-header{padding-left:13px;background-image:none}.x-list-round.x-list-ungrouped .x-list-item-tpl,.x-list-round.x-list-ungrouped .x-list-item .x-dock-horizontal,.x-list-round.x-list-grouped .x-list-item-tpl,.x-list-round.x-list-grouped .x-list-item .x-dock-horizontal{border:1px solid #dedede;border-width:1px 1px 0 1px;background:#f7f7f7}.x-list-round.x-list-ungrouped .x-list-item-first{-moz-border-radius-topleft:0.4em;-webkit-border-top-left-radius:0.4em;-ms-border-top-left-radius:0.4em;-o-border-top-left-radius:0.4em;border-top-left-radius:0.4em;-moz-border-radius-topright:0.4em;-webkit-border-top-right-radius:0.4em;-ms-border-top-right-radius:0.4em;-o-border-top-right-radius:0.4em;border-top-right-radius:0.4em}.x-list-round.x-list-ungrouped .x-list-item-last{-moz-border-radius-bottomleft:0.4em;-webkit-border-bottom-left-radius:0.4em;-ms-border-bottom-left-radius:0.4em;-o-border-bottom-left-radius:0.4em;border-bottom-left-radius:0.4em;-moz-border-radius-bottomright:0.4em;-webkit-border-bottom-right-radius:0.4em;-ms-border-bottom-right-radius:0.4em;-o-border-bottom-right-radius:0.4em;border-bottom-right-radius:0.4em;border-width:1px;margin-bottom:13px}.x-list-round.x-list-grouped .x-list-header-wrap .x-dock-horizontal{-moz-border-radius-topleft:0.4em;-webkit-border-top-left-radius:0.4em;-ms-border-top-left-radius:0.4em;-o-border-top-left-radius:0.4em;border-top-left-radius:0.4em;-moz-border-radius-topright:0.4em;-webkit-border-top-right-radius:0.4em;-ms-border-top-right-radius:0.4em;-o-border-top-right-radius:0.4em;border-top-right-radius:0.4em}.x-list-round.x-list-grouped .x-list-header-wrap.x-list-header{border:1px solid #dedede;border-width:1px 1px 0 1px;-moz-border-radius-topleft:0.4em;-webkit-border-top-left-radius:0.4em;-ms-border-top-left-radius:0.4em;-o-border-top-left-radius:0.4em;border-top-left-radius:0.4em;-moz-border-radius-topright:0.4em;-webkit-border-top-right-radius:0.4em;-ms-border-top-right-radius:0.4em;-o-border-top-right-radius:0.4em;border-top-right-radius:0.4em}.x-list-round.x-list-grouped .x-list-footer-wrap{background:transparent}.x-list-round.x-list-grouped .x-list-footer-wrap.x-list-item-tpl,.x-list-round.x-list-grouped .x-list-footer-wrap .x-dock-horizontal{border:none;background:transparent;padding-bottom:13px;margin-bottom:13px}.x-list-round.x-list-grouped .x-list-footer-wrap.x-list-item-tpl>.x-innerhtml,.x-list-round.x-list-grouped .x-list-footer-wrap.x-list-item-tpl>.x-dock-body,.x-list-round.x-list-grouped .x-list-footer-wrap .x-dock-horizontal>.x-innerhtml,.x-list-round.x-list-grouped .x-list-footer-wrap .x-dock-horizontal>.x-dock-body{border:1px solid #dedede;background:#f7f7f7;-moz-border-radius-bottomleft:0.4em;-webkit-border-bottom-left-radius:0.4em;-ms-border-bottom-left-radius:0.4em;-o-border-bottom-left-radius:0.4em;border-bottom-left-radius:0.4em;-moz-border-radius-bottomright:0.4em;-webkit-border-bottom-right-radius:0.4em;-ms-border-bottom-right-radius:0.4em;-o-border-bottom-right-radius:0.4em;border-bottom-right-radius:0.4em}.x-list-round.x-list-grouped .x-list-footer-wrap.x-item-selected>.x-innerhtml,.x-list-round.x-list-grouped .x-list-footer-wrap.x-item-selected>.x-dock-body{background-image:none;background-color:#006bb6;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #0398ff), color-stop(3%, #007ad0), color-stop(100%, #005c9d));background-image:-webkit-linear-gradient(top, #0398ff,#007ad0 3%,#005c9d);background-image:-moz-linear-gradient(top, #0398ff,#007ad0 3%,#005c9d);background-image:-o-linear-gradient(top, #0398ff,#007ad0 3%,#005c9d);background-image:-ms-linear-gradient(top, #0398ff,#007ad0 3%,#005c9d);background-image:linear-gradient(top, #0398ff,#007ad0 3%,#005c9d);color:#fff}.x-list-round .x-indexbar-vertical{margin-right:20px}.x-list-round .x-list-footer-wrap.x-list-item-last.x-list-item-odd.x-list-item.x-list-item-tpl{background-color:transparent !important}.x-list-round.x-list-grouped .x-list-item-odd.x-list-footer-wrap>.x-innerhtml,.x-list-round.x-list-grouped .x-list-item-odd.x-list-footer-wrap>.x-dock-body{background-color:#eaeaea !important}.x-list .x-list-item-odd.x-list-item-tpl,.x-list .x-list-item-odd .x-dock-horizontal{background-color:#eaeaea !important;border-bottom:1px solid #eaeaea}.x-picker .x-picker-inner{background-color:#fff;overflow:hidden;margin:0.7em;-webkit-border-radius:0.4em;-moz-border-radius:0.4em;-ms-border-radius:0.4em;-o-border-radius:0.4em;border-radius:0.4em;-webkit-background-clip:padding;-moz-background-clip:padding;background-clip:padding-box;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #bbb), color-stop(30%, #fff), color-stop(70%, #fff), color-stop(100%, #bbb));background:-webkit-linear-gradient(top, #bbb 0%, #fff 30%, #fff 70%, #bbb 100%)}.x-picker-slot .x-scroll-view{-webkit-box-shadow:rgba(0,0,0,0.4) -1px 0 1px;-moz-box-shadow:rgba(0,0,0,0.4) -1px 0 1px;box-shadow:rgba(0,0,0,0.4) -1px 0 1px}.x-picker-slot .x-scroll-view:first-child{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.x-picker-bar{border-top:0.12em solid #006bb6;border-bottom:0.12em solid #006bb6;height:2.5em;background-image:none;background-color:rgba(13,148,242,0.3);background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, rgba(85,180,246,0.3)), color-stop(3%, rgba(37,159,244,0.3)), color-stop(100%, rgba(11,133,218,0.3)));background-image:-webkit-linear-gradient(top, rgba(85,180,246,0.3),rgba(37,159,244,0.3) 3%,rgba(11,133,218,0.3));background-image:-moz-linear-gradient(top, rgba(85,180,246,0.3),rgba(37,159,244,0.3) 3%,rgba(11,133,218,0.3));background-image:-o-linear-gradient(top, rgba(85,180,246,0.3),rgba(37,159,244,0.3) 3%,rgba(11,133,218,0.3));background-image:-ms-linear-gradient(top, rgba(85,180,246,0.3),rgba(37,159,244,0.3) 3%,rgba(11,133,218,0.3));background-image:linear-gradient(top, rgba(85,180,246,0.3),rgba(37,159,244,0.3) 3%,rgba(11,133,218,0.3));-webkit-box-shadow:rgba(0,0,0,0.2) 0 0.2em 0.2em;-moz-box-shadow:rgba(0,0,0,0.2) 0 0.2em 0.2em;box-shadow:rgba(0,0,0,0.2) 0 0.2em 0.2em}.x-use-titles .x-picker-bar{margin-top:1.5em}.x-picker-slot-title{height:1.5em;border-top:1px solid #1295f1;border-bottom:1px solid #095b94;padding:0.2em 1.02em;-webkit-box-shadow:rgba(0,0,0,0.3) 0px 0.1em 0.3em;-moz-box-shadow:rgba(0,0,0,0.3) 0px 0.1em 0.3em;box-shadow:rgba(0,0,0,0.3) 0px 0.1em 0.3em;background-image:none;background-color:#1295f1;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #5ab5f5), color-stop(3%, #2aa0f2), color-stop(100%, #0d87dc));background-image:-webkit-linear-gradient(top, #5ab5f5,#2aa0f2 3%,#0d87dc);background-image:-moz-linear-gradient(top, #5ab5f5,#2aa0f2 3%,#0d87dc);background-image:-o-linear-gradient(top, #5ab5f5,#2aa0f2 3%,#0d87dc);background-image:-ms-linear-gradient(top, #5ab5f5,#2aa0f2 3%,#0d87dc);background-image:linear-gradient(top, #5ab5f5,#2aa0f2 3%,#0d87dc)}.x-picker-slot-title>div{font-size:0.8em;color:#113b59;text-shadow:rgba(255,255,255,0.25) 0 0.08em 0}.x-picker-slot .x-dataview-item{height:2.5em;line-height:2.5em;font-weight:bold;padding:0 10px}.x-list-paging{padding:1em 0}.x-list-paging .x-list-paging-msg{color:#006bb6;-webkit-border-radius:6px;-moz-border-radius:6px;-ms-border-radius:6px;-o-border-radius:6px;border-radius:6px}.x-list-paging.x-loading{padding:0.5em}.x-list-pullrefresh-arrow{background:center center url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAA8CAYAAAAUufjgAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAjFJREFUeNrsmU8oREEYwOexdtNuKBfFwdVhCyfuysnFiXISS+1BLopyUpKLXETkRLaUi1LK3Q2lpPbiQLnIn03a/Hm+z86Ttv0zM++bfbOar36Hbad5v535Zp7v47iuy0wOpyoEHccRHV9L9NxPkUE/bhKCOKiOSPAdn69DsJ5I8E2HYA0QJRJ8Bb50CDYRCT7pEMQD0kwk+CByUFQEW4gE73UIhoA2IsFb4ENEMCQ5MdU1IxwygpT3oKNLMGyyYFVscdhusc8tDpu+xRG7xf95BW0O2kNiV1AgIvaQ2BzUJNgJNJYZGyUU7OG1cal4Bi68oqkDPszy2teEwJp5Cdyu/lZ1g8CwIYJ7wEF+2YmrNw90Byx3BizgKhaqizEP1wg7CLLxCEzy/CtauMeBlQDyEfNuGrgU6SyM8F9SyVgHdmRaH6tAb4XkToEp2d4M5mOK0TWMigU2koa8vJMRZPxEb2ss2LEVPMpPLlMRxBgDZjQJLgNbxb6Uab9tAn3EcifAeKkBMoLY+j0GWonk7oB+lmsFkwhidAGHBPmIeTcAnJcbKCuIMQEs+hScAzZEBqoIYuzyFVCJI36lMJ2CDfxibZeUu+EX/4uMIFP8ZyLejxkgK0hG5a8kP4IYSZbr1IuQVHmAX0HGX4VuGfZVJ6cQxPd1uoRcWqDW0SroFVzZAnJZ/h0LWhAjUUAw4XdSSsH8fExRTEgtGAOuOTETBb16Jk412e+bxOSwglYw6PgWYABvLk8P7zGJFwAAAABJRU5ErkJggg==') no-repeat;background-size:2em 3em;-webkit-transition-property:-webkit-transform;-webkit-transition-duration:200ms;-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);-o-transform:rotate(0deg);transform:rotate(0deg)}.x-android-2 .x-list-pullrefresh-arrow{-webkit-transition-property:none;-webkit-transition-duration:0}.x-list-pullrefresh-release .x-list-pullrefresh-arrow{-webkit-transform:rotate(-180deg);-moz-transform:rotate(-180deg);-ms-transform:rotate(-180deg);-o-transform:rotate(-180deg);transform:rotate(-180deg)}.x-list-pullrefresh-message{margin-bottom:0.1em}.x-slider,.x-toggle{height:2.2em}.x-slider.x-item-disabled{opacity:.6}.x-thumb{height:2.2em;width:2.2em;background:transparent none;border:0}.x-thumb:after{border:1px solid #919191;content:'';position:absolute;width:1.85em;height:1.85em;top:0.175em;left:0.175em;background-image:none;background-color:#ddd;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(3%, #eaeaea), color-stop(100%, #d0d0d0));background-image:-webkit-linear-gradient(top, #ffffff,#eaeaea 3%,#d0d0d0);background-image:-moz-linear-gradient(top, #ffffff,#eaeaea 3%,#d0d0d0);background-image:-o-linear-gradient(top, #ffffff,#eaeaea 3%,#d0d0d0);background-image:-ms-linear-gradient(top, #ffffff,#eaeaea 3%,#d0d0d0);background-image:linear-gradient(top, #ffffff,#eaeaea 3%,#d0d0d0);-webkit-background-clip:padding;-moz-background-clip:padding;background-clip:padding-box;-webkit-border-radius:0.925em;-moz-border-radius:0.925em;-ms-border-radius:0.925em;-o-border-radius:0.925em;border-radius:0.925em}.x-thumb.x-dragging{opacity:1}.x-thumb.x-dragging:after{background-image:none;background-color:#d0d0d0;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #f7f7f7), color-stop(3%, #dddddd), color-stop(100%, #c4c4c4));background-image:-webkit-linear-gradient(top, #f7f7f7,#dddddd 3%,#c4c4c4);background-image:-moz-linear-gradient(top, #f7f7f7,#dddddd 3%,#c4c4c4);background-image:-o-linear-gradient(top, #f7f7f7,#dddddd 3%,#c4c4c4);background-image:-ms-linear-gradient(top, #f7f7f7,#dddddd 3%,#c4c4c4);background-image:linear-gradient(top, #f7f7f7,#dddddd 3%,#c4c4c4)}.x-slider:before{margin:0 0.925em;border:0.1em solid rgba(0,0,0,0.1);border-bottom:0;content:'';position:absolute;width:auto;height:0.8em;top:0.737em;left:0;background-image:none;background-color:#ddd;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #c4c4c4), color-stop(10%, #d0d0d0), color-stop(65%, #dddddd), color-stop(100%, #dedede));background-image:-webkit-linear-gradient(top, #c4c4c4,#d0d0d0 10%,#dddddd 65%,#dedede);background-image:-moz-linear-gradient(top, #c4c4c4,#d0d0d0 10%,#dddddd 65%,#dedede);background-image:-o-linear-gradient(top, #c4c4c4,#d0d0d0 10%,#dddddd 65%,#dedede);background-image:-ms-linear-gradient(top, #c4c4c4,#d0d0d0 10%,#dddddd 65%,#dedede);background-image:linear-gradient(top, #c4c4c4,#d0d0d0 10%,#dddddd 65%,#dedede);-webkit-box-shadow:rgba(255,255,255,0.7) 0 0.1em 0;-moz-box-shadow:rgba(255,255,255,0.7) 0 0.1em 0;box-shadow:rgba(255,255,255,0.7) 0 0.1em 0;-webkit-border-radius:0.4em;-moz-border-radius:0.4em;-ms-border-radius:0.4em;-o-border-radius:0.4em;border-radius:0.4em}.x-toggle{width:4.4em;border:1px solid #b7b7b7;background-image:none;background-color:#ddd;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #c4c4c4), color-stop(10%, #d0d0d0), color-stop(65%, #dddddd), color-stop(100%, #dedede));background-image:-webkit-linear-gradient(top, #c4c4c4,#d0d0d0 10%,#dddddd 65%,#dedede);background-image:-moz-linear-gradient(top, #c4c4c4,#d0d0d0 10%,#dddddd 65%,#dedede);background-image:-o-linear-gradient(top, #c4c4c4,#d0d0d0 10%,#dddddd 65%,#dedede);background-image:-ms-linear-gradient(top, #c4c4c4,#d0d0d0 10%,#dddddd 65%,#dedede);background-image:linear-gradient(top, #c4c4c4,#d0d0d0 10%,#dddddd 65%,#dedede);-webkit-border-radius:1.1em;-moz-border-radius:1.1em;-ms-border-radius:1.1em;-o-border-radius:1.1em;border-radius:1.1em}.x-toggle .x-thumb.x-dragging{opacity:1}.x-toggle .x-thumb:before{top:0.175em}.x-toggle-on{background-image:none;background-color:#92cf00;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #6e9c00), color-stop(10%, #80b500), color-stop(65%, #92cf00), color-stop(100%, #94d200));background-image:-webkit-linear-gradient(top, #6e9c00,#80b500 10%,#92cf00 65%,#94d200);background-image:-moz-linear-gradient(top, #6e9c00,#80b500 10%,#92cf00 65%,#94d200);background-image:-o-linear-gradient(top, #6e9c00,#80b500 10%,#92cf00 65%,#94d200);background-image:-ms-linear-gradient(top, #6e9c00,#80b500 10%,#92cf00 65%,#94d200);background-image:linear-gradient(top, #6e9c00,#80b500 10%,#92cf00 65%,#94d200)}.x-tab.x-item-disabled span.x-button-label,.x-tab.x-item-disabled span.x-badge,.x-tab.x-item-disabled .x-hasbadge span.x-badge,.x-hasbadge .x-tab.x-item-disabled span.x-badge,.x-tab.x-item-disabled .x-button-icon{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=50);opacity:0.5}.x-tab.x-draggable{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=70);opacity:0.7}.x-tabbar.x-docked-top{height:2.6em;padding:0 .8em}.x-tabbar.x-docked-top .x-tab{background:transparent none;border:0;padding:0.4em 0.8em;height:1.8em;-webkit-border-radius:0.9em;-moz-border-radius:0.9em;-ms-border-radius:0.9em;-o-border-radius:0.9em;border-radius:0.9em}.x-tabbar.x-docked-top .x-tab .x-button-label,.x-tabbar.x-docked-top .x-tab .x-badge,.x-tabbar.x-docked-top .x-tab .x-hasbadge .x-badge,.x-hasbadge .x-tabbar.x-docked-top .x-tab .x-badge{font-size:.8em;line-height:1.2em;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased}.x-tabbar.x-docked-top .x-tab .x-badge{font-size:.6em !important;top:-0.5em}.x-tabbar.x-docked-top .x-tab .x-button-icon{width:1.2em;height:1.2em;margin:0 auto}.x-tabbar.x-docked-top .x-tab .x-button-icon:before{font-size:1.6em}.x-tabbar.x-docked-top .x-tab.x-tab-icon{padding:0.3em 0.8em}.x-tabbar.x-docked-top .x-tab.x-tab-icon .x-button-label,.x-tabbar.x-docked-top .x-tab.x-tab-icon .x-badge,.x-tabbar.x-docked-top .x-tab.x-tab-icon .x-hasbadge .x-badge,.x-hasbadge .x-tabbar.x-docked-top .x-tab.x-tab-icon .x-badge{margin:0;margin-left:.8em;padding:.1em 0 .2em 0;display:inline-block;position:relative;top:-0.2em}.x-tabbar.x-docked-bottom{height:3em;padding:0}.x-tabbar.x-docked-bottom .x-tab{background:transparent none;border:0;padding-top:.2em;-webkit-border-radius:0.25em;-moz-border-radius:0.25em;-ms-border-radius:0.25em;-o-border-radius:0.25em;border-radius:0.25em;-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column}.x-tabbar.x-docked-bottom .x-tab .x-button-icon{width:1.65em;height:1.65em;margin:0 auto}.x-tabbar.x-docked-bottom .x-tab .x-button-icon:before{font-size:1.6em;line-height:1.1em}.x-tabbar.x-docked-bottom .x-tab .x-button-label,.x-tabbar.x-docked-bottom .x-tab .x-badge,.x-tabbar.x-docked-bottom .x-tab .x-hasbadge .x-badge,.x-hasbadge .x-tabbar.x-docked-bottom .x-tab .x-badge{margin:0;padding:.1em 0 .2em 0;font-size:9px;line-height:12px;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased}.x-tabbar-light{border-top-color:#2175af;border-bottom-color:#195884;background-image:none;background-color:#2583c4;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #56a7df), color-stop(3%, #2b91d7), color-stop(100%, #2175af));background-image:-webkit-linear-gradient(top, #56a7df,#2b91d7 3%,#2175af);background-image:-moz-linear-gradient(top, #56a7df,#2b91d7 3%,#2175af);background-image:-o-linear-gradient(top, #56a7df,#2b91d7 3%,#2175af);background-image:-ms-linear-gradient(top, #56a7df,#2b91d7 3%,#2175af);background-image:linear-gradient(top, #56a7df,#2b91d7 3%,#2175af)}.x-tabbar-light .x-tab{color:#c1dff4;border-bottom:1px solid transparent}.x-tabbar-light .x-tab-active{color:#fff;border-bottom-color:#278bd1}.x-tabbar-light .x-tab-active .x-button-icon:before{color:#1da2ff}.x-tabbar-light .x-tab-pressed{color:#fff}.x-tabbar-light.x-docked-bottom .x-tab{text-shadow:rgba(0,0,0,0.5) 0 -0.08em 0}.x-tabbar-light.x-docked-bottom .x-tab-active{background-image:none;background-color:#2175af;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #195884), color-stop(10%, #1d6699), color-stop(65%, #2175af), color-stop(100%, #2176b1));background-image:-webkit-linear-gradient(top, #195884,#1d6699 10%,#2175af 65%,#2176b1);background-image:-moz-linear-gradient(top, #195884,#1d6699 10%,#2175af 65%,#2176b1);background-image:-o-linear-gradient(top, #195884,#1d6699 10%,#2175af 65%,#2176b1);background-image:-ms-linear-gradient(top, #195884,#1d6699 10%,#2175af 65%,#2176b1);background-image:linear-gradient(top, #195884,#1d6699 10%,#2175af 65%,#2176b1);text-shadow:rgba(255,255,255,0.25) 0 0.08em 0;-webkit-box-shadow:#1d6699 0 0 0.25em inset;-moz-box-shadow:#1d6699 0 0 0.25em inset;box-shadow:#1d6699 0 0 0.25em inset}.x-tabbar-light.x-docked-bottom .x-tab-active .x-button-icon:before{color:#1da2ff}.x-tabbar-light.x-docked-top .x-tab-active{background-image:none;background-color:#2175af;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #195884), color-stop(10%, #1d6699), color-stop(65%, #2175af), color-stop(100%, #2176b1));background-image:-webkit-linear-gradient(top, #195884,#1d6699 10%,#2175af 65%,#2176b1);background-image:-moz-linear-gradient(top, #195884,#1d6699 10%,#2175af 65%,#2176b1);background-image:-o-linear-gradient(top, #195884,#1d6699 10%,#2175af 65%,#2176b1);background-image:-ms-linear-gradient(top, #195884,#1d6699 10%,#2175af 65%,#2176b1);background-image:linear-gradient(top, #195884,#1d6699 10%,#2175af 65%,#2176b1);color:#fff}.x-tabbar-dark{border-top-color:#0b3c5e;border-bottom-color:#061f31;background-image:none;background-color:#0e4b75;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #1676b9), color-stop(3%, #11598c), color-stop(100%, #0b3c5e));background-image:-webkit-linear-gradient(top, #1676b9,#11598c 3%,#0b3c5e);background-image:-moz-linear-gradient(top, #1676b9,#11598c 3%,#0b3c5e);background-image:-o-linear-gradient(top, #1676b9,#11598c 3%,#0b3c5e);background-image:-ms-linear-gradient(top, #1676b9,#11598c 3%,#0b3c5e);background-image:linear-gradient(top, #1676b9,#11598c 3%,#0b3c5e)}.x-tabbar-dark .x-tab{color:#63b4ec;border-bottom:1px solid transparent}.x-tabbar-dark .x-tab-active{color:#fff;border-bottom-color:#105483}.x-tabbar-dark .x-tab-active .x-button-icon:before{color:#50b7ff}.x-tabbar-dark .x-tab-pressed{color:#fff}.x-tabbar-dark.x-docked-bottom .x-tab{text-shadow:rgba(0,0,0,0.5) 0 -0.08em 0}.x-tabbar-dark.x-docked-bottom .x-tab-active{background-image:none;background-color:#0b3c5e;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #061f31), color-stop(10%, #092e47), color-stop(65%, #0b3c5e), color-stop(100%, #0c3e60));background-image:-webkit-linear-gradient(top, #061f31,#092e47 10%,#0b3c5e 65%,#0c3e60);background-image:-moz-linear-gradient(top, #061f31,#092e47 10%,#0b3c5e 65%,#0c3e60);background-image:-o-linear-gradient(top, #061f31,#092e47 10%,#0b3c5e 65%,#0c3e60);background-image:-ms-linear-gradient(top, #061f31,#092e47 10%,#0b3c5e 65%,#0c3e60);background-image:linear-gradient(top, #061f31,#092e47 10%,#0b3c5e 65%,#0c3e60);text-shadow:rgba(0,0,0,0.5) 0 -0.08em 0;-webkit-box-shadow:#092e47 0 0 0.25em inset;-moz-box-shadow:#092e47 0 0 0.25em inset;box-shadow:#092e47 0 0 0.25em inset}.x-tabbar-dark.x-docked-bottom .x-tab-active .x-button-icon:before{color:#50b7ff}.x-tabbar-dark.x-docked-top .x-tab-active{background-image:none;background-color:#0b3c5e;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #061f31), color-stop(10%, #092e47), color-stop(65%, #0b3c5e), color-stop(100%, #0c3e60));background-image:-webkit-linear-gradient(top, #061f31,#092e47 10%,#0b3c5e 65%,#0c3e60);background-image:-moz-linear-gradient(top, #061f31,#092e47 10%,#0b3c5e 65%,#0c3e60);background-image:-o-linear-gradient(top, #061f31,#092e47 10%,#0b3c5e 65%,#0c3e60);background-image:-ms-linear-gradient(top, #061f31,#092e47 10%,#0b3c5e 65%,#0c3e60);background-image:linear-gradient(top, #061f31,#092e47 10%,#0b3c5e 65%,#0c3e60);color:#fff}.x-tabbar-neutral{border-top-color:#d3d3d3;border-bottom-color:#bababa;background-image:none;background-color:#e0e0e0;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(3%, #ededed), color-stop(100%, #d3d3d3));background-image:-webkit-linear-gradient(top, #ffffff,#ededed 3%,#d3d3d3);background-image:-moz-linear-gradient(top, #ffffff,#ededed 3%,#d3d3d3);background-image:-o-linear-gradient(top, #ffffff,#ededed 3%,#d3d3d3);background-image:-ms-linear-gradient(top, #ffffff,#ededed 3%,#d3d3d3);background-image:linear-gradient(top, #ffffff,#ededed 3%,#d3d3d3)}.x-tabbar-neutral .x-tab{color:#7a7a7a;border-bottom:1px solid transparent}.x-tabbar-neutral .x-tab-active{color:#000;border-bottom-color:#e8e8e8}.x-tabbar-neutral .x-tab-active .x-button-icon:before{color:#7a7a7a}.x-tabbar-neutral .x-tab-pressed{color:#000}.x-tabbar-neutral.x-docked-bottom .x-tab{text-shadow:rgba(255,255,255,0.25) 0 0.08em 0}.x-tabbar-neutral.x-docked-bottom .x-tab-active{background-image:none;background-color:#d3d3d3;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #bababa), color-stop(10%, #c7c7c7), color-stop(65%, #d3d3d3), color-stop(100%, #d5d5d5));background-image:-webkit-linear-gradient(top, #bababa,#c7c7c7 10%,#d3d3d3 65%,#d5d5d5);background-image:-moz-linear-gradient(top, #bababa,#c7c7c7 10%,#d3d3d3 65%,#d5d5d5);background-image:-o-linear-gradient(top, #bababa,#c7c7c7 10%,#d3d3d3 65%,#d5d5d5);background-image:-ms-linear-gradient(top, #bababa,#c7c7c7 10%,#d3d3d3 65%,#d5d5d5);background-image:linear-gradient(top, #bababa,#c7c7c7 10%,#d3d3d3 65%,#d5d5d5);text-shadow:rgba(255,255,255,0.25) 0 0.08em 0;-webkit-box-shadow:#c7c7c7 0 0 0.25em inset;-moz-box-shadow:#c7c7c7 0 0 0.25em inset;box-shadow:#c7c7c7 0 0 0.25em inset}.x-tabbar-neutral.x-docked-bottom .x-tab-active .x-button-icon:before{color:#7a7a7a}.x-tabbar-neutral.x-docked-top .x-tab-active{background-image:none;background-color:#d3d3d3;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #bababa), color-stop(10%, #c7c7c7), color-stop(65%, #d3d3d3), color-stop(100%, #d5d5d5));background-image:-webkit-linear-gradient(top, #bababa,#c7c7c7 10%,#d3d3d3 65%,#d5d5d5);background-image:-moz-linear-gradient(top, #bababa,#c7c7c7 10%,#d3d3d3 65%,#d5d5d5);background-image:-o-linear-gradient(top, #bababa,#c7c7c7 10%,#d3d3d3 65%,#d5d5d5);background-image:-ms-linear-gradient(top, #bababa,#c7c7c7 10%,#d3d3d3 65%,#d5d5d5);background-image:linear-gradient(top, #bababa,#c7c7c7 10%,#d3d3d3 65%,#d5d5d5);color:#000}.x-tab .x-button-icon.chart:before,.x-button .x-button-icon.chart:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"Z"}.x-tab .x-button-icon.bird:before,.x-button .x-button-icon.bird:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"B"}.x-tab .x-button-icon.box:before,.x-button .x-button-icon.box:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"b"}.x-tab .x-button-icon.add2:before,.x-button .x-button-icon.add2:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"+"}.x-accordion-list .x-list-item .x-innerhtml{display:-webkit-box}.x-accordion-list .down{position:relative;width:0;height:0;border:8px solid transparent;border-top-color:#999;top:4px;margin-right:0.4em}.x-accordion-list .right{position:relative;width:0;height:0;border:8px solid transparent;border-left-color:#999;top:2px;margin-right:0.4em}.x-accordion-list .x-list-item.x-item-selected .down{border-top-color:#fff}.x-accordion-list .x-list-item.x-item-selected .right{border-left-color:#fff}.PL-view .x-accordion-list-header{background-color:#3498db;border-top:1px solid #7f8c8d;color:#fff}.PL-view .x-accordion-list-header .down{border-top-color:#fff}.PL-view .x-accordion-list-header .right{border-left-color:#fff}.components-view .accordion-list-item{background:#ecf0f1;padding-top:.6em;border-bottom:#ddd solid 1px}.components-view .accordion-list-item .x-button-plain{color:#2c3e50}.components-view .accordion-list-item.x-accordion-list-content{padding-bottom:.6em}.components-view .accordion-list-item .x-field{border-top:solid 1px #ccc;border-left:solid 1px #ccc;border-right:solid 1px #ccc;margin-right:.6em}.components-view .accordion-list-item .x-field-textarea{border-bottom:solid 1px #ccc} diff --git a/examples/.sencha/app/build-impl.xml b/examples/.sencha/app/build-impl.xml new file mode 100644 index 0000000..e9d332f --- /dev/null +++ b/examples/.sencha/app/build-impl.xml @@ -0,0 +1,503 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + compass watch ${app.sass.dir} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Using Sencha Cmd from ${cmd.dir} for ${ant.file} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/.sencha/app/build.properties b/examples/.sencha/app/build.properties new file mode 100644 index 0000000..c2649c9 --- /dev/null +++ b/examples/.sencha/app/build.properties @@ -0,0 +1,20 @@ +# ============================================================================= +# This file provides an override point for default variables defined in these +# lower priority files: +# +# - touch.properties +# - *.defaults.properties +# - defaults.properties +# +# To override a property based on build.environment instead add properties to +# one of these higher priority files: +# +# - production.properties +# - testing.properties +# - native.properties +# - package.properties +# +# IMPORTANT - Sencha Cmd will merge your changes with its own during upgrades. +# To avoid potential merge conflicts avoid making large, sweeping changes to +# this file. +# ============================================================================= diff --git a/examples/.sencha/app/codegen.json b/examples/.sencha/app/codegen.json new file mode 100644 index 0000000..425e8a3 --- /dev/null +++ b/examples/.sencha/app/codegen.json @@ -0,0 +1,282 @@ +{ + "sources": { + "build.properties.merge": { + "ec0f832e80d63d776086203cffe9fed5c73b4294": "eJytUstOw0AMvPcrRuoNQT8AiQPixIGHoD/gZp3E6saOdjeJ+vc4fagSQZy6N3vs8YzXazzd8q3W2LaSUUtk9MlGCZxBChs5JQ/Qm2hBbQmBaxpiwUhJaBe9zjOiHCCK0nJmZ4s2cXImsSTlcOTNj6u1I8ADig1Vu/E5PacinM/pu82ZOy+xP5FZtl01Es7gATvKLsgUu0Fi2LCOkkw7dg+iuTAFUAi4krkmZzNlWH1ygVaa9h8T3huGqojpUm3hXESbJaBUZORlvqdqTw3/dvf69vnxtX1+33rJN2vVEl66gEliRMepYRxsSPC8Nu5hktJCSoZNijAkl4ChbxL5b25Oy6LRxH1b8VUIXVgq0zpK5Z0nvKP93BvJwXvkibmf48uc467K5WBm5tte4w874erN" + }, + "native.properties.merge": { + "2c8c063f9588eecff09624782d7369a8a000d61c": "eJytkEsOwjAMRPecYkT3vQF3YMEFguJSi2BXjgni9rgfFQ5AdrEm743T4fTPc+hwGbli4EKYTBtnqkgCbWQWF0zK4hjUkGlIz+JoyThdS+RiwkIZLAiQJOdG/RarfeAmMmeqfUioLoJtgmQElfIGPyY1D8hrJMH1ySWz3AI3K30kHFfuESSNTeVB4v2hi8T5i/tp4vs+nu6zk9XY38tGK/+nWQx87hK0pU3RlAMzu3fv8qaG8s9f/wFV3ZB9" + }, + "package.properties.merge": { + "c6c1fb2fb1dda28480ad0f6e5caffc9b97d196ae": "eJytkUFygzAMRfc5hSZsOxygM11223aRCwgsQBNH8tiCTG5fGWjDAcLOsnjvS27g45XfqYHLxAUGjgQp68KBCqCALpSzHyApi8GgGQINOEeDBTNjF73PKywUgAUclLC/4kjt3lda5yXKxlRat1BZDXsFMBOoxAfwLWk2p9wnEuhmjoFldF512kRw3sFnIFk4q9xIrD013vLz5B2y2P9EhtcqZc1sj3WmTXCI5gWrYZy2xomKwTFV/hSvP5XN+fV9+Xzftjb7SDoc+jClWJmmIGi80N9SwnbVe1HlDUTdWfNvt1togpGEMkYoLP1K7tVfIHKXfeVU/S9+/V9rlbyW" + }, + "production.properties.merge": { + "cbdf9712e9b5d37cecb4d0530ba1fccd0ed004a3": "eJytkUEOwjAMBO+8YkXv/QF/4MAHAnGpRbArxy3i97gFQbk3t6ycmbXS4LDl2TU49VzRcSEMphNnqkgCncgsLhiUxdGpIVOXxuKYknE6l5iLhIUyWBCgeJ7Hi7NK+xmtbWQDmTPVNkRUF8knQTKCSnmC74OaB+jRk+A8csks10DOWu8J+x97D5KJTeVO4u2uianjD7lq5N+9PN1mL6uxP5fN3o5Vuwh87hO0pVHRlAMz+//cy7sa2o2/4QV6LJW9" + }, + "sencha.cfg.tpl.merge": { + "d2e6e42720f88befc892f12df5fd7bab587f7879": "eJxtUDEOwjAM3PsKSzAi6MaUhQfwAhaTujTQNpHtClWof8cpamFgSU53F/sumNK+x47cK59TUaARNRt+Rn641wrPX9m3KJJQG7e9DGV5PGWyCjwdMrjL7g9dFBvQJggkjolYR5BEPtSBBBB87DoEoYSMShW0QRRiDXmJmNorhj70NxvCJHFgb880mpLGfGtDcB1CW4HtI6+RxznpYt7Pg9wn/mzMwZb4uZ71MdsqTYefDp+feQN/i2pK" + }, + "testing.properties.merge": { + "360e715956c81757e53736789fe20be045acb544": "eJytkMENwjAMRe+d4oveuwE7cGCBoLjUItiVY4q6PW6pKAM0t1g/732nxfnI07S4DlzRcyGMphNnqkgCncgsLhiVxdGrIVOfXsUxJeN0K5GLCQtlsCBATtVZ7t2Wq13wRjJnql1YqK6GbYJkBJUyg5+jmgflPZDg9uKSgxK8xekD4bSBTyCZ2FSeJN41bUQuO++vi/828vRYpKzGPq87fQV/1WLgS5mgrXWKphyYRb6L10c1nAf//gdqIpHi" + }, + "app.js.tpl.merge": { + "bf7e5518d2efd28e0a64077e1e7666428cf994ae": "eJx1VdtuEzEQfc9XjILQblDkpCEtEFRxKTxEAlRxkxDiwV1PErdee/GlSajCtzP2ZnMhiR/2NnPOzBx7Zh8ey7Iy1l/z4o5PMS9MyRzqYsZZ8FJ1Hq96T1pA6+tMOphIhUD3KWq03KMArgWESqTnmyV8SVC4KgWDHyZAwTWgkB78Bs5d4tOIgjATY2FpggVeVUoW3Euju3ATIgIdJrCDuVQKZvwewRu4QSjRTlPARLUNCvMZaqBwFVpiLh0URmCTLlGD5+7OgQvFjBLZGPSU8pknspIAynUJqL01SqF1QDneS5y7VG0KYYPWEdWutYrZkwxTywW2WSsRjQVypZZAZj1FFzPfijA3QYlYiZKlbHQsjfNksXdbszAaE5vUYEgRC5XiBbHlTQlX2zw7DMaTXTVIfW18rVZSOVE1CcWQUdztZkaxulG+pHdljQgFbRi0awaSZEJ75NtUCPeRMPEl57idsUSLzijap5LrEMtnrSe9Vuv9wrOdDc4f6iPASxxB9kCWT/S4yrq1chZ/B0lEI/iZ3uPKIsVHdI4O6VuzyJLh1xqQNmfP+yOXet9HUvYjeNi6nD/LKHjMN1hStBcdXG9MV1bpKeWy8Xw2OOX5V1Zc/O9+djY85f96sDjwHp70TuwNJCFWTTEu2q8tUrtWxqEYgbcB11bnufWhGpek1V7JTwf9xfCivx9v7d1bG9lttZffxbC/eDE4gVkbDwS7eL446/eHx0GN9QA1jN8Hp1Br64F+508vFoN+//lx2MZ8qPuLaBiewjXmQ/EVD9RhI5jQLZ3mzo7GvR68Q0cduYwDDB7R2f5guKBZMdYiHn+aJaiwRO03mHi0J2qZZ0ecsw4TNV/eednaDTPW0kuu5B9MkUo68akR9mi/04c43hkXIo8fCovU6vm26VjEsNQvHYqwW6jR3+rJfqLW1JJuyuJckLbMN4a42m+2/Q41T7u775F+KTtjgSa8g9tAQ5CGG22Gm4Q4QG+QBm7zj0lTlMYmvZDfPU09AjL4jIqEA23mr/6Lssmc/ine6LHYraBZcgIbO1xeXkK2RJcd84xrLrUwc6ZMnTazKXi+Vm93rVrH3xqhWyt6+geQsUAZ" + }, + "app.json.tpl.merge": { + "a36200bbd84dffd4133a6074252425c15a5f25b1": "eJzFWMtu2zgU3ecrCGOAtoFjrWYTTAtk0hTNTJoWdYpZtF3QFGWxpUiVpOwYgf99zqUeluwkrdOiERBIscR7z33wHJI3BwxXcngY7+yQXeWS8bLUSvCgrHnimeGF9CUXcswqL1M2W7GpNCLn7NQWBTcpC5bNpZGOB8mE5t5L35hL4n1EJkbHbHRDD+vR+OA2r5nSkpU85GQv5Mpv4cicNYG9vnpzwVIrqkKaMGZOarxfyP6YyRdvTTQ3RKFMKq9fh0K/gxOCE3+Y5PjlDkh85q2uENWH9xe3oWLKsFQupLYlwWHSLBRQ1tDURB5jRDfYVWbHQOsMpla2cmwpZ2zm7NJLx9LKKTPv2x8zOZkDdx5CeZwk2gquc+tDUqxgM+mFM2kMb4KB3wXXlWR4MFKmKOQyl4bNKqVjBZ1ErEhkxDHMfCpLCdtGKOmZypgK+PpbpTCEAelCuiOvUhlNVE501Ue4PDDuJDMWd4E3Xs1Q5YXidbn9ygdZsNLZYIXVk2HBKqdRJlNpvVueC+UDsxnjWrN/+IJPhVMlnKD5gqe6UOadmueoyrUUVSyXdal0rRN2xkWOWOCfioK3sy9SBLZU1ILUkFZru6QaZNYVPBy3A+N1M/gv4i2bvqJ7EmziIya044glCXvXtDYFPqY0xvrVeUBGiwoBzeSPdXTPqZOFDTS7gkN1BxecPn1bUuRcP9sZed+FkUfspcx4pZFNIKlQ/0wZdM3TjGsvV8/oV6/mMM14P5RlrpDWpUJdEI2wpZLp/r6npRQqW9VBIVcxE3WqkBFWB73jkNoMsO72O6rKlMdsjVKpAx/9qmwB8nkW/fuIHM7HPdARnTV6Rdi05TT9rCFKBX/u7YsxgdaFCWXivIvZnwbr+FyiUkHp2nU34UHWZi7TyQOiavOEtErDafJamu+YH0dcgaToLauzStNkE/NDfGWY6iNWSG5gA8+t4babCiSupq1NauvY/G6pr49m1gYfHC+3Z8dPlfrcpESNkvqwT/6FBbhY444vVxPG9jUP3fF1Z/tNU3cdjZJHXpANcacgYYHKr8BtmBWZdHC7/4Rr+LJT8Y5zoO8qk2CmurYogRLO1i3stlUmXushh4P8jtnHg9bXzUHfc8eYN5nDymBp3VdiyXXi4wLjKNhK5H+FUoMCno+0mjmOSJ8/Z09A+09GL45w+yvB+xdEsuOh7d36d+/X4+8B6ob+asN1ZrdNzsCvuiXxMQldr81qFUUnxLXVUI1JXAWYBB8a/HX90RHPRuObinQ+t6lwE0R8+ny/5p5Op7eKrTJCV/4RxJZsT4R/JK19MKM8otI+ktD+TKp+l8z+jMpGqURbYwlvDXgaArHcP8zforu/THbvUwCakz8gAd3mIcGAhCYiDdziyf0564OvK8KrYEEroFSN9thsV6nEk07lnsbt5Z+DPV78pBPCZz1exVap5tZhwBh8SmMAcxNrB6mG1VIpsVbHoKcnp6/P2JuTy/NXZ9MrbK3EZo/Yc1BntfHwcZig3h6we/F5vBeKy7Or/96+//d+90YGUutdAIcP9vvq5OLi75PT7zgGJ+oZF9Hz5/jzerfoZ9cQ5812dEBVUC8LldkI47B43aBBaL3uVAXmf78x++8gxXe88oG7UJWju/r0FXVV0lvP0VEJui6gzC5GAAWwruk8hLIireyvBf240zVQkkoR/7zS3GH/WzraeQPb1oFItDgM9NOniV+YP+7E+bID2B7V+ECwaE0ANwtlK0/7+bSKRWygTdglyUhcyRBg5CnQmrmdhx3JRoLpktA6beP6KktaYQQu6gUp/JSg2cZKXHRkNTV6fB6WEqmqKWMrcu5EDt1vD4Kaf285BWo7tUTLEe/Hw7D6uCQegHTrYlGkzToLoOigY7ut6vOSLtm3UZVR3yrZYydkJd2Qe4+TmpM4TpnGYuE6fjTQp69y5bu11yWtqIj2iLB8biugNNi5uIbFezq2dQKj0rg6ryKy83Q9Olgf/A/eSIqN" + }, + "index.html.tpl.merge": { + "5c2622f8945945e183e62230dbbcdc870ee41e31": "eJydVU1vGjEQvfMrJhvlEnVZogoppYAq5UONlKqVQg49eu0BHLz2yh4gKMp/z3gXkuVDRakPyGY8857fjN72T65/X43+/rmBn6Nf98NWf0qFgUJYPcZAgyQBI+xkkKBNHx+SGEehhi3g1S+QBMip8AH55uPoNr1M1iHSZHD4YkWBr/2sPtWRQCuDQKsSBwnhM2UyhHVWtbLz84/DOdw8i6LkBDcGYUFbTVoYME4obSd8VloKcr7dzLkj0AE8SlcUaBUqIAczxBJoygERoOBCBdfhbelC0Hmk5KD0bqEVctlAwhKMEVUu5KxZfDnVkQ5N0TNEcHMvkWt6hEDaGMgxEosEGXfsPGMijLUPBKQLbJTK3vdR8y+QO7WCl48LMYB6MqUeXHQ6Z9+3IpHWxLu5Val0xvkenF58u+xed95vvbbet6eiLO9rye42iu0gsQwsrbM9EHlwZk64jUeu7EF3l0Uh/ETbtAqmF93yeSeJ+5sKoydcVqIl9NvxpVY0PfS6zbu/dnZLpkvMZ5qrxgZGwmmcMWa9/8JjiWruRf3kTrsbjt3WzL7eSVaduWk7juOIR2E0T2KNY7RF0eB1rEVDnreXY22/rdY2C6VDacQqkoyYaW6cnH1W4tx5hT71TGoeuEt77a27z/LBXmjd2f3irhRS0ypqfnlQiB8b+Bmuxp57Gw71dluVztmOTLtIW8HXrVP3SPI/UuPc/h9wvetnlRmujfEkTWHEXhEbxi5i3BKKObtGjuxdJVuaJSGpspQHtGy7cMX+JmzlbvlcGwUrdqOoloki8cRBmm5cV3oda6hBUmjpXeVPPmn68JNYiPpaAsHLQdIOFUzGBbNGUqZwwexKtlZqP7F38zOqNP44ZPXXoR+tbI2s9KKCPdDEhu3Ha1wo/n7qv/W2n9WITICtdNh6Az5F4Bg\u003d" + }, + "packager.json.tpl.merge": { + "79175610d9330cc0582cd66bb8103f2e24409b4a": "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\u003d" + }, + "app.scss.tpl.merge": { + "3d3f6b023c31a4e49cd626dd27cff9474aff32d7": "eJx9kL1uAyEQhHs/xXRnS8nRx40lK0Xq8wusYc8QceyJH5/99gHsOh3MDLMfqxQuljGL97K5cEPeBN4FTnDLKjEjV9vwTMVnTBy0JVykaNuMhUf8zHhKAUXGtThvaslOKRACb6/MByIvcud+AwXTO8mY9jBCtoDzNEECsqyQudtXStzl/Wadtq3SJZCPTOYJF7Qvhk09vEpoXcffVCtm5/kw7k5v+iF15M/ckNX7H8Pxf1+R9zXTZp5LyrJAi2HcpG7FcuRx7N73g5bVV60il9SXV8GdrhSLe7jw1UKnN2rX90NJHIfD8Q/mSX+o" + }, + "config.rb.tpl.merge": { + "e254e92dd21bc9ecb27f3b8251d67dfbc79fa1af": "eJxlkMFOwzAMhu95Cqs7bEiQB0DaCTGEtAPiBSIrddtAG5c4ASrEu+N00kDjYtl/7O+PvYEHypAHgjYk8pnTohVWKQh4jl3oS8IcOEIXRgL6DJIFQjQ6AHs4qGg1jTjRzrnD4/HeuStjNnBkbFeyUPQD3mQufoAuaeMHp1fAknlSssdxXKwZa/tKe+EQd4q8hq2123P8Oo8+YR6+q5RIuCRPUgu1mjRbve94mlEuFhAjqrlZp/XjamD8b3nh3FjbaNSGZgU+01vRAwHGBbBtQ+XhqPyTzzyWPkSBgRJZEybsSdyfA/0Dn1qUzSXPJTvJix53D7eVqGsJtYbie0gcJ4q5vsyJ2+KrsfkBl52Ucw\u003d\u003d" + } + }, + "targets": { + ".sencha/app/build.properties": { + "source": "build.properties.merge", + "version": "ec0f832e80d63d776086203cffe9fed5c73b4294", + "parameters": { + "viewNamespace": "AccordionListExample.view", + "frameworkName": "touch", + "frameworkPath": "touch", + "senchadir": ".sencha", + "appModels": "", + "appControllers": "", + "appViews": "", + "uniqueId": "354dac46-9e8a-47b4-a308-a14fd02d9c9c", + "appName": "AccordionListExample", + "modelNamespace": "AccordionListExample.model", + "name": "AccordionListExample", + "library": "core", + "controllerNamespace": "AccordionListExample.controller", + "appStores": "" + } + }, + ".sencha/app/native.properties": { + "source": "native.properties.merge", + "version": "2c8c063f9588eecff09624782d7369a8a000d61c", + "parameters": { + "viewNamespace": "AccordionListExample.view", + "frameworkName": "touch", + "frameworkPath": "touch", + "senchadir": ".sencha", + "appModels": "", + "appControllers": "", + "appViews": "", + "uniqueId": "354dac46-9e8a-47b4-a308-a14fd02d9c9c", + "appName": "AccordionListExample", + "modelNamespace": "AccordionListExample.model", + "name": "AccordionListExample", + "library": "core", + "controllerNamespace": "AccordionListExample.controller", + "appStores": "" + } + }, + ".sencha/app/package.properties": { + "source": "package.properties.merge", + "version": "c6c1fb2fb1dda28480ad0f6e5caffc9b97d196ae", + "parameters": { + "viewNamespace": "AccordionListExample.view", + "frameworkName": "touch", + "frameworkPath": "touch", + "senchadir": ".sencha", + "appModels": "", + "appControllers": "", + "appViews": "", + "uniqueId": "354dac46-9e8a-47b4-a308-a14fd02d9c9c", + "appName": "AccordionListExample", + "modelNamespace": "AccordionListExample.model", + "name": "AccordionListExample", + "library": "core", + "controllerNamespace": "AccordionListExample.controller", + "appStores": "" + } + }, + ".sencha/app/production.properties": { + "source": "production.properties.merge", + "version": "cbdf9712e9b5d37cecb4d0530ba1fccd0ed004a3", + "parameters": { + "viewNamespace": "AccordionListExample.view", + "frameworkName": "touch", + "frameworkPath": "touch", + "senchadir": ".sencha", + "appModels": "", + "appControllers": "", + "appViews": "", + "uniqueId": "354dac46-9e8a-47b4-a308-a14fd02d9c9c", + "appName": "AccordionListExample", + "modelNamespace": "AccordionListExample.model", + "name": "AccordionListExample", + "library": "core", + "controllerNamespace": "AccordionListExample.controller", + "appStores": "" + } + }, + ".sencha/app/sencha.cfg": { + "source": "sencha.cfg.tpl.merge", + "version": "d2e6e42720f88befc892f12df5fd7bab587f7879", + "parameters": { + "viewNamespace": "AccordionListExample.view", + "frameworkName": "touch", + "frameworkPath": "touch", + "senchadir": ".sencha", + "appModels": "", + "appControllers": "", + "appViews": "", + "uniqueId": "354dac46-9e8a-47b4-a308-a14fd02d9c9c", + "appName": "AccordionListExample", + "modelNamespace": "AccordionListExample.model", + "name": "AccordionListExample", + "library": "core", + "controllerNamespace": "AccordionListExample.controller", + "appStores": "" + } + }, + ".sencha/app/testing.properties": { + "source": "testing.properties.merge", + "version": "360e715956c81757e53736789fe20be045acb544", + "parameters": { + "viewNamespace": "AccordionListExample.view", + "frameworkName": "touch", + "frameworkPath": "touch", + "senchadir": ".sencha", + "appModels": "", + "appControllers": "", + "appViews": "", + "uniqueId": "354dac46-9e8a-47b4-a308-a14fd02d9c9c", + "appName": "AccordionListExample", + "modelNamespace": "AccordionListExample.model", + "name": "AccordionListExample", + "library": "core", + "controllerNamespace": "AccordionListExample.controller", + "appStores": "" + } + }, + "app.js": { + "source": "app.js.tpl.merge", + "version": "bf7e5518d2efd28e0a64077e1e7666428cf994ae", + "parameters": { + "viewNamespace": "AccordionListExample.view", + "frameworkName": "touch", + "frameworkPath": "touch", + "senchadir": ".sencha", + "appModels": "", + "appControllers": "", + "appViews": "", + "uniqueId": "354dac46-9e8a-47b4-a308-a14fd02d9c9c", + "appName": "AccordionListExample", + "modelNamespace": "AccordionListExample.model", + "name": "AccordionListExample", + "library": "core", + "controllerNamespace": "AccordionListExample.controller", + "appStores": "" + } + }, + "app.json": { + "source": "app.json.tpl.merge", + "version": "a36200bbd84dffd4133a6074252425c15a5f25b1", + "parameters": { + "viewNamespace": "AccordionListExample.view", + "frameworkName": "touch", + "frameworkPath": "touch", + "senchadir": ".sencha", + "appModels": "", + "appControllers": "", + "appViews": "", + "uniqueId": "354dac46-9e8a-47b4-a308-a14fd02d9c9c", + "appName": "AccordionListExample", + "modelNamespace": "AccordionListExample.model", + "name": "AccordionListExample", + "library": "core", + "controllerNamespace": "AccordionListExample.controller", + "appStores": "" + } + }, + "index.html": { + "source": "index.html.tpl.merge", + "version": "5c2622f8945945e183e62230dbbcdc870ee41e31", + "parameters": { + "viewNamespace": "AccordionListExample.view", + "frameworkName": "touch", + "frameworkPath": "touch", + "senchadir": ".sencha", + "appModels": "", + "appControllers": "", + "appViews": "", + "uniqueId": "354dac46-9e8a-47b4-a308-a14fd02d9c9c", + "appName": "AccordionListExample", + "modelNamespace": "AccordionListExample.model", + "name": "AccordionListExample", + "library": "core", + "controllerNamespace": "AccordionListExample.controller", + "appStores": "" + } + }, + "packager.json": { + "source": "packager.json.tpl.merge", + "version": "79175610d9330cc0582cd66bb8103f2e24409b4a", + "parameters": { + "viewNamespace": "AccordionListExample.view", + "frameworkName": "touch", + "frameworkPath": "touch", + "senchadir": ".sencha", + "appModels": "", + "appControllers": "", + "appViews": "", + "uniqueId": "354dac46-9e8a-47b4-a308-a14fd02d9c9c", + "appName": "AccordionListExample", + "modelNamespace": "AccordionListExample.model", + "name": "AccordionListExample", + "library": "core", + "controllerNamespace": "AccordionListExample.controller", + "appStores": "" + } + }, + "resources/sass/app.scss": { + "source": "app.scss.tpl.merge", + "version": "3d3f6b023c31a4e49cd626dd27cff9474aff32d7", + "parameters": { + "viewNamespace": "AccordionListExample.view", + "frameworkName": "touch", + "frameworkPath": "touch", + "senchadir": ".sencha", + "appModels": "", + "appControllers": "", + "appViews": "", + "uniqueId": "354dac46-9e8a-47b4-a308-a14fd02d9c9c", + "appName": "AccordionListExample", + "modelNamespace": "AccordionListExample.model", + "name": "AccordionListExample", + "library": "core", + "controllerNamespace": "AccordionListExample.controller", + "appStores": "" + } + }, + "resources/sass/config.rb": { + "source": "config.rb.tpl.merge", + "version": "e254e92dd21bc9ecb27f3b8251d67dfbc79fa1af", + "parameters": { + "viewNamespace": "AccordionListExample.view", + "frameworkName": "touch", + "frameworkPath": "touch", + "senchadir": ".sencha", + "appModels": "", + "appControllers": "", + "appViews": "", + "uniqueId": "354dac46-9e8a-47b4-a308-a14fd02d9c9c", + "appName": "AccordionListExample", + "modelNamespace": "AccordionListExample.model", + "name": "AccordionListExample", + "library": "core", + "controllerNamespace": "AccordionListExample.controller", + "appStores": "" + } + } + } +} \ No newline at end of file diff --git a/examples/.sencha/app/defaults.properties b/examples/.sencha/app/defaults.properties new file mode 100644 index 0000000..9746e01 --- /dev/null +++ b/examples/.sencha/app/defaults.properties @@ -0,0 +1,584 @@ +# ============================================================================= +# This file defines properties used by build-impl.xml and the associated +# *-impl.xml files (sass-impl.xml, js-impl.xml, etc.), which are the core of +# the applications build process. +# +# This file represents the lowest priority file for defining these properties +# as well as the place to look for documentation and learning what properties +# exist. +# +# The full set of these files is as follows (in priority order): +# +# - One of these (based on build.environment): +# - production.properties +# - testing.properties +# - native.properties +# - package.properties +# +# - build.properties +# +# - One of these (based on app.framework): +# - ext.properties +# - touch.properties +# +# - One of these (based on build.environment): +# - production.defaults.properties +# - testing.defaults.properties +# - native.defaults.properties +# - package.defaults.properties +# +# - defaults.properties +# +# Properties are controlled by the first file in the above list to define the +# value. Values from all levels, however, can reference each other via the +# property expansion. +# +# IMPORTANT - This file should not be modified by an app as it is overwritten +# during each app upgrade. +# ============================================================================= + +# ***************************************************************************** +# Global Build Properties +# these are cross-concern properties used by many build phases +# ***************************************************************************** + +# the default build enviornment type (production, testing, native, package) +# NOTE: this is only a default and will typically be set before this file is +# loaded, typically by the 'sencha app build" command. +# See "sencha help app build" for details. +# +# The corresponding properies files: +# (production.properties, testing.properties, etc.) provide examples of +# overriding sets of properties depending on the selected environment +# NOTE: this replaces the deprecated args.environment +build.environment=production + +# the directory to place built application files +build.dir=${workspace.build.dir}/${build.environment}/${app.name} + +# a temporary output directory used for staging intermediate build artifacts +build.temp.dir=${workspace.build.dir}/temp/${build.environment}/${app.name} + +# the directory under the output folder for placing resources +build.resources.dir=${build.dir}/resources + +# ***************************************************************************** +# JS +# these properties control various aspects of output js code construction +# ***************************************************************************** + +# the output js file that contains all needed js code +build.classes.name=app.js +build.classes.file=${build.dir}/${build.classes.name} + +# the output js file for framework code, if the framework +# classes are not included in the default all-classes.js file +build.framework.name=framework.js +build.framework.file=${build.dir}/${build.framework.name} + +# Don't use these - they are deprecated +build.options.debug.enable=debug:true +build.options.debug.disable=debug:false +build.options.logger.enable=logger:yes +build.options.logger.disable=logger:no + +# This property enables/disables blocks in js output, see build.options +build.options.logger=no + +# This property enables/disables blocks in js output, see build.options +build.options.debug=false + +# This property can be used to pass custom build options in addition to any of the other +# build.options flags. When overlapping, these options take priority, see build.options +build.options.custom= + +# This value is specified by the framework +build.options.default= + +# This property contains the framework ("product") used for filtering of JavaScript using +# the preprocessor. This is set by either ext.properties or touch.properties. +# +#build.options.product=touch + +# This property contains the desired API level used for preprocessor filtering of JavaScript. +# This is set by either ext.properties or touch.properties. +# +#build.options.minVersion=2.1 + +# This property holds the set of js preprocessor options in the form: +# +# name1:value1,name2:value2,... +# +# (used by -init-compiler in init-impl.xml) +# +# This property is not likely to be set directly. Rather, you should set one of the +# contributing properties that are combined to form this one: +# +# build.options.debug +# build.options.logger +# build.options.custom +# +# The other properties that contribute to this are typically not needing to be set: +# +# build.options.product +# build.options.minVersion +# +build.options=logger:${build.options.logger},debug:${build.options.debug},product:${build.options.product},minVersion:${build.options.minVersion},${build.options.default},${build.options.custom} + +# This property can be modified to change general build options +# such as excluding files from the set. The format expects newlines +# for each argument, for example: +# +# build.operations=\ +# exclude\n \ +# -namespace=Ext\n +# +# NOTE: modifications to build.operations are intended to be +# placed in an override of the "-after-init" target, where it +# can be calculated based on other +# ant properties +# +# build.operations= + +# enables / disables the full class optimizer during js builds +# (used by the -compile-* targets in js-impl.xml) +build.optimize.enable=\ + optimize\n \ + -define-rewrite\n +build.optimize.disable= +build.optimize=${build.optimize.disable} + +# enables / disables yui compression +build.compression.yui=0 + +# enables / disables closure compression +build.compression.closure=0 + +# enables / disables uglify compression +build.compression.ugilfy=0 + +build.compile.temp.dir=${build.temp.dir}/sencha-compiler + +# controles whether to keep the temp compile dir after the build +build.compile.temp.dir.keep=true + +# ------------------------------------------ +# DOC ONLY - Do Not Set +# this variable will be set to the appropriate compressor +# option, and is calculated in init-impl.xml, but may be overridded in +# app.properties, .properties, or via command line +# +# build.compression= +# ------------------------------------------ + +# ***************************************************************************** +# Page +# these variables control aspects of building the output markup page +# ***************************************************************************** + +# controls whether the output will be microloader-enabled, or markup only +build.output.markuponly=false + +# controls whether the microloader content will be embedded in the output +# markup, or left as a separate resource +build.enable.embedded.microloader=true + +# whether to include the page's manifest.json code with the +# microloader content. Production.properties files should set this to +# false to have app.json exist as a server resource. +build.enable.embedded.manifest=true + +# enables / disables delta patch generation +enable.deltas=false + +# enables / disables generation of cache manifest +enable.cache.manifest=false + +# enables / disables compression of resources referenced in app.json / package.json +# js and css entries +enable.resource.compression=false + +# defaults to index.html, but may be overridden in app.json +app.indexHtmlPath=index.html + +# the input page file for the application +app.page.name=${app.indexHtmlPath} +app.page.file=${app.dir}/${app.page.name} + +# the output page file +build.page.name=${app.page.name} +build.page.file=${build.dir}/${build.page.name} + +# the directory where the microloader files may be found +app.microloader.dir=${app.config.dir}/microloader + +# the file names of the individual microloaders +app.microloader.development=development.js +app.microloader.testing=testing.js +app.microloader.production=production.js + +# the target microloader to use for builds +app.microloader.name=${app.microloader.development} +app.microloader.path=${app.microloader.dir}/${app.microloader.name} + +# specifies how to embed the microloader code into the output markup +# {0} is replaced with the content of the microloader file specified +# by app.microloader.path +build.microloader.code.tpl={0} + +# the template to use when generating a stand-alone json manifest file +build.microloader.json.tpl.standalone={0} + +# the template to use when embedding the manifest json directly next to the +# microloader in the output microloader content +build.microloader.json.tpl.embedded=Ext.blink({0}); + +# the template to use in the output microloader content when supplying +# the manifest json as a separate server-side resource ('production' builds) +build.microloader.json.tpl.external=Ext.blink('{'id:''${app.id}'''}'); + +# the template string to use when embedding the microloader content +# into the output markup +build.embedded.microloader.tpl= + +# the name of the output microloader file +build.microloader.name=microloader.js + +# the path to the microloader content file, if external to the outpout markup +build.microloader.path=${build.dir}/${build.microloader.name} + +# the inner markup to embed into the output markup when not including +# the microloader content directly into the output markup +build.embedded.microloader.src=${build.microloader.name} +build.external.microloader.markup= + +# a flag indicating which mode the microloader should run in (production, testing, etc.) +# currently unused : is a placeholder for future microloader interactions +build.microloader.mode=${build.environment} + +# the tag name to use when generating the compiler save set for +# the page's js code +build.tag.name=full-page + +# the name of the archive folder containing source versions for +# delta patch generation +build.archive.name=archive +build.out.archive.path=${workspace.build.dir}/${build.archive.name}/${app.name} + +# the name of the output folder for calculated delta patches +build.deltas.name=deltas +build.out.delta.path=${build.dir}/${build.deltas.name} + +# the output cache manifest file +build.manifest.name=cache.appcache +build.manifest.path=${build.dir}/${build.manifest.name} + +# the path to the output markup page +build.out.page.path=${build.dir}/${app.page.name} + +# the name of the manifest json file +build.json.name=app.json + +# the full path to the manifest json file +build.out.json.path=${build.dir}/${build.json.name} + +# Defines the file that will contain Ext.setVersion calls for each used package. +build.out.package.versions=${build.compile.temp.dir}/cmd-packages.js + +# a temp directory for managing extracted resources during the page build +build.app.temp.dir=${build.compile.temp.dir}/app + +# ***************************************************************************** +# Refresh +# these properties are used for generating bootstrap js and css +# files to support dev-time interaction with the app +# ***************************************************************************** + +# the base path to use for generating / calculating bootstrap info +app.bootstrap.base.path=${app.dir} + +# these control the name of the bootstrap js file +# note: there will be corresponding entries in either the index page +# or app.json that reference these names +app.bootstrap.js.name=bootstrap.js +app.bootstrap.js=${app.bootstrap.base.path}/${app.bootstrap.js.name} + +# these control the name of the bootstrap css file (for ext 4.2+ apps) +# note: there will be corresponding entries in either the index page +# or app.json that reference these names +app.bootstrap.css.name=bootstrap.css +app.bootstrap.css=${app.bootstrap.base.path}/${app.bootstrap.css.name} + +# the microloader to use for bootstrapping operations +app.microloader.bootstrap=${app.microloader.dir}/${app.microloader.development} + +# the name of the bootstrap microloader manifest +build.json.bootstrap.name=bootstrap.json + +# the full path to the bootstrap microloader manifest +build.json.bootstrap.path=${app.dir}/${build.json.bootstrap.name} + +# ***************************************************************************** +# Sass / Css +# properties for controling features of sass generation and compilation +# ***************************************************************************** + +# controls the ruby command that is used to execute compasss +# a full path to ruby may be specified rather than allowing the system +# shell to resolve the command +build.ruby.path=ruby + +# -------------------- +# these control properties select the mode used to build the app's styling +# see sass-impl.xml for how then are used + +# enables theme builds for apps using ext 41 style themes +enable.ext41.themes=false + +# enables theme builds for apps using ext 42 style themes +enable.ext42.themes=false + +# enables theme builds for apps using touch style themes +enable.touch.themes=false +# -------------------- + +# selector count threshold to use when +# splitting a single css file into multiple +# css files (IE selector limit workaround) +# +# NOTE: applies only to ext js 4.2+ style theme management, currently +# see the above theme control variables for details +build.css.selector.limit=4095 + +# enables / disable css preprocessor (enable.ext42.themes only) +build.css.preprocess=true + +# sets the css preprocessor options, in the form: +# name1:value1,name2:value2,... +build.css.preprocessor.opts= + +# enables / disable css compressor (enable.ext42.themes only) +build.css.compress=true + +# controls the directory used to generate the output app scss file +# for apps that use theme packages +build.sass.dir=${build.temp.dir}/sass + +# Specify the name for the individual resource dirs in the app +# (enable.touch.themes only) +app.sass.name=sass + +# Specify the sass path in the app +# (enable.touch.themes only) +app.sass.dir=${app.dir}/resources/${app.sass.name} + +# name prefix to use for output css / sass files +app.out.base=${app.name}-all +app.out.base.debug=${app.out.base} + +# the output sass file to generate (used with enable.ext42.themes) +app.out.scss=${build.sass.dir}/${app.out.base.debug}.scss +# the output ruby compass config file to generate (used with enable.ext42.themes) +app.out.ruby=${build.sass.dir}/config.rb + +# output css file prefix +app.out.css.prefix=${app.out.base.debug} + +# output css file name +app.out.css.name=${app.out.css.prefix}.css + +# output css file path (relative to build directory root +app.out.css.rel=resources/${app.out.css.name} + +# output css file path (full path) +app.out.css=${build.dir}/${app.out.css.rel} + +# separate file name to use for generating a compressed copy +# of the output css file (this default will compress the file in-place) +app.out.css.compressed=${build.dir}/resources/${app.out.base}.css + +# the directory containing sass files for compass to compile +compass.sass.dir=${build.sass.dir} + +# the output directory where compass should place built css files +compass.css.dir=${build.dir}/resources + +# the directory containing the ruby config file for compass +compass.config.file=${app.out.ruby} + +# enables / disables console highlighting for compass +compass.compile.boring=false + +# enables / disables forced rebuilds for compass +compass.compile.force=true + +# enables / disables stack traces in compass failure output +compass.compile.trace=true + +# the directory that will be the current working directory of the compass +# process (controls the location of .sass-cache folder creation) +# NOTE: this directory will also typically need to contain the config.rb file +# used for compass invocation, so it is ideal to set build.sass.dir instead of this +# variable, as that will control both the config.rb location as well as the +# .sass-cache location +compass.working.dir=${build.sass.dir} + +# --------------------------------------------------- +# Legacy properties for ext41 theme directories +# Specify the resources path in the app +app.packages.dir=${app.dir}/packages + +# Specify the theme path in the app (this directory contains the themes) +app.theme.dir=${app.packages.dir} + +# the currently selected ext 41 theme name +theme.name=default +# --------------------------------------------------- + +# ***************************************************************************** +# Slice +# these properties control features of the theme slice build phase +# ***************************************************************************** + +# the resources directory of the application +# note: this property is currently only used for building ext 4.1 style themes +# (used by x-build-theme and x-copy-resources in slice-impl.xml) +app.resources.dir=${app.dir}/resources + +# the directory containing the slicer widget example page +app.example.dir=${app.dir}/sass/example + +# properties to control the recirect css file that is +# generated for the slicer example page +app.example.css.name=example.css +app.example.css.file=${app.example.dir}/${app.example.css.name} + +# the base path for generating the bootstrap code for the +# slicer page +bootstrap.base.path=${app.example.dir} + +# the full file name of the slicer page's bootstrap js file +bootstrap.example.js=${app.example.dir}/bootstrap.js + +# this is the directory used for intermediate build artifacts used +# by the slicer for generating theme images +app.example.build.dir=${build.temp.dir}/slicer-temp + +# the name of the intermediate screenshot file used for image slicing +build.capture.png=${app.example.build.dir}/theme-capture.png + +# the name of the intermediate widget manifest file used for image slicing +build.capture.json=${app.example.build.dir}/theme-capture.json + +# the location of the slicer widget page +app.example.theme.html.name=theme.html +app.example.theme.html=${app.example.dir}/${app.example.theme.html.name} + +# a name prefix used for slicer page temporary artifacts +app.example.base=${app.name}-example + +# the special slicer page scss file name to generate +app.example.scss=${app.example.build.dir}/${app.example.base}.scss + +# the relative path from the slicer css file to the slicer html file +app.example.css.rel=${app.example.base}.css + +# the path to the css file that will be built for the slicer page +app.example.css=${app.example.build.dir}/${app.example.css.rel} + +# the ruby compass config file to generate for slicer page scss +app.example.out.ruby=${app.example.build.dir}/config.rb +app.example.compass.config=${app.example.out.ruby} + +# legacy ext 41 theme property indicating the name of the +# slicer example page contained in the theme directory +theme.page.name=theme.html + +# Options to pass to the "sencha fs slice" command. +build.slice.options= + +# ***************************************************************************** +# Packager +# these properties control features of the native packaging phase of the +# build process +# ***************************************************************************** + +# enables packaging the built application with the Sencha Desktop Packager +# NOTE: currently unsupported +enable.desktop.packager=false + +# skips packaging the built application with sencha mobile packager (stbuild) or cordova/phonegap +skip.native-package=true + +# a property that controls whether a standalone manifest.json file will be +# generated for the native packaged application +enable.standalone.manifest=false + +# these set the name of the mobile native packager's config file +build.mobile.packager.name=packager.json +build.mobile.packager.file=${app.dir}/${build.mobile.packager.name} + +# the default mobile packager config to use when specifying the autorun argument +# with "sencha app build -run native" +build.mobile.packager.default.name=packager.json +build.mobile.packager.default.file=${app.dir}/${build.mobile.packager.default.name} + +# these set the name of the mobile native packager's temporary config file +# that will have the input and output path properties updated +build.mobile.packager.temp.name=packager.temp.json +build.mobile.packager.temp.file=${app.dir}/${build.mobile.packager.temp.name} + +# the input directory for the mobile native packager that contains the +# built Sencha Cmd application +build.mobile.packager.in.dir=${build.dir} + +# the output location of the mobile native packaged application +build.mobile.packager.out.dir.name=native-package-mobile +build.mobile.packager.out.dir=${workspace.build.dir}/${build.mobile.packager.out.dir.name}/${app.name} + +# ***************************************************************************** +# Resolve +# these properties control aspects of the dynamic dependency resolver, which +# uses phantomjs to load the applicaiton and extract Ext.Loader class load +# history. +# ***************************************************************************** + +# enables / disables dynamic dependency resolution +skip.resolve=true + +# enables the local web server. this may be disabled to load the application's +# page from an existing web server. +skip.web-start=false + +# the port number to start the local web server on +build.web.port=54321 + +# the directory representing the root web folder +build.web.root=${workspace.dir} + +# the base url to access the local web server +build.resolve.url=http://localhost:${build.web.port} + +# a template string used to format the detected dynamic dependencies +build.resolve.tpl={0} + +# the mode to use when formatting the detected dynamic dependencies +build.resolve.mode=references + +# the output file for the detected dynamic dependencies +build.resolve.file=${build.temp.dir}/resolve.json + +# controls whether unmatched external references in the specified file will +# generate build warnings or build failures +build.resolve.allow.unmatched=true + +# ***************************************************************************** +# Watch +# these properties adjust the behavior of the app watch process. +# ***************************************************************************** + +# the default set of actions to run when triggering a rebuild +build.trigger.targets=-refresh,-resources,-compass-compile + +# the watcher targets to run that monitor for code changes +build.watcher.targets=-watch-compiler diff --git a/examples/.sencha/app/find-cmd-impl.xml b/examples/.sencha/app/find-cmd-impl.xml new file mode 100644 index 0000000..55d6826 --- /dev/null +++ b/examples/.sencha/app/find-cmd-impl.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + source ~/.bash_profile; sencha which -p cmd.dir -o '$cmddir$' + + + + + + \ No newline at end of file diff --git a/examples/.sencha/app/init-impl.xml b/examples/.sencha/app/init-impl.xml new file mode 100644 index 0000000..9d51916 --- /dev/null +++ b/examples/.sencha/app/init-impl.xml @@ -0,0 +1,214 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/.sencha/app/js-impl.xml b/examples/.sencha/app/js-impl.xml new file mode 100644 index 0000000..1583bce --- /dev/null +++ b/examples/.sencha/app/js-impl.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/.sencha/app/microloader/development.js b/examples/.sencha/app/microloader/development.js new file mode 100644 index 0000000..19572d9 --- /dev/null +++ b/examples/.sencha/app/microloader/development.js @@ -0,0 +1,185 @@ +/** + * Sencha Blink - Development + * @author Jacky Nguyen + */ +(function() { + var head = document.head; + + function write(content) { + document.write(content); + } + + function addMeta(name, content) { + var meta = document.createElement('meta'); + + meta.setAttribute('name', name); + meta.setAttribute('content', content); + head.appendChild(meta); + } + + var xhr = new XMLHttpRequest(); + xhr.open('GET', 'bootstrap.json', false); + xhr.send(null); + + var options = eval("(" + xhr.responseText + ")"), + scripts = options.js || [], + styleSheets = options.css || [], + i, ln, path, platform, theme, exclude; + + if(options.platform && options.platforms && options.platforms[options.platform] && options.platforms[options.platform].js) { + scripts = options.platforms[options.platform].js.concat(scripts); + } + + if (navigator.userAgent.match(/IEMobile\/10\.0/)) { + var msViewportStyle = document.createElement("style"); + msViewportStyle.appendChild( + document.createTextNode( + "@media screen and (orientation: portrait) {" + + "@-ms-viewport {width: 320px !important;}" + + "}" + + "@media screen and (orientation: landscape) {" + + "@-ms-viewport {width: 560px !important;}" + + "}" + ) + ); + document.getElementsByTagName("head")[0].appendChild(msViewportStyle); + } + + addMeta('viewport', 'width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no'); + addMeta('apple-mobile-web-app-capable', 'yes'); + addMeta('apple-touch-fullscreen', 'yes'); + + if (!window.Ext) { + window.Ext = {}; + } + Ext.microloaded = true; + + var filterPlatform = window.Ext.filterPlatform = function(platform) { + var profileMatch = false, + ua = navigator.userAgent, + j, jln; + + platform = [].concat(platform); + + function isPhone(ua) { + var isMobile = /Mobile(\/|\s)/.test(ua); + + // Either: + // - iOS but not iPad + // - Android 2 + // - Android with "Mobile" in the UA + + return /(iPhone|iPod)/.test(ua) || + (!/(Silk)/.test(ua) && (/(Android)/.test(ua) && (/(Android 2)/.test(ua) || isMobile))) || + (/(BlackBerry|BB)/.test(ua) && isMobile) || + /(Windows Phone)/.test(ua); + } + + function isTablet(ua) { + return !isPhone(ua) && (/iPad/.test(ua) || /Android|Silk/.test(ua) || /(RIM Tablet OS)/.test(ua) || + (/MSIE 10/.test(ua) && /; Touch/.test(ua))); + } + + // Check if the ?platform parameter is set in the URL + var paramsString = window.location.search.substr(1), + paramsArray = paramsString.split("&"), + params = {}, + testPlatform, i; + + for (i = 0; i < paramsArray.length; i++) { + var tmpArray = paramsArray[i].split("="); + params[tmpArray[0]] = tmpArray[1]; + } + + testPlatform = params.platform; + if (testPlatform) { + return platform.indexOf(testPlatform) != -1; + } + + for (j = 0, jln = platform.length; j < jln; j++) { + switch (platform[j]) { + case 'phone': + profileMatch = isPhone(ua); + break; + case 'tablet': + profileMatch = isTablet(ua); + break; + case 'desktop': + profileMatch = !isPhone(ua) && !isTablet(ua); + break; + case 'ios': + profileMatch = /(iPad|iPhone|iPod)/.test(ua); + break; + case 'android': + profileMatch = /(Android|Silk)/.test(ua); + break; + case 'blackberry': + profileMatch = /(BlackBerry|BB)/.test(ua); + break; + case 'safari': + profileMatch = /Safari/.test(ua) && !(/(BlackBerry|BB)/.test(ua)); + break; + case 'chrome': + profileMatch = /Chrome/.test(ua); + break; + case 'ie10': + profileMatch = /MSIE 10/.test(ua); + break; + case 'windows': + profileMatch = /MSIE 10/.test(ua) || /Trident/.test(ua); + break; + case 'tizen': + profileMatch = /Tizen/.test(ua); + break; + case 'firefox': + profileMatch = /Firefox/.test(ua); + } + if (profileMatch) { + return true; + } + } + return false; + }; + + + for (i = 0,ln = styleSheets.length; i < ln; i++) { + path = styleSheets[i]; + + if (typeof path != 'string') { + platform = path.platform; + exclude = path.exclude; + theme = path.theme; + path = path.path; + } + + if (platform) { + if (!filterPlatform(platform) || filterPlatform(exclude)) { + continue; + } + Ext.theme = { + name: theme || 'Default' + }; + } + + write(''); + } + + for (i = 0,ln = scripts.length; i < ln; i++) { + path = scripts[i]; + + if (typeof path != 'string') { + platform = path.platform; + exclude = path.exclude; + path = path.path; + } + + if (platform) { + if (!filterPlatform(platform) || filterPlatform(exclude)) { + continue; + } + } + + write(' +
diff --git a/example/packager.json b/examples/packager.json similarity index 98% rename from example/packager.json rename to examples/packager.json index 5faa115..40daa29 100644 --- a/example/packager.json +++ b/examples/packager.json @@ -5,13 +5,13 @@ * This is the name of your application, which is displayed on the device when the app is installed. On IOS, this should match * the name of your application in the Apple Provisioning Portal. */ - "applicationName":"22", + "applicationName":"AccordionListExample", /** * @cfg applicationId * This is the name namespace for your application. On IOS, this should match the name of your application in the Apple Provisioning Portal. */ - "applicationId":"22", + "applicationId":"AccordionListExample", /** * @cfg bundleSeedId diff --git a/examples/resources/css/app.css b/examples/resources/css/app.css new file mode 100644 index 0000000..9563e02 --- /dev/null +++ b/examples/resources/css/app.css @@ -0,0 +1 @@ +html,body{position:relative;width:100%;height:100%}.x-fullscreen{position:absolute !important}.x-body{position:relative;z-index:0}.x-inner,.x-body{width:100%;height:100%}.x-sized{position:relative}.x-innerhtml{width:100%}.x-layout-box{display:flex;display:-webkit-box;display:-ms-flexbox}.x-layout-box.x-horizontal{-webkit-box-orient:horizontal !important;-ms-flex-direction:row !important;flex-direction:row !important}.x-layout-box.x-horizontal > .x-layout-box-item.x-flexed{min-width:0 !important}.x-layout-box.x-vertical{-webkit-box-orient:vertical !important;-ms-flex-direction:column !important;flex-direction:column !important}.x-layout-box.x-vertical > .x-layout-box-item.x-flexed{min-height:0 !important}.x-layout-box > .x-layout-box-item{display:flex !important;display:-webkit-box !important;display:-ms-flexbox !important}.x-layout-box.x-align-start{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.x-layout-box.x-align-center{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.x-layout-box.x-align-end{-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end}.x-layout-box.x-align-stretch{-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch}.x-layout-box.x-pack-start{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.x-layout-box.x-pack-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.x-layout-box.x-pack-end{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.x-layout-box.x-pack-justify{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.x-layout-box-item.x-sized > .x-inner,.x-layout-box-item.x-sized > .x-body,.x-layout-box-item.x-sized > .x-dock-outer{width:auto;height:auto;position:absolute;top:0;right:0;bottom:0;left:0}.x-webkit .x-layout-box.x-horizontal > .x-layout-box-item.x-flexed{width:0 !important}.x-webkit .x-layout-box.x-vertical > .x-layout-box-item.x-flexed{height:0 !important}.x-firefox .x-stretched.x-dock-horizontal > .x-dock-body{width:0}.x-firefox .x-stretched.x-dock-vertical > .x-dock-body{height:0}.x-firefox .x-container .x-dock-horizontal.x-unsized .x-dock-body{-webkit-box-flex:1;-ms-flex:1 0 0px;flex:1 0 0px;min-height:0;min-width:0}.x-firefox .x-has-height > .x-dock.x-unsized.x-dock-vertical > .x-dock-body{height:0}.x-layout-card{position:relative;overflow:hidden}.x-layout-card-perspective{-webkit-perspective:1000px;-ms-perspective:1000px;perspective:1000px}.x-layout-card-item-container{width:auto;height:auto;position:absolute;top:0;right:0;bottom:0;left:0}.x-layout-card-item{position:absolute;top:0;right:0;bottom:0;left:0;position:absolute !important}.x-dock{display:flex;display:-webkit-box;display:-ms-flexbox}.x-dock > .x-dock-body{overflow:hidden}.x-dock.x-sized,.x-dock.x-sized > .x-dock-body > *,.x-dock.x-sized > .x-dock-body > .x-body > .x-inner{width:auto;height:auto;position:absolute;top:0;right:0;bottom:0;left:0}.x-dock.x-sized > .x-dock-body{position:relative;display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;min-height:0;min-width:0}.x-dock.x-unsized,.x-dock.x-stretched{height:100%}.x-dock.x-unsized > .x-dock-body,.x-dock.x-stretched > .x-dock-body{position:relative;display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column;min-height:0;min-width:0}.x-dock.x-unsized > .x-dock-body > *,.x-dock.x-stretched > .x-dock-body > *{-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;min-height:0;min-width:0}.x-dock.x-dock-vertical{-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column}.x-dock.x-dock-horizontal{-webkit-box-orient:horizontal !important;-ms-flex-direction:row !important;flex-direction:row !important}.x-dock.x-dock-horizontal > .x-dock-item{display:flex;display:-webkit-box;display:-ms-flexbox}.x-dock.x-dock-horizontal > .x-dock-item.x-sized > .x-inner,.x-dock.x-dock-horizontal > .x-dock-item.x-sized > .x-body{width:auto;height:auto;position:absolute;top:0;right:0;bottom:0;left:0}.x-dock.x-dock-horizontal > .x-dock-item.x-unsized{-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column}.x-dock.x-dock-horizontal > .x-dock-item.x-unsized > *{-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;min-height:0;min-width:0}.x-ie .x-stretched.x-dock-horizontal > .x-dock-body{width:0}.x-ie .x-stretched.x-dock-vertical > .x-dock-body{height:0}.x-ie .x-has-width > .x-dock.x-unsized.x-dock-horizontal > .x-dock-body{width:0}.x-ie .x-has-height > .x-dock.x-unsized.x-dock-vertical > .x-dock-body{height:0}.x-stretched.x-container{display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column}.x-stretched.x-container > .x-inner,.x-stretched.x-container > .x-body,.x-stretched.x-container > .x-body > .x-inner{display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column;min-height:0px}.x-layout-fit.x-stretched > .x-layout-fit-item{display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;min-height:0;min-width:0}.x-layout-fit{position:relative}.x-layout-fit-item.x-sized{position:absolute;top:0;right:0;bottom:0;left:0}.x-layout-fit-item.x-unsized{width:100%;height:100%}.x-ie .x-stretched > .x-inner,.x-ie .x-stretched > .x-body{min-height:inherit}.x-center,.x-centered{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.x-center > *,.x-centered > *{position:relative}.x-center > .x-floating,.x-centered > .x-floating{position:relative !important}.x-floating{position:absolute !important}.x-layout-float{overflow:hidden}.x-layout-float > .x-layout-float-item{float:left}.x-layout-float.x-direction-right > .x-layout-float-item{float:right}@-webkit-keyframes x-paint-monitor-helper{from{zoom:1}to{zoom:1}}@keyframes x-paint-monitor-helper{from{zoom:1}to{zoom:1}}.x-paint-monitored{position:relative}.x-paint-monitor{width:0 !important;height:0 !important;visibility:hidden}.x-paint-monitor.cssanimation{-webkit-animation-duration:0.0001ms;-webkit-animation-name:x-paint-monitor-helper;animation-duration:0.0001ms;animation-name:x-paint-monitor-helper}.x-paint-monitor.overflowchange{overflow:hidden}.x-paint-monitor.overflowchange::after{content:'';display:block;width:1px !important;height:1px !important}.x-size-monitored{position:relative}.x-size-monitors{position:absolute;left:0;top:0;width:100%;height:100%;visibility:hidden;overflow:hidden}.x-size-monitors > *{width:100%;height:100%;overflow:hidden}.x-size-monitors.scroll > *.shrink::after{content:'';display:block;width:200%;height:200%;min-width:1px;min-height:1px}.x-size-monitors.scroll > *.expand::after{content:'';display:block;width:100000px;height:100000px}.x-size-monitors.overflowchanged > *.shrink > *{width:100%;height:100%}.x-size-monitors.overflowchanged > *.expand > *{width:200%;height:200%}.x-size-change-detector{visibility:hidden;position:absolute;left:0;top:0;z-index:-1;width:100%;height:100%;overflow:hidden}.x-size-change-detector > *{visibility:hidden}.x-size-change-detector-shrink > *{width:200%;height:200%}.x-size-change-detector-expand > *{width:100000px;height:100000px}.x-translatable{position:absolute !important;top:500000px !important;left:500000px !important;overflow:visible !important;z-index:1}.x-translatable-hboxfix{position:absolute;min-width:100%;top:0;left:0}.x-translatable-hboxfix > .x-translatable{position:relative !important}.x-translatable-container{overflow:hidden;width:auto;height:auto;position:absolute;top:0;right:0;bottom:0;left:0}.x-translatable-container::before{content:'';display:block;width:1000000px;height:1000000px;visibility:hidden}.x-button{display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-align:center;-ms-flex-align:center;align-items:center;background-color:#eee;border:1px solid #ccc;position:relative;overflow:hidden;z-index:1}.x-button .x-button-icon{position:relative;background-repeat:no-repeat;background-position:center}.x-button .x-button-icon.x-shown{display:block}.x-button .x-button-icon.x-hidden{display:none}.x-iconalign-left,.x-icon-align-right{-webkit-box-orient:horizontal;-ms-flex-direction:row;flex-direction:row}.x-iconalign-top,.x-iconalign-bottom{-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column}.x-iconalign-bottom,.x-iconalign-right{-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.x-iconalign-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.x-button-label,.x-badge,.x-hasbadge .x-badge{-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;-webkit-box-align:center;-ms-flex-align:center;align-items:center;white-space:nowrap;text-overflow:ellipsis;text-align:center;display:block;overflow:hidden}.x-badge{background-color:#ccc;border:1px solid #aaa;z-index:2;position:absolute !important;width:auto;font-size:.6em;right:0;top:0;max-width:95%;display:inline-block}html,body{font-family:"Helvetica Neue", HelveticaNeue, "Helvetica-Neue", Helvetica, "BBAlpha Sans", sans-serif;font-weight:normal;-webkit-text-size-adjust:none;margin:0;cursor:default}body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;padding:0}table{border-collapse:collapse;border-spacing:0}fieldset,img{border:0}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal}li{list-style:none}caption,th{text-align:left}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}q:before,q:after{content:''}abbr,acronym{border:0;font-variant:normal}sup{vertical-align:text-top}sub{vertical-align:text-bottom}input,textarea,select{font-family:inherit;font-size:inherit;font-weight:inherit}*:focus{outline:none}body.x-desktop{overflow:hidden}@-ms-viewport{width:device-width}*,*:after,*:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-touch-callout:none;-webkit-user-drag:none;-webkit-user-select:none;-ms-user-select:none;-ms-touch-action:none;-moz-user-select:-moz-none}input,textarea{-webkit-user-select:text;-ms-user-select:auto;-moz-user-select:text}.x-hidden-visibility{visibility:hidden !important}.x-hidden-display,.x-field-hidden{display:none !important}.x-hidden-offsets{position:absolute !important;left:-10000em;top:-10000em;visibility:hidden}.x-html{-webkit-user-select:auto;-webkit-touch-callout:inherit;-ms-user-select:auto;line-height:1.5;color:#333;font-size:.8em;padding:1.2em}.x-html body{line-height:1.5;font-family:"Helvetica Neue",Arial,Helvetica,sans-serif;color:#333;font-size:75%}.x-html h1,.x-html h2,.x-html h3,.x-html h4,.x-html h5,.x-html h6{font-weight:normal;color:#222}.x-html h1 img,.x-html h2 img,.x-html h3 img,.x-html h4 img,.x-html h5 img,.x-html h6 img{margin:0}.x-html h1{font-size:3em;line-height:1;margin-bottom:0.50em}.x-html h2{font-size:2em;margin-bottom:0.75em}.x-html h3{font-size:1.5em;line-height:1;margin-bottom:1.00em}.x-html h4{font-size:1.2em;line-height:1.25;margin-bottom:1.25em}.x-html h5{font-size:1em;font-weight:bold;margin-bottom:1.50em}.x-html h6{font-size:1em;font-weight:bold}.x-html p{margin:0 0 1.5em}.x-html p .left{display:inline;float:left;margin:1.5em 1.5em 1.5em 0;padding:0}.x-html p .right{display:inline;float:right;margin:1.5em 0 1.5em 1.5em;padding:0}.x-html a{text-decoration:underline;color:#06c}.x-html a:visited{color:#004c99}.x-html a:focus{color:#09f}.x-html a:hover{color:#09f}.x-html a:active{color:#bf00ff}.x-html blockquote{margin:1.5em;color:#666;font-style:italic}.x-html strong,.x-html dfn{font-weight:bold}.x-html em,.x-html dfn{font-style:italic}.x-html sup,.x-html sub{line-height:0}.x-html abbr,.x-html acronym{border-bottom:1px dotted #666666}.x-html address{margin:0 0 1.5em;font-style:italic}.x-html del{color:#666}.x-html pre{margin:1.5em 0;white-space:pre}.x-html pre,.x-html code,.x-html tt{font:1em "andale mono","lucida console",monospace;line-height:1.5}.x-html li ul,.x-html li ol{margin:0}.x-html ul,.x-html ol{margin:0 1.5em 1.5em 0;padding-left:1.5em}.x-html ul{list-style-type:disc}.x-html ol{list-style-type:decimal}.x-html dl{margin:0 0 1.5em 0}.x-html dl dt{font-weight:bold}.x-html dd{margin-left:1.5em}.x-html table{margin-bottom:1.4em;width:100%}.x-html th{font-weight:bold}.x-html thead th{background:#c3d9ff}.x-html th,.x-html td,.x-html caption{padding:4px 10px 4px 5px}.x-html table.striped tr:nth-child(even) td,.x-html table tr.even td{background:#e5ecf9}.x-html tfoot{font-style:italic}.x-html caption{background:#eee}.x-html .quiet{color:#666}.x-html .loud{color:#111}.x-html ul li{list-style-type:circle}.x-html ol li{list-style-type:decimal}@-webkit-keyframes x-loading-spinner-rotate{0%{-webkit-transform:rotate(0deg)}8.32%{-webkit-transform:rotate(0deg)}8.33%{-webkit-transform:rotate(30deg)}16.65%{-webkit-transform:rotate(30deg)}16.66%{-webkit-transform:rotate(60deg)}24.99%{-webkit-transform:rotate(60deg)}25%{-webkit-transform:rotate(90deg)}33.32%{-webkit-transform:rotate(90deg)}33.33%{-webkit-transform:rotate(120deg)}41.65%{-webkit-transform:rotate(120deg)}41.66%{-webkit-transform:rotate(150deg)}49.99%{-webkit-transform:rotate(150deg)}50%{-webkit-transform:rotate(180deg)}58.32%{-webkit-transform:rotate(180deg)}58.33%{-webkit-transform:rotate(210deg)}66.65%{-webkit-transform:rotate(210deg)}66.66%{-webkit-transform:rotate(240deg)}74.99%{-webkit-transform:rotate(240deg)}75%{-webkit-transform:rotate(270deg)}83.32%{-webkit-transform:rotate(270deg)}83.33%{-webkit-transform:rotate(300deg)}91.65%{-webkit-transform:rotate(300deg)}91.66%{-webkit-transform:rotate(330deg)}100%{-webkit-transform:rotate(330deg)}}@keyframes x-loading-spinner-rotate{0%{-ms-transform:rotate(0deg)}8.32%{-ms-transform:rotate(0deg)}8.33%{-ms-transform:rotate(30deg)}16.65%{-ms-transform:rotate(30deg)}16.66%{-ms-transform:rotate(60deg)}24.99%{-ms-transform:rotate(60deg)}25%{-ms-transform:rotate(90deg)}33.32%{-ms-transform:rotate(90deg)}33.33%{-ms-transform:rotate(120deg)}41.65%{-ms-transform:rotate(120deg)}41.66%{-ms-transform:rotate(150deg)}49.99%{-ms-transform:rotate(150deg)}50%{-ms-transform:rotate(180deg)}58.32%{-ms-transform:rotate(180deg)}58.33%{-ms-transform:rotate(210deg)}66.65%{-ms-transform:rotate(210deg)}66.66%{-ms-transform:rotate(240deg)}74.99%{-ms-transform:rotate(240deg)}75%{-ms-transform:rotate(270deg)}83.32%{-ms-transform:rotate(270deg)}83.33%{-ms-transform:rotate(300deg)}91.65%{-ms-transform:rotate(300deg)}91.66%{-ms-transform:rotate(330deg)}100%{-ms-transform:rotate(330deg)}}@font-face{font-family:"Pictos";src:url('data:application/x-font-woff;base64,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') format('woff'), url('data:font/truetype;base64,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AQIFAw4BAQQCCAEBBAIBAQMDAgYGAgECAgEBAQICAQ0DAQICBQEMBwIFAgICBgMCBQQCBAQMAQMBAQEBBAUBAwkBAwEBAgEDAgIBBAICBgECBgMCBQIGCAUFAQUIAQMFAQELAQEGAQIDAQEBBAEBAQMCBgIEAwQGAgQHAgMDAQIGAQIBAQICAQQBBQECGwQCAQUDAQIDAgcFCAMBBgMEAwQEBAMDAQIDAwUCAgEIBgIKAQ0EBAIGAwQMAwELAQcJCAIDAgYDAQcBBwYDBAYCAgUBAwEBCwcIAgEKIceMUo4vBwIDBQUBBAIKAgEBAQMBAQMCBQIDAgJFAhkBAgEBBwQHAgoBAQUCAwMDAQIJAQUClAEFBQsCCAEDBAcBBAUBAwMBAScCBgEDAwIEAQIBBQEHAgMCAgMMBAMBAQIHARYCAgMEBQQCAgEBBAEBAwYBAwOgAQPKAgMBAQMCAQUCAQEWAgcCBQFxBgoGBQEDAgICCQEJAQ4EAgEBAQQCAgECBAECAQEBAQ8HARMPAgECAQUEAQMFAQIBAQQBBAQGBgMDCwENCgoBBwoDCQQIBAQDAwQEAgECAQIDAgEDAwQCBAEEAQIEAQMDAwUJAQgNAQMICAoQBgIICQYBAgICAQUCBQYGAQUBAgoDAQH+YwMEAgEBEQQHAgMBAggEBQUGIwICAQENAQcBBwIBCAIfBAUGAgEBJgMEAgIBARABAQF9AgICuvb+pPb2AVwzAwMFAggECwIBBAIECQIBAgECBgECAgIEBwECAQMEAgX+wFprEwkCCQIBAwgEBAMHAgQBBAEHAQMDBQoEAQMEAQIBAQIIAgEEAgYCAgMFAQcEDAUMDgIKAQsECQQBAgkBCQICAQEBAQIDAgwDAQQDBAcBAQEKAQQKAQIBBwQCBgkBBQEFAQECAwYDDAMEAgcBAgIBAQESAgMEAwEBAQQJAQgKAQICAQQDBgIEBgYBBAYFAQIBAgECAQIGBAgBAwMCAgEDAQsDAgYCAwoCAgcEAQIGBQ0IBAMCAgIBAQIIBAICCQIEAgECBQQCAQM4QFsBAwEGAgcCBgIBAQICBAEBAQIBAQECAQICAQIDBAMCBAMKBwEKAQoDAQICCwICAQQCBQEBAQEBCwIHBAECAQEBAQIPCAQBAgMEBgoCAQUDAQICAgYGAgQFAgEJAwECAQ0DAQMCBgQBCQMC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') format('truetype'), url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/Pgo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiID4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8bWV0YWRhdGE+ClRoaXMgaXMgYSBjdXN0b20gU1ZHIHdlYmZvbnQgZ2VuZXJhdGVkIGJ5IEZvbnQgU3F1aXJyZWwuCkRlc2lnbmVyICAgIDogRHJldyBXaWxzb24KRm91bmRyeSAgICAgOiBEcmV3IFdpbHNvbgpGb3VuZHJ5IFVSTCA6IGh0dHBwaWN0b3NkcmV3d2lsc29uY29tCjwvbWV0YWRhdGE+CjxkZWZzPgo8Zm9udCBpZD0id2ViZm9udEl5Zlpic2VGIiBob3Jpei1hZHYteD0iOTIwIiA+Cjxmb250LWZhY2UgdW5pdHMtcGVyLWVtPSIxMDAwIiBhc2NlbnQ9Ijc1MCIgZGVzY2VudD0iLTI1MCIgLz4KPG1pc3NpbmctZ2x5cGggaG9yaXotYWR2LXg9IjUwMCIgLz4KPGdseXBoIHVuaWNvZGU9IiAiICBob3Jpei1hZHYteD0iNTAwIiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4MDk7IiBob3Jpei1hZHYteD0iNTAwIiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4YTA7IiBob3Jpei1hZHYteD0iNTAwIiAvPgo8Z2x5cGggdW5pY29kZT0iISIgaG9yaXotYWR2LXg9IjkzNiIgZD0iTTg2NSAxMDNxMzcgLTYyIDExIC0xMDYuNXQtOTggLTQ0LjVoLTYyMXEtNzIgMCAtOTcuNSA0NC41dDExLjUgMTA2LjVsMzEwIDUzNHEzNiA2MiA4Ny41IDYydDg3LjUgLTYyek00NzEgNDZxMjMgMCAzOC41IDE2dDE1LjUgMzh0LTE1LjUgMzcuNXQtMzguNSAxNS41cS0yMiAwIC0zNy41IC0xNS41dC0xNS41IC0zNy41dDE1LjUgLTM4dDM3LjUgLTE2ek01MDkgMTg3bDI2IDMwOGgtMTI3bDI2IC0zMDhoNzV6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4MjI7IiBob3Jpei1hZHYteD0iODY1IiBkPSJNNTIgMjg5cTEgNjUgNy41IDExNXQyNi41IDEwMS41dDUzLjUgODYuNXQ5MC41IDU4LjV0MTM1IDI4LjV2LTE1N3EtNjYgMCAtOTUgLTQ2LjV0LTI5IC0xNDcuNWwtNCAtMWg4NHExOCAwIDMxIC0xM3QxMyAtMzJ2LTI1OHEwIC0xOCAtMTMgLTMxdC0zMSAtMTNoLTIyNXEtMTggMCAtMzEgMTN0LTEzIDMxdjI1OHY3ek00OTMgMjg5cTAgNjUgNyAxMTV0MjcgMTAxLjV0NTMuNSA4Ni41dDkwLjUgNTguNXQxMzUgMjguNXYtMTU3IHEtNjcgMCAtOTYgLTQ2LjV0LTI5IC0xNDcuNWwtNCAtMWg4NHExOCAwIDMxIC0xM3QxMyAtMzJ2LTI1OHEwIC0xOCAtMTMgLTMxdC0zMSAtMTNoLTIyNHEtMTkgMCAtMzIgMTN0LTEzIDMxdjI1OHEwIDUgMSA3eiIgLz4KPGdseXBoIHVuaWNvZGU9IiMiIGhvcml6LWFkdi14PSI3NDgiIGQ9Ik03MDUgNDgycTkgLTE0IC04IC0xNGgtNDh2LTU2N3EwIC03IC01IC0xMnQtMTIgLTVoLTUxM3EtNyAwIC0xMiA1dC01IDEydjU2N2gtNTJxLTcgMCAtOS41IDR0MS41IDEwbDMxIDQ2cTkgMTQgMjcgMTRoNzV2NjZxMCAyMCAxMiAzMGw0OCA0OXExMiAxMiAzMCAxMmgyMTZxMTggMCAzMCAtMTJsNTIgLTUycTEzIC0xMyAxMyAtMzB2LTYzaDcxcTE4IDAgMjcgLTE0ek0yNDggNTQ2di00aDI1NHY0djI4cTAgMjAgLTEyIDMwbC05IDEwIHEtMTIgMTIgLTMwIDEyaC0xNTVxLTE4IDAgLTMwIC0xMmwtNiAtNnEtMTIgLTEyIC0xMiAtMzB2LTMyek01NzYgNDUwcTAgMTYgLTE2IDE4aC0yNzloLTg5cS03IDAgLTEyIC01LjV0LTUgLTEyLjV2LTQ3NnEwIC03IDUgLTEydDEyIC01aDM2N3E3IDAgMTIgNXQ1IDEydjQ3NnpNMjYzIDQxOHE3IDAgMTIuNSAtNXQ1LjUgLTEydi0zNzlxMCAtNyAtNS41IC0xMnQtMTIuNSAtNWgtMjFxLTcgMCAtMTIuNSA1dC01LjUgMTJ2Mzc5cTAgNyA1LjUgMTIgdDEyLjUgNWgyMXpNMzY0IDVxLTcgMCAtMTIuNSA1dC01LjUgMTJ2Mzc5cTAgNyA1LjUgMTJ0MTIuNSA1aDIxcTcgMCAxMiAtNXQ1IC0xMnYtMzc5cTAgLTcgLTUgLTEydC0xMiAtNWgtMjF6TTQ4NSA1cS03IDAgLTEyIDV0LTUgMTJ2Mzc5cTAgNyA1IDEydDEyIDVoMjJxNyAwIDEyIC01dDUgLTEydi0zNzlxMCAtNyAtNSAtMTJ0LTEyIC01aC0yMnoiIC8+CjxnbHlwaCB1bmljb2RlPSIkIiBob3Jpei1hZHYteD0iODkzIiBkPSJNNTAzIDI4M2gtMTA4bC0xNiA2OGgxMjR2LTY4ek02ODQgMzUxbC0xOCAtNjhoLTEwNGwxIDY4aDEyMXpNNDAwIDExOHEyOCAwIDQ4LjUgLTIwdDIwLjUgLTQ5dC0yMC41IC00OXQtNDguNSAtMjB0LTQ4LjUgMjB0LTIwLjUgNDl0MjAuNSA0OXQ0OC41IDIwek02NTkgMTE4cTI5IDAgNDkgLTIwdDIwIC00OXQtMjAgLTQ5dC00OSAtMjB0LTQ5IDIwdC0yMCA0OXQyMCA0OXQ0OSAyMHpNODMzIDUxNnEyNSAtNyAyNSAtMzNxMCAtMyAtMiAtOSBsLTg4IC0yOTNxLTcgLTI1IC0zMiAtMjVoLTQxN3EtMTIgMCAtMjEuNSA3LjV0LTExLjUgMTguNWwtODEgMzI3aC0xNDlxLTE0IDAgLTI0IDEwdC0xMCAyNHQxMCAyNHQyNCAxMGgxNzZxMjYgMCAzMyAtMjZsMTggLTczaDUwM2w1IDE1cTYgMjQgMzIgMjRxNyAwIDEwIC0xek03MTIgMjMxbDU0IDE3OWgtNDY2bDQ1IC0xODZoMzY1eiIgLz4KPGdseXBoIHVuaWNvZGU9IiUiIGhvcml6LWFkdi14PSI5MDMiIGQ9Ik04NjcgMjc3cTAgLTc5IC0zNy41IC0xNDl0LTEwMi41IC0xMTdsMTEgLTk2di00cTAgLTE3IC0xMSAtMzBxLTEzIC0xNSAtMzQgLTE1aC0xNDhxLTIxIDAgLTM0IDE1cS0xMSAxMyAtMTEgMzB2NWwyIDE4cS02IC0xIC0xOCAtMWgtMTBsMiAtMTd2LTVxMCAtMTcgLTExIC0zMHEtMTIgLTE1IC0zNCAtMTVoLTE0OHEtMjEgMCAtMzQgMTVxLTExIDEzIC0xMSAzMHY1bDExIDkwcS04NiA2MCAtMTI0IDE1M2wtNDQgLTRoLTRxLTE4IDAgLTMwIDEyIHEtMTUgMTIgLTE1IDMzdjE1MnEwIDIxIDE1IDMzcTEyIDEyIDMwIDEyaDRsNDMgLTRxMzQgODUgMTA3IDE0MWwtMiAxMTB2MXYxcTAgMjggMjUgNDNxMTEgNyAyNiA3cTE0IDAgMjUgLTdsMTI4IC03MnEyNSAzIDUxIDNxMTYwIDAgMjcwIC05OXExMTMgLTEwMCAxMTMgLTI0NHpNNjgxIDQ3cTYxIDQxIDk1LjUgMTAxdDM0LjUgMTI5cTAgMTE4IC05NCAyMDJxLTk2IDg1IC0yMzMgODVxLTI5IDAgLTUzIC00bC05IC0xbC0xMzYgNzdsMiAtMTMwIGwtMTIgLThxLTc5IC01NyAtMTA2IC0xNDRsLTcgLTIybC03NSA3di0xMjdsNzUgOGw3IC0yMnEzMyAtOTYgMTI0IC0xNTVsMTUgLTlsLTEzIC0xMTJoMTIzbC05IDc0bDM1IC00cTEzIC0yIDM5IC0ycTI0IDAgNDcgM2wzNiA0bC05IC03NWgxMjNsLTE1IDExNnpNNTAxIDUyMWw3IC0xcTcgMCAxOCAtMnQyNiAtNXQzMiAtOXQzNSAtMTR0MzcgLTIwLjV0MzYgLTI4LjVxOCAtNyA4IC0xOXQtOCAtMjBxLTggLTkgLTIwIC05cS0xMSAwIC0xOSA4IHEtMjQgMjMgLTU5IDM4LjV0LTU1LjUgMTkuNXQtMzUuNSA1aC00cS0xMSAxIC0xOSA5LjV0LTggMTkuNXExIDEyIDkuNSAyMHQxOS41IDh6TTIzMSAzODRxMTkgMjAgNDEgMjZ0MzQgLTVxMTEgLTExIDYuNSAtMzN0LTIzLjUgLTQydC00MC41IC0yNnQtMzMuNSA1dC03IDMzdDIzIDQyeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeDI2OyIgaG9yaXotYWR2LXg9IjczMiIgZD0iTTQ2NSA0MDVoMjUwdi0xOThoLTI1MHYtMjUwaC0xOTh2MjUwaC0yNTB2MTk4aDI1MHYyNTBoMTk4di0yNTB6IiAvPgo8Z2x5cGggdW5pY29kZT0iJyIgaG9yaXotYWR2LXg9IjkwOCIgZD0iTTI2NSAxMzlxNzggNzggMTg4LjUgNzh0MTg4LjUgLTc4cTEgMCAxIC0xbC01NSAtNTVxLTEgMCAtMSAxcS01NSA1NSAtMTMzIDU1dC0xMzMgLTU1ek0xNDAgMjY0cTg1IDg1IDE5OS41IDExNS41dDIyOC41IDB0MTk5IC0xMTUuNWwxIC0xbC01NiAtNTZxMCAxIC0xIDFxLTEwNiAxMDYgLTI1Ny41IDEwNi41dC0yNTcuNSAtMTA1LjV6TTg5MyAzOTJxMCAtMiAyIC0ybC01NiAtNTZsLTIgMnEtMTA0IDEwNCAtMjQ0IDE0MXQtMjc5LjUgMCB0LTI0My41IC0xNDFxLTEgMCAtMSAtMWwtNTYgNTZsMSAxcTEyMCAxMTkgMjgwIDE2MS41dDMxOS41IDB0Mjc5LjUgLTE2MS41ek0zOTIgMTNxMjYgMjUgNjMgMjV0NjMgLTI1bC02MyAtNjN6IiAvPgo8Z2x5cGggdW5pY29kZT0iKCIgaG9yaXotYWR2LXg9IjY3MSIgZD0iTTU1MCAzNTloNzd2LTQzN2gtNTgydjQzN2g3NXYxMjhxMCA4NyA2MiAxNDl0MTQ5IDYyaDRoNHE4OCAwIDE0OS41IC02MnQ2MS41IC0xNDl2LTEyOHpNNDAyIDJsLTMyIDE0MXEzMiAyMCAzMiA1N3EwIDI4IC0xOSA0N3QtNDcgMTlxLTI3IDAgLTQ2LjUgLTE5dC0xOS41IC00N3EwIC0zOCAzMyAtNTZsLTMzIC0xNDJoMTMyek00NDUgMzU5djEyOHEwIDQzIC0zMSA3NHQtNzUgMzFoLTNoLTVxLTQzIDAgLTc0IC0zMXQtMzEgLTc0di0xMjggaDIxOXoiIC8+CjxnbHlwaCB1bmljb2RlPSIpIiBob3Jpei1hZHYteD0iODg5IiBkPSJNNjQ1IDY5OHE4OCAwIDE1MCAtNjEuNXQ2MiAtMTQ5LjV2LTEyOGgtMTA2djI5bDM2IDM0djEzaC0zNnY1MnEwIDQ0IC0zMSA3NC41dC03NSAzMC41aC0yaC01cS00NCAwIC03NSAtMzAuNXQtMzEgLTc0LjV2LTEyOGg3N3YtNDM4aC01ODR2NDM4aDQwMXYxMjhxMCA4OCA2MiAxNDkuNXQxNTAgNjEuNWgzaDR6TTM4MiAwbC0zMyAxNDJxMzMgMjAgMzMgNTdxMCAyOCAtMTkuNSA0Ny41dC00Ni41IDE5LjVxLTI4IDAgLTQ3LjUgLTE5LjUgdC0xOS41IC00Ny41cTAgLTM3IDMzIC01N2wtMzMgLTE0MmgxMzN6IiAvPgo8Z2x5cGggdW5pY29kZT0iKiIgaG9yaXotYWR2LXg9Ijc3NyIgZD0iTTczNyA0OTBsLTE5NSAtMTk1bDE5NSAtMTk2bC0xNTQgLTE1M2wtMTk1IDE5NWwtMTk1IC0xOTVsLTE1NCAxNTNsMTk1IDE5NmwtMTk1IDE5NWwxNTQgMTU0bDE5NSAtMTk1bDE5NSAxOTV6IiAvPgo8Z2x5cGggdW5pY29kZT0iKyIgZD0iTTQ2MCA3MDJxMTc0IDAgMjk3IC0xMjN0MTIzIC0yOTd0LTEyMyAtMjk3dC0yOTcgLTEyM3QtMjk3IDEyM3QtMTIzIDI5N3QxMjMgMjk3dDI5NyAxMjN6TTcwOSAyNjJ2NDFxMCAxNSAtMTAuNSAyNS41dC0yNS41IDEwLjVoLTEyMXEtMTUgMCAtMjUuNSAxMXQtMTAuNSAyNnYxMjFxMCAxNSAtMTEgMjUuNXQtMjYgMTAuNWgtNDFxLTE1IDAgLTI1LjUgLTEwLjV0LTEwLjUgLTI1LjV2LTEyMXEwIC0xNSAtMTEgLTI2dC0yNiAtMTFoLTEyMCBxLTE2IDAgLTI2LjUgLTEwLjV0LTEwLjUgLTI1LjV2LTQxcTAgLTE1IDEwLjUgLTI2dDI2LjUgLTExaDEyMHExNSAwIDI2IC0xMC41dDExIC0yNS41di0xMjFxMCAtMTUgMTAuNSAtMjUuNXQyNS41IC0xMC41aDQxcTE1IDAgMjYgMTAuNXQxMSAyNS41djEyMXEwIDE1IDEwLjUgMjUuNXQyNS41IDEwLjVoMTIxcTE1IDAgMjUuNSAxMXQxMC41IDI2eiIgLz4KPGdseXBoIHVuaWNvZGU9IiwiIGhvcml6LWFkdi14PSI5MTUiIGQ9Ik00NTggNzAxcTE3MyAwIDI5NSAtMTIyLjV0MTIyIC0yOTUuNXEwIC0xMDQgLTQ2IC0xOTFxLTU5IC0xMTUgLTE3MiAtMTc2cS05NCAtNTEgLTE5OSAtNTFxLTEwMSAwIC0xOTQgNDhxLTExNCA2MCAtMTc1IDE3M3EtNDkgOTMgLTQ5IDE5N3EwIDE3MyAxMjIuNSAyOTUuNXQyOTUuNSAxMjIuNXpNNzYwIDIwM3ExMSA0MSAxMSA4MHEwIDEzMCAtOTIgMjIydC0yMjEgOTJxLTEzMCAwIC0yMjIgLTkydC05MiAtMjIycTAgLTM5IDEyIC04NSBxMyAtOSA5IC0yNXEyMSA2IDQ1IDZxNjUgMCAxMTEuNSAtNDZ0NDYuNSAtMTExcTAgLTE3IC01IC0zN3E0IC0yIDEyIC00cTQyIC0xMSA4MyAtMTFxNDUgMCA4NyAxMnEyIDAgNS41IDJ0NS41IDJxLTUgMjIgLTUgNDBxMCA2NCA0Ni41IDExMC41dDExMC41IDQ2LjVxMjMgMCA0NCAtNnE1IDE1IDggMjZ6TTQ5OCAzMzNxMjUgLTE5IDI1IC01MHEwIC0xNCAtNSAtMjRxLTE2IC0zOSAtNTggLTM5cS0xMSAwIC0yNCA1cS0zOSAxNiAtMzkgNTggcTAgMSAwLjUgNHQwLjUgNWwtNTYgMjQ1bDIxIDl6TTQ3OCA1NjV2LTk1aC0zOXY5NWgzOXpNNjMyIDQ5MGwyNyAtMjdsLTY4IC02OGwtMjcgMjh6TTYyOSAzMDB2MzhoOTZ2LTM4aC05NnpNMTkyIDMwMHYzOGg5NXYtMzhoLTk1ek0yNDQgNDYzbDI4IDI3bDY3IC02N2wtMjcgLTI4eiIgLz4KPGdseXBoIHVuaWNvZGU9Ii0iIGhvcml6LWFkdi14PSI5MjEiIGQ9Ik00NjEgNjk4cTE3NCAwIDI5NyAtMTIzLjV0MTIzIC0yOTcuNXQtMTIzIC0yOTcuNXQtMjk3IC0xMjMuNXEtMTc1IDAgLTI5OCAxMjMuNXQtMTIzIDI5Ny41dDEyMyAyOTcuNXQyOTggMTIzLjV6TTY5NCAyNTh2MzlxMCAxOSAtMTQgMzN0LTMzIDE0aC0zNzZxLTE5IDAgLTMzIC0xNHQtMTQgLTMzdi0zOXEwIC0yMCAxNCAtMzMuNXQzMyAtMTMuNWgzNzZxMTkgMCAzMyAxMy41dDE0IDMzLjV6IiAvPgo8Z2x5cGggdW5pY29kZT0iLiIgaG9yaXotYWR2LXg9Ijk0NSIgZD0iTTE0NyAzOTJxMzcgMCA2NCAtMjd0MjcgLTY0cTAgLTM4IC0yNi41IC02NXQtNjQuNSAtMjd0LTY1IDI3dC0yNyA2NXQyNyA2NC41dDY1IDI2LjV6TTQ3MiAzOTJxMzggMCA2NSAtMjYuNXQyNyAtNjQuNXQtMjcgLTY1dC02NSAtMjd0LTY0LjUgMjd0LTI2LjUgNjVxMCAzNyAyNi41IDY0dDY0LjUgMjd6TTc5OCAzOTJxMzggMCA2NSAtMjYuNXQyNyAtNjQuNXQtMjcgLTY1dC02NSAtMjd0LTY1IDI3dC0yNyA2NXEwIDM3IDI3IDY0dDY1IDI3eiAiIC8+CjxnbHlwaCB1bmljb2RlPSIvIiBob3Jpei1hZHYteD0iOTEyIiBkPSJNNjkzIDUzN2gxODF2LTEyN3YtMzAxaC0xODF2LTUzbC0xMzYgLTEzNmgtMzM2djE4OWgtMTgxdjMwMXYxMjdoMTgxdjE2M2g0NzJ2LTE2M3pNODE2IDQ4MGgtMTA1di01M2gxMDV2NTN6TTI3NSA2NDZ2LTEwOWgzNjR2MTA5aC0zNjR6TTUwMiAtMjZ2MTM2aDEzN3YxMzF2NTVoNTR2LTEyOWg2N3YxOTdoLTYwNHYtMTk3aDY1djExMXYxOGg1NHYtNTV2LTI2N2gyMjd6IiAvPgo8Z2x5cGggdW5pY29kZT0iMCIgaG9yaXotYWR2LXg9Ijg4OSIgZD0iTTY0MyAxNjFsMzkgLTQwbDI4IC0yN3EtNDcgLTYwIC0xMTYuNSAtOTQuNXQtMTQ4LjUgLTM0LjVxLTE0MCAwIC0yMzguNSA5OHQtOTkuNSAyMzhoLTExaC0yaC02N2wxMjYgMTI2bDEyNyAtMTI2aC01MWgtMjhxMCAtMTAwIDcxLjUgLTE3MXQxNzIuNSAtNzFxNjAgMCAxMTIuNSAyNy41dDg1LjUgNzQuNXpNODEwIDMwMWg1MmwtMTI3IC0xMjZsLTEyNiAxMjZoNTBoMzB2MnEwIDEwMSAtNzEuNSAxNzIuNXQtMTcyLjUgNzEuNSBxLTYxIDAgLTExMy41IC0yOC41dC04Ni41IC03Ni41bC0zOSAzOWwtMjggMjhxNDcgNjEgMTE2LjUgOTZ0MTUwLjUgMzVxMTM5IDAgMjM4IC05OXQ5OSAtMjM4di0yaDI4eiIgLz4KPGdseXBoIHVuaWNvZGU9IjEiIGhvcml6LWFkdi14PSI3NDMiIGQ9Ik02ODggMjM1aDI5di0zMHEwIC0xNDMgLTEwMC41IC0yNDMuNXQtMjQzLjUgLTEwMC41dC0yNDQgMTAxdC0xMDEgMjQzcTAgMTQzIDEwMSAyNDR0MjQ0IDEwMXExNiAwIDI1IC0xdjc5djcxbDQ5IC01MGwxNTcgLTE1N2wyMSAtMjFsLTIxIC0yMGwtMTU3IC0xNTdsLTQ5IC01MHY3MHY4OHEtMTggMiAtMjUgMnEtODMgMCAtMTQxIC01OHQtNTggLTE0MXEwIC04MiA1OC41IC0xNDB0MTQwLjUgLTU4dDE0MCA1OHQ1OCAxNDB2MzBoMzBoODd6ICIgLz4KPGdseXBoIHVuaWNvZGU9IjIiIGhvcml6LWFkdi14PSI5MTkiIGQ9Ik00NTkgNzAxcTE3NCAwIDI5NyAtMTIzdDEyMyAtMjk3dC0xMjMgLTI5N3QtMjk3IC0xMjNxLTE3MyAwIC0yOTYgMTIzdC0xMjMgMjk3dDEyMyAyOTd0Mjk2IDEyM3pNNzI4IDM5MnE2IDYgNiAxNXQtNiAxNmwtNTUgNTRxLTYgNiAtMTUgNnQtMTYgLTZsLTI0MyAtMjQ0cS0xNSAtMTYgLTMxIDBsLTg4IDg4cS0xNiAxNiAtMzEgMGwtNTUgLTU0cS02IC03IC02IC0xNnQ2IC0xNWwxMzkgLTE0MHExNSAtMTUgMzcgLTE1aDI2cTIwIDAgMzcgMTV6ICIgLz4KPGdseXBoIHVuaWNvZGU9IjMiIGhvcml6LWFkdi14PSI4NjgiIGQ9Ik0yMiAyMzlxLTEwIDEwIC0xMCAyNHQxMCAyNGw4MyA4M3ExMCAxMCAyMy41IDEwdDIzLjUgLTEwbDEzNiAtMTM1cTEwIC0xMCAyMy41IC0xMHQyMy41IDEwbDM3MSAzNzJxMTAgMTAgMjMuNSAxMHQyMy41IC0xMGw4MyAtODJxMTAgLTEwIDEwIC0yMy41dC0xMCAtMjMuNWwtNDUwIC00NTFxLTI0IC0yNCAtNTcgLTI0aC0zOXEtMzIgMCAtNTYgMjR6IiAvPgo8Z2x5cGggdW5pY29kZT0iNCIgaG9yaXotYWR2LXg9Ijc2MiIgZD0iTTU5IDcwMGw3MDIgLTM1MWwtNzAyIC0zNTB2NzAxeiIgLz4KPGdseXBoIHVuaWNvZGU9IjUiIGhvcml6LWFkdi14PSI4MTYiIGQ9Ik01OSAxdjY5OGgyNjJ2LTY5OGgtMjYyek00OTUgNjk5aDI2MnYtNjk4aC0yNjJ2Njk4eiIgLz4KPGdseXBoIHVuaWNvZGU9IjYiIGhvcml6LWFkdi14PSI4MTciIGQ9Ik03NTggMmgtNjk5djY5OGg2OTl2LTY5OHoiIC8+CjxnbHlwaCB1bmljb2RlPSI3IiBob3Jpei1hZHYteD0iOTIyIiBkPSJNNDIzIDQxN3YxODJsNDg1IC0yNDNsLTQ4NSAtMjQydjE4MWwtMzY0IC0xODF2NDg1eiIgLz4KPGdseXBoIHVuaWNvZGU9IjgiIGhvcml6LWFkdi14PSI5MjIiIGQ9Ik01MDAgMjk1di0xODJsLTQ4NiAyNDNsNDg2IDI0MnYtMTgybDM2MyAxODJ2LTQ4NXoiIC8+CjxnbHlwaCB1bmljb2RlPSI5IiBkPSJNNDYwIDcwMHExNzQgMCAyOTcgLTEyM3QxMjMgLTI5N3QtMTIzIC0yOTd0LTI5NyAtMTIzdC0yOTcgMTIzdC0xMjMgMjk3dDEyMyAyOTd0Mjk3IDEyM3pNMjk4IDY0bDQzMSAyMTZsLTQzMSAyMTZ2LTQzMnoiIC8+CjxnbHlwaCB1bmljb2RlPSI6IiBob3Jpei1hZHYteD0iODAxIiBkPSJNNjcxIDEwMGwxMDUgLTEwMnEwIC0xNiAtMTIgLTI4LjV0LTI5IC0xMi41aC0yNDJxMSAtNCAxIC0xMnEwIC0zOSAtMjcuNSAtNjYuNXQtNjYuNSAtMjcuNXQtNjYuNSAyNy41dC0yNy41IDY2LjVxMCAyIDAuNSA2dDAuNSA2aC0yNDFxLTE2IDAgLTI4LjUgMTIuNXQtMTIuNSAyOC41bDEwNSAxMDJxLTEgOCAtMSAyNXYyMDhxMCA4OCA1MC41IDE1OHQxMzAuNSA5OHEtNCAxMSAtNCAyNnEwIDM5IDI3LjUgNjYuNXQ2Ni41IDI3LjUgdDY2LjUgLTI3LjV0MjcuNSAtNjYuNXEwIC0xNCAtMyAtMjZxODAgLTI4IDEzMC41IC05OC41dDUwLjUgLTE1Ny41di0yMDhxMCAtMTcgLTEgLTI1ek0zNDggNjE1cTAgLTUgMiAtMTVxMjggNSA1MCA1cTIzIDAgNTAgLTVxMyA4IDMgMTVxMCAyMiAtMTUuNSAzN3QtMzcuNSAxNXQtMzcgLTE1dC0xNSAtMzd6IiAvPgo8Z2x5cGggdW5pY29kZT0iOyIgaG9yaXotYWR2LXg9Ijg4NyIgZD0iTTI5OSA0MThsLTQyIC00NHEtNCAtNSAtMTEgLTEyLjVsLTEyLjUgLTEzLjVsLTEwLjUgLTExcS0xOCAxNiAtMjcgMjNxLTQ5IDQwIC04MSA0MGgtMTAxdjExMmgxMDFxNTkgLTEgMTE4IC00MXEzMyAtMjEgNjYgLTUzek0zOTkgMTU2bDQ0IDQ3bDMyIDM0cTE2IC0xNCAyNiAtMjJxNTIgLTQyIDg0IC00MGg4NnY5NGwxNzUgLTE0OGwtMTc1IC0xNDZ2ODhoLTg2cS01NiAwIC0xMjAgNDBxLTI3IDE3IC02NiA1M3pNNTgyIDQwMCBxLTIzIDAgLTU2IC0yMnEtMzUgLTIzIC03OCAtNjhxLTE5IC0xOSAtNTQuNSAtNTcuNWwtNjYuNSAtNjkuNXQtNjAgLTU1cS04MCAtNjQgLTE1NCAtNjVoLTk5djExMmg5OXEyNiAwIDU5IDIycTI5IDE4IDc5IDY4cTUgNSA3MyA3Ny41dDEwNyAxMDQuNXE4MSA2NCAxNTIgNjVoODh2OTJsMTc1IC0xNDdsLTE3NSAtMTQ3djkwaC04OGgtMXoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3gzYzsiIGhvcml6LWFkdi14PSIzOTUiIGQ9Ik0xMTUgNDEwbDIyMiAyMjN2LTY2OGwtMjIyIDIyMmgtMTEydjIyM2gxMTJ6IiAvPgo8Z2x5cGggdW5pY29kZT0iPSIgaG9yaXotYWR2LXg9Ijk0NyIgZD0iTTg5NiAzNzl2LTE3NmwtNjMgLTI1di0xMDhoLTc3M3Y0NDJoNzczdi0xMDl6TTc2MCAxNDR2Mjk0aC02MjZ2LTI5NGg2MjZ6TTM3MyAzOTBsMjIyIC0xOThoLTQxM3YxOThoMTkxeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeDNlOyIgaG9yaXotYWR2LXg9Ijg4OSIgZD0iTTEyNiA0MDhsMjIyIDIyM3YtNjY4bC0yMjIgMjIyaC0xMTJ2MjIzaDExMnpNNDM0IDQzOHE3NSAtNTAgNzUgLTE0MHQtNzUgLTEzOWwtMzQgNjdxMzUgMjggMzUgNzJ0LTM1IDcydjJ6TTY4MCAyOThxMCAtOTIgLTQ2IC0xNjguNXQtMTIzIC0xMjAuNWwtMzQgNjZxNTkgMzQgOTQgOTMuNXQzNSAxMjkuNXQtMzUgMTI5LjV0LTk0IDkzLjV2MmwzMyA2NXE3NyAtNDQgMTIzLjUgLTEyMS41dDQ2LjUgLTE2OC41ek01ODcgNzM4IHExMTggLTY2IDE4OC41IC0xODN0NzAuNSAtMjU3dC03MC41IC0yNTd0LTE4OC41IC0xODJsLTMzIDY2cTk5IDU2IDE1OC41IDE1NS41dDU5LjUgMjE3LjV0LTU5LjUgMjE3LjV0LTE1OS41IDE1NS41eiIgLz4KPGdseXBoIHVuaWNvZGU9Ij8iIGhvcml6LWFkdi14PSI5MjIiIGQ9Ik00NjEgNzAycTE3NSAwIDI5OCAtMTIzLjV0MTIzIC0yOTcuNXQtMTIzIC0yOTcuNXQtMjk4IC0xMjMuNXEtMTc0IDAgLTI5Ny41IDEyMy41dC0xMjMuNSAyOTcuNXQxMjMuNSAyOTcuNXQyOTcuNSAxMjMuNXpNNDg5IDI5cTE5IDE4IDE5IDQ3dC0xOSA0N3EtMjAgMTcgLTQ5IDE3cS0yOCAwIC00OCAtMTdxLTIwIC0yMCAtMTggLTQ3cS0yIC0yNyAxOCAtNDdxMTkgLTE3IDQ4IC0xN3EzMiAwIDQ5IDE3ek02MDIgMzUxcTEwIDI0IDEwIDYyIHEwIDU4IC00MSA5M3EtMzggMzQgLTEwOCAzNHEtNDkgMCAtODUgLTEycS0zMyAtMTEgLTYzIC0zMWwtOSAtNmw0NiAtODdsMTAgOHEyIDEgMTkgMTFxNyA0IDIzIDEwcTEwIDQgMjMgNnE3IDIgMjEgMnEzMCAwIDM4IC0xMHExMSAtMTEgMTEgLTMxcTAgLTEzIC03IC0yNXEtMTIgLTE2IC0yMSAtMjRxLTQgLTQgLTguNSAtOGwtMTAgLTl0LTkuNSAtOHEtMTcgLTE2IC0zMCAtMzRxLTEyIC0yMCAtMjAgLTQ2cS01IC0yMiAtNSAtNDEgcTAgLTQgMC41IC0xMnQwLjUgLTEybDEgLTExaDExaDg4djEycTAgMjYgOCA0MnE5IDE2IDIxIDMwcTE0IDE0IDI5IDI1dDMyIDMwcTE0IDE3IDI1IDQyeiIgLz4KPGdseXBoIHVuaWNvZGU9IkAiIGhvcml6LWFkdi14PSI1MDgiIGQ9Ik0yNTggNzAzcTkyIDAgMTU3LjUgLTY2dDY1LjUgLTE1N3EwIC0xMDcgLTIwMyAtNTQ2bC0yNCAtNTBsLTYzIDEzNXQtMTAxIDI0NC41dC02MyAyMTYuNXEwIDkyIDY1LjUgMTU3LjV0MTU3LjUgNjUuNWg0aDR6TTI1NCAzOTdxNDIgMCA3MiAzMHQzMCA3M3EwIDQyIC0zMCA3MnQtNzIgMzBxLTQzIDAgLTczIC0zMHQtMzAgLTcycTAgLTQzIDMwIC03M3Q3MyAtMzB6IiAvPgo8Z2x5cGggdW5pY29kZT0iQSIgaG9yaXotYWR2LXg9Ijg5MyIgZD0iTTMxNSAyOTlsNzAgLTcwcS0zOCAtMzIgLTg4LjUgLTMwdC04Ni41IDM4bC0xNDQgMTQ0cS0zOCAzNyAtMzggOTF0MzggOTFsOTkgOTlxMzggMzggOTEuNSAzOHQ5MS41IC0zOGwxNDQgLTE0NHEzNiAtMzYgMzcuNSAtODYuNXQtMzAuNSAtODguNWwtNzAgNjlxMTAgMjAgLTYgMzhsLTE0NCAxNDRxLTkgOSAtMjIuNSA5dC0yMi41IC05bC05OSAtOTlxLTEwIC0xMCAtMTAgLTIzdDEwIC0yM2wxNDQgLTE0NHExNiAtMTYgMzYgLTZ6TTcyOCAtOTkgcS0zOCAtMzcgLTkxIC0zN3QtOTEgMzdsLTE0NSAxNDVxLTM1IDM1IC0zNyA4NS41dDMwIDg4LjVsNjkgLTcwcS05IC0yMCA3IC0zNmwxNDQgLTE0NHE5IC0xMCAyMi41IC0xMHQyMi41IDEwbDk5IDk5cTEwIDkgMTAgMjIuNXQtMTAgMjIuNWwtMTQ0IDE0NXEtMTYgMTYgLTM3IDVsLTY5IDcwcTM4IDMyIDg4LjUgMzAuNXQ4Ni41IC0zNy41bDE0NCAtMTQ0cTM3IC0zOCAzNyAtOTEuNXQtMzcgLTkxLjV6TTI2MyA0NjVxMTQgMTQgMzQgMTQgdDM0IC0xNGwyOTUgLTI5NXExNCAtMTQgMTQgLTM0dC0xNCAtMzR0LTM0IC0xNHQtMzQgMTRsLTI5NSAyOTRxLTE0IDE0IC0xNCAzNC41dDE0IDM0LjV6IiAvPgo8Z2x5cGggdW5pY29kZT0iQiIgaG9yaXotYWR2LXg9Ijg4MSIgZD0iTTczNCAzMTFxLTE0IC0yNyAtNDIgLTUwcS0xMiAtMzAgLTMxLjUgLTU4dC01NC41IC02MHQtOTIuNSAtNTEuNXQtMTI5LjUgLTE5LjVxLTc3IDAgLTE0My41IDIxdC0xMDUuNSA1MXQtNjcgNjB0LTM5IDUxbC0xMSAyMXE1IC0zIDE0LjUgLTYuNXQzOC41IC0xMS41dDU4IC0xMnQ3MCAtMC41dDc4IDE3LjVxLTY0IDI3IC05NiA5MXEtMjEgNDMgLTggNTRxNyA3IDI1IC0xMHE1MyAtNTAgMjEyIC00MXE3IDggMjEgMjZ2NXEwIDY3IDQ3IDExNCB0MTE0IDQ3cTY0IDAgMTEwIC00My41dDUxIC0xMDYuNWwxMDIgLTQ5ek02MjYgNDY5cS0xOSAwIC0zMiAtMTMuNXQtMTMgLTMyLjV0MTMgLTMydDMyIC0xM3QzMi41IDEzdDEzLjUgMzJ0LTEzIDMyLjV0LTMzIDEzLjV6IiAvPgo8Z2x5cGggdW5pY29kZT0iQyIgaG9yaXotYWR2LXg9IjkxMyIgZD0iTTc3MSAzMTdxNDYgLTE4IDc0IC01OS41dDI4IC05Mi41cTAgLTY4IC00OC41IC0xMTYuNXQtMTE2LjUgLTQ4LjVxLTIgMCAtNSAwLjV0LTQgMC41aC00OTRoLTFoLTJxLTY5IDEgLTExNy41IDUwdC00OC41IDExOXEwIDQ1IDIyLjUgODMuNXQ2MC41IDYwLjVxLTYgMTYgLTYgMzVxMCA0NyAzNCA4MXQ4MSAzNHEzOCAwIDcxIC0yNXEzMSA2NCA5MSAxMDN0MTMzIDM5cTEwMyAwIDE3NiAtNzIuNXQ3MyAtMTc2LjVxMCAtMTAgLTEgLTE1eiIgLz4KPGdseXBoIHVuaWNvZGU9IkQiIGhvcml6LWFkdi14PSI5MTciIGQ9Ik00NTkgNjk4cTE3MyAwIDI5NS41IC0xMjN0MTIyLjUgLTI5NnQtMTIyLjUgLTI5NS41dC0yOTUuNSAtMTIyLjV0LTI5NiAxMjIuNXQtMTIzIDI5NS41dDEyMyAyOTZ0Mjk2IDEyM3pNNTc0IDI1MnEtMTEgMTIgLTExIDI4dDExIDI4bDEwOSAxMDhxMTEgMTIgMTEgMjguNXQtMTEgMjcuNWwtMzEgMzFxLTEyIDExIC0yOC41IDExdC0yNy41IC0xMWwtMTA4IC0xMDlxLTEyIC0xMSAtMjguNSAtMTF0LTI3LjUgMTFsLTEwOSAxMDkgcS0xMSAxMSAtMjcuNSAxMXQtMjcuNSAtMTFsLTMxIC0zMXEtMTEgLTExIC0xMSAtMjcuNXQxMSAtMjguNWwxMDkgLTEwOHExMSAtMTIgMTEgLTI4dC0xMSAtMjhsLTEwOSAtMTA4cS0xMSAtMTIgLTExIC0yOC41dDExIC0yNy41bDMxIC0zMXExMSAtMTEgMjcuNSAtMTF0MjcuNSAxMWwxMDkgMTA5cTExIDExIDI3LjUgMTF0MjguNSAtMTFsMTA4IC0xMDlxMTEgLTExIDI3LjUgLTExdDI4LjUgMTFsMzEgMzFxMTEgMTEgMTEgMjcuNXQtMTEgMjguNXogIiAvPgo8Z2x5cGggdW5pY29kZT0iRSIgaG9yaXotYWR2LXg9Ijg5NSIgZD0iTTQ0OCA1MzFxNjMgMCAxMjkuNSAtMjMuNXQxMTUuNSAtNTd0ODkuNSAtNjd0NjEuNSAtNTcuNWwyMSAtMjN2LThsLTIyIC0yNC41dC01OS41IC01NC41dC05MiAtNjl0LTExNCAtNTQuNXQtMTMwLjUgLTI0LjV0LTEyOS41IDIzLjV0LTExNS41IDU3dC04OS41IDY3dC02MS41IDU2LjVsLTIxIDI0djlsMjIgMjQuNXQ1OS41IDU0LjV0OTIgNjguNXQxMTQgNTR0MTMwLjUgMjQuNXpNNDQ2IDE1OHE1OCAwIDk4LjUgNDAuNXQ0MC41IDk4LjUgcTAgNTcgLTQwLjUgOTcuNXQtOTguNSA0MC41cS01NyAwIC05Ny41IC00MC41dC00MC41IC05Ny41cTAgLTU4IDQwLjUgLTk4LjV0OTcuNSAtNDAuNXpNNDQ2IDM2MXEyNiAwIDQ1IC0xOXQxOSAtNDV0LTE5IC00NC41dC00NSAtMTguNXQtNDQuNSAxOC41dC0xOC41IDQ0LjV0MTguNSA0NXQ0NC41IDE5eiIgLz4KPGdseXBoIHVuaWNvZGU9IkYiIGhvcml6LWFkdi14PSI3MDQiIGQ9Ik0yMjQgNzAwaDQyMnYtODE4aC01OTN2NjQ2bDE3MSAxNzF2MXpNNTc4IC01MHY2ODJoLTI4NXYtMTcyaC0xNzJ2LTUxMGg0NTd6IiAvPgo8Z2x5cGggdW5pY29kZT0iRyIgZD0iTTQ2MCA2OThxMTc0IDAgMjk3IC0xMjN0MTIzIC0yOTd0LTEyMyAtMjk3dC0yOTcgLTEyM3QtMjk3IDEyM3QtMTIzIDI5N3QxMjMgMjk3dDI5NyAxMjN6TTczOCA0MDFsLTEgLTNxLTEgLTMgLTEgLTUuNXQyIC0yLjVxMCAtMiAzIC02dDMgLTh2LTExcTEgLTIgNSAtM3ExIC00IDYgLTV0NiAzcS0zIDAgLTIuNSA0LjV0LTAuNSA0LjVxMCAyIC0xIDNxLTIgMiAtMiAzaDdxMCAyIC0yIDV0LTIgNHEtMSAwIC0yLjUgLTF0LTIgLTF0LTAuNSAyIHQtNCA2bC0yIDdxMyAwIDYgMXEtMSAwIDQgMnEtMSAxIC0yIDRxLTIgNCAtNyAycS0yIDAgLTUgLTIuNXQtNSAtMi41ek03MzUgODFxNjMgOTAgNjMgMTk3cTAgMTkgLTEgMjhxLTkgMCAtMTMgMnEtNCAwIC0xNC41IDQuNXQtMTYuNSAyLjVxMCAxIC0xIDFxMiAzIC01IDExcS01IDQgLTcgMHEtMiAtMyA1IC0xMHEwIC0yIDIgLTZxMiAtMSAxIC0zdC0xIC0zcTQgMCA1IDdxMCAtMSAxIC0xcS0yIC0zIDEgLTZ2LTVxMTAgMCAxNCAxMCBxMSAwIDEgLTJ0MSAtM3EzIC0zIDIgLTV0MiAtMnEyIC0xIDIgMXYycTQgLTIgNCAtNnQtNCAtNnEwIC0xIC0xIC0zdC0xIC00cTAgLTYgLTQgLThsLTQgLTJxLTQgLTMgLTggLTUuNXQtNCAtMy41cS0xMiAwIC0xNSAtN3EtNyAwIC0xMSAtNHEtNiAwIC04LjUgNnQtNC41IDZsLTIgNXExIDAgLTEuNSA2bC01LjUgMTN0LTMgOWwtNSAxMHEtMiAxIC03IDEycS04IDQgLTEwIDEzcTEwIDAgMTAgNHEtMSAwIC0yIDFxLTIgMiAxIDJsMyA5IHEwIDEgMSA1LjV0MSA2LjVxLTIgMCAtOCAtMnEwIC0xIC0xLjUgLTAuNXQtMy41IDAuNWwtMyAxcTAgMSAtNi41IDB0LTguNSAycS0yIDIgLTQgMTRxLTEgMyAtOCAzcS0zIDEgLTMuNSAtMXQwLjUgLTVsMSAtNHEyIDAgLTIgLTdxLTEgLTEgLTEgLTJxLTQgMSAtNiA2dC00IDZxLTEgNCAtMyA0cTAgMTAgLTEgMTBsLTMgMXEtNCAyIC01IDNxLTIgMCAtNS41IDMuNXQtNi41IDUuNXQtNCAwbDMgLTZxMiAwIDUgLTQuNXQ3IC0zLjV2LTUgcTMgMSA0LjUgLTEuNXQyLjUgLTIuNXEwIC0xIC0zIDBxLTQgMiAtMyAtMXEyIC02IC00IC05cTAgMTIgLTMgMTJxLTIgMyAtNyA1dC02IDRxLTEgMCAtMy41IDMuNXQtNC41IDQuNXEtMiAtMiAtNSAtMnEtMSAtMiAtNC41IC0yLjV0LTcuNSAwLjVsLTMgMXEtNyAtMTggLTggLTIwcS0xIC0zIC0zIC01dC0zIC01cTAgLTEgLTcuNSAtMS41dC03LjUgLTEuNXEtMTEgNCAtMTEgMTN2NXQxIDl0MSA2bDIgLTJoMy41aDQuNXQzLjUgMXQxLjUgMiBxNCAwIDMgLTRxOSAtMyA5IDNxLTIgMCAtMiAycTMgNCAyIDd0LTQgNnQtMyA0bC00IDRxOSAtNiAxMSAtMXEwIDEgLTEgM3YxcTIgLTIgMy41IC0yLjV0Mi41IDEuNXEyIDEgMyAzdjZxMyAtNCA0LjUgMHQyLjUgNXEwIC0zIDMgMHEyIDIgMyAycTEgMiA1IDIuNXQ1IDMuNXEtMyAxIC0zIDEycTIgMCA0LjUgMS41dDMuNSAxLjV0MiAtMnEwIC02IDEgLTZxNCAyIDQgNXEtMiAwIC01IDEwcS0zIDAgLTUgLTJxLTMgMCAtNy41IDF0LTYuNSAxIHEtNyA3IC02IDdxLTIgNCAyIDVoMnEwIDIgMTEuNSA1dDEyLjUgOHEtNiAwIDggMTNxMTAgOCAxNCA4cTEgMCA5LjUgMmwxNC41IDMuNXQ4IC0wLjVxMjIgMCAyMiAtMnExIDAgMy41IC0xdDQgLTEuNXQzLjUgMC41cTMgMiAxMSAtMnQ4IC04cS0zIDAgLTEyIC0xdC0xNCAtMXYtMnEyIDAgNS41IC00LjV0Mi41IC02LjVxMyAwIDYgMnQ0IDJxMCAtMiAxIC0zcTMgLTIgNCAzbC0xIDRxMSAyIDQuNSAyLjV0NC41IDMuNXEtNDcgNTYgLTExNC41IDg4IHQtMTQzLjUgMzJxLTEzNCAwIC0yMzEgLTkxcTEgLTEgNSAybDIgMXEwIC02IDEgLThsMyAtN3E4IDAgOSAtMmgtNXExIC02IC0zIC00cS0zIDEgLTQgMXEwIDEgLTMgMnQtNSAwdDAgLTVxMSAwIDIgLTF0MyAtMnEyIDAgNi41IC0xdDYuNSAtMnEyIDAgNSAwLjV0NCAwLjVxMiAxIDMgMnQtMSAycTEgMiAtNCA0cTAgMSAxMSAxcTIgMiAxLjUgMy41dDAuNSAzLjV0NCAydDQgM3E0IC0yIDUgLTZxMSAwIDMgLTNxOSAtMTAgOSAtM3E2IC0xIDYgLTExIHE3IDEgNyAxMXEtMSAwIC0xIDNoNHEyIC0xIDIgMXExIDAgMSAtMmg4di0xMXEwIC0yIC0yIC0zdC0zIC0xbC0yIC0xcS0zIC00IC0xLjUgLTV0Ni41IC0zLjV0NiAtMy41bC04IDFxLTEgMCAtNC41IC0wLjV0LTYgLTF0LTQuNSAwLjVxNSAwIDcgMTFxLTggMiAtMTEgLTVxLTEgLTQgLTQgLTMuNXQtNCAtMS41bC0yIC0xcS0zIC0xIC01IC0xLjV0LTIgMC41cS03IC0yIC03IC0xN3ExMSAtOCAxMSAtMTJxNCAtMSA5LjUgLTJ0OC41IC0xIHExIC0zIDQgLTNxMCAtNCA5IC00cTAgNiA2IC00cTEgLTIgMSAtM3EtMSAwIDAgLTIuNXQzIC01LjVxLTIgMCAtMSAtMXEyIC0yIDUuNSAtMXQzLjUgM3EtMiAwIC0yIDZxLTYgNiAxIDhxMCAtNCA2IDFxMiAyIC0xIDNxMiA5IDAgMTJxLTEgMSAtMi41IDF0LTIuNSAycTQgMSAxIDE0aDVxMiAwIDUuNSAtMS41dDUuNSAtMXQzIDMuNXEzIC0yIDQuNSAtNXQ0LjUgMXEwIC0xIDQgLTUuNXQ1IC00LjVxMCAtMyAyIC0zbC0xIC0ycTcgMCA3IDEgcTYgMCA2IDhxMSAwIDIuNSAtM2wzIC02dDIuNSAtM2wyLjUgLTIuNWwzIC0zdDIuNSAtM3QxIC0yLjVxMiAtMiAyIC01cTEgMCAyIDJxMyAzIDMgLTFxMiAwIDQuNSAtMi41dDIuNSAtMy41cS0yIDAgLTEuNSAtMnQtMC41IC0ycTAgLTEgLTExIC0xcS0xIC01IC02IC02dC0xMSAwLjV0LTExIC0wLjVxLTQgLTIgLTkuNSAtOC41dC01LjUgLTEwLjVxMyAwIDcuNSAzLjV0Ni41IDQuNXEyIDAgMTAgNHEwIC0xIDEgLTF2LTFxLTYgMCAtMiAtNyBxMSAtMSAxIC0ycTMgLTUgOCAtNXEwIC0xIC0yLjUgLTF0LTIuNSAtMmwtNSAtM2gtNmwxIDFsMSAxaDN2NHEtMyAwIC02IC0xLjV0LTUgLTEuNXEtNCAtNCAtNiAtNHEtMiAtMTAgLTYgLTEybC0yIC0xbC00IC0ybC0yIC0ybC0yIC0ycS0xIC0yIC0yIC01cS0zIC03IC0zIC05cS0xIDAgLTMuNSAtNS41dC02LjUgLTUuNXEtMSAtMiAtNS41IC02dC00LjUgLTEwcTEgLTEgMS41IC00dDEuNSAtNi41dDEgLTQuNXEwIC04IC00IC04bC0yIDN0LTEgMyBxMCA0IC00IDEycTAgMiAtNC41IDEuNXQtNS41IC0wLjVxLTEgMyAtMTMgM3EwIC0xIDEgLTJ0MSAtM3EtNiAtMiAtNyAtMnEtMiAwIC00LjUgMi41dC01LjUgMS41cS0xNCAtMiAtMTQgLTE2cS0xIDAgLTEgLTguNXQxIC04LjVxMCAtMiAyIC02dDIgLTVxMiAwIDYgLTR0NSAtNHExIC00IDUgLTRsMiAxbDIgNHEtMyAxIC0xLjUgMy41dDMuNSAzLjVxMCAtMiA2IDJsNiAybDIgMnExIC0zIC0xIC00cS0yIDAgLTMgLTNsLTEgLTIgcS0xIC0yIC0yIC01dC0xIC01dDEgLTQuNXQwIC00LjVoMTN2M3EzIDAgMi41IC02LjV0MS41IC02LjVxMCAtMiAxIC02dDEgLTVxNSAtMyA0IC04cTEyIDAgMTIgM3E3IDAgNSAtN3E1IDAgNiAzdDEgNS41dDIgMi41cTAgMyAyIDFsNiAzbDMgMnEyIC0xIDIgLTJxNSAwIDkgNHEyIDAgNCAtNXQ2IC01cTEyIDAgMTMgMXEzIC0yIDMgLTNxMSAwIDIgLTFsMSAtMWgxbDQgLTRxMCAtMiAyLjUgLTN0Mi41IC0ybDEgLTFsMyAtMmw5IC0zcTEgMyA0IDAgcTEgLTEgMiAtMWwyIC0ycTEgLTEgNCAtN3EyIC0yIDQgLTExcS0xIDAgLTEgLThsNCAtMXEyIDAgMiAycTIgMCA1IC0ydDQgLTJxLTIgLTIgMSAtMy41dDMgMi41cTMgMCAzIC0xMXEyIDAgNC41IDEuNXQ0LjUgMS41cTYgMCA2IDFxOCAtMiAxMyAtOHE1IC01IDUuNSAtMTR0LTQuNSAtMTRsLTggLTEwcTAgLTEyIC0xIC0xMnEwIC0xNCAtMyAtMTRxMCAtMyAtMi41IC03dC0zLjUgLTZxLTEgLTEgLTYuNSAtNC41dC02LjUgLTUuNSBxLTEgMCAtNCAtMXQtNCAtMWwtMiAtM3EtMyAtMyAtMiAtM3EwIC0xIC0wLjUgLTcuNXQtMS41IC04LjVxLTQgLTIgLTMgLTRxLTEgMCAtMS41IC0xdC0zLjUgLTFxLTIgMCAtNSAtMi41dC0zIC01LjVxLTIgLTggLTYgLTExbC0zIC0ycS00IC0yIC00IC00di04cS02IDAgLTggLTRxLTQgMCAtMTEgLTRxMCAtNCAtMiAtNHEwIC00IC0zIC0zdC00IDBxMiAwIDIgLTZxMCAtMSAtNiAtOWwtMSAtMnEtMiAtMyAtMyAtM3EwIC0xIC0wLjUgLTQgdC0wLjUgLTV2LTNsMiAycTAgMSAyIC0xcS0xIC0yIC0zIC00dC0zIC01cS01IDAgLTUgLThxMCAtMiAxIC0ycTAgLTEgMiAtNWwtMjcgOXEwIDM3IDQgMzdxMCA5IDIgOXYxNHEtMSAyIDEuNSA2LjV0Mi41IDYuNXEzIDEgMy41IDEwdDAuNSAxN3QyIDhxMCA0IDEuNSAyMC41dC0wLjUgMjAuNWwtNyA4cS01IDAgLTkgNi41dC00IDEyLjVxLTMgOSAtMyAxMHExIDAgLTIgNC41dC02IDkuNWwtNCA1cS0zIDMgLTMgNC41dDIgNXQyIDYuNSBxLTQgMiAtMiAxMC41dDUgOC41cTAgMyAzIDRxMSAtMyAzIC0ycTMgMyAwIDV2MTNxMCAxMCAtNSAxMHEtMiAwIC00IC01cS0xIDEgLTUgMS41dC03IDJ0LTMgNC41cTIgNiAtOCAxMXExIDQgLTUuNSA4LjV0LTEwLjUgNC41cTAgMSAtMiAxLjV0LTIgMS41cS0yIDAgLTUgM3QtNiAzcS00IDAgLTEwIDIuNXQtOSAyLjVxLTEgMiAtNi41IDN0LTYuNSAzcS03IDAgLTcgMTNxMCAxOCAtOSAxOHEwIDMgLTQgNi41dC02IDMuNXEtMyA3IC01IDcgcTAgNCAtNiA5cS0zIDIgLTMgMHEtMSAtMiAyLjUgLTUuNXQzLjUgLTUuNXExIDAgOCAtMTNxNiAtMTAgMyAtMTFxLTQgLTEgLTEwIDhxLTIgNCAtMiA2cS0yIDEgLTQuNSA2LjV0LTIuNSA3LjVxLTEgMSAtMi41IDR0LTIuNSA2bC0xIDJxMCAxMCAtMTEgMTBsLTcgOXEwIDEwIC04IDEzcTAgMiAtMSA5dDAgMTBxMCAyMyAtMTAgMzFxLTMzIC02OCAtMzMgLTE0NHEwIC0xNDAgOTkuNSAtMjM5dDIzOS41IC05OXE4MiAwIDE1MyAzN3QxMTggMTAwIHEtNyAtMiAtOSA5cS0zIDE3IDIgMzJxNSAtMiA2IDBxLTQgMSAtMiA2cTEwIC03IDEwIDJsLTIgMnEwIDIgMSAzdDEuNSAwLjV0MC41IC0yLjVxMyAwIDMuNSA0LjV0MS41IDUuNXEwIC0xMSAzIC0xMnEyIC0yIC0wLjUgLTQuNXQtMi41IC0zLjVxLTIgLTEgLTIgLTZoLTNxMCAtMyAtMSAtOC41dC0xIC03LjVxLTIgMCAtMiAtMTZ6TTY2NiAzODNxMiAtMSAyIC00cTI1IDAgMjUgM3ExIC0yIDIgLTN0MiAycTEgMCA0LjUgLTN0Ny41IC0ybDcgNCBsLTIgMXEwIDYgLTUgOS41dC02IDQuNXEtMSAwIC0zLjUgMXQtNC41IDFxLTMgMiAtNiAtMXEtMyAtMiAtMyAwcS0xIDIgLTMgMnEwIDggLTkgN3EtMSAtMyAtMy41IC03dC0zLjUgLTcuNXQtMSAtNy41ek01MTggNDkxcTAgLTUgLTEgLTVxLTUgLTMgLTEwIC0zaC0xMXEtMiAwIC0xMCAycTAgMSAxIDJxMyA0IC0xIDRxNyAzIDggM3YtMXYtNHEwIC0xIDIgLTAuNXQ0LjUgMXQzLjUgMS41cTMgMCA2IDFxMSAxIDEuNSAwLjV0MC41IC0zLjV6IE01NTEgNDQ0cTAgMiAtMSA0dC0xIDRxMCAzIDMgMi41dDQgMy41cTMgLTEgMCAtM3YtNHEyIDAgNCAydDMgMnEtMiAtNyAtMSAtOHE1IC01IDQgLTZxNyAwIDUgLTExcTMgMCAzIDNxMiAtMSAyIC0yLjV0LTIgLTEuNXEtMyAtNSAtMTUgLTVxMCA2IC00IDNxLTMgLTEgLTIgNHExIDIgMSAzcS0yIDEgNSAycS0xIDggLTggOHpNNTM2IDQyOHEtMiAyIDAgOHEtMyAxIDEgMmw1IDJxLTQgMCAtMiA0aDJxMSAtMiAyIC0xaDRxMSAtMSAwIC0zIHEtMyAtMTIgLTEyIC0xMnpNNTUxIDQyMnExIDAgMSAxaDNxMCAtMiAtMS41IC0ydC0yLjUgMXpNMzkyIDQwMXExIDEgNCAzcTAgLTMgLTQgLTN6TTU5OCAzODhxMiAwIC0xIC02cS0xIDIgLTIgNXEzIDAgMyAxek01OTggMzgwcTIgMCAxLjUgLTQuNXQtNS41IC0zLjVxMCA3IDIgN2wxIC0ycTEgMSAxIDN6TTYyMCAzNjVxMCAtNCAtMSAtNC41dC00LjUgMS41dC01LjUgMmg1cTEgLTEgNiAxek03MjggMjQwcTYgMCA2IDFxMTAgMCAxNiAzIHEwIC00IC0yLjUgLTkuNXQtMS41IC05LjVxLTMgMCAtMyAtNWwtMiAtMnEtMiAtMyAtNCAtNHEwIC0yIC05IC0xMXEtMSAtMiAtNS41IC02LjV0LTUuNSAtNi41cS0xNCAtMTQgLTEwIC0xNHEwIC0yNCAyIC0yNGwxIC02cTEgLTYgMSAtMTB0LTEgLTVxMCAtMyAtMiAtNy41dC0yIC02LjVsLTIgLTFsLTMgLTNxLTIgMCAtNCAtMy41dC0zIC0zLjVxMCAtNCAtMSAtMTF0LTEgLTExbC0xIC00bC0yIC02bC0xIC00cS0xNSAtOCAtMTUgLTE3IHEtNyAtMTAgLTggLTEycS0xOSAwIC0xOSAtNGgtMTVxMCAyIC0xIDZ0LTEgN3EtMSAwIC0yIDMuNXQtMiAzLjVxMCAxIC0yLjUgNi41dC00LjUgMTF0LTEgNS41cTAgOSAtMyA5cTAgNCAtMi41IDExdC0yLjUgMTBxLTEgMCAtMiA0dC0xLjUgNy41dDAuNSA0LjVxMCA0IDQgMjJxMSA5IC0zIDIzcS00IDAgLTQgNnEtNiA0IC02IDE1cTYgNiAzIDIwcS0zIDEgLTE0IDFxLTEgMyAtNy41IDR0LTE2LjUgMGwtMTAgLTFxLTEgLTIgLTQuNSAtMS41IHQtOC41IDIuNXQtNSAzcS0zIDAgLTcuNSA0LjV0LTQuNSA4LjVxLTQgMSAtOCA5LjV0LTQgMTIuNXEtNCA0IDAgOXEwIDMgLTMgMTJxMCAyIDEuNSA0dDEuNSA0cTAgMTEgNCAxOXEwIDEgMiA0dDIgNHEyIDMgMyAzcTIgMSAzIDNxMiAxIDUgNXEyIDMgMyA0cTMgMSAwIDRxNCAwIDQgMTBxMiAzIDYgM2wxIDFxNCA1IDUgNXEyIDMgNiAzcTEgLTEgMi41IC0xdDQuNSAxbDMgMXE1IDcgMTQgN3ExIDIgNSAxLjV0MTAuNSAtMS41dDcuNSAtMXYyIHEzIC0xIDcgLTEwdDQgLTEyaDhxMCAtNCAxMCAtNHExNiAwIDE2IDZxNiAwIDYgLTZoNnQ4LjUgLTAuNXQ3LjUgLTJ0MiAtMi41cTIgMCA0IC0zdDMgLTNxMCAtMyAyLjUgLTguNXQ0LjUgLTUuNXEwIC04IDUgLTExcTYgLTE0IDEyIC0xOHEtMSAtMiAxLjUgLTZ0Mi41IC01cTEgLTYgMyAtN3EwIC00IDUgLTExLjV0OCAtNy41cTAgLTEgLTEgLTJ0MiAtMnpNMzEyIDI5NnEwIC0zIDMgMHEwIC00IC00IC0ycS0yIDAgLTEgM3ExIDAgMiAtMXogTTMyOCAyOTdxNCAtMSA3LjUgLTMuNXQ1LjUgLTIuNXEzIC0zIDMuNSAtNHQtMS41IC0ycS04IC0yIC0xMiA1cS01IDAgLTEwIDVxNiAwIDcgMnpNMzYyIDI4M2wyIC0xcTIgLTIgMyAtNGwxIC0xaC0xM3EtMSAtMSAtNC41IC0xdC00LjUgMmg3bC0yIDRxMSAwIDUgLTF0NiAtMXYzek0zMzEgMjc4cTQgMCA0IC0zcS01IDAgLTQgM3pNMzM2IDI3NWwyIDNxMSAwIDEgLTJxLTEgLTEgLTMgLTF6TTM3NiAyNzhxMyAwIDMgLTFxLTQgMiAtMyAxeiBNMzczIDI3OGwyIC0xcS0xIDAgLTEgLTAuNXQtMSAtMC41djJ6TTM1NyAyNTBxMSAxIDEgMmwxIC0xcTAgLTEgLTIgLTF6TTc0MCAxMzRxMCAyIDIgM3oiIC8+CjxnbHlwaCB1bmljb2RlPSJIIiBob3Jpei1hZHYteD0iODY1IiBkPSJNNjg2IDI3OXYtMzc4aC0xNzd2MjM1aC0xNTJ2LTIzNWgtMTgzdjM3OGgtMTUzbDQxMiA0MTFsNDExIC00MTFoLTE1OHoiIC8+CjxnbHlwaCB1bmljb2RlPSJJIiBob3Jpei1hZHYteD0iOTMyIiBkPSJNODg0IDIzNHYtMzE0aC04MzZ2MzE0bDE1NyA0MThoNTIyek01ODIgMjM0aDE5OGwtMTA1IDMyMmwtNDE4IDFsLTEwNCAtMzIzaDE5N2w0OSAtOTZoMTMweiIgLz4KPGdseXBoIHVuaWNvZGU9IkoiIGhvcml6LWFkdi14PSI4NjIiIGQ9Ik04NDggNTM0bC0xMjIgLTEyMmw4MiAtODJsLTM3MCAtNDJsNDMgMzY5bDgxIC04MWwxMjIgMTIyek0xMzYgMTQ4bC04MiA4MmwzNjkgNDNsLTQzIC0zNzBsLTgxIDgybC0xMjIgLTEyMmwtMTYzIDE2M3pNMTgyIDM4OGwxOTcgLTY4bC0yMjEgMTh6TTM5MyA0MTd2LTg1bC0yOCA4MHpNNjgyIDE3NGwtMTk3IDY5bDIyMSAtMTl6TTQ3MSAxNDZ2ODVsMjggLTgxeiIgLz4KPGdseXBoIHVuaWNvZGU9IksiIGhvcml6LWFkdi14PSI4NjkiIGQ9Ik01MzAgMzUxbDMxOCAtMzE4di0xNjh2MGgtMTY4aC0xdjEyOWgtMTI4djEyOGgtMTI4bC02MSA2MXEtNDAgLTE0IC04MyAtMTRxLTEwOSAwIC0xODcgNzcuNXQtNzggMTg3LjV0NzggMTg3LjV0MTg3IDc3LjV0MTg3IC03Ny41dDc4IC0xODcuNXEwIC00MyAtMTQgLTgzek0yMjQgNDAycTM3IDAgNjMgMjZ0MjYgNjN0LTI2IDYzdC02MyAyNnQtNjMuNSAtMjZ0LTI2LjUgLTYzdDI2LjUgLTYzdDYzLjUgLTI2eiIgLz4KPGdseXBoIHVuaWNvZGU9IkwiIGQ9Ik00NjAgNzAxcTE3NCAwIDI5NyAtMTIzdDEyMyAtMjk3dC0xMjMgLTI5N3QtMjk3IC0xMjN0LTI5NyAxMjN0LTEyMyAyOTd0MTIzIDI5N3QyOTcgMTIzek00NjAgLTM0cTEzMCAwIDIyMi41IDkydDkyLjUgMjIzdC05Mi41IDIyM3QtMjIyLjUgOTJ0LTIyMi41IC05MnQtOTIuNSAtMjIzdDkyLjUgLTIyM3QyMjIuNSAtOTJ6TTQ2NCA1MjlxMTAzIDAgMTc2LjUgLTczLjV0NzMuNSAtMTc3LjV0LTczIC0xNzcuNXQtMTc3IC03My41IHQtMTc3LjUgNzMuNXQtNzMuNSAxNzcuNXQ3My41IDE3Ny41dDE3Ny41IDczLjV6TTM5NiAzNTlxMzMgMzMgMTAyIDcwbC0zMCA0MHEtNCAxIC0xMiAxcS02MSAwIC0xMTYuNSAtNTV0LTU1LjUgLTExNnEwIC02IDEgLTlsNDIgLTMycTM4IDcwIDY5IDEwMXpNNTQwIDE1NXExNiAwIDI4IDEydDEyIDI5dC0xMS41IDI5dC0yOC41IDEydC0yOSAtMTJ0LTEyIC0yOXQxMiAtMjl0MjkgLTEyeiIgLz4KPGdseXBoIHVuaWNvZGU9Ik0iIGhvcml6LWFkdi14PSI5NTIiIGQ9Ik04OTIgMzJsLTI3MyAyNjJsMjczIDIzNHEzIC04IDMgLTE1di00NjVxMCAtOCAtMyAtMTZ6TTQ3NiAyMzhsLTcyIDU4bC0zNiAzMGwtMjc1IDIzNXExMCAyIDE0IDJoNzM4cTQgMCAxNCAtMmwtMjc1IC0yMzVsLTM2IC0zMHpNODQ1IC0yaC03MzhxLTUgMCAtMTMgMmwyNzYgMjY1bDEwNiAtODdsMTA3IDg3bDI3NSAtMjY1cS04IC0yIC0xMyAtMnpNNjAgNTI4bDI3MyAtMjM0bC0yNzMgLTI2MnEtMyA4IC0zIDE2djQ2NXEwIDcgMyAxNXoiIC8+CjxnbHlwaCB1bmljb2RlPSJOIiBob3Jpei1hZHYteD0iOTQzIiBkPSJNODU3IDY3MHExNyAwIDIzIC02dDYgLTIzdi02NTVxMCAtMTcgLTYgLTIzdC0yMyAtNmgtMTA4aC01NDZoLTcxcS0yOCAwIC01My41IDI2LjV0LTI1LjUgNTIuNXY0ODFxMCAxNyA2IDIzdDIzIDZoOTJ2OTVxMCAxNyA2IDIzdDIzIDZoNjU0ek04MzcgN3Y2MTNoLTYxNHYtNzR2LTUwdi00NDVoLTQ5djQ0NWgtNzF2LTQ2MHEwIC03IDExIC0xOHQxOCAtMTFoNzFoNTQ2aDg4ek01MTEgNTU2di0yMjNoLTIyM3YyMjNoMjIzek03NjUgNTI1di0zNyBoLTE4NXYzN2gxODV6TTc2NSA0MTF2LTM3aC0xODV2MzdoMTg1ek03NjUgMjU5di0zN2gtNDc3djM3aDQ3N3pNNzY1IDE0NHYtMzdoLTQ3N3YzN2g0Nzd6IiAvPgo8Z2x5cGggdW5pY29kZT0iTyIgaG9yaXotYWR2LXg9IjkzMCIgZD0iTTg4MiA1MTB2LTUxMWgtNzB2NTExaDcwek02OTUgNTEwaDQ3di01MTFoLTU1NnY1MTFoNTJxNjggMTMzIDEyMiAxMzNoMjA3cTMyIDAgNjYuNSAtNDAuNXQ2MS41IC05Mi41ek01MTQgNTIycTEzIDAgMjIgOXQ5IDIydC05IDIxLjV0LTIyIDguNWgtMTA0cS0xMyAwIC0yMS41IC04LjV0LTguNSAtMjEuNXQ4LjUgLTIydDIxLjUgLTloMTA0ek00OCA1MTBoNjl2LTUxMWgtNjl2NTExeiIgLz4KPGdseXBoIHVuaWNvZGU9IlAiIGhvcml6LWFkdi14PSI5MDkiIGQ9Ik03MTkgNDk2aDE0M3YtNDk1aC02NTl2MWwtMTc3IDQ2MWw2MTUgMjM3ek02NjAgNDk2bC01MSAxMzNsLTM0NSAtMTMzaDM5NnpNOTcgNDMybDEwNiAtMjc3djMxOHpNMjU4IDU2aDU0OXYzODVoLTU0OXYtMzg1ek02OTkgMjkybDU4IC0xOTBoLTQzMmwxMDMgMTEybDY2IC00MmwxMjMgMTc3bDM4IC03MXpNMzc5IDI3NXEtMjIgMCAtMzcgMTV0LTE1IDM3dDE1IDM3dDM3IDE1dDM3IC0xNXQxNSAtMzd0LTE1IC0zN3QtMzcgLTE1eiIgLz4KPGdseXBoIHVuaWNvZGU9IlEiIGhvcml6LWFkdi14PSI4NDQiIGQ9Ik02ODEgNTIxcTYxIC01NCA5NS41IC0xMjkuNXQzNC41IC0xNjAuNXEwIC0xNjEgLTExNCAtMjc1LjV0LTI3NSAtMTE0LjV0LTI3NSAxMTQuNXQtMTE0IDI3NS41cTAgODUgMzUgMTYxdDk2IDEzMHEyMCAxNyA0Ni41IDE1LjV0NDMuNSAtMjEuNXExNyAtMTkgMTUuNSAtNDUuNXQtMjEuNSAtNDMuNXEtODggLTc4IC04OCAtMTk2cTAgLTEwOSA3Ni41IC0xODZ0MTg1LjUgLTc3dDE4NS41IDc3dDc3LjUgMTg2cTAgMTE3IC04OCAxOTUgcS0yMCAxOCAtMjEuNSA0NHQxNi41IDQ2cTE3IDE5IDQzLjUgMjAuNXQ0NS41IC0xNS41ek00MjMgMTY2cS0yNiAwIC00NC41IDE5dC0xOC41IDQ1djQwN3EwIDI2IDE4LjUgNDV0NDQuNSAxOXQ0NSAtMTl0MTkgLTQ1di00MDdxMCAtMjYgLTE5IC00NXQtNDUgLTE5eiIgLz4KPGdseXBoIHVuaWNvZGU9IlIiIGhvcml6LWFkdi14PSI5MDkiIGQ9Ik02NjggMTA1djg3bDEwNCA3MHYtMjYyaC03MzF2NTIzaDMyN3EtMiAtMSAtNi41IC0zdC02LjUgLTNxLTg3IC0zOSAtMTQxIC05OWgtNjl2LTMxM2g1MjN6TTg3NyA0MTdsLTMxMyAtMjExdjEzN3EtOTAgMCAtMTQxIC03cS00OSAtNiAtODkuNSAtMjF0LTYzLjUgLTMzLjV0LTM5IC0zNS41dC0yMiAtMjhsLTYgLTEycTAgNTQgMjAgMTAwdDUxLjUgNzUuNXQ3MC41IDUyLjV0NzcuNSAzNXQ3MCAyMHQ1MS41IDEwbDIwIDJ2MTI2eiIgLz4KPGdseXBoIHVuaWNvZGU9IlMiIGhvcml6LWFkdi14PSI4NTMiIGQ9Ik04MjYgMzg5cTEwIC0xMSA4IC0yNHEwIC0xMyAtMTAgLTI4cS0zIC00IC0xNiAtMTRsLTE4NCAtMTIxcS0yIC0xIC01LjUgLTd0LTIuNSAtMTB2LTRsODEgLTIzN3E0IC0xMSA0IC0yM3EwIC0xNSAtNyAtMjVxLTExIC0xNiAtMzAgLTE2aC0xcS0xNiAxIC0zNiAxNWwtMTkwIDE1NXEtMyAzIC0xMCAzdC05IC0zbC0xODEgLTE1NHEtMTggLTE0IC0zNiAtMTVxLTIxIC0yIC0zMSAxNXEtOCAxMSAtOCAyNnEwIDcgNCAyMWw3MiAyMzZ2NCBxMSA1IC0yIDExdC02IDdsLTE4NSAxMjJxLTEwIDcgLTE2IDE0cS0xMSAxMyAtMTEgMjhxMCAxNCA4IDI0cTkgOSAxNiAxMnExMiA1IDI3IDVoMjMwcTYgMCAxMSA0cTcgNSA3IDEwbDY3IDIzOXE0IDE0IDkgMjFxMTMgMTggMzMgMTlxMjAgLTEgMzMgLTE5cTMgLTQgMTAgLTIxbDY2IC0yMzlxMCAtNSA3IC0xMHE1IC00IDExIC00aDIzMHE5IDAgMjAgLTNxMTQgLTQgMjMgLTE0eiIgLz4KPGdseXBoIHVuaWNvZGU9IlQiIGhvcml6LWFkdi14PSI4OTkiIGQ9Ik04MTcgMTg1bDYzIC02NGwtMTYyIC05MWwtOTIgLTE2M2wtNjMgNjRsMTQgMTQ4bC0xNjkgMTY5bC0yMjQgLTM3MWwtNjMgNjNsMTIwIDQ3NWwtMTc2IDE3NXEtMTkgMjAgLTE5IDQ2LjV0MTkgNDUuNXQ0NiAxOXQ0NiAtMTlsMTc2IC0xNzVsNDc1IDEyMGw2MyAtNjNsLTM3MSAtMjI1bDE2OCAtMTY4eiIgLz4KPGdseXBoIHVuaWNvZGU9IlUiIGhvcml6LWFkdi14PSI4OTQiIGQ9Ik03NjAgMTU0cTQ2IC0yMCA3Mi41IC00NC41dDI5LjUgLTM4LjVsMyAtMTR2LTg2aC04MzZ2ODZxMCAyIDAuNSA2dDYgMTV0MTUuNSAyMnQzMS41IDI2dDUwLjUgMjhxMTIgNSA1NCAyOXQ4NyA0M3Q5NCAyOHEtMzMgMzQgLTcyIDEzNHEtMTEgMjggLTExIDEwMHEwIDcgLTEgMzF0LTAuNSA0MS41dDMuNSAyOS41cTMxIDExMSAxNTkgMTExcTEyNyAwIDE1OCAtMTExcTQgLTEyIDQuNSAtMjkuNXQtMSAtNDF0LTEuNSAtMzEuNSBxMCAtNzIgLTEwIC0xMDBxLTM4IC05NiAtNzIgLTEzNHE1MCAtOCA5NC41IC0yN3Q4NyAtNDMuNXQ1NC41IC0yOS41eiIgLz4KPGdseXBoIHVuaWNvZGU9IlYiIGhvcml6LWFkdi14PSI5NDkiIGQ9Ik02NTkgNDE2bDIzNSAxMTF2LTQ0OWwtMjM1IDExMXYxdi0xMDNxMCAtMTkgLTEzIC0zMnQtMzIgLTEzaC01MTBxLTE5IDAgLTMyIDEzdC0xMyAzMnY0MzNxMCAxOSAxMyAzMnQzMiAxM2g1MTBxMTkgMCAzMiAtMTN0MTMgLTMydi0xMDR6IiAvPgo8Z2x5cGggdW5pY29kZT0iVyIgaG9yaXotYWR2LXg9Ijk1NCIgZD0iTTcwNCA1NHYxODFsOTIgOTN2LTI3NHEwIC01MSAtMzYgLTg3dC04NyAtMzZoLTQ5MnEtNTEgMCAtODcgMzZ0LTM2IDg3djQ5M3EwIDUxIDM2IDg3dDg3IDM2aDQ5MnExNyAwIDI0IC0ybC04OSAtOTBoLTQyN3EtMTMgMCAtMjIgLTl0LTkgLTIydi00OTNxMCAtMTMgOSAtMjJ0MjIgLTloNDkycTEzIDAgMjIgOXQ5IDIyek00MzEgMzE0bDM1NCAzNTRsMTMyIC0xMzJsLTM1NCAtMzU0djBsLTE5NSAtNjNsNjMgMTk1djB6TTU0NyAyMDggbC04OSA4OWwtNDMgLTEzMXoiIC8+CjxnbHlwaCB1bmljb2RlPSJYIiBob3Jpei1hZHYteD0iOTIxIiBkPSJNODY4IDU0MnYtNDIzaC02NnEtMTMgMjkgLTQwIDQ2LjV0LTYwIDE3LjV0LTU5LjUgLTE3LjV0LTQwLjUgLTQ2LjVoLTIyMHY0MjNoNDg2ek0yNDAgMTgzcS0zMyAwIC02MCAtMTcuNXQtNDAgLTQ2LjVoLTEwN3YxODBsMTExIDEyM2gxODR2LTI4NHEtMzMgNDUgLTg4IDQ1ek0xMDEgMjg4di01OGgxNjF2MTMyaC05OXpNMjQwIDE0NnEzMCAwIDUxLjUgLTIxdDIxLjUgLTUycTAgLTMwIC0yMS41IC01MS41dC01MS41IC0yMS41IHEtMzEgMCAtNTIgMjEuNXQtMjEgNTEuNXEwIDMxIDIxIDUydDUyIDIxek03MDIgMTQ2cTMxIDAgNTIgLTIxdDIxIC01MnEwIC0zMCAtMjEgLTUxLjV0LTUyIC0yMS41cS0zMCAwIC01MS41IDIxLjV0LTIxLjUgNTEuNXEwIDMxIDIxLjUgNTJ0NTEuNSAyMXoiIC8+CjxnbHlwaCB1bmljb2RlPSJZIiBob3Jpei1hZHYteD0iODYxIiBkPSJNNDI1IDQ4OGwtMTQ1IC00MDlsLTEyNiAxOTNsLTgxIC03NmwtMjIgLTIwbC00NiAzOWwxNjIgMTUxbDk2IC0xNDdsMTcxIDQ4M2wxNTcgLTYwNWwxMzEgNDEzbDExNiAtMzcxbC02MSAtMTZsLTU1IDE3OGwtMTM3IC00MzF6IiAvPgo8Z2x5cGggdW5pY29kZT0iWiIgaG9yaXotYWR2LXg9Ijg5NyIgZD0iTTQwMiA2MDd2LTM2OWgzNzFxMCAtMTUzIC0xMDggLTI2MXQtMjYxIC0xMDh0LTI2MSAxMDh0LTEwOCAyNjFxMCAxNTIgMTA3LjUgMjYwdDI1OS41IDEwOXpNNDk2IDcwMHExNTMgMCAyNjEuNSAtMTA4LjV0MTA4LjUgLTI2MS41aC0zNzF2MzcwaDF6IiAvPgo8Z2x5cGggdW5pY29kZT0iWyIgaG9yaXotYWR2LXg9Ijg2MSIgZD0iTTQ0NSA2NzF2LTI3OGg0MDl2LTE4NWgtNDA5di0yNzdsLTQyNyAzNzB6IiAvPgo8Z2x5cGggdW5pY29kZT0iXCIgaG9yaXotYWR2LXg9Ijg1NCIgZD0iTTcxMCA1NzloODd2LTczOWgtNzQwdjczOWg4OXY0NnEwIDM1IDIwIDU0dDU2IDE5dDU2LjUgLTE5LjV0MjAuNSAtNTMuNXYtNDZoNTJ2NDZxMCAzNCAyMC41IDUzLjV0NTYuNSAxOS41dDU2IC0xOXQyMCAtNTR2LTQ2aDUydjQ2cTAgMzQgMjAuNSA1My41dDU2LjUgMTkuNXQ1Ni41IC0xOS41dDIwLjUgLTUzLjV2LTQ2ek01OTggNjI1di0xMjNxMCAtMzIgMzUgLTMycTE5IDAgMjcuNSA3LjV0OC41IDI0LjV2MTIzcTAgMTcgLTguNSAyNC41IHQtMjcuNSA3LjVxLTM1IDAgLTM1IC0zMnpNMzkyIDYyNXYtMTIzcTAgLTE3IDguNSAtMjQuNXQyNy41IC03LjVxMzUgMCAzNSAzMnYxMjNxMCAzMiAtMzUgMzJxLTE5IDAgLTI3LjUgLTcuNXQtOC41IC0yNC41ek0xODcgNjI1di0xMjNxMCAtMzIgMzUgLTMycTE5IDAgMjcuNSA3LjV0OC41IDI0LjV2MTIzcTAgMTcgLTguNSAyNC41dC0yNy41IDcuNXEtMzUgMCAtMzUgLTMyek03MzUgLTk5djUxNGgtNjE2di01MTRoNjE2ek00MjkgOTkgcTAgLTQ1IC0zNSAtNzB0LTkwIC0yNXEtMzYgMCAtNzMgMTRsNyA1MnEzNSAtMTQgNzMgLTE0cTI0IDAgMzggMTF0MTQgMjhxMCAyMiAtMTYuNSAzMi41dC01OS41IDEyLjV2NTJxNjMgNSA2MyAzOHEwIDI4IC00MiAyOHEtMjkgMCAtNjEgLTE1bC03IDUycTM0IDE1IDg0IDE1cTQ1IDAgNzEgLTE4dDI2IC00NnEwIC01MCAtNjUgLTcydi0xcTczIC0yMCA3MyAtNzR6TTUzNyAyMjlsLTUyIC0yMGwtNyA1Mmw5MSA0NGgzMXYtMjk2aC02M3YyMjB6ICIgLz4KPGdseXBoIHVuaWNvZGU9Il0iIGhvcml6LWFkdi14PSI4NjEiIGQ9Ik00MTUgLTY5djI3N2gtNDA4djE4NWg0MDh2Mjc4bDQyOCAtMzcweiIgLz4KPGdseXBoIHVuaWNvZGU9Il4iIGhvcml6LWFkdi14PSI3NzUiIGQ9Ik03NDkgNTcycTIyIC00NiAtMyAtMTMycS0yNCAtODUgLTUgLTIzNHEtOCAtMiAtMjEgLTR0LTQ5IC04dC02NiAtOHQtNjEgLTJ0LTQ2LjUgOXQtMTAuNSAyNnExNSA0OCAtNDggNDZxLTYxIC0yIC0xODIgLTQ4cS0zNyAtMTQgLTYzIC0zdjM5OXEyMiA2IDU4IDE1dDExMiAyNXQxMjYuNSAxNC41dDUwLjUgLTI0LjVxMCAtMyAtMiAtMTQuNXQtMy41IC0yM3QtMS41IC0yM3Q1IC0xOHQxNiAtNS41cTMwIDQgNzguNSA3dDgyLjUgNHogTTE0NSA2NTh2LTgxN2gtODV2ODE3cTAgMTcgMTIuNSAyOS41dDMwLjUgMTIuNXExNyAwIDI5LjUgLTEyLjV0MTIuNSAtMjkuNXoiIC8+CjxnbHlwaCB1bmljb2RlPSJfIiBob3Jpei1hZHYteD0iODIwIiBkPSJNNTkgMTk4djE5OWg3MDJ2LTE5OWgtNzAyeiIgLz4KPGdseXBoIHVuaWNvZGU9ImAiIGhvcml6LWFkdi14PSI5MzYiIGQ9Ik0zMDYgMzc4bC0xNTIgMTUzbC05NSAtOTZ2Mjc3aDI3N2wtOTUgLTk1bDE1MiAtMTUyek03ODMgNzVsOTUgOTV2LTI3NmgtMjc3bDk1IDk1bC0xNTIgMTUxbDg3IDg3ek02MzEgMzc4bC04NyA4N2wxNTIgMTUybC05NSA5NWgyNzZ2LTI3N2wtOTQgOTV6TTMwNiAyMjdsODcgLTg3bC0xNTIgLTE1Mmw5NSAtOTVsLTI3NyAxdjI3N2w5NSAtOTZ6IiAvPgo8Z2x5cGggdW5pY29kZT0iYSIgaG9yaXotYWR2LXg9IjgxMCIgZD0iTTc0NSAxNDRxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV0LTE0LjUgLTM2dC0zNS41IC0xNXEtMiAwIC02IDAuNXQtNiAwLjVxLTQyIC0zNiAtNzkgLTU5cS04MyAtNTUgLTE1NyAtNzZxLTcxIC00NCAtOTAgLTQ0cS0xNCAwIC05NSA0NXEtNzYgMjIgLTE1NiA3NXEtNDAgMjcgLTc5IDU5cS0yIDAgLTUuNSAtMC41dC01LjUgLTAuNXEtMjEgMCAtMzYgMTV0LTE1IDM2dDE1IDM1LjV0MzYgMTQuNXQzNS41IC0xNC41dDE0LjUgLTM1LjV2LTggcTkgLTggMzQgLTIydDM4IC0yM3E0NyAtMzEgMTQ0IC0zM2wzMiAxNTFxNCA5OCA3IDE5MmgtMTM2bC01MiAxMnEtMTQgLTE3IC0zMyAtMTdxLTE3IDAgLTI5IDExLjV0LTEyIDI4LjV0MTIgMjguNXQyOSAxMS41cTIyIDAgMzMgLTE4aDE5MHEyIDcyIDMgOTZxLTMyIDEwIC01MiAzNi41dC0yMCA2MC41cTAgNDIgMjkuNSA3MS41dDcwLjUgMjkuNXE0MiAwIDcxLjUgLTI5LjV0MjkuNSAtNzEuNXEwIC0zMyAtMjAgLTU5LjV0LTUxIC0zNi41IHEwIC03IDEuNSAtNDAuNWwyLjUgLTU2LjVoMTg5cTExIDE4IDMzIDE4cTE3IDAgMjkgLTExLjV0MTIgLTI4LjV0LTEyIC0yOC41dC0yOSAtMTEuNXEtMjEgMCAtMzIgMTdsLTUzIC0xMmgtMTM1bDYgLTE5MmwzMyAtMTU0cTc5IC00IDEyMCAyMXE1MCAzMCA5NiA2MnEtMSAyIC0xIDZxMCAyMSAxNSAzNS41dDM2IDE0LjV6TTM1MSA2MDFxMCAtMjIgMTUuNSAtMzcuNXQzNy41IC0xNS41cTIzIDAgMzguNSAxNS41dDE1LjUgMzcuNXQtMTYgMzcuNSB0LTM4IDE1LjV0LTM3LjUgLTE1LjV0LTE1LjUgLTM3LjV6IiAvPgo8Z2x5cGggdW5pY29kZT0iYiIgaG9yaXotYWR2LXg9IjkxOSIgZD0iTTQ2MSA2OTlsNDA4IC0xMTN2LTU5MWwtNDA4IC0xMTRsLTQxMCAxMTR2NTkxek00MjYgLTM4djQzOWwtMzA2IDg2di00NDF6TTQ2MCA0NjJsMzAwIDg0bC0yOTkgODJsLTMwMCAtODJ6TTgwMSA0NnY0NDBsLTMwNyAtODV2LTQ0MHoiIC8+CjxnbHlwaCB1bmljb2RlPSJjIiBob3Jpei1hZHYteD0iOTA4IiBkPSJNNzY3IDMxOHE0NiAtMTkgNzMuNSAtNjB0MjcuNSAtOTJxMCAtNjggLTQ4IC0xMTZ0LTExNiAtNDhoLTloLTE5OHYxNjJoMzBoNzZxMTIgMCAxNSA2LjV0LTQgMTYuNWwtMTQ1IDE3M3EtOCAxMCAtMTkuNSAxMHQtMTkuNSAtMTBsLTE0NSAtMTczcS04IC0xMCAtNSAtMTYuNXQxNiAtNi41aDc2aDMwdi0xNjJoLTE5OGgtMWgtMWgtMnYxcS02OCAxIC0xMTYuNSA1MHQtNDguNSAxMTdxMCA0NiAyMiA4NHQ2MCA2MXEtNSAxOCAtNSAzNCBxMCA0NyAzMy41IDgwLjV0ODEuNSAzMy41cTM5IDAgNjkgLTI0cTMxIDY0IDkxIDEwM3QxMzMgMzlxMTAzIDAgMTc1LjUgLTcyLjV0NzIuNSAtMTc1LjVxMCAtMTAgLTEgLTE1eiIgLz4KPGdseXBoIHVuaWNvZGU9ImQiIGhvcml6LWFkdi14PSI5MTgiIGQ9Ik00NTkgNjk5cTE3NCAwIDI5Ni41IC0xMjN0MTIyLjUgLTI5NnEwIC0xNzQgLTEyMi41IC0yOTYuNXQtMjk2LjUgLTEyMi41cS0xNzMgMCAtMjk2IDEyMi41dC0xMjMgMjk2LjVxMCAxNzMgMTIzIDI5NnQyOTYgMTIzek03NzQgMjgwcTAgMTMwIC05Mi41IDIyMnQtMjIyLjUgOTJxLTEwMCAwIC0xODIgLTU4bDQzOCAtNDM4cTU5IDgxIDU5IDE4MnpNMTQ1IDI4MHEwIC0xMzAgOTIgLTIyMnQyMjIgLTkycTEwMyAwIDE4MyA1OGwtNDM4IDQzOSBxLTU5IC04MyAtNTkgLTE4M3oiIC8+CjxnbHlwaCB1bmljb2RlPSJlIiBob3Jpei1hZHYteD0iNTU2IiBkPSJNNTUwIDY5OWwtMTkzIC0zNDJoMTU4bC01MTAgLTQ3NmwyMzkgMzg2aC0xNjB6IiAvPgo8Z2x5cGggdW5pY29kZT0iZiIgaG9yaXotYWR2LXg9IjkxMiIgZD0iTTU2IDQxNXExNDkgMCAyNzUgLTczLjV0MjAwIC0xOTkuNXQ3NSAtMjc1aC0xNjBxLTIgMTYxIC0xMTUgMjc0cS0xMTQgMTE0IC0yNzUgMTE0djE2MHpNNTYgNzAwcTE2OSAwIDMyMi41IC02NnQyNjUuNSAtMTc3LjV0MTc4IC0yNjZ0NjcgLTMyMy41aC0xNjBxLTEgMTgzIC05MS41IDMzNy41dC0yNDUgMjQ0LjV0LTMzNi41IDkwdjE2MXpNMTY3IDkwcTQ2IDAgNzguNSAtMzIuNXQzMi41IC03OC41dC0zMi41IC03OC41dC03OC41IC0zMi41IHQtNzguNSAzMi41dC0zMi41IDc4LjV0MzIuNSA3OC41dDc4LjUgMzIuNXoiIC8+CjxnbHlwaCB1bmljb2RlPSJnIiBob3Jpei1hZHYteD0iODk0IiBkPSJNODY1IDM2di0zNWgtMTUxdjQ3djFxLTQgNDMgLTU1IDczcS0xMCAxNiAtMjIgNDdxLTUgMTEgLTUgNDBxMCAzNyAxIDQxcTEzIDQ0IDY0IDQ0dDY0IC00NHYtNDFxMCAtMzAgLTQgLTQwcS0xNSAtMzkgLTI5IC01NHEyMCAtNCAzOCAtMTEuNXQzNS41IC0xN3QyMS41IC0xMS41cTE5IC04IDI5LjUgLTE4dDExLjUgLTE1ek0xODAgNDl2LTF2LTQ3aC0xNTF2MzVxMCAyIDEgNnQxMS41IDE0dDI5LjUgMThxNSAyIDIxLjUgMTJ0MzQuNSAxNy41IHQzOCAxMS41cS0xNCAxNSAtMjkgNTRxLTQgMTAgLTQgNDBxMCAzNyAxIDQxcTExIDQ0IDYzIDQ0cTUxIDAgNjQgLTQ0cTEgLTQgMSAtNDFxMCAtMzAgLTQgLTQwcS0xNSAtMzYgLTI0IC00OHEtNTMgLTMyIC01MyAtNzJ6TTYyMCAxMDJxMjUgLTExIDM5LjUgLTI0LjV0MTYuNSAtMjEuNWwyIC04di00N2gtNDYydjQ3cTAgMyAxLjUgOC41dDE2IDE5LjV0NDAuNSAyNnE2IDMgMjkgMTZ0NDggMjMuNXQ1MiAxNS41cS0xOCAyMSAtMzkgNzQgcS02IDEzIC02IDU2cTAgNTMgMSA1NnExNyA2MSA4NyA2MXQ4OCAtNjFxMSAtMyAxIC01NnEwIC00MSAtNiAtNTZxLTIxIC01NCAtNDAgLTc0cTI4IC01IDUyLjUgLTE1dDQ5IC0yNHQyOS41IC0xNnoiIC8+CjxnbHlwaCB1bmljb2RlPSJoIiBob3Jpei1hZHYteD0iOTA2IiBkPSJNODQ4IDQyNXEyNSAtNjggMjUgLTE0NHQtMjUgLTE0NHEtMTAgLTI4IC00MCAtMjhxLTYgMCAtMTAgMWwtNyAycS01NSAtMTExIC0xNjkgLTE2OWwyIC03cTQgLTE2IC0zLjUgLTMwdC0yMi41IC0yMHEtNzIgLTI1IC0xNDQgLTI1cS03MyAwIC0xNDUgMjVxLTE1IDYgLTIyLjUgMjB0LTMuNSAzMGwyIDdxLTExMiA1NSAtMTcwIDE2OWwtNyAtMnEtMyAtMSAtMTAgLTFxLTI5IDAgLTM5IDI4cS0yNiA3MCAtMjYgMTQ0dDI2IDE0NCBxMTAgMjggMzkgMjhxMyAwIDExIC0ybDYgLTFxNTggMTE1IDE3MCAxNjlsLTIgN3EtNCAxNiAzLjUgMzB0MjIuNSAyMHE3MiAyNSAxNDQgMjVxNzUgMCAxNDUgLTI2cTE1IC01IDIyLjUgLTE5dDMuNSAtMzBsLTIgLTdxMTEzIC01NiAxNzAgLTE2OWw2IDFxOCAyIDExIDJxMjkgMCAzOSAtMjh6TTgwOCAxNTFxMjMgNjMgMjMgMTMwcTAgNjYgLTIyIDEzMGwtMTY2IC00MXEyMCAtNDIgMjAgLTg5dC0yMCAtODl6TTU4MyAtNzRsLTQwIDE2NSBxLTQyIC0yMCAtODkgLTIwdC05MCAyMGwtNDAgLTE2NXE2MSAtMjMgMTMwIC0yM3E2OCAwIDEyOSAyM3pNNTYxIDEyOXExMiAtNyAxNyAtMTZxMjQgMTcgNDQgNDNxLTExIDYgLTE3IDE4cS04IDE3IDAgMzZxMTYgMzIgMTYgNzFxMCAzOCAtMTYgNzFxLTggMTggMCAzNnE3IDEyIDE3IDE4cS0xOSAyNSAtNDQgNDNxLTcgLTEyIC0xNyAtMTZxLTggLTQgLTE4IC00cS0xMSAwIC0xOCA0cS0zMyAxNiAtNzIgMTZxLTM4IDAgLTcxIC0xNiBxLTcgLTQgLTE4IC00cS0xMCAwIC0xOCA0cS0xMiA3IC0xNyAxNnEtMjUgLTE4IC00NCAtNDNxMTEgLTYgMTcgLTE4cTggLTE4IDAgLTM2cS0xNyAtMzYgLTE3IC03MXEwIC0zNiAxNiAtNzFxOSAtMTkgMCAtMzZxLTQgLTExIC0xNiAtMThxMTYgLTIyIDQ0IC00NHE1IDEwIDE3IDE3cTggNCAxOCA0cTExIDAgMTggLTRxMzMgLTE2IDcyIC0xNnEzOCAwIDcxIDE2cTcgNCAxOCA0cTEwIDAgMTggLTR6TTc1IDI4MXEwIC02NCAyMyAtMTMwbDE2NSA0MSBxLTIwIDQ1IC0yMCA4OXEwIDQ1IDIxIDg5bC0xNjYgNDFxLTIzIC02NyAtMjMgLTEzMHpNNDUzIDY1OXEtNjggMCAtMTI5IC0yM2w0MCAtMTY1cTQzIDIwIDg5IDIwcTQ3IDAgOTAgLTIwbDQwIDE2NXEtNjEgMjMgLTEzMCAyM3oiIC8+CjxnbHlwaCB1bmljb2RlPSJpIiBkPSJNNDYwIDY5OXExNzQgMCAyOTcgLTEyM3QxMjMgLTI5N3QtMTIzIC0yOTd0LTI5NyAtMTIzcS0xNzMgMCAtMjk2LjUgMTIzdC0xMjMuNSAyOTd0MTIzLjUgMjk3dDI5Ni41IDEyM3pNNTE0IDU2OXEtMzEgLTEgLTQ5IC0yMnQtMTggLTQ1cTAgLTI1IDEzLjUgLTQwLjV0MzYuNSAtMTUuNWgxcTI5IDAgNDguNSAyMC41dDE5LjUgNDguNXEwIDIzIC0xMyAzN3EtMTUgMTcgLTM5IDE3ek01NjUgOThsMyAzbC0yIDRsLTE4IDM4bC01IC00IHEtMTQgLTE0IC0zNC41IC0yOHQtMjQuNSAtMTV2NXEwIDcgMyAyMGw0NiAxODhxNiAyNSA2IDU3cTAgMTggLTYgMzBxLTcgMTIgLTIyIDEycS0yNSAwIC03MS41IC0yOC41dC05MS41IC03MC41bC0zIC0zbDE2IC00NWw2IDRxMzUgMzEgNTUgMzlxMCAtNiAtMyAtMjFsLTQzIC0xODJxLTYgLTMwIC02IC02MHEwIC0yNSAxMCAtMzZxOSAtMTAgMjYgLTEwcTIzIDAgNzAuNSAyOXQ4OC41IDc0eiIgLz4KPGdseXBoIHVuaWNvZGU9ImoiIGhvcml6LWFkdi14PSI4NzciIGQ9Ik04MzUgMjMydi0xbDEgLTF2LTFxMTkgLTM1IDE5IC03OXEwIC0xOCAtNSAtNDNxLTEyIC00NiAtNDUgLTgwbC02NCAtNjNxLTUxIC01MSAtMTIzIC01MXQtMTIyIDUxbC03NyA3NmwtNDcgNDhsLTMzIDMzcS0zNyAzNyAtNDggOTFxLTIgMjAgLTIgMzFxMCAxNyAzIDM1bDMgMTJxNCAxNSAxNCAzNHYxcTEgMSAyLjUgNGwyLjUgNWwxIDJsMSAxcTEgMSAyLjUgMy41dDIuNSAzLjV2MWwyIDJxMSAxIDMgMy41dDMgMy41djFsMiAybDQgNHQ0IDUgbDI4IDI4bDQgLTVsNTcgLTU2cTAgLTEgMiAtM3QyIC0zdDEgLTMuNXQxIC0zLjVsLTI1IC0yNXEtMSAtMSAtMyAtMy41dC00IC00LjVxMCAtMSAtMSAtMnYtMXEtMiAtMiAtNCAtNnEtMSAwIC0xIC0xdC0xIC0ydC0xLjUgLTMuNXQtMC41IC0zLjVsLTEgLTF2LTJxLTQgLTkgLTQgLTIycTAgLTE1IDcgLTMycTQgLTggMTQgLTIwbDU3IC01N2w0MCAtMzlsNjAgLTYxcTIxIC0yMSA1MiAtMjFxMzIgMCA1MiAyMWw2NCA2NHExMiAxMiAxOCAyOSBxMyAxMSAzIDIzcTAgMTAgLTMgMjFxLTUgMTkgLTE4IDMxbC05OCA5OHExIDYgMSAxN3EwIDIxIC0zIDQwcS0xMiA2OCAtNTkgMTE2cTM5IC0xMiA3MSAtNDJsMiAtMmwxNTcgLTE1N3ExOCAtMTggMjkgLTM5cTAgLTEgMSAtMXpNNTM4IDQ0MXEzOSAtMzkgNDggLTkxcTMgLTE1IDMgLTMxcTAgLTExIC00IC0zNWwtMyAtMTJxLTMgLTEyIC0xMyAtMzRsLTEgLTFxLTEgLTEgLTIuNSAtNGwtMi41IC01bC0xIC0ybC0xIC0xcS0yIC00IC01IC03IGwtMSAtMXEtMSAtMSAtMSAtMnEtMyAtMyAtNSAtN2wtMSAtMWwtMiAtMnEtMiAtMyAtOCAtOWwtMjggLTI4bC00IDVsLTU3IDU2cS0xIDEgLTIgM3QtMiAzdC0xIDMuNXQtMSAzLjVsMjUgMjVxMSAxIDMgMy41dDQgNC41cTAgMSAwLjUgMXQwLjUgMXYxcTIgMiA0IDZsMSAxcTEgMSAxIDJxMiA0IDMgN3YxcTAgMSAxIDJxMyAxMSAzIDIycTAgMTUgLTcgMzJxLTQgOCAtMTQgMjBsLTU3IDU3bC0zOSAzOWwtNjEgNjFxLTIxIDIxIC01MiAyMSB0LTUyIC0yMWwtNjQgLTY0cS0xMiAtMTIgLTE4IC0yOXEtMyAtMTEgLTMgLTIzcTAgLTEwIDMgLTIxcTUgLTE5IDE4IC0zMWw5OCAtOThxLTEgLTYgLTEgLTE3cTAgLTIzIDQgLTQwcTEwIC02NSA1OCAtMTE2cS00MCAxMiAtNzEgNDJsLTIgMmwtMTU3IDE1N3EtMTggMTggLTI5IDM5cTAgMSAtMSAxdjFsLTEgMXYxcS0xOSAzOCAtMTkgNzlxMCAxOCA1IDQzcTEyIDQ2IDQ1IDgwbDY0IDYzcTUxIDUxIDEyMyA1MXQxMjIgLTUxbDc3IC03NiBsNDcgLTQ4eiIgLz4KPGdseXBoIHVuaWNvZGU9ImsiIGhvcml6LWFkdi14PSI4OTYiIGQ9Ik02NTcgNjEwcTg5IDAgMTQ4LjUgLTUwLjV0NTkuNSAtMTU5LjVxMCAtNDkgLTI2IC0xMDF0LTUyIC03OWwtMjYgLTI4bC0zMTMgLTMxMmwtMzEzIDMxMmwtMTEgMTF0LTI1IDMwdC0zMiA0NnQtMjUgNTYuNXQtMTEgNjQuNXEwIDEwOSA1OSAxNTkuNXQxNDggNTAuNXE5MCAwIDE5MSAtMTA3bDE5IC0yMXE0IDUgMTEuNSAxMy41dDMxIDMxdDQ3IDM5dDU2LjUgMzAuNXQ2MyAxNHoiIC8+CjxnbHlwaCB1bmljb2RlPSJsIiBob3Jpei1hZHYteD0iOTQyIiBkPSJNMjc5IDcwMGg2MDV2LTEzM2gtNjA1djEzM3pNMjc5IDI4NHYxMzNoNjA1di0xMzNoLTYwNXpNMjc5IDB2MTMzaDYwNXYtMTMzaC02MDV6TTEyMiA3MDBxMjggMCA0Ny41IC0xOS41dDE5LjUgLTQ2LjVxMCAtMjggLTE5LjUgLTQ3LjV0LTQ3LjUgLTE5LjVxLTI3IDAgLTQ2LjUgMTkuNXQtMTkuNSA0Ny41cTAgMjcgMTkuNSA0Ni41dDQ2LjUgMTkuNXpNMTIyIDQxOHEyOCAwIDQ3LjUgLTE5LjV0MTkuNSAtNDcuNXEwIC0yNyAtMTkuNSAtNDYuNSB0LTQ3LjUgLTE5LjVxLTI3IDAgLTQ2LjUgMTkuNXQtMTkuNSA0Ni41cTAgMjggMTkuNSA0Ny41dDQ2LjUgMTkuNXpNMTIyIDEzNHEyOCAwIDQ3LjUgLTE5LjV0MTkuNSAtNDYuNXEwIC0yOCAtMTkuNSAtNDcuNXQtNDcuNSAtMTkuNXEtMjcgMCAtNDYuNSAxOS41dC0xOS41IDQ3LjVxMCAyNyAxOS41IDQ2LjV0NDYuNSAxOS41eiIgLz4KPGdseXBoIHVuaWNvZGU9Im0iIGhvcml6LWFkdi14PSI4MDgiIGQ9Ik03NzEgNjk4di04M3YtNTE0cS0xIC01MiAtNDYuNSAtODh0LTExMC41IC0zNnQtMTExIDM3dC00NiA4OXQ0NiA4OXQxMTEgMzdxMzYgMCA3MCAtMTN2MzA4bC0zNTIgLTg0di00OTVxLTEgLTUyIC00NyAtODguNXQtMTEwIC0zNi41cS02NSAwIC0xMTEgMzd0LTQ2IDkwcTAgNTIgNDYgODl0MTExIDM3cTM1IDAgNjkgLTEzdjUxM2gybDQzOCAxMDR6IiAvPgo8Z2x5cGggdW5pY29kZT0ibiIgaG9yaXotYWR2LXg9Ijk1NiIgZD0iTTc1OSA3MDBxNTggMCA5OSAtNDF0NDEgLTk5di01NjFxMCAtNTggLTQxIC05OXQtOTkgLTQxaC01NjFxLTU4IDAgLTk5IDQxdC00MSA5OXY1NjFxMCA1OCA0MSA5OXQ5OSA0MWg1NjF6TTc5NCA0OTBoLTUxM3YtMTE3aDUxM3YxMTd6TTI1OSAyMTdoLTk2di0xMTRoOTZ2MTE0ek0xNjMgMjM4aDk2djExNGgtOTZ2LTExNHpNMjgxIDIxN3YtMTE0aDUxM3YxMTRoLTUxM3pNMjgxIDIzOGg1MTN2MTE0aC01MTN2LTExNHpNMjU5IDQ5MGgtOTYgdi0xMTdoOTZ2MTE3ek0xNjMgLTFxMCAtMTQgMTAuNSAtMjQuNXQyNC41IC0xMC41aDYxdjExN2gtOTZ2LTgyek03NTkgLTM2cTE0IDAgMjQuNSAxMC41dDEwLjUgMjQuNXY4MmgtNTEzdi0xMTdoNDc4eiIgLz4KPGdseXBoIHVuaWNvZGU9Im8iIGhvcml6LWFkdi14PSI5NDEiIGQ9Ik04NjcgNTQ1cTExIDAgMTggLTcuNXQ3IC0xNy41di01MjVxMCAtMTEgLTcgLTE4dC0xOCAtN2gtNzg0cS0xMSAwIC0xOCA3dC03IDE4djUyNXEwIDEwIDcgMTcuNXQxOCA3LjVoMzhsMjkgNTlxMTEgMjIgMzYgMjJoMTU4cTI1IDAgMzYgLTIybDI4IC01OWg0NTl6IiAvPgo8Z2x5cGggdW5pY29kZT0icCIgaG9yaXotYWR2LXg9Ijg1NSIgZD0iTTU0MiA1NDlsMTUzIC0xNTNsLTQ2MCAtNDYwdjB2MGwtMjI2IC03NGw3MyAyMjd2MHYwek0xODggNjVsMzc5IDM3OWwtMjUgMjZsLTM4MCAtMzgwek02OTQgNzAxbDE1NCAtMTUzbC0xMDEgLTEwMGwtMTUzIDE1M3oiIC8+CjxnbHlwaCB1bmljb2RlPSJxIiBob3Jpei1hZHYteD0iOTEwIiBkPSJNODY1IDE2MHEwIC00MiAtMjYgLTc1dC02NiAtNDRxMTUgLTQzIDY2IC04MnExMiAtOCAtOSAtMTRxLTQ1IC0xMSAtMTE0IDIxcS01MiAyNSAtOTcgNzFoLTI5OXEtNDIgMCAtNzcgMjdxMzAgMTggNTYgNDNoMjc2cTc0IDAgMTI2LjUgNTIuNXQ1Mi41IDEyNi41djIzNXE0NyAtNSA3OSAtNDB0MzIgLTgzdi0yMzh6TTY5OCAyODZxMCAtNTIgLTM2IC04OHQtODcgLTM2aC0yOThxLTQ5IC01MCAtMTAwIC03MnQtOTAgLTIycS0zNCAwIC0zNCAxMSBxMCAzIDMgNXE1MCAzOCA2NiA4MnEtNDAgMTEgLTY2IDQ0dC0yNiA3NnYyMzdxMCA1MSAzNiA4Ny41dDg4IDM2LjVoNDIxcTUxIDAgODcgLTM2LjV0MzYgLTg3LjV2LTIzN3oiIC8+CjxnbHlwaCB1bmljb2RlPSJyIiBob3Jpei1hZHYteD0iOTAwIiBkPSJNNzI2IDI3OGwyNCAyNGw5MSA5MXYtMjYwcTAgLTEyOCAtMTI4IC0xMjhoLTUwOXYtMTA4bC0xNzEgMTcybDE3MSAxNzJ2LTExNXYtNmg0ODRxMTYgMCAyNyAxMXQxMSAyN3YxMjB6TTE3NCAzMTlsLTI0IC0yNGwtOTEgLTkxdjI2MHEwIDEyNyAxMjggMTI3aDUwOXYxMDhsMTcxIC0xNzFsLTE3MSAtMTcydjExNXY2aC00ODRxLTE2IDAgLTI3IC0xMS41dC0xMSAtMjcuNXYtMTE5eiIgLz4KPGdseXBoIHVuaWNvZGU9InMiIGhvcml6LWFkdi14PSI4NjQiIGQ9Ik04MTYgNHEyMyAtMjMgMjMgLTU0cTAgLTI5IC0yMCAtNDhxLTE5IC0xOSAtNDcgLTE5cS0zMiAwIC01NSAyM2wtMjE5IDIxOXEtNzQgLTQ4IC0xNjYgLTQ4cS0xMjkgMCAtMjIwLjUgOTEuNXQtOTEuNSAyMjAuNXQ5MS41IDIyMC41dDIyMC41IDkxLjV0MjIwLjUgLTkxLjV0OTEuNSAtMjIwLjVxMCAtOTAgLTQ3IC0xNjV6TTUwNiAzODlxMCA3MiAtNTEgMTIzdC0xMjMgNTF0LTEyMyAtNTF0LTUxIC0xMjN0NTEgLTEyM3QxMjMgLTUxIHQxMjMgNTF0NTEgMTIzeiIgLz4KPGdseXBoIHVuaWNvZGU9InQiIGhvcml6LWFkdi14PSI5MTkiIGQ9Ik00NjAgNjk5cTE3MyAwIDI5NiAtMTIzdDEyMyAtMjk2cTAgLTE3NCAtMTIzIC0yOTd0LTI5NiAtMTIzcS0xNzQgMCAtMjk3IDEyM3QtMTIzIDI5N3EwIDE3MyAxMjMgMjk2dDI5NyAxMjN6TTQ2MCAtMzVxMTMwIDAgMjIyIDkyLjV0OTIgMjIyLjV0LTkyIDIyMnQtMjIyIDkydC0yMjIuNSAtOTJ0LTkyLjUgLTIyMnQ5Mi41IC0yMjIuNXQyMjIuNSAtOTIuNXpNNjYzIDE4NnExNCAtMTAgNSAtMjRsLTI0IC0zOXEtNSAtNiAtMTEgLThoLTQgcS01IDAgLTEwIDNsLTE5MyAxMjlxLTEgMSAtMi41IDJ0LTIuNSAxcS01IDcgLTUgMTN2MjI4cTAgNyA1IDEycTcgNSAxMyA1aDQ2cTcgMCAxMiAtNXQ1IC0xMnYtMTkzeiIgLz4KPGdseXBoIHVuaWNvZGU9InUiIGhvcml6LWFkdi14PSI5NTUiIGQ9Ik02MCA2MzFoODM1di02NzNoLTgzNXY2NzN6TTgyNSAyOHY1MzRoLTY5NXYtNTM0aDY5NXpNMjI1IDQzMXEtMTggMCAtMzEgMTN0LTEzIDMxdDEzIDMwLjV0MzEgMTIuNXQzMC41IC0xMi41dDEyLjUgLTMwLjV0LTEyLjUgLTMxdC0zMC41IC0xM3pNNzMxIDQzMXEtMTggMCAtMzEgMTN0LTEzIDMxdDEzIDMwLjV0MzEgMTIuNXQzMC41IC0xMi41dDEyLjUgLTMwLjV0LTEyLjUgLTMxdC0zMC41IC0xM3pNMjI1IDE1OXExOCAwIDMwLjUgLTEzIHQxMi41IC0zMXQtMTIuNSAtMzAuNXQtMzAuNSAtMTIuNXQtMzEgMTIuNXQtMTMgMzAuNXQxMyAzMXQzMSAxM3pNNzMxIDE1OXExOCAwIDMwLjUgLTEzdDEyLjUgLTMxdC0xMi41IC0zMC41dC0zMC41IC0xMi41dC0zMSAxMi41dC0xMyAzMC41dDEzIDMxdDMxIDEzek01OTMgNDU3di0zMjVoLTIyOHYzMjVoMjI4ek01MzMgMTgxdjExOGgtMTA5di0xMThoMTA5eiIgLz4KPGdseXBoIHVuaWNvZGU9InYiIGhvcml6LWFkdi14PSI5NDUiIGQ9Ik04NjYgNTU3cTEwIDAgMTcuNSAtN3Q3LjUgLTE3di00NzJxMCAtMTEgLTcuNSAtMTh0LTE3LjUgLTdoLTc4NnEtMTAgMCAtMTcuNSA3dC03LjUgMTh2NDcycTAgMTAgNy41IDE3dDE3LjUgN2gxNzNxMCAxIDEgMWwyMyA0OHE0IDkgMTUgMTUuNXQyMSA2LjVoMzE5cTI1IDAgMzYgLTIybDI0IC00OHYtMWgxNzR6TTQ3MiAxMjBxNzUgMCAxMjggNTIuNXQ1MyAxMjcuNXQtNTMgMTI4dC0xMjggNTNxLTc0IDAgLTEyNyAtNTN0LTUzIC0xMjggdDUzIC0xMjcuNXQxMjcgLTUyLjV6IiAvPgo8Z2x5cGggdW5pY29kZT0idyIgaG9yaXotYWR2LXg9IjkyNyIgZD0iTTg4NSAzOTdxMTYgLTEzNyAtOTQuNSAtMjQ3dC0yODIuNSAtMTI5cS02MiAtNyAtMTIwIDBxLTkyIC05NSAtMTk3IC0xMDZxLTQ3IC01IC01NiA4cS0zIDQgMyA4cTg4IDY2IDgwIDE0NXEtNjkgMzkgLTExMiA5OHQtNTEgMTMwcS0xNiAxMzYgOTQgMjQ2LjV0MjgyIDEzMC41cTE3MiAxOSAzMDQuNSAtNjR0MTQ5LjUgLTIyMHoiIC8+CjxnbHlwaCB1bmljb2RlPSJ4IiBob3Jpei1hZHYteD0iOTQ5IiBkPSJNNTI2IDEwMHEyIDEwIDIgMTZsOTggOThsMTM5IC0xMzlsOTQgLTY5bDEwIC0zOGwtMTA0IC0xMDRsLTM3IDEwbC03MCA5NHpNNzU1IDIycS0xOCAwIC0zMC41IC0xMi41dC0xMi41IC0zMS41cTAgLTE4IDEyLjUgLTMwLjV0MzAuNSAtMTIuNXExOSAwIDMxLjUgMTIuNXQxMi41IDMwLjVxMCAxOSAtMTIuNSAzMS41dC0zMS41IDEyLjV6TTQ2OSAzNzFsLTk4IC05OHEtNiAwIC0xNiAtMmwtNzEgNzBxLTMyIC0xNSAtNTYgLTE1IHEtNzQgMCAtMTMzLjUgNjB0LTYwLjUgMTM0cTAgMSAxNyAxOHE2MyAtNjMgNzEgLTY4dDQ1IC01cTI5IDAgNjUuNSAzNnQzNi41IDY2cTAgMzYgLTYgNDUuNXQtNjcgNjkuNXExNSAxOCAxOCAxOHE3NCAxIDEzNCAtNTkuNXQ2MCAtMTM0LjVxMCAtMjcgLTE2IC01N3pNNzg2IDIwMnEwIDMgMC41IDcuNXQwLjUgMTguNXQtMS41IDI4dC01LjUgMzJ0LTEwLjUgMzMuNXQtMTkgMzAuNXQtMjguNSAyNGgtM3EtMTAgMCAtMzQgLTIybC0yMTggLTIxNyBxOCAtMjkgLTggLTQ3cS0yIC0xIC03IC02bC0yMDEgLTIwMXEtNSAtNSAtNiAtN3EtMTEgLTExIC0yOSAtMTFxLTQxIDAgLTc3IDQ4dC04IDc3cTMgMiA2IDZsMjAyIDIwMnE1IDMgNiA2cTExIDExIDI4IDExcTkgMCAxOSAtM2wxOTQgMTk0bDQgNnE0IDYgNS41IDh0NSA4LjV0NC41IDExdDEuNSAxMXQtMSAxMy41dC00LjUgMTRxLTE2IDI5IC02MCAzOGgtMXEtMTYgMCAtNTUgMzdsLTYgNnEtMTkgMTkgLTIwIDI1dDE4IDI3bDcyIDczIHExNyAxNyAyNiAxN3E2IDAgMjYgLTIwbDYgLTZxMzMgLTMzIDM3IC00OXE0IC0yMCAyNCAtNDZxMyAtNCAxOCAtNHQxOSAtNGwxMTkgLTExOXE3MyAtNzMgMzAgLTI1MmwtMTUgLTUweiIgLz4KPGdseXBoIHVuaWNvZGU9InkiIGhvcml6LWFkdi14PSI4OTciIGQ9Ik04NDMgMzU5cTkgLTEgMTUuNSAtOXQ2LjUgLTE3di05N3EwIC05IC02LjUgLTE3dC0xNS41IC05bC0xMjQgLTIzcS05IC0yIC0xMiAtOHQyIC0xNGw3MiAtMTA2cTEyIC0xOSAtNCAtMzVsLTY4IC02OHEtMTYgLTE2IC0zNCAtM2wtMTA2IDcxcS03IDUgLTE0LjUgMi41dC04LjUgLTExLjVsLTIzIC0xMjVxLTEgLTkgLTkgLTE1LjV0LTE3IC02LjVoLTk3cS05IDAgLTE3IDYuNXQtOSAxNS41bC0yMyAxMjVxLTEgOSAtOC41IDExLjUgdC0xNC41IC0yLjVsLTEwNSAtNzFxLTIwIC0xMiAtMzUgM2wtNjggNjhxLTE2IDE2IC00IDM1bDcyIDEwNnE1IDggMiAxNHQtMTIgOGwtMTI0IDIzcS05IDEgLTE1LjUgOXQtNi41IDE3djk3cTAgOSA2LjUgMTd0MTUuNSA5bDEyNCAyM3EyMiA2IDEwIDIzbC03MiAxMDZxLTExIDE5IDQgMzRsNjggNjhxMTYgMTYgMzUgNGwxMDUgLTcycTcgLTUgMTQuNSAtMnQ4LjUgMTJsMjMgMTI0cTEgOSA5IDE1LjV0MTcgNi41aDk3cTkgMCAxNyAtNi41IHQ5IC0xNS41bDIzIC0xMjRxMSAtOSA4LjUgLTEydDE0LjUgMmwxMDYgNzJxMTggMTIgMzQgLTRsNjggLTY4cTE1IC0xNSA0IC0zNGwtNzIgLTEwNnEtMTIgLTE3IDEwIC0yM3pNNDQ4IDEzNHE2MyAwIDEwNyA0NHQ0NCAxMDZ0LTQ0IDEwNi41dC0xMDcgNDQuNXEtNjIgMCAtMTA2IC00NC41dC00NCAtMTA2LjV0NDQgLTEwNnQxMDYgLTQ0eiIgLz4KPGdseXBoIHVuaWNvZGU9InoiIGhvcml6LWFkdi14PSI3MzYiIGQ9Ik00MzMgLTMzcTM0IDAgNTUgMjNsMTc2IDE3NmwzOSAtMzlxMTUgLTE1IDAgLTMxbC0yNTQgLTI1NHEtMTUgLTE2IC0zMSAwbC0zNTAgMzUwcS0xNSAxNSAtMTcgMzZsLTggOTdsMzM1IC0zMzVxMjMgLTIzIDU1IC0yM3pNMzUzIDY2NGwzNTAgLTM0OXExNiAtMTYgMCAtMzFsLTI1NCAtMjU1cS03IC02IC0xNiAtNnQtMTUgNmwtMzUwIDM1MHEtMTUgMTcgLTE3IDM3bC0xNyAxOTBxLTIgMjIgMTQgMzZsNDMgNDRxMTUgMTMgMzQgMTNoMyBsMTg5IC0xN3EyMiAtMiAzNiAtMTh6TTExNSA2MTdxLTE0IC0xMyAtMTQgLTMzdDE0IC0zM3ExMyAtMTMgMzMgLTEzdDMzIDEzdDEzIDMzdC0xMyAzM3EtMTQgMTQgLTMzIDE0dC0zMyAtMTR6IiAvPgo8Z2x5cGggdW5pY29kZT0ieyIgaG9yaXotYWR2LXg9Ijc2MiIgZD0iTTc1MSAyOTloLTI3OHYtNDA4aC0xODV2NDA4aC0yNzdsMzcwIDQyOHoiIC8+CjxnbHlwaCB1bmljb2RlPSJ8IiBob3Jpei1hZHYteD0iOTE1IiBkPSJNMTgyIDI4MHEtMyAtMTYgLTMgLTM1di02OXEtNTggMCAtOTguNSA0MC41dC00MC41IDk4LjV2MjQ0cTAgNTggNDAuNSA5OC41dDk4LjUgNDAuNWgzNDhxNTggMCA5OC41IC00MC41dDQwLjUgLTk4LjV2LTEwNWgtMTA0djEwNXEwIDE0IC0xMC41IDI0LjV0LTI0LjUgMTAuNWgtMzQ4cS0xNCAwIC0yNC41IC0xMC41dC0xMC41IC0yNC41di0yNDRxMCAtMTQgMTAuNSAtMjQuNXQyNC41IC0xMC41aDN6TTczNiAzODVxNTcgMCA5OCAtNDEgdDQxIC05OXYtMjQzcTAgLTU4IC00MSAtOTl0LTk4IC00MWgtMzQ4cS01OCAwIC05OC41IDQxdC00MC41IDk5djI0M3EwIDU4IDQwLjUgOTl0OTguNSA0MWgzNDh6TTc3MCAydjI0M3EwIDE1IC0xMCAyNXQtMjQgMTBoLTM0OHEtMTQgMCAtMjQuNSAtMTB0LTEwLjUgLTI1di0yNDNxMCAtMTUgMTAuNSAtMjV0MjQuNSAtMTBoMzQ4cTE0IDAgMjQgMTB0MTAgMjV6IiAvPgo8Z2x5cGggdW5pY29kZT0ifSIgaG9yaXotYWR2LXg9Ijc2MiIgZD0iTTExIDMwMWgyNzd2NDA5aDE4NXYtNDA5aDI3OGwtMzcwIC00Mjd6IiAvPgo8Z2x5cGggdW5pY29kZT0ifiIgZD0iTTQ2MCA2OTlxMTc0IDAgMjk3IC0xMjN0MTIzIC0yOTd0LTEyMyAtMjk3dC0yOTcgLTEyM3QtMjk3IDEyM3QtMTIzIDI5N3QxMjMgMjk3dDI5NyAxMjN6TTYyOCAzNHYyMzJoLTE2NmwxNDUgMTY3aC0xMTJ2MTM1aC03NXYtMTM1aC0xMTJsMTQ0IC0xNjdoLTE2MnYtMjMyaDE0NWwtMzkgLTM5aDEyNmwtMzkgMzloMTQ1ek0zMzMgNzZ2MTQ4aDI1M3YtMTQ4aC0yNTN6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZmY7IiBob3Jpei1hZHYteD0iODMzIiAvPgo8Z2x5cGggaG9yaXotYWR2LXg9IjUwMCIgLz4KPC9mb250Pgo8L2RlZnM+PC9zdmc+IA==') format('svg')}.x-tab .x-button-icon:before,.x-button .x-button-icon:before{font-family:"Pictos"}.x-img.x-img-image{text-align:center}.x-img.x-img-image img{width:auto;height:100%}.x-img.x-img-background{background-repeat:no-repeat;background-position:center;background-size:auto 100%}.x-map{background-color:#edeae2}.x-map *{-webkit-box-sizing:content-box;box-sizing:content-box}.x-mask-map{background:transparent !important}.x-map-container{position:absolute !important;top:0;left:0;right:0;bottom:0}.x-mask{min-width:8.5em;position:absolute;top:0;left:0;bottom:0;right:0;height:100%;z-index:10;display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;background:rgba(0,0,0,0.3) center center no-repeat}.x-mask.x-mask-gray{background-color:rgba(0,0,0,0.5)}.x-mask.x-mask-transparent{background-color:transparent}.x-mask .x-mask-inner{position:relative;background:rgba(0,0,0,0.25);color:#fff;text-align:center;padding:.4em;font-size:.95em;font-weight:bold}.x-mask .x-loading-spinner-outer{display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:100%;min-width:8em;height:8em}.x-mask.x-indicator-hidden .x-mask-inner{padding-bottom:0 !important}.x-mask.x-indicator-hidden .x-loading-spinner-outer{display:none}.x-mask.x-indicator-hidden .x-mask-message{position:relative;bottom:.25em}.x-mask .x-mask-message{position:absolute;bottom:5px;color:#333;left:0;right:0;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}.x-mask.x-has-message .x-mask-inner{padding-bottom:2em}.x-mask.x-has-message .x-loading-spinner-outer{height:168px}.x-ie .x-mask[visibility='visible'] ~ div:not(.x-mask) .x-input-el,.x-ie .x-mask[visibility='visible'] ~ div:not(.x-panel) .x-input-el,.x-ie .x-mask[visibility='visible'] ~ div:not(.x-floating) .x-input-el,.x-ie .x-mask[visibility='visible'] ~ div:not(.x-center) .x-input-el,.x-ie .x-mask[visibility='visible'] ~ div:not(.x-msgbox) .x-input-el,.x-ie .x-mask:not(.x-item-hidden) ~ div:not(.x-mask) .x-input-el,.x-ie .x-mask:not(.x-item-hidden) ~ div:not(.x-panel) .x-input-el,.x-ie .x-mask:not(.x-item-hidden) ~ div:not(.x-floating) .x-input-el,.x-ie .x-mask:not(.x-item-hidden) ~ div:not(.x-center) .x-input-el,.x-ie .x-mask:not(.x-item-hidden) ~ div:not(.x-msgbox) .x-input-el{visibility:collapse}.x-video{height:100%;width:100%;background-color:#000}.x-video > *{height:100%;width:100%;position:absolute}.x-video-ghost{-webkit-background-size:100% auto;background:#000 url() center center no-repeat}audio{width:100%}.x-msgbox{min-width:15em;max-width:20em;max-height:90%;margin:6px;border:1px solid #ccc}.x-msgbox .x-docking-vertical{overflow:hidden}.x-msgbox .x-toolbar.x-docked-top{border-bottom:0}.x-msgbox .x-toolbar.x-docked-bottom{border-top:0}.x-ie .x-msgbox .x-dock.x-dock-horizontal.x-unsized > .x-dock-body{-webkit-box-flex:1;-ms-flex:1 0 0px;flex:1 0 0px}.x-msgbox-text{text-align:center}.x-msgbox-buttons .x-button{min-width:4.5em}.x-progressindicator{width:50%;height:1.3em}.x-progressindicator .x-progressindicator-inner{background:#222222;padding:10px;height:100%;border-radius:20px;box-shadow:0px 5px 17px rgba(40,40,40,0.5);box-sizing:content-box;position:relative}.x-progressindicator .x-progressindicator-text{display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:100%;height:100%;position:absolute;top:0px;left:0px;color:white;text-shadow:1px 1px 2px black}.x-progressindicator .x-progressindicator-bar{height:100%;width:0%;border-radius:10px}.x-progressindicator:not(.x-item-hidden) .x-progressindicator-bar .x-progressindicator-bar-fill{height:100%;width:100%;background-color:gray;border-radius:10px;-webkit-animation-name:progressIndicator;-moz-animation-name:progressIndicator;-ms-animation-name:progressIndicator;-o-animation-name:progressIndicator;animation-name:progressIndicator;-webkit-animation-duration:1s;-moz-animation-duration:1s;-ms-animation-duration:1s;-o-animation-duration:1s;animation-duration:1s;-webkit-animation-timing-function:linear;-moz-animation-timing-function:linear;-ms-animation-timing-function:linear;-o-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-iteration-count:infinite;-moz-animation-iteration-count:infinite;-ms-animation-iteration-count:infinite;-o-animation-iteration-count:infinite;animation-iteration-count:infinite;background-repeat:repeat-x;background-size:30px 30px;background-image:-webkit-linear-gradient(-45deg, rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(-45deg, rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(-45deg, rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(-45deg, rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}@-webkit-keyframes progressIndicator{to{background-position:30px}}@-moz-keyframes progressIndicator{to{background-position:30px}}@keyframes progressIndicator{to{background-position:30px}}.x-panel,.x-msgbox{position:relative}.x-panel.x-floating,.x-msgbox,.x-form.x-floating{padding:6px;background-color:#ccc}.x-panel.x-floating .x-panel-inner,.x-panel.x-floating > .x-body,.x-msgbox .x-panel-inner,.x-msgbox > .x-body,.x-form.x-floating .x-panel-inner,.x-form.x-floating > .x-body{z-index:1;background-color:#fff}.x-panel.x-floating > .x-dock,.x-msgbox > .x-dock,.x-form.x-floating > .x-dock{z-index:1}.x-panel.x-floating > .x-dock.x-sized,.x-msgbox > .x-dock.x-sized,.x-form.x-floating > .x-dock.x-sized{margin:6px}.x-sheet,.x-sheet-action{height:auto}.x-toolbar{position:relative;background-color:#eee;min-height:2.6em;overflow:hidden}.x-toolbar.x-docked-top{border-bottom:1px solid}.x-toolbar.x-docked-bottom{border-top:1px solid}.x-toolbar.x-docked-left{width:50px;height:auto;border-right:1px solid}.x-toolbar.x-docked-right{width:50px;height:auto;border-left:1px solid}.x-title{font-size:1.2em;text-align:center;font-weight:bold;max-width:100%}.x-title.x-title-align-left{padding-left:10px}.x-title.x-title-align-right{padding-right:10px}.x-title .x-innerhtml{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.x-navigation-bar .x-container{overflow:visible}.x-toolbar-inner .x-field .x-component-outer{-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto}.x-ie .x-toolbar-inner{height:100% !important}.x-menu{background:#eee}.x-carousel-inner{position:relative;overflow:hidden}.x-carousel-item,.x-carousel-item > *{position:absolute !important;width:100%;height:100%}.x-carousel-indicator{-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.x-carousel-indicator span{display:block;width:10px;height:10px;margin:3px;background-color:#eee}.x-carousel-indicator span.x-carousel-indicator-active{background-color:#ccc}.x-carousel-indicator-horizontal{width:100%}.x-carousel-indicator-vertical{-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column;height:100%}.x-android-3 .x-surface-wrap,.x-android-3 .x-surface-wrap > *{-webkit-perspective:1}.x-draw-component{position:relative}.x-draw-component .x-inner{overflow:hidden}.x-surface{position:absolute}.x-chart-watermark{opacity:0.5;z-index:9;right:0;bottom:0;background:rgba(0,0,0,0.5);color:white;padding:4px 6px;font-family:"Helvetica";font-size:12px;position:absolute;border-top-left-radius:4px;white-space:nowrap;-webkit-border-top-left-radius:4px}.x-legend .x-legend-inner .x-legend-container{-webkit-border-radius:5px;-moz-border-radius:5px;-ms-border-radius:5px;-o-border-radius:5px;border-radius:5px;border:1px solid #ccc;background:#fff}.x-legend .x-legend-inner .x-legend-container .x-legend-item{padding:0.8em 1em 0.8em 1.8em;color:#333;background:rgba(255,255,255,0);max-width:20em;min-width:0;font-size:14px;line-height:14px;font-weight:bold;white-space:nowrap;position:relative}.x-legend .x-legend-inner .x-legend-container .x-legend-item .x-legend-inactive{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=30);opacity:0.3}.x-legend .x-legend-inner .x-legend-container .x-legend-item .x-legend-item-marker{position:absolute;width:0.8em;height:0.8em;-webkit-border-radius:0.4em;-moz-border-radius:0.4em;-ms-border-radius:0.4em;-o-border-radius:0.4em;border-radius:0.4em;-webkit-box-shadow:rgba(255,255,255,0.3) 0 1px 0,rgba(0,0,0,0.4) 0 1px 0 inset;-moz-box-shadow:rgba(255,255,255,0.3) 0 1px 0,rgba(0,0,0,0.4) 0 1px 0 inset;box-shadow:rgba(255,255,255,0.3) 0 1px 0,rgba(0,0,0,0.4) 0 1px 0 inset;left:.7em;top:1em}.x-legend.x-docked-top .x-legend-item,.x-legend.x-docked-bottom .x-legend-item{border-right:1px solid rgba(204,204,204,0.5)}.x-legend.x-docked-top .x-legend-item:last-child,.x-legend.x-docked-bottom .x-legend-item:last-child{border-right:0}.x-legend.x-docked-left .x-legend-inner,.x-legend.x-docked-right .x-legend-inner{display:-webkit-box;-webkit-box-align:center;-webkit-box-pack:center}.x-chart-toolbar{position:absolute;z-index:9;display:-webkit-box;display:-moz-box;display:-ms-box;display:box;padding:.6em}.x-chart-toolbar .x-button{margin:.2em}.x-chart-toolbar[data-side=left],.x-chart-toolbar[data-side=right]{top:0;-webkit-box-orient:vertical;-moz-box-orient:vertical;-ms-box-orient:vertical;box-orient:vertical}.x-chart-toolbar[data-side=left]{left:0}.x-chart-toolbar[data-side=right]{right:0}.x-chart-toolbar[data-side=top],.x-chart-toolbar[data-side=bottom]{-webkit-box-orient:horizontal;-moz-box-orient:horizontal;-ms-box-orient:horizontal;box-orient:horizontal;right:0}.x-chart-toolbar[data-side=top]{top:0}.x-chart-toolbar[data-side=bottom]{bottom:0;-webkit-box-orient:horizontal;-moz-box-orient:horizontal;-ms-box-orient:horizontal;box-orient:horizontal}.x-tab .x-button-icon.list:before,.x-button .x-button-icon.list:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"l"}.x-tab .x-button-icon.expand:before,.x-button .x-button-icon.expand:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"`"}.x-dataview-inlineblock .x-dataview-item,.x-dataview-inlineblock .x-data-item{display:inline-block !important}.x-dataview-nowrap .x-dataview-container{white-space:nowrap !important}.x-dataview-nowrap .x-container.x-dataview{white-space:nowrap !important}.x-list{overflow:hidden}.x-list .x-scroll-scroller{max-width:100%}.x-list .x-list-inner{width:100% !important}.x-list.x-list-indexed .x-list-disclosure{margin-right:50px}.x-list .x-item-selected .x-list-disclosure{background-color:#fff}.x-list .x-list-scrolldock-hidden{display:none}.x-list .x-list-item{position:absolute !important;left:0;top:0;width:100%}.x-list .x-list-item > .x-dock{height:auto}.x-list .x-list-item .x-dock-horizontal{border-top:1px solid #ccc}.x-list .x-list-item.x-item-selected .x-dock-horizontal,.x-list .x-list-item.x-item-selected.x-list-item-tpl{background-color:#ccc}.x-list .x-list-item.x-item-pressed.x-list-item-tpl,.x-list .x-list-item.x-item-pressed .x-dock-horizontal{background-color:#ddd}.x-list .x-list-item .x-list-item-body,.x-list .x-list-item.x-list-item-tpl .x-innerhtml{padding:5px}.x-list .x-list-item.x-list-item-relative{position:relative !important}.x-list .x-list-header{background-color:#eee;border-top:1px solid #ccc;border-bottom:1px solid #ccc;font-weight:bold}.x-list .x-list-header.x-list-item-relative{position:relative !important}.x-list .x-list-disclosure{margin:5px 15px 5px 0;overflow:visible;width:20px;height:20px;border:1px solid #ccc;background-color:#eee}.x-list .x-list-item-tpl .x-list-disclosure{position:absolute;right:0px;top:0px}.x-list .x-list-emptytext{text-align:center;pointer-events:none;font-color:#333333;display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.x-list.x-list-indexed .x-list-disclosure{margin-right:35px}.x-list .x-list-scrolldockitem{position:absolute !important;left:0;top:0;width:100%}.x-ie .x-list-grouped .x-translatable-container .x-list-item:before,.x-ie .x-list-grouped .x-translatable-container .x-list-header:before{content:". .";color:transparent;position:absolute;left:0px;word-spacing:3000px;opacity:0}.x-list-header{position:absolute;left:0;width:100%;z-index:2 !important}.x-ios .x-list-header{-webkit-transform:translate3d(0, 0, 0);-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-o-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}.x-list-grouped .x-list-item.x-list-header-wrap .x-dock-horizontal,.x-list-grouped .x-list-item-tpl.x-list-header-wrap{border-top:0}.x-list-inlineblock .x-list-item{display:inline-block !important}.x-list-nowrap .x-list-inner{width:auto}.x-list-nowrap .x-list-container{white-space:nowrap !important}.x-list-item-dragging{border-bottom:1px solid #ccc;background:#fff !important;z-index:1}.x-indexbar-wrapper{-webkit-box-pack:end !important;-ms-flex-pack:end !important;justify-content:flex-end !important;pointer-events:none}.x-indexbar{pointer-events:auto;z-index:2;min-height:0 !important;height:auto !important;-webkit-box-flex:0 !important;-ms-flex:0 0 auto !important;flex:0 0 auto !important}.x-indexbar > div{font-size:0.6em;text-align:center;line-height:1.1em;font-weight:bold;display:block}.x-indexbar-vertical{width:15px;-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column;margin-right:15px}.x-indexbar-horizontal{height:15px;-webkit-box-orient:horizontal;-ms-flex-direction:row;flex-direction:row}.x-phone.x-landscape .x-indexbar > div{font-size:0.38em;line-height:1em}.x-indexbar-pressed{background-color:#ccc}.x-form-label{display:none !important}.x-form-label span{font-weight:bold}.x-form-label-nowrap .x-form-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.x-field{display:flex;display:-webkit-box;display:-ms-flexbox}.x-field .x-field-input{position:relative;min-width:3.7em}.x-field .x-field-input,.x-field .x-input-el{width:100%}.x-field.x-field-labeled .x-form-label{display:block !important}.x-field .x-component-outer{position:relative}.x-label-align-left,.x-label-align-right{-webkit-box-orient:horizontal !important;-ms-flex-direction:row !important;flex-direction:row !important}.x-label-align-left .x-component-outer,.x-label-align-right .x-component-outer{-webkit-box-flex:1;-ms-flex:1 0 0px;flex:1 0 0px}.x-label-align-right{-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.x-label-align-top,.x-label-align-bottom{-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column}.x-label-align-bottom{-webkit-box-direction:reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}.x-input-el{display:block}.x-field-mask{width:auto;height:auto;position:absolute;top:0;right:0;bottom:0;left:0}.x-ie .x-field.x-field-text .x-field-mask,.x-ie .x-field.x-field-textarea .x-field-mask,.x-ie .x-field.x-field-search .x-field-mask{z-index:-1}.x-field-required .x-form-label:after{content:"*";display:inline}.x-spinner .x-component-outer{display:flex;display:-webkit-box;display:-ms-flexbox}.x-spinner .x-component-outer > *{width:auto}.x-spinner .x-field-input{-webkit-box-flex:1;-ms-flex:1 0 0px;flex:1 0 0px}.x-spinner .x-field-input .x-input-el{width:100%;text-align:center}.x-spinner .x-field-input input::-webkit-outer-spin-button,.x-spinner .x-field-input input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.x-spinner .x-spinner-button{text-align:center;border:1px solid #ccc !important;background-color:#eee}.x-spinner.x-field-grouped-buttons .x-input-el{text-align:left}.x-select-overlay .x-list-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}.x-field-number input::-webkit-outer-spin-button,.x-field-number input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.x-field-input .x-clear-icon{display:none;width:10px;height:10px;background-color:#ccc;position:absolute;top:50%;right:0}.x-field-clearable .x-clear-icon{display:block}.x-field-clearable .x-field-input{padding-right:10px}.x-android .x-input-el{-webkit-text-fill-color:#000}.x-android .x-empty .x-input-el{-webkit-text-fill-color:#A9A9A9}.x-android .x-item-disabled .x-input-el{-webkit-text-fill-color:#b3b3b3}.x-form-fieldset .x-form-fieldset-inner{border:1px solid #ccc;overflow:hidden}.x-form-fieldset .x-dock .x-dock-body{-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto}.x-form-fieldset-title{font-weight:bold}.x-form-fieldset-title .x-innerhtml{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.x-form-fieldset-instructions{text-align:center}.x-ie .x-field-select .x-field-mask{z-index:3}.x-sheet.x-picker{padding:0}.x-sheet.x-picker .x-sheet-inner{background-color:#fff;overflow:hidden}.x-sheet.x-picker .x-sheet-inner .x-picker-slot .x-body{border-left:1px solid #999999;border-right:1px solid #ACACAC}.x-sheet.x-picker .x-sheet-inner .x-picker-slot.x-first .x-body{border-left:0}.x-sheet.x-picker .x-sheet-inner .x-picker-slot.x-last .x-body{border-left:0;border-right:0}.x-picker-slot .x-scroll-view{z-index:2;position:relative}.x-picker-mask{position:absolute;top:0;left:0;right:0;bottom:0;z-index:3;display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;pointer-events:none}.x-picker-slot-title{position:relative;z-index:2}.x-picker-slot-title > div{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-weight:bold}.x-picker-slot .x-dataview-inner{width:100% !important}.x-picker-slot .x-dataview-item{vertical-align:middle;height:30px;line-height:30px}.x-picker-slot .x-dataview-item.x-item-selected{font-weight:bold}.x-picker-slot .x-picker-item{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.x-ie .x-picker-item{cursor:default}.x-ie .x-picker-item::before{content:". .";color:transparent;position:absolute;left:0px;word-spacing:3000px}.x-picker-right{text-align:right}.x-picker-center{text-align:center}.x-picker-left{text-align:left}.x-list-paging .x-loading-spinner{display:none;margin:auto}.x-list-paging .x-list-paging-msg{text-align:center;clear:both}.x-list-paging.x-loading .x-loading-spinner{display:block}.x-list-paging.x-loading .x-list-paging-msg{display:none}.x-list-pullrefresh{display:flex;display:-webkit-box;display:-ms-flexbox;-webkit-box-orient:horizontal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;position:absolute;top:-5em;left:0;width:100%;height:4.5em}.x-list-pullrefresh .x-loading-spinner{display:none}.x-list-pullrefresh-arrow{width:2.5em;height:4.5em;background-color:#bbb}.x-list-pullrefresh-wrap{width:20em;font-size:0.7em}.x-list-pullrefresh-message{font-weight:bold;font-size:1.3em;text-align:center}.x-list-pullrefresh-updated{text-align:center}.x-list-pullrefresh-loading *.x-loading-spinner{display:block}.x-list-pullrefresh-loading .x-list-pullrefresh-arrow{display:none}.x-android-2 .x-list-pullrefresh-loading *.x-loading-spinner{display:none}.x-slider,.x-toggle{position:relative;height:16px;min-height:0;min-width:0}.x-slider > *,.x-toggle > *{position:absolute;width:100%;height:100%}.x-thumb{position:absolute;height:16px;width:10px;border:1px solid #ccc;background-color:#ddd}.x-slider:before{content:'';position:absolute;width:auto;height:8px;top:4px;left:0;right:0;margin:0 5px;background-color:#eee}.x-toggle{border:1px solid #ccc;width:30px;overflow:hidden;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}.x-toggle-on{background-color:#eee}.x-tab{z-index:1;overflow:visible !important;background-color:#eee;border:1px solid #ccc}.x-tabbar{border-color:#ccc;border-style:solid;border-width:0;background-color:#eee}.x-tabbar.x-docked-top{border-bottom-width:1px}.x-tabbar.x-docked-top .x-tab .x-button-icon{position:relative}.x-tabbar.x-docked-top .x-tab .x-button-icon.x-shown{display:inline-block}.x-tabbar.x-docked-top .x-tab .x-button-icon.x-hidden{display:none}.x-tabbar.x-docked-bottom{border-top-width:1px}.x-tabbar.x-docked-bottom .x-tab .x-button-icon{display:block;position:relative}.x-tabbar.x-docked-bottom .x-tab .x-button-icon.x-shown{visibility:visible}.x-tabbar.x-docked-bottom .x-tab .x-button-icon.x-hidden{visibility:hidden}.x-tab{position:relative;min-width:3.3em}.x-table-inner{display:table !important;width:100% !important;height:100% !important}.x-table-inner.x-fixed-layout{table-layout:fixed !important}.x-table-row{display:table-row !important}.x-table-cell{display:table-cell !important;vertical-align:middle}.x-grid .x-grid-header-container{border-width:0 1px 1px 0;border-style:solid;height:65px;font-weight:bold;overflow:hidden}.x-grid .x-grid-header-container .x-grid-column{display:inline-block}.x-grid .x-grid-header-container .x-grid-header-container-inner{width:100000px;position:absolute;top:0;left:0}.x-grid .x-grid-column{height:64px;border-width:1px 1px 0 1px;border-style:solid;line-height:64px;vertical-align:middle;padding:0 8px}.x-grid .x-grid-column .x-innerhtml{display:inline-block;width:auto;position:relative}.x-grid .x-grid-column.x-column-sorted-asc .x-innerhtml:after,.x-grid .x-grid-column.x-column-sorted-desc .x-innerhtml:after{position:absolute;width:12px;line-height:64px;top:0;height:64px;font-family:'Pictos';font-size:12px}.x-grid .x-grid-column.x-column-align-left .x-innerhtml:after,.x-grid .x-grid-column.x-column-align-center .x-innerhtml:after{right:-16px}.x-grid .x-grid-column.x-column-align-right .x-innerhtml:after{left:-16px}.x-grid .x-grid-column.x-column-sorted-asc .x-innerhtml:after{content:"{"}.x-grid .x-grid-column.x-column-sorted-desc .x-innerhtml:after{content:"}"}.x-grid .x-grid-headergroup{display:inline-block;position:relative;vertical-align:bottom;height:64px;padding-top:32px}.x-grid .x-grid-headergroup .x-inner > .x-innerhtml{height:32px;line-height:28px;vertical-align:middle;display:block;position:absolute;width:100%;top:0;left:0;text-align:center;border-style:solid;border-width:1px;overflow:hidden;text-overflow:ellipsis}.x-grid .x-grid-headergroup .x-grid-column{height:32px !important;line-height:27px !important;font-size:0.7em}.x-grid .x-grid-headergroup .x-grid-column.x-column-sorted-asc .x-innerhtml:after,.x-grid .x-grid-headergroup .x-grid-column.x-column-sorted-desc .x-innerhtml:after{line-height:27px;height:27px}.x-grid .x-grid-row{position:absolute;left:0;top:0;border-width:0 0 1px 0;border-style:solid}.x-grid .x-grid-cell{display:inline-block;vertical-align:middle;line-height:60px;padding:0 8px;height:60px;overflow:hidden;border-width:0 1px 0 0}.x-grid .x-grid-cell-align-center,.x-grid .x-grid-column-align-center{text-align:center}.x-grid .x-grid-cell-align-right,.x-grid .x-grid-column-align-right{text-align:right}.x-grid .x-grid-viewoptions{border-width:0 0 0 1px;border-style:solid}.x-grid .x-grid-viewoptions .x-list-item .x-innerhtml{padding:0px !important}.x-grid .x-grid-viewoptions .x-column-options-header{height:32px;line-height:28px;vertical-align:middle;border-style:solid;border-width:1px;overflow:hidden;padding-left:10px}.x-grid .x-grid-viewoptions .x-column-options-sortablehandle,.x-grid .x-grid-viewoptions .x-column-options-visibleindicator,.x-grid .x-grid-viewoptions .x-column-options-folder,.x-grid .x-grid-viewoptions .x-column-options-leaf{width:40px;height:48px;position:absolute;bottom:0}.x-grid .x-grid-viewoptions .x-column-options-sortablehandle:after,.x-grid .x-grid-viewoptions .x-column-options-visibleindicator:after,.x-grid .x-grid-viewoptions .x-column-options-folder:after,.x-grid .x-grid-viewoptions .x-column-options-leaf:after{position:absolute;top:0;left:0;height:100%;width:100%;text-align:center;font-size:24px;font-family:'Pictos';line-height:48px;content:"l";vertical-align:middle}.x-grid .x-grid-viewoptions .x-column-options-sortablehandle{left:0}.x-grid .x-grid-viewoptions .x-column-options-sortablehandle:after{line-height:54px}.x-grid .x-grid-viewoptions .x-column-options-visibleindicator{right:0}.x-grid .x-grid-viewoptions .x-column-options-visibleindicator:after{font-size:30px;line-height:54px;content:"E"}.x-grid .x-grid-viewoptions .x-column-options-folder,.x-grid .x-grid-viewoptions .x-column-options-leaf{width:30px;left:40px}.x-grid .x-grid-viewoptions .x-column-options-folder:after,.x-grid .x-grid-viewoptions .x-column-options-leaf:after{line-height:52px;content:"o"}.x-grid .x-grid-viewoptions .x-column-options-leaf:after{content:"F"}.x-grid .x-grid-viewoptions .x-list-item.x-item-selected.x-list-item-tpl{background:transparent}.x-grid .x-grid-viewoptions .x-list-item.x-item-selected.x-list-item-tpl .x-innerhtml{background:transparent}.x-grid .x-grid-viewoptions .x-column-options-text{display:block;height:30px;margin:10px 50px 5px 80px;position:relative;vertical-align:middle;line-height:28px}.x-grid .x-grid-columnoptions{border-width:0 0 1px}.x-grid .x-grid-multiselection-column{position:relative;padding:0}.x-grid .x-grid-multiselection-column:after{position:absolute;top:0;left:0;width:60px;height:64px;line-height:64px;font-family:'Pictos';font-size:26px;text-align:center;content:"2"}.x-grid .x-grid-multiselection-cell{position:relative;padding:0}.x-grid .x-grid-multiselection-cell:after{position:absolute;top:0;left:0;width:60px;height:60px;line-height:60px;font-family:'Pictos';font-size:20px;text-align:center;content:"_"}.x-grid .x-item-selected .x-grid-multiselection-cell:after{content:"3"}.x-grid .x-grid-pagingtoolbar > .x-body{padding:0 30px 0 50px}.x-grid .x-grid-pagingtoolbar-currentpage{position:relative;height:22px}.x-grid .x-grid-pagingtoolbar-currentpage span{position:absolute;right:0;top:0;line-height:22px;height:22px}.x-grid .x-grid-summaryrow{height:32px;font-size:0.8em;position:relative}.x-grid .x-grid-summaryrow .x-grid-cell{height:32px;line-height:30px;border-width:0 0 1px;border-style:solid}.x-grid .x-grid-summaryrow .x-grid-multiselection-cell:after{content:''}.x-scroll-view{position:relative;display:block;overflow:hidden}.x-scroll-container{position:absolute;width:100%;height:100%}.x-scroll-scroller{position:absolute;min-width:100%;min-height:100%;height:auto !important;width:auto !important}.x-scroll-stretcher{position:absolute;visibility:hidden}.x-scroll-bar-grid-wrapper{position:absolute;width:100%;height:100%}.x-scroll-bar-grid{display:table;width:100%;height:100%}.x-scroll-bar-grid > *{display:table-row}.x-scroll-bar-grid > * > *{display:table-cell}.x-scroll-bar-grid > :first-child > :first-child{width:100%;height:100%}.x-scroll-bar-grid > :first-child > :nth-child(2){padding:3px 3px 0 0}.x-scroll-bar-grid > :nth-child(2) > :first-child{padding:0 0 3px 3px}.x-scroll-bar{position:relative;overflow:hidden}.x-scroll-bar-stretcher{position:absolute;visibility:hidden;width:100%;height:100%}.x-scroll-bar-x{width:100%}.x-scroll-bar-x > .x-scroll-bar-stretcher{width:300%}.x-scroll-bar-x.active{height:6px}.x-scroll-bar-y{height:100%}.x-scroll-bar-y > .x-scroll-bar-stretcher{height:300%}.x-scroll-bar-y.active{width:6px}.x-scroll-indicator{background:#333;position:absolute;z-index:3}.x-scroll-indicator-x{height:100%}.x-scroll-indicator-y{width:100%}.x-scroll-indicator.rounded{background:none}.x-scroll-indicator.rounded > *{position:absolute;background-color:#333}.x-scroll-indicator.rounded > :nth-child(2){-webkit-transform-origin:0% 0%;background:none;content:url(data:image/bmp;base64,Qk08AAAAAAAAADYAAAAoAAAAAQAAAAEAAAABABAAAAAAAAYAAAASCwAAEgsAAAAAAAAAAAAAxhgAAAAA)}.x-scroll-indicator.rounded.x-scroll-indicator-light > *{background-color:#eee}.x-scroll-indicator.rounded.x-scroll-indicator-light > :nth-child(2){content:url(data:image/bmp;base64,Qk08AAAAAAAAADYAAAAoAAAAAQAAAAEAAAABABAAAAAAAAYAAAASCwAAEgsAAAAAAAAAAAAAvXcAAAAA)}.x-scroll-indicator.rounded.x-scroll-indicator-y > *{width:100%}.x-scroll-indicator.rounded.x-scroll-indicator-y > :first-child{height:3px;-moz-border-radius-topleft:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-topright:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px}.x-scroll-indicator.rounded.x-scroll-indicator-y > :nth-child(2){height:1px}.x-scroll-indicator.rounded.x-scroll-indicator-y > :last-child{height:3px;-moz-border-radius-bottomleft:3px;-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-moz-border-radius-bottomright:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px}.x-scroll-indicator.rounded.x-scroll-indicator-x > *{height:100%}.x-scroll-indicator.rounded.x-scroll-indicator-x > :first-child{width:3px;-moz-border-radius-topleft:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px}.x-scroll-indicator.rounded.x-scroll-indicator-x > :nth-child(2){width:1px}.x-scroll-indicator.rounded.x-scroll-indicator-x > :last-child{width:3px;-moz-border-radius-topright:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-moz-border-radius-bottomright:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px}.x-list-light .x-scroll-indicator,.x-dataview-light .x-scroll-indicator{background:#fff}.x-ios .x-scroll-scroller{-webkit-transform:translate3d(0, 0, 0)}.x-ie .x-scroll-bar-y{position:absolute;margin-left:-5px}html,body{font-family:"Helvetica Neue",HelveticaNeue,"Helvetica-Neue",Helvetica,"BBAlpha Sans",sans-serif}.x-ios.x-tablet .x-landscape *{-webkit-text-stroke:1px transparent}body{font-size:104%}body.x-android.x-phone{font-size:116%}body.x-ios.x-phone{font-size:114%}body.x-desktop{font-size:114%}.x-layout-card-item{background:#eee}.x-loading-spinner{font-size:250%;height:1em;width:1em;position:relative;-webkit-transform-origin:0.5em 0.5em;transform-origin:0.5em 0.5em}.x-loading-spinner > span,.x-loading-spinner > span:before,.x-loading-spinner > span:after{display:block;position:absolute;width:0.1em;height:0.25em;top:0;-webkit-transform-origin:0.05em 0.5em;transform-origin:0.05em 0.5em;content:" "}.x-loading-spinner > span{left:50%;margin-left:-0.05em}.x-loading-spinner > span.x-loading-top{background-color:rgba(170,170,170,0.99)}.x-loading-spinner > span.x-loading-top::after{background-color:rgba(170,170,170,0.9)}.x-loading-spinner > span.x-loading-left::before{background-color:rgba(170,170,170,0.8)}.x-loading-spinner > span.x-loading-left{background-color:rgba(170,170,170,0.7)}.x-loading-spinner > span.x-loading-left::after{background-color:rgba(170,170,170,0.6)}.x-loading-spinner > span.x-loading-bottom::before{background-color:rgba(170,170,170,0.5)}.x-loading-spinner > span.x-loading-bottom{background-color:rgba(170,170,170,0.4)}.x-loading-spinner > span.x-loading-bottom::after{background-color:rgba(170,170,170,0.35)}.x-loading-spinner > span.x-loading-right::before{background-color:rgba(170,170,170,0.3)}.x-loading-spinner > span.x-loading-right{background-color:rgba(170,170,170,0.25)}.x-loading-spinner > span.x-loading-right::after{background-color:rgba(170,170,170,0.2)}.x-loading-spinner > span.x-loading-top::before{background-color:rgba(170,170,170,0.15)}.x-loading-spinner > span.x-loading-top{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg)}.x-loading-spinner > span.x-loading-right{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg)}.x-loading-spinner > span.x-loading-bottom{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg)}.x-loading-spinner > span.x-loading-left{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg)}.x-loading-spinner > span::before{-webkit-transform:rotate(30deg);-moz-transform:rotate(30deg);-ms-transform:rotate(30deg)}.x-loading-spinner > span::after{-webkit-transform:rotate(-30deg);-moz-transform:rotate(-30deg);-ms-transform:rotate(-30deg)}.x-loading-spinner{-webkit-animation-name:x-loading-spinner-rotate;-webkit-animation-duration:.5s;-webkit-animation-iteration-count:infinite;-webkit-animation-timing-function:linear;animation-name:x-loading-spinner-rotate;animation-duration:.5s;animation-timing-function:linear;animation-iteration-count:infinite}html,body{font-family:"Helvetica Neue",HelveticaNeue,"Helvetica-Neue",Helvetica,"BBAlpha Sans",sans-serif}.x-ios.x-tablet .x-landscape *{-webkit-text-stroke:1px transparent}body{font-size:104%}body.x-android.x-phone{font-size:116%}body.x-ios.x-phone{font-size:114%}body.x-desktop{font-size:114%}.x-layout-card-item{background:#eee}.x-button{-webkit-background-clip:padding;-moz-background-clip:padding;background-clip:padding-box;-webkit-border-radius:0.4em;-moz-border-radius:0.4em;-ms-border-radius:0.4em;-o-border-radius:0.4em;border-radius:0.4em;min-height:1.8em;padding:.3em .6em}.x-button,.x-toolbar .x-button{border:1px solid #999;border-top-color:#a6a6a6;background-color:#ccc;color:#000}.x-button.x-button-back:before,.x-button.x-button-forward:before,.x-toolbar .x-button.x-button-back:before,.x-toolbar .x-button.x-button-forward:before{background:#999}.x-button,.x-button.x-button-back:after,.x-button.x-button-forward:after,.x-toolbar .x-button,.x-toolbar .x-button.x-button-back:after,.x-toolbar .x-button.x-button-forward:after{background-image:none;background-color:#ccc;background-image:-webkit-linear-gradient(top, #f2f2f2,#d9d9d9 3%,#bfbfbf);background-image:-moz-linear-gradient(top, #f2f2f2,#d9d9d9 3%,#bfbfbf);background-image:-o-linear-gradient(top, #f2f2f2,#d9d9d9 3%,#bfbfbf);background-image:linear-gradient(top, #f2f2f2,#d9d9d9 3%,#bfbfbf)}.x-button.x-button-pressing,.x-button.x-button-pressing:after,.x-button.x-button-pressed,.x-button.x-button-pressed:after,.x-button.x-button-active,.x-button.x-button-active:after,.x-toolbar .x-button.x-button-pressing,.x-toolbar .x-button.x-button-pressing:after,.x-toolbar .x-button.x-button-pressed,.x-toolbar .x-button.x-button-pressed:after,.x-toolbar .x-button.x-button-active,.x-toolbar .x-button.x-button-active:after{background-image:none;background-color:#c4c4c4;background-image:-webkit-linear-gradient(top, #ababab,#b8b8b8 10%,#c4c4c4 65%,#c6c6c6);background-image:-moz-linear-gradient(top, #ababab,#b8b8b8 10%,#c4c4c4 65%,#c6c6c6);background-image:-o-linear-gradient(top, #ababab,#b8b8b8 10%,#c4c4c4 65%,#c6c6c6);background-image:linear-gradient(top, #ababab,#b8b8b8 10%,#c4c4c4 65%,#c6c6c6)}.x-button .x-button-icon{width:1.5em;height:1.5em}.x-button .x-button-icon:before{font-size:1.6em;line-height:1em}.x-button.x-item-disabled .x-button-label,.x-button.x-item-disabled .x-badge,.x-button.x-item-disabled .x-hasbadge .x-badge,.x-hasbadge .x-button.x-item-disabled .x-badge,.x-button.x-item-disabled .x-button-icon{opacity:.5}.x-button-round,.x-button.x-button-action-round,.x-button.x-button-confirm-round,.x-button.x-button-decline-round{-webkit-border-radius:0.9em;-moz-border-radius:0.9em;-ms-border-radius:0.9em;-o-border-radius:0.9em;border-radius:0.9em}.x-ie .x-button{height:0px}.x-ie .x-button .x-button-label,.x-ie .x-button .x-badge,.x-ie .x-button .x-hasbadge .x-badge,.x-hasbadge .x-ie .x-button .x-badge{overflow:visible}.x-iconalign-left .x-button-label,.x-iconalign-left .x-badge,.x-iconalign-left .x-hasbadge .x-badge,.x-hasbadge .x-iconalign-left .x-badge{margin-left:.6em}.x-iconalign-right .x-button-label,.x-iconalign-right .x-badge,.x-iconalign-right .x-hasbadge .x-badge,.x-hasbadge .x-iconalign-right .x-badge{margin-right:.6em}.x-iconalign-top,.x-iconalign-bottom{padding-top:.2em !important;padding-bottom:.2em !important}.x-button-label,.x-badge,.x-hasbadge .x-badge{font-weight:bold;line-height:1.2em}.x-toolbar .x-button{margin:6px .2em;padding:0 .6em}.x-toolbar .x-button .x-button-label,.x-toolbar .x-button .x-badge,.x-toolbar .x-button .x-hasbadge .x-badge,.x-hasbadge .x-toolbar .x-button .x-badge{font-size:.7em}.x-toolbar .x-button .x-button-label,.x-toolbar .x-button .x-badge,.x-toolbar .x-button .x-hasbadge .x-badge,.x-hasbadge .x-toolbar .x-button .x-badge,.x-toolbar .x-button .x-hasbadge .x-badge{line-height:1.6em}.x-toolbar .x-button .x-button-icon:before{font-size:1.3em;line-height:1.3em}.x-ie .x-toolbar .x-button .x-button-icon::before{font-size:.6em;line-height:1em}.x-button-small,.x-button.x-button-action-small,.x-button.x-button-confirm-small,.x-button.x-button-decline-small,.x-toolbar .x-button-small,.x-toolbar .x-button.x-button-action-small,.x-toolbar .x-button.x-button-confirm-small,.x-toolbar .x-button.x-button-decline-small{-webkit-border-radius:0.3em;-moz-border-radius:0.3em;-ms-border-radius:0.3em;-o-border-radius:0.3em;border-radius:0.3em;padding:.2em .4em;min-height:0}.x-button-small .x-button-label,.x-button.x-button-action-small .x-button-label,.x-button.x-button-confirm-small .x-button-label,.x-button.x-button-decline-small .x-button-label,.x-button-small .x-badge,.x-button.x-button-action-small .x-badge,.x-button.x-button-confirm-small .x-badge,.x-button.x-button-decline-small .x-badge,.x-button-small .x-hasbadge .x-badge,.x-hasbadge .x-button-small .x-badge,.x-button.x-button-action-small .x-hasbadge .x-badge,.x-hasbadge .x-button.x-button-action-small .x-badge,.x-button.x-button-confirm-small .x-hasbadge .x-badge,.x-hasbadge .x-button.x-button-confirm-small .x-badge,.x-button.x-button-decline-small .x-hasbadge .x-badge,.x-hasbadge .x-button.x-button-decline-small .x-badge,.x-toolbar .x-button-small .x-button-label,.x-toolbar .x-button.x-button-action-small .x-button-label,.x-toolbar .x-button.x-button-confirm-small .x-button-label,.x-toolbar .x-button.x-button-decline-small .x-button-label,.x-toolbar .x-button-small .x-badge,.x-toolbar .x-button.x-button-action-small .x-badge,.x-toolbar .x-button.x-button-confirm-small .x-badge,.x-toolbar .x-button.x-button-decline-small .x-badge,.x-toolbar .x-button-small .x-hasbadge .x-badge,.x-hasbadge .x-toolbar .x-button-small .x-badge,.x-toolbar .x-button.x-button-action-small .x-hasbadge .x-badge,.x-hasbadge .x-toolbar .x-button.x-button-action-small .x-badge,.x-toolbar .x-button.x-button-confirm-small .x-hasbadge .x-badge,.x-hasbadge .x-toolbar .x-button.x-button-confirm-small .x-badge,.x-toolbar .x-button.x-button-decline-small .x-hasbadge .x-badge,.x-hasbadge .x-toolbar .x-button.x-button-decline-small .x-badge{font-size:.6em}.x-button-small .x-button-icon,.x-button.x-button-action-small .x-button-icon,.x-button.x-button-confirm-small .x-button-icon,.x-button.x-button-decline-small .x-button-icon,.x-toolbar .x-button-small .x-button-icon,.x-toolbar .x-button.x-button-action-small .x-button-icon,.x-toolbar .x-button.x-button-confirm-small .x-button-icon,.x-toolbar .x-button.x-button-decline-small .x-button-icon{width:.75em;height:.75em}.x-button-forward,.x-button-back{position:relative;overflow:visible;height:1.7em;z-index:1}.x-webkit .x-button-forward:before,.x-webkit .x-button-forward:after,.x-webkit .x-button-back:before,.x-webkit .x-button-back:after{content:'';position:absolute;width:15px;height:auto;top:-2px;left:auto;bottom:-2px;z-index:2;-webkit-mask:4px 0 url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAABGCAYAAADb7SQ4AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAiNJREFUeNrEWb9LQlEUvj5BcHoQvMnVKXD1D3CLwqBJbHJsazQaWoSCxgbHJiMIAiNok6AhCDdXVycnJ8EQOgeOYaG+d39998KH+HyP753zzjnfd325xfdSgVeV8B6BScuEV0IRSbxHeCMk/AVFXCA8ScQKSXxPqK0fQBBfE5r/D+Y8VzUT9jb94DPimqRYIYkrhGcpKhhxIqTxrpNcExdlQJTTTnRJnCc8ykhUSOIOoZ71ZFfEZ4S2zgUu+rguxZRHEnPbfKRVsOtUl0RtYpOLTYljIS2Z3nVk2DY9SbNCEt8RDm0rUpe4La1jvXSqmtum72raZI24KuNQIYl/nSGSOJb0Jq61M0pxhjwK9304hUjHGSKILzc5Q5drUzttdYY+I97pDH1FzG0zNFUb04gTG4kzJS5kdYauiZtZnaFr4ooKsCIVaDHxKAQxt1NBnGIVHfGCcEQYh3jGU8KBfMKLiyM+lgzAq/qT0ArVTg+Ei1B9fEPoovV4fcfQd2HedScX39GprwGTNjJn0maTELN6IuSzECLB6T5x2eM66jQgnIeSxa60GnS3uL56tr7b1Ai0JPVwYi6yho2U2lgfKym19VxjMRHzEGbvS9K+RBPzetGVUpf29lZHSl2/DMnLvwh1ZMQrKW3Ic4fvJOZS6ZMQW5hpmpT63DvtlFLfm7bBNruM2C2yXb7y3U6ZpRS5P/4jpUjihRTbCJ3q1eL3GMMfAQYAJmB6SBO619IAAAAASUVORK5CYII=') no-repeat;-webkit-mask-size:15px 100%;overflow:hidden}.x-webkit .x-button-back,.x-webkit .x-toolbar .x-button-back{margin-left:0.772em;padding-left:.4em}.x-webkit .x-button-back:before,.x-webkit .x-toolbar .x-button-back:before{left:-15px}.x-webkit .x-button-back:after,.x-webkit .x-toolbar .x-button-back:after{left:-14px}.x-webkit .x-button-forward,.x-webkit .x-toolbar .x-button-forward{margin-right:0.782em;padding-right:.4em}.x-webkit .x-button-forward:before,.x-webkit .x-button-forward:after,.x-webkit .x-toolbar .x-button-forward:before,.x-webkit .x-toolbar .x-button-forward:after{-webkit-mask:-4px 0 url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAABGCAYAAADb7SQ4AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAXlJREFUaN7lmTFqAlEQhh8EhFSCYJXW1law9QAewMrWAwQWAmmtbPcGHiCQ1gPYCla2QsDKSsgmQecvFqImu2/fzry/2OLb9mt23vwz47Kvn5MwEFxM8DkLB6HHEIOd0GGIwUpoMcRgyRKDOUsMJizxpzBiiMFR6DPEeZl1GWKwFh4ZYvAmPDDEqmVWVQxmLPG3MGaIVcosVAz2whNDDDZCmyEG7yFlpiEGKUsMEpb4XKXMtMXeiVVb7J1YLcRgW1ZmVuLSxGopLkys1mLwwhL/mVhjie8Sayxx3kp7DPFVYo0tzhNriyEGU5Z40TjxtDE/F6WcDowHBE/msDFNImG0xZQRBAonDCvxhhH2vKZIZ9Ds+7EDfaWFnKZ4xhja5owxdcnYCAQv1p1Gi4sprn08cZbDt6ZYZasXIn5mLFHTjLCvVt1V+4rVt/M+4r3FPaJMbHaBKRKb3pyKxKZXtv/Er4yjZpRL6q042u34tzh4xV9H/FHnqBHKBQeEd6aqqwD6AAAAAElFTkSuQmCC') no-repeat;-webkit-mask-size:15px 100%}.x-webkit .x-button-forward:before,.x-webkit .x-toolbar .x-button-forward:before{right:-15px}.x-webkit .x-button-forward:after,.x-webkit .x-toolbar .x-button-forward:after{right:-14px}.x-button.x-button-plain,.x-toolbar .x-button.x-button-plain{background:none;border:0 none;min-height:0;text-shadow:none;line-height:auto;height:1.9em;padding:0 0.5em;-webkit-border-radius:none;-moz-border-radius:none;-ms-border-radius:none;-o-border-radius:none;border-radius:none}.x-button.x-button-plain > *,.x-toolbar .x-button.x-button-plain > *{overflow:visible}.x-button.x-button-plain.x-button-pressing,.x-button.x-button-plain.x-button-pressed,.x-toolbar .x-button.x-button-plain.x-button-pressing,.x-toolbar .x-button.x-button-plain.x-button-pressed{background:none;background-image:-webkit-radial-gradient(rgba(182,225,255,0.7),rgba(182,225,255,0) 24px);background-image:-moz-radial-gradient(rgba(182,225,255,0.7),rgba(182,225,255,0) 24px);background-image:-o-radial-gradient(rgba(182,225,255,0.7),rgba(182,225,255,0) 24px);background-image:radial-gradient(rgba(182,225,255,0.7),rgba(182,225,255,0) 24px)}.x-segmentedbutton .x-button{margin:0;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0}.x-segmentedbutton .x-button.x-first{-moz-border-radius-topleft:0.4em;-webkit-border-top-left-radius:0.4em;border-top-left-radius:0.4em;-moz-border-radius-bottomleft:0.4em;-webkit-border-bottom-left-radius:0.4em;border-bottom-left-radius:0.4em}.x-segmentedbutton .x-button.x-last{-moz-border-radius-topright:0.4em;-webkit-border-top-right-radius:0.4em;border-top-right-radius:0.4em;-moz-border-radius-bottomright:0.4em;-webkit-border-bottom-right-radius:0.4em;border-bottom-right-radius:0.4em}.x-segmentedbutton .x-button:not(.x-first){border-left:0}.x-hasbadge{overflow:visible}.x-hasbadge .x-badge{border-color:#900;min-width:2em;line-height:1.2em;top:-0.2em;padding:.1em .3em;-webkit-background-clip:padding;-moz-background-clip:padding;background-clip:padding-box;color:#fcc;background-image:none;background-color:#c00;background-image:-webkit-linear-gradient(top, #ff1a1a,#e60000 3%,#b30000);background-image:-moz-linear-gradient(top, #ff1a1a,#e60000 3%,#b30000);background-image:-o-linear-gradient(top, #ff1a1a,#e60000 3%,#b30000);background-image:linear-gradient(top, #ff1a1a,#e60000 3%,#b30000);-webkit-border-radius:0.2em;-moz-border-radius:0.2em;-ms-border-radius:0.2em;-o-border-radius:0.2em;border-radius:0.2em;text-shadow:rgba(0,0,0,0.5) 0 -0.08em 0;-webkit-box-shadow:rgba(0,0,0,0.5) 0 0.1em 0.1em;-moz-box-shadow:rgba(0,0,0,0.5) 0 0.1em 0.1em;box-shadow:rgba(0,0,0,0.5) 0 0.1em 0.1em}.x-tab .x-button-icon.calendar:before,.x-button .x-button-icon.calendar:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"\005C"}.x-tab .x-button-icon.action:before,.x-button .x-button-icon.action:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"R"}.x-tab .x-button-icon.add:before,.x-button .x-button-icon.add:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"&"}.x-tab .x-button-icon.arrow_down:before,.x-button .x-button-icon.arrow_down:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"}"}.x-tab .x-button-icon.arrow_left:before,.x-button .x-button-icon.arrow_left:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"["}.x-tab .x-button-icon.arrow_right:before,.x-button .x-button-icon.arrow_right:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"]"}.x-tab .x-button-icon.arrow_up:before,.x-button .x-button-icon.arrow_up:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"{"}.x-tab .x-button-icon.compose:before,.x-button .x-button-icon.compose:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"W"}.x-tab .x-button-icon.delete:before,.x-button .x-button-icon.delete:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"*"}.x-tab .x-button-icon.organize:before,.x-button .x-button-icon.organize:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"I"}.x-tab .x-button-icon.refresh:before,.x-button .x-button-icon.refresh:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"1"}.x-tab .x-button-icon.reply:before,.x-button .x-button-icon.reply:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"R"}.x-tab .x-button-icon.search:before,.x-button .x-button-icon.search:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"s"}.x-tab .x-button-icon.settings:before,.x-button .x-button-icon.settings:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"y"}.x-tab .x-button-icon.star:before,.x-button .x-button-icon.star:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"S"}.x-tab .x-button-icon.trash:before,.x-button .x-button-icon.trash:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"#"}.x-tab .x-button-icon.maps:before,.x-button .x-button-icon.maps:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"@"}.x-tab .x-button-icon.locate:before,.x-button .x-button-icon.locate:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"@"}.x-tab .x-button-icon.home:before,.x-button .x-button-icon.home:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"H"}.x-tab .x-button-icon.bookmarks:before,.x-button .x-button-icon.bookmarks:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"I"}.x-tab .x-button-icon.download:before,.x-button .x-button-icon.download:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"~"}.x-tab .x-button-icon.favorites:before,.x-button .x-button-icon.favorites:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"S"}.x-tab .x-button-icon.info:before,.x-button .x-button-icon.info:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"i"}.x-tab .x-button-icon.more:before,.x-button .x-button-icon.more:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"."}.x-tab .x-button-icon.time:before,.x-button .x-button-icon.time:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"t"}.x-tab .x-button-icon.user:before,.x-button .x-button-icon.user:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"U"}.x-tab .x-button-icon.team:before,.x-button .x-button-icon.team:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"g"}.x-button.x-button-action,.x-toolbar .x-button.x-button-action,.x-button.x-button-action-round,.x-toolbar .x-button.x-button-action-round,.x-button.x-button-action-small,.x-toolbar .x-button.x-button-action-small{border:1px solid #002f50;border-top-color:#003e6a;background-color:#006bb6;color:#fff}.x-button.x-button-action.x-button-back:before,.x-button.x-button-action.x-button-forward:before,.x-toolbar .x-button.x-button-action.x-button-back:before,.x-toolbar .x-button.x-button-action.x-button-forward:before,.x-button.x-button-action-round.x-button-back:before,.x-button.x-button-action-round.x-button-forward:before,.x-toolbar .x-button.x-button-action-round.x-button-back:before,.x-toolbar .x-button.x-button-action-round.x-button-forward:before,.x-button.x-button-action-small.x-button-back:before,.x-button.x-button-action-small.x-button-forward:before,.x-toolbar .x-button.x-button-action-small.x-button-back:before,.x-toolbar .x-button.x-button-action-small.x-button-forward:before{background:#002f50}.x-button.x-button-action,.x-button.x-button-action.x-button-back:after,.x-button.x-button-action.x-button-forward:after,.x-toolbar .x-button.x-button-action,.x-toolbar .x-button.x-button-action.x-button-back:after,.x-toolbar .x-button.x-button-action.x-button-forward:after,.x-button.x-button-action-round,.x-button.x-button-action-round.x-button-back:after,.x-button.x-button-action-round.x-button-forward:after,.x-toolbar .x-button.x-button-action-round,.x-toolbar .x-button.x-button-action-round.x-button-back:after,.x-toolbar .x-button.x-button-action-round.x-button-forward:after,.x-button.x-button-action-small,.x-button.x-button-action-small.x-button-back:after,.x-button.x-button-action-small.x-button-forward:after,.x-toolbar .x-button.x-button-action-small,.x-toolbar .x-button.x-button-action-small.x-button-back:after,.x-toolbar .x-button.x-button-action-small.x-button-forward:after{background-image:none;background-color:#006bb6;background-image:-webkit-linear-gradient(top, #0398ff,#007ad0 3%,#005c9d);background-image:-moz-linear-gradient(top, #0398ff,#007ad0 3%,#005c9d);background-image:-o-linear-gradient(top, #0398ff,#007ad0 3%,#005c9d);background-image:linear-gradient(top, #0398ff,#007ad0 3%,#005c9d)}.x-button.x-button-action.x-button-pressing,.x-button.x-button-action.x-button-pressing:after,.x-button.x-button-action.x-button-pressed,.x-button.x-button-action.x-button-pressed:after,.x-button.x-button-action.x-button-active,.x-button.x-button-action.x-button-active:after,.x-toolbar .x-button.x-button-action.x-button-pressing,.x-toolbar .x-button.x-button-action.x-button-pressing:after,.x-toolbar .x-button.x-button-action.x-button-pressed,.x-toolbar .x-button.x-button-action.x-button-pressed:after,.x-toolbar .x-button.x-button-action.x-button-active,.x-toolbar .x-button.x-button-action.x-button-active:after,.x-button.x-button-action-round.x-button-pressing,.x-button.x-button-action-round.x-button-pressing:after,.x-button.x-button-action-round.x-button-pressed,.x-button.x-button-action-round.x-button-pressed:after,.x-button.x-button-action-round.x-button-active,.x-button.x-button-action-round.x-button-active:after,.x-toolbar .x-button.x-button-action-round.x-button-pressing,.x-toolbar .x-button.x-button-action-round.x-button-pressing:after,.x-toolbar .x-button.x-button-action-round.x-button-pressed,.x-toolbar .x-button.x-button-action-round.x-button-pressed:after,.x-toolbar .x-button.x-button-action-round.x-button-active,.x-toolbar .x-button.x-button-action-round.x-button-active:after,.x-button.x-button-action-small.x-button-pressing,.x-button.x-button-action-small.x-button-pressing:after,.x-button.x-button-action-small.x-button-pressed,.x-button.x-button-action-small.x-button-pressed:after,.x-button.x-button-action-small.x-button-active,.x-button.x-button-action-small.x-button-active:after,.x-toolbar .x-button.x-button-action-small.x-button-pressing,.x-toolbar .x-button.x-button-action-small.x-button-pressing:after,.x-toolbar .x-button.x-button-action-small.x-button-pressed,.x-toolbar .x-button.x-button-action-small.x-button-pressed:after,.x-toolbar .x-button.x-button-action-small.x-button-active,.x-toolbar .x-button.x-button-action-small.x-button-active:after{background-image:none;background-color:#0062a7;background-image:-webkit-linear-gradient(top, #004474,#00538d 10%,#0062a7 65%,#0064a9);background-image:-moz-linear-gradient(top, #004474,#00538d 10%,#0062a7 65%,#0064a9);background-image:-o-linear-gradient(top, #004474,#00538d 10%,#0062a7 65%,#0064a9);background-image:linear-gradient(top, #004474,#00538d 10%,#0062a7 65%,#0064a9)}.x-button.x-button-confirm,.x-toolbar .x-button.x-button-confirm,.x-button.x-button-confirm-round,.x-toolbar .x-button.x-button-confirm-round,.x-button.x-button-confirm-small,.x-toolbar .x-button.x-button-confirm-small{border:1px solid #263501;border-top-color:#374e02;background-color:#6c9804;color:#fff}.x-button.x-button-confirm.x-button-back:before,.x-button.x-button-confirm.x-button-forward:before,.x-toolbar .x-button.x-button-confirm.x-button-back:before,.x-toolbar .x-button.x-button-confirm.x-button-forward:before,.x-button.x-button-confirm-round.x-button-back:before,.x-button.x-button-confirm-round.x-button-forward:before,.x-toolbar .x-button.x-button-confirm-round.x-button-back:before,.x-toolbar .x-button.x-button-confirm-round.x-button-forward:before,.x-button.x-button-confirm-small.x-button-back:before,.x-button.x-button-confirm-small.x-button-forward:before,.x-toolbar .x-button.x-button-confirm-small.x-button-back:before,.x-toolbar .x-button.x-button-confirm-small.x-button-forward:before{background:#263501}.x-button.x-button-confirm,.x-button.x-button-confirm.x-button-back:after,.x-button.x-button-confirm.x-button-forward:after,.x-toolbar .x-button.x-button-confirm,.x-toolbar .x-button.x-button-confirm.x-button-back:after,.x-toolbar .x-button.x-button-confirm.x-button-forward:after,.x-button.x-button-confirm-round,.x-button.x-button-confirm-round.x-button-back:after,.x-button.x-button-confirm-round.x-button-forward:after,.x-toolbar .x-button.x-button-confirm-round,.x-toolbar .x-button.x-button-confirm-round.x-button-back:after,.x-toolbar .x-button.x-button-confirm-round.x-button-forward:after,.x-button.x-button-confirm-small,.x-button.x-button-confirm-small.x-button-back:after,.x-button.x-button-confirm-small.x-button-forward:after,.x-toolbar .x-button.x-button-confirm-small,.x-toolbar .x-button.x-button-confirm-small.x-button-back:after,.x-toolbar .x-button.x-button-confirm-small.x-button-forward:after{background-image:none;background-color:#6c9804;background-image:-webkit-linear-gradient(top, #a2e306,#7eb105 3%,#5b7f03);background-image:-moz-linear-gradient(top, #a2e306,#7eb105 3%,#5b7f03);background-image:-o-linear-gradient(top, #a2e306,#7eb105 3%,#5b7f03);background-image:linear-gradient(top, #a2e306,#7eb105 3%,#5b7f03)}.x-button.x-button-confirm.x-button-pressing,.x-button.x-button-confirm.x-button-pressing:after,.x-button.x-button-confirm.x-button-pressed,.x-button.x-button-confirm.x-button-pressed:after,.x-button.x-button-confirm.x-button-active,.x-button.x-button-confirm.x-button-active:after,.x-toolbar .x-button.x-button-confirm.x-button-pressing,.x-toolbar .x-button.x-button-confirm.x-button-pressing:after,.x-toolbar .x-button.x-button-confirm.x-button-pressed,.x-toolbar .x-button.x-button-confirm.x-button-pressed:after,.x-toolbar .x-button.x-button-confirm.x-button-active,.x-toolbar .x-button.x-button-confirm.x-button-active:after,.x-button.x-button-confirm-round.x-button-pressing,.x-button.x-button-confirm-round.x-button-pressing:after,.x-button.x-button-confirm-round.x-button-pressed,.x-button.x-button-confirm-round.x-button-pressed:after,.x-button.x-button-confirm-round.x-button-active,.x-button.x-button-confirm-round.x-button-active:after,.x-toolbar .x-button.x-button-confirm-round.x-button-pressing,.x-toolbar .x-button.x-button-confirm-round.x-button-pressing:after,.x-toolbar .x-button.x-button-confirm-round.x-button-pressed,.x-toolbar .x-button.x-button-confirm-round.x-button-pressed:after,.x-toolbar .x-button.x-button-confirm-round.x-button-active,.x-toolbar .x-button.x-button-confirm-round.x-button-active:after,.x-button.x-button-confirm-small.x-button-pressing,.x-button.x-button-confirm-small.x-button-pressing:after,.x-button.x-button-confirm-small.x-button-pressed,.x-button.x-button-confirm-small.x-button-pressed:after,.x-button.x-button-confirm-small.x-button-active,.x-button.x-button-confirm-small.x-button-active:after,.x-toolbar .x-button.x-button-confirm-small.x-button-pressing,.x-toolbar .x-button.x-button-confirm-small.x-button-pressing:after,.x-toolbar .x-button.x-button-confirm-small.x-button-pressed,.x-toolbar .x-button.x-button-confirm-small.x-button-pressed:after,.x-toolbar .x-button.x-button-confirm-small.x-button-active,.x-toolbar .x-button.x-button-confirm-small.x-button-active:after{background-image:none;background-color:#628904;background-image:-webkit-linear-gradient(top, #3e5702,#507003 10%,#628904 65%,#648c04);background-image:-moz-linear-gradient(top, #3e5702,#507003 10%,#628904 65%,#648c04);background-image:-o-linear-gradient(top, #3e5702,#507003 10%,#628904 65%,#648c04);background-image:linear-gradient(top, #3e5702,#507003 10%,#628904 65%,#648c04)}.x-button.x-button-decline,.x-toolbar .x-button.x-button-decline,.x-button.x-button-decline-round,.x-toolbar .x-button.x-button-decline-round,.x-button.x-button-decline-small,.x-toolbar .x-button.x-button-decline-small{border:1px solid #630303;border-top-color:#7c0303;background-color:#c70505;color:#fff}.x-button.x-button-decline.x-button-back:before,.x-button.x-button-decline.x-button-forward:before,.x-toolbar .x-button.x-button-decline.x-button-back:before,.x-toolbar .x-button.x-button-decline.x-button-forward:before,.x-button.x-button-decline-round.x-button-back:before,.x-button.x-button-decline-round.x-button-forward:before,.x-toolbar .x-button.x-button-decline-round.x-button-back:before,.x-toolbar .x-button.x-button-decline-round.x-button-forward:before,.x-button.x-button-decline-small.x-button-back:before,.x-button.x-button-decline-small.x-button-forward:before,.x-toolbar .x-button.x-button-decline-small.x-button-back:before,.x-toolbar .x-button.x-button-decline-small.x-button-forward:before{background:#630303}.x-button.x-button-decline,.x-button.x-button-decline.x-button-back:after,.x-button.x-button-decline.x-button-forward:after,.x-toolbar .x-button.x-button-decline,.x-toolbar .x-button.x-button-decline.x-button-back:after,.x-toolbar .x-button.x-button-decline.x-button-forward:after,.x-button.x-button-decline-round,.x-button.x-button-decline-round.x-button-back:after,.x-button.x-button-decline-round.x-button-forward:after,.x-toolbar .x-button.x-button-decline-round,.x-toolbar .x-button.x-button-decline-round.x-button-back:after,.x-toolbar .x-button.x-button-decline-round.x-button-forward:after,.x-button.x-button-decline-small,.x-button.x-button-decline-small.x-button-back:after,.x-button.x-button-decline-small.x-button-forward:after,.x-toolbar .x-button.x-button-decline-small,.x-toolbar .x-button.x-button-decline-small.x-button-back:after,.x-toolbar .x-button.x-button-decline-small.x-button-forward:after{background-image:none;background-color:#c70505;background-image:-webkit-linear-gradient(top, #f91f1f,#e00606 3%,#ae0404);background-image:-moz-linear-gradient(top, #f91f1f,#e00606 3%,#ae0404);background-image:-o-linear-gradient(top, #f91f1f,#e00606 3%,#ae0404);background-image:linear-gradient(top, #f91f1f,#e00606 3%,#ae0404)}.x-button.x-button-decline.x-button-pressing,.x-button.x-button-decline.x-button-pressing:after,.x-button.x-button-decline.x-button-pressed,.x-button.x-button-decline.x-button-pressed:after,.x-button.x-button-decline.x-button-active,.x-button.x-button-decline.x-button-active:after,.x-toolbar .x-button.x-button-decline.x-button-pressing,.x-toolbar .x-button.x-button-decline.x-button-pressing:after,.x-toolbar .x-button.x-button-decline.x-button-pressed,.x-toolbar .x-button.x-button-decline.x-button-pressed:after,.x-toolbar .x-button.x-button-decline.x-button-active,.x-toolbar .x-button.x-button-decline.x-button-active:after,.x-button.x-button-decline-round.x-button-pressing,.x-button.x-button-decline-round.x-button-pressing:after,.x-button.x-button-decline-round.x-button-pressed,.x-button.x-button-decline-round.x-button-pressed:after,.x-button.x-button-decline-round.x-button-active,.x-button.x-button-decline-round.x-button-active:after,.x-toolbar .x-button.x-button-decline-round.x-button-pressing,.x-toolbar .x-button.x-button-decline-round.x-button-pressing:after,.x-toolbar .x-button.x-button-decline-round.x-button-pressed,.x-toolbar .x-button.x-button-decline-round.x-button-pressed:after,.x-toolbar .x-button.x-button-decline-round.x-button-active,.x-toolbar .x-button.x-button-decline-round.x-button-active:after,.x-button.x-button-decline-small.x-button-pressing,.x-button.x-button-decline-small.x-button-pressing:after,.x-button.x-button-decline-small.x-button-pressed,.x-button.x-button-decline-small.x-button-pressed:after,.x-button.x-button-decline-small.x-button-active,.x-button.x-button-decline-small.x-button-active:after,.x-toolbar .x-button.x-button-decline-small.x-button-pressing,.x-toolbar .x-button.x-button-decline-small.x-button-pressing:after,.x-toolbar .x-button.x-button-decline-small.x-button-pressed,.x-toolbar .x-button.x-button-decline-small.x-button-pressed:after,.x-toolbar .x-button.x-button-decline-small.x-button-active,.x-toolbar .x-button.x-button-decline-small.x-button-active:after{background-image:none;background-color:#b80505;background-image:-webkit-linear-gradient(top, #860303,#9f0404 10%,#b80505 65%,#ba0505);background-image:-moz-linear-gradient(top, #860303,#9f0404 10%,#b80505 65%,#ba0505);background-image:-o-linear-gradient(top, #860303,#9f0404 10%,#b80505 65%,#ba0505);background-image:linear-gradient(top, #860303,#9f0404 10%,#b80505 65%,#ba0505)}.x-panel.x-floating,.x-msgbox,.x-form.x-floating{-webkit-border-radius:0.3em;-moz-border-radius:0.3em;-ms-border-radius:0.3em;-o-border-radius:0.3em;border-radius:0.3em;-webkit-box-shadow:rgba(0,0,0,0.8) 0 0.2em 0.6em;-moz-box-shadow:rgba(0,0,0,0.8) 0 0.2em 0.6em;box-shadow:rgba(0,0,0,0.8) 0 0.2em 0.6em;background-image:none;background-color:#03111a}.x-panel.x-floating.x-floating-light,.x-msgbox.x-floating-light,.x-form.x-floating.x-floating-light{background-image:none;background-color:#1985d0}.x-panel.x-floating .x-panel-inner,.x-panel.x-floating > .x-body,.x-msgbox .x-panel-inner,.x-msgbox > .x-body,.x-form.x-floating .x-panel-inner,.x-form.x-floating > .x-body{-webkit-border-radius:0.3em;-moz-border-radius:0.3em;-ms-border-radius:0.3em;-o-border-radius:0.3em;border-radius:0.3em}.x-webkit .x-anchor{position:absolute;overflow:hidden}.x-webkit .x-anchor.x-anchor-top{margin-top:-0.68em;margin-left:-0.816em;width:1.631em;height:0.7em;-webkit-mask:0 0 url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAPCAYAAABut3YUAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAPZJREFUeNpi/PX7LwOFwAyIG6HseiA+Ra5BjBQ6xg+IVwAxJ5T/HYgjgHgTOYYxUeCQUiBeh+QQBih7HVSOLiHDDMSTgTiTgLrpQJwLxH9p5RhOaLT4EakeFF3RQPyF2o6RhkaBGYkheRmIPYH4KbXSjC4QnyTDIch6danhGCcgPgwNGXKBNNQMb0ocEwXE24GYn4FyADJjI76Ej88x7UC8FIjZGKgHQDlxGtRsZmISMMjy+dBQoSXYBC0gv+NyDD80xzgx0AeAqg4fIH6NHk0qQHyMjg6B1WvHYDkNFjIgwS1ALMowMOAjEAeBHINe2Q0U+AUQYACQ10C2QNhRogAAAABJRU5ErkJggg==') no-repeat;-webkit-mask-size:1.631em 0.7em;background-color:#03111a}.x-webkit .x-anchor.x-anchor-bottom{margin-left:-0.816em;width:1.631em;height:0.7em;-webkit-mask:0 0 url('data:image/png;base64,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') no-repeat;-webkit-mask-size:1.631em 0.7em;background-color:#03111a}.x-webkit .x-anchor.x-anchor-left{margin-left:-0.666em;margin-top:-0.35em;height:1.631em;width:0.7em;-webkit-mask:0 0 url('data:image/png;base64,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') no-repeat;-webkit-mask-size:0.7em 1.631em;background-color:#03111a}.x-webkit .x-anchor.x-anchor-right{margin-top:-0.35em;height:1.631em;width:0.7em;-webkit-mask:0 0 url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAjCAYAAABLuFAHAAAEJGlDQ1BJQ0MgUHJvZmlsZQAAOBGFVd9v21QUPolvUqQWPyBYR4eKxa9VU1u5GxqtxgZJk6XtShal6dgqJOQ6N4mpGwfb6baqT3uBNwb8AUDZAw9IPCENBmJ72fbAtElThyqqSUh76MQPISbtBVXhu3ZiJ1PEXPX6yznfOec7517bRD1fabWaGVWIlquunc8klZOnFpSeTYrSs9RLA9Sr6U4tkcvNEi7BFffO6+EdigjL7ZHu/k72I796i9zRiSJPwG4VHX0Z+AxRzNRrtksUvwf7+Gm3BtzzHPDTNgQCqwKXfZwSeNHHJz1OIT8JjtAq6xWtCLwGPLzYZi+3YV8DGMiT4VVuG7oiZpGzrZJhcs/hL49xtzH/Dy6bdfTsXYNY+5yluWO4D4neK/ZUvok/17X0HPBLsF+vuUlhfwX4j/rSfAJ4H1H0qZJ9dN7nR19frRTeBt4Fe9FwpwtN+2p1MXscGLHR9SXrmMgjONd1ZxKzpBeA71b4tNhj6JGoyFNp4GHgwUp9qplfmnFW5oTdy7NamcwCI49kv6fN5IAHgD+0rbyoBc3SOjczohbyS1drbq6pQdqumllRC/0ymTtej8gpbbuVwpQfyw66dqEZyxZKxtHpJn+tZnpnEdrYBbueF9qQn93S7HQGGHnYP7w6L+YGHNtd1FJitqPAR+hERCNOFi1i1alKO6RQnjKUxL1GNjwlMsiEhcPLYTEiT9ISbN15OY/jx4SMshe9LaJRpTvHr3C/ybFYP1PZAfwfYrPsMBtnE6SwN9ib7AhLwTrBDgUKcm06FSrTfSj187xPdVQWOk5Q8vxAfSiIUc7Z7xr6zY/+hpqwSyv0I0/QMTRb7RMgBxNodTfSPqdraz/sDjzKBrv4zu2+a2t0/HHzjd2Lbcc2sG7GtsL42K+xLfxtUgI7YHqKlqHK8HbCCXgjHT1cAdMlDetv4FnQ2lLasaOl6vmB0CMmwT/IPszSueHQqv6i/qluqF+oF9TfO2qEGTumJH0qfSv9KH0nfS/9TIp0Wboi/SRdlb6RLgU5u++9nyXYe69fYRPdil1o1WufNSdTTsp75BfllPy8/LI8G7AUuV8ek6fkvfDsCfbNDP0dvRh0CrNqTbV7LfEEGDQPJQadBtfGVMWEq3QWWdufk6ZSNsjG2PQjp3ZcnOWWing6noonSInvi0/Ex+IzAreevPhe+CawpgP1/pMTMDo64G0sTCXIM+KdOnFWRfQKdJvQzV1+Bt8OokmrdtY2yhVX2a+qrykJfMq4Ml3VR4cVzTQVz+UoNne4vcKLoyS+gyKO6EHe+75Fdt0Mbe5bRIf/wjvrVmhbqBN97RD1vxrahvBOfOYzoosH9bq94uejSOQGkVM6sN/7HelL4t10t9F4gPdVzydEOx83Gv+uNxo7XyL/FtFl8z9ZAHF4bBsrEwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAb5JREFUSA2dlb1OwzAQx+/y4VIJqRMTK2vXbkgVG0srdWJl7AMgwc6AxMjAExQxMVSgssADdEXiDTqxUAmRxkl8nNMGuW2aOImU+Gzf7/5nnxVDKJMwiKITIoKqL4QyJg7wHYbUrgo7kD7UAlRPPwAHy77ddwVrZzoSUfLMRtMOBTDgFOlImTyy5doE2IQBEHpSqut6sKaQLsNIDcsCoN7tfCdMSFG/0XBf8udZYzesEZwDOcdCwEdegO01r3lRi0BNggAO14ZXnRKYtZEOXU9N2H9/M0ApvASozSUcsb1WQkuYMS4hV+DOVLeHU56GYawusgAlu525mW1awgGXcFwD1oEwQEi6NWHmCV4rrdlMPtUvPmGb7ll/mXYN5XTDznzfn1aGCeFK77TOoRJMgPcNz7n9T956zQRjIdwBg0lVeCp8t8tQkIG6LU2bCGdJnCqugRYwzhGc02YTZqZiZhcoo1SoBrv+IsXKROd7nveeqeS1Xt4gEN4I4TzkzpmDulQb78j2zlpddMsACxm/MShsYSNt/Gz4jj4E0sysyE5hPnZfoJw+O86LnLfm+G7+lVJ2bFM1/WCxiHvmQBX7D24MnWFZVIC2AAAAAElFTkSuQmCC') no-repeat;-webkit-mask-size:0.7em 1.631em;background-color:#03111a}.x-floating.x-panel-light:after{background-color:#1985d0}.x-sheet,.x-picker,.x-sheet-action{padding:0.7em;border-top:1px solid #092e47;background-image:none;background-color:rgba(3,17,26,0.9);background-image:-webkit-linear-gradient(top, rgba(11,60,94,0.9),rgba(6,31,49,0.9) 3%,rgba(0,2,3,0.9));background-image:-moz-linear-gradient(top, rgba(11,60,94,0.9),rgba(6,31,49,0.9) 3%,rgba(0,2,3,0.9));background-image:-o-linear-gradient(top, rgba(11,60,94,0.9),rgba(6,31,49,0.9) 3%,rgba(0,2,3,0.9));background-image:linear-gradient(top, rgba(11,60,94,0.9),rgba(6,31,49,0.9) 3%,rgba(0,2,3,0.9));-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0}.x-sheet-inner > .x-button,.x-sheet-action-inner > .x-button{margin-bottom:0.5em}.x-sheet-inner > .x-button:last-child,.x-sheet-action-inner > .x-button:last-child{margin-bottom:0}.x-msgbox{margin:.5em;border:0.15em solid #1985d0;-webkit-box-shadow:rgba(0,0,0,0.4) 0 0.1em 0.5em;-moz-box-shadow:rgba(0,0,0,0.4) 0 0.1em 0.5em;box-shadow:rgba(0,0,0,0.4) 0 0.1em 0.5em;-webkit-border-radius:0.3em;-moz-border-radius:0.3em;-ms-border-radius:0.3em;-o-border-radius:0.3em;border-radius:0.3em}.x-msgbox .x-icon{margin:0 0.8em 0 0.5em;background:#fff;-webkit-mask-size:100%}.x-msgbox .x-msgbox-info{-webkit-mask-image:url('data:image/png;base64,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')}.x-msgbox .x-msgbox-warning{-webkit-mask-image:url('data:image/png;base64,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')}.x-msgbox .x-msgbox-question{-webkit-mask-image:url('data:image/png;base64,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')}.x-msgbox .x-msgbox-error{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAFGUlEQVRoBe2bzW8VVRxAeS0UMZggaARtGgtNU5pIRCMaEsPChrgh7FhCjHtdEBKNLvwjdOHShSHGmEiMiVFw4cL4EcFoolRSuqBiRDQqCLRS6znDzPP1dub1fbbzLv6S05m57829vzN3Pu+8VhYWFtZ0KyqVygbqHoA74QEYhnmojX4WpuFHuAZz5HSdaVei0mlhJBW7Hx6GJ+AheAwaiS/50rfwGXwNF8nPDdGx6JgwonvJ6hE4CI/DXdBOXGHlz+EEnEb803Yqq65rD7cDFSn4NvwKHh/dwLpt42A7ubpuS7I03Ad74C24DP9AN0Rr67QN27JN2+5rRb5pYRraBC+Bx9ZKiNZKO2+bM/AKbG5WuilhGtgNb4Jn0zCRlV42B3PZ3Yx0w8JUfAQmwcvKSssVtWcu5nSkUemGhKnwKFyE1diFi2SzcnMyt6ONSNcVphJvCl4ATxZZA2WdmqO59tcTLxRmRc/Ez8AvUFbJMC9zNefCM3g9YW8kvocyHbOhYLhsrua8t6iXc4VZYRQ+hJsQVlr2ZXM299E86SXCfNEb/tfhTyi7XFF+5q7DhlB6kTBfqMCzMA1FlfVKuQ66JM8LmXgoPM4XTsIs9IpYUZ466DKeyTr1TJwETztegg7BLhhICnv7jw66HErdEpuqMEvb4Um4O/kkjj+66KRbEokwW2AtS/tgBzgfS+ii077UsbpL30fhBNwLsYVOuum4pg9zz8xj4P7u2FNsoZNuY7q6S3twPwUx9i5aSeim44DC68CxKB/sYw3ddFyn8BBsg5hOVugsCt10HFJ4BGLuXfSS0HFE80HYmBQt/XOdIseJfwfvaDzBlTGy3JRyHNzngTB0HFR4KxSdnS/w2ctwFhxZKHO4t3q1eRV82gtDx60Kb4E7wk/T5d+YTnIPqnjpI73EmnNe6LjFrVJvN3VXya7VeZWUpiyV1ceciyK5Dhd9GGW5W+S2iv+Fg+72eKh3TARfX/XFZfO1h+eg6JLjbec8Z+nSS6c5/k2+/ZAXOs55WboEvqfJu/nYTvlznAHPM3UItMxh5w3BgwVJ6nhJYa+xVyFP2Gv0MYghdLzgVpmCP2IwWsZBxymFz8FlKP1xSo6thm46nlPYrp6EvyDW0E3HqwrPwinwRVSsoZuOs75l83R9Bn4G52MLnXQ7o6s9bMzAR+B+HlvopJuOt4ZpMb/CvF3ulogtdDqVOlbHpZX8DnzQd5QjltBFJ92SyHZpX6p5YB+HH2A++bS3/+igy/HULbGpCqdu7zP9BLxU9XrooItO/wX24SvTnXz6MXgjnj199NrU3HXYucQvLHCZOAzT0GuiWb7mfjjXLbfw1qD886zUiz97MGdzX5vrlldoGbEZ3gAfq7ItV/apuZpz4W8wFx2/oTwrOkh/Am5A2WXN0VwHQ4/a5brCaU+PUMm7UGZpczPHkVq5vPllhWuk3ymptLLmtqxs4pK3FfLKqND3Ni+Ct2rekK/2Lm4O5mJOm/JyzitrqIezFal4PTwNp+EmrJa0bZuDuazP8mtk2pRwViGNDMNr4BPISva2bdmmbQ9n+TQzbUk4a4BGJ8Azo/fh3RS3btuwrYms/Vambf8bD0O4jgM/CgfAXcyfFoT36BS1FIq6634A78FXSLb1YNO2MEkkgbiD9l63x2E/2Ptj0Ky8kmfhJPirWB/tZhD1/rjt6JhwbSbIe3LzBfQ22AV7YAfck+K8MQWOSIjzX8A38BNcQ9Lxto7Gv+RtOqJ9fOwKAAAAAElFTkSuQmCC')}.x-msgbox .x-title{font-size:.9em;line-height:1.4em}.x-msgbox .x-body{background:transparent !important}.x-msgbox .x-toolbar{background:transparent none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.x-msgbox .x-toolbar.x-docked-top{height:1.3em}.x-msgbox .x-field{min-height:2em;background:#fff;-webkit-border-radius:0.2em;-moz-border-radius:0.2em;-ms-border-radius:0.2em;-o-border-radius:0.2em;border-radius:0.2em}.x-msgbox .x-form-field{min-height:1.5em;padding-right:0 !important;-webkit-appearance:none}.x-msgbox .x-field-input{padding-right:2.2em}.x-msgbox-text{padding:6px 0;line-height:1.4em}.x-msgbox-buttons{padding:0.4em 0;height:auto}.x-msgbox-buttons .x-button-normal span{opacity:.7}.x-msgbox-dark .x-msgbox-text{color:rgba(190,224,247,0.9);text-shadow:rgba(0,0,0,0.5) 0 -0.08em 0}.x-msgbox-dark .x-msgbox-input{background-image:none;background-color:rgba(190,224,247,0.9);background-image:-webkit-linear-gradient(top, rgba(144,202,242,0.9),rgba(167,213,244,0.9) 10%,rgba(190,224,247,0.9) 65%,rgba(192,225,247,0.9));background-image:-moz-linear-gradient(top, rgba(144,202,242,0.9),rgba(167,213,244,0.9) 10%,rgba(190,224,247,0.9) 65%,rgba(192,225,247,0.9));background-image:-o-linear-gradient(top, rgba(144,202,242,0.9),rgba(167,213,244,0.9) 10%,rgba(190,224,247,0.9) 65%,rgba(192,225,247,0.9));background-image:linear-gradient(top, rgba(144,202,242,0.9),rgba(167,213,244,0.9) 10%,rgba(190,224,247,0.9) 65%,rgba(192,225,247,0.9));border:0.1em solid rgba(25,133,208,0.9)}.x-toolbar{padding:0 0.2em}.x-toolbar.x-docked-left{width:7em;padding:0.2em}.x-toolbar.x-docked-right{width:7em;padding:0.2em}.x-title{line-height:2.1em;font-size:1.2em;margin:0 0.3em;padding:0 .3em}.x-toolbar-dark{background-image:none;background-color:#1468a2;background-image:-webkit-linear-gradient(top, #1e93e4,#1676b9 3%,#11598c);background-image:-moz-linear-gradient(top, #1e93e4,#1676b9 3%,#11598c);background-image:-o-linear-gradient(top, #1e93e4,#1676b9 3%,#11598c);background-image:linear-gradient(top, #1e93e4,#1676b9 3%,#11598c);border-color:#000}.x-toolbar-dark .x-title{color:#fff;text-shadow:rgba(0,0,0,0.5) 0 -0.08em 0}.x-toolbar-dark.x-docked-top{border-bottom-color:#000}.x-toolbar-dark.x-docked-bottom{border-top-color:#000}.x-toolbar-dark.x-docked-left{border-right-color:#000}.x-toolbar-dark.x-docked-right{border-left-color:#000}.x-toolbar-dark .x-button,.x-toolbar .x-toolbar-dark .x-button,.x-toolbar-dark .x-field-select .x-component-outer,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer{border:1px solid #061f31;border-top-color:#092e47;background-color:#11598c;color:#fff}.x-toolbar-dark .x-button.x-button-back:before,.x-toolbar-dark .x-button.x-button-forward:before,.x-toolbar .x-toolbar-dark .x-button.x-button-back:before,.x-toolbar .x-toolbar-dark .x-button.x-button-forward:before,.x-toolbar-dark .x-field-select .x-component-outer.x-button-back:before,.x-toolbar-dark .x-field-select .x-component-outer.x-button-forward:before,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer.x-button-back:before,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer.x-button-forward:before{background:#061f31}.x-toolbar-dark .x-button,.x-toolbar-dark .x-button.x-button-back:after,.x-toolbar-dark .x-button.x-button-forward:after,.x-toolbar .x-toolbar-dark .x-button,.x-toolbar .x-toolbar-dark .x-button.x-button-back:after,.x-toolbar .x-toolbar-dark .x-button.x-button-forward:after,.x-toolbar-dark .x-field-select .x-component-outer,.x-toolbar-dark .x-field-select .x-component-outer.x-button-back:after,.x-toolbar-dark .x-field-select .x-component-outer.x-button-forward:after,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer.x-button-back:after,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer.x-button-forward:after{background-image:none;background-color:#11598c;background-image:-webkit-linear-gradient(top, #1985d0,#1468a2 3%,#0e4b75);background-image:-moz-linear-gradient(top, #1985d0,#1468a2 3%,#0e4b75);background-image:-o-linear-gradient(top, #1985d0,#1468a2 3%,#0e4b75);background-image:linear-gradient(top, #1985d0,#1468a2 3%,#0e4b75)}.x-toolbar-dark .x-button.x-button-pressing,.x-toolbar-dark .x-button.x-button-pressing:after,.x-toolbar-dark .x-button.x-button-pressed,.x-toolbar-dark .x-button.x-button-pressed:after,.x-toolbar-dark .x-button.x-button-active,.x-toolbar-dark .x-button.x-button-active:after,.x-toolbar .x-toolbar-dark .x-button.x-button-pressing,.x-toolbar .x-toolbar-dark .x-button.x-button-pressing:after,.x-toolbar .x-toolbar-dark .x-button.x-button-pressed,.x-toolbar .x-toolbar-dark .x-button.x-button-pressed:after,.x-toolbar .x-toolbar-dark .x-button.x-button-active,.x-toolbar .x-toolbar-dark .x-button.x-button-active:after,.x-toolbar-dark .x-field-select .x-component-outer.x-button-pressing,.x-toolbar-dark .x-field-select .x-component-outer.x-button-pressing:after,.x-toolbar-dark .x-field-select .x-component-outer.x-button-pressed,.x-toolbar-dark .x-field-select .x-component-outer.x-button-pressed:after,.x-toolbar-dark .x-field-select .x-component-outer.x-button-active,.x-toolbar-dark .x-field-select .x-component-outer.x-button-active:after,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer.x-button-pressing,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer.x-button-pressing:after,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer.x-button-pressed,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer.x-button-pressed:after,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer.x-button-active,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer.x-button-active:after{background-image:none;background-color:#0f517e;background-image:-webkit-linear-gradient(top, #0a3351,#0c4267 10%,#0f517e 65%,#0f5280);background-image:-moz-linear-gradient(top, #0a3351,#0c4267 10%,#0f517e 65%,#0f5280);background-image:-o-linear-gradient(top, #0a3351,#0c4267 10%,#0f517e 65%,#0f5280);background-image:linear-gradient(top, #0a3351,#0c4267 10%,#0f517e 65%,#0f5280)}.x-toolbar-dark .x-label,.x-toolbar-dark .x-form-label{font-weight:bold;color:#fff;text-shadow:rgba(0,0,0,0.5) 0 -0.08em 0}.x-toolbar-light{background-image:none;background-color:#1985d0;background-image:-webkit-linear-gradient(top, #4ca9e9,#1e93e4 3%,#1676b9);background-image:-moz-linear-gradient(top, #4ca9e9,#1e93e4 3%,#1676b9);background-image:-o-linear-gradient(top, #4ca9e9,#1e93e4 3%,#1676b9);background-image:linear-gradient(top, #4ca9e9,#1e93e4 3%,#1676b9);border-color:#000}.x-toolbar-light .x-title{color:#fff;text-shadow:rgba(0,0,0,0.5) 0 -0.08em 0}.x-toolbar-light.x-docked-top{border-bottom-color:#000}.x-toolbar-light.x-docked-bottom{border-top-color:#000}.x-toolbar-light.x-docked-left{border-right-color:#000}.x-toolbar-light.x-docked-right{border-left-color:#000}.x-toolbar-light .x-button,.x-toolbar .x-toolbar-light .x-button,.x-toolbar-light .x-field-select .x-component-outer,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer{border:1px solid #0b3c5e;border-top-color:#0e4b75;background-color:#1676b9;color:#fff}.x-toolbar-light .x-button.x-button-back:before,.x-toolbar-light .x-button.x-button-forward:before,.x-toolbar .x-toolbar-light .x-button.x-button-back:before,.x-toolbar .x-toolbar-light .x-button.x-button-forward:before,.x-toolbar-light .x-field-select .x-component-outer.x-button-back:before,.x-toolbar-light .x-field-select .x-component-outer.x-button-forward:before,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer.x-button-back:before,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer.x-button-forward:before{background:#0b3c5e}.x-toolbar-light .x-button,.x-toolbar-light .x-button.x-button-back:after,.x-toolbar-light .x-button.x-button-forward:after,.x-toolbar .x-toolbar-light .x-button,.x-toolbar .x-toolbar-light .x-button.x-button-back:after,.x-toolbar .x-toolbar-light .x-button.x-button-forward:after,.x-toolbar-light .x-field-select .x-component-outer,.x-toolbar-light .x-field-select .x-component-outer.x-button-back:after,.x-toolbar-light .x-field-select .x-component-outer.x-button-forward:after,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer.x-button-back:after,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer.x-button-forward:after{background-image:none;background-color:#1676b9;background-image:-webkit-linear-gradient(top, #359ee7,#1985d0 3%,#1468a2);background-image:-moz-linear-gradient(top, #359ee7,#1985d0 3%,#1468a2);background-image:-o-linear-gradient(top, #359ee7,#1985d0 3%,#1468a2);background-image:linear-gradient(top, #359ee7,#1985d0 3%,#1468a2)}.x-toolbar-light .x-button.x-button-pressing,.x-toolbar-light .x-button.x-button-pressing:after,.x-toolbar-light .x-button.x-button-pressed,.x-toolbar-light .x-button.x-button-pressed:after,.x-toolbar-light .x-button.x-button-active,.x-toolbar-light .x-button.x-button-active:after,.x-toolbar .x-toolbar-light .x-button.x-button-pressing,.x-toolbar .x-toolbar-light .x-button.x-button-pressing:after,.x-toolbar .x-toolbar-light .x-button.x-button-pressed,.x-toolbar .x-toolbar-light .x-button.x-button-pressed:after,.x-toolbar .x-toolbar-light .x-button.x-button-active,.x-toolbar .x-toolbar-light .x-button.x-button-active:after,.x-toolbar-light .x-field-select .x-component-outer.x-button-pressing,.x-toolbar-light .x-field-select .x-component-outer.x-button-pressing:after,.x-toolbar-light .x-field-select .x-component-outer.x-button-pressed,.x-toolbar-light .x-field-select .x-component-outer.x-button-pressed:after,.x-toolbar-light .x-field-select .x-component-outer.x-button-active,.x-toolbar-light .x-field-select .x-component-outer.x-button-active:after,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer.x-button-pressing,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer.x-button-pressing:after,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer.x-button-pressed,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer.x-button-pressed:after,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer.x-button-active,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer.x-button-active:after{background-image:none;background-color:#156eac;background-image:-webkit-linear-gradient(top, #0f517e,#125f95 10%,#156eac 65%,#156fae);background-image:-moz-linear-gradient(top, #0f517e,#125f95 10%,#156eac 65%,#156fae);background-image:-o-linear-gradient(top, #0f517e,#125f95 10%,#156eac 65%,#156fae);background-image:linear-gradient(top, #0f517e,#125f95 10%,#156eac 65%,#156fae)}.x-toolbar-light .x-label,.x-toolbar-light .x-form-label{font-weight:bold;color:#fff;text-shadow:rgba(0,0,0,0.5) 0 -0.08em 0}.x-toolbar-neutral{background-image:none;background-color:#e0e0e0;background-image:-webkit-linear-gradient(top, #ffffff,#ededed 3%,#d3d3d3);background-image:-moz-linear-gradient(top, #ffffff,#ededed 3%,#d3d3d3);background-image:-o-linear-gradient(top, #ffffff,#ededed 3%,#d3d3d3);background-image:linear-gradient(top, #ffffff,#ededed 3%,#d3d3d3);border-color:#616161}.x-toolbar-neutral .x-title{color:#070707;text-shadow:rgba(255,255,255,0.25) 0 0.08em 0}.x-toolbar-neutral.x-docked-top{border-bottom-color:#616161}.x-toolbar-neutral.x-docked-bottom{border-top-color:#616161}.x-toolbar-neutral.x-docked-left{border-right-color:#616161}.x-toolbar-neutral.x-docked-right{border-left-color:#616161}.x-toolbar-neutral .x-button,.x-toolbar .x-toolbar-neutral .x-button,.x-toolbar-neutral .x-field-select .x-component-outer,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer{border:1px solid #a0a0a0;border-top-color:#adadad;background-color:#d3d3d3;color:#000}.x-toolbar-neutral .x-button.x-button-back:before,.x-toolbar-neutral .x-button.x-button-forward:before,.x-toolbar .x-toolbar-neutral .x-button.x-button-back:before,.x-toolbar .x-toolbar-neutral .x-button.x-button-forward:before,.x-toolbar-neutral .x-field-select .x-component-outer.x-button-back:before,.x-toolbar-neutral .x-field-select .x-component-outer.x-button-forward:before,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer.x-button-back:before,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer.x-button-forward:before{background:#a0a0a0}.x-toolbar-neutral .x-button,.x-toolbar-neutral .x-button.x-button-back:after,.x-toolbar-neutral .x-button.x-button-forward:after,.x-toolbar .x-toolbar-neutral .x-button,.x-toolbar .x-toolbar-neutral .x-button.x-button-back:after,.x-toolbar .x-toolbar-neutral .x-button.x-button-forward:after,.x-toolbar-neutral .x-field-select .x-component-outer,.x-toolbar-neutral .x-field-select .x-component-outer.x-button-back:after,.x-toolbar-neutral .x-field-select .x-component-outer.x-button-forward:after,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer.x-button-back:after,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer.x-button-forward:after{background-image:none;background-color:#d3d3d3;background-image:-webkit-linear-gradient(top, #fafafa,#e0e0e0 3%,#c7c7c7);background-image:-moz-linear-gradient(top, #fafafa,#e0e0e0 3%,#c7c7c7);background-image:-o-linear-gradient(top, #fafafa,#e0e0e0 3%,#c7c7c7);background-image:linear-gradient(top, #fafafa,#e0e0e0 3%,#c7c7c7)}.x-toolbar-neutral .x-button.x-button-pressing,.x-toolbar-neutral .x-button.x-button-pressing:after,.x-toolbar-neutral .x-button.x-button-pressed,.x-toolbar-neutral .x-button.x-button-pressed:after,.x-toolbar-neutral .x-button.x-button-active,.x-toolbar-neutral .x-button.x-button-active:after,.x-toolbar .x-toolbar-neutral .x-button.x-button-pressing,.x-toolbar .x-toolbar-neutral .x-button.x-button-pressing:after,.x-toolbar .x-toolbar-neutral .x-button.x-button-pressed,.x-toolbar .x-toolbar-neutral .x-button.x-button-pressed:after,.x-toolbar .x-toolbar-neutral .x-button.x-button-active,.x-toolbar .x-toolbar-neutral .x-button.x-button-active:after,.x-toolbar-neutral .x-field-select .x-component-outer.x-button-pressing,.x-toolbar-neutral .x-field-select .x-component-outer.x-button-pressing:after,.x-toolbar-neutral .x-field-select .x-component-outer.x-button-pressed,.x-toolbar-neutral .x-field-select .x-component-outer.x-button-pressed:after,.x-toolbar-neutral .x-field-select .x-component-outer.x-button-active,.x-toolbar-neutral .x-field-select .x-component-outer.x-button-active:after,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer.x-button-pressing,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer.x-button-pressing:after,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer.x-button-pressed,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer.x-button-pressed:after,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer.x-button-active,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer.x-button-active:after{background-image:none;background-color:#ccc;background-image:-webkit-linear-gradient(top, #b2b2b2,#bfbfbf 10%,#cccccc 65%,#cdcdcd);background-image:-moz-linear-gradient(top, #b2b2b2,#bfbfbf 10%,#cccccc 65%,#cdcdcd);background-image:-o-linear-gradient(top, #b2b2b2,#bfbfbf 10%,#cccccc 65%,#cdcdcd);background-image:linear-gradient(top, #b2b2b2,#bfbfbf 10%,#cccccc 65%,#cdcdcd)}.x-toolbar-neutral .x-label,.x-toolbar-neutral .x-form-label{font-weight:bold;color:#070707;text-shadow:rgba(255,255,255,0.25) 0 0.08em 0}.x-toolbar.x-toolbar-neutral .x-toolbar-inner .x-button.x-button-pressing{background-image:-webkit-radial-gradient(rgba(122,191,239,0.7),rgba(122,191,239,0) 24px);background-image:-moz-radial-gradient(rgba(122,191,239,0.7),rgba(122,191,239,0) 24px);background-image:-o-radial-gradient(rgba(122,191,239,0.7),rgba(122,191,239,0) 24px);background-image:radial-gradient(rgba(122,191,239,0.7),rgba(122,191,239,0) 24px)}.x-toolbar.x-toolbar-neutral .x-toolbar-inner .x-button.x-button-pressing .x-button-icon.x-button-mask{background-image:none;background-color:#fff;background-image:-webkit-linear-gradient(top, #e6e6e6,#f2f2f2 10%,#ffffff 65%,#ffffff);background-image:-moz-linear-gradient(top, #e6e6e6,#f2f2f2 10%,#ffffff 65%,#ffffff);background-image:-o-linear-gradient(top, #e6e6e6,#f2f2f2 10%,#ffffff 65%,#ffffff);background-image:linear-gradient(top, #e6e6e6,#f2f2f2 10%,#ffffff 65%,#ffffff)}.x-spinner .x-input-el,.x-field-select .x-input-el{-webkit-text-fill-color:#000;-webkit-opacity:1}.x-spinner.x-item-disabled .x-input-el,.x-field-select.x-item-disabled .x-input-el{-webkit-text-fill-color:currentcolor}.x-toolbar .x-field-select .x-input-el{-webkit-text-fill-color:#fff}.x-toolbar .x-field-select.x-item-disabled .x-input-el{-webkit-text-fill-color:rgba(255,255,255,0.6)}.x-toolbar .x-form-field-container{padding:0 .3em}.x-toolbar .x-slider-field .x-component-outer,.x-toolbar .x-toggle-field .x-component-outer{padding:0em .3em}.x-toolbar .x-field{width:13em;padding:.5em;min-height:0;border-bottom:0;background:transparent}.x-toolbar .x-field .x-clear-icon{background-size:50% 50%;right:-0.8em;margin-top:-1.06em}.x-toolbar .x-field-input{padding-right:1.6em !important}.x-toolbar .x-field-textarea .x-component-outer,.x-toolbar .x-field-text .x-component-outer,.x-toolbar .x-field-number .x-component-outer,.x-toolbar .x-field-search .x-component-outer{background-color:#fff;-webkit-border-radius:0.3em;-moz-border-radius:0.3em;-ms-border-radius:0.3em;-o-border-radius:0.3em;border-radius:0.3em;-webkit-box-shadow:rgba(0,0,0,0.5) 0 0.1em 0 inset,rgba(0,0,0,0.5) 0 -0.1em 0 inset,rgba(0,0,0,0.5) 0.1em 0 0 inset,rgba(0,0,0,0.5) -0.1em 0 0 inset,rgba(0,0,0,0.5) 0 0.15em 0.4em inset;-moz-box-shadow:rgba(0,0,0,0.5) 0 0.1em 0 inset,rgba(0,0,0,0.5) 0 -0.1em 0 inset,rgba(0,0,0,0.5) 0.1em 0 0 inset,rgba(0,0,0,0.5) -0.1em 0 0 inset,rgba(0,0,0,0.5) 0 0.15em 0.4em inset;box-shadow:rgba(0,0,0,0.5) 0 0.1em 0 inset,rgba(0,0,0,0.5) 0 -0.1em 0 inset,rgba(0,0,0,0.5) 0.1em 0 0 inset,rgba(0,0,0,0.5) -0.1em 0 0 inset,rgba(0,0,0,0.5) 0 0.15em 0.4em inset}.x-toolbar .x-form-label{background:transparent;border:0;padding:0;line-height:1.4em}.x-toolbar .x-form-field{height:1.6em;color:#6e6e6e;background:transparent;min-height:0;-webkit-appearance:none;padding:0em .3em;margin:0}.x-toolbar .x-form-field:focus{color:#000}.x-toolbar .x-field-select .x-component-outer,.x-toolbar .x-field-search .x-component-outer{-webkit-border-radius:0.8em;-moz-border-radius:0.8em;-ms-border-radius:0.8em;-o-border-radius:0.8em;border-radius:0.8em}.x-toolbar .x-field-search .x-field-input{background-position:.5em 50%}.x-toolbar .x-field-select{-webkit-box-shadow:none}.x-toolbar .x-field-select .x-form-field{height:1.4em}.x-toolbar .x-field-select{background:transparent}.x-toolbar .x-field-select .x-component-outer:after{right:.4em}.x-toolbar .x-field-select.x-item-disabled .x-component-outer:after{opacity:.6}.x-toolbar .x-field-select .x-component-outer:before{width:3em;border-left:none;-moz-border-radius-topright:0.8em;-webkit-border-top-right-radius:0.8em;border-top-right-radius:0.8em;-moz-border-radius-bottomright:0.8em;-webkit-border-bottom-right-radius:0.8em;border-bottom-right-radius:0.8em;-webkit-mask:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAABCAYAAACc0f2yAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADJJREFUeNpi/P//PwMjIyMbAwMDOxRzAjEXFHMDMQ8a5kXC6HLcSHo5kcwEmU9TABBgAOcTBAFcRiSpAAAAAElFTkSuQmCC');-webkit-mask-position:right top;-webkit-mask-repeat:repeat-y;-webkit-mask-size:3em 0.05em}.x-toolbar .x-field-select .x-input-text{color:#fff}.x-android .x-field-search .x-field-input{padding-left:.2em !important;padding-right:2.2em !important}.x-menu{padding:0.7em;background-image:none;background-color:rgba(3,17,26,0.9);background-image:-webkit-linear-gradient(top, rgba(11,60,94,0.9),rgba(6,31,49,0.9) 3%,rgba(0,2,3,0.9));background-image:-moz-linear-gradient(top, rgba(11,60,94,0.9),rgba(6,31,49,0.9) 3%,rgba(0,2,3,0.9));background-image:-o-linear-gradient(top, rgba(11,60,94,0.9),rgba(6,31,49,0.9) 3%,rgba(0,2,3,0.9));background-image:linear-gradient(top, rgba(11,60,94,0.9),rgba(6,31,49,0.9) 3%,rgba(0,2,3,0.9))}.x-menu .x-button{margin-bottom:0.7em}.x-menu .x-button:last-child{margin-bottom:0}.x-carousel-indicator span{width:0.5em;height:0.5em;-webkit-border-radius:0.25em;-moz-border-radius:0.25em;-ms-border-radius:0.25em;-o-border-radius:0.25em;border-radius:0.25em;margin:0.2em}.x-carousel-indicator-horizontal{height:1.5em}.x-carousel-indicator-vertical{width:1.5em}.x-carousel-indicator-light span{background-image:none;background-color:rgba(255,255,255,0.1)}.x-carousel-indicator-light span.x-carousel-indicator-active{background-image:none;background-color:rgba(255,255,255,0.3)}.x-carousel-indicator-dark span{background-image:none;background-color:rgba(0,0,0,0.1)}.x-carousel-indicator-dark span.x-carousel-indicator-active{background-image:none;background-color:rgba(0,0,0,0.3)}.x-form .x-scroll-container{background-color:#eee}.x-form .x-toolbar .x-scroll-container{background-color:transparent}.x-form-label{text-shadow:#fff 0 1px 1px;color:#333;text-shadow:rgba(255,255,255,0.25) 0 0.08em 0;padding:0.6em;background-color:#f7f7f7}.x-form-label span{font-size:.8em}.x-form-fieldset{margin:.5em .5em 1.5em}.x-form-fieldset .x-form-label{border-top:1px solid #fff}.x-form-fieldset .x-form-fieldset-inner{border:1px solid #ddd;background:#fff;padding:0;-webkit-border-radius:0.4em;-moz-border-radius:0.4em;-ms-border-radius:0.4em;-o-border-radius:0.4em;border-radius:0.4em}.x-form-fieldset .x-field{border-bottom:1px solid #ddd;background:transparent}.x-form-fieldset .x-field:first-child{-moz-border-radius-topleft:0.4em;-webkit-border-top-left-radius:0.4em;border-top-left-radius:0.4em;-moz-border-radius-topright:0.4em;-webkit-border-top-right-radius:0.4em;border-top-right-radius:0.4em}.x-form-fieldset .x-field:last-child{border-bottom:0;-moz-border-radius-bottomleft:0.4em;-webkit-border-bottom-left-radius:0.4em;border-bottom-left-radius:0.4em;-moz-border-radius-bottomright:0.4em;-webkit-border-bottom-right-radius:0.4em;border-bottom-right-radius:0.4em}.x-form-fieldset-title{text-shadow:#fff 0 1px 1px;color:#333;margin:1em 0.7em 0.3em;color:#333}.x-form-fieldset-instructions{text-shadow:#fff 0 1px 1px;color:#333;color:gray;margin:1em 0.7em 0.3em;font-size:.8em}.x-label-align-left:first-child .x-form-label{-moz-border-radius-topleft:0.4em;-webkit-border-top-left-radius:0.4em;border-top-left-radius:0.4em}.x-label-align-left:last-child .x-form-label{-moz-border-radius-bottomleft:0.4em;-webkit-border-bottom-left-radius:0.4em;border-bottom-left-radius:0.4em}.x-label-align-right:first-child .x-form-label{-moz-border-radius-topright:0.4em;-webkit-border-top-right-radius:0.4em;border-top-right-radius:0.4em}.x-label-align-right:last-child{border-bottom:0}.x-label-align-right:last-child .x-form-label{-moz-border-radius-bottomright:0.4em;-webkit-border-bottom-right-radius:0.4em;border-bottom-right-radius:0.4em}.x-label-align-top:first-child .x-form-label{-moz-border-radius-topleft:0.4em;-webkit-border-top-left-radius:0.4em;border-top-left-radius:0.4em;-moz-border-radius-topright:0.4em;-webkit-border-top-right-radius:0.4em;border-top-right-radius:0.4em}.x-label-align-bottom:last-child .x-form-label{-moz-border-radius-bottomleft:0.4em;-webkit-border-bottom-left-radius:0.4em;border-bottom-left-radius:0.4em;-moz-border-radius-bottomright:0.4em;-webkit-border-bottom-right-radius:0.4em;border-bottom-right-radius:0.4em}.x-field{min-height:2.5em;background:#fff}.x-field:last-child{border-bottom:0}.x-field-input .x-clear-icon{background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAADHmlDQ1BJQ0MgUHJvZmlsZQAAeAGFVN9r01AU/tplnbDhizpnEQk+aJFuZFN0Q5y2a1e6zVrqNrchSJumbVyaxiTtfrAH2YtvOsV38Qc++QcM2YNve5INxhRh+KyIIkz2IrOemzRNJ1MDufe73/nuOSfn5F6g+XFa0xQvDxRVU0/FwvzE5BTf8gFeHEMr/GhNi4YWSiZHQA/Tsnnvs/MOHsZsdO5v36v+Y9WalQwR8BwgvpQ1xCLhWaBpXNR0E+DWie+dMTXCzUxzWKcECR9nOG9jgeGMjSOWZjQ1QJoJwgfFQjpLuEA4mGng8w3YzoEU5CcmqZIuizyrRVIv5WRFsgz28B9zg/JfsKiU6Zut5xCNbZoZTtF8it4fOX1wjOYA1cE/Xxi9QbidcFg246M1fkLNJK4RJr3n7nRpmO1lmpdZKRIlHCS8YlSuM2xp5gsDiZrm0+30UJKwnzS/NDNZ8+PtUJUE6zHF9fZLRvS6vdfbkZMH4zU+pynWf0D+vff1corleZLw67QejdX0W5I6Vtvb5M2mI8PEd1E/A0hCgo4cZCjgkUIMYZpjxKr4TBYZIkqk0ml0VHmyONY7KJOW7RxHeMlfDrheFvVbsrj24Pue3SXXjrwVhcW3o9hR7bWB6bqyE5obf3VhpaNu4Te55ZsbbasLCFH+iuWxSF5lyk+CUdd1NuaQU5f8dQvPMpTuJXYSWAy6rPBe+CpsCk+FF8KXv9TIzt6tEcuAcSw+q55TzcbsJdJM0utkuL+K9ULGGPmQMUNanb4kTZyKOfLaUAsnBneC6+biXC/XB567zF3h+rkIrS5yI47CF/VFfCHwvjO+Pl+3b4hhp9u+02TrozFa67vTkbqisXqUj9sn9j2OqhMZsrG+sX5WCCu0omNqSrN0TwADJW1Ol/MFk+8RhAt8iK4tiY+rYleQTysKb5kMXpcMSa9I2S6wO4/tA7ZT1l3maV9zOfMqcOkb/cPrLjdVBl4ZwNFzLhegM3XkCbB8XizrFdsfPJ63gJE722OtPW1huos+VqvbdC5bHgG7D6vVn8+q1d3n5H8LeKP8BqkjCtbCoV8yAAAACXBIWXMAAAsTAAALEwEAmpwYAAABbmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNC40LjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPgogICAgICAgICA8ZGM6c3ViamVjdD4KICAgICAgICAgICAgPHJkZjpCYWcvPgogICAgICAgICA8L2RjOnN1YmplY3Q+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgrlPw1BAAAIWklEQVRoBdVbS2hVRxiee83LmJeaRBOTCKWgtIiJoQYNFAnSRSF205AqKEJ3urDQlq7aECuuCqUUzK5gS20XBUMLlQYaH3TRoGJsaTURN0mMryQGE40mJun3He65zL2ZmTPnZZOBm3POzPz//N/MN/88k1hcXBRxh2vXrlUsLCxsWbVq1WaUV5JIJIpRZi5+0/iewvc40gdvI7S1tc3GaU8iDsBXr17dlpOTsxeGt+C3G791NiBgyzzA30De83jvffLkye/Nzc1TNrK2eSIDDJBVAHkIhh6E0a/bGmDKB10zSO9G659ubGzswXdoOoYGfOXKlVcA9BOAPAzj8kwAwqQB67+QP3nr1q0fQfv5oLoCA+7r6yvJz88/joKPAmxOUAMCyN2cn58/umPHjt4AsiIQ4P7+/ndQWBeAVgUpNAoZtPgP0HOkvr5+0o8+X4ABMAGP+xkeHSgk4aegmPIOQO++7du3D9rqtwYMp1SIYeU0wL5rq/xl5ENLT8KmdoDusSkvaZPp8uXLtXBMfyw3sLQdNpUB9K/oZsdssHi2MMHm5ub2QfH/1l9tgDAPhq8TDQ0Nn5ryGwGTxmxZKGgwKVlOaQB9AKDp0JRBS2m0aIJ9FlIrBiwRJpPJb0DvN5Roma5LSHnjZeWgdLZmxRfguxv2V2fFO59KwBxn0cAcelZkgO3V+J29cOHCkgnRkojUDKoLSI3jbF1dnVi7dq22QsbGxsSdO3e06aaE2tpasW6dfr0xMjIixsfHTSrovXeWlZV9gExfyBmXtDCni8js6ZEJZm5uTtaV8b5+/XpRVFSUEWfzQRlTRT5+/FhMTEzYqCLoDjRgjZw5AzAXAkg8KmfQvWM+K4aGhnTJLEzU1NTQiWjzZCe4MnyqwosXLwRbF+OuKlkVV1RQUNApJ2RYk1r1LKG5LCC/Y70qHj58KEdlvIMtoqrKkyxpmY0bNwrK6ALBmlilkkPlHMTwWuempQFzPYuaPewm2DxZ0/fv3xfPnj3TZmdftKF2YWGhKC8v1+ohjUlnvwGYctGQH7lyacCIPIRI3+tZUnt4eNjVt+RJSm/atMmh+JJEKYJ5dPSfnZ0Vd+/e9UNlSbOg3MFz58451EkDZmRGLh8fMzMzjkE6EdK0ulo5LDoiGzZsEKtXr9aJO/2W/TdoQCuXobu0Ut4BDDpvQ2TgbRlSm8ME+7QqQLfjeVXUhlNxqMw8qvDgwQMxPT2tSvIVB/bsp4ADGHTe60takZnU5lCFuawiVQhMU51WzqYtWx7lK2XIHDpFVmjYAB0tnZ2d6TGjJaxCytN5sa/pAluTntgNprGaIFmBYajslsMnad3a2trg9uFmOTHoO4189OiR1pvK1M7LyxOVlZVaZ3bv3j3x9OnToKYo5VD+7hxukoNm+jmiUlQfSWqzlTnMqKjKOI7N9LwErQpTU1PObCoKKsv6AXhrEkq3ypFRvHtRmx65pKREWRQpzNaNispyIQC8JcnjDzkyqvfJyUmH3ip9pHa283LzcSITNZVd3WjczUl4VZ7zRB7orTmkPH/+3Fq3qZKslRgyoqJLkvgTC2CWS2qzxWz6IiuGeekD4gqwo5hemqd4sQWOpXRQXoEOzDTb8pK3TM8l4PDTGE1pnGxw2mhaAbmi7NfMy7E6xjBNLx3pcaRsLBfy2HWQo4zvrBiOzayoOAIqdYp92LxXErBkjsNsMVWgQ9P1a1ZSaWmpSix0HMocp5ceDK0pSwEnF5xCqiYezMp1Lfu2LnBiElN/HkzymgGQR+Ya2Re56C8uVjt/d23L2ZhucuFWWNTUhm0DSd6pwMsNXW37jSeV5QWCLE8ac2wmaC75OO/WUZszMdKbFRhVAJuvu4uH81EoZcuYdjcIUt5e5RTStD1EakfotRcB+KIDGLUc6DRdriS2REVFhbbvkb6jo6OyiLN2ZpxussHpJyswCmoD41+4JzLmAOZtGUTovUiGmeoP7mZwSFEF0pYLeVVrelF7zZo1guvmsNSGDb/QNgdw6mpQt8pYmzhSmXvQukCPzL6rC2xl05w7Cq8NtnzH8t0+THp9qzPIFM+ap0G6tS30eh65kAGm7SGWz+OXENT+070WkQYMfv+Ggnk1yFegNzWdA/GMyWa5R2qbjlDovDiRCUjtL11QacAAy52yk26CzRM3A4xUJk3piW0Dx2YTtekU2ad9hoHu7u6fXJk0YEbw0hceN91E05M1zX6rm02x/nyeAzle20uGp5Z+qA07jnd0dKS3UjMA84YbgtVhGmms26ZhRXFSQZr6DdljdbY8WcWhyiYA7CXc4zoj51Xe8cCB+Bm0oLNxLWdeSe8AOwcMDXBW/8h2Z7SwlHAE7wPS94p7BeBj2WAJQgk4dZ1vH4R8XetbLrUCu0/hJk+Xyh4lYGbkuAVKtEM4spWUyoAY4nqxGai9pKYFnALdg+eHMRgVi0o0zm2M+W179uzRHjUaAdMq0PsrzJZOxGJhhEoJFox8e9euXcYLIJ6AaROv8wH0Abzqj/ojNN6vKoA9j/n6TnZDL1krwFTC63xQ/CZ+mWs8rxJiToc9p9Bn3/JqWdcM5TjsJqqevOEG6pzFb6cq/WXFAegcfsd03lhnh3ULuwpQwChqtBmFfYw4/1MpV1GIJ8q+hAqHKeqhx6TadwvLynjpC6uYThjA/2SJ9QQjVe4AyvocjvR72Q4/775bWFbe1NQ0AkfxPubfryL+axgT10SlD/rbsep5LQxY2h6qhalADrwahM2AfWjt9wC+BU/7YwdZkXPTaPFv6PiZOxU23jdTXP8VKWC5GF4g4Z0KgG7Gbwt+WwFgM57FeHLTml1gGt/8d7wxvHNmN4Dh7zp+F7nhJuuL6v0/Vc+vwPfknLsAAAAASUVORK5CYII=') no-repeat;background-position:center center;background-size:55% 55%;width:2.2em;height:2.2em;margin:.5em;margin-top:-1.1em;right:-0.5em}.x-field-clearable .x-field-input{padding-right:2.2em}.x-input-el{padding:.4em;min-height:2.5em;border-width:0;-webkit-appearance:none}.x-ie .x-input-el{background:transparent}.x-item-disabled .x-form-label,.x-item-disabled input,.x-item-disabled .x-input-el,.x-item-disabled .x-spinner-body,.x-item-disabled select,.x-item-disabled textarea,.x-item-disabled .x-field-clear-container{color:#b3b3b3;pointer-events:none}.x-item-disabled .x-form-label{color:#aaa}.x-item-disabled .x-form-label:after{color:#666 !important}.x-checkmark-base,.x-field-checkbox .x-field-mask::after,.x-field-radio .x-field-mask::after,.x-select-overlay .x-item-selected.x-list-item::after{position:absolute;top:0;right:10px;bottom:0;content:'3';font-family:'Pictos';font-size:1.6em;text-align:right;line-height:1.6em}.x-field-checkbox .x-field-mask::after,.x-field-radio .x-field-mask::after{color:#ddd}.x-input-checkbox,.x-input-radio{visibility:hidden}.x-input-el:checked + .x-field-mask::after{color:#006bb6}.x-item-disabled.x-field-checkbox .x-input-checkbox:checked + .x-field-mask::after{color:#84afcd}.x-field-radio .x-field-mask{position:absolute;top:0;right:0;bottom:0;left:0}.x-field-radio .x-field-mask::after{content:'';position:absolute;width:16px;height:16px;top:16px;left:auto;right:16px;background-color:#d0d0d0;-webkit-border-radius:16px;-moz-border-radius:16px;-ms-border-radius:16px;-o-border-radius:16px;border-radius:16px}.x-field-radio .x-field-mask::before{content:'';position:absolute;width:26px;height:26px;top:11px;left:auto;right:11px;background-color:#ddd;-webkit-border-radius:26px;-moz-border-radius:26px;-ms-border-radius:26px;-o-border-radius:26px;border-radius:26px}.x-input-radio:checked + .x-field-mask::after{background:#006bb6}.x-item-disabled.x-field-radio .x-input-radio:checked + .x-field-mask::after{background:#84afcd}.x-field-search .x-field-input{position:relative}.x-field-search .x-field-input:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"s"}.x-field-search .x-field-input:before{color:#ccc;top:.7em;left:.5em;font-size:1.1em;right:auto}.x-toolbar .x-field-search .x-field-input:before{top:.3em}.x-field-search .x-field-input .x-form-field{margin-left:1em}.x-webkit .x-selectmark-base,.x-webkit .x-field-select .x-component-outer:after,.x-field-select .x-webkit .x-component-outer:after{content:'';position:absolute;width:1em;height:1em;top:50%;left:auto;right:0.7em;-webkit-mask-size:1em;-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpGRTdGMTE3NDA3MjA2ODExOTJDQUMyNUQwRUE4NjdEQiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoxQTFBMDFDQ0I5NEYxMURGQUU1RjlGMEFERUNDQTVEMCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoyMkRCMDIxMkI5NEUxMURGQUU1RjlGMEFERUNDQTVEMCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IE1hY2ludG9zaCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjMwRTE0QzVBNDIyMjY4MTFCQ0ZCOTAzOTcwNzcyRkVCIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkZFN0YxMTc0MDcyMDY4MTE5MkNBQzI1RDBFQTg2N0RCIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+HfrH/AAAAeVJREFUeNrs2cFHBGEUAPA3zYqIiIhOnTpFRHSKrp26RqeuEV077R/QqWtE166dOkVERHRa9hQRnZalFcv0Hk/W1Mx+38z3vvlm5j3eZW+/9+abne+9KEkSaFPMQMtCwQpWsIIVrGAFK1jBClawgo2ik/4hiqJGwLKuvfpIc5xSkWqYr5hzU1s/mRNxXTPsJ+ZqluvXlwOmSj3XBDvG3M1rpAmYYoUrFzr4ZNqTawqm2MH8Dhh7ZXJUbcAUx4FinzBnJcAUl4FhP/jIgRSYKvkYCJaO2LbNv08RMMUy5nsA4COTLy0XYIqtil9iF6aflq7AwBWuAvuQ9ZKSBgNX2ieWjtKSzeXBNZgqfe8J+4W5aXtbcg0GrvibB/BhkeuhBJhigzsghT0veh+WAlMcCGHvMOMQwcCdcIntYy6WmXhIg2PuiAvsEHO97IhHGgzckb4D8L6LmZYPMHBnhiWwXVdDPF9g4A4Vwd66nFr6BAN3ygbbw1yoMzjmjplgB5hrrufSvsHAHesZDOD2JAbxVYCBOzfIAZ9JbR6qAgN3cPwP9kZy1VIlGLiTdluCmoOBO/pnS9Bk8DzmS3pL4BMcpZEe1qX0GI/atC4dQYXRMa1MU0IX4gpWsIIVrGAFK1jBCnYUPwIMAPUPAyFL+nRdAAAAAElFTkSuQmCC');margin-top:-0.5em}.x-field-select{position:relative;z-index:1}.x-field-select .x-component-outer:after{z-index:2;background-color:#ddd}.x-field-select .x-component-outer:before,.x-field-select .x-component-outer:after{pointer-events:none;position:absolute;display:block}.x-select-overlay .x-list-item-label{height:2.6em}.x-select-overlay .x-item-selected .x-list-label{margin-right:2.6em}.x-select-overlay .x-item-selected.x-list-item::after{color:#ddd}.x-slider-field .x-component-outer,.x-toggle-field .x-component-outer{padding:0.6em}.x-spinner .x-field-input .x-input-el{-webkit-text-fill-color:#000}.x-spinner.x-item-disabled .x-input-el{-webkit-text-fill-color:#B3B3B3}.x-spinner.x-item-disabled .x-spinner-button{color:#aaa !important}.x-spinner.x-item-disabled .x-spinner-button,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button{border:1px solid #c4c4c4;border-top-color:#d0d0d0;background-color:#f7f7f7;color:#1e1e1e}.x-spinner.x-item-disabled .x-spinner-button.x-button-back:before,.x-spinner.x-item-disabled .x-spinner-button.x-button-forward:before,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-back:before,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-forward:before{background:#c4c4c4}.x-spinner.x-item-disabled .x-spinner-button,.x-spinner.x-item-disabled .x-spinner-button.x-button-back:after,.x-spinner.x-item-disabled .x-spinner-button.x-button-forward:after,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-back:after,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-forward:after{background-image:none;background-color:#f7f7f7;background-image:-webkit-linear-gradient(top, #ffffff,#ffffff 3%,#eaeaea);background-image:-moz-linear-gradient(top, #ffffff,#ffffff 3%,#eaeaea);background-image:-o-linear-gradient(top, #ffffff,#ffffff 3%,#eaeaea);background-image:linear-gradient(top, #ffffff,#ffffff 3%,#eaeaea)}.x-spinner.x-item-disabled .x-spinner-button.x-button-pressing,.x-spinner.x-item-disabled .x-spinner-button.x-button-pressing:after,.x-spinner.x-item-disabled .x-spinner-button.x-button-pressed,.x-spinner.x-item-disabled .x-spinner-button.x-button-pressed:after,.x-spinner.x-item-disabled .x-spinner-button.x-button-active,.x-spinner.x-item-disabled .x-spinner-button.x-button-active:after,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-pressing,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-pressing:after,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-pressed,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-pressed:after,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-active,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-active:after{background-image:none;background-color:#efefef;background-image:-webkit-linear-gradient(top, #d5d5d5,#e2e2e2 10%,#efefef 65%,#f0f0f0);background-image:-moz-linear-gradient(top, #d5d5d5,#e2e2e2 10%,#efefef 65%,#f0f0f0);background-image:-o-linear-gradient(top, #d5d5d5,#e2e2e2 10%,#efefef 65%,#f0f0f0);background-image:linear-gradient(top, #d5d5d5,#e2e2e2 10%,#efefef 65%,#f0f0f0)}.x-spinner .x-spinner-button{margin-top:.25em;margin-bottom:.25em;width:2em;padding:.23em 0 .27em;font-weight:bold;text-align:center;border:1px solid #ddd !important;-webkit-border-radius:1em;-moz-border-radius:1em;-ms-border-radius:1em;-o-border-radius:1em;border-radius:1em}.x-spinner .x-spinner-button,.x-toolbar .x-spinner .x-spinner-button{border:1px solid #b7b7b7;border-top-color:#c4c4c4;background-color:#eaeaea;color:#111}.x-spinner .x-spinner-button.x-button-back:before,.x-spinner .x-spinner-button.x-button-forward:before,.x-toolbar .x-spinner .x-spinner-button.x-button-back:before,.x-toolbar .x-spinner .x-spinner-button.x-button-forward:before{background:#b7b7b7}.x-spinner .x-spinner-button,.x-spinner .x-spinner-button.x-button-back:after,.x-spinner .x-spinner-button.x-button-forward:after,.x-toolbar .x-spinner .x-spinner-button,.x-toolbar .x-spinner .x-spinner-button.x-button-back:after,.x-toolbar .x-spinner .x-spinner-button.x-button-forward:after{background-image:none;background-color:#eaeaea;background-image:-webkit-linear-gradient(top, #ffffff,#f7f7f7 3%,#dddddd);background-image:-moz-linear-gradient(top, #ffffff,#f7f7f7 3%,#dddddd);background-image:-o-linear-gradient(top, #ffffff,#f7f7f7 3%,#dddddd);background-image:linear-gradient(top, #ffffff,#f7f7f7 3%,#dddddd)}.x-spinner .x-spinner-button.x-button-pressing,.x-spinner .x-spinner-button.x-button-pressing:after,.x-spinner .x-spinner-button.x-button-pressed,.x-spinner .x-spinner-button.x-button-pressed:after,.x-spinner .x-spinner-button.x-button-active,.x-spinner .x-spinner-button.x-button-active:after,.x-toolbar .x-spinner .x-spinner-button.x-button-pressing,.x-toolbar .x-spinner .x-spinner-button.x-button-pressing:after,.x-toolbar .x-spinner .x-spinner-button.x-button-pressed,.x-toolbar .x-spinner .x-spinner-button.x-button-pressed:after,.x-toolbar .x-spinner .x-spinner-button.x-button-active,.x-toolbar .x-spinner .x-spinner-button.x-button-active:after{background-image:none;background-color:#e2e2e2;background-image:-webkit-linear-gradient(top, #c9c9c9,#d5d5d5 10%,#e2e2e2 65%,#e3e3e3);background-image:-moz-linear-gradient(top, #c9c9c9,#d5d5d5 10%,#e2e2e2 65%,#e3e3e3);background-image:-o-linear-gradient(top, #c9c9c9,#d5d5d5 10%,#e2e2e2 65%,#e3e3e3);background-image:linear-gradient(top, #c9c9c9,#d5d5d5 10%,#e2e2e2 65%,#e3e3e3)}.x-spinner .x-spinner-button-down{margin-left:.25em}.x-spinner .x-spinner-button-up{margin-right:.25em}.x-spinner.x-field-grouped-buttons .x-spinner-button-down{margin-right:.5em}.x-android .x-spinner-button{padding:.40em 0 .11em !important}.x-ie .x-spinner .x-field-input .x-input-el:disabled{color:#000}.x-field-textarea textarea{min-height:6em;padding-top:.5em}.x-indexbar{padding:.3em 0;color:#155988}.x-indexbar-vertical{width:1.1em;margin-right:8px}.x-indexbar-horizontal{height:1.1em;margin-bottom:8px}.x-indexbar-pressed{-webkit-border-radius:0.55em;-moz-border-radius:0.55em;-ms-border-radius:0.55em;-o-border-radius:0.55em;border-radius:0.55em;background-color:rgba(143,155,163,0.8)}.x-list{background-color:#f7f7f7}.x-list .x-list-disclosure{position:relative;overflow:visible;border:0;-webkit-border-radius:32px;-moz-border-radius:32px;-ms-border-radius:32px;-o-border-radius:32px;border-radius:32px;background-image:none;background-color:#006bb6;background-image:-webkit-linear-gradient(top, #0398ff,#007ad0 3%,#005c9d);background-image:-moz-linear-gradient(top, #0398ff,#007ad0 3%,#005c9d);background-image:-o-linear-gradient(top, #0398ff,#007ad0 3%,#005c9d);background-image:linear-gradient(top, #0398ff,#007ad0 3%,#005c9d);width:32px;height:32px;margin:7px 7px 0 0}.x-list .x-list-disclosure:before{position:absolute;top:0;right:0;bottom:0;left:0;content:']';font-family:'Pictos';color:#fff;font-size:24px;text-align:center;line-height:35px;text-shadow:0 0 0}.x-list.x-list-indexed .x-list-disclosure{margin-right:1.8em}.x-list .x-item-selected .x-list-disclosure{background:#fff none}.x-list .x-item-selected .x-list-disclosure:before{color:#006bb6}.x-list .x-list-item{color:#000}.x-list .x-list-item.x-item-selected .x-dock-horizontal,.x-list .x-list-item.x-item-selected.x-list-item-tpl{background-image:none;background-color:#006bb6;background-image:-webkit-linear-gradient(top, #0398ff,#007ad0 3%,#005c9d);background-image:-moz-linear-gradient(top, #0398ff,#007ad0 3%,#005c9d);background-image:-o-linear-gradient(top, #0398ff,#007ad0 3%,#005c9d);background-image:linear-gradient(top, #0398ff,#007ad0 3%,#005c9d);color:#fff}.x-list .x-list-item.x-item-pressed.x-list-item-tpl,.x-list .x-list-item.x-item-pressed .x-dock-horizontal{background:#b6e1ff none}.x-list .x-list-item .x-list-item-body,.x-list .x-list-item.x-list-item-tpl .x-innerhtml{padding:12px 15px}.x-list-normal .x-list-header{background-image:none;background-color:#5ab5f5;background-image:-webkit-linear-gradient(top, #a2d6f9,#72c0f6 3%,#42abf4);background-image:-moz-linear-gradient(top, #a2d6f9,#72c0f6 3%,#42abf4);background-image:-o-linear-gradient(top, #a2d6f9,#72c0f6 3%,#42abf4);background-image:linear-gradient(top, #a2d6f9,#72c0f6 3%,#42abf4);color:#0a6aac;text-shadow:rgba(255,255,255,0.25) 0 0.08em 0;border-top:1px solid #5ab5f5;border-bottom:1px solid #0d87dc;font-weight:bold;font-size:0.8em;padding:0.2em 1.02em}.x-list-normal .x-list-item.x-list-item-tpl,.x-list-normal .x-list-item .x-dock-horizontal{border-top:1px solid #dedede}.x-list-normal .x-list-item.x-list-item-tpl.x-list-footer-wrap,.x-list-normal .x-list-item.x-list-footer-wrap .x-dock-horizontal{border-bottom:1px solid #dedede}.x-list-normal .x-list-item.x-item-pressed.x-list-item-tpl,.x-list-normal .x-list-item.x-item-pressed .x-dock-horizontal{border-top-color:#b6e1ff;background-color:#b6e1ff}.x-list-normal .x-list-item.x-item-selected.x-list-item-tpl,.x-list-normal .x-list-item.x-item-selected .x-dock-horizontal{border-top-color:#006bb6}.x-list-round .x-scroll-view{background-color:#eee}.x-list-round .x-list-header-swap{padding-right:13px}.x-list-round .x-list-inner .x-scroll-container{top:13px;left:13px;bottom:13px;right:13px;width:auto !important;height:auto !important}.x-list-round .x-list-header{color:#777;font-size:1em;font-weight:bold;padding-left:26px;line-height:1.7em;background-image:-webkit-linear-gradient(top, #eeeeee,rgba(238,238,238,0.9) 30%,rgba(238,238,238,0.4));background-image:-moz-linear-gradient(top, #eeeeee,rgba(238,238,238,0.9) 30%,rgba(238,238,238,0.4));background-image:-o-linear-gradient(top, #eeeeee,rgba(238,238,238,0.9) 30%,rgba(238,238,238,0.4));background-image:linear-gradient(top, #eeeeee,rgba(238,238,238,0.9) 30%,rgba(238,238,238,0.4))}.x-list-round .x-list-container{padding:13px 13px 0 13px}.x-list-round .x-list-container .x-list-header{padding-left:13px;background-image:none}.x-list-round.x-list-ungrouped .x-list-item-tpl,.x-list-round.x-list-ungrouped .x-list-item .x-dock-horizontal,.x-list-round.x-list-grouped .x-list-item-tpl,.x-list-round.x-list-grouped .x-list-item .x-dock-horizontal{border:1px solid #dedede;border-width:1px 1px 0 1px;background:#f7f7f7}.x-list-round.x-list-ungrouped .x-list-item-first{-moz-border-radius-topleft:0.4em;-webkit-border-top-left-radius:0.4em;border-top-left-radius:0.4em;-moz-border-radius-topright:0.4em;-webkit-border-top-right-radius:0.4em;border-top-right-radius:0.4em}.x-list-round.x-list-ungrouped .x-list-item-last{-moz-border-radius-bottomleft:0.4em;-webkit-border-bottom-left-radius:0.4em;border-bottom-left-radius:0.4em;-moz-border-radius-bottomright:0.4em;-webkit-border-bottom-right-radius:0.4em;border-bottom-right-radius:0.4em;border-width:1px;margin-bottom:13px}.x-list-round.x-list-grouped .x-list-header-wrap .x-dock-horizontal{-moz-border-radius-topleft:0.4em;-webkit-border-top-left-radius:0.4em;border-top-left-radius:0.4em;-moz-border-radius-topright:0.4em;-webkit-border-top-right-radius:0.4em;border-top-right-radius:0.4em}.x-list-round.x-list-grouped .x-list-header-wrap.x-list-header{border:1px solid #dedede;border-width:1px 1px 0 1px;-moz-border-radius-topleft:0.4em;-webkit-border-top-left-radius:0.4em;border-top-left-radius:0.4em;-moz-border-radius-topright:0.4em;-webkit-border-top-right-radius:0.4em;border-top-right-radius:0.4em}.x-list-round.x-list-grouped .x-list-footer-wrap{background:transparent}.x-list-round.x-list-grouped .x-list-footer-wrap.x-list-item-tpl,.x-list-round.x-list-grouped .x-list-footer-wrap .x-dock-horizontal{border:none;background:transparent;padding-bottom:13px;margin-bottom:13px}.x-list-round.x-list-grouped .x-list-footer-wrap.x-list-item-tpl > .x-innerhtml,.x-list-round.x-list-grouped .x-list-footer-wrap.x-list-item-tpl > .x-dock-body,.x-list-round.x-list-grouped .x-list-footer-wrap .x-dock-horizontal > .x-innerhtml,.x-list-round.x-list-grouped .x-list-footer-wrap .x-dock-horizontal > .x-dock-body{border:1px solid #dedede;background:#f7f7f7;-moz-border-radius-bottomleft:0.4em;-webkit-border-bottom-left-radius:0.4em;border-bottom-left-radius:0.4em;-moz-border-radius-bottomright:0.4em;-webkit-border-bottom-right-radius:0.4em;border-bottom-right-radius:0.4em}.x-list-round.x-list-grouped .x-list-footer-wrap.x-item-pressed > .x-innerhtml,.x-list-round.x-list-grouped .x-list-footer-wrap.x-item-pressed > .x-dock-body{background:#b6e1ff none}.x-list-round.x-list-grouped .x-list-footer-wrap.x-item-selected > .x-innerhtml,.x-list-round.x-list-grouped .x-list-footer-wrap.x-item-selected > .x-dock-body{background-image:none;background-color:#006bb6;background-image:-webkit-linear-gradient(top, #0398ff,#007ad0 3%,#005c9d);background-image:-moz-linear-gradient(top, #0398ff,#007ad0 3%,#005c9d);background-image:-o-linear-gradient(top, #0398ff,#007ad0 3%,#005c9d);background-image:linear-gradient(top, #0398ff,#007ad0 3%,#005c9d);color:#fff}.x-list-round .x-indexbar-vertical{margin-right:20px}.x-list-round .x-list-footer-wrap.x-list-item-last.x-list-item-odd.x-list-item.x-list-item-tpl{background-color:transparent !important}.x-list-round.x-list-grouped .x-list-item-odd.x-list-footer-wrap > .x-innerhtml,.x-list-round.x-list-grouped .x-list-item-odd.x-list-footer-wrap > .x-dock-body{background-color:#eaeaea !important}.x-list .x-list-item-odd.x-list-item-tpl,.x-list .x-list-item-odd .x-dock-horizontal{background-color:#eaeaea !important;border-bottom:1px solid #eaeaea}.x-picker .x-picker-inner{background-color:#fff;overflow:hidden;margin:0.7em;-webkit-border-radius:0.4em;-moz-border-radius:0.4em;-ms-border-radius:0.4em;-o-border-radius:0.4em;border-radius:0.4em;-webkit-background-clip:padding;-moz-background-clip:padding;background-clip:padding-box;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #bbb), color-stop(30%, #fff), color-stop(70%, #fff), color-stop(100%, #bbb));background:-webkit-linear-gradient(top, #bbb 0%, #fff 30%, #fff 70%, #bbb 100%)}.x-picker-slot .x-scroll-view{-webkit-box-shadow:rgba(0,0,0,0.4) -1px 0 1px;-moz-box-shadow:rgba(0,0,0,0.4) -1px 0 1px;box-shadow:rgba(0,0,0,0.4) -1px 0 1px}.x-picker-slot .x-scroll-view:first-child{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.x-picker-bar{border-top:0.12em solid #006bb6;border-bottom:0.12em solid #006bb6;height:2.5em;background-image:none;background-color:rgba(13,148,242,0.3);background-image:-webkit-linear-gradient(top, rgba(85,180,246,0.3),rgba(37,159,244,0.3) 3%,rgba(11,133,218,0.3));background-image:-moz-linear-gradient(top, rgba(85,180,246,0.3),rgba(37,159,244,0.3) 3%,rgba(11,133,218,0.3));background-image:-o-linear-gradient(top, rgba(85,180,246,0.3),rgba(37,159,244,0.3) 3%,rgba(11,133,218,0.3));background-image:linear-gradient(top, rgba(85,180,246,0.3),rgba(37,159,244,0.3) 3%,rgba(11,133,218,0.3));-webkit-box-shadow:rgba(0,0,0,0.2) 0 0.2em 0.2em;-moz-box-shadow:rgba(0,0,0,0.2) 0 0.2em 0.2em;box-shadow:rgba(0,0,0,0.2) 0 0.2em 0.2em}.x-use-titles .x-picker-bar{margin-top:1.5em}.x-picker-slot-title{height:1.5em;border-top:1px solid #1295f1;border-bottom:1px solid #095b94;padding:0.2em 1.02em;-webkit-box-shadow:rgba(0,0,0,0.3) 0px 0.1em 0.3em;-moz-box-shadow:rgba(0,0,0,0.3) 0px 0.1em 0.3em;box-shadow:rgba(0,0,0,0.3) 0px 0.1em 0.3em;background-image:none;background-color:#1295f1;background-image:-webkit-linear-gradient(top, #5ab5f5,#2aa0f2 3%,#0d87dc);background-image:-moz-linear-gradient(top, #5ab5f5,#2aa0f2 3%,#0d87dc);background-image:-o-linear-gradient(top, #5ab5f5,#2aa0f2 3%,#0d87dc);background-image:linear-gradient(top, #5ab5f5,#2aa0f2 3%,#0d87dc)}.x-picker-slot-title > div{font-size:0.8em;color:#113b59;text-shadow:rgba(255,255,255,0.25) 0 0.08em 0}.x-picker-slot{border-left:2px solid #acacac}.x-picker-slot .x-dataview-item{height:2.5em;line-height:2.5em;font-weight:bold;padding:0 10px}.x-picker-slot:first-child{border-left:0}.x-list-paging{padding:1em 0}.x-list-paging .x-list-paging-msg{color:#006bb6;-webkit-border-radius:6px;-moz-border-radius:6px;-ms-border-radius:6px;-o-border-radius:6px;border-radius:6px}.x-list-paging.x-loading{padding:0.5em}.x-list-pullrefresh-arrow{background:center center url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAA8CAYAAAAUufjgAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAjFJREFUeNrsmU8oREEYwOexdtNuKBfFwdVhCyfuysnFiXISS+1BLopyUpKLXETkRLaUi1LK3Q2lpPbiQLnIn03a/Hm+z86Ttv0zM++bfbOar36Hbad5v535Zp7v47iuy0wOpyoEHccRHV9L9NxPkUE/bhKCOKiOSPAdn69DsJ5I8E2HYA0QJRJ8Bb50CDYRCT7pEMQD0kwk+CByUFQEW4gE73UIhoA2IsFb4ENEMCQ5MdU1IxwygpT3oKNLMGyyYFVscdhusc8tDpu+xRG7xf95BW0O2kNiV1AgIvaQ2BzUJNgJNJYZGyUU7OG1cal4Bi68oqkDPszy2teEwJp5Cdyu/lZ1g8CwIYJ7wEF+2YmrNw90Byx3BizgKhaqizEP1wg7CLLxCEzy/CtauMeBlQDyEfNuGrgU6SyM8F9SyVgHdmRaH6tAb4XkToEp2d4M5mOK0TWMigU2koa8vJMRZPxEb2ss2LEVPMpPLlMRxBgDZjQJLgNbxb6Uab9tAn3EcifAeKkBMoLY+j0GWonk7oB+lmsFkwhidAGHBPmIeTcAnJcbKCuIMQEs+hScAzZEBqoIYuzyFVCJI36lMJ2CDfxibZeUu+EX/4uMIFP8ZyLejxkgK0hG5a8kP4IYSZbr1IuQVHmAX0HGX4VuGfZVJ6cQxPd1uoRcWqDW0SroFVzZAnJZ/h0LWhAjUUAw4XdSSsH8fExRTEgtGAOuOTETBb16Jk412e+bxOSwglYw6PgWYABvLk8P7zGJFwAAAABJRU5ErkJggg==') no-repeat;background-size:2em 3em;-webkit-transition-property:-webkit-transform;-webkit-transition-duration:200ms;-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);-o-transform:rotate(0deg);transform:rotate(0deg)}.x-android-2 .x-list-pullrefresh-arrow{-webkit-transition-property:none;-webkit-transition-duration:0}.x-list-pullrefresh-release .x-list-pullrefresh-arrow{-webkit-transform:rotate(-180deg);-moz-transform:rotate(-180deg);-ms-transform:rotate(-180deg);-o-transform:rotate(-180deg);transform:rotate(-180deg)}.x-list-pullrefresh-message{margin-bottom:0.1em}.x-slider,.x-toggle{height:2.2em}.x-slider.x-item-disabled{opacity:.6}.x-thumb{height:2.2em;width:2.2em;background:transparent none;border:0}.x-thumb:after{border:1px solid #919191;content:'';position:absolute;width:1.85em;height:1.85em;top:0.175em;left:0.175em;background-image:none;background-color:#ddd;background-image:-webkit-linear-gradient(top, #ffffff,#eaeaea 3%,#d0d0d0);background-image:-moz-linear-gradient(top, #ffffff,#eaeaea 3%,#d0d0d0);background-image:-o-linear-gradient(top, #ffffff,#eaeaea 3%,#d0d0d0);background-image:linear-gradient(top, #ffffff,#eaeaea 3%,#d0d0d0);-webkit-background-clip:padding;-moz-background-clip:padding;background-clip:padding-box;-webkit-border-radius:0.925em;-moz-border-radius:0.925em;-ms-border-radius:0.925em;-o-border-radius:0.925em;border-radius:0.925em}.x-thumb.x-dragging{opacity:1}.x-thumb.x-dragging:after{background-image:none;background-color:#d0d0d0;background-image:-webkit-linear-gradient(top, #f7f7f7,#dddddd 3%,#c4c4c4);background-image:-moz-linear-gradient(top, #f7f7f7,#dddddd 3%,#c4c4c4);background-image:-o-linear-gradient(top, #f7f7f7,#dddddd 3%,#c4c4c4);background-image:linear-gradient(top, #f7f7f7,#dddddd 3%,#c4c4c4)}.x-slider:before{margin:0 0.925em;border:0.1em solid rgba(0,0,0,0.1);border-bottom:0;content:'';position:absolute;width:auto;height:0.8em;top:0.737em;left:0;background-image:none;background-color:#ddd;background-image:-webkit-linear-gradient(top, #c4c4c4,#d0d0d0 10%,#dddddd 65%,#dedede);background-image:-moz-linear-gradient(top, #c4c4c4,#d0d0d0 10%,#dddddd 65%,#dedede);background-image:-o-linear-gradient(top, #c4c4c4,#d0d0d0 10%,#dddddd 65%,#dedede);background-image:linear-gradient(top, #c4c4c4,#d0d0d0 10%,#dddddd 65%,#dedede);-webkit-box-shadow:rgba(255,255,255,0.7) 0 0.1em 0;-moz-box-shadow:rgba(255,255,255,0.7) 0 0.1em 0;box-shadow:rgba(255,255,255,0.7) 0 0.1em 0;-webkit-border-radius:0.4em;-moz-border-radius:0.4em;-ms-border-radius:0.4em;-o-border-radius:0.4em;border-radius:0.4em}.x-toggle{width:4.4em;border:1px solid #b7b7b7;background-image:none;background-color:#ddd;background-image:-webkit-linear-gradient(top, #c4c4c4,#d0d0d0 10%,#dddddd 65%,#dedede);background-image:-moz-linear-gradient(top, #c4c4c4,#d0d0d0 10%,#dddddd 65%,#dedede);background-image:-o-linear-gradient(top, #c4c4c4,#d0d0d0 10%,#dddddd 65%,#dedede);background-image:linear-gradient(top, #c4c4c4,#d0d0d0 10%,#dddddd 65%,#dedede);-webkit-border-radius:1.1em;-moz-border-radius:1.1em;-ms-border-radius:1.1em;-o-border-radius:1.1em;border-radius:1.1em}.x-toggle .x-thumb.x-dragging{opacity:1}.x-toggle .x-thumb:before{top:0.175em}.x-toggle-on{background-image:none;background-color:#92cf00;background-image:-webkit-linear-gradient(top, #6e9c00,#80b500 10%,#92cf00 65%,#94d200);background-image:-moz-linear-gradient(top, #6e9c00,#80b500 10%,#92cf00 65%,#94d200);background-image:-o-linear-gradient(top, #6e9c00,#80b500 10%,#92cf00 65%,#94d200);background-image:linear-gradient(top, #6e9c00,#80b500 10%,#92cf00 65%,#94d200)}.x-tab.x-item-disabled span.x-button-label,.x-tab.x-item-disabled span.x-badge,.x-tab.x-item-disabled .x-hasbadge span.x-badge,.x-hasbadge .x-tab.x-item-disabled span.x-badge,.x-tab.x-item-disabled .x-button-icon{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=50);opacity:0.5}.x-tab.x-draggable{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=70);opacity:0.7}.x-tabbar.x-docked-top{height:2.6em;padding:0 .8em}.x-tabbar.x-docked-top .x-tab{background:transparent none;border:0;padding:0.4em 0.8em;height:1.8em;-webkit-border-radius:0.9em;-moz-border-radius:0.9em;-ms-border-radius:0.9em;-o-border-radius:0.9em;border-radius:0.9em}.x-tabbar.x-docked-top .x-tab .x-button-label,.x-tabbar.x-docked-top .x-tab .x-badge,.x-tabbar.x-docked-top .x-tab .x-hasbadge .x-badge,.x-hasbadge .x-tabbar.x-docked-top .x-tab .x-badge{font-size:.8em;line-height:1.2em;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased}.x-tabbar.x-docked-top .x-tab .x-badge{font-size:.6em !important;top:-0.5em}.x-tabbar.x-docked-top .x-tab .x-button-icon{width:1.2em;height:1.2em;margin:0 auto}.x-tabbar.x-docked-top .x-tab .x-button-icon:before{font-size:1.6em}.x-tabbar.x-docked-top .x-tab.x-tab-icon{padding:0.3em 0.8em}.x-tabbar.x-docked-top .x-tab.x-tab-icon .x-button-label,.x-tabbar.x-docked-top .x-tab.x-tab-icon .x-badge,.x-tabbar.x-docked-top .x-tab.x-tab-icon .x-hasbadge .x-badge,.x-hasbadge .x-tabbar.x-docked-top .x-tab.x-tab-icon .x-badge{margin:0;margin-left:.8em;padding:.1em 0 .2em 0;display:inline-block;position:relative;top:-0.2em}.x-tabbar.x-docked-bottom{height:3em;padding:0}.x-tabbar.x-docked-bottom .x-tab{background:transparent none;border:0;padding-top:.2em;-webkit-border-radius:0.25em;-moz-border-radius:0.25em;-ms-border-radius:0.25em;-o-border-radius:0.25em;border-radius:0.25em;-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column}.x-tabbar.x-docked-bottom .x-tab .x-button-icon{width:1.65em;height:1.65em;margin:0 auto}.x-tabbar.x-docked-bottom .x-tab .x-button-icon:before{font-size:1.6em;line-height:1.1em}.x-tabbar.x-docked-bottom .x-tab .x-button-label,.x-tabbar.x-docked-bottom .x-tab .x-badge,.x-tabbar.x-docked-bottom .x-tab .x-hasbadge .x-badge,.x-hasbadge .x-tabbar.x-docked-bottom .x-tab .x-badge{margin:0;padding:.1em 0 .2em 0;font-size:9px;line-height:12px;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased}.x-tabbar-light{border-top-color:#2175af;border-bottom-color:#195884;background-image:none;background-color:#2583c4;background-image:-webkit-linear-gradient(top, #56a7df,#2b91d7 3%,#2175af);background-image:-moz-linear-gradient(top, #56a7df,#2b91d7 3%,#2175af);background-image:-o-linear-gradient(top, #56a7df,#2b91d7 3%,#2175af);background-image:linear-gradient(top, #56a7df,#2b91d7 3%,#2175af)}.x-tabbar-light .x-tab{color:#c1dff4;border-bottom:1px solid transparent}.x-tabbar-light .x-tab-active{color:#fff;border-bottom-color:#278bd1}.x-tabbar-light .x-tab-active .x-button-icon:before{color:#1da2ff}.x-tabbar-light .x-tab-pressed{color:#fff}.x-tabbar-light.x-docked-bottom .x-tab{text-shadow:rgba(0,0,0,0.5) 0 -0.08em 0}.x-tabbar-light.x-docked-bottom .x-tab-active{background-image:none;background-color:#2175af;background-image:-webkit-linear-gradient(top, #195884,#1d6699 10%,#2175af 65%,#2176b1);background-image:-moz-linear-gradient(top, #195884,#1d6699 10%,#2175af 65%,#2176b1);background-image:-o-linear-gradient(top, #195884,#1d6699 10%,#2175af 65%,#2176b1);background-image:linear-gradient(top, #195884,#1d6699 10%,#2175af 65%,#2176b1);text-shadow:rgba(255,255,255,0.25) 0 0.08em 0;-webkit-box-shadow:#1d6699 0 0 0.25em inset;-moz-box-shadow:#1d6699 0 0 0.25em inset;box-shadow:#1d6699 0 0 0.25em inset}.x-tabbar-light.x-docked-bottom .x-tab-active .x-button-icon:before{color:#1da2ff}.x-tabbar-light.x-docked-top .x-tab-active{background-image:none;background-color:#2175af;background-image:-webkit-linear-gradient(top, #195884,#1d6699 10%,#2175af 65%,#2176b1);background-image:-moz-linear-gradient(top, #195884,#1d6699 10%,#2175af 65%,#2176b1);background-image:-o-linear-gradient(top, #195884,#1d6699 10%,#2175af 65%,#2176b1);background-image:linear-gradient(top, #195884,#1d6699 10%,#2175af 65%,#2176b1);color:#fff}.x-tabbar-dark{border-top-color:#0b3c5e;border-bottom-color:#061f31;background-image:none;background-color:#0e4b75;background-image:-webkit-linear-gradient(top, #1676b9,#11598c 3%,#0b3c5e);background-image:-moz-linear-gradient(top, #1676b9,#11598c 3%,#0b3c5e);background-image:-o-linear-gradient(top, #1676b9,#11598c 3%,#0b3c5e);background-image:linear-gradient(top, #1676b9,#11598c 3%,#0b3c5e)}.x-tabbar-dark .x-tab{color:#63b4ec;border-bottom:1px solid transparent}.x-tabbar-dark .x-tab-active{color:#fff;border-bottom-color:#105483}.x-tabbar-dark .x-tab-active .x-button-icon:before{color:#50b7ff}.x-tabbar-dark .x-tab-pressed{color:#fff}.x-tabbar-dark.x-docked-bottom .x-tab{text-shadow:rgba(0,0,0,0.5) 0 -0.08em 0}.x-tabbar-dark.x-docked-bottom .x-tab-active{background-image:none;background-color:#0b3c5e;background-image:-webkit-linear-gradient(top, #061f31,#092e47 10%,#0b3c5e 65%,#0c3e60);background-image:-moz-linear-gradient(top, #061f31,#092e47 10%,#0b3c5e 65%,#0c3e60);background-image:-o-linear-gradient(top, #061f31,#092e47 10%,#0b3c5e 65%,#0c3e60);background-image:linear-gradient(top, #061f31,#092e47 10%,#0b3c5e 65%,#0c3e60);text-shadow:rgba(0,0,0,0.5) 0 -0.08em 0;-webkit-box-shadow:#092e47 0 0 0.25em inset;-moz-box-shadow:#092e47 0 0 0.25em inset;box-shadow:#092e47 0 0 0.25em inset}.x-tabbar-dark.x-docked-bottom .x-tab-active .x-button-icon:before{color:#50b7ff}.x-tabbar-dark.x-docked-top .x-tab-active{background-image:none;background-color:#0b3c5e;background-image:-webkit-linear-gradient(top, #061f31,#092e47 10%,#0b3c5e 65%,#0c3e60);background-image:-moz-linear-gradient(top, #061f31,#092e47 10%,#0b3c5e 65%,#0c3e60);background-image:-o-linear-gradient(top, #061f31,#092e47 10%,#0b3c5e 65%,#0c3e60);background-image:linear-gradient(top, #061f31,#092e47 10%,#0b3c5e 65%,#0c3e60);color:#fff}.x-tabbar-neutral{border-top-color:#d3d3d3;border-bottom-color:#bababa;background-image:none;background-color:#e0e0e0;background-image:-webkit-linear-gradient(top, #ffffff,#ededed 3%,#d3d3d3);background-image:-moz-linear-gradient(top, #ffffff,#ededed 3%,#d3d3d3);background-image:-o-linear-gradient(top, #ffffff,#ededed 3%,#d3d3d3);background-image:linear-gradient(top, #ffffff,#ededed 3%,#d3d3d3)}.x-tabbar-neutral .x-tab{color:#7a7a7a;border-bottom:1px solid transparent}.x-tabbar-neutral .x-tab-active{color:#000;border-bottom-color:#e8e8e8}.x-tabbar-neutral .x-tab-active .x-button-icon:before{color:#7a7a7a}.x-tabbar-neutral .x-tab-pressed{color:#000}.x-tabbar-neutral.x-docked-bottom .x-tab{text-shadow:rgba(255,255,255,0.25) 0 0.08em 0}.x-tabbar-neutral.x-docked-bottom .x-tab-active{background-image:none;background-color:#d3d3d3;background-image:-webkit-linear-gradient(top, #bababa,#c7c7c7 10%,#d3d3d3 65%,#d5d5d5);background-image:-moz-linear-gradient(top, #bababa,#c7c7c7 10%,#d3d3d3 65%,#d5d5d5);background-image:-o-linear-gradient(top, #bababa,#c7c7c7 10%,#d3d3d3 65%,#d5d5d5);background-image:linear-gradient(top, #bababa,#c7c7c7 10%,#d3d3d3 65%,#d5d5d5);text-shadow:rgba(255,255,255,0.25) 0 0.08em 0;-webkit-box-shadow:#c7c7c7 0 0 0.25em inset;-moz-box-shadow:#c7c7c7 0 0 0.25em inset;box-shadow:#c7c7c7 0 0 0.25em inset}.x-tabbar-neutral.x-docked-bottom .x-tab-active .x-button-icon:before{color:#7a7a7a}.x-tabbar-neutral.x-docked-top .x-tab-active{background-image:none;background-color:#d3d3d3;background-image:-webkit-linear-gradient(top, #bababa,#c7c7c7 10%,#d3d3d3 65%,#d5d5d5);background-image:-moz-linear-gradient(top, #bababa,#c7c7c7 10%,#d3d3d3 65%,#d5d5d5);background-image:-o-linear-gradient(top, #bababa,#c7c7c7 10%,#d3d3d3 65%,#d5d5d5);background-image:linear-gradient(top, #bababa,#c7c7c7 10%,#d3d3d3 65%,#d5d5d5);color:#000}.x-grid{background-color:#fff !important}.x-grid .x-grid-header-container{border-color:#d7d7d7;background-color:#f5f5f5;color:#000000}.x-grid .x-grid-header-container .x-grid-column-resizing{background-color:#D2EDFE}.x-grid .x-grid-column{border-color:#fff #d7d7d7 #d7d7d7 #fff}.x-grid .x-grid-column.x-column-sorted-asc,.x-grid .x-grid-column.x-column-sorted-desc{color:#1464AE}.x-grid .x-grid-headergroup .x-inner > .x-innerhtml{border-color:#fff #d7d7d7 #d7d7d7 #fff}.x-grid .x-grid-row{border-color:#d7d7d7;color:#000}.x-grid .x-grid-row.x-grid-item-odd{background-color:#fafafa}.x-grid .x-grid-row.x-item-selected{background-color:#D2EDFE}.x-grid .x-grid-cell{border-color:#d7d7d7}.x-grid .x-grid-viewoptions{background-color:#fff;border-color:#C0C0C0}.x-grid .x-grid-viewoptions .x-column-options-header{background:#1464AE;border-color:#fff #d7d7d7 #d7d7d7 #fff;color:#fff}.x-grid .x-grid-viewoptions .x-column-options-sortablehandle,.x-grid .x-grid-viewoptions .x-column-options-visibleindicator,.x-grid .x-grid-viewoptions .x-column-options-folder,.x-grid .x-grid-viewoptions .x-column-options-leaf{color:#C0C0C0}.x-grid .x-grid-viewoptions .x-column-options-sortablehandle{color:#aaa}.x-grid .x-grid-viewoptions .x-column-options-text{color:#C0C0C0}.x-grid .x-grid-viewoptions .x-list-item.x-item-selected.x-list-item-tpl{border-top-color:#ccc}.x-grid .x-grid-viewoptions .x-list-item.x-item-selected.x-list-item-tpl .x-column-options-text{color:#000}.x-grid .x-grid-viewoptions .x-list-item.x-item-selected.x-list-item-tpl .x-column-options-visibleindicator:after{color:#1464AE}.x-grid .x-grid-viewoptions .x-list-item.x-item-selected.x-list-item-tpl .x-column-options-sortablehandle:after{color:#aaa}.x-grid .x-grid-viewoptions .x-list-item.x-item-selected.x-list-item-tpl .x-column-options-folder:after,.x-grid .x-grid-viewoptions .x-list-item.x-item-selected.x-list-item-tpl .x-column-options-leaf:after{color:#91E698}.x-grid .x-grid-columnoptions{border-color:#d7d7d7}.x-grid .x-grid-multiselection-column{color:#C0C0C0}.x-grid .x-grid-multiselection-column.x-grid-multiselection-allselected:after{color:#1464AE !important}.x-grid .x-grid-multiselection-cell{color:#C0C0C0}.x-grid .x-item-selected .x-grid-multiselection-cell:after{color:#1464AE}.x-grid .x-grid-pagingtoolbar{border-top-color:#d7d7d7}.x-grid .x-grid-summaryrow{background-color:#1464AE;color:#fff}.x-grid .x-grid-summaryrow .x-grid-cell{border-color:#C0C0C0}.x-tab .x-button-icon.chart:before,.x-button .x-button-icon.chart:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"Z"}.x-tab .x-button-icon.bird:before,.x-button .x-button-icon.bird:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"B"}.x-tab .x-button-icon.box:before,.x-button .x-button-icon.box:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"b"}.x-tab .x-button-icon.add2:before,.x-button .x-button-icon.add2:before{position:absolute;top:0;right:0;bottom:0;left:0;text-align:center;font-family:"Pictos";content:"+"}.x-accordion-list .x-list-item .x-innerhtml{display:-webkit-box}.x-accordion-list .down{position:relative;width:0;height:0;border:8px solid transparent;border-top-color:#999;top:4px;margin-right:0.4em}.x-accordion-list .right{position:relative;width:0;height:0;border:8px solid transparent;border-left-color:#999;top:2px;margin-right:0.4em}.x-accordion-list .x-list-item.x-item-selected .down{border-top-color:#fff}.x-accordion-list .x-list-item.x-item-selected .right{border-left-color:#fff}.PL-view .x-accordion-list-header{background-color:#3498db;border-top:1px solid #7f8c8d;color:#fff}.PL-view .x-accordion-list-header .down{border-top-color:#fff}.PL-view .x-accordion-list-header .right{border-left-color:#fff}.components-view .accordion-list-item{background:#ecf0f1;padding-top:.6em;border-bottom:#ddd solid 1px}.components-view .accordion-list-item .x-button-plain{color:#2c3e50}.components-view .accordion-list-item.x-accordion-list-content{padding-bottom:.6em}.components-view .accordion-list-item .x-field{border-top:solid 1px #ccc;border-left:solid 1px #ccc;border-right:solid 1px #ccc;margin-right:.6em}.components-view .accordion-list-item .x-field-textarea{border-bottom:solid 1px #ccc} diff --git a/example/resources/data/componentsData.json b/examples/resources/data/componentsData.json similarity index 100% rename from example/resources/data/componentsData.json rename to examples/resources/data/componentsData.json diff --git a/example/resources/data/groupedData.json b/examples/resources/data/groupedData.json similarity index 100% rename from example/resources/data/groupedData.json rename to examples/resources/data/groupedData.json diff --git a/example/resources/data/plData.json b/examples/resources/data/plData.json similarity index 100% rename from example/resources/data/plData.json rename to examples/resources/data/plData.json diff --git a/example/resources/data/testBigData.json b/examples/resources/data/testBigData.json similarity index 100% rename from example/resources/data/testBigData.json rename to examples/resources/data/testBigData.json diff --git a/example/resources/data/testData.json b/examples/resources/data/testData.json similarity index 100% rename from example/resources/data/testData.json rename to examples/resources/data/testData.json diff --git a/example/resources/icons/Icon.png b/examples/resources/icons/Icon.png similarity index 100% rename from example/resources/icons/Icon.png rename to examples/resources/icons/Icon.png diff --git a/example/resources/icons/Icon@2x.png b/examples/resources/icons/Icon@2x.png similarity index 100% rename from example/resources/icons/Icon@2x.png rename to examples/resources/icons/Icon@2x.png diff --git a/examples/resources/icons/Icon_Android36.png b/examples/resources/icons/Icon_Android36.png new file mode 100644 index 0000000..b856bdc Binary files /dev/null and b/examples/resources/icons/Icon_Android36.png differ diff --git a/examples/resources/icons/Icon_Android48.png b/examples/resources/icons/Icon_Android48.png new file mode 100644 index 0000000..926731a Binary files /dev/null and b/examples/resources/icons/Icon_Android48.png differ diff --git a/example/resources/icons/Icon~ipad.png b/examples/resources/icons/Icon~ipad.png similarity index 100% rename from example/resources/icons/Icon~ipad.png rename to examples/resources/icons/Icon~ipad.png diff --git a/example/resources/icons/Icon~ipad@2x.png b/examples/resources/icons/Icon~ipad@2x.png similarity index 100% rename from example/resources/icons/Icon~ipad@2x.png rename to examples/resources/icons/Icon~ipad@2x.png diff --git a/example/resources/icons/iTunesArtwork.png b/examples/resources/icons/iTunesArtwork.png similarity index 100% rename from example/resources/icons/iTunesArtwork.png rename to examples/resources/icons/iTunesArtwork.png diff --git a/example/resources/icons/icon-spot~ipad.png b/examples/resources/icons/icon-spot~ipad.png similarity index 100% rename from example/resources/icons/icon-spot~ipad.png rename to examples/resources/icons/icon-spot~ipad.png diff --git a/example/resources/loading/Default-Landscape@2x~ipad.png b/examples/resources/loading/Default-Landscape@2x~ipad.png similarity index 100% rename from example/resources/loading/Default-Landscape@2x~ipad.png rename to examples/resources/loading/Default-Landscape@2x~ipad.png diff --git a/example/resources/loading/Default-LandscapeLeft~ipad.png b/examples/resources/loading/Default-LandscapeLeft~ipad.png similarity index 100% rename from example/resources/loading/Default-LandscapeLeft~ipad.png rename to examples/resources/loading/Default-LandscapeLeft~ipad.png diff --git a/example/resources/loading/Default-LandscapeRight~ipad.png b/examples/resources/loading/Default-LandscapeRight~ipad.png similarity index 100% rename from example/resources/loading/Default-LandscapeRight~ipad.png rename to examples/resources/loading/Default-LandscapeRight~ipad.png diff --git a/example/resources/loading/Default-Landscape~ipad.png b/examples/resources/loading/Default-Landscape~ipad.png similarity index 100% rename from example/resources/loading/Default-Landscape~ipad.png rename to examples/resources/loading/Default-Landscape~ipad.png diff --git a/example/resources/loading/Default-Portrait@2x~ipad.png b/examples/resources/loading/Default-Portrait@2x~ipad.png similarity index 100% rename from example/resources/loading/Default-Portrait@2x~ipad.png rename to examples/resources/loading/Default-Portrait@2x~ipad.png diff --git a/example/resources/loading/Default-PortraitUpsideDown~ipad.png b/examples/resources/loading/Default-PortraitUpsideDown~ipad.png similarity index 100% rename from example/resources/loading/Default-PortraitUpsideDown~ipad.png rename to examples/resources/loading/Default-PortraitUpsideDown~ipad.png diff --git a/example/resources/loading/Default-Portrait~ipad.png b/examples/resources/loading/Default-Portrait~ipad.png similarity index 100% rename from example/resources/loading/Default-Portrait~ipad.png rename to examples/resources/loading/Default-Portrait~ipad.png diff --git a/example/resources/loading/Default.png b/examples/resources/loading/Default.png similarity index 100% rename from example/resources/loading/Default.png rename to examples/resources/loading/Default.png diff --git a/example/resources/loading/Default@2x.png b/examples/resources/loading/Default@2x.png similarity index 100% rename from example/resources/loading/Default@2x.png rename to examples/resources/loading/Default@2x.png diff --git a/example/resources/loading/Default~ipad.png b/examples/resources/loading/Default~ipad.png similarity index 100% rename from example/resources/loading/Default~ipad.png rename to examples/resources/loading/Default~ipad.png diff --git a/example/resources/sass/app.scss b/examples/resources/sass/app.scss similarity index 99% rename from example/resources/sass/app.scss rename to examples/resources/sass/app.scss index b1edff0..243717b 100644 --- a/example/resources/sass/app.scss +++ b/examples/resources/sass/app.scss @@ -60,6 +60,3 @@ } } - - - diff --git a/example/resources/sass/config.rb b/examples/resources/sass/config.rb similarity index 100% rename from example/resources/sass/config.rb rename to examples/resources/sass/config.rb diff --git a/example/resources/sass/stylesheets/_accordionlist.scss b/examples/resources/sass/stylesheets/_accordionlist.scss similarity index 100% rename from example/resources/sass/stylesheets/_accordionlist.scss rename to examples/resources/sass/stylesheets/_accordionlist.scss diff --git a/examples/resources/sass/stylesheets/fonts/ios7/ios7.eot b/examples/resources/sass/stylesheets/fonts/ios7/ios7.eot new file mode 100644 index 0000000..6306b67 Binary files /dev/null and b/examples/resources/sass/stylesheets/fonts/ios7/ios7.eot differ diff --git a/examples/resources/sass/stylesheets/fonts/ios7/ios7.svg b/examples/resources/sass/stylesheets/fonts/ios7/ios7.svg new file mode 100644 index 0000000..be9446f --- /dev/null +++ b/examples/resources/sass/stylesheets/fonts/ios7/ios7.svg @@ -0,0 +1,16 @@ + + + + +This is a custom SVG font generated by IcoMoon. + + + + + + + + + + + \ No newline at end of file diff --git a/examples/resources/sass/stylesheets/fonts/ios7/ios7.ttf b/examples/resources/sass/stylesheets/fonts/ios7/ios7.ttf new file mode 100644 index 0000000..6aaa050 Binary files /dev/null and b/examples/resources/sass/stylesheets/fonts/ios7/ios7.ttf differ diff --git a/examples/resources/sass/stylesheets/fonts/ios7/ios7.woff b/examples/resources/sass/stylesheets/fonts/ios7/ios7.woff new file mode 100644 index 0000000..8485875 Binary files /dev/null and b/examples/resources/sass/stylesheets/fonts/ios7/ios7.woff differ diff --git a/example/resources/sass/stylesheets/fonts/pictos/pictos-web.eot b/examples/resources/sass/stylesheets/fonts/pictos/pictos-web.eot similarity index 100% rename from example/resources/sass/stylesheets/fonts/pictos/pictos-web.eot rename to examples/resources/sass/stylesheets/fonts/pictos/pictos-web.eot diff --git a/example/resources/sass/stylesheets/fonts/pictos/pictos-web.svg b/examples/resources/sass/stylesheets/fonts/pictos/pictos-web.svg similarity index 100% rename from example/resources/sass/stylesheets/fonts/pictos/pictos-web.svg rename to examples/resources/sass/stylesheets/fonts/pictos/pictos-web.svg diff --git a/example/resources/sass/stylesheets/fonts/pictos/pictos-web.ttf b/examples/resources/sass/stylesheets/fonts/pictos/pictos-web.ttf similarity index 100% rename from example/resources/sass/stylesheets/fonts/pictos/pictos-web.ttf rename to examples/resources/sass/stylesheets/fonts/pictos/pictos-web.ttf diff --git a/example/resources/sass/stylesheets/fonts/pictos/pictos-web.woff b/examples/resources/sass/stylesheets/fonts/pictos/pictos-web.woff similarity index 100% rename from example/resources/sass/stylesheets/fonts/pictos/pictos-web.woff rename to examples/resources/sass/stylesheets/fonts/pictos/pictos-web.woff diff --git a/example/resources/startup/1496x2048.png b/examples/resources/startup/1496x2048.png similarity index 100% rename from example/resources/startup/1496x2048.png rename to examples/resources/startup/1496x2048.png diff --git a/example/resources/startup/1536x2008.png b/examples/resources/startup/1536x2008.png similarity index 100% rename from example/resources/startup/1536x2008.png rename to examples/resources/startup/1536x2008.png diff --git a/example/resources/startup/320x460.jpg b/examples/resources/startup/320x460.jpg similarity index 100% rename from example/resources/startup/320x460.jpg rename to examples/resources/startup/320x460.jpg diff --git a/example/resources/startup/640x920.png b/examples/resources/startup/640x920.png similarity index 100% rename from example/resources/startup/640x920.png rename to examples/resources/startup/640x920.png diff --git a/example/resources/startup/748x1024.png b/examples/resources/startup/748x1024.png similarity index 100% rename from example/resources/startup/748x1024.png rename to examples/resources/startup/748x1024.png diff --git a/example/resources/startup/768x1004.png b/examples/resources/startup/768x1004.png similarity index 100% rename from example/resources/startup/768x1004.png rename to examples/resources/startup/768x1004.png diff --git a/image1.png b/image1.png deleted file mode 100644 index 4eea85e..0000000 Binary files a/image1.png and /dev/null differ diff --git a/image2.png b/image2.png deleted file mode 100644 index 2f6cca6..0000000 Binary files a/image2.png and /dev/null differ diff --git a/MIT.LICENSE b/licenses/MIT.LICENSE similarity index 100% rename from MIT.LICENSE rename to licenses/MIT.LICENSE diff --git a/package.json b/package.json index df18cce..006443e 100644 --- a/package.json +++ b/package.json @@ -1,10 +1,34 @@ { - "name": "Ext.ux.AccordionList", - "version": "1.0.1", - "description": "", - "repository": "https://github.com/kawanoshinobu/Ext.ux.AccordionList", - "author": "KAWANO Shinobu", - "license": "MIT", - "devDependencies": { - } + "name": "Ext.ux.AccordionList", + "version": "1.1.0", + "repository": "https://github.com/kawanoshinobu/Ext.ux.AccordionList", + "license": "MIT", + "type": "code", + "creator": "Shinobu Kawano", + "summary": "Accordion List for Sencha Touch 2", + "detailedDescription": "Collapsible List with Ext.data.TreeStore. You can expand and collapse contents by header item tap. Also it can nested infinity.", + "compatVersion": "1", + "architect": { + "compatFrameworks": [ + "touch20", + "touch21", + "touch22", + "touch23" + ], + "requires": [ + "ux/AccordionListItem.js" + ], + "classes": [{ + "definition": "AccordionList.js", + "className": "Ext.ux.AccordionList", + "js": ["ux/AccordionList.js"], + "css": [] + }, { + "definition": "AccordionListItem.js", + "className": "Ext.ux.AccordionListItem", + "js": ["ux/AccordionListItem.js"], + "css": [] + }] + }, + "local": true } diff --git a/project.xml b/project.xml deleted file mode 100644 index 2c0f2f3..0000000 --- a/project.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/resources/Readme.md b/resources/Readme.md new file mode 100644 index 0000000..efe6dda --- /dev/null +++ b/resources/Readme.md @@ -0,0 +1,3 @@ +# Ext.ux.AccordionList/resources + +This folder contains static resources (typically an `"images"` folder as well). diff --git a/resources/architect.png b/resources/architect.png new file mode 100644 index 0000000..5fc110b Binary files /dev/null and b/resources/architect.png differ diff --git a/resources/eyecatch.png b/resources/eyecatch.png new file mode 100644 index 0000000..8d0bf8d Binary files /dev/null and b/resources/eyecatch.png differ diff --git a/resources/siesta.png b/resources/siesta.png new file mode 100644 index 0000000..16e3c60 Binary files /dev/null and b/resources/siesta.png differ diff --git a/sass/Readme.md b/sass/Readme.md new file mode 100644 index 0000000..c90d036 --- /dev/null +++ b/sass/Readme.md @@ -0,0 +1,7 @@ +# Ext.ux.AccordionList/sass + +This folder contains SASS files of various kinds, organized in sub-folders: + + Ext.ux.AccordionList/sass/etc + Ext.ux.AccordionList/sass/src + Ext.ux.AccordionList/sass/var diff --git a/sass/config.rb b/sass/config.rb new file mode 100644 index 0000000..2c32c0a --- /dev/null +++ b/sass/config.rb @@ -0,0 +1,2 @@ +cur_dir = File.dirname(__FILE__) +output_style = :nested diff --git a/sass/etc/Readme.md b/sass/etc/Readme.md new file mode 100644 index 0000000..895e703 --- /dev/null +++ b/sass/etc/Readme.md @@ -0,0 +1,4 @@ +# Ext.ux.AccordionList/sass/etc + +This folder contains miscellaneous SASS files. Unlike `"Ext.ux.AccordionList/sass/etc"`, these files +need to be used explicitly. diff --git a/sass/etc/all.scss b/sass/etc/all.scss new file mode 100644 index 0000000..e69de29 diff --git a/sass/example/custom.js b/sass/example/custom.js new file mode 100644 index 0000000..4b38faf --- /dev/null +++ b/sass/example/custom.js @@ -0,0 +1,12 @@ +/* + * This file is generated as a starting point by Sencha Cmd - it will not be replaced or + * updated by "sencha package upgrade". + * + * This file can be removed and the script tag in theme.html removed if this theme does + * not need custom additional manifest or shortcut entries. These are documented in + * ./packages/ext-theme-base/sass/example/render.js. + */ + +//Ext.theme.addManifest(); + +//Ext.theme.addShortcuts(); diff --git a/sass/example/render.js b/sass/example/render.js new file mode 100644 index 0000000..e65f4e8 --- /dev/null +++ b/sass/example/render.js @@ -0,0 +1,423 @@ +/* + * This file is generated by Sencha Cmd and should NOT be edited. It will be replaced + * during an upgrade. + */ + +Ext.require([ + 'Ext.layout.Context', +]); + +Ext.theme = { + /** + * The array of all component manifests. These objects have the following set of + * properties recognized by the slicer: + * @private + */ + _manifest: [], + + /** + * The collection of shortcuts for a given alias (e.g., 'widget.panel'). This is an + * object keyed by alias whose values are arrays of shortcut definitions. + * @private + */ + _shortcuts: {}, + + doRequire : function(xtype) { + if(xtype.indexOf("widget.") != 0) { + xtype = "widget." + xtype; + } + Ext.require([xtype]); + }, + + /** + * Adds one ore more component entries to the theme manifest. These entries will be + * instantiated by the `Ext.theme.render` method when the page is ready. + * + * Usage: + * + * Ext.theme.addManifest({ + * xtype: 'widget.menu', + * folder: 'menu', + * delegate: '.x-menu-item-link', + * filename: 'menu-item-active', + * config: { + * floating: false, + * width: 200, + * items: [{ + * text: 'test', + * cls: 'x-menu-item-active' + * }] + * } + * },{ + * //... + * }); + * + * @param manifest {Object} An object with type of component, slicing information and + * component configuration. If this parameter is an array, each element is treated as + * a manifest entry. Otherwise, each argument passed is treated as a manifest entry. + * + * @param manifest.xtype {String} The xtype ('grid') or alias ('widget.grid'). This + * is used to specify the type of component to create as well as a potential key to + * any `shortcuts` defined for the xtype. + * + * @param manifest.config {Object} The component configuration object. The properties + * of this depend on the `xtype` of the component. + * + * @param [manifest.delegate] {String} The DOM query to use to select the element to + * slice. The default is to slice the primary element of the component. + * + * @param [manifest.parentCls] An optional CSS class to add to the parent of the + * component. + * + * @param [manifest.setup] {Function} An optional function to be called to initialize + * the component. + * @param manifest.setup.component {Ext.Component} The component instance + * @param manifest.setup.container {Element} The component's container. + * + * @param [manifest.folder] {String} The folder in to which to produce image slices. + * Only applies to Ext JS 4.1 (removed in 4.2). + * + * @param [manifest.filename] {String} The base filename for slices. + * Only applies to Ext JS 4.1 (removed in 4.2). + * + * @param [manifest.reverse] {Boolean} True to position the slices for linear gradient + * background at then opposite "end" (right or bottom) and apply the stretch to the + * area before it (left or top). Only applies to Ext JS 4.1 (removed in 4.2). + */ + addManifest: function (manifest) { + var all = Ext.theme._manifest; + var add = Ext.isArray(manifest) ? manifest : arguments; + + if(manifest.xtype) { + Ext.theme.doRequire(manifest.xtype); + } + + for (var i = 0, n = add.length; i < n; ++i) { + all.push(add[i]); + } + }, + + /** + * Adds one or more shortcuts to the rendering process. A `shortcut` is an object that + * looks the same as a `manifest` entry. These are combined by copying the properties + * from the shortcut over those of the manifest entry. In basic terms: + * + * var config = Ext.apply(Ext.apply({}, manfiest.config), shortcut.config); + * var entry = Ext.apply(Ext.apply({}, manfiest), shortcut); + * entry.config = config; + * + * This is not exactly the process, but the idea is the same. The difference is that + * the `ui` of the manifest entry is used to replace any `"{ui}"` substrings found in + * any string properties of the shortcut or its `config` object. + * + * Usage: + * + * Ext.theme.addShortcuts({ + * 'widget.foo': [{ + * config: { + * } + * },{ + * config: { + * } + * }], + * + * 'widget.bar': [ ... ] + * }); + */ + addShortcuts: function (shortcuts) { + var all = Ext.theme._shortcuts; + + for (var key in shortcuts) { + + var add = shortcuts[key]; + var xtype = Ext.theme.addWidget(key); + var existing = all[xtype]; + + Ext.theme.doRequire(xtype); + for(var i=0; i < add.length; i++) { + var config = add[i]; + if(config.xtype) { + Ext.theme.doRequire(config.xtype); + } + } + + if (!existing) { + all[xtype] = existing = []; + } + + existing.push.apply(existing, add); + } + }, + + /** + * This method ensures that a given string has the specified prefix (e.g., "widget."). + * @private + */ + addPrefix: function (prefix, s) { + if (!s || (s.length > prefix.length && s.substring(0,prefix.length) === prefix)) { + return s; + } + return prefix + s; + }, + + /** + * This method returns the given string with "widget." added to the front if that is + * not already present. + * @private + */ + addWidget: function (str) { + return Ext.theme.addPrefix('widget.', str); + }, + + /** + * This method accepts an manifest entry and a shortcut entry and returns the merged + * version. + * @private + */ + applyShortcut: function (manifestEntry, shortcut) { + var ui = manifestEntry.ui; + var config = Ext.theme.copyProps({}, manifestEntry.config); + var entry = Ext.theme.copyProps({}, manifestEntry); + + if (ui && !config.ui) { + config.ui = ui; + } + if (shortcut) { + var tpl = { ui: ui }; + Ext.theme.copyProps(entry, shortcut, tpl); + Ext.theme.copyProps(config, shortcut.config, tpl); + } + + entry.xtype = Ext.theme.addWidget(entry.xtype); + entry.config = config; // both guys have "config" so smash merged one on now... + return entry; + }, + + /** + * This method copies property from a `src` object to a `dest` object and reaplces + * `"{foo}"` fragments of any string properties as defined in the `tpl` object. + * + * var obj = Ext.theme.copyProps({}, { + * foo: 'Hello-{ui}' + * }, { + * ui: 'World' + * }); + * + * console.log('obj.foo: ' + obj.foo); // logs "Hello-World" + * + * @return {Object} The `dest` object or a new object (if `dest` was null). + * @private + */ + copyProps: function (dest, src, tpl) { + var out = dest || {}; + var replacements = []; + var token; + + if (src) { + if (tpl) { + for (token in tpl) { + replacements.push({ + re: new RegExp('\\{' + token + '\\}', 'g'), + value: tpl[token] + }); + } + } + + for (var key in src) { + var val = src[key]; + if (tpl && typeof val === 'string') { + for (var i = 0; i < replacements.length; ++ i) { + val = val.replace(replacements[i].re, replacements[i].value); + } + } + out[key] = val; + } + } + + return out; + }, + + /** + * Renders a component given its manifest and shortcut entries. + * @private + */ + renderWidget: function (manifestEntry, shortcut) { + var entry = Ext.theme.applyShortcut(manifestEntry, shortcut); + var config = entry.config; + var widget = Ext.create(entry.xtype, config); + var ct = Ext.fly(document.body).createChild({ cls: 'widget-container' }); + + Ext.theme.currentWidget = widget; + + if (widget.floating === true) { + widget.floating = { shadow: false }; + } + if (widget.floating) { + widget.focusOnToFront = false; + } + + if (entry.setup) { + entry.setup.call(widget, widget, ct); + } else { + widget.render(ct); + if (widget.floating) { + widget.showAt(0, 0); + ct.setHeight(widget.getHeight()); + } + } + + var el = widget.el; + if (entry.delegate) { + el = el.down(entry.delegate); + } + + el.addCls('x-slicer-target'); // this is what generateSlicerManifest looks for + + if (entry.over) { + widget.addOverCls(); + } + if (config.parentCls) { + el.parent().addCls(config.parentCls); + } + + if (Ext.theme.legacy) { + // The 4.1 approach has some interesting extra pieces + // + var data = {}; + if (entry.reverse) { + data.reverse = true; + } + if (entry.filename) { + data.filename = entry.filename; + } + if (entry.folder) { + data.folder = entry.folder; + } + if (entry.offsets) { + data.offsets = entry.offsets; + } + + Ext.theme.setData(el.dom, data); + } + + Ext.theme.currentWidget = null; + }, + + /** + * Renders all of the components that have been added to the manifest. + * @private + */ + render: function () { + var manifest = Ext.theme._manifest; + var shortcuts = Ext.theme._shortcuts; + + for (var k = 0, n = manifest ? manifest.length : 0; k < n; ++k) { + var manifestEntry = manifest[k]; + var xtype = Ext.theme.addWidget(manifestEntry.xtype); + var widgetShortcuts = xtype ? shortcuts[xtype] : null; + + if (xtype && manifestEntry.ui && widgetShortcuts) { + for (var i = 0; i < widgetShortcuts.length; i++) { + Ext.theme.renderWidget(manifestEntry, widgetShortcuts[i]); + } + } else { + Ext.theme.renderWidget(manifestEntry); + } + } + }, + + /** + * Renders all components (see `render`) and notifies the Slicer that things are ready. + * @private + */ + run: function () { + var extjsVer = Ext.versions.extjs; + var globalData = {}; + + if (Ext.layout.Context) { + Ext.override(Ext.layout.Context, { + run: function () { + var ok = this.callParent(), + widget = Ext.theme.currentWidget; + if (!ok && widget) { + Ext.Error.raise("Layout run failed: " + widget.id); + } + return ok; + } + }); + } + + // Previous to Ext JS 4.2, themes and their manifests where defined differently. + // So pass this along if we are hosting a pre-4.2 theme. + // + if (extjsVer && extjsVer.isLessThan(new Ext.Version("4.2"))) { + globalData.format = "1.0"; // tell the Slicer tool + Ext.theme.legacy = true; // not for our own data collection + + // Check for the Cmd3.0/ExtJS4.1 variables: + // + if (Ext.manifest && Ext.manifest.widgets) { + Ext.theme.addManifest(Ext.manifest.widgets); + } + if (Ext.shortcuts) { + Ext.theme.addShortcuts(Ext.shortcuts); + } + if (Ext.userManifest && Ext.userManifest.widgets) { + Ext.theme.addManifest(Ext.userManifest.widgets); + } + } + + Ext.theme.setData(document.body, globalData); + + Ext.theme.render(); + + // This function is defined by slicer.js (the framework-independent piece) + Ext.defer(generateSlicerManifest, 1); + }, + + /** + * Sets the `data-slicer` attribute to the JSON-encoded value of the provided data. + * @private + */ + setData: function (el, data) { + if (data) { + var json = Ext.encode(data); + if (json !== '{}') { + el.setAttribute('data-slicer', json); + } + } + }, + + /** + * This used to be `loadExtStylesheet`. + * @private + */ + loadCss: function (src, callback) { + var xhr = new XMLHttpRequest(); + + xhr.open('GET', src); + + xhr.onload = function() { + var css = xhr.responseText, + head = document.getElementsByTagName('head')[0], + style = document.createElement('style'); + + // There's bugginess in the next gradient syntax in WebKit r84622 + // This might be fixed in a later WebKit, but for now we're going to + // strip it out here since compass generates it. + // + // TODO: Upgrade to later WebKit revision + css = css.replace(/background(-image)?: ?-webkit-linear-gradient(?:.*?);/g, ''); + + style.type = 'text/css'; + style.innerText = css; + + head.appendChild(style); + callback(); + }; + + xhr.send(null); + } +}; + +Ext.onReady(Ext.theme.run, Ext.theme); diff --git a/sass/example/theme.html b/sass/example/theme.html new file mode 100644 index 0000000..6ad3636 --- /dev/null +++ b/sass/example/theme.html @@ -0,0 +1,44 @@ + + + + + Ext JS Theme Harness + + + + + + + + + + + + + + + + + + + diff --git a/sass/src/Readme.md b/sass/src/Readme.md new file mode 100644 index 0000000..542d0de --- /dev/null +++ b/sass/src/Readme.md @@ -0,0 +1,4 @@ +# Ext.ux.AccordionList/sass/src + +This folder contains SASS sources that mimic the component-class hierarchy. These files +are gathered in to a build of the CSS based on classes that are used by the build. diff --git a/sass/src/_accordionlist.scss b/sass/src/_accordionlist.scss new file mode 100644 index 0000000..c44caa2 --- /dev/null +++ b/sass/src/_accordionlist.scss @@ -0,0 +1,39 @@ +@mixin accordionlist { + + .x-accordion-list { + + .x-list-item .x-innerhtml { + display: -webkit-box; + } + + .down { + position: relative; + width: 0; + height: 0; + border: 8px solid transparent; + border-top-color: #999; + top: 4px; + margin-right: 0.4em; + } + + .right { + position: relative; + width: 0; + height: 0; + border: 8px solid transparent; + border-left-color: #999; + top: 2px; + margin-right: 0.4em; + } + + .x-list-item.x-item-selected .down { + border-top-color: #fff; + } + + .x-list-item.x-item-selected .right { + border-left-color: #fff; + + } + } + +} diff --git a/sass/var/Readme.md b/sass/var/Readme.md new file mode 100644 index 0000000..d0266d2 --- /dev/null +++ b/sass/var/Readme.md @@ -0,0 +1,3 @@ +# Ext.ux.AccordionList/sass/var + +This folder contains variable declaration files named by their component class. diff --git a/src/Readme.md b/src/Readme.md new file mode 100644 index 0000000..e0d3acc --- /dev/null +++ b/src/Readme.md @@ -0,0 +1,4 @@ +# Ext.ux.AccordionList/src + +This folder contains source code that will automatically be added to the classpath when +the package is used. diff --git a/src/ux/AccordionList.js b/src/ux/AccordionList.js index 55cc928..c41e697 100644 --- a/src/ux/AccordionList.js +++ b/src/ux/AccordionList.js @@ -4,7 +4,7 @@ * You can expand and collapse contents by header item tap. * Also it can nested infinity. * - * @author KAWANO Shinobu + * @author Shinobu Kawano * * Simple example: * @@ -113,7 +113,7 @@ Ext.define('Ext.ux.AccordionList', { /** * @cfg {Ext.data.TreeStore/Object} store - * Store instanse or tree store'a data object. + * Store instanse */ store: null, @@ -513,7 +513,7 @@ Ext.define('Ext.ux.AccordionList', { /** * Remove all items from the store. */ - removeAll: function() { + removeAllItem: function() { this.getStore().removeAll(); }, @@ -794,11 +794,17 @@ Ext.define('Ext.ux.AccordionList', { * HACK: See. Can not able to load json data in Sencha touch 2.1 Accordionlist * http://www.sencha.com/forum/showthread.php?253032-Can-not-able-to-load-json-data-in-Sencha-touch-2.1-Accordionlist * @private - * @param {[type]} store + * @param {Ext.data.TreeStore} store * @return {Ext.data.TreeStore} */ patchStore: function(store) { var me = this; + + if (!store.isStore) { + console.error('You should set instance of Ext.data.TreeStore to `store` config'); + return; + } + store.onProxyLoad = function(operation) { var records = operation.getRecords(), successful = operation.wasSuccessful(), diff --git a/test/SpecRunner.html b/test/SpecRunner.html deleted file mode 100644 index ef1738f..0000000 --- a/test/SpecRunner.html +++ /dev/null @@ -1,58 +0,0 @@ - - - - Jasmine Spec Runner - - - - - - - - - - - - - - - - - -
-
-
-
-
-
-
- - diff --git a/test/jasmine/jasmine-html.js b/test/jasmine/jasmine-html.js deleted file mode 100644 index 543d569..0000000 --- a/test/jasmine/jasmine-html.js +++ /dev/null @@ -1,681 +0,0 @@ -jasmine.HtmlReporterHelpers = {}; - -jasmine.HtmlReporterHelpers.createDom = function(type, attrs, childrenVarArgs) { - var el = document.createElement(type); - - for (var i = 2; i < arguments.length; i++) { - var child = arguments[i]; - - if (typeof child === 'string') { - el.appendChild(document.createTextNode(child)); - } else { - if (child) { - el.appendChild(child); - } - } - } - - for (var attr in attrs) { - if (attr == "className") { - el[attr] = attrs[attr]; - } else { - el.setAttribute(attr, attrs[attr]); - } - } - - return el; -}; - -jasmine.HtmlReporterHelpers.getSpecStatus = function(child) { - var results = child.results(); - var status = results.passed() ? 'passed' : 'failed'; - if (results.skipped) { - status = 'skipped'; - } - - return status; -}; - -jasmine.HtmlReporterHelpers.appendToSummary = function(child, childElement) { - var parentDiv = this.dom.summary; - var parentSuite = (typeof child.parentSuite == 'undefined') ? 'suite' : 'parentSuite'; - var parent = child[parentSuite]; - - if (parent) { - if (typeof this.views.suites[parent.id] == 'undefined') { - this.views.suites[parent.id] = new jasmine.HtmlReporter.SuiteView(parent, this.dom, this.views); - } - parentDiv = this.views.suites[parent.id].element; - } - - parentDiv.appendChild(childElement); -}; - - -jasmine.HtmlReporterHelpers.addHelpers = function(ctor) { - for(var fn in jasmine.HtmlReporterHelpers) { - ctor.prototype[fn] = jasmine.HtmlReporterHelpers[fn]; - } -}; - -jasmine.HtmlReporter = function(_doc) { - var self = this; - var doc = _doc || window.document; - - var reporterView; - - var dom = {}; - - // Jasmine Reporter Public Interface - self.logRunningSpecs = false; - - self.reportRunnerStarting = function(runner) { - var specs = runner.specs() || []; - - if (specs.length == 0) { - return; - } - - createReporterDom(runner.env.versionString()); - doc.body.appendChild(dom.reporter); - setExceptionHandling(); - - reporterView = new jasmine.HtmlReporter.ReporterView(dom); - reporterView.addSpecs(specs, self.specFilter); - }; - - self.reportRunnerResults = function(runner) { - reporterView && reporterView.complete(); - }; - - self.reportSuiteResults = function(suite) { - reporterView.suiteComplete(suite); - }; - - self.reportSpecStarting = function(spec) { - if (self.logRunningSpecs) { - self.log('>> Jasmine Running ' + spec.suite.description + ' ' + spec.description + '...'); - } - }; - - self.reportSpecResults = function(spec) { - reporterView.specComplete(spec); - }; - - self.log = function() { - var console = jasmine.getGlobal().console; - if (console && console.log) { - if (console.log.apply) { - console.log.apply(console, arguments); - } else { - console.log(arguments); // ie fix: console.log.apply doesn't exist on ie - } - } - }; - - self.specFilter = function(spec) { - if (!focusedSpecName()) { - return true; - } - - return spec.getFullName().indexOf(focusedSpecName()) === 0; - }; - - return self; - - function focusedSpecName() { - var specName; - - (function memoizeFocusedSpec() { - if (specName) { - return; - } - - var paramMap = []; - var params = jasmine.HtmlReporter.parameters(doc); - - for (var i = 0; i < params.length; i++) { - var p = params[i].split('='); - paramMap[decodeURIComponent(p[0])] = decodeURIComponent(p[1]); - } - - specName = paramMap.spec; - })(); - - return specName; - } - - function createReporterDom(version) { - dom.reporter = self.createDom('div', { id: 'HTMLReporter', className: 'jasmine_reporter' }, - dom.banner = self.createDom('div', { className: 'banner' }, - self.createDom('span', { className: 'title' }, "Jasmine "), - self.createDom('span', { className: 'version' }, version)), - - dom.symbolSummary = self.createDom('ul', {className: 'symbolSummary'}), - dom.alert = self.createDom('div', {className: 'alert'}, - self.createDom('span', { className: 'exceptions' }, - self.createDom('label', { className: 'label', 'for': 'no_try_catch' }, 'No try/catch'), - self.createDom('input', { id: 'no_try_catch', type: 'checkbox' }))), - dom.results = self.createDom('div', {className: 'results'}, - dom.summary = self.createDom('div', { className: 'summary' }), - dom.details = self.createDom('div', { id: 'details' })) - ); - } - - function noTryCatch() { - return window.location.search.match(/catch=false/); - } - - function searchWithCatch() { - var params = jasmine.HtmlReporter.parameters(window.document); - var removed = false; - var i = 0; - - while (!removed && i < params.length) { - if (params[i].match(/catch=/)) { - params.splice(i, 1); - removed = true; - } - i++; - } - if (jasmine.CATCH_EXCEPTIONS) { - params.push("catch=false"); - } - - return params.join("&"); - } - - function setExceptionHandling() { - var chxCatch = document.getElementById('no_try_catch'); - - if (noTryCatch()) { - chxCatch.setAttribute('checked', true); - jasmine.CATCH_EXCEPTIONS = false; - } - chxCatch.onclick = function() { - window.location.search = searchWithCatch(); - }; - } -}; -jasmine.HtmlReporter.parameters = function(doc) { - var paramStr = doc.location.search.substring(1); - var params = []; - - if (paramStr.length > 0) { - params = paramStr.split('&'); - } - return params; -} -jasmine.HtmlReporter.sectionLink = function(sectionName) { - var link = '?'; - var params = []; - - if (sectionName) { - params.push('spec=' + encodeURIComponent(sectionName)); - } - if (!jasmine.CATCH_EXCEPTIONS) { - params.push("catch=false"); - } - if (params.length > 0) { - link += params.join("&"); - } - - return link; -}; -jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter); -jasmine.HtmlReporter.ReporterView = function(dom) { - this.startedAt = new Date(); - this.runningSpecCount = 0; - this.completeSpecCount = 0; - this.passedCount = 0; - this.failedCount = 0; - this.skippedCount = 0; - - this.createResultsMenu = function() { - this.resultsMenu = this.createDom('span', {className: 'resultsMenu bar'}, - this.summaryMenuItem = this.createDom('a', {className: 'summaryMenuItem', href: "#"}, '0 specs'), - ' | ', - this.detailsMenuItem = this.createDom('a', {className: 'detailsMenuItem', href: "#"}, '0 failing')); - - this.summaryMenuItem.onclick = function() { - dom.reporter.className = dom.reporter.className.replace(/ showDetails/g, ''); - }; - - this.detailsMenuItem.onclick = function() { - showDetails(); - }; - }; - - this.addSpecs = function(specs, specFilter) { - this.totalSpecCount = specs.length; - - this.views = { - specs: {}, - suites: {} - }; - - for (var i = 0; i < specs.length; i++) { - var spec = specs[i]; - this.views.specs[spec.id] = new jasmine.HtmlReporter.SpecView(spec, dom, this.views); - if (specFilter(spec)) { - this.runningSpecCount++; - } - } - }; - - this.specComplete = function(spec) { - this.completeSpecCount++; - - if (isUndefined(this.views.specs[spec.id])) { - this.views.specs[spec.id] = new jasmine.HtmlReporter.SpecView(spec, dom); - } - - var specView = this.views.specs[spec.id]; - - switch (specView.status()) { - case 'passed': - this.passedCount++; - break; - - case 'failed': - this.failedCount++; - break; - - case 'skipped': - this.skippedCount++; - break; - } - - specView.refresh(); - this.refresh(); - }; - - this.suiteComplete = function(suite) { - var suiteView = this.views.suites[suite.id]; - if (isUndefined(suiteView)) { - return; - } - suiteView.refresh(); - }; - - this.refresh = function() { - - if (isUndefined(this.resultsMenu)) { - this.createResultsMenu(); - } - - // currently running UI - if (isUndefined(this.runningAlert)) { - this.runningAlert = this.createDom('a', { href: jasmine.HtmlReporter.sectionLink(), className: "runningAlert bar" }); - dom.alert.appendChild(this.runningAlert); - } - this.runningAlert.innerHTML = "Running " + this.completeSpecCount + " of " + specPluralizedFor(this.totalSpecCount); - - // skipped specs UI - if (isUndefined(this.skippedAlert)) { - this.skippedAlert = this.createDom('a', { href: jasmine.HtmlReporter.sectionLink(), className: "skippedAlert bar" }); - } - - this.skippedAlert.innerHTML = "Skipping " + this.skippedCount + " of " + specPluralizedFor(this.totalSpecCount) + " - run all"; - - if (this.skippedCount === 1 && isDefined(dom.alert)) { - dom.alert.appendChild(this.skippedAlert); - } - - // passing specs UI - if (isUndefined(this.passedAlert)) { - this.passedAlert = this.createDom('span', { href: jasmine.HtmlReporter.sectionLink(), className: "passingAlert bar" }); - } - this.passedAlert.innerHTML = "Passing " + specPluralizedFor(this.passedCount); - - // failing specs UI - if (isUndefined(this.failedAlert)) { - this.failedAlert = this.createDom('span', {href: "?", className: "failingAlert bar"}); - } - this.failedAlert.innerHTML = "Failing " + specPluralizedFor(this.failedCount); - - if (this.failedCount === 1 && isDefined(dom.alert)) { - dom.alert.appendChild(this.failedAlert); - dom.alert.appendChild(this.resultsMenu); - } - - // summary info - this.summaryMenuItem.innerHTML = "" + specPluralizedFor(this.runningSpecCount); - this.detailsMenuItem.innerHTML = "" + this.failedCount + " failing"; - }; - - this.complete = function() { - dom.alert.removeChild(this.runningAlert); - - this.skippedAlert.innerHTML = "Ran " + this.runningSpecCount + " of " + specPluralizedFor(this.totalSpecCount) + " - run all"; - - if (this.failedCount === 0) { - dom.alert.appendChild(this.createDom('span', {className: 'passingAlert bar'}, "Passing " + specPluralizedFor(this.passedCount))); - } else { - showDetails(); - } - - dom.banner.appendChild(this.createDom('span', {className: 'duration'}, "finished in " + ((new Date().getTime() - this.startedAt.getTime()) / 1000) + "s")); - }; - - return this; - - function showDetails() { - if (dom.reporter.className.search(/showDetails/) === -1) { - dom.reporter.className += " showDetails"; - } - } - - function isUndefined(obj) { - return typeof obj === 'undefined'; - } - - function isDefined(obj) { - return !isUndefined(obj); - } - - function specPluralizedFor(count) { - var str = count + " spec"; - if (count > 1) { - str += "s" - } - return str; - } - -}; - -jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.ReporterView); - - -jasmine.HtmlReporter.SpecView = function(spec, dom, views) { - this.spec = spec; - this.dom = dom; - this.views = views; - - this.symbol = this.createDom('li', { className: 'pending' }); - this.dom.symbolSummary.appendChild(this.symbol); - - this.summary = this.createDom('div', { className: 'specSummary' }, - this.createDom('a', { - className: 'description', - href: jasmine.HtmlReporter.sectionLink(this.spec.getFullName()), - title: this.spec.getFullName() - }, this.spec.description) - ); - - this.detail = this.createDom('div', { className: 'specDetail' }, - this.createDom('a', { - className: 'description', - href: '?spec=' + encodeURIComponent(this.spec.getFullName()), - title: this.spec.getFullName() - }, this.spec.getFullName()) - ); -}; - -jasmine.HtmlReporter.SpecView.prototype.status = function() { - return this.getSpecStatus(this.spec); -}; - -jasmine.HtmlReporter.SpecView.prototype.refresh = function() { - this.symbol.className = this.status(); - - switch (this.status()) { - case 'skipped': - break; - - case 'passed': - this.appendSummaryToSuiteDiv(); - break; - - case 'failed': - this.appendSummaryToSuiteDiv(); - this.appendFailureDetail(); - break; - } -}; - -jasmine.HtmlReporter.SpecView.prototype.appendSummaryToSuiteDiv = function() { - this.summary.className += ' ' + this.status(); - this.appendToSummary(this.spec, this.summary); -}; - -jasmine.HtmlReporter.SpecView.prototype.appendFailureDetail = function() { - this.detail.className += ' ' + this.status(); - - var resultItems = this.spec.results().getItems(); - var messagesDiv = this.createDom('div', { className: 'messages' }); - - for (var i = 0; i < resultItems.length; i++) { - var result = resultItems[i]; - - if (result.type == 'log') { - messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage log'}, result.toString())); - } else if (result.type == 'expect' && result.passed && !result.passed()) { - messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage fail'}, result.message)); - - if (result.trace.stack) { - messagesDiv.appendChild(this.createDom('div', {className: 'stackTrace'}, result.trace.stack)); - } - } - } - - if (messagesDiv.childNodes.length > 0) { - this.detail.appendChild(messagesDiv); - this.dom.details.appendChild(this.detail); - } -}; - -jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.SpecView);jasmine.HtmlReporter.SuiteView = function(suite, dom, views) { - this.suite = suite; - this.dom = dom; - this.views = views; - - this.element = this.createDom('div', { className: 'suite' }, - this.createDom('a', { className: 'description', href: jasmine.HtmlReporter.sectionLink(this.suite.getFullName()) }, this.suite.description) - ); - - this.appendToSummary(this.suite, this.element); -}; - -jasmine.HtmlReporter.SuiteView.prototype.status = function() { - return this.getSpecStatus(this.suite); -}; - -jasmine.HtmlReporter.SuiteView.prototype.refresh = function() { - this.element.className += " " + this.status(); -}; - -jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.SuiteView); - -/* @deprecated Use jasmine.HtmlReporter instead - */ -jasmine.TrivialReporter = function(doc) { - this.document = doc || document; - this.suiteDivs = {}; - this.logRunningSpecs = false; -}; - -jasmine.TrivialReporter.prototype.createDom = function(type, attrs, childrenVarArgs) { - var el = document.createElement(type); - - for (var i = 2; i < arguments.length; i++) { - var child = arguments[i]; - - if (typeof child === 'string') { - el.appendChild(document.createTextNode(child)); - } else { - if (child) { el.appendChild(child); } - } - } - - for (var attr in attrs) { - if (attr == "className") { - el[attr] = attrs[attr]; - } else { - el.setAttribute(attr, attrs[attr]); - } - } - - return el; -}; - -jasmine.TrivialReporter.prototype.reportRunnerStarting = function(runner) { - var showPassed, showSkipped; - - this.outerDiv = this.createDom('div', { id: 'TrivialReporter', className: 'jasmine_reporter' }, - this.createDom('div', { className: 'banner' }, - this.createDom('div', { className: 'logo' }, - this.createDom('span', { className: 'title' }, "Jasmine"), - this.createDom('span', { className: 'version' }, runner.env.versionString())), - this.createDom('div', { className: 'options' }, - "Show ", - showPassed = this.createDom('input', { id: "__jasmine_TrivialReporter_showPassed__", type: 'checkbox' }), - this.createDom('label', { "for": "__jasmine_TrivialReporter_showPassed__" }, " passed "), - showSkipped = this.createDom('input', { id: "__jasmine_TrivialReporter_showSkipped__", type: 'checkbox' }), - this.createDom('label', { "for": "__jasmine_TrivialReporter_showSkipped__" }, " skipped") - ) - ), - - this.runnerDiv = this.createDom('div', { className: 'runner running' }, - this.createDom('a', { className: 'run_spec', href: '?' }, "run all"), - this.runnerMessageSpan = this.createDom('span', {}, "Running..."), - this.finishedAtSpan = this.createDom('span', { className: 'finished-at' }, "")) - ); - - this.document.body.appendChild(this.outerDiv); - - var suites = runner.suites(); - for (var i = 0; i < suites.length; i++) { - var suite = suites[i]; - var suiteDiv = this.createDom('div', { className: 'suite' }, - this.createDom('a', { className: 'run_spec', href: '?spec=' + encodeURIComponent(suite.getFullName()) }, "run"), - this.createDom('a', { className: 'description', href: '?spec=' + encodeURIComponent(suite.getFullName()) }, suite.description)); - this.suiteDivs[suite.id] = suiteDiv; - var parentDiv = this.outerDiv; - if (suite.parentSuite) { - parentDiv = this.suiteDivs[suite.parentSuite.id]; - } - parentDiv.appendChild(suiteDiv); - } - - this.startedAt = new Date(); - - var self = this; - showPassed.onclick = function(evt) { - if (showPassed.checked) { - self.outerDiv.className += ' show-passed'; - } else { - self.outerDiv.className = self.outerDiv.className.replace(/ show-passed/, ''); - } - }; - - showSkipped.onclick = function(evt) { - if (showSkipped.checked) { - self.outerDiv.className += ' show-skipped'; - } else { - self.outerDiv.className = self.outerDiv.className.replace(/ show-skipped/, ''); - } - }; -}; - -jasmine.TrivialReporter.prototype.reportRunnerResults = function(runner) { - var results = runner.results(); - var className = (results.failedCount > 0) ? "runner failed" : "runner passed"; - this.runnerDiv.setAttribute("class", className); - //do it twice for IE - this.runnerDiv.setAttribute("className", className); - var specs = runner.specs(); - var specCount = 0; - for (var i = 0; i < specs.length; i++) { - if (this.specFilter(specs[i])) { - specCount++; - } - } - var message = "" + specCount + " spec" + (specCount == 1 ? "" : "s" ) + ", " + results.failedCount + " failure" + ((results.failedCount == 1) ? "" : "s"); - message += " in " + ((new Date().getTime() - this.startedAt.getTime()) / 1000) + "s"; - this.runnerMessageSpan.replaceChild(this.createDom('a', { className: 'description', href: '?'}, message), this.runnerMessageSpan.firstChild); - - this.finishedAtSpan.appendChild(document.createTextNode("Finished at " + new Date().toString())); -}; - -jasmine.TrivialReporter.prototype.reportSuiteResults = function(suite) { - var results = suite.results(); - var status = results.passed() ? 'passed' : 'failed'; - if (results.totalCount === 0) { // todo: change this to check results.skipped - status = 'skipped'; - } - this.suiteDivs[suite.id].className += " " + status; -}; - -jasmine.TrivialReporter.prototype.reportSpecStarting = function(spec) { - if (this.logRunningSpecs) { - this.log('>> Jasmine Running ' + spec.suite.description + ' ' + spec.description + '...'); - } -}; - -jasmine.TrivialReporter.prototype.reportSpecResults = function(spec) { - var results = spec.results(); - var status = results.passed() ? 'passed' : 'failed'; - if (results.skipped) { - status = 'skipped'; - } - var specDiv = this.createDom('div', { className: 'spec ' + status }, - this.createDom('a', { className: 'run_spec', href: '?spec=' + encodeURIComponent(spec.getFullName()) }, "run"), - this.createDom('a', { - className: 'description', - href: '?spec=' + encodeURIComponent(spec.getFullName()), - title: spec.getFullName() - }, spec.description)); - - - var resultItems = results.getItems(); - var messagesDiv = this.createDom('div', { className: 'messages' }); - for (var i = 0; i < resultItems.length; i++) { - var result = resultItems[i]; - - if (result.type == 'log') { - messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage log'}, result.toString())); - } else if (result.type == 'expect' && result.passed && !result.passed()) { - messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage fail'}, result.message)); - - if (result.trace.stack) { - messagesDiv.appendChild(this.createDom('div', {className: 'stackTrace'}, result.trace.stack)); - } - } - } - - if (messagesDiv.childNodes.length > 0) { - specDiv.appendChild(messagesDiv); - } - - this.suiteDivs[spec.suite.id].appendChild(specDiv); -}; - -jasmine.TrivialReporter.prototype.log = function() { - var console = jasmine.getGlobal().console; - if (console && console.log) { - if (console.log.apply) { - console.log.apply(console, arguments); - } else { - console.log(arguments); // ie fix: console.log.apply doesn't exist on ie - } - } -}; - -jasmine.TrivialReporter.prototype.getLocation = function() { - return this.document.location; -}; - -jasmine.TrivialReporter.prototype.specFilter = function(spec) { - var paramMap = {}; - var params = this.getLocation().search.substring(1).split('&'); - for (var i = 0; i < params.length; i++) { - var p = params[i].split('='); - paramMap[decodeURIComponent(p[0])] = decodeURIComponent(p[1]); - } - - if (!paramMap.spec) { - return true; - } - return spec.getFullName().indexOf(paramMap.spec) === 0; -}; diff --git a/test/jasmine/jasmine.css b/test/jasmine/jasmine.css deleted file mode 100644 index 8c008dc..0000000 --- a/test/jasmine/jasmine.css +++ /dev/null @@ -1,82 +0,0 @@ -body { background-color: #eeeeee; padding: 0; margin: 5px; overflow-y: scroll; } - -#HTMLReporter { font-size: 11px; font-family: Monaco, "Lucida Console", monospace; line-height: 14px; color: #333333; } -#HTMLReporter a { text-decoration: none; } -#HTMLReporter a:hover { text-decoration: underline; } -#HTMLReporter p, #HTMLReporter h1, #HTMLReporter h2, #HTMLReporter h3, #HTMLReporter h4, #HTMLReporter h5, #HTMLReporter h6 { margin: 0; line-height: 14px; } -#HTMLReporter .banner, #HTMLReporter .symbolSummary, #HTMLReporter .summary, #HTMLReporter .resultMessage, #HTMLReporter .specDetail .description, #HTMLReporter .alert .bar, #HTMLReporter .stackTrace { padding-left: 9px; padding-right: 9px; } -#HTMLReporter #jasmine_content { position: fixed; right: 100%; } -#HTMLReporter .version { color: #aaaaaa; } -#HTMLReporter .banner { margin-top: 14px; } -#HTMLReporter .duration { color: #aaaaaa; float: right; } -#HTMLReporter .symbolSummary { overflow: hidden; *zoom: 1; margin: 14px 0; } -#HTMLReporter .symbolSummary li { display: block; float: left; height: 7px; width: 14px; margin-bottom: 7px; font-size: 16px; } -#HTMLReporter .symbolSummary li.passed { font-size: 14px; } -#HTMLReporter .symbolSummary li.passed:before { color: #5e7d00; content: "\02022"; } -#HTMLReporter .symbolSummary li.failed { line-height: 9px; } -#HTMLReporter .symbolSummary li.failed:before { color: #b03911; content: "x"; font-weight: bold; margin-left: -1px; } -#HTMLReporter .symbolSummary li.skipped { font-size: 14px; } -#HTMLReporter .symbolSummary li.skipped:before { color: #bababa; content: "\02022"; } -#HTMLReporter .symbolSummary li.pending { line-height: 11px; } -#HTMLReporter .symbolSummary li.pending:before { color: #aaaaaa; content: "-"; } -#HTMLReporter .exceptions { color: #fff; float: right; margin-top: 5px; margin-right: 5px; } -#HTMLReporter .bar { line-height: 28px; font-size: 14px; display: block; color: #eee; } -#HTMLReporter .runningAlert { background-color: #666666; } -#HTMLReporter .skippedAlert { background-color: #aaaaaa; } -#HTMLReporter .skippedAlert:first-child { background-color: #333333; } -#HTMLReporter .skippedAlert:hover { text-decoration: none; color: white; text-decoration: underline; } -#HTMLReporter .passingAlert { background-color: #a6b779; } -#HTMLReporter .passingAlert:first-child { background-color: #5e7d00; } -#HTMLReporter .failingAlert { background-color: #cf867e; } -#HTMLReporter .failingAlert:first-child { background-color: #b03911; } -#HTMLReporter .results { margin-top: 14px; } -#HTMLReporter #details { display: none; } -#HTMLReporter .resultsMenu, #HTMLReporter .resultsMenu a { background-color: #fff; color: #333333; } -#HTMLReporter.showDetails .summaryMenuItem { font-weight: normal; text-decoration: inherit; } -#HTMLReporter.showDetails .summaryMenuItem:hover { text-decoration: underline; } -#HTMLReporter.showDetails .detailsMenuItem { font-weight: bold; text-decoration: underline; } -#HTMLReporter.showDetails .summary { display: none; } -#HTMLReporter.showDetails #details { display: block; } -#HTMLReporter .summaryMenuItem { font-weight: bold; text-decoration: underline; } -#HTMLReporter .summary { margin-top: 14px; } -#HTMLReporter .summary .suite .suite, #HTMLReporter .summary .specSummary { margin-left: 14px; } -#HTMLReporter .summary .specSummary.passed a { color: #5e7d00; } -#HTMLReporter .summary .specSummary.failed a { color: #b03911; } -#HTMLReporter .description + .suite { margin-top: 0; } -#HTMLReporter .suite { margin-top: 14px; } -#HTMLReporter .suite a { color: #333333; } -#HTMLReporter #details .specDetail { margin-bottom: 28px; } -#HTMLReporter #details .specDetail .description { display: block; color: white; background-color: #b03911; } -#HTMLReporter .resultMessage { padding-top: 14px; color: #333333; } -#HTMLReporter .resultMessage span.result { display: block; } -#HTMLReporter .stackTrace { margin: 5px 0 0 0; max-height: 224px; overflow: auto; line-height: 18px; color: #666666; border: 1px solid #ddd; background: white; white-space: pre; } - -#TrivialReporter { padding: 8px 13px; position: absolute; top: 0; bottom: 0; left: 0; right: 0; overflow-y: scroll; background-color: white; font-family: "Helvetica Neue Light", "Lucida Grande", "Calibri", "Arial", sans-serif; /*.resultMessage {*/ /*white-space: pre;*/ /*}*/ } -#TrivialReporter a:visited, #TrivialReporter a { color: #303; } -#TrivialReporter a:hover, #TrivialReporter a:active { color: blue; } -#TrivialReporter .run_spec { float: right; padding-right: 5px; font-size: .8em; text-decoration: none; } -#TrivialReporter .banner { color: #303; background-color: #fef; padding: 5px; } -#TrivialReporter .logo { float: left; font-size: 1.1em; padding-left: 5px; } -#TrivialReporter .logo .version { font-size: .6em; padding-left: 1em; } -#TrivialReporter .runner.running { background-color: yellow; } -#TrivialReporter .options { text-align: right; font-size: .8em; } -#TrivialReporter .suite { border: 1px outset gray; margin: 5px 0; padding-left: 1em; } -#TrivialReporter .suite .suite { margin: 5px; } -#TrivialReporter .suite.passed { background-color: #dfd; } -#TrivialReporter .suite.failed { background-color: #fdd; } -#TrivialReporter .spec { margin: 5px; padding-left: 1em; clear: both; } -#TrivialReporter .spec.failed, #TrivialReporter .spec.passed, #TrivialReporter .spec.skipped { padding-bottom: 5px; border: 1px solid gray; } -#TrivialReporter .spec.failed { background-color: #fbb; border-color: red; } -#TrivialReporter .spec.passed { background-color: #bfb; border-color: green; } -#TrivialReporter .spec.skipped { background-color: #bbb; } -#TrivialReporter .messages { border-left: 1px dashed gray; padding-left: 1em; padding-right: 1em; } -#TrivialReporter .passed { background-color: #cfc; display: none; } -#TrivialReporter .failed { background-color: #fbb; } -#TrivialReporter .skipped { color: #777; background-color: #eee; display: none; } -#TrivialReporter .resultMessage span.result { display: block; line-height: 2em; color: black; } -#TrivialReporter .resultMessage .mismatch { color: black; } -#TrivialReporter .stackTrace { white-space: pre; font-size: .8em; margin-left: 10px; max-height: 5em; overflow: auto; border: 1px inset red; padding: 1em; background: #eef; } -#TrivialReporter .finished-at { padding-left: 1em; font-size: .6em; } -#TrivialReporter.show-passed .passed, #TrivialReporter.show-skipped .skipped { display: block; } -#TrivialReporter #jasmine_content { position: fixed; right: 100%; } -#TrivialReporter .runner { border: 1px solid gray; display: block; margin: 5px 0; padding: 2px 0 2px 10px; } diff --git a/test/jasmine/jasmine.js b/test/jasmine/jasmine.js deleted file mode 100644 index 6b3459b..0000000 --- a/test/jasmine/jasmine.js +++ /dev/null @@ -1,2600 +0,0 @@ -var isCommonJS = typeof window == "undefined" && typeof exports == "object"; - -/** - * Top level namespace for Jasmine, a lightweight JavaScript BDD/spec/testing framework. - * - * @namespace - */ -var jasmine = {}; -if (isCommonJS) exports.jasmine = jasmine; -/** - * @private - */ -jasmine.unimplementedMethod_ = function() { - throw new Error("unimplemented method"); -}; - -/** - * Use jasmine.undefined instead of undefined, since undefined is just - * a plain old variable and may be redefined by somebody else. - * - * @private - */ -jasmine.undefined = jasmine.___undefined___; - -/** - * Show diagnostic messages in the console if set to true - * - */ -jasmine.VERBOSE = false; - -/** - * Default interval in milliseconds for event loop yields (e.g. to allow network activity or to refresh the screen with the HTML-based runner). Small values here may result in slow test running. Zero means no updates until all tests have completed. - * - */ -jasmine.DEFAULT_UPDATE_INTERVAL = 250; - -/** - * Maximum levels of nesting that will be included when an object is pretty-printed - */ -jasmine.MAX_PRETTY_PRINT_DEPTH = 40; - -/** - * Default timeout interval in milliseconds for waitsFor() blocks. - */ -jasmine.DEFAULT_TIMEOUT_INTERVAL = 5000; - -/** - * By default exceptions thrown in the context of a test are caught by jasmine so that it can run the remaining tests in the suite. - * Set to false to let the exception bubble up in the browser. - * - */ -jasmine.CATCH_EXCEPTIONS = true; - -jasmine.getGlobal = function() { - function getGlobal() { - return this; - } - - return getGlobal(); -}; - -/** - * Allows for bound functions to be compared. Internal use only. - * - * @ignore - * @private - * @param base {Object} bound 'this' for the function - * @param name {Function} function to find - */ -jasmine.bindOriginal_ = function(base, name) { - var original = base[name]; - if (original.apply) { - return function() { - return original.apply(base, arguments); - }; - } else { - // IE support - return jasmine.getGlobal()[name]; - } -}; - -jasmine.setTimeout = jasmine.bindOriginal_(jasmine.getGlobal(), 'setTimeout'); -jasmine.clearTimeout = jasmine.bindOriginal_(jasmine.getGlobal(), 'clearTimeout'); -jasmine.setInterval = jasmine.bindOriginal_(jasmine.getGlobal(), 'setInterval'); -jasmine.clearInterval = jasmine.bindOriginal_(jasmine.getGlobal(), 'clearInterval'); - -jasmine.MessageResult = function(values) { - this.type = 'log'; - this.values = values; - this.trace = new Error(); // todo: test better -}; - -jasmine.MessageResult.prototype.toString = function() { - var text = ""; - for (var i = 0; i < this.values.length; i++) { - if (i > 0) text += " "; - if (jasmine.isString_(this.values[i])) { - text += this.values[i]; - } else { - text += jasmine.pp(this.values[i]); - } - } - return text; -}; - -jasmine.ExpectationResult = function(params) { - this.type = 'expect'; - this.matcherName = params.matcherName; - this.passed_ = params.passed; - this.expected = params.expected; - this.actual = params.actual; - this.message = this.passed_ ? 'Passed.' : params.message; - - var trace = (params.trace || new Error(this.message)); - this.trace = this.passed_ ? '' : trace; -}; - -jasmine.ExpectationResult.prototype.toString = function () { - return this.message; -}; - -jasmine.ExpectationResult.prototype.passed = function () { - return this.passed_; -}; - -/** - * Getter for the Jasmine environment. Ensures one gets created - */ -jasmine.getEnv = function() { - var env = jasmine.currentEnv_ = jasmine.currentEnv_ || new jasmine.Env(); - return env; -}; - -/** - * @ignore - * @private - * @param value - * @returns {Boolean} - */ -jasmine.isArray_ = function(value) { - return jasmine.isA_("Array", value); -}; - -/** - * @ignore - * @private - * @param value - * @returns {Boolean} - */ -jasmine.isString_ = function(value) { - return jasmine.isA_("String", value); -}; - -/** - * @ignore - * @private - * @param value - * @returns {Boolean} - */ -jasmine.isNumber_ = function(value) { - return jasmine.isA_("Number", value); -}; - -/** - * @ignore - * @private - * @param {String} typeName - * @param value - * @returns {Boolean} - */ -jasmine.isA_ = function(typeName, value) { - return Object.prototype.toString.apply(value) === '[object ' + typeName + ']'; -}; - -/** - * Pretty printer for expecations. Takes any object and turns it into a human-readable string. - * - * @param value {Object} an object to be outputted - * @returns {String} - */ -jasmine.pp = function(value) { - var stringPrettyPrinter = new jasmine.StringPrettyPrinter(); - stringPrettyPrinter.format(value); - return stringPrettyPrinter.string; -}; - -/** - * Returns true if the object is a DOM Node. - * - * @param {Object} obj object to check - * @returns {Boolean} - */ -jasmine.isDomNode = function(obj) { - return obj.nodeType > 0; -}; - -/** - * Returns a matchable 'generic' object of the class type. For use in expecations of type when values don't matter. - * - * @example - * // don't care about which function is passed in, as long as it's a function - * expect(mySpy).toHaveBeenCalledWith(jasmine.any(Function)); - * - * @param {Class} clazz - * @returns matchable object of the type clazz - */ -jasmine.any = function(clazz) { - return new jasmine.Matchers.Any(clazz); -}; - -/** - * Returns a matchable subset of a JSON object. For use in expectations when you don't care about all of the - * attributes on the object. - * - * @example - * // don't care about any other attributes than foo. - * expect(mySpy).toHaveBeenCalledWith(jasmine.objectContaining({foo: "bar"}); - * - * @param sample {Object} sample - * @returns matchable object for the sample - */ -jasmine.objectContaining = function (sample) { - return new jasmine.Matchers.ObjectContaining(sample); -}; - -/** - * Jasmine Spies are test doubles that can act as stubs, spies, fakes or when used in an expecation, mocks. - * - * Spies should be created in test setup, before expectations. They can then be checked, using the standard Jasmine - * expectation syntax. Spies can be checked if they were called or not and what the calling params were. - * - * A Spy has the following fields: wasCalled, callCount, mostRecentCall, and argsForCall (see docs). - * - * Spies are torn down at the end of every spec. - * - * Note: Do not call new jasmine.Spy() directly - a spy must be created using spyOn, jasmine.createSpy or jasmine.createSpyObj. - * - * @example - * // a stub - * var myStub = jasmine.createSpy('myStub'); // can be used anywhere - * - * // spy example - * var foo = { - * not: function(bool) { return !bool; } - * } - * - * // actual foo.not will not be called, execution stops - * spyOn(foo, 'not'); - - // foo.not spied upon, execution will continue to implementation - * spyOn(foo, 'not').andCallThrough(); - * - * // fake example - * var foo = { - * not: function(bool) { return !bool; } - * } - * - * // foo.not(val) will return val - * spyOn(foo, 'not').andCallFake(function(value) {return value;}); - * - * // mock example - * foo.not(7 == 7); - * expect(foo.not).toHaveBeenCalled(); - * expect(foo.not).toHaveBeenCalledWith(true); - * - * @constructor - * @see spyOn, jasmine.createSpy, jasmine.createSpyObj - * @param {String} name - */ -jasmine.Spy = function(name) { - /** - * The name of the spy, if provided. - */ - this.identity = name || 'unknown'; - /** - * Is this Object a spy? - */ - this.isSpy = true; - /** - * The actual function this spy stubs. - */ - this.plan = function() { - }; - /** - * Tracking of the most recent call to the spy. - * @example - * var mySpy = jasmine.createSpy('foo'); - * mySpy(1, 2); - * mySpy.mostRecentCall.args = [1, 2]; - */ - this.mostRecentCall = {}; - - /** - * Holds arguments for each call to the spy, indexed by call count - * @example - * var mySpy = jasmine.createSpy('foo'); - * mySpy(1, 2); - * mySpy(7, 8); - * mySpy.mostRecentCall.args = [7, 8]; - * mySpy.argsForCall[0] = [1, 2]; - * mySpy.argsForCall[1] = [7, 8]; - */ - this.argsForCall = []; - this.calls = []; -}; - -/** - * Tells a spy to call through to the actual implemenatation. - * - * @example - * var foo = { - * bar: function() { // do some stuff } - * } - * - * // defining a spy on an existing property: foo.bar - * spyOn(foo, 'bar').andCallThrough(); - */ -jasmine.Spy.prototype.andCallThrough = function() { - this.plan = this.originalValue; - return this; -}; - -/** - * For setting the return value of a spy. - * - * @example - * // defining a spy from scratch: foo() returns 'baz' - * var foo = jasmine.createSpy('spy on foo').andReturn('baz'); - * - * // defining a spy on an existing property: foo.bar() returns 'baz' - * spyOn(foo, 'bar').andReturn('baz'); - * - * @param {Object} value - */ -jasmine.Spy.prototype.andReturn = function(value) { - this.plan = function() { - return value; - }; - return this; -}; - -/** - * For throwing an exception when a spy is called. - * - * @example - * // defining a spy from scratch: foo() throws an exception w/ message 'ouch' - * var foo = jasmine.createSpy('spy on foo').andThrow('baz'); - * - * // defining a spy on an existing property: foo.bar() throws an exception w/ message 'ouch' - * spyOn(foo, 'bar').andThrow('baz'); - * - * @param {String} exceptionMsg - */ -jasmine.Spy.prototype.andThrow = function(exceptionMsg) { - this.plan = function() { - throw exceptionMsg; - }; - return this; -}; - -/** - * Calls an alternate implementation when a spy is called. - * - * @example - * var baz = function() { - * // do some stuff, return something - * } - * // defining a spy from scratch: foo() calls the function baz - * var foo = jasmine.createSpy('spy on foo').andCall(baz); - * - * // defining a spy on an existing property: foo.bar() calls an anonymnous function - * spyOn(foo, 'bar').andCall(function() { return 'baz';} ); - * - * @param {Function} fakeFunc - */ -jasmine.Spy.prototype.andCallFake = function(fakeFunc) { - this.plan = fakeFunc; - return this; -}; - -/** - * Resets all of a spy's the tracking variables so that it can be used again. - * - * @example - * spyOn(foo, 'bar'); - * - * foo.bar(); - * - * expect(foo.bar.callCount).toEqual(1); - * - * foo.bar.reset(); - * - * expect(foo.bar.callCount).toEqual(0); - */ -jasmine.Spy.prototype.reset = function() { - this.wasCalled = false; - this.callCount = 0; - this.argsForCall = []; - this.calls = []; - this.mostRecentCall = {}; -}; - -jasmine.createSpy = function(name) { - - var spyObj = function() { - spyObj.wasCalled = true; - spyObj.callCount++; - var args = jasmine.util.argsToArray(arguments); - spyObj.mostRecentCall.object = this; - spyObj.mostRecentCall.args = args; - spyObj.argsForCall.push(args); - spyObj.calls.push({object: this, args: args}); - return spyObj.plan.apply(this, arguments); - }; - - var spy = new jasmine.Spy(name); - - for (var prop in spy) { - spyObj[prop] = spy[prop]; - } - - spyObj.reset(); - - return spyObj; -}; - -/** - * Determines whether an object is a spy. - * - * @param {jasmine.Spy|Object} putativeSpy - * @returns {Boolean} - */ -jasmine.isSpy = function(putativeSpy) { - return putativeSpy && putativeSpy.isSpy; -}; - -/** - * Creates a more complicated spy: an Object that has every property a function that is a spy. Used for stubbing something - * large in one call. - * - * @param {String} baseName name of spy class - * @param {Array} methodNames array of names of methods to make spies - */ -jasmine.createSpyObj = function(baseName, methodNames) { - if (!jasmine.isArray_(methodNames) || methodNames.length === 0) { - throw new Error('createSpyObj requires a non-empty array of method names to create spies for'); - } - var obj = {}; - for (var i = 0; i < methodNames.length; i++) { - obj[methodNames[i]] = jasmine.createSpy(baseName + '.' + methodNames[i]); - } - return obj; -}; - -/** - * All parameters are pretty-printed and concatenated together, then written to the current spec's output. - * - * Be careful not to leave calls to jasmine.log in production code. - */ -jasmine.log = function() { - var spec = jasmine.getEnv().currentSpec; - spec.log.apply(spec, arguments); -}; - -/** - * Function that installs a spy on an existing object's method name. Used within a Spec to create a spy. - * - * @example - * // spy example - * var foo = { - * not: function(bool) { return !bool; } - * } - * spyOn(foo, 'not'); // actual foo.not will not be called, execution stops - * - * @see jasmine.createSpy - * @param obj - * @param methodName - * @return {jasmine.Spy} a Jasmine spy that can be chained with all spy methods - */ -var spyOn = function(obj, methodName) { - return jasmine.getEnv().currentSpec.spyOn(obj, methodName); -}; -if (isCommonJS) exports.spyOn = spyOn; - -/** - * Creates a Jasmine spec that will be added to the current suite. - * - * // TODO: pending tests - * - * @example - * it('should be true', function() { - * expect(true).toEqual(true); - * }); - * - * @param {String} desc description of this specification - * @param {Function} func defines the preconditions and expectations of the spec - */ -var it = function(desc, func) { - return jasmine.getEnv().it(desc, func); -}; -if (isCommonJS) exports.it = it; - -/** - * Creates a disabled Jasmine spec. - * - * A convenience method that allows existing specs to be disabled temporarily during development. - * - * @param {String} desc description of this specification - * @param {Function} func defines the preconditions and expectations of the spec - */ -var xit = function(desc, func) { - return jasmine.getEnv().xit(desc, func); -}; -if (isCommonJS) exports.xit = xit; - -/** - * Starts a chain for a Jasmine expectation. - * - * It is passed an Object that is the actual value and should chain to one of the many - * jasmine.Matchers functions. - * - * @param {Object} actual Actual value to test against and expected value - * @return {jasmine.Matchers} - */ -var expect = function(actual) { - return jasmine.getEnv().currentSpec.expect(actual); -}; -if (isCommonJS) exports.expect = expect; - -/** - * Defines part of a jasmine spec. Used in cominbination with waits or waitsFor in asynchrnous specs. - * - * @param {Function} func Function that defines part of a jasmine spec. - */ -var runs = function(func) { - jasmine.getEnv().currentSpec.runs(func); -}; -if (isCommonJS) exports.runs = runs; - -/** - * Waits a fixed time period before moving to the next block. - * - * @deprecated Use waitsFor() instead - * @param {Number} timeout milliseconds to wait - */ -var waits = function(timeout) { - jasmine.getEnv().currentSpec.waits(timeout); -}; -if (isCommonJS) exports.waits = waits; - -/** - * Waits for the latchFunction to return true before proceeding to the next block. - * - * @param {Function} latchFunction - * @param {String} optional_timeoutMessage - * @param {Number} optional_timeout - */ -var waitsFor = function(latchFunction, optional_timeoutMessage, optional_timeout) { - jasmine.getEnv().currentSpec.waitsFor.apply(jasmine.getEnv().currentSpec, arguments); -}; -if (isCommonJS) exports.waitsFor = waitsFor; - -/** - * A function that is called before each spec in a suite. - * - * Used for spec setup, including validating assumptions. - * - * @param {Function} beforeEachFunction - */ -var beforeEach = function(beforeEachFunction) { - jasmine.getEnv().beforeEach(beforeEachFunction); -}; -if (isCommonJS) exports.beforeEach = beforeEach; - -/** - * A function that is called after each spec in a suite. - * - * Used for restoring any state that is hijacked during spec execution. - * - * @param {Function} afterEachFunction - */ -var afterEach = function(afterEachFunction) { - jasmine.getEnv().afterEach(afterEachFunction); -}; -if (isCommonJS) exports.afterEach = afterEach; - -/** - * Defines a suite of specifications. - * - * Stores the description and all defined specs in the Jasmine environment as one suite of specs. Variables declared - * are accessible by calls to beforeEach, it, and afterEach. Describe blocks can be nested, allowing for specialization - * of setup in some tests. - * - * @example - * // TODO: a simple suite - * - * // TODO: a simple suite with a nested describe block - * - * @param {String} description A string, usually the class under test. - * @param {Function} specDefinitions function that defines several specs. - */ -var describe = function(description, specDefinitions) { - return jasmine.getEnv().describe(description, specDefinitions); -}; -if (isCommonJS) exports.describe = describe; - -/** - * Disables a suite of specifications. Used to disable some suites in a file, or files, temporarily during development. - * - * @param {String} description A string, usually the class under test. - * @param {Function} specDefinitions function that defines several specs. - */ -var xdescribe = function(description, specDefinitions) { - return jasmine.getEnv().xdescribe(description, specDefinitions); -}; -if (isCommonJS) exports.xdescribe = xdescribe; - - -// Provide the XMLHttpRequest class for IE 5.x-6.x: -jasmine.XmlHttpRequest = (typeof XMLHttpRequest == "undefined") ? function() { - function tryIt(f) { - try { - return f(); - } catch(e) { - } - return null; - } - - var xhr = tryIt(function() { - return new ActiveXObject("Msxml2.XMLHTTP.6.0"); - }) || - tryIt(function() { - return new ActiveXObject("Msxml2.XMLHTTP.3.0"); - }) || - tryIt(function() { - return new ActiveXObject("Msxml2.XMLHTTP"); - }) || - tryIt(function() { - return new ActiveXObject("Microsoft.XMLHTTP"); - }); - - if (!xhr) throw new Error("This browser does not support XMLHttpRequest."); - - return xhr; -} : XMLHttpRequest; -/** - * @namespace - */ -jasmine.util = {}; - -/** - * Declare that a child class inherit it's prototype from the parent class. - * - * @private - * @param {Function} childClass - * @param {Function} parentClass - */ -jasmine.util.inherit = function(childClass, parentClass) { - /** - * @private - */ - var subclass = function() { - }; - subclass.prototype = parentClass.prototype; - childClass.prototype = new subclass(); -}; - -jasmine.util.formatException = function(e) { - var lineNumber; - if (e.line) { - lineNumber = e.line; - } - else if (e.lineNumber) { - lineNumber = e.lineNumber; - } - - var file; - - if (e.sourceURL) { - file = e.sourceURL; - } - else if (e.fileName) { - file = e.fileName; - } - - var message = (e.name && e.message) ? (e.name + ': ' + e.message) : e.toString(); - - if (file && lineNumber) { - message += ' in ' + file + ' (line ' + lineNumber + ')'; - } - - return message; -}; - -jasmine.util.htmlEscape = function(str) { - if (!str) return str; - return str.replace(/&/g, '&') - .replace(//g, '>'); -}; - -jasmine.util.argsToArray = function(args) { - var arrayOfArgs = []; - for (var i = 0; i < args.length; i++) arrayOfArgs.push(args[i]); - return arrayOfArgs; -}; - -jasmine.util.extend = function(destination, source) { - for (var property in source) destination[property] = source[property]; - return destination; -}; - -/** - * Environment for Jasmine - * - * @constructor - */ -jasmine.Env = function() { - this.currentSpec = null; - this.currentSuite = null; - this.currentRunner_ = new jasmine.Runner(this); - - this.reporter = new jasmine.MultiReporter(); - - this.updateInterval = jasmine.DEFAULT_UPDATE_INTERVAL; - this.defaultTimeoutInterval = jasmine.DEFAULT_TIMEOUT_INTERVAL; - this.lastUpdate = 0; - this.specFilter = function() { - return true; - }; - - this.nextSpecId_ = 0; - this.nextSuiteId_ = 0; - this.equalityTesters_ = []; - - // wrap matchers - this.matchersClass = function() { - jasmine.Matchers.apply(this, arguments); - }; - jasmine.util.inherit(this.matchersClass, jasmine.Matchers); - - jasmine.Matchers.wrapInto_(jasmine.Matchers.prototype, this.matchersClass); -}; - - -jasmine.Env.prototype.setTimeout = jasmine.setTimeout; -jasmine.Env.prototype.clearTimeout = jasmine.clearTimeout; -jasmine.Env.prototype.setInterval = jasmine.setInterval; -jasmine.Env.prototype.clearInterval = jasmine.clearInterval; - -/** - * @returns an object containing jasmine version build info, if set. - */ -jasmine.Env.prototype.version = function () { - if (jasmine.version_) { - return jasmine.version_; - } else { - throw new Error('Version not set'); - } -}; - -/** - * @returns string containing jasmine version build info, if set. - */ -jasmine.Env.prototype.versionString = function() { - if (!jasmine.version_) { - return "version unknown"; - } - - var version = this.version(); - var versionString = version.major + "." + version.minor + "." + version.build; - if (version.release_candidate) { - versionString += ".rc" + version.release_candidate; - } - versionString += " revision " + version.revision; - return versionString; -}; - -/** - * @returns a sequential integer starting at 0 - */ -jasmine.Env.prototype.nextSpecId = function () { - return this.nextSpecId_++; -}; - -/** - * @returns a sequential integer starting at 0 - */ -jasmine.Env.prototype.nextSuiteId = function () { - return this.nextSuiteId_++; -}; - -/** - * Register a reporter to receive status updates from Jasmine. - * @param {jasmine.Reporter} reporter An object which will receive status updates. - */ -jasmine.Env.prototype.addReporter = function(reporter) { - this.reporter.addReporter(reporter); -}; - -jasmine.Env.prototype.execute = function() { - this.currentRunner_.execute(); -}; - -jasmine.Env.prototype.describe = function(description, specDefinitions) { - var suite = new jasmine.Suite(this, description, specDefinitions, this.currentSuite); - - var parentSuite = this.currentSuite; - if (parentSuite) { - parentSuite.add(suite); - } else { - this.currentRunner_.add(suite); - } - - this.currentSuite = suite; - - var declarationError = null; - try { - specDefinitions.call(suite); - } catch(e) { - declarationError = e; - } - - if (declarationError) { - this.it("encountered a declaration exception", function() { - throw declarationError; - }); - } - - this.currentSuite = parentSuite; - - return suite; -}; - -jasmine.Env.prototype.beforeEach = function(beforeEachFunction) { - if (this.currentSuite) { - this.currentSuite.beforeEach(beforeEachFunction); - } else { - this.currentRunner_.beforeEach(beforeEachFunction); - } -}; - -jasmine.Env.prototype.currentRunner = function () { - return this.currentRunner_; -}; - -jasmine.Env.prototype.afterEach = function(afterEachFunction) { - if (this.currentSuite) { - this.currentSuite.afterEach(afterEachFunction); - } else { - this.currentRunner_.afterEach(afterEachFunction); - } - -}; - -jasmine.Env.prototype.xdescribe = function(desc, specDefinitions) { - return { - execute: function() { - } - }; -}; - -jasmine.Env.prototype.it = function(description, func) { - var spec = new jasmine.Spec(this, this.currentSuite, description); - this.currentSuite.add(spec); - this.currentSpec = spec; - - if (func) { - spec.runs(func); - } - - return spec; -}; - -jasmine.Env.prototype.xit = function(desc, func) { - return { - id: this.nextSpecId(), - runs: function() { - } - }; -}; - -jasmine.Env.prototype.compareRegExps_ = function(a, b, mismatchKeys, mismatchValues) { - if (a.source != b.source) - mismatchValues.push("expected pattern /" + b.source + "/ is not equal to the pattern /" + a.source + "/"); - - if (a.ignoreCase != b.ignoreCase) - mismatchValues.push("expected modifier i was" + (b.ignoreCase ? " " : " not ") + "set and does not equal the origin modifier"); - - if (a.global != b.global) - mismatchValues.push("expected modifier g was" + (b.global ? " " : " not ") + "set and does not equal the origin modifier"); - - if (a.multiline != b.multiline) - mismatchValues.push("expected modifier m was" + (b.multiline ? " " : " not ") + "set and does not equal the origin modifier"); - - if (a.sticky != b.sticky) - mismatchValues.push("expected modifier y was" + (b.sticky ? " " : " not ") + "set and does not equal the origin modifier"); - - return (mismatchValues.length === 0); -}; - -jasmine.Env.prototype.compareObjects_ = function(a, b, mismatchKeys, mismatchValues) { - if (a.__Jasmine_been_here_before__ === b && b.__Jasmine_been_here_before__ === a) { - return true; - } - - a.__Jasmine_been_here_before__ = b; - b.__Jasmine_been_here_before__ = a; - - var hasKey = function(obj, keyName) { - return obj !== null && obj[keyName] !== jasmine.undefined; - }; - - for (var property in b) { - if (!hasKey(a, property) && hasKey(b, property)) { - mismatchKeys.push("expected has key '" + property + "', but missing from actual."); - } - } - for (property in a) { - if (!hasKey(b, property) && hasKey(a, property)) { - mismatchKeys.push("expected missing key '" + property + "', but present in actual."); - } - } - for (property in b) { - if (property == '__Jasmine_been_here_before__') continue; - if (!this.equals_(a[property], b[property], mismatchKeys, mismatchValues)) { - mismatchValues.push("'" + property + "' was '" + (b[property] ? jasmine.util.htmlEscape(b[property].toString()) : b[property]) + "' in expected, but was '" + (a[property] ? jasmine.util.htmlEscape(a[property].toString()) : a[property]) + "' in actual."); - } - } - - if (jasmine.isArray_(a) && jasmine.isArray_(b) && a.length != b.length) { - mismatchValues.push("arrays were not the same length"); - } - - delete a.__Jasmine_been_here_before__; - delete b.__Jasmine_been_here_before__; - return (mismatchKeys.length === 0 && mismatchValues.length === 0); -}; - -jasmine.Env.prototype.equals_ = function(a, b, mismatchKeys, mismatchValues) { - mismatchKeys = mismatchKeys || []; - mismatchValues = mismatchValues || []; - - for (var i = 0; i < this.equalityTesters_.length; i++) { - var equalityTester = this.equalityTesters_[i]; - var result = equalityTester(a, b, this, mismatchKeys, mismatchValues); - if (result !== jasmine.undefined) return result; - } - - if (a === b) return true; - - if (a === jasmine.undefined || a === null || b === jasmine.undefined || b === null) { - return (a == jasmine.undefined && b == jasmine.undefined); - } - - if (jasmine.isDomNode(a) && jasmine.isDomNode(b)) { - return a === b; - } - - if (a instanceof Date && b instanceof Date) { - return a.getTime() == b.getTime(); - } - - if (a.jasmineMatches) { - return a.jasmineMatches(b); - } - - if (b.jasmineMatches) { - return b.jasmineMatches(a); - } - - if (a instanceof jasmine.Matchers.ObjectContaining) { - return a.matches(b); - } - - if (b instanceof jasmine.Matchers.ObjectContaining) { - return b.matches(a); - } - - if (jasmine.isString_(a) && jasmine.isString_(b)) { - return (a == b); - } - - if (jasmine.isNumber_(a) && jasmine.isNumber_(b)) { - return (a == b); - } - - if (a instanceof RegExp && b instanceof RegExp) { - return this.compareRegExps_(a, b, mismatchKeys, mismatchValues); - } - - if (typeof a === "object" && typeof b === "object") { - return this.compareObjects_(a, b, mismatchKeys, mismatchValues); - } - - //Straight check - return (a === b); -}; - -jasmine.Env.prototype.contains_ = function(haystack, needle) { - if (jasmine.isArray_(haystack)) { - for (var i = 0; i < haystack.length; i++) { - if (this.equals_(haystack[i], needle)) return true; - } - return false; - } - return haystack.indexOf(needle) >= 0; -}; - -jasmine.Env.prototype.addEqualityTester = function(equalityTester) { - this.equalityTesters_.push(equalityTester); -}; -/** No-op base class for Jasmine reporters. - * - * @constructor - */ -jasmine.Reporter = function() { -}; - -//noinspection JSUnusedLocalSymbols -jasmine.Reporter.prototype.reportRunnerStarting = function(runner) { -}; - -//noinspection JSUnusedLocalSymbols -jasmine.Reporter.prototype.reportRunnerResults = function(runner) { -}; - -//noinspection JSUnusedLocalSymbols -jasmine.Reporter.prototype.reportSuiteResults = function(suite) { -}; - -//noinspection JSUnusedLocalSymbols -jasmine.Reporter.prototype.reportSpecStarting = function(spec) { -}; - -//noinspection JSUnusedLocalSymbols -jasmine.Reporter.prototype.reportSpecResults = function(spec) { -}; - -//noinspection JSUnusedLocalSymbols -jasmine.Reporter.prototype.log = function(str) { -}; - -/** - * Blocks are functions with executable code that make up a spec. - * - * @constructor - * @param {jasmine.Env} env - * @param {Function} func - * @param {jasmine.Spec} spec - */ -jasmine.Block = function(env, func, spec) { - this.env = env; - this.func = func; - this.spec = spec; -}; - -jasmine.Block.prototype.execute = function(onComplete) { - if (!jasmine.CATCH_EXCEPTIONS) { - this.func.apply(this.spec); - } - else { - try { - this.func.apply(this.spec); - } catch (e) { - this.spec.fail(e); - } - } - onComplete(); -}; -/** JavaScript API reporter. - * - * @constructor - */ -jasmine.JsApiReporter = function() { - this.started = false; - this.finished = false; - this.suites_ = []; - this.results_ = {}; -}; - -jasmine.JsApiReporter.prototype.reportRunnerStarting = function(runner) { - this.started = true; - var suites = runner.topLevelSuites(); - for (var i = 0; i < suites.length; i++) { - var suite = suites[i]; - this.suites_.push(this.summarize_(suite)); - } -}; - -jasmine.JsApiReporter.prototype.suites = function() { - return this.suites_; -}; - -jasmine.JsApiReporter.prototype.summarize_ = function(suiteOrSpec) { - var isSuite = suiteOrSpec instanceof jasmine.Suite; - var summary = { - id: suiteOrSpec.id, - name: suiteOrSpec.description, - type: isSuite ? 'suite' : 'spec', - children: [] - }; - - if (isSuite) { - var children = suiteOrSpec.children(); - for (var i = 0; i < children.length; i++) { - summary.children.push(this.summarize_(children[i])); - } - } - return summary; -}; - -jasmine.JsApiReporter.prototype.results = function() { - return this.results_; -}; - -jasmine.JsApiReporter.prototype.resultsForSpec = function(specId) { - return this.results_[specId]; -}; - -//noinspection JSUnusedLocalSymbols -jasmine.JsApiReporter.prototype.reportRunnerResults = function(runner) { - this.finished = true; -}; - -//noinspection JSUnusedLocalSymbols -jasmine.JsApiReporter.prototype.reportSuiteResults = function(suite) { -}; - -//noinspection JSUnusedLocalSymbols -jasmine.JsApiReporter.prototype.reportSpecResults = function(spec) { - this.results_[spec.id] = { - messages: spec.results().getItems(), - result: spec.results().failedCount > 0 ? "failed" : "passed" - }; -}; - -//noinspection JSUnusedLocalSymbols -jasmine.JsApiReporter.prototype.log = function(str) { -}; - -jasmine.JsApiReporter.prototype.resultsForSpecs = function(specIds){ - var results = {}; - for (var i = 0; i < specIds.length; i++) { - var specId = specIds[i]; - results[specId] = this.summarizeResult_(this.results_[specId]); - } - return results; -}; - -jasmine.JsApiReporter.prototype.summarizeResult_ = function(result){ - var summaryMessages = []; - var messagesLength = result.messages.length; - for (var messageIndex = 0; messageIndex < messagesLength; messageIndex++) { - var resultMessage = result.messages[messageIndex]; - summaryMessages.push({ - text: resultMessage.type == 'log' ? resultMessage.toString() : jasmine.undefined, - passed: resultMessage.passed ? resultMessage.passed() : true, - type: resultMessage.type, - message: resultMessage.message, - trace: { - stack: resultMessage.passed && !resultMessage.passed() ? resultMessage.trace.stack : jasmine.undefined - } - }); - } - - return { - result : result.result, - messages : summaryMessages - }; -}; - -/** - * @constructor - * @param {jasmine.Env} env - * @param actual - * @param {jasmine.Spec} spec - */ -jasmine.Matchers = function(env, actual, spec, opt_isNot) { - this.env = env; - this.actual = actual; - this.spec = spec; - this.isNot = opt_isNot || false; - this.reportWasCalled_ = false; -}; - -// todo: @deprecated as of Jasmine 0.11, remove soon [xw] -jasmine.Matchers.pp = function(str) { - throw new Error("jasmine.Matchers.pp() is no longer supported, please use jasmine.pp() instead!"); -}; - -// todo: @deprecated Deprecated as of Jasmine 0.10. Rewrite your custom matchers to return true or false. [xw] -jasmine.Matchers.prototype.report = function(result, failing_message, details) { - throw new Error("As of jasmine 0.11, custom matchers must be implemented differently -- please see jasmine docs"); -}; - -jasmine.Matchers.wrapInto_ = function(prototype, matchersClass) { - for (var methodName in prototype) { - if (methodName == 'report') continue; - var orig = prototype[methodName]; - matchersClass.prototype[methodName] = jasmine.Matchers.matcherFn_(methodName, orig); - } -}; - -jasmine.Matchers.matcherFn_ = function(matcherName, matcherFunction) { - return function() { - var matcherArgs = jasmine.util.argsToArray(arguments); - var result = matcherFunction.apply(this, arguments); - - if (this.isNot) { - result = !result; - } - - if (this.reportWasCalled_) return result; - - var message; - if (!result) { - if (this.message) { - message = this.message.apply(this, arguments); - if (jasmine.isArray_(message)) { - message = message[this.isNot ? 1 : 0]; - } - } else { - var englishyPredicate = matcherName.replace(/[A-Z]/g, function(s) { return ' ' + s.toLowerCase(); }); - message = "Expected " + jasmine.pp(this.actual) + (this.isNot ? " not " : " ") + englishyPredicate; - if (matcherArgs.length > 0) { - for (var i = 0; i < matcherArgs.length; i++) { - if (i > 0) message += ","; - message += " " + jasmine.pp(matcherArgs[i]); - } - } - message += "."; - } - } - var expectationResult = new jasmine.ExpectationResult({ - matcherName: matcherName, - passed: result, - expected: matcherArgs.length > 1 ? matcherArgs : matcherArgs[0], - actual: this.actual, - message: message - }); - this.spec.addMatcherResult(expectationResult); - return jasmine.undefined; - }; -}; - - - - -/** - * toBe: compares the actual to the expected using === - * @param expected - */ -jasmine.Matchers.prototype.toBe = function(expected) { - return this.actual === expected; -}; - -/** - * toNotBe: compares the actual to the expected using !== - * @param expected - * @deprecated as of 1.0. Use not.toBe() instead. - */ -jasmine.Matchers.prototype.toNotBe = function(expected) { - return this.actual !== expected; -}; - -/** - * toEqual: compares the actual to the expected using common sense equality. Handles Objects, Arrays, etc. - * - * @param expected - */ -jasmine.Matchers.prototype.toEqual = function(expected) { - return this.env.equals_(this.actual, expected); -}; - -/** - * toNotEqual: compares the actual to the expected using the ! of jasmine.Matchers.toEqual - * @param expected - * @deprecated as of 1.0. Use not.toEqual() instead. - */ -jasmine.Matchers.prototype.toNotEqual = function(expected) { - return !this.env.equals_(this.actual, expected); -}; - -/** - * Matcher that compares the actual to the expected using a regular expression. Constructs a RegExp, so takes - * a pattern or a String. - * - * @param expected - */ -jasmine.Matchers.prototype.toMatch = function(expected) { - return new RegExp(expected).test(this.actual); -}; - -/** - * Matcher that compares the actual to the expected using the boolean inverse of jasmine.Matchers.toMatch - * @param expected - * @deprecated as of 1.0. Use not.toMatch() instead. - */ -jasmine.Matchers.prototype.toNotMatch = function(expected) { - return !(new RegExp(expected).test(this.actual)); -}; - -/** - * Matcher that compares the actual to jasmine.undefined. - */ -jasmine.Matchers.prototype.toBeDefined = function() { - return (this.actual !== jasmine.undefined); -}; - -/** - * Matcher that compares the actual to jasmine.undefined. - */ -jasmine.Matchers.prototype.toBeUndefined = function() { - return (this.actual === jasmine.undefined); -}; - -/** - * Matcher that compares the actual to null. - */ -jasmine.Matchers.prototype.toBeNull = function() { - return (this.actual === null); -}; - -/** - * Matcher that compares the actual to NaN. - */ -jasmine.Matchers.prototype.toBeNaN = function() { - this.message = function() { - return [ "Expected " + jasmine.pp(this.actual) + " to be NaN." ]; - }; - - return (this.actual !== this.actual); -}; - -/** - * Matcher that boolean not-nots the actual. - */ -jasmine.Matchers.prototype.toBeTruthy = function() { - return !!this.actual; -}; - - -/** - * Matcher that boolean nots the actual. - */ -jasmine.Matchers.prototype.toBeFalsy = function() { - return !this.actual; -}; - - -/** - * Matcher that checks to see if the actual, a Jasmine spy, was called. - */ -jasmine.Matchers.prototype.toHaveBeenCalled = function() { - if (arguments.length > 0) { - throw new Error('toHaveBeenCalled does not take arguments, use toHaveBeenCalledWith'); - } - - if (!jasmine.isSpy(this.actual)) { - throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.'); - } - - this.message = function() { - return [ - "Expected spy " + this.actual.identity + " to have been called.", - "Expected spy " + this.actual.identity + " not to have been called." - ]; - }; - - return this.actual.wasCalled; -}; - -/** @deprecated Use expect(xxx).toHaveBeenCalled() instead */ -jasmine.Matchers.prototype.wasCalled = jasmine.Matchers.prototype.toHaveBeenCalled; - -/** - * Matcher that checks to see if the actual, a Jasmine spy, was not called. - * - * @deprecated Use expect(xxx).not.toHaveBeenCalled() instead - */ -jasmine.Matchers.prototype.wasNotCalled = function() { - if (arguments.length > 0) { - throw new Error('wasNotCalled does not take arguments'); - } - - if (!jasmine.isSpy(this.actual)) { - throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.'); - } - - this.message = function() { - return [ - "Expected spy " + this.actual.identity + " to not have been called.", - "Expected spy " + this.actual.identity + " to have been called." - ]; - }; - - return !this.actual.wasCalled; -}; - -/** - * Matcher that checks to see if the actual, a Jasmine spy, was called with a set of parameters. - * - * @example - * - */ -jasmine.Matchers.prototype.toHaveBeenCalledWith = function() { - var expectedArgs = jasmine.util.argsToArray(arguments); - if (!jasmine.isSpy(this.actual)) { - throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.'); - } - this.message = function() { - var invertedMessage = "Expected spy " + this.actual.identity + " not to have been called with " + jasmine.pp(expectedArgs) + " but it was."; - var positiveMessage = ""; - if (this.actual.callCount === 0) { - positiveMessage = "Expected spy " + this.actual.identity + " to have been called with " + jasmine.pp(expectedArgs) + " but it was never called."; - } else { - positiveMessage = "Expected spy " + this.actual.identity + " to have been called with " + jasmine.pp(expectedArgs) + " but actual calls were " + jasmine.pp(this.actual.argsForCall).replace(/^\[ | \]$/g, '') - } - return [positiveMessage, invertedMessage]; - }; - - return this.env.contains_(this.actual.argsForCall, expectedArgs); -}; - -/** @deprecated Use expect(xxx).toHaveBeenCalledWith() instead */ -jasmine.Matchers.prototype.wasCalledWith = jasmine.Matchers.prototype.toHaveBeenCalledWith; - -/** @deprecated Use expect(xxx).not.toHaveBeenCalledWith() instead */ -jasmine.Matchers.prototype.wasNotCalledWith = function() { - var expectedArgs = jasmine.util.argsToArray(arguments); - if (!jasmine.isSpy(this.actual)) { - throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.'); - } - - this.message = function() { - return [ - "Expected spy not to have been called with " + jasmine.pp(expectedArgs) + " but it was", - "Expected spy to have been called with " + jasmine.pp(expectedArgs) + " but it was" - ]; - }; - - return !this.env.contains_(this.actual.argsForCall, expectedArgs); -}; - -/** - * Matcher that checks that the expected item is an element in the actual Array. - * - * @param {Object} expected - */ -jasmine.Matchers.prototype.toContain = function(expected) { - return this.env.contains_(this.actual, expected); -}; - -/** - * Matcher that checks that the expected item is NOT an element in the actual Array. - * - * @param {Object} expected - * @deprecated as of 1.0. Use not.toContain() instead. - */ -jasmine.Matchers.prototype.toNotContain = function(expected) { - return !this.env.contains_(this.actual, expected); -}; - -jasmine.Matchers.prototype.toBeLessThan = function(expected) { - return this.actual < expected; -}; - -jasmine.Matchers.prototype.toBeGreaterThan = function(expected) { - return this.actual > expected; -}; - -/** - * Matcher that checks that the expected item is equal to the actual item - * up to a given level of decimal precision (default 2). - * - * @param {Number} expected - * @param {Number} precision, as number of decimal places - */ -jasmine.Matchers.prototype.toBeCloseTo = function(expected, precision) { - if (!(precision === 0)) { - precision = precision || 2; - } - return Math.abs(expected - this.actual) < (Math.pow(10, -precision) / 2); -}; - -/** - * Matcher that checks that the expected exception was thrown by the actual. - * - * @param {String} [expected] - */ -jasmine.Matchers.prototype.toThrow = function(expected) { - var result = false; - var exception; - if (typeof this.actual != 'function') { - throw new Error('Actual is not a function'); - } - try { - this.actual(); - } catch (e) { - exception = e; - } - if (exception) { - result = (expected === jasmine.undefined || this.env.equals_(exception.message || exception, expected.message || expected)); - } - - var not = this.isNot ? "not " : ""; - - this.message = function() { - if (exception && (expected === jasmine.undefined || !this.env.equals_(exception.message || exception, expected.message || expected))) { - return ["Expected function " + not + "to throw", expected ? expected.message || expected : "an exception", ", but it threw", exception.message || exception].join(' '); - } else { - return "Expected function to throw an exception."; - } - }; - - return result; -}; - -jasmine.Matchers.Any = function(expectedClass) { - this.expectedClass = expectedClass; -}; - -jasmine.Matchers.Any.prototype.jasmineMatches = function(other) { - if (this.expectedClass == String) { - return typeof other == 'string' || other instanceof String; - } - - if (this.expectedClass == Number) { - return typeof other == 'number' || other instanceof Number; - } - - if (this.expectedClass == Function) { - return typeof other == 'function' || other instanceof Function; - } - - if (this.expectedClass == Object) { - return typeof other == 'object'; - } - - return other instanceof this.expectedClass; -}; - -jasmine.Matchers.Any.prototype.jasmineToString = function() { - return ''; -}; - -jasmine.Matchers.ObjectContaining = function (sample) { - this.sample = sample; -}; - -jasmine.Matchers.ObjectContaining.prototype.jasmineMatches = function(other, mismatchKeys, mismatchValues) { - mismatchKeys = mismatchKeys || []; - mismatchValues = mismatchValues || []; - - var env = jasmine.getEnv(); - - var hasKey = function(obj, keyName) { - return obj != null && obj[keyName] !== jasmine.undefined; - }; - - for (var property in this.sample) { - if (!hasKey(other, property) && hasKey(this.sample, property)) { - mismatchKeys.push("expected has key '" + property + "', but missing from actual."); - } - else if (!env.equals_(this.sample[property], other[property], mismatchKeys, mismatchValues)) { - mismatchValues.push("'" + property + "' was '" + (other[property] ? jasmine.util.htmlEscape(other[property].toString()) : other[property]) + "' in expected, but was '" + (this.sample[property] ? jasmine.util.htmlEscape(this.sample[property].toString()) : this.sample[property]) + "' in actual."); - } - } - - return (mismatchKeys.length === 0 && mismatchValues.length === 0); -}; - -jasmine.Matchers.ObjectContaining.prototype.jasmineToString = function () { - return ""; -}; -// Mock setTimeout, clearTimeout -// Contributed by Pivotal Computer Systems, www.pivotalsf.com - -jasmine.FakeTimer = function() { - this.reset(); - - var self = this; - self.setTimeout = function(funcToCall, millis) { - self.timeoutsMade++; - self.scheduleFunction(self.timeoutsMade, funcToCall, millis, false); - return self.timeoutsMade; - }; - - self.setInterval = function(funcToCall, millis) { - self.timeoutsMade++; - self.scheduleFunction(self.timeoutsMade, funcToCall, millis, true); - return self.timeoutsMade; - }; - - self.clearTimeout = function(timeoutKey) { - self.scheduledFunctions[timeoutKey] = jasmine.undefined; - }; - - self.clearInterval = function(timeoutKey) { - self.scheduledFunctions[timeoutKey] = jasmine.undefined; - }; - -}; - -jasmine.FakeTimer.prototype.reset = function() { - this.timeoutsMade = 0; - this.scheduledFunctions = {}; - this.nowMillis = 0; -}; - -jasmine.FakeTimer.prototype.tick = function(millis) { - var oldMillis = this.nowMillis; - var newMillis = oldMillis + millis; - this.runFunctionsWithinRange(oldMillis, newMillis); - this.nowMillis = newMillis; -}; - -jasmine.FakeTimer.prototype.runFunctionsWithinRange = function(oldMillis, nowMillis) { - var scheduledFunc; - var funcsToRun = []; - for (var timeoutKey in this.scheduledFunctions) { - scheduledFunc = this.scheduledFunctions[timeoutKey]; - if (scheduledFunc != jasmine.undefined && - scheduledFunc.runAtMillis >= oldMillis && - scheduledFunc.runAtMillis <= nowMillis) { - funcsToRun.push(scheduledFunc); - this.scheduledFunctions[timeoutKey] = jasmine.undefined; - } - } - - if (funcsToRun.length > 0) { - funcsToRun.sort(function(a, b) { - return a.runAtMillis - b.runAtMillis; - }); - for (var i = 0; i < funcsToRun.length; ++i) { - try { - var funcToRun = funcsToRun[i]; - this.nowMillis = funcToRun.runAtMillis; - funcToRun.funcToCall(); - if (funcToRun.recurring) { - this.scheduleFunction(funcToRun.timeoutKey, - funcToRun.funcToCall, - funcToRun.millis, - true); - } - } catch(e) { - } - } - this.runFunctionsWithinRange(oldMillis, nowMillis); - } -}; - -jasmine.FakeTimer.prototype.scheduleFunction = function(timeoutKey, funcToCall, millis, recurring) { - this.scheduledFunctions[timeoutKey] = { - runAtMillis: this.nowMillis + millis, - funcToCall: funcToCall, - recurring: recurring, - timeoutKey: timeoutKey, - millis: millis - }; -}; - -/** - * @namespace - */ -jasmine.Clock = { - defaultFakeTimer: new jasmine.FakeTimer(), - - reset: function() { - jasmine.Clock.assertInstalled(); - jasmine.Clock.defaultFakeTimer.reset(); - }, - - tick: function(millis) { - jasmine.Clock.assertInstalled(); - jasmine.Clock.defaultFakeTimer.tick(millis); - }, - - runFunctionsWithinRange: function(oldMillis, nowMillis) { - jasmine.Clock.defaultFakeTimer.runFunctionsWithinRange(oldMillis, nowMillis); - }, - - scheduleFunction: function(timeoutKey, funcToCall, millis, recurring) { - jasmine.Clock.defaultFakeTimer.scheduleFunction(timeoutKey, funcToCall, millis, recurring); - }, - - useMock: function() { - if (!jasmine.Clock.isInstalled()) { - var spec = jasmine.getEnv().currentSpec; - spec.after(jasmine.Clock.uninstallMock); - - jasmine.Clock.installMock(); - } - }, - - installMock: function() { - jasmine.Clock.installed = jasmine.Clock.defaultFakeTimer; - }, - - uninstallMock: function() { - jasmine.Clock.assertInstalled(); - jasmine.Clock.installed = jasmine.Clock.real; - }, - - real: { - setTimeout: jasmine.getGlobal().setTimeout, - clearTimeout: jasmine.getGlobal().clearTimeout, - setInterval: jasmine.getGlobal().setInterval, - clearInterval: jasmine.getGlobal().clearInterval - }, - - assertInstalled: function() { - if (!jasmine.Clock.isInstalled()) { - throw new Error("Mock clock is not installed, use jasmine.Clock.useMock()"); - } - }, - - isInstalled: function() { - return jasmine.Clock.installed == jasmine.Clock.defaultFakeTimer; - }, - - installed: null -}; -jasmine.Clock.installed = jasmine.Clock.real; - -//else for IE support -jasmine.getGlobal().setTimeout = function(funcToCall, millis) { - if (jasmine.Clock.installed.setTimeout.apply) { - return jasmine.Clock.installed.setTimeout.apply(this, arguments); - } else { - return jasmine.Clock.installed.setTimeout(funcToCall, millis); - } -}; - -jasmine.getGlobal().setInterval = function(funcToCall, millis) { - if (jasmine.Clock.installed.setInterval.apply) { - return jasmine.Clock.installed.setInterval.apply(this, arguments); - } else { - return jasmine.Clock.installed.setInterval(funcToCall, millis); - } -}; - -jasmine.getGlobal().clearTimeout = function(timeoutKey) { - if (jasmine.Clock.installed.clearTimeout.apply) { - return jasmine.Clock.installed.clearTimeout.apply(this, arguments); - } else { - return jasmine.Clock.installed.clearTimeout(timeoutKey); - } -}; - -jasmine.getGlobal().clearInterval = function(timeoutKey) { - if (jasmine.Clock.installed.clearTimeout.apply) { - return jasmine.Clock.installed.clearInterval.apply(this, arguments); - } else { - return jasmine.Clock.installed.clearInterval(timeoutKey); - } -}; - -/** - * @constructor - */ -jasmine.MultiReporter = function() { - this.subReporters_ = []; -}; -jasmine.util.inherit(jasmine.MultiReporter, jasmine.Reporter); - -jasmine.MultiReporter.prototype.addReporter = function(reporter) { - this.subReporters_.push(reporter); -}; - -(function() { - var functionNames = [ - "reportRunnerStarting", - "reportRunnerResults", - "reportSuiteResults", - "reportSpecStarting", - "reportSpecResults", - "log" - ]; - for (var i = 0; i < functionNames.length; i++) { - var functionName = functionNames[i]; - jasmine.MultiReporter.prototype[functionName] = (function(functionName) { - return function() { - for (var j = 0; j < this.subReporters_.length; j++) { - var subReporter = this.subReporters_[j]; - if (subReporter[functionName]) { - subReporter[functionName].apply(subReporter, arguments); - } - } - }; - })(functionName); - } -})(); -/** - * Holds results for a set of Jasmine spec. Allows for the results array to hold another jasmine.NestedResults - * - * @constructor - */ -jasmine.NestedResults = function() { - /** - * The total count of results - */ - this.totalCount = 0; - /** - * Number of passed results - */ - this.passedCount = 0; - /** - * Number of failed results - */ - this.failedCount = 0; - /** - * Was this suite/spec skipped? - */ - this.skipped = false; - /** - * @ignore - */ - this.items_ = []; -}; - -/** - * Roll up the result counts. - * - * @param result - */ -jasmine.NestedResults.prototype.rollupCounts = function(result) { - this.totalCount += result.totalCount; - this.passedCount += result.passedCount; - this.failedCount += result.failedCount; -}; - -/** - * Adds a log message. - * @param values Array of message parts which will be concatenated later. - */ -jasmine.NestedResults.prototype.log = function(values) { - this.items_.push(new jasmine.MessageResult(values)); -}; - -/** - * Getter for the results: message & results. - */ -jasmine.NestedResults.prototype.getItems = function() { - return this.items_; -}; - -/** - * Adds a result, tracking counts (total, passed, & failed) - * @param {jasmine.ExpectationResult|jasmine.NestedResults} result - */ -jasmine.NestedResults.prototype.addResult = function(result) { - if (result.type != 'log') { - if (result.items_) { - this.rollupCounts(result); - } else { - this.totalCount++; - if (result.passed()) { - this.passedCount++; - } else { - this.failedCount++; - } - } - } - this.items_.push(result); -}; - -/** - * @returns {Boolean} True if everything below passed - */ -jasmine.NestedResults.prototype.passed = function() { - return this.passedCount === this.totalCount; -}; -/** - * Base class for pretty printing for expectation results. - */ -jasmine.PrettyPrinter = function() { - this.ppNestLevel_ = 0; -}; - -/** - * Formats a value in a nice, human-readable string. - * - * @param value - */ -jasmine.PrettyPrinter.prototype.format = function(value) { - this.ppNestLevel_++; - try { - if (value === jasmine.undefined) { - this.emitScalar('undefined'); - } else if (value === null) { - this.emitScalar('null'); - } else if (value === jasmine.getGlobal()) { - this.emitScalar(''); - } else if (value.jasmineToString) { - this.emitScalar(value.jasmineToString()); - } else if (typeof value === 'string') { - this.emitString(value); - } else if (jasmine.isSpy(value)) { - this.emitScalar("spy on " + value.identity); - } else if (value instanceof RegExp) { - this.emitScalar(value.toString()); - } else if (typeof value === 'function') { - this.emitScalar('Function'); - } else if (typeof value.nodeType === 'number') { - this.emitScalar('HTMLNode'); - } else if (value instanceof Date) { - this.emitScalar('Date(' + value + ')'); - } else if (value.__Jasmine_been_here_before__) { - this.emitScalar(''); - } else if (jasmine.isArray_(value) || typeof value == 'object') { - value.__Jasmine_been_here_before__ = true; - if (jasmine.isArray_(value)) { - this.emitArray(value); - } else { - this.emitObject(value); - } - delete value.__Jasmine_been_here_before__; - } else { - this.emitScalar(value.toString()); - } - } finally { - this.ppNestLevel_--; - } -}; - -jasmine.PrettyPrinter.prototype.iterateObject = function(obj, fn) { - for (var property in obj) { - if (!obj.hasOwnProperty(property)) continue; - if (property == '__Jasmine_been_here_before__') continue; - fn(property, obj.__lookupGetter__ ? (obj.__lookupGetter__(property) !== jasmine.undefined && - obj.__lookupGetter__(property) !== null) : false); - } -}; - -jasmine.PrettyPrinter.prototype.emitArray = jasmine.unimplementedMethod_; -jasmine.PrettyPrinter.prototype.emitObject = jasmine.unimplementedMethod_; -jasmine.PrettyPrinter.prototype.emitScalar = jasmine.unimplementedMethod_; -jasmine.PrettyPrinter.prototype.emitString = jasmine.unimplementedMethod_; - -jasmine.StringPrettyPrinter = function() { - jasmine.PrettyPrinter.call(this); - - this.string = ''; -}; -jasmine.util.inherit(jasmine.StringPrettyPrinter, jasmine.PrettyPrinter); - -jasmine.StringPrettyPrinter.prototype.emitScalar = function(value) { - this.append(value); -}; - -jasmine.StringPrettyPrinter.prototype.emitString = function(value) { - this.append("'" + value + "'"); -}; - -jasmine.StringPrettyPrinter.prototype.emitArray = function(array) { - if (this.ppNestLevel_ > jasmine.MAX_PRETTY_PRINT_DEPTH) { - this.append("Array"); - return; - } - - this.append('[ '); - for (var i = 0; i < array.length; i++) { - if (i > 0) { - this.append(', '); - } - this.format(array[i]); - } - this.append(' ]'); -}; - -jasmine.StringPrettyPrinter.prototype.emitObject = function(obj) { - if (this.ppNestLevel_ > jasmine.MAX_PRETTY_PRINT_DEPTH) { - this.append("Object"); - return; - } - - var self = this; - this.append('{ '); - var first = true; - - this.iterateObject(obj, function(property, isGetter) { - if (first) { - first = false; - } else { - self.append(', '); - } - - self.append(property); - self.append(' : '); - if (isGetter) { - self.append(''); - } else { - self.format(obj[property]); - } - }); - - this.append(' }'); -}; - -jasmine.StringPrettyPrinter.prototype.append = function(value) { - this.string += value; -}; -jasmine.Queue = function(env) { - this.env = env; - - // parallel to blocks. each true value in this array means the block will - // get executed even if we abort - this.ensured = []; - this.blocks = []; - this.running = false; - this.index = 0; - this.offset = 0; - this.abort = false; -}; - -jasmine.Queue.prototype.addBefore = function(block, ensure) { - if (ensure === jasmine.undefined) { - ensure = false; - } - - this.blocks.unshift(block); - this.ensured.unshift(ensure); -}; - -jasmine.Queue.prototype.add = function(block, ensure) { - if (ensure === jasmine.undefined) { - ensure = false; - } - - this.blocks.push(block); - this.ensured.push(ensure); -}; - -jasmine.Queue.prototype.insertNext = function(block, ensure) { - if (ensure === jasmine.undefined) { - ensure = false; - } - - this.ensured.splice((this.index + this.offset + 1), 0, ensure); - this.blocks.splice((this.index + this.offset + 1), 0, block); - this.offset++; -}; - -jasmine.Queue.prototype.start = function(onComplete) { - this.running = true; - this.onComplete = onComplete; - this.next_(); -}; - -jasmine.Queue.prototype.isRunning = function() { - return this.running; -}; - -jasmine.Queue.LOOP_DONT_RECURSE = true; - -jasmine.Queue.prototype.next_ = function() { - var self = this; - var goAgain = true; - - while (goAgain) { - goAgain = false; - - if (self.index < self.blocks.length && !(this.abort && !this.ensured[self.index])) { - var calledSynchronously = true; - var completedSynchronously = false; - - var onComplete = function () { - if (jasmine.Queue.LOOP_DONT_RECURSE && calledSynchronously) { - completedSynchronously = true; - return; - } - - if (self.blocks[self.index].abort) { - self.abort = true; - } - - self.offset = 0; - self.index++; - - var now = new Date().getTime(); - if (self.env.updateInterval && now - self.env.lastUpdate > self.env.updateInterval) { - self.env.lastUpdate = now; - self.env.setTimeout(function() { - self.next_(); - }, 0); - } else { - if (jasmine.Queue.LOOP_DONT_RECURSE && completedSynchronously) { - goAgain = true; - } else { - self.next_(); - } - } - }; - self.blocks[self.index].execute(onComplete); - - calledSynchronously = false; - if (completedSynchronously) { - onComplete(); - } - - } else { - self.running = false; - if (self.onComplete) { - self.onComplete(); - } - } - } -}; - -jasmine.Queue.prototype.results = function() { - var results = new jasmine.NestedResults(); - for (var i = 0; i < this.blocks.length; i++) { - if (this.blocks[i].results) { - results.addResult(this.blocks[i].results()); - } - } - return results; -}; - - -/** - * Runner - * - * @constructor - * @param {jasmine.Env} env - */ -jasmine.Runner = function(env) { - var self = this; - self.env = env; - self.queue = new jasmine.Queue(env); - self.before_ = []; - self.after_ = []; - self.suites_ = []; -}; - -jasmine.Runner.prototype.execute = function() { - var self = this; - if (self.env.reporter.reportRunnerStarting) { - self.env.reporter.reportRunnerStarting(this); - } - self.queue.start(function () { - self.finishCallback(); - }); -}; - -jasmine.Runner.prototype.beforeEach = function(beforeEachFunction) { - beforeEachFunction.typeName = 'beforeEach'; - this.before_.splice(0,0,beforeEachFunction); -}; - -jasmine.Runner.prototype.afterEach = function(afterEachFunction) { - afterEachFunction.typeName = 'afterEach'; - this.after_.splice(0,0,afterEachFunction); -}; - - -jasmine.Runner.prototype.finishCallback = function() { - this.env.reporter.reportRunnerResults(this); -}; - -jasmine.Runner.prototype.addSuite = function(suite) { - this.suites_.push(suite); -}; - -jasmine.Runner.prototype.add = function(block) { - if (block instanceof jasmine.Suite) { - this.addSuite(block); - } - this.queue.add(block); -}; - -jasmine.Runner.prototype.specs = function () { - var suites = this.suites(); - var specs = []; - for (var i = 0; i < suites.length; i++) { - specs = specs.concat(suites[i].specs()); - } - return specs; -}; - -jasmine.Runner.prototype.suites = function() { - return this.suites_; -}; - -jasmine.Runner.prototype.topLevelSuites = function() { - var topLevelSuites = []; - for (var i = 0; i < this.suites_.length; i++) { - if (!this.suites_[i].parentSuite) { - topLevelSuites.push(this.suites_[i]); - } - } - return topLevelSuites; -}; - -jasmine.Runner.prototype.results = function() { - return this.queue.results(); -}; -/** - * Internal representation of a Jasmine specification, or test. - * - * @constructor - * @param {jasmine.Env} env - * @param {jasmine.Suite} suite - * @param {String} description - */ -jasmine.Spec = function(env, suite, description) { - if (!env) { - throw new Error('jasmine.Env() required'); - } - if (!suite) { - throw new Error('jasmine.Suite() required'); - } - var spec = this; - spec.id = env.nextSpecId ? env.nextSpecId() : null; - spec.env = env; - spec.suite = suite; - spec.description = description; - spec.queue = new jasmine.Queue(env); - - spec.afterCallbacks = []; - spec.spies_ = []; - - spec.results_ = new jasmine.NestedResults(); - spec.results_.description = description; - spec.matchersClass = null; -}; - -jasmine.Spec.prototype.getFullName = function() { - return this.suite.getFullName() + ' ' + this.description + '.'; -}; - - -jasmine.Spec.prototype.results = function() { - return this.results_; -}; - -/** - * All parameters are pretty-printed and concatenated together, then written to the spec's output. - * - * Be careful not to leave calls to jasmine.log in production code. - */ -jasmine.Spec.prototype.log = function() { - return this.results_.log(arguments); -}; - -jasmine.Spec.prototype.runs = function (func) { - var block = new jasmine.Block(this.env, func, this); - this.addToQueue(block); - return this; -}; - -jasmine.Spec.prototype.addToQueue = function (block) { - if (this.queue.isRunning()) { - this.queue.insertNext(block); - } else { - this.queue.add(block); - } -}; - -/** - * @param {jasmine.ExpectationResult} result - */ -jasmine.Spec.prototype.addMatcherResult = function(result) { - this.results_.addResult(result); -}; - -jasmine.Spec.prototype.expect = function(actual) { - var positive = new (this.getMatchersClass_())(this.env, actual, this); - positive.not = new (this.getMatchersClass_())(this.env, actual, this, true); - return positive; -}; - -/** - * Waits a fixed time period before moving to the next block. - * - * @deprecated Use waitsFor() instead - * @param {Number} timeout milliseconds to wait - */ -jasmine.Spec.prototype.waits = function(timeout) { - var waitsFunc = new jasmine.WaitsBlock(this.env, timeout, this); - this.addToQueue(waitsFunc); - return this; -}; - -/** - * Waits for the latchFunction to return true before proceeding to the next block. - * - * @param {Function} latchFunction - * @param {String} optional_timeoutMessage - * @param {Number} optional_timeout - */ -jasmine.Spec.prototype.waitsFor = function(latchFunction, optional_timeoutMessage, optional_timeout) { - var latchFunction_ = null; - var optional_timeoutMessage_ = null; - var optional_timeout_ = null; - - for (var i = 0; i < arguments.length; i++) { - var arg = arguments[i]; - switch (typeof arg) { - case 'function': - latchFunction_ = arg; - break; - case 'string': - optional_timeoutMessage_ = arg; - break; - case 'number': - optional_timeout_ = arg; - break; - } - } - - var waitsForFunc = new jasmine.WaitsForBlock(this.env, optional_timeout_, latchFunction_, optional_timeoutMessage_, this); - this.addToQueue(waitsForFunc); - return this; -}; - -jasmine.Spec.prototype.fail = function (e) { - var expectationResult = new jasmine.ExpectationResult({ - passed: false, - message: e ? jasmine.util.formatException(e) : 'Exception', - trace: { stack: e.stack } - }); - this.results_.addResult(expectationResult); -}; - -jasmine.Spec.prototype.getMatchersClass_ = function() { - return this.matchersClass || this.env.matchersClass; -}; - -jasmine.Spec.prototype.addMatchers = function(matchersPrototype) { - var parent = this.getMatchersClass_(); - var newMatchersClass = function() { - parent.apply(this, arguments); - }; - jasmine.util.inherit(newMatchersClass, parent); - jasmine.Matchers.wrapInto_(matchersPrototype, newMatchersClass); - this.matchersClass = newMatchersClass; -}; - -jasmine.Spec.prototype.finishCallback = function() { - this.env.reporter.reportSpecResults(this); -}; - -jasmine.Spec.prototype.finish = function(onComplete) { - this.removeAllSpies(); - this.finishCallback(); - if (onComplete) { - onComplete(); - } -}; - -jasmine.Spec.prototype.after = function(doAfter) { - if (this.queue.isRunning()) { - this.queue.add(new jasmine.Block(this.env, doAfter, this), true); - } else { - this.afterCallbacks.unshift(doAfter); - } -}; - -jasmine.Spec.prototype.execute = function(onComplete) { - var spec = this; - if (!spec.env.specFilter(spec)) { - spec.results_.skipped = true; - spec.finish(onComplete); - return; - } - - this.env.reporter.reportSpecStarting(this); - - spec.env.currentSpec = spec; - - spec.addBeforesAndAftersToQueue(); - - spec.queue.start(function () { - spec.finish(onComplete); - }); -}; - -jasmine.Spec.prototype.addBeforesAndAftersToQueue = function() { - var runner = this.env.currentRunner(); - var i; - - for (var suite = this.suite; suite; suite = suite.parentSuite) { - for (i = 0; i < suite.before_.length; i++) { - this.queue.addBefore(new jasmine.Block(this.env, suite.before_[i], this)); - } - } - for (i = 0; i < runner.before_.length; i++) { - this.queue.addBefore(new jasmine.Block(this.env, runner.before_[i], this)); - } - for (i = 0; i < this.afterCallbacks.length; i++) { - this.queue.add(new jasmine.Block(this.env, this.afterCallbacks[i], this), true); - } - for (suite = this.suite; suite; suite = suite.parentSuite) { - for (i = 0; i < suite.after_.length; i++) { - this.queue.add(new jasmine.Block(this.env, suite.after_[i], this), true); - } - } - for (i = 0; i < runner.after_.length; i++) { - this.queue.add(new jasmine.Block(this.env, runner.after_[i], this), true); - } -}; - -jasmine.Spec.prototype.explodes = function() { - throw 'explodes function should not have been called'; -}; - -jasmine.Spec.prototype.spyOn = function(obj, methodName, ignoreMethodDoesntExist) { - if (obj == jasmine.undefined) { - throw "spyOn could not find an object to spy upon for " + methodName + "()"; - } - - if (!ignoreMethodDoesntExist && obj[methodName] === jasmine.undefined) { - throw methodName + '() method does not exist'; - } - - if (!ignoreMethodDoesntExist && obj[methodName] && obj[methodName].isSpy) { - throw new Error(methodName + ' has already been spied upon'); - } - - var spyObj = jasmine.createSpy(methodName); - - this.spies_.push(spyObj); - spyObj.baseObj = obj; - spyObj.methodName = methodName; - spyObj.originalValue = obj[methodName]; - - obj[methodName] = spyObj; - - return spyObj; -}; - -jasmine.Spec.prototype.removeAllSpies = function() { - for (var i = 0; i < this.spies_.length; i++) { - var spy = this.spies_[i]; - spy.baseObj[spy.methodName] = spy.originalValue; - } - this.spies_ = []; -}; - -/** - * Internal representation of a Jasmine suite. - * - * @constructor - * @param {jasmine.Env} env - * @param {String} description - * @param {Function} specDefinitions - * @param {jasmine.Suite} parentSuite - */ -jasmine.Suite = function(env, description, specDefinitions, parentSuite) { - var self = this; - self.id = env.nextSuiteId ? env.nextSuiteId() : null; - self.description = description; - self.queue = new jasmine.Queue(env); - self.parentSuite = parentSuite; - self.env = env; - self.before_ = []; - self.after_ = []; - self.children_ = []; - self.suites_ = []; - self.specs_ = []; -}; - -jasmine.Suite.prototype.getFullName = function() { - var fullName = this.description; - for (var parentSuite = this.parentSuite; parentSuite; parentSuite = parentSuite.parentSuite) { - fullName = parentSuite.description + ' ' + fullName; - } - return fullName; -}; - -jasmine.Suite.prototype.finish = function(onComplete) { - this.env.reporter.reportSuiteResults(this); - this.finished = true; - if (typeof(onComplete) == 'function') { - onComplete(); - } -}; - -jasmine.Suite.prototype.beforeEach = function(beforeEachFunction) { - beforeEachFunction.typeName = 'beforeEach'; - this.before_.unshift(beforeEachFunction); -}; - -jasmine.Suite.prototype.afterEach = function(afterEachFunction) { - afterEachFunction.typeName = 'afterEach'; - this.after_.unshift(afterEachFunction); -}; - -jasmine.Suite.prototype.results = function() { - return this.queue.results(); -}; - -jasmine.Suite.prototype.add = function(suiteOrSpec) { - this.children_.push(suiteOrSpec); - if (suiteOrSpec instanceof jasmine.Suite) { - this.suites_.push(suiteOrSpec); - this.env.currentRunner().addSuite(suiteOrSpec); - } else { - this.specs_.push(suiteOrSpec); - } - this.queue.add(suiteOrSpec); -}; - -jasmine.Suite.prototype.specs = function() { - return this.specs_; -}; - -jasmine.Suite.prototype.suites = function() { - return this.suites_; -}; - -jasmine.Suite.prototype.children = function() { - return this.children_; -}; - -jasmine.Suite.prototype.execute = function(onComplete) { - var self = this; - this.queue.start(function () { - self.finish(onComplete); - }); -}; -jasmine.WaitsBlock = function(env, timeout, spec) { - this.timeout = timeout; - jasmine.Block.call(this, env, null, spec); -}; - -jasmine.util.inherit(jasmine.WaitsBlock, jasmine.Block); - -jasmine.WaitsBlock.prototype.execute = function (onComplete) { - if (jasmine.VERBOSE) { - this.env.reporter.log('>> Jasmine waiting for ' + this.timeout + ' ms...'); - } - this.env.setTimeout(function () { - onComplete(); - }, this.timeout); -}; -/** - * A block which waits for some condition to become true, with timeout. - * - * @constructor - * @extends jasmine.Block - * @param {jasmine.Env} env The Jasmine environment. - * @param {Number} timeout The maximum time in milliseconds to wait for the condition to become true. - * @param {Function} latchFunction A function which returns true when the desired condition has been met. - * @param {String} message The message to display if the desired condition hasn't been met within the given time period. - * @param {jasmine.Spec} spec The Jasmine spec. - */ -jasmine.WaitsForBlock = function(env, timeout, latchFunction, message, spec) { - this.timeout = timeout || env.defaultTimeoutInterval; - this.latchFunction = latchFunction; - this.message = message; - this.totalTimeSpentWaitingForLatch = 0; - jasmine.Block.call(this, env, null, spec); -}; -jasmine.util.inherit(jasmine.WaitsForBlock, jasmine.Block); - -jasmine.WaitsForBlock.TIMEOUT_INCREMENT = 10; - -jasmine.WaitsForBlock.prototype.execute = function(onComplete) { - if (jasmine.VERBOSE) { - this.env.reporter.log('>> Jasmine waiting for ' + (this.message || 'something to happen')); - } - var latchFunctionResult; - try { - latchFunctionResult = this.latchFunction.apply(this.spec); - } catch (e) { - this.spec.fail(e); - onComplete(); - return; - } - - if (latchFunctionResult) { - onComplete(); - } else if (this.totalTimeSpentWaitingForLatch >= this.timeout) { - var message = 'timed out after ' + this.timeout + ' msec waiting for ' + (this.message || 'something to happen'); - this.spec.fail({ - name: 'timeout', - message: message - }); - - this.abort = true; - onComplete(); - } else { - this.totalTimeSpentWaitingForLatch += jasmine.WaitsForBlock.TIMEOUT_INCREMENT; - var self = this; - this.env.setTimeout(function() { - self.execute(onComplete); - }, jasmine.WaitsForBlock.TIMEOUT_INCREMENT); - } -}; - -jasmine.version_= { - "major": 1, - "minor": 3, - "build": 1, - "revision": 1354556913 -}; diff --git a/test/resources/data/plData.json b/test/resources/data/plData.json deleted file mode 100644 index bee772c..0000000 --- a/test/resources/data/plData.json +++ /dev/null @@ -1,210 +0,0 @@ -{ - "items": [ - { - "text": "2012", - "year": true, - "items": [ - { - "text": "Jan", - "items": [ - { - "sales": 120, - "expenses": 90, - "profits": 30, - "leaf": true - }, - { - "sales": 150, - "expenses": 70, - "profits": 80, - "leaf": true - } - ] - }, - { - "text": "Feb", - "items": [ - { - "sales": 100, - "expenses": 80, - "profits": 20, - "leaf": true - }, - { - "sales": 130, - "expenses": 80, - "profits": 50, - "leaf": true - } - ] - }, - { - "text": "Mar", - "items": [ - { - "sales": 180, - "expenses": 110, - "profits": 70, - "leaf": true - }, - { - "sales": 130, - "expenses": 80, - "profits": 50, - "leaf": true - } - ] - }, - { - "text": "Apr", - "items": [ - { - "sales": 110, - "expenses": 70, - "profits": 40, - "leaf": true - } - ] - }, - { - "text": "May", - "items": [ - { - "sales": 60, - "expenses": 50, - "profits": 10, - "leaf": true - } - ] - }, - { - "text": "Jun", - "items": [ - { - "sales": 210, - "expenses": 180, - "profits": 30, - "leaf": true - } - ] - }, - { - "text": "Jul", - "items": [ - { - "sales": 250, - "expenses": 140, - "profits": 110, - "leaf": true - } - ] - }, - { - "text": "Aug", - "items": [ - { - "sales": 130, - "expenses": 80, - "profits": 50, - "leaf": true - } - ] - }, - { - "text": "Sep", - "items": [ - { - "sales": 110, - "expenses": 80, - "profits": 30, - "leaf": true - } - ] - }, - { - "text": "Oct", - "items": [ - { - "sales": 180, - "expenses": 110, - "profits": 70, - "leaf": true - } - ] - }, - { - "text": "Nov", - "items": [ - { - "sales": 220, - "expenses": 130, - "profits": 90, - "leaf": true - } - ] - }, - { - "text": "Dec", - "items": [ - { - "sales": 150, - "expenses": 130, - "profits": 30, - "leaf": true - } - ] - } - ] - }, - { - "text": "2013", - "year": true, - "items": [ - { - "text": "Jan", - "items": [ - { - "sales": 120, - "expenses": 90, - "profits": 30, - "leaf": true - } - ] - }, - { - "text": "Feb", - "items": [ - { - "sales": 100, - "expenses": 80, - "profits": 20, - "leaf": true - } - ] - }, - { - "text": "Mar", - "items": [ - { - "sales": 180, - "expenses": 110, - "profits": 70, - "leaf": true - } - ] - }, - { - "text": "Apr", - "items": [ - { - "sales": 110, - "expenses": 70, - "profits": 40, - "leaf": true - } - ] - } - ] - } - ] -} diff --git a/test/resources/data/testData.json b/test/resources/data/testData.json deleted file mode 100644 index a8f5adb..0000000 --- a/test/resources/data/testData.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "items" : [{ - "text" : "Today", - "items" : [{ - "text" : "Eat", - "leaf" : true - }, { - "text" : "Sleep", - "leaf" : true - }, { - "text" : "Drinking", - "leaf" : true - }] - }, { - "text" : "Tomorrow", - "items" : [{ - "text" : "Watch TV", - "leaf" : true - }, { - "text" : "Watch Video", - "leaf" : true - }] - }, { - "text" : "This week", - "items" : [{ - "text" : "Shopping", - "leaf" : true - }] - }, { - "text" : "Later", - "items" : [{ - "text" : "Eat", - "leaf" : true - }, { - "text" : "Sleep", - "leaf" : true - }, { - "text" : "Drinking", - "leaf" : true - }] - }] -} \ No newline at end of file diff --git a/test/run-jasmine.js b/test/run-jasmine.js deleted file mode 100644 index 5e5fe60..0000000 --- a/test/run-jasmine.js +++ /dev/null @@ -1,86 +0,0 @@ -var system = require('system'); - -/** - * Wait until the test condition is true or a timeout occurs. Useful for waiting - * on a server response or for a ui change (fadeIn, etc.) to occur. - * - * @param testFx javascript condition that evaluates to a boolean, - * it can be passed in as a string (e.g.: "1 == 1" or "$('#bar').is(':visible')" or - * as a callback function. - * @param onReady what to do when testFx condition is fulfilled, - * it can be passed in as a string (e.g.: "1 == 1" or "$('#bar').is(':visible')" or - * as a callback function. - * @param timeOutMillis the max amount of time to wait. If not specified, 3 sec is used. - */ -function waitFor(testFx, onReady, timeOutMillis) { - var maxtimeOutMillis = timeOutMillis ? timeOutMillis : 3001, //< Default Max Timeout is 3s - start = new Date().getTime(), - condition = false, - interval = setInterval(function() { - if ( (new Date().getTime() - start < maxtimeOutMillis) && !condition ) { - // If not time-out yet and condition not yet fulfilled - condition = (typeof(testFx) === "string" ? eval(testFx) : testFx()); //< defensive code - } else { - if(!condition) { - // If condition still not fulfilled (timeout but condition is 'false') - console.log("'waitFor()' timeout"); - phantom.exit(1); - } else { - // Condition fulfilled (timeout and/or condition is 'true') - console.log("'waitFor()' finished in " + (new Date().getTime() - start) + "ms."); - typeof(onReady) === "string" ? eval(onReady) : onReady(); //< Do what it's supposed to do once the condition is fulfilled - clearInterval(interval); //< Stop this interval - } - } - }, 100); //< repeat check every 100ms -}; - - -if (system.args.length !== 2) { - console.log('Usage: run-jasmine.js URL'); - phantom.exit(1); -} - -var page = require('webpage').create(); - -// Route "console.log()" calls from within the Page context to the main Phantom context (i.e. current "this") -page.onConsoleMessage = function(msg) { - console.log(msg); -}; - -page.open(system.args[1], function(status){ - if (status !== "success") { - console.log("Unable to access network"); - phantom.exit(); - } else { - waitFor(function(){ - return page.evaluate(function(){ - return document.body.querySelector('.symbolSummary .pending') === null; - }); - }, function(){ - var exitCode = page.evaluate(function(){ - console.log(''); - console.log(document.body.querySelector('.description').innerText); - var list = document.body.querySelectorAll('.results > #details > .specDetail.failed'); - if (list && list.length > 0) { - console.log(''); - console.log(list.length + ' test(s) FAILED:'); - for (i = 0; i < list.length; ++i) { - var el = list[i], - desc = el.querySelector('.description'), - msg = el.querySelector('.resultMessage.fail'); - console.log(''); - console.log(desc.innerText); - console.log(msg.innerText); - console.log(''); - } - return 1; - } else { - console.log(document.body.querySelector('.alert > .passingAlert.bar').innerText); - return 0; - } - }); - phantom.exit(exitCode); - }); - } -}); diff --git a/test/spec/AccordionListSpec.js b/test/spec/AccordionListSpec.js deleted file mode 100644 index d931a45..0000000 --- a/test/spec/AccordionListSpec.js +++ /dev/null @@ -1,132 +0,0 @@ -describe('Ext.ux.AccordionList', function() { - var accordionList; - - beforeEach(function() { - accordionList = Ext.create('Ext.ux.AccordionList'); - }); - - it('says Hello!', function() { - expect(accordionList).toBeDefined(); - }); - - it('loads nested json data', function() { - accordionList.setStore(Ext.create('AccordionListExample.store.Task')); - accordionList.load(); - - waitsFor(function() { - return accordionList.getCount() > 0; - }, "Now, loading data...", 10000); - - runs(function () { - expect(accordionList.getCount()).toEqual(4); - expect(accordionList.getAllCount()).toEqual(13); - }); - }); - - it('should remove all record', function() { - accordionList.setStore(Ext.create('AccordionListExample.store.Task')); - accordionList.load(); - - waitsFor(function() { - return accordionList.getCount() > 0; - }, "Now, loading data...", 10000); - - runs(function () { - accordionList.removeAll(); - expect(accordionList.getCount()).toEqual(0); - expect(accordionList.getAllCount()).toEqual(0); - }); - }); - - isAllExpanded = function() { - var nodes = accordionList.getList().getStore().getNode().childNodes; - return nodes.every(function expanded (v) { - var hasChild = v.childNodes > 0; - return v.isExpanded() && - (hasChild ? v.childNodes.every(expanded) : true); - }); - }; - - isAllCollapsed = function() { - var nodes = accordionList.getList().getStore().getNode().childNodes; - return nodes.every(function collapsed (v) { - var hasChild = v.childNodes > 0; - return v.isExpanded() === false && - (hasChild ? v.childNodes.every(collapsed) : true); - }); - }; - - - it('should expand all item when configured defaultExpanded', function() { - accordionList.setDefaultExpanded(true); - accordionList.setStore(Ext.create('AccordionListExample.store.Task')); - accordionList.load(); - - waitsFor(function() { - return accordionList.getCount() > 0; - }, "Now, loading data...", 10000); - - runs(function () { - accordionList.doInitialize(); - expect(isAllExpanded(accordionList)).toBeTruthy(); - }); - }); - - it('should expand all item when invoked doAllExpand', function() { - accordionList.setStore(Ext.create('AccordionListExample.store.Task')); - accordionList.load(); - - waitsFor(function() { - return accordionList.getCount() > 0; - }, "Now, loading data...", 10000); - - runs(function () { - accordionList.doAllExpand(); - expect(isAllExpanded(accordionList)).toBeTruthy(); - }); - }); - - it('should collapse all item when invoked doAllCollapse', function() { - accordionList.setStore(Ext.create('AccordionListExample.store.Task')); - accordionList.load(); - - waitsFor(function() { - return accordionList.getCount() > 0; - }, "Now, loading data...", 10000); - - runs(function () { - accordionList.doAllCollapse(); - expect(isAllCollapsed(accordionList)).toBeTruthy(); - }); - }); - - it('header item should have headerItemCls', function() { - accordionList.setStore(Ext.create('AccordionListExample.store.Task')); - accordionList.load(); - - waitsFor(function() { - return accordionList.getCount() > 0; - }, "Now, loading data...", 10000); - - runs(function () { - var elems = accordionList.element.query('.' + accordionList.getHeaderItemCls()); - expect(elems.length).toEqual(4); - }); - }); - - it('content item should have contentItemCls', function() { - accordionList.setStore(Ext.create('AccordionListExample.store.Task')); - accordionList.load(); - - waitsFor(function() { - return accordionList.getCount() > 0; - }, "Now, loading data...", 10000); - - runs(function () { - accordionList.doAllExpand(); - var elems = accordionList.element.query('.' + accordionList.getContentItemCls()); - expect(elems.length).toEqual(9); - }); - }); - -}); diff --git a/test/src/app.js b/test/src/app.js deleted file mode 100644 index 1923534..0000000 --- a/test/src/app.js +++ /dev/null @@ -1 +0,0 @@ -/*9e08fba34a37e3b141f9519c233414ba0ddd666a*/(function(){var global=this,objectPrototype=Object.prototype,toString=objectPrototype.toString,enumerables=true,enumerablesTest={toString:1},emptyFn=function(){},i;if(typeof Ext==="undefined"){global.Ext={}}Ext.global=global;for(i in enumerablesTest){enumerables=null}if(enumerables){enumerables=["hasOwnProperty","valueOf","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","constructor"]}Ext.enumerables=enumerables;Ext.apply=function(object,config,defaults){if(defaults){Ext.apply(object,defaults)}if(object&&config&&typeof config==="object"){var i,j,k;for(i in config){object[i]=config[i]}if(enumerables){for(j=enumerables.length;j--;){k=enumerables[j];if(config.hasOwnProperty(k)){object[k]=config[k]}}}}return object};Ext.buildSettings=Ext.apply({baseCSSPrefix:"x-",scopeResetCSS:false},Ext.buildSettings||{});Ext.apply(Ext,{emptyFn:emptyFn,baseCSSPrefix:Ext.buildSettings.baseCSSPrefix,applyIf:function(object,config){var property;if(object){for(property in config){if(object[property]===undefined){object[property]=config[property]}}}return object},iterate:function(object,fn,scope){if(Ext.isEmpty(object)){return}if(scope===undefined){scope=object}if(Ext.isIterable(object)){Ext.Array.each.call(Ext.Array,object,fn,scope)}else{Ext.Object.each.call(Ext.Object,object,fn,scope)}}});Ext.apply(Ext,{extend:function(){var objectConstructor=objectPrototype.constructor,inlineOverrides=function(o){for(var m in o){if(!o.hasOwnProperty(m)){continue}this[m]=o[m]}};return function(subclass,superclass,overrides){if(Ext.isObject(superclass)){overrides=superclass;superclass=subclass;subclass=overrides.constructor!==objectConstructor?overrides.constructor:function(){superclass.apply(this,arguments)}}var F=function(){},subclassProto,superclassProto=superclass.prototype;F.prototype=superclassProto;subclassProto=subclass.prototype=new F();subclassProto.constructor=subclass;subclass.superclass=superclassProto;if(superclassProto.constructor===objectConstructor){superclassProto.constructor=superclass}subclass.override=function(overrides){Ext.override(subclass,overrides)};subclassProto.override=inlineOverrides;subclassProto.proto=subclassProto;subclass.override(overrides);subclass.extend=function(o){return Ext.extend(subclass,o)};return subclass}}(),override:function(cls,overrides){if(cls.$isClass){return cls.override(overrides)}else{Ext.apply(cls.prototype,overrides)}}});Ext.apply(Ext,{valueFrom:function(value,defaultValue,allowBlank){return Ext.isEmpty(value,allowBlank)?defaultValue:value},typeOf:function(value){if(value===null){return"null"}var type=typeof value;if(type==="undefined"||type==="string"||type==="number"||type==="boolean"){return type}var typeToString=toString.call(value);switch(typeToString){case"[object Array]":return"array";case"[object Date]":return"date";case"[object Boolean]":return"boolean";case"[object Number]":return"number";case"[object RegExp]":return"regexp"}if(type==="function"){return"function"}if(type==="object"){if(value.nodeType!==undefined){if(value.nodeType===3){return(/\S/).test(value.nodeValue)?"textnode":"whitespace"}else{return"element"}}return"object"}},isEmpty:function(value,allowEmptyString){return(value===null)||(value===undefined)||(!allowEmptyString?value==="":false)||(Ext.isArray(value)&&value.length===0)},isArray:("isArray" in Array)?Array.isArray:function(value){return toString.call(value)==="[object Array]"},isDate:function(value){return toString.call(value)==="[object Date]"},isMSDate:function(value){if(!Ext.isString(value)){return false}else{return value.match("\\\\?/Date\\(([-+])?(\\d+)(?:[+-]\\d{4})?\\)\\\\?/")!==null}},isObject:(toString.call(null)==="[object Object]")?function(value){return value!==null&&value!==undefined&&toString.call(value)==="[object Object]"&&value.ownerDocument===undefined}:function(value){return toString.call(value)==="[object Object]"},isSimpleObject:function(value){return value instanceof Object&&value.constructor===Object},isPrimitive:function(value){var type=typeof value;return type==="string"||type==="number"||type==="boolean"},isFunction:(typeof document!=="undefined"&&typeof document.getElementsByTagName("body")==="function")?function(value){return toString.call(value)==="[object Function]"}:function(value){return typeof value==="function"},isNumber:function(value){return typeof value==="number"&&isFinite(value)},isNumeric:function(value){return !isNaN(parseFloat(value))&&isFinite(value)},isString:function(value){return typeof value==="string"},isBoolean:function(value){return typeof value==="boolean"},isElement:function(value){return value?value.nodeType===1:false},isTextNode:function(value){return value?value.nodeName==="#text":false},isDefined:function(value){return typeof value!=="undefined"},isIterable:function(value){return(value&&typeof value!=="string")?value.length!==undefined:false}});Ext.apply(Ext,{clone:function(item){if(item===null||item===undefined){return item}if(item.nodeType&&item.cloneNode){return item.cloneNode(true)}var type=toString.call(item);if(type==="[object Date]"){return new Date(item.getTime())}var i,j,k,clone,key;if(type==="[object Array]"){i=item.length;clone=[];while(i--){clone[i]=Ext.clone(item[i])}}else{if(type==="[object Object]"&&item.constructor===Object){clone={};for(key in item){clone[key]=Ext.clone(item[key])}if(enumerables){for(j=enumerables.length;j--;){k=enumerables[j];clone[k]=item[k]}}}}return clone||item},getUniqueGlobalNamespace:function(){var uniqueGlobalNamespace=this.uniqueGlobalNamespace;if(uniqueGlobalNamespace===undefined){var i=0;do{uniqueGlobalNamespace="ExtBox"+(++i)}while(Ext.global[uniqueGlobalNamespace]!==undefined);Ext.global[uniqueGlobalNamespace]=Ext;this.uniqueGlobalNamespace=uniqueGlobalNamespace}return uniqueGlobalNamespace},functionFactory:function(){var args=Array.prototype.slice.call(arguments),ln=args.length;if(ln>0){args[ln-1]="var Ext=window."+this.getUniqueGlobalNamespace()+";"+args[ln-1]}return Function.prototype.constructor.apply(Function.prototype,args)},globalEval:("execScript" in global)?function(code){global.execScript(code)}:function(code){(function(){eval(code)})()}});Ext.type=Ext.typeOf})();(function(){var a="4.1.0",b;Ext.Version=b=Ext.extend(Object,{constructor:function(d){var c=this.toNumber,f,e;if(d instanceof b){return d}this.version=this.shortVersion=String(d).toLowerCase().replace(/_/g,".").replace(/[\-+]/g,"");e=this.version.search(/([^\d\.])/);if(e!==-1){this.release=this.version.substr(e,d.length);this.shortVersion=this.version.substr(0,e)}this.shortVersion=this.shortVersion.replace(/[^\d]/g,"");f=this.version.split(".");this.major=c(f.shift());this.minor=c(f.shift());this.patch=c(f.shift());this.build=c(f.shift());return this},toNumber:function(c){c=parseInt(c||0,10);if(isNaN(c)){c=0}return c},toString:function(){return this.version},valueOf:function(){return this.version},getMajor:function(){return this.major||0},getMinor:function(){return this.minor||0},getPatch:function(){return this.patch||0},getBuild:function(){return this.build||0},getRelease:function(){return this.release||""},isGreaterThan:function(c){return b.compare(this.version,c)===1},isGreaterThanOrEqual:function(c){return b.compare(this.version,c)>=0},isLessThan:function(c){return b.compare(this.version,c)===-1},isLessThanOrEqual:function(c){return b.compare(this.version,c)<=0},equals:function(c){return b.compare(this.version,c)===0},match:function(c){c=String(c);return this.version.substr(0,c.length)===c},toArray:function(){return[this.getMajor(),this.getMinor(),this.getPatch(),this.getBuild(),this.getRelease()]},getShortVersion:function(){return this.shortVersion},gt:function(){return this.isGreaterThan.apply(this,arguments)},lt:function(){return this.isLessThan.apply(this,arguments)},gtEq:function(){return this.isGreaterThanOrEqual.apply(this,arguments)},ltEq:function(){return this.isLessThanOrEqual.apply(this,arguments)}});Ext.apply(b,{releaseValueMap:{dev:-6,alpha:-5,a:-5,beta:-4,b:-4,rc:-3,"#":-2,p:-1,pl:-1},getComponentValue:function(c){return !c?0:(isNaN(c)?this.releaseValueMap[c]||c:parseInt(c,10))},compare:function(g,f){var d,e,c;g=new b(g).toArray();f=new b(f).toArray();for(c=0;ce){return 1}}}return 0}});Ext.apply(Ext,{versions:{},lastRegisteredVersion:null,setVersion:function(d,c){Ext.versions[d]=new b(c);Ext.lastRegisteredVersion=Ext.versions[d];return this},getVersion:function(c){if(c===undefined){return Ext.lastRegisteredVersion}return Ext.versions[c]},deprecate:function(c,e,f,d){if(b.compare(Ext.getVersion(c),e)<1){f.call(d)}}});Ext.setVersion("core",a)})();Ext.String={trimRegex:/^[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u202f\u205f\u3000]+|[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u202f\u205f\u3000]+$/g,escapeRe:/('|\\)/g,formatRe:/\{(\d+)\}/g,escapeRegexRe:/([-.*+?^${}()|[\]\/\\])/g,htmlEncode:(function(){var d={"&":"&",">":">","<":"<",'"':"""},b=[],c,a;for(c in d){b.push(c)}a=new RegExp("("+b.join("|")+")","g");return function(e){return(!e)?e:String(e).replace(a,function(g,f){return d[f]})}})(),htmlDecode:(function(){var d={"&":"&",">":">","<":"<",""":'"'},b=[],c,a;for(c in d){b.push(c)}a=new RegExp("("+b.join("|")+"|&#[0-9]{1,5};)","g");return function(e){return(!e)?e:String(e).replace(a,function(g,f){if(f in d){return d[f]}else{return String.fromCharCode(parseInt(f.substr(2),10))}})}})(),urlAppend:function(b,a){if(!Ext.isEmpty(a)){return b+(b.indexOf("?")===-1?"?":"&")+a}return b},trim:function(a){return a.replace(Ext.String.trimRegex,"")},capitalize:function(a){return a.charAt(0).toUpperCase()+a.substr(1)},ellipsis:function(c,a,d){if(c&&c.length>a){if(d){var e=c.substr(0,a-2),b=Math.max(e.lastIndexOf(" "),e.lastIndexOf("."),e.lastIndexOf("!"),e.lastIndexOf("?"));if(b!==-1&&b>=(a-15)){return e.substr(0,b)+"..."}}return c.substr(0,a-3)+"..."}return c},escapeRegex:function(a){return a.replace(Ext.String.escapeRegexRe,"\\$1")},escape:function(a){return a.replace(Ext.String.escapeRe,"\\$1")},toggle:function(b,c,a){return b===c?a:c},leftPad:function(b,c,d){var a=String(b);d=d||" ";while(a.lengthH){for(C=e;C--;){F[z+C]=F[H+C]}}}if(J&&G===B){F.length=B;F.push.apply(F,I)}else{F.length=B+J;for(C=0;C-1;y--){if(A.call(z||C[y],C[y],y,C)===false){return y}}}return true},forEach:i?function(z,y,e){return z.forEach(y,e)}:function(B,z,y){var e=0,A=B.length;for(;eD.length){return 1}else{if(E.lengthe){e=z}}}return e},mean:function(e){return e.length>0?a.sum(e)/e.length:undefined},sum:function(B){var y=0,e,A,z;for(e=0,A=B.length;e=c){f+=c}else{if(b*2<-c){f-=c}}}return Ext.Number.constrain(f,d,g)},toFixed:function(d,b){if(a){b=b||0;var c=Math.pow(10,b);return(Math.round(d*c)/c).toFixed(b)}return d.toFixed(b)},from:function(c,b){if(isFinite(c)){c=parseFloat(c)}return !isNaN(c)?c:b}}})();Ext.num=function(){return Ext.Number.from.apply(this,arguments)};(function(){var a=function(){};var b=Ext.Object={chain:("create" in Object)?function(c){return Object.create(c)}:function(d){a.prototype=d;var c=new a();a.prototype=null;return c},toQueryObjects:function(e,j,d){var c=b.toQueryObjects,h=[],f,g;if(Ext.isArray(j)){for(f=0,g=j.length;f0){h=n.split("=");v=decodeURIComponent(h[0]);m=(h[1]!==undefined)?decodeURIComponent(h[1]):"";if(!q){if(t.hasOwnProperty(v)){if(!Ext.isArray(t[v])){t[v]=[t[v]]}t[v].push(m)}else{t[v]=m}}else{g=v.match(/(\[):?([^\]]*)\]/g);s=v.match(/^([^\[]+)/);v=s[0];k=[];if(g===null){t[v]=m;continue}for(o=0,c=g.length;o0){return setTimeout(e,c)}e();return 0},createSequence:function(b,c,a){if(!c){return b}else{return function(){var d=b.apply(this,arguments);c.apply(a||this,arguments);return d}}},createBuffered:function(e,b,d,c){var a;return function(){var g=c||Array.prototype.slice.call(arguments,0),f=d||this;if(a){clearTimeout(a)}a=setTimeout(function(){e.apply(f,g)},b)}},createThrottled:function(e,b,d){var f,a,c,h,g=function(){e.apply(d||this,c);f=new Date().getTime()};return function(){a=new Date().getTime()-f;c=arguments;clearTimeout(h);if(!f||(a>=b)){g()}else{h=setTimeout(g,b-a)}}},interceptBefore:function(b,a,c){var d=b[a]||Ext.emptyFn;return b[a]=function(){var e=c.apply(this,arguments);d.apply(this,arguments);return e}},interceptAfter:function(b,a,c){var d=b[a]||Ext.emptyFn;return b[a]=function(){d.apply(this,arguments);return c.apply(this,arguments)}}};Ext.defer=Ext.Function.alias(Ext.Function,"defer");Ext.pass=Ext.Function.alias(Ext.Function,"pass");Ext.bind=Ext.Function.alias(Ext.Function,"bind");Ext.JSON=new (function(){var useHasOwn=!!{}.hasOwnProperty,isNative=function(){var useNative=null;return function(){if(useNative===null){useNative=Ext.USE_NATIVE_JSON&&window.JSON&&JSON.toString()=="[object JSON]"}return useNative}}(),pad=function(n){return n<10?"0"+n:n},doDecode=function(json){return eval("("+json+")")},doEncode=function(o){if(!Ext.isDefined(o)||o===null){return"null"}else{if(Ext.isArray(o)){return encodeArray(o)}else{if(Ext.isDate(o)){return Ext.JSON.encodeDate(o)}else{if(Ext.isString(o)){if(Ext.isMSDate(o)){return encodeMSDate(o)}else{return encodeString(o)}}else{if(typeof o=="number"){return isFinite(o)?String(o):"null"}else{if(Ext.isBoolean(o)){return String(o)}else{if(Ext.isObject(o)){return encodeObject(o)}else{if(typeof o==="function"){return"null"}}}}}}}}return"undefined"},m={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\","\x0b":"\\u000b"},charToReplace=/[\\\"\x00-\x1f\x7f-\uffff]/g,encodeString=function(s){return'"'+s.replace(charToReplace,function(a){var c=m[a];return typeof c==="string"?c:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"'},encodeArray=function(o){var a=["[",""],len=o.length,i;for(i=0;i0){for(d=0;d0){if(m===l){return o[m]}n=o[m];l=l.substring(m.length+1)}if(n.length>0){n+="/"}return n.replace(/\/\.\//g,"/")+l.replace(/\./g,"/")+".js"},getPrefix:function(m){var o=this.config.paths,n,l="";if(o.hasOwnProperty(m)){return m}for(n in o){if(o.hasOwnProperty(n)&&n+"."===m.substring(0,n.length+1)){if(n.length>l.length){l=n}}}return l},require:function(n,m,l,o){if(m){m.call(l)}},syncRequire:function(){},exclude:function(m){var l=this;return{require:function(p,o,n){return l.require(p,o,n,m)},syncRequire:function(p,o,n){return l.syncRequire(p,o,n,m)}}},onReady:function(o,n,p,l){var m;if(p!==false&&Ext.onDocumentReady){m=o;o=function(){Ext.onDocumentReady(m,n,l)}}o.call(n)}};Ext.apply(b,{documentHead:typeof document!="undefined"&&(document.head||document.getElementsByTagName("head")[0]),isLoading:false,queue:[],isClassFileLoaded:{},isFileLoaded:{},readyListeners:[],optionalRequires:[],requiresMap:{},numPendingFiles:0,numLoadedFiles:0,hasFileLoadError:false,classNameToFilePathMap:{},syncModeEnabled:false,scriptElements:{},refreshQueue:function(){var l=this.queue,r=l.length,o,q,m,p,n;if(r===0){this.triggerReady();return}for(o=0;othis.numLoadedFiles){continue}m=0;do{if(a.isCreated(p[m])){g(p,m,1)}else{m++}}while(m=200&&o<300)||o==304||(o==0&&r.length>0)){Ext.globalEval(r+"\n//@ sourceURL="+m);t.call(x)}else{}v=null}},syncRequire:function(){var l=this.syncModeEnabled;if(!l){this.syncModeEnabled=true}this.require.apply(this,arguments);if(!l){this.syncModeEnabled=false}this.refreshQueue()},require:function(G,u,o,r){var w={},n={},z=this.queue,D=this.classNameToFilePathMap,B=this.isClassFileLoaded,t=[],I=[],F=[],m=[],s,H,y,x,l,q,E,C,A,v,p;if(r){r=i(r);for(C=0,v=r.length;C0){t=a.getNamesByExpression(l);for(A=0,p=t.length;A0){s=function(){var L=[],K,M,J;for(K=0,M=m.length;K0){I=a.getNamesByExpression(x);p=I.length;for(A=0;A0){if(!this.config.enabled){throw new Error("Ext.Loader is not enabled, so dependencies cannot be resolved dynamically. Missing required class"+((F.length>1)?"es":"")+": "+F.join(", "))}}else{s.call(o);return this}H=this.syncModeEnabled;if(!H){z.push({requires:F.slice(),callback:s,scope:o})}v=F.length;for(C=0;C=2){if("1496x2048" in r){e(r["1496x2048"],"(orientation: landscape)")}if("1536x2008" in r){e(r["1536x2008"],"(orientation: portrait)")}if("144" in p){n(p["144"],"144x144",t)}}else{if("748x1024" in r){e(r["748x1024"],"(orientation: landscape)")}if("768x1004" in r){e(r["768x1004"],"(orientation: portrait)")}if("72" in p){n(p["72"],"72x72",t)}}}else{if(o>=2&&Ext.os.version.gtEq("4.3")){if(Ext.os.is.iPhone5){e(r["640x1096"])}else{e(r["640x920"])}if("114" in p){n(p["114"],"114x114",t)}}else{e(r["320x460"]);if("57" in p){n(p["57"],null,t)}}}},application:function(b){var a=b.name,e,d,c;if(!b){b={}}if(!Ext.Loader.config.paths[a]){Ext.Loader.setPath(a,b.appFolder||"app")}c=Ext.Array.from(b.requires);b.requires=["Ext.app.Application"];e=b.onReady;d=b.scope;b.onReady=function(){b.requires=c;new Ext.app.Application(b);if(e){e.call(d)}};Ext.setup(b)},factoryConfig:function(a,l){var g=Ext.isSimpleObject(a);if(g&&a.xclass){var f=a.xclass;delete a.xclass;Ext.require(f,function(){Ext.factoryConfig(a,function(i){l(Ext.create(f,i))})});return}var d=Ext.isArray(a),m=[],k,j,c,e;if(g||d){if(g){for(k in a){if(a.hasOwnProperty(k)){j=a[k];if(Ext.isSimpleObject(j)||Ext.isArray(j)){m.push(k)}}}}else{for(c=0,e=a.length;c=e){l(a);return}k=m[c];j=a[k];Ext.factoryConfig(j,h)}b();return}l(a)},factory:function(b,e,a,f){var d=Ext.ClassManager,c;if(!b||b.isInstance){if(a&&a!==b){a.destroy()}return b}if(f){if(typeof b=="string"){return d.instantiateByAlias(f+"."+b)}else{if(Ext.isObject(b)&&"type" in b){return d.instantiateByAlias(f+"."+b.type,b)}}}if(b===true){return a||d.instantiate(e)}if("xtype" in b){c=d.instantiateByAlias("widget."+b.xtype,b)}else{if("xclass" in b){c=d.instantiate(b.xclass,b)}}if(c){if(a){a.destroy()}return c}if(a){return a.setConfig(b)}return d.instantiate(e,b)},deprecateClassMember:function(b,c,a,d){return this.deprecateProperty(b.prototype,c,a,d)},deprecateClassMembers:function(b,c){var d=b.prototype,e,a;for(e in c){if(c.hasOwnProperty(e)){a=c[e];this.deprecateProperty(d,e,a)}}},deprecateProperty:function(b,c,a,d){if(!d){d="'"+c+"' is deprecated"}if(a){d+=", please use '"+a+"' instead"}if(a){Ext.Object.defineProperty(b,c,{get:function(){return this[a]},set:function(e){this[a]=e},configurable:true})}},deprecatePropertyValue:function(b,a,d,c){Ext.Object.defineProperty(b,a,{get:function(){return d},configurable:true})},deprecateMethod:function(b,a,d,c){b[a]=function(){if(d){return d.apply(this,arguments)}}},deprecateClassMethod:function(a,b,h,d){if(typeof b!="string"){var g,f;for(g in b){if(b.hasOwnProperty(g)){f=b[g];Ext.deprecateClassMethod(a,g,f)}}return}var c=typeof h=="string",e;if(!d){d="'"+b+"()' is deprecated, please use '"+(c?h:h.name)+"()' instead"}if(c){e=function(){return this[h].apply(this,arguments)}}else{e=function(){return h.apply(this,arguments)}}if(b in a.prototype){Ext.Object.defineProperty(a.prototype,b,{value:null,writable:true,configurable:true})}a.addMember(b,e)},isReady:false,readyListeners:[],triggerReady:function(){var b=Ext.readyListeners,a,c,d;if(!Ext.isReady){Ext.isReady=true;for(a=0,c=b.length;a0){return b+Ext.String.capitalize(a)}return a},getPreferredTranslationMethod:function(a){if(typeof a=="object"&&"translationMethod" in a&&a.translationMethod!=="auto"){return a.translationMethod}else{if(this.is.AndroidStock2||this.is.IE){return"scrollposition"}else{return"csstransform"}}}},function(){var a=Ext.browser=new this(Ext.global.navigator.userAgent)});Ext.define("Ext.env.OS",{statics:{names:{ios:"iOS",android:"Android",windowsPhone:"WindowsPhone",webos:"webOS",blackberry:"BlackBerry",rimTablet:"RIMTablet",mac:"MacOS",win:"Windows",linux:"Linux",bada:"Bada",chrome:"ChromeOS",other:"Other"},prefixes:{ios:"i(?:Pad|Phone|Pod)(?:.*)CPU(?: iPhone)? OS ",android:"(Android |HTC_|Silk/)",windowsPhone:"Windows Phone ",blackberry:"(?:BlackBerry|BB)(?:.*)Version/",rimTablet:"RIM Tablet OS ",webos:"(?:webOS|hpwOS)/",bada:"Bada/",chrome:"CrOS "}},is:Ext.emptyFn,name:null,version:null,setFlag:function(a,b){if(typeof b=="undefined"){b=true}this.is[a]=b;this.is[a.toLowerCase()]=b;return this},constructor:function(o,b,k){var l=this.statics(),j=l.names,d=l.prefixes,a,h="",c,g,f,n,e,m;k=k||Ext.browser;e=this.is=function(i){return this.is[i]===true};for(c in d){if(d.hasOwnProperty(c)){g=d[c];f=o.match(new RegExp("(?:"+g+")([^\\s;]+)"));if(f){a=j[c];m=f[1];if(m&&m=="HTC_"){h=new Ext.Version("2.3")}else{if(m&&m=="Silk/"){if(/Macintosh/i.test(o)){h=new Ext.Version("2.3")}else{h=new Ext.Version("4.0")}}else{h=new Ext.Version(f[f.length-1])}}break}}}if(!a){a=j[(o.toLowerCase().match(/mac|win|linux/)||["other"])[0]];h=new Ext.Version("")}this.name=a;this.version=h;if(b){this.setFlag(b.replace(/ simulator$/i,""))}this.setFlag(a);if(h){this.setFlag(a+(h.getMajor()||""));this.setFlag(a+h.getShortVersion())}for(c in j){if(j.hasOwnProperty(c)){n=j[c];if(!e.hasOwnProperty(a)){this.setFlag(n,(a===n))}}}if(this.name=="iOS"&&window.screen.height==568){this.setFlag("iPhone5")}if(k.is.Safari||k.is.Silk){if(this.is.Android2||this.is.Android3||k.version.shortVersion==501){k.setFlag("AndroidStock");k.setFlag("AndroidStock2")}if(this.is.Android4){k.setFlag("AndroidStock");k.setFlag("AndroidStock4")}}return this}},function(){var a=Ext.global.navigator,e=a.userAgent,b,g,d;Ext.os=b=new this(e,a.platform);g=b.name;var c=window.location.search.match(/deviceType=(Tablet|Phone)/),f=window.deviceType;if(c&&c[1]){d=c[1]}else{if(f==="iPhone"){d="Phone"}else{if(f==="iPad"){d="Tablet"}else{if(!b.is.Android&&!b.is.iOS&&!b.is.WindowsPhone&&/Windows|Linux|MacOS/.test(g)){d="Desktop";Ext.browser.is.WebView=false}else{if(b.is.iPad||b.is.RIMTablet||b.is.Android3||(b.is.Android4&&e.search(/mobile/i)==-1)){d="Tablet"}else{d="Phone"}}}}}b.setFlag(d,true);b.deviceType=d});Ext.define("Ext.env.Feature",{constructor:function(){this.testElements={};this.has=function(a){return !!this.has[a]};if(!Ext.theme){Ext.theme={name:"Default"}}Ext.onDocumentReady(function(){this.registerTest({ProperHBoxStretching:function(){var b=document.createElement("div"),c=b.appendChild(document.createElement("div")),d=c.appendChild(document.createElement("div")),a;b.setAttribute("style","width: 100px; height: 100px; position: relative;");c.setAttribute("style","position: absolute; display: -ms-flexbox; display: -webkit-flex; display: -moz-flexbox; display: flex; -ms-flex-direction: row; -webkit-flex-direction: row; -moz-flex-direction: row; flex-direction: row; min-width: 100%;");d.setAttribute("style","width: 200px; height: 50px;");document.body.appendChild(b);a=c.offsetWidth;document.body.removeChild(b);return(a>100)}})},this)},getTestElement:function(a,b){if(a===undefined){a="div"}else{if(typeof a!=="string"){return a}}if(b){return document.createElement(a)}if(!this.testElements[a]){this.testElements[a]=document.createElement(a)}return this.testElements[a]},isStyleSupported:function(c,b){var d=this.getTestElement(b).style,a=Ext.String.capitalize(c);if(typeof d[c]!=="undefined"||typeof d[Ext.browser.getStylePrefix(c)+a]!=="undefined"){return true}return false},isEventSupported:function(c,a){if(a===undefined){a=window}var e=this.getTestElement(a),b="on"+c.toLowerCase(),d=(b in e);if(!d){if(e.setAttribute&&e.removeAttribute){e.setAttribute(b,"");d=typeof e[b]==="function";if(typeof e[b]!=="undefined"){e[b]=undefined}e.removeAttribute(b)}}return d},getSupportedPropertyName:function(b,a){var c=Ext.browser.getVendorProperyName(a);if(c in b){return c}else{if(a in b){return a}}return null},registerTest:Ext.Function.flexSetter(function(a,b){this.has[a]=b.call(this);return this})},function(){Ext.feature=new this;var a=Ext.feature.has;Ext.feature.registerTest({Canvas:function(){var b=this.getTestElement("canvas");return !!(b&&b.getContext&&b.getContext("2d"))},Svg:function(){var b=document;return !!(b.createElementNS&&!!b.createElementNS("http://www.w3.org/2000/svg","svg").createSVGRect)},Vml:function(){var c=this.getTestElement(),b=false;c.innerHTML="";b=(c.childNodes.length===1);c.innerHTML="";return b},Touch:function(){return this.isEventSupported("touchstart")&&!(Ext.os&&Ext.os.name.match(/Windows|MacOS|Linux/)&&!Ext.os.is.BlackBerry6)},Pointer:function(){return !!window.navigator.msPointerEnabled},Orientation:function(){return("orientation" in window)&&this.isEventSupported("orientationchange")},OrientationChange:function(){return this.isEventSupported("orientationchange")},DeviceMotion:function(){return this.isEventSupported("devicemotion")},Geolocation:function(){return"geolocation" in window.navigator},SqlDatabase:function(){return"openDatabase" in window},WebSockets:function(){return"WebSocket" in window},Range:function(){return !!document.createRange},CreateContextualFragment:function(){var b=!!document.createRange?document.createRange():false;return b&&!!b.createContextualFragment},History:function(){return("history" in window&&"pushState" in window.history)},CssTransforms:function(){return this.isStyleSupported("transform")},Css3dTransforms:function(){return this.has("CssTransforms")&&this.isStyleSupported("perspective")&&!Ext.browser.is.AndroidStock2},CssAnimations:function(){return this.isStyleSupported("animationName")},CssTransitions:function(){return this.isStyleSupported("transitionProperty")},Audio:function(){return !!this.getTestElement("audio").canPlayType},Video:function(){return !!this.getTestElement("video").canPlayType},ClassList:function(){return"classList" in this.getTestElement()},LocalStorage:function(){var b=false;try{if("localStorage" in window&&window.localStorage!==null){localStorage.setItem("sencha-localstorage-test","test success");localStorage.removeItem("sencha-localstorage-test");b=true}}catch(c){}return b}})});Ext.define("Ext.dom.Query",{select:function(h,b){var g=[],d,f,e,c,a;b=b||document;if(typeof b=="string"){b=document.getElementById(b)}h=h.split(",");for(f=0,c=h.length;f")}else{c.push(">");if((h=d.tpl)){h.applyOut(d.tplData,c)}if((h=d.html)){c.push(h)}if((h=d.cn||d.children)){g.generateMarkup(h,c)}f=g.closeTags;c.push(f[a]||(f[a]=""))}}}return c},generateStyles:function(e,c){var b=c||[],d;for(d in e){if(e.hasOwnProperty(d)){b.push(this.decamelizeName(d),":",e[d],";")}}return c||b.join("")},markup:function(a){if(typeof a=="string"){return a}var b=this.generateMarkup(a,[]);return b.join("")},applyStyles:function(a,b){Ext.fly(a).applyStyles(b)},createContextualFragment:function(c){var f=document.createElement("div"),a=document.createDocumentFragment(),b=0,d,e;f.innerHTML=c;e=f.childNodes;d=e.length;for(;b0){this.id=b=a.id}else{a.id=b=this.mixins.identifiable.getUniqueId.call(this)}Ext.Element.cache[b]=this}return b},setId:function(c){var a=this.id,b=Ext.Element.cache;if(a){delete b[a]}this.dom.id=c;this.id=c;b[c]=this;return this},setHtml:function(a){this.dom.innerHTML=a},getHtml:function(){return this.dom.innerHTML},setText:function(a){this.dom.textContent=a},redraw:function(){var b=this.dom,a=b.style;a.display="none";b.offsetHeight;a.display=""},isPainted:(function(){return !Ext.browser.is.IE?function(){var a=this.dom;return Boolean(a&&a.offsetParent)}:function(){var a=this.dom;return Boolean(a&&(a.offsetHeight!==0&&a.offsetWidth!==0))}})(),set:function(a,b){var e=this.dom,c,d;for(c in a){if(a.hasOwnProperty(c)){d=a[c];if(c=="style"){this.applyStyles(d)}else{if(c=="cls"){e.className=d}else{if(b!==false){if(d===undefined){e.removeAttribute(c)}else{e.setAttribute(c,d)}}else{e[c]=d}}}}}return this},is:function(a){return Ext.DomQuery.is(this.dom,a)},getValue:function(b){var a=this.dom.value;return b?parseInt(a,10):a},getAttribute:function(a,b){var c=this.dom;return c.getAttributeNS(b,a)||c.getAttribute(b+":"+a)||c.getAttribute(a)||c[a]},setSizeState:function(d){var c=["x-sized","x-unsized","x-stretched"],a=[true,false,null],b=a.indexOf(d),e;if(b!==-1){e=c[b];c.splice(b,1);this.addCls(e)}this.removeCls(c);return this},destroy:function(){this.isDestroyed=true;var a=Ext.Element.cache,b=this.dom;if(b&&b.parentNode&&b.tagName!="BODY"){b.parentNode.removeChild(b)}delete a[this.id];delete this.dom}},function(a){Ext.elements=Ext.cache=a.cache;this.addStatics({Fly:new Ext.Class({extend:a,constructor:function(b){this.dom=b}}),_flyweights:{},fly:function(e,c){var f=null,d=a._flyweights,b;c=c||"_global";e=Ext.getDom(e);if(e){f=d[c]||(d[c]=new a.Fly());f.dom=e;f.isSynchronized=false;b=Ext.cache[e.id];if(b&&b.isElement){b.isSynchronized=false}}return f}});Ext.get=function(b){return a.get.call(a,b)};Ext.fly=function(){return a.fly.apply(a,arguments)};Ext.ClassManager.onCreated(function(){a.mixin("observable",Ext.mixin.Observable)},null,"Ext.mixin.Observable")});Ext.dom.Element.addStatics({numberRe:/\d+$/,unitRe:/\d+(px|em|%|en|ex|pt|in|cm|mm|pc)$/i,camelRe:/(-[a-z])/gi,cssRe:/([a-z0-9-]+)\s*:\s*([^;\s]+(?:\s*[^;\s]+)*);?/gi,opacityRe:/alpha\(opacity=(.*)\)/i,propertyCache:{},defaultUnit:"px",borders:{l:"border-left-width",r:"border-right-width",t:"border-top-width",b:"border-bottom-width"},paddings:{l:"padding-left",r:"padding-right",t:"padding-top",b:"padding-bottom"},margins:{l:"margin-left",r:"margin-right",t:"margin-top",b:"margin-bottom"},addUnits:function(b,a){if(b===""||b=="auto"||b===undefined||b===null){return b||""}if(Ext.isNumber(b)||this.numberRe.test(b)){return b+(a||this.defaultUnit||"px")}else{if(!this.unitRe.test(b)){return b||""}}return b},isAncestor:function(b,d){var a=false;b=Ext.getDom(b);d=Ext.getDom(d);if(b&&d){if(b.contains){return b.contains(d)}else{if(b.compareDocumentPosition){return !!(b.compareDocumentPosition(d)&16)}else{while((d=d.parentNode)){a=d==b||a}}}}return a},parseBox:function(b){if(typeof b!="string"){b=b.toString()}var c=b.split(" "),a=c.length;if(a==1){c[1]=c[2]=c[3]=c[0]}else{if(a==2){c[2]=c[0];c[3]=c[1]}else{if(a==3){c[3]=c[1]}}}return{top:c[0]||0,right:c[1]||0,bottom:c[2]||0,left:c[3]||0}},unitizeBox:function(c,a){var b=this;c=b.parseBox(c);return b.addUnits(c.top,a)+" "+b.addUnits(c.right,a)+" "+b.addUnits(c.bottom,a)+" "+b.addUnits(c.left,a)},camelReplaceFn:function(b,c){return c.charAt(1).toUpperCase()},normalize:function(a){return this.propertyCache[a]||(this.propertyCache[a]=a.replace(this.camelRe,this.camelReplaceFn))},fromPoint:function(a,b){return Ext.get(document.elementFromPoint(a,b))},parseStyles:function(c){var a={},b=this.cssRe,d;if(c){b.lastIndex=0;while((d=b.exec(c))){a[d[1]]=d[2]}}return a}});Ext.dom.Element.addMembers({appendChild:function(a){this.dom.appendChild(Ext.getDom(a));return this},removeChild:function(a){this.dom.removeChild(Ext.getDom(a));return this},append:function(){this.appendChild.apply(this,arguments)},appendTo:function(a){Ext.getDom(a).appendChild(this.dom);return this},insertBefore:function(a){a=Ext.getDom(a);a.parentNode.insertBefore(this.dom,a);return this},insertAfter:function(a){a=Ext.getDom(a);a.parentNode.insertBefore(this.dom,a.nextSibling);return this},insertFirst:function(b){var a=Ext.getDom(b),d=this.dom,c=d.firstChild;if(!c){d.appendChild(a)}else{d.insertBefore(a,c)}return this},insertSibling:function(e,c,d){var f=this,b,a=(c||"before").toLowerCase()=="after",g;if(Ext.isArray(e)){g=f;Ext.each(e,function(h){b=Ext.fly(g,"_internal").insertSibling(h,c,d);if(a){g=b}});return b}e=e||{};if(e.nodeType||e.dom){b=f.dom.parentNode.insertBefore(Ext.getDom(e),a?f.dom.nextSibling:f.dom);if(!d){b=Ext.get(b)}}else{if(a&&!f.dom.nextSibling){b=Ext.core.DomHelper.append(f.dom.parentNode,e,!d)}else{b=Ext.core.DomHelper[a?"insertAfter":"insertBefore"](f.dom,e,!d)}}return b},replace:function(a){a=Ext.getDom(a);a.parentNode.replaceChild(this.dom,a);return this},replaceWith:function(a){var b=this;if(a.nodeType||a.dom||typeof a=="string"){a=Ext.get(a);b.dom.parentNode.insertBefore(a,b.dom)}else{a=Ext.core.DomHelper.insertBefore(b.dom,a)}delete Ext.cache[b.id];Ext.removeNode(b.dom);b.id=Ext.id(b.dom=a);Ext.dom.Element.addToCache(b.isFlyweight?new Ext.dom.Element(b.dom):b);return b},doReplaceWith:function(a){var b=this.dom;b.parentNode.replaceChild(Ext.getDom(a),b)},createChild:function(b,a,c){b=b||{tag:"div"};if(a){return Ext.core.DomHelper.insertBefore(a,b,c!==true)}else{return Ext.core.DomHelper[!this.dom.firstChild?"insertFirst":"append"](this.dom,b,c!==true)}},wrap:function(b,c){var e=this.dom,f=this.self.create(b,c),d=(c)?f:f.dom,a=e.parentNode;if(a){a.insertBefore(d,e)}d.appendChild(e);return f},wrapAllChildren:function(a){var d=this.dom,b=d.childNodes,e=this.self.create(a),c=e.dom;while(b.length>0){c.appendChild(d.firstChild)}d.appendChild(c);return e},unwrapAllChildren:function(){var c=this.dom,b=c.childNodes,a=c.parentNode;if(a){while(b.length>0){a.insertBefore(c,c.firstChild)}this.destroy()}},unwrap:function(){var c=this.dom,a=c.parentNode,b;if(a){b=a.parentNode;b.insertBefore(c,a);b.removeChild(a)}else{b=document.createDocumentFragment();b.appendChild(c)}return this},detach:function(){var a=this.dom;if(a&&a.parentNode&&a.tagName!=="BODY"){a.parentNode.removeChild(a)}return this},insertHtml:function(b,c,a){var d=Ext.core.DomHelper.insertHtml(b,this.dom,c);return a?Ext.get(d):d}});Ext.dom.Element.override({getX:function(a){return this.getXY(a)[0]},getY:function(a){return this.getXY(a)[1]},getXY:function(){var b=this.dom.getBoundingClientRect(),a=Math.round;return[a(b.left+window.pageXOffset),a(b.top+window.pageYOffset)]},getOffsetsTo:function(a){var c=this.getXY(),b=Ext.fly(a,"_internal").getXY();return[c[0]-b[0],c[1]-b[1]]},setX:function(a){return this.setXY([a,this.getY()])},setY:function(a){return this.setXY([this.getX(),a])},setXY:function(d){var b=this;if(arguments.length>1){d=[d,arguments[1]]}var c=b.translatePoints(d),a=b.dom.style;for(d in c){if(!c.hasOwnProperty(d)){continue}if(!isNaN(c[d])){a[d]=c[d]+"px"}}return b},getLeft:function(){return parseInt(this.getStyle("left"),10)||0},getRight:function(){return parseInt(this.getStyle("right"),10)||0},getTop:function(){return parseInt(this.getStyle("top"),10)||0},getBottom:function(){return parseInt(this.getStyle("bottom"),10)||0},translatePoints:function(a,g){g=isNaN(a[1])?g:a[1];a=isNaN(a[0])?a:a[0];var d=this,e=d.isStyle("position","relative"),f=d.getXY(),b=parseInt(d.getStyle("left"),10),c=parseInt(d.getStyle("top"),10);b=!isNaN(b)?b:(e?0:d.dom.offsetLeft);c=!isNaN(c)?c:(e?0:d.dom.offsetTop);return{left:(a-f[0]+b),top:(g-f[1]+c)}},setBox:function(d){var c=this,b=d.width,a=d.height,f=d.top,e=d.left;if(e!==undefined){c.setLeft(e)}if(f!==undefined){c.setTop(f)}if(b!==undefined){c.setWidth(b)}if(a!==undefined){c.setHeight(a)}return this},getBox:function(g,j){var h=this,e=h.dom,c=e.offsetWidth,k=e.offsetHeight,n,f,d,a,m,i;if(!j){n=h.getXY()}else{if(g){n=[0,0]}else{n=[parseInt(h.getStyle("left"),10)||0,parseInt(h.getStyle("top"),10)||0]}}if(!g){f={x:n[0],y:n[1],0:n[0],1:n[1],width:c,height:k}}else{d=h.getBorderWidth.call(h,"l")+h.getPadding.call(h,"l");a=h.getBorderWidth.call(h,"r")+h.getPadding.call(h,"r");m=h.getBorderWidth.call(h,"t")+h.getPadding.call(h,"t");i=h.getBorderWidth.call(h,"b")+h.getPadding.call(h,"b");f={x:n[0]+d,y:n[1]+m,0:n[0]+d,1:n[1]+m,width:c-(d+a),height:k-(m+i)}}f.left=f.x;f.top=f.y;f.right=f.x+f.width;f.bottom=f.y+f.height;return f},getPageBox:function(e){var g=this,c=g.dom,j=c.offsetWidth,f=c.offsetHeight,m=g.getXY(),k=m[1],a=m[0]+j,i=m[1]+f,d=m[0];if(!c){return new Ext.util.Region()}if(e){return new Ext.util.Region(k,a,i,d)}else{return{left:d,top:k,width:j,height:f,right:a,bottom:i}}}});Ext.dom.Element.addMembers({WIDTH:"width",HEIGHT:"height",MIN_WIDTH:"min-width",MIN_HEIGHT:"min-height",MAX_WIDTH:"max-width",MAX_HEIGHT:"max-height",TOP:"top",RIGHT:"right",BOTTOM:"bottom",LEFT:"left",VISIBILITY:1,DISPLAY:2,OFFSETS:3,SEPARATOR:"-",trimRe:/^\s+|\s+$/g,wordsRe:/\w/g,spacesRe:/\s+/,styleSplitRe:/\s*(?::|;)\s*/,transparentRe:/^(?:transparent|(?:rgba[(](?:\s*\d+\s*[,]){3}\s*0\s*[)]))$/i,classNameSplitRegex:/[\s]+/,borders:{t:"border-top-width",r:"border-right-width",b:"border-bottom-width",l:"border-left-width"},paddings:{t:"padding-top",r:"padding-right",b:"padding-bottom",l:"padding-left"},margins:{t:"margin-top",r:"margin-right",b:"margin-bottom",l:"margin-left"},defaultUnit:"px",isSynchronized:false,synchronize:function(){var g=this.dom,a={},d=g.className,f,c,e,b;if(d.length>0){f=g.className.split(this.classNameSplitRegex);for(c=0,e=f.length;c0?a:0},getWidth:function(a){var c=this.dom,b=a?(c.clientWidth-this.getPadding("lr")):c.offsetWidth;return b>0?b:0},getBorderWidth:function(a){return this.addStyles(a,this.borders)},getPadding:function(a){return this.addStyles(a,this.paddings)},applyStyles:function(d){if(d){var e=this.dom,c,b,a;if(typeof d=="function"){d=d.call()}c=typeof d;if(c=="string"){d=Ext.util.Format.trim(d).split(this.styleSplitRe);for(b=0,a=d.length;b "+a,c.dom);return b?d:Ext.get(d)},parent:function(a,b){return this.matchNode("parentNode","parentNode",a,b)},next:function(a,b){return this.matchNode("nextSibling","nextSibling",a,b)},prev:function(a,b){return this.matchNode("previousSibling","previousSibling",a,b)},first:function(a,b){return this.matchNode("nextSibling","firstChild",a,b)},last:function(a,b){return this.matchNode("previousSibling","lastChild",a,b)},matchNode:function(b,e,a,c){if(!this.dom){return null}var d=this.dom[e];while(d){if(d.nodeType==1&&(!a||Ext.DomQuery.is(d,a))){return !c?Ext.get(d):d}d=d[b]}return null},isAncestor:function(a){return this.self.isAncestor.call(this.self,this.dom,a)}});Ext.define("Ext.dom.CompositeElementLite",{alternateClassName:["Ext.CompositeElementLite","Ext.CompositeElement"],statics:{importElementMethods:function(){}},constructor:function(b,a){this.elements=[];this.add(b,a);this.el=new Ext.dom.Element.Fly()},isComposite:true,getElement:function(a){return this.el.attach(a).synchronize()},transformElement:function(a){return Ext.getDom(a)},getCount:function(){return this.elements.length},add:function(c,a){var e=this.elements,b,d;if(!c){return this}if(typeof c=="string"){c=Ext.dom.Element.selectorFunction(c,a)}else{if(c.isComposite){c=c.elements}else{if(!Ext.isIterable(c)){c=[c]}}}for(b=0,d=c.length;b-1){c=Ext.getDom(c);if(a){f=this.elements[b];f.parentNode.insertBefore(c,f);Ext.removeNode(f)}Ext.Array.splice(this.elements,b,1,c)}return this},clear:function(){this.elements=[]},addElements:function(c,a){if(!c){return this}if(typeof c=="string"){c=Ext.dom.Element.selectorFunction(c,a)}var b=this.elements;Ext.each(c,function(d){b.push(Ext.get(d))});return this},first:function(){return this.item(0)},last:function(){return this.item(this.getCount()-1)},contains:function(a){return this.indexOf(a)!=-1},removeElement:function(c,e){var b=this,d=this.elements,a;Ext.each(c,function(f){if((a=(d[f]||d[f=b.indexOf(f)]))){if(e){if(a.dom){a.remove()}else{Ext.removeNode(a)}}Ext.Array.erase(d,f,1)}});return this}},function(){var a=Ext.dom.Element,d=a.prototype,c=this.prototype,b;for(b in d){if(typeof d[b]=="function"){(function(e){c[e]=c[e]||function(){return this.invoke(e,arguments)}}).call(c,b)}}c.on=c.addListener;if(Ext.DomQuery){a.selectorFunction=Ext.DomQuery.select}a.select=function(e,f){var g;if(typeof e=="string"){g=a.selectorFunction(e,f)}else{if(e.length!==undefined){g=e}else{}}return new Ext.CompositeElementLite(g)};Ext.select=function(){return a.select.apply(a,arguments)}});Ext.define("Ext.event.ListenerStack",{currentOrder:"current",length:0,constructor:function(){this.listeners={before:[],current:[],after:[]};this.lateBindingMap={};return this},add:function(h,j,k,e){var a=this.lateBindingMap,g=this.getAll(e),f=g.length,b,d,c;if(typeof h=="string"&&j.isIdentifiable){c=j.getId();b=a[c];if(b){if(b[h]){return false}else{b[h]=true}}else{a[c]=b={};b[h]=true}}else{if(f>0){while(f--){d=g[f];if(d.fn===h&&d.scope===j){d.options=k;return false}}}}d=this.create(h,j,k,e);if(k&&k.prepend){delete k.prepend;g.unshift(d)}else{g.push(d)}this.length++;return true},getAt:function(b,a){return this.getAll(a)[b]},getAll:function(a){if(!a){a=this.currentOrder}return this.listeners[a]},count:function(a){return this.getAll(a).length},create:function(d,c,b,a){return{stack:this,fn:d,firingFn:false,boundFn:false,isLateBinding:typeof d=="string",scope:c,options:b||{},order:a}},remove:function(h,j,e){var g=this.getAll(e),f=g.length,b=false,a=this.lateBindingMap,d,c;if(f>0){while(f--){d=g[f];if(d.fn===h&&d.scope===j){g.splice(f,1);b=true;this.length--;if(typeof h=="string"&&j.isIdentifiable){c=j.getId();if(a[c]&&a[c][h]){delete a[c][h]}}break}}}return b}});Ext.define("Ext.event.Controller",{isFiring:false,listenerStack:null,constructor:function(a){this.firingListeners=[];this.firingArguments=[];this.setInfo(a);return this},setInfo:function(a){this.info=a},getInfo:function(){return this.info},setListenerStacks:function(a){this.listenerStacks=a},fire:function(h,e){var n=this.listenerStacks,m=this.firingListeners,d=this.firingArguments,k=m.push,g=n.length,j,l,c,o,a=false,b=false,f;m.length=0;if(e){if(e.order!=="after"){a=true}else{b=true}}if(g===1){j=n[0].listeners;l=j.before;c=j.current;o=j.after;if(l.length>0){k.apply(m,l)}if(a){k.call(m,e)}if(c.length>0){k.apply(m,c)}if(b){k.call(m,e)}if(o.length>0){k.apply(m,o)}}else{for(f=0;f0){k.apply(m,l)}}if(a){k.call(m,e)}for(f=0;f0){k.apply(m,c)}}if(b){k.call(m,e)}for(f=0;f0){k.apply(m,o)}}}if(m.length===0){return this}if(!h){h=[]}d.length=0;d.push.apply(d,h);d.push(null,this);this.doFire();return this},doFire:function(){var k=this.firingListeners,c=this.firingArguments,g=c.length-2,d,f,b,o,h,n,a,j,l,e,m;this.isPausing=false;this.isPaused=false;this.isStopped=false;this.isFiring=true;for(d=0,f=k.length;d0){this.isPaused=false;this.doFire()}if(a){a.resume()}return this},isInterrupted:function(){return this.isStopped||this.isPaused},stop:function(){var a=this.connectingController;this.isStopped=true;if(a){this.connectingController=null;a.stop()}this.isFiring=false;this.listenerStacks=null;return this},pause:function(){var a=this.connectingController;this.isPausing=true;if(a){a.pause()}return this}});Ext.define("Ext.event.Dispatcher",{statics:{getInstance:function(){if(!this.instance){this.instance=new this()}return this.instance},setInstance:function(a){this.instance=a;return this}},config:{publishers:{}},wildcard:"*",constructor:function(a){this.listenerStacks={};this.activePublishers={};this.publishersCache={};this.noActivePublishers=[];this.controller=null;this.initConfig(a);return this},getListenerStack:function(e,g,c,b){var d=this.listenerStacks,f=d[e],a;b=Boolean(b);if(!f){if(b){d[e]=f={}}else{return null}}f=f[g];if(!f){if(b){d[e][g]=f={}}else{return null}}a=f[c];if(!a){if(b){f[c]=a=new Ext.event.ListenerStack()}else{return null}}return a},getController:function(d,f,c,b){var a=this.controller,e={targetType:d,target:f,eventName:c};if(!a){this.controller=a=new Ext.event.Controller()}if(a.isFiring){a=new Ext.event.Controller()}a.setInfo(e);if(b&&a!==b){a.connect(b)}return a},applyPublishers:function(c){var a,b;this.publishersCache={};for(a in c){if(c.hasOwnProperty(a)){b=c[a];this.registerPublisher(b)}}return c},registerPublisher:function(b){var a=this.activePublishers,c=b.getTargetType(),d=a[c];if(!d){a[c]=d=[]}d.push(b);b.setDispatcher(this);return this},getCachedActivePublishers:function(c,b){var a=this.publishersCache,d;if((d=a[c])&&(d=d[b])){return d}return null},cacheActivePublishers:function(c,b,d){var a=this.publishersCache;if(!a[c]){a[c]={}}a[c][b]=d;return d},getActivePublishers:function(f,b){var g,a,c,e,d;if((g=this.getCachedActivePublishers(f,b))){return g}a=this.activePublishers[f];if(a){g=[];for(c=0,e=a.length;c0}return false},addListener:function(e,f,b){var g=this.getActivePublishers(e,b),d=g.length,c,a;a=this.doAddListener.apply(this,arguments);if(a&&d>0){for(c=0;c0){for(c=0;c0){for(b=0;b 0 ? +1 : (Ext.Date.getWeekOfYear(this) >= 52 && this.getMonth() < 11 ? -1 : 0)))",Y:"Ext.String.leftPad(this.getFullYear(), 4, '0')",y:"('' + this.getFullYear()).substring(2, 4)",a:"(this.getHours() < 12 ? 'am' : 'pm')",A:"(this.getHours() < 12 ? 'AM' : 'PM')",g:"((this.getHours() % 12) ? this.getHours() % 12 : 12)",G:"this.getHours()",h:"Ext.String.leftPad((this.getHours() % 12) ? this.getHours() % 12 : 12, 2, '0')",H:"Ext.String.leftPad(this.getHours(), 2, '0')",i:"Ext.String.leftPad(this.getMinutes(), 2, '0')",s:"Ext.String.leftPad(this.getSeconds(), 2, '0')",u:"Ext.String.leftPad(this.getMilliseconds(), 3, '0')",O:"Ext.Date.getGMTOffset(this)",P:"Ext.Date.getGMTOffset(this, true)",T:"Ext.Date.getTimezone(this)",Z:"(this.getTimezoneOffset() * -60)",c:function(){for(var j="Y-m-dTH:i:sP",g=[],f=0,d=j.length;f= 0 && y >= 0){","v = Ext.Date.add(new Date(y < 100 ? 100 : y, 0, 1, h, i, s, ms), Ext.Date.YEAR, y < 100 ? y - 100 : 0);","v = !strict? v : (strict === true && (z <= 364 || (Ext.Date.isLeapYear(v) && z <= 365))? Ext.Date.add(v, Ext.Date.DAY, z) : null);","}else if(strict === true && !Ext.Date.isValid(y, m + 1, d, h, i, s, ms)){","v = null;","}else{","v = Ext.Date.add(new Date(y < 100 ? 100 : y, m, d, h, i, s, ms), Ext.Date.YEAR, y < 100 ? y - 100 : 0);","}","}","}","if(v){","if(zz != null){","v = Ext.Date.add(v, Ext.Date.SECOND, -v.getTimezoneOffset() * 60 - zz);","}else if(o){","v = Ext.Date.add(v, Ext.Date.MINUTE, -v.getTimezoneOffset() + (sn == '+'? -1 : 1) * (hr * 60 + mn));","}","}","return v;"].join("\n");return function(l){var e=a.parseRegexes.length,m=1,f=[],k=[],j=false,d="";for(var h=0;h Ext.Date.y2kYear ? 1900 + ty : 2000 + ty;\n",s:"(\\d{1,2})"},a:{g:1,c:"if (/(am)/i.test(results[{0}])) {\nif (!h || h == 12) { h = 0; }\n} else { if (!h || h < 12) { h = (h || 0) + 12; }}",s:"(am|pm|AM|PM)"},A:{g:1,c:"if (/(am)/i.test(results[{0}])) {\nif (!h || h == 12) { h = 0; }\n} else { if (!h || h < 12) { h = (h || 0) + 12; }}",s:"(AM|PM|am|pm)"},g:function(){return a.formatCodeToRegex("G")},G:{g:1,c:"h = parseInt(results[{0}], 10);\n",s:"(\\d{1,2})"},h:function(){return a.formatCodeToRegex("H")},H:{g:1,c:"h = parseInt(results[{0}], 10);\n",s:"(\\d{2})"},i:{g:1,c:"i = parseInt(results[{0}], 10);\n",s:"(\\d{2})"},s:{g:1,c:"s = parseInt(results[{0}], 10);\n",s:"(\\d{2})"},u:{g:1,c:"ms = results[{0}]; ms = parseInt(ms, 10)/Math.pow(10, ms.length - 3);\n",s:"(\\d+)"},O:{g:1,c:["o = results[{0}];","var sn = o.substring(0,1),","hr = o.substring(1,3)*1 + Math.floor(o.substring(3,5) / 60),","mn = o.substring(3,5) % 60;","o = ((-12 <= (hr*60 + mn)/60) && ((hr*60 + mn)/60 <= 14))? (sn + Ext.String.leftPad(hr, 2, '0') + Ext.String.leftPad(mn, 2, '0')) : null;\n"].join("\n"),s:"([+-]\\d{4})"},P:{g:1,c:["o = results[{0}];","var sn = o.substring(0,1),","hr = o.substring(1,3)*1 + Math.floor(o.substring(4,6) / 60),","mn = o.substring(4,6) % 60;","o = ((-12 <= (hr*60 + mn)/60) && ((hr*60 + mn)/60 <= 14))? (sn + Ext.String.leftPad(hr, 2, '0') + Ext.String.leftPad(mn, 2, '0')) : null;\n"].join("\n"),s:"([+-]\\d{2}:\\d{2})"},T:{g:0,c:null,s:"[A-Z]{1,4}"},Z:{g:1,c:"zz = results[{0}] * 1;\nzz = (-43200 <= zz && zz <= 50400)? zz : null;\n",s:"([+-]?\\d{1,5})"},c:function(){var e=[],c=[a.formatCodeToRegex("Y",1),a.formatCodeToRegex("m",2),a.formatCodeToRegex("d",3),a.formatCodeToRegex("h",4),a.formatCodeToRegex("i",5),a.formatCodeToRegex("s",6),{c:"ms = results[7] || '0'; ms = parseInt(ms, 10)/Math.pow(10, ms.length - 3);\n"},{c:["if(results[8]) {","if(results[8] == 'Z'){","zz = 0;","}else if (results[8].indexOf(':') > -1){",a.formatCodeToRegex("P",8).c,"}else{",a.formatCodeToRegex("O",8).c,"}","}"].join("\n")}];for(var f=0,d=c.length;f0?"-":"+")+Ext.String.leftPad(Math.floor(Math.abs(e)/60),2,"0")+(d?":":"")+Ext.String.leftPad(Math.abs(e%60),2,"0")},getDayOfYear:function(f){var e=0,h=Ext.Date.clone(f),c=f.getMonth(),g;for(g=0,h.setDate(1),h.setMonth(0);g28){c=Math.min(c,Ext.Date.getLastDateOfMonth(Ext.Date.add(Ext.Date.getFirstDateOfMonth(f),"mo",g)).getDate())}h.setDate(c);h.setMonth(f.getMonth()+g);break;case Ext.Date.YEAR:h.setFullYear(f.getFullYear()+g);break}return h},between:function(d,f,c){var e=d.getTime();return f.getTime()<=e&&e<=c.getTime()},diff:function(e,c,g){var d=Ext.Date,f,h=+c-e;switch(g){case d.MILLI:return h;case d.SECOND:return Math.floor(h/1000);case d.MINUTE:return Math.floor(h/60000);case d.HOUR:return Math.floor(h/3600000);case d.DAY:return Math.floor(h/86400000);case"w":return Math.floor(h/604800000);case d.MONTH:f=(c.getFullYear()*12+c.getMonth())-(e.getFullYear()*12+e.getMonth());if(Ext.Date.add(e,g,f)>c){return f-1}else{return f}case d.YEAR:f=c.getFullYear()-e.getFullYear();if(Ext.Date.add(e,g,f)>c){return f-1}else{return f}}},align:function(d,f,e){var c=new Date(+d);switch(f.toLowerCase()){case Ext.Date.MILLI:return c;break;case Ext.Date.SECOND:c.setUTCSeconds(c.getUTCSeconds()-c.getUTCSeconds()%e);c.setUTCMilliseconds(0);return c;break;case Ext.Date.MINUTE:c.setUTCMinutes(c.getUTCMinutes()-c.getUTCMinutes()%e);c.setUTCSeconds(0);c.setUTCMilliseconds(0);return c;break;case Ext.Date.HOUR:c.setUTCHours(c.getUTCHours()-c.getUTCHours()%e);c.setUTCMinutes(0);c.setUTCSeconds(0);c.setUTCMilliseconds(0);return c;break;case Ext.Date.DAY:if(e==7||e==14){c.setUTCDate(c.getUTCDate()-c.getUTCDay()+1)}c.setUTCHours(0);c.setUTCMinutes(0);c.setUTCSeconds(0);c.setUTCMilliseconds(0);return c;break;case Ext.Date.MONTH:c.setUTCMonth(c.getUTCMonth()-(c.getUTCMonth()-1)%e,1);c.setUTCHours(0);c.setUTCMinutes(0);c.setUTCSeconds(0);c.setUTCMilliseconds(0);return c;break;case Ext.Date.YEAR:c.setUTCFullYear(c.getUTCFullYear()-c.getUTCFullYear()%e,1,1);c.setUTCHours(0);c.setUTCMinutes(0);c.setUTCSeconds(0);c.setUTCMilliseconds(0);return d;break}}};var a=Ext.DateExtras;Ext.apply(Ext.Date,a)})();Ext.define("Ext.util.Format",{singleton:true,defaultDateFormat:"m/d/Y",escapeRe:/('|\\)/g,trimRe:/^[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u202f\u205f\u3000]+|[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u202f\u205f\u3000]+$/g,formatRe:/\{(\d+)\}/g,escapeRegexRe:/([-.*+?^${}()|[\]\/\\])/g,dashesRe:/-/g,iso8601TestRe:/\d\dT\d\d/,iso8601SplitRe:/[- :T\.Z\+]/,ellipsis:function(c,a,d){if(c&&c.length>a){if(d){var e=c.substr(0,a-2),b=Math.max(e.lastIndexOf(" "),e.lastIndexOf("."),e.lastIndexOf("!"),e.lastIndexOf("?"));if(b!=-1&&b>=(a-15)){return e.substr(0,b)+"..."}}return c.substr(0,a-3)+"..."}return c},escapeRegex:function(a){return a.replace(Ext.util.Format.escapeRegexRe,"\\$1")},escape:function(a){return a.replace(Ext.util.Format.escapeRe,"\\$1")},toggle:function(b,c,a){return b==c?a:c},trim:function(a){return a.replace(Ext.util.Format.trimRe,"")},leftPad:function(d,b,c){var a=String(d);c=c||" ";while(a.length/g,">").replace(/").replace(/</g,"<").replace(/"/g,'"').replace(/&/g,"&")},date:function(f,g){var b=f;if(!f){return""}if(!Ext.isDate(f)){b=new Date(Date.parse(f));if(isNaN(b)){if(this.iso8601TestRe.test(f)){if(Ext.os.is.Android&&Ext.os.version.isLessThan("3.0")){var h=[1,4,5,6,7,10,11];var e,d=0;if((e=/^(\d{4}|[+\-]\d{6})(?:-(\d{2})(?:-(\d{2}))?)?(?:T(\d{2}):(\d{2})(?::(\d{2})(?:\.(\d{3}))?)?(?:(Z)|([+\-])(\d{2})(?::(\d{2}))?)?)?$/.exec(f))){for(var c=0,a;(a=h[c]);++c){e[a]=+e[a]||0}e[2]=(+e[2]||1)-1;e[3]=+e[3]||1;if(e[8]!=="Z"&&e[9]!==undefined){d=e[10]*60+e[11];if(e[9]==="+"){d=0-d}}b=new Date(Date.UTC(e[1],e[2],e[3],e[4],e[5]+d,e[6],e[7]))}}else{b=f.split(this.iso8601SplitRe);b=new Date(b[0],b[1]-1,b[2],b[3],b[4],b[5])}}}if(isNaN(b)){b=new Date(Date.parse(f.replace(this.dashesRe,"/")))}f=b}return Ext.Date.format(f,g||Ext.util.Format.defaultDateFormat)}});Ext.define("Ext.Template",{inheritableStatics:{from:function(b,a){b=Ext.getDom(b);return new this(b.value||b.innerHTML,a||"")}},constructor:function(d){var f=this,b=arguments,a=[],c=0,e=b.length,g;f.initialConfig={};if(e===1&&Ext.isArray(d)){b=d;e=b.length}if(e>1){for(;c]*)\>)|(?:<\/tpl>)/g,actionsRe:/\s*(elif|elseif|if|for|exec|switch|case|eval)\s*\=\s*(?:(?:"([^"]*)")|(?:'([^']*)'))\s*/g,propRe:/prop=(?:(?:"([^"]*)")|(?:'([^']*)'))/,defaultRe:/^\s*default\s*$/,elseRe:/^\s*else\s*$/});Ext.define("Ext.XTemplateCompiler",{extend:Ext.XTemplateParser,useEval:Ext.isGecko,useIndex:Ext.isIE6||Ext.isIE7,useFormat:true,propNameRe:/^[\w\d\$]*$/,compile:function(a){var c=this,b=c.generate(a);return c.useEval?c.evalTpl(b):(new Function("Ext",b))(Ext)},generate:function(a){var d=this,b="var fm=Ext.util.Format,ts=Object.prototype.toString;",c;d.maxLevel=0;d.body=["var c0=values, a0="+d.createArrayTest(0)+", p0=parent, n0=xcount, i0=xindex, v;\n"];if(d.definitions){if(typeof d.definitions==="string"){d.definitions=[d.definitions,b]}else{d.definitions.push(b)}}else{d.definitions=[b]}d.switches=[];d.parse(a);d.definitions.push((d.useEval?"$=":"return")+" function ("+d.fnArgs+") {",d.body.join(""),"}");c=d.definitions.join("\n");d.definitions.length=d.body.length=d.switches.length=0;delete d.definitions;delete d.body;delete d.switches;return c},doText:function(c){var b=this,a=b.body;c=c.replace(b.aposRe,"\\'").replace(b.newLineRe,"\\n");if(b.useIndex){a.push("out[out.length]='",c,"'\n")}else{a.push("out.push('",c,"')\n")}},doExpr:function(b){var a=this.body;a.push("if ((v="+b+")!==undefined && (v="+b+")!==null) out");if(this.useIndex){a.push("[out.length]=v+''\n")}else{a.push(".push(v+'')\n")}},doTag:function(a){this.doExpr(this.parseTag(a))},doElse:function(){this.body.push("} else {\n")},doEval:function(a){this.body.push(a,"\n")},doIf:function(b,c){var a=this;if(b==="."){a.body.push("if (values) {\n")}else{if(a.propNameRe.test(b)){a.body.push("if (",a.parseTag(b),") {\n")}else{a.body.push("if (",a.addFn(b),a.callFn,") {\n")}}if(c.exec){a.doExec(c.exec)}},doElseIf:function(b,c){var a=this;if(b==="."){a.body.push("else if (values) {\n")}else{if(a.propNameRe.test(b)){a.body.push("} else if (",a.parseTag(b),") {\n")}else{a.body.push("} else if (",a.addFn(b),a.callFn,") {\n")}}if(c.exec){a.doExec(c.exec)}},doSwitch:function(b){var a=this;if(b==="."){a.body.push("switch (values) {\n")}else{if(a.propNameRe.test(b)){a.body.push("switch (",a.parseTag(b),") {\n")}else{a.body.push("switch (",a.addFn(b),a.callFn,") {\n")}}a.switches.push(0)},doCase:function(e){var d=this,c=Ext.isArray(e)?e:[e],f=d.switches.length-1,a,b;if(d.switches[f]){d.body.push("break;\n")}else{d.switches[f]++}for(b=0,f=c.length;bb){this.isEnded=true;return this.getEndValue()}else{return this.getStartValue()+((a/b)*this.distance)}}});Ext.define("Ext.util.translatable.Abstract",{extend:Ext.Evented,config:{useWrapper:null,easing:null,easingX:null,easingY:null},x:0,y:0,activeEasingX:null,activeEasingY:null,isAnimating:false,isTranslatable:true,constructor:function(a){this.initConfig(a)},factoryEasing:function(a){return Ext.factory(a,Ext.fx.easing.Linear,null,"easing")},applyEasing:function(a){if(!this.getEasingX()){this.setEasingX(this.factoryEasing(a))}if(!this.getEasingY()){this.setEasingY(this.factoryEasing(a))}},applyEasingX:function(a){return this.factoryEasing(a)},applyEasingY:function(a){return this.factoryEasing(a)},doTranslate:Ext.emptyFn,translate:function(a,c,b){if(b){return this.translateAnimated(a,c,b)}if(this.isAnimating){this.stopAnimation()}if(!isNaN(a)&&typeof a=="number"){this.x=a}if(!isNaN(c)&&typeof c=="number"){this.y=c}this.doTranslate(a,c)},translateAxis:function(b,d,c){var a,e;if(b=="x"){a=d}else{e=d}return this.translate(a,e,c)},animate:function(b,a){this.activeEasingX=b;this.activeEasingY=a;this.isAnimating=true;this.lastX=null;this.lastY=null;Ext.AnimationQueue.start(this.doAnimationFrame,this);this.fireEvent("animationstart",this,this.x,this.y);return this},translateAnimated:function(b,g,e){if(!Ext.isObject(e)){e={}}if(this.isAnimating){this.stopAnimation()}var d=Ext.Date.now(),f=e.easing,c=(typeof b=="number")?(e.easingX||f||this.getEasingX()||true):null,a=(typeof g=="number")?(e.easingY||f||this.getEasingY()||true):null;if(c){c=this.factoryEasing(c);c.setStartTime(d);c.setStartValue(this.x);c.setEndValue(b);if("duration" in e){c.setDuration(e.duration)}}if(a){a=this.factoryEasing(a);a.setStartTime(d);a.setStartValue(this.y);a.setEndValue(g);if("duration" in e){a.setDuration(e.duration)}}return this.animate(c,a)},doAnimationFrame:function(){var e=this,c=e.activeEasingX,b=e.activeEasingY,d=Date.now(),a,f;if(!e.isAnimating){return}e.lastRun=d;if(c===null&&b===null){e.stopAnimation();return}if(c!==null){e.x=a=Math.round(c.getValue());if(c.isEnded){e.activeEasingX=null;e.fireEvent("axisanimationend",e,"x",a)}}else{a=e.x}if(b!==null){e.y=f=Math.round(b.getValue());if(b.isEnded){e.activeEasingY=null;e.fireEvent("axisanimationend",e,"y",f)}}else{f=e.y}if(e.lastX!==a||e.lastY!==f){e.doTranslate(a,f);e.lastX=a;e.lastY=f}e.fireEvent("animationframe",e,a,f)},stopAnimation:function(){if(!this.isAnimating){return}this.activeEasingX=null;this.activeEasingY=null;this.isAnimating=false;Ext.AnimationQueue.stop(this.doAnimationFrame,this);this.fireEvent("animationend",this,this.x,this.y)},refresh:function(){this.translate(this.x,this.y)},destroy:function(){if(this.isAnimating){this.stopAnimation()}this.callParent(arguments)}});Ext.define("Ext.util.translatable.Dom",{extend:Ext.util.translatable.Abstract,config:{element:null},applyElement:function(a){if(!a){return}return Ext.get(a)},updateElement:function(){this.refresh()}});Ext.define("Ext.util.translatable.CssTransform",{extend:Ext.util.translatable.Dom,doTranslate:function(a,b){if(!this.isDestroyed){this.getElement().translate(a,b)}},destroy:function(){var a=this.getElement();if(a&&!a.isDestroyed){a.dom.style.webkitTransform=null}this.callSuper()}});Ext.define("Ext.util.translatable.ScrollPosition",{extend:Ext.util.translatable.Dom,type:"scrollposition",config:{useWrapper:true},getWrapper:function(){var c=this.wrapper,b=this.getElement(),a;if(!c){a=b.getParent();if(!a){return null}if(a.hasCls(Ext.baseCSSPrefix+"translatable-hboxfix")){a=a.getParent()}if(this.getUseWrapper()){c=b.wrap()}else{c=a}b.addCls("x-translatable");c.addCls("x-translatable-container");this.wrapper=c;c.on("painted","refresh",this);this.refresh()}return c},doTranslate:function(a,d){var c=this.getWrapper(),b;if(c){b=c.dom;if(typeof a=="number"){b.scrollLeft=500000-a}if(typeof d=="number"){b.scrollTop=500000-d}}},destroy:function(){var a=this.getElement(),b=this.wrapper;if(b){if(!a.isDestroyed){if(this.getUseWrapper()){b.doReplaceWith(a)}a.removeCls("x-translatable")}if(!b.isDestroyed){b.removeCls("x-translatable-container");b.un("painted","refresh",this)}delete this.wrapper;delete this._element}this.callSuper()}});Ext.define("Ext.util.translatable.CssPosition",{extend:Ext.util.translatable.Dom,doTranslate:function(a,c){var b=this.getElement().dom.style;if(typeof a=="number"){b.left=a+"px"}if(typeof c=="number"){b.top=c+"px"}},destroy:function(){var a=this.getElement().dom.style;a.left=null;a.top=null;this.callParent(arguments)}});Ext.define("Ext.util.Translatable",{constructor:function(a){var b=Ext.util.translatable;switch(Ext.browser.getPreferredTranslationMethod(a)){case"scrollposition":return new b.ScrollPosition(a);case"csstransform":return new b.CssTransform(a);case"cssposition":return new b.CssPosition(a)}}});Ext.define("Ext.behavior.Translatable",{extend:Ext.behavior.Behavior,setConfig:function(c){var a=this.translatable,b=this.component;if(c){if(!a){this.translatable=a=new Ext.util.Translatable(c);a.setElement(b.renderElement);a.on("destroy","onTranslatableDestroy",this)}else{if(Ext.isObject(c)){a.setConfig(c)}}}else{if(a){a.destroy()}}return this},getTranslatable:function(){return this.translatable},onTranslatableDestroy:function(){delete this.translatable},onComponentDestroy:function(){var a=this.translatable;if(a){a.destroy()}}});Ext.define("Ext.util.Draggable",{isDraggable:true,mixins:[Ext.mixin.Observable],config:{cls:Ext.baseCSSPrefix+"draggable",draggingCls:Ext.baseCSSPrefix+"dragging",element:null,constraint:"container",disabled:null,direction:"both",initialOffset:{x:0,y:0},translatable:{}},DIRECTION_BOTH:"both",DIRECTION_VERTICAL:"vertical",DIRECTION_HORIZONTAL:"horizontal",defaultConstraint:{min:{x:-Infinity,y:-Infinity},max:{x:Infinity,y:Infinity}},containerWidth:0,containerHeight:0,width:0,height:0,constructor:function(a){var b;this.extraConstraint={};this.initialConfig=a;this.offset={x:0,y:0};this.listeners={dragstart:"onDragStart",drag:"onDrag",dragend:"onDragEnd",resize:"onElementResize",scope:this};if(a&&a.element){b=a.element;delete a.element;this.setElement(b)}return this},applyElement:function(a){if(!a){return}return Ext.get(a)},updateElement:function(a){a.on(this.listeners);this.initConfig(this.initialConfig)},updateInitialOffset:function(b){if(typeof b=="number"){b={x:b,y:b}}var c=this.offset,a,d;c.x=a=b.x;c.y=d=b.y;this.getTranslatable().translate(a,d)},updateCls:function(a){this.getElement().addCls(a)},applyTranslatable:function(a,b){a=Ext.factory(a,Ext.util.Translatable,b);if(a){a.setElement(this.getElement())}return a},setExtraConstraint:function(a){this.extraConstraint=a||{};this.refreshConstraint();return this},addExtraConstraint:function(a){Ext.merge(this.extraConstraint,a);this.refreshConstraint();return this},applyConstraint:function(a){this.currentConstraint=a;if(!a){a=this.defaultConstraint}if(a==="container"){return Ext.merge(this.getContainerConstraint(),this.extraConstraint)}return Ext.merge({},this.extraConstraint,a)},updateConstraint:function(){this.refreshOffset()},getContainerConstraint:function(){var a=this.getContainer(),b=this.getElement();if(!a||!b.dom){return this.defaultConstraint}return{min:{x:0,y:0},max:{x:this.containerWidth-this.width,y:this.containerHeight-this.height}}},getContainer:function(){var a=this.container;if(!a){a=this.getElement().getParent();if(a){this.container=a;a.on({resize:"onContainerResize",destroy:"onContainerDestroy",scope:this})}}return a},onElementResize:function(a,b){this.width=b.width;this.height=b.height;this.refresh()},onContainerResize:function(a,b){this.containerWidth=b.width;this.containerHeight=b.height;this.refresh()},onContainerDestroy:function(){delete this.container;delete this.containerSizeMonitor},detachListeners:function(){this.getElement().un(this.listeners)},isAxisEnabled:function(a){var b=this.getDirection();if(a==="x"){return(b===this.DIRECTION_BOTH||b===this.DIRECTION_HORIZONTAL)}return(b===this.DIRECTION_BOTH||b===this.DIRECTION_VERTICAL)},onDragStart:function(a){if(this.getDisabled()){return false}var b=this.offset;this.fireAction("dragstart",[this,a,b.x,b.y],this.initDragStart)},initDragStart:function(b,c,a,d){this.dragStartOffset={x:a,y:d};this.isDragging=true;this.getElement().addCls(this.getDraggingCls())},onDrag:function(b){if(!this.isDragging){return}var a=this.dragStartOffset;this.fireAction("drag",[this,b,a.x+b.deltaX,a.y+b.deltaY],this.doDrag)},doDrag:function(b,c,a,d){b.setOffset(a,d)},onDragEnd:function(a){if(!this.isDragging){return}this.onDrag(a);this.isDragging=false;this.getElement().removeCls(this.getDraggingCls());this.fireEvent("dragend",this,a,this.offset.x,this.offset.y)},setOffset:function(i,h,b){var f=this.offset,a=this.getConstraint(),e=a.min,c=a.max,d=Math.min,g=Math.max;if(this.isAxisEnabled("x")&&typeof i=="number"){i=d(g(i,e.x),c.x)}else{i=f.x}if(this.isAxisEnabled("y")&&typeof h=="number"){h=d(g(h,e.y),c.y)}else{h=f.y}f.x=i;f.y=h;this.getTranslatable().translate(i,h,b)},getOffset:function(){return this.offset},refreshConstraint:function(){this.setConstraint(this.currentConstraint)},refreshOffset:function(){var a=this.offset;this.setOffset(a.x,a.y)},refresh:function(){this.refreshConstraint();this.getTranslatable().refresh();this.refreshOffset()},enable:function(){return this.setDisabled(false)},disable:function(){return this.setDisabled(true)},destroy:function(){var a=this.getTranslatable();var b=this.getElement();if(b&&!b.isDestroyed){b.removeCls(this.getCls())}this.detachListeners();if(a){a.destroy()}}},function(){});Ext.define("Ext.behavior.Draggable",{extend:Ext.behavior.Behavior,setConfig:function(c){var a=this.draggable,b=this.component;if(c){if(!a){b.setTranslatable(c.translatable);this.draggable=a=new Ext.util.Draggable(c);a.setTranslatable(b.getTranslatable());a.setElement(b.renderElement);a.on("destroy","onDraggableDestroy",this);b.on(this.listeners)}else{if(Ext.isObject(c)){a.setConfig(c)}}}else{if(a){a.destroy()}}return this},getDraggable:function(){return this.draggable},onDraggableDestroy:function(){delete this.draggable},onComponentDestroy:function(){var a=this.draggable;if(a){a.destroy()}}});(function(a){Ext.define("Ext.Component",{extend:Ext.AbstractComponent,alternateClassName:"Ext.lib.Component",mixins:[Ext.mixin.Traversable],xtype:"component",observableType:"component",cachedConfig:{baseCls:null,cls:null,floatingCls:a+"floating",hiddenCls:a+"item-hidden",ui:null,margin:null,padding:null,border:null,styleHtmlCls:a+"html",styleHtmlContent:null},eventedConfig:{flex:null,left:null,top:null,right:null,bottom:null,width:null,height:null,minWidth:null,minHeight:null,maxWidth:null,maxHeight:null,docked:null,centered:null,hidden:null,disabled:null},config:{style:null,html:null,draggable:null,translatable:null,renderTo:null,zIndex:null,tpl:null,enterAnimation:null,exitAnimation:null,showAnimation:null,hideAnimation:null,tplWriteMode:"overwrite",data:null,disabledCls:a+"item-disabled",contentEl:null,itemId:undefined,record:null,plugins:null},listenerOptionsRegex:/^(?:delegate|single|delay|buffer|args|prepend|element)$/,alignmentRegex:/^([a-z]+)-([a-z]+)(\?)?$/,isComponent:true,floating:false,rendered:false,isInner:true,dockPositions:{top:true,right:true,bottom:true,left:true},innerElement:null,element:null,template:[],widthLayoutSized:false,heightLayoutSized:false,layoutStretched:false,sizeState:false,sizeFlags:0,LAYOUT_WIDTH:1,LAYOUT_HEIGHT:2,LAYOUT_BOTH:3,LAYOUT_STRETCHED:4,constructor:function(c){var d=this,b=d.config,e;d.onInitializedListeners=[];d.initialConfig=c;if(c!==undefined&&"id" in c){e=c.id}else{if("id" in b){e=b.id}else{e=d.getId()}}d.id=e;d.setId(e);Ext.ComponentManager.register(d);d.initElement();d.initConfig(d.initialConfig);d.refreshSizeState=d.doRefreshSizeState;d.refreshFloating=d.doRefreshFloating;if(d.refreshSizeStateOnInitialized){d.refreshSizeState()}if(d.refreshFloatingOnInitialized){d.refreshFloating()}d.initialize();d.triggerInitialized();if(d.config.fullscreen){d.fireEvent("fullscreen",d)}d.fireEvent("initialize",d)},beforeInitConfig:function(b){this.beforeInitialize.apply(this,arguments)},beforeInitialize:Ext.emptyFn,initialize:Ext.emptyFn,getTemplate:function(){return this.template},getElementConfig:function(){return{reference:"element",classList:["x-unsized"],children:this.getTemplate()}},triggerInitialized:function(){var f=this.onInitializedListeners,g=f.length,h,e,d,b,c;if(!this.initialized){this.initialized=true;if(g>0){for(c=0;c0)){this.element.replaceCls(b,c)}},updateStyleHtmlCls:function(d,b){var e=this.innerHtmlElement,c=this.innerElement;if(this.getStyleHtmlContent()&&b){if(e){e.replaceCls(b,d)}else{c.replaceCls(b,d)}}},applyStyleHtmlContent:function(b){return Boolean(b)},updateStyleHtmlContent:function(d){var b=this.getStyleHtmlCls(),c=this.innerElement,e=this.innerHtmlElement;if(d){if(e){e.addCls(b)}else{c.addCls(b)}}else{if(e){e.removeCls(b)}else{c.addCls(b)}}},applyContentEl:function(b){if(b){return Ext.get(b)}},updateContentEl:function(b,c){if(c){c.hide();Ext.getBody().append(c)}if(b){this.setHtml(b.dom);b.show()}},getSize:function(){return{width:this.getWidth(),height:this.getHeight()}},isCentered:function(){return Boolean(this.getCentered())},isFloating:function(){return this.floating},isDocked:function(){return Boolean(this.getDocked())},isInnerItem:function(){return this.isInner},setIsInner:function(b){if(b!==this.isInner){this.isInner=b;if(this.initialized){this.fireEvent("innerstatechange",this,b)}}},filterLengthValue:function(b){if(b==="auto"||(!b&&b!==0)){return null}return b},applyTop:function(b){return this.filterLengthValue(b)},applyRight:function(b){return this.filterLengthValue(b)},applyBottom:function(b){return this.filterLengthValue(b)},applyLeft:function(b){return this.filterLengthValue(b)},applyWidth:function(b){return this.filterLengthValue(b)},applyHeight:function(b){return this.filterLengthValue(b)},applyMinWidth:function(b){return this.filterLengthValue(b)},applyMinHeight:function(b){return this.filterLengthValue(b)},applyMaxWidth:function(b){return this.filterLengthValue(b)},applyMaxHeight:function(b){return this.filterLengthValue(b)},doSetTop:function(b){this.element.setTop(b);this.refreshFloating()},doSetRight:function(b){this.element.setRight(b);this.refreshFloating()},doSetBottom:function(b){this.element.setBottom(b);this.refreshFloating()},doSetLeft:function(b){this.element.setLeft(b);this.refreshFloating()},doSetWidth:function(b){this.element.setWidth(b);this.refreshSizeState()},doSetHeight:function(b){this.element.setHeight(b);this.refreshSizeState()},applyFlex:function(b){if(b){b=Number(b);if(isNaN(b)){b=null}}else{b=null}return b},doSetFlex:Ext.emptyFn,refreshSizeState:function(){this.refreshSizeStateOnInitialized=true},doRefreshSizeState:function(){var c=this.getWidth()!==null||this.widthLayoutSized||(this.getLeft()!==null&&this.getRight()!==null),d=this.getHeight()!==null||this.heightLayoutSized||(this.getTop()!==null&&this.getBottom()!==null),f=this.layoutStretched||this.hasCSSMinHeight||(!d&&this.getMinHeight()!==null),e=c&&d,b=(c&&this.LAYOUT_WIDTH)|(d&&this.LAYOUT_HEIGHT)|(f&&this.LAYOUT_STRETCHED);if(!e&&f){e=null}this.setSizeState(e);this.setSizeFlags(b)},setLayoutSizeFlags:function(b){this.layoutStretched=!!(b&this.LAYOUT_STRETCHED);this.widthLayoutSized=!!(b&this.LAYOUT_WIDTH);this.heightLayoutSized=!!(b&this.LAYOUT_HEIGHT);this.refreshSizeState()},setSizeFlags:function(b){if(b!==this.sizeFlags){this.sizeFlags=b;var c=!!(b&this.LAYOUT_WIDTH),d=!!(b&this.LAYOUT_HEIGHT),e=!!(b&this.LAYOUT_STRETCHED);if(c&&!e&&!d){this.element.addCls("x-has-width")}else{this.element.removeCls("x-has-width")}if(d&&!e&&!c){this.element.addCls("x-has-height")}else{this.element.removeCls("x-has-height")}if(this.initialized){this.fireEvent("sizeflagschange",this,b)}}},getSizeFlags:function(){if(!this.initialized){this.doRefreshSizeState()}return this.sizeFlags},setSizeState:function(b){if(b!==this.sizeState){this.sizeState=b;this.element.setSizeState(b);if(this.initialized){this.fireEvent("sizestatechange",this,b)}}},getSizeState:function(){if(!this.initialized){this.doRefreshSizeState()}return this.sizeState},doSetMinWidth:function(b){this.element.setMinWidth(b)},doSetMinHeight:function(b){this.element.setMinHeight(b);this.refreshSizeState()},doSetMaxWidth:function(b){this.element.setMaxWidth(b)},doSetMaxHeight:function(b){this.element.setMaxHeight(b)},applyCentered:function(b){b=Boolean(b);if(b){this.refreshInnerState=Ext.emptyFn;if(this.isFloating()){this.resetFloating()}if(this.isDocked()){this.setDocked(false)}this.setIsInner(false);delete this.refreshInnerState}return b},doSetCentered:function(b){this.toggleCls(this.getFloatingCls(),b);if(!b){this.refreshInnerState()}},applyDocked:function(b){if(!b){return null}this.refreshInnerState=Ext.emptyFn;if(this.isFloating()){this.resetFloating()}if(this.isCentered()){this.setCentered(false)}this.setIsInner(false);delete this.refreshInnerState;return b},doSetDocked:function(c,b){this.fireEvent("afterdockedchange",this,c,b);if(!c){this.refreshInnerState()}},resetFloating:function(){this.setTop(null);this.setRight(null);this.setBottom(null);this.setLeft(null)},refreshInnerState:function(){this.setIsInner(!this.isCentered()&&!this.isFloating()&&!this.isDocked())},refreshFloating:function(){this.refreshFloatingOnInitialized=true},doRefreshFloating:function(){var c=true,b=this.getFloatingCls();if(this.getTop()===null&&this.getBottom()===null&&this.getRight()===null&&this.getLeft()===null){c=false}else{this.refreshSizeState()}if(c!==this.floating){this.floating=c;if(c){this.refreshInnerState=Ext.emptyFn;if(this.isCentered()){this.setCentered(false)}if(this.isDocked()){this.setDocked(false)}this.setIsInner(false);delete this.refreshInnerState}this.element.toggleCls(b,c);if(this.initialized){this.fireEvent("floatingchange",this,c)}if(!c){this.refreshInnerState()}}},updateFloatingCls:function(b,c){if(this.isFloating()){this.replaceCls(c,b)}},applyDisabled:function(b){return Boolean(b)},doSetDisabled:function(b){this.element[b?"addCls":"removeCls"](this.getDisabledCls())},updateDisabledCls:function(b,c){if(this.isDisabled()){this.element.replaceCls(c,b)}},disable:function(){this.setDisabled(true)},enable:function(){this.setDisabled(false)},isDisabled:function(){return this.getDisabled()},applyZIndex:function(b){if(!b&&b!==0){b=null}if(b!==null){b=Number(b);if(isNaN(b)){b=null}}return b},updateZIndex:function(d){var c=this.element,b;if(c&&!c.isDestroyed){b=c.dom.style;if(d!==null){b.setProperty("z-index",d,"important")}else{b.removeProperty("z-index")}}},getInnerHtmlElement:function(){var b=this.innerHtmlElement,c=this.getStyleHtmlCls();if(!b||!b.dom||!b.dom.parentNode){this.innerHtmlElement=b=this.innerElement.createChild({cls:"x-innerhtml "});if(this.getStyleHtmlContent()){this.innerHtmlElement.addCls(c);this.innerElement.removeCls(c)}}return b},updateHtml:function(b){var c=this.getInnerHtmlElement();if(Ext.isElement(b)){c.setHtml("");c.append(b)}else{c.setHtml(b)}},applyHidden:function(b){return Boolean(b)},doSetHidden:function(c){var b=this.renderElement;if(b.isDestroyed){return}if(c){b.hide()}else{b.show()}if(this.element){this.element[c?"addCls":"removeCls"](this.getHiddenCls())}this.fireEvent(c?"hide":"show",this)},updateHiddenCls:function(b,c){if(this.isHidden()){this.element.replaceCls(c,b)}},isHidden:function(){return this.getHidden()},hide:function(b){if(!this.getHidden()){if(b===undefined||(b&&b.isComponent)){b=this.getHideAnimation()}if(b){if(b===true){b="fadeOut"}this.onBefore({hiddenchange:"animateFn",scope:this,single:true,args:[b]})}this.setHidden(true)}return this},show:function(c){var b=this.getHidden();if(b||b===null){if(c===true){c="fadeIn"}else{if(c===undefined||(c&&c.isComponent)){c=this.getShowAnimation()}}if(c){this.onBefore({hiddenchange:"animateFn",scope:this,single:true,args:[c]})}this.setHidden(false)}return this},animateFn:function(g,e,h,d,c,b){if(g&&(!h||(h&&this.isPainted()))){var f=new Ext.fx.Animation(g);f.setElement(e.element);if(h){f.setOnEnd(function(){b.resume()});b.pause()}Ext.Animator.run(f)}},setVisibility:function(b){this.renderElement.setVisibility(b)},isRendered:function(){return this.rendered},isPainted:function(){return this.renderElement.isPainted()},applyTpl:function(b){return(Ext.isObject(b)&&b.isTemplate)?b:new Ext.XTemplate(b)},applyData:function(b){if(Ext.isObject(b)){return Ext.apply({},b)}else{if(!b){b={}}}return b},updateData:function(d){var e=this;if(d){var c=e.getTpl(),b=e.getTplWriteMode();if(c){c[b](e.getInnerHtmlElement(),d)}this.fireEvent("updatedata",e,d)}},applyRecord:function(b){if(b&&Ext.isObject(b)&&b.isModel){return b}return null},updateRecord:function(c,b){var d=this;if(b){b.unjoin(d)}if(!c){d.updateData("")}else{c.join(d);d.updateData(c.getData(true))}},afterEdit:function(){this.updateRecord(this.getRecord())},afterErase:function(){this.setRecord(null)},applyItemId:function(b){return b||this.getId()},isXType:function(c,b){if(b){return this.xtypes.indexOf(c)!=-1}return Boolean(this.xtypesMap[c])},getXTypes:function(){return this.xtypesChain.join("/")},getDraggableBehavior:function(){var b=this.draggableBehavior;if(!b){b=this.draggableBehavior=new Ext.behavior.Draggable(this)}return b},applyDraggable:function(b){this.getDraggableBehavior().setConfig(b)},getDraggable:function(){return this.getDraggableBehavior().getDraggable()},getTranslatableBehavior:function(){var b=this.translatableBehavior;if(!b){b=this.translatableBehavior=new Ext.behavior.Translatable(this)}return b},applyTranslatable:function(b){this.getTranslatableBehavior().setConfig(b)},getTranslatable:function(){return this.getTranslatableBehavior().getTranslatable()},translateAxis:function(c,e,d){var b,f;if(c==="x"){b=e}else{f=e}return this.translate(b,f,d)},translate:function(){var b=this.getTranslatable();if(!b){this.setTranslatable(true);b=this.getTranslatable()}b.translate.apply(b,arguments)},setRendered:function(c){var b=this.rendered;if(c!==b){this.rendered=c;return true}return false},setSize:function(c,b){if(c!=undefined){this.setWidth(c)}if(b!=undefined){this.setHeight(b)}},doAddListener:function(d,f,e,c,b){if(c&&"element" in c){return this[c.element].doAddListener(d,f,e||this,c,b)}if(d=="painted"||d=="resize"){return this.element.doAddListener(d,f,e||this,c,b)}return this.callParent(arguments)},doRemoveListener:function(d,f,e,c,b){if(c&&"element" in c){this[c.element].doRemoveListener(d,f,e||this,c,b)}return this.callParent(arguments)},showBy:function(c,f){var e=this,b=Ext.Viewport,d=e.getParent();e.setVisibility(false);if(d!==b){b.add(e)}e.show();e.on({hide:"onShowByErased",destroy:"onShowByErased",single:true,scope:e});b.on("resize","alignTo",e,{args:[c,f]});e.alignTo(c,f);e.setVisibility(true)},onShowByErased:function(){Ext.Viewport.un("resize","alignTo",this)},alignTo:function(o,j){var f=o.isComponent?o.renderElement:o,c=this.renderElement,q=f.getPageBox(),B=this.getParent().element.getPageBox(),n=c.getPageBox(),y=q.height,p=q.width,t=n.height,v=n.width;B.bottom-=5;B.height-=10;B.left+=5;B.right-=5;B.top+=5;B.width-=10;if(!j||j==="auto"){if(B.bottom-q.bottomh){d=m.element;k.splice(e,0,n);break}}if(!d){k.push(n);d=this.getBodyElement()}this.itemsCount++;if(g==="start"){f.insertBefore(d)}else{f.insertAfter(d)}},removeItem:function(c){var a=c.getDocked(),b=this.items[this.positionMap[a]];Ext.Array.remove(b,c);c.element.detach();delete c.$dockWrapper;c.removeCls("x-dock-item");c.removeCls("x-docked-"+a);if(--this.itemsCount===0){this.destroy()}},getItemsSlice:function(c){var a=this.getContainer(),b=this.items,h=[],g,d,f,e;for(g=b.start,d=0,f=g.length;dc){h.push(e)}}for(g=b.end,d=0,f=g.length;dc){h.push(e)}}return h},applyElement:function(a){return Ext.Element.create(a)},updateElement:function(a){a.addCls("x-dock-"+this.getDirection())},applyBodyElement:function(a){return Ext.Element.create(a)},updateBodyElement:function(a){this.getElement().append(a)},updateInnerWrapper:function(a,c){var b=this.getBodyElement();if(c&&c.$outerWrapper===this){c.getElement().detach();delete c.$outerWrapper}if(a){a.setSizeState(this.getSizeState());a.$outerWrapper=this;b.append(a.getElement())}},updateSizeState:function(b){var a=this.getInnerWrapper();this.getElement().setSizeState(b);if(a){a.setSizeState(b)}},destroy:function(){var c=this.getInnerWrapper(),b=this.$outerWrapper,a;if(c){if(b){b.setInnerWrapper(c)}else{a=c.getElement();if(!a.isDestroyed){a.replace(this.getElement())}delete c.$outerWrapper}}delete this.$outerWrapper;this.setInnerWrapper(null);this.unlink("_bodyElement","_element");this.callSuper()}});Ext.define("Ext.layout.Default",{extend:Ext.layout.Abstract,isAuto:true,alias:["layout.default","layout.auto"],config:{animation:null},centerWrapperClass:"x-center",dockWrapperClass:"x-dock",positionMap:{top:"start",left:"start",middle:"center",bottom:"end",right:"end"},positionDirectionMap:{top:"vertical",bottom:"vertical",left:"horizontal",right:"horizontal"},setContainer:function(a){var b={delegate:"> component"};this.dockedItems=[];this.callSuper(arguments);a.on("centeredchange","onItemCenteredChange",this,b,"before").on("floatingchange","onItemFloatingChange",this,b,"before").on("dockedchange","onBeforeItemDockedChange",this,b,"before").on("afterdockedchange","onAfterItemDockedChange",this,b)},monitorSizeStateChange:function(){this.monitorSizeStateChange=Ext.emptyFn;this.container.on("sizestatechange","onContainerSizeStateChange",this)},monitorSizeFlagsChange:function(){this.monitorSizeFlagsChange=Ext.emptyFn;this.container.on("sizeflagschange","onContainerSizeFlagsChange",this)},onItemAdd:function(a){var b=a.getDocked();if(b!==null){this.dockItem(a)}else{if(a.isCentered()){this.onItemCenteredChange(a,true)}else{if(a.isFloating()){this.onItemFloatingChange(a,true)}else{this.onItemInnerStateChange(a,true)}}}},onItemInnerStateChange:function(b,a,c){if(a){this.insertInnerItem(b,this.container.innerIndexOf(b))}else{this.removeInnerItem(b)}},insertInnerItem:function(f,d){var b=this.container,h=b.innerElement.dom,e=f.element.dom,g=d!==-1?b.getInnerAt(d+1):null,c=null,a;if(g){a=g.getTranslatable();if(a&&a.getUseWrapper()){c=a.getWrapper().dom}else{c=g?g.element.dom:null}}h.insertBefore(e,c);return this},insertBodyItem:function(c){var a=this.container.setUseBodyElement(true),b=a.bodyElement.dom;if(c.getZIndex()===null){c.setZIndex((a.indexOf(c)+1)*2)}b.insertBefore(c.element.dom,b.firstChild);return this},removeInnerItem:function(a){a.element.detach()},removeBodyItem:function(a){a.setZIndex(null);a.element.detach()},onItemRemove:function(b,a,c){var d=b.getDocked();if(d){this.undockItem(b)}else{if(b.isCentered()){this.onItemCenteredChange(b,false)}else{if(b.isFloating()){this.onItemFloatingChange(b,false)}else{this.onItemInnerStateChange(b,false,c)}}}},onItemMove:function(b,c,a){if(b.isCentered()||b.isFloating()){b.setZIndex((c+1)*2)}else{if(b.isInnerItem()){this.insertInnerItem(b,this.container.innerIndexOf(b))}else{this.undockItem(b);this.dockItem(b)}}},onItemCenteredChange:function(c,a){var b="$centerWrapper";if(a){this.insertBodyItem(c);c.link(b,new Ext.util.Wrapper({className:this.centerWrapperClass},c.element))}else{c.unlink(b);this.removeBodyItem(c)}},onItemFloatingChange:function(a,b){if(b){this.insertBodyItem(a)}else{this.removeBodyItem(a)}},onBeforeItemDockedChange:function(a,c,b){if(b){this.undockItem(a)}},onAfterItemDockedChange:function(a,c,b){if(c){this.dockItem(a)}},onContainerSizeStateChange:function(){var a=this.getDockWrapper();if(a){a.setSizeState(this.container.getSizeState())}},onContainerSizeFlagsChange:function(){var a=this.dockedItems,b,d,c;for(b=0,d=a.length;bt){n=q||p[0];p.splice(m,0,s);break}q=v}if(!n){n=p[g-1];p.push(s)}a=n.getDocked();d=n.$dockWrapper;l=f[a];if(u===l){d.addItem(s)}else{k=d.getItemsSlice(t);o=new b({container:this.container,direction:u});if(k.length>0){if(k.length===d.itemsCount){c=d;o.setSizeState(c.getSizeState());o.getElement().replace(c.getElement())}else{c=new b({container:this.container,direction:l});c.setInnerWrapper(d.getInnerWrapper());c.addItems(k);d.setInnerWrapper(o)}o.setInnerWrapper(c)}else{j=d.getInnerWrapper();d.setInnerWrapper(null);o.setInnerWrapper(j);d.setInnerWrapper(o)}o.addItem(s)}}h.onInitialized("refreshDockedItemLayoutSizeFlags",this,[s])},getDockWrapper:function(){var a=this.dockedItems;if(a.length>0){return a[0].$dockWrapper}return null},undockItem:function(b){var a=this.dockedItems;if(b.$dockWrapper){b.$dockWrapper.removeItem(b)}Ext.Array.remove(a,b);b.setLayoutSizeFlags(0)},destroy:function(){this.dockedItems.length=0;delete this.dockedItems;this.callSuper()}});Ext.define("Ext.layout.Box",{extend:Ext.layout.Default,config:{orient:"horizontal",align:"start",pack:"start"},alias:"layout.tablebox",layoutBaseClass:"x-layout-tablebox",itemClass:"x-layout-tablebox-item",setContainer:function(a){this.callSuper(arguments);a.innerElement.addCls(this.layoutBaseClass);a.on("flexchange","onItemFlexChange",this,{delegate:"> component"})},onItemInnerStateChange:function(b,a){this.callSuper(arguments);b.toggleCls(this.itemClass,a)},onItemFlexChange:function(){}});Ext.define("Ext.layout.FlexBox",{extend:Ext.layout.Box,alias:"layout.box",config:{align:"stretch"},layoutBaseClass:"x-layout-box",itemClass:"x-layout-box-item",setContainer:function(a){this.callSuper(arguments);this.monitorSizeFlagsChange()},applyOrient:function(a){return a},updateOrient:function(c,b){var a=this.container,d={delegate:"> component"};if(c==="horizontal"){this.sizePropertyName="width"}else{this.sizePropertyName="height"}a.innerElement.swapCls("x-"+c,"x-"+b);if(b){a.un(b==="horizontal"?"widthchange":"heightchange","onItemSizeChange",this,d);this.redrawContainer()}a.on(c==="horizontal"?"widthchange":"heightchange","onItemSizeChange",this,d)},onItemInnerStateChange:function(d,c){this.callSuper(arguments);var a,b;d.toggleCls(this.itemClass,c);if(c){a=d.getFlex();b=d.get(this.sizePropertyName);if(a){this.doItemFlexChange(d,a)}else{if(b){this.doItemSizeChange(d,b)}}}this.refreshItemSizeState(d)},refreshItemSizeState:function(e){var c=e.isInnerItem(),a=this.container,f=a.LAYOUT_HEIGHT,d=a.LAYOUT_WIDTH,g=this.sizePropertyName,b=0,h=a.getSizeFlags();if(c){b|=a.LAYOUT_STRETCHED;if(this.getAlign()==="stretch"){b|=h&(g==="width"?f:d)}if(e.getFlex()){b|=h&(g==="width"?d:f)}}e.setLayoutSizeFlags(b)},refreshAllItemSizedStates:function(){var d=this.container.innerItems,a,c,b;for(a=0,c=d.length;aj){e=n.element;l.splice(f,0,o);break}}if(!e){l.push(o);e=this.getBodyElement()}this.itemsCount++;if(h==="start"){g.insertBefore(e)}else{g.insertAfter(e)}a.wrap(o.element);a.bindSize(this.getDirection()==="horizontal"?"width":"height")},removeItem:function(c){var a=c.getDocked(),b=this.items[this.positionMap[a]];c.removeCls("x-docked-"+a);Ext.Array.remove(b,c);c.unlink("$dockItemWrapper");c.element.detach();delete c.$dockWrapper;if(--this.itemsCount===0){this.destroy()}},getItemsSlice:function(c){var a=this.getContainer(),b=this.items,h=[],g,d,f,e;for(g=b.start,d=0,f=g.length;dc){h.push(e)}}for(g=b.end,d=0,f=g.length;dc){h.push(e)}}return h},applyElement:function(a){return Ext.Element.create(a)},updateElement:function(a){a.addCls("x-dock-"+this.getDirection())},applyBodyElement:function(a){return Ext.Element.create(a)},updateBodyElement:function(a){this.getElement().append(a)},updateInnerWrapper:function(a,c){var b=this.getBodyElement();if(c&&c.$outerWrapper===this){b.remove(c.getElement());delete c.$outerWrapper}if(a){a.setSizeState(this.getSizeState());a.$outerWrapper=this;b.append(a.getElement())}},updateSizeState:function(b){var a=this.getInnerWrapper();this.getElement().setSizeState(b);if(a){a.setSizeState(b)}},destroy:function(){var b=this.getInnerWrapper(),a=this.$outerWrapper;if(b){if(a){a.setInnerWrapper(b)}else{b.getElement().replace(this.getElement());delete b.$outerWrapper}}delete this.$outerWrapper;this.setInnerWrapper(null);this.unlink("_bodyElement","_element");this.callSuper()}});Ext.define("Ext.layout.VBox",{extend:Ext.layout.FlexBox,alias:"layout.vbox",config:{orient:"vertical"}});Ext.define("Ext.fx.layout.card.Abstract",{extend:Ext.Evented,isAnimation:true,config:{direction:"left",duration:null,reverse:null,layout:null},updateLayout:function(){this.enable()},enable:function(){var a=this.getLayout();if(a){a.onBefore("activeitemchange","onActiveItemChange",this)}},disable:function(){var a=this.getLayout();if(this.isAnimating){this.stopAnimation()}if(a){a.unBefore("activeitemchange","onActiveItemChange",this)}},onActiveItemChange:Ext.emptyFn,destroy:function(){var a=this.getLayout();if(this.isAnimating){this.stopAnimation()}if(a){a.unBefore("activeitemchange","onActiveItemChange",this)}this.setLayout(null);if(this.observableId){this.fireEvent("destroy",this);this.clearListeners();this.clearManagedListeners()}}});Ext.define("Ext.fx.State",{isAnimatable:{"background-color":true,"background-image":true,"background-position":true,"border-bottom-color":true,"border-bottom-width":true,"border-color":true,"border-left-color":true,"border-left-width":true,"border-right-color":true,"border-right-width":true,"border-spacing":true,"border-top-color":true,"border-top-width":true,"border-width":true,bottom:true,color:true,crop:true,"font-size":true,"font-weight":true,height:true,left:true,"letter-spacing":true,"line-height":true,"margin-bottom":true,"margin-left":true,"margin-right":true,"margin-top":true,"max-height":true,"max-width":true,"min-height":true,"min-width":true,opacity:true,"outline-color":true,"outline-offset":true,"outline-width":true,"padding-bottom":true,"padding-left":true,"padding-right":true,"padding-top":true,right:true,"text-indent":true,"text-shadow":true,top:true,"vertical-align":true,visibility:true,width:true,"word-spacing":true,"z-index":true,zoom:true,transform:true},constructor:function(a){this.data={};this.set(a)},setConfig:function(a){this.set(a);return this},setRaw:function(a){this.data=a;return this},clear:function(){return this.setRaw({})},setTransform:function(c,g){var f=this.data,a=Ext.isArray(g),b=f.transform,e,d;if(!b){b=f.transform={translateX:0,translateY:0,translateZ:0,scaleX:1,scaleY:1,scaleZ:1,rotate:0,rotateX:0,rotateY:0,rotateZ:0,skewX:0,skewY:0}}if(typeof c=="string"){switch(c){case"translate":if(a){e=g.length;if(e==0){break}b.translateX=g[0];if(e==1){break}b.translateY=g[1];if(e==2){break}b.translateZ=g[2]}else{b.translateX=g}break;case"rotate":if(a){e=g.length;if(e==0){break}b.rotateX=g[0];if(e==1){break}b.rotateY=g[1];if(e==2){break}b.rotateZ=g[2]}else{b.rotate=g}break;case"scale":if(a){e=g.length;if(e==0){break}b.scaleX=g[0];if(e==1){break}b.scaleY=g[1];if(e==2){break}b.scaleZ=g[2]}else{b.scaleX=g;b.scaleY=g}break;case"skew":if(a){e=g.length;if(e==0){break}b.skewX=g[0];if(e==1){break}b.skewY=g[1]}else{b.skewX=g}break;default:b[c]=g}}else{for(d in c){if(c.hasOwnProperty(d)){g=c[d];this.setTransform(d,g)}}}},set:function(a,d){var c=this.data,b;if(typeof a!="string"){for(b in a){d=a[b];if(b==="transform"){this.setTransform(d)}else{c[b]=d}}}else{if(a==="transform"){this.setTransform(d)}else{c[a]=d}}return this},unset:function(a){var b=this.data;if(b.hasOwnProperty(a)){delete b[a]}return this},getData:function(){return this.data}});Ext.define("Ext.fx.animation.Abstract",{extend:Ext.Evented,isAnimation:true,config:{name:"",element:null,before:null,from:{},to:{},after:null,states:{},duration:300,easing:"linear",iteration:1,direction:"normal",delay:0,onBeforeStart:null,onEnd:null,onBeforeEnd:null,scope:null,reverse:null,preserveEndState:false,replacePrevious:true},STATE_FROM:"0%",STATE_TO:"100%",DIRECTION_UP:"up",DIRECTION_DOWN:"down",DIRECTION_LEFT:"left",DIRECTION_RIGHT:"right",stateNameRegex:/^(?:[\d\.]+)%$/,constructor:function(){this.states={};this.callParent(arguments);return this},applyElement:function(a){return Ext.get(a)},applyBefore:function(a,b){if(a){return Ext.factory(a,Ext.fx.State,b)}},applyAfter:function(b,a){if(b){return Ext.factory(b,Ext.fx.State,a)}},setFrom:function(a){return this.setState(this.STATE_FROM,a)},setTo:function(a){return this.setState(this.STATE_TO,a)},getFrom:function(){return this.getState(this.STATE_FROM)},getTo:function(){return this.getState(this.STATE_TO)},setStates:function(a){var c=this.stateNameRegex,b;for(b in a){if(c.test(b)){this.setState(b,a[b])}}return this},getStates:function(){return this.states},stop:function(){this.fireEvent("stop",this)},destroy:function(){this.stop();this.callParent()},setState:function(b,d){var a=this.getStates(),c;c=Ext.factory(d,Ext.fx.State,a[b]);if(c){a[b]=c}return this},getState:function(a){return this.getStates()[a]},getData:function(){var k=this.getStates(),e={},g=this.getBefore(),c=this.getAfter(),h=k[this.STATE_FROM],i=k[this.STATE_TO],j=h.getData(),f=i.getData(),d,b,a;for(b in k){if(k.hasOwnProperty(b)){a=k[b];d=a.getData();e[b]=d}}if(Ext.browser.is.AndroidStock2){e["0.0001%"]=j}return{before:g?g.getData():{},after:c?c.getData():{},states:e,from:j,to:f,duration:this.getDuration(),iteration:this.getIteration(),direction:this.getDirection(),easing:this.getEasing(),delay:this.getDelay(),onEnd:this.getOnEnd(),onBeforeEnd:this.getOnBeforeEnd(),onBeforeStart:this.getOnBeforeStart(),scope:this.getScope(),preserveEndState:this.getPreserveEndState(),replacePrevious:this.getReplacePrevious()}}});Ext.define("Ext.fx.animation.Slide",{extend:Ext.fx.animation.Abstract,alternateClassName:"Ext.fx.animation.SlideIn",alias:["animation.slide","animation.slideIn"],config:{direction:"left",out:false,offset:0,easing:"auto",containerBox:"auto",elementBox:"auto",isElementBoxFit:true,useCssTransform:true},reverseDirectionMap:{up:"down",down:"up",left:"right",right:"left"},applyEasing:function(a){if(a==="auto"){return"ease-"+((this.getOut())?"in":"out")}return a},getContainerBox:function(){var a=this._containerBox;if(a==="auto"){a=this.getElement().getParent().getPageBox()}return a},getElementBox:function(){var a=this._elementBox;if(this.getIsElementBoxFit()){return this.getContainerBox()}if(a==="auto"){a=this.getElement().getPageBox()}return a},getData:function(){var p=this.getElementBox(),c=this.getContainerBox(),g=p?p:c,n=this.getFrom(),o=this.getTo(),f=this.getOut(),e=this.getOffset(),m=this.getDirection(),b=this.getUseCssTransform(),h=this.getReverse(),d=0,a=0,l,j,k,i;if(h){m=this.reverseDirectionMap[m]}switch(m){case this.DIRECTION_UP:if(f){a=c.top-g.top-g.height-e}else{a=c.bottom-g.bottom+g.height+e}break;case this.DIRECTION_DOWN:if(f){a=c.bottom-g.bottom+g.height+e}else{a=c.top-g.height-g.top-e}break;case this.DIRECTION_RIGHT:if(f){d=c.right-g.right+g.width+e}else{d=c.left-g.left-g.width-e}break;case this.DIRECTION_LEFT:if(f){d=c.left-g.left-g.width-e}else{d=c.right-g.right+g.width+e}break}l=(f)?0:d;j=(f)?0:a;if(b){n.setTransform({translateX:l,translateY:j})}else{n.set("left",l);n.set("top",j)}k=(f)?d:0;i=(f)?a:0;if(b){o.setTransform({translateX:k,translateY:i})}else{o.set("left",k);o.set("top",i)}return this.callParent(arguments)}});Ext.define("Ext.fx.animation.SlideOut",{extend:Ext.fx.animation.Slide,alias:["animation.slideOut"],config:{out:true}});Ext.define("Ext.fx.animation.Fade",{extend:Ext.fx.animation.Abstract,alternateClassName:"Ext.fx.animation.FadeIn",alias:["animation.fade","animation.fadeIn"],config:{out:false,before:{display:null,opacity:0},after:{opacity:null},reverse:null},updateOut:function(a){var c=this.getTo(),b=this.getFrom();if(a){b.set("opacity",1);c.set("opacity",0)}else{b.set("opacity",0);c.set("opacity",1)}}});Ext.define("Ext.fx.animation.FadeOut",{extend:Ext.fx.animation.Fade,alias:"animation.fadeOut",config:{out:true,before:{}}});Ext.define("Ext.fx.animation.Flip",{extend:Ext.fx.animation.Abstract,alias:"animation.flip",config:{easing:"ease-in",direction:"right",half:false,out:null},getData:function(){var h=this.getFrom(),i=this.getTo(),g=this.getDirection(),b=this.getOut(),l=this.getHalf(),c=(l)?90:180,e=1,a=1,k=0,j=0,f=0,d=0;if(b){a=0.8}else{e=0.8}switch(g){case this.DIRECTION_UP:if(b){f=c}else{k=-c}break;case this.DIRECTION_DOWN:if(b){f=-c}else{k=c}break;case this.DIRECTION_RIGHT:if(b){d=-c}else{j=c}break;case this.DIRECTION_LEFT:if(b){d=-c}else{j=c}break}h.setTransform({rotateX:k,rotateY:j,scale:e});i.setTransform({rotateX:f,rotateY:d,scale:a});return this.callParent(arguments)}});Ext.define("Ext.fx.animation.Pop",{extend:Ext.fx.animation.Abstract,alias:["animation.pop","animation.popIn"],alternateClassName:"Ext.fx.animation.PopIn",config:{out:false,before:{display:null,opacity:0},after:{opacity:null}},getData:function(){var c=this.getTo(),b=this.getFrom(),a=this.getOut();if(a){b.set("opacity",1);b.setTransform({scale:1});c.set("opacity",0);c.setTransform({scale:0})}else{b.set("opacity",0);b.setTransform({scale:0});c.set("opacity",1);c.setTransform({scale:1})}return this.callParent(arguments)}});Ext.define("Ext.fx.animation.PopOut",{extend:Ext.fx.animation.Pop,alias:"animation.popOut",config:{out:true,before:{}}});Ext.define("Ext.fx.Animation",{constructor:function(b){var a=Ext.fx.animation.Abstract,c;if(typeof b=="string"){c=b;b={}}else{if(b&&b.type){c=b.type}}if(c){if(Ext.browser.is.AndroidStock2){if(c=="pop"){c="fade"}if(c=="popIn"){c="fadeIn"}if(c=="popOut"){c="fadeOut"}}a=Ext.ClassManager.getByAlias("animation."+c)}return Ext.factory(b,a)}});Ext.define("Ext.fx.layout.card.Style",{extend:Ext.fx.layout.card.Abstract,config:{inAnimation:{before:{visibility:null},preserveEndState:false,replacePrevious:true},outAnimation:{preserveEndState:false,replacePrevious:true}},constructor:function(b){var c,a;this.initConfig(b);this.endAnimationCounter=0;c=this.getInAnimation();a=this.getOutAnimation();c.on("animationend","incrementEnd",this);a.on("animationend","incrementEnd",this)},updateDirection:function(a){this.getInAnimation().setDirection(a);this.getOutAnimation().setDirection(a)},updateDuration:function(a){this.getInAnimation().setDuration(a);this.getOutAnimation().setDuration(a)},updateReverse:function(a){this.getInAnimation().setReverse(a);this.getOutAnimation().setReverse(a)},incrementEnd:function(){this.endAnimationCounter++;if(this.endAnimationCounter>1){this.endAnimationCounter=0;this.fireEvent("animationend",this)}},applyInAnimation:function(b,a){return Ext.factory(b,Ext.fx.Animation,a)},applyOutAnimation:function(b,a){return Ext.factory(b,Ext.fx.Animation,a)},updateInAnimation:function(a){a.setScope(this)},updateOutAnimation:function(a){a.setScope(this)},onActiveItemChange:function(a,e,h,i,d){var b=this.getInAnimation(),g=this.getOutAnimation(),f,c;if(e&&h&&h.isPainted()){f=e.renderElement;c=h.renderElement;b.setElement(f);g.setElement(c);g.setOnBeforeEnd(function(j,k){if(k||Ext.Animator.hasRunningAnimations(j)){d.firingArguments[1]=null;d.firingArguments[2]=null}});g.setOnEnd(function(){d.resume()});f.dom.style.setProperty("visibility","hidden","important");e.show();Ext.Animator.run([g,b]);d.pause()}},destroy:function(){Ext.destroy(this.getInAnimation(),this.getOutAnimation());this.callParent(arguments)}});Ext.define("Ext.fx.layout.card.Slide",{extend:Ext.fx.layout.card.Style,alias:"fx.layout.card.slide",config:{inAnimation:{type:"slide",easing:"ease-out"},outAnimation:{type:"slide",easing:"ease-out",out:true}},updateReverse:function(a){this.getInAnimation().setReverse(a);this.getOutAnimation().setReverse(a)}});Ext.define("Ext.fx.layout.card.Cover",{extend:Ext.fx.layout.card.Style,alias:"fx.layout.card.cover",config:{reverse:null,inAnimation:{before:{"z-index":100},after:{"z-index":0},type:"slide",easing:"ease-out"},outAnimation:{easing:"ease-out",from:{opacity:0.99},to:{opacity:1},out:true}},updateReverse:function(a){this.getInAnimation().setReverse(a);this.getOutAnimation().setReverse(a)}});Ext.define("Ext.fx.layout.card.Reveal",{extend:Ext.fx.layout.card.Style,alias:"fx.layout.card.reveal",config:{inAnimation:{easing:"ease-out",from:{opacity:0.99},to:{opacity:1}},outAnimation:{before:{"z-index":100},after:{"z-index":0},type:"slide",easing:"ease-out",out:true}},updateReverse:function(a){this.getInAnimation().setReverse(a);this.getOutAnimation().setReverse(a)}});Ext.define("Ext.fx.layout.card.Fade",{extend:Ext.fx.layout.card.Style,alias:"fx.layout.card.fade",config:{reverse:null,inAnimation:{type:"fade",easing:"ease-out"},outAnimation:{type:"fade",easing:"ease-out",out:true}}});Ext.define("Ext.fx.layout.card.Flip",{extend:Ext.fx.layout.card.Style,alias:"fx.layout.card.flip",config:{duration:500,inAnimation:{type:"flip",half:true,easing:"ease-out",before:{"backface-visibility":"hidden"},after:{"backface-visibility":null}},outAnimation:{type:"flip",half:true,easing:"ease-in",before:{"backface-visibility":"hidden"},after:{"backface-visibility":null},out:true}},onActiveItemChange:function(e,c,f,b,a){var d=c.element.getParent();d.addCls("x-layout-card-perspective");this.on("animationend",function(){d.removeCls("x-layout-card-perspective")},this,{single:true});this.callParent(arguments)},updateDuration:function(d){var c=d/2,b=this.getInAnimation(),a=this.getOutAnimation();b.setDelay(c);b.setDuration(c);a.setDuration(c)}});Ext.define("Ext.fx.layout.card.Pop",{extend:Ext.fx.layout.card.Style,alias:"fx.layout.card.pop",config:{duration:500,inAnimation:{type:"pop",easing:"ease-out"},outAnimation:{type:"pop",easing:"ease-in",out:true}},updateDuration:function(d){var c=d/2,b=this.getInAnimation(),a=this.getOutAnimation();b.setDelay(c);b.setDuration(c);a.setDuration(c)}});Ext.define("Ext.fx.layout.card.Scroll",{extend:Ext.fx.layout.card.Abstract,alias:"fx.layout.card.scroll",config:{duration:150},constructor:function(a){this.initConfig(a)},getEasing:function(){var a=this.easing;if(!a){this.easing=a=new Ext.fx.easing.Linear()}return a},updateDuration:function(a){this.getEasing().setDuration(a)},onActiveItemChange:function(a,d,l,m,c){var i=this.getDirection(),g=this.getEasing(),k,e,b,h,j,f;if(d&&l){if(this.isAnimating){this.stopAnimation()}d.setWidth("100%");d.setHeight("100%");k=this.getLayout().container.innerElement;h=k.getWidth();j=k.getHeight();e=d.renderElement;b=l.renderElement;this.oldItem=l;this.newItem=d;this.currentEventController=c;this.containerElement=k;this.isReverse=f=this.getReverse();d.show();if(i=="right"){i="left";this.isReverse=f=!f}else{if(i=="down"){i="up";this.isReverse=f=!f}}if(i=="left"){if(f){g.setConfig({startValue:h,endValue:0});k.dom.scrollLeft=h;b.setLeft(h)}else{g.setConfig({startValue:0,endValue:h});e.setLeft(h)}}else{if(f){g.setConfig({startValue:j,endValue:0});k.dom.scrollTop=j;b.setTop(j)}else{g.setConfig({startValue:0,endValue:j});e.setTop(j)}}this.startAnimation();c.pause()}},startAnimation:function(){this.isAnimating=true;this.getEasing().setStartTime(Date.now());Ext.AnimationQueue.start(this.doAnimationFrame,this)},doAnimationFrame:function(){var d=this.getEasing(),c=this.getDirection(),a="scrollTop",b;if(c=="left"||c=="right"){a="scrollLeft"}if(d.isEnded){this.stopAnimation()}else{b=d.getValue();this.containerElement.dom[a]=b}},stopAnimation:function(){var c=this,e=c.getDirection(),a="setTop",d=c.oldItem,b=c.newItem;if(e=="left"||e=="right"){a="setLeft"}c.currentEventController.resume();if(c.isReverse&&d&&d.renderElement&&d.renderElement.dom){d.renderElement[a](null)}else{if(b&&b.renderElement&&b.renderElement.dom){b.renderElement[a](null)}}Ext.AnimationQueue.stop(this.doAnimationFrame,this);c.isAnimating=false;c.fireEvent("animationend",c)}});Ext.define("Ext.fx.layout.Card",{constructor:function(b){var a=Ext.fx.layout.card.Abstract,c;if(!b){return null}if(typeof b=="string"){c=b;b={}}else{if(b.type){c=b.type}}b.elementBox=false;if(c){if(Ext.browser.is.AndroidStock2){if(c!="fade"){c="scroll"}}a=Ext.ClassManager.getByAlias("fx.layout.card."+c)}return Ext.factory(b,a)}});Ext.define("Ext.layout.Card",{extend:Ext.layout.Default,alias:"layout.card",isCard:true,layoutClass:"x-layout-card",itemClass:"x-layout-card-item",applyAnimation:function(a){return new Ext.fx.layout.Card(a)},updateAnimation:function(b,a){if(b&&b.isAnimation){b.setLayout(this)}if(a){a.destroy()}},setContainer:function(a){this.callSuper(arguments);a.innerElement.addCls(this.layoutClass);a.onInitialized("onContainerInitialized",this)},onContainerInitialized:function(){var a=this.container,b=a.getActiveItem();if(b){b.show()}a.on("activeitemchange","onContainerActiveItemChange",this)},onContainerActiveItemChange:function(a){this.relayEvent(arguments,"doActiveItemChange")},onItemInnerStateChange:function(c,b,d){this.callSuper(arguments);var a=this.container,e=a.getActiveItem();c.toggleCls(this.itemClass,b);c.setLayoutSizeFlags(b?a.LAYOUT_BOTH:0);if(b){if(e!==a.innerIndexOf(c)&&e!==c&&c!==a.pendingActiveItem){c.hide()}}else{if(!d&&!c.isDestroyed&&c.isDestroying!==true){c.show()}}},doActiveItemChange:function(b,c,a){if(a){a.hide()}if(c){c.show()}},destroy:function(){this.callParent(arguments);Ext.destroy(this.getAnimation())}});Ext.define("Ext.util.Filter",{isFilter:true,config:{property:null,value:null,filterFn:Ext.emptyFn,anyMatch:false,exactMatch:false,caseSensitive:false,root:null,id:undefined,scope:null},applyId:function(a){if(!a){if(this.getProperty()){a=this.getProperty()+"-"+String(this.getValue())}if(!a){a=Ext.id(null,"ext-filter-")}}return a},constructor:function(a){this.initConfig(a)},applyFilterFn:function(b){if(b===Ext.emptyFn){b=this.getInitialConfig("filter");if(b){return b}var a=this.getValue();if(!this.getProperty()&&!a&&a!==0){return Ext.emptyFn}else{return this.createFilterFn()}}return b},createFilterFn:function(){var a=this,b=a.createValueMatcher();return function(d){var c=a.getRoot(),e=a.getProperty();if(c){d=d[c]}return b.test(d[e])}},createValueMatcher:function(){var d=this,e=d.getValue(),f=d.getAnyMatch(),c=d.getExactMatch(),a=d.getCaseSensitive(),b=Ext.String.escapeRegex;if(e===null||e===undefined||!e.exec){e=String(e);if(f===true){e=b(e)}else{e="^"+b(e);if(c===true){e+="$"}}e=new RegExp(e,a?"":"i")}return e}});Ext.define("Ext.util.AbstractMixedCollection",{mixins:{observable:Ext.mixin.Observable},constructor:function(b,a){var c=this;c.items=[];c.map={};c.keys=[];c.length=0;c.allowFunctions=b===true;if(a){c.getKey=a}c.mixins.observable.constructor.call(c)},allowFunctions:false,add:function(b,e){var d=this,f=e,c=b,a;if(arguments.length==1){f=c;c=d.getKey(f)}if(typeof c!="undefined"&&c!==null){a=d.map[c];if(typeof a!="undefined"){return d.replace(c,f)}d.map[c]=f}d.length++;d.items.push(f);d.keys.push(c);d.fireEvent("add",d.length-1,f,c);return f},getKey:function(a){return a.id},replace:function(c,e){var d=this,a,b;if(arguments.length==1){e=arguments[0];c=d.getKey(e)}a=d.map[c];if(typeof c=="undefined"||c===null||typeof a=="undefined"){return d.add(c,e)}b=d.indexOfKey(c);d.items[b]=e;d.map[c]=e;d.fireEvent("replace",c,a,e);return e},addAll:function(f){var e=this,d=0,b,a,c;if(arguments.length>1||Ext.isArray(f)){b=arguments.length>1?arguments:f;for(a=b.length;d=d.length){return d.add(c,f)}d.length++;Ext.Array.splice(d.items,a,0,f);if(typeof c!="undefined"&&c!==null){d.map[c]=f}Ext.Array.splice(d.keys,a,0,c);d.fireEvent("add",a,f,c);return f},remove:function(a){return this.removeAt(this.indexOf(a))},removeAll:function(a){Ext.each(a||[],function(b){this.remove(b)},this);return this},removeAt:function(a){var c=this,d,b;if(a=0){c.length--;d=c.items[a];Ext.Array.erase(c.items,a,1);b=c.keys[a];if(typeof b!="undefined"){delete c.map[b]}Ext.Array.erase(c.keys,a,1);c.fireEvent("remove",d,b);return d}return false},removeAtKey:function(a){return this.removeAt(this.indexOfKey(a))},getCount:function(){return this.length},indexOf:function(a){return Ext.Array.indexOf(this.items,a)},indexOfKey:function(a){return Ext.Array.indexOf(this.keys,a)},get:function(b){var d=this,a=d.map[b],c=a!==undefined?a:(typeof b=="number")?d.items[b]:undefined;return typeof c!="function"||d.allowFunctions?c:null},getAt:function(a){return this.items[a]},getByKey:function(a){return this.map[a]},contains:function(a){return Ext.Array.contains(this.items,a)},containsKey:function(a){return typeof this.map[a]!="undefined"},clear:function(){var a=this;a.length=0;a.items=[];a.keys=[];a.map={};a.fireEvent("clear")},first:function(){return this.items[0]},last:function(){return this.items[this.length-1]},sum:function(g,b,h,a){var c=this.extractValues(g,b),f=c.length,e=0,d;h=h||0;a=(a||a===0)?a:f-1;for(d=h;d<=a;d++){e+=c[d]}return e},collect:function(j,e,g){var k=this.extractValues(j,e),a=k.length,b={},c=[],h,f,d;for(d=0;d=a;d--){b[b.length]=c[d]}}return b},filter:function(d,c,f,a){var b=[],e;if(Ext.isString(d)){b.push(Ext.create("Ext.util.Filter",{property:d,value:c,anyMatch:f,caseSensitive:a}))}else{if(Ext.isArray(d)||d instanceof Ext.util.Filter){b=b.concat(d)}}e=function(g){var m=true,n=b.length,h;for(h=0;ha?1:(de?1:(f0?1:-1,g=this.getMinMomentumValue(),d=this.getMaxMomentumValue(),c=(f==1)?d:g,h=this.lastValue,i,b;if(e===0){return this.getStartValue()}if(!this.isOutOfBound){i=a.getValue();b=a.getVelocity();if(Math.abs(b)=g&&i<=d){return i}this.isOutOfBound=true;j.setStartTime(Ext.Date.now()).setStartVelocity(b).setStartValue(c)}i=j.getValue();if(!this.isEnded){if(!this.isBouncingBack){if(h!==null){if((f==1&&ih)){this.isBouncingBack=true}}}else{if(Math.round(i)==c){this.isEnded=true}}}this.lastValue=i;return i}});Ext.define("Ext.fx.easing.EaseOut",{extend:Ext.fx.easing.Linear,alias:"easing.ease-out",config:{exponent:4,duration:1500},getValue:function(){var f=Ext.Date.now()-this.getStartTime(),d=this.getDuration(),b=this.getStartValue(),h=this.getEndValue(),a=this.distance,c=f/d,g=1-c,e=1-Math.pow(g,this.getExponent()),i=b+(e*a);if(f>=d){this.isEnded=true;return h}return i}});Ext.define("Ext.scroll.Scroller",{extend:Ext.Evented,config:{element:null,direction:"auto",fps:"auto",disabled:null,directionLock:false,momentumEasing:{momentum:{acceleration:30,friction:0.5},bounce:{acceleration:30,springTension:0.3},minVelocity:1},bounceEasing:{duration:400},outOfBoundRestrictFactor:0.5,startMomentumResetTime:300,maxAbsoluteVelocity:6,containerSize:"auto",size:"auto",autoRefresh:true,initialOffset:{x:0,y:0},slotSnapSize:{x:0,y:0},slotSnapOffset:{x:0,y:0},slotSnapEasing:{duration:150},translatable:{translationMethod:"auto",useWrapper:false}},cls:Ext.baseCSSPrefix+"scroll-scroller",containerCls:Ext.baseCSSPrefix+"scroll-container",dragStartTime:0,dragEndTime:0,isDragging:false,isAnimating:false,constructor:function(a){var b=a&&a.element;this.listeners={scope:this,touchstart:"onTouchStart",touchend:"onTouchEnd",dragstart:"onDragStart",drag:"onDrag",dragend:"onDragEnd"};this.minPosition={x:0,y:0};this.startPosition={x:0,y:0};this.position={x:0,y:0};this.velocity={x:0,y:0};this.isAxisEnabledFlags={x:false,y:false};this.flickStartPosition={x:0,y:0};this.flickStartTime={x:0,y:0};this.lastDragPosition={x:0,y:0};this.dragDirection={x:0,y:0};this.initialConfig=a;if(b){this.setElement(b)}return this},applyElement:function(a){if(!a){return}return Ext.get(a)},updateElement:function(a){this.initialize();if(!this.FixedHBoxStretching){a.addCls(this.cls)}if(!this.getDisabled()){this.attachListeneners()}this.onConfigUpdate(["containerSize","size"],"refreshMaxPosition");this.on("maxpositionchange","snapToBoundary");this.on("minpositionchange","snapToBoundary");return this},applyTranslatable:function(b,a){return Ext.factory(b,Ext.util.Translatable,a)},updateTranslatable:function(a){a.setConfig({element:this.getElement(),listeners:{animationframe:"onAnimationFrame",animationend:"onAnimationEnd",scope:this}})},updateFps:function(a){if(a!=="auto"){this.getTranslatable().setFps(a)}},attachListeneners:function(){this.getContainer().on(this.listeners)},detachListeners:function(){this.getContainer().un(this.listeners)},updateDisabled:function(a){if(a){this.detachListeners()}else{this.attachListeneners()}},updateInitialOffset:function(c){if(typeof c=="number"){c={x:c,y:c}}var b=this.position,a,d;b.x=a=c.x;b.y=d=c.y;this.getTranslatable().translate(-a,-d)},applyDirection:function(a){var e=this.getMinPosition(),d=this.getMaxPosition(),c,b;this.givenDirection=a;if(a==="auto"){c=d.x>e.x;b=d.y>e.y;if(c&&b){a="both"}else{if(c){a="horizontal"}else{a="vertical"}}}return a},updateDirection:function(b){var a=this.isAxisEnabledFlags;a.x=(b==="both"||b==="horizontal");a.y=(b==="both"||b==="vertical")},isAxisEnabled:function(a){this.getDirection();return this.isAxisEnabledFlags[a]},applyMomentumEasing:function(b){var a=Ext.fx.easing.BoundMomentum;return{x:Ext.factory(b,a),y:Ext.factory(b,a)}},applyBounceEasing:function(b){var a=Ext.fx.easing.EaseOut;return{x:Ext.factory(b,a),y:Ext.factory(b,a)}},updateBounceEasing:function(a){this.getTranslatable().setEasingX(a.x).setEasingY(a.y)},applySlotSnapEasing:function(b){var a=Ext.fx.easing.EaseOut;return{x:Ext.factory(b,a),y:Ext.factory(b,a)}},getMinPosition:function(){var a=this.minPosition;if(!a){this.minPosition=a={x:0,y:0};this.fireEvent("minpositionchange",this,a)}return a},getMaxPosition:function(){var c=this.maxPosition,a,b;if(!c){a=this.getSize();b=this.getContainerSize();this.maxPosition=c={x:Math.max(0,a.x-b.x),y:Math.max(0,a.y-b.y)};this.fireEvent("maxpositionchange",this,c)}return c},refreshMaxPosition:function(){this.maxPosition=null;this.getMaxPosition()},applyContainerSize:function(b){var c=this.getContainer().dom,a,d;if(!c){return}this.givenContainerSize=b;if(b==="auto"){a=c.offsetWidth;d=c.offsetHeight}else{a=b.x;d=b.y}return{x:a,y:d}},applySize:function(b){var c=this.getElement().dom,a,d;if(!c){return}this.givenSize=b;if(b==="auto"){a=c.offsetWidth;d=c.offsetHeight}else{if(typeof b=="number"){a=b;d=b}else{a=b.x;d=b.y}}return{x:a,y:d}},updateAutoRefresh:function(a){this.getElement().toggleListener(a,"resize","onElementResize",this);this.getContainer().toggleListener(a,"resize","onContainerResize",this)},applySlotSnapSize:function(a){if(typeof a=="number"){return{x:a,y:a}}return a},applySlotSnapOffset:function(a){if(typeof a=="number"){return{x:a,y:a}}return a},getContainer:function(){var a=this.container,b;if(!a){b=this.getElement().getParent();this.container=a=this.FixedHBoxStretching?b.getParent():b;a.addCls(this.containerCls)}return a},refresh:function(){this.stopAnimation();this.getTranslatable().refresh();this.setSize(this.givenSize);this.setContainerSize(this.givenContainerSize);this.setDirection(this.givenDirection);this.fireEvent("refresh",this);return this},onElementResize:function(a,b){this.setSize({x:b.width,y:b.height});this.refresh()},onContainerResize:function(a,b){this.setContainerSize({x:b.width,y:b.height});this.refresh()},scrollTo:function(c,h,g){if(this.isDestroyed){return this}var b=this.getTranslatable(),a=this.position,d=false,f,e;if(this.isAxisEnabled("x")){if(isNaN(c)||typeof c!="number"){c=a.x}else{if(a.x!==c){a.x=c;d=true}}f=-c}if(this.isAxisEnabled("y")){if(isNaN(h)||typeof h!="number"){h=a.y}else{if(a.y!==h){a.y=h;d=true}}e=-h}if(d){if(g!==undefined&&g!==false){b.translateAnimated(f,e,g)}else{this.fireEvent("scroll",this,a.x,a.y);b.translate(f,e)}}return this},scrollToTop:function(b){var a=this.getInitialOffset();return this.scrollTo(a.x,a.y,b)},scrollToEnd:function(c){var b=this.getSize(),a=this.getContainerSize();return this.scrollTo(b.x-a.x,b.y-a.y,c)},scrollBy:function(b,d,c){var a=this.position;b=(typeof b=="number")?b+a.x:null;d=(typeof d=="number")?d+a.y:null;return this.scrollTo(b,d,c)},onTouchStart:function(){this.isTouching=true;this.stopAnimation()},onTouchEnd:function(){var a=this.position;this.isTouching=false;if(!this.isDragging&&this.snapToSlot()){this.fireEvent("scrollstart",this,a.x,a.y)}},onDragStart:function(l){var o=this.getDirection(),g=l.absDeltaX,f=l.absDeltaY,j=this.getDirectionLock(),i=this.startPosition,d=this.flickStartPosition,k=this.flickStartTime,h=this.lastDragPosition,c=this.position,b=this.dragDirection,n=c.x,m=c.y,a=Ext.Date.now();this.isDragging=true;if(j&&o!=="both"){if((o==="horizontal"&&g>f)||(o==="vertical"&&f>g)){l.stopPropagation()}else{this.isDragging=false;return}}h.x=n;h.y=m;d.x=n;d.y=m;i.x=n;i.y=m;k.x=a;k.y=a;b.x=0;b.y=0;this.dragStartTime=a;this.isDragging=true;this.fireEvent("scrollstart",this,n,m)},onAxisDrag:function(i,q){if(!this.isAxisEnabled(i)){return}var h=this.flickStartPosition,l=this.flickStartTime,j=this.lastDragPosition,e=this.dragDirection,g=this.position[i],k=this.getMinPosition()[i],o=this.getMaxPosition()[i],d=this.startPosition[i],p=j[i],n=d-q,c=e[i],m=this.getOutOfBoundRestrictFactor(),f=this.getStartMomentumResetTime(),b=Ext.Date.now(),a;if(no){a=n-o;n=o+a*m}}if(n>p){e[i]=1}else{if(nf){h[i]=g;l[i]=b}j[i]=n},onDrag:function(b){if(!this.isDragging){return}var a=this.lastDragPosition;this.onAxisDrag("x",b.deltaX);this.onAxisDrag("y",b.deltaY);this.scrollTo(a.x,a.y)},onDragEnd:function(c){var b,a;if(!this.isDragging){return}this.dragEndTime=Ext.Date.now();this.onDrag(c);this.isDragging=false;b=this.getAnimationEasing("x",c);a=this.getAnimationEasing("y",c);if(b||a){this.getTranslatable().animate(b,a)}else{this.onScrollEnd()}},getAnimationEasing:function(g,j){if(!this.isAxisEnabled(g)){return null}var f=this.position[g],c=this.getMinPosition()[g],i=this.getMaxPosition()[g],a=this.getMaxAbsoluteVelocity(),d=null,b=this.dragEndTime,h=j.flick.velocity[g],k;if(fi){d=i}}if(d!==null){k=this.getBounceEasing()[g];k.setConfig({startTime:b,startValue:-f,endValue:-d});return k}if(h===0){return null}if(h<-a){h=-a}else{if(h>a){h=a}}if(Ext.browser.is.IE){h*=2}k=this.getMomentumEasing()[g];k.setConfig({startTime:b,startValue:-f,startVelocity:h*1.5,minMomentumValue:-i,maxMomentumValue:0});return k},onAnimationFrame:function(c,b,d){var a=this.position;a.x=-b;a.y=-d;this.fireEvent("scroll",this,a.x,a.y)},onAnimationEnd:function(){this.snapToBoundary();this.onScrollEnd()},stopAnimation:function(){this.getTranslatable().stopAnimation()},onScrollEnd:function(){var a=this.position;if(this.isTouching||!this.snapToSlot()){this.fireEvent("scrollend",this,a.x,a.y)}},snapToSlot:function(){var b=this.getSnapPosition("x"),a=this.getSnapPosition("y"),c=this.getSlotSnapEasing();if(b!==null||a!==null){this.scrollTo(b,a,{easingX:c.x,easingY:c.y});return true}return false},getSnapPosition:function(c){var g=this.getSlotSnapSize()[c],d=null,a,f,e,b;if(g!==0&&this.isAxisEnabled(c)){a=this.position[c];f=this.getSlotSnapOffset()[c];e=this.getMaxPosition()[c];b=Math.floor((a-f)%g);if(b!==0){if(a!==e){if(Math.abs(b)>g/2){d=Math.min(e,a+((b>0)?g-b:b-g))}else{d=a-b}}else{d=a-b}}}return d},snapToBoundary:function(){var g=this.position,c=this.getMinPosition(),f=this.getMaxPosition(),e=c.x,d=c.y,b=f.x,a=f.y,i=Math.round(g.x),h=Math.round(g.y);if(ib){i=b}}if(ha){h=a}}this.scrollTo(i,h)},destroy:function(){var c=this.getElement(),b=this.sizeMonitors,a;if(b){b.element.destroy();b.container.destroy()}if(c&&!c.isDestroyed){c.removeCls(this.cls);a=this.getContainer();if(a&&!a.isDestroyed){a.removeCls(this.containerCls)}}Ext.destroy(this.getTranslatable());this.callParent(arguments)}},function(){});Ext.define("Ext.scroll.indicator.Abstract",{extend:Ext.Component,config:{baseCls:"x-scroll-indicator",axis:"x",value:null,length:null,minLength:6,hidden:true,ui:"dark"},cachedConfig:{ratio:1,barCls:"x-scroll-bar",active:true},barElement:null,barLength:0,gapLength:0,getElementConfig:function(){return{reference:"barElement",children:[this.callParent()]}},applyRatio:function(a){if(isNaN(a)||a>1){a=1}return a},refresh:function(){var f=this.barElement,e=f.dom,c=this.getRatio(),b=this.getAxis(),a=(b==="x")?e.offsetWidth:e.offsetHeight,d=a*c;this.barLength=a;this.gapLength=a-d;this.setLength(d);this.updateValue(this.getValue())},updateBarCls:function(a){this.barElement.addCls(a)},updateAxis:function(a){this.element.addCls(this.getBaseCls(),null,a);this.barElement.addCls(this.getBarCls(),null,a)},updateValue:function(f){var b=this.barLength,c=this.gapLength,d=this.getLength(),e,g,a;if(f<=0){g=0;this.updateLength(this.applyLength(d+f*b))}else{if(f>=1){a=Math.round((f-1)*b);e=this.applyLength(d-a);a=d-e;this.updateLength(e);g=c+a}else{g=c*f}}this.setOffset(g)},updateActive:function(a){this.barElement[a?"addCls":"removeCls"]("active")},doSetHidden:function(a){if(a){this.setOffset(-10000)}else{delete this.lastLength;delete this.lastOffset;this.updateValue(this.getValue())}},applyLength:function(a){return Math.max(this.getMinLength(),a)},updateLength:function(a){a=Math.round(a);if(this.lastLength===a){return}this.lastLength=a;Ext.TaskQueue.requestWrite("doUpdateLength",this,[a])},doUpdateLength:function(c){if(!this.isDestroyed){var b=this.getAxis(),a=this.element;if(b==="x"){a.setWidth(c)}else{a.setHeight(c)}}},setOffset:function(a){a=Math.round(a);if(this.lastOffset===a||this.lastOffset===-10000){return}this.lastOffset=a;Ext.TaskQueue.requestWrite("doSetOffset",this,[a])},doSetOffset:function(c){if(!this.isDestroyed){var b=this.getAxis(),a=this.element;if(b==="x"){a.translate(c,0)}else{a.translate(0,c)}}}});Ext.define("Ext.scroll.indicator.CssTransform",{extend:Ext.scroll.indicator.Abstract,config:{cls:"csstransform"}});Ext.define("Ext.scroll.indicator.ScrollPosition",{extend:Ext.scroll.indicator.Abstract,config:{cls:"scrollposition"},getElementConfig:function(){var a=this.callParent(arguments);a.children.unshift({className:"x-scroll-bar-stretcher"});return a},updateValue:function(a){if(this.gapLength===0){if(a>=1){a--}this.setOffset(this.barLength*a)}else{this.setOffset(this.gapLength*a)}},doUpdateLength:function(){if(!this.isDestroyed){var a=this.barLength,b=this.element;this.callParent(arguments);if(this.getAxis()==="x"){b.setLeft(a)}else{b.setTop(a)}}},doSetOffset:function(d){if(!this.isDestroyed){var b=this.barLength,a=this.getMinLength(),c=this.barElement.dom;if(d!==-10000){d=Math.min(b-a,Math.max(d,a-this.getLength()));d=b-d}if(this.getAxis()==="x"){c.scrollLeft=d}else{c.scrollTop=d}}}});Ext.define("Ext.scroll.indicator.Rounded",{extend:Ext.scroll.indicator.Abstract,config:{cls:"rounded"},constructor:function(){this.callParent(arguments);this.transformPropertyName=Ext.browser.getVendorProperyName("transform")},getElementConfig:function(){var a=this.callParent();a.children[0].children=[{reference:"startElement"},{reference:"middleElement"},{reference:"endElement"}];return a},refresh:function(){var d=this.getAxis(),c=this.startElement.dom,a=this.endElement.dom,e=this.middleElement,b,f;if(d==="x"){b=c.offsetWidth;f=a.offsetWidth;e.setLeft(b)}else{b=c.offsetHeight;f=a.offsetHeight;e.setTop(b)}this.startElementLength=b;this.endElementLength=f;this.callParent()},doUpdateLength:function(c){if(!this.isDestroyed){var b=this.getAxis(),a=this.endElement,e=this.middleElement.dom.style,d=this.endElementLength,h=c-d,g=h-this.startElementLength,f=this.transformPropertyName;if(b==="x"){a.translate(h,0);e[f]="translate3d(0, 0, 0) scaleX("+g+")"}else{a.translate(0,h);e[f]="translate3d(0, 0, 0) scaleY("+g+")"}}}});Ext.define("Ext.scroll.Indicator",{alternateClassName:"Ext.util.Indicator",constructor:function(a){var b=Ext.scroll.indicator;switch(Ext.browser.getPreferredTranslationMethod(a)){case"scrollposition":return new b.ScrollPosition(a);case"csstransform":if(Ext.browser.is.AndroidStock4){return new b.CssTransform(a)}else{return new b.Rounded(a)}}}});Ext.define("Ext.scroll.View",{extend:Ext.Evented,alternateClassName:"Ext.util.ScrollView",config:{indicatorsUi:"dark",element:null,scroller:{},indicators:{x:{axis:"x"},y:{axis:"y"}},indicatorsHidingDelay:100,cls:Ext.baseCSSPrefix+"scroll-view"},processConfig:function(c){if(!c){return null}if(typeof c=="string"){c={direction:c}}c=Ext.merge({},c);var a=c.scroller,b;if(!a){c.scroller=a={}}for(b in c){if(c.hasOwnProperty(b)){if(!this.hasConfig(b)){a[b]=c[b];delete c[b]}}}return c},constructor:function(a){a=this.processConfig(a);this.useIndicators={x:true,y:true};this.doHideIndicators=Ext.Function.bind(this.doHideIndicators,this);this.initConfig(a)},setConfig:function(a){return this.callParent([this.processConfig(a)])},updateIndicatorsUi:function(a){var b=this.getIndicators();b.x.setUi(a);b.y.setUi(a)},applyScroller:function(a,b){return Ext.factory(a,Ext.scroll.Scroller,b)},applyIndicators:function(b,d){var a=Ext.scroll.Indicator,c=this.useIndicators;if(!b){b={}}if(!b.x){c.x=false;b.x={}}if(!b.y){c.y=false;b.y={}}return{x:Ext.factory(b.x,a,d&&d.x),y:Ext.factory(b.y,a,d&&d.y)}},updateIndicators:function(a){this.indicatorsGrid=Ext.Element.create({className:"x-scroll-bar-grid-wrapper",children:[{className:"x-scroll-bar-grid",children:[{children:[{},{children:[a.y.barElement]}]},{children:[{children:[a.x.barElement]},{}]}]}]})},updateScroller:function(a){a.on({scope:this,scrollstart:"onScrollStart",scroll:"onScroll",scrollend:"onScrollEnd",refresh:"refreshIndicators"})},isAxisEnabled:function(a){return this.getScroller().isAxisEnabled(a)&&this.useIndicators[a]},applyElement:function(a){if(a){return Ext.get(a)}},updateElement:function(c){var b=this.getScroller(),a;a=c.getFirstChild().getFirstChild();if(this.FixedHBoxStretching){a=a.getFirstChild()}c.addCls(this.getCls());c.insertFirst(this.indicatorsGrid);b.setElement(a);this.refreshIndicators();return this},showIndicators:function(){var a=this.getIndicators();if(this.hasOwnProperty("indicatorsHidingTimer")){clearTimeout(this.indicatorsHidingTimer);delete this.indicatorsHidingTimer}if(this.isAxisEnabled("x")){a.x.show()}if(this.isAxisEnabled("y")){a.y.show()}},hideIndicators:function(){var a=this.getIndicatorsHidingDelay();if(a>0){this.indicatorsHidingTimer=setTimeout(this.doHideIndicators,a)}else{this.doHideIndicators()}},doHideIndicators:function(){var a=this.getIndicators();if(this.isAxisEnabled("x")){a.x.hide()}if(this.isAxisEnabled("y")){a.y.hide()}},onScrollStart:function(){this.onScroll.apply(this,arguments);this.showIndicators()},onScrollEnd:function(){this.hideIndicators()},onScroll:function(b,a,c){this.setIndicatorValue("x",a);this.setIndicatorValue("y",c)},setIndicatorValue:function(b,f){if(!this.isAxisEnabled(b)){return this}var a=this.getScroller(),c=a.getMaxPosition()[b],e=a.getContainerSize()[b],d;if(c===0){d=f/e;if(f>=0){d+=1}}else{if(f>c){d=1+((f-c)/e)}else{if(f<0){d=f/e}else{d=f/c}}}this.getIndicators()[b].setValue(d)},refreshIndicator:function(d){if(!this.isAxisEnabled(d)){return this}var a=this.getScroller(),b=this.getIndicators()[d],e=a.getContainerSize()[d],f=a.getSize()[d],c=e/f;b.setRatio(c);b.refresh()},refresh:function(){return this.getScroller().refresh()},refreshIndicators:function(){var a=this.getIndicators();a.x.setActive(this.isAxisEnabled("x"));a.y.setActive(this.isAxisEnabled("y"));this.refreshIndicator("x");this.refreshIndicator("y")},destroy:function(){var a=this.getElement(),b=this.getIndicators();Ext.destroy(this.getScroller(),this.indicatorsGrid);if(this.hasOwnProperty("indicatorsHidingTimer")){clearTimeout(this.indicatorsHidingTimer);delete this.indicatorsHidingTimer}if(a&&!a.isDestroyed){a.removeCls(this.getCls())}b.x.destroy();b.y.destroy();delete this.indicatorsGrid;this.callParent(arguments)}});Ext.define("Ext.behavior.Scrollable",{extend:Ext.behavior.Behavior,constructor:function(){this.listeners={painted:"onComponentPainted",scope:this};this.callParent(arguments)},onComponentPainted:function(){this.scrollView.refresh()},setConfig:function(f){var c=this.scrollView,e=this.component,b,d,a,g;if(f){if(!c){this.scrollView=c=new Ext.scroll.View(f);c.on("destroy","onScrollViewDestroy",this);e.setUseBodyElement(true);this.scrollerElement=b=e.innerElement;if(!Ext.feature.has.ProperHBoxStretching){a=c.getScroller();g=f.direction||"auto";if(g!=="vertical"){d=b.wrap();d.addCls(Ext.baseCSSPrefix+"translatable-hboxfix");if(g=="horizontal"){d.setStyle({height:"100%"})}this.scrollContainer=d.wrap();c.FixedHBoxStretching=a.FixedHBoxStretching=true}else{this.scrollContainer=b.wrap()}}else{this.scrollContainer=b.wrap()}c.setElement(e.bodyElement);if(e.isPainted()){this.onComponentPainted()}e.on(this.listeners)}else{if(Ext.isString(f)||Ext.isObject(f)){c.setConfig(f)}}}else{if(c){c.destroy()}}return this},getScrollView:function(){return this.scrollView},onScrollViewDestroy:function(){var b=this.component,a=this.scrollerElement;if(!a.isDestroyed){this.scrollerElement.unwrap()}this.scrollContainer.destroy();if(!b.isDestroyed){b.un(this.listeners)}delete this.scrollerElement;delete this.scrollView;delete this.scrollContainer},onComponentDestroy:function(){var a=this.scrollView;if(a){a.destroy()}}});Ext.define("Ext.Mask",{extend:Ext.Component,xtype:"mask",config:{baseCls:Ext.baseCSSPrefix+"mask",transparent:false,top:0,left:0,right:0,bottom:0},initialize:function(){this.callSuper();this.element.on("*","onEvent",this);this.on({hide:"onHide"});this.inputBlocker=new Ext.util.InputBlocker()},onHide:function(){this.inputBlocker.unblockInputs();if(Ext.browser.is.AndroidStock4&&Ext.os.version.getMinor()===0){var a=this.element.getFirstChild();if(a){a.redraw()}}},onEvent:function(b){var a=arguments[arguments.length-1];if(a.info.eventName==="tap"){this.fireEvent("tap",this,b);return false}if(b&&b.stopEvent){b.stopEvent()}return false},updateTransparent:function(a){this[a?"addCls":"removeCls"](this.getBaseCls()+"-transparent")}});Ext.define("Ext.Container",{extend:Ext.Component,alternateClassName:"Ext.lib.Container",xtype:"container",eventedConfig:{activeItem:0,scrollable:null},config:{layout:null,control:{},defaults:null,items:null,autoDestroy:true,defaultType:null,useBodyElement:null,masked:null,modal:null,hideOnMaskTap:null},isContainer:true,constructor:function(a){var b=this;b._items=b.items=new Ext.ItemCollection();b.innerItems=[];b.onItemAdd=b.onFirstItemAdd;b.callParent(arguments)},getElementConfig:function(){return{reference:"element",classList:["x-container","x-unsized"],children:[{reference:"innerElement",className:"x-inner"}]}},applyMasked:function(b){var a=true,c;if(b===false){b=true;a=false}c=Ext.factory(b,Ext.Mask,this.getMasked());if(c){this.add(c);c.setHidden(!a)}return c},mask:function(a){this.setMasked(a||true)},unmask:function(){this.setMasked(false)},setParent:function(a){this.callSuper(arguments);if(a){var b=this.getModal();if(b){a.insertBefore(b,this);b.setZIndex(this.getZIndex()-1)}}},applyModal:function(c,b){var a=true;if(c===false){c=true;a=false}b=Ext.factory(c,Ext.Mask,b);if(b){b.setVisibility(a)}return b},updateModal:function(b){var a=this.getParent();if(a){if(b){a.insertBefore(b,this);b.setZIndex(this.getZIndex()-1)}else{a.remove(b)}}},updateHideOnMaskTap:function(b){var a=this.getModal();if(a){a[b?"on":"un"].call(a,"tap","hide",this)}},updateZIndex:function(b){var a=this.getModal();this.callParent(arguments);if(a){a.setZIndex(b-1)}},updateBaseCls:function(a,b){var c=this,d=c.getUi();if(a){this.element.addCls(a);this.innerElement.addCls(a,null,"inner");if(d){this.element.addCls(a,null,d)}}if(b){this.element.removeCls(b);this.innerElement.removeCls(a,null,"inner");if(d){this.element.removeCls(b,null,d)}}},updateUseBodyElement:function(a){if(a){this.link("bodyElement",this.innerElement.wrap({cls:"x-body"}))}},applyItems:function(a,d){if(a){var b=this;b.getDefaultType();b.getDefaults();if(b.initialized&&d.length>0){b.removeAll()}b.add(a);if(b.initialized){var c=b.initialConfig.activeItem||b.config.activeItem||0;b.setActiveItem(c)}}},applyControl:function(c){var a,b,e,d;for(a in c){d=c[a];for(b in d){e=d[b];if(Ext.isObject(e)){e.delegate=a}}d.delegate=a;this.addListener(d)}return c},onFirstItemAdd:function(){delete this.onItemAdd;if(this.innerHtmlElement&&!this.getHtml()){this.innerHtmlElement.destroy();delete this.innerHtmlElement}this.on("innerstatechange","onItemInnerStateChange",this,{delegate:"> component"});return this.onItemAdd.apply(this,arguments)},getLayout:function(){var a=this.layout;if(!a){a=this.link("_layout",this.link("layout",Ext.factory(this._layout||"default",Ext.layout.Default,null,"layout")));a.setContainer(this)}return a},updateDefaultType:function(a){this.defaultItemClass=Ext.ClassManager.getByAlias("widget."+a)},applyDefaults:function(a){if(a){this.factoryItem=this.factoryItemWithDefaults;return a}},factoryItem:function(a){return Ext.factory(a,this.defaultItemClass)},factoryItemWithDefaults:function(c){var b=this,d=b.getDefaults(),a;if(!d){return Ext.factory(c,b.defaultItemClass)}if(c.isComponent){a=c;if(d&&c.isInnerItem()&&!b.has(a)){a.setConfig(d,true)}}else{if(d&&!c.ignoreDefaults){if(!(c.hasOwnProperty("left")&&c.hasOwnProperty("right")&&c.hasOwnProperty("top")&&c.hasOwnProperty("bottom")&&c.hasOwnProperty("docked")&&c.hasOwnProperty("centered"))){c=Ext.mergeIf({},c,d)}}a=Ext.factory(c,b.defaultItemClass)}return a},add:function(a){var e=this,b,d,c,f;if(Ext.isArray(a)){for(b=0,d=a.length;b0&&c.isInnerItem()){f=c}}}else{c=e.factoryItem(a);this.doAdd(c);if(!f&&!this.getActiveItem()&&this.innerItems.length>0&&c.isInnerItem()){f=c}}if(f){this.setActiveItem(f)}return c},doAdd:function(d){var c=this,a=c.getItems(),b;if(!a.has(d)){b=a.length;a.add(d);if(d.isInnerItem()){c.insertInner(d)}d.setParent(c);c.onItemAdd(d,b)}},remove:function(d,b){var c=this,a=c.indexOf(d),e=c.getInnerItems();if(b===undefined){b=c.getAutoDestroy()}if(a!==-1){if(!c.removingAll&&e.length>1&&d===c.getActiveItem()){c.on({activeitemchange:"doRemove",scope:c,single:true,order:"after",args:[d,a,b]});c.doResetActiveItem(e.indexOf(d))}else{c.doRemove(d,a,b);if(e.length===0){c.setActiveItem(null)}}}return c},doResetActiveItem:function(a){if(a===0){this.setActiveItem(1)}else{this.setActiveItem(0)}},doRemove:function(d,a,b){var c=this;c.items.remove(d);if(d.isInnerItem()){c.removeInner(d)}c.onItemRemove(d,a,b);d.setParent(null);if(b){d.destroy()}},removeAll:function(c,f){var a=this.items,e=a.length,b=0,d;if(typeof c!="boolean"){c=this.getAutoDestroy()}f=Boolean(f);this.removingAll=true;for(;b=0;b--){c.insert(a,d[b])}return c}d=this.factoryItem(d);this.doInsert(a,d);return d},doInsert:function(d,f){var e=this,b=e.items,c=b.length,a,g;g=f.isInnerItem();if(d>c){d=c}if(b[d-1]===f){return e}a=e.indexOf(f);if(a!==-1){if(a "+a)[0]||null},down:function(a){return this.query(a)[0]||null},destroy:function(){var b=this,a=b.getModal();if(a){a.destroy()}b.removeAll(true,true);b.unlink("_scrollable");Ext.destroy(b.items);b.callSuper()}},function(){this.addMember("defaultItemClass",this)});Ext.define("Ext.util.Point",{radianToDegreeConstant:180/Math.PI,statics:{fromEvent:function(b){var a=b.changedTouches,c=(a&&a.length>0)?a[0]:b;return this.fromTouch(c)},fromTouch:function(a){return new this(a.pageX,a.pageY)},from:function(a){if(!a){return new this(0,0)}if(!(a instanceof this)){return new this(a.x,a.y)}return a}},constructor:function(a,b){if(typeof a=="undefined"){a=0}if(typeof b=="undefined"){b=0}this.x=a;this.y=b;return this},clone:function(){return new this.self(this.x,this.y)},copy:function(){return this.clone.apply(this,arguments)},copyFrom:function(a){this.x=a.x;this.y=a.y;return this},toString:function(){return"Point["+this.x+","+this.y+"]"},equals:function(a){return(this.x===a.x&&this.y===a.y)},isCloseTo:function(c,b){if(typeof b=="number"){b={x:b};b.y=b.x}var a=c.x,f=c.y,e=b.x,d=b.y;return(this.x<=a+e&&this.x>=a-e&&this.y<=f+d&&this.y>=f-d)},isWithin:function(){return this.isCloseTo.apply(this,arguments)},translate:function(a,b){this.x+=a;this.y+=b;return this},roundedEquals:function(a){if(typeof a!="object"){a={x:0,y:0}}return(Math.round(this.x)===Math.round(a.x)&&Math.round(this.y)===Math.round(a.y))},getDistanceTo:function(b){if(typeof b!="object"){b={x:0,y:0}}var c=this.x-b.x,a=this.y-b.y;return Math.sqrt(c*c+a*a)},getAngleTo:function(b){if(typeof b!="object"){b={x:0,y:0}}var c=this.x-b.x,a=this.y-b.y;return Math.atan2(a,c)*this.radianToDegreeConstant}});Ext.define("Ext.util.LineSegment",{constructor:function(b,a){var c=Ext.util.Point;this.point1=c.from(b);this.point2=c.from(a)},intersects:function(l){var o=this.point1,m=this.point2,i=l.point1,f=l.point2,c=o.x,b=m.x,a=i.x,q=f.x,p=o.y,n=m.y,k=i.y,h=f.y,g=(c-b)*(k-h)-(p-n)*(a-q),j,e;if(g==0){return null}j=((a-q)*(c*n-p*b)-(c-b)*(a*h-k*q))/g;e=((k-h)*(c*n-p*b)-(p-n)*(a*h-k*q))/g;if(jMath.max(c,b)||jMath.max(a,q)||eMath.max(p,n)||eMath.max(k,h)){return null}return new Ext.util.Point(j,e)},getLength:function(){return Math.abs(this.point1.getDistanceTo(this.point2))},getAngleToX:function(){var d=this.point1,c=this.point2,a=c.y-d.y,b=c.x-d.x;return Math.atan2(a,b)},getInBetweenPoint:function(e){var b=this.point1,c=this.getAngleToX(),a=b.x+Math.cos(c)*e,d=b.y+Math.sin(c)*e;return new Ext.util.Point(a,d)},toString:function(){return this.point1.toString()+" "+this.point2.toString()}});Ext.define("Ext.Panel",{extend:Ext.Container,alternateClassName:"Ext.lib.Panel",xtype:"panel",isPanel:true,config:{baseCls:Ext.baseCSSPrefix+"panel",bodyPadding:null,bodyMargin:null,bodyBorder:null},getElementConfig:function(){var a=this.callParent();a.children.push({reference:"tipElement",className:"x-anchor",hidden:true});return a},applyBodyPadding:function(a){if(a===true){a=5}if(a){a=Ext.dom.Element.unitizeBox(a)}return a},updateBodyPadding:function(a){this.element.setStyle("padding",a)},applyBodyMargin:function(a){if(a===true){a=5}if(a){a=Ext.dom.Element.unitizeBox(a)}return a},updateBodyMargin:function(a){this.element.setStyle("margin",a)},applyBodyBorder:function(a){if(a===true){a=1}if(a){a=Ext.dom.Element.unitizeBox(a)}return a},updateBodyBorder:function(a){this.element.setStyle("border-width",a)},alignTo:function(m){var w=this.tipElement;w.hide();if(this.currentTipPosition){w.removeCls("x-anchor-"+this.currentTipPosition)}this.callParent(arguments);var f=Ext.util.LineSegment,d=m.isComponent?m.renderElement:m,a=this.renderElement,n=d.getPageBox(),k=a.getPageBox(),b=k.left,t=k.top,C=k.right,h=k.bottom,j=b+(k.width/2),i=t+(k.height/2),o={x:b,y:t},l={x:C,y:t},B={x:b,y:h},D={x:C,y:h},y={x:j,y:i},s=n.left+(n.width/2),q=n.top+(n.height/2),v={x:s,y:q},c=new f(y,v),g=0,A=0,e,z,r,p,x,u;w.setVisibility(false);w.show();e=w.getSize();z=e.width;r=e.height;if(c.intersects(new f(o,l))){x=Math.min(Math.max(s,b+z),C-(z));u=t;A=r+10;p="top"}else{if(c.intersects(new f(o,B))){x=b;u=Math.min(Math.max(q+(z/2),z*1.6),h-(z/2.2));g=r+10;p="left"}else{if(c.intersects(new f(B,D))){x=Math.min(Math.max(s,b+z),C-z);u=h;A=-r-10;p="bottom"}else{if(c.intersects(new f(l,D))){x=C;u=Math.max(Math.min(q-r,h-z*1.3),z/2);g=-r-10;p="right"}}}}if(x||u){this.currentTipPosition=p;w.addCls("x-anchor-"+p);w.setLeft(x-b);w.setTop(u-t);w.setVisibility(true);this.setLeft(this.getLeft()+g);this.setTop(this.getTop()+A)}}});Ext.define("Ext.Button",{extend:Ext.Component,xtype:"button",cachedConfig:{pressedCls:Ext.baseCSSPrefix+"button-pressing",badgeCls:Ext.baseCSSPrefix+"badge",hasBadgeCls:Ext.baseCSSPrefix+"hasbadge",labelCls:Ext.baseCSSPrefix+"button-label",iconCls:null},config:{badgeText:null,text:null,icon:false,iconAlign:"left",pressedDelay:0,handler:null,scope:null,autoEvent:null,ui:"normal",baseCls:Ext.baseCSSPrefix+"button"},template:[{tag:"span",reference:"badgeElement",hidden:true},{tag:"span",className:Ext.baseCSSPrefix+"button-icon",reference:"iconElement"},{tag:"span",reference:"textElement",hidden:true}],initialize:function(){this.callParent();this.element.on({scope:this,tap:"onTap",touchstart:"onPress",touchend:"onRelease"})},updateBadgeText:function(c){var a=this.element,b=this.badgeElement;if(c){b.show();b.setText(c)}else{b.hide()}a[(c)?"addCls":"removeCls"](this.getHasBadgeCls())},updateText:function(b){var a=this.textElement;if(a){if(b){a.show();a.setHtml(b)}else{a.hide()}}},updateHtml:function(b){var a=this.textElement;if(b){a.show();a.setHtml(b)}else{a.hide()}},updateBadgeCls:function(b,a){this.badgeElement.replaceCls(a,b)},updateHasBadgeCls:function(b,c){var a=this.element;if(a.hasCls(c)){a.replaceCls(c,b)}},updateLabelCls:function(b,a){this.textElement.replaceCls(a,b)},updatePressedCls:function(b,c){var a=this.element;if(a.hasCls(c)){a.replaceCls(c,b)}},updateIcon:function(b){var c=this,a=c.iconElement;if(b){c.showIconElement();a.setStyle("background-image","url("+b+")");c.refreshIconAlign()}else{a.setStyle("background-image","");c.hideIconElement()}},updateIconCls:function(c,a){var d=this,b=d.iconElement;if(c){d.showIconElement();b.replaceCls(a,c);d.refreshIconAlign()}else{b.removeCls(a);d.hideIconElement()}},updateIconAlign:function(d,c){var b=this.element,a=Ext.baseCSSPrefix+"iconalign-";if(!this.getText()){d="center"}b.removeCls(a+"center");b.removeCls(a+c);if(this.getIcon()||this.getIconCls()){b.addCls(a+d)}},refreshIconAlign:function(){this.updateIconAlign(this.getIconAlign())},applyAutoEvent:function(b){var a=this;if(typeof b=="string"){b={name:b,scope:a.scope||a}}return b},updateAutoEvent:function(c){var a=c.name,b=c.scope;this.setHandler(function(){b.fireEvent(a,b,this)});this.setScope(b)},hideIconElement:function(){this.iconElement.removeCls(Ext.baseCSSPrefix+"shown");this.iconElement.addCls(Ext.baseCSSPrefix+"hidden")},showIconElement:function(){this.iconElement.removeCls(Ext.baseCSSPrefix+"hidden");this.iconElement.addCls(Ext.baseCSSPrefix+"shown")},applyUi:function(a){if(a&&Ext.isString(a)){var b=a.split("-");if(b&&(b[1]=="back"||b[1]=="forward")){return b}}return a},getUi:function(){var a=this._ui;if(Ext.isArray(a)){return a.join("-")}return a},applyPressedDelay:function(a){if(Ext.isNumber(a)){return a}return(a)?100:0},onPress:function(){var c=this,a=c.element,d=c.getPressedDelay(),b=c.getPressedCls();if(!c.getDisabled()){if(d>0){c.pressedTimeout=setTimeout(function(){delete c.pressedTimeout;if(a){a.addCls(b)}},d)}else{a.addCls(b)}}},onRelease:function(a){this.fireAction("release",[this,a],"doRelease")},doRelease:function(a,b){if(!a.getDisabled()){if(a.hasOwnProperty("pressedTimeout")){clearTimeout(a.pressedTimeout);delete a.pressedTimeout}else{a.element.removeCls(a.getPressedCls())}}},onTap:function(a){if(this.getDisabled()){return false}this.fireAction("tap",[this,a],"doTap")},doTap:function(c,d){var b=c.getHandler(),a=c.getScope()||c;if(!b){return}if(typeof b=="string"){b=a[b]}if(d&&d.preventDefault){d.preventDefault()}b.apply(a,arguments)}},function(){});Ext.define("Ext.Sheet",{extend:Ext.Panel,xtype:"sheet",alternateClassName:["widget.crosscut"],config:{baseCls:Ext.baseCSSPrefix+"sheet",modal:true,centered:true,stretchX:null,stretchY:null,enter:"bottom",exit:"bottom",showAnimation:!Ext.browser.is.AndroidStock2?{type:"slideIn",duration:250,easing:"ease-out"}:null,hideAnimation:!Ext.browser.is.AndroidStock2?{type:"slideOut",duration:250,easing:"ease-in"}:null},platformConfig:[{theme:["Windows"],enter:"top",exit:"top"}],applyHideAnimation:function(b){var a=this.getExit(),d=a;if(a===null){return null}if(b===true){b={type:"slideOut"}}if(Ext.isString(b)){b={type:b}}var c=Ext.factory(b,Ext.fx.Animation);if(c){if(a=="bottom"){d="down"}if(a=="top"){d="up"}c.setDirection(d)}return c},applyShowAnimation:function(a){var d=this.getEnter(),c=d;if(d===null){return null}if(a===true){a={type:"slideIn"}}if(Ext.isString(a)){a={type:a}}var b=Ext.factory(a,Ext.fx.Animation);if(b){if(d=="bottom"){c="down"}if(d=="top"){c="up"}b.setBefore({display:null});b.setReverse(true);b.setDirection(c)}return b},updateStretchX:function(a){this.getLeft();this.getRight();if(a){this.setLeft(0);this.setRight(0)}},updateStretchY:function(a){this.getTop();this.getBottom();if(a){this.setTop(0);this.setBottom(0)}}});Ext.define("Ext.data.Connection",{mixins:{observable:Ext.mixin.Observable},statics:{requestId:0},config:{url:null,async:true,method:null,username:"",password:"",disableCaching:true,disableCachingParam:"_dc",timeout:30000,extraParams:null,defaultHeaders:null,useDefaultHeader:true,defaultPostHeader:"application/x-www-form-urlencoded; charset=UTF-8",useDefaultXhrHeader:true,defaultXhrHeader:"XMLHttpRequest",autoAbort:false},textAreaRe:/textarea/i,multiPartRe:/multipart\/form-data/i,lineBreakRe:/\r\n/g,constructor:function(a){this.initConfig(a);this.requests={}},request:function(j){j=j||{};var f=this,i=j.scope||window,e=j.username||f.getUsername(),g=j.password||f.getPassword()||"",b,c,d,a,h;if(f.fireEvent("beforerequest",f,j)!==false){c=f.setOptions(j,i);if(this.isFormUpload(j)===true){this.upload(j.form,c.url,c.data,j);return null}if(j.autoAbort===true||f.getAutoAbort()){f.abort()}h=this.getXhrInstance();b=j.async!==false?(j.async||f.getAsync()):false;if(e){h.open(c.method,c.url,b,e,g)}else{h.open(c.method,c.url,b)}a=f.setupHeaders(h,j,c.data,c.params);d={id:++Ext.data.Connection.requestId,xhr:h,headers:a,options:j,async:b,timeout:setTimeout(function(){d.timedout=true;f.abort(d)},j.timeout||f.getTimeout())};f.requests[d.id]=d;if(b){h.onreadystatechange=Ext.Function.bind(f.onStateChange,f,[d])}h.send(c.data);if(!b){return this.onComplete(d)}return d}else{Ext.callback(j.callback,j.scope,[j,undefined,undefined]);return null}},upload:function(e,c,i,k){e=Ext.getDom(e);k=k||{};var d=Ext.id(),g=document.createElement("iframe"),j=[],h="multipart/form-data",f={target:e.target,method:e.method,encoding:e.encoding,enctype:e.enctype,action:e.action},b=function(l,m){a=document.createElement("input");Ext.fly(a).set({type:"hidden",value:m,name:l});e.appendChild(a);j.push(a)},a;Ext.fly(g).set({id:d,name:d,cls:Ext.baseCSSPrefix+"hide-display",src:Ext.SSL_SECURE_URL});document.body.appendChild(g);if(document.frames){document.frames[d].name=d}Ext.fly(e).set({target:d,method:"POST",enctype:h,encoding:h,action:c||f.action});if(i){Ext.iterate(Ext.Object.fromQueryString(i),function(l,m){if(Ext.isArray(m)){Ext.each(m,function(n){b(l,n)})}else{b(l,m)}})}Ext.fly(g).on("load",Ext.Function.bind(this.onUploadComplete,this,[g,k]),null,{single:true});e.submit();Ext.fly(e).set(f);Ext.each(j,function(l){Ext.removeNode(l)})},onUploadComplete:function(h,b){var c=this,a={responseText:"",responseXML:null},g,f;try{g=h.contentWindow.document||h.contentDocument||window.frames[id].document;if(g){if(g.body){if(this.textAreaRe.test((f=g.body.firstChild||{}).tagName)){a.responseText=f.value}else{a.responseText=g.body.innerHTML}}a.responseXML=g.XMLDocument||g}}catch(d){}c.fireEvent("requestcomplete",c,a,b);Ext.callback(b.success,b.scope,[a,b]);Ext.callback(b.callback,b.scope,[b,true,a]);setTimeout(function(){Ext.removeNode(h)},100)},isFormUpload:function(a){var b=this.getForm(a);if(b){return(a.isUpload||(this.multiPartRe).test(b.getAttribute("enctype")))}return false},getForm:function(a){return Ext.getDom(a.form)||null},setOptions:function(k,j){var h=this,e=k.params||{},g=h.getExtraParams(),d=k.urlParams,c=k.url||h.getUrl(),i=k.jsonData,b,a,f;if(Ext.isFunction(e)){e=e.call(j,k)}if(Ext.isFunction(c)){c=c.call(j,k)}c=this.setupUrl(k,c);f=k.rawData||k.xmlData||i||null;if(i&&!Ext.isPrimitive(i)){f=Ext.encode(f)}if(Ext.isObject(e)){e=Ext.Object.toQueryString(e)}if(Ext.isObject(g)){g=Ext.Object.toQueryString(g)}e=e+((g)?((e)?"&":"")+g:"");d=Ext.isObject(d)?Ext.Object.toQueryString(d):d;e=this.setupParams(k,e);b=(k.method||h.getMethod()||((e||f)?"POST":"GET")).toUpperCase();this.setupMethod(k,b);a=k.disableCaching!==false?(k.disableCaching||h.getDisableCaching()):false;if(a){c=Ext.urlAppend(c,(k.disableCachingParam||h.getDisableCachingParam())+"="+(new Date().getTime()))}if((b=="GET"||f)&&e){c=Ext.urlAppend(c,e);e=null}if(d){c=Ext.urlAppend(c,d)}return{url:c,method:b,data:f||e||null}},setupUrl:function(b,a){var c=this.getForm(b);if(c){a=a||c.action}return a},setupParams:function(a,d){var c=this.getForm(a),b;if(c&&!this.isFormUpload(a)){b=Ext.Element.serializeForm(c);d=d?(d+"&"+b):b}return d},setupMethod:function(a,b){if(this.isFormUpload(a)){return"POST"}return b},setupHeaders:function(l,m,d,c){var h=this,b=Ext.apply({},m.headers||{},h.getDefaultHeaders()||{}),k=h.getDefaultPostHeader(),i=m.jsonData,a=m.xmlData,j,f;if(!b["Content-Type"]&&(d||c)){if(d){if(m.rawData){k="text/plain"}else{if(a&&Ext.isDefined(a)){k="text/xml"}else{if(i&&Ext.isDefined(i)){k="application/json"}}}}b["Content-Type"]=k}if(((h.getUseDefaultXhrHeader()&&m.useDefaultXhrHeader!==false)||m.useDefaultXhrHeader)&&!b["X-Requested-With"]){b["X-Requested-With"]=h.getDefaultXhrHeader()}try{for(j in b){if(b.hasOwnProperty(j)){f=b[j];l.setRequestHeader(j,f)}}}catch(g){h.fireEvent("exception",j,f)}if(m.withCredentials){l.withCredentials=m.withCredentials}return b},getXhrInstance:(function(){var b=[function(){return new XMLHttpRequest()},function(){return new ActiveXObject("MSXML2.XMLHTTP.3.0")},function(){return new ActiveXObject("MSXML2.XMLHTTP")},function(){return new ActiveXObject("Microsoft.XMLHTTP")}],c=0,a=b.length,f;for(;c=200&&a<300)||a==304||(a==0&&d.responseText.length>0),b=false;if(!c){switch(a){case 12002:case 12029:case 12030:case 12031:case 12152:case 13030:b=true;break}}return{success:c,isException:b}},createResponse:function(c){var g=c.xhr,a={},h,d,i,e,f,b;if(c.timedout||c.aborted){c.success=false;h=[]}else{h=g.getAllResponseHeaders().replace(this.lineBreakRe,"\n").split("\n")}d=h.length;while(d--){i=h[d];e=i.indexOf(":");if(e>=0){f=i.substr(0,e).toLowerCase();if(i.charAt(e+1)==" "){++e}a[f]=i.substr(e+1)}}c.xhr=null;delete c.xhr;b={request:c,requestId:c.id,status:g.status,statusText:g.statusText,getResponseHeader:function(j){return a[j.toLowerCase()]},getAllResponseHeaders:function(){return a},responseText:g.responseText,responseXML:g.responseXML};g=null;return b},createException:function(a){return{request:a,requestId:a.id,status:a.aborted?-1:0,statusText:a.aborted?"transaction aborted":"communication failure",aborted:a.aborted,timedout:a.timedout}}});Ext.define("Ext.Ajax",{extend:Ext.data.Connection,singleton:true,autoAbort:false});(function(){var c=0,f=["ms","moz","webkit","o"],b=f.length,a,e,d;for(a=0;a0){c=b.shift();this.invoke(c);this.processIdleQueue()}},processTaskQueue:function(){if(!this.hasOwnProperty("taskQueueTimer")){this.taskQueueTimer=setTimeout(this.processTaskQueueItem,15)}},processTaskQueueItem:function(){delete this.taskQueueTimer;var b=this.taskQueue,c;if(b.length>0){c=b.shift();this.invoke(c);this.processTaskQueue()}},showFps:function(){if(!Ext.trueRequestAnimationFrames){alert("This browser does not support requestAnimationFrame. The FPS listed will not be accurate")}Ext.onReady(function(){Ext.Viewport.add([{xtype:"component",bottom:50,left:0,width:50,height:20,html:"Average",style:"background-color: black; color: white; text-align: center; line-height: 20px; font-size: 8px;"},{id:"__averageFps",xtype:"component",bottom:0,left:0,width:50,height:50,html:"0",style:"background-color: red; color: white; text-align: center; line-height: 50px;"},{xtype:"component",bottom:50,left:50,width:50,height:20,html:"Min (Last 1k)",style:"background-color: black; color: white; text-align: center; line-height: 20px; font-size: 8px;"},{id:"__minFps",xtype:"component",bottom:0,left:50,width:50,height:50,html:"0",style:"background-color: orange; color: white; text-align: center; line-height: 50px;"},{xtype:"component",bottom:50,left:100,width:50,height:20,html:"Max (Last 1k)",style:"background-color: black; color: white; text-align: center; line-height: 20px; font-size: 8px;"},{id:"__maxFps",xtype:"component",bottom:0,left:100,width:50,height:50,html:"0",style:"background-color: yellow; color: black; text-align: center; line-height: 50px;"},{xtype:"component",bottom:50,left:150,width:50,height:20,html:"Current",style:"background-color: black; color: white; text-align: center; line-height: 20px; font-size: 8px;"},{id:"__currentFps",xtype:"component",bottom:0,left:150,width:50,height:50,html:"0",style:"background-color: green; color: white; text-align: center; line-height: 50px;"}]);Ext.AnimationQueue.resetFps()})},resetFps:function(){var d=Ext.getCmp("__currentFps"),c=Ext.getCmp("__averageFps"),i=Ext.getCmp("__minFps"),h=Ext.getCmp("__maxFps"),e=1000,b=0,g=0,f=0;Ext.AnimationQueue.onFpsChanged=function(j){g++;if(!(g%10)){e=1000;b=0}f+=j;e=Math.min(e,j);b=Math.max(b,j);d.setHtml(Math.round(j));c.setHtml(Math.round(f/g));i.setHtml(Math.round(e));h.setHtml(Math.round(b))}}},function(){})})(this);Ext.define("Ext.ComponentQuery",{singleton:true},function(){var g=this,j=["var r = [],","i = 0,","it = items,","l = it.length,","c;","for (; i < l; i++) {","c = it[i];","if (c.{0}) {","r.push(c);","}","}","return r;"].join(""),e=function(o,n){return n.method.apply(this,[o].concat(n.args))},a=function(p,t){var n=[],q=0,s=p.length,r,o=t!==">";for(;q\^])\s?|\s|$)/,c=/^(#)?([\w\-]+|\*)(?:\((true|false)\))?/,b=[{re:/^\.([\w\-]+)(?:\((true|false)\))?/,method:l},{re:/^(?:[\[](?:@)?([\w\-]+)\s?(?:(=|.=)\s?['"]?(.*?)["']?)?[\]])/,method:m},{re:/^#([\w\-]+)/,method:d},{re:/^\:([\w\-]+)(?:\(((?:\{[^\}]+\})|(?:(?!\{)[^\s>\/]*?(?!\})))\))?/,method:k},{re:/^(?:\{([^\}]+)\})/,method:j}];g.Query=Ext.extend(Object,{constructor:function(n){n=n||{};Ext.apply(this,n)},execute:function(o){var q=this.operations,r=0,s=q.length,p,n;if(!o){n=Ext.ComponentManager.all.getArray()}else{if(Ext.isArray(o)){n=o}}for(;r1){for(q=0,r=s.length;q1){r=q.length;for(p=0;p=10){a.input.on({scope:a,keypress:"onKeyPress"})}},useManualMaxLength:function(){return Boolean((Ext.os.is.Android&&!Ext.browser.is.Chrome))},applyUseMask:function(a){if(a==="auto"){a=Ext.os.is.iOS&&Ext.os.version.lt("5")}return Boolean(a)},updateUseMask:function(a){this.mask[a?"show":"hide"]()},updatePattern:function(a){this.updateFieldAttribute("pattern",a)},updateFieldAttribute:function(b,c){var a=this.input;if(c){a.dom.setAttribute(b,c)}else{a.dom.removeAttribute(b)}},updateCls:function(b,a){this.input.addCls(Ext.baseCSSPrefix+"input-el");this.input.replaceCls(a,b)},updateType:function(a,c){var b=Ext.baseCSSPrefix+"input-";this.input.replaceCls(b+c,b+a);this.updateFieldAttribute("type",a)},updateName:function(a){this.updateFieldAttribute("name",a)},getValue:function(){var a=this.input;if(a){this._value=a.dom.value}return this._value},applyValue:function(a){return(Ext.isEmpty(a))?"":a},updateValue:function(b){var a=this.input;if(a){a.dom.value=b}},setValue:function(b){var a=this._value;this.updateValue(this.applyValue(b));b=this.getValue();if(String(b)!=String(a)&&this.initialized){this.onChange(this,b,a)}return this},updateTabIndex:function(a){this.updateFieldAttribute("tabIndex",a)},testAutoFn:function(a){return[true,"on"].indexOf(a)!==-1},updateMaxLength:function(a){if(!this.useManualMaxLength()){this.updateFieldAttribute("maxlength",a)}},updatePlaceHolder:function(a){this.updateFieldAttribute("placeholder",a)},applyAutoComplete:function(a){return this.testAutoFn(a)},updateAutoComplete:function(a){var b=a?"on":"off";this.updateFieldAttribute("autocomplete",b)},applyAutoCapitalize:function(a){return this.testAutoFn(a)},updateAutoCapitalize:function(b){var a=b?"on":"off";this.updateFieldAttribute("autocapitalize",a)},applyAutoCorrect:function(a){return this.testAutoFn(a)},updateAutoCorrect:function(a){var b=a?"on":"off";this.updateFieldAttribute("autocorrect",b)},updateMinValue:function(a){this.updateFieldAttribute("min",a)},updateMaxValue:function(a){this.updateFieldAttribute("max",a)},updateStepValue:function(a){this.updateFieldAttribute("step",a)},checkedRe:/^(true|1|on)/i,getChecked:function(){var a=this.input,b;if(a){b=a.dom.checked;this._checked=b}return b},applyChecked:function(a){return !!this.checkedRe.test(String(a))},setChecked:function(a){this.updateChecked(this.applyChecked(a));this._checked=a},updateChecked:function(a){this.input.dom.checked=a},updateReadOnly:function(a){this.updateFieldAttribute("readonly",a)},updateMaxRows:function(a){this.updateFieldAttribute("rows",a)},doSetDisabled:function(a){this.callParent(arguments);this.input.dom.disabled=a;if(!a){this.blur()}},isDirty:function(){if(this.getDisabled()){return false}return String(this.getValue())!==String(this.originalValue)},reset:function(){this.setValue(this.originalValue)},onMaskTap:function(a){this.fireAction("masktap",[this,a],"doMaskTap")},doMaskTap:function(a,b){if(a.getDisabled()){return false}a.maskCorrectionTimer=Ext.defer(a.showMask,1000,a);a.hideMask()},showMask:function(a){if(this.mask){this.mask.setStyle("display","block")}},hideMask:function(a){if(this.mask){this.mask.setStyle("display","none")}},focus:function(){var b=this,a=b.input;if(a&&a.dom.focus){a.dom.focus()}return b},blur:function(){var b=this,a=this.input;if(a&&a.dom.blur){a.dom.blur()}return b},select:function(){var b=this,a=b.input;if(a&&a.dom.setSelectionRange){a.dom.setSelectionRange(0,9999)}return b},onFocus:function(a){this.fireAction("focus",[a],"doFocus")},doFocus:function(b){var a=this;if(a.mask){if(a.maskCorrectionTimer){clearTimeout(a.maskCorrectionTimer)}a.hideMask()}if(!a.getIsFocused()){a.setIsFocused(true);a.setStartValue(a.getValue())}},onBlur:function(a){this.fireAction("blur",[a],"doBlur")},doBlur:function(d){var b=this,c=b.getValue(),a=b.getStartValue();b.setIsFocused(false);if(String(c)!=String(a)){b.onChange(b,c,a)}b.showMask()},onClearIconTap:function(a){this.fireEvent("clearicontap",this,a);if(Ext.os.is.Android){this.focus()}},onClearIconPress:function(){this.clearIcon.addCls(Ext.baseCSSPrefix+"pressing")},onClearIconRelease:function(){this.clearIcon.removeCls(Ext.baseCSSPrefix+"pressing")},onClick:function(a){this.fireEvent("click",a)},onChange:function(b,c,a){if(this.useManualMaxLength()){this.trimValueToMaxLength()}this.fireEvent("change",b,c,a)},onPaste:function(a){if(this.useManualMaxLength()){this.trimValueToMaxLength()}this.fireEvent("paste",a)},onKeyUp:function(a){if(this.useManualMaxLength()){this.trimValueToMaxLength()}this.fireEvent("keyup",a)},onKeyDown:function(){this.ignoreInput=true},onInput:function(b){var a=this;if(a.ignoreInput){a.ignoreInput=false;return}setTimeout(function(){if(!a.ignoreInput){a.fireEvent("keyup",b);a.ignoreInput=false}},10)},onKeyPress:function(a){if(a.browserEvent.keyCode==13){this.fireEvent("keyup",a)}},onMouseDown:function(a){this.fireEvent("mousedown",a)},trimValueToMaxLength:function(){var a=this.getMaxLength();if(a){var b=this.getValue();if(b.length>this.getMaxLength()){this.setValue(b.slice(0,a))}}}});Ext.define("Ext.field.Field",{extend:Ext.Decorator,alternateClassName:"Ext.form.Field",xtype:"field",isField:true,isFormField:true,config:{baseCls:Ext.baseCSSPrefix+"field",label:null,labelAlign:"left",labelWidth:"30%",labelWrap:false,clearIcon:null,required:false,inputType:null,name:null,value:null,tabIndex:null},platformConfig:[{theme:["Windows"],labelAlign:"top"}],cachedConfig:{labelCls:null,requiredCls:Ext.baseCSSPrefix+"field-required",inputCls:null},getElementConfig:function(){var a=Ext.baseCSSPrefix;return{reference:"element",className:"x-container",children:[{reference:"label",cls:a+"form-label",children:[{reference:"labelspan",tag:"span"}]},{reference:"innerElement",cls:a+"component-outer"}]}},updateLabel:function(b,d){var a=this.renderElement,c=Ext.baseCSSPrefix;if(b){this.labelspan.setHtml(b);a.addCls(c+"field-labeled")}else{a.removeCls(c+"field-labeled")}},updateLabelAlign:function(b,c){var a=this.renderElement,d=Ext.baseCSSPrefix;if(b){a.addCls(d+"label-align-"+b);if(b=="top"||b=="bottom"){this.label.setWidth("100%")}else{this.updateLabelWidth(this.getLabelWidth())}}if(c){a.removeCls(d+"label-align-"+c)}},updateLabelCls:function(a,b){if(a){this.label.addCls(a)}if(b){this.label.removeCls(b)}},updateLabelWidth:function(b){var a=this.getLabelAlign();if(b){if(a=="top"||a=="bottom"){this.label.setWidth("100%")}else{this.label.setWidth(b)}}},updateLabelWrap:function(b,c){var a=Ext.baseCSSPrefix+"form-label-nowrap";if(!b){this.addCls(a)}else{this.removeCls(a)}},updateRequired:function(a){this.renderElement[a?"addCls":"removeCls"](this.getRequiredCls())},updateRequiredCls:function(a,b){if(this.getRequired()){this.renderElement.replaceCls(b,a)}},initialize:function(){var a=this;a.callParent();a.doInitValue()},doInitValue:function(){this.originalValue=this.getInitialConfig().value},reset:function(){this.setValue(this.originalValue);return this},resetOriginalValue:function(){this.originalValue=this.getValue()},isDirty:function(){return false}},function(){});Ext.define("Ext.field.Text",{extend:Ext.field.Field,xtype:"textfield",alternateClassName:"Ext.form.Text",config:{ui:"text",clearIcon:true,placeHolder:null,maxLength:null,autoComplete:null,autoCapitalize:null,autoCorrect:null,readOnly:null,component:{xtype:"input",type:"text"},bubbleEvents:["action"]},initialize:function(){var a=this;a.callParent();a.getComponent().on({scope:this,keyup:"onKeyUp",change:"onChange",focus:"onFocus",blur:"onBlur",paste:"onPaste",mousedown:"onMouseDown",clearicontap:"onClearIconTap"});a.originalValue=a.originalValue||"";a.getComponent().originalValue=a.originalValue;a.syncEmptyCls()},syncEmptyCls:function(){var b=(this._value)?this._value.length:false,a=Ext.baseCSSPrefix+"empty";if(b){this.removeCls(a)}else{this.addCls(a)}},updateValue:function(c){var b=this.getComponent(),a=c!==undefined&&c!==null;if(b){b.setValue(c)}this[a&&this.isDirty()?"showClearIcon":"hideClearIcon"]();this.syncEmptyCls()},getValue:function(){var a=this;a._value=a.getComponent().getValue();a.syncEmptyCls();return a._value},updatePlaceHolder:function(a){this.getComponent().setPlaceHolder(a)},updateMaxLength:function(a){this.getComponent().setMaxLength(a)},updateAutoComplete:function(a){this.getComponent().setAutoComplete(a)},updateAutoCapitalize:function(a){this.getComponent().setAutoCapitalize(a)},updateAutoCorrect:function(a){this.getComponent().setAutoCorrect(a)},updateReadOnly:function(a){if(a){this.hideClearIcon()}else{this.showClearIcon()}this.getComponent().setReadOnly(a)},updateInputType:function(a){var b=this.getComponent();if(b){b.setType(a)}},updateName:function(a){var b=this.getComponent();if(b){b.setName(a)}},updateTabIndex:function(b){var a=this.getComponent();if(a){a.setTabIndex(b)}},updateInputCls:function(a,b){var c=this.getComponent();if(c){c.replaceCls(b,a)}},doSetDisabled:function(b){var c=this;c.callParent(arguments);var a=c.getComponent();if(a){a.setDisabled(b)}if(b){c.hideClearIcon()}else{c.showClearIcon()}},showClearIcon:function(){var b=this,c=b.getValue(),a=c!==undefined&&c!==null;if(b.getClearIcon()&&!b.getDisabled()&&!b.getReadOnly()&&a){b.element.addCls(Ext.baseCSSPrefix+"field-clearable")}return b},hideClearIcon:function(){if(this.getClearIcon()){this.element.removeCls(Ext.baseCSSPrefix+"field-clearable")}},onKeyUp:function(a){this.fireAction("keyup",[this,a],"doKeyUp")},doKeyUp:function(b,d){var c=b.getValue(),a=c!==undefined&&c!==null;this[a&&c!==this.originalValue?"showClearIcon":"hideClearIcon"]();if(d.browserEvent.keyCode===13){b.fireAction("action",[b,d],"doAction")}},doAction:function(){this.blur()},onClearIconTap:function(a){this.fireAction("clearicontap",[this,a],"doClearIconTap")},doClearIconTap:function(a,b){a.setValue(this.originalValue);a.getValue()},onChange:function(b,c,a){b.fireEvent("change",this,c,a)},onFocus:function(a){this.addCls(Ext.baseCSSPrefix+"field-focused");this.isFocused=true;this.fireEvent("focus",this,a)},onBlur:function(b){var a=this;this.removeCls(Ext.baseCSSPrefix+"field-focused");this.isFocused=false;a.fireEvent("blur",a,b);setTimeout(function(){a.isFocused=false},50)},onPaste:function(a){this.fireEvent("paste",this,a)},onMouseDown:function(a){this.fireEvent("mousedown",this,a)},focus:function(){this.getComponent().focus();return this},blur:function(){this.getComponent().blur();return this},select:function(){this.getComponent().select();return this},resetOriginalValue:function(){this.callParent();var a=this.getComponent();if(a&&a.hasOwnProperty("originalValue")){this.getComponent().originalValue=this.originalValue}this.reset()},reset:function(){this.getComponent().reset();this.getValue();this[this.isDirty()?"showClearIcon":"hideClearIcon"]()},isDirty:function(){var a=this.getComponent();if(a){return a.isDirty()}return false}});Ext.define("Ext.field.TextAreaInput",{extend:Ext.field.Input,xtype:"textareainput",tag:"textarea"});Ext.define("Ext.field.TextArea",{extend:Ext.field.Text,xtype:"textareafield",alternateClassName:"Ext.form.TextArea",config:{ui:"textarea",autoCapitalize:false,component:{xtype:"textareainput"},maxRows:null},updateMaxRows:function(a){this.getComponent().setMaxRows(a)},doSetHeight:function(a){this.callParent(arguments);var b=this.getComponent();b.input.setHeight(a)},doSetWidth:function(b){this.callParent(arguments);var a=this.getComponent();a.input.setWidth(b)},doKeyUp:function(a){var b=a.getValue();a[b?"showClearIcon":"hideClearIcon"]()}});Ext.define("Ext.MessageBox",{extend:Ext.Sheet,config:{ui:"dark",baseCls:Ext.baseCSSPrefix+"msgbox",iconCls:null,showAnimation:{type:"popIn",duration:250,easing:"ease-out"},hideAnimation:{type:"popOut",duration:250,easing:"ease-out"},zIndex:999,defaultTextHeight:75,title:null,buttons:null,message:null,prompt:null,modal:true,layout:{type:"vbox",pack:"center"}},platformConfig:[{theme:["Windows"],ui:"light",showAnimation:{type:"fadeIn"},hideAnimation:{type:"fadeOut"}},{theme:["Blackberry"],ui:"plain"}],statics:{OK:{text:"OK",itemId:"ok",ui:"action"},YES:{text:"Yes",itemId:"yes",ui:"action"},NO:{text:"No",itemId:"no"},CANCEL:{text:"Cancel",itemId:"cancel"},INFO:Ext.baseCSSPrefix+"msgbox-info",WARNING:Ext.baseCSSPrefix+"msgbox-warning",QUESTION:Ext.baseCSSPrefix+"msgbox-question",ERROR:Ext.baseCSSPrefix+"msgbox-error",OKCANCEL:[{text:"Cancel",itemId:"cancel"},{text:"OK",itemId:"ok",ui:"action"}],YESNOCANCEL:[{text:"Cancel",itemId:"cancel"},{text:"No",itemId:"no"},{text:"Yes",itemId:"yes",ui:"action"}],YESNO:[{text:"No",itemId:"no"},{text:"Yes",itemId:"yes",ui:"action"}]},constructor:function(a){a=a||{};if(a.hasOwnProperty("promptConfig")){Ext.applyIf(a,{prompt:a.promptConfig});delete a.promptConfig}if(a.hasOwnProperty("multiline")||a.hasOwnProperty("multiLine")){a.prompt=a.prompt||{};Ext.applyIf(a.prompt,{multiLine:a.multiline||a.multiLine});delete a.multiline;delete a.multiLine}this.defaultAllowedConfig={};var e=["ui","showAnimation","hideAnimation","title","message","prompt","iconCls","buttons","defaultTextHeight"],d=e.length,b,c;for(b=0;b button",scope:a,tap:"onButtonRelease"});a.onAfter({delegate:"> button",scope:a,hide:"onButtonHiddenChange",show:"onButtonHiddenChange"})},updateAllowMultiple:function(a){if(!this.initialized&&!this.getInitialConfig().hasOwnProperty("allowDepress")&&a){this.setAllowDepress(true)}},applyItems:function(){var e=this,f=[],d,b,c,a;e.callParent(arguments);a=this.getItems();d=a.length;for(b=0;b=0;c--){d=b.items[c];if(!d.isHidden()){d.addCls(g);break}}},applyPressedButtons:function(a){var e=this,f=[],c,d,b;if(e.getAllowToggle()){if(Ext.isArray(a)){d=a.length;for(b=0;b0){c=false}}else{f=e;if(j.length>0){c=true}}var b=f.slice(),d,g,a,h,k;f.length=0;for(d=0,g=b.length;d2){h.apply(k,a[2])}else{h.call(k)}}b.length=0;if(c!==null){this.request(c)}}});Ext.define("Ext.TitleBar",{extend:Ext.Container,xtype:"titlebar",isToolbar:true,config:{baseCls:Ext.baseCSSPrefix+"toolbar",cls:Ext.baseCSSPrefix+"navigation-bar",ui:"dark",title:null,defaultType:"button",minHeight:null,layout:{type:"hbox"},items:[]},hasCSSMinHeight:true,maxButtonWidth:"40%",beforeInitialize:function(){this.applyItems=this.applyInitialItems},initialize:function(){delete this.applyItems;this.add(this.initialItems);delete this.initialItems;this.on({painted:"refreshTitlePosition",single:true})},applyInitialItems:function(a){var b=this,c=b.getDefaults()||{};b.initialItems=a;b.leftBox=b.add({xtype:"container",style:"position: relative",layout:{type:"hbox",align:"center"},listeners:{resize:"refreshTitlePosition",scope:b}});b.spacer=b.add({xtype:"component",style:"position: relative",flex:1,listeners:{resize:"refreshTitlePosition",scope:b}});b.rightBox=b.add({xtype:"container",style:"position: relative",layout:{type:"hbox",align:"center"},listeners:{resize:"refreshTitlePosition",scope:b}});b.titleComponent=b.add({xtype:"title",hidden:c.hidden,centered:true});b.doAdd=b.doBoxAdd;b.remove=b.doBoxRemove;b.doInsert=b.doBoxInsert},doBoxAdd:function(a){if(a.config.align=="right"){this.rightBox.add(a)}else{this.leftBox.add(a)}},doBoxRemove:function(a){if(a.config.align=="right"){this.rightBox.remove(a)}else{this.leftBox.remove(a)}},doBoxInsert:function(a,b){if(b.config.align=="right"){this.rightBox.add(b)}else{this.leftBox.add(b)}},getMaxButtonWidth:function(){var a=this.maxButtonWidth;if(Ext.isString(this.maxButtonWidth)){a=parseInt(a.replace("%",""),10);a=Math.round((this.element.getWidth()/100)*a)}return a},refreshTitlePosition:function(){if(this.isDestroyed){return}var g=this.titleComponent.renderElement;g.setWidth(null);g.setLeft(null);var b=this.leftBox,d=b.down("button"),a=b.getItems().getCount()==1,i,n;if(d&&a){if(d.getWidth()==null){d.renderElement.setWidth("auto")}i=b.renderElement.getWidth();n=this.getMaxButtonWidth();if(i>n){d.renderElement.setWidth(n)}}var k=this.spacer.renderElement.getPageBox(),l=g.getPageBox(),h=l.width-k.width,e=l.left,j=l.right,c,m,f;if(h>0){g.setWidth(k.width);c=h/2;e+=c;j-=c}m=k.left-e;f=j-k.right;if(m>0){g.setLeft(m)}else{if(f>0){g.setLeft(-f)}}g.repaint()},updateTitle:function(a){this.titleComponent.setTitle(a);if(this.isPainted()){this.refreshTitlePosition()}}});Ext.define("Ext.app.Action",{config:{scope:null,application:null,controller:null,action:null,args:[],url:undefined,data:{},title:null,beforeFilters:[],currentFilterIndex:-1},constructor:function(a){this.initConfig(a);this.getUrl()},applyBeforeFilters:function(a){return a||[]},execute:function(){this.resume()},resume:function(){var b=this.getCurrentFilterIndex()+1,c=this.getBeforeFilters(),a=this.getController(),d=c[b];if(d){this.setCurrentFilterIndex(b);d.call(a,this)}else{a[this.getAction()].apply(a,this.getArgs())}},applyUrl:function(a){if(a===null||a===undefined){a=this.urlEncode()}return a},applyController:function(a){var c=this.getApplication(),b=c.getCurrentProfile();if(Ext.isString(a)){a=c.getController(a,b?b.getNamespace():null)}return a},urlEncode:function(){var a=this.getController(),b;if(a instanceof Ext.app.Controller){b=a.$className.split(".");a=b[b.length-1]}return a+"/"+this.getAction()}});Ext.define("Ext.app.Controller",{mixins:{observable:Ext.mixin.Observable},config:{refs:{},routes:{},control:{},before:{},application:{},stores:[],models:[],views:[]},constructor:function(a){this.initConfig(a);this.mixins.observable.constructor.call(this,a)},init:Ext.emptyFn,launch:Ext.emptyFn,redirectTo:function(a){return this.getApplication().redirectTo(a)},execute:function(b,a){b.setBeforeFilters(this.getBefore()[b.getAction()]);b.execute()},applyBefore:function(e){var d,a,c,b;for(a in e){d=Ext.Array.from(e[a]);c=d.length;for(b=0;b>1;f=d(e,b[c]);if(f>=0){h=c+1}else{if(f<0){a=c-1}}}return h}});Ext.define("Ext.mixin.Filterable",{extend:Ext.mixin.Mixin,mixinConfig:{id:"filterable"},config:{filters:null,filterRoot:null},dirtyFilterFn:false,filterFn:null,filtered:false,applyFilters:function(a,b){if(!b){b=this.createFiltersCollection()}b.clear();this.filtered=false;this.dirtyFilterFn=true;if(a){this.addFilters(a)}return b},createFiltersCollection:function(){this._filters=Ext.create("Ext.util.Collection",function(a){return a.getId()});return this._filters},addFilter:function(a){this.addFilters([a])},addFilters:function(b){var a=this.getFilters();return this.insertFilters(a?a.length:0,b)},insertFilter:function(a,b){return this.insertFilters(a,[b])},insertFilters:function(h,c){if(!Ext.isArray(c)){c=[c]}var j=c.length,a=this.getFilterRoot(),d=this.getFilters(),e=[],f,g,b;if(!d){d=this.createFiltersCollection()}for(g=0;g=e.length||(a&&e.getAutoSort())){return e.add(d,f)}if(typeof d!="undefined"&&d!==null){if(typeof g[d]!="undefined"){e.replace(d,f);return false}g[d]=f}this.all.push(f);if(b&&this.getAutoFilter()&&this.mixins.filterable.isFiltered.call(e,f)){return null}e.length++;Ext.Array.splice(e.items,c,0,f);Ext.Array.splice(e.keys,c,0,d);e.dirtyIndices=true;return f},insertAll:function(g,d){if(g>=this.items.length||(this.sorted&&this.getAutoSort())){return this.addAll(d)}var s=this,h=this.filtered,a=this.sorted,b=this.all,m=this.items,l=this.keys,r=this.map,n=this.getAutoFilter(),o=this.getAutoSort(),t=[],j=[],f=[],c=this.mixins.filterable,e=false,k,u,p,q;if(a&&this.getAutoSort()){}if(Ext.isObject(d)){for(u in d){if(d.hasOwnProperty(u)){j.push(m[u]);t.push(u)}}}else{j=d;k=d.length;for(p=0;p=0){e=a[b];c=f[b];if(typeof c!="undefined"){delete g.map[c]}Ext.Array.erase(a,b,1);Ext.Array.erase(f,b,1);Ext.Array.remove(d,e);delete g.indices[c];g.length--;this.dirtyIndices=true;return e}return false},removeAtKey:function(a){return this.removeAt(this.indexOfKey(a))},getCount:function(){return this.length},indexOf:function(b){if(this.dirtyIndices){this.updateIndices()}var a=this.indices[this.getKey(b)];return(a===undefined)?-1:a},indexOfKey:function(b){if(this.dirtyIndices){this.updateIndices()}var a=this.indices[b];return(a===undefined)?-1:a},updateIndices:function(){var a=this.items,e=a.length,f=this.indices={},c,d,b;for(c=0;c=a;d--){b[b.length]=c[d]}}return b},findIndexBy:function(d,c,h){var g=this,f=g.keys,a=g.items,b=h||0,e=a.length;for(;b=0){return Ext.functionFactory("obj","return obj"+(b>0?".":"")+a)(d)}return d[a]},onMetaChange:function(f){var a=f.fields,e=this,d,c,b;e.metaData=f;if(f.rootProperty!==undefined){e.setRootProperty(f.rootProperty)}else{if(f.root!==undefined){e.setRootProperty(f.root)}}if(f.idProperty!==undefined){e.setIdProperty(f.idProperty)}if(f.totalProperty!==undefined){e.setTotalProperty(f.totalProperty)}if(f.successProperty!==undefined){e.setSuccessProperty(f.successProperty)}if(f.messageProperty!==undefined){e.setMessageProperty(f.messageProperty)}if(a){if(e.getModel()){e.getModel().setFields(a);e.buildExtractors()}else{b=e.getIdProperty();c={fields:a};if(b){c.idProperty=b}d=Ext.define("Ext.data.reader.MetaModel"+Ext.id(),{extend:"Ext.data.Model",config:c});e.setModel(d)}}else{e.buildExtractors()}}},function(){Ext.apply(this.prototype,{nullResultSet:new Ext.data.ResultSet({total:0,count:0,records:[],success:false})})});Ext.define("Ext.data.reader.Json",{extend:Ext.data.reader.Reader,alternateClassName:"Ext.data.JsonReader",alias:"reader.json",config:{record:null,useSimpleAccessors:false},objectRe:/[\[\.]/,getResponseData:function(a){var d=a;if(a&&a.responseText){d=a.responseText}if(typeof d!=="string"){return d}var c;try{c=Ext.decode(d)}catch(b){this.fireEvent("exception",this,a,"Unable to parse the JSON returned by the server: "+b.toString());Ext.Logger.warn("Unable to parse the JSON returned by the server: "+b.toString())}return c},buildExtractors:function(){var b=this,a=b.getRootProperty();b.callParent(arguments);if(a){b.rootAccessor=b.createAccessor(a)}else{delete b.rootAccessor}},getRoot:function(b){var a=this.getModel().getFields();if(a.isDirty){this.buildExtractors(true);delete a.isDirty}if(this.rootAccessor){return this.rootAccessor.call(this,b)}else{return b}},extractData:function(a){var e=this.getRecord(),d=[],c,b;if(e){c=a.length;if(!c&&Ext.isObject(a)){c=1;a=[a]}for(b=0;b=0){return Ext.functionFactory("obj","var value; try {value = obj"+(b>0?".":"")+c+"} catch(e) {}; return value;")}}return function(d){return d[c]}}}(),createFieldAccessExpression:function(g,b,c){var f=this,h=f.objectRe,e=(g.getMapping()!==null),a=e?g.getMapping():g.getName(),i,d;if(typeof a==="function"){i=b+".getMapping()("+c+", this)"}else{if(f.getUseSimpleAccessors()===true||((d=String(a).search(h))<0)){if(!e||isNaN(a)){a='"'+a+'"'}i=c+"["+a+"]"}else{i=c+(d>0?".":"")+a}}return i}});Ext.define("Ext.data.writer.Writer",{alias:"writer.base",alternateClassName:["Ext.data.DataWriter","Ext.data.Writer"],config:{writeAllFields:true,nameProperty:"name"},constructor:function(a){this.initConfig(a)},write:function(e){var c=e.getOperation(),b=c.getRecords()||[],a=b.length,d=0,f=[];for(;d]+>/gi,none:function(a){return a},asText:function(a){return String(a).replace(this.stripTagsRE,"")},asUCText:function(a){return String(a).toUpperCase().replace(this.stripTagsRE,"")},asUCString:function(a){return String(a).toUpperCase()},asDate:function(a){if(!a){return 0}if(Ext.isDate(a)){return a.getTime()}return Date.parse(String(a))},asFloat:function(a){a=parseFloat(String(a).replace(/,/g,""));return isNaN(a)?0:a},asInt:function(a){a=parseInt(String(a).replace(/,/g,""),10);return isNaN(a)?0:a}});Ext.define("Ext.data.Types",{singleton:true,stripRe:/[\$,%]/g,dashesRe:/-/g,iso8601TestRe:/\d\dT\d\d/,iso8601SplitRe:/[- :T\.Z\+]/},function(){var b=this,a=Ext.data.SortTypes;Ext.apply(b,{AUTO:{convert:function(c){return c},sortType:a.none,type:"auto"},STRING:{convert:function(c){return(c===undefined||c===null)?(this.getAllowNull()?null:""):String(c)},sortType:a.asUCString,type:"string"},INT:{convert:function(c){return(c!==undefined&&c!==null&&c!=="")?((typeof c==="number")?parseInt(c,10):parseInt(String(c).replace(b.stripRe,""),10)):(this.getAllowNull()?null:0)},sortType:a.none,type:"int"},FLOAT:{convert:function(c){return(c!==undefined&&c!==null&&c!=="")?((typeof c==="number")?c:parseFloat(String(c).replace(b.stripRe,""),10)):(this.getAllowNull()?null:0)},sortType:a.none,type:"float"},BOOL:{convert:function(c){if((c===undefined||c===null||c==="")&&this.getAllowNull()){return null}return c!=="false"&&!!c},sortType:a.none,type:"bool"},DATE:{convert:function(e){var c=this.getDateFormat(),d;if(!e){return null}if(Ext.isDate(e)){return e}if(c){if(c=="timestamp"){return new Date(e*1000)}if(c=="time"){return new Date(parseInt(e,10))}return Ext.Date.parse(e,c)}d=new Date(Date.parse(e));if(isNaN(d)){if(b.iso8601TestRe.test(e)){d=e.split(b.iso8601SplitRe);d=new Date(d[0],d[1]-1,d[2],d[3],d[4],d[5])}if(isNaN(d)){d=new Date(Date.parse(e.replace(b.dashesRe,"/")))}}return isNaN(d)?null:d},sortType:a.asDate,type:"date"}});Ext.apply(b,{BOOLEAN:this.BOOL,INTEGER:this.INT,NUMBER:this.FLOAT})});Ext.define("Ext.data.Field",{alias:"data.field",isField:true,config:{name:null,type:"auto",convert:undefined,dateFormat:null,allowNull:true,defaultValue:undefined,mapping:null,sortType:undefined,sortDir:"ASC",allowBlank:true,persist:true,encode:null,decode:null,bubbleEvents:"action"},constructor:function(a){if(Ext.isString(a)){a={name:a}}this.initConfig(a)},applyType:function(c){var b=Ext.data.Types,a=b.AUTO;if(c){if(Ext.isString(c)){return b[c.toUpperCase()]||a}else{return c}}return a},updateType:function(a,b){var c=this.getConvert();if(b&&c===b.convert){this.setConvert(a.convert)}},applySortType:function(d){var c=Ext.data.SortTypes,a=this.getType(),b=a.sortType;if(d){if(Ext.isString(d)){return c[d]||b}else{return d}}return b},applyConvert:function(b){var a=this.getType().convert;if(b&&b!==a){this._hasCustomConvert=true;return b}else{this._hasCustomConvert=false;return a}},hasCustomConvert:function(){return this._hasCustomConvert}});Ext.define("Ext.data.identifier.Simple",{alias:"data.identifier.simple",statics:{AUTO_ID:1},config:{prefix:"ext-record-"},constructor:function(a){this.initConfig(a)},generate:function(a){return this._prefix+this.self.AUTO_ID++}});Ext.define("Ext.data.ModelManager",{extend:Ext.AbstractManager,alternateClassName:["Ext.ModelMgr","Ext.ModelManager"],singleton:true,modelNamespace:null,registerType:function(c,b){var d=b.prototype,a;if(d&&d.isModel){a=b}else{b={extend:b.extend||"Ext.data.Model",config:b};a=Ext.define(c,b)}this.types[c]=a;return a},onModelDefined:Ext.emptyFn,getModel:function(b){var a=b;if(typeof a=="string"){a=this.types[a];if(!a&&this.modelNamespace){a=this.types[this.modelNamespace+"."+a]}}return a},create:function(c,b,d){var a=typeof b=="function"?b:this.types[b||c.name];return new a(c,d)}},function(){Ext.regModel=function(){return this.ModelManager.registerType.apply(this.ModelManager,arguments)}});Ext.define("Ext.data.Request",{config:{action:null,params:null,method:"GET",url:null,operation:null,proxy:null,disableCaching:false,headers:{},callbackKey:null,jsonP:null,jsonData:null,xmlData:null,withCredentials:null,username:null,password:null,callback:null,scope:null,timeout:30000,records:null,directFn:null,args:null},constructor:function(a){this.initConfig(a)}});Ext.define("Ext.data.proxy.Server",{extend:Ext.data.proxy.Proxy,alias:"proxy.server",alternateClassName:"Ext.data.ServerProxy",config:{url:null,pageParam:"page",startParam:"start",limitParam:"limit",groupParam:"group",sortParam:"sort",filterParam:"filter",directionParam:"dir",enablePagingParams:true,simpleSortMode:false,noCache:true,cacheString:"_dc",timeout:30000,api:{create:undefined,read:undefined,update:undefined,destroy:undefined},extraParams:{}},constructor:function(a){a=a||{};if(a.nocache!==undefined){a.noCache=a.nocache}this.callParent([a])},create:function(){return this.doRequest.apply(this,arguments)},read:function(){return this.doRequest.apply(this,arguments)},update:function(){return this.doRequest.apply(this,arguments)},destroy:function(){return this.doRequest.apply(this,arguments)},setExtraParam:function(a,b){this.getExtraParams()[a]=b},buildRequest:function(a){var c=this,d=Ext.applyIf(a.getParams()||{},c.getExtraParams()||{}),b;d=Ext.applyIf(d,c.getParams(a));b=Ext.create("Ext.data.Request",{params:d,action:a.getAction(),records:a.getRecords(),url:a.getUrl(),operation:a,proxy:c});b.setUrl(c.buildUrl(b));a.setRequest(b);return b},processResponse:function(k,b,d,c,j,l){var h=this,a=b.getAction(),f,i;if(k===true){f=h.getReader();try{i=f.process(c)}catch(g){b.setException(g.message);h.fireEvent("exception",this,c,b);return}if(!b.getModel()){b.setModel(this.getModel())}if(b.process(a,i,d,c)===false){this.fireEvent("exception",this,c,b)}}else{h.setException(b,c);h.fireEvent("exception",this,c,b)}if(typeof j=="function"){j.call(l||h,b)}h.afterRequest(d,k)},setException:function(b,a){if(Ext.isObject(a)){b.setException({status:a.status,statusText:a.statusText})}},applyEncoding:function(a){return Ext.encode(a)},encodeSorters:function(d){var b=[],c=d.length,a=0;for(;a0){if(o){h[e]=m[0].getProperty();h[b]=m[0].getDirection()}else{h[e]=n.encodeSorters(m)}}if(c&&f&&f.length>0){h[c]=n.encodeFilters(f)}return h},buildUrl:function(c){var b=this,a=b.getUrl(c);if(b.getNoCache()){a=Ext.urlAppend(a,Ext.String.format("{0}={1}",b.getCacheString(),Ext.Date.now()))}return a},getUrl:function(a){return a?a.getUrl()||this.getApi()[a.getAction()]||this._url:this._url},doRequest:function(a,c,b){},afterRequest:Ext.emptyFn});Ext.define("Ext.data.proxy.Ajax",{extend:Ext.data.proxy.Server,alias:"proxy.ajax",alternateClassName:["Ext.data.HttpProxy","Ext.data.AjaxProxy"],config:{withCredentials:false,username:null,password:null,actionMethods:{create:"POST",read:"GET",update:"POST",destroy:"POST"},headers:{}},doRequest:function(a,f,b){var d=this,e=d.getWriter(),c=d.buildRequest(a);c.setConfig({headers:d.getHeaders(),timeout:d.getTimeout(),method:d.getMethod(c),callback:d.createRequestCallback(c,a,f,b),scope:d,proxy:d});if(a.getWithCredentials()||d.getWithCredentials()){c.setWithCredentials(true);c.setUsername(d.getUsername());c.setPassword(d.getPassword())}c=e.write(c);Ext.Ajax.request(c.getCurrentConfig());return c},getMethod:function(a){return this.getActionMethods()[a.getAction()]},createRequestCallback:function(d,a,e,b){var c=this;return function(g,h,f){c.processResponse(h,a,d,f,e,b)}}});Ext.define("Ext.data.association.Association",{alternateClassName:"Ext.data.Association",config:{ownerModel:null,ownerName:undefined,associatedModel:null,associatedName:undefined,associationKey:undefined,primaryKey:"id",reader:null,type:null,name:undefined},statics:{create:function(a){if(!a.isAssociation){if(Ext.isString(a)){a={type:a}}a.type=a.type.toLowerCase();return Ext.factory(a,Ext.data.association.Association,null,"association")}return a}},constructor:function(a){this.initConfig(a)},applyName:function(a){if(!a){a=this.getAssociatedName()}return a},applyOwnerModel:function(a){var b=Ext.data.ModelManager.getModel(a);if(b===undefined){Ext.Logger.error("The configured ownerModel was not valid (you tried "+a+")")}return b},applyOwnerName:function(a){if(!a){a=this.getOwnerModel().modelName}a=a.slice(a.lastIndexOf(".")+1);return a},updateOwnerModel:function(a,b){if(b){this.setOwnerName(a.modelName)}},applyAssociatedModel:function(a){var b=Ext.data.ModelManager.types[a];if(b===undefined){Ext.Logger.error("The configured associatedModel was not valid (you tried "+a+")")}return b},applyAssociatedName:function(a){if(!a){a=this.getAssociatedModel().modelName}a=a.slice(a.lastIndexOf(".")+1);return a},updateAssociatedModel:function(b,a){if(a){this.setAssociatedName(b.modelName)}},applyReader:function(a){if(a){if(Ext.isString(a)){a={type:a}}if(!a.isReader){Ext.applyIf(a,{type:"json"})}}return Ext.factory(a,Ext.data.Reader,this.getReader(),"reader")},updateReader:function(a){a.setModel(this.getAssociatedModel())}});Ext.define("Ext.util.Inflector",{singleton:true,plurals:[[(/(quiz)$/i),"$1zes"],[(/^(ox)$/i),"$1en"],[(/([m|l])ouse$/i),"$1ice"],[(/(matr|vert|ind)ix|ex$/i),"$1ices"],[(/(x|ch|ss|sh)$/i),"$1es"],[(/([^aeiouy]|qu)y$/i),"$1ies"],[(/(hive)$/i),"$1s"],[(/(?:([^f])fe|([lr])f)$/i),"$1$2ves"],[(/sis$/i),"ses"],[(/([ti])um$/i),"$1a"],[(/(buffal|tomat|potat)o$/i),"$1oes"],[(/(bu)s$/i),"$1ses"],[(/(alias|status|sex)$/i),"$1es"],[(/(octop|vir)us$/i),"$1i"],[(/(ax|test)is$/i),"$1es"],[(/^person$/),"people"],[(/^man$/),"men"],[(/^(child)$/),"$1ren"],[(/s$/i),"s"],[(/$/),"s"]],singulars:[[(/(quiz)zes$/i),"$1"],[(/(matr)ices$/i),"$1ix"],[(/(vert|ind)ices$/i),"$1ex"],[(/^(ox)en/i),"$1"],[(/(alias|status)es$/i),"$1"],[(/(octop|vir)i$/i),"$1us"],[(/(cris|ax|test)es$/i),"$1is"],[(/(shoe)s$/i),"$1"],[(/(o)es$/i),"$1"],[(/(bus)es$/i),"$1"],[(/([m|l])ice$/i),"$1ouse"],[(/(x|ch|ss|sh)es$/i),"$1"],[(/(m)ovies$/i),"$1ovie"],[(/(s)eries$/i),"$1eries"],[(/([^aeiouy]|qu)ies$/i),"$1y"],[(/([lr])ves$/i),"$1f"],[(/(tive)s$/i),"$1"],[(/(hive)s$/i),"$1"],[(/([^f])ves$/i),"$1fe"],[(/(^analy)ses$/i),"$1sis"],[(/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/i),"$1$2sis"],[(/([ti])a$/i),"$1um"],[(/(n)ews$/i),"$1ews"],[(/people$/i),"person"],[(/s$/i),""]],uncountable:["sheep","fish","series","species","money","rice","information","equipment","grass","mud","offspring","deer","means"],singular:function(b,a){this.singulars.unshift([b,a])},plural:function(b,a){this.plurals.unshift([b,a])},clearSingulars:function(){this.singulars=[]},clearPlurals:function(){this.plurals=[]},isTransnumeral:function(a){return Ext.Array.indexOf(this.uncountable,a)!=-1},pluralize:function(f){if(this.isTransnumeral(f)){return f}var e=this.plurals,d=e.length,a,c,b;for(b=0;b0){b=n.data.items;k=b.length;o.length=0;for(p=0;p0){h=o.shift();Ext.apply(s[h.associationName][h.j],this.prepareAssociatedData(h.associatedRecord,h.ids,h.associationType))}}}else{if(t&&(f.toLowerCase()=="belongsto"||f.toLowerCase()=="hasone")){a=d[e.getInstanceName()];if(a!==undefined){l=a.id;if(Ext.Array.indexOf(m,l)===-1){m.push(l);s[u]=a.getData();Ext.apply(s[u],this.prepareAssociatedData(a,m,c))}}}}}return s},join:function(a){Ext.Array.include(this.stores,a)},unjoin:function(a){Ext.Array.remove(this.stores,a)},setDirty:function(){var b=this,a;b.dirty=true;b.fields.each(function(c){if(c.getPersist()){a=c.getName();b.modified[a]=b.get(a)}})},validate:function(){var j=Ext.create("Ext.data.Errors"),c=this.getValidations().items,e=Ext.data.Validations,b,d,h,a,g,f;if(c){b=c.length;for(f=0;ff)?1:((ba?1:(d0){b.create=e;f=true}if(c.length>0){b.update=c;f=true}if(a.length>0){b.destroy=a;f=true}if(f&&d.fireEvent("beforesync",this,b)!==false){d.getProxy().batch({operations:b,listeners:d.getBatchListeners()})}return{added:e,updated:c,removed:a}},first:function(){return this.data.first()},last:function(){return this.data.last()},sum:function(e){var d=0,c=0,b=this.data.items,a=b.length;for(;c0){c=b[0].get(f)}for(;d0){a=c[0].get(f)}for(;da){a=e}}return a},average:function(e){var c=0,b=this.data.items,a=b.length,d=0;if(b.length>0){for(;c0},isExpandable:function(){var a=this;if(a.get("expandable")){return !(a.isLeaf()||(a.isLoaded()&&!a.hasChildNodes()))}return false},appendChild:function(b,j,h){var f=this,c,e,d,g,a;if(Ext.isArray(b)){for(c=0,e=b.length;c0){Ext.Array.sort(d,f);for(c=0;ce){return 1}else{if(fa.data.index)?1:-1},applyFilters:function(b){var a=this;return function(c){return a.isVisible(c)}},applyProxy:function(a){},applyNode:function(a){if(a){a=Ext.data.NodeInterface.decorate(a)}return a},updateNode:function(a,c){if(c&&!c.isDestroyed){c.un({append:"onNodeAppend",insert:"onNodeInsert",remove:"onNodeRemove",load:"onNodeLoad",scope:this});c.unjoin(this)}if(a){a.on({scope:this,append:"onNodeAppend",insert:"onNodeInsert",remove:"onNodeRemove",load:"onNodeLoad"});a.join(this);var b=[];if(a.childNodes.length){b=b.concat(this.retrieveChildNodes(a))}if(this.getRootVisible()){b.push(a)}else{if(a.isLoaded()||a.isLoading()){a.set("expanded",true)}}this.data.clear();this.fireEvent("clear",this);this.suspendEvents();this.add(b);this.resumeEvents();this.fireEvent("refresh",this,this.data)}},retrieveChildNodes:function(a){var d=this.getNode(),b=this.getRecursive(),c=[],e=a;if(!a.childNodes.length||(!b&&a!==d)){return c}if(!b){return a.childNodes}while(e){if(e._added){delete e._added;if(e===a){break}else{e=e.nextSibling||e.parentNode}}else{if(e!==a){c.push(e)}if(e.firstChild){e._added=true;e=e.firstChild}else{e=e.nextSibling||e.parentNode}}}return c},isVisible:function(b){var a=b.parentNode;if(!this.getRecursive()&&a!==this.getNode()){return false}while(a){if(!a.isExpanded()){return false}if(a===this.getNode()){break}a=a.parentNode}return true}});Ext.define("Ext.data.TreeStore",{extend:Ext.data.NodeStore,alias:"store.tree",config:{root:undefined,clearOnLoad:true,nodeParam:"node",defaultRootId:"root",defaultRootProperty:"children",recursive:true},applyProxy:function(){return Ext.data.Store.prototype.applyProxy.apply(this,arguments)},applyRoot:function(a){var b=this;a=a||{};a=Ext.apply({},a);if(!a.isModel){Ext.applyIf(a,{id:b.getStoreId()+"-"+b.getDefaultRootId(),text:"Root",allowDrag:false});a=Ext.data.ModelManager.create(a,b.getModel())}Ext.data.NodeInterface.decorate(a);a.set(a.raw);return a},handleTreeInsertionIndex:function(a,b,d,c){if(b.parentNode){b.parentNode.sort(d.getSortFn(),true,true)}return this.callParent(arguments)},handleTreeSort:function(a,b){if(this._sorting){return a}this._sorting=true;this.getNode().sort(b.getSortFn(),true,true);delete this._sorting;return this.callParent(arguments)},updateRoot:function(a,b){if(b){b.unBefore({expand:"onNodeBeforeExpand",scope:this});b.unjoin(this)}a.onBefore({expand:"onNodeBeforeExpand",scope:this});this.onNodeAppend(null,a);this.setNode(a);if(!a.isLoaded()&&!a.isLoading()&&a.isExpanded()){this.load({node:a})}this.fireEvent("rootchange",this,a,b)},getNodeById:function(a){return this.data.getByKey(a)},onNodeBeforeExpand:function(b,a,c){if(b.isLoading()){c.pause();this.on("load",function(){c.resume()},this,{single:true})}else{if(!b.isLoaded()){c.pause();this.load({node:b,callback:function(){c.resume()}})}}},onNodeAppend:function(n,c){var l=this.getProxy(),j=l.getReader(),b=this.getModel(),g=c.raw,d=[],a=j.getRootProperty(),m,h,f,k,e;if(!c.isLeaf()){m=j.getRoot(g);if(m){h=j.extractData(m);for(f=0,k=h.length;fa)){return false}else{return true}},email:function(b,a){return Ext.data.validations.emailRe.test(a)},format:function(a,b){if(b===undefined||b===null){b=""}return !!(a.matcher&&a.matcher.test(b))},inclusion:function(a,b){return a.list&&Ext.Array.indexOf(a.list,b)!=-1},exclusion:function(a,b){return a.list&&Ext.Array.indexOf(a.list,b)==-1}});Ext.define("Ext.data.reader.Array",{extend:Ext.data.reader.Json,alternateClassName:"Ext.data.ArrayReader",alias:"reader.array",config:{totalProperty:undefined,successProperty:undefined},createFieldAccessExpression:function(g,c,b){var f=this,e=g.getMapping(),d=(e==null)?f.getModel().getFields().indexOf(g):e,a;if(typeof d==="function"){a=c+".getMapping()("+b+", this)"}else{if(isNaN(d)){d='"'+d+'"'}a=b+"["+d+"]"}return a}});Ext.define("Ext.mixin.Selectable",{extend:Ext.mixin.Mixin,mixinConfig:{id:"selectable",hooks:{updateStore:"updateStore"}},config:{disableSelection:null,mode:"SINGLE",allowDeselect:false,lastSelected:null,lastFocused:null,deselectOnContainerClick:true},modes:{SINGLE:true,SIMPLE:true,MULTI:true},selectableEventHooks:{addrecords:"onSelectionStoreAdd",removerecords:"onSelectionStoreRemove",updaterecord:"onSelectionStoreUpdate",load:"refreshSelection",refresh:"refreshSelection"},constructor:function(){this.selected=new Ext.util.MixedCollection();this.callParent(arguments)},applyMode:function(a){a=a?a.toUpperCase():"SINGLE";return this.modes[a]?a:"SINGLE"},updateStore:function(a,c){var b=this,d=Ext.apply({},b.selectableEventHooks,{scope:b});if(c&&Ext.isObject(c)&&c.isStore){if(c.autoDestroy){c.destroy()}else{c.un(d);if(a){a.un("clear","onSelectionStoreClear",this)}}}if(a){a.on(d);a.onBefore("clear","onSelectionStoreClear",this);b.refreshSelection()}},selectAll:function(a){var e=this,c=e.getStore().getRange(),d=c.length,b=0;for(;bg){e=g;g=c;c=e}for(d=c;d<=g;d++){a.push(b.getAt(d))}this.doMultiSelect(a,h)},select:function(c,e,b){var d=this,a;if(d.getDisableSelection()){return}if(typeof c==="number"){c=[d.getStore().getAt(c)]}if(!c){return}if(d.getMode()=="SINGLE"&&c){a=c.length?c[0]:c;d.doSingleSelect(a,b)}else{d.doMultiSelect(c,e,b)}},doSingleSelect:function(a,b){var d=this,c=d.selected;if(d.getDisableSelection()){return}if(d.isSelected(a)){return}if(c.getCount()>0){d.deselect(d.getLastSelected(),b)}c.add(a);d.setLastSelected(a);d.onItemSelect(a,b);d.setLastFocused(a);if(!b){d.fireSelectionChange([a])}},doMultiSelect:function(a,j,h){if(a===null||this.getDisableSelection()){return}a=!Ext.isArray(a)?[a]:a;var f=this,b=f.selected,e=a.length,g=false,c=0,d;if(!j&&b.getCount()>0){g=true;f.deselect(f.getSelection(),true)}for(;c0},refreshSelection:function(){var b=this,a=b.getSelection();b.deselectAll(true);if(a.length){b.select(a,false,true)}},onSelectionStoreRemove:function(c,b){var g=this,e=g.selected,f=b.length,a,d;if(g.getDisableSelection()){return}for(d=0;d ."+Ext.baseCSSPrefix+"data-item",scope:this})},initialize:function(){this.callParent();this.doInitialize()},onItemTouchStart:function(d){var b=this,c=d.getTarget(),a=Ext.getCmp(c.id);a.on({touchmove:"onItemTouchMove",scope:b,single:true});b.fireEvent("itemtouchstart",b,a,b.indexOf(a),d)},onItemTouchMove:function(d){var b=this,c=d.getTarget(),a=Ext.getCmp(c.id);b.fireEvent("itemtouchmove",b,a,b.indexOf(a),d)},onItemTouchEnd:function(d){var b=this,c=d.getTarget(),a=Ext.getCmp(c.id);a.un({touchmove:"onItemTouchMove",scope:b});b.fireEvent("itemtouchend",b,a,b.indexOf(a),d)},onItemTap:function(d){var b=this,c=d.getTarget(),a=Ext.getCmp(c.id);b.fireEvent("itemtap",b,a,b.indexOf(a),d)},onItemTapHold:function(d){var b=this,c=d.getTarget(),a=Ext.getCmp(c.id);b.fireEvent("itemtaphold",b,a,b.indexOf(a),d)},onItemSingleTap:function(d){var b=this,c=d.getTarget(),a=Ext.getCmp(c.id);b.fireEvent("itemsingletap",b,a,b.indexOf(a),d)},onItemDoubleTap:function(d){var b=this,c=d.getTarget(),a=Ext.getCmp(c.id);b.fireEvent("itemdoubletap",b,a,b.indexOf(a),d)},onItemSwipe:function(d){var b=this,c=d.getTarget(),a=Ext.getCmp(c.id);b.fireEvent("itemswipe",b,a,b.indexOf(a),d)},moveItemsToCache:function(j,k){var h=this,c=h.dataview,a=c.getMaxItemCache(),g=h.getViewItems(),f=h.itemCache,e=f.length,l=c.getPressedCls(),d=c.getSelectedCls(),b=k-j,m;for(;b>=0;b--){m=g[j+b];if(e!==a){h.remove(m,false);m.removeCls([l,d]);f.push(m);e++}else{m.destroy()}}if(h.getViewItems().length==0){this.dataview.showEmptyText()}},moveItemsFromCache:function(b){var l=this,e=l.dataview,m=e.getStore(),k=b.length,a=e.getDefaultType(),h=e.getItemConfig(),g=l.itemCache,f=g.length,j=[],c,n,d;if(k){e.hideEmptyText()}for(c=0;ci._tmpIndex?1:-1});for(c=0;c div",scope:this})},initialize:function(){this.callParent();this.doInitialize()},updateBaseCls:function(a,b){var c=this;c.callParent([a+"-container",b])},onItemTouchStart:function(d){var b=this,c=d.getTarget(),a=b.getViewItems().indexOf(c);Ext.get(c).on({touchmove:"onItemTouchMove",scope:b,single:true});b.fireEvent("itemtouchstart",b,Ext.get(c),a,d)},onItemTouchEnd:function(d){var b=this,c=d.getTarget(),a=b.getViewItems().indexOf(c);Ext.get(c).un({touchmove:"onItemTouchMove",scope:b});b.fireEvent("itemtouchend",b,Ext.get(c),a,d)},onItemTouchMove:function(d){var b=this,c=d.getTarget(),a=b.getViewItems().indexOf(c);b.fireEvent("itemtouchmove",b,Ext.get(c),a,d)},onItemTap:function(d){var b=this,c=d.getTarget(),a=b.getViewItems().indexOf(c);b.fireEvent("itemtap",b,Ext.get(c),a,d)},onItemTapHold:function(d){var b=this,c=d.getTarget(),a=b.getViewItems().indexOf(c);b.fireEvent("itemtaphold",b,Ext.get(c),a,d)},onItemDoubleTap:function(d){var b=this,c=d.getTarget(),a=b.getViewItems().indexOf(c);b.fireEvent("itemdoubletap",b,Ext.get(c),a,d)},onItemSingleTap:function(d){var b=this,c=d.getTarget(),a=b.getViewItems().indexOf(c);b.fireEvent("itemsingletap",b,Ext.get(c),a,d)},onItemSwipe:function(d){var b=this,c=d.getTarget(),a=b.getViewItems().indexOf(c);b.fireEvent("itemswipe",b,Ext.get(c),a,d)},updateListItem:function(b,f){var e=this,a=e.dataview,c=a.getStore(),d=c.indexOf(b),g=a.prepareData(b.getData(true),d,b);g.xcount=c.getCount();g.xindex=typeof g.xindex==="number"?g.xindex:d;f.innerHTML=a.getItemTpl().apply(g)},addListItem:function(e,c){var h=this,d=h.dataview,i=d.getStore(),a=d.prepareData(c.getData(true),e,c),b=h.element,j=b.dom.childNodes,g=j.length,f;a.xcount=typeof a.xcount==="number"?a.xcount:i.getCount();a.xindex=typeof a.xindex==="number"?a.xindex:e;f=Ext.Element.create(this.getItemElementConfig(e,a));if(!g||e==g){f.appendTo(b)}else{f.insertBefore(j[e])}},getItemElementConfig:function(c,e){var b=this.dataview,d=b.getItemCls(),a=b.getBaseCls()+"-item";if(d){a+=" "+d}return{cls:a,html:b.getItemTpl().apply(e)}},doRemoveItemCls:function(a){var d=this.getViewItems(),c=d.length,b=0;for(;b=0;b--){c=a[f+b];Ext.get(c).destroy()}if(d.getViewItems().length==0){this.dataview.showEmptyText()}},moveItemsFromCache:function(d){var g=this,b=g.dataview,c=b.getStore(),f=d.length,e,a;if(f){b.hideEmptyText()}for(e=0;eh._tmpIndex?1:-1});for(e=0;e{text}
",pressedCls:"x-item-pressed",itemCls:null,selectedCls:"x-item-selected",triggerEvent:"itemtap",triggerCtEvent:"tap",deselectOnContainerClick:true,scrollable:true,inline:null,pressedDelay:100,loadingText:"Loading...",useComponents:null,itemConfig:{},maxItemCache:20,defaultType:"dataitem",scrollToTopOnRefresh:true},constructor:function(a){var c=this,b;c.hasLoadedStore=false;c.mixins.selectable.constructor.apply(c,arguments);c.indexOffset=0;c.callParent(arguments)},updateItemCls:function(c,b){var a=this.container;if(a){if(b){a.doRemoveItemCls(b)}if(c){a.doAddItemCls(c)}}},storeEventHooks:{beforeload:"onBeforeLoad",load:"onLoad",refresh:"refresh",addrecords:"onStoreAdd",removerecords:"onStoreRemove",updaterecord:"onStoreUpdate"},initialize:function(){this.callParent();var b=this,a;b.on(b.getTriggerCtEvent(),b.onContainerTrigger,b);a=b.container=this.add(new Ext.dataview[b.getUseComponents()?"component":"element"].Container({baseCls:this.getBaseCls()}));a.dataview=b;b.on(b.getTriggerEvent(),b.onItemTrigger,b);a.on({itemtouchstart:"onItemTouchStart",itemtouchend:"onItemTouchEnd",itemtap:"onItemTap",itemtaphold:"onItemTapHold",itemtouchmove:"onItemTouchMove",itemsingletap:"onItemSingleTap",itemdoubletap:"onItemDoubleTap",itemswipe:"onItemSwipe",scope:b});if(b.getStore()){if(b.isPainted()){b.refresh()}else{b.on({painted:"refresh",single:true})}}},applyInline:function(a){if(Ext.isObject(a)){a=Ext.apply({},a)}return a},updateInline:function(c,b){var a=this.getBaseCls();if(b){this.removeCls([a+"-inlineblock",a+"-nowrap"])}if(c){this.addCls(a+"-inlineblock");if(Ext.isObject(c)&&c.wrap===false){this.addCls(a+"-nowrap")}else{this.removeCls(a+"-nowrap")}}},prepareData:function(c,b,a){return c},onContainerTrigger:function(b){var a=this;if(b.target!=a.element.dom){return}if(a.getDeselectOnContainerClick()&&a.getStore()){a.deselectAll()}},onItemTrigger:function(b,a){this.selectWithEvent(this.getStore().getAt(a))},doAddPressedCls:function(a){var c=this,b=c.getItemAt(c.getStore().indexOf(a));if(Ext.isElement(b)){b=Ext.get(b)}if(b){if(b.isComponent){b.renderElement.addCls(c.getPressedCls())}else{b.addCls(c.getPressedCls())}}},onItemTouchStart:function(b,h,d,g){var f=this,c=f.getStore(),a=c&&c.getAt(d);f.fireAction("itemtouchstart",[f,d,h,a,g],"doItemTouchStart")},doItemTouchStart:function(c,b,e,a){var d=c.getPressedDelay();if(a){if(d>0){c.pressedTimeout=Ext.defer(c.doAddPressedCls,d,c,[a])}else{c.doAddPressedCls(a)}}},onItemTouchEnd:function(b,h,d,g){var f=this,c=f.getStore(),a=c&&c.getAt(d);if(this.hasOwnProperty("pressedTimeout")){clearTimeout(this.pressedTimeout);delete this.pressedTimeout}if(a&&h){if(h.isComponent){h.renderElement.removeCls(f.getPressedCls())}else{h.removeCls(f.getPressedCls())}}f.fireEvent("itemtouchend",f,d,h,a,g)},onItemTouchMove:function(b,h,d,g){var f=this,c=f.getStore(),a=c&&c.getAt(d);if(f.hasOwnProperty("pressedTimeout")){clearTimeout(f.pressedTimeout);delete f.pressedTimeout}if(a&&h){if(h.isComponent){h.renderElement.removeCls(f.getPressedCls())}else{h.removeCls(f.getPressedCls())}}f.fireEvent("itemtouchmove",f,d,h,a,g)},onItemTap:function(b,h,d,g){var f=this,c=f.getStore(),a=c&&c.getAt(d);f.fireEvent("itemtap",f,d,h,a,g)},onItemTapHold:function(b,h,d,g){var f=this,c=f.getStore(),a=c&&c.getAt(d);f.fireEvent("itemtaphold",f,d,h,a,g)},onItemSingleTap:function(b,h,d,g){var f=this,c=f.getStore(),a=c&&c.getAt(d);f.fireEvent("itemsingletap",f,d,h,a,g)},onItemDoubleTap:function(b,h,d,g){var f=this,c=f.getStore(),a=c&&c.getAt(d);f.fireEvent("itemdoubletap",f,d,h,a,g)},onItemSwipe:function(b,h,d,g){var f=this,c=f.getStore(),a=c&&c.getAt(d);f.fireEvent("itemswipe",f,d,h,a,g)},onItemSelect:function(a,b){var c=this;if(b){c.doItemSelect(c,a)}else{c.fireAction("select",[c,a],"doItemSelect")}},doItemSelect:function(c,a){if(c.container&&!c.isDestroyed){var b=c.getItemAt(c.getStore().indexOf(a));if(Ext.isElement(b)){b=Ext.get(b)}if(b){if(b.isComponent){b.renderElement.removeCls(c.getPressedCls());b.renderElement.addCls(c.getSelectedCls())}else{b.removeCls(c.getPressedCls());b.addCls(c.getSelectedCls())}}}},onItemDeselect:function(a,b){var c=this;if(c.container&&!c.isDestroyed){if(b){c.doItemDeselect(c,a)}else{c.fireAction("deselect",[c,a,b],"doItemDeselect")}}},doItemDeselect:function(c,a){var b=c.getItemAt(c.getStore().indexOf(a));if(Ext.isElement(b)){b=Ext.get(b)}if(b){if(b.isComponent){b.renderElement.removeCls([c.getPressedCls(),c.getSelectedCls()])}else{b.removeCls([c.getPressedCls(),c.getSelectedCls()])}}},updateData:function(b){var a=this.getStore();if(!a){this.setStore(Ext.create("Ext.data.Store",{data:b,autoDestroy:true}))}else{a.add(b)}},applyStore:function(b){var d=this,e=Ext.apply({},d.storeEventHooks,{scope:d}),c,a;if(b){b=Ext.data.StoreManager.lookup(b);if(b&&Ext.isObject(b)&&b.isStore){b.on(e);c=b.getProxy();if(c){a=c.getReader();if(a){a.on("exception","handleException",this)}}}}return b},handleException:function(){this.setMasked(false)},updateStore:function(b,e){var d=this,f=Ext.apply({},d.storeEventHooks,{scope:d}),c,a;if(e&&Ext.isObject(e)&&e.isStore){e.un(f);if(!d.isDestroyed){d.onStoreClear()}if(e.getAutoDestroy()){e.destroy()}else{c=e.getProxy();if(c){a=c.getReader();if(a){a.un("exception","handleException",this)}}}}if(b){if(b.isLoaded()){this.hasLoadedStore=true}if(b.isLoading()){d.onBeforeLoad()}if(d.container){d.refresh()}}},onBeforeLoad:function(){var a=this.getLoadingText();if(a&&this.isPainted()){this.setMasked({xtype:"loadmask",message:a})}this.hideEmptyText()},updateEmptyText:function(c,d){var b=this,a;if(d&&b.emptyTextCmp){b.remove(b.emptyTextCmp,true);delete b.emptyTextCmp}if(c){b.emptyTextCmp=b.add({xtype:"component",cls:b.getBaseCls()+"-emptytext",html:c,hidden:true});a=b.getStore();if(a&&b.hasLoadedStore&&!a.getCount()){this.showEmptyText()}}},onLoad:function(a){this.hasLoadedStore=true;this.setMasked(false);if(!a.getCount()){this.showEmptyText()}},refresh:function(){var b=this,a=b.container;if(!b.getStore()){if(!b.hasLoadedStore&&!b.getDeferEmptyText()){b.showEmptyText()}return}if(a){b.fireAction("refresh",[b],"doRefresh")}},applyItemTpl:function(a){return(Ext.isObject(a)&&a.isTemplate)?a:new Ext.XTemplate(a)},onAfterRender:function(){var a=this;a.callParent(arguments);a.updateStore(a.getStore())},getItemAt:function(a){return this.getViewItems()[a-this.indexOffset]},getItemIndex:function(b){var a=this.getViewItems().indexOf(b);return(a===-1)?a:this.indexOffset+a},getViewItems:function(){return this.container.getViewItems()},doRefresh:function(g){var a=g.container,l=g.getStore(),b=l.getRange(),f=g.getViewItems(),j=b.length,o=f.length,c=j-o,h=g.getScrollable(),d,m;if(this.getScrollToTopOnRefresh()&&h){h.getScroller().scrollToTop()}if(j<1){g.onStoreClear();return}else{g.hideEmptyText()}if(c<0){a.moveItemsToCache(o+c,o-1);f=g.getViewItems();o=f.length}else{if(c>0){a.moveItemsFromCache(l.getRange(o))}}for(d=0;dd.bottom||a.yd.right||a.xb[a-1]){return a-1}while(f+1>1,e=b[c];if(e==d){return c}else{if(ej){b=Math.min(l,h-j);for(e=b-1;e>=0;e--){k=c.pop();c.unshift(k);f.updateListItem(k,e+j,a)}}else{b=Math.min(l,j-h);for(e=0;e=0||(b===0&&d+m>=0)||(b===0&&-m<=k[b])){g=-10000}else{if(j<0){g=j}else{g=Math.max(0,m)}}a=n.getGroupString(i);if(c.$currentHeader!=a){c.setHtml(a);c.$currentHeader=a}if(c.$position!=g){c.translate(0,g);c.$position=g}}},createItem:function(c){var h=this,a=h.container,d=h.listItems,f=h.getInfinite(),g=h.scrollElement,i,e,b;i=Ext.factory(c);i.dataview=h;i.$height=c.minHeight;e=i.getHeader();if(!f){b=h.getBaseCls()+"-item-relative";i.addCls(b);e.addCls(b)}else{e.setTranslatable({translationMethod:this.translationMethod});e.translate(0,-10000);g.insertFirst(e.renderElement)}a.doAdd(i);d.push(i);return i},setItemsCount:function(a){var d=this,e=d.listItems,b=d.getListItemConfig(),f=a-e.length,c;for(c=0;c=0){j[b]=true}}j[d-1]=true;return l},onIndex:function(d,k){var m=this,p=k.toLowerCase(),n=m.getStore(),e=n.getGroups(),l=e.length,j=m.container.getScrollable().getScroller(),o,h,c,b;for(h=0;h=p){c=o;break}else{c=o}}if(c){k=n.indexOf(c.children[0]);j.stopAnimation();var a=j.getContainerSize().y,q=j.getSize().y,f=q-a,g=m.getInfinite()?m.getItemMap().map[k]:m.listItems[k].getHeader().renderElement.dom.offsetTop;j.scrollTo(0,Math.min(g,f))}},onItemAdd:function(c){var b=this,a=c.config;if(a.scrollDock){if(a.scrollDock=="bottom"){b.scrollDockItems.bottom.push(c)}else{b.scrollDockItems.top.push(c)}if(b.getInfinite()){c.on({resize:"onScrollDockItemResize",scope:this});c.addCls(b.getBaseCls()+"-scrolldockitem");c.setTranslatable({translationMethod:this.translationMethod});c.translate(0,-10000);c.$scrollDockHeight=0}b.container.doAdd(c)}else{b.callParent(arguments)}},getScrollDockedItems:function(){return this.scrollDockItems.bottom.slice().concat(this.scrollDockItems.top.slice())},onScrollDockItemResize:function(g,c){var f=this,a=f.listItems,e=a.length,b,d;Ext.getCmp(g.id).$scrollDockHeight=c.height;for(b=0;b(?:[\s]*)|(?:\s*))([\w\-]+)$/i,handledEvents:["*"],getSubscribers:function(b,a){var d=this.subscribers,c=d[b];if(!c&&a){c=d[b]={type:{$length:0},selector:[],$length:0}}return c},subscribe:function(g,f){if(this.idSelectorRegex.test(g)){return false}var e=g.match(this.optimizedSelectorRegex),a=this.getSubscribers(f,true),k=a.type,c=a.selector,d,i,j,b,h;if(e!==null){d=e[1];i=e[2].indexOf(">")===-1;j=e[3];b=k[j];if(!b){k[j]=b={descendents:{$length:0},children:{$length:0},$length:0}}h=i?b.descendents:b.children;if(h.hasOwnProperty(d)){h[d]++;return true}h[d]=1;h.$length++;b.$length++;k.$length++}else{if(c.hasOwnProperty(g)){c[g]++;return true}c[g]=1;c.push(g)}a.$length++;return true},unsubscribe:function(g,f,k){var a=this.getSubscribers(f);if(!a){return false}var e=g.match(this.optimizedSelectorRegex),l=a.type,c=a.selector,d,i,j,b,h;k=Boolean(k);if(e!==null){d=e[1];i=e[2].indexOf(">")===-1;j=e[3];b=l[j];if(!b){return true}h=i?b.descendents:b.children;if(!h.hasOwnProperty(d)||(!k&&--h[d]>0)){return true}delete h[d];h.$length--;b.$length--;l.$length--}else{if(!c.hasOwnProperty(g)||(!k&&--c[g]>0)){return true}delete c[g];Ext.Array.remove(c,g)}if(--a.$length===0){delete this.subscribers[f]}return true},notify:function(d,a){var c=this.getSubscribers(a),e,b;if(!c||c.$length===0){return false}e=d.substr(1);b=Ext.ComponentManager.get(e);if(b){this.dispatcher.doAddListener(this.targetType,d,a,"publish",this,{args:[a,b]},"before")}},matchesSelector:function(b,a){return Ext.ComponentQuery.is(b,a)},dispatch:function(d,b,c,a){this.dispatcher.doDispatchEvent(this.targetType,d,b,c,null,a)},publish:function(g,k){var e=this.getSubscribers(g);if(!e){return}var p=arguments[arguments.length-1],o=e.type,b=e.selector,d=Array.prototype.slice.call(arguments,2,-2),l=k.xtypesChain,s,n,t,a,m,v,r,u,h,f,q,c;for(u=0,h=l.length;u0){s=e.descendents;if(s.$length>0){if(!a){a=k.getAncestorIds()}for(q=0,c=a.length;q0){if(!t){if(a){t=a[0]}else{v=k.getParent();if(v){t=v.getId()}}}if(t){if(n.hasOwnProperty(t)){this.dispatch("#"+t+" > "+f,g,d,p)}}}}}h=b.length;if(h>0){for(u=0;u0)){return true}delete d[f];if(--d.$length===0){delete this.subscribers[a]}return true},onBeforeComponentRenderedChange:function(b,d,g){var f=this.eventNames,c=g?f.painted:f.erased,e=this.getSubscribers(c),a;if(e&&e.$length>0){this.renderedQueue[d.getId()]=a=[];this.publish(e,d,c,a)}},onBeforeComponentHiddenChange:function(c,d){var f=this.eventNames,b=d?f.erased:f.painted,e=this.getSubscribers(b),a;if(e&&e.$length>0){this.hiddenQueue[c.getId()]=a=[];this.publish(e,c,b,a)}},onComponentRenderedChange:function(b,c){var d=this.renderedQueue,e=c.getId(),a;if(!d.hasOwnProperty(e)){return}a=d[e];delete d[e];if(a.length>0){this.dispatchQueue(a)}},onComponentHiddenChange:function(c){var b=this.hiddenQueue,d=c.getId(),a;if(!b.hasOwnProperty(d)){return}a=b[d];delete b[d];if(a.length>0){this.dispatchQueue(a)}},dispatchQueue:function(g){var l=this.dispatcher,a=this.targetType,b=this.eventNames,e=g.slice(),f=e.length,c,k,h,d,j;g.length=0;if(f>0){for(c=0;c0)){return true}delete c[i];c.$length--}else{if(!d.hasOwnProperty(i)||(!j&&--d[i]>0)){return true}delete d[i];d.$length--}}else{if(g===this.SELECTOR_ALL){if(j){a.all=0}else{a.all--}}else{if(!b.hasOwnProperty(g)||(!j&&--b[g]>0)){return true}delete b[g];Ext.Array.remove(b,g)}}a.$length--;return true},getElementTarget:function(a){if(a.nodeType!==1){a=a.parentNode;if(!a||a.nodeType!==1){return null}}return a},getBubblingTargets:function(b){var a=[];if(!b){return a}do{a[a.length]=b;b=b.parentNode}while(b&&b.nodeType===1);return a},dispatch:function(c,a,b){b.push(b[0].target);this.callParent(arguments)},publish:function(b,a,c){var d=this.getSubscribers(b),e;if(d.$length===0||!this.doPublish(d,b,a,c)){e=this.getSubscribers("*");if(e.$length>0){this.doPublish(e,b,a,c)}}return this},doPublish:function(f,h,x,u){var r=f.id,g=f.className,b=f.selector,p=r.$length>0,a=g.$length>0,l=b.length>0,o=f.all>0,y={},e=[u],q=false,m=this.classNameSplitRegex,v,k,t,d,z,n,c,w,s;for(v=0,k=x.length;v0)){return true}delete d[f];this.monitors[f].destroy();delete this.monitors[f];return true},onElementPainted:function(b,a){Ext.TaskQueue.requestRead("dispatch",this,[b,"painted",[a]])}});Ext.define("Ext.mixin.Templatable",{extend:Ext.mixin.Mixin,mixinConfig:{id:"templatable"},referenceAttributeName:"reference",referenceSelector:"[reference]",getElementConfig:function(){return{reference:"element"}},getElementTemplate:function(){var a=document.createDocumentFragment();a.appendChild(Ext.Element.create(this.getElementConfig(),true));return a},initElement:function(){var a=this.self.prototype;a.elementTemplate=this.getElementTemplate();a.initElement=a.doInitElement;this.initElement.apply(this,arguments)},linkElement:function(a,b){this.link(a,b)},doInitElement:function(){var g=this.referenceAttributeName,c,d,e,f,b,a;c=this.elementTemplate.cloneNode(true);d=c.querySelectorAll(this.referenceSelector);for(e=0,f=d.length;e0){c.width=b;c.height=j;c.contentWidth=a;c.contentHeight=i;c.flag=g;e=true;this.getCallback().apply(this.getScope(),this.getArgs())}return e},refresh:function(a){if(this.refreshSize()||a){Ext.TaskQueue.requestWrite("refreshMonitors",this)}},destroy:function(){var a=this.getElement();this.bindListeners(false);if(a&&!a.isDestroyed){a.removeCls("x-size-monitored")}delete this._element;this.callSuper()}});Ext.define("Ext.util.sizemonitor.Default",{extend:Ext.util.sizemonitor.Abstract,updateElement:function(a){},bindListeners:function(b){var a=this.getElement().dom;if(!a){return}if(b){a.onresize=this.refresh}else{delete a.onresize}},getContentBounds:function(){return this.getElement().dom.getBoundingClientRect()},getContentWidth:function(){return this.getElement().getWidth()},getContentHeight:function(){return this.getElement().getHeight()}});Ext.define("Ext.util.sizemonitor.Scroll",{extend:Ext.util.sizemonitor.Abstract,getElementConfig:function(){return{reference:"detectorsContainer",classList:["x-size-monitors","scroll"],children:[{reference:"expandMonitor",className:"expand"},{reference:"shrinkMonitor",className:"shrink"}]}},constructor:function(a){this.onScroll=Ext.Function.bind(this.onScroll,this);this.callSuper(arguments)},bindListeners:function(b){var a=b?"addEventListener":"removeEventListener";this.expandMonitor[a]("scroll",this.onScroll,true);this.shrinkMonitor[a]("scroll",this.onScroll,true)},forceRefresh:function(){Ext.TaskQueue.requestRead("refresh",this,[true])},onScroll:function(){Ext.TaskQueue.requestRead("refresh",this)},refreshMonitors:function(){var b=this.expandMonitor,c=this.shrinkMonitor,a=1000000;if(b&&!b.isDestroyed){b.scrollLeft=a;b.scrollTop=a}if(c&&!c.isDestroyed){c.scrollLeft=a;c.scrollTop=a}}});Ext.define("Ext.util.sizemonitor.OverflowChange",{extend:Ext.util.sizemonitor.Abstract,constructor:function(a){this.onExpand=Ext.Function.bind(this.onExpand,this);this.onShrink=Ext.Function.bind(this.onShrink,this);this.callSuper(arguments)},getElementConfig:function(){return{reference:"detectorsContainer",classList:["x-size-monitors","overflowchanged"],children:[{reference:"expandMonitor",className:"expand",children:[{reference:"expandHelper"}]},{reference:"shrinkMonitor",className:"shrink",children:[{reference:"shrinkHelper"}]}]}},bindListeners:function(b){var a=b?"addEventListener":"removeEventListener";this.expandMonitor[a](Ext.browser.is.Firefox?"underflow":"overflowchanged",this.onExpand,true);this.shrinkMonitor[a](Ext.browser.is.Firefox?"overflow":"overflowchanged",this.onShrink,true)},onExpand:function(a){if(Ext.browser.is.Webkit&&a.horizontalOverflow&&a.verticalOverflow){return}Ext.TaskQueue.requestRead("refresh",this)},onShrink:function(a){if(Ext.browser.is.Webkit&&!a.horizontalOverflow&&!a.verticalOverflow){return}Ext.TaskQueue.requestRead("refresh",this)},refreshMonitors:function(){if(this.isDestroyed){return}var f=this.expandHelper,e=this.shrinkHelper,b=this.getContentBounds(),d=b.width,a=b.height,c;if(f&&!f.isDestroyed){c=f.style;c.width=(d+1)+"px";c.height=(a+1)+"px"}if(e&&!e.isDestroyed){c=e.style;c.width=d+"px";c.height=a+"px"}Ext.TaskQueue.requestRead("refresh",this)}});Ext.define("Ext.util.SizeMonitor",{constructor:function(a){var b=Ext.util.sizemonitor;if(Ext.browser.is.Firefox){return new b.OverflowChange(a)}else{if(Ext.browser.is.WebKit){if(Ext.browser.engineVersion.gtEq("535")){return new b.OverflowChange(a)}else{return new b.Scroll(a)}}else{return new b.Default(a)}}}});Ext.define("Ext.event.publisher.ElementSize",{extend:Ext.event.publisher.Publisher,targetType:"element",handledEvents:["resize"],constructor:function(){this.monitors={};this.callSuper(arguments)},subscribe:function(e){var b=e.match(this.idSelectorRegex),d=this.subscribers,f,c,a;if(!b){return false}f=b[1];if(d.hasOwnProperty(f)){d[f]++;return true}d[f]=1;c=Ext.get(f);this.monitors[f]=a=new Ext.util.SizeMonitor({element:c,callback:this.onElementResize,scope:this,args:[e,c]});this.dispatcher.addListener("element",e,"painted","forceRefresh",a);return true},unsubscribe:function(g,a,e){var c=g.match(this.idSelectorRegex),f=this.subscribers,d=this.monitors,h,b;if(!c){return false}h=c[1];if(!f.hasOwnProperty(h)||(!e&&--f[h]>0)){return true}delete f[h];b=d[h];this.dispatcher.removeListener("element",g,"painted","forceRefresh",b);b.destroy();delete d[h];return true},onElementResize:function(c,a,b){Ext.TaskQueue.requestRead("dispatch",this,[c,"resize",[a,b]])}});Ext.define("Ext.event.publisher.TouchGesture",{extend:Ext.event.publisher.Dom,handledEvents:["touchstart","touchmove","touchend","touchcancel"],mouseToTouchMap:{mousedown:"touchstart",mousemove:"touchmove",mouseup:"touchend"},lastEventType:null,config:{moveThrottle:0,recognizers:{}},constructor:function(a){this.eventProcessors={touchstart:this.onTouchStart,touchmove:this.onTouchMove,touchend:this.onTouchEnd,touchcancel:this.onTouchEnd};this.eventToRecognizerMap={};this.activeRecognizers=[];this.touchesMap={};this.currentIdentifiers=[];if(Ext.browser.is.Chrome&&Ext.os.is.Android){this.screenPositionRatio=Ext.browser.version.gt("18")?1:1/window.devicePixelRatio}else{if(Ext.os.is.BlackBerry){this.screenPositionRatio=1/window.devicePixelRatio}else{this.screenPositionRatio=(Ext.browser.engineName=="WebKit"&&Ext.os.is.Desktop)?1:window.innerWidth/window.screen.width}}this.initConfig(a);return this.callSuper()},applyRecognizers:function(b){var c,a;for(c in b){if(b.hasOwnProperty(c)){a=b[c];if(a){this.registerRecognizer(a)}}}return b},handles:function(a){return this.callSuper(arguments)||this.eventToRecognizerMap.hasOwnProperty(a)},doesEventBubble:function(){return true},onEvent:function(f){var d=f.type,b=this.lastEventType,c=[f];if(this.eventProcessors[d]){this.eventProcessors[d].call(this,f);return}if("button" in f&&f.button>0){return}else{if(d==="mousedown"&&b&&b!=="mouseup"){var a=document.createEvent("MouseEvent");a.initMouseEvent("mouseup",f.bubbles,f.cancelable,document.defaultView,f.detail,f.screenX,f.screenY,f.clientX,f.clientY,f.ctrlKey,f.altKey,f.shiftKey,f.metaKey,f.metaKey,f.button,f.relatedTarget);this.onEvent(a)}if(d!=="mousemove"){this.lastEventType=d}f.identifier=1;f.touches=(d!=="mouseup")?c:[];f.targetTouches=(d!=="mouseup")?c:[];f.changedTouches=c;this.eventProcessors[this.mouseToTouchMap[d]].call(this,f)}},registerRecognizer:function(a){var g=this.eventToRecognizerMap,e=this.activeRecognizers,c=a.getHandledEvents(),d,f,b;a.setOnRecognized(this.onRecognized);a.setCallbackScope(this);for(d=0,f=c.length;d0){this.invokeRecognizers("onTouchMove",d)}},onTouchEnd:function(h){if(!this.isStarted){return}if(this.lastMoveEvent){this.onAnimationFrame()}var a=this.touchesMap,d=this.currentIdentifiers,f=h.changedTouches,g=f.length,b,c,j;this.updateTouches(f);f=h.changedTouches;for(c=0;c0){return}var a=this.pointerToTouchMap[b.type];b.identifier=b.pointerId;b.changedTouches=[b];this.eventProcessors[a].call(this,b)}})}else{if(Ext.os.is.ChromeOS||!Ext.feature.has.Touch){this.override({handledEvents:["touchstart","touchmove","touchend","touchcancel","mousedown","mousemove","mouseup"]})}}});Ext.define("Ext.event.recognizer.Recognizer",{mixins:[Ext.mixin.Identifiable],handledEvents:[],config:{onRecognized:Ext.emptyFn,onFailed:Ext.emptyFn,callbackScope:null},constructor:function(a){this.initConfig(a);return this},getHandledEvents:function(){return this.handledEvents},onStart:Ext.emptyFn,onEnd:Ext.emptyFn,fail:function(){this.getOnFailed().apply(this.getCallbackScope(),arguments);return false},fire:function(){this.getOnRecognized().apply(this.getCallbackScope(),arguments)}});Ext.define("Ext.event.recognizer.Touch",{extend:Ext.event.recognizer.Recognizer,onTouchStart:Ext.emptyFn,onTouchMove:Ext.emptyFn,onTouchEnd:Ext.emptyFn});Ext.define("Ext.event.recognizer.SingleTouch",{extend:Ext.event.recognizer.Touch,inheritableStatics:{NOT_SINGLE_TOUCH:1,TOUCH_MOVED:2},onTouchStart:function(a){if(a.touches.length>1){return this.fail(this.self.NOT_SINGLE_TOUCH)}}});Ext.define("Ext.event.recognizer.DoubleTap",{extend:Ext.event.recognizer.SingleTouch,inheritableStatics:{DIFFERENT_TARGET:3},config:{maxDuration:300},handledEvents:["singletap","doubletap"],singleTapTimer:null,startTime:0,lastTapTime:0,onTouchStart:function(a){if(this.callParent(arguments)===false){return false}this.startTime=a.time;clearTimeout(this.singleTapTimer)},onTouchMove:function(){return this.fail(this.self.TOUCH_MOVED)},onEnd:function(g){var i=this,d=this.getMaxDuration(),f=g.changedTouches[0],a=g.time,h=g.target,j=this.lastTapTime,b=this.lastTarget,c;this.lastTapTime=a;this.lastTarget=h;if(j){c=a-j;if(c<=d){if(h!==b){return this.fail(this.self.DIFFERENT_TARGET)}this.lastTarget=null;this.lastTapTime=0;this.fire("doubletap",g,[f],{touch:f,duration:c});return}}if(a-this.startTime>d){this.fireSingleTap(g,f)}else{this.singleTapTimer=setTimeout(function(){i.fireSingleTap(g,f)},d)}},fireSingleTap:function(a,b){this.fire("singletap",a,[b],{touch:b})}});Ext.define("Ext.event.recognizer.Drag",{extend:Ext.event.recognizer.SingleTouch,isStarted:false,startPoint:null,previousPoint:null,lastPoint:null,handledEvents:["dragstart","drag","dragend"],config:{minDistance:8},constructor:function(){this.callSuper(arguments);this.info={touch:null,previous:{x:0,y:0},x:0,y:0,delta:{x:0,y:0},absDelta:{x:0,y:0},flick:{velocity:{x:0,y:0}},direction:{x:0,y:0},time:0,previousTime:{x:0,y:0}}},onTouchStart:function(a){if(this.callSuper(arguments)===false){if(this.isStarted&&this.lastMoveEvent!==null){this.onTouchEnd(this.lastMoveEvent)}return false}this.startTime=a.time;this.startPoint=a.changedTouches[0].point},tryDragStart:function(f){var b=this.startPoint,d=f.changedTouches,h=d[0],a=h.point,g=this.getMinDistance(),c=this.info;if(Math.abs(a.getDistanceTo(b))>=g){this.isStarted=true;this.lastPoint=this.previousPoint=this.lastPoint=a;this.resetInfo("x",f,h);this.resetInfo("y",f,h);c.time=f.time;this.fire("dragstart",f,d,c)}},onTouchMove:function(c){if(!this.isStarted){this.tryDragStart(c)}if(!this.isStarted){return}var b=c.changedTouches,d=b[0],a=d.point;if(this.lastPoint){this.previousPoint=this.lastPoint}this.lastPoint=a;this.lastMoveEvent=c;this.updateInfo("x",c,d,true);this.updateInfo("y",c,d,true);this.info.time=c.time;this.fire("drag",c,b,this.info)},onAxisDragEnd:function(a,c){var b=c.time-c.previousTime[a];if(b>0){c.flick.velocity[a]=(c[a]-c.previous[a])/b}},resetInfo:function(c,g,i){var d=this.lastPoint[c],b=this.startPoint[c],h=d-b,a=c.toUpperCase(),f=this.info;f.touch=i;f.delta[c]=h;f.absDelta[c]=Math.abs(h);f.previousTime[c]=this.startTime;f.previous[c]=b;f[c]=d;f.direction[c]=0;f["start"+a]=this.startPoint[c];f["previous"+a]=f.previous[c];f["page"+a]=f[c];f["delta"+a]=f.delta[c];f["absDelta"+a]=f.absDelta[c];f["previousDelta"+a]=0;f.startTime=this.startTime},updateInfo:function(f,k,j,l){var d=k.time,n=this.lastPoint[f],g=this.previousPoint[f],a=this.startPoint[f],o=n-a,c=this.info,m=c.direction,i=f.toUpperCase(),b=c.previous[f],h;c.touch=j;h=c.delta[f];c.delta[f]=o;c.absDelta[f]=Math.abs(o);if(l&&n!==b&&n!==c[f]&&d-c.previousTime[f]>=50){c.previous[f]=c[f];c.previousTime[f]=c.time}c[f]=n;if(n>g){m[f]=1}else{if(nthis.getMaxDuration()){return this.fail(this.self.MAX_DURATION_EXCEEDED)}if(this.isVertical&&c>this.getMaxOffset()){this.isVertical=false}if(this.isHorizontal&&a>this.getMaxOffset()){this.isHorizontal=false}if(!this.isHorizontal&&!this.isVertical){return this.fail(this.self.MAX_OFFSET_EXCEEDED)}},onTouchEnd:function(i){if(this.onTouchMove(i)===false){return false}var h=i.changedTouches[0],l=h.pageX,j=h.pageY,g=l-this.startX,f=j-this.startY,c=Math.abs(g),b=Math.abs(f),m=this.getMinDistance(),d=i.time-this.startTime,k,a;if(this.isVertical&&bc){return this.fail(this.self.MAX_DURATION_EXCEEDED)}if(a>b){return this.fail(this.self.MAX_OFFSET_EXCEEDED)}},onTouchEnd:function(f){if(this.onTouchMove(f)!==false){var i=f.changedTouches[0],a=i.pageX,b=a-this.startX,h=Math.abs(b),d=f.time-this.startTime,g=this.getMinDistance(),c;if(ha){this.end(d)}}},onTouchEnd:function(a){this.end(a)},start:function(){if(!this.isTracking){this.isTracking=true;this.isStarted=false}},end:function(a){if(this.isTracking){this.isTracking=false;if(this.isStarted){this.isStarted=false;this.fireEnd(a)}}}});Ext.define("Ext.event.recognizer.Pinch",{extend:Ext.event.recognizer.MultiTouch,requiredTouchesCount:2,handledEvents:["pinchstart","pinch","pinchend"],startDistance:0,lastTouches:null,onTouchMove:function(c){if(!this.isTracking){return}var b=Array.prototype.slice.call(c.touches),d,a,f;d=b[0].point;a=b[1].point;f=d.getDistanceTo(a);if(f===0){return}if(!this.isStarted){this.isStarted=true;this.startDistance=f;this.fire("pinchstart",c,b,{touches:b,distance:f,scale:1})}else{this.fire("pinch",c,b,{touches:b,distance:f,scale:f/this.startDistance})}this.lastTouches=b},fireEnd:function(a){this.fire("pinchend",a,this.lastTouches)},fail:function(){return this.callParent(arguments)}});Ext.define("Ext.event.recognizer.Rotate",{extend:Ext.event.recognizer.MultiTouch,requiredTouchesCount:2,handledEvents:["rotatestart","rotate","rotateend"],startAngle:0,lastTouches:null,lastAngle:null,onTouchMove:function(h){if(!this.isTracking){return}var g=Array.prototype.slice.call(h.touches),b=this.lastAngle,d,f,c,a,i,j;d=g[0].point;f=g[1].point;c=d.getAngleTo(f);if(b!==null){j=Math.abs(b-c);a=c+360;i=c-360;if(Math.abs(a-b)=this.getMoveDistance()){this.fire("tapcancel",b,[c],{touch:c});return this.fail(this.self.TOUCH_MOVED)}},onTouchEnd:function(a){var b=a.changedTouches[0];this.fire("tap",a,[b],{touch:b})}});Ext.define("Ext.fx.runner.Css",{extend:Ext.Evented,prefixedProperties:{transform:true,"transform-origin":true,perspective:true,"transform-style":true,transition:true,"transition-property":true,"transition-duration":true,"transition-timing-function":true,"transition-delay":true,animation:true,"animation-name":true,"animation-duration":true,"animation-iteration-count":true,"animation-direction":true,"animation-timing-function":true,"animation-delay":true},lengthProperties:{top:true,right:true,bottom:true,left:true,width:true,height:true,"max-height":true,"max-width":true,"min-height":true,"min-width":true,"margin-bottom":true,"margin-left":true,"margin-right":true,"margin-top":true,"padding-bottom":true,"padding-left":true,"padding-right":true,"padding-top":true,"border-bottom-width":true,"border-left-width":true,"border-right-width":true,"border-spacing":true,"border-top-width":true,"border-width":true,"outline-width":true,"letter-spacing":true,"line-height":true,"text-indent":true,"word-spacing":true,"font-size":true,translate:true,translateX:true,translateY:true,translateZ:true,translate3d:true},durationProperties:{"transition-duration":true,"transition-delay":true,"animation-duration":true,"animation-delay":true},angleProperties:{rotate:true,rotateX:true,rotateY:true,rotateZ:true,skew:true,skewX:true,skewY:true},lengthUnitRegex:/([a-z%]*)$/,DEFAULT_UNIT_LENGTH:"px",DEFAULT_UNIT_ANGLE:"deg",DEFAULT_UNIT_DURATION:"ms",formattedNameCache:{},constructor:function(){var a=Ext.feature.has.Css3dTransforms;if(a){this.transformMethods=["translateX","translateY","translateZ","rotate","rotateX","rotateY","rotateZ","skewX","skewY","scaleX","scaleY","scaleZ"]}else{this.transformMethods=["translateX","translateY","rotate","skewX","skewY","scaleX","scaleY"]}this.vendorPrefix=Ext.browser.getStyleDashPrefix();this.ruleStylesCache={};return this},getStyleSheet:function(){var c=this.styleSheet,a,b;if(!c){a=document.createElement("style");a.type="text/css";(document.head||document.getElementsByTagName("head")[0]).appendChild(a);b=document.styleSheets;this.styleSheet=c=b[b.length-1]}return c},applyRules:function(i){var g=this.getStyleSheet(),k=this.ruleStylesCache,j=g.cssRules,c,e,h,b,d,a,f;for(c in i){e=i[c];h=k[c];if(h===undefined){d=j.length;g.insertRule(c+"{}",d);h=k[c]=j.item(d).style}b=h.$cache;if(!b){b=h.$cache={}}for(a in e){f=this.formatValue(e[a],a);a=this.formatName(a);if(b[a]!==f){b[a]=f;if(f===null){h.removeProperty(a)}else{h.setProperty(a,f,"important")}}}}return this},applyStyles:function(d){var g,c,f,b,a,e;for(g in d){if(d.hasOwnProperty(g)){c=document.getElementById(g);if(!c){return this}f=c.style;b=d[g];for(a in b){if(b.hasOwnProperty(a)){e=this.formatValue(b[a],a);a=this.formatName(a);if(e===null){f.removeProperty(a)}else{f.setProperty(a,e,"important")}}}}}return this},formatName:function(b){var a=this.formattedNameCache,c=a[b];if(!c){if(this.prefixedProperties[b]&&Ext.browser.is.WebKit){c=this.vendorPrefix+b}else{c=b}a[b]=c}return c},formatValue:function(j,b){var g=typeof j,l=this.DEFAULT_UNIT_LENGTH,e,a,d,f,c,k,h;if(j===null){return""}if(g=="string"){if(this.lengthProperties[b]){h=j.match(this.lengthUnitRegex)[1];if(h.length>0){}else{return j+l}}return j}else{if(g=="number"){if(j==0){return"0"}if(this.lengthProperties[b]){return j+l}if(this.angleProperties[b]){return j+this.DEFAULT_UNIT_ANGLE}if(this.durationProperties[b]){return j+this.DEFAULT_UNIT_DURATION}}else{if(b==="transform"){e=this.transformMethods;c=[];for(d=0,f=e.length;d0)?k.join(", "):"none"}}}}return j}});Ext.define("Ext.fx.runner.CssTransition",{extend:Ext.fx.runner.Css,listenersAttached:false,constructor:function(){this.runningAnimationsData={};return this.callParent(arguments)},attachListeners:function(){this.listenersAttached=true;this.getEventDispatcher().addListener("element","*","transitionend","onTransitionEnd",this)},onTransitionEnd:function(b){var a=b.target,c=a.id;if(c&&this.runningAnimationsData.hasOwnProperty(c)){this.refreshRunningAnimationsData(Ext.get(a),[b.browserEvent.propertyName])}},onAnimationEnd:function(g,f,d,j,n){var c=g.getId(),k=this.runningAnimationsData[c],o={},m={},b,h,e,l,a;d.un("stop","onAnimationStop",this);if(k){b=k.nameMap}o[c]=m;if(f.onBeforeEnd){f.onBeforeEnd.call(f.scope||this,g,j)}d.fireEvent("animationbeforeend",d,g,j);this.fireEvent("animationbeforeend",this,d,g,j);if(n||(!j&&!f.preserveEndState)){h=f.toPropertyNames;for(e=0,l=h.length;e0},refreshRunningAnimationsData:function(d,k,t,p){var g=d.getId(),q=this.runningAnimationsData,a=q[g];if(!a){return}var m=a.nameMap,s=a.nameList,b=a.sessions,f,h,e,u,l,c,r,o,n=false;t=Boolean(t);p=Boolean(p);if(!b){return this}f=b.length;if(f===0){return this}if(p){a.nameMap={};s.length=0;for(l=0;l");d.close();this.testElement=c=d.createElement("div");c.style.setProperty("position","absolute","important");d.body.appendChild(c);this.testElementComputedStyle=window.getComputedStyle(c)}return c},getCssStyleValue:function(b,e){var d=this.getTestElement(),a=this.testElementComputedStyle,c=d.style;c.setProperty(b,e);if(Ext.browser.is.Firefox){d.offsetHeight}e=a.getPropertyValue(b);c.removeProperty(b);return e},run:function(q){var G=this,h=this.lengthProperties,y={},F={},H={},d,t,z,e,v,J,w,r,s,a,n,B,A,p,C,l,u,g,D,I,k,f,x,o,c,E,b,m;if(!this.listenersAttached){this.attachListeners()}q=Ext.Array.from(q);for(B=0,p=q.length;B0){this.refreshRunningAnimationsData(d,Ext.Array.merge(J,w),true,H.replacePrevious)}c=a.nameMap;E=a.nameList;u={};for(A=0;A0){J=Ext.Array.difference(E,J);w=Ext.Array.merge(J,w);n["transition-property"]=J}y[t]=n;F[t]=Ext.apply({},e);F[t]["transition-property"]=w;F[t]["transition-duration"]=H.duration;F[t]["transition-timing-function"]=H.easing;F[t]["transition-delay"]=H.delay;C.startTime=Date.now()}s=this.$className;this.applyStyles(y);r=function(i){if(i.data===s&&i.source===window){window.removeEventListener("message",r,false);G.applyStyles(F)}};window.addEventListener("message",r,false);window.postMessage(s,"*")},onAnimationStop:function(d){var f=this.runningAnimationsData,h,a,g,b,c,e;for(h in f){if(f.hasOwnProperty(h)){a=f[h];g=a.sessions;for(b=0,c=g.length;b tab",scope:a})},onTabTap:function(a){this.setActiveTab(a)},applyActiveTab:function(b,c){if(!b&&b!==0){return}var a=this.parseActiveTab(b);if(!a){return}return a},doSetDocked:function(a){var c=this.getLayout(),d=this.getInitialConfig(),b;if(!d.layout||!d.layout.pack){b=(a=="bottom")?"center":"left";if(c.isLayout){c.setPack(b)}else{c.pack=(c&&c.pack)?c.pack:b}}this.callParent(arguments)},doSetActiveTab:function(b,a){if(b){b.setActive(true)}if(a&&a.parent){a.setActive(false)}},parseActiveTab:function(a){if(typeof a=="number"){return this.getInnerItems()[a]}else{if(typeof a=="string"){a=Ext.getCmp(a)}}return a}});Ext.define("Ext.tab.Panel",{extend:Ext.Container,xtype:"tabpanel",alternateClassName:"Ext.TabPanel",config:{ui:"dark",tabBar:true,tabBarPosition:"top",layout:{type:"card",animation:{type:"slide",direction:"left"}},cls:Ext.baseCSSPrefix+"tabpanel"},initialize:function(){this.callParent();this.on({order:"before",activetabchange:"doTabChange",delegate:"> tabbar",scope:this});this.on({disabledchange:"onItemDisabledChange",delegate:"> component",scope:this})},applyScrollable:function(){return false},updateUi:function(a,b){this.callParent(arguments);if(this.initialized){this.getTabBar().setUi(a)}},doSetActiveItem:function(d,j){if(d){var f=this.getInnerItems(),g=f.indexOf(j),i=f.indexOf(d),e=g>i,c=this.getLayout().getAnimation(),b=this.getTabBar(),h=b.parseActiveTab(g),a=b.parseActiveTab(i);if(c&&c.setReverse){c.setReverse(e)}this.callParent(arguments);if(i!=-1){this.forcedChange=true;b.setActiveTab(i);this.forcedChange=false;if(h){h.setActive(false)}if(a){a.setActive(true)}}}},doTabChange:function(a,d){var b=this.getActiveItem(),c;this.setActiveItem(a.indexOf(d));c=this.getActiveItem();return this.forcedChange||b!==c},applyTabBar:function(a){if(a===true){a={}}if(a){Ext.applyIf(a,{ui:this.getUi(),docked:this.getTabBarPosition()})}return Ext.factory(a,Ext.tab.Bar,this.getTabBar())},updateTabBar:function(a){if(a){this.add(a);this.setTabBarPosition(a.getDocked())}},updateTabBarPosition:function(b){var a=this.getTabBar();if(a){a.setDocked(b)}},onItemAdd:function(e){var k=this;if(!e.isInnerItem()){return k.callParent(arguments)}var c=k.getTabBar(),o=e.getInitialConfig(),d=o.tab||{},g=(e.getTitle)?e.getTitle():o.title,i=(e.getIconCls)?e.getIconCls():o.iconCls,j=(e.getHidden)?e.getHidden():o.hidden,n=(e.getDisabled)?e.getDisabled():o.disabled,p=(e.getBadgeText)?e.getBadgeText():o.badgeText,b=k.getInnerItems(),h=b.indexOf(e),l=c.getItems(),a=c.getActiveTab(),m=(l.length>=b.length)&&l.getAt(h),f;if(g&&!d.title){d.title=g}if(i&&!d.iconCls){d.iconCls=i}if(j&&!d.hidden){d.hidden=j}if(n&&!d.disabled){d.disabled=n}if(p&&!d.badgeText){d.badgeText=p}f=Ext.factory(d,Ext.tab.Tab,m);if(!m){c.insert(h,f)}e.tab=f;k.callParent(arguments);if(!a&&a!==0){c.setActiveTab(c.getActiveItem())}},onItemDisabledChange:function(a,b){if(a&&a.tab){a.tab.setDisabled(b)}},onItemRemove:function(b,a){this.getTabBar().remove(b.tab,this.getAutoDestroy());this.callParent(arguments)}},function(){});Ext.define("Ext.util.InputBlocker",{blockInputs:function(){if(Ext.browser.is.ie){Ext.select(".x-field-text .x-field-input:not(.x-item-disabled) .x-input-el, .x-field-textarea .x-field-input:not(.x-item-disabled) .x-input-el").each(function(a){if(a.dom.offsetWidth>0){a.dom.setAttribute("disabled",true);a.dom.setAttribute("overlayfix",true)}})}},unblockInputs:function(){if(Ext.browser.is.ie){Ext.select("[overlayfix]").each(function(a){a.dom.removeAttribute("disabled");a.dom.removeAttribute("overlayfix")})}}});Ext.define("Ext.viewport.Default",{extend:Ext.Container,xtype:"viewport",PORTRAIT:"portrait",LANDSCAPE:"landscape",config:{autoMaximize:false,autoBlurInput:true,preventPanning:true,preventZooming:false,autoRender:true,layout:"card",width:"100%",height:"100%",useBodyElement:true},isReady:false,isViewport:true,isMaximizing:false,id:"ext-viewport",isInputRegex:/^(input|textarea|select|a)$/i,focusedElement:null,fullscreenItemCls:Ext.baseCSSPrefix+"fullscreen",constructor:function(a){var b=Ext.Function.bind;this.doPreventPanning=b(this.doPreventPanning,this);this.doPreventZooming=b(this.doPreventZooming,this);this.doBlurInput=b(this.doBlurInput,this);this.maximizeOnEvents=["ready","orientationchange"];this.orientation=this.determineOrientation();this.windowWidth=this.getWindowWidth();this.windowHeight=this.getWindowHeight();this.windowOuterHeight=this.getWindowOuterHeight();if(!this.stretchHeights){this.stretchHeights={}}window.devicePixelRatio=window.devicePixelRatio||1;this.callParent([a]);if(!Ext.os.is.Android||Ext.browser.is.ChromeMobile){if(this.supportsOrientation()){this.addWindowListener("orientationchange",b(this.onOrientationChange,this))}else{this.addWindowListener("resize",b(this.onResize,this))}}document.addEventListener("focus",b(this.onElementFocus,this),true);document.addEventListener("blur",b(this.onElementBlur,this),true);Ext.onDocumentReady(this.onDomReady,this);this.on("ready",this.onReady,this,{single:true});this.getEventDispatcher().addListener("component","*","fullscreen","onItemFullscreenChange",this);return this},onDomReady:function(){this.isReady=true;this.updateSize();this.fireEvent("ready",this)},onReady:function(){if(this.getAutoRender()){this.render()}},onElementFocus:function(a){this.focusedElement=a.target},onElementBlur:function(){this.focusedElement=null},render:function(){if(!this.rendered){var a=Ext.getBody(),b=Ext.baseCSSPrefix,h=[],d=Ext.os,g=d.name.toLowerCase(),f=Ext.browser.name.toLowerCase(),e=d.version.getMajor(),c=this.getOrientation();this.renderTo(a);h.push(b+d.deviceType.toLowerCase());if(d.is.iPad){h.push(b+"ipad")}h.push(b+g);h.push(b+f);if(e){h.push(b+g+"-"+e)}if(d.is.BlackBerry){h.push(b+"bb")}if(Ext.browser.is.WebKit){h.push(b+"webkit")}if(Ext.browser.is.Standalone){h.push(b+"standalone")}h.push(b+c);a.addCls(h)}},applyAutoBlurInput:function(a){var b=(Ext.feature.has.Touch)?"touchstart":"mousedown";if(a){this.addWindowListener(b,this.doBlurInput,false)}else{this.removeWindowListener(b,this.doBlurInput,false)}return a},applyAutoMaximize:function(a){if(Ext.browser.is.WebView){a=false}if(a){this.on("ready","doAutoMaximizeOnReady",this,{single:true});this.on("orientationchange","doAutoMaximizeOnOrientationChange",this)}else{this.un("ready","doAutoMaximizeOnReady",this);this.un("orientationchange","doAutoMaximizeOnOrientationChange",this)}return a},applyPreventPanning:function(a){if(a){this.addWindowListener("touchmove",this.doPreventPanning,false)}else{this.removeWindowListener("touchmove",this.doPreventPanning,false)}return a},applyPreventZooming:function(a){var b=(Ext.feature.has.Touch)?"touchstart":"mousedown";if(a){this.addWindowListener(b,this.doPreventZooming,false)}else{this.removeWindowListener(b,this.doPreventZooming,false)}return a},doAutoMaximizeOnReady:function(){var a=arguments[arguments.length-1];a.pause();this.isMaximizing=true;this.on("maximize",function(){this.isMaximizing=false;this.updateSize();a.resume();this.fireEvent("ready",this)},this,{single:true});this.maximize()},doAutoMaximizeOnOrientationChange:function(){var a=arguments[arguments.length-1],b=a.firingArguments;a.pause();this.isMaximizing=true;this.on("maximize",function(){this.isMaximizing=false;this.updateSize();b[2]=this.windowWidth;b[3]=this.windowHeight;a.resume()},this,{single:true});this.maximize()},doBlurInput:function(b){var a=b.target,c=this.focusedElement;if(c&&c.nodeName.toUpperCase()!="BODY"&&!this.isInputRegex.test(a.tagName)){delete this.focusedElement;c.blur()}},doPreventPanning:function(a){a.preventDefault()},doPreventZooming:function(b){if("button" in b&&b.button!==0){return}var a=b.target;if(a&&a.nodeType===1&&!this.isInputRegex.test(a.tagName)){b.preventDefault()}},addWindowListener:function(b,c,a){window.addEventListener(b,c,Boolean(a))},removeWindowListener:function(b,c,a){window.removeEventListener(b,c,Boolean(a))},doAddListener:function(a,d,c,b){if(a==="ready"&&this.isReady&&!this.isMaximizing){d.call(c);return this}return this.callSuper(arguments)},supportsOrientation:function(){return Ext.feature.has.Orientation},onResize:function(){var c=this.windowWidth,f=this.windowHeight,e=this.getWindowWidth(),a=this.getWindowHeight(),d=this.getOrientation(),b=this.determineOrientation();if((c!==e&&f!==a)&&d!==b){this.fireOrientationChangeEvent(b,d)}},onOrientationChange:function(){var b=this.getOrientation(),a=this.determineOrientation();if(a!==b){this.fireOrientationChangeEvent(a,b)}},fireOrientationChangeEvent:function(b,c){var a=Ext.baseCSSPrefix;Ext.getBody().replaceCls(a+c,a+b);this.orientation=b;this.updateSize();this.fireEvent("orientationchange",this,b,this.windowWidth,this.windowHeight)},updateSize:function(b,a){this.windowWidth=b!==undefined?b:this.getWindowWidth();this.windowHeight=a!==undefined?a:this.getWindowHeight();return this},waitUntil:function(h,e,g,a,f){if(!a){a=50}if(!f){f=2000}var c=this,b=0;setTimeout(function d(){b+=a;if(h.call(c)===true){if(e){e.call(c)}}else{if(b>=f){if(g){g.call(c)}}else{setTimeout(d,a)}}},a)},maximize:function(){this.fireMaximizeEvent()},fireMaximizeEvent:function(){this.updateSize();this.fireEvent("maximize",this)},doSetHeight:function(a){Ext.getBody().setHeight(a);this.callParent(arguments)},doSetWidth:function(a){Ext.getBody().setWidth(a);this.callParent(arguments)},scrollToTop:function(){window.scrollTo(0,-1)},getWindowWidth:function(){return window.innerWidth},getWindowHeight:function(){return window.innerHeight},getWindowOuterHeight:function(){return window.outerHeight},getWindowOrientation:function(){return window.orientation},getOrientation:function(){return this.orientation},getSize:function(){return{width:this.windowWidth,height:this.windowHeight}},determineOrientation:function(){var b=this.PORTRAIT,a=this.LANDSCAPE;if(!Ext.os.is.Android&&this.supportsOrientation()){if(this.getWindowOrientation()%180===0){return b}return a}else{if(this.getWindowHeight()>=this.getWindowWidth()){return b}return a}},onItemFullscreenChange:function(a){a.addCls(this.fullscreenItemCls);this.add(a)}});Ext.define("Ext.viewport.Android",{extend:Ext.viewport.Default,constructor:function(){this.on("orientationchange","doFireOrientationChangeEvent",this,{prepend:true});this.on("orientationchange","hideKeyboardIfNeeded",this,{prepend:true});this.callParent(arguments);this.addWindowListener("resize",Ext.Function.bind(this.onResize,this))},getDummyInput:function(){var a=this.dummyInput,c=this.focusedElement,b=Ext.fly(c).getPageBox();if(!a){this.dummyInput=a=document.createElement("input");a.style.position="absolute";a.style.opacity="0";document.body.appendChild(a)}a.style.left=b.left+"px";a.style.top=b.top+"px";a.style.display="";return a},doBlurInput:function(c){var b=c.target,d=this.focusedElement,a;if(d&&!this.isInputRegex.test(b.tagName)){a=this.getDummyInput();delete this.focusedElement;a.focus();setTimeout(function(){a.style.display="none"},100)}},hideKeyboardIfNeeded:function(){var a=arguments[arguments.length-1],b=this.focusedElement;if(b){delete this.focusedElement;a.pause();if(Ext.os.version.lt("4")){b.style.display="none"}else{b.blur()}setTimeout(function(){b.style.display="";a.resume()},1000)}},doFireOrientationChangeEvent:function(){var a=arguments[arguments.length-1];this.orientationChanging=true;a.pause();this.waitUntil(function(){return this.getWindowOuterHeight()!==this.windowOuterHeight},function(){this.windowOuterHeight=this.getWindowOuterHeight();this.updateSize();a.firingArguments[2]=this.windowWidth;a.firingArguments[3]=this.windowHeight;a.resume();this.orientationChanging=false},function(){});return this},applyAutoMaximize:function(a){a=this.callParent(arguments);this.on("add","fixSize",this,{single:true});if(!a){this.on("ready","fixSize",this,{single:true});this.onAfter("orientationchange","doFixSize",this,{buffer:100})}else{this.un("ready","fixSize",this);this.unAfter("orientationchange","doFixSize",this)}},fixSize:function(){this.doFixSize()},doFixSize:function(){this.setHeight(this.getWindowHeight())},determineOrientation:function(){return(this.getWindowHeight()>=this.getWindowWidth())?this.PORTRAIT:this.LANDSCAPE},getActualWindowOuterHeight:function(){return Math.round(this.getWindowOuterHeight()/window.devicePixelRatio)},maximize:function(){var c=this.stretchHeights,b=this.orientation,a;a=c[b];if(!a){c[b]=a=this.getActualWindowOuterHeight()}if(!this.addressBarHeight){this.addressBarHeight=a-this.getWindowHeight()}this.setHeight(a);var d=Ext.Function.bind(this.isHeightMaximized,this,[a]);this.scrollToTop();this.waitUntil(d,this.fireMaximizeEvent,this.fireMaximizeEvent)},isHeightMaximized:function(a){this.scrollToTop();return this.getWindowHeight()===a}},function(){if(!Ext.os.is.Android){return}var a=Ext.os.version,b=Ext.browser.userAgent,c=/(htc|desire|incredible|ADR6300)/i.test(b)&&a.lt("2.3");if(c){this.override({constructor:function(d){if(!d){d={}}d.autoMaximize=false;this.watchDogTick=Ext.Function.bind(this.watchDogTick,this);setInterval(this.watchDogTick,1000);return this.callParent([d])},watchDogTick:function(){this.watchDogLastTick=Ext.Date.now()},doPreventPanning:function(){var e=Ext.Date.now(),f=this.watchDogLastTick,d=e-f;if(d>=2000){return}return this.callParent(arguments)},doPreventZooming:function(){var e=Ext.Date.now(),f=this.watchDogLastTick,d=e-f;if(d>=2000){return}return this.callParent(arguments)}})}if(a.match("2")){this.override({onReady:function(){this.addWindowListener("resize",Ext.Function.bind(this.onWindowResize,this));this.callParent(arguments)},scrollToTop:function(){document.body.scrollTop=100},onWindowResize:function(){var e=this.windowWidth,g=this.windowHeight,f=this.getWindowWidth(),d=this.getWindowHeight();if(this.getAutoMaximize()&&!this.isMaximizing&&!this.orientationChanging&&window.scrollY===0&&e===f&&d=g-this.addressBarHeight)||!this.focusedElement)){this.scrollToTop()}},fixSize:function(){var d=this.getOrientation(),f=window.outerHeight,g=window.outerWidth,e;if(d==="landscape"&&(f=g)){e=this.getActualWindowOuterHeight()}else{e=this.getWindowHeight()}this.waitUntil(function(){return e>this.getWindowHeight()},this.doFixSize,this.doFixSize,50,1000)}})}else{if(a.gtEq("3.1")){this.override({isHeightMaximized:function(d){this.scrollToTop();return this.getWindowHeight()===d-1}})}else{if(a.match("3")){this.override({isHeightMaximized:function(){this.scrollToTop();return true}})}}}if(a.gtEq("4")){this.override({doBlurInput:Ext.emptyFn,onResize:function(){this.callParent();this.doFixSize()}})}});Ext.define("Ext.viewport.Ios",{extend:Ext.viewport.Default,isFullscreen:function(){return this.isHomeScreen()},isHomeScreen:function(){return window.navigator.standalone===true},constructor:function(){this.callParent(arguments);if(this.getAutoMaximize()&&!this.isFullscreen()){this.addWindowListener("touchstart",Ext.Function.bind(this.onTouchStart,this))}},maximize:function(){if(this.isFullscreen()){return this.callParent()}var c=this.stretchHeights,b=this.orientation,d=this.getWindowHeight(),a=c[b];if(window.scrollY>0){this.scrollToTop();if(!a){c[b]=a=this.getWindowHeight()}this.setHeight(a);this.fireMaximizeEvent()}else{if(!a){a=this.getScreenHeight()}this.setHeight(a);this.waitUntil(function(){this.scrollToTop();return d!==this.getWindowHeight()},function(){if(!c[b]){a=c[b]=this.getWindowHeight();this.setHeight(a)}this.fireMaximizeEvent()},function(){a=c[b]=this.getWindowHeight();this.setHeight(a);this.fireMaximizeEvent()},50,1000)}},getScreenHeight:function(){return window.screen[this.orientation===this.PORTRAIT?"height":"width"]},onElementFocus:function(){if(this.getAutoMaximize()&&!this.isFullscreen()){clearTimeout(this.scrollToTopTimer)}this.callParent(arguments)},onElementBlur:function(){if(this.getAutoMaximize()&&!this.isFullscreen()){this.scrollToTopTimer=setTimeout(this.scrollToTop,500)}this.callParent(arguments)},onTouchStart:function(){if(this.focusedElement===null){this.scrollToTop()}},scrollToTop:function(){window.scrollTo(0,0)}},function(){if(!Ext.os.is.iOS){return}if(Ext.os.version.lt("3.2")){this.override({constructor:function(){var a=this.stretchHeights={};a[this.PORTRAIT]=416;a[this.LANDSCAPE]=268;return this.callOverridden(arguments)}})}if(Ext.os.version.lt("5")){this.override({fieldMaskClsTest:"-field-mask",doPreventZooming:function(b){var a=b.target;if(a&&a.nodeType===1&&!this.isInputRegex.test(a.tagName)&&a.className.indexOf(this.fieldMaskClsTest)==-1){b.preventDefault()}}})}if(Ext.os.is.iPad){this.override({isFullscreen:function(){return true}})}});Ext.define("Ext.viewport.WindowsPhone",{requires:[],alternateClassName:"Ext.viewport.WP",extend:Ext.viewport.Default,initialize:function(){var a=function(d){var c=d.srcElement.nodeName.toUpperCase(),b=["INPUT","TEXTAREA"];if(b.indexOf(c)==-1){return false}};document.body.attachEvent("onselectstart",a);this.callParent(arguments)}});Ext.define("Ext.viewport.Viewport",{constructor:function(b){var c=Ext.os.name,d,a;switch(c){case"Android":d=(Ext.browser.name=="ChromeMobile")?"Default":"Android";break;case"iOS":d="Ios";break;case"Windows":d=(Ext.browser.name=="IE")?"WindowsPhone":"Default";break;case"WindowsPhone":d="WindowsPhone";break;default:d="Default";break}a=Ext.create("Ext.viewport."+d,b);return a}});Ext.define("AccordionListExample.model.Task",{extend:Ext.data.Model,config:{fields:[{name:"text",type:"string"}]}});Ext.define("AccordionListExample.store.Task",{extend:Ext.data.TreeStore,config:{defaultRootProperty:"items",model:"AccordionListExample.model.Task",proxy:{type:"ajax",url:"resources/data/testData.json"}}});Ext.define("AccordionListExample.model.PL",{extend:Ext.data.Model,config:{fields:[{name:"text",type:"string"},{name:"sales",type:"number"},{name:"expenses",type:"number"},{name:"profits",type:"number"},{name:"year",type:"boolean"}]}});Ext.define("AccordionListExample.store.PL",{extend:Ext.data.TreeStore,config:{defaultRootProperty:"items",model:"AccordionListExample.model.PL",proxy:{type:"ajax",url:"resources/data/plData.json"}}});Ext.define("Ext.ux.AccordionList",{extend:Ext.Container,xtype:"accordionlist",alternateClassName:"Ext.AccordionList",config:{cls:Ext.baseCSSPrefix+"accordion-list",headerItemCls:Ext.baseCSSPrefix+"accordion-list-header",contentItemCls:Ext.baseCSSPrefix+"accordion-list-content",layout:{type:"fit"},store:null,displayField:"text",listScrollable:true,headerItemTpl:['',"{0}","","{1}",""].join(""),headerCloseTpl:'
{0}
',headerOpenTpl:'
{0}
',contentItemTpl:"{0}",defaultExpanded:false,useSelectedHighlights:true,list:null},initialize:function(){var a=this;a.doInitialize();a.callParent(arguments)},doInitialize:function(){var a=this;if(a.getDefaultExpanded()){a.doAllExpand()}},applyStore:function(a){return this.patchStore(a)},applyDisplayField:function(a){return"{"+a+"}"},updateStore:function(a,e){var b=this,c=b.getList(),d;if(!c){d=new Ext.XTemplate('',b.makeContentTemplate(),"",b.makeHeaderTemplate(),"",{isExpanded:function(f){return f.expanded}});c=Ext.create("Ext.dataview.List",{itemTpl:d,scrollToTopOnRefresh:false});if(b.getUseSelectedHighlights()===false){c.setSelectedCls("")}c.on("itemtap",b.onItemTap,b);c.on("refresh",b.onListRefresh,b);b.setList(c);c.setScrollable(b.getListScrollable());b.add(c)}c.setStore(a)},makeHeaderTemplate:function(){var d=this,a=d.getDisplayField(),c=Ext.String.format(d.getHeaderOpenTpl(),a),b=Ext.String.format(d.getHeaderCloseTpl(),a);return Ext.String.format(d.getHeaderItemTpl(),c,b)},makeContentTemplate:function(){var b=this,a=b.getDisplayField();return Ext.String.format(b.getContentItemTpl(),a)},updateListScrollable:function(a,c){var b=this.getList();if(b){b.setScrollable(a)}},load:function(){this.getStore().load()},removeAll:function(){this.getStore().removeAll()},getCount:function(){var a=this.getStore();return Ext.isEmpty(a)?0:a.getCount()},getAllCount:function(){var a=this.getStore();return Ext.isEmpty(a)?0:a.getAllCount()},doAllExpand:function(){var b=this;b.doAll(function a(c){c.expand();if(!c.isLeaf()){c.childNodes.forEach(a,b)}})},doAllCollapse:function(){var a=this;a.doAll(function b(c){c.collapse();if(!c.isLeaf()){c.childNodes.forEach(b,a)}})},doAll:function(d){var b=this,c=b.getList(),a=c.getStore();a.each(d,b)},onListRefresh:function(f){var j=this,h=f.listItems,g=h.length,e=j.getHeaderItemCls(),a=j.getContentItemCls(),c,k,d,b;for(c=0;c','
','
style="font-style:italic;">',"{text}
","",'
','
style="font-style:italic;">',"{text}
","
"].join(""),contentItemTpl:['
','
','
${sales}
','
${expenses}
','
${profits}
',"
"].join(""),useSelectedHighlights:false,flex:1,itemId:"PL",listeners:{initialize:function(){this.addCls("PL-view")}}}],control:{"button[action=expand]":{tap:function(){this.down("accordionlist").doAllExpand()}},"button[action=collapse]":{tap:function(){this.down("accordionlist").doAllCollapse()}}}}]}});Ext.define("AccordionListExample.controller.Task",{extend:Ext.app.Controller,config:{refs:{},control:{accordionlist:{leafitemtap:"onLeafItemTap"}}},onLeafItemTap:function(d,b,e,a){var c=a.get("text")||"";Ext.Msg.alert("You tapped leaf! : "+c)}});Ext.application({name:"AccordionListExample",models:["Task","PL"],views:["Main"],controllers:["Task"],icon:{"57":"resources/icons/Icon.png","72":"resources/icons/Icon~ipad.png","114":"resources/icons/Icon@2x.png","144":"resources/icons/Icon~ipad@2x.png"},isIconPrecomposed:true,startupImage:{"320x460":"resources/startup/320x460.jpg","640x920":"resources/startup/640x920.png","768x1004":"resources/startup/768x1004.png","748x1024":"resources/startup/748x1024.png","1536x2008":"resources/startup/1536x2008.png","1496x2048":"resources/startup/1496x2048.png"},launch:function(){Ext.fly("appLoadingIndicator").destroy();Ext.Viewport.add(Ext.create("AccordionListExample.view.Main"))},onUpdated:function(){Ext.Msg.confirm("Application Update","This application has just successfully been updated to the latest version. Reload now?",function(a){if(a==="yes"){window.location.reload()}})}}); \ No newline at end of file diff --git a/tests/browse-mobile.html b/tests/browse-mobile.html new file mode 100644 index 0000000..0b1d7e9 --- /dev/null +++ b/tests/browse-mobile.html @@ -0,0 +1,44 @@ + + + + + + + + + + + + +
+
+ Loading... +
+
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/tests/index.html b/tests/index.html new file mode 100644 index 0000000..9bcaff2 --- /dev/null +++ b/tests/index.html @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/index.js b/tests/index.js new file mode 100644 index 0000000..b93cbc8 --- /dev/null +++ b/tests/index.js @@ -0,0 +1,28 @@ +var Harness = Siesta.Harness.Browser.SenchaTouch; + +Harness.configure({ + title : 'Ext.ux.AccordionList Test', + + preload : [ + "http://cdn.sencha.com/touch/sencha-touch-2.3.1/resources/css/sencha-touch.css", + "http://cdn.sencha.com/touch/sencha-touch-2.3.1/sencha-touch-all-debug.js" + ], + + keepNLastResults : 2 +}); + +Harness.start( + { + group : 'Ext.ux.AccordionList tests', + hostPageUrl : '../examples/', + performSetup : true, + items : [ + 'spec/010_basic.t.js', + 'spec/020_decorate.t.js', + 'spec/030_nested.t.js', + 'spec/040_paging.t.js', + 'spec/050_components.t.js', + 'spec/060_grouped.t.js' + ] + } +); diff --git a/tests/siesta/resources/css/fonts/icomoon.dev.svg b/tests/siesta/resources/css/fonts/icomoon.dev.svg new file mode 100644 index 0000000..3bfa88d --- /dev/null +++ b/tests/siesta/resources/css/fonts/icomoon.dev.svg @@ -0,0 +1,74 @@ + + + + +This is a custom SVG font generated by IcoMoon. + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/siesta/resources/css/fonts/icomoon.eot b/tests/siesta/resources/css/fonts/icomoon.eot new file mode 100644 index 0000000..88166ff Binary files /dev/null and b/tests/siesta/resources/css/fonts/icomoon.eot differ diff --git a/tests/siesta/resources/css/fonts/icomoon.svg b/tests/siesta/resources/css/fonts/icomoon.svg new file mode 100644 index 0000000..f2120b8 --- /dev/null +++ b/tests/siesta/resources/css/fonts/icomoon.svg @@ -0,0 +1,74 @@ + + + + +This is a custom SVG font generated by IcoMoon. + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/siesta/resources/css/fonts/icomoon.ttf b/tests/siesta/resources/css/fonts/icomoon.ttf new file mode 100644 index 0000000..1bd58ed Binary files /dev/null and b/tests/siesta/resources/css/fonts/icomoon.ttf differ diff --git a/tests/siesta/resources/css/fonts/icomoon.woff b/tests/siesta/resources/css/fonts/icomoon.woff new file mode 100644 index 0000000..f5c2b25 Binary files /dev/null and b/tests/siesta/resources/css/fonts/icomoon.woff differ diff --git a/tests/siesta/resources/css/fonts/icomoon49753/Read Me.txt b/tests/siesta/resources/css/fonts/icomoon49753/Read Me.txt new file mode 100644 index 0000000..9d2b9e5 --- /dev/null +++ b/tests/siesta/resources/css/fonts/icomoon49753/Read Me.txt @@ -0,0 +1,3 @@ +To modify your generated font, use the *dev.svg* file, located in the *fonts* folder in this package. You can import this dev.svg file to the IcoMoon app. All the tags (class names) and the Unicode points of your glyphs are saved in this file. + +See the documentation for more info on how to use this package: http://icomoon.io/#docs/font-face \ No newline at end of file diff --git a/tests/siesta/resources/css/fonts/icomoon49753/index.html b/tests/siesta/resources/css/fonts/icomoon49753/index.html new file mode 100644 index 0000000..1f3b7fd --- /dev/null +++ b/tests/siesta/resources/css/fonts/icomoon49753/index.html @@ -0,0 +1,263 @@ + + + +Your Font/Glyphs + + + + + +
+
+
+

Your font contains the following glyphs

+

The generated SVG font can be imported back to IcoMoon for modification.

+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
+

Class Names

+
+ + +  icon-file + + + +  icon-screen + + + +  icon-bug + + + +  icon-search + + + +  icon-play + + + +  icon-loop + + + +  icon-folder + + + +  icon-folder-open + + + +  icon-close + + + +  icon-file-2 + + + +  icon-checkmark + + + +  icon-busy + + + +  icon-lightning + + + +  icon-flag + + + +  icon-forward + + + +  icon-cog + + + +  icon-bars + + + +  icon-bars-2 + + + +  icon-book + +
+ +
+ + + \ No newline at end of file diff --git a/tests/siesta/resources/css/fonts/icomoon49753/license.txt b/tests/siesta/resources/css/fonts/icomoon49753/license.txt new file mode 100644 index 0000000..8527799 --- /dev/null +++ b/tests/siesta/resources/css/fonts/icomoon49753/license.txt @@ -0,0 +1,2 @@ +Icon Set: IcoMoon - Free -- http://keyamoon.com/icomoon/ +License: CC BY 3.0 -- http://creativecommons.org/licenses/by/3.0/ \ No newline at end of file diff --git a/tests/siesta/resources/css/fonts/icomoon49753/lte-ie7.js b/tests/siesta/resources/css/fonts/icomoon49753/lte-ie7.js new file mode 100644 index 0000000..fda0af1 --- /dev/null +++ b/tests/siesta/resources/css/fonts/icomoon49753/lte-ie7.js @@ -0,0 +1,46 @@ +/* Load this script using conditional IE comments if you need to support IE 7 and IE 6. */ + +window.onload = function() { + function addIcon(el, entity) { + var html = el.innerHTML; + el.innerHTML = '' + entity + '' + html; + } + var icons = { + 'icon-file' : '', + 'icon-screen' : '', + 'icon-bug' : '', + 'icon-search' : '', + 'icon-play' : '', + 'icon-loop' : '', + 'icon-folder' : '', + 'icon-folder-open' : '', + 'icon-close' : '', + 'icon-file-2' : '', + 'icon-checkmark' : '', + 'icon-busy' : '', + 'icon-lightning' : '', + 'icon-flag' : '', + 'icon-forward' : '', + 'icon-cog' : '', + 'icon-bars' : '', + 'icon-bars-2' : '', + 'icon-book' : '' + }, + els = document.getElementsByTagName('*'), + i, attr, html, c, el; + for (i = 0; ; i += 1) { + el = els[i]; + if(!el) { + break; + } + attr = el.getAttribute('data-icon'); + if (attr) { + addIcon(el, attr); + } + c = el.className; + c = c.match(/icon-[^\s'"]+/); + if (c && icons[c[0]]) { + addIcon(el, icons[c[0]]); + } + } +}; \ No newline at end of file diff --git a/tests/siesta/resources/css/fonts/icomoon49753/style.css b/tests/siesta/resources/css/fonts/icomoon49753/style.css new file mode 100644 index 0000000..3c068b6 --- /dev/null +++ b/tests/siesta/resources/css/fonts/icomoon49753/style.css @@ -0,0 +1,104 @@ +/* + +Siesta 2.0.4 +Copyright(c) 2009-2013 Bryntum AB +http://bryntum.com/contact +http://bryntum.com/products/siesta/license + +*/ +@font-face { + font-family: 'icomoon'; + src:url('fonts/icomoon.eot'); + src:url('fonts/icomoon.eot?#iefix') format('embedded-opentype'), + url('fonts/icomoon.woff') format('woff'), + url('fonts/icomoon.ttf') format('truetype'), + url('fonts/icomoon.svg#icomoon') format('svg'); + font-weight: normal; + font-style: normal; +} + +/* Use the following CSS code if you want to use data attributes for inserting your icons */ +[data-icon]:before { + font-family: 'icomoon'; + content: attr(data-icon); + speak: none; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + -webkit-font-smoothing: antialiased; +} + +/* Use the following CSS code if you want to have a class per icon */ +/* +Instead of a list of all class selectors, +you can use the generic selector below, but it's slower: +[class*="icon-"] { +*/ +.icon-file, .icon-screen, .icon-bug, .icon-search, .icon-play, .icon-loop, .icon-folder, .icon-folder-open, .icon-close, .icon-file-2, .icon-checkmark, .icon-busy, .icon-lightning, .icon-flag, .icon-forward, .icon-cog, .icon-bars, .icon-bars-2, .icon-book { + font-family: 'icomoon'; + speak: none; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + -webkit-font-smoothing: antialiased; +} +.icon-file:before { + content: "\e000"; +} +.icon-screen:before { + content: "\e001"; +} +.icon-bug:before { + content: "\e002"; +} +.icon-search:before { + content: "\e003"; +} +.icon-play:before { + content: "\e004"; +} +.icon-loop:before { + content: "\e005"; +} +.icon-folder:before { + content: "\e006"; +} +.icon-folder-open:before { + content: "\e007"; +} +.icon-close:before { + content: "\e008"; +} +.icon-file-2:before { + content: "\e009"; +} +.icon-checkmark:before { + content: "\e00a"; +} +.icon-busy:before { + content: "\e00b"; +} +.icon-lightning:before { + content: "\e00c"; +} +.icon-flag:before { + content: "\e00d"; +} +.icon-forward:before { + content: "\e00e"; +} +.icon-cog:before { + content: "\e00f"; +} +.icon-bars:before { + content: "\e010"; +} +.icon-bars-2:before { + content: "\e011"; +} +.icon-book:before { + content: "\e012"; +} diff --git a/tests/siesta/resources/css/fonts/sourcesanspro/v5/ODelI1aHBYDBqgeIAH2zlNHq-FFgoDNV3GTKpHwuvtI.woff b/tests/siesta/resources/css/fonts/sourcesanspro/v5/ODelI1aHBYDBqgeIAH2zlNHq-FFgoDNV3GTKpHwuvtI.woff new file mode 100644 index 0000000..98860ea Binary files /dev/null and b/tests/siesta/resources/css/fonts/sourcesanspro/v5/ODelI1aHBYDBqgeIAH2zlNHq-FFgoDNV3GTKpHwuvtI.woff differ diff --git a/tests/siesta/resources/css/fonts/sourcesanspro/v5/toadOcfmlt9b38dHJxOBGMVNtom4QlEDNJaqqqzqdSs.woff b/tests/siesta/resources/css/fonts/sourcesanspro/v5/toadOcfmlt9b38dHJxOBGMVNtom4QlEDNJaqqqzqdSs.woff new file mode 100644 index 0000000..90cf9e2 Binary files /dev/null and b/tests/siesta/resources/css/fonts/sourcesanspro/v5/toadOcfmlt9b38dHJxOBGMVNtom4QlEDNJaqqqzqdSs.woff differ diff --git a/tests/siesta/resources/css/siesta-all.css b/tests/siesta/resources/css/siesta-all.css new file mode 100644 index 0000000..b28f1c8 --- /dev/null +++ b/tests/siesta/resources/css/siesta-all.css @@ -0,0 +1,1858 @@ +/* + +Siesta 2.0.4 +Copyright(c) 2009-2013 Bryntum AB +http://bryntum.com/contact +http://bryntum.com/products/siesta/license + +*/ +@font-face { + font-family : 'Source Sans Pro'; + font-style : normal; + font-weight : 300; + src : local('Source Sans Pro Light'), local('SourceSansPro-Light'), url(fonts/sourcesanspro/v5/toadOcfmlt9b38dHJxOBGMVNtom4QlEDNJaqqqzqdSs.woff) format('woff'); +} + +@font-face { + font-family : 'Source Sans Pro'; + font-style : normal; + font-weight : 400; + src : local('Source Sans Pro'), local('SourceSansPro-Regular'), url(fonts/sourcesanspro/v5/ODelI1aHBYDBqgeIAH2zlNHq-FFgoDNV3GTKpHwuvtI.woff) format('woff'); +} + +/* Nice UI for nice browsers. For other browsers... well - not so nice. */ +body.x-webkit, +body.x-gecko, +body.x-gecko .x-panel-header-text-container-default, +body.x-webkit .x-panel-header-text-container-default, +body.x-webkit .x-grid-cell-inner, +body.x-gecko .x-grid-cell-inner, +body.x-webkit .x-tree-node-text, +body.x-gecko .x-tree-node-text, +body.x-webkit .x-btn-inner, +body.x-gecko .x-btn-inner, +body.x-webkit .x-column-header, +body.x-gecko .x-column-header, +body.x-webkit .x-menu-item-text, +body.x-gecko .x-menu-item-text, +body.x-gecko .x-toolbar .x-toolbar-item, +body.x-webkit .x-toolbar .x-toolbar-item, +body.x-webkit input, +body.x-gecko input +{ + font-size:13px; + font-family: 'Source Sans Pro', sans-serif !important; + font: 400 normal 'Source Sans Pro', sans-serif !important; +} + +.light-button { + background-image : -moz-linear-gradient(top, #fff, #e0e0e0); + background-image : -webkit-gradient(linear, 0 0, 0 100%, from(#fff), to(#e0e0e0)); + background-image : -webkit-linear-gradient(top, #fff, #e0e0e0); + background-image : -o-linear-gradient(top, #fff, #e0e0e0); + background-image : linear-gradient(to bottom, fff, #e0e0e0); + border-color : #FFF; +} + +.x-nlg .light-button, +.x-nlg .green-button +{ + background-image: none !important; +} + +.light-button:hover { + background-image : -moz-linear-gradient(top, #f5f5f5, #d7d7d7); + background-image : -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#d7d7d7)); + background-image : -webkit-linear-gradient(top, #f5f5f5, #d7d7d7); + background-image : -o-linear-gradient(top, #f5f5f5, #d7d7d7); + background-image : linear-gradient(to bottom, f5f5f5, #d7d7d7); +} + +.light-button.x-btn-pressed { + background-image : -moz-linear-gradient(top, #e8e8e8, #c6c6c6); + background-image : -webkit-gradient(linear, 0 0, 0 100%, from(#e8e8e8), to(#c6c6c6)); + background-image : -webkit-linear-gradient(top, #e8e8e8, #c6c6c6); + background-image : -o-linear-gradient(top, #e8e8e8, #c6c6c6); + background-image : linear-gradient(to bottom, e8e8e8, #c6c6c6); +} + + +.green-button +{ + background: #59d152; + background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #59d152), color-stop(100%, #74a23a)); + background-image: -webkit-linear-gradient(#59d152, #74a23a); + background-image: -moz-linear-gradient(#59d152, #74a23a); + background-image: -o-linear-gradient(#59d152, #74a23a); + background-image: linear-gradient(#59d152, #74a23a); + border: 1px solid #607822; + border-radius:2px; + box-shadow: 0 3px 1px -2px #94f648 inset; +} + +.green-button .x-btn-inner +{ + text-shadow: 0 1px 0 #607822; + color: #fff; +} + +.green-button:hover +{ + background: #77982c; + background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #59b152), color-stop(100%, #74a23a)); + background-image: -webkit-linear-gradient(#59b152, #74a23a); + background-image: -moz-linear-gradient(#59b152, #74a23a); + background-image: -o-linear-gradient(#59b152, #74a23a); + background-image: linear-gradient(#59b152, #74a23a); +} + +.x-panel, +.x-tree-panel { + border-color : #999 !important; +} + +.x-tree-panel .x-grid-header-ct { + border : 0 none; + background : #eaeaea; +} + +.x-tree-panel .x-grid-body { + border : 0 none; + border-top : 1px solid #bbb; + border-bottom : 1px solid #bbb; +} + +.x-tree-panel .x-column-header-over .x-column-header-trigger, +.x-tree-panel b.x-column-header-open .x-column-header-trigger { + background-color : transparent; +} + +.x-tree-panel .x-grid-row-selected .x-grid-cell-inner, +.x-grid-cell-selected .x-grid-cell-inner { + color : #000 !important; +} + +.x-tree-panel .x-grid-row-selected .x-grid-cell, +.x-grid-cell-selected{ + background-color : #ffd0a9 !important; +} + +.x-tree-panel .x-column-header, +.x-tree-panel .x-column-header-over { + border : 0 none; + background : #eaeaea; + background-image : none; + color : #444; +} + +.x-tree-panel .x-tree-cell { + height : 22px; + line-height : 19px; + cursor : pointer; +} + +.x-tree-panel .x-grid-cell-inner { + color : #444; + margin : 3px 0; + white-space : nowrap; +} + + +.filterfield .x-form-text { + padding-left : 5px; +} + +.filterfield .x-form-text, +.filterfield .x-form-trigger { + height : 26px !important; +} + +.filterfield .x-form-trigger { + background : #e2e2e2 !important; + line-height : 25px; + text-align : center; + border-top : 1px solid #aaa; + border-right : 1px solid #aaa; + color : rgb(7, 89, 133); + text-shadow : 1px 0px 1px #f5f5f5; + width : 23px !important; +} + +.filterfield .x-form-trigger:hover { + background : #d9d9d9 !important; + color : #222; +} + +.filterfield .x-trigger-cell { + width : 23px !important; +} +/* + +Play icons from: +Author : Sekkyumu +HomePage : http://sekkyumu.deviantart.com/ +License : Creative Commons Attribution 3.0 License + +*/ + +body, +.x-border-layout-ct { + background-color : rgb(105, 191, 210) !important; +} + +body > .x-splitter { + background : transparent; +} + +.x-toolbar, .x-panel-header { + background-color : #eaeaea; + background-image : -moz-linear-gradient(top, #f8f8f8, #eaeaea); + background-image : -webkit-gradient(linear, 0 0, 0 100%, from(#f8f8f8), to(#eaeaea)); + background-image : -webkit-linear-gradient(top, #f8f8f8, #eaeaea); + background-image : -o-linear-gradient(top, #f8f8f8, #eaeaea); + background-image : linear-gradient(to bottom, #f8f8f8, #eaeaea); +} + +.x-nlg .x-toolbar, .x-panel-header { + background-image : none !important; +} + +.x-column-header, .x-column-header-over { + background : #eaeaea; +} + +a.logo-link { + position : absolute; + top : 5px; + left : 8px; + z-index : 2; +} + +a.logo-link img { + height : 47px; + width : 96px; + background : transparent url(../images/logo_small2.png) no-repeat 0 0; + background-size : contain; +} + +.x-ie a.logo-link img { + background : transparent url(../images/logo_small3.png) no-repeat 0 0; +} + +.tr-version-indicator { + position : absolute; + color : #eee; + font-size : 10px; + right : 0 !important; + bottom : -1px !important; + font-size : 9px; +} + +.x-ie9p .tr-version-indicator { + bottom : -2px !important; +} + +.meta-info { + float : right; + color : #fff; + text-decoration : none; + margin-right : 4px; + margin-top : 4px; + position : relative; + z-index : 5; + font-size : 11px; +} + +#update-ct { + position : absolute; + top : 30px; + right : 5px; + z-index : 5; +} + +/*======================================================================================================================================================================================================================= + Test suite status +*/ + +.tr-status-allgreen { + background-image : url(../images/checkmark32.png) !important; +} + +.tr-status-bugs { + background-image : url(../images/bug32.png) !important; +} + +.tr-status-running { + background-image : url(../images/lightning32.png) !important; +} + +.tr-status-allgreen-small { + background-image : url(../images/ok.png) !important; +} + +.tr-status-bugs-small { + background-image : url(../images/bug.png) !important; +} + +.tr-status-running-small { + background-image : url(../images/lightning.png) !important; +} + +.tr-status-neutral-small { + background-image : url(../images/to_do_list_small.png) !important; +} + +/*======================================================================================================================================================================================================================= + Vertically aligned content +*/ + +.tr-vertical-align-helper-content { + display : -moz-inline-box; + display : inline-block; + vertical-align : middle; + zoom : 1; +} + +.tr-vertical-align-helper { + display : -moz-inline-box; + display : inline-block; + vertical-align : middle; + height : 100%; + width : 0px; + zoom : 1; +} + +.tr-rounded-box { + background : #FFFFFF; + color : black; + font-size : larger; + border : 3px solid #d5e7f0; + padding : 30px; + -moz-border-radius : 24px; + -webkit-border-radius : 24px; + border-radius : 24px; +} + +.tr-main-area-centered { + text-align : center; +} + +/* Ext 4.0.7+ defines this as white*/ +.x-grid-row .x-grid-cell { + background-color : transparent; +} + +.tr-progress-indicator { + display : inline-block; + height : 6px; + width : 30px; + background : transparent url(../images/loading2.gif) no-repeat right center; + margin-left : 10px; + position : absolute; + bottom : 2px; + transition : opacity 0.5s; + opacity : 0; +} + +.testsuite-running .tr-progress-indicator { + opacity : 1; +} + +.right-top-area { + position : absolute; + top : 3px; + right : 3px; + padding : 0; + margin : 0; + list-style : none; + z-index : 5; +} + +.right-top-area li { + text-align : right; + height : 14px; +} + +.right-top-area li a { + color : #fff; + font-size : 10px; + text-decoration : none; +} + +.right-top-area li a:hover { + text-decoration : underline; +} + +#bryntum-logo { + background : transparent url(../images/logo.png) no-repeat right top; + background-size : contain; + width : 81px; + height : 19px; + opacity : 0.6; + transition : opacity 0.7s; +} + +#bryntum-logo:hover { + opacity : 1; +} + +.x-linux .x-btn-icon-el { + margin-top : 2px; +} + +.center-ct +{ + padding-top : 57px; +} +.ghost-cursor { + position : absolute; + width : 19px; + height : 22px; + left : 0px; + top : 0px; + z-index : 1000001; + background : url(../images/cursor-hand.png) no-repeat left center; +} + +.ghost-cursor-press { + background : url(../images/cursor-hand-press.png) no-repeat left center; +} + +.ghost-cursor-message { + background : none repeat scroll 0 0 #FFFFFF; + border : 1px solid #CCCCCC; + color : #666666; + padding : 2px 4px; + position : absolute; + z-index : 101; + border-radius : 5px; + box-shadow : 1px 1px 1px rgba(200, 200, 200, 0.1); + -webkit-transition-property : opacity, top; + -webkit-transition-duration : 2s; + -moz-transition-property : opacity, top; + -moz-transition-duration : 2s; + transition-property : opacity, top; + transition-duration : 2s; + opacity : 1; +} + +.ghost-cursor-click-indicator { + position : absolute; + border-radius : 100%; + margin-left : -3px; + margin-top : -3px; + -webkit-transition-property : opacity, width, height, margin-left, margin-top, visibility; + -webkit-transition-duration : 2.5s; + -moz-transition-property : opacity, width, height, margin-left, margin-top, visibility; + -moz-transition-duration : 2.5s; + transition-property : opacity, width, height, margin-left, margin-top, visibility; + transition-duration : 2.5s; + border : 2px solid darkred; + opacity : 0.7; + width : 7px; + height : 7px; + z-index : 101; +} + +.ghost-cursor-click-indicator-big { + margin-left : -21px; + margin-top : -21px; + height : 50px; + width : 50px; + opacity : 0; + visibility : hidden; +} + +.x-ie .ghost-cursor { + z-index : -1; + display : none; +} +.cmp-inspector-box { + position : absolute; + pointer-events : none; + z-index : 100001; + border : 2px solid red; + transition-property : left, top, width, height; + transition-duration : 0.3s; +} + +.cmp-inspector-label { + display : inline-block; + margin-top : -10px; + font-size : 10px; + padding : 2px; + pointer-events : auto; + background : rgb(32, 169, 220); + color : #fff; + text-decoration: none; +} + +.cmp-inspector-label:hover { + text-decoration: underline; +}/*======================================================================================================================================================================================================================= + Panel with test iframe +*/ + +.tr-container { + visibility : visible !important; +} + +.x-ie9 .tr-container { + z-index : 1; +} + +.tr-container .x-panel-collapsed { + display : block !important; + visibility : hidden !important; + z-index : -1 !important; +} + +td.tr-td-vertical-align { + vertical-align : middle; +} + +.tr-iframe-wrapper { + position : absolute; + left : -10000px; + top : -10000px; + overflow : auto; + z-index : 6; /* Without this, the dom container Ext panel will be on top of the iframe (in IE10)*/ +} + +.tr-iframe-forced { + z-index : 100000 !important; + border : 5px solid; + border-color : #d5e7f0; + -moz-border-radius : 14px; + -webkit-border-radius : 14px; + border-radius : 14px; + background-color : white; +} + +.tr-iframe-hidden { + left : -10000px !important; + top : -10000px !important; +} + +.siesta-domcontainer { + background : #fff url(../images/domcontainer-bg.png) repeat; + box-shadow : inset 3px 3px 4px #dfdfdf; +} + +.siesta-domcontainer .x-panel-body { + background : transparent; + border : 0 none; +} + +.domcontainer-console { + z-index : 5; +} + +.domcontainer-console input { + color : #666; + height : 24px; + width : 100%; + padding : 2px 2px 2px 20px; + background : #fff url(../images/prompt.png) no-repeat 4px center; + font : 14px "Consolas"; + background-size : 12px; + line-height : 19px; + border : 1px solid #ccc; + box-shadow : 0 1px 3px 0 rgba(150, 150, 150, 0.2) inset, 0 1px 0 rgba(255, 255, 255, 0.2); +} + +.sch-tree-filtered .x-tree-expander { + visibility : hidden; +} + +.tr-filter-trigger-leaf { + background-image : url("../images/trigger-leafs.gif"); +} + +.tr-filter-trigger-group { + background-image : url("../images/trigger-groups.gif"); +} +/* GENERAL GRID STYLES */ +.tr-testgrid { + margin-top : 57px; + border-top : 1px solid #999; + border-right : 1px solid #999; + background-color : #eaeaea; +} + +.tr-testgrid .x-grid-header-ct { + border : 0 none; + background : #eaeaea !important; +} + +.tr-testgrid .x-grid-body { + border : 0 none; + border-top : 1px solid #bbb; + border-bottom : 1px solid #bbb; +} + +.test-name-column .x-grid-cell-inner { + position : relative; +} +.tr-testgrid .x-tree-view, +.test-name-column .x-grid-cell-inner { + user-select : none; + -o-user-select : none; + -ms-user-select : none; + -moz-user-select : -moz-none; + -webkit-user-select : none; +} + +.test-name-column span.x-tree-node-text { + /*-moz-user-select : text;*/ + /*-webkit-user-select : text;*/ + /*-ms-user-select : text;*/ + /*user-select : text;*/ + /*-o-user-select : text;*/ +} + +/* TOP TOOLBAR STYLES */ +.tr-testgrid .main-tbar { + padding : 9px 5px 11px 8px; +} + +.tr-testgrid .x-tree-icon { + display : none; +} + +.tr-testgrid .x-tree-view +{ + +} + +.x-ie9 .tr-testgrid .x-tree-view { + z-index : 1; +} + +.sch-tree-filtered .x-tree-expander { + visibility : hidden; +} + +.toggle-expand { + border : 0 none; + opacity : 0.6; + background : url(../images/expand.png) no-repeat left center !important; +} + +.toggle-expand:hover { + opacity : 0.9; +} + +/* BOTTOM TOOLBAR STYLES */ +.tr-testgrid .main-bbar { + padding : 6px 0 4px 5px; +} + +.x-ie .tr-testgrid .main-bbar { +} + +.main-bbar .x-btn { + margin-left : 4px; + border : 0 none; + background : transparent none; + opacity : 0.8; +} + +.main-bbar .x-btn:hover { + text-shadow : 1px 0px 1px #222; + opacity : 1; +} + +.x-ie .tr-icon-options .x-btn-arrow-right { + height : 22px !important; +} + +.main-bbar .x-btn-icon-el { + font-size : 2em; +} + +.tr-icon-run-checked { + background : url(../images/checked.gif) no-repeat right bottom !important; + background-size : 12px 12px !important; +} + +.tr-icon-run-all, +.tr-icon-run-checked { + color : rgb(89, 205, 82); + text-shadow : 1px 0 1px green; +} + +.tr-icon-run-failed { + color : #ff1111; + text-shadow : 1px 0 1px darkred; +} + +.main-bbar .icon-book, +.main-bbar .icon-cog { + font-size : 1.5em; + line-height : 1.4em; + color : rgb(7, 89, 133); + text-shadow : 1px 0px 1px #f5f5f5; +} + +.x-disabled .icon-book { + opacity : 0.5; +} + +.tr-icon-run-all { +} + +/* SUMMARY BAR */ +.summary-bar { + background-color : #ddd; + background-image : -moz-linear-gradient(top, #e9e9e9, #ddd); + background-image : -webkit-gradient(linear, 0 0, 0 100%, from(#e9e9e9), to(#ddd)); + background-image : -webkit-linear-gradient(top, #e9e9e9, #ddd); + background-image : -o-linear-gradient(top, #e9e9e9, #ddd); + background-image : linear-gradient(to bottom, #e9e9e9, #ddd); + padding : 4px 13px 8px 0; + text-align : right; + border-left : 1px solid #bbb !important; + color : #444; +} + +.summary-bar .icon-checkmark, +.summary-bar .icon-bug { + color : #444 !important; + text-shadow : none; + margin-left : 6px; + margin-top : -1px; + font-size : 0.7em !important; +} + +.summary-bar .icon-close { + font-size : 0.6em; +} +.resultPanel-panel { + margin-top : -25px; + border : 0 none; +} + +.resultPanel-panel .x-panel-body { + border : 0 none; +} + +.siesta-assertion-grid { + border-top-left-radius : 3px; + border-top-right-radius : 3px; + border : 1px solid #999; + border-bottom : 0 none; +} + +.siesta-assertion-grid .light-button .x-btn-button{ + overflow:visible; +} + +.resultPanel-panel .resultpanel-toolbar { + border-top-left-radius : 3px; + background-image : none !important; +} + +.resultpanel-toolbar .light-button { + border : 0 none; + background : none; + color : rgb(7, 89, 133); +} + +.resultpanel-toolbar .light-button:hover { + color : #222; +} + +.resultpanel-toolbar .light-button.x-pressed { + color : blue; +} + +.resultpanel-toolbar .icon-play { + color : #fff; + font-size : 1.3em; + line-height : 22px; + padding-left : 2px; +} + +.resultPanel-panel > .x-panel-header { + background : transparent none; + border : 0 none; + box-shadow : none; + border-bottom : 1px solid #bababa; +} + +.resultPanel-panel > .x-panel-header .x-header-text { + font-size : 1.4em; + text-shadow : 0 1px rgba(55, 55, 55, 0.5); + color : #fff; +} + +.view-source { + background : url(../images/text_align_left.png) no-repeat left center; +} + +.test-source-ct .syntaxhighlighter { + overflow : hidden !important; +} + +/* fixes row height sync in Chrome */ +.syntaxhighlighter .line { + height : 1.2em !important; + vertical-align : middle !important; +} + +.test-source-ct { + background : #fff; +} + +.siesta-domcontainer { + border-radius : 3px; + border : 1px solid #999; +} +/*======================================================================================================================================================================================================================= + Common and unsorted +*/ + +.assertiongrid-initializing { + color : #777; + margin : 5px; + font-size : 10px; + text-align : left; +} + +.siesta-assertion-grid .x-grid-cell-inner { + line-height : 23px !important; + padding-bottom : 4px !important; +} + +.siesta-assertion-grid .x-grid-cell-inner { + margin : 0; + padding : 3px 0; +} + +.siesta-assertion-grid .x-grid-cell { + border-width : 0; +} + +/*======================================================================================================================================================================================================================= + Summary row +*/ + +.tr-summary-row .x-tree-icon, +.tr-summary-row .x-tree-elbow-empty, +.tr-summary-row .x-tree-elbow-end { + display : none !important; +} + +.tr-summary-row .x-grid-cell { + padding-left : 10px; +} + +.tr-summary-row .x-grid-cell-inner { + border-top : 10px solid #59d152; + line-height : 17px; + margin : 15px 17px 6px 7px; + padding : 5px 0 0 3px; +} + +.tr-summary-failure .x-grid-cell-inner { + border-top : 10px solid #ff1111; +} + +.tr-summary-failure span { + font-weight : bold; +} + +/*======================================================================================================================================================================================================================= + Diagnostic row +*/ + +.tr-diagnostic-row { + background-color : #f7f7f7 !important; + border-top : 1px solid; + text-transform : uppercase; +} + +.tr-diagnostic-row .x-tree-icon { + display : none !important; +} + +.tr-diagnostic-row span.assertion-text { + font-weight : bold; +} + +.tr-warning-row span.assertion-text { + color : #ff1111; +} + +.tr-diagnostic-row td { + border-top : 1px solid #e6e6e6 !important; + border-bottom : 1px solid #e6e6e6 !important; + background-image : none !important; +} + +/*======================================================================================================================================================================================================================= + Annotation +*/ + +.tr-assert-row-annontation { + font-family : "Courier New", monospace, serif; + font-size : 1em; + padding-top : 10px; + line-height : 13px; +} + +/*======================================================================================================================================================================================================================= + Assertion row +*/ + +.si-hide-passes .tr-assertion-row-passed { + display : none; +} + +.tr-waiting-row .x-tree-icon { + background-image : url(../images/spinner.gif); +} + +.tr-assertion-row-passed .x-tree-icon, +.tr-subtest-row-green .x-tree-icon { + background-image : url(../images/ok.png); +} + +.tr-assertion-row-failed .x-tree-icon, +.tr-subtest-row-red .x-tree-icon { + background-image : url(../images/bug.png); +} + +.tr-assertion-row-failed { + background-color : #ff8186; +} + +.tr-todo-row-passed .x-tree-icon { + background-image : url(../images/ok-todo.png); +} + +.tr-todo-row-failed .x-tree-icon { + background-image : url(../images/bug-todo.png); +} + +.tr-waiting-row .assertion-text { + color : #666; +} + +.tr-waiting-row-passed .x-tree-icon { + background-image : url(../images/clock_check.png); +} + +.tr-waiting-row-passed .assertion-text { + color : #666; +} + +.tr-subtest-row-working .x-tree-icon { + background-image : url(../images/spinner.gif); +} + +/*======================================================================================================================================================================================================================= + Exception row +*/ + +.tr-exception-row .x-tree-icon { + background-image : url(../images/flag-red.png) !important; +} + +.tr-exception-row { + background-color : #FD3F3F; +} + +.tr-exception-row .x-grid-cell { + font-weight : bolder; +} + +.tr-exception-todo-row .x-tree-icon { + background-image : url(../images/flag-green.png) !important; +} + +/*======================================================================================================================================================================================================================= + Sub test row (including describe/it) +*/ + +.tr-subtest-row-describe .x-grid-cell-inner { + font-weight : bolder; +} + +.tr-subtest-row-describe { + background-color : rgb(154, 228, 252); +} + +.siesta-assertion-grid .x-grid-cell-inner img { + vertical-align : middle; +} + +.siesta-assertion-grid .x-tree-icon { + margin-top : -2px; + margin-right : 5px; +} + +.tr-tree-column .x-grid-cell-inner { + position : relative; +} + +.x-tree-elbow-line { + visibility : hidden; +} + +.tr-elbow-line { + visibility : visible; + position : absolute !important; + display : block !important; + height : 100% !important; + top : 0px; +} + +.test-name-column .x-tree-expander { + margin-top : 6px; + margin-right : 7px; + margin-left : 1px; + height : 0; + width : 0; + background : none !important; + border-style : solid; + border-width : 5px 0 5px 8px; + border-color : transparent transparent transparent #868686; +} + +.x-grid-tree-node-expanded .test-name-column .x-tree-expander { + margin-top : 9px; + margin-right : 7px; + margin-left : -1px; + border-width : 8px 5px 0 5px; + border-style : solid; + border-color : #868686 transparent transparent transparent; +} + +.x-ie9m .test-name-column .x-tree-expander { + position:relative; + top:-4px; +} + + +/* ICONS AND TEXT */ +.test-name-column span.x-tree-node-text { + font-size : 14px; + padding-left : 24px; + position : relative; +} + +/* TEST STATUS ICONS */ + +.test-icon { + font-size : 1.2em; + position : absolute; + left : 2px; + top : 0; +} + +body.x-linux .test-icon { + margin-top : 2px; +} + + +.x-ie .test-icon, +.x-ie10 .test-icon { + top : 3px; +} + +.icon-checkmark { + background-position : 3px center; + background-repeat : no-repeat; + color : rgb(89, 205, 82); + text-shadow : 1px 0 1px green; +} + +.test-name-column .icon-file-2 { + color : #bbb; +} + +.test-name-column .icon-bug { + color : #ff1111; + font-size : 1.1em; + margin-top : 1px; +} + +.icon-busy { + color : #777; +} + +.test-name-column .icon-close { + color : #ff1111; +} + +.icon-flag { + color : #F52222; +} + +.icon-lightning { + color : rgb(251, 249, 176); + text-shadow : 1px 0 1px rgb(148, 120, 87); +} + +.icon-folder-open, +.icon-folder { + color : rgb(215, 213, 40); + text-shadow : 1px 0 1px rgb(148, 120, 87); + top : 0; +} + +.icon-folder-open.tr-folder-green, +.icon-folder.tr-folder-green { + color : rgb(89, 205, 82); + text-shadow : 1px 0 1px green; +} + +.icon-folder-open.tr-folder-red, +.icon-folder.tr-folder-red { + color : #FC2525; + text-shadow : 1px 0 1px darkred; +} + +.tr-test-todo-pass { + color : green; + font-weight : bold; +} + +.tr-test-todo-fail { + color : #666; +}.changelog-window .light-button { + /* FROM TWITTER BOOTSTRAP */ + background-color : #5bb75b; + background-image : -moz-linear-gradient(top, #62c462, #51a351); + background-image : -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351)); + background-image : -webkit-linear-gradient(top, #62c462, #51a351); + background-image : -o-linear-gradient(top, #62c462, #51a351); + background-image : linear-gradient(to bottom, #62c462, #51a351); + background-repeat : repeat-x; + border-color : #51a351 #51a351 #387038; + border-color : rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); +} + +.changelog-window .light-button .x-btn-inner { + color : #ffffff; + text-shadow : 0 -1px 0 rgba(0, 0, 0, 0.25); +} + +/* CHANGELOG STYLING*/ + +.changelog-window .x-window-body { + background : #fff; + padding : 10px 20px !important; +} + +.changelog-window h3 { + background : none repeat scroll 0 0 #FFEEEE; + border-bottom : 1px solid #EEEEEE; + color : #333333; + margin-top : 30px; + padding : 15px; +} + +.changelog-window h4 { + color : Navy; + line-height : 17px; + margin-bottom : 5px; + margin-top : 20px; + padding-left : 20px; +} + +.changelog-window ul li { + margin-top : 5px; + padding-left : 5px; + margin-left : 20px; +} + +.siesta-hidden { + position : absolute; + left : -10000px; + top : -10000px; +}@font-face { + font-family: 'icomoon'; + src:url('fonts/icomoon.eot'); + src:url('fonts/icomoon.eot?#iefix') format('embedded-opentype'), + url('fonts/icomoon.woff') format('woff'), + url('fonts/icomoon.ttf') format('truetype'), + url('fonts/icomoon.svg#icomoon') format('svg'); + font-weight: normal; + font-style: normal; +} + +/* Use the following CSS code if you want to use data attributes for inserting your icons */ +[data-icon]:before { + font-family: 'icomoon'; + content: attr(data-icon); + speak: none; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + -webkit-font-smoothing: antialiased; +} + +/* Use the following CSS code if you want to have a class per icon */ +/* +Instead of a list of all class selectors, +you can use the generic selector below, but it's slower: +[class*="icon-"] { +*/ +.icon-file, .icon-screen, .icon-bug, .icon-search, .icon-play, .icon-loop, .icon-folder, .icon-folder-open, .icon-close, .icon-file-2, .icon-checkmark, .icon-busy, .icon-lightning, .icon-flag, .icon-forward, .icon-cog, .icon-bars, .icon-bars-2, .icon-book { + font-family: 'icomoon'; + speak: none; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + -webkit-font-smoothing: antialiased; +} +.icon-file:before { + content: "\e000"; +} +.icon-screen:before { + content: "\e001"; +} +.icon-bug:before { + content: "\e002"; +} +.icon-search:before { + content: "\e003"; +} +.icon-play:before { + content: "\e004"; +} +.icon-loop:before { + content: "\e005"; +} +.icon-folder:before { + content: "\e006"; +} +.icon-folder-open:before { + content: "\e007"; +} +.icon-close:before { + content: "\e008"; +} +.icon-file-2:before { + content: "\e009"; +} +.icon-checkmark:before { + content: "\e00a"; +} +.icon-busy:before { + content: "\e00b"; +} +.icon-lightning:before { + content: "\e00c"; +} +.icon-flag:before { + content: "\e00d"; +} +.icon-forward:before { + content: "\e00e"; +} +.icon-cog:before { + content: "\e00f"; +} +.icon-bars:before { + content: "\e010"; +} +.icon-bars-2:before { + content: "\e011"; +} +.icon-book:before { + content: "\e012"; +} +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +.syntaxhighlighter a, +.syntaxhighlighter div, +.syntaxhighlighter code, +.syntaxhighlighter table, +.syntaxhighlighter table td, +.syntaxhighlighter table tr, +.syntaxhighlighter table tbody, +.syntaxhighlighter table thead, +.syntaxhighlighter table caption, +.syntaxhighlighter textarea { + -moz-border-radius: 0 0 0 0 !important; + -webkit-border-radius: 0 0 0 0 !important; + background: none !important; + border: 0 !important; + bottom: auto !important; + float: none !important; + height: auto !important; + left: auto !important; + line-height: 1.1em !important; + margin: 0 !important; + outline: 0 !important; + overflow: visible !important; + padding: 0 !important; + position: static !important; + right: auto !important; + text-align: left !important; + top: auto !important; + vertical-align: baseline !important; + width: auto !important; + box-sizing: content-box !important; + font-family: "Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace !important; + font-weight: normal !important; + font-style: normal !important; + font-size: 1em !important; + min-height: inherit !important; + min-height: auto !important; +} + +.syntaxhighlighter { + width: 100% !important; + margin: 1em 0 1em 0 !important; + position: relative !important; + overflow: auto !important; + font-size: 1em !important; +} +.syntaxhighlighter.source { + overflow: hidden !important; +} +.syntaxhighlighter .bold { + font-weight: bold !important; +} +.syntaxhighlighter .italic { + font-style: italic !important; +} +.syntaxhighlighter .line { + white-space: pre !important; +} +.syntaxhighlighter table { + width: 100% !important; +} +.syntaxhighlighter table caption { + text-align: left !important; + padding: .5em 0 0.5em 1em !important; +} +.syntaxhighlighter table td.code { + width: 100% !important; +} +.syntaxhighlighter table td.code .container { + position: relative !important; +} +.syntaxhighlighter table td.code .container textarea { + box-sizing: border-box !important; + position: absolute !important; + left: 0 !important; + top: 0 !important; + width: 100% !important; + height: 100% !important; + border: none !important; + background: white !important; + padding-left: 1em !important; + overflow: hidden !important; + white-space: pre !important; +} +.syntaxhighlighter table td.gutter .line { + text-align: right !important; + padding: 0 0.5em 0 1em !important; +} +.syntaxhighlighter table td.code .line { + padding: 0 1em !important; +} +.syntaxhighlighter.nogutter td.code .container textarea, .syntaxhighlighter.nogutter td.code .line { + padding-left: 0em !important; +} +.syntaxhighlighter.show { + display: block !important; +} +.syntaxhighlighter.collapsed table { + display: none !important; +} +.syntaxhighlighter.collapsed .toolbar { + padding: 0.1em 0.8em 0em 0.8em !important; + font-size: 1em !important; + position: static !important; + width: auto !important; + height: auto !important; +} +.syntaxhighlighter.collapsed .toolbar span { + display: inline !important; + margin-right: 1em !important; +} +.syntaxhighlighter.collapsed .toolbar span a { + padding: 0 !important; + display: none !important; +} +.syntaxhighlighter.collapsed .toolbar span a.expandSource { + display: inline !important; +} +.syntaxhighlighter .toolbar { + position: absolute !important; + right: 1px !important; + top: 1px !important; + width: 11px !important; + height: 11px !important; + font-size: 10px !important; + z-index: 10 !important; +} +.syntaxhighlighter .toolbar span.title { + display: inline !important; +} +.syntaxhighlighter .toolbar a { + display: block !important; + text-align: center !important; + text-decoration: none !important; + padding-top: 1px !important; +} +.syntaxhighlighter .toolbar a.expandSource { + display: none !important; +} +.syntaxhighlighter.ie { + font-size: .9em !important; + padding: 1px 0 1px 0 !important; +} +.syntaxhighlighter.ie .toolbar { + line-height: 8px !important; +} +.syntaxhighlighter.ie .toolbar a { + padding-top: 0px !important; +} +.syntaxhighlighter.printing .line.alt1 .content, +.syntaxhighlighter.printing .line.alt2 .content, +.syntaxhighlighter.printing .line.highlighted .number, +.syntaxhighlighter.printing .line.highlighted.alt1 .content, +.syntaxhighlighter.printing .line.highlighted.alt2 .content { + background: none !important; +} +.syntaxhighlighter.printing .line .number { + color: #bbbbbb !important; +} +.syntaxhighlighter.printing .line .content { + color: black !important; +} +.syntaxhighlighter.printing .toolbar { + display: none !important; +} +.syntaxhighlighter.printing a { + text-decoration: none !important; +} +.syntaxhighlighter.printing .plain, .syntaxhighlighter.printing .plain a { + color: black !important; +} +.syntaxhighlighter.printing .comments, .syntaxhighlighter.printing .comments a { + color: #008200 !important; +} +.syntaxhighlighter.printing .string, .syntaxhighlighter.printing .string a { + color: blue !important; +} +.syntaxhighlighter.printing .keyword { + color: #006699 !important; + font-weight: bold !important; +} +.syntaxhighlighter.printing .preprocessor { + color: gray !important; +} +.syntaxhighlighter.printing .variable { + color: #aa7700 !important; +} +.syntaxhighlighter.printing .value { + color: #009900 !important; +} +.syntaxhighlighter.printing .functions { + color: #ff1493 !important; +} +.syntaxhighlighter.printing .constants { + color: #0066cc !important; +} +.syntaxhighlighter.printing .script { + font-weight: bold !important; +} +.syntaxhighlighter.printing .color1, .syntaxhighlighter.printing .color1 a { + color: gray !important; +} +.syntaxhighlighter.printing .color2, .syntaxhighlighter.printing .color2 a { + color: #ff1493 !important; +} +.syntaxhighlighter.printing .color3, .syntaxhighlighter.printing .color3 a { + color: red !important; +} +.syntaxhighlighter.printing .break, .syntaxhighlighter.printing .break a { + color: black !important; +} +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +.syntaxhighlighter { + background-color: white !important; +} +.syntaxhighlighter .line.alt1 { + background-color: white !important; +} +.syntaxhighlighter .line.alt2 { + background-color: white !important; +} +.syntaxhighlighter .line.highlighted.alt1, .syntaxhighlighter .line.highlighted.alt2 { + background-color: #e0e0e0 !important; +} +.syntaxhighlighter .line.highlighted.number { + color: black !important; +} +.syntaxhighlighter table caption { + color: black !important; +} +.syntaxhighlighter .gutter { + color: #afafaf !important; +} +.syntaxhighlighter .gutter .line { + border-right: 3px solid #6ce26c !important; +} +.syntaxhighlighter .gutter .line.highlighted { + background-color: #6ce26c !important; + color: white !important; +} +.syntaxhighlighter.printing .line .content { + border: none !important; +} +.syntaxhighlighter.collapsed { + overflow: visible !important; +} +.syntaxhighlighter.collapsed .toolbar { + color: blue !important; + background: white !important; + border: 1px solid #6ce26c !important; +} +.syntaxhighlighter.collapsed .toolbar a { + color: blue !important; +} +.syntaxhighlighter.collapsed .toolbar a:hover { + color: red !important; +} +.syntaxhighlighter .toolbar { + color: white !important; + background: #6ce26c !important; + border: none !important; +} +.syntaxhighlighter .toolbar a { + color: white !important; +} +.syntaxhighlighter .toolbar a:hover { + color: black !important; +} +.syntaxhighlighter .plain, .syntaxhighlighter .plain a { + color: black !important; +} +.syntaxhighlighter .comments, .syntaxhighlighter .comments a { + color: #008200 !important; +} +.syntaxhighlighter .string, .syntaxhighlighter .string a { + color: blue !important; +} +.syntaxhighlighter .keyword { + color: #006699 !important; +} +.syntaxhighlighter .preprocessor { + color: gray !important; +} +.syntaxhighlighter .variable { + color: #aa7700 !important; +} +.syntaxhighlighter .value { + color: #009900 !important; +} +.syntaxhighlighter .functions { + color: #ff1493 !important; +} +.syntaxhighlighter .constants { + color: #0066cc !important; +} +.syntaxhighlighter .script { + font-weight: bold !important; + color: #006699 !important; + background-color: none !important; +} +.syntaxhighlighter .color1, .syntaxhighlighter .color1 a { + color: gray !important; +} +.syntaxhighlighter .color2, .syntaxhighlighter .color2 a { + color: #ff1493 !important; +} +.syntaxhighlighter .color3, .syntaxhighlighter .color3 a { + color: red !important; +} + +.syntaxhighlighter .keyword { + font-weight: bold !important; +} +.st-cov-report-tree-panel, +.st-cov-report-tree-panel, +.st-cov-report-source-panel { + border : 1px solid #bbb; + border-top-left-radius : 3px; + border-top-right-radius : 3px; + border-bottom : 0 none; +} + +.st-cov-report-tree-panel .x-toolbar { + padding-top : 3px; +} + + + +.st-cov-report-tree-panel .x-grid-cell { + padding : 0 4px; + border : 0 none !important; +} + +.st-cov-report-tree-panel .x-grid-cell-inner { + padding-bottom : 2px; + text-overflow : clip; +} + + +.st-cov-report-tree-panel .x-grid-row-selected .cov-result-cell { + background : transparent !important; +} + +.x-grid-row-selected .cov-result-cell .x-grid-cell-inner { + color : #000; + font-weight : 400; +} + +.st-cov-report-tree-panel .x-tree-icon-parent { + background : url(../images/ns.png) no-repeat 0 0 !important; +} + +.st-cov-report-tree-panel .x-tree-icon-leaf { + background : url(../images/leaf.png) no-repeat 0 0 !important; +} + + +.st-cov-report-tree-panel .x-tree-icon { + background-size: 16px 16px !important; + border-radius: 16px; +} + +.st-cov-report-tree-panel .x-btn { + background-image : none !important; +} + +.st-cov-report-tree-panel .x-btn-pressed { + background : #d8d8d8; + border-color : #aaa; +} + +.st-cov-level-high .x-grid-cell-inner { border-bottom : 4px solid rgb(89, 205, 82) !important; font-weight : 300; } + +.st-cov-level-medium .x-grid-cell-inner { border-bottom : 4px solid rgb(215, 213, 40) !important; font-weight : 300; } + +.st-cov-level-low .x-grid-cell-inner { border-bottom : 4px solid #ff1111 !important; font-weight : 300; } + +/* CODE AREA STYLING Styles from Istanbul, TODO: remove unused rules, or completely re-style */ + +pre.coverage { + font-family : "Monaco", "Inconsolata", "Andale Mono", "Lucida Console", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace !important; + margin : 0; + padding : 0; + line-height : 15px; + font-size : 13px; + -moz-tab-size : 2; + -o-tab-size : 2; + tab-size : 2; +} + +div.path { font-size : 110%; } + +div.path a:link, div.path a:visited { color : #555; } + +table.coverage { border-collapse : collapse; margin : 0; padding : 0 } + +table.coverage td { + margin : 0; + padding : 0; + color : #111; + vertical-align : top; +} + +table.coverage td.line-count { + text-align : right; + padding-right : 5px; + font-size : 11px; + color : #afafaf; +} + +table.coverage td.line-coverage { + color : #777 !important; + text-align : right; + border-left : 1px solid #ccc; + border-right : 1px solid #ccc; +} + +table.coverage td.text { +} + +table.coverage td span.cline-any { + display : inline-block; + padding : 0 5px; + width : 40px; +} + +table.coverage td span.cline-neutral { + background : #f4f4f4; +} + +table.coverage td span.cline-yes { + background : #b5d592; + color : #999; +} + +table.coverage td span.cline-no { + background : #fc8c84; +} + +.cstat-yes { color : #555; } + +.cstat-no { background : #fc8c84; color : #111; } + +.fstat-no { background : #ffc520; color : #111 !important; } + +.cbranch-no { background : yellow !important; color : #111; } + +.missing-if-branch { + display : inline-block; + margin-right : 10px; + position : relative; + padding : 0 4px; + background : black; + color : yellow; + text-decoration : line-through; +} + +.missing-if-branch .typ { + color : inherit !important; +} + +.high { background : #b5d592 !important; } + +.medium { background : #ffe87c !important; } + +.low { background : #fc8c84 !important; } + +span.cover-fill, span.cover-empty { + display : inline-block; + border : 1px solid #444; + background : white; + height : 12px; +} + +span.cover-fill { + background : #ccc; + border-right : 1px solid #444; +} + +span.cover-empty { + background : white; + border-left : none; +} + +span.cover-full { + border-right : none !important; +} + +.st-cov-stat-abs-statements, +.st-cov-stat-abs-branches, +.st-cov-stat-abs-lines, +.st-cov-stat-abs-functions +{ + font-size:0.8em; +} + +pre.prettyprint { + border : none !important; + padding : 0 !important; + margin : 0 !important; +} + +.com { color : #999 !important; } + +/* EOF Styles from Istanbul */.pln { color : #333 } + +@media screen { + .str { color : #080 } + + .kwd { color : #008 } + + .com { color : #800 } + + .typ { color : #606 } + + .lit { color : #066 } + + .pun, .opn, .clo { color : #660 } + + .tag { color : #008 } + + .atn { color : #606 } + + .atv { color : #080 } + + .dec, .var { color : #606 } + + .fun { color : red } +} + +@media print, projection { + .str { color : #060 } + + .kwd { color : #006; font-weight : bold } + + .com { color : #600; font-style : italic } + + .typ { color : #404; font-weight : bold } + + .lit { color : #044 } + + .pun, .opn, .clo { color : #440 } + + .tag { color : #006; font-weight : bold } + + .atn { color : #404 } + + .atv { color : #060 } +} + +pre.prettyprint { padding : 2px; border : 1px solid #888 } + +ol.linenums { margin-top : 0; margin-bottom : 0 } + +li.L0, li.L1, li.L2, li.L3, li.L5, li.L6, li.L7, li.L8 { list-style-type : none } + +li.L1, li.L3, li.L5, li.L7, li.L9 { background : #eee } diff --git a/tests/siesta/resources/css/siesta-touch-all.css b/tests/siesta/resources/css/siesta-touch-all.css new file mode 100644 index 0000000..1e11dac --- /dev/null +++ b/tests/siesta/resources/css/siesta-touch-all.css @@ -0,0 +1,334 @@ +/* + +Siesta 2.0.4 +Copyright(c) 2009-2013 Bryntum AB +http://bryntum.com/contact +http://bryntum.com/products/siesta/license + +*/ +.siesta-hidden { + position : absolute; + left : -10000px; + top : -10000px; +}.ghost-cursor { + position : absolute; + width : 19px; + height : 22px; + left : 0px; + top : 0px; + z-index : 1000001; + background : url(../images/cursor-hand.png) no-repeat left center; +} + +.ghost-cursor-press { + background : url(../images/cursor-hand-press.png) no-repeat left center; +} + +.ghost-cursor-message { + background : none repeat scroll 0 0 #FFFFFF; + border : 1px solid #CCCCCC; + color : #666666; + padding : 2px 4px; + position : absolute; + z-index : 101; + border-radius : 5px; + box-shadow : 1px 1px 1px rgba(200, 200, 200, 0.1); + -webkit-transition-property : opacity, top; + -webkit-transition-duration : 2s; + -moz-transition-property : opacity, top; + -moz-transition-duration : 2s; + transition-property : opacity, top; + transition-duration : 2s; + opacity : 1; +} + +.ghost-cursor-click-indicator { + position : absolute; + border-radius : 100%; + margin-left : -3px; + margin-top : -3px; + -webkit-transition-property : opacity, width, height, margin-left, margin-top, visibility; + -webkit-transition-duration : 2.5s; + -moz-transition-property : opacity, width, height, margin-left, margin-top, visibility; + -moz-transition-duration : 2.5s; + transition-property : opacity, width, height, margin-left, margin-top, visibility; + transition-duration : 2.5s; + border : 2px solid darkred; + opacity : 0.7; + width : 7px; + height : 7px; + z-index : 101; +} + +.ghost-cursor-click-indicator-big { + margin-left : -21px; + margin-top : -21px; + height : 50px; + width : 50px; + opacity : 0; + visibility : hidden; +} + +.x-ie .ghost-cursor { + z-index : -1; + display : none; +} +/* + Play icons from: + Author : Sekkyumu + HomePage : http://sekkyumu.deviantart.com/ + License : Creative Commons Attribution 3.0 License +*/ + +.tr-iframe-wrapper { + position : absolute; + width : 100% !important; + height : 100% !important; + left : -10000px; + top : -10000px; + + background-color : white; +} + +iframe.tr-iframe { + position : absolute; + width : 100% !important; + height : 100% !important; +} + +.tr-iframe-wrapper.active { + left : 0px; + top : 0px; + z-index : 0; +} + +.mainarea-panel, .tr-testgrid, .x-layout-card-item +{ + background:transparent !important; +} + + +/*======================================================================================================================================================================================================================= + Icons +*/ + +.tr-icon-run-failed .x-button-label { + background: transparent url(../images/PlayRed.png) no-repeat 0 -8px; + height:16px; +} + +.tr-icon-run-all .x-button-label{ + background: transparent url(../images/PlayAll.png) no-repeat 0 -8px; + height:16px; +} + +.tr-icon-stop .x-button-label{ + background: transparent url(../images/Stop.png) no-repeat 0 -8px; + height:16px; +} + +/*======================================================================================================================================================================================================================= + Unsorted +*/ + +.launching +{ + background: url(../images/clock_48.png) no-repeat 5px center !important; + padding-left:60px; +} + +#splashLoader { + background: url(../images/logo_small2.png) no-repeat center 25%; + position: absolute; + top: 0; + right: 0; + left: 0; + bottom: 0; +} + +#loading { + color: #9EB2CD; + font-size: 120%; + position: absolute; + width: 170px; + left: 50%; + margin: 55% 0 0 -59px; +} + +#loading .x-loading-spinner { + font-size: 160%; + margin: -27px 0 0 -45px; +} + +.suite-bar .x-title +{ + opacity:0.5; +}/*======================================================================================================================================================================================================================= + Row in tests grid - result cell +*/ + +.tr-folder-item { + background-color : lightcyan; + font-weight : bolder; +} + +.tr-test-status { + background-position: 0px center; + background-repeat: no-repeat; + padding-left : 25px; +} + +.tr-test-status-empty { + background-image : url(../images/document_16.png) !important; +} + +.tr-test-status-failed { + background-image : url(../images/bug.png) !important; +} + +.tr-test-status-thrown { + background-image : url(../images/flag-red.png) !important; +} + +.tr-test-status-working { + background-image : url(../images/hourglass.png) !important; +} + +.tr-test-status-passed { + background-image : url(../images/ok.png) !important; +} + +.tr-test-status-missing { + background-image : url(../images/cross.png) !important; +} + +.tr-test-status-running { + background-image : url(../images/lightning.png) !important; +} + +.tr-folder-green { + background-image : url(../images/folder_green.png) !important; +} + +.tr-folder-yellow { + background-image : url(../images/folder_yellow.png) !important; +} + +.tr-folder-red { + background-image : url(../images/folder_red.png) !important; +} + +.tr-test-todo-pass +{ + color: green; + font-weight:bold; +} + +.tr-test-todo-fail +{ + color: #666; +} + + +.tr-test-results { + height : 1.7em; + position : absolute; + right : 2.14em; + bottom : 0.44em; + text-align : right; + line-height : 1.7em; + margin-right : 20px; +} + +.tr-test-results-passed, .tr-test-results-failed +{ + overflow : hidden; + float : left; + padding-left : 20px; +} + +.tr-test-results +{ + margin-right : 15px; +} + +.tr-test-results-passed +{ + background : url(../images/ok.png) no-repeat left center; +} + +.tr-test-results-failed +{ + margin-left : 20px; + background : url(../images/bug.png) no-repeat left center; +} +/*======================================================================================================================================================================================================================= + Assertion row - result cell +*/ + + +.result-list .x-list-item-label +{ + min-height:0 !important; + padding:0 !important; +} + +.siesta-initializing +{ + color:#777; +} + + +.tr-assertion-row-failed { + background : #ff8186 url(../images/bug.png) no-repeat 10px center; + padding-left : 35px !important; +} + +.tr-assertion-row-passed { + background : transparent url(../images/ok.png) no-repeat 10px center; + padding-left : 35px !important; +} + +.tr-waiting-row-passed +{ + background : transparent url(../images/clock_check.png) no-repeat 10px center; + padding-left : 35px !important; +} + +.tr-diagnostic-row +{ + background-color : #d5e7f0; + border : 1px solid lightblue; +} + +.tr-summary-row +{ + padding: 0.65em 0.8em; + background-color: #115788; + color:#fff; +} + +.tr-summary-failure { + background-color : #FF8186 !important; +} + +.result-summary-button .passed-indicator, +.result-summary-button .failed-indicator +{ + line-height:21px; + overflow:hidden; + float:left; + padding-left:25px; +} + + +.result-summary-button .passed-indicator +{ + background : url(../images/ok.png) no-repeat left center; +} + +.result-summary-button .failed-indicator +{ + margin-left:15px; + background : url(../images/bug.png) no-repeat left center; +} diff --git a/tests/siesta/resources/images/Play.png b/tests/siesta/resources/images/Play.png new file mode 100644 index 0000000..25e25d6 Binary files /dev/null and b/tests/siesta/resources/images/Play.png differ diff --git a/tests/siesta/resources/images/PlayAll.png b/tests/siesta/resources/images/PlayAll.png new file mode 100644 index 0000000..b943c40 Binary files /dev/null and b/tests/siesta/resources/images/PlayAll.png differ diff --git a/tests/siesta/resources/images/PlayButton.png b/tests/siesta/resources/images/PlayButton.png new file mode 100644 index 0000000..3a585f7 Binary files /dev/null and b/tests/siesta/resources/images/PlayButton.png differ diff --git a/tests/siesta/resources/images/PlayButtonBlue.png b/tests/siesta/resources/images/PlayButtonBlue.png new file mode 100644 index 0000000..ed47d23 Binary files /dev/null and b/tests/siesta/resources/images/PlayButtonBlue.png differ diff --git a/tests/siesta/resources/images/PlayButtonRed.png b/tests/siesta/resources/images/PlayButtonRed.png new file mode 100644 index 0000000..3a585f7 Binary files /dev/null and b/tests/siesta/resources/images/PlayButtonRed.png differ diff --git a/tests/siesta/resources/images/PlayRed.png b/tests/siesta/resources/images/PlayRed.png new file mode 100644 index 0000000..93d3df7 Binary files /dev/null and b/tests/siesta/resources/images/PlayRed.png differ diff --git a/tests/siesta/resources/images/Stop.png b/tests/siesta/resources/images/Stop.png new file mode 100644 index 0000000..e560b08 Binary files /dev/null and b/tests/siesta/resources/images/Stop.png differ diff --git a/tests/siesta/resources/images/StopButton.png b/tests/siesta/resources/images/StopButton.png new file mode 100644 index 0000000..41dadeb Binary files /dev/null and b/tests/siesta/resources/images/StopButton.png differ diff --git a/tests/siesta/resources/images/arrow_in.png b/tests/siesta/resources/images/arrow_in.png new file mode 100644 index 0000000..3702f29 Binary files /dev/null and b/tests/siesta/resources/images/arrow_in.png differ diff --git a/tests/siesta/resources/images/arrow_out.png b/tests/siesta/resources/images/arrow_out.png new file mode 100644 index 0000000..8a96a53 Binary files /dev/null and b/tests/siesta/resources/images/arrow_out.png differ diff --git a/tests/siesta/resources/images/arrow_rotate_anticlockwise.png b/tests/siesta/resources/images/arrow_rotate_anticlockwise.png new file mode 100644 index 0000000..46c75aa Binary files /dev/null and b/tests/siesta/resources/images/arrow_rotate_anticlockwise.png differ diff --git a/tests/siesta/resources/images/bodybg.gif b/tests/siesta/resources/images/bodybg.gif new file mode 100644 index 0000000..6d7cf0a Binary files /dev/null and b/tests/siesta/resources/images/bodybg.gif differ diff --git a/tests/siesta/resources/images/book.png b/tests/siesta/resources/images/book.png new file mode 100644 index 0000000..b0f4dd7 Binary files /dev/null and b/tests/siesta/resources/images/book.png differ diff --git a/tests/siesta/resources/images/book_48.png b/tests/siesta/resources/images/book_48.png new file mode 100644 index 0000000..f94f1ef Binary files /dev/null and b/tests/siesta/resources/images/book_48.png differ diff --git a/tests/siesta/resources/images/bryntum-logo-64.jpg b/tests/siesta/resources/images/bryntum-logo-64.jpg new file mode 100644 index 0000000..d996a65 Binary files /dev/null and b/tests/siesta/resources/images/bryntum-logo-64.jpg differ diff --git a/tests/siesta/resources/images/bug-todo.png b/tests/siesta/resources/images/bug-todo.png new file mode 100755 index 0000000..2c9c217 Binary files /dev/null and b/tests/siesta/resources/images/bug-todo.png differ diff --git a/tests/siesta/resources/images/bug.png b/tests/siesta/resources/images/bug.png new file mode 100755 index 0000000..87bef79 Binary files /dev/null and b/tests/siesta/resources/images/bug.png differ diff --git a/tests/siesta/resources/images/bug32.png b/tests/siesta/resources/images/bug32.png new file mode 100644 index 0000000..31dd84f Binary files /dev/null and b/tests/siesta/resources/images/bug32.png differ diff --git a/tests/siesta/resources/images/button_play_all.png b/tests/siesta/resources/images/button_play_all.png new file mode 100644 index 0000000..a375bd1 Binary files /dev/null and b/tests/siesta/resources/images/button_play_all.png differ diff --git a/tests/siesta/resources/images/button_play_checked.png b/tests/siesta/resources/images/button_play_checked.png new file mode 100644 index 0000000..7a0ebb2 Binary files /dev/null and b/tests/siesta/resources/images/button_play_checked.png differ diff --git a/tests/siesta/resources/images/button_play_checked.xcf b/tests/siesta/resources/images/button_play_checked.xcf new file mode 100644 index 0000000..d8e4e90 Binary files /dev/null and b/tests/siesta/resources/images/button_play_checked.xcf differ diff --git a/tests/siesta/resources/images/button_play_red.png b/tests/siesta/resources/images/button_play_red.png new file mode 100644 index 0000000..fa4939d Binary files /dev/null and b/tests/siesta/resources/images/button_play_red.png differ diff --git a/tests/siesta/resources/images/cart.png b/tests/siesta/resources/images/cart.png new file mode 100644 index 0000000..1baf7b9 Binary files /dev/null and b/tests/siesta/resources/images/cart.png differ diff --git a/tests/siesta/resources/images/checked.gif b/tests/siesta/resources/images/checked.gif new file mode 100644 index 0000000..fad5893 Binary files /dev/null and b/tests/siesta/resources/images/checked.gif differ diff --git a/tests/siesta/resources/images/checkmark32.png b/tests/siesta/resources/images/checkmark32.png new file mode 100644 index 0000000..11da1c9 Binary files /dev/null and b/tests/siesta/resources/images/checkmark32.png differ diff --git a/tests/siesta/resources/images/clock_48.png b/tests/siesta/resources/images/clock_48.png new file mode 100644 index 0000000..9f35bce Binary files /dev/null and b/tests/siesta/resources/images/clock_48.png differ diff --git a/tests/siesta/resources/images/clock_check.png b/tests/siesta/resources/images/clock_check.png new file mode 100644 index 0000000..5bb282a Binary files /dev/null and b/tests/siesta/resources/images/clock_check.png differ diff --git a/tests/siesta/resources/images/cross.png b/tests/siesta/resources/images/cross.png new file mode 100644 index 0000000..1514d51 Binary files /dev/null and b/tests/siesta/resources/images/cross.png differ diff --git a/tests/siesta/resources/images/cursor-arrow.png b/tests/siesta/resources/images/cursor-arrow.png new file mode 100644 index 0000000..0126125 Binary files /dev/null and b/tests/siesta/resources/images/cursor-arrow.png differ diff --git a/tests/siesta/resources/images/cursor-hand-press.png b/tests/siesta/resources/images/cursor-hand-press.png new file mode 100644 index 0000000..9ad27fe Binary files /dev/null and b/tests/siesta/resources/images/cursor-hand-press.png differ diff --git a/tests/siesta/resources/images/cursor-hand.png b/tests/siesta/resources/images/cursor-hand.png new file mode 100644 index 0000000..9f410f6 Binary files /dev/null and b/tests/siesta/resources/images/cursor-hand.png differ diff --git a/tests/siesta/resources/images/document_16.png b/tests/siesta/resources/images/document_16.png new file mode 100644 index 0000000..915a521 Binary files /dev/null and b/tests/siesta/resources/images/document_16.png differ diff --git a/tests/siesta/resources/images/domcontainer-bg.png b/tests/siesta/resources/images/domcontainer-bg.png new file mode 100644 index 0000000..e1d0615 Binary files /dev/null and b/tests/siesta/resources/images/domcontainer-bg.png differ diff --git a/tests/siesta/resources/images/expand.png b/tests/siesta/resources/images/expand.png new file mode 100644 index 0000000..eea5f00 Binary files /dev/null and b/tests/siesta/resources/images/expand.png differ diff --git a/tests/siesta/resources/images/flag-green.png b/tests/siesta/resources/images/flag-green.png new file mode 100644 index 0000000..4015c5e Binary files /dev/null and b/tests/siesta/resources/images/flag-green.png differ diff --git a/tests/siesta/resources/images/flag-red.png b/tests/siesta/resources/images/flag-red.png new file mode 100644 index 0000000..2bfd900 Binary files /dev/null and b/tests/siesta/resources/images/flag-red.png differ diff --git a/tests/siesta/resources/images/folder_green.png b/tests/siesta/resources/images/folder_green.png new file mode 100644 index 0000000..b040638 Binary files /dev/null and b/tests/siesta/resources/images/folder_green.png differ diff --git a/tests/siesta/resources/images/folder_red.png b/tests/siesta/resources/images/folder_red.png new file mode 100644 index 0000000..8561c85 Binary files /dev/null and b/tests/siesta/resources/images/folder_red.png differ diff --git a/tests/siesta/resources/images/folder_yellow.png b/tests/siesta/resources/images/folder_yellow.png new file mode 100644 index 0000000..5d62800 Binary files /dev/null and b/tests/siesta/resources/images/folder_yellow.png differ diff --git a/tests/siesta/resources/images/gear.png b/tests/siesta/resources/images/gear.png new file mode 100644 index 0000000..80e034c Binary files /dev/null and b/tests/siesta/resources/images/gear.png differ diff --git a/tests/siesta/resources/images/group.png b/tests/siesta/resources/images/group.png new file mode 100644 index 0000000..7fb4e1f Binary files /dev/null and b/tests/siesta/resources/images/group.png differ diff --git a/tests/siesta/resources/images/hourglass.png b/tests/siesta/resources/images/hourglass.png new file mode 100644 index 0000000..127c5d6 Binary files /dev/null and b/tests/siesta/resources/images/hourglass.png differ diff --git a/tests/siesta/resources/images/key_down.png b/tests/siesta/resources/images/key_down.png new file mode 100644 index 0000000..1b91db9 Binary files /dev/null and b/tests/siesta/resources/images/key_down.png differ diff --git a/tests/siesta/resources/images/key_press.png b/tests/siesta/resources/images/key_press.png new file mode 100644 index 0000000..1b91db9 Binary files /dev/null and b/tests/siesta/resources/images/key_press.png differ diff --git a/tests/siesta/resources/images/key_up.png b/tests/siesta/resources/images/key_up.png new file mode 100644 index 0000000..1332b18 Binary files /dev/null and b/tests/siesta/resources/images/key_up.png differ diff --git a/tests/siesta/resources/images/leaf.png b/tests/siesta/resources/images/leaf.png new file mode 100644 index 0000000..27e1e86 Binary files /dev/null and b/tests/siesta/resources/images/leaf.png differ diff --git a/tests/siesta/resources/images/lightning.png b/tests/siesta/resources/images/lightning.png new file mode 100644 index 0000000..c933224 Binary files /dev/null and b/tests/siesta/resources/images/lightning.png differ diff --git a/tests/siesta/resources/images/lightning32.png b/tests/siesta/resources/images/lightning32.png new file mode 100644 index 0000000..df8dffc Binary files /dev/null and b/tests/siesta/resources/images/lightning32.png differ diff --git a/tests/siesta/resources/images/loading2.gif b/tests/siesta/resources/images/loading2.gif new file mode 100644 index 0000000..df2b66c Binary files /dev/null and b/tests/siesta/resources/images/loading2.gif differ diff --git a/tests/siesta/resources/images/logo.png b/tests/siesta/resources/images/logo.png new file mode 100644 index 0000000..6ea7f15 Binary files /dev/null and b/tests/siesta/resources/images/logo.png differ diff --git a/tests/siesta/resources/images/logo_small2.png b/tests/siesta/resources/images/logo_small2.png new file mode 100644 index 0000000..166e661 Binary files /dev/null and b/tests/siesta/resources/images/logo_small2.png differ diff --git a/tests/siesta/resources/images/logo_small3.png b/tests/siesta/resources/images/logo_small3.png new file mode 100644 index 0000000..bb0e5ad Binary files /dev/null and b/tests/siesta/resources/images/logo_small3.png differ diff --git a/tests/siesta/resources/images/magnifier.png b/tests/siesta/resources/images/magnifier.png new file mode 100755 index 0000000..cf3d97f Binary files /dev/null and b/tests/siesta/resources/images/magnifier.png differ diff --git a/tests/siesta/resources/images/monitor.png b/tests/siesta/resources/images/monitor.png new file mode 100644 index 0000000..d040bd0 Binary files /dev/null and b/tests/siesta/resources/images/monitor.png differ diff --git a/tests/siesta/resources/images/ns.png b/tests/siesta/resources/images/ns.png new file mode 100644 index 0000000..5ab801f Binary files /dev/null and b/tests/siesta/resources/images/ns.png differ diff --git a/tests/siesta/resources/images/ok-todo.png b/tests/siesta/resources/images/ok-todo.png new file mode 100755 index 0000000..f03e0dc Binary files /dev/null and b/tests/siesta/resources/images/ok-todo.png differ diff --git a/tests/siesta/resources/images/ok.png b/tests/siesta/resources/images/ok.png new file mode 100644 index 0000000..3f3940c Binary files /dev/null and b/tests/siesta/resources/images/ok.png differ diff --git a/tests/siesta/resources/images/palmtree.png b/tests/siesta/resources/images/palmtree.png new file mode 100644 index 0000000..c5bbec4 Binary files /dev/null and b/tests/siesta/resources/images/palmtree.png differ diff --git a/tests/siesta/resources/images/prompt.png b/tests/siesta/resources/images/prompt.png new file mode 100644 index 0000000..505d24f Binary files /dev/null and b/tests/siesta/resources/images/prompt.png differ diff --git a/tests/siesta/resources/images/spinner.gif b/tests/siesta/resources/images/spinner.gif new file mode 100644 index 0000000..d112c54 Binary files /dev/null and b/tests/siesta/resources/images/spinner.gif differ diff --git a/tests/siesta/resources/images/stop_2.png b/tests/siesta/resources/images/stop_2.png new file mode 100644 index 0000000..0539646 Binary files /dev/null and b/tests/siesta/resources/images/stop_2.png differ diff --git a/tests/siesta/resources/images/stop_on_error.png b/tests/siesta/resources/images/stop_on_error.png new file mode 100644 index 0000000..cb7e23b Binary files /dev/null and b/tests/siesta/resources/images/stop_on_error.png differ diff --git a/tests/siesta/resources/images/text_align_left.png b/tests/siesta/resources/images/text_align_left.png new file mode 100644 index 0000000..6c8fcc1 Binary files /dev/null and b/tests/siesta/resources/images/text_align_left.png differ diff --git a/tests/siesta/resources/images/to_do_list.png b/tests/siesta/resources/images/to_do_list.png new file mode 100644 index 0000000..0b4ab11 Binary files /dev/null and b/tests/siesta/resources/images/to_do_list.png differ diff --git a/tests/siesta/resources/images/to_do_list_small.png b/tests/siesta/resources/images/to_do_list_small.png new file mode 100644 index 0000000..bdd16cb Binary files /dev/null and b/tests/siesta/resources/images/to_do_list_small.png differ diff --git a/tests/siesta/resources/images/trigger-groups.gif b/tests/siesta/resources/images/trigger-groups.gif new file mode 100644 index 0000000..3aed3d0 Binary files /dev/null and b/tests/siesta/resources/images/trigger-groups.gif differ diff --git a/tests/siesta/resources/images/trigger-leafs.gif b/tests/siesta/resources/images/trigger-leafs.gif new file mode 100644 index 0000000..e8e7c29 Binary files /dev/null and b/tests/siesta/resources/images/trigger-leafs.gif differ diff --git a/tests/siesta/resources/images/unchecked.gif b/tests/siesta/resources/images/unchecked.gif new file mode 100644 index 0000000..43823e5 Binary files /dev/null and b/tests/siesta/resources/images/unchecked.gif differ diff --git a/tests/siesta/resources/images/video.png b/tests/siesta/resources/images/video.png new file mode 100644 index 0000000..5bf19a0 Binary files /dev/null and b/tests/siesta/resources/images/video.png differ diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/LGPL-LICENSE b/tests/siesta/resources/syntaxhighlighter_3.0.83/LGPL-LICENSE new file mode 100644 index 0000000..3f9959f --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/LGPL-LICENSE @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser 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 +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. \ No newline at end of file diff --git a/test/jasmine/MIT.LICENSE b/tests/siesta/resources/syntaxhighlighter_3.0.83/MIT-LICENSE similarity index 96% rename from test/jasmine/MIT.LICENSE rename to tests/siesta/resources/syntaxhighlighter_3.0.83/MIT-LICENSE index 7c435ba..e7c70ba 100644 --- a/test/jasmine/MIT.LICENSE +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/MIT-LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2008-2011 Pivotal Labs +Copyright (c) 2003, 2004 Jim Weirich Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/compass/_theme_template.scss b/tests/siesta/resources/syntaxhighlighter_3.0.83/compass/_theme_template.scss new file mode 100644 index 0000000..53f4df5 --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/compass/_theme_template.scss @@ -0,0 +1,120 @@ +$background: white !default; + +$line_alt1_background: $background !default; +$line_alt2_background: $background !default; + +$line_highlighted_background: #e0e0e0 !default; +$line_highlighted_number: black !default; + +$gutter_text: #afafaf !default; +$gutter_border_color: #6ce26c !default; +$gutter_border: 3px solid $gutter_border_color !default; + +$toolbar_collapsed_a: #00f !default; +$toolbar_collapsed_a_hover: #f00 !default; +$toolbar_collapsed_background: #fff !default; +$toolbar_collapsed_border: 1px solid $gutter_border_color !default; + +$toolbar_a: #fff !default; +$toolbar_a_hover: #000 !default; +$toolbar_background: $gutter_border_color !default; +$toolbar_border: none !default; + +$code_plain: black !default; +$code_comments: #008200 !default; +$code_string: blue !default; +$code_keyword: #006699 !default; +$code_preprocessor: gray !default; +$code_variable: #aa7700 !default; +$code_value: #009900 !default; +$code_functions: #ff1493 !default; +$code_constants: #0066cc !default; +$code_script: $code_keyword !default; +$code_script_background: none !default; +$code_color1: gray !default; +$code_color2: #ff1493 !default; +$code_color3: red !default; + +$caption_color: $code_plain !default; + +// Interface elements. +.syntaxhighlighter { + background-color: $background !important; + + // Highlighed line number + .line { + &.alt1 { background-color: $line_alt1_background !important; } + &.alt2 { background-color: $line_alt2_background !important; } + + // Highlighed line + &.highlighted { + &.alt1, &.alt2 { background-color: $line_highlighted_background !important; } + &.number { color: $line_highlighted_number !important; } + } + } + + table { + caption { + color: $caption_color !important; + } + } + + // Add border to the lines + .gutter { + color: $gutter_text !important; + .line { + border-right: $gutter_border !important; + + &.highlighted { + background-color: $gutter_border_color !important; + color: $background !important; + } + } + } + + &.printing .line .content { border: none !important; } + + &.collapsed { + overflow: visible !important; + + .toolbar { + color: $toolbar_collapsed_a !important; + background: $toolbar_collapsed_background !important; + border: $toolbar_collapsed_border !important; + + a { + color: $toolbar_collapsed_a !important; + &:hover { color: $toolbar_collapsed_a_hover !important; } + } + } + } + + .toolbar { + color: $toolbar_a !important; + background: $toolbar_background !important; + border: $toolbar_border !important; + a { + color: $toolbar_a !important; + &:hover { color: $toolbar_a_hover !important; } + } + } + + // Actual syntax highlighter colors. + .plain, .plain a { color: $code_plain !important; } + .comments, .comments a { color: $code_comments !important; } + .string, .string a { color: $code_string !important; } + .keyword { color: $code_keyword !important; } + .preprocessor { color: $code_preprocessor !important; } + .variable { color: $code_variable !important; } + .value { color: $code_value !important; } + .functions { color: $code_functions !important; } + .constants { color: $code_constants !important; } + .script { + font-weight: bold !important; + color: $code_script !important; + background-color: $code_script_background !important; + } + .color1, .color1 a { color: $code_color1 !important; } + .color2, .color2 a { color: $code_color2 !important; } + .color3, .color3 a { color: $code_color3 !important; } +} diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/compass/config.rb b/tests/siesta/resources/syntaxhighlighter_3.0.83/compass/config.rb new file mode 100644 index 0000000..6f82de1 --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/compass/config.rb @@ -0,0 +1,14 @@ +environment = :production +project_type = :stand_alone +http_path = "/" +css_dir = "../styles" +sass_dir = "." +images_dir = "images" +sass_options = { + :line_numbers => false, + :debug_info => false +} + +# output_style = :compressed +# output_style = :compact +output_style = :expanded diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/compass/shCore.scss b/tests/siesta/resources/syntaxhighlighter_3.0.83/compass/shCore.scss new file mode 100644 index 0000000..a67e4f9 --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/compass/shCore.scss @@ -0,0 +1,216 @@ +@mixin round_corners_custom($top, $right, $bottom, $left) { + -moz-border-radius: $top $right $bottom $left !important; + -webkit-border-radius: $top $right $bottom $left !important; +} + +@mixin round_corners($radius) { + @include round_corners_custom($radius, $radius, $radius, $radius); +} + +.syntaxhighlighter { + a, + div, + code, + table, + table td, + table tr, + table tbody, + table thead, + table caption, + textarea { + @include round_corners(0); + + background: none !important; + border: 0 !important; + bottom: auto !important; + float: none !important; + height: auto !important; + left: auto !important; + line-height: 1.1em !important; + margin: 0 !important; + outline: 0 !important; + overflow: visible !important; + padding: 0 !important; + position: static !important; + right: auto !important; + text-align: left !important; + top: auto !important; + vertical-align: baseline !important; + width: auto !important; + box-sizing: content-box !important; + font: { + family: "Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace !important; + weight: normal !important; + style: normal !important; + size: 1em !important; + } + min: { + // For IE8, FF & WebKit + height: inherit !important; + // For IE7 + height: auto !important; + } + } +} + +.syntaxhighlighter { + width: 100% !important; + margin: 1em 0 1em 0 !important; + + position: relative !important; + overflow: auto !important; + font-size: 1em !important; + + &.source { overflow: hidden !important; } + + // set up bold and italic + .bold { font-weight: bold !important; } + .italic { font-style: italic !important; } + + .line { white-space: pre !important; } + + // main table and columns + table { + width: 100% !important; + caption { + text-align: left !important; + padding: .5em 0 0.5em 1em !important; + } + + td.code { + width: 100% !important; + + .container { + position: relative !important; + + textarea { + box-sizing: border-box !important; + position: absolute !important; + left: 0 !important; + top: 0 !important; + width: 100% !important; + height: 100% !important; + border: none !important; + background: white !important; + padding-left: 1em !important; + overflow: hidden !important; + white-space: pre !important; + } + } + } + + // middle spacing between line numbers and lines + td.gutter .line { + text-align: right !important; + padding: 0 0.5em 0 1em !important; + } + + td.code .line { + padding: 0 1em !important; + } + } + + &.nogutter { + td.code { + .container textarea, .line { padding-left: 0em !important; } + } + } + + &.show { display: block !important; } + + // Adjust some properties when collapsed + &.collapsed { + table { display: none !important; } + + .toolbar { + padding: 0.1em 0.8em 0em 0.8em !important; + font-size: 1em !important; + position: static !important; + width: auto !important; + height: auto !important; + + span { + display: inline !important; + margin-right: 1em !important; + + a { + padding: 0 !important; + display: none !important; + &.expandSource { display: inline !important; } + } + } + } + } + + // Styles for the toolbar + .toolbar { + position: absolute !important; + right: 1px !important; + top: 1px !important; + width: 11px !important; + height: 11px !important; + font-size: 10px !important; + z-index: 10 !important; + + span.title { display: inline !important; } + + a { + display: block !important; + text-align: center !important; + text-decoration: none !important; + padding-top: 1px !important; + + &.expandSource { display: none !important; } + } + } + + &.ie { + font-size: .9em !important; + padding: 1px 0 1px 0 !important; + + .toolbar { + line-height: 8px !important; + a { + padding-top: 0px !important; + } + } + } + + // Print view. + // Colors are based on the default theme without background. + &.printing { + .line.alt1 .content, + .line.alt2 .content, + .line.highlighted .number, + .line.highlighted.alt1 .content, + .line.highlighted.alt2 .content { background: none !important; } + + // Gutter line numbers + .line { + .number { color: #bbbbbb !important; } + // Add border to the lines + .content { color: black !important; } + } + + // Toolbar when visible + .toolbar { display: none !important; } + a { text-decoration: none !important; } + .plain, .plain a { color: black !important; } + .comments, .comments a { color: #008200 !important; } + .string, .string a { color: blue !important; } + .keyword { + color: #006699 !important; + font-weight: bold !important; + } + .preprocessor { color: gray !important; } + .variable { color: #aa7700 !important; } + .value { color: #009900 !important; } + .functions { color: #ff1493 !important; } + .constants { color: #0066cc !important; } + .script { font-weight: bold !important; } + .color1, .color1 a { color: gray !important; } + .color2, .color2 a { color: #ff1493 !important; } + .color3, .color3 a { color: red !important; } + .break, .break a { color: black !important; } + } +} \ No newline at end of file diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/compass/shCoreDefault.scss b/tests/siesta/resources/syntaxhighlighter_3.0.83/compass/shCoreDefault.scss new file mode 100644 index 0000000..ff80c7f --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/compass/shCoreDefault.scss @@ -0,0 +1,2 @@ +@import "shCore.scss"; +@import "shThemeDefault.scss"; diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/compass/shCoreDjango.scss b/tests/siesta/resources/syntaxhighlighter_3.0.83/compass/shCoreDjango.scss new file mode 100644 index 0000000..ef572e9 --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/compass/shCoreDjango.scss @@ -0,0 +1,2 @@ +@import "shCore.scss"; +@import "shThemeDjango.scss"; diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/compass/shCoreEclipse.scss b/tests/siesta/resources/syntaxhighlighter_3.0.83/compass/shCoreEclipse.scss new file mode 100644 index 0000000..9767f53 --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/compass/shCoreEclipse.scss @@ -0,0 +1,2 @@ +@import "shCore.scss"; +@import "shThemeEclipse.scss"; diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/compass/shCoreEmacs.scss b/tests/siesta/resources/syntaxhighlighter_3.0.83/compass/shCoreEmacs.scss new file mode 100644 index 0000000..5e466f3 --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/compass/shCoreEmacs.scss @@ -0,0 +1,2 @@ +@import "shCore.scss"; +@import "shThemeEmacs.scss"; diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/compass/shCoreFadeToGrey.scss b/tests/siesta/resources/syntaxhighlighter_3.0.83/compass/shCoreFadeToGrey.scss new file mode 100644 index 0000000..4628595 --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/compass/shCoreFadeToGrey.scss @@ -0,0 +1,2 @@ +@import "shCore.scss"; +@import "shThemeFadeToGrey.scss"; diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/compass/shCoreMDUltra.scss b/tests/siesta/resources/syntaxhighlighter_3.0.83/compass/shCoreMDUltra.scss new file mode 100644 index 0000000..10ad4c5 --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/compass/shCoreMDUltra.scss @@ -0,0 +1,2 @@ +@import "shCore.scss"; +@import "shThemeMDUltra.scss"; diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/compass/shCoreMidnight.scss b/tests/siesta/resources/syntaxhighlighter_3.0.83/compass/shCoreMidnight.scss new file mode 100644 index 0000000..e357eb2 --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/compass/shCoreMidnight.scss @@ -0,0 +1,2 @@ +@import "shCore.scss"; +@import "shThemeMidnight.scss"; diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/compass/shCoreRDark.scss b/tests/siesta/resources/syntaxhighlighter_3.0.83/compass/shCoreRDark.scss new file mode 100644 index 0000000..5c26da3 --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/compass/shCoreRDark.scss @@ -0,0 +1,2 @@ +@import "shCore.scss"; +@import "shThemeRDark.scss"; diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/compass/shThemeDefault.scss b/tests/siesta/resources/syntaxhighlighter_3.0.83/compass/shThemeDefault.scss new file mode 100644 index 0000000..1574dae --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/compass/shThemeDefault.scss @@ -0,0 +1,7 @@ +// Default Syntax Highlighter theme. + +@import "_theme_template.scss"; + +.syntaxhighlighter { + .keyword { font-weight: bold !important; } +} diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/compass/shThemeDjango.scss b/tests/siesta/resources/syntaxhighlighter_3.0.83/compass/shThemeDjango.scss new file mode 100644 index 0000000..8e95c56 --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/compass/shThemeDjango.scss @@ -0,0 +1,36 @@ +// Django SyntaxHighlighter theme + +$background: #0a2b1d !default; + +$line_highlighted_background: #233729 !default; +$line_highlighted_number: white !default; + +$gutter_text: #497958 !default; +$gutter_border_color: #41a83e !default; + +$toolbar_collapsed_a: #96dd3b !default; +$toolbar_collapsed_a_hover: #fff !default; +$toolbar_collapsed_background: #000 !default; + +$toolbar_a: #fff !default; +$toolbar_a_hover: #ffe862 !default; + +$code_plain: #f8f8f8 !default; +$code_comments: #336442 !default; +$code_string: #9df39f !default; +$code_keyword: #96dd3b !default; +$code_preprocessor: #91bb9e !default; +$code_variable: #ffaa3e !default; +$code_value: #f7e741 !default; +$code_functions: #ffaa3e !default; +$code_constants: #e0e8ff !default; +$code_color1: #eb939a !default; +$code_color2: #91bb9e !default; +$code_color3: #edef7d !default; + +@import "_theme_template.scss"; + +.syntaxhighlighter { + .comments { font-style: italic !important; } + .keyword { font-weight: bold !important; } +} diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/compass/shThemeEclipse.scss b/tests/siesta/resources/syntaxhighlighter_3.0.83/compass/shThemeEclipse.scss new file mode 100644 index 0000000..193fb1d --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/compass/shThemeEclipse.scss @@ -0,0 +1,48 @@ +// Eclipse IDE SyntaxHighlighter color theme +// (C) Code-House +// :http//blog.code-house.org/2009/10/xml-i-adnotacje-kod-ogolnego-przeznaczenia-i-jpa/ + +$background: #fff !default; + +$line_highlighted_background: #c3defe !default; +$line_highlighted_number: #fff !default; + +$gutter_text: #787878 !default; +$gutter_border_color: #d4d0c8 !default; + +$toolbar_collapsed_a: #3f5fbf !default; +$toolbar_collapsed_a_hover: #aa7700 !default; +$toolbar_collapsed_background: #fff !default; + +$toolbar_a: #a0a0a0 !default; +$toolbar_a_hover: red !default; + +$code_plain: black !default; +$code_comments: #3f5fbf !default; +$code_string: #2a00ff !default; +$code_keyword: #7f0055 !default; +$code_preprocessor: #646464 !default; +$code_variable: #aa7700 !default; +$code_value: #009900 !default; +$code_functions: #ff1493 !default; +$code_constants: #0066cc !default; +$code_color1: gray !default; +$code_color2: #ff1493 !default; +$code_color3: red !default; + +@import "_theme_template.scss"; + +.syntaxhighlighter { + .keyword { font-weight: bold !important; } + + .xml { + .keyword { + color: #3f7f7f !important; + font-weight: normal !important; } + .color1, .color1 a { color: #7f007f !important; } + .string { + font-style: italic !important; + color: #2a00ff !important; + } + } +} diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/compass/shThemeEmacs.scss b/tests/siesta/resources/syntaxhighlighter_3.0.83/compass/shThemeEmacs.scss new file mode 100644 index 0000000..11c9deb --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/compass/shThemeEmacs.scss @@ -0,0 +1,32 @@ +// Emacs SyntaxHighlighter theme based on theme by Joshua Emmons +// http://www.skia.net/ + +$background: black !default; + +$line_highlighted_background: #2A3133 !default; +$line_highlighted_number: white !default; + +$gutter_text: #d3d3d3 !default; +$gutter_border_color: #990000 !default; + +$toolbar_collapsed_a: #ebdb8d !default; +$toolbar_collapsed_a_hover: #ff7d27 !default; +$toolbar_collapsed_background: black !default; + +$toolbar_a: #fff !default; +$toolbar_a_hover: #9ccff4 !default; + +$code_plain: #d3d3d3 !default; +$code_comments: #ff7d27 !default; +$code_string: #ff9e7b !default; +$code_keyword: aqua !default; +$code_preprocessor: #aec4de !default; +$code_variable: #ffaa3e !default; +$code_value: #009900 !default; +$code_functions: #81cef9 !default; +$code_constants: #ff9e7b !default; +$code_color1: #ebdb8d !default; +$code_color2: #ff7d27 !default; +$code_color3: #aec4de !default; + +@import "_theme_template.scss"; diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/compass/shThemeFadeToGrey.scss b/tests/siesta/resources/syntaxhighlighter_3.0.83/compass/shThemeFadeToGrey.scss new file mode 100644 index 0000000..7963814 --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/compass/shThemeFadeToGrey.scss @@ -0,0 +1,36 @@ +// Fade to Grey SyntaxHighlighter theme based on theme by Brasten Sager +// :http//www.ibrasten.com/ + +$background: #121212 !default; + +$line_highlighted_background: #2C2C29 !default; +$line_highlighted_number: white !default; + +$gutter_text: #afafaf !default; +$gutter_border_color: #3185b9 !default; + +$toolbar_collapsed_a: #3185b9 !default; +$toolbar_collapsed_a_hover: #d01d33 !default; +$toolbar_collapsed_background: black !default; + +$toolbar_a: #fff !default; +$toolbar_a_hover: #96daff !default; + +$code_plain: white !default; +$code_comments: #696854 !default; +$code_string: #e3e658 !default; +$code_keyword: #d01d33 !default; +$code_preprocessor: #435a5f !default; +$code_variable: #898989 !default; +$code_value: #009900 !default; +$code_functions: #aaaaaa !default; +$code_constants: #96daff !default; +$code_color1: #ffc074 !default; +$code_color2: #4a8cdb !default; +$code_color3: #96daff !default; + +@import "_theme_template.scss"; + +.syntaxhighlighter { + .functions { font-weight: bold !important; } +} diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/compass/shThemeMDUltra.scss b/tests/siesta/resources/syntaxhighlighter_3.0.83/compass/shThemeMDUltra.scss new file mode 100644 index 0000000..0356fa6 --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/compass/shThemeMDUltra.scss @@ -0,0 +1,32 @@ +// MDUltra SyntaxHighlighter theme based on Midnight Theme +// http://www.mddev.co.uk/ + +$background: #222222 !default; + +$line_highlighted_background: #253e5a !default; +$line_highlighted_number: white !default; + +$gutter_text: #38566f !default; +$gutter_border_color: #435a5f !default; + +$toolbar_collapsed_a: #428bdd !default; +$toolbar_collapsed_a_hover: lime !default; +$toolbar_collapsed_background: black !default; + +$toolbar_a: #aaaaff !default; +$toolbar_a_hover: #9ccff4 !default; + +$code_plain: lime !default; +$code_comments: #428bdd !default; +$code_string: lime !default; +$code_keyword: #aaaaff !default; +$code_preprocessor: #8aa6c1 !default; +$code_variable: aqua !default; +$code_value: #f7e741 !default; +$code_functions: #ff8000 !default; +$code_constants: yellow !default; +$code_color1: red !default; +$code_color2: yellow !default; +$code_color3: #ffaa3e !default; + +@import "_theme_template.scss"; diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/compass/shThemeMidnight.scss b/tests/siesta/resources/syntaxhighlighter_3.0.83/compass/shThemeMidnight.scss new file mode 100644 index 0000000..a4dae02 --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/compass/shThemeMidnight.scss @@ -0,0 +1,32 @@ +// Midnight SyntaxHighlighter theme based on theme by J.D. Myers +// http://webdesign.lsnjd.com/ + +$background: #0f192a !default; + +$line_highlighted_background: #253e5a !default; +$line_highlighted_number: #38566f !default; + +$gutter_text: #afafaf !default; +$gutter_border_color: #435a5f !default; + +$toolbar_collapsed_a: #428bdd !default; +$toolbar_collapsed_a_hover: #1dc116 !default; +$toolbar_collapsed_background: #000 !default; + +$toolbar_a: #D1EDFF !default; +$toolbar_a_hover: #8aa6c1 !default; + +$code_plain: #d1edff !default; +$code_comments: #428bdd !default; +$code_string: #1dc116 !default; +$code_keyword: #b43d3d !default; +$code_preprocessor: #8aa6c1 !default; +$code_variable: #ffaa3e !default; +$code_value: #f7e741 !default; +$code_functions: #ffaa3e !default; +$code_constants: #e0e8ff !default; +$code_color1: #f8bb00 !default; +$code_color2: white !default; +$code_color3: #ffaa3e !default; + +@import "_theme_template.scss"; diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/compass/shThemeRDark.scss b/tests/siesta/resources/syntaxhighlighter_3.0.83/compass/shThemeRDark.scss new file mode 100644 index 0000000..3b67b15 --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/compass/shThemeRDark.scss @@ -0,0 +1,32 @@ +// RDark SyntaxHighlighter theme based on theme by Radu Dineiu +// http://www.vim.org/scripts/script.php?script_id=1732 + +$background: #1b2426 !default; + +$line_highlighted_background: #323E41 !default; +$line_highlighted_number: #b9bdb6 !default; + +$gutter_text: #afafaf !default; +$gutter_border_color: #435a5f !default; + +$toolbar_collapsed_a: #5ba1cf !default; +$toolbar_collapsed_a_hover: #5ce638 !default; +$toolbar_collapsed_background: #000 !default; + +$toolbar_a: #fff !default; +$toolbar_a_hover: #e0e8ff !default; + +$code_plain: #b9bdb6 !default; +$code_comments: #878a85 !default; +$code_string: #5ce638 !default; +$code_keyword: #5ba1cf !default; +$code_preprocessor: #435a5f !default; +$code_variable: #ffaa3e !default; +$code_value: #009900 !default; +$code_functions: #ffaa3e !default; +$code_constants: #e0e8ff !default; +$code_color1: #e0e8ff !default; +$code_color2: white !default; +$code_color3: #ffaa3e !default; + +@import "_theme_template.scss"; diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/index.html b/tests/siesta/resources/syntaxhighlighter_3.0.83/index.html new file mode 100644 index 0000000..60908f4 --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/index.html @@ -0,0 +1,22 @@ + + + + + Hello SyntaxHighlighter + + + + + + + + +

Hello SyntaxHighlighter

+
+function helloSyntaxHighlighter()
+{
+	return "hi!";
+}
+
+ + diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shAutoloader.js b/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shAutoloader.js new file mode 100644 index 0000000..4e29bdd --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shAutoloader.js @@ -0,0 +1,17 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +eval(function(p,a,c,k,e,d){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('(2(){1 h=5;h.I=2(){2 n(c,a){4(1 d=0;d|<|≥|>=|≤|<=|\*|\+|-|\/|÷|\^)/g, + css: 'color2' }, + + { regex: /\b(?:and|as|div|mod|not|or|return(?!\s&)(ing)?|equals|(is(n't| not)? )?equal( to)?|does(n't| not) equal|(is(n't| not)? )?(greater|less) than( or equal( to)?)?|(comes|does(n't| not) come) (after|before)|is(n't| not)?( in)? (back|front) of|is(n't| not)? behind|is(n't| not)?( (in|contained by))?|does(n't| not) contain|contain(s)?|(start|begin|end)(s)? with|((but|end) )?(consider|ignor)ing|prop(erty)?|(a )?ref(erence)?( to)?|repeat (until|while|with)|((end|exit) )?repeat|((else|end) )?if|else|(end )?(script|tell|try)|(on )?error|(put )?into|(of )?(it|me)|its|my|with (timeout( of)?|transaction)|end (timeout|transaction))\b/g, + css: 'keyword' }, + + { regex: /\b\d+(st|nd|rd|th)\b/g, // ordinals + css: 'keyword' }, + + { regex: /\b(?:about|above|against|around|at|below|beneath|beside|between|by|(apart|aside) from|(instead|out) of|into|on(to)?|over|since|thr(ough|u)|under)\b/g, + css: 'color3' }, + + { regex: /\b(?:adding folder items to|after receiving|choose( ((remote )?application|color|folder|from list|URL))?|clipboard info|set the clipboard to|(the )?clipboard|entire contents|display(ing| (alert|dialog|mode))?|document( (edited|file|nib name))?|file( (name|type))?|(info )?for|giving up after|(name )?extension|quoted form|return(ed)?|second(?! item)(s)?|list (disks|folder)|text item(s| delimiters)?|(Unicode )?text|(disk )?item(s)?|((current|list) )?view|((container|key) )?window|with (data|icon( (caution|note|stop))?|parameter(s)?|prompt|properties|seed|title)|case|diacriticals|hyphens|numeric strings|punctuation|white space|folder creation|application(s( folder)?| (processes|scripts position|support))?|((desktop )?(pictures )?|(documents|downloads|favorites|home|keychain|library|movies|music|public|scripts|sites|system|users|utilities|workflows) )folder|desktop|Folder Action scripts|font(s| panel)?|help|internet plugins|modem scripts|(system )?preferences|printer descriptions|scripting (additions|components)|shared (documents|libraries)|startup (disk|items)|temporary items|trash|on server|in AppleTalk zone|((as|long|short) )?user name|user (ID|locale)|(with )?password|in (bundle( with identifier)?|directory)|(close|open for) access|read|write( permission)?|(g|s)et eof|using( delimiters)?|starting at|default (answer|button|color|country code|entr(y|ies)|identifiers|items|name|location|script editor)|hidden( answer)?|open(ed| (location|untitled))?|error (handling|reporting)|(do( shell)?|load|run|store) script|administrator privileges|altering line endings|get volume settings|(alert|boot|input|mount|output|set) volume|output muted|(fax|random )?number|round(ing)?|up|down|toward zero|to nearest|as taught in school|system (attribute|info)|((AppleScript( Studio)?|system) )?version|(home )?directory|(IPv4|primary Ethernet) address|CPU (type|speed)|physical memory|time (stamp|to GMT)|replacing|ASCII (character|number)|localized string|from table|offset|summarize|beep|delay|say|(empty|multiple) selections allowed|(of|preferred) type|invisibles|showing( package contents)?|editable URL|(File|FTP|News|Media|Web) [Ss]ervers|Telnet hosts|Directory services|Remote applications|waiting until completion|saving( (in|to))?|path (for|to( (((current|frontmost) )?application|resource))?)|POSIX (file|path)|(background|RGB) color|(OK|cancel) button name|cancel button|button(s)?|cubic ((centi)?met(re|er)s|yards|feet|inches)|square ((kilo)?met(re|er)s|miles|yards|feet)|(centi|kilo)?met(re|er)s|miles|yards|feet|inches|lit(re|er)s|gallons|quarts|(kilo)?grams|ounces|pounds|degrees (Celsius|Fahrenheit|Kelvin)|print( (dialog|settings))?|clos(e(able)?|ing)|(de)?miniaturized|miniaturizable|zoom(ed|able)|attribute run|action (method|property|title)|phone|email|((start|end)ing|home) page|((birth|creation|current|custom|modification) )?date|((((phonetic )?(first|last|middle))|computer|host|maiden|related) |nick)?name|aim|icq|jabber|msn|yahoo|address(es)?|save addressbook|should enable action|city|country( code)?|formatte(r|d address)|(palette )?label|state|street|zip|AIM [Hh]andle(s)?|my card|select(ion| all)?|unsaved|(alpha )?value|entr(y|ies)|group|(ICQ|Jabber|MSN) handle|person|people|company|department|icon image|job title|note|organization|suffix|vcard|url|copies|collating|pages (across|down)|request print time|target( printer)?|((GUI Scripting|Script menu) )?enabled|show Computer scripts|(de)?activated|awake from nib|became (key|main)|call method|of (class|object)|center|clicked toolbar item|closed|for document|exposed|(can )?hide|idle|keyboard (down|up)|event( (number|type))?|launch(ed)?|load (image|movie|nib|sound)|owner|log|mouse (down|dragged|entered|exited|moved|up)|move|column|localization|resource|script|register|drag (info|types)|resigned (active|key|main)|resiz(e(d)?|able)|right mouse (down|dragged|up)|scroll wheel|(at )?index|should (close|open( untitled)?|quit( after last window closed)?|zoom)|((proposed|screen) )?bounds|show(n)?|behind|in front of|size (mode|to fit)|update(d| toolbar item)?|was (hidden|miniaturized)|will (become active|close|finish launching|hide|miniaturize|move|open|quit|(resign )?active|((maximum|minimum|proposed) )?size|show|zoom)|bundle|data source|movie|pasteboard|sound|tool(bar| tip)|(color|open|save) panel|coordinate system|frontmost|main( (bundle|menu|window))?|((services|(excluded from )?windows) )?menu|((executable|frameworks|resource|scripts|shared (frameworks|support)) )?path|(selected item )?identifier|data|content(s| view)?|character(s)?|click count|(command|control|option|shift) key down|context|delta (x|y|z)|key( code)?|location|pressure|unmodified characters|types|(first )?responder|playing|(allowed|selectable) identifiers|allows customization|(auto saves )?configuration|visible|image( name)?|menu form representation|tag|user(-| )defaults|associated file name|(auto|needs) display|current field editor|floating|has (resize indicator|shadow)|hides when deactivated|level|minimized (image|title)|opaque|position|release when closed|sheet|title(d)?)\b/g, + css: 'color3' }, + + { regex: new RegExp(this.getKeywords(specials), 'gm'), css: 'color3' }, + { regex: new RegExp(this.getKeywords(keywords), 'gm'), css: 'keyword' }, + { regex: new RegExp(this.getKeywords(ordinals), 'gm'), css: 'keyword' } + ]; + }; + + Brush.prototype = new SyntaxHighlighter.Highlighter(); + Brush.aliases = ['applescript']; + + SyntaxHighlighter.brushes.AppleScript = Brush; + + // CommonJS + typeof(exports) != 'undefined' ? exports.Brush = Brush : null; +})(); diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushBash.js b/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushBash.js new file mode 100644 index 0000000..8c29696 --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushBash.js @@ -0,0 +1,59 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +;(function() +{ + // CommonJS + typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null; + + function Brush() + { + var keywords = 'if fi then elif else for do done until while break continue case function return in eq ne ge le'; + var commands = 'alias apropos awk basename bash bc bg builtin bzip2 cal cat cd cfdisk chgrp chmod chown chroot' + + 'cksum clear cmp comm command cp cron crontab csplit cut date dc dd ddrescue declare df ' + + 'diff diff3 dig dir dircolors dirname dirs du echo egrep eject enable env ethtool eval ' + + 'exec exit expand export expr false fdformat fdisk fg fgrep file find fmt fold format ' + + 'free fsck ftp gawk getopts grep groups gzip hash head history hostname id ifconfig ' + + 'import install join kill less let ln local locate logname logout look lpc lpr lprint ' + + 'lprintd lprintq lprm ls lsof make man mkdir mkfifo mkisofs mknod more mount mtools ' + + 'mv netstat nice nl nohup nslookup open op passwd paste pathchk ping popd pr printcap ' + + 'printenv printf ps pushd pwd quota quotacheck quotactl ram rcp read readonly renice ' + + 'remsync rm rmdir rsync screen scp sdiff sed select seq set sftp shift shopt shutdown ' + + 'sleep sort source split ssh strace su sudo sum symlink sync tail tar tee test time ' + + 'times touch top traceroute trap tr true tsort tty type ulimit umask umount unalias ' + + 'uname unexpand uniq units unset unshar useradd usermod users uuencode uudecode v vdir ' + + 'vi watch wc whereis which who whoami Wget xargs yes' + ; + + this.regexList = [ + { regex: /^#!.*$/gm, css: 'preprocessor bold' }, + { regex: /\/[\w-\/]+/gm, css: 'plain' }, + { regex: SyntaxHighlighter.regexLib.singleLinePerlComments, css: 'comments' }, // one line comments + { regex: SyntaxHighlighter.regexLib.doubleQuotedString, css: 'string' }, // double quoted strings + { regex: SyntaxHighlighter.regexLib.singleQuotedString, css: 'string' }, // single quoted strings + { regex: new RegExp(this.getKeywords(keywords), 'gm'), css: 'keyword' }, // keywords + { regex: new RegExp(this.getKeywords(commands), 'gm'), css: 'functions' } // commands + ]; + } + + Brush.prototype = new SyntaxHighlighter.Highlighter(); + Brush.aliases = ['bash', 'shell']; + + SyntaxHighlighter.brushes.Bash = Brush; + + // CommonJS + typeof(exports) != 'undefined' ? exports.Brush = Brush : null; +})(); diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushCSharp.js b/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushCSharp.js new file mode 100644 index 0000000..079214e --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushCSharp.js @@ -0,0 +1,65 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +;(function() +{ + // CommonJS + typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null; + + function Brush() + { + var keywords = 'abstract as base bool break byte case catch char checked class const ' + + 'continue decimal default delegate do double else enum event explicit ' + + 'extern false finally fixed float for foreach get goto if implicit in int ' + + 'interface internal is lock long namespace new null object operator out ' + + 'override params private protected public readonly ref return sbyte sealed set ' + + 'short sizeof stackalloc static string struct switch this throw true try ' + + 'typeof uint ulong unchecked unsafe ushort using virtual void while'; + + function fixComments(match, regexInfo) + { + var css = (match[0].indexOf("///") == 0) + ? 'color1' + : 'comments' + ; + + return [new SyntaxHighlighter.Match(match[0], match.index, css)]; + } + + this.regexList = [ + { regex: SyntaxHighlighter.regexLib.singleLineCComments, func : fixComments }, // one line comments + { regex: SyntaxHighlighter.regexLib.multiLineCComments, css: 'comments' }, // multiline comments + { regex: /@"(?:[^"]|"")*"/g, css: 'string' }, // @-quoted strings + { regex: SyntaxHighlighter.regexLib.doubleQuotedString, css: 'string' }, // strings + { regex: SyntaxHighlighter.regexLib.singleQuotedString, css: 'string' }, // strings + { regex: /^\s*#.*/gm, css: 'preprocessor' }, // preprocessor tags like #region and #endregion + { regex: new RegExp(this.getKeywords(keywords), 'gm'), css: 'keyword' }, // c# keyword + { regex: /\bpartial(?=\s+(?:class|interface|struct)\b)/g, css: 'keyword' }, // contextual keyword: 'partial' + { regex: /\byield(?=\s+(?:return|break)\b)/g, css: 'keyword' } // contextual keyword: 'yield' + ]; + + this.forHtmlScript(SyntaxHighlighter.regexLib.aspScriptTags); + }; + + Brush.prototype = new SyntaxHighlighter.Highlighter(); + Brush.aliases = ['c#', 'c-sharp', 'csharp']; + + SyntaxHighlighter.brushes.CSharp = Brush; + + // CommonJS + typeof(exports) != 'undefined' ? exports.Brush = Brush : null; +})(); + diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushColdFusion.js b/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushColdFusion.js new file mode 100644 index 0000000..627dbb9 --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushColdFusion.js @@ -0,0 +1,100 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +;(function() +{ + // CommonJS + typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null; + + function Brush() + { + // Contributed by Jen + // http://www.jensbits.com/2009/05/14/coldfusion-brush-for-syntaxhighlighter-plus + + var funcs = 'Abs ACos AddSOAPRequestHeader AddSOAPResponseHeader AjaxLink AjaxOnLoad ArrayAppend ArrayAvg ArrayClear ArrayDeleteAt ' + + 'ArrayInsertAt ArrayIsDefined ArrayIsEmpty ArrayLen ArrayMax ArrayMin ArraySet ArraySort ArraySum ArraySwap ArrayToList ' + + 'Asc ASin Atn BinaryDecode BinaryEncode BitAnd BitMaskClear BitMaskRead BitMaskSet BitNot BitOr BitSHLN BitSHRN BitXor ' + + 'Ceiling CharsetDecode CharsetEncode Chr CJustify Compare CompareNoCase Cos CreateDate CreateDateTime CreateObject ' + + 'CreateODBCDate CreateODBCDateTime CreateODBCTime CreateTime CreateTimeSpan CreateUUID DateAdd DateCompare DateConvert ' + + 'DateDiff DateFormat DatePart Day DayOfWeek DayOfWeekAsString DayOfYear DaysInMonth DaysInYear DE DecimalFormat DecrementValue ' + + 'Decrypt DecryptBinary DeleteClientVariable DeserializeJSON DirectoryExists DollarFormat DotNetToCFType Duplicate Encrypt ' + + 'EncryptBinary Evaluate Exp ExpandPath FileClose FileCopy FileDelete FileExists FileIsEOF FileMove FileOpen FileRead ' + + 'FileReadBinary FileReadLine FileSetAccessMode FileSetAttribute FileSetLastModified FileWrite Find FindNoCase FindOneOf ' + + 'FirstDayOfMonth Fix FormatBaseN GenerateSecretKey GetAuthUser GetBaseTagData GetBaseTagList GetBaseTemplatePath ' + + 'GetClientVariablesList GetComponentMetaData GetContextRoot GetCurrentTemplatePath GetDirectoryFromPath GetEncoding ' + + 'GetException GetFileFromPath GetFileInfo GetFunctionList GetGatewayHelper GetHttpRequestData GetHttpTimeString ' + + 'GetK2ServerDocCount GetK2ServerDocCountLimit GetLocale GetLocaleDisplayName GetLocalHostIP GetMetaData GetMetricData ' + + 'GetPageContext GetPrinterInfo GetProfileSections GetProfileString GetReadableImageFormats GetSOAPRequest GetSOAPRequestHeader ' + + 'GetSOAPResponse GetSOAPResponseHeader GetTempDirectory GetTempFile GetTemplatePath GetTickCount GetTimeZoneInfo GetToken ' + + 'GetUserRoles GetWriteableImageFormats Hash Hour HTMLCodeFormat HTMLEditFormat IIf ImageAddBorder ImageBlur ImageClearRect ' + + 'ImageCopy ImageCrop ImageDrawArc ImageDrawBeveledRect ImageDrawCubicCurve ImageDrawLine ImageDrawLines ImageDrawOval ' + + 'ImageDrawPoint ImageDrawQuadraticCurve ImageDrawRect ImageDrawRoundRect ImageDrawText ImageFlip ImageGetBlob ImageGetBufferedImage ' + + 'ImageGetEXIFTag ImageGetHeight ImageGetIPTCTag ImageGetWidth ImageGrayscale ImageInfo ImageNegative ImageNew ImageOverlay ImagePaste ' + + 'ImageRead ImageReadBase64 ImageResize ImageRotate ImageRotateDrawingAxis ImageScaleToFit ImageSetAntialiasing ImageSetBackgroundColor ' + + 'ImageSetDrawingColor ImageSetDrawingStroke ImageSetDrawingTransparency ImageSharpen ImageShear ImageShearDrawingAxis ImageTranslate ' + + 'ImageTranslateDrawingAxis ImageWrite ImageWriteBase64 ImageXORDrawingMode IncrementValue InputBaseN Insert Int IsArray IsBinary ' + + 'IsBoolean IsCustomFunction IsDate IsDDX IsDebugMode IsDefined IsImage IsImageFile IsInstanceOf IsJSON IsLeapYear IsLocalHost ' + + 'IsNumeric IsNumericDate IsObject IsPDFFile IsPDFObject IsQuery IsSimpleValue IsSOAPRequest IsStruct IsUserInAnyRole IsUserInRole ' + + 'IsUserLoggedIn IsValid IsWDDX IsXML IsXmlAttribute IsXmlDoc IsXmlElem IsXmlNode IsXmlRoot JavaCast JSStringFormat LCase Left Len ' + + 'ListAppend ListChangeDelims ListContains ListContainsNoCase ListDeleteAt ListFind ListFindNoCase ListFirst ListGetAt ListInsertAt ' + + 'ListLast ListLen ListPrepend ListQualify ListRest ListSetAt ListSort ListToArray ListValueCount ListValueCountNoCase LJustify Log ' + + 'Log10 LSCurrencyFormat LSDateFormat LSEuroCurrencyFormat LSIsCurrency LSIsDate LSIsNumeric LSNumberFormat LSParseCurrency LSParseDateTime ' + + 'LSParseEuroCurrency LSParseNumber LSTimeFormat LTrim Max Mid Min Minute Month MonthAsString Now NumberFormat ParagraphFormat ParseDateTime ' + + 'Pi PrecisionEvaluate PreserveSingleQuotes Quarter QueryAddColumn QueryAddRow QueryConvertForGrid QueryNew QuerySetCell QuotedValueList Rand ' + + 'Randomize RandRange REFind REFindNoCase ReleaseComObject REMatch REMatchNoCase RemoveChars RepeatString Replace ReplaceList ReplaceNoCase ' + + 'REReplace REReplaceNoCase Reverse Right RJustify Round RTrim Second SendGatewayMessage SerializeJSON SetEncoding SetLocale SetProfileString ' + + 'SetVariable Sgn Sin Sleep SpanExcluding SpanIncluding Sqr StripCR StructAppend StructClear StructCopy StructCount StructDelete StructFind ' + + 'StructFindKey StructFindValue StructGet StructInsert StructIsEmpty StructKeyArray StructKeyExists StructKeyList StructKeyList StructNew ' + + 'StructSort StructUpdate Tan TimeFormat ToBase64 ToBinary ToScript ToString Trim UCase URLDecode URLEncodedFormat URLSessionFormat Val ' + + 'ValueList VerifyClient Week Wrap Wrap WriteOutput XmlChildPos XmlElemNew XmlFormat XmlGetNodeType XmlNew XmlParse XmlSearch XmlTransform ' + + 'XmlValidate Year YesNoFormat'; + + var keywords = 'cfabort cfajaximport cfajaxproxy cfapplet cfapplication cfargument cfassociate cfbreak cfcache cfcalendar ' + + 'cfcase cfcatch cfchart cfchartdata cfchartseries cfcol cfcollection cfcomponent cfcontent cfcookie cfdbinfo ' + + 'cfdefaultcase cfdirectory cfdiv cfdocument cfdocumentitem cfdocumentsection cfdump cfelse cfelseif cferror ' + + 'cfexchangecalendar cfexchangeconnection cfexchangecontact cfexchangefilter cfexchangemail cfexchangetask ' + + 'cfexecute cfexit cffeed cffile cfflush cfform cfformgroup cfformitem cfftp cffunction cfgrid cfgridcolumn ' + + 'cfgridrow cfgridupdate cfheader cfhtmlhead cfhttp cfhttpparam cfif cfimage cfimport cfinclude cfindex ' + + 'cfinput cfinsert cfinterface cfinvoke cfinvokeargument cflayout cflayoutarea cfldap cflocation cflock cflog ' + + 'cflogin cfloginuser cflogout cfloop cfmail cfmailparam cfmailpart cfmenu cfmenuitem cfmodule cfNTauthenticate ' + + 'cfobject cfobjectcache cfoutput cfparam cfpdf cfpdfform cfpdfformparam cfpdfparam cfpdfsubform cfpod cfpop ' + + 'cfpresentation cfpresentationslide cfpresenter cfprint cfprocessingdirective cfprocparam cfprocresult ' + + 'cfproperty cfquery cfqueryparam cfregistry cfreport cfreportparam cfrethrow cfreturn cfsavecontent cfschedule ' + + 'cfscript cfsearch cfselect cfset cfsetting cfsilent cfslider cfsprydataset cfstoredproc cfswitch cftable ' + + 'cftextarea cfthread cfthrow cftimer cftooltip cftrace cftransaction cftree cftreeitem cftry cfupdate cfwddx ' + + 'cfwindow cfxml cfzip cfzipparam'; + + var operators = 'all and any between cross in join like not null or outer some'; + + this.regexList = [ + { regex: new RegExp('--(.*)$', 'gm'), css: 'comments' }, // one line and multiline comments + { regex: SyntaxHighlighter.regexLib.xmlComments, css: 'comments' }, // single quoted strings + { regex: SyntaxHighlighter.regexLib.doubleQuotedString, css: 'string' }, // double quoted strings + { regex: SyntaxHighlighter.regexLib.singleQuotedString, css: 'string' }, // single quoted strings + { regex: new RegExp(this.getKeywords(funcs), 'gmi'), css: 'functions' }, // functions + { regex: new RegExp(this.getKeywords(operators), 'gmi'), css: 'color1' }, // operators and such + { regex: new RegExp(this.getKeywords(keywords), 'gmi'), css: 'keyword' } // keyword + ]; + } + + Brush.prototype = new SyntaxHighlighter.Highlighter(); + Brush.aliases = ['coldfusion','cf']; + + SyntaxHighlighter.brushes.ColdFusion = Brush; + + // CommonJS + typeof(exports) != 'undefined' ? exports.Brush = Brush : null; +})(); diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushCpp.js b/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushCpp.js new file mode 100644 index 0000000..9f70d3a --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushCpp.js @@ -0,0 +1,97 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +;(function() +{ + // CommonJS + typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null; + + function Brush() + { + // Copyright 2006 Shin, YoungJin + + var datatypes = 'ATOM BOOL BOOLEAN BYTE CHAR COLORREF DWORD DWORDLONG DWORD_PTR ' + + 'DWORD32 DWORD64 FLOAT HACCEL HALF_PTR HANDLE HBITMAP HBRUSH ' + + 'HCOLORSPACE HCONV HCONVLIST HCURSOR HDC HDDEDATA HDESK HDROP HDWP ' + + 'HENHMETAFILE HFILE HFONT HGDIOBJ HGLOBAL HHOOK HICON HINSTANCE HKEY ' + + 'HKL HLOCAL HMENU HMETAFILE HMODULE HMONITOR HPALETTE HPEN HRESULT ' + + 'HRGN HRSRC HSZ HWINSTA HWND INT INT_PTR INT32 INT64 LANGID LCID LCTYPE ' + + 'LGRPID LONG LONGLONG LONG_PTR LONG32 LONG64 LPARAM LPBOOL LPBYTE LPCOLORREF ' + + 'LPCSTR LPCTSTR LPCVOID LPCWSTR LPDWORD LPHANDLE LPINT LPLONG LPSTR LPTSTR ' + + 'LPVOID LPWORD LPWSTR LRESULT PBOOL PBOOLEAN PBYTE PCHAR PCSTR PCTSTR PCWSTR ' + + 'PDWORDLONG PDWORD_PTR PDWORD32 PDWORD64 PFLOAT PHALF_PTR PHANDLE PHKEY PINT ' + + 'PINT_PTR PINT32 PINT64 PLCID PLONG PLONGLONG PLONG_PTR PLONG32 PLONG64 POINTER_32 ' + + 'POINTER_64 PSHORT PSIZE_T PSSIZE_T PSTR PTBYTE PTCHAR PTSTR PUCHAR PUHALF_PTR ' + + 'PUINT PUINT_PTR PUINT32 PUINT64 PULONG PULONGLONG PULONG_PTR PULONG32 PULONG64 ' + + 'PUSHORT PVOID PWCHAR PWORD PWSTR SC_HANDLE SC_LOCK SERVICE_STATUS_HANDLE SHORT ' + + 'SIZE_T SSIZE_T TBYTE TCHAR UCHAR UHALF_PTR UINT UINT_PTR UINT32 UINT64 ULONG ' + + 'ULONGLONG ULONG_PTR ULONG32 ULONG64 USHORT USN VOID WCHAR WORD WPARAM WPARAM WPARAM ' + + 'char bool short int __int32 __int64 __int8 __int16 long float double __wchar_t ' + + 'clock_t _complex _dev_t _diskfree_t div_t ldiv_t _exception _EXCEPTION_POINTERS ' + + 'FILE _finddata_t _finddatai64_t _wfinddata_t _wfinddatai64_t __finddata64_t ' + + '__wfinddata64_t _FPIEEE_RECORD fpos_t _HEAPINFO _HFILE lconv intptr_t ' + + 'jmp_buf mbstate_t _off_t _onexit_t _PNH ptrdiff_t _purecall_handler ' + + 'sig_atomic_t size_t _stat __stat64 _stati64 terminate_function ' + + 'time_t __time64_t _timeb __timeb64 tm uintptr_t _utimbuf ' + + 'va_list wchar_t wctrans_t wctype_t wint_t signed'; + + var keywords = 'break case catch class const __finally __exception __try ' + + 'const_cast continue private public protected __declspec ' + + 'default delete deprecated dllexport dllimport do dynamic_cast ' + + 'else enum explicit extern if for friend goto inline ' + + 'mutable naked namespace new noinline noreturn nothrow ' + + 'register reinterpret_cast return selectany ' + + 'sizeof static static_cast struct switch template this ' + + 'thread throw true false try typedef typeid typename union ' + + 'using uuid virtual void volatile whcar_t while'; + + var functions = 'assert isalnum isalpha iscntrl isdigit isgraph islower isprint' + + 'ispunct isspace isupper isxdigit tolower toupper errno localeconv ' + + 'setlocale acos asin atan atan2 ceil cos cosh exp fabs floor fmod ' + + 'frexp ldexp log log10 modf pow sin sinh sqrt tan tanh jmp_buf ' + + 'longjmp setjmp raise signal sig_atomic_t va_arg va_end va_start ' + + 'clearerr fclose feof ferror fflush fgetc fgetpos fgets fopen ' + + 'fprintf fputc fputs fread freopen fscanf fseek fsetpos ftell ' + + 'fwrite getc getchar gets perror printf putc putchar puts remove ' + + 'rename rewind scanf setbuf setvbuf sprintf sscanf tmpfile tmpnam ' + + 'ungetc vfprintf vprintf vsprintf abort abs atexit atof atoi atol ' + + 'bsearch calloc div exit free getenv labs ldiv malloc mblen mbstowcs ' + + 'mbtowc qsort rand realloc srand strtod strtol strtoul system ' + + 'wcstombs wctomb memchr memcmp memcpy memmove memset strcat strchr ' + + 'strcmp strcoll strcpy strcspn strerror strlen strncat strncmp ' + + 'strncpy strpbrk strrchr strspn strstr strtok strxfrm asctime ' + + 'clock ctime difftime gmtime localtime mktime strftime time'; + + this.regexList = [ + { regex: SyntaxHighlighter.regexLib.singleLineCComments, css: 'comments' }, // one line comments + { regex: SyntaxHighlighter.regexLib.multiLineCComments, css: 'comments' }, // multiline comments + { regex: SyntaxHighlighter.regexLib.doubleQuotedString, css: 'string' }, // strings + { regex: SyntaxHighlighter.regexLib.singleQuotedString, css: 'string' }, // strings + { regex: /^ *#.*/gm, css: 'preprocessor' }, + { regex: new RegExp(this.getKeywords(datatypes), 'gm'), css: 'color1 bold' }, + { regex: new RegExp(this.getKeywords(functions), 'gm'), css: 'functions bold' }, + { regex: new RegExp(this.getKeywords(keywords), 'gm'), css: 'keyword bold' } + ]; + }; + + Brush.prototype = new SyntaxHighlighter.Highlighter(); + Brush.aliases = ['cpp', 'c']; + + SyntaxHighlighter.brushes.Cpp = Brush; + + // CommonJS + typeof(exports) != 'undefined' ? exports.Brush = Brush : null; +})(); diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushCss.js b/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushCss.js new file mode 100644 index 0000000..4297a9a --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushCss.js @@ -0,0 +1,91 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +;(function() +{ + // CommonJS + typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null; + + function Brush() + { + function getKeywordsCSS(str) + { + return '\\b([a-z_]|)' + str.replace(/ /g, '(?=:)\\b|\\b([a-z_\\*]|\\*|)') + '(?=:)\\b'; + }; + + function getValuesCSS(str) + { + return '\\b' + str.replace(/ /g, '(?!-)(?!:)\\b|\\b()') + '\:\\b'; + }; + + var keywords = 'ascent azimuth background-attachment background-color background-image background-position ' + + 'background-repeat background baseline bbox border-collapse border-color border-spacing border-style border-top ' + + 'border-right border-bottom border-left border-top-color border-right-color border-bottom-color border-left-color ' + + 'border-top-style border-right-style border-bottom-style border-left-style border-top-width border-right-width ' + + 'border-bottom-width border-left-width border-width border bottom cap-height caption-side centerline clear clip color ' + + 'content counter-increment counter-reset cue-after cue-before cue cursor definition-src descent direction display ' + + 'elevation empty-cells float font-size-adjust font-family font-size font-stretch font-style font-variant font-weight font ' + + 'height left letter-spacing line-height list-style-image list-style-position list-style-type list-style margin-top ' + + 'margin-right margin-bottom margin-left margin marker-offset marks mathline max-height max-width min-height min-width orphans ' + + 'outline-color outline-style outline-width outline overflow padding-top padding-right padding-bottom padding-left padding page ' + + 'page-break-after page-break-before page-break-inside pause pause-after pause-before pitch pitch-range play-during position ' + + 'quotes right richness size slope src speak-header speak-numeral speak-punctuation speak speech-rate stemh stemv stress ' + + 'table-layout text-align top text-decoration text-indent text-shadow text-transform unicode-bidi unicode-range units-per-em ' + + 'vertical-align visibility voice-family volume white-space widows width widths word-spacing x-height z-index'; + + var values = 'above absolute all always aqua armenian attr aural auto avoid baseline behind below bidi-override black blink block blue bold bolder '+ + 'both bottom braille capitalize caption center center-left center-right circle close-quote code collapse compact condensed '+ + 'continuous counter counters crop cross crosshair cursive dashed decimal decimal-leading-zero default digits disc dotted double '+ + 'embed embossed e-resize expanded extra-condensed extra-expanded fantasy far-left far-right fast faster fixed format fuchsia '+ + 'gray green groove handheld hebrew help hidden hide high higher icon inline-table inline inset inside invert italic '+ + 'justify landscape large larger left-side left leftwards level lighter lime line-through list-item local loud lower-alpha '+ + 'lowercase lower-greek lower-latin lower-roman lower low ltr marker maroon medium message-box middle mix move narrower '+ + 'navy ne-resize no-close-quote none no-open-quote no-repeat normal nowrap n-resize nw-resize oblique olive once open-quote outset '+ + 'outside overline pointer portrait pre print projection purple red relative repeat repeat-x repeat-y rgb ridge right right-side '+ + 'rightwards rtl run-in screen scroll semi-condensed semi-expanded separate se-resize show silent silver slower slow '+ + 'small small-caps small-caption smaller soft solid speech spell-out square s-resize static status-bar sub super sw-resize '+ + 'table-caption table-cell table-column table-column-group table-footer-group table-header-group table-row table-row-group teal '+ + 'text-bottom text-top thick thin top transparent tty tv ultra-condensed ultra-expanded underline upper-alpha uppercase upper-latin '+ + 'upper-roman url visible wait white wider w-resize x-fast x-high x-large x-loud x-low x-slow x-small x-soft xx-large xx-small yellow'; + + var fonts = '[mM]onospace [tT]ahoma [vV]erdana [aA]rial [hH]elvetica [sS]ans-serif [sS]erif [cC]ourier mono sans serif'; + + this.regexList = [ + { regex: SyntaxHighlighter.regexLib.multiLineCComments, css: 'comments' }, // multiline comments + { regex: SyntaxHighlighter.regexLib.doubleQuotedString, css: 'string' }, // double quoted strings + { regex: SyntaxHighlighter.regexLib.singleQuotedString, css: 'string' }, // single quoted strings + { regex: /\#[a-fA-F0-9]{3,6}/g, css: 'value' }, // html colors + { regex: /(-?\d+)(\.\d+)?(px|em|pt|\:|\%|)/g, css: 'value' }, // sizes + { regex: /!important/g, css: 'color3' }, // !important + { regex: new RegExp(getKeywordsCSS(keywords), 'gm'), css: 'keyword' }, // keywords + { regex: new RegExp(getValuesCSS(values), 'g'), css: 'value' }, // values + { regex: new RegExp(this.getKeywords(fonts), 'g'), css: 'color1' } // fonts + ]; + + this.forHtmlScript({ + left: /(<|<)\s*style.*?(>|>)/gi, + right: /(<|<)\/\s*style\s*(>|>)/gi + }); + }; + + Brush.prototype = new SyntaxHighlighter.Highlighter(); + Brush.aliases = ['css']; + + SyntaxHighlighter.brushes.CSS = Brush; + + // CommonJS + typeof(exports) != 'undefined' ? exports.Brush = Brush : null; +})(); diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushDelphi.js b/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushDelphi.js new file mode 100644 index 0000000..e1060d4 --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushDelphi.js @@ -0,0 +1,55 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +;(function() +{ + // CommonJS + typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null; + + function Brush() + { + var keywords = 'abs addr and ansichar ansistring array as asm begin boolean byte cardinal ' + + 'case char class comp const constructor currency destructor div do double ' + + 'downto else end except exports extended false file finalization finally ' + + 'for function goto if implementation in inherited int64 initialization ' + + 'integer interface is label library longint longword mod nil not object ' + + 'of on or packed pansichar pansistring pchar pcurrency pdatetime pextended ' + + 'pint64 pointer private procedure program property pshortstring pstring ' + + 'pvariant pwidechar pwidestring protected public published raise real real48 ' + + 'record repeat set shl shortint shortstring shr single smallint string then ' + + 'threadvar to true try type unit until uses val var varirnt while widechar ' + + 'widestring with word write writeln xor'; + + this.regexList = [ + { regex: /\(\*[\s\S]*?\*\)/gm, css: 'comments' }, // multiline comments (* *) + { regex: /{(?!\$)[\s\S]*?}/gm, css: 'comments' }, // multiline comments { } + { regex: SyntaxHighlighter.regexLib.singleLineCComments, css: 'comments' }, // one line + { regex: SyntaxHighlighter.regexLib.singleQuotedString, css: 'string' }, // strings + { regex: /\{\$[a-zA-Z]+ .+\}/g, css: 'color1' }, // compiler Directives and Region tags + { regex: /\b[\d\.]+\b/g, css: 'value' }, // numbers 12345 + { regex: /\$[a-zA-Z0-9]+\b/g, css: 'value' }, // numbers $F5D3 + { regex: new RegExp(this.getKeywords(keywords), 'gmi'), css: 'keyword' } // keyword + ]; + }; + + Brush.prototype = new SyntaxHighlighter.Highlighter(); + Brush.aliases = ['delphi', 'pascal', 'pas']; + + SyntaxHighlighter.brushes.Delphi = Brush; + + // CommonJS + typeof(exports) != 'undefined' ? exports.Brush = Brush : null; +})(); diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushDiff.js b/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushDiff.js new file mode 100644 index 0000000..e9b14fc --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushDiff.js @@ -0,0 +1,41 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +;(function() +{ + // CommonJS + typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null; + + function Brush() + { + this.regexList = [ + { regex: /^\+\+\+.*$/gm, css: 'color2' }, + { regex: /^\-\-\-.*$/gm, css: 'color2' }, + { regex: /^\s.*$/gm, css: 'color1' }, + { regex: /^@@.*@@$/gm, css: 'variable' }, + { regex: /^\+[^\+]{1}.*$/gm, css: 'string' }, + { regex: /^\-[^\-]{1}.*$/gm, css: 'comments' } + ]; + }; + + Brush.prototype = new SyntaxHighlighter.Highlighter(); + Brush.aliases = ['diff', 'patch']; + + SyntaxHighlighter.brushes.Diff = Brush; + + // CommonJS + typeof(exports) != 'undefined' ? exports.Brush = Brush : null; +})(); diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushErlang.js b/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushErlang.js new file mode 100644 index 0000000..6ba7d9d --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushErlang.js @@ -0,0 +1,52 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +;(function() +{ + // CommonJS + typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null; + + function Brush() + { + // Contributed by Jean-Lou Dupont + // http://jldupont.blogspot.com/2009/06/erlang-syntax-highlighter.html + + // According to: http://erlang.org/doc/reference_manual/introduction.html#1.5 + var keywords = 'after and andalso band begin bnot bor bsl bsr bxor '+ + 'case catch cond div end fun if let not of or orelse '+ + 'query receive rem try when xor'+ + // additional + ' module export import define'; + + this.regexList = [ + { regex: new RegExp("[A-Z][A-Za-z0-9_]+", 'g'), css: 'constants' }, + { regex: new RegExp("\\%.+", 'gm'), css: 'comments' }, + { regex: new RegExp("\\?[A-Za-z0-9_]+", 'g'), css: 'preprocessor' }, + { regex: new RegExp("[a-z0-9_]+:[a-z0-9_]+", 'g'), css: 'functions' }, + { regex: SyntaxHighlighter.regexLib.doubleQuotedString, css: 'string' }, + { regex: SyntaxHighlighter.regexLib.singleQuotedString, css: 'string' }, + { regex: new RegExp(this.getKeywords(keywords), 'gm'), css: 'keyword' } + ]; + }; + + Brush.prototype = new SyntaxHighlighter.Highlighter(); + Brush.aliases = ['erl', 'erlang']; + + SyntaxHighlighter.brushes.Erland = Brush; + + // CommonJS + typeof(exports) != 'undefined' ? exports.Brush = Brush : null; +})(); diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushGroovy.js b/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushGroovy.js new file mode 100644 index 0000000..6ec5c18 --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushGroovy.js @@ -0,0 +1,67 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +;(function() +{ + // CommonJS + typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null; + + function Brush() + { + // Contributed by Andres Almiray + // http://jroller.com/aalmiray/entry/nice_source_code_syntax_highlighter + + var keywords = 'as assert break case catch class continue def default do else extends finally ' + + 'if in implements import instanceof interface new package property return switch ' + + 'throw throws try while public protected private static'; + var types = 'void boolean byte char short int long float double'; + var constants = 'null'; + var methods = 'allProperties count get size '+ + 'collect each eachProperty eachPropertyName eachWithIndex find findAll ' + + 'findIndexOf grep inject max min reverseEach sort ' + + 'asImmutable asSynchronized flatten intersect join pop reverse subMap toList ' + + 'padRight padLeft contains eachMatch toCharacter toLong toUrl tokenize ' + + 'eachFile eachFileRecurse eachB yte eachLine readBytes readLine getText ' + + 'splitEachLine withReader append encodeBase64 decodeBase64 filterLine ' + + 'transformChar transformLine withOutputStream withPrintWriter withStream ' + + 'withStreams withWriter withWriterAppend write writeLine '+ + 'dump inspect invokeMethod print println step times upto use waitForOrKill '+ + 'getText'; + + this.regexList = [ + { regex: SyntaxHighlighter.regexLib.singleLineCComments, css: 'comments' }, // one line comments + { regex: SyntaxHighlighter.regexLib.multiLineCComments, css: 'comments' }, // multiline comments + { regex: SyntaxHighlighter.regexLib.doubleQuotedString, css: 'string' }, // strings + { regex: SyntaxHighlighter.regexLib.singleQuotedString, css: 'string' }, // strings + { regex: /""".*"""/g, css: 'string' }, // GStrings + { regex: new RegExp('\\b([\\d]+(\\.[\\d]+)?|0x[a-f0-9]+)\\b', 'gi'), css: 'value' }, // numbers + { regex: new RegExp(this.getKeywords(keywords), 'gm'), css: 'keyword' }, // goovy keyword + { regex: new RegExp(this.getKeywords(types), 'gm'), css: 'color1' }, // goovy/java type + { regex: new RegExp(this.getKeywords(constants), 'gm'), css: 'constants' }, // constants + { regex: new RegExp(this.getKeywords(methods), 'gm'), css: 'functions' } // methods + ]; + + this.forHtmlScript(SyntaxHighlighter.regexLib.aspScriptTags); + } + + Brush.prototype = new SyntaxHighlighter.Highlighter(); + Brush.aliases = ['groovy']; + + SyntaxHighlighter.brushes.Groovy = Brush; + + // CommonJS + typeof(exports) != 'undefined' ? exports.Brush = Brush : null; +})(); diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushJScript.js b/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushJScript.js new file mode 100644 index 0000000..ff98dab --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushJScript.js @@ -0,0 +1,52 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +;(function() +{ + // CommonJS + typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null; + + function Brush() + { + var keywords = 'break case catch continue ' + + 'default delete do else false ' + + 'for function if in instanceof ' + + 'new null return super switch ' + + 'this throw true try typeof var while with' + ; + + var r = SyntaxHighlighter.regexLib; + + this.regexList = [ + { regex: r.multiLineDoubleQuotedString, css: 'string' }, // double quoted strings + { regex: r.multiLineSingleQuotedString, css: 'string' }, // single quoted strings + { regex: r.singleLineCComments, css: 'comments' }, // one line comments + { regex: r.multiLineCComments, css: 'comments' }, // multiline comments + { regex: /\s*#.*/gm, css: 'preprocessor' }, // preprocessor tags like #region and #endregion + { regex: new RegExp(this.getKeywords(keywords), 'gm'), css: 'keyword' } // keywords + ]; + + this.forHtmlScript(r.scriptScriptTags); + }; + + Brush.prototype = new SyntaxHighlighter.Highlighter(); + Brush.aliases = ['js', 'jscript', 'javascript']; + + SyntaxHighlighter.brushes.JScript = Brush; + + // CommonJS + typeof(exports) != 'undefined' ? exports.Brush = Brush : null; +})(); diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushJava.js b/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushJava.js new file mode 100644 index 0000000..d692fd6 --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushJava.js @@ -0,0 +1,57 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +;(function() +{ + // CommonJS + typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null; + + function Brush() + { + var keywords = 'abstract assert boolean break byte case catch char class const ' + + 'continue default do double else enum extends ' + + 'false final finally float for goto if implements import ' + + 'instanceof int interface long native new null ' + + 'package private protected public return ' + + 'short static strictfp super switch synchronized this throw throws true ' + + 'transient try void volatile while'; + + this.regexList = [ + { regex: SyntaxHighlighter.regexLib.singleLineCComments, css: 'comments' }, // one line comments + { regex: /\/\*([^\*][\s\S]*)?\*\//gm, css: 'comments' }, // multiline comments + { regex: /\/\*(?!\*\/)\*[\s\S]*?\*\//gm, css: 'preprocessor' }, // documentation comments + { regex: SyntaxHighlighter.regexLib.doubleQuotedString, css: 'string' }, // strings + { regex: SyntaxHighlighter.regexLib.singleQuotedString, css: 'string' }, // strings + { regex: /\b([\d]+(\.[\d]+)?|0x[a-f0-9]+)\b/gi, css: 'value' }, // numbers + { regex: /(?!\@interface\b)\@[\$\w]+\b/g, css: 'color1' }, // annotation @anno + { regex: /\@interface\b/g, css: 'color2' }, // @interface keyword + { regex: new RegExp(this.getKeywords(keywords), 'gm'), css: 'keyword' } // java keyword + ]; + + this.forHtmlScript({ + left : /(<|<)%[@!=]?/g, + right : /%(>|>)/g + }); + }; + + Brush.prototype = new SyntaxHighlighter.Highlighter(); + Brush.aliases = ['java']; + + SyntaxHighlighter.brushes.Java = Brush; + + // CommonJS + typeof(exports) != 'undefined' ? exports.Brush = Brush : null; +})(); diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushJavaFX.js b/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushJavaFX.js new file mode 100644 index 0000000..1a150a6 --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushJavaFX.js @@ -0,0 +1,58 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +;(function() +{ + // CommonJS + typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null; + + function Brush() + { + // Contributed by Patrick Webster + // http://patrickwebster.blogspot.com/2009/04/javafx-brush-for-syntaxhighlighter.html + var datatypes = 'Boolean Byte Character Double Duration ' + + 'Float Integer Long Number Short String Void' + ; + + var keywords = 'abstract after and as assert at before bind bound break catch class ' + + 'continue def delete else exclusive extends false finally first for from ' + + 'function if import in indexof init insert instanceof into inverse last ' + + 'lazy mixin mod nativearray new not null on or override package postinit ' + + 'protected public public-init public-read replace return reverse sizeof ' + + 'step super then this throw true try tween typeof var where while with ' + + 'attribute let private readonly static trigger' + ; + + this.regexList = [ + { regex: SyntaxHighlighter.regexLib.singleLineCComments, css: 'comments' }, + { regex: SyntaxHighlighter.regexLib.multiLineCComments, css: 'comments' }, + { regex: SyntaxHighlighter.regexLib.singleQuotedString, css: 'string' }, + { regex: SyntaxHighlighter.regexLib.doubleQuotedString, css: 'string' }, + { regex: /(-?\.?)(\b(\d*\.?\d+|\d+\.?\d*)(e[+-]?\d+)?|0x[a-f\d]+)\b\.?/gi, css: 'color2' }, // numbers + { regex: new RegExp(this.getKeywords(datatypes), 'gm'), css: 'variable' }, // datatypes + { regex: new RegExp(this.getKeywords(keywords), 'gm'), css: 'keyword' } + ]; + this.forHtmlScript(SyntaxHighlighter.regexLib.aspScriptTags); + }; + + Brush.prototype = new SyntaxHighlighter.Highlighter(); + Brush.aliases = ['jfx', 'javafx']; + + SyntaxHighlighter.brushes.JavaFX = Brush; + + // CommonJS + typeof(exports) != 'undefined' ? exports.Brush = Brush : null; +})(); diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushPerl.js b/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushPerl.js new file mode 100644 index 0000000..d94a2e0 --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushPerl.js @@ -0,0 +1,72 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +;(function() +{ + // CommonJS + typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null; + + function Brush() + { + // Contributed by David Simmons-Duffin and Marty Kube + + var funcs = + 'abs accept alarm atan2 bind binmode chdir chmod chomp chop chown chr ' + + 'chroot close closedir connect cos crypt defined delete each endgrent ' + + 'endhostent endnetent endprotoent endpwent endservent eof exec exists ' + + 'exp fcntl fileno flock fork format formline getc getgrent getgrgid ' + + 'getgrnam gethostbyaddr gethostbyname gethostent getlogin getnetbyaddr ' + + 'getnetbyname getnetent getpeername getpgrp getppid getpriority ' + + 'getprotobyname getprotobynumber getprotoent getpwent getpwnam getpwuid ' + + 'getservbyname getservbyport getservent getsockname getsockopt glob ' + + 'gmtime grep hex index int ioctl join keys kill lc lcfirst length link ' + + 'listen localtime lock log lstat map mkdir msgctl msgget msgrcv msgsnd ' + + 'oct open opendir ord pack pipe pop pos print printf prototype push ' + + 'quotemeta rand read readdir readline readlink readpipe recv rename ' + + 'reset reverse rewinddir rindex rmdir scalar seek seekdir select semctl ' + + 'semget semop send setgrent sethostent setnetent setpgrp setpriority ' + + 'setprotoent setpwent setservent setsockopt shift shmctl shmget shmread ' + + 'shmwrite shutdown sin sleep socket socketpair sort splice split sprintf ' + + 'sqrt srand stat study substr symlink syscall sysopen sysread sysseek ' + + 'system syswrite tell telldir time times tr truncate uc ucfirst umask ' + + 'undef unlink unpack unshift utime values vec wait waitpid warn write'; + + var keywords = + 'bless caller continue dbmclose dbmopen die do dump else elsif eval exit ' + + 'for foreach goto if import last local my next no our package redo ref ' + + 'require return sub tie tied unless untie until use wantarray while'; + + this.regexList = [ + { regex: new RegExp('#[^!].*$', 'gm'), css: 'comments' }, + { regex: new RegExp('^\\s*#!.*$', 'gm'), css: 'preprocessor' }, // shebang + { regex: SyntaxHighlighter.regexLib.doubleQuotedString, css: 'string' }, + { regex: SyntaxHighlighter.regexLib.singleQuotedString, css: 'string' }, + { regex: new RegExp('(\\$|@|%)\\w+', 'g'), css: 'variable' }, + { regex: new RegExp(this.getKeywords(funcs), 'gmi'), css: 'functions' }, + { regex: new RegExp(this.getKeywords(keywords), 'gm'), css: 'keyword' } + ]; + + this.forHtmlScript(SyntaxHighlighter.regexLib.phpScriptTags); + } + + Brush.prototype = new SyntaxHighlighter.Highlighter(); + Brush.aliases = ['perl', 'Perl', 'pl']; + + SyntaxHighlighter.brushes.Perl = Brush; + + // CommonJS + typeof(exports) != 'undefined' ? exports.Brush = Brush : null; +})(); diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushPhp.js b/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushPhp.js new file mode 100644 index 0000000..95e6e43 --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushPhp.js @@ -0,0 +1,88 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +;(function() +{ + // CommonJS + typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null; + + function Brush() + { + var funcs = 'abs acos acosh addcslashes addslashes ' + + 'array_change_key_case array_chunk array_combine array_count_values array_diff '+ + 'array_diff_assoc array_diff_key array_diff_uassoc array_diff_ukey array_fill '+ + 'array_filter array_flip array_intersect array_intersect_assoc array_intersect_key '+ + 'array_intersect_uassoc array_intersect_ukey array_key_exists array_keys array_map '+ + 'array_merge array_merge_recursive array_multisort array_pad array_pop array_product '+ + 'array_push array_rand array_reduce array_reverse array_search array_shift '+ + 'array_slice array_splice array_sum array_udiff array_udiff_assoc '+ + 'array_udiff_uassoc array_uintersect array_uintersect_assoc '+ + 'array_uintersect_uassoc array_unique array_unshift array_values array_walk '+ + 'array_walk_recursive atan atan2 atanh base64_decode base64_encode base_convert '+ + 'basename bcadd bccomp bcdiv bcmod bcmul bindec bindtextdomain bzclose bzcompress '+ + 'bzdecompress bzerrno bzerror bzerrstr bzflush bzopen bzread bzwrite ceil chdir '+ + 'checkdate checkdnsrr chgrp chmod chop chown chr chroot chunk_split class_exists '+ + 'closedir closelog copy cos cosh count count_chars date decbin dechex decoct '+ + 'deg2rad delete ebcdic2ascii echo empty end ereg ereg_replace eregi eregi_replace error_log '+ + 'error_reporting escapeshellarg escapeshellcmd eval exec exit exp explode extension_loaded '+ + 'feof fflush fgetc fgetcsv fgets fgetss file_exists file_get_contents file_put_contents '+ + 'fileatime filectime filegroup fileinode filemtime fileowner fileperms filesize filetype '+ + 'floatval flock floor flush fmod fnmatch fopen fpassthru fprintf fputcsv fputs fread fscanf '+ + 'fseek fsockopen fstat ftell ftok getallheaders getcwd getdate getenv gethostbyaddr gethostbyname '+ + 'gethostbynamel getimagesize getlastmod getmxrr getmygid getmyinode getmypid getmyuid getopt '+ + 'getprotobyname getprotobynumber getrandmax getrusage getservbyname getservbyport gettext '+ + 'gettimeofday gettype glob gmdate gmmktime ini_alter ini_get ini_get_all ini_restore ini_set '+ + 'interface_exists intval ip2long is_a is_array is_bool is_callable is_dir is_double '+ + 'is_executable is_file is_finite is_float is_infinite is_int is_integer is_link is_long '+ + 'is_nan is_null is_numeric is_object is_readable is_real is_resource is_scalar is_soap_fault '+ + 'is_string is_subclass_of is_uploaded_file is_writable is_writeable mkdir mktime nl2br '+ + 'parse_ini_file parse_str parse_url passthru pathinfo print readlink realpath rewind rewinddir rmdir '+ + 'round str_ireplace str_pad str_repeat str_replace str_rot13 str_shuffle str_split '+ + 'str_word_count strcasecmp strchr strcmp strcoll strcspn strftime strip_tags stripcslashes '+ + 'stripos stripslashes stristr strlen strnatcasecmp strnatcmp strncasecmp strncmp strpbrk '+ + 'strpos strptime strrchr strrev strripos strrpos strspn strstr strtok strtolower strtotime '+ + 'strtoupper strtr strval substr substr_compare'; + + var keywords = 'abstract and array as break case catch cfunction class clone const continue declare default die do ' + + 'else elseif enddeclare endfor endforeach endif endswitch endwhile extends final for foreach ' + + 'function include include_once global goto if implements interface instanceof namespace new ' + + 'old_function or private protected public return require require_once static switch ' + + 'throw try use var while xor '; + + var constants = '__FILE__ __LINE__ __METHOD__ __FUNCTION__ __CLASS__'; + + this.regexList = [ + { regex: SyntaxHighlighter.regexLib.singleLineCComments, css: 'comments' }, // one line comments + { regex: SyntaxHighlighter.regexLib.multiLineCComments, css: 'comments' }, // multiline comments + { regex: SyntaxHighlighter.regexLib.doubleQuotedString, css: 'string' }, // double quoted strings + { regex: SyntaxHighlighter.regexLib.singleQuotedString, css: 'string' }, // single quoted strings + { regex: /\$\w+/g, css: 'variable' }, // variables + { regex: new RegExp(this.getKeywords(funcs), 'gmi'), css: 'functions' }, // common functions + { regex: new RegExp(this.getKeywords(constants), 'gmi'), css: 'constants' }, // constants + { regex: new RegExp(this.getKeywords(keywords), 'gm'), css: 'keyword' } // keyword + ]; + + this.forHtmlScript(SyntaxHighlighter.regexLib.phpScriptTags); + }; + + Brush.prototype = new SyntaxHighlighter.Highlighter(); + Brush.aliases = ['php']; + + SyntaxHighlighter.brushes.Php = Brush; + + // CommonJS + typeof(exports) != 'undefined' ? exports.Brush = Brush : null; +})(); diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushPlain.js b/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushPlain.js new file mode 100644 index 0000000..9f7d9e9 --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushPlain.js @@ -0,0 +1,33 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +;(function() +{ + // CommonJS + typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null; + + function Brush() + { + }; + + Brush.prototype = new SyntaxHighlighter.Highlighter(); + Brush.aliases = ['text', 'plain']; + + SyntaxHighlighter.brushes.Plain = Brush; + + // CommonJS + typeof(exports) != 'undefined' ? exports.Brush = Brush : null; +})(); diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushPowerShell.js b/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushPowerShell.js new file mode 100644 index 0000000..0be1752 --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushPowerShell.js @@ -0,0 +1,74 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +;(function() +{ + // CommonJS + typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null; + + function Brush() + { + // Contributes by B.v.Zanten, Getronics + // http://confluence.atlassian.com/display/CONFEXT/New+Code+Macro + + var keywords = 'Add-Content Add-History Add-Member Add-PSSnapin Clear(-Content)? Clear-Item ' + + 'Clear-ItemProperty Clear-Variable Compare-Object ConvertFrom-SecureString Convert-Path ' + + 'ConvertTo-Html ConvertTo-SecureString Copy(-Item)? Copy-ItemProperty Export-Alias ' + + 'Export-Clixml Export-Console Export-Csv ForEach(-Object)? Format-Custom Format-List ' + + 'Format-Table Format-Wide Get-Acl Get-Alias Get-AuthenticodeSignature Get-ChildItem Get-Command ' + + 'Get-Content Get-Credential Get-Culture Get-Date Get-EventLog Get-ExecutionPolicy ' + + 'Get-Help Get-History Get-Host Get-Item Get-ItemProperty Get-Location Get-Member ' + + 'Get-PfxCertificate Get-Process Get-PSDrive Get-PSProvider Get-PSSnapin Get-Service ' + + 'Get-TraceSource Get-UICulture Get-Unique Get-Variable Get-WmiObject Group-Object ' + + 'Import-Alias Import-Clixml Import-Csv Invoke-Expression Invoke-History Invoke-Item ' + + 'Join-Path Measure-Command Measure-Object Move(-Item)? Move-ItemProperty New-Alias ' + + 'New-Item New-ItemProperty New-Object New-PSDrive New-Service New-TimeSpan ' + + 'New-Variable Out-Default Out-File Out-Host Out-Null Out-Printer Out-String Pop-Location ' + + 'Push-Location Read-Host Remove-Item Remove-ItemProperty Remove-PSDrive Remove-PSSnapin ' + + 'Remove-Variable Rename-Item Rename-ItemProperty Resolve-Path Restart-Service Resume-Service ' + + 'Select-Object Select-String Set-Acl Set-Alias Set-AuthenticodeSignature Set-Content ' + + 'Set-Date Set-ExecutionPolicy Set-Item Set-ItemProperty Set-Location Set-PSDebug ' + + 'Set-Service Set-TraceSource Set(-Variable)? Sort-Object Split-Path Start-Service ' + + 'Start-Sleep Start-Transcript Stop-Process Stop-Service Stop-Transcript Suspend-Service ' + + 'Tee-Object Test-Path Trace-Command Update-FormatData Update-TypeData Where(-Object)? ' + + 'Write-Debug Write-Error Write(-Host)? Write-Output Write-Progress Write-Verbose Write-Warning'; + var alias = 'ac asnp clc cli clp clv cpi cpp cvpa diff epal epcsv fc fl ' + + 'ft fw gal gc gci gcm gdr ghy gi gl gm gp gps group gsv ' + + 'gsnp gu gv gwmi iex ihy ii ipal ipcsv mi mp nal ndr ni nv oh rdr ' + + 'ri rni rnp rp rsnp rv rvpa sal sasv sc select si sl sleep sort sp ' + + 'spps spsv sv tee cat cd cp h history kill lp ls ' + + 'mount mv popd ps pushd pwd r rm rmdir echo cls chdir del dir ' + + 'erase rd ren type % \\?'; + + this.regexList = [ + { regex: /#.*$/gm, css: 'comments' }, // one line comments + { regex: /\$[a-zA-Z0-9]+\b/g, css: 'value' }, // variables $Computer1 + { regex: /\-[a-zA-Z]+\b/g, css: 'keyword' }, // Operators -not -and -eq + { regex: SyntaxHighlighter.regexLib.doubleQuotedString, css: 'string' }, // strings + { regex: SyntaxHighlighter.regexLib.singleQuotedString, css: 'string' }, // strings + { regex: new RegExp(this.getKeywords(keywords), 'gmi'), css: 'keyword' }, + { regex: new RegExp(this.getKeywords(alias), 'gmi'), css: 'keyword' } + ]; + }; + + Brush.prototype = new SyntaxHighlighter.Highlighter(); + Brush.aliases = ['powershell', 'ps']; + + SyntaxHighlighter.brushes.PowerShell = Brush; + + // CommonJS + typeof(exports) != 'undefined' ? exports.Brush = Brush : null; +})(); diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushPython.js b/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushPython.js new file mode 100644 index 0000000..ce77462 --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushPython.js @@ -0,0 +1,64 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +;(function() +{ + // CommonJS + typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null; + + function Brush() + { + // Contributed by Gheorghe Milas and Ahmad Sherif + + var keywords = 'and assert break class continue def del elif else ' + + 'except exec finally for from global if import in is ' + + 'lambda not or pass print raise return try yield while'; + + var funcs = '__import__ abs all any apply basestring bin bool buffer callable ' + + 'chr classmethod cmp coerce compile complex delattr dict dir ' + + 'divmod enumerate eval execfile file filter float format frozenset ' + + 'getattr globals hasattr hash help hex id input int intern ' + + 'isinstance issubclass iter len list locals long map max min next ' + + 'object oct open ord pow print property range raw_input reduce ' + + 'reload repr reversed round set setattr slice sorted staticmethod ' + + 'str sum super tuple type type unichr unicode vars xrange zip'; + + var special = 'None True False self cls class_'; + + this.regexList = [ + { regex: SyntaxHighlighter.regexLib.singleLinePerlComments, css: 'comments' }, + { regex: /^\s*@\w+/gm, css: 'decorator' }, + { regex: /(['\"]{3})([^\1])*?\1/gm, css: 'comments' }, + { regex: /"(?!")(?:\.|\\\"|[^\""\n])*"/gm, css: 'string' }, + { regex: /'(?!')(?:\.|(\\\')|[^\''\n])*'/gm, css: 'string' }, + { regex: /\+|\-|\*|\/|\%|=|==/gm, css: 'keyword' }, + { regex: /\b\d+\.?\w*/g, css: 'value' }, + { regex: new RegExp(this.getKeywords(funcs), 'gmi'), css: 'functions' }, + { regex: new RegExp(this.getKeywords(keywords), 'gm'), css: 'keyword' }, + { regex: new RegExp(this.getKeywords(special), 'gm'), css: 'color1' } + ]; + + this.forHtmlScript(SyntaxHighlighter.regexLib.aspScriptTags); + }; + + Brush.prototype = new SyntaxHighlighter.Highlighter(); + Brush.aliases = ['py', 'python']; + + SyntaxHighlighter.brushes.Python = Brush; + + // CommonJS + typeof(exports) != 'undefined' ? exports.Brush = Brush : null; +})(); diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushRuby.js b/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushRuby.js new file mode 100644 index 0000000..ff82130 --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushRuby.js @@ -0,0 +1,55 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +;(function() +{ + // CommonJS + typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null; + + function Brush() + { + // Contributed by Erik Peterson. + + var keywords = 'alias and BEGIN begin break case class def define_method defined do each else elsif ' + + 'END end ensure false for if in module new next nil not or raise redo rescue retry return ' + + 'self super then throw true undef unless until when while yield'; + + var builtins = 'Array Bignum Binding Class Continuation Dir Exception FalseClass File::Stat File Fixnum Fload ' + + 'Hash Integer IO MatchData Method Module NilClass Numeric Object Proc Range Regexp String Struct::TMS Symbol ' + + 'ThreadGroup Thread Time TrueClass'; + + this.regexList = [ + { regex: SyntaxHighlighter.regexLib.singleLinePerlComments, css: 'comments' }, // one line comments + { regex: SyntaxHighlighter.regexLib.doubleQuotedString, css: 'string' }, // double quoted strings + { regex: SyntaxHighlighter.regexLib.singleQuotedString, css: 'string' }, // single quoted strings + { regex: /\b[A-Z0-9_]+\b/g, css: 'constants' }, // constants + { regex: /:[a-z][A-Za-z0-9_]*/g, css: 'color2' }, // symbols + { regex: /(\$|@@|@)\w+/g, css: 'variable bold' }, // $global, @instance, and @@class variables + { regex: new RegExp(this.getKeywords(keywords), 'gm'), css: 'keyword' }, // keywords + { regex: new RegExp(this.getKeywords(builtins), 'gm'), css: 'color1' } // builtins + ]; + + this.forHtmlScript(SyntaxHighlighter.regexLib.aspScriptTags); + }; + + Brush.prototype = new SyntaxHighlighter.Highlighter(); + Brush.aliases = ['ruby', 'rails', 'ror', 'rb']; + + SyntaxHighlighter.brushes.Ruby = Brush; + + // CommonJS + typeof(exports) != 'undefined' ? exports.Brush = Brush : null; +})(); diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushSass.js b/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushSass.js new file mode 100644 index 0000000..aa04da0 --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushSass.js @@ -0,0 +1,94 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +;(function() +{ + // CommonJS + typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null; + + function Brush() + { + function getKeywordsCSS(str) + { + return '\\b([a-z_]|)' + str.replace(/ /g, '(?=:)\\b|\\b([a-z_\\*]|\\*|)') + '(?=:)\\b'; + }; + + function getValuesCSS(str) + { + return '\\b' + str.replace(/ /g, '(?!-)(?!:)\\b|\\b()') + '\:\\b'; + }; + + var keywords = 'ascent azimuth background-attachment background-color background-image background-position ' + + 'background-repeat background baseline bbox border-collapse border-color border-spacing border-style border-top ' + + 'border-right border-bottom border-left border-top-color border-right-color border-bottom-color border-left-color ' + + 'border-top-style border-right-style border-bottom-style border-left-style border-top-width border-right-width ' + + 'border-bottom-width border-left-width border-width border bottom cap-height caption-side centerline clear clip color ' + + 'content counter-increment counter-reset cue-after cue-before cue cursor definition-src descent direction display ' + + 'elevation empty-cells float font-size-adjust font-family font-size font-stretch font-style font-variant font-weight font ' + + 'height left letter-spacing line-height list-style-image list-style-position list-style-type list-style margin-top ' + + 'margin-right margin-bottom margin-left margin marker-offset marks mathline max-height max-width min-height min-width orphans ' + + 'outline-color outline-style outline-width outline overflow padding-top padding-right padding-bottom padding-left padding page ' + + 'page-break-after page-break-before page-break-inside pause pause-after pause-before pitch pitch-range play-during position ' + + 'quotes right richness size slope src speak-header speak-numeral speak-punctuation speak speech-rate stemh stemv stress ' + + 'table-layout text-align top text-decoration text-indent text-shadow text-transform unicode-bidi unicode-range units-per-em ' + + 'vertical-align visibility voice-family volume white-space widows width widths word-spacing x-height z-index'; + + var values = 'above absolute all always aqua armenian attr aural auto avoid baseline behind below bidi-override black blink block blue bold bolder '+ + 'both bottom braille capitalize caption center center-left center-right circle close-quote code collapse compact condensed '+ + 'continuous counter counters crop cross crosshair cursive dashed decimal decimal-leading-zero digits disc dotted double '+ + 'embed embossed e-resize expanded extra-condensed extra-expanded fantasy far-left far-right fast faster fixed format fuchsia '+ + 'gray green groove handheld hebrew help hidden hide high higher icon inline-table inline inset inside invert italic '+ + 'justify landscape large larger left-side left leftwards level lighter lime line-through list-item local loud lower-alpha '+ + 'lowercase lower-greek lower-latin lower-roman lower low ltr marker maroon medium message-box middle mix move narrower '+ + 'navy ne-resize no-close-quote none no-open-quote no-repeat normal nowrap n-resize nw-resize oblique olive once open-quote outset '+ + 'outside overline pointer portrait pre print projection purple red relative repeat repeat-x repeat-y rgb ridge right right-side '+ + 'rightwards rtl run-in screen scroll semi-condensed semi-expanded separate se-resize show silent silver slower slow '+ + 'small small-caps small-caption smaller soft solid speech spell-out square s-resize static status-bar sub super sw-resize '+ + 'table-caption table-cell table-column table-column-group table-footer-group table-header-group table-row table-row-group teal '+ + 'text-bottom text-top thick thin top transparent tty tv ultra-condensed ultra-expanded underline upper-alpha uppercase upper-latin '+ + 'upper-roman url visible wait white wider w-resize x-fast x-high x-large x-loud x-low x-slow x-small x-soft xx-large xx-small yellow'; + + var fonts = '[mM]onospace [tT]ahoma [vV]erdana [aA]rial [hH]elvetica [sS]ans-serif [sS]erif [cC]ourier mono sans serif'; + + var statements = '!important !default'; + var preprocessor = '@import @extend @debug @warn @if @for @while @mixin @include'; + + var r = SyntaxHighlighter.regexLib; + + this.regexList = [ + { regex: r.multiLineCComments, css: 'comments' }, // multiline comments + { regex: r.singleLineCComments, css: 'comments' }, // singleline comments + { regex: r.doubleQuotedString, css: 'string' }, // double quoted strings + { regex: r.singleQuotedString, css: 'string' }, // single quoted strings + { regex: /\#[a-fA-F0-9]{3,6}/g, css: 'value' }, // html colors + { regex: /\b(-?\d+)(\.\d+)?(px|em|pt|\:|\%|)\b/g, css: 'value' }, // sizes + { regex: /\$\w+/g, css: 'variable' }, // variables + { regex: new RegExp(this.getKeywords(statements), 'g'), css: 'color3' }, // statements + { regex: new RegExp(this.getKeywords(preprocessor), 'g'), css: 'preprocessor' }, // preprocessor + { regex: new RegExp(getKeywordsCSS(keywords), 'gm'), css: 'keyword' }, // keywords + { regex: new RegExp(getValuesCSS(values), 'g'), css: 'value' }, // values + { regex: new RegExp(this.getKeywords(fonts), 'g'), css: 'color1' } // fonts + ]; + }; + + Brush.prototype = new SyntaxHighlighter.Highlighter(); + Brush.aliases = ['sass', 'scss']; + + SyntaxHighlighter.brushes.Sass = Brush; + + // CommonJS + typeof(exports) != 'undefined' ? exports.Brush = Brush : null; +})(); diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushScala.js b/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushScala.js new file mode 100644 index 0000000..4b0b6f0 --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushScala.js @@ -0,0 +1,51 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +;(function() +{ + // CommonJS + typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null; + + function Brush() + { + // Contributed by Yegor Jbanov and David Bernard. + + var keywords = 'val sealed case def true trait implicit forSome import match object null finally super ' + + 'override try lazy for var catch throw type extends class while with new final yield abstract ' + + 'else do if return protected private this package false'; + + var keyops = '[_:=><%#@]+'; + + this.regexList = [ + { regex: SyntaxHighlighter.regexLib.singleLineCComments, css: 'comments' }, // one line comments + { regex: SyntaxHighlighter.regexLib.multiLineCComments, css: 'comments' }, // multiline comments + { regex: SyntaxHighlighter.regexLib.multiLineSingleQuotedString, css: 'string' }, // multi-line strings + { regex: SyntaxHighlighter.regexLib.multiLineDoubleQuotedString, css: 'string' }, // double-quoted string + { regex: SyntaxHighlighter.regexLib.singleQuotedString, css: 'string' }, // strings + { regex: /0x[a-f0-9]+|\d+(\.\d+)?/gi, css: 'value' }, // numbers + { regex: new RegExp(this.getKeywords(keywords), 'gm'), css: 'keyword' }, // keywords + { regex: new RegExp(keyops, 'gm'), css: 'keyword' } // scala keyword + ]; + } + + Brush.prototype = new SyntaxHighlighter.Highlighter(); + Brush.aliases = ['scala']; + + SyntaxHighlighter.brushes.Scala = Brush; + + // CommonJS + typeof(exports) != 'undefined' ? exports.Brush = Brush : null; +})(); diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushSql.js b/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushSql.js new file mode 100644 index 0000000..5c2cd88 --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushSql.js @@ -0,0 +1,66 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +;(function() +{ + // CommonJS + typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null; + + function Brush() + { + var funcs = 'abs avg case cast coalesce convert count current_timestamp ' + + 'current_user day isnull left lower month nullif replace right ' + + 'session_user space substring sum system_user upper user year'; + + var keywords = 'absolute action add after alter as asc at authorization begin bigint ' + + 'binary bit by cascade char character check checkpoint close collate ' + + 'column commit committed connect connection constraint contains continue ' + + 'create cube current current_date current_time cursor database date ' + + 'deallocate dec decimal declare default delete desc distinct double drop ' + + 'dynamic else end end-exec escape except exec execute false fetch first ' + + 'float for force foreign forward free from full function global goto grant ' + + 'group grouping having hour ignore index inner insensitive insert instead ' + + 'int integer intersect into is isolation key last level load local max min ' + + 'minute modify move name national nchar next no numeric of off on only ' + + 'open option order out output partial password precision prepare primary ' + + 'prior privileges procedure public read real references relative repeatable ' + + 'restrict return returns revoke rollback rollup rows rule schema scroll ' + + 'second section select sequence serializable set size smallint static ' + + 'statistics table temp temporary then time timestamp to top transaction ' + + 'translation trigger true truncate uncommitted union unique update values ' + + 'varchar varying view when where with work'; + + var operators = 'all and any between cross in join like not null or outer some'; + + this.regexList = [ + { regex: /--(.*)$/gm, css: 'comments' }, // one line and multiline comments + { regex: SyntaxHighlighter.regexLib.multiLineDoubleQuotedString, css: 'string' }, // double quoted strings + { regex: SyntaxHighlighter.regexLib.multiLineSingleQuotedString, css: 'string' }, // single quoted strings + { regex: new RegExp(this.getKeywords(funcs), 'gmi'), css: 'color2' }, // functions + { regex: new RegExp(this.getKeywords(operators), 'gmi'), css: 'color1' }, // operators and such + { regex: new RegExp(this.getKeywords(keywords), 'gmi'), css: 'keyword' } // keyword + ]; + }; + + Brush.prototype = new SyntaxHighlighter.Highlighter(); + Brush.aliases = ['sql']; + + SyntaxHighlighter.brushes.Sql = Brush; + + // CommonJS + typeof(exports) != 'undefined' ? exports.Brush = Brush : null; +})(); + diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushVb.js b/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushVb.js new file mode 100644 index 0000000..be845dc --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushVb.js @@ -0,0 +1,56 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +;(function() +{ + // CommonJS + typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null; + + function Brush() + { + var keywords = 'AddHandler AddressOf AndAlso Alias And Ansi As Assembly Auto ' + + 'Boolean ByRef Byte ByVal Call Case Catch CBool CByte CChar CDate ' + + 'CDec CDbl Char CInt Class CLng CObj Const CShort CSng CStr CType ' + + 'Date Decimal Declare Default Delegate Dim DirectCast Do Double Each ' + + 'Else ElseIf End Enum Erase Error Event Exit False Finally For Friend ' + + 'Function Get GetType GoSub GoTo Handles If Implements Imports In ' + + 'Inherits Integer Interface Is Let Lib Like Long Loop Me Mod Module ' + + 'MustInherit MustOverride MyBase MyClass Namespace New Next Not Nothing ' + + 'NotInheritable NotOverridable Object On Option Optional Or OrElse ' + + 'Overloads Overridable Overrides ParamArray Preserve Private Property ' + + 'Protected Public RaiseEvent ReadOnly ReDim REM RemoveHandler Resume ' + + 'Return Select Set Shadows Shared Short Single Static Step Stop String ' + + 'Structure Sub SyncLock Then Throw To True Try TypeOf Unicode Until ' + + 'Variant When While With WithEvents WriteOnly Xor'; + + this.regexList = [ + { regex: /'.*$/gm, css: 'comments' }, // one line comments + { regex: SyntaxHighlighter.regexLib.doubleQuotedString, css: 'string' }, // strings + { regex: /^\s*#.*$/gm, css: 'preprocessor' }, // preprocessor tags like #region and #endregion + { regex: new RegExp(this.getKeywords(keywords), 'gm'), css: 'keyword' } // vb keyword + ]; + + this.forHtmlScript(SyntaxHighlighter.regexLib.aspScriptTags); + }; + + Brush.prototype = new SyntaxHighlighter.Highlighter(); + Brush.aliases = ['vb', 'vbnet']; + + SyntaxHighlighter.brushes.Vb = Brush; + + // CommonJS + typeof(exports) != 'undefined' ? exports.Brush = Brush : null; +})(); diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushXml.js b/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushXml.js new file mode 100644 index 0000000..69d9fd0 --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shBrushXml.js @@ -0,0 +1,69 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +;(function() +{ + // CommonJS + typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null; + + function Brush() + { + function process(match, regexInfo) + { + var constructor = SyntaxHighlighter.Match, + code = match[0], + tag = new XRegExp('(<|<)[\\s\\/\\?]*(?[:\\w-\\.]+)', 'xg').exec(code), + result = [] + ; + + if (match.attributes != null) + { + var attributes, + regex = new XRegExp('(? [\\w:\\-\\.]+)' + + '\\s*=\\s*' + + '(? ".*?"|\'.*?\'|\\w+)', + 'xg'); + + while ((attributes = regex.exec(code)) != null) + { + result.push(new constructor(attributes.name, match.index + attributes.index, 'color1')); + result.push(new constructor(attributes.value, match.index + attributes.index + attributes[0].indexOf(attributes.value), 'string')); + } + } + + if (tag != null) + result.push( + new constructor(tag.name, match.index + tag[0].indexOf(tag.name), 'keyword') + ); + + return result; + } + + this.regexList = [ + { regex: new XRegExp('(\\<|<)\\!\\[[\\w\\s]*?\\[(.|\\s)*?\\]\\](\\>|>)', 'gm'), css: 'color2' }, // + { regex: SyntaxHighlighter.regexLib.xmlComments, css: 'comments' }, // + { regex: new XRegExp('(<|<)[\\s\\/\\?]*(\\w+)(?.*?)[\\s\\/\\?]*(>|>)', 'sg'), func: process } + ]; + }; + + Brush.prototype = new SyntaxHighlighter.Highlighter(); + Brush.aliases = ['xml', 'xhtml', 'xslt', 'html']; + + SyntaxHighlighter.brushes.Xml = Brush; + + // CommonJS + typeof(exports) != 'undefined' ? exports.Brush = Brush : null; +})(); diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shCore.js b/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shCore.js new file mode 100644 index 0000000..b47b645 --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shCore.js @@ -0,0 +1,17 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +eval(function(p,a,c,k,e,d){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('K M;I(M)1S 2U("2a\'t 4k M 4K 2g 3l 4G 4H");(6(){6 r(f,e){I(!M.1R(f))1S 3m("3s 15 4R");K a=f.1w;f=M(f.1m,t(f)+(e||""));I(a)f.1w={1m:a.1m,19:a.19?a.19.1a(0):N};H f}6 t(f){H(f.1J?"g":"")+(f.4s?"i":"")+(f.4p?"m":"")+(f.4v?"x":"")+(f.3n?"y":"")}6 B(f,e,a,b){K c=u.L,d,h,g;v=R;5K{O(;c--;){g=u[c];I(a&g.3r&&(!g.2p||g.2p.W(b))){g.2q.12=e;I((h=g.2q.X(f))&&h.P===e){d={3k:g.2b.W(b,h,a),1C:h};1N}}}}5v(i){1S i}5q{v=11}H d}6 p(f,e,a){I(3b.Z.1i)H f.1i(e,a);O(a=a||0;a-1},3d:6(g){e+=g}};c1&&p(e,"")>-1){a=15(J.1m,n.Q.W(t(J),"g",""));n.Q.W(f.1a(e.P),a,6(){O(K c=1;c<14.L-2;c++)I(14[c]===1d)e[c]=1d})}I(J.1w&&J.1w.19)O(K b=1;be.P&&J.12--}H e};I(!D)15.Z.1A=6(f){(f=n.X.W(J,f))&&J.1J&&!f[0].L&&J.12>f.P&&J.12--;H!!f};1r.Z.1C=6(f){M.1R(f)||(f=15(f));I(f.1J){K e=n.1C.1p(J,14);f.12=0;H e}H f.X(J)};1r.Z.Q=6(f,e){K a=M.1R(f),b,c;I(a&&1j e.58()==="3f"&&e.1i("${")===-1&&y)H n.Q.1p(J,14);I(a){I(f.1w)b=f.1w.19}Y f+="";I(1j e==="6")c=n.Q.W(J,f,6(){I(b){14[0]=1f 1r(14[0]);O(K d=0;dd.L-3;){i=1r.Z.1a.W(g,-1)+i;g=1Q.3i(g/10)}H(g?d[g]||"":"$")+i}Y{g=+i;I(g<=d.L-3)H d[g];g=b?p(b,i):-1;H g>-1?d[g+1]:h}})})}I(a&&f.1J)f.12=0;H c};1r.Z.1e=6(f,e){I(!M.1R(f))H n.1e.1p(J,14);K a=J+"",b=[],c=0,d,h;I(e===1d||+e<0)e=5D;Y{e=1Q.3i(+e);I(!e)H[]}O(f=M.3c(f);d=f.X(a);){I(f.12>c){b.U(a.1a(c,d.P));d.L>1&&d.P=e)1N}f.12===d.P&&f.12++}I(c===a.L){I(!n.1A.W(f,"")||h)b.U("")}Y b.U(a.1a(c));H b.L>e?b.1a(0,e):b};M.1h(/\\(\\?#[^)]*\\)/,6(f){H n.1A.W(A,f.2S.1a(f.P+f[0].L))?"":"(?:)"});M.1h(/\\((?!\\?)/,6(){J.19.U(N);H"("});M.1h(/\\(\\?<([$\\w]+)>/,6(f){J.19.U(f[1]);J.2N=R;H"("});M.1h(/\\\\k<([\\w$]+)>/,6(f){K e=p(J.19,f[1]);H e>-1?"\\\\"+(e+1)+(3R(f.2S.3a(f.P+f[0].L))?"":"(?:)"):f[0]});M.1h(/\\[\\^?]/,6(f){H f[0]==="[]"?"\\\\b\\\\B":"[\\\\s\\\\S]"});M.1h(/^\\(\\?([5A]+)\\)/,6(f){J.3d(f[1]);H""});M.1h(/(?:\\s+|#.*)+/,6(f){H n.1A.W(A,f.2S.1a(f.P+f[0].L))?"":"(?:)"},M.1B,6(){H J.2K("x")});M.1h(/\\./,6(){H"[\\\\s\\\\S]"},M.1B,6(){H J.2K("s")})})();1j 2e!="1d"&&(2e.M=M);K 1v=6(){6 r(a,b){a.1l.1i(b)!=-1||(a.1l+=" "+b)}6 t(a){H a.1i("3e")==0?a:"3e"+a}6 B(a){H e.1Y.2A[t(a)]}6 p(a,b,c){I(a==N)H N;K d=c!=R?a.3G:[a.2G],h={"#":"1c",".":"1l"}[b.1o(0,1)]||"3h",g,i;g=h!="3h"?b.1o(1):b.5u();I((a[h]||"").1i(g)!=-1)H a;O(a=0;d&&a\'+c+""});H a}6 n(a,b){a.1e("\\n");O(K c="",d=0;d<50;d++)c+=" ";H a=v(a,6(h){I(h.1i("\\t")==-1)H h;O(K g=0;(g=h.1i("\\t"))!=-1;)h=h.1o(0,g)+c.1o(0,b-g%b)+h.1o(g+1,h.L);H h})}6 x(a){H a.Q(/^\\s+|\\s+$/g,"")}6 D(a,b){I(a.Pb.P)H 1;Y I(a.Lb.L)H 1;H 0}6 y(a,b){6 c(k){H k[0]}O(K d=N,h=[],g=b.2D?b.2D:c;(d=b.1I.X(a))!=N;){K i=g(d,b);I(1j i=="3f")i=[1f e.2L(i,d.P,b.23)];h=h.1O(i)}H h}6 E(a){K b=/(.*)((&1G;|&1y;).*)/;H a.Q(e.3A.3M,6(c){K d="",h=N;I(h=b.X(c)){c=h[1];d=h[2]}H\'\'+c+""+d})}6 z(){O(K a=1E.36("1k"),b=[],c=0;c<1z 4I="1Z://2y.3L.3K/4L/5L"><3J><4N 1Z-4M="5G-5M" 6K="2O/1z; 6J=6I-8" /><1t>6L 1v<3B 1L="25-6M:6Q,6P,6O,6N-6F;6y-2f:#6x;2f:#6w;25-22:6v;2O-3D:3C;">1v3v 3.0.76 (72 73 3x)1Z://3u.2w/1v70 17 6U 71.6T 6X-3x 6Y 6D.6t 61 60 J 1k, 5Z 5R 5V <2R/>5U 5T 5S!\'}},1Y:{2j:N,2A:{}},1U:{},3A:{6n:/\\/\\*[\\s\\S]*?\\*\\//2c,6m:/\\/\\/.*$/2c,6l:/#.*$/2c,6k:/"([^\\\\"\\n]|\\\\.)*"/g,6o:/\'([^\\\\\'\\n]|\\\\.)*\'/g,6p:1f M(\'"([^\\\\\\\\"]|\\\\\\\\.)*"\',"3z"),6s:1f M("\'([^\\\\\\\\\']|\\\\\\\\.)*\'","3z"),6q:/(&1y;|<)!--[\\s\\S]*?--(&1G;|>)/2c,3M:/\\w+:\\/\\/[\\w-.\\/?%&=:@;]*/g,6a:{18:/(&1y;|<)\\?=?/g,1b:/\\?(&1G;|>)/g},69:{18:/(&1y;|<)%=?/g,1b:/%(&1G;|>)/g},6d:{18:/(&1y;|<)\\s*1k.*?(&1G;|>)/2T,1b:/(&1y;|<)\\/\\s*1k\\s*(&1G;|>)/2T}},16:{1H:6(a){6 b(i,k){H e.16.2o(i,k,e.13.1x[k])}O(K c=\'\',d=e.16.2x,h=d.2X,g=0;g";H c},2o:6(a,b,c){H\'<2W>\'+c+""},2b:6(a){K b=a.1F,c=b.1l||"";b=B(p(b,".20",R).1c);K d=6(h){H(h=15(h+"6f(\\\\w+)").X(c))?h[1]:N}("6g");b&&d&&e.16.2x[d].2B(b);a.3N()},2x:{2X:["21","2P"],21:{1H:6(a){I(a.V("2l")!=R)H"";K b=a.V("1t");H e.16.2o(a,"21",b?b:e.13.1x.21)},2B:6(a){a=1E.6j(t(a.1c));a.1l=a.1l.Q("47","")}},2P:{2B:6(){K a="68=0";a+=", 18="+(31.30-33)/2+", 32="+(31.2Z-2Y)/2+", 30=33, 2Z=2Y";a=a.Q(/^,/,"");a=1P.6Z("","38",a);a.2C();K b=a.1E;b.6W(e.13.1x.37);b.6V();a.2C()}}}},35:6(a,b){K c;I(b)c=[b];Y{c=1E.36(e.13.34);O(K d=[],h=0;h(.*?))\\\\]$"),s=1f M("(?<27>[\\\\w-]+)\\\\s*:\\\\s*(?<1T>[\\\\w-%#]+|\\\\[.*?\\\\]|\\".*?\\"|\'.*?\')\\\\s*;?","g");(j=s.X(k))!=N;){K o=j.1T.Q(/^[\'"]|[\'"]$/g,"");I(o!=N&&m.1A(o)){o=m.X(o);o=o.2V.L>0?o.2V.1e(/\\s*,\\s*/):[]}l[j.27]=o}g={1F:g,1n:C(i,l)};g.1n.1D!=N&&d.U(g)}H d},1M:6(a,b){K c=J.35(a,b),d=N,h=e.13;I(c.L!==0)O(K g=0;g")==o-3){m=m.4h(0,o-3);s=R}l=s?m:l}I((i.1t||"")!="")k.1t=i.1t;k.1D=j;d.2Q(k);b=d.2F(l);I((i.1c||"")!="")b.1c=i.1c;i.2G.74(b,i)}}},2E:6(a){w(1P,"4k",6(){e.1M(a)})}};e.2E=e.2E;e.1M=e.1M;e.2L=6(a,b,c){J.1T=a;J.P=b;J.L=a.L;J.23=c;J.1V=N};e.2L.Z.1q=6(){H J.1T};e.4l=6(a){6 b(j,l){O(K m=0;md)1N;Y I(g.P==c.P&&g.L>c.L)a[b]=N;Y I(g.P>=c.P&&g.P\'+c+""},3Q:6(a,b){K c="",d=a.1e("\\n").L,h=2u(J.V("2i-1s")),g=J.V("2z-1s-2t");I(g==R)g=(h+d-1).1q().L;Y I(3R(g)==R)g=0;O(K i=0;i\'+j+"":"")+i)}H a},4f:6(a){H a?"<4a>"+a+"":""},4b:6(a,b){6 c(l){H(l=l?l.1V||g:g)?l+" ":""}O(K d=0,h="",g=J.V("1D",""),i=0;i|&1y;2R\\s*\\/?&1G;/2T;I(e.13.46==R)b=b.Q(h,"\\n");I(e.13.44==R)b=b.Q(h,"");b=b.1e("\\n");h=/^\\s*/;g=4Q;O(K i=0;i0;i++){K k=b[i];I(x(k).L!=0){k=h.X(k);I(k==N){a=a;1N a}g=1Q.4q(k[0].L,g)}}I(g>0)O(i=0;i\'+(J.V("16")?e.16.1H(J):"")+\'<3Z 5z="0" 5H="0" 5J="0">\'+J.4f(J.V("1t"))+"<3T><3P>"+(1u?\'<2d 1g="1u">\'+J.3Q(a)+"":"")+\'<2d 1g="17">\'+b+""},2F:6(a){I(a===N)a="";J.17=a;K b=J.3Y("T");b.3X=J.1H(a);J.V("16")&&w(p(b,".16"),"5c",e.16.2b);J.V("3V-17")&&w(p(b,".17"),"56",f);H b},2Q:6(a){J.1c=""+1Q.5d(1Q.5n()*5k).1q();e.1Y.2A[t(J.1c)]=J;J.1n=C(e.2v,a||{});I(J.V("2k")==R)J.1n.16=J.1n.1u=11},5j:6(a){a=a.Q(/^\\s+|\\s+$/g,"").Q(/\\s+/g,"|");H"\\\\b(?:"+a+")\\\\b"},5f:6(a){J.28={18:{1I:a.18,23:"1k"},1b:{1I:a.1b,23:"1k"},17:1f M("(?<18>"+a.18.1m+")(?<17>.*?)(?<1b>"+a.1b.1m+")","5o")}}};H e}();1j 2e!="1d"&&(2e.1v=1v);',62,441,'||||||function|||||||||||||||||||||||||||||||||||||return|if|this|var|length|XRegExp|null|for|index|replace|true||div|push|getParam|call|exec|else|prototype||false|lastIndex|config|arguments|RegExp|toolbar|code|left|captureNames|slice|right|id|undefined|split|new|class|addToken|indexOf|typeof|script|className|source|params|substr|apply|toString|String|line|title|gutter|SyntaxHighlighter|_xregexp|strings|lt|html|test|OUTSIDE_CLASS|match|brush|document|target|gt|getHtml|regex|global|join|style|highlight|break|concat|window|Math|isRegExp|throw|value|brushes|brushName|space|alert|vars|http|syntaxhighlighter|expandSource|size|css|case|font|Fa|name|htmlScript|dA|can|handler|gm|td|exports|color|in|href|first|discoveredBrushes|light|collapse|object|cache|getButtonHtml|trigger|pattern|getLineHtml|nbsp|numbers|parseInt|defaults|com|items|www|pad|highlighters|execute|focus|func|all|getDiv|parentNode|navigator|INSIDE_CLASS|regexList|hasFlag|Match|useScriptTags|hasNamedCapture|text|help|init|br|input|gi|Error|values|span|list|250|height|width|screen|top|500|tagName|findElements|getElementsByTagName|aboutDialog|_blank|appendChild|charAt|Array|copyAsGlobal|setFlag|highlighter_|string|attachEvent|nodeName|floor|backref|output|the|TypeError|sticky|Za|iterate|freezeTokens|scope|type|textarea|alexgorbatchev|version|margin|2010|005896|gs|regexLib|body|center|align|noBrush|require|childNodes|DTD|xhtml1|head|org|w3|url|preventDefault|container|tr|getLineNumbersHtml|isNaN|userAgent|tbody|isLineHighlighted|quick|void|innerHTML|create|table|links|auto|smart|tab|stripBrs|tabs|bloggerMode|collapsed|plain|getCodeLinesHtml|caption|getMatchesHtml|findMatches|figureOutLineNumbers|removeNestedMatches|getTitleHtml|brushNotHtmlScript|substring|createElement|Highlighter|load|HtmlScript|Brush|pre|expand|multiline|min|Can|ignoreCase|find|blur|extended|toLowerCase|aliases|addEventListener|innerText|textContent|wasn|select|createTextNode|removeChild|option|same|frame|xmlns|dtd|twice|1999|equiv|meta|htmlscript|transitional|1E3|expected|PUBLIC|DOCTYPE|on|W3C|XHTML|TR|EN|Transitional||configured|srcElement|Object|after|run|dblclick|matchChain|valueOf|constructor|default|switch|click|round|execAt|forHtmlScript|token|gimy|functions|getKeywords|1E6|escape|within|random|sgi|another|finally|supply|MSIE|ie|toUpperCase|catch|returnValue|definition|event|border|imsx|constructing|one|Infinity|from|when|Content|cellpadding|flags|cellspacing|try|xhtml|Type|spaces|2930402|hosted_button_id|lastIndexOf|donate|active|development|keep|to|xclick|_s|Xml|please|like|you|paypal|cgi|cmd|webscr|bin|highlighted|scrollbars|aspScriptTags|phpScriptTags|sort|max|scriptScriptTags|toolbar_item|_|command|command_|number|getElementById|doubleQuotedString|singleLinePerlComments|singleLineCComments|multiLineCComments|singleQuotedString|multiLineDoubleQuotedString|xmlComments|alt|multiLineSingleQuotedString|If|https|1em|000|fff|background|5em|xx|bottom|75em|Gorbatchev|large|serif|CDATA|continue|utf|charset|content|About|family|sans|Helvetica|Arial|Geneva|3em|nogutter|Copyright|syntax|close|write|2004|Alex|open|JavaScript|highlighter|July|02|replaceChild|offset|83'.split('|'),0,{})) diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shLegacy.js b/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shLegacy.js new file mode 100644 index 0000000..6d9fd4d --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/scripts/shLegacy.js @@ -0,0 +1,17 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +eval(function(p,a,c,k,e,d){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('3 u={8:{}};u.8={A:4(c,k,l,m,n,o){4 d(a,b){2 a!=1?a:b}4 f(a){2 a!=1?a.E():1}c=c.I(":");3 g=c[0],e={};t={"r":K};M=1;5=8.5;9(3 j R c)e[c[j]]="r";k=f(d(k,5.C));l=f(d(l,5.D));m=f(d(m,5.s));o=f(d(o,5.Q));n=f(d(n,5["x-y"]));2{P:g,C:d(t[e.O],k),D:d(t[e.N],l),s:d({"r":r}[e.s],m),"x-y":d(4(a,b){9(3 h=T S("^"+b+"\\\\[(?\\\\w+)\\\\]$","U"),i=1,p=0;p tags to the document body + for (i = 0; i < elements.length; i++) + { + var url = brushes[elements[i].params.brush]; + + if (!url) + continue; + + scripts[url] = false; + loadScript(url); + } + + function loadScript(url) + { + var script = document.createElement('script'), + done = false + ; + + script.src = url; + script.type = 'text/javascript'; + script.language = 'javascript'; + script.onload = script.onreadystatechange = function() + { + if (!done && (!this.readyState || this.readyState == 'loaded' || this.readyState == 'complete')) + { + done = true; + scripts[url] = true; + checkAll(); + + // Handle memory leak in IE + script.onload = script.onreadystatechange = null; + script.parentNode.removeChild(script); + } + }; + + // sync way of adding script tags to the page + document.body.appendChild(script); + }; + + function checkAll() + { + for(var url in scripts) + if (scripts[url] == false) + return; + + if (allCalled) + SyntaxHighlighter.highlight(allParams); + }; +}; + +})(); diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/src/shCore.js b/tests/siesta/resources/syntaxhighlighter_3.0.83/src/shCore.js new file mode 100644 index 0000000..4214763 --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/src/shCore.js @@ -0,0 +1,1721 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +// +// Begin anonymous function. This is used to contain local scope variables without polutting global scope. +// +var SyntaxHighlighter = function() { + +// CommonJS +if (typeof(require) != 'undefined' && typeof(XRegExp) == 'undefined') +{ + XRegExp = require('XRegExp').XRegExp; +} + +// Shortcut object which will be assigned to the SyntaxHighlighter variable. +// This is a shorthand for local reference in order to avoid long namespace +// references to SyntaxHighlighter.whatever... +var sh = { + defaults : { + /** Additional CSS class names to be added to highlighter elements. */ + 'class-name' : '', + + /** First line number. */ + 'first-line' : 1, + + /** + * Pads line numbers. Possible values are: + * + * false - don't pad line numbers. + * true - automaticaly pad numbers with minimum required number of leading zeroes. + * [int] - length up to which pad line numbers. + */ + 'pad-line-numbers' : false, + + /** Lines to highlight. */ + 'highlight' : null, + + /** Title to be displayed above the code block. */ + 'title' : null, + + /** Enables or disables smart tabs. */ + 'smart-tabs' : true, + + /** Gets or sets tab size. */ + 'tab-size' : 4, + + /** Enables or disables gutter. */ + 'gutter' : true, + + /** Enables or disables toolbar. */ + 'toolbar' : true, + + /** Enables quick code copy and paste from double click. */ + 'quick-code' : true, + + /** Forces code view to be collapsed. */ + 'collapse' : false, + + /** Enables or disables automatic links. */ + 'auto-links' : true, + + /** Gets or sets light mode. Equavalent to turning off gutter and toolbar. */ + 'light' : false, + + 'html-script' : false + }, + + config : { + space : ' ', + + /** Enables use of tags. */ + scriptScriptTags : { left: /(<|<)\s*script.*?(>|>)/gi, right: /(<|<)\/\s*script\s*(>|>)/gi } + }, + + toolbar: { + /** + * Generates HTML markup for the toolbar. + * @param {Highlighter} highlighter Highlighter instance. + * @return {String} Returns HTML markup. + */ + getHtml: function(highlighter) + { + var html = '
', + items = sh.toolbar.items, + list = items.list + ; + + function defaultGetHtml(highlighter, name) + { + return sh.toolbar.getButtonHtml(highlighter, name, sh.config.strings[name]); + }; + + for (var i = 0; i < list.length; i++) + html += (items[list[i]].getHtml || defaultGetHtml)(highlighter, list[i]); + + html += '
'; + + return html; + }, + + /** + * Generates HTML markup for a regular button in the toolbar. + * @param {Highlighter} highlighter Highlighter instance. + * @param {String} commandName Command name that would be executed. + * @param {String} label Label text to display. + * @return {String} Returns HTML markup. + */ + getButtonHtml: function(highlighter, commandName, label) + { + return '' + label + '' + ; + }, + + /** + * Event handler for a toolbar anchor. + */ + handler: function(e) + { + var target = e.target, + className = target.className || '' + ; + + function getValue(name) + { + var r = new RegExp(name + '_(\\w+)'), + match = r.exec(className) + ; + + return match ? match[1] : null; + }; + + var highlighter = getHighlighterById(findParentElement(target, '.syntaxhighlighter').id), + commandName = getValue('command') + ; + + // execute the toolbar command + if (highlighter && commandName) + sh.toolbar.items[commandName].execute(highlighter); + + // disable default A click behaviour + e.preventDefault(); + }, + + /** Collection of toolbar items. */ + items : { + // Ordered lis of items in the toolbar. Can't expect `for (var n in items)` to be consistent. + list: ['expandSource', 'help'], + + expandSource: { + getHtml: function(highlighter) + { + if (highlighter.getParam('collapse') != true) + return ''; + + var title = highlighter.getParam('title'); + return sh.toolbar.getButtonHtml(highlighter, 'expandSource', title ? title : sh.config.strings.expandSource); + }, + + execute: function(highlighter) + { + var div = getHighlighterDivById(highlighter.id); + removeClass(div, 'collapsed'); + } + }, + + /** Command to display the about dialog window. */ + help: { + execute: function(highlighter) + { + var wnd = popup('', '_blank', 500, 250, 'scrollbars=0'), + doc = wnd.document + ; + + doc.write(sh.config.strings.aboutDialog); + doc.close(); + wnd.focus(); + } + } + } + }, + + /** + * Finds all elements on the page which should be processes by SyntaxHighlighter. + * + * @param {Object} globalParams Optional parameters which override element's + * parameters. Only used if element is specified. + * + * @param {Object} element Optional element to highlight. If none is + * provided, all elements in the current document + * are returned which qualify. + * + * @return {Array} Returns list of { target: DOMElement, params: Object } objects. + */ + findElements: function(globalParams, element) + { + var elements = element ? [element] : toArray(document.getElementsByTagName(sh.config.tagName)), + conf = sh.config, + result = [] + ; + + // support for \ No newline at end of file diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/brushes_tests.html b/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/brushes_tests.html new file mode 100644 index 0000000..e1e2068 --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/brushes_tests.html @@ -0,0 +1,136 @@ + + + + + SyntaxHighlighter Brushes Tests + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/cases/001_basic.html b/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/cases/001_basic.html new file mode 100644 index 0000000..1d57334 --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/cases/001_basic.html @@ -0,0 +1,42 @@ +
+	/**
+	 * multiline comment 
+	 */
+	
+	text
+	
+	// single line comment
+	
+	text
+	
+	"string" text 'string' text "string"
+	"string with \" escape" text 'string with \' escape' text "string with \" escape"
+	
+	var code = '\
+		function helloWorld()\
+		{\
+			// this is great!\
+			for(var i = 0; i <= 1; i++)\
+				alert("yay");\
+		}\
+		';
+
+ + diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/cases/002_brushes.html b/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/cases/002_brushes.html new file mode 100644 index 0000000..e9c64e2 --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/cases/002_brushes.html @@ -0,0 +1,50 @@ +
+
test
+
test
+
test
+
test
+
test
+
test
+
test
+
test
+
test
+
test
+
test
+
test
+
test
+
test
+
test
+
test
+
test
+
test
+
test
+
test
+
test
+
test
+
test
+
test
+
test
+
+ + diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/cases/003_script_tag.html b/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/cases/003_script_tag.html new file mode 100644 index 0000000..9b44292 --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/cases/003_script_tag.html @@ -0,0 +1,42 @@ +
+ +
+ + diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/cases/004_url_parsing.html b/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/cases/004_url_parsing.html new file mode 100644 index 0000000..d489a66 --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/cases/004_url_parsing.html @@ -0,0 +1,43 @@ +
+/**
+ * Please see <http://www.alexgorbatchev.come/?test=1&y=2>
+ */
+var home = "http://www.alexgorbatchev.come/?test=1&y=2;test/1/2/3;";
+// < http://www.gnu.org/licenses/?test=1&y=2 >.
+
+// Test embedded URLs that terminate at a left angle bracket.
+// See bug #28: http://bitbucket.org/alexg/syntaxhighlighter/issue/28/
+"http://www.example.com/song2.mp3";
+
+ + \ No newline at end of file diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/cases/005_no_gutter.html b/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/cases/005_no_gutter.html new file mode 100644 index 0000000..6e6b1be --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/cases/005_no_gutter.html @@ -0,0 +1,33 @@ +
+			public Image getImage(URL url, String name) {
+				try {
+					/*
+					   Regular multiline comment.
+					*/
+				    return getImage(new URL(url, name));
+				} catch (MalformedURLException e) {
+				    return null;
+				}
+			}
+
+ + diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/cases/006_pad_line_numbers.html b/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/cases/006_pad_line_numbers.html new file mode 100644 index 0000000..8ebdd55 --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/cases/006_pad_line_numbers.html @@ -0,0 +1,39 @@ +
+/**
+ * Returns an Image object that can then be painted on the screen. 
+ * The url argument must specify an absolute {@link URL}. The name
+ * argument is a specifier that is relative to the url argument. 
+ *
+ * @param  url  an absolute URL giving the base location of the image
+ * @param  name the location of the image, relative to the url argument
+ * @return      the image at the specified URL
+ * @see         Image
+ */
+
+ + diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/cases/007_collapse.html b/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/cases/007_collapse.html new file mode 100644 index 0000000..2643bb5 --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/cases/007_collapse.html @@ -0,0 +1,60 @@ +
+	/**
+	 * Returns an Image object that can then be painted on the screen. 
+	 * The url argument must specify an absolute {@link URL}. The name
+	 * argument is a specifier that is relative to the url argument. 
+	 *
+	 * @param  url  an absolute URL giving the base location of the image
+	 * @param  name the location of the image, relative to the url argument
+	 * @return      the image at the specified URL
+	 * @see         Image
+	 */
+
+ +
+	/**
+	 * Returns an Image object that can then be painted on the screen. 
+	 * The url argument must specify an absolute {@link URL}. The name
+	 * argument is a specifier that is relative to the url argument. 
+	 *
+	 * @param  url  an absolute URL giving the base location of the image
+	 * @param  name the location of the image, relative to the url argument
+	 * @return      the image at the specified URL
+	 * @see         Image
+	 */
+
+ + diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/cases/007_collapse_interaction.html b/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/cases/007_collapse_interaction.html new file mode 100644 index 0000000..ea72046 --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/cases/007_collapse_interaction.html @@ -0,0 +1,44 @@ + diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/cases/008_first_line.html b/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/cases/008_first_line.html new file mode 100644 index 0000000..169dc38 --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/cases/008_first_line.html @@ -0,0 +1,29 @@ +
+	partial class Foo
+	{
+		function test()
+		{
+			yield return;
+		}
+	}
+
+ + diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/cases/009_class_name.html b/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/cases/009_class_name.html new file mode 100644 index 0000000..f2437d5 --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/cases/009_class_name.html @@ -0,0 +1,32 @@ +
+	public Image getImage(URL url, String name) {
+		try {
+			/*
+			   Regular multiline comment.
+			*/
+		    return getImage(new URL(url, name));
+		} catch (MalformedURLException e) {
+		    return null;
+		}
+	}
+
+ + diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/cases/010_highlight.html b/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/cases/010_highlight.html new file mode 100644 index 0000000..64b6613 --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/cases/010_highlight.html @@ -0,0 +1,70 @@ +
+	public function validateStrongPassword(password:String):Boolean
+	{
+		if (password == null || password.length <= 0)
+		{
+			return false;
+		}
+		
+		return STRONG_PASSWORD_PATTERN.test(password);
+	}
+
+ + + diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/cases/011_smart_tabs.html b/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/cases/011_smart_tabs.html new file mode 100644 index 0000000..d6d62fc --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/cases/011_smart_tabs.html @@ -0,0 +1,98 @@ +
+	the		words	in		this	paragraph
+	should	look	like	they	are
+	evenly	spaced	between	columns
+
+ +
+	the	words	in	this	paragraph
+	should	look	like	they	are
+	evenly	spaced	between	columns
+
+ +
+	the		words	in		this	paragraph
+	should	look	out		of		whack
+	because	smart	tabs	are		disabled
+
+ + diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/cases/012_server_side.html b/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/cases/012_server_side.html new file mode 100644 index 0000000..1bb4217 --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/cases/012_server_side.html @@ -0,0 +1,35 @@ + + +
+
+ + \ No newline at end of file diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/cases/013_html_script.html b/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/cases/013_html_script.html new file mode 100644 index 0000000..c0a1201 --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/cases/013_html_script.html @@ -0,0 +1,34 @@ +
+<hello>
+	<%
+		package free.cafekiwi.gotapi;
+	%>
+</hello>
+
+
+<%= print(); %>
+
+ + \ No newline at end of file diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/cases/014_legacy.html b/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/cases/014_legacy.html new file mode 100644 index 0000000..eb4343e --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/cases/014_legacy.html @@ -0,0 +1,70 @@ +
basic check
+
no toolbar
+
no gutter
+
collapsed
+
first line
+ + diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/commonjs_tests.js b/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/commonjs_tests.js new file mode 100644 index 0000000..cda8162 --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/commonjs_tests.js @@ -0,0 +1,52 @@ +/** + * This is a CommonJS compatibility test. You can run this file with node. + */ +require.paths.unshift(__dirname + '/../scripts'); + +var sys = require('sys'), + shSyntaxHighlighter = require('shCore').SyntaxHighlighter, + code = 'test', + brushes = [ + 'AS3', + 'AppleScript', + 'Bash', + 'CSharp', + 'ColdFusion', + 'Cpp', + 'Css', + 'Delphi', + 'Diff', + 'Erlang', + 'Groovy', + 'JScript', + 'Java', + 'JavaFX', + 'Perl', + 'Php', + 'Plain', + 'PowerShell', + 'Python', + 'Ruby', + 'Sass', + 'Scala', + 'Sql', + 'Vb', + 'Xml' + ] + ; + +brushes.sort(); + +for (var i = 0; i < brushes.length; i++) +{ + var name = brushes[i], + brush = require('shBrush' + name).Brush + ; + + brush = new brush(); + brush.init({ toolbar: false }); + + var result = brush.getHtml(code); + + sys.puts(name + (result != null ? ': ok' : ': NOT OK')); +} diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/js/jquery-1.4.2.js b/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/js/jquery-1.4.2.js new file mode 100644 index 0000000..e414a7e --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/js/jquery-1.4.2.js @@ -0,0 +1,6240 @@ +/*! + * jQuery JavaScript Library v1.4.2 + * http://jquery.com/ + * + * Copyright 2010, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2010, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Sat Feb 13 22:33:48 2010 -0500 + */ +(function( window, undefined ) { + +// 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 ); + }, + + // Map over jQuery in case of overwrite + _jQuery = window.jQuery, + + // Map over the $ in case of overwrite + _$ = window.$, + + // Use the correct document accordingly with window argument (sandbox) + document = window.document, + + // A central reference to the root jQuery(document) + rootjQuery, + + // A simple way to check for HTML strings or ID strings + // (both of which we optimize for) + quickExpr = /^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/, + + // Is it a simple selector + isSimple = /^.[^:#\[\.,]*$/, + + // Check if a string has a non-whitespace character in it + rnotwhite = /\S/, + + // Used for trimming whitespace + rtrim = /^(\s|\u00A0)+|(\s|\u00A0)+$/g, + + // Match a standalone tag + rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, + + // Keep a UserAgent string for use with jQuery.browser + userAgent = navigator.userAgent, + + // For matching the engine and version of the browser + browserMatch, + + // Has the ready events already been bound? + readyBound = false, + + // The functions to execute on DOM ready + readyList = [], + + // The ready event handler + DOMContentLoaded, + + // Save a reference to some core methods + toString = Object.prototype.toString, + hasOwnProperty = Object.prototype.hasOwnProperty, + push = Array.prototype.push, + slice = Array.prototype.slice, + indexOf = Array.prototype.indexOf; + +jQuery.fn = jQuery.prototype = { + init: function( selector, context ) { + 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 ) { + this.context = document; + this[0] = document.body; + this.selector = "body"; + this.length = 1; + return this; + } + + // Handle HTML strings + if ( typeof selector === "string" ) { + // Are we dealing with HTML string or an ID? + 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] ) { + 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 = buildFragment( [ match[1] ], [ doc ] ); + selector = (ret.cacheable ? ret.fragment.cloneNode(true) : ret.fragment).childNodes; + } + + return jQuery.merge( this, selector ); + + // HANDLE: $("#id") + } else { + elem = document.getElementById( match[2] ); + + if ( elem ) { + // 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: $("TAG") + } else if ( !context && /^\w+$/.test( selector ) ) { + this.selector = selector; + this.context = document; + selector = document.getElementsByTagName( selector ); + return jQuery.merge( this, selector ); + + // 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 jQuery( 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.4.2", + + // 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.slice(num)[ 0 ] : 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 = jQuery(); + + 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(); + + // If the DOM is already ready + if ( jQuery.isReady ) { + // Execute the function immediately + fn.call( document, jQuery ); + + // Otherwise, remember the function for later + } else if ( readyList ) { + // Add the function to the wait list + readyList.push( 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 || jQuery(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() { + // copy reference to target object + var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options, name, src, copy; + + // 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 object literal values or arrays + if ( deep && copy && ( jQuery.isPlainObject(copy) || jQuery.isArray(copy) ) ) { + var clone = src && ( jQuery.isPlainObject(src) || jQuery.isArray(src) ) ? src + : jQuery.isArray(copy) ? [] : {}; + + // 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 ) { + window.$ = _$; + + if ( deep ) { + window.jQuery = _jQuery; + } + + return jQuery; + }, + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // Handle when the DOM is ready + ready: function() { + // Make sure that the DOM is not already loaded + if ( !jQuery.isReady ) { + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( !document.body ) { + return setTimeout( jQuery.ready, 13 ); + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If there are functions bound, to execute + if ( readyList ) { + // Execute all of them + var fn, i = 0; + while ( (fn = readyList[ i++ ]) ) { + fn.call( document, jQuery ); + } + + // Reset the list of functions + readyList = null; + } + + // Trigger any bound ready events + if ( jQuery.fn.triggerHandler ) { + jQuery( document ).triggerHandler( "ready" ); + } + } + }, + + bindReady: function() { + if ( readyBound ) { + return; + } + + readyBound = true; + + // Catch cases where $(document).ready() is called after the + // browser event has already occurred. + if ( document.readyState === "complete" ) { + return jQuery.ready(); + } + + // 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 toString.call(obj) === "[object Function]"; + }, + + isArray: function( obj ) { + return toString.call(obj) === "[object Array]"; + }, + + 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 || toString.call(obj) !== "[object Object]" || obj.nodeType || obj.setInterval ) { + return false; + } + + // Not own constructor property must be Object + if ( obj.constructor + && !hasOwnProperty.call(obj, "constructor") + && !hasOwnProperty.call(obj.constructor.prototype, "isPrototypeOf") ) { + 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 || hasOwnProperty.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 ); + + // Make sure the incoming data is actual JSON + // Logic borrowed from http://json.org/json2.js + if ( /^[\],:{}\s]*$/.test(data.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@") + .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]") + .replace(/(?:^|:|,)(?:\s*\[)+/g, "")) ) { + + // Try to use the native JSON parser first + return window.JSON && window.JSON.parse ? + window.JSON.parse( data ) : + (new Function("return " + data))(); + + } else { + jQuery.error( "Invalid JSON: " + data ); + } + }, + + noop: function() {}, + + // Evalulates a script in a global context + globalEval: function( data ) { + if ( data && rnotwhite.test(data) ) { + // Inspired by code by Andrea Giammarchi + // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html + var head = document.getElementsByTagName("head")[0] || document.documentElement, + script = document.createElement("script"); + + script.type = "text/javascript"; + + if ( jQuery.support.scriptEval ) { + script.appendChild( document.createTextNode( data ) ); + } else { + script.text = data; + } + + // Use insertBefore instead of appendChild to circumvent an IE6 bug. + // This arises when a base node is used (#2709). + head.insertBefore( script, head.firstChild ); + head.removeChild( script ); + } + }, + + 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 ( var value = object[0]; + i < length && callback.call( value, i, value ) !== false; value = object[++i] ) {} + } + } + + return object; + }, + + trim: function( text ) { + return (text || "").replace( rtrim, "" ); + }, + + // 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) + if ( array.length == null || typeof array === "string" || jQuery.isFunction(array) || (typeof array !== "function" && array.setInterval) ) { + push.call( ret, array ); + } else { + jQuery.merge( ret, array ); + } + } + + return ret; + }, + + inArray: function( elem, array ) { + if ( array.indexOf ) { + return array.indexOf( elem ); + } + + for ( var i = 0, length = array.length; i < length; i++ ) { + if ( 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 = []; + + // Go through the array, only saving the items + // that pass the validator function + for ( var i = 0, length = elems.length; i < length; i++ ) { + if ( !inv !== !callback( elems[ i ], i ) ) { + ret.push( elems[ i ] ); + } + } + + return ret; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var ret = [], value; + + // Go through the array, translating each of the items to their + // new value (or values). + for ( var i = 0, length = elems.length; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + + return ret.concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + proxy: function( fn, proxy, thisObject ) { + if ( arguments.length === 2 ) { + if ( typeof proxy === "string" ) { + thisObject = fn; + fn = thisObject[ proxy ]; + proxy = undefined; + + } else if ( proxy && !jQuery.isFunction( proxy ) ) { + thisObject = proxy; + proxy = undefined; + } + } + + if ( !proxy && fn ) { + proxy = function() { + return fn.apply( thisObject || this, arguments ); + }; + } + + // Set the guid of unique handler to the same of original handler, so it can be removed + if ( fn ) { + proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; + } + + // So proxy can be declared as an argument + return proxy; + }, + + // Use of jQuery.browser is frowned upon. + // More details: http://docs.jquery.com/Utilities/jQuery.browser + uaMatch: function( ua ) { + ua = ua.toLowerCase(); + + var match = /(webkit)[ \/]([\w.]+)/.exec( ua ) || + /(opera)(?:.*version)?[ \/]([\w.]+)/.exec( ua ) || + /(msie) ([\w.]+)/.exec( ua ) || + !/compatible/.test( ua ) && /(mozilla)(?:.*? rv:([\w.]+))?/.exec( ua ) || + []; + + return { browser: match[1] || "", version: match[2] || "0" }; + }, + + browser: {} +}); + +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; +} + +if ( indexOf ) { + jQuery.inArray = function( elem, array ) { + return indexOf.call( array, elem ); + }; +} + +// 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( error ) { + setTimeout( doScrollCheck, 1 ); + return; + } + + // and execute any waiting functions + jQuery.ready(); +} + +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 || "" ); + } + + if ( elem.parentNode ) { + elem.parentNode.removeChild( elem ); + } +} + +// Mutifunctional method to get and set values to a collection +// The value/s can be optionally by executed if its a function +function access( elems, key, value, exec, fn, pass ) { + var length = elems.length; + + // Setting many attributes + if ( typeof key === "object" ) { + for ( var k in key ) { + 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; +} + +function now() { + return (new Date).getTime(); +} +(function() { + + jQuery.support = {}; + + var root = document.documentElement, + script = document.createElement("script"), + div = document.createElement("div"), + id = "script" + now(); + + div.style.display = "none"; + div.innerHTML = "
a"; + + var all = div.getElementsByTagName("*"), + a = div.getElementsByTagName("a")[0]; + + // Can't get basic test support + if ( !all || !all.length || !a ) { + return; + } + + jQuery.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 insted) + style: /red/.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 that if no value is specified for a checkbox + // that it defaults to "on". + // (WebKit defaults to "" instead) + checkOn: div.getElementsByTagName("input")[0].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: document.createElement("select").appendChild( document.createElement("option") ).selected, + + parentNode: div.removeChild( div.appendChild( document.createElement("div") ) ).parentNode === null, + + // Will be defined later + deleteExpando: true, + checkClone: false, + scriptEval: false, + noCloneEvent: true, + boxModel: null + }; + + script.type = "text/javascript"; + try { + script.appendChild( document.createTextNode( "window." + id + "=1;" ) ); + } catch(e) {} + + root.insertBefore( script, root.firstChild ); + + // Make sure that the execution of code works by injecting a script + // tag with appendChild/createTextNode + // (IE doesn't support this, fails, and uses .text instead) + if ( window[ id ] ) { + jQuery.support.scriptEval = true; + delete window[ id ]; + } + + // Test to see if it's possible to delete an expando from an element + // Fails in Internet Explorer + try { + delete script.test; + + } catch(e) { + jQuery.support.deleteExpando = false; + } + + root.removeChild( script ); + + if ( div.attachEvent && div.fireEvent ) { + div.attachEvent("onclick", function click() { + // Cloning a node shouldn't copy over any + // bound event handlers (IE does this) + jQuery.support.noCloneEvent = false; + div.detachEvent("onclick", click); + }); + div.cloneNode(true).fireEvent("onclick"); + } + + div = document.createElement("div"); + div.innerHTML = ""; + + var fragment = document.createDocumentFragment(); + fragment.appendChild( div.firstChild ); + + // WebKit doesn't clone checked state correctly in fragments + jQuery.support.checkClone = fragment.cloneNode(true).cloneNode(true).lastChild.checked; + + // Figure out if the W3C box model works as expected + // document.body must exist before we can do this + jQuery(function() { + var div = document.createElement("div"); + div.style.width = div.style.paddingLeft = "1px"; + + document.body.appendChild( div ); + jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2; + document.body.removeChild( div ).style.display = 'none'; + + div = null; + }); + + // Technique from Juriy Zaytsev + // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/ + var eventSupported = function( eventName ) { + var el = document.createElement("div"); + eventName = "on" + eventName; + + var isSupported = (eventName in el); + if ( !isSupported ) { + el.setAttribute(eventName, "return;"); + isSupported = typeof el[eventName] === "function"; + } + el = null; + + return isSupported; + }; + + jQuery.support.submitBubbles = eventSupported("submit"); + jQuery.support.changeBubbles = eventSupported("change"); + + // release memory in IE + root = script = div = all = a = null; +})(); + +jQuery.props = { + "for": "htmlFor", + "class": "className", + readonly: "readOnly", + maxlength: "maxLength", + cellspacing: "cellSpacing", + rowspan: "rowSpan", + colspan: "colSpan", + tabindex: "tabIndex", + usemap: "useMap", + frameborder: "frameBorder" +}; +var expando = "jQuery" + now(), uuid = 0, windowData = {}; + +jQuery.extend({ + cache: {}, + + expando:expando, + + // The following elements throw uncatchable exceptions if you + // attempt to add expando properties to them. + noData: { + "embed": true, + "object": true, + "applet": true + }, + + data: function( elem, name, data ) { + if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) { + return; + } + + elem = elem == window ? + windowData : + elem; + + var id = elem[ expando ], cache = jQuery.cache, thisCache; + + if ( !id && typeof name === "string" && data === undefined ) { + return null; + } + + // Compute a unique ID for the element + if ( !id ) { + id = ++uuid; + } + + // Avoid generating a new cache unless none exists and we + // want to manipulate it. + if ( typeof name === "object" ) { + elem[ expando ] = id; + thisCache = cache[ id ] = jQuery.extend(true, {}, name); + + } else if ( !cache[ id ] ) { + elem[ expando ] = id; + cache[ id ] = {}; + } + + thisCache = cache[ id ]; + + // Prevent overriding the named cache with undefined values + if ( data !== undefined ) { + thisCache[ name ] = data; + } + + return typeof name === "string" ? thisCache[ name ] : thisCache; + }, + + removeData: function( elem, name ) { + if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) { + return; + } + + elem = elem == window ? + windowData : + elem; + + var id = elem[ expando ], cache = jQuery.cache, thisCache = cache[ id ]; + + // If we want to remove a specific section of the element's data + if ( name ) { + if ( thisCache ) { + // Remove the section of cache data + delete thisCache[ name ]; + + // If we've removed all the data, remove the element's cache + if ( jQuery.isEmptyObject(thisCache) ) { + jQuery.removeData( elem ); + } + } + + // Otherwise, we want to remove all of the element's data + } else { + if ( jQuery.support.deleteExpando ) { + delete elem[ jQuery.expando ]; + + } else if ( elem.removeAttribute ) { + elem.removeAttribute( jQuery.expando ); + } + + // Completely remove the data cache + delete cache[ id ]; + } + } +}); + +jQuery.fn.extend({ + data: function( key, value ) { + if ( typeof key === "undefined" && this.length ) { + return jQuery.data( this[0] ); + + } else if ( typeof key === "object" ) { + return this.each(function() { + jQuery.data( this, key ); + }); + } + + var parts = key.split("."); + parts[1] = parts[1] ? "." + parts[1] : ""; + + if ( value === undefined ) { + var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); + + if ( data === undefined && this.length ) { + data = jQuery.data( this[0], key ); + } + return data === undefined && parts[1] ? + this.data( parts[0] ) : + data; + } else { + return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function() { + jQuery.data( this, key, value ); + }); + } + }, + + removeData: function( key ) { + return this.each(function() { + jQuery.removeData( this, key ); + }); + } +}); +jQuery.extend({ + queue: function( elem, type, data ) { + if ( !elem ) { + return; + } + + type = (type || "fx") + "queue"; + var q = jQuery.data( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( !data ) { + return q || []; + } + + 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(); + + // 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"); + } + + fn.call(elem, function() { + jQuery.dequeue(elem, type); + }); + } + } +}); + +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( i, elem ) { + 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() { + var elem = this; + setTimeout(function() { + jQuery.dequeue( elem, type ); + }, time ); + }); + }, + + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + } +}); +var rclass = /[\n\t]/g, + rspace = /\s+/, + rreturn = /\r/g, + rspecialurl = /href|src|style/, + rtype = /(button|input)/i, + rfocusable = /(button|input|object|select|textarea)/i, + rclickable = /^(a|area)$/i, + rradiocheck = /radio|checkbox/; + +jQuery.fn.extend({ + attr: function( name, value ) { + return access( this, name, value, true, jQuery.attr ); + }, + + removeAttr: function( name, fn ) { + return this.each(function(){ + jQuery.attr( this, name, "" ); + if ( this.nodeType === 1 ) { + this.removeAttribute( name ); + } + }); + }, + + addClass: function( value ) { + if ( jQuery.isFunction(value) ) { + return this.each(function(i) { + var self = jQuery(this); + self.addClass( value.call(this, i, self.attr("class")) ); + }); + } + + if ( value && typeof value === "string" ) { + var classNames = (value || "").split( rspace ); + + for ( var i = 0, l = this.length; i < l; i++ ) { + var elem = this[i]; + + if ( elem.nodeType === 1 ) { + if ( !elem.className ) { + elem.className = value; + + } else { + var className = " " + elem.className + " ", setClass = elem.className; + for ( var c = 0, cl = classNames.length; c < cl; c++ ) { + if ( className.indexOf( " " + classNames[c] + " " ) < 0 ) { + setClass += " " + classNames[c]; + } + } + elem.className = jQuery.trim( setClass ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + if ( jQuery.isFunction(value) ) { + return this.each(function(i) { + var self = jQuery(this); + self.removeClass( value.call(this, i, self.attr("class")) ); + }); + } + + if ( (value && typeof value === "string") || value === undefined ) { + var classNames = (value || "").split(rspace); + + for ( var i = 0, l = this.length; i < l; i++ ) { + var elem = this[i]; + + if ( elem.nodeType === 1 && elem.className ) { + if ( value ) { + var className = (" " + elem.className + " ").replace(rclass, " "); + for ( var 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) { + var self = jQuery(this); + self.toggleClass( value.call(this, i, self.attr("class"), 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 + " "; + for ( var i = 0, l = this.length; i < l; i++ ) { + if ( (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) { + return true; + } + } + + return false; + }, + + val: function( value ) { + if ( value === undefined ) { + var elem = this[0]; + + if ( elem ) { + if ( jQuery.nodeName( elem, "option" ) ) { + return (elem.attributes.value || {}).specified ? elem.value : elem.text; + } + + // We need to handle select boxes special + if ( jQuery.nodeName( elem, "select" ) ) { + var 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 + for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) { + var option = options[ i ]; + + if ( option.selected ) { + // Get the specifc 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 ); + } + } + + return values; + } + + // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified + if ( rradiocheck.test( elem.type ) && !jQuery.support.checkOn ) { + return elem.getAttribute("value") === null ? "on" : elem.value; + } + + + // Everything else, we just grab the value + return (elem.value || "").replace(rreturn, ""); + + } + + return undefined; + } + + var isFunction = jQuery.isFunction(value); + + return this.each(function(i) { + var self = jQuery(this), val = value; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( isFunction ) { + val = value.call(this, i, self.val()); + } + + // Typecast each time if the value is a Function and the appended + // value is therefore different each time. + if ( typeof val === "number" ) { + val += ""; + } + + if ( jQuery.isArray(val) && rradiocheck.test( this.type ) ) { + this.checked = jQuery.inArray( self.val(), val ) >= 0; + + } else if ( jQuery.nodeName( this, "select" ) ) { + var values = jQuery.makeArray(val); + + jQuery( "option", this ).each(function() { + this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; + }); + + if ( !values.length ) { + this.selectedIndex = -1; + } + + } else { + this.value = val; + } + }); + } +}); + +jQuery.extend({ + attrFn: { + val: true, + css: true, + html: true, + text: true, + data: true, + width: true, + height: true, + offset: true + }, + + attr: function( elem, name, value, pass ) { + // don't set attributes on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) { + return undefined; + } + + if ( pass && name in jQuery.attrFn ) { + return jQuery(elem)[name](value); + } + + var notxml = elem.nodeType !== 1 || !jQuery.isXMLDoc( elem ), + // Whether we are setting (or getting) + set = value !== undefined; + + // Try to normalize/fix the name + name = notxml && jQuery.props[ name ] || name; + + // Only do all the following if this is a node (faster for style) + if ( elem.nodeType === 1 ) { + // These attributes require special treatment + var special = rspecialurl.test( name ); + + // Safari mis-reports the default selected property of an option + // Accessing the parent's selectedIndex property fixes it + if ( name === "selected" && !jQuery.support.optSelected ) { + var parent = elem.parentNode; + if ( parent ) { + parent.selectedIndex; + + // Make sure that it also works with optgroups, see #5701 + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + } + + // If applicable, access the attribute via the DOM 0 way + if ( name in elem && notxml && !special ) { + if ( set ) { + // We can't allow the type property to be changed (since it causes problems in IE) + if ( name === "type" && rtype.test( elem.nodeName ) && elem.parentNode ) { + jQuery.error( "type property can't be changed" ); + } + + elem[ name ] = value; + } + + // browsers index elements by id/name on forms, give priority to attributes. + if ( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) ) { + return elem.getAttributeNode( name ).nodeValue; + } + + // 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/ + if ( name === "tabIndex" ) { + var attributeNode = elem.getAttributeNode( "tabIndex" ); + + return attributeNode && attributeNode.specified ? + attributeNode.value : + rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? + 0 : + undefined; + } + + return elem[ name ]; + } + + if ( !jQuery.support.style && notxml && name === "style" ) { + if ( set ) { + elem.style.cssText = "" + value; + } + + return elem.style.cssText; + } + + if ( set ) { + // convert the value to a string (all browsers do this but IE) see #1070 + elem.setAttribute( name, "" + value ); + } + + var attr = !jQuery.support.hrefNormalized && notxml && special ? + // Some attributes require a special call on IE + elem.getAttribute( name, 2 ) : + elem.getAttribute( name ); + + // Non-existent attributes return null, we normalize to undefined + return attr === null ? undefined : attr; + } + + // elem is actually elem.style ... set the style + // Using attr for specific style information is now deprecated. Use style instead. + return jQuery.style( elem, name, value ); + } +}); +var rnamespaces = /\.(.*)$/, + fcleanup = function( nm ) { + return nm.replace(/[^\w\s\.\|`]/g, function( ch ) { + return "\\" + ch; + }); + }; + +/* + * A number of helper functions used for managing events. + * Many of the ideas behind this code originated from + * Dean Edwards' addEvent library. + */ +jQuery.event = { + + // Bind an event to an element + // Original by Dean Edwards + add: function( elem, types, handler, data ) { + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // For whatever reason, IE has trouble passing the window object + // around, causing it to be cloned in the process + if ( elem.setInterval && ( elem !== window && !elem.frameElement ) ) { + elem = window; + } + + var handleObjIn, handleObj; + + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + } + + // Make sure that the function being executed has a unique ID + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure + var elemData = jQuery.data( elem ); + + // If no elemData is found then we must be trying to bind to one of the + // banned noData elements + if ( !elemData ) { + return; + } + + var events = elemData.events = elemData.events || {}, + eventHandle = elemData.handle, eventHandle; + + if ( !eventHandle ) { + elemData.handle = eventHandle = function() { + // Handle the second event of a trigger and when + // an event is called after a page has unloaded + return typeof jQuery !== "undefined" && !jQuery.event.triggered ? + jQuery.event.handle.apply( eventHandle.elem, arguments ) : + undefined; + }; + } + + // Add elem as a property of the handle function + // This is to prevent a memory leak with non-native events in IE. + eventHandle.elem = elem; + + // Handle multiple events separated by a space + // jQuery(...).bind("mouseover mouseout", fn); + types = types.split(" "); + + var type, i = 0, namespaces; + + while ( (type = types[ i++ ]) ) { + handleObj = handleObjIn ? + jQuery.extend({}, handleObjIn) : + { handler: handler, data: data }; + + // Namespaced event handlers + if ( type.indexOf(".") > -1 ) { + namespaces = type.split("."); + type = namespaces.shift(); + handleObj.namespace = namespaces.slice(0).sort().join("."); + + } else { + namespaces = []; + handleObj.namespace = ""; + } + + handleObj.type = type; + handleObj.guid = handler.guid; + + // Get the current list of functions bound to this event + var handlers = events[ type ], + special = jQuery.event.special[ type ] || {}; + + // Init the event handler queue + if ( !handlers ) { + handlers = events[ type ] = []; + + // Check for a special event handler + // 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 the function to the element's handler list + handlers.push( handleObj ); + + // Keep track of which events have been used, for global triggering + 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, pos ) { + // don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + var ret, type, fn, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType, + elemData = jQuery.data( elem ), + events = elemData && elemData.events; + + if ( !elemData || !events ) { + return; + } + + // types is actually an event object here + if ( types && types.type ) { + handler = types.handler; + types = types.type; + } + + // Unbind all events for the element + if ( !types || typeof types === "string" && types.charAt(0) === "." ) { + types = types || ""; + + for ( type in events ) { + jQuery.event.remove( elem, type + types ); + } + + return; + } + + // Handle multiple events separated by a space + // jQuery(...).unbind("mouseover mouseout", fn); + types = types.split(" "); + + while ( (type = types[ i++ ]) ) { + origType = type; + handleObj = null; + all = type.indexOf(".") < 0; + namespaces = []; + + if ( !all ) { + // Namespaced event handlers + namespaces = type.split("."); + type = namespaces.shift(); + + namespace = new RegExp("(^|\\.)" + + jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)") + } + + eventType = events[ type ]; + + if ( !eventType ) { + continue; + } + + if ( !handler ) { + for ( var j = 0; j < eventType.length; j++ ) { + handleObj = eventType[ j ]; + + if ( all || namespace.test( handleObj.namespace ) ) { + jQuery.event.remove( elem, origType, handleObj.handler, j ); + eventType.splice( j--, 1 ); + } + } + + continue; + } + + special = jQuery.event.special[ type ] || {}; + + for ( var j = pos || 0; j < eventType.length; j++ ) { + handleObj = eventType[ j ]; + + if ( handler.guid === handleObj.guid ) { + // remove the given handler for the given type + if ( all || namespace.test( handleObj.namespace ) ) { + if ( pos == null ) { + eventType.splice( j--, 1 ); + } + + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + + if ( pos != null ) { + break; + } + } + } + + // remove generic event handler if no more handlers exist + if ( eventType.length === 0 || pos != null && eventType.length === 1 ) { + if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) { + removeEvent( elem, type, elemData.handle ); + } + + ret = null; + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + var handle = elemData.handle; + if ( handle ) { + handle.elem = null; + } + + delete elemData.events; + delete elemData.handle; + + if ( jQuery.isEmptyObject( elemData ) ) { + jQuery.removeData( elem ); + } + } + }, + + // bubbling is internal + trigger: function( event, data, elem /*, bubbling */ ) { + // Event object or event type + var type = event.type || event, + bubbling = arguments[3]; + + if ( !bubbling ) { + event = typeof event === "object" ? + // jQuery.Event object + event[expando] ? event : + // Object literal + jQuery.extend( jQuery.Event(type), event ) : + // Just the event type (string) + jQuery.Event(type); + + if ( type.indexOf("!") >= 0 ) { + event.type = type = type.slice(0, -1); + event.exclusive = true; + } + + // Handle a global trigger + if ( !elem ) { + // Don't bubble custom events when global (to avoid too much overhead) + event.stopPropagation(); + + // Only trigger if we've ever bound an event for it + if ( jQuery.event.global[ type ] ) { + jQuery.each( jQuery.cache, function() { + if ( this.events && this.events[type] ) { + jQuery.event.trigger( event, data, this.handle.elem ); + } + }); + } + } + + // Handle triggering a single element + + // don't do events on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) { + return undefined; + } + + // Clean up in case it is reused + event.result = undefined; + event.target = elem; + + // Clone the incoming data, if any + data = jQuery.makeArray( data ); + data.unshift( event ); + } + + event.currentTarget = elem; + + // Trigger the event, it is assumed that "handle" is a function + var handle = jQuery.data( elem, "handle" ); + if ( handle ) { + handle.apply( elem, data ); + } + + var parent = elem.parentNode || elem.ownerDocument; + + // Trigger an inline bound script + try { + if ( !(elem && elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()]) ) { + if ( elem[ "on" + type ] && elem[ "on" + type ].apply( elem, data ) === false ) { + event.result = false; + } + } + + // prevent IE from throwing an error for some elements with some event types, see #3533 + } catch (e) {} + + if ( !event.isPropagationStopped() && parent ) { + jQuery.event.trigger( event, data, parent, true ); + + } else if ( !event.isDefaultPrevented() ) { + var target = event.target, old, + isClick = jQuery.nodeName(target, "a") && type === "click", + special = jQuery.event.special[ type ] || {}; + + if ( (!special._default || special._default.call( elem, event ) === false) && + !isClick && !(target && target.nodeName && jQuery.noData[target.nodeName.toLowerCase()]) ) { + + try { + if ( target[ type ] ) { + // Make sure that we don't accidentally re-trigger the onFOO events + old = target[ "on" + type ]; + + if ( old ) { + target[ "on" + type ] = null; + } + + jQuery.event.triggered = true; + target[ type ](); + } + + // prevent IE from throwing an error for some elements with some event types, see #3533 + } catch (e) {} + + if ( old ) { + target[ "on" + type ] = old; + } + + jQuery.event.triggered = false; + } + } + }, + + handle: function( event ) { + var all, handlers, namespaces, namespace, events; + + event = arguments[0] = jQuery.event.fix( event || window.event ); + event.currentTarget = this; + + // Namespaced event handlers + all = event.type.indexOf(".") < 0 && !event.exclusive; + + if ( !all ) { + namespaces = event.type.split("."); + event.type = namespaces.shift(); + namespace = new RegExp("(^|\\.)" + namespaces.slice(0).sort().join("\\.(?:.*\\.)?") + "(\\.|$)"); + } + + var events = jQuery.data(this, "events"), handlers = events[ event.type ]; + + if ( events && handlers ) { + // Clone the handlers to prevent manipulation + handlers = handlers.slice(0); + + for ( var j = 0, l = handlers.length; j < l; j++ ) { + var handleObj = handlers[ j ]; + + // Filter the functions by class + if ( all || namespace.test( handleObj.namespace ) ) { + // Pass in a reference to the handler function itself + // So that we can later remove it + event.handler = handleObj.handler; + event.data = handleObj.data; + event.handleObj = handleObj; + + var ret = handleObj.handler.apply( this, arguments ); + + if ( ret !== undefined ) { + event.result = ret; + if ( ret === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + + if ( event.isImmediatePropagationStopped() ) { + break; + } + } + } + } + + return event.result; + }, + + props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "), + + fix: function( event ) { + if ( event[ expando ] ) { + return event; + } + + // store a copy of the original event object + // and "clone" to set read-only properties + var originalEvent = event; + event = jQuery.Event( originalEvent ); + + for ( var i = this.props.length, prop; i; ) { + prop = this.props[ --i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Fix target property, if necessary + if ( !event.target ) { + event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either + } + + // check if target is a textnode (safari) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + // Add relatedTarget, if necessary + if ( !event.relatedTarget && event.fromElement ) { + event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement; + } + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && event.clientX != null ) { + var doc = document.documentElement, body = document.body; + event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0); + event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0); + } + + // Add which for key events + if ( !event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode) ) { + event.which = event.charCode || event.keyCode; + } + + // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs) + if ( !event.metaKey && event.ctrlKey ) { + event.metaKey = event.ctrlKey; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && event.button !== undefined ) { + event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) )); + } + + return event; + }, + + // Deprecated, use jQuery.guid instead + guid: 1E8, + + // Deprecated, use jQuery.proxy instead + proxy: jQuery.proxy, + + special: { + ready: { + // Make sure the ready event is setup + setup: jQuery.bindReady, + teardown: jQuery.noop + }, + + live: { + add: function( handleObj ) { + jQuery.event.add( this, handleObj.origType, jQuery.extend({}, handleObj, {handler: liveHandler}) ); + }, + + remove: function( handleObj ) { + var remove = true, + type = handleObj.origType.replace(rnamespaces, ""); + + jQuery.each( jQuery.data(this, "events").live || [], function() { + if ( type === this.origType.replace(rnamespaces, "") ) { + remove = false; + return false; + } + }); + + if ( remove ) { + jQuery.event.remove( this, handleObj.origType, liveHandler ); + } + } + + }, + + beforeunload: { + setup: function( data, namespaces, eventHandle ) { + // We only want to do this special case on windows + if ( this.setInterval ) { + this.onbeforeunload = eventHandle; + } + + return false; + }, + teardown: function( namespaces, eventHandle ) { + if ( this.onbeforeunload === eventHandle ) { + this.onbeforeunload = null; + } + } + } + } +}; + +var removeEvent = document.removeEventListener ? + function( elem, type, handle ) { + elem.removeEventListener( type, handle, false ); + } : + function( elem, type, handle ) { + elem.detachEvent( "on" + type, handle ); + }; + +jQuery.Event = function( src ) { + // Allow instantiation without the 'new' keyword + if ( !this.preventDefault ) { + return new jQuery.Event( src ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + // Event type + } else { + this.type = src; + } + + // timeStamp is buggy for some events on Firefox(#3843) + // So we won't rely on the native value + this.timeStamp = now(); + + // Mark it as fixed + this[ 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) + 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 +}; + +// Checks if an event happened on an element within another element +// Used in jQuery.event.special.mouseenter and mouseleave handlers +var withinElement = function( event ) { + // Check if mouse(over|out) are still within the same parent element + var parent = event.relatedTarget; + + // Firefox sometimes assigns relatedTarget a XUL element + // which we cannot access the parentNode property of + try { + // Traverse up the tree + while ( parent && parent !== this ) { + parent = parent.parentNode; + } + + if ( parent !== this ) { + // set the correct event type + event.type = event.data; + + // handle event if we actually just moused on to a non sub-element + jQuery.event.handle.apply( this, arguments ); + } + + // assuming we've left the element since we most likely mousedover a xul element + } catch(e) { } +}, + +// In case of event delegation, we only need to rename the event.type, +// liveHandler will take care of the rest. +delegate = function( event ) { + event.type = event.data; + jQuery.event.handle.apply( this, arguments ); +}; + +// Create mouseenter and mouseleave events +jQuery.each({ + mouseenter: "mouseover", + mouseleave: "mouseout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + setup: function( data ) { + jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig ); + }, + teardown: function( data ) { + jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement ); + } + }; +}); + +// submit delegation +if ( !jQuery.support.submitBubbles ) { + + jQuery.event.special.submit = { + setup: function( data, namespaces ) { + if ( this.nodeName.toLowerCase() !== "form" ) { + jQuery.event.add(this, "click.specialSubmit", function( e ) { + var elem = e.target, type = elem.type; + + if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) { + return trigger( "submit", this, arguments ); + } + }); + + jQuery.event.add(this, "keypress.specialSubmit", function( e ) { + var elem = e.target, type = elem.type; + + if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) { + return trigger( "submit", this, arguments ); + } + }); + + } else { + return false; + } + }, + + teardown: function( namespaces ) { + jQuery.event.remove( this, ".specialSubmit" ); + } + }; + +} + +// change delegation, happens here so we have bind. +if ( !jQuery.support.changeBubbles ) { + + var formElems = /textarea|input|select/i, + + changeFilters, + + getVal = function( elem ) { + var type = elem.type, val = elem.value; + + if ( type === "radio" || type === "checkbox" ) { + val = elem.checked; + + } else if ( type === "select-multiple" ) { + val = elem.selectedIndex > -1 ? + jQuery.map( elem.options, function( elem ) { + return elem.selected; + }).join("-") : + ""; + + } else if ( elem.nodeName.toLowerCase() === "select" ) { + val = elem.selectedIndex; + } + + return val; + }, + + testChange = function testChange( e ) { + var elem = e.target, data, val; + + if ( !formElems.test( elem.nodeName ) || elem.readOnly ) { + return; + } + + data = jQuery.data( elem, "_change_data" ); + val = getVal(elem); + + // the current data will be also retrieved by beforeactivate + if ( e.type !== "focusout" || elem.type !== "radio" ) { + jQuery.data( elem, "_change_data", val ); + } + + if ( data === undefined || val === data ) { + return; + } + + if ( data != null || val ) { + e.type = "change"; + return jQuery.event.trigger( e, arguments[1], elem ); + } + }; + + jQuery.event.special.change = { + filters: { + focusout: testChange, + + click: function( e ) { + var elem = e.target, type = elem.type; + + if ( type === "radio" || type === "checkbox" || elem.nodeName.toLowerCase() === "select" ) { + return testChange.call( this, e ); + } + }, + + // Change has to be called before submit + // Keydown will be called before keypress, which is used in submit-event delegation + keydown: function( e ) { + var elem = e.target, type = elem.type; + + if ( (e.keyCode === 13 && elem.nodeName.toLowerCase() !== "textarea") || + (e.keyCode === 32 && (type === "checkbox" || type === "radio")) || + type === "select-multiple" ) { + return testChange.call( this, e ); + } + }, + + // Beforeactivate happens also before the previous element is blurred + // with this event you can't trigger a change event, but you can store + // information/focus[in] is not needed anymore + beforeactivate: function( e ) { + var elem = e.target; + jQuery.data( elem, "_change_data", getVal(elem) ); + } + }, + + setup: function( data, namespaces ) { + if ( this.type === "file" ) { + return false; + } + + for ( var type in changeFilters ) { + jQuery.event.add( this, type + ".specialChange", changeFilters[type] ); + } + + return formElems.test( this.nodeName ); + }, + + teardown: function( namespaces ) { + jQuery.event.remove( this, ".specialChange" ); + + return formElems.test( this.nodeName ); + } + }; + + changeFilters = jQuery.event.special.change.filters; +} + +function trigger( type, elem, args ) { + args[0].type = type; + return jQuery.event.handle.apply( elem, args ); +} + +// Create "bubbling" focus and blur events +if ( document.addEventListener ) { + jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { + jQuery.event.special[ fix ] = { + setup: function() { + this.addEventListener( orig, handler, true ); + }, + teardown: function() { + this.removeEventListener( orig, handler, true ); + } + }; + + function handler( e ) { + e = jQuery.event.fix( e ); + e.type = fix; + return jQuery.event.handle.call( this, e ); + } + }); +} + +jQuery.each(["bind", "one"], function( i, name ) { + jQuery.fn[ name ] = function( type, data, fn ) { + // Handle object literals + if ( typeof type === "object" ) { + for ( var key in type ) { + this[ name ](key, data, type[key], fn); + } + return this; + } + + if ( jQuery.isFunction( data ) ) { + fn = data; + data = undefined; + } + + var handler = name === "one" ? jQuery.proxy( fn, function( event ) { + jQuery( this ).unbind( event, handler ); + return fn.apply( this, arguments ); + }) : fn; + + if ( type === "unload" && name !== "one" ) { + this.one( type, data, fn ); + + } else { + for ( var i = 0, l = this.length; i < l; i++ ) { + jQuery.event.add( this[i], type, handler, data ); + } + } + + return this; + }; +}); + +jQuery.fn.extend({ + unbind: function( type, fn ) { + // Handle object literals + if ( typeof type === "object" && !type.preventDefault ) { + for ( var key in type ) { + this.unbind(key, type[key]); + } + + } else { + for ( var i = 0, l = this.length; i < l; i++ ) { + jQuery.event.remove( this[i], type, fn ); + } + } + + return this; + }, + + delegate: function( selector, types, data, fn ) { + return this.live( types, data, fn, selector ); + }, + + undelegate: function( selector, types, fn ) { + if ( arguments.length === 0 ) { + return this.unbind( "live" ); + + } else { + return this.die( types, null, fn, selector ); + } + }, + + trigger: function( type, data ) { + return this.each(function() { + jQuery.event.trigger( type, data, this ); + }); + }, + + triggerHandler: function( type, data ) { + if ( this[0] ) { + var event = jQuery.Event( type ); + event.preventDefault(); + event.stopPropagation(); + jQuery.event.trigger( event, data, this[0] ); + return event.result; + } + }, + + toggle: function( fn ) { + // Save reference to arguments for access in closure + var args = arguments, i = 1; + + // link all the functions, so any of them can unbind this click handler + while ( i < args.length ) { + jQuery.proxy( fn, args[ i++ ] ); + } + + return this.click( jQuery.proxy( fn, 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; + })); + }, + + hover: function( fnOver, fnOut ) { + return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); + } +}); + +var liveMap = { + focus: "focusin", + blur: "focusout", + mouseenter: "mouseover", + mouseleave: "mouseout" +}; + +jQuery.each(["live", "die"], function( i, name ) { + jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) { + var type, i = 0, match, namespaces, preType, + selector = origSelector || this.selector, + context = origSelector ? this : jQuery( this.context ); + + if ( jQuery.isFunction( data ) ) { + fn = data; + data = undefined; + } + + types = (types || "").split(" "); + + while ( (type = types[ i++ ]) != null ) { + match = rnamespaces.exec( type ); + namespaces = ""; + + if ( match ) { + namespaces = match[0]; + type = type.replace( rnamespaces, "" ); + } + + if ( type === "hover" ) { + types.push( "mouseenter" + namespaces, "mouseleave" + namespaces ); + continue; + } + + preType = type; + + if ( type === "focus" || type === "blur" ) { + types.push( liveMap[ type ] + namespaces ); + type = type + namespaces; + + } else { + type = (liveMap[ type ] || type) + namespaces; + } + + if ( name === "live" ) { + // bind live handler + context.each(function(){ + jQuery.event.add( this, liveConvert( type, selector ), + { data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } ); + }); + + } else { + // unbind live handler + context.unbind( liveConvert( type, selector ), fn ); + } + } + + return this; + } +}); + +function liveHandler( event ) { + var stop, elems = [], selectors = [], args = arguments, + related, match, handleObj, elem, j, i, l, data, + events = jQuery.data( this, "events" ); + + // Make sure we avoid non-left-click bubbling in Firefox (#3861) + if ( event.liveFired === this || !events || !events.live || event.button && event.type === "click" ) { + return; + } + + event.liveFired = this; + + var live = events.live.slice(0); + + for ( j = 0; j < live.length; j++ ) { + handleObj = live[j]; + + if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) { + selectors.push( handleObj.selector ); + + } else { + live.splice( j--, 1 ); + } + } + + match = jQuery( event.target ).closest( selectors, event.currentTarget ); + + for ( i = 0, l = match.length; i < l; i++ ) { + for ( j = 0; j < live.length; j++ ) { + handleObj = live[j]; + + if ( match[i].selector === handleObj.selector ) { + elem = match[i].elem; + related = null; + + // Those two events require additional checking + if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) { + related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0]; + } + + if ( !related || related !== elem ) { + elems.push({ elem: elem, handleObj: handleObj }); + } + } + } + } + + for ( i = 0, l = elems.length; i < l; i++ ) { + match = elems[i]; + event.currentTarget = match.elem; + event.data = match.handleObj.data; + event.handleObj = match.handleObj; + + if ( match.handleObj.origHandler.apply( match.elem, args ) === false ) { + stop = false; + break; + } + } + + return stop; +} + +function liveConvert( type, selector ) { + return "live." + (type && type !== "*" ? type + "." : "") + selector.replace(/\./g, "`").replace(/ /g, "&"); +} + +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").split(" "), function( i, name ) { + + // Handle event binding + jQuery.fn[ name ] = function( fn ) { + return fn ? this.bind( name, fn ) : this.trigger( name ); + }; + + if ( jQuery.attrFn ) { + jQuery.attrFn[ name ] = true; + } +}); + +// Prevent memory leaks in IE +// Window isn't included so as not to unbind existing unload events +// More info: +// - http://isaacschlueter.com/2006/10/msie-memory-leaks/ +if ( window.attachEvent && !window.addEventListener ) { + window.attachEvent("onunload", function() { + for ( var id in jQuery.cache ) { + if ( jQuery.cache[ id ].handle ) { + // Try/Catch is to handle iframes being unloaded, see #4280 + try { + jQuery.event.remove( jQuery.cache[ id ].handle.elem ); + } catch(e) {} + } + } + }); +} +/*! + * Sizzle CSS Selector Engine - v1.0 + * Copyright 2009, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){ + +var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, + done = 0, + toString = Object.prototype.toString, + hasDuplicate = false, + baseHasDuplicate = true; + +// 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 || []; + var origContext = context = context || document; + + if ( context.nodeType !== 1 && context.nodeType !== 9 ) { + return []; + } + + if ( !selector || typeof selector !== "string" ) { + return results; + } + + var parts = [], m, set, checkSet, extra, prune = true, contextXML = isXML(context), + soFar = selector; + + // Reset the position of the chunker regexp (start from head) + while ( (chunker.exec(""), m = chunker.exec(soFar)) !== null ) { + soFar = m[3]; + + parts.push( m[1] ); + + if ( m[2] ) { + extra = m[3]; + break; + } + } + + if ( parts.length > 1 && origPOS.exec( selector ) ) { + if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { + set = posProcess( parts[0] + parts[1], context ); + } 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 ); + } + } + } 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]) ) { + var ret = Sizzle.find( parts.shift(), context, contextXML ); + context = ret.expr ? Sizzle.filter( ret.expr, ret.set )[0] : ret.set[0]; + } + + if ( context ) { + var 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 ) { + var 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 ( var i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) { + results.push( set[i] ); + } + } + } else { + for ( var 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.find = function(expr, context, isXML){ + var set, match; + + if ( !expr ) { + return []; + } + + for ( var i = 0, l = Expr.order.length; i < l; i++ ) { + var type = Expr.order[i], match; + + if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { + var left = match[1]; + match.splice(1,1); + + if ( left.substr( left.length - 1 ) !== "\\" ) { + match[1] = (match[1] || "").replace(/\\/g, ""); + set = Expr.find[ type ]( match, context, isXML ); + if ( set != null ) { + expr = expr.replace( Expr.match[ type ], "" ); + break; + } + } + } + } + + if ( !set ) { + set = context.getElementsByTagName("*"); + } + + return {set: set, expr: expr}; +}; + +Sizzle.filter = function(expr, set, inplace, not){ + var old = expr, result = [], curLoop = set, match, anyFound, + isXMLFilter = set && set[0] && isXML(set[0]); + + while ( expr && set.length ) { + for ( var type in Expr.filter ) { + if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) { + var filter = Expr.filter[ type ], found, item, 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 ( var i = 0; (item = curLoop[i]) != null; i++ ) { + if ( item ) { + found = filter( item, match, i, curLoop ); + var 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; +}; + +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|)\s*\]/, + TAG: /^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/, + CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/, + 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"); + } + }, + relative: { + "+": function(checkSet, part){ + var isPartStr = typeof part === "string", + isTag = isPartStr && !/\W/.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 isPartStr = typeof part === "string"; + + if ( isPartStr && !/\W/.test(part) ) { + part = part.toLowerCase(); + + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + if ( elem ) { + var parent = elem.parentNode; + checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; + } + } + } else { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var 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 doneName = done++, checkFn = dirCheck; + + if ( typeof part === "string" && !/\W/.test(part) ) { + var nodeCheck = part = part.toLowerCase(); + checkFn = dirNodeCheck; + } + + checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML); + }, + "~": function(checkSet, part, isXML){ + var doneName = done++, checkFn = dirCheck; + + if ( typeof part === "string" && !/\W/.test(part) ) { + var nodeCheck = part = part.toLowerCase(); + 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]); + return m ? [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){ + return context.getElementsByTagName(match[1]); + } + }, + preFilter: { + CLASS: function(match, curLoop, inplace, result, not, isXML){ + match = " " + match[1].replace(/\\/g, "") + " "; + + 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]/g, " ").indexOf(match) >= 0) ) { + if ( !inplace ) { + result.push( elem ); + } + } else if ( inplace ) { + curLoop[i] = false; + } + } + } + + return false; + }, + ID: function(match){ + return match[1].replace(/\\/g, ""); + }, + TAG: function(match, curLoop){ + return match[1].toLowerCase(); + }, + CHILD: function(match){ + if ( match[1] === "nth" ) { + // 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; + } + + // TODO: Move to normal caching system + match[0] = done++; + + return match; + }, + ATTR: function(match, curLoop, inplace, result, not, isXML){ + var name = match[1].replace(/\\/g, ""); + + if ( !isXML && Expr.attrMap[name] ) { + match[1] = Expr.attrMap[name]; + } + + 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 + 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){ + return "text" === elem.type; + }, + radio: function(elem){ + return "radio" === elem.type; + }, + checkbox: function(elem){ + return "checkbox" === elem.type; + }, + file: function(elem){ + return "file" === elem.type; + }, + password: function(elem){ + return "password" === elem.type; + }, + submit: function(elem){ + return "submit" === elem.type; + }, + image: function(elem){ + return "image" === elem.type; + }, + reset: function(elem){ + return "reset" === elem.type; + }, + button: function(elem){ + return "button" === elem.type || elem.nodeName.toLowerCase() === "button"; + }, + input: function(elem){ + return /input|select|textarea|button/i.test(elem.nodeName); + } + }, + 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 i = 0, l = not.length; i < l; i++ ) { + if ( not[i] === elem ) { + return false; + } + } + + return true; + } else { + Sizzle.error( "Syntax error, unrecognized expression: " + name ); + } + }, + CHILD: function(elem, match){ + var 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': + var first = match[2], last = match[3]; + + if ( first === 1 && last === 0 ) { + return true; + } + + var doneName = match[0], + parent = elem.parentNode; + + if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) { + var count = 0; + for ( node = parent.firstChild; node; node = node.nextSibling ) { + if ( node.nodeType === 1 ) { + node.nodeIndex = ++count; + } + } + parent.sizcache = doneName; + } + + var 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.toLowerCase() === match; + }, + CLASS: function(elem, match){ + return (" " + (elem.className || elem.getAttribute("class")) + " ") + .indexOf( match ) > -1; + }, + ATTR: function(elem, match){ + var name = match[1], + result = 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 === "=" ? + 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; + +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, function(all, num){ + return "\\" + (num - 0 + 1); + })); +} + +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 ret = results || []; + + if ( toString.call(array) === "[object Array]" ) { + Array.prototype.push.apply( ret, array ); + } else { + if ( typeof array.length === "number" ) { + for ( var i = 0, l = array.length; i < l; i++ ) { + ret.push( array[i] ); + } + } else { + for ( var i = 0; array[i]; i++ ) { + ret.push( array[i] ); + } + } + } + + return ret; + }; +} + +var sortOrder; + +if ( document.documentElement.compareDocumentPosition ) { + sortOrder = function( a, b ) { + if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { + if ( a == b ) { + hasDuplicate = true; + } + return a.compareDocumentPosition ? -1 : 1; + } + + var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1; + if ( ret === 0 ) { + hasDuplicate = true; + } + return ret; + }; +} else if ( "sourceIndex" in document.documentElement ) { + sortOrder = function( a, b ) { + if ( !a.sourceIndex || !b.sourceIndex ) { + if ( a == b ) { + hasDuplicate = true; + } + return a.sourceIndex ? -1 : 1; + } + + var ret = a.sourceIndex - b.sourceIndex; + if ( ret === 0 ) { + hasDuplicate = true; + } + return ret; + }; +} else if ( document.createRange ) { + sortOrder = function( a, b ) { + if ( !a.ownerDocument || !b.ownerDocument ) { + if ( a == b ) { + hasDuplicate = true; + } + return a.ownerDocument ? -1 : 1; + } + + var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange(); + aRange.setStart(a, 0); + aRange.setEnd(a, 0); + bRange.setStart(b, 0); + bRange.setEnd(b, 0); + var ret = aRange.compareBoundaryPoints(Range.START_TO_END, bRange); + if ( ret === 0 ) { + hasDuplicate = true; + } + return ret; + }; +} + +// Utility function for retreiving the text value of an array of DOM nodes +function getText( elems ) { + var ret = "", elem; + + for ( var i = 0; elems[i]; i++ ) { + elem = elems[i]; + + // Get the text from text nodes and CDATA nodes + if ( elem.nodeType === 3 || elem.nodeType === 4 ) { + ret += elem.nodeValue; + + // Traverse everything else, except comment nodes + } else if ( elem.nodeType !== 8 ) { + ret += getText( elem.childNodes ); + } + } + + return ret; +} + +// 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(); + form.innerHTML = ""; + + // Inject it into the root element, check its status, and remove it quickly + var root = document.documentElement; + 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 ); + root = form = null; // release memory in IE +})(); + +(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 = ""; + if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && + div.firstChild.getAttribute("href") !== "#" ) { + Expr.attrHandle.href = function(elem){ + return elem.getAttribute("href", 2); + }; + } + + div = null; // release memory in IE +})(); + +if ( document.querySelectorAll ) { + (function(){ + var oldSizzle = Sizzle, div = document.createElement("div"); + div.innerHTML = "

"; + + // 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 && context.nodeType === 9 && !isXML(context) ) { + try { + return makeArray( context.querySelectorAll(query), extra ); + } catch(e){} + } + + return oldSizzle(query, context, extra, seed); + }; + + for ( var prop in oldSizzle ) { + Sizzle[ prop ] = oldSizzle[ prop ]; + } + + div = null; // release memory in IE + })(); +} + +(function(){ + var div = document.createElement("div"); + + div.innerHTML = "
"; + + // 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]); + } + }; + + div = null; // release memory in IE +})(); + +function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + if ( elem ) { + elem = elem[dir]; + var match = false; + + while ( elem ) { + if ( elem.sizcache === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 && !isXML ){ + elem.sizcache = 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 ) { + elem = elem[dir]; + var match = false; + + while ( elem ) { + if ( elem.sizcache === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 ) { + if ( !isXML ) { + elem.sizcache = 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; + } + } +} + +var contains = document.compareDocumentPosition ? function(a, b){ + return !!(a.compareDocumentPosition(b) & 16); +} : function(a, b){ + return a !== b && (a.contains ? a.contains(b) : true); +}; + +var 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){ + var tmpSet = [], later = "", match, + 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 ); + } + + return Sizzle.filter( later, tmpSet ); +}; + +// EXPOSE +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; +jQuery.expr[":"] = jQuery.expr.filters; +jQuery.unique = Sizzle.uniqueSort; +jQuery.text = getText; +jQuery.isXMLDoc = isXML; +jQuery.contains = contains; + +return; + +window.Sizzle = Sizzle; + +})(); +var runtil = /Until$/, + rparentsprev = /^(?:parents|prevUntil|prevAll)/, + // Note: This RegExp should be improved, or likely pulled from Sizzle + rmultiselector = /,/, + slice = Array.prototype.slice; + +// Implement the identical functionality for filter and not +var winnow = function( elements, qualifier, keep ) { + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep(elements, function( elem, i ) { + return !!qualifier.call( elem, i, elem ) === 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; + }); +}; + +jQuery.fn.extend({ + find: function( selector ) { + var ret = this.pushStack( "", "find", selector ), length = 0; + + for ( var 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 ( var n = length; n < ret.length; n++ ) { + for ( var 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 && jQuery.filter( selector, this ).length > 0; + }, + + closest: function( selectors, context ) { + if ( jQuery.isArray( selectors ) ) { + var ret = [], cur = this[0], match, matches = {}, selector; + + if ( cur && selectors.length ) { + for ( var i = 0, l = selectors.length; i < l; i++ ) { + selector = selectors[i]; + + if ( !matches[selector] ) { + matches[selector] = jQuery.expr.match.POS.test( selector ) ? + jQuery( selector, context || this.context ) : + selector; + } + } + + while ( cur && cur.ownerDocument && cur !== context ) { + for ( selector in matches ) { + match = matches[selector]; + + if ( match.jquery ? match.index(cur) > -1 : jQuery(cur).is(match) ) { + ret.push({ selector: selector, elem: cur }); + delete matches[selector]; + } + } + cur = cur.parentNode; + } + } + + return ret; + } + + var pos = jQuery.expr.match.POS.test( selectors ) ? + jQuery( selectors, context || this.context ) : null; + + return this.map(function( i, cur ) { + while ( cur && cur.ownerDocument && cur !== context ) { + if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selectors) ) { + return cur; + } + cur = cur.parentNode; + } + return null; + }); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + if ( !elem || typeof elem === "string" ) { + return jQuery.inArray( this[0], + // If it receives a string, the selector is used + // If it receives nothing, the siblings are used + elem ? jQuery( elem ) : this.parent().children() ); + } + // 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 || this.context ) : + jQuery.makeArray( 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 ); + + if ( !runtil.test( name ) ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + ret = jQuery.filter( selector, ret ); + } + + ret = this.length > 1 ? jQuery.unique( ret ) : ret; + + if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) { + ret = ret.reverse(); + } + + return this.pushStack( ret, name, slice.call(arguments).join(",") ); + }; +}); + +jQuery.extend({ + filter: function( expr, elems, not ) { + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return 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; + } +}); +var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, + rleadingWhitespace = /^\s+/, + rxhtmlTag = /(<([\w:]+)[^>]*?)\/>/g, + rselfClosing = /^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i, + rtagName = /<([\w:]+)/, + rtbody = /"; + }, + wrapMap = { + option: [ 1, "" ], + legend: [ 1, "
", "
" ], + thead: [ 1, "", "
" ], + tr: [ 2, "", "
" ], + td: [ 3, "", "
" ], + col: [ 2, "", "
" ], + area: [ 1, "", "" ], + _default: [ 0, "", "" ] + }; + +wrapMap.optgroup = wrapMap.option; +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +// IE can't serialize and + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

SyntaxHighlighter Highlight Lines Test

+

+
+

+
    + + + +
    +
    + + + + + + + diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/theme_tests.html b/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/theme_tests.html new file mode 100644 index 0000000..da07ecf --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/theme_tests.html @@ -0,0 +1,134 @@ + + + + + SyntaxHighlighter Theme Tests + + + + + +
    + + + + + + + + + diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/webrick.rb b/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/webrick.rb new file mode 100644 index 0000000..0b3c93c --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/webrick.rb @@ -0,0 +1,11 @@ +require 'webrick' +include WEBrick + +s = HTTPServer.new( + :Port => 2010, + :DocumentRoot => Dir::pwd +) +s.mount('/sh/scripts', WEBrick::HTTPServlet::FileHandler, '../scripts') +s.mount('/sh/styles', WEBrick::HTTPServlet::FileHandler, '../styles') +trap('INT') { s.stop } +s.start diff --git a/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/webrick.sh b/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/webrick.sh new file mode 100644 index 0000000..7e249f8 --- /dev/null +++ b/tests/siesta/resources/syntaxhighlighter_3.0.83/tests/webrick.sh @@ -0,0 +1,2 @@ +#!/bin/sh +ruby webrick.rb diff --git a/tests/siesta/siesta-all.js b/tests/siesta/siesta-all.js new file mode 100644 index 0000000..5ed7439 --- /dev/null +++ b/tests/siesta/siesta-all.js @@ -0,0 +1,34766 @@ +/* + +Siesta 2.0.4 +Copyright(c) 2009-2013 Bryntum AB +http://bryntum.com/contact +http://bryntum.com/products/siesta/license + +*/ +;!function () {; +var Joose = {} + +// configuration hash + +Joose.C = typeof JOOSE_CFG != 'undefined' ? JOOSE_CFG : {} + +Joose.is_IE = '\v' == 'v' +Joose.is_NodeJS = Boolean(typeof process != 'undefined' && process.pid) + + +Joose.top = Joose.is_NodeJS && global || this + +Joose.stub = function () { + return function () { throw new Error("Modules can not be instantiated") } +} + + +Joose.VERSION = ({ /*PKGVERSION*/VERSION : '3.50.1' }).VERSION + + +if (typeof module != 'undefined') module.exports = Joose +/*if (!Joose.is_NodeJS) */ +this.Joose = Joose + + +// Static helpers for Arrays +Joose.A = { + + each : function (array, func, scope) { + scope = scope || this + + for (var i = 0, len = array.length; i < len; i++) + if (func.call(scope, array[i], i) === false) return false + }, + + + eachR : function (array, func, scope) { + scope = scope || this + + for (var i = array.length - 1; i >= 0; i--) + if (func.call(scope, array[i], i) === false) return false + }, + + + exists : function (array, value) { + for (var i = 0, len = array.length; i < len; i++) if (array[i] == value) return true + + return false + }, + + + map : function (array, func, scope) { + scope = scope || this + + var res = [] + + for (var i = 0, len = array.length; i < len; i++) + res.push( func.call(scope, array[i], i) ) + + return res + }, + + + grep : function (array, func) { + var a = [] + + Joose.A.each(array, function (t) { + if (func(t)) a.push(t) + }) + + return a + }, + + + remove : function (array, removeEle) { + var a = [] + + Joose.A.each(array, function (t) { + if (t !== removeEle) a.push(t) + }) + + return a + } + +} + +// Static helpers for Strings +Joose.S = { + + saneSplit : function (str, delimeter) { + var res = (str || '').split(delimeter) + + if (res.length == 1 && !res[0]) res.shift() + + return res + }, + + + uppercaseFirst : function (string) { + return string.substr(0, 1).toUpperCase() + string.substr(1, string.length - 1) + }, + + + strToClass : function (name, top) { + var current = top || Joose.top + + Joose.A.each(name.split('.'), function (segment) { + if (current) + current = current[ segment ] + else + return false + }) + + return current + } +} + +var baseFunc = function () {} + +var enumProps = [ 'hasOwnProperty', 'valueOf', 'toString', 'constructor' ] + +var manualEnum = true + +for (var i in { toString : 1 }) manualEnum = false + + +// Static helpers for objects +Joose.O = { + + each : function (object, func, scope) { + scope = scope || this + + for (var i in object) + if (func.call(scope, object[i], i) === false) return false + + if (manualEnum) + return Joose.A.each(enumProps, function (el) { + + if (object.hasOwnProperty(el)) return func.call(scope, object[el], el) + }) + }, + + + eachOwn : function (object, func, scope) { + scope = scope || this + + return Joose.O.each(object, function (value, name) { + if (object.hasOwnProperty(name)) return func.call(scope, value, name) + }, scope) + }, + + + copy : function (source, target) { + target = target || {} + + Joose.O.each(source, function (value, name) { target[name] = value }) + + return target + }, + + + copyOwn : function (source, target) { + target = target || {} + + Joose.O.eachOwn(source, function (value, name) { target[name] = value }) + + return target + }, + + + getMutableCopy : function (object) { + baseFunc.prototype = object + + return new baseFunc() + }, + + + extend : function (target, source) { + return Joose.O.copy(source, target) + }, + + + isEmpty : function (object) { + for (var i in object) if (object.hasOwnProperty(i)) return false + + return true + }, + + + isInstance: function (obj) { + return obj && obj.meta && obj.constructor == obj.meta.c + }, + + + isClass : function (obj) { + return obj && obj.meta && obj.meta.c == obj + }, + + + wantArray : function (obj) { + if (obj instanceof Array) return obj + + return [ obj ] + }, + + + // this was a bug in WebKit, which gives typeof / / == 'function' + // should be monitored and removed at some point in the future + isFunction : function (obj) { + return typeof obj == 'function' && obj.constructor != / /.constructor + } +} + + +//initializers + +Joose.I = { + Array : function () { return [] }, + Object : function () { return {} }, + Function : function () { return arguments.callee }, + Now : function () { return new Date() } +}; +Joose.Proto = Joose.stub() + +Joose.Proto.Empty = Joose.stub() + +Joose.Proto.Empty.meta = {}; +;(function () { + + Joose.Proto.Object = Joose.stub() + + + var SUPER = function () { + var self = SUPER.caller + + if (self == SUPERARG) self = self.caller + + if (!self.SUPER) throw "Invalid call to SUPER" + + return self.SUPER[self.methodName].apply(this, arguments) + } + + + var SUPERARG = function () { + return this.SUPER.apply(this, arguments[0]) + } + + + + Joose.Proto.Object.prototype = { + + SUPERARG : SUPERARG, + SUPER : SUPER, + + INNER : function () { + throw "Invalid call to INNER" + }, + + + BUILD : function (config) { + return arguments.length == 1 && typeof config == 'object' && config || {} + }, + + + initialize: function () { + }, + + + toString: function () { + return "a " + this.meta.name + } + + } + + Joose.Proto.Object.meta = { + constructor : Joose.Proto.Object, + + methods : Joose.O.copy(Joose.Proto.Object.prototype), + attributes : {} + } + + Joose.Proto.Object.prototype.meta = Joose.Proto.Object.meta + +})(); +;(function () { + + Joose.Proto.Class = function () { + return this.initialize(this.BUILD.apply(this, arguments)) || this + } + + var bootstrap = { + + VERSION : null, + AUTHORITY : null, + + constructor : Joose.Proto.Class, + superClass : null, + + name : null, + + attributes : null, + methods : null, + + meta : null, + c : null, + + defaultSuperClass : Joose.Proto.Object, + + + BUILD : function (name, extend) { + this.name = name + + return { __extend__ : extend || {} } + }, + + + initialize: function (props) { + var extend = props.__extend__ + + this.VERSION = extend.VERSION + this.AUTHORITY = extend.AUTHORITY + + delete extend.VERSION + delete extend.AUTHORITY + + this.c = this.extractConstructor(extend) + + this.adaptConstructor(this.c) + + if (extend.constructorOnly) { + delete extend.constructorOnly + return + } + + this.construct(extend) + }, + + + construct : function (extend) { + if (!this.prepareProps(extend)) return + + var superClass = this.superClass = this.extractSuperClass(extend) + + this.processSuperClass(superClass) + + this.adaptPrototype(this.c.prototype) + + this.finalize(extend) + }, + + + finalize : function (extend) { + this.processStem(extend) + + this.extend(extend) + }, + + + //if the extension returns false from this method it should re-enter 'construct' + prepareProps : function (extend) { + return true + }, + + + extractConstructor : function (extend) { + var res = extend.hasOwnProperty('constructor') ? extend.constructor : this.defaultConstructor() + + delete extend.constructor + + return res + }, + + + extractSuperClass : function (extend) { + if (extend.hasOwnProperty('isa') && !extend.isa) throw new Error("Attempt to inherit from undefined superclass [" + this.name + "]") + + var res = extend.isa || this.defaultSuperClass + + delete extend.isa + + return res + }, + + + processStem : function () { + var superMeta = this.superClass.meta + + this.methods = Joose.O.getMutableCopy(superMeta.methods || {}) + this.attributes = Joose.O.getMutableCopy(superMeta.attributes || {}) + }, + + + initInstance : function (instance, props) { + Joose.O.copyOwn(props, instance) + }, + + + defaultConstructor: function () { + return function (arg) { + var BUILD = this.BUILD + + var args = BUILD && BUILD.apply(this, arguments) || arg || {} + + var thisMeta = this.meta + + thisMeta.initInstance(this, args) + + return thisMeta.hasMethod('initialize') && this.initialize(args) || this + } + }, + + + processSuperClass: function (superClass) { + var superProto = superClass.prototype + + //non-Joose superclasses + if (!superClass.meta) { + + var extend = Joose.O.copy(superProto) + + extend.isa = Joose.Proto.Empty + // clear potential value in the `extend.constructor` to prevent it from being modified + delete extend.constructor + + var meta = new this.defaultSuperClass.meta.constructor(null, extend) + + superClass.meta = superProto.meta = meta + + meta.c = superClass + } + + this.c.prototype = Joose.O.getMutableCopy(superProto) + this.c.superClass = superProto + }, + + + adaptConstructor: function (c) { + c.meta = this + + if (!c.hasOwnProperty('toString')) c.toString = function () { return this.meta.name } + }, + + + adaptPrototype: function (proto) { + //this will fix weird semantic of native "constructor" property to more intuitive (idea borrowed from Ext) + proto.constructor = this.c + proto.meta = this + }, + + + addMethod: function (name, func) { + func.SUPER = this.superClass.prototype + + //chrome don't allow to redefine the "name" property + func.methodName = name + + this.methods[name] = func + this.c.prototype[name] = func + }, + + + addAttribute: function (name, init) { + this.attributes[name] = init + this.c.prototype[name] = init + }, + + + removeMethod : function (name) { + delete this.methods[name] + delete this.c.prototype[name] + }, + + + removeAttribute: function (name) { + delete this.attributes[name] + delete this.c.prototype[name] + }, + + + hasMethod: function (name) { + return Boolean(this.methods[name]) + }, + + + hasAttribute: function (name) { + return this.attributes[name] !== undefined + }, + + + hasOwnMethod: function (name) { + return this.hasMethod(name) && this.methods.hasOwnProperty(name) + }, + + + hasOwnAttribute: function (name) { + return this.hasAttribute(name) && this.attributes.hasOwnProperty(name) + }, + + + extend : function (props) { + Joose.O.eachOwn(props, function (value, name) { + if (name != 'meta' && name != 'constructor') + if (Joose.O.isFunction(value) && !value.meta) + this.addMethod(name, value) + else + this.addAttribute(name, value) + }, this) + }, + + + subClassOf : function (classObject, extend) { + return this.subClass(extend, null, classObject) + }, + + + subClass : function (extend, name, classObject) { + extend = extend || {} + extend.isa = classObject || this.c + + return new this.constructor(name, extend).c + }, + + + instantiate : function () { + var f = function () {} + + f.prototype = this.c.prototype + + var obj = new f() + + return this.c.apply(obj, arguments) || obj + } + } + + //micro bootstraping + + Joose.Proto.Class.prototype = Joose.O.getMutableCopy(Joose.Proto.Object.prototype) + + Joose.O.extend(Joose.Proto.Class.prototype, bootstrap) + + Joose.Proto.Class.prototype.meta = new Joose.Proto.Class('Joose.Proto.Class', bootstrap) + + + + Joose.Proto.Class.meta.addMethod('isa', function (someClass) { + var f = function () {} + + f.prototype = this.c.prototype + + return new f() instanceof someClass + }) +})(); +Joose.Managed = Joose.stub() + +Joose.Managed.Property = new Joose.Proto.Class('Joose.Managed.Property', { + + name : null, + + init : null, + value : null, + + definedIn : null, + + + initialize : function (props) { + Joose.Managed.Property.superClass.initialize.call(this, props) + + this.computeValue() + }, + + + computeValue : function () { + this.value = this.init + }, + + + //targetClass is still open at this stage + preApply : function (targetClass) { + }, + + + //targetClass is already open at this stage + postUnApply : function (targetClass) { + }, + + + apply : function (target) { + target[this.name] = this.value + }, + + + isAppliedTo : function (target) { + return target[this.name] == this.value + }, + + + unapply : function (from) { + if (!this.isAppliedTo(from)) throw "Unapply of property [" + this.name + "] from [" + from + "] failed" + + delete from[this.name] + }, + + + cloneProps : function () { + return { + name : this.name, + init : this.init, + definedIn : this.definedIn + } + }, + + + clone : function (name) { + var props = this.cloneProps() + + props.name = name || props.name + + return new this.constructor(props) + } + + +}).c; +Joose.Managed.Property.ConflictMarker = new Joose.Proto.Class('Joose.Managed.Property.ConflictMarker', { + + isa : Joose.Managed.Property, + + apply : function (target) { + throw new Error("Attempt to apply ConflictMarker [" + this.name + "] to [" + target + "]") + } + +}).c; +Joose.Managed.Property.Requirement = new Joose.Proto.Class('Joose.Managed.Property.Requirement', { + + isa : Joose.Managed.Property, + + + apply : function (target) { + if (!target.meta.hasMethod(this.name)) + throw new Error("Requirement [" + this.name + "], defined in [" + this.definedIn.definedIn.name + "] is not satisfied for class [" + target + "]") + }, + + + unapply : function (from) { + } + +}).c; +Joose.Managed.Property.Attribute = new Joose.Proto.Class('Joose.Managed.Property.Attribute', { + + isa : Joose.Managed.Property, + + slot : null, + + + initialize : function () { + Joose.Managed.Property.Attribute.superClass.initialize.apply(this, arguments) + + this.slot = this.name + }, + + + apply : function (target) { + target.prototype[ this.slot ] = this.value + }, + + + isAppliedTo : function (target) { + return target.prototype[ this.slot ] == this.value + }, + + + unapply : function (from) { + if (!this.isAppliedTo(from)) throw "Unapply of property [" + this.name + "] from [" + from + "] failed" + + delete from.prototype[this.slot] + }, + + + clearValue : function (instance) { + delete instance[ this.slot ] + }, + + + hasValue : function (instance) { + return instance.hasOwnProperty(this.slot) + }, + + + getRawValueFrom : function (instance) { + return instance[ this.slot ] + }, + + + setRawValueTo : function (instance, value) { + instance[ this.slot ] = value + + return this + } + +}).c; +Joose.Managed.Property.MethodModifier = new Joose.Proto.Class('Joose.Managed.Property.MethodModifier', { + + isa : Joose.Managed.Property, + + + prepareWrapper : function () { + throw "Abstract method [prepareWrapper] of " + this + " was called" + }, + + + apply : function (target) { + var name = this.name + var targetProto = target.prototype + var isOwn = targetProto.hasOwnProperty(name) + var original = targetProto[name] + var superProto = target.meta.superClass.prototype + + + var originalCall = isOwn ? original : function () { + return superProto[name].apply(this, arguments) + } + + var methodWrapper = this.prepareWrapper({ + name : name, + modifier : this.value, + + isOwn : isOwn, + originalCall : originalCall, + + superProto : superProto, + + target : target + }) + + if (isOwn) methodWrapper.__ORIGINAL__ = original + + methodWrapper.__CONTAIN__ = this.value + methodWrapper.__METHOD__ = this + this.value.displayName = this.getDisplayName(target) + methodWrapper.displayName = 'internal wrapper' + + targetProto[name] = methodWrapper + }, + + + getDisplayName : function (target) { + return target.meta.name + '[' + this.name + ']' + }, + + + isAppliedTo : function (target) { + var targetCont = target.prototype[this.name] + + return targetCont && targetCont.__CONTAIN__ == this.value + }, + + + unapply : function (from) { + var name = this.name + var fromProto = from.prototype + var original = fromProto[name].__ORIGINAL__ + + if (!this.isAppliedTo(from)) throw "Unapply of method [" + name + "] from class [" + from + "] failed" + + //if modifier was applied to own method - restore it + if (original) + fromProto[name] = original + //otherwise - just delete it, to reveal the inherited method + else + delete fromProto[name] + } + +}).c; +Joose.Managed.Property.MethodModifier.Override = new Joose.Proto.Class('Joose.Managed.Property.MethodModifier.Override', { + + isa : Joose.Managed.Property.MethodModifier, + + + prepareWrapper : function (params) { + + var modifier = params.modifier + var originalCall = params.originalCall + var superProto = params.superProto + var superMetaConst = superProto.meta.constructor + + //call to Joose.Proto level, require some additional processing + var isCallToProto = (superMetaConst == Joose.Proto.Class || superMetaConst == Joose.Proto.Object) && !(params.isOwn && originalCall.IS_OVERRIDE) + + var original = originalCall + + if (isCallToProto) original = function () { + var beforeSUPER = this.SUPER + + this.SUPER = superProto.SUPER + + var res = originalCall.apply(this, arguments) + + this.SUPER = beforeSUPER + + return res + } + + var override = function () { + + var beforeSUPER = this.SUPER + + this.SUPER = original + + var res = modifier.apply(this, arguments) + + this.SUPER = beforeSUPER + + return res + } + + override.IS_OVERRIDE = true + + return override + }, + + getDisplayName : function (target) { + return target.meta.name + '[override ' + this.name + ']' + } + + +}).c; +Joose.Managed.Property.MethodModifier.Put = new Joose.Proto.Class('Joose.Managed.Property.MethodModifier.Put', { + + isa : Joose.Managed.Property.MethodModifier.Override, + + + prepareWrapper : function (params) { + + if (params.isOwn) throw "Method [" + params.name + "] is applying over something [" + params.originalCall + "] in class [" + params.target + "]" + + return Joose.Managed.Property.MethodModifier.Put.superClass.prepareWrapper.call(this, params) + }, + + getDisplayName : function (target) { + return target.meta.name + '[' + this.name + ']' + } + + +}).c; +Joose.Managed.Property.MethodModifier.After = new Joose.Proto.Class('Joose.Managed.Property.MethodModifier.After', { + + isa : Joose.Managed.Property.MethodModifier, + + + prepareWrapper : function (params) { + + var modifier = params.modifier + var originalCall = params.originalCall + + return function () { + var res = originalCall.apply(this, arguments) + modifier.apply(this, arguments) + return res + } + }, + + getDisplayName : function (target) { + return target.meta.name + '[after ' + this.name + ']' + } + +}).c; +Joose.Managed.Property.MethodModifier.Before = new Joose.Proto.Class('Joose.Managed.Property.MethodModifier.Before', { + + isa : Joose.Managed.Property.MethodModifier, + + + prepareWrapper : function (params) { + + var modifier = params.modifier + var originalCall = params.originalCall + + return function () { + modifier.apply(this, arguments) + return originalCall.apply(this, arguments) + } + }, + + getDisplayName : function (target) { + return target.meta.name + '[before ' + this.name + ']' + } + +}).c; +Joose.Managed.Property.MethodModifier.Around = new Joose.Proto.Class('Joose.Managed.Property.MethodModifier.Around', { + + isa : Joose.Managed.Property.MethodModifier, + + prepareWrapper : function (params) { + + var modifier = params.modifier + var originalCall = params.originalCall + + var me + + var bound = function () { + return originalCall.apply(me, arguments) + } + + return function () { + me = this + + var boundArr = [ bound ] + boundArr.push.apply(boundArr, arguments) + + return modifier.apply(this, boundArr) + } + }, + + getDisplayName : function (target) { + return target.meta.name + '[around ' + this.name + ']' + } + +}).c; +Joose.Managed.Property.MethodModifier.Augment = new Joose.Proto.Class('Joose.Managed.Property.MethodModifier.Augment', { + + isa : Joose.Managed.Property.MethodModifier, + + + prepareWrapper : function (params) { + + var AUGMENT = function () { + + //populate callstack to the most deep non-augment method + var callstack = [] + + var self = AUGMENT + + do { + callstack.push(self.IS_AUGMENT ? self.__CONTAIN__ : self) + + self = self.IS_AUGMENT && (self.__ORIGINAL__ || self.SUPER[self.methodName]) + } while (self) + + + //save previous INNER + var beforeINNER = this.INNER + + //create new INNER + this.INNER = function () { + var innerCall = callstack.pop() + + return innerCall ? innerCall.apply(this, arguments) : undefined + } + + //augment modifier results in hypotetical INNER call of the same method in subclass + var res = this.INNER.apply(this, arguments) + + //restore previous INNER chain + this.INNER = beforeINNER + + return res + } + + AUGMENT.methodName = params.name + AUGMENT.SUPER = params.superProto + AUGMENT.IS_AUGMENT = true + + return AUGMENT + }, + + getDisplayName : function (target) { + return target.meta.name + '[augment ' + this.name + ']' + } + +}).c; +Joose.Managed.PropertySet = new Joose.Proto.Class('Joose.Managed.PropertySet', { + + isa : Joose.Managed.Property, + + properties : null, + + propertyMetaClass : Joose.Managed.Property, + + + initialize : function (props) { + Joose.Managed.PropertySet.superClass.initialize.call(this, props) + + //XXX this guards the meta roles :) + this.properties = props.properties || {} + }, + + + addProperty : function (name, props) { + var metaClass = props.meta || this.propertyMetaClass + delete props.meta + + props.definedIn = this + props.name = name + + return this.properties[name] = new metaClass(props) + }, + + + addPropertyObject : function (object) { + return this.properties[object.name] = object + }, + + + removeProperty : function (name) { + var prop = this.properties[name] + + delete this.properties[name] + + return prop + }, + + + haveProperty : function (name) { + return this.properties[name] != null + }, + + + haveOwnProperty : function (name) { + return this.haveProperty(name) && this.properties.hasOwnProperty(name) + }, + + + getProperty : function (name) { + return this.properties[name] + }, + + + //includes inherited properties (probably you wants 'eachOwn', which process only "own" (including consumed from Roles) properties) + each : function (func, scope) { + Joose.O.each(this.properties, func, scope || this) + }, + + + eachOwn : function (func, scope) { + Joose.O.eachOwn(this.properties, func, scope || this) + }, + + + //synonym for each + eachAll : function (func, scope) { + this.each(func, scope) + }, + + + cloneProps : function () { + var props = Joose.Managed.PropertySet.superClass.cloneProps.call(this) + + props.propertyMetaClass = this.propertyMetaClass + + return props + }, + + + clone : function (name) { + var clone = this.cleanClone(name) + + clone.properties = Joose.O.copyOwn(this.properties) + + return clone + }, + + + cleanClone : function (name) { + var props = this.cloneProps() + + props.name = name || props.name + + return new this.constructor(props) + }, + + + alias : function (what) { + var props = this.properties + + Joose.O.each(what, function (aliasName, originalName) { + var original = props[originalName] + + if (original) this.addPropertyObject(original.clone(aliasName)) + }, this) + }, + + + exclude : function (what) { + var props = this.properties + + Joose.A.each(what, function (name) { + delete props[name] + }) + }, + + + beforeConsumedBy : function () { + }, + + + flattenTo : function (target) { + var targetProps = target.properties + + this.eachOwn(function (property, name) { + var targetProperty = targetProps[name] + + if (targetProperty instanceof Joose.Managed.Property.ConflictMarker) return + + if (!targetProps.hasOwnProperty(name) || targetProperty == null) { + target.addPropertyObject(property) + return + } + + if (targetProperty == property) return + + target.removeProperty(name) + target.addProperty(name, { + meta : Joose.Managed.Property.ConflictMarker + }) + }, this) + }, + + + composeTo : function (target) { + this.eachOwn(function (property, name) { + if (!target.haveOwnProperty(name)) target.addPropertyObject(property) + }) + }, + + + composeFrom : function () { + if (!arguments.length) return + + var flattening = this.cleanClone() + + Joose.A.each(arguments, function (arg) { + var isDescriptor = !(arg instanceof Joose.Managed.PropertySet) + var propSet = isDescriptor ? arg.propertySet : arg + + propSet.beforeConsumedBy(this, flattening) + + if (isDescriptor) { + if (arg.alias || arg.exclude) propSet = propSet.clone() + if (arg.alias) propSet.alias(arg.alias) + if (arg.exclude) propSet.exclude(arg.exclude) + } + + propSet.flattenTo(flattening) + }, this) + + flattening.composeTo(this) + }, + + + preApply : function (target) { + this.eachOwn(function (property) { + property.preApply(target) + }) + }, + + + apply : function (target) { + this.eachOwn(function (property) { + property.apply(target) + }) + }, + + + unapply : function (from) { + this.eachOwn(function (property) { + property.unapply(from) + }) + }, + + + postUnApply : function (target) { + this.eachOwn(function (property) { + property.postUnApply(target) + }) + } + +}).c +; +var __ID__ = 1 + + +Joose.Managed.PropertySet.Mutable = new Joose.Proto.Class('Joose.Managed.PropertySet.Mutable', { + + isa : Joose.Managed.PropertySet, + + ID : null, + + derivatives : null, + + opened : null, + + composedFrom : null, + + + initialize : function (props) { + Joose.Managed.PropertySet.Mutable.superClass.initialize.call(this, props) + + //initially opened + this.opened = 1 + this.derivatives = {} + this.ID = __ID__++ + this.composedFrom = [] + }, + + + addComposeInfo : function () { + this.ensureOpen() + + Joose.A.each(arguments, function (arg) { + this.composedFrom.push(arg) + + var propSet = arg instanceof Joose.Managed.PropertySet ? arg : arg.propertySet + + propSet.derivatives[this.ID] = this + }, this) + }, + + + removeComposeInfo : function () { + this.ensureOpen() + + Joose.A.each(arguments, function (arg) { + + var i = 0 + + while (i < this.composedFrom.length) { + var propSet = this.composedFrom[i] + propSet = propSet instanceof Joose.Managed.PropertySet ? propSet : propSet.propertySet + + if (arg == propSet) { + delete propSet.derivatives[this.ID] + this.composedFrom.splice(i, 1) + } else i++ + } + + }, this) + }, + + + ensureOpen : function () { + if (!this.opened) throw "Mutation of closed property set: [" + this.name + "]" + }, + + + addProperty : function (name, props) { + this.ensureOpen() + + return Joose.Managed.PropertySet.Mutable.superClass.addProperty.call(this, name, props) + }, + + + addPropertyObject : function (object) { + this.ensureOpen() + + return Joose.Managed.PropertySet.Mutable.superClass.addPropertyObject.call(this, object) + }, + + + removeProperty : function (name) { + this.ensureOpen() + + return Joose.Managed.PropertySet.Mutable.superClass.removeProperty.call(this, name) + }, + + + composeFrom : function () { + this.ensureOpen() + + return Joose.Managed.PropertySet.Mutable.superClass.composeFrom.apply(this, this.composedFrom) + }, + + + open : function () { + this.opened++ + + if (this.opened == 1) { + + Joose.O.each(this.derivatives, function (propSet) { + propSet.open() + }) + + this.deCompose() + } + }, + + + close : function () { + if (!this.opened) throw "Unmatched 'close' operation on property set: [" + this.name + "]" + + if (this.opened == 1) { + this.reCompose() + + Joose.O.each(this.derivatives, function (propSet) { + propSet.close() + }) + } + this.opened-- + }, + + + reCompose : function () { + this.composeFrom() + }, + + + deCompose : function () { + this.eachOwn(function (property, name) { + if (property.definedIn != this) this.removeProperty(name) + }, this) + } + +}).c; +Joose.Managed.StemElement = function () { throw "Modules may not be instantiated." } + +Joose.Managed.StemElement.Attributes = new Joose.Proto.Class('Joose.Managed.StemElement.Attributes', { + + isa : Joose.Managed.PropertySet.Mutable, + + propertyMetaClass : Joose.Managed.Property.Attribute + +}).c +; +Joose.Managed.StemElement.Methods = new Joose.Proto.Class('Joose.Managed.StemElement.Methods', { + + isa : Joose.Managed.PropertySet.Mutable, + + propertyMetaClass : Joose.Managed.Property.MethodModifier.Put, + + + preApply : function () { + }, + + + postUnApply : function () { + } + +}).c; +Joose.Managed.StemElement.Requirements = new Joose.Proto.Class('Joose.Managed.StemElement.Requirements', { + + isa : Joose.Managed.PropertySet.Mutable, + + propertyMetaClass : Joose.Managed.Property.Requirement, + + + + alias : function () { + }, + + + exclude : function () { + }, + + + flattenTo : function (target) { + this.each(function (property, name) { + if (!target.haveProperty(name)) target.addPropertyObject(property) + }) + }, + + + composeTo : function (target) { + this.flattenTo(target) + }, + + + preApply : function () { + }, + + + postUnApply : function () { + } + +}).c; +Joose.Managed.StemElement.MethodModifiers = new Joose.Proto.Class('Joose.Managed.StemElement.MethodModifiers', { + + isa : Joose.Managed.PropertySet.Mutable, + + propertyMetaClass : null, + + + addProperty : function (name, props) { + var metaClass = props.meta + delete props.meta + + props.definedIn = this + props.name = name + + var modifier = new metaClass(props) + var properties = this.properties + + if (!properties[name]) properties[ name ] = [] + + properties[name].push(modifier) + + return modifier + }, + + + addPropertyObject : function (object) { + var name = object.name + var properties = this.properties + + if (!properties[name]) properties[name] = [] + + properties[name].push(object) + + return object + }, + + + //remove only the last modifier + removeProperty : function (name) { + if (!this.haveProperty(name)) return undefined + + var properties = this.properties + var modifier = properties[ name ].pop() + + //if all modifiers were removed - clearing the properties + if (!properties[name].length) Joose.Managed.StemElement.MethodModifiers.superClass.removeProperty.call(this, name) + + return modifier + }, + + + alias : function () { + }, + + + exclude : function () { + }, + + + flattenTo : function (target) { + var targetProps = target.properties + + this.each(function (modifiersArr, name) { + var targetModifiersArr = targetProps[name] + + if (targetModifiersArr == null) targetModifiersArr = targetProps[name] = [] + + Joose.A.each(modifiersArr, function (modifier) { + if (!Joose.A.exists(targetModifiersArr, modifier)) targetModifiersArr.push(modifier) + }) + + }) + }, + + + composeTo : function (target) { + this.flattenTo(target) + }, + + + deCompose : function () { + this.each(function (modifiersArr, name) { + var i = 0 + + while (i < modifiersArr.length) + if (modifiersArr[i].definedIn != this) + modifiersArr.splice(i, 1) + else + i++ + }) + }, + + + preApply : function (target) { + }, + + + postUnApply : function (target) { + }, + + + apply : function (target) { + this.each(function (modifiersArr, name) { + Joose.A.each(modifiersArr, function (modifier) { + modifier.apply(target) + }) + }) + }, + + + unapply : function (from) { + this.each(function (modifiersArr, name) { + for (var i = modifiersArr.length - 1; i >=0 ; i--) modifiersArr[i].unapply(from) + }) + } + + + +}).c; +Joose.Managed.PropertySet.Composition = new Joose.Proto.Class('Joose.Managed.PropertySet.Composition', { + + isa : Joose.Managed.PropertySet.Mutable, + + propertyMetaClass : Joose.Managed.PropertySet.Mutable, + + processOrder : null, + + + each : function (func, scope) { + var props = this.properties + var scope = scope || this + + Joose.A.each(this.processOrder, function (name) { + func.call(scope, props[name], name) + }) + }, + + + eachR : function (func, scope) { + var props = this.properties + var scope = scope || this + + Joose.A.eachR(this.processOrder, function (name) { + func.call(scope, props[name], name) + }) + + +// var props = this.properties +// var processOrder = this.processOrder +// +// for(var i = processOrder.length - 1; i >= 0; i--) +// func.call(scope || this, props[ processOrder[i] ], processOrder[i]) + }, + + + clone : function (name) { + var clone = this.cleanClone(name) + + this.each(function (property) { + clone.addPropertyObject(property.clone()) + }) + + return clone + }, + + + alias : function (what) { + this.each(function (property) { + property.alias(what) + }) + }, + + + exclude : function (what) { + this.each(function (property) { + property.exclude(what) + }) + }, + + + flattenTo : function (target) { + var targetProps = target.properties + + this.each(function (property, name) { + var subTarget = targetProps[name] || target.addProperty(name, { + meta : property.constructor + }) + + property.flattenTo(subTarget) + }) + }, + + + composeTo : function (target) { + var targetProps = target.properties + + this.each(function (property, name) { + var subTarget = targetProps[name] || target.addProperty(name, { + meta : property.constructor + }) + + property.composeTo(subTarget) + }) + }, + + + + deCompose : function () { + this.eachR(function (property) { + property.open() + }) + + Joose.Managed.PropertySet.Composition.superClass.deCompose.call(this) + }, + + + reCompose : function () { + Joose.Managed.PropertySet.Composition.superClass.reCompose.call(this) + + this.each(function (property) { + property.close() + }) + }, + + + unapply : function (from) { + this.eachR(function (property) { + property.unapply(from) + }) + } + +}).c +; +Joose.Managed.Stem = new Joose.Proto.Class('Joose.Managed.Stem', { + + isa : Joose.Managed.PropertySet.Composition, + + targetMeta : null, + + attributesMC : Joose.Managed.StemElement.Attributes, + methodsMC : Joose.Managed.StemElement.Methods, + requirementsMC : Joose.Managed.StemElement.Requirements, + methodsModifiersMC : Joose.Managed.StemElement.MethodModifiers, + + processOrder : [ 'attributes', 'methods', 'requirements', 'methodsModifiers' ], + + + initialize : function (props) { + Joose.Managed.Stem.superClass.initialize.call(this, props) + + var targetMeta = this.targetMeta + + this.addProperty('attributes', { + meta : this.attributesMC, + + //it can be no 'targetMeta' in clones + properties : targetMeta ? targetMeta.attributes : {} + }) + + + this.addProperty('methods', { + meta : this.methodsMC, + + properties : targetMeta ? targetMeta.methods : {} + }) + + + this.addProperty('requirements', { + meta : this.requirementsMC + }) + + + this.addProperty('methodsModifiers', { + meta : this.methodsModifiersMC + }) + }, + + + reCompose : function () { + var c = this.targetMeta.c + + this.preApply(c) + + Joose.Managed.Stem.superClass.reCompose.call(this) + + this.apply(c) + }, + + + deCompose : function () { + var c = this.targetMeta.c + + this.unapply(c) + + Joose.Managed.Stem.superClass.deCompose.call(this) + + this.postUnApply(c) + } + + +}).c +; +Joose.Managed.Builder = new Joose.Proto.Class('Joose.Managed.Builder', { + + targetMeta : null, + + + _buildStart : function (targetMeta, props) { + targetMeta.stem.open() + + Joose.A.each([ 'trait', 'traits', 'removeTrait', 'removeTraits', 'does', 'doesnot', 'doesnt' ], function (builder) { + if (props[builder]) { + this[builder](targetMeta, props[builder]) + delete props[builder] + } + }, this) + }, + + + _extend : function (props) { + if (Joose.O.isEmpty(props)) return + + var targetMeta = this.targetMeta + + this._buildStart(targetMeta, props) + + Joose.O.eachOwn(props, function (value, name) { + var handler = this[name] + + if (!handler) throw new Error("Unknown builder [" + name + "] was used during extending of [" + targetMeta.c + "]") + + handler.call(this, targetMeta, value) + }, this) + + this._buildComplete(targetMeta, props) + }, + + + _buildComplete : function (targetMeta, props) { + targetMeta.stem.close() + }, + + + methods : function (targetMeta, info) { + Joose.O.eachOwn(info, function (value, name) { + targetMeta.addMethod(name, value) + }) + }, + + + removeMethods : function (targetMeta, info) { + Joose.A.each(info, function (name) { + targetMeta.removeMethod(name) + }) + }, + + + have : function (targetMeta, info) { + Joose.O.eachOwn(info, function (value, name) { + targetMeta.addAttribute(name, value) + }) + }, + + + havenot : function (targetMeta, info) { + Joose.A.each(info, function (name) { + targetMeta.removeAttribute(name) + }) + }, + + + havent : function (targetMeta, info) { + this.havenot(targetMeta, info) + }, + + + after : function (targetMeta, info) { + Joose.O.each(info, function (value, name) { + targetMeta.addMethodModifier(name, value, Joose.Managed.Property.MethodModifier.After) + }) + }, + + + before : function (targetMeta, info) { + Joose.O.each(info, function (value, name) { + targetMeta.addMethodModifier(name, value, Joose.Managed.Property.MethodModifier.Before) + }) + }, + + + override : function (targetMeta, info) { + Joose.O.each(info, function (value, name) { + targetMeta.addMethodModifier(name, value, Joose.Managed.Property.MethodModifier.Override) + }) + }, + + + around : function (targetMeta, info) { + Joose.O.each(info, function (value, name) { + targetMeta.addMethodModifier(name, value, Joose.Managed.Property.MethodModifier.Around) + }) + }, + + + augment : function (targetMeta, info) { + Joose.O.each(info, function (value, name) { + targetMeta.addMethodModifier(name, value, Joose.Managed.Property.MethodModifier.Augment) + }) + }, + + + removeModifier : function (targetMeta, info) { + Joose.A.each(info, function (name) { + targetMeta.removeMethodModifier(name) + }) + }, + + + does : function (targetMeta, info) { + Joose.A.each(Joose.O.wantArray(info), function (desc) { + targetMeta.addRole(desc) + }) + }, + + + doesnot : function (targetMeta, info) { + Joose.A.each(Joose.O.wantArray(info), function (desc) { + targetMeta.removeRole(desc) + }) + }, + + + doesnt : function (targetMeta, info) { + this.doesnot(targetMeta, info) + }, + + + trait : function () { + this.traits.apply(this, arguments) + }, + + + traits : function (targetMeta, info) { + if (targetMeta.firstPass) return + + if (!targetMeta.meta.isDetached) throw "Can't apply trait to not detached class" + + targetMeta.meta.extend({ + does : info + }) + }, + + + removeTrait : function () { + this.removeTraits.apply(this, arguments) + }, + + + removeTraits : function (targetMeta, info) { + if (!targetMeta.meta.isDetached) throw "Can't remove trait from not detached class" + + targetMeta.meta.extend({ + doesnot : info + }) + }, + + name : function (targetMeta, name) { + targetMeta.name = name + } + +}).c; +Joose.Managed.Class = new Joose.Proto.Class('Joose.Managed.Class', { + + isa : Joose.Proto.Class, + + stem : null, + stemClass : Joose.Managed.Stem, + stemClassCreated : false, + + builder : null, + builderClass : Joose.Managed.Builder, + builderClassCreated : false, + + isDetached : false, + firstPass : true, + + // a special instance, which, when passed as 1st argument to constructor, signifies that constructor should + // skips traits processing for this instance + skipTraitsAnchor : {}, + + + //build for metaclasses - collects traits from roles + BUILD : function () { + var sup = Joose.Managed.Class.superClass.BUILD.apply(this, arguments) + + var props = sup.__extend__ + + var traits = Joose.O.wantArray(props.trait || props.traits || []) + delete props.trait + delete props.traits + + Joose.A.each(Joose.O.wantArray(props.does || []), function (arg) { + var role = (arg.meta instanceof Joose.Managed.Class) ? arg : arg.role + + if (role.meta.meta.isDetached) traits.push(role.meta.constructor) + }) + + if (traits.length) props.traits = traits + + return sup + }, + + + initInstance : function (instance, props) { + Joose.O.each(this.attributes, function (attribute, name) { + + if (attribute instanceof Joose.Managed.Attribute) + attribute.initFromConfig(instance, props) + else + if (props.hasOwnProperty(name)) instance[name] = props[name] + }) + }, + + + // we are using the same constructor for usual and meta- classes + defaultConstructor: function () { + return function (skipTraitsAnchor, params) { + + var thisMeta = this.meta + var skipTraits = skipTraitsAnchor == thisMeta.skipTraitsAnchor + + var BUILD = this.BUILD + + var props = BUILD && BUILD.apply(this, skipTraits ? params : arguments) || (skipTraits ? params[0] : skipTraitsAnchor) || {} + + + // either looking for traits in __extend__ (meta-class) or in usual props (usual class) + var extend = props.__extend__ || props + + var traits = extend.trait || extend.traits + + if (traits || extend.detached) { + delete extend.trait + delete extend.traits + delete extend.detached + + if (!skipTraits) { + var classWithTrait = thisMeta.subClass({ does : traits || [] }, thisMeta.name) + var meta = classWithTrait.meta + meta.isDetached = true + + return meta.instantiate(thisMeta.skipTraitsAnchor, arguments) + } + } + + thisMeta.initInstance(this, props) + + return thisMeta.hasMethod('initialize') && this.initialize(props) || this + } + }, + + + finalize: function (extend) { + Joose.Managed.Class.superClass.finalize.call(this, extend) + + this.stem.close() + + this.afterMutate() + }, + + + processStem : function () { + Joose.Managed.Class.superClass.processStem.call(this) + + this.builder = new this.builderClass({ targetMeta : this }) + this.stem = new this.stemClass({ name : this.name, targetMeta : this }) + + var builderClass = this.getClassInAttribute('builderClass') + + if (builderClass) { + this.builderClassCreated = true + this.addAttribute('builderClass', this.subClassOf(builderClass)) + } + + + var stemClass = this.getClassInAttribute('stemClass') + + if (stemClass) { + this.stemClassCreated = true + this.addAttribute('stemClass', this.subClassOf(stemClass)) + } + }, + + + extend : function (props) { + if (props.builder) { + this.getBuilderTarget().meta.extend(props.builder) + delete props.builder + } + + if (props.stem) { + this.getStemTarget().meta.extend(props.stem) + delete props.stem + } + + this.builder._extend(props) + + this.firstPass = false + + if (!this.stem.opened) this.afterMutate() + }, + + + getBuilderTarget : function () { + var builderClass = this.getClassInAttribute('builderClass') + if (!builderClass) throw "Attempt to extend a builder on non-meta class" + + return builderClass + }, + + + getStemTarget : function () { + var stemClass = this.getClassInAttribute('stemClass') + if (!stemClass) throw "Attempt to extend a stem on non-meta class" + + return stemClass + }, + + + getClassInAttribute : function (attributeName) { + var attrClass = this.getAttribute(attributeName) + if (attrClass instanceof Joose.Managed.Property.Attribute) attrClass = attrClass.value + + return attrClass + }, + + + addMethodModifier: function (name, func, type) { + var props = {} + + props.init = func + props.meta = type + + return this.stem.properties.methodsModifiers.addProperty(name, props) + }, + + + removeMethodModifier: function (name) { + return this.stem.properties.methodsModifiers.removeProperty(name) + }, + + + addMethod: function (name, func, props) { + props = props || {} + props.init = func + + return this.stem.properties.methods.addProperty(name, props) + }, + + + addAttribute: function (name, init, props) { + props = props || {} + props.init = init + + return this.stem.properties.attributes.addProperty(name, props) + }, + + + removeMethod : function (name) { + return this.stem.properties.methods.removeProperty(name) + }, + + + removeAttribute: function (name) { + return this.stem.properties.attributes.removeProperty(name) + }, + + + hasMethod: function (name) { + return this.stem.properties.methods.haveProperty(name) + }, + + + hasAttribute: function (name) { + return this.stem.properties.attributes.haveProperty(name) + }, + + + hasMethodModifiersFor : function (name) { + return this.stem.properties.methodsModifiers.haveProperty(name) + }, + + + hasOwnMethod: function (name) { + return this.stem.properties.methods.haveOwnProperty(name) + }, + + + hasOwnAttribute: function (name) { + return this.stem.properties.attributes.haveOwnProperty(name) + }, + + + getMethod : function (name) { + return this.stem.properties.methods.getProperty(name) + }, + + + getAttribute : function (name) { + return this.stem.properties.attributes.getProperty(name) + }, + + + eachRole : function (roles, func, scope) { + Joose.A.each(roles, function (arg, index) { + var role = (arg.meta instanceof Joose.Managed.Class) ? arg : arg.role + + func.call(scope || this, arg, role, index) + }, this) + }, + + + addRole : function () { + + this.eachRole(arguments, function (arg, role) { + + this.beforeRoleAdd(role) + + var desc = arg + + //compose descriptor can contain 'alias' and 'exclude' fields, in this case actual reference should be stored + //into 'propertySet' field + if (role != arg) { + desc.propertySet = role.meta.stem + delete desc.role + } else + desc = desc.meta.stem + + this.stem.addComposeInfo(desc) + + }, this) + }, + + + beforeRoleAdd : function (role) { + var roleMeta = role.meta + + if (roleMeta.builderClassCreated) this.getBuilderTarget().meta.extend({ + does : [ roleMeta.getBuilderTarget() ] + }) + + if (roleMeta.stemClassCreated) this.getStemTarget().meta.extend({ + does : [ roleMeta.getStemTarget() ] + }) + + if (roleMeta.meta.isDetached && !this.firstPass) this.builder.traits(this, roleMeta.constructor) + }, + + + beforeRoleRemove : function (role) { + var roleMeta = role.meta + + if (roleMeta.builderClassCreated) this.getBuilderTarget().meta.extend({ + doesnt : [ roleMeta.getBuilderTarget() ] + }) + + if (roleMeta.stemClassCreated) this.getStemTarget().meta.extend({ + doesnt : [ roleMeta.getStemTarget() ] + }) + + if (roleMeta.meta.isDetached && !this.firstPass) this.builder.removeTraits(this, roleMeta.constructor) + }, + + + removeRole : function () { + this.eachRole(arguments, function (arg, role) { + this.beforeRoleRemove(role) + + this.stem.removeComposeInfo(role.meta.stem) + }, this) + }, + + + getRoles : function () { + + return Joose.A.map(this.stem.composedFrom, function (composeDesc) { + //compose descriptor can contain 'alias' and 'exclude' fields, in this case actual reference is stored + //into 'propertySet' field + if (!(composeDesc instanceof Joose.Managed.PropertySet)) return composeDesc.propertySet + + return composeDesc.targetMeta.c + }) + }, + + + does : function (role) { + var myRoles = this.getRoles() + + for (var i = 0; i < myRoles.length; i++) if (role == myRoles[i]) return true + for (var i = 0; i < myRoles.length; i++) if (myRoles[i].meta.does(role)) return true + + var superMeta = this.superClass.meta + + // considering the case of inheriting from non-Joose classes + if (this.superClass != Joose.Proto.Empty && superMeta && superMeta.meta && superMeta.meta.hasMethod('does')) return superMeta.does(role) + + return false + }, + + + getMethods : function () { + return this.stem.properties.methods + }, + + + getAttributes : function () { + return this.stem.properties.attributes + }, + + + afterMutate : function () { + }, + + + getCurrentMethod : function () { + for (var wrapper = arguments.callee.caller, count = 0; wrapper && count < 5; wrapper = wrapper.caller, count++) + if (wrapper.__METHOD__) return wrapper.__METHOD__ + + return null + } + + +}).c; +Joose.Managed.Role = new Joose.Managed.Class('Joose.Managed.Role', { + + isa : Joose.Managed.Class, + + have : { + defaultSuperClass : Joose.Proto.Empty, + + builderRole : null, + stemRole : null + }, + + + methods : { + + defaultConstructor : function () { + return function () { + throw new Error("Roles cant be instantiated") + } + }, + + + processSuperClass : function () { + if (this.superClass != this.defaultSuperClass) throw new Error("Roles can't inherit from anything") + }, + + + getBuilderTarget : function () { + if (!this.builderRole) { + this.builderRole = new this.constructor().c + this.builderClassCreated = true + } + + return this.builderRole + }, + + + getStemTarget : function () { + if (!this.stemRole) { + this.stemRole = new this.constructor().c + this.stemClassCreated = true + } + + return this.stemRole + }, + + + addRequirement : function (methodName) { + this.stem.properties.requirements.addProperty(methodName, {}) + } + + }, + + + stem : { + methods : { + + apply : function () { + }, + + + unapply : function () { + } + } + }, + + + builder : { + methods : { + requires : function (targetClassMeta, info) { + Joose.A.each(Joose.O.wantArray(info), function (methodName) { + targetClassMeta.addRequirement(methodName) + }, this) + } + } + } + +}).c; +Joose.Managed.Attribute = new Joose.Managed.Class('Joose.Managed.Attribute', { + + isa : Joose.Managed.Property.Attribute, + + have : { + is : null, + + builder : null, + + isPrivate : false, + + role : null, + + publicName : null, + setterName : null, + getterName : null, + + //indicates the logical readableness/writeableness of the attribute + readable : false, + writeable : false, + + //indicates the physical presense of the accessor (may be absent for "combined" accessors for example) + hasGetter : false, + hasSetter : false, + + required : false, + + canInlineSetRaw : true, + canInlineGetRaw : true + }, + + + after : { + initialize : function () { + var name = this.name + + this.publicName = name.replace(/^_+/, '') + + this.slot = this.isPrivate ? '$' + name : name + + this.setterName = this.setterName || this.getSetterName() + this.getterName = this.getterName || this.getGetterName() + + this.readable = this.hasGetter = /^r/i.test(this.is) + this.writeable = this.hasSetter = /^.w/i.test(this.is) + } + }, + + + override : { + + computeValue : function () { + var init = this.init + + if (Joose.O.isClass(init) || !Joose.O.isFunction(init)) this.SUPER() + }, + + + preApply : function (targetClass) { + targetClass.meta.extend({ + methods : this.getAccessorsFor(targetClass) + }) + }, + + + postUnApply : function (from) { + from.meta.extend({ + removeMethods : this.getAccessorsFrom(from) + }) + } + + }, + + + methods : { + + getAccessorsFor : function (targetClass) { + var targetMeta = targetClass.meta + var setterName = this.setterName + var getterName = this.getterName + + var methods = {} + + if (this.hasSetter && !targetMeta.hasMethod(setterName)) { + methods[setterName] = this.getSetter() + methods[setterName].ACCESSOR_FROM = this + } + + if (this.hasGetter && !targetMeta.hasMethod(getterName)) { + methods[getterName] = this.getGetter() + methods[getterName].ACCESSOR_FROM = this + } + + return methods + }, + + + getAccessorsFrom : function (from) { + var targetMeta = from.meta + var setterName = this.setterName + var getterName = this.getterName + + var setter = this.hasSetter && targetMeta.getMethod(setterName) + var getter = this.hasGetter && targetMeta.getMethod(getterName) + + var removeMethods = [] + + if (setter && setter.value.ACCESSOR_FROM == this) removeMethods.push(setterName) + if (getter && getter.value.ACCESSOR_FROM == this) removeMethods.push(getterName) + + return removeMethods + }, + + + getGetterName : function () { + return 'get' + Joose.S.uppercaseFirst(this.publicName) + }, + + + getSetterName : function () { + return 'set' + Joose.S.uppercaseFirst(this.publicName) + }, + + + getSetter : function () { + var me = this + var slot = me.slot + + if (me.canInlineSetRaw) + return function (value) { + this[ slot ] = value + + return this + } + else + return function () { + return me.setRawValueTo.apply(this, arguments) + } + }, + + + getGetter : function () { + var me = this + var slot = me.slot + + if (me.canInlineGetRaw) + return function (value) { + return this[ slot ] + } + else + return function () { + return me.getRawValueFrom.apply(this, arguments) + } + }, + + + getValueFrom : function (instance) { + var getterName = this.getterName + + if (this.readable && instance.meta.hasMethod(getterName)) return instance[ getterName ]() + + return this.getRawValueFrom(instance) + }, + + + setValueTo : function (instance, value) { + var setterName = this.setterName + + if (this.writeable && instance.meta.hasMethod(setterName)) + instance[ setterName ](value) + else + this.setRawValueTo(instance, value) + }, + + + initFromConfig : function (instance, config) { + var name = this.name + + var value, isSet = false + + if (config.hasOwnProperty(name)) { + value = config[name] + isSet = true + } else { + var init = this.init + + // simple function (not class) has been used as "init" value + if (Joose.O.isFunction(init) && !Joose.O.isClass(init)) { + + value = init.call(instance, config, name) + + isSet = true + + } else if (this.builder) { + + value = instance[ this.builder.replace(/^this\./, '') ](config, name) + isSet = true + } + } + + if (isSet) + this.setRawValueTo(instance, value) + else + if (this.required) throw new Error("Required attribute [" + name + "] is missed during initialization of " + instance) + } + } + +}).c +; +Joose.Managed.Attribute.Builder = new Joose.Managed.Role('Joose.Managed.Attribute.Builder', { + + + have : { + defaultAttributeClass : Joose.Managed.Attribute + }, + + builder : { + + methods : { + + has : function (targetClassMeta, info) { + Joose.O.eachOwn(info, function (props, name) { + if (typeof props != 'object' || props == null || props.constructor == / /.constructor) props = { init : props } + + props.meta = props.meta || targetClassMeta.defaultAttributeClass + + if (/^__/.test(name)) { + name = name.replace(/^_+/, '') + + props.isPrivate = true + } + + targetClassMeta.addAttribute(name, props.init, props) + }, this) + }, + + + hasnot : function (targetClassMeta, info) { + this.havenot(targetClassMeta, info) + }, + + + hasnt : function (targetClassMeta, info) { + this.hasnot(targetClassMeta, info) + } + } + + } + +}).c +; +Joose.Managed.My = new Joose.Managed.Role('Joose.Managed.My', { + + have : { + myClass : null, + + needToReAlias : false + }, + + + methods : { + createMy : function (extend) { + var thisMeta = this.meta + var isRole = this instanceof Joose.Managed.Role + + var myExtend = extend.my || {} + delete extend.my + + // Symbiont will generally have the same meta class as its hoster, excepting the cases, when the superclass also have the symbiont. + // In such cases, the meta class for symbiont will be inherited (unless explicitly specified) + var superClassMy = this.superClass.meta.myClass + + if (!isRole && !myExtend.isa && superClassMy) myExtend.isa = superClassMy + + + if (!myExtend.meta && !myExtend.isa) myExtend.meta = this.constructor + + myExtend.name = this.name + '.my' + + var createdClass = this.myClass = Class(myExtend) + + var c = this.c + + c.prototype.my = c.my = isRole ? createdClass : new createdClass({ HOST : c }) + + this.needToReAlias = true + }, + + + aliasStaticMethods : function () { + this.needToReAlias = false + + var c = this.c + var myProto = this.myClass.prototype + + Joose.O.eachOwn(c, function (property, name) { + if (property.IS_ALIAS) delete c[ name ] + }) + + this.myClass.meta.stem.properties.methods.each(function (method, name) { + + if (!c[ name ]) + (c[ name ] = function () { + return myProto[ name ].apply(c.my, arguments) + }).IS_ALIAS = true + }) + } + }, + + + override : { + + extend : function (props) { + var myClass = this.myClass + + if (!myClass && this.superClass.meta.myClass) this.createMy(props) + + if (props.my) { + if (!myClass) + this.createMy(props) + else { + this.needToReAlias = true + + myClass.meta.extend(props.my) + delete props.my + } + } + + this.SUPER(props) + + if (this.needToReAlias && !(this instanceof Joose.Managed.Role)) this.aliasStaticMethods() + } + }, + + + before : { + + addRole : function () { + var myStem + + Joose.A.each(arguments, function (arg) { + + if (!arg) throw new Error("Attempt to consume an undefined Role into [" + this.name + "]") + + //instanceof Class to allow treat classes as roles + var role = (arg.meta instanceof Joose.Managed.Class) ? arg : arg.role + + if (role.meta.meta.hasAttribute('myClass') && role.meta.myClass) { + + if (!this.myClass) { + this.createMy({ + my : { + does : role.meta.myClass + } + }) + return + } + + myStem = this.myClass.meta.stem + if (!myStem.opened) myStem.open() + + myStem.addComposeInfo(role.my.meta.stem) + } + }, this) + + if (myStem) { + myStem.close() + + this.needToReAlias = true + } + }, + + + removeRole : function () { + if (!this.myClass) return + + var myStem = this.myClass.meta.stem + myStem.open() + + Joose.A.each(arguments, function (role) { + if (role.meta.meta.hasAttribute('myClass') && role.meta.myClass) { + myStem.removeComposeInfo(role.my.meta.stem) + + this.needToReAlias = true + } + }, this) + + myStem.close() + } + + } + +}).c; +Joose.Namespace = Joose.stub() + +Joose.Namespace.Able = new Joose.Managed.Role('Joose.Namespace.Able', { + + have : { + bodyFunc : null + }, + + + before : { + extend : function (extend) { + if (extend.body) { + this.bodyFunc = extend.body + delete extend.body + } + } + }, + + + after: { + + afterMutate : function () { + var bodyFunc = this.bodyFunc + delete this.bodyFunc + + if (bodyFunc) Joose.Namespace.Manager.my.executeIn(this.c, bodyFunc) + } + } + +}).c; +Joose.Managed.Bootstrap = new Joose.Managed.Role('Joose.Managed.Bootstrap', { + + does : [ Joose.Namespace.Able, Joose.Managed.My, Joose.Managed.Attribute.Builder ] + +}).c +; +Joose.Meta = Joose.stub() + + +Joose.Meta.Object = new Joose.Proto.Class('Joose.Meta.Object', { + + isa : Joose.Proto.Object + +}).c + + +; +Joose.Meta.Class = new Joose.Managed.Class('Joose.Meta.Class', { + + isa : Joose.Managed.Class, + + does : Joose.Managed.Bootstrap, + + have : { + defaultSuperClass : Joose.Meta.Object + } + +}).c + +; +Joose.Meta.Role = new Joose.Meta.Class('Joose.Meta.Role', { + + isa : Joose.Managed.Role, + + does : Joose.Managed.Bootstrap + +}).c; +Joose.Namespace.Keeper = new Joose.Meta.Class('Joose.Namespace.Keeper', { + + isa : Joose.Meta.Class, + + have : { + externalConstructor : null + }, + + + methods: { + + defaultConstructor: function () { + + return function () { + //constructors should assume that meta is attached to 'arguments.callee' (not to 'this') + var thisMeta = arguments.callee.meta + + if (thisMeta instanceof Joose.Namespace.Keeper) throw new Error("Module [" + thisMeta.c + "] may not be instantiated. Forgot to 'use' the class with the same name?") + + var externalConstructor = thisMeta.externalConstructor + + if (typeof externalConstructor == 'function') { + + externalConstructor.meta = thisMeta + + return externalConstructor.apply(this, arguments) + } + + throw "NamespaceKeeper of [" + thisMeta.name + "] was planted incorrectly." + } + }, + + + //withClass should be not constructed yet on this stage (see Joose.Proto.Class.construct) + //it should be on the 'constructorOnly' life stage (should already have constructor) + plant: function (withClass) { + var keeper = this.c + + keeper.meta = withClass.meta + + keeper.meta.c = keeper + keeper.meta.externalConstructor = withClass + } + } + +}).c + + +; +Joose.Namespace.Manager = new Joose.Managed.Class('Joose.Namespace.Manager', { + + have : { + current : null + }, + + + methods : { + + initialize : function () { + this.current = [ Joose.top ] + }, + + + getCurrent: function () { + return this.current[0] + }, + + + executeIn : function (ns, func) { + var current = this.current + + current.unshift(ns) + var res = func.call(ns, ns) + current.shift() + + return res + }, + + + earlyCreate : function (name, metaClass, props) { + props.constructorOnly = true + + return new metaClass(name, props).c + }, + + + //this function establishing the full "namespace chain" (including the last element) + create : function (nsName, metaClass, extend) { + + //if no name provided, then we creating an anonymous class, so just skip all the namespace manipulations + if (!nsName) return new metaClass(nsName, extend).c + + var me = this + + if (/^\./.test(nsName)) return this.executeIn(Joose.top, function () { + return me.create(nsName.replace(/^\./, ''), metaClass, extend) + }) + + var props = extend || {} + + var parts = Joose.S.saneSplit(nsName, '.') + var object = this.getCurrent() + var soFar = object == Joose.top ? [] : Joose.S.saneSplit(object.meta.name, '.') + + for (var i = 0; i < parts.length; i++) { + var part = parts[i] + var isLast = i == parts.length - 1 + + if (part == "meta" || part == "my" || !part) throw "Module name [" + nsName + "] may not include a part called 'meta' or 'my' or empty part." + + var cur = object[part] + + soFar.push(part) + + var soFarName = soFar.join(".") + var needFinalize = false + var nsKeeper + + // if the namespace segment is empty + if (typeof cur == "undefined") { + if (isLast) { + // perform "early create" which just fills the namespace segment with right constructor + // this allows us to have a right constructor in the namespace segment when the `body` will be called + nsKeeper = this.earlyCreate(soFarName, metaClass, props) + needFinalize = true + } else + nsKeeper = new Joose.Namespace.Keeper(soFarName).c + + object[part] = nsKeeper + + cur = nsKeeper + + } else if (isLast && cur && cur.meta) { + + var currentMeta = cur.meta + + if (metaClass == Joose.Namespace.Keeper) + //`Module` over something case - extend the original + currentMeta.extend(props) + else { + + if (currentMeta instanceof Joose.Namespace.Keeper) { + + currentMeta.plant(this.earlyCreate(soFarName, metaClass, props)) + + needFinalize = true + } else + throw new Error("Double declaration of [" + soFarName + "]") + } + + } else + if (isLast && !(cur && cur.meta && cur.meta.meta)) throw "Trying to setup module " + soFarName + " failed. There is already something: " + cur + + // hook to allow embedd resource into meta + if (isLast) this.prepareMeta(cur.meta) + + if (needFinalize) cur.meta.construct(props) + + object = cur + } + + return object + }, + + + prepareMeta : function () { + }, + + + prepareProperties : function (name, props, defaultMeta, callback) { + if (name && typeof name != 'string') { + props = name + name = null + } + + var meta + + if (props && props.meta) { + meta = props.meta + delete props.meta + } + + if (!meta) + if (props && typeof props.isa == 'function' && props.isa.meta) + meta = props.isa.meta.constructor + else + meta = defaultMeta + + return callback.call(this, name, meta, props) + }, + + + getDefaultHelperFor : function (metaClass) { + var me = this + + return function (name, props) { + return me.prepareProperties(name, props, metaClass, function (name, meta, props) { + return me.create(name, meta, props) + }) + } + }, + + + register : function (helperName, metaClass, func) { + var me = this + + if (this.meta.hasMethod(helperName)) { + + var helper = function () { + return me[ helperName ].apply(me, arguments) + } + + if (!Joose.top[ helperName ]) Joose.top[ helperName ] = helper + if (!Joose[ helperName ]) Joose[ helperName ] = helper + + if (Joose.is_NodeJS && typeof exports != 'undefined') exports[ helperName ] = helper + + } else { + var methods = {} + + methods[ helperName ] = func || this.getDefaultHelperFor(metaClass) + + this.meta.extend({ + methods : methods + }) + + this.register(helperName) + } + }, + + + Module : function (name, props) { + return this.prepareProperties(name, props, Joose.Namespace.Keeper, function (name, meta, props) { + if (typeof props == 'function') props = { body : props } + + return this.create(name, meta, props) + }) + } + } + +}).c + +Joose.Namespace.Manager.my = new Joose.Namespace.Manager() + +Joose.Namespace.Manager.my.register('Class', Joose.Meta.Class) +Joose.Namespace.Manager.my.register('Role', Joose.Meta.Role) +Joose.Namespace.Manager.my.register('Module') + + +// for the rest of the package +var Class = Joose.Class +var Role = Joose.Role +; +Role('Joose.Attribute.Delegate', { + + have : { + handles : null + }, + + + override : { + + eachDelegate : function (handles, func, scope) { + if (typeof handles == 'string') return func.call(scope, handles, handles) + + if (handles instanceof Array) + return Joose.A.each(handles, function (delegateTo) { + + func.call(scope, delegateTo, delegateTo) + }) + + if (handles === Object(handles)) + Joose.O.eachOwn(handles, function (delegateTo, handleAs) { + + func.call(scope, handleAs, delegateTo) + }) + }, + + + getAccessorsFor : function (targetClass) { + var targetMeta = targetClass.meta + var methods = this.SUPER(targetClass) + + var me = this + + this.eachDelegate(this.handles, function (handleAs, delegateTo) { + + if (!targetMeta.hasMethod(handleAs)) { + var handler = methods[ handleAs ] = function () { + var attrValue = me.getValueFrom(this) + + return attrValue[ delegateTo ].apply(attrValue, arguments) + } + + handler.ACCESSOR_FROM = me + } + }) + + return methods + }, + + + getAccessorsFrom : function (from) { + var methods = this.SUPER(from) + + var me = this + var targetMeta = from.meta + + this.eachDelegate(this.handles, function (handleAs) { + + var handler = targetMeta.getMethod(handleAs) + + if (handler && handler.value.ACCESSOR_FROM == me) methods.push(handleAs) + }) + + return methods + } + } +}) + +; +Role('Joose.Attribute.Trigger', { + + have : { + trigger : null + }, + + + after : { + initialize : function() { + if (this.trigger) { + if (!this.writeable) throw new Error("Can't use `trigger` for read-only attributes") + + this.hasSetter = true + } + } + }, + + + override : { + + getSetter : function() { + var original = this.SUPER() + var trigger = this.trigger + + if (!trigger) return original + + var me = this + var init = Joose.O.isFunction(me.init) ? null : me.init + + return function () { + var oldValue = me.hasValue(this) ? me.getValueFrom(this) : init + + var res = original.apply(this, arguments) + + trigger.call(this, me.getValueFrom(this), oldValue) + + return res + } + } + } +}) + +; +Role('Joose.Attribute.Lazy', { + + + have : { + lazy : null + }, + + + before : { + computeValue : function () { + if (typeof this.init == 'function' && this.lazy) { + this.lazy = this.init + delete this.init + } + } + }, + + + after : { + initialize : function () { + if (this.lazy) this.readable = this.hasGetter = true + } + }, + + + override : { + + getGetter : function () { + var original = this.SUPER() + var lazy = this.lazy + + if (!lazy) return original + + var me = this + + return function () { + if (!me.hasValue(this)) { + var initializer = typeof lazy == 'function' ? lazy : this[ lazy.replace(/^this\./, '') ] + + me.setValueTo(this, initializer.apply(this, arguments)) + } + + return original.call(this) + } + } + } +}) + +; +Role('Joose.Attribute.Accessor.Combined', { + + + have : { + isCombined : false + }, + + + after : { + initialize : function() { + this.isCombined = this.isCombined || /..c/i.test(this.is) + + if (this.isCombined) { + this.slot = '$$' + this.name + + this.hasGetter = true + this.hasSetter = false + + this.setterName = this.getterName = this.publicName + } + } + }, + + + override : { + + getGetter : function() { + var getter = this.SUPER() + + if (!this.isCombined) return getter + + var setter = this.getSetter() + + var me = this + + return function () { + + if (!arguments.length) { + if (me.readable) return getter.call(this) + throw new Error("Call to getter of unreadable attribute: [" + me.name + "]") + } + + if (me.writeable) return setter.apply(this, arguments) + + throw new Error("Call to setter of read-only attribute: [" + me.name + "]") + } + } + } + +}) + +; +Joose.Managed.Attribute.meta.extend({ + does : [ Joose.Attribute.Delegate, Joose.Attribute.Trigger, Joose.Attribute.Lazy, Joose.Attribute.Accessor.Combined ] +}) + +; +Role('Joose.Meta.Singleton', { + + has : { + forceInstance : Joose.I.Object, + instance : null + }, + + + + override : { + + defaultConstructor : function () { + var meta = this + var previous = this.SUPER() + + this.adaptConstructor(previous) + + return function (forceInstance, params) { + if (forceInstance == meta.forceInstance) return previous.apply(this, params) || this + + var instance = meta.instance + + if (instance) { + if (meta.hasMethod('configure')) instance.configure.apply(instance, arguments) + } else + meta.instance = new meta.c(meta.forceInstance, arguments) + + return meta.instance + } + } + } + + +}) + + +Joose.Namespace.Manager.my.register('Singleton', Class({ + isa : Joose.Meta.Class, + meta : Joose.Meta.Class, + + does : Joose.Meta.Singleton +})) +; +; +}();; +; +Class('Scope.Provider', { + + /*PKGVERSION*/VERSION : 0.12, + + has : { + scope : null, + + seedingCode : null, + seedingScript : null, + + preload : { + is : 'ro', + init : Joose.I.Array + }, + + cleanupCallback : null, + beforeCleanupCallback : null + }, + + + methods : { + + isCSS : function (url) { + return /\.css(\?.*)?$/i.test(url) + }, + + + isAlreadySetUp : function () { + return Boolean(this.scope) + }, + + + addPreload : function (preloadDesc) { + if (this.isAlreadySetUp()) throw new Error("Can't use `addPreload` - scope is already setup. Use `runCode/runScript` instead") + + if (typeof preloadDesc == 'string') + + if (this.isCSS(preloadDesc)) + preloadDesc = { + type : 'css', + url : preloadDesc + } + else + preloadDesc = { + type : 'js', + url : preloadDesc + } + else + + if (preloadDesc.text) + preloadDesc = { + type : 'js', + content : preloadDesc.text + } + + if (!preloadDesc.type) throw new Error("Preload descriptor must have the `type` property") + + this.preload.push(preloadDesc) + }, + + + addOnErrorHandler : function (handler, callback) { + throw "Abstract method `addOnErrorHandler` of Scope.Provider called" + }, + + + create : function () { + throw "Abstract method `create` of Scope.Provider called" + }, + + + setup : function (callback) { + throw "Abstract method `setup` of Scope.Provider called" + }, + + + cleanup : function (callback) { + throw "Abstract method `cleanup` of Scope.Provider called" + }, + + + runCode : function (text, callback) { + throw "Abstract method `runCode` of Scope.Provider called" + }, + + + runScript : function (url, callback) { + throw "Abstract method `runScript` of Scope.Provider called" + } + } +}) + + +Scope.Provider.__ONLOAD__ = {} +Scope.Provider.__ONERROR__ = {}; +Role('Scope.Provider.Role.WithDOM', { + + requires : [ 'getDocument', 'create', 'getPreload', 'isAlreadySetUp' ], + + has : { + useStrictMode : true, + sourceURL : null, + + minViewportSize : null, + + parentWindow : function () { return window }, + scopeId : function () { return Math.round(Math.random() * 1e10) }, + + // init function + attachToOnError : function () { + + // returns the value of the attribute + return function (window, scopeId, handler, preventDefault) { + + var prevHandler = window.onerror + if (prevHandler && prevHandler.__SP_MANAGED__) return + + window.onerror = function (message, url, lineNumber) { + // prevent recursive calls if other authors politely did not overwrite the handler and will call it + if (handler.__CALLING__) return + + handler.__CALLING__ = true + + prevHandler && prevHandler.apply(this, arguments) + + handler.apply(this, arguments) + + handler.__CALLING__ = false + + // in FF/IE need to return `true` to prevent default action + if (preventDefault !== false) return window.WebKitPoint ? false : true + } + + window.onerror.__SP_MANAGED__ = true + } + }, + + // this is a "cached" onerror handler - a handler which was provided before the scope + // has started the creation process - should be installed ASAP in the creation process + // to allow catching of the exceptions in the scope with `sourceURL` + cachedOnError : null + }, + + + override : { + + cleanup : function () { + this.scope.onerror = null + + this.SUPERARG(arguments) + + this.scope = null + } + }, + + + methods : { + + cleanupHanlders : function () { + var scopeProvider = this.parentWindow.Scope.Provider + + delete scopeProvider.__ONLOAD__[ this.scopeId ] + delete scopeProvider.__ONERROR__[ this.scopeId ] + }, + + + getHead : function () { + return this.getDocument().getElementsByTagName('head')[ 0 ] + }, + + + installOnErrorHandler : function (handler) { + if (!this.isAlreadySetUp()) throw "Scope should be already set up" + + this.attachToOnError(this.scope, this.scopeId, handler) + }, + + + addOnErrorHandler : function (handler, preventDefault) { + handler.__SP_MANAGED__ = true + + if (this.cachedOnError && this.cachedOnError != handler) throw "Can only install one on error handler" + this.cachedOnError = handler + + var scopeId = this.scopeId + + this.parentWindow.Scope.Provider.__ONERROR__[ scopeId ] = handler + + var attachToOnError = ';(' + this.attachToOnError.toString() + ')(window, ' + scopeId + ', (window.opener || window.parent).Scope.Provider.__ONERROR__[ ' + scopeId + ' ], ' + preventDefault + ');' + + if (this.isAlreadySetUp()) + this.runCode(attachToOnError) + else { + // this is a fallback - run the "attachToOnError" from inside of scope + this.getPreload().unshift({ + type : 'js', + content : attachToOnError, + unordered : true + }) + } + }, + + + addSeedingToPreload : function () { + var preload = this.getPreload() + + if (this.seedingCode) preload.unshift({ + type : 'js', + content : this.seedingCode + }) + + if (this.seedingScript) preload.push({ + type : 'js', + url : this.seedingScript + }) + }, + + + setup : function (callback) { + var isIE = 'v' == '\v' || Boolean(this.parentWindow.msWriteProfilerMark) +// var isOpera = Object.prototype.toString.call(this.parentWindow.opera) == '[object Opera]' + var hasInlineScript = false + + Joose.A.each(this.getPreload(), function (preloadDesc) { + // IE will execute the inline scripts ASAP, this might be not what we want (inline script might be need executed only after some url script) + // its however ok in some cases (like adding `onerror` handler + // such inline scripts should be marked with `unordered` - true + if (preloadDesc.type == 'js' && preloadDesc.content && !preloadDesc.unordered) { + hasInlineScript = true + + return false + } + }) + + if (this.sourceURL || isIE && hasInlineScript) { + this.addSeedingToPreload() + + this.setupIncrementally(callback) + + } else { + // for sane browsers just add the seeding code and seeding script to preloads + if (!isIE) this.addSeedingToPreload() + + // seeding scripts are included only for sane browsers (not IE) + this.setupWithDocWrite(callback, isIE) + } + }, + + + setupWithDocWrite : function (callback, needToSeed) { + var html = [] + var me = this + + Joose.A.each(this.getPreload(), function (preloadDesc) { + + if (preloadDesc.type == 'js') + html.push(me.getScriptTagString(preloadDesc.url, preloadDesc.content)) + + else if (preloadDesc.type == 'css') + html.push(me.getLinkTagString(preloadDesc.url, preloadDesc.content)) + + else throw "Incorrect preload descriptor " + preloadDesc + }) + + // no need to wait for DOM ready - we'll overwrite it anyway + this.create() + + var scopeId = this.scopeId + + this.parentWindow.Scope.Provider.__ONLOAD__[ scopeId ] = function () { + + var cont = function () { callback && callback(me) } + + // sane browsers - seeding code and script has been already added + if (!needToSeed) { cont(); return } + + // our beloved IE - manually seeding the scope + + if (me.seedingCode) me.runCode(me.seedingCode) + + if (me.seedingScript) + me.runScript(me.seedingScript, cont) + else + cont() + } + + var doc = this.getDocument() + + doc.open() + + doc.write([ + this.useStrictMode ? '' : '', + '', + '', + html.join(''), + '', + + '', + '', + '' + ].join('')) + + doc.close() + + // Chrome (Webkit?) will clear the `onerror` after "doc.open()/.close()" so need to re-install it + if (me.cachedOnError) me.installOnErrorHandler(me.cachedOnError) + }, + + + setupIncrementally : function (callback) { + var me = this + + // here the "onerror" should be included early in the "preloads" + this.create(function () { + + var loadScripts = function (preloads, callback) { + + var cont = function () { loadScripts(preloads, callback) } + + if (!preloads.length) + callback && callback() + else { + var preloadDesc = preloads.shift() + + if (preloadDesc.url) + me.runScript(preloadDesc.url, cont) + else + if (preloadDesc.type == 'js') + me.runCode(preloadDesc.content, cont) + else { + me.addStyleTag(preloadDesc.content) + + cont() + } + } + } + + loadScripts(me.getPreload().slice(), callback) + }) + }, + + + getScriptTagString : function (url, text) { + var res = '' + else + res += '>' + text.replace(/<\/script>/gi, '\\x3C/script>') + '' + + return res + }, + + + getLinkTagString : function (url, text) { + if (url) return '' + + if (text) return '' + }, + + + + loadCSS : function (url, callback) { + var doc = this.getDocument() + var link = doc.createElement('link') + + link.type = 'text/css' + link.rel = 'stylesheet' + link.href = url + + this.getHead().appendChild(link) + + var hasContinued = false + + var cont = function () { + // just in case some crazy JS engine calls `onerror` even after node removal + if (hasContinued) return + hasContinued = true + clearTimeout(forcedTimeout) + + if (callback) callback() + + doc.body.removeChild(img) + } + + var forcedTimeout = setTimeout(cont, 3000) + + var img = doc.createElement('img') + + img.onerror = cont + + doc.body.appendChild(img) + + img.src = url + }, + + + runCode : function (text, callback) { + this.getHead().appendChild(this.createScriptTag(text)) + + callback && callback() + }, + + + runScript : function (url, callback) { + if (this.isCSS(url)) + this.loadCSS(url, callback) + else + this.getHead().appendChild(this.createScriptTag(null, url, callback)) + }, + + + createScriptTag : function (text, url, callback) { + var node = this.getDocument().createElement("script") + + node.setAttribute("type", "text/javascript") + + if (url) node.setAttribute("src", url) + + if (text) node.text = text + + if (callback) node.onload = node.onreadystatechange = function() { + if (!node.readyState || node.readyState == "loaded" || node.readyState == "complete" || node.readyState == 4 && node.status == 200) { + node.onload = node.onreadystatechange = null + + //surely for IE6.. + if ('v' == '\v') + setTimeout(callback, 0) + else + callback() + } + } + + return node + }, + + + addStyleTag : function (text) { + var document = this.getDocument() + var node = document.createElement('style') + + node.setAttribute("type", "text/css") + + var head = document.getElementsByTagName('head')[0] + head.appendChild(node) + + if (node.styleSheet) { // IE + node.styleSheet.cssText = text + } else { // the world + node.appendChild(document.createTextNode(text)) + } + } + } +}) + + +/** + +Name +==== + +Scope.Provider.Role.WithDOM - role for scope provider, which uses `script` tag for running the code. + + +SYNOPSIS +======== + + Class('Scope.Provider.IFrame', { + + isa : Scope.Provider, + + does : Scope.Provider.Role.WithDOM, + + ... + }) + +DESCRIPTION +=========== + +`Scope.Provider.Role.WithDOM` requires the implementation of the `getDocument` method, which should return the +document into which the `script` tags will be created. + +In return, this role provides the implementation of `runCode` and `runScript`. + + + + +GETTING HELP +============ + +This extension is supported via github issues tracker: + +For general Joose questions you can also visit [#joose](http://webchat.freenode.net/?randomnick=1&channels=joose&prompt=1) +on irc.freenode.org or the forum at: + + + +SEE ALSO +======== + +Web page of this module: + +General documentation for Joose: + + +BUGS +==== + +All complex software has bugs lurking in it, and this module is no exception. + +Please report any bugs through the web interface at + + + +AUTHORS +======= + +Nickolay Platonov + + + + + +COPYRIGHT AND LICENSE +===================== + +This software is Copyright (c) 2010 by Nickolay Platonov . + +This is free software, licensed under: + + The GNU Lesser General Public License, Version 3, June 2007 + +*/; +Class('Scope.Provider.IFrame', { + + isa : Scope.Provider, + + does : Scope.Provider.Role.WithDOM, + + + have : { + iframe : null, + cls : null, + + performWrap : false, + wrapCls : null, + wrapper : null, + + parentEl : null, + + cleanupDelay : 1000 + }, + + + methods : { + + getDocument : function () { + return this.iframe.contentWindow.document + }, + + + create : function (onLoadCallback) { + var me = this + var doc = this.parentWindow.document + var iframe = this.iframe = doc.createElement('iframe') + + var minViewportSize = this.minViewportSize + + iframe.className = this.cls || '' + iframe.style.width = (minViewportSize && minViewportSize.width || 1024) + 'px' + iframe.style.height = (minViewportSize && minViewportSize.height || 768) + 'px' + iframe.setAttribute('frameborder', 0) + + var ignoreOnLoad = false + + var callback = function () { + if (ignoreOnLoad) return + + if (iframe.detachEvent) + iframe.detachEvent('onload', callback) + else + iframe.onload = null + + onLoadCallback && onLoadCallback(me) + } + + if (iframe.attachEvent) + iframe.attachEvent('onload', callback) + else + iframe.onload = callback + + iframe.src = this.sourceURL || 'about:blank' + + if (this.performWrap) { + var wrapper = this.wrapper = this.wrapper || doc.createElement('div') + + wrapper.className = this.wrapCls || '' + + wrapper.appendChild(iframe) + } + + ;(this.parentEl || doc.body).appendChild(wrapper || iframe) + + var scope = this.scope = iframe.contentWindow + var doc = this.getDocument() + + // dances with tambourine around the IE, somehow fixes the cross-domain limits + if ('v' == '\v' || Boolean(this.parentWindow.msWriteProfilerMark)) { + // only ignore the 1st call to callback when there is a `sourceURL` config + // which will later be assigned to `iframe.src` and will trigger a new iframe loading + if (this.sourceURL) ignoreOnLoad = true + + doc.open() + doc.write('') + doc.close() + + ignoreOnLoad = false + + iframe.onreadystatechange = function () { + if (iframe.readyState == 'complete') iframe.onreadystatechange = null + + // trying to add the "early" onerror handler on each "readyState" change + // for some mystical reasons can't use `me.installOnErrorHandler` need to inline the call + if (me.cachedOnError) me.attachToOnError(scope, me.scopeId, me.cachedOnError) + } + + if (this.sourceURL) iframe.src = this.sourceURL + } + + // trying to add the "early" onerror handler - installing it in this stage will only work in FF + // (other browsers will clear on varios stages) + if (me.cachedOnError) me.installOnErrorHandler(me.cachedOnError) + }, + + + cleanup : function () { + var wrapper = this.wrapper || this.iframe + var iframe = this.iframe + var me = this + + wrapper.style.display = 'none' + + var onUnloadChecker = function () { + if (!window.onunload) window.onunload = function () { return 'something' } + } + + // add the `onunload` handler if there's no any - attempting to prevent browser from caching the iframe + // trying to create the handler from inside of the scope + this.runCode(';(' + onUnloadChecker.toString() + ')();') + + this.iframe = null + this.scope = null + this.wrapper = null + + // wait for 1000ms to allow time for possible `setTimeout` in the scope of iframe + setTimeout(function () { + + if (me.beforeCleanupCallback) me.beforeCleanupCallback() + + // chaging the page, triggering `onunload` and hopefully preventing browser from caching the content of iframe + iframe.src = 'javascript:false' + + // wait again before removing iframe from the DOM, as recommended by some online sources + setTimeout(function () { + ;(me.parentEl || me.parentWindow.document.body).removeChild(wrapper) + + wrapper = null + iframe = null + + me.parentEl = null + + me.cleanupHanlders() + + if (me.cleanupCallback) me.cleanupCallback() + + }, me.cleanupDelay) + }, me.cleanupDelay) + } + } +}) + +/** + +Name +==== + +Scope.Provider.IFrame - scope provider, which uses the iframe. + + +SYNOPSIS +======== + + var provider = new Scope.Provider.IFrame() + + provider.setup(function () { + + if (provider.scope.SOME_GLOBAL == 'some_value') { + ... + } + + provider.runCode(text, callback) + + ... + + provider.runScript(url, callback) + + ... + + provider.cleanup() + }) + + +DESCRIPTION +=========== + +`Scope.Provider.IFrame` is an implementation of the scope provider, which uses the iframe, +to create a new scope. + + +ISA +=== + +[Scope.Provider](../Provider.html) + + +DOES +==== + +[Scope.Provider.Role.WithDOM](Role/WithDOM.html) + + + +GETTING HELP +============ + +This extension is supported via github issues tracker: + +You can also ask questions at IRC channel : [#joose](http://webchat.freenode.net/?randomnick=1&channels=joose&prompt=1) + +Or the mailing list: + + + +SEE ALSO +======== + +Web page of this module: + +General documentation for Joose: + + +BUGS +==== + +All complex software has bugs lurking in it, and this module is no exception. + +Please report any bugs through the web interface at + + + +AUTHORS +======= + +Nickolay Platonov + + + + + +COPYRIGHT AND LICENSE +===================== + +This software is Copyright (c) 2010 by Nickolay Platonov . + +This is free software, licensed under: + + The GNU Lesser General Public License, Version 3, June 2007 + +*/; +Class('Scope.Provider.Window', { + + isa : Scope.Provider, + + does : Scope.Provider.Role.WithDOM, + + + has : { + popupWindow : null + }, + + + methods : { + + create : function (onLoadCallback) { + var popup = this.scope = this.popupWindow = this.parentWindow.open(this.sourceURL || 'about:blank', '_blank', "width=800,height=600") + + if (!popup) { + alert('Please enable popups for the host with this test suite running: ' + this.parentWindow.location.host) + throw 'Please enable popups for the host with this test suite running: ' + this.parentWindow.location.host + } + + var isIE = 'v' == '\v' || Boolean(this.parentWindow.msWriteProfilerMark) + + // dances with tambourine around the IE + if (isIE && !this.sourceURL) { + var doc = this.getDocument() + + doc.open() + doc.write('') + doc.close() + } + + // trying to add the "early" onerror handler - will probably only work in FF + if (this.cachedOnError) this.installOnErrorHandler(this.cachedOnError) + + /*! + * contentloaded.js + * + * Author: Diego Perini (diego.perini at gmail.com) + * Summary: cross-browser wrapper for DOMContentLoaded + * Updated: 20101020 + * License: MIT + * Version: 1.2 + * + * URL: + * http://javascript.nwbox.com/ContentLoaded/ + * http://javascript.nwbox.com/ContentLoaded/MIT-LICENSE + * + */ + + // @win window reference + // @fn function reference + var contentLoaded = function (win, fn) { + + var done = false, top = true, + + doc = win.document, root = doc.documentElement, + + add = doc.addEventListener ? 'addEventListener' : 'attachEvent', + rem = doc.addEventListener ? 'removeEventListener' : 'detachEvent', + pre = doc.addEventListener ? '' : 'on', + + init = function(e) { + if (e.type == 'readystatechange' && doc.readyState != 'complete') return; + + (e.type == 'load' ? win : doc)[rem](pre + e.type, init, false); + + if (!done && (done = true)) fn.call(win, e.type || e); + }, + + poll = function() { + try { root.doScroll('left'); } catch(e) { setTimeout(poll, 50); return; } + + init('poll'); + }; + + if (doc.readyState == 'complete') + fn.call(win, 'lazy'); + else { + if (doc.createEventObject && root.doScroll) { + try { top = !win.frameElement; } catch(e) { } + if (top) poll(); + } + doc[add](pre + 'DOMContentLoaded', init, false); + doc[add](pre + 'readystatechange', init, false); + win[add](pre + 'load', init, false); + } + } + + contentLoaded(popup, onLoadCallback || function () {}) + }, + + + getDocument : function () { + return this.popupWindow.document + }, + + + cleanup : function () { + if (this.beforeCleanupCallback) this.beforeCleanupCallback() + + this.popupWindow.close() + + this.popupWindow = null + + this.cleanupHanlders() + + if (this.cleanupCallback) this.cleanupCallback() + } + } +}) + +/** + +Name +==== + +Scope.Provider.Window - scope provider, which uses the popup browser window. + + +SYNOPSIS +======== + + var provider = new Scope.Provider.Window() + + provider.setup(function () { + + if (provider.scope.SOME_GLOBAL == 'some_value') { + ... + } + + provider.runCode(text, callback) + + ... + + provider.runScript(url, callback) + + ... + + provider.cleanup() + }) + + +DESCRIPTION +=========== + +`Scope.Provider.Window` is an implementation of the scope provider, which uses the popup browser window, +to create a new scope. + + +ISA +=== + +[Scope.Provider](../Provider.html) + + +DOES +==== + +[Scope.Provider.Role.WithDOM](Role/WithDOM.html) + + + +GETTING HELP +============ + +This extension is supported via github issues tracker: + +You can also ask questions at IRC channel : [#joose](http://webchat.freenode.net/?randomnick=1&channels=joose&prompt=1) + +Or the mailing list: + + + +SEE ALSO +======== + +Web page of this module: + +General documentation for Joose: + + +BUGS +==== + +All complex software has bugs lurking in it, and this module is no exception. + +Please report any bugs through the web interface at + + + +AUTHORS +======= + +Nickolay Platonov + + + + + +COPYRIGHT AND LICENSE +===================== + +This software is Copyright (c) 2010 by Nickolay Platonov . + +This is free software, licensed under: + + The GNU Lesser General Public License, Version 3, June 2007 + +*/; +Class('Scope.Provider.NodeJS', { + + isa : Scope.Provider, + + + has : { + sourceURL : null + }, + + + methods : { + + compile : function (module, content, filename) { + var Module = require('module') + var path = require('path') + + var self = module; + // remove shebang + content = content.replace(/^\#\!.*/, ''); + + var modRequire = function (path) { + return self.require(path); + } + + modRequire.resolve = function(request) { + return Module._resolveFilename(request, self)[1]; + }; + + Object.defineProperty(modRequire, 'paths', { get: function() { + throw new Error('modRequire.paths is removed. Use ' + + 'node_modules folders, or the NODE_PATH '+ + 'environment variable instead.'); + }}); + + modRequire.main = process.mainModule; + + // Enable support to add extra extension types + modRequire.extensions = Module._extensions; + modRequire.registerExtension = function() { + throw new Error('modRequire.registerExtension() removed. Use ' + + 'modRequire.extensions instead.'); + }; + + modRequire.cache = Module._cache; + + var dirname = path.dirname(filename); + + // create wrapper function + var wrapper = Module.wrap(content); + + var compiledWrapper = require('vm').runInContext(wrapper, this.scope, filename); + + return compiledWrapper.apply(self.exports, [self.exports, modRequire, self, filename, dirname]); + }, + + + addOnErrorHandler : function (handler, callback) { + }, + + + create : function (callback) { + var vm = require('vm') + var sandbox = {} + + Joose.O.extend(sandbox, { +// __PROVIDER__ : true, + + process : process, + + global : sandbox, + root : root, + + setTimeout : setTimeout, + clearTimeout : clearTimeout, + setInterval : setInterval, + clearInterval : clearInterval +// , +// +// __filename : __filename, +// __dirname : __dirname, +// module : module + }) + + var scope = this.scope = vm.createContext(sandbox) + + callback && callback() + }, + + + setup : function (callback) { + this.create() + + var me = this + + if (this.seedingCode) require('vm').runInContext(this.seedingCode, this.scope) + + Joose.A.each(this.getPreload(), function (preloadDesc) { + + if (preloadDesc.type == 'js') + if (preloadDesc.url) + me.runScript(preloadDesc.url) + else + me.runCode(preloadDesc.content) + }) + + if (this.seedingScript) { + var Module = require('module') + var path = require('path') + + var module = new Module('./' + this.sourceURL, require.main) + + var filename = module.filename = path.join(path.dirname(require.main.filename), this.sourceURL) + + var content = require('fs').readFileSync(filename, 'utf8') + // Remove byte order marker. This catches EF BB BF (the UTF-8 BOM) + // because the buffer-to-string conversion in `fs.readFileSync()` + // translates it to FEFF, the UTF-16 BOM. + if (content.charCodeAt(0) === 0xFEFF) content = content.slice(1) + + this.compile(module, content, filename) + } + + callback && callback() + }, + + + runCode : function (text, callback) { + var res = require('vm').runInContext(text, this.scope) + + callback && callback(res) + + return res + }, + + + runScript : function (url, callback) { + var content = require('fs').readFileSync(url, 'utf8') + + var res = require('vm').runInContext(content, this.scope, url) + + callback && callback(res) + + return res + }, + + + cleanup : function () { + if (this.beforeCleanupCallback) this.beforeCleanupCallback() + if (this.cleanupCallback) this.cleanupCallback() + } + } +}) + + +/** + +Name +==== + +Scope.Provider.NodeJS - scope provider, which uses the `Script.runInNewContext` call of the NodeJS. + + +SYNOPSIS +======== + + var provider = new Scope.Provider.NodeJS() + + provider.setup(function () { + + if (provider.scope.SOME_GLOBAL == 'some_value') { + ... + } + + provider.runCode(text, callback) + + ... + + provider.runScript(url, callback) + + ... + + provider.cleanup() + }) + + +DESCRIPTION +=========== + +`Scope.Provider.NodeJS` is an implementation of the scope provider, +which uses the `Script.runInNewContext` call of the NodeJS platform. + + +ISA +=== + +[Scope.Provider](../Provider.html) + + + +GETTING HELP +============ + +This extension is supported via github issues tracker: + +You can also ask questions at IRC channel : [#joose](http://webchat.freenode.net/?randomnick=1&channels=joose&prompt=1) + +Or the mailing list: + + + +SEE ALSO +======== + +Web page of this module: + +General documentation for Joose: + + +BUGS +==== + +All complex software has bugs lurking in it, and this module is no exception. + +Please report any bugs through the web interface at + + + +AUTHORS +======= + +Nickolay Platonov + + + + + +COPYRIGHT AND LICENSE +===================== + +This software is Copyright (c) 2010 by Nickolay Platonov . + +This is free software, licensed under: + + The GNU Lesser General Public License, Version 3, June 2007 + +*/; +; +Class('JooseX.Observable.Event', { + + has : { + name : { required : true }, + args : { required : true }, + + source : { required : true }, + + splat : null, + current : null, + + bubbling : true + }, + + + methods : { + + stopPropagation : function () { + this.bubbling = false + } + } +}) + + +; +Class('JooseX.Observable.Listener', { + + has : { + channel : { required : true }, + eventName : { required : true }, + + func : { required : true }, + scope : null, + + single : false, + + buffer : null, + bufferMax : null, + + bufferStartedAt : null, + bufferTimeout : null, + + delayTimeout : null, + + delay : null + }, + + + methods : { + + activate : function (event, args) { + var me = this + + if (me.buffer != null) { + + if (me.bufferMax != null) + if (!me.bufferStartedAt) + me.bufferStartedAt = new Date() + else + if (new Date - me.bufferStartedAt > me.bufferMax) return + + + if (me.bufferTimeout) clearTimeout(me.bufferTimeout) + + me.bufferTimeout = setTimeout(function () { + + delete me.bufferStartedAt + delete me.bufferTimeout + + me.doActivate(event, args) + + }, me.buffer) + + return + } + + if (me.delay != null) { + + me.delayTimeout = setTimeout(function () { + + delete me.delayTimeout + + me.doActivate(event, args) + + }, me.delay) + + return + } + + return me.doActivate(event, args) + }, + + + doActivate : function (event, args) { + if (this.single) this.remove() + + return this.func.apply(this.scope || event.source, [ event ].concat(args) ) !== false + }, + + + cancel : function () { + if (this.buffer) { + clearTimeout(this.bufferTimeout) + + delete this.bufferTimeout + delete this.bufferStartedAt + } + + if (this.delay) clearTimeout(this.delayTimeout) + }, + + + remove : function () { + this.channel.removeListener(this) + } + } +}) + + +; +Class('JooseX.Observable.Channel', { + + has : { + channels : Joose.I.Object, + + listeners : Joose.I.Object + }, + + + methods : { + + // (!) segments array will be destroyed in this method + getListenersFor : function (segments, name, activators) { + var listeners = this.listeners + + if (listeners[ '**' ]) { + + var splat = segments.concat(name) + + Joose.A.each(listeners[ '**' ], function (listener) { + activators.push({ + listener : listener, + splat : splat + }) + }) + } + + if (segments.length) { + var next = this.getSingleChannel(segments.shift(), true) + + if (next) next.getListenersFor(segments, name, activators) + } else { + + if (listeners[ '*' ]) + Joose.A.each(listeners[ '*' ], function (listener) { + + activators.push({ + listener : listener, + splat : name + }) + }) + + if (listeners[ name ]) + Joose.A.each(listeners[ name ], function (listener) { + + activators.push({ + listener : listener + }) + }) + } + }, + + + hasListenerFor : function (segments, name) { + var listeners = this.listeners + + if (listeners[ '**' ] && listeners[ '**' ].length) return true + + if (segments.length) { + var next = this.getSingleChannel(segments.shift(), true) + + if (next) return next.hasListenerFor(segments, name) + + } else { + + if (listeners[ '*' ] && listeners[ '*' ].length) return true + + if (listeners[ name ] && listeners[ name ].length) return true + } + + return false + }, + + + addListener : function (listener) { + var eventName = listener.eventName + var listeners = this.listeners + + listeners[ eventName ] = listeners[ eventName ] || [] + + listeners[ eventName ].push(listener) + }, + + + removeListener : function (listenerToRemove) { + var eventListeners = this.listeners[ listenerToRemove.eventName ] + + eventListeners && Joose.A.each(eventListeners, function (listener, index) { + + if (listener == listenerToRemove) { + + eventListeners.splice(index, 1) + + return false + } + }) + }, + + + removeListenerByHandler : function (eventName, func, scope) { + var eventListeners = this.listeners[ eventName ] + + eventListeners && Joose.A.each(eventListeners, function (listener, index) { + + if (listener.func == func && listener.scope == scope) { + + eventListeners.splice(index, 1) + + return false + } + }) + }, + + + getSingleChannel : function (name, doNotCreate) { + var channels = this.channels + + if (channels[ name ]) return channels[ name ] + + if (doNotCreate) return null + + return channels[ name ] = new JooseX.Observable.Channel() + }, + + + // (!) segments array will be destroyed in this method + getChannel : function (segments, doNotCreate) { + if (!segments.length) return this + + var next = this.getSingleChannel(segments.shift(), doNotCreate) + + if (doNotCreate && !next) return null + + return next.getChannel(segments, doNotCreate) + } + } +}) + + +; +Role('JooseX.Observable', { + + /*PKGVERSION*/VERSION : 0.04, + +// use : [ +// 'JooseX.Observable.Channel', +// 'JooseX.Observable.Listener', +// 'JooseX.Observable.Event' +// ], + + +// trait : 'JooseX.Observable.Meta', + + + has : { + rootChannel : { + is : 'rw', + init : function () { return new JooseX.Observable.Channel() } + }, + + suspendCounter : 0 + }, + + + methods : { + + getBubbleTarget : function () { + }, + + + parseEventPath : function (path) { + var channels = path.split('/') + var eventName = channels.pop() + + if (channels.length && !channels[ 0 ]) channels.shift() + + return { + channels : channels, + eventName : eventName + } + }, + + + on : function (path, func, scope, options) { + if (!func) throw "Not valid listener function provided when subsribing on event: " + path + + var parsed = this.parseEventPath(path) + var channel = this.getRootChannel().getChannel(parsed.channels) + + var listener = new JooseX.Observable.Listener(Joose.O.extend(options || {}, { + channel : channel, + eventName : parsed.eventName, + + func : func, + scope : scope + })) + + channel.addListener(listener) + + return listener + }, + + + un : function (path, func, scope) { + + if (path instanceof JooseX.Observable.Listener) { + + path.remove() + + return + } + + var parsed = this.parseEventPath(path) + var channel = this.getRootChannel().getChannel(parsed.channels, true) + + if (channel) channel.removeListenerByHandler(parsed.eventName, func, scope) + }, + + + emit : function () { + return this.fireEvent.apply(this, arguments) + }, + + + fireEvent : function (path) { + if (this.suspendCounter) return + + var args = Array.prototype.slice.call(arguments, 1) + + var event = new JooseX.Observable.Event({ + name : path, + args : args, + + source : this + }) + + return this.propagateEvent(event, path, args) + }, + + + propagateEvent : function (event, path, args) { + if (this.suspendCounter) return + + var parsed = this.parseEventPath(path) + var eventName = parsed.eventName + + if (!eventName == '*' || eventName == '**') throw new Error("Can't fire an empty event or event with `*`, `**` names ") + + var activators = [] + + this.getRootChannel().getListenersFor(parsed.channels, eventName, activators) + + var res = true + + event.current = this + + if (activators.length) Joose.A.each(activators, function (activator) { + event.splat = activator.splat + + res = activator.listener.activate(event, args) !== false && res + }) + + if (event.bubbling) { + + var further = this.getBubbleTarget() + + if (further) res = further.propagateEvent(event, path, args) !== false && res + } + + return res + }, + + + hasListenerFor : function (path) { + var parsed = this.parseEventPath(path) + + return this.getRootChannel().hasListenerFor(parsed.channels, parsed.eventName) + }, + + + purgeListeners : function () { + this.rootChannel = new JooseX.Observable.Channel() + }, + + + suspendEvents : function () { + this.suspendCounter++ + }, + + + resumeEvents : function () { + this.suspendCounter-- + + if (this.suspendCounter < 0) this.suspendCounter = 0 + } + } +}); +; +/* + http://www.JSON.org/json2.js + 2011-02-23 + + Public Domain. + + NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. + + See http://www.JSON.org/js.html + + + This code should be minified before deployment. + See http://javascript.crockford.com/jsmin.html + + USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO + NOT CONTROL. + + + This file creates a global JSON object containing two methods: stringify + and parse. + + JSON.stringify(value, replacer, space) + value any JavaScript value, usually an object or array. + + replacer an optional parameter that determines how object + values are stringified for objects. It can be a + function or an array of strings. + + space an optional parameter that specifies the indentation + of nested structures. If it is omitted, the text will + be packed without extra whitespace. If it is a number, + it will specify the number of spaces to indent at each + level. If it is a string (such as '\t' or ' '), + it contains the characters used to indent at each level. + + This method produces a JSON text from a JavaScript value. + + When an object value is found, if the object contains a toJSON + method, its toJSON method will be called and the result will be + stringified. A toJSON method does not serialize: it returns the + value represented by the name/value pair that should be serialized, + or undefined if nothing should be serialized. The toJSON method + will be passed the key associated with the value, and this will be + bound to the value + + For example, this would serialize Dates as ISO strings. + + Date.prototype.toJSON = function (key) { + function f(n) { + // Format integers to have at least two digits. + return n < 10 ? '0' + n : n; + } + + return this.getUTCFullYear() + '-' + + f(this.getUTCMonth() + 1) + '-' + + f(this.getUTCDate()) + 'T' + + f(this.getUTCHours()) + ':' + + f(this.getUTCMinutes()) + ':' + + f(this.getUTCSeconds()) + 'Z'; + }; + + You can provide an optional replacer method. It will be passed the + key and value of each member, with this bound to the containing + object. The value that is returned from your method will be + serialized. If your method returns undefined, then the member will + be excluded from the serialization. + + If the replacer parameter is an array of strings, then it will be + used to select the members to be serialized. It filters the results + such that only members with keys listed in the replacer array are + stringified. + + Values that do not have JSON representations, such as undefined or + functions, will not be serialized. Such values in objects will be + dropped; in arrays they will be replaced with null. You can use + a replacer function to replace those with JSON values. + JSON.stringify(undefined) returns undefined. + + The optional space parameter produces a stringification of the + value that is filled with line breaks and indentation to make it + easier to read. + + If the space parameter is a non-empty string, then that string will + be used for indentation. If the space parameter is a number, then + the indentation will be that many spaces. + + Example: + + text = JSON.stringify(['e', {pluribus: 'unum'}]); + // text is '["e",{"pluribus":"unum"}]' + + + text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t'); + // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]' + + text = JSON.stringify([new Date()], function (key, value) { + return this[key] instanceof Date ? + 'Date(' + this[key] + ')' : value; + }); + // text is '["Date(---current time---)"]' + + + JSON.parse(text, reviver) + This method parses a JSON text to produce an object or array. + It can throw a SyntaxError exception. + + The optional reviver parameter is a function that can filter and + transform the results. It receives each of the keys and values, + and its return value is used instead of the original value. + If it returns what it received, then the structure is not modified. + If it returns undefined then the member is deleted. + + Example: + + // Parse the text. Values that look like ISO date strings will + // be converted to Date objects. + + myData = JSON.parse(text, function (key, value) { + var a; + if (typeof value === 'string') { + a = +/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value); + if (a) { + return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], + +a[5], +a[6])); + } + } + return value; + }); + + myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) { + var d; + if (typeof value === 'string' && + value.slice(0, 5) === 'Date(' && + value.slice(-1) === ')') { + d = new Date(value.slice(5, -1)); + if (d) { + return d; + } + } + return value; + }); + + + This is a reference implementation. You are free to copy, modify, or + redistribute. +*/ + +/*jslint evil: true, strict: false, regexp: false */ + +/*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply, + call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours, + getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join, + lastIndex, length, parse, prototype, push, replace, slice, stringify, + test, toJSON, toString, valueOf +*/ + + +// Create a JSON object only if one does not already exist. We create the +// methods in a closure to avoid creating global variables. + +var JSON; +if (!JSON) { + JSON = {}; +} + +(function () { + "use strict"; + + function f(n) { + // Format integers to have at least two digits. + return n < 10 ? '0' + n : n; + } + + if (typeof Date.prototype.toJSON !== 'function') { + + Date.prototype.toJSON = function (key) { + + return isFinite(this.valueOf()) ? + this.getUTCFullYear() + '-' + + f(this.getUTCMonth() + 1) + '-' + + f(this.getUTCDate()) + 'T' + + f(this.getUTCHours()) + ':' + + f(this.getUTCMinutes()) + ':' + + f(this.getUTCSeconds()) + 'Z' : null; + }; + + String.prototype.toJSON = + Number.prototype.toJSON = + Boolean.prototype.toJSON = function (key) { + return this.valueOf(); + }; + } + + var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, + escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, + gap, + indent, + meta = { // table of character substitutions + '\b': '\\b', + '\t': '\\t', + '\n': '\\n', + '\f': '\\f', + '\r': '\\r', + '"' : '\\"', + '\\': '\\\\' + }, + rep; + + + function quote(string) { + +// If the string contains no control characters, no quote characters, and no +// backslash characters, then we can safely slap some quotes around it. +// Otherwise we must also replace the offending characters with safe escape +// sequences. + + escapable.lastIndex = 0; + return escapable.test(string) ? '"' + string.replace(escapable, function (a) { + var c = meta[a]; + return typeof c === 'string' ? c : + '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); + }) + '"' : '"' + string + '"'; + } + + + function str(key, holder) { + +// Produce a string from holder[key]. + + var i, // The loop counter. + k, // The member key. + v, // The member value. + length, + mind = gap, + partial, + value = holder[key]; + +// If the value has a toJSON method, call it to obtain a replacement value. + + if (value && typeof value === 'object' && + typeof value.toJSON === 'function') { + value = value.toJSON(key); + } + +// If we were called with a replacer function, then call the replacer to +// obtain a replacement value. + + if (typeof rep === 'function') { + value = rep.call(holder, key, value); + } + +// What happens next depends on the value's type. + + switch (typeof value) { + case 'string': + return quote(value); + + case 'number': + +// JSON numbers must be finite. Encode non-finite numbers as null. + + return isFinite(value) ? String(value) : 'null'; + + case 'boolean': + case 'null': + +// If the value is a boolean or null, convert it to a string. Note: +// typeof null does not produce 'null'. The case is included here in +// the remote chance that this gets fixed someday. + + return String(value); + +// If the type is 'object', we might be dealing with an object or an array or +// null. + + case 'object': + +// Due to a specification blunder in ECMAScript, typeof null is 'object', +// so watch out for that case. + + if (!value) { + return 'null'; + } + +// Make an array to hold the partial results of stringifying this object value. + + gap += indent; + partial = []; + +// Is the value an array? + + if (Object.prototype.toString.apply(value) === '[object Array]') { + +// The value is an array. Stringify every element. Use null as a placeholder +// for non-JSON values. + + length = value.length; + for (i = 0; i < length; i += 1) { + partial[i] = str(i, value) || 'null'; + } + +// Join all of the elements together, separated with commas, and wrap them in +// brackets. + + v = partial.length === 0 ? '[]' : gap ? + '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' : + '[' + partial.join(',') + ']'; + gap = mind; + return v; + } + +// If the replacer is an array, use it to select the members to be stringified. + + if (rep && typeof rep === 'object') { + length = rep.length; + for (i = 0; i < length; i += 1) { + if (typeof rep[i] === 'string') { + k = rep[i]; + v = str(k, value); + if (v) { + partial.push(quote(k) + (gap ? ': ' : ':') + v); + } + } + } + } else { + +// Otherwise, iterate through all of the keys in the object. + + for (k in value) { + if (Object.prototype.hasOwnProperty.call(value, k)) { + v = str(k, value); + if (v) { + partial.push(quote(k) + (gap ? ': ' : ':') + v); + } + } + } + } + +// Join all of the member texts together, separated with commas, +// and wrap them in braces. + + v = partial.length === 0 ? '{}' : gap ? + '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' : + '{' + partial.join(',') + '}'; + gap = mind; + return v; + } + } + +// If the JSON object does not yet have a stringify method, give it one. + + if (typeof JSON.stringify !== 'function') { + JSON.stringify = function (value, replacer, space) { + +// The stringify method takes a value and an optional replacer, and an optional +// space parameter, and returns a JSON text. The replacer can be a function +// that can replace values, or an array of strings that will select the keys. +// A default replacer method can be provided. Use of the space parameter can +// produce text that is more easily readable. + + var i; + gap = ''; + indent = ''; + +// If the space parameter is a number, make an indent string containing that +// many spaces. + + if (typeof space === 'number') { + for (i = 0; i < space; i += 1) { + indent += ' '; + } + +// If the space parameter is a string, it will be used as the indent string. + + } else if (typeof space === 'string') { + indent = space; + } + +// If there is a replacer, it must be a function or an array. +// Otherwise, throw an error. + + rep = replacer; + if (replacer && typeof replacer !== 'function' && + (typeof replacer !== 'object' || + typeof replacer.length !== 'number')) { + throw new Error('JSON.stringify'); + } + +// Make a fake root object containing our value under the key of ''. +// Return the result of stringifying the value. + + return str('', {'': value}); + }; + } + + +// If the JSON object does not yet have a parse method, give it one. + + if (typeof JSON.parse !== 'function') { + JSON.parse = function (text, reviver) { + +// The parse method takes a text and an optional reviver function, and returns +// a JavaScript value if the text is a valid JSON text. + + var j; + + function walk(holder, key) { + +// The walk method is used to recursively walk the resulting structure so +// that modifications can be made. + + var k, v, value = holder[key]; + if (value && typeof value === 'object') { + for (k in value) { + if (Object.prototype.hasOwnProperty.call(value, k)) { + v = walk(value, k); + if (v !== undefined) { + value[k] = v; + } else { + delete value[k]; + } + } + } + } + return reviver.call(holder, key, value); + } + + +// Parsing happens in four stages. In the first stage, we replace certain +// Unicode characters with escape sequences. JavaScript handles many characters +// incorrectly, either silently deleting them, or treating them as line endings. + + text = String(text); + cx.lastIndex = 0; + if (cx.test(text)) { + text = text.replace(cx, function (a) { + return '\\u' + + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); + }); + } + +// In the second stage, we run the text against regular expressions that look +// for non-JSON patterns. We are especially concerned with '()' and 'new' +// because they can cause invocation, and '=' because it can cause mutation. +// But just to be safe, we want to reject all unexpected forms. + +// We split the second stage into 4 regexp operations in order to work around +// crippling inefficiencies in IE's and Safari's regexp engines. First we +// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we +// replace all simple value tokens with ']' characters. Third, we delete all +// open brackets that follow a colon or comma or that begin the text. Finally, +// we look to see that the remaining characters are only whitespace or ']' or +// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval. + + if (/^[\],:{}\s]*$/ + .test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@') + .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']') + .replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) { + +// In the third stage we use the eval function to compile the text into a +// JavaScript structure. The '{' operator is subject to a syntactic ambiguity +// in JavaScript: it can begin a block or an object literal. We wrap the text +// in parens to eliminate the ambiguity. + + j = eval('(' + text + ')'); + +// In the optional fourth stage, we recursively walk the new structure, passing +// each name/value pair to a reviver function for possible transformation. + + return typeof reviver === 'function' ? + walk({'': j}, '') : j; + } + +// If the text is not JSON parseable, then a SyntaxError is thrown. + + throw new SyntaxError('JSON.parse'); + }; + } +}()); +; +!function () { + + var REF = 1 + + Class('Data.Visitor2', { + + has : { + seenPlaceholder : { + init : {} + }, + + outOfDepthPlaceholder : { + init : {} + }, + + seen : Joose.I.Object, + + maxDepth : null + }, + + methods : { + + getClassNameFor : function (object) { + if (Joose.O.isInstance(object)) return object.meta.name + + return Object.prototype.toString.call(object).replace(/^\[object /, '').replace(/\]$/, '') + }, + + + getRefAdr : function () { + return REF++ + }, + + + assignRefAdrTo : function (object) { + if (!object.__REFADR__) + if (Object.defineProperty) + Object.defineProperty(object, '__REFADR__', { value : REF++ }) + else + object.__REFADR__ = REF++ + + return object.__REFADR__ + }, + + + isSeen : function (object) { + return object.__REFADR__ && this.seen.hasOwnProperty(object.__REFADR__) + }, + + + markSeenAs : function (object, result) { + return this.seen[ object.__REFADR__ ] = result + }, + + + hasSeenResultFor : function (object) { + var ref = object.__REFADR__ + + return this.seen.hasOwnProperty(ref) && this.seen[ ref ] != this.seenPlaceholder + }, + + + visit : function (value, depth) { + // will be false for NaN values + if (depth > this.maxDepth) + return this.visitOutOfDepthValue(value, depth + 1) + else + if (Object(value) === value) + if (this.isSeen(value)) + return this.visitSeen(value, depth + 1) + else + return this.visitNotSeen(value, depth + 1) + else + return this.visitValue(value, depth + 1) + }, + + + visitOutOfDepthValue : function (value, depth) { + return this.outOfDepthPlaceholder + }, + + + visitValue : function (value, depth) { + return value + }, + + + visitSeen : function (value, depth) { + return this.seen[ value.__REFADR__ ] + }, + + + getInitialSeenMarker : function (object, depth) { + return this.seenPlaceholder + }, + + + visitNotSeen : function (object, depth) { + this.assignRefAdrTo(object) + + this.markSeenAs(object, this.getInitialSeenMarker(object, depth)) + + + if (Joose.O.isInstance(object)) return this.markSeenAs(object, this.visitJooseInstance(object, depth)) + + + var methodName = 'visit' + this.getClassNameFor(object) + + if (!this.meta.hasMethod(methodName)) methodName = 'visitObject' + + return this.markSeenAs(object, this[ methodName ](object, depth)) + }, + + + visitArray : function (array, depth) { + Joose.A.each(array, function (value, index) { + + this.visitArrayEntry(value, index, array, depth) + + }, this) + + return array + }, + + + visitArrayEntry : function (entry, index, array, depth) { + return this.visit(entry, depth) + }, + + + visitObject : function (object, depth) { + + Joose.O.eachOwn(object, function (value, key) { + + if (key != '__REFADR__') { + this.visitObjectKey(key, value, object, depth) + this.visitObjectValue(value, key, object, depth) + } + + }, this) + + return object + }, + + + visitJooseInstance : function (value, depth) { + return this.visitObject(value, depth) + }, + + + visitObjectKey : function (key, value, object, depth) { + return this.visitValue(key, depth) + }, + + + visitObjectValue : function (value, key, object, depth) { + return this.visit(value, depth) + } + }, + + + my : { + + has : { + HOST : null + }, + + + methods : { + + visit : function (value, maxDepth) { + var visitor = new this.HOST({ + maxDepth : maxDepth || Infinity + }) + + return visitor.visit(value, 0) + } + } + } + }) + +}() + + +; +; +; +Class('Siesta.Util.Serializer', { + + isa : Data.Visitor2, + + has : { + result : Joose.I.Array, + manualEnum : function () { + for (var i in { toString : 1 }) return false + + return true + } + }, + + + methods : { + + assignRefAdrTo : function (object) { + try { + return this.SUPER(object) + } catch (e) { + if (!object.__REFADR__) object.__REFADR__ = this.getRefAdr() + } + + return object.__REFADR__ + }, + + + write : function (str) { + this.result.push(str) + }, + + + visitOutOfDepthValue : function (value, depth) { + this.write('...') + }, + + + visitValue : function (value) { + if (value == null) + // `null` and `undefined` + this.write(value + '') + else + this.write(typeof value == 'string' ? '"' + value.replace(/"/g, '\\"').replace(/\n/g, '\\n') + '"' : value + '') + }, + + + visitObjectKey : function (key, value, object) { + this.write('"' + key + '": ') + }, + + + getClassNameFor : function (object) { + if (object.nodeType != null && object.nodeName != null && object.tagName) return 'DOMElement' + + // trying to detect and not dive into global window + if (object.document != null && object.location != null && object.location.href != null) return 'Window' + + return this.SUPER(object) + }, + + + visitSeen : function (value, depth) { + this.write('[Circular]') + }, + + + visitRegExp : function (value, depth) { + this.write(value + '') + }, + + + visitFunction : function (value, depth) { + this.write('function ' + (value.name || '') + '() { ... }') + }, + + + visitDate : function (value, depth) { + this.write('"' + value + '"') + }, + + + // safer alternative to parent's implementation of `visitObject` - some host objects has no "hasOwnProperty" method + visitObject : function (object, depth) { + for (var key in object) { + if (key != '__REFADR__' && (!object.hasOwnProperty || object.hasOwnProperty(key))) { + var value = object[ key ] + + this.visitObjectKey(key, value, object, depth) + this.visitObjectValue(value, key, object, depth) + } + } + + var me = this + + if (this.manualEnum) + Joose.A.each([ 'hasOwnProperty', 'valueOf', 'toString', 'constructor' ], function (key) { + if (object.hasOwnProperty && object.hasOwnProperty(key)) { + var value = object[ key ] + + me.visitObjectKey(key, value, object, depth) + me.visitObjectValue(value, key, object, depth) + } + }) + + return object + }, + + + visitJooseInstance : function (value, depth) { + if (value.meta.hasMethod('toString')) { + this.write(value.toString()) + + return value + } + + return this.SUPERARG(arguments) + }, + + + visitDOMElement : function (object, depth) { + var output = '<' + object.tagName + + if (object.id) output += ' id="' + object.id + '"' + if (object.className) output += ' class="' + object.className + '"' + + this.write(output + '>') + }, + + + visitDOMStringMap : function () { + this.write('[DOMStringMap]') + }, + + + // the Object.prototype.toString.call(window) for FF + visitWindow : function () { + this.write('[window]') + }, + + + // window.location type in FF + visitLocation : function () { + this.write('[window.location]') + } + }, + + + before : { + visitObject : function () { + this.write('{') + }, + + + visitArray : function () { + this.write('[') + } + }, + + + after : { + visitObject : function () { + var result = this.result + + if (result[ result.length - 1 ] == ', ') result.pop() + + this.write('}') + }, + + + visitArray : function () { + var result = this.result + + if (result[ result.length - 1 ] == ', ') result.pop() + + this.write(']') + }, + + + visitObjectValue : function () { + this.write(', ') + }, + + + visitArrayEntry : function () { + this.write(', ') + } + }, + + + my : { + + has : { + HOST : null + }, + + + methods : { + + stringify : function (value, maxDepth) { + var visitor = new this.HOST({ + maxDepth : maxDepth || 4 + }) + + visitor.visit(value, 0) + + return visitor.result.join('') + } + } + } +}) +; +Role('Siesta.Util.Role.CanFormatStrings', { + + methods : { + + formatString: function (string, data) { + var match + var variables = [] + var isRaw = [] + var regexp = /\{(\!)?((?:\w|-|_)+?)\}/g + + while (match = regexp.exec(string)) { + isRaw.push(match[ 1 ]) + variables.push(match[ 2 ]) + } + + var result = string + + Joose.A.each(variables, function (variable, index) { + var varIsRaw = isRaw[ index ] + + result = result.replace( + new RegExp('\\{' + (varIsRaw ? '!' : '') + variable + '\\}', 'g'), + data.hasOwnProperty(variable) ? + varIsRaw ? data[ variable ] + '' : Siesta.Util.Serializer.stringify(data[ variable ]) + : + '' + ) + }) + + return result + } + } +}) +; +Class('Siesta.Util.Queue', { + + has : { + // array of Objects, each containing arbitrary data about queue step. Possibly keys: + // `processor` - an individual processor function for this step + // can also be provided for whole queue + // will receive the: (stepData, index, queue) + // `isAsync` - when provided, the `next` function will be also embedded, + // which should be called manually + // `interval` - the delay after step (except for asynchronous) + steps : Joose.I.Array, + + interval : 100, + callbackDelay : 0, + // setTimeout + deferer : { required : true }, + // clearTimeout - only required when "abort" is planned / possible + deferClearer : null, + + processor : null, + processorScope : null, + + currentTimeout : null, + callback : null, + scope : null, + isAborted : false, + + observeTest : null, + + currentDelayStepId : null + }, + + + methods : { + + // step is an object with + // { + // processor : func, + // processorScope : obj, + // next : func (in case of async step, will be populated by queue) + // } + + addStep : function (stepData) { + this.addSyncStep(stepData) + }, + + + addSyncStep : function (stepData) { + this.steps.push(stepData) + }, + + + addAsyncStep : function (stepData) { + stepData.isAsync = true + + this.steps.push(stepData) + }, + + addDelayStep : function (delayMs) { + var origSetTimeout = this.deferer; + var me = this; + + this.addAsyncStep({ + processor : function(data) { + me.currentDelayStepId = origSetTimeout(data.next, delayMs || 500); + } + }); + }, + + + run : function (callback, scope) { + this.callback = callback + this.scope = scope + + // abort the queue, if the provided test instance has finalized (probably because of exception) + this.observeTest && this.observeTest.on('testfinalize', function () { this.abort(true) }, this, { single : true }) + + this.doSteps(this.steps.slice(), callback, scope) + }, + + + abort : function (ignoreCallback) { + this.isAborted = true + + var deferClearer = this.deferClearer + + if (!deferClearer) throw "Need `deferClearer` to be able to `abort` the queue" + + deferClearer(this.currentDelayStepId); + deferClearer(this.currentTimeout) + + if (!ignoreCallback) this.callback.call(this.scope || this) + }, + + + doSteps : function (steps, callback, scope) { + this.currentTimeout = null + + var me = this + var deferer = this.deferer + var step = steps.shift() + + if (this.isAborted) return + + if (step) { + var processor = step.processor || this.processor + var processorScope = step.processorScope || this.processorScope + + var index = this.steps.length - steps.length - 1 + + if (!processor) throw new Error("No process function found for step: " + index) + + if (step.isAsync) { + var next = step.next = function () { + me.doSteps(steps, callback, scope) + } + + // processor should call `next` to continue + processor.call(processorScope || me, step, index, this, next) + } else { + + processor.call(processorScope || me, step, index, this) + + if (this.isAborted) return + + var interval = step.interval || me.interval + + if (interval) + this.currentTimeout = deferer(function () { + me.doSteps(steps, callback, scope) + }, interval) + else + me.doSteps(steps, callback, scope) + } + + + } else { + if (callback) + if (this.callbackDelay) + deferer(function () { + if (!me.isAborted) callback.call(scope || this) + }, this.callbackDelay) + else + callback.call(scope || this) + } + } + } +}) +; +Class('Siesta.Util.XMLNode', { + + has : { + children : Joose.I.Array, + + tag : { required : true }, + attributes : Joose.I.Object, + + textContent : null, + + escapeTable : { + + init : { + '&' : '&', + '<' : '<', + '>' : '>', + '"' : '"' + } + } + + }, + + + methods : { + + escapeXml : function (s) { + var me = this + + return typeof s != 'string' ? s : s.replace(/[&<>"]/g, function (match) { + return me.escapeTable[ match ] + }) + }, + + + toString : function () { + var me = this + var childrenContent = [] + + Joose.A.each(this.children, function (child) { + childrenContent.push(child.toString()) + }) + + var attributesContent = [] + + Joose.O.each(this.attributes, function (value, name) { + attributesContent.push(name + '="' + me.escapeXml(value) + '"') + }) + + // to have predictable order of attributes in tests + attributesContent.sort() + + attributesContent.unshift(this.tag) + + + return '<' + attributesContent.join(' ') + '>' + (this.textContent != null ? this.escapeXml(this.textContent) : '') + childrenContent.join('') + '' + }, + + + appendChild : function (child) { + if (child instanceof Siesta.Util.XMLNode) + child.parent = this + else + child = new Siesta.Util.XMLNode(Joose.O.extend(child, { parent : this })) + + this.children.push(child) + + return child + }, + + + setAttribute : function (name, value) { + this.attributes[ name ] = value + } + } +}) +; +Class('Siesta.Util.Rect', { + + has : { + left : null, + top : null, + width : null, + height : null, + + right : null, + bottom : null + }, + + + methods : { + + initialize : function () { + var left = this.left + var width = this.width + var right = this.right + + if (right == null && left != null && width != null) this.right = left + width - 1 + + if (width == null && left != null && right != null) this.width = right - left + 1 + + var top = this.top + var height = this.height + var bottom = this.bottom + + if (bottom == null && top != null && height != null) this.bottom = top + height - 1 + + if (height == null && top != null && bottom != null) this.height = bottom - top + 1 + }, + + + isEmpty : function () { + return this.left == null + }, + + + intersect : function (rect) { + if ( + rect.isEmpty() || this.isEmpty() + || + rect.left > this.right || rect.right < this.left + || + rect.top > this.bottom || rect.bottom < this.top + ) return this.my.getEmpty() + + return new this.constructor({ + left : Math.max(this.left, rect.left), + right : Math.min(this.right, rect.right), + top : Math.max(this.top, rect.top), + bottom : Math.min(this.bottom, rect.bottom) + }) + }, + + + contains : function (left, top) { + return this.left <= left && left <= this.right + && + this.top <= top && top <= this.bottom + }, + + + cropLeftRight : function (rect) { + return this.intersect(new this.constructor({ + left : rect.left, + right : rect.right, + top : this.top, + bottom : this.bottom + })) + }, + + + cropTopBottom : function (rect) { + return this.intersect(new this.constructor({ + left : this.left, + right : this.right, + top : rect.top, + bottom : rect.bottom + })) + }, + + + equalsTo : function (rect) { + return this.left == rect.left && this.right == rect.right && this.top == rect.top && this.bottom == rect.bottom + } + }, + + + // static methods/props + my : { + has : { + HOST : null + }, + + methods : { + + getEmpty : function () { + return new this.HOST() + } + } + } +}) +; +Class('Siesta.Content.Resource', { + + has : { + url : null, + + content : null + }, + + + methods : { + + asHTML : function () { + throw "Abstract method called" + }, + + + asDescriptor : function () { + throw "Abstract method called" + }, + + + // todo should check same-origin + canCache : function () { + } + + } + +}) +//eof Siesta.Result + +; +Class('Siesta.Content.Resource.CSS', { + + isa : Siesta.Content.Resource, + + has : { + }, + + + methods : { + + asHTML : function () { + }, + + + asDescriptor : function () { + var res = { + type : 'css' + } + + if (this.url) res.url = this.url + if (this.content) res.content = this.content + + return res + } + } + +}) +//eof Siesta.Result + +; +Class('Siesta.Content.Resource.JavaScript', { + + isa : Siesta.Content.Resource, + + has : { + instrument : false + }, + + + methods : { + + asHTML : function () { + }, + + + asDescriptor : function () { + var res = { + type : 'js' + } + + if (this.url) res.url = this.url + if (this.content) res.content = this.content + + return res + } + } + +}) +//eof Siesta.Result + +; +Class('Siesta.Content.Preset', { + + has : { + preload : Joose.I.Array, + + resources : Joose.I.Array + }, + + + methods : { + + initialize : function () { + var me = this + + Joose.A.each(this.preload, function (preloadDesc) { + + me.addResource(preloadDesc) + }) + }, + + + isCSS : function (url) { + return /\.css(\?.*)?$/i.test(url) + }, + + + getResourceFromDescriptor : function (desc) { + var constructor, config + + var CSS + + if (typeof desc == 'string') { + constructor = this.isCSS(desc) ? Siesta.Content.Resource.CSS : Siesta.Content.Resource.JavaScript + + config = { url : desc } + } else if (desc.text) { + constructor = Siesta.Content.Resource.JavaScript + config = { content : desc.text } + + } else { + if (!desc.url && !desc.content) throw "Incorrect preload descriptor:" + desc + + constructor = desc.type && desc.type == 'css' || this.isCSS(desc.url) ? Siesta.Content.Resource.CSS : Siesta.Content.Resource.JavaScript + + config = {} + + if (desc.url) config.url = desc.url + if (desc.content) config.content = desc.content + if (desc.instrument) config.instrument = desc.instrument + } + + return new constructor(config) + }, + + + addResource : function (desc) { + var resource = (desc instanceof Siesta.Content.Resource) && desc || this.getResourceFromDescriptor(desc) + + this.resources.push(resource) + + return resource + }, + + + eachResource : function (func, scope) { + return Joose.A.each(this.resources, func, scope || this) + }, + + + // deprecated - seems preset doesn't need to know about scope providers + prepareScope : function (scopeProvider, contentManager) { + + this.eachResource(function (resource) { + + if (contentManager.hasContentOf(resource)) + scopeProvider.addPreload({ + type : (resource instanceof Siesta.Content.Resource.CSS) ? 'css' : 'js', + content : contentManager.getContentOf(resource) + }) + else + scopeProvider.addPreload(resource.asDescriptor()) + }) + } + } + +}) + +; +Class('Siesta.Content.Manager', { + + has : { + disabled : false, + + presets : { + required : true + }, + + urls : Joose.I.Object, + + maxLoads : 5, + + harness : null + }, + + + methods : { + + cache : function (callback, errback, ignoreErrors) { + if (this.disabled) { + callback && callback() + + return + } + + var urls = this.urls + var me = this + + Joose.A.each(this.presets, function (preset) { + preset.eachResource(function (resource) { + if (resource.url) urls[ resource.url ] = null + }) + }) + + var loadCount = 0 + var errorCount = 0 + + var urlsArray = [] + + Joose.O.each(urls, function (value, url) { + // if some content has been already provided - skip it from caching + if (!me.hasContentOf(url)) urlsArray.push(url) + }) + + var total = urlsArray.length + + if (total) { + + var loadSingle = function () { + if (!urlsArray.length) return + + var url = urlsArray.shift() + + me.load(url, function (content) { + if (errorCount) return + + urls[ url ] = content + + if (++loadCount == total) + callback && callback() + else + loadSingle() + + }, ignoreErrors ? function () { + + if (++loadCount == total) + callback && callback() + else + loadSingle() + + } : function () { + errorCount++ + + errback && errback(url) + }) + } + + // running only `maxLoads` "loading threads" at the same time + for (var i = 0; i < this.maxLoads; i++) loadSingle() + + } else + callback && callback() + }, + + + load : function (url, callback, errback) { + throw "abstract method `load` called" + }, + + + addContent : function (url, content) { + this.urls[ url ] = content + }, + + + hasContentOf : function (url) { + if (url instanceof Siesta.Content.Resource) url = url.url + + return typeof this.urls[ url ] == 'string' + }, + + + getContentOf : function (url) { + if (url instanceof Siesta.Content.Resource) url = url.url + + return this.urls[ url ] + } + } +}) + +; +; +Class('Siesta', { + /*PKGVERSION*/VERSION : '2.0.4', + + // "my" should been named "static" + my : { + + has : { + config : null, + activeHarness : null + }, + + methods : { + + getConfigForTestScript : function (text) { + try { + eval(text) + + return this.config + } catch (e) { + return null + } + }, + + + StartTest : function (arg1, arg2) { + if (typeof arg1 == 'object') + this.config = arg1 + else if (typeof arg2 == 'object') + this.config = arg2 + else + this.config = null + } + } + } +}) + +// fake StartTest function to extract test configs +if (typeof StartTest == 'undefined') StartTest = Siesta.StartTest +if (typeof startTest == 'undefined') startTest = Siesta.StartTest +if (typeof describe == 'undefined') describe = Siesta.StartTest; +;(function () { + +var ID = 0 + +Class('Siesta.Result', { + + has : { + description : null, + + children : Joose.I.Array, + + length : 0, + + id : function () { + return ++ID + }, + + parent : null + }, + + + methods : { + + itemAt : function (i) { + return this.children[ i ] + }, + + + push : function (result) { + this.children.push(result) + + result.parent = this + + this.length = this.children.length + }, + + + each : function (func, scope) { + var children = this.children + + if (func.call(scope || this, this) === false) return false + + for (var i = 0; i < children.length; i++) + if (children[ i ].each(func, scope) === false) return false + }, + + + eachChild : function (func, scope) { + var children = this.children + + for (var i = 0; i < children.length; i++) + if (func.call(scope, children[ i ]) === false) return false + }, + + + toString : function () { + return this.description + }, + + + toJSON : function () { + return { + type : this.meta.name, + description : this.description + } + }, + + + findChildById : function (id) { + var child + + this.each(function (node) { + if (node.id == id) { child = node; return false } + }) + + return child + } + }, + + // used for self-testing when we need different ids for outer context and context being tested + my : { + methods : { + seedID : function (value) { + ID = value + } + } + } + +}) + + +})(); +Class('Siesta.Result.Diagnostic', { + + isa : Siesta.Result, + + has : { + isWarning : false + }, + + methods : { + + toString : function () { + return '# ' + this.description + }, + + + toJSON : function () { + var info = { + type : this.meta.name, + description : this.description + } + + if (this.isWarning) info.isWarning = true + + return info + } + } +}); + +; +Class('Siesta.Result.Summary', { + + isa : Siesta.Result, + + has : { + isFailed : false + }, + + methods : { + + // summary should belong only to the top level Siesta.Result.SubTest instance + getTest : function () { + return this.parent.test + }, + + + toString : function () { + + } + } +}); + +; +Class('Siesta.Result.Assertion', { + + isa : Siesta.Result, + + + has : { + name : null, + + passed : null, + + annotation : null, + + index : null, + // stored as string + sourceLine : null, + + isSkipped : false, + isTodo : false, + + isException : false, + exceptionType : null, + + isWaitFor : false, + completed : false // for waitFor assertions + }, + + + methods : { + + isPassed : function (raw) { + if (raw) return this.passed + + if (this.isTodo) return true + + if (this.isWaitFor && !this.completed) return true + + return this.passed + }, + + + toString : function () { + var text = (this.isTodo ? 'TODO: ' : '') + (this.passed ? 'ok ' : 'fail ') + this.index + ' - ' + this.description + + if (this.annotation) text += '\n' + this.annotation + + return text + }, + + + toJSON : function () { + var me = this + + var info = { + type : this.meta.name, + passed : this.passed, + description : this.description || 'No description' + } + + // copy if true + Joose.A.each([ 'isTodo', 'annotation', 'isWaitFor', 'isException', 'sourceLine', 'name' ], function (name) { + if (me[ name ]) info[ name ] = me[ name ] + }) + + if (this.isException) { + info.exceptionType = this.exceptionType + } + + return info + } + } +}) + +; +Class('Siesta.Result.SubTest', { + + isa : Siesta.Result, + + + has : { + // reference to a test it belongs to + // SubTests result instances will be set as `results` for sub tests instances + test : null + }, + + + methods : { + + isWorking : function () { + return !this.test.isFinished() + }, + + + toJSON : function () { + var test = this.test + + // a flag that test instance does not belongs to the current context + // this only happens during self-testing + // if this is the case, in IE, calling any method from the test context will throw exception + // "can't execute script from freed context", so we avoid calling any methods on the test in such case + // accessing properties is ok though + var isCrossContext = !(test instanceof Object) + + var report = { + type : this.meta.name, + name : test.name, + + startDate : test.startDate, + endDate : test.endDate || (new Date() - 0), + + passed : isCrossContext ? null : test.isPassed() + } + + if (!test.parent) report.url = test.url + if (test.specType) report.bddSpecType = test.specType + + var isFailed = false + var assertions = [] + + Joose.A.each(this.children, function (result) { + if ((result instanceof Siesta.Result.Assertion) || (result instanceof Siesta.Result.Diagnostic) || (result instanceof Siesta.Result.SubTest)) { + var assertion = result.toJSON() + + if (!assertion.passed && !assertion.isTodo) isFailed = true + + assertions.push(assertion) + } + }) + + report.assertions = assertions + + // see a comment above + if (isCrossContext) { + report.passed = !(isFailed || test.failed || !test.endDate) + } + + return report + } + + } +}) + +; +/** +@class Siesta.Test.Function + +This is a mixin, with helper methods for testing functionality relating to DOM elements. This mixin is consumed by {@link Siesta.Test} + +*/ +Role('Siesta.Test.Function', { + + methods : { + /** + * This assertion passes if the function is called at least one time during the test life span. + * + * @param {Function/String} fn The function itself or the name of the function on the host object (2nd argument) + * @param {Object} host The "owner" of the method + * @param {String} desc The description of the assertion. + */ + isCalled : function(fn, obj, desc) { + this.isCalledNTimes(fn, obj, 1, desc, true); + }, + + /** + * This assertion passes if the function is called exactly one time during the test life span. + * + * @param {Function/String} fn The function itself or the name of the function on the host object (2nd argument) + * @param {Object} host The "owner" of the method + * @param {String} desc The description of the assertion. + */ + isCalledOnce : function(fn, obj, desc) { + this.isCalledNTimes(fn, obj, 1, desc, false); + }, + + /** + * This assertion passes if the function is called exactly (n) times during the test life span. + * + * @param {Function/String} fn The function itself or the name of the function on the host object (2nd argument) + * @param {Object} host The "owner" of the method + * @param {Number} n The expected number of calls + * @param {String} desc The description of the assertion. + */ + isCalledNTimes : function(fn, obj, n, desc, isGreaterEqual) { + var me = this, + prop = typeof fn === "string" ? fn : me.getPropertyName(obj, fn); + + desc = desc ? (desc + ' ') : ''; + + this.on('beforetestfinalizeearly', function () { + if (counter === n || (isGreaterEqual && counter > n)) { + me.pass(desc || (prop + ' method was called exactly ' + n + ' times')); + } else { + + me.fail(desc || prop, { + assertionName : 'isCalledNTimes ' + prop, + got : counter, + need : n , + needDesc : ("Need " + (isGreaterEqual ? 'at least ' : 'exactly ')) + }); + } + }); + + var counter = 0; + fn = obj[prop]; + obj[prop] = function () { counter++; return fn.apply(this, arguments); }; + }, + + /** + * This assertion passes if the function is not called during the test life span. + * + * @param {Function/String} fn The function itself or the name of the function on the host object (2nd argument) + * @param {Object} host The "owner" of the method + * @param {Number} n The expected number of calls + * @param {String} desc The description of the assertion. + */ + isntCalled : function(fn, obj, desc) { + this.isCalledNTimes(fn, obj, 0, desc); + }, + + getPropertyName : function(host, obj) { + for (var o in host) { + if (host[o] === obj) return o; + } + }, + + /** + * This assertion passes when the supplied class method is called exactly (n) times during the test life span. + * Under "class method" here we mean the function in the prototype. Note, that this assertion counts calls to the method in *any* class instance. + * + * The `className` parameter can be supplied as a class constructor function or as a string, representing the class + * name. In the latter case the `class` will be eval'ed to get a reference to the class constructor. + * + * For example: + + StartTest(function (t) { + + function machine(type, version) { + this.machineInfo = { + type : type, + version : version + }; + }; + + machine.prototype.update = function (type, version) { + this.setVersion(type); + this.setType(version); + }; + + machine.prototype.setVersion = function (data) { + this.machineInfo.version = data; + }; + + machine.prototype.setType = function (data) { + this.machineInfo.type = data; + }; + + t.methodIsCalled("setVersion", machine, "Checking if method 'setVersion' has been called"); + t.methodIsCalled("setType", machine, "Checking if method 'setType' has been called"); + + var m = new machine('rover', '0.1.2'); + + m.update('3.2.1', 'New Rover'); + }); + + * + * This assertion is useful when testing for example an Ext JS class where event listeners are added during + * class instantiation time, which means you need to observe the prototype method before instantiation. + * + * @param {Function/String} fn The function itself or the name of the method on the class (2nd argument) + * @param {Function/String} className The constructor function or the name of the class that contains the method + * @param {Number} n The expected number of calls + * @param {String} desc The description of the assertion + */ + methodIsCalledNTimes: function(fn, className, n, desc, isGreaterEqual){ + var me = this, + counter = 0; + + desc = desc ? (desc + ' ') : ''; + + try { + if (me.typeOf(className) == 'String') className = me.global.eval(className) + } catch (e) { + me.fail(desc, { + assertionName : 'isMethodCalled', + annotation : "Exception [" + e + "] caught, while evaluating the class name [" + className + "]" + }) + + return + } + + var prototype = className.prototype; + var prop = typeof fn === "string" ? fn : me.getPropertyName(prototype, fn); + + me.on('beforetestfinalizeearly', function () { + if (counter === n || (isGreaterEqual && counter > n)) { + me.pass(desc || (prop + ' method was called exactly ' + n + ' times')); + } else { + me.fail(desc || prop, { + assertionName : 'isCalledNTimes ' + prop, + got : counter, + need : n , + needDesc : ("Need " + (isGreaterEqual ? 'at least ' : 'exactly ')) + }); + } + }); + + fn = prototype[ prop ]; + prototype[ prop ] = function () { counter++; return fn.apply(this, arguments); }; + }, + + /** + * This assertion passes if the class method is called at least one time during the test life span. + * + * See {@link #methodIsCalledNTimes} for more details. + * + * @param {Function/String} fn The function itself or the name of the method on the class (2nd argument) + * @param {Function/String} className The class constructor function or name of the class that contains the method + * @param {String} desc The description of the assertion. + */ + methodIsCalled : function(fn, className, desc) { + this.methodIsCalledNTimes(fn, className, 1, desc, true); + }, + + /** + * This assertion passes if the class method is not called during the test life span. + * + * See {@link #methodIsCalledNTimes} for more details. + * + * @param {Function/String} fn The function itself or the name of the method on the class (2nd argument) + * @param {Function/String} className The class constructor function or name of the class that contains the method + * @param {String} desc The description of the assertion. + */ + methodIsntCalled : function(fn, className, desc) { + this.methodIsCalledNTimes(fn, className, 0, desc); + } + } +}); +; +/** +@class Siesta.Test.Date + +A mixin with the additinal assertions for dates. Being consumed by {@link Siesta.Test} + +*/ +Role('Siesta.Test.Date', { + + methods : { + + isDateEq: function (got, expectedDate, description) { + this.isDateEqual.apply(this, arguments); + }, + + + /** + * This assertion passes when the 2 provided dates are equal and fails otherwise. + * + * It has a synonym: `isDateEq` + * + * @param {Date} got The 1st date to compare + * @param {Date} expectedDate The 2nd date to compare + * @param {String} [description] The description of the assertion + */ + isDateEqual: function (got, expectedDate, description) { + if (got - expectedDate === 0) { + this.pass(description, { + descTpl : '{got} date is equal to {expectedDate}', + got : got, + expectedDate : expectedDate + }); + } else { + this.fail(description, { + assertionName : 'isDateEqual', + + got : got ? got.toString() : '', + gotDesc : 'Got', + + need : expectedDate.toString() + }); + } + } + } +}); +; +/** +@class Siesta.Test.More + +A mixin with additional generic assertion methods, which can work cross-platform between browsers and NodeJS. +Is being consumed by {@link Siesta.Test}, so all of them are available in all tests. + +*/ +Role('Siesta.Test.More', { + + requires : [ 'isFailed', 'typeOf', 'on' ], + + + has : { + autoCheckGlobals : false, + expectedGlobals : Joose.I.Array, + + disableGlobalsCheck : false, + + browserGlobals : { + init : [ + 'console', + 'getInterface', + 'ExtBox1', + '__IE_DEVTOOLBAR_CONSOLE_COMMAND_LINE', + 'seleniumAlert', + 'onload', + 'onerror', + 'StartTest', + 'startTest', + 'describe', + // will be reported in IE8 after overriding + 'setTimeout', + 'clearTimeout', + 'requestAnimationFrame', + 'cancelAnimationFrame', + '__coverage__', + /__cov_\d+/ + ] + }, + + /** + * @cfg {Number} waitForTimeout Default timeout for `waitFor` (in milliseconds). Default value is 10000. + */ + waitForTimeout : 10000, + + waitForPollInterval : 100 + }, + + + methods : { + + /** + * This assertion passes, when the comparison of 1st with 2nd, using `>` operator will return `true` and fails otherwise. + * + * @param {Number/Date} value1 The 1st value to compare + * @param {Number/Date} value2 The 2nd value to compare + * @param {String} desc The description of the assertion + */ + isGreater : function (value1, value2, desc) { + if (value1 > value2) + this.pass(desc, { + descTpl : '`{value1}` is greater than `{value2}`', + value1 : value1, + value2 : value2 + }) + else + this.fail(desc, { + assertionName : 'isGreater', + + got : value1, + need : value2, + + needDesc : "Need, greater than" + }) + }, + + + /** + * This assertion passes, when the comparison of 1st with 2nd, using `<` operator will return `true` and fails otherwise. + * + * @param {Number/Date} value1 The 1st value to compare + * @param {Number/Date} value2 The 2nd value to compare + * @param {String} desc The description of the assertion + */ + isLess : function (value1, value2, desc) { + if (value1 < value2) + this.pass(desc, { + descTpl : '`{value1}` is less than `{value2}`', + value1 : value1, + value2 : value2 + }) + else + this.fail(desc, { + assertionName : 'isLess', + + got : value1, + need : value2, + + needDesc : "Need, less than" + }) + }, + + + isGE : function () { + this.isGreaterOrEqual.apply(this, arguments) + }, + + /** + * This assertion passes, when the comparison of 1st with 2nd, using `>=` operator will return `true` and fails otherwise. + * + * It has a synonym - `isGE`. + * + * @param {Number/Date} value1 The 1st value to compare + * @param {Number/Date} value2 The 2nd value to compare + * @param {String} desc The description of the assertion + */ + isGreaterOrEqual : function (value1, value2, desc) { + if (value1 >= value2) + this.pass(desc, { + descTpl : '`{value1}` is greater or equal to `{value2}`', + value1 : value1, + value2 : value2 + }) + else + this.fail(desc, { + assertionName : 'isGreaterOrEqual', + + got : value1, + need : value2, + + needDesc : "Need, greater or equal to" + }) + }, + + + + isLE : function () { + this.isLessOrEqual.apply(this, arguments) + }, + + /** + * This assertion passes, when the comparison of 1st with 2nd, using `<=` operator will return `true` and fails otherwise. + * + * It has a synonym - `isLE`. + * + * @param {Number/Date} value1 The 1st value to compare + * @param {Number/Date} value2 The 2nd value to compare + * @param {String} desc The description of the assertion + */ + isLessOrEqual : function (value1, value2, desc) { + if (value1 <= value2) + this.pass(desc, { + descTpl : '`{value1}` is less or equal to `{value2}`', + value1 : value1, + value2 : value2 + }) + else + this.fail(desc, { + assertionName : 'isLessOrEqual', + + got : value1, + need : value2, + + needDesc : "Need, less or equal to" + }) + }, + + + /** + * This assertion suppose to compare the numeric values. It passes when the passed values are approximately the same (the difference + * is withing a threshold). A threshold can be provided explicitly (when assertion is called with 4 arguments), + * or it will be set to 5% from the 1st value (when calling assertion with 3 arguments). + * + * @param {Number} value1 The 1st value to compare + * @param {Number} value2 The 2nd value to compare + * @param {Number} threshHold The maximum allowed difference between values. This argument can be omited. + * @param {String} desc The description of the assertion + */ + isApprox : function (value1, value2, threshHold, desc) { + if (arguments.length == 2) threshHold = Math.abs(value1 * 0.05) + + if (arguments.length == 3) { + if (this.typeOf(threshHold) == 'String') { + desc = threshHold + threshHold = Math.abs(value1 * 0.05) + } + } + + // this function normalizes the fractional numbers to fixed point presentation + // for example in JS: 1.05 - 1 = 0.050000000000000044 + // so what we do is: (1.05 * 10^2 - 1 * 10^2) / 10^2 = (105 - 100) / 100 = 0.05 + var subtract = function (value1, value2) { + var fractionalLength = function (v) { + var afterPointPart = (v + '').split('.')[ 1 ] + + return afterPointPart && afterPointPart.length || 0 + } + + var maxLength = Math.max(fractionalLength(value1), fractionalLength(value2)) + var k = Math.pow(10, maxLength); + + return (value1 * k - value2 * k) / k; + }; + + if (Math.abs(subtract(value2, value1)) <= threshHold) + this.pass(desc, { + descTpl : '`{value1}` is approximately equal to `{value2}`', + value1 : value1, + value2 : value2, + annotation : value2 == value1 ? 'Exact match' : 'Match within treshhold: ' + threshHold + }) + else + this.fail(desc, { + assertionName : 'isApprox', + got : value1, + need : value2, + needDesc : 'Need approx', + annotation : 'Threshold is: ' + threshHold + }) + }, + + + /** + * This assertion passes when the passed `string` matches to a regular expression `regex`. When `regex` is a string, + * assertion will check that it is a substring of `string` + * + * @param {String} string The string to check for "likeness" + * @param {String/RegExp} regex The regex against which to test the string, can be also a plain string + * @param {String} desc The description of the assertion + */ + like : function (string, regex, desc) { + if (this.typeOf(regex) == "RegExp") + + if (string.match(regex)) + this.pass(desc, { + descTpl : '`{string}` matches regexp {regex}', + string : string, + regex : regex + }) + else + this.fail(desc, { + assertionName : 'like', + got : string, + need : regex, + needDesc : 'Need string matching' + }) + else + + if (string.indexOf(regex) != -1) + this.pass(desc, { + descTpl : '`{string}` has a substring: `{regex}`', + string : string, + regex : regex + }) + else + this.fail(desc, { + assertionName : 'like', + got : string, + need : regex, + needDesc : 'Need string containing' + }) + }, + + /** + * This method is the opposite of 'like', it adds failed assertion, when the string matches the passed regex. + * + * @param {String} string The string to check for "unlikeness" + * @param {String/RegExp} regex The regex against which to test the string, can be also a plain string + * @param {String} desc The description of the assertion + */ + unlike : function(string, regex, desc) { + if (this.typeOf(regex) == "RegExp") + + if (!string.match(regex)) + this.pass(desc, { + descTpl : '`{string}` does not match regexp {regex}', + string : string, + regex : regex + }) + else + this.fail(desc, { + assertionName : 'unlike', + got : string, + need : regex, + needDesc : 'Need string not matching' + }) + else + + if (string.indexOf(regex) == -1) + this.pass(desc, { + descTpl : '`{string}` does not have a substring: `{regex}`', + string : string, + regex : regex + }) + else + this.fail(desc, { + assertionName : 'unlike', + got : string, + need : regex, + needDesc : 'Need string not containing' + }) + }, + + + "throws" : function () { + this.throwsOk.apply(this, arguments) + }, + + throws_ok : function () { + this.throwsOk.apply(this, arguments) + }, + + /** + * This assertion passes, when the `func` function throws the exception during executing, and the + * stringified exception passes the 'like' assertion (with 'expected' parameter). + * + * It has synonyms - `throws_ok` and `throws`. + * + * @param {Function} func The function which supposed to throw an exception + * @param {String/RegExp} expected The regex against which to test the stringified exception, can be also a plain string + * @param {String} desc The description of the assertion + */ + throwsOk : function (func, expected, desc) { + if (this.typeOf(func) != 'Function') throw new Error('throws_ok accepts a function as 1st argument') + + var e = this.getExceptionCatcher()(func) + + // assuming no one will throw undefined exception.. + if (e === undefined) { + this.fail(desc, { + assertionName : 'throws_ok', + annotation : 'Function did not throw an exception' + }) + + return + } + + if (e instanceof this.getTestErrorClass()) + //IE uses non-standard 'description' property for error msg + e = e.message || e.description + + e = '' + e + + if (this.typeOf(expected) == "RegExp") + + if (e.match(expected)) + this.pass(desc, { + descTpl : 'Function throws exception matching to {expected}', + expected : expected + }) + else + this.fail(desc, { + assertionName : 'throws_ok', + got : e, + gotDesc : 'Exception stringifies to', + need : expected, + needDesc : 'Need string matching' + }) + else + + if (e.indexOf(expected) != -1) + this.pass(desc, { + descTpl : 'Function throws exception containing a substring: {expected}', + expected : expected + }) + else + this.fail(desc, { + assertionName : 'throws_ok', + got : e, + gotDesc : 'Exception stringifies to', + need : expected, + needDesc : 'Need string containing' + }) + }, + + + + lives_ok : function () { + this.livesOk.apply(this, arguments) + }, + + lives : function () { + this.livesOk.apply(this, arguments) + }, + + /** + * This assertion passes, when the supplied `func` function doesn't throw an exception during execution. + * + * This method has two synonyms: `lives_ok` and `lives` + * + * @param {Function} func The function which is not supposed to throw an exception + * @param {String} desc The description of the assertion + */ + livesOk : function (func, desc) { + if (this.typeOf(func) != 'Function') { + func = [ desc, desc = func ][ 0 ] + } + + var e = this.getExceptionCatcher()(func) + + if (e === undefined) + this.pass(desc, { + descTpl : 'Function does not throw any exceptions' + }) + else + this.fail(desc, { + assertionName : 'lives_ok', + annotation : 'Function threw an exception: ' + e + }) + }, + + + isa_ok : function (value, className, desc) { + this.isInstanceOf(value, className, desc) + }, + + + isaOk : function (value, className, desc) { + this.isInstanceOf(value, className, desc) + }, + + /** + * This assertion passes, when the supplied `value` is the instance of the `className`. The check is performed with + * `instanceof` operator. The `className` parameter can be supplied as class constructor or as string, representing the class + * name. In the latter case the `class` will eval'ed to receive the class constructor. + * + * This method has synonyms: `isaOk`, `isa_ok` + * + * @param {Mixed} value The value to check for 'isa' relationship + * @param {Class/String} className The class to check for 'isa' relationship with `value` + * @param {String} desc The description of the assertion + */ + isInstanceOf : function (value, className, desc) { + try { + if (this.typeOf(className) == 'String') className = this.global.eval(className) + } catch (e) { + this.fail(desc, { + assertionName : 'isa_ok', + annotation : "Exception [" + e + "] caught, while evaluating the class name [" + className + "]" + }) + + return + } + + if (value instanceof className) + this.pass(desc, { + descTpl : '{value} is an instance of correct class', + value : value + }) + else + this.fail(desc, { + assertionName : 'isa_ok', + got : value, + need : String(className), + needDesc : 'Need, instance of' + }) + }, + + + /** + * This assertion passes, if supplied value is a String. + * + * @param {Mixed} value The value to check. + * @param {String} desc The description of the assertion + */ + isString : function (value, desc) { + if (this.typeOf(value) == 'String') + this.pass(desc, { + descTpl : '{value} is a string', + value : value + }) + else + this.fail(desc, { + got : value, + need : "A string value" + }) + }, + + + /** + * This assertion passes, if supplied value is an Object + * + * @param {Mixed} value The value to check. + * @param {String} desc The description of the assertion + */ + isObject : function (value, desc) { + if (this.typeOf(value) == 'Object') + this.pass(desc, { + descTpl : '{value} is an object', + value : value + }) + else + this.fail(desc, { + got : value, + need : "An object value" + }) + }, + + + /** + * This assertion passes, if supplied value is an Array + * + * @param {Mixed} value The value to check. + * @param {String} desc The description of the assertion + */ + isArray : function (value, desc) { + if (this.typeOf(value) == 'Array') + this.pass(desc, { + descTpl : '{value} is an array', + value : value + }) + else + this.fail(desc, { + got : value, + need : "An array value" + }) + }, + + + /** + * This assertion passes, if supplied value is a Number. + * + * @param {Mixed} value The value to check. + * @param {String} desc The description of the assertion + */ + isNumber : function (value, desc) { + if (this.typeOf(value) == 'Number') + this.pass(desc, { + descTpl : '{value} is a number', + value : value + }) + else + this.fail(desc, { + got : value, + need : "A number value" + }) + }, + + + /** + * This assertion passes, if supplied value is a Boolean. + * + * @param {Mixed} value The value to check. + * @param {String} desc The description of the assertion + */ + isBoolean : function (value, desc) { + if (this.typeOf(value) == 'Boolean') + this.pass(desc, { + descTpl : '{value} is a boolean', + value : value + }) + else + this.fail(desc, { + got : value, + need : "A boolean value" + }) + }, + + + /** + * This assertion passes, if supplied value is a Date. + * + * @param {Mixed} value The value to check. + * @param {String} desc The description of the assertion + */ + isDate : function (value, desc) { + if (this.typeOf(value) == 'Date') + this.pass(desc, { + descTpl : '{value} is a date', + value : value + }) + else + this.fail(desc, { + got : value, + need : "A date value" + }) + }, + + + /** + * This assertion passes, if supplied value is a RegExp. + * + * @param {Mixed} value The value to check. + * @param {String} desc The description of the assertion + */ + isRegExp : function (value, desc) { + if (this.typeOf(value) == 'RegExp') + this.pass(desc, { + descTpl : '{value} is a regular expression', + value : value + }) + else + this.fail(desc, { + got : value, + need : "A regular expression value" + }) + }, + + + /** + * This assertion passes, if supplied value is a Function. + * + * @param {Mixed} value The value to check. + * @param {String} desc The description of the assertion + */ + isFunction : function (value, desc) { + if (this.typeOf(value) == 'Function') + this.pass(desc, { + descTpl : '{value} is a function', + value : value + }) + else + this.fail(desc, { + got : value, + need : "A function value" + }) + }, + + + is_deeply : function (obj1, obj2, desc) { + this.isDeeply.apply(this, arguments) + }, + + /** + * This assertion passes when in-depth comparison of 1st and 2nd arguments (which are assumed to be JSON objects) shows that they are equal. + * Comparison is performed with '==' operator, so `[ 1 ]` and `[ "1" ] objects will be equal. The objects should not contain cyclic references. + * + * This method works correctly with the *placeholders* generated with method {@link #any}. + * + * This method has a synonym: `is_deeply` + * + * @param {Object} obj1 The 1st object to compare + * @param {Object} obj2 The 2nd object to compare + * @param {String} desc The description of the assertion + */ + isDeeply : function (obj1, obj2, desc) { + if (this.typeOf(obj1) === this.typeOf(obj2) && this.compareObjects(obj1, obj2)) + this.pass(desc, { + descTpl : '{obj1} is deeply equal to {obj2}', + obj1 : obj1, + obj2 : obj2 + }) + else + this.fail(desc, { + assertionName : 'isDeeply', + got : obj1, + need : obj2 + }) + }, + + + /** + * This assertion passes when in-depth comparison of 1st and 2nd arguments (which are assumed to be JSON objects) shows that they are equal. + * Comparison is performed with '===' operator, so `[ 1 ]` and `[ "1" ] objects will be different. The objects should not contain cyclic references. + * + * This method works correctly with the *placeholders* generated with method {@link #any}. + * + * @param {Object} obj1 The 1st object to compare + * @param {Object} obj2 The 2nd object to compare + * @param {String} desc The description of the assertion + */ + isDeeplyStrict : function (obj1, obj2, desc) { + if (this.typeOf(obj1) === this.typeOf(obj2) && this.compareObjects(obj1, obj2, true)) + this.pass(desc, { + descTpl : '{obj1} is strictly deeply equal to {obj2}', + obj1 : obj1, + obj2 : obj2 + }) + else + this.fail(desc, { + assertionName : 'isDeeplyStrict', + got : obj1, + need : obj2 + }) + }, + + expectGlobal : function () { + this.expectGlobals.apply(this, arguments) + }, + + + /** + * This method accepts a variable number of names of expected properties in the global scope. When verifying the globals with {@link #verifyGlobals} + * assertions, the expected gloabls will not be counted as failed assertions. + * + * This method has a synonym with singular name: `expectGlobal` + * + * @param {String/RegExp} name1 The name of global property or the regular expression to match several properties + * @param {String/RegExp} name2 The name of global property or the regular expression to match several properties + * @param {String/RegExp} nameN The name of global property or the regular expression to match several properties + */ + expectGlobals : function () { + this.expectedGlobals.push.apply(this.expectedGlobals, arguments) + }, + + + /** + * This method accepts a variable number of names of expected properties in the global scope and then performs a globals check. + * + * It will scan all globals properties in the scope of test and compare them with the list of expected globals. Expected globals can be provided with: + * {@link #expectGlobals} method or {@link Siesta.Harness#expectedGlobals expectedGlobals} configuration option of harness. + * + * You can enable this assertion to automatically happen at the end of each test, using {@link Siesta.Harness#autoCheckGlobals autoCheckGlobals} option of the harness. + * + * @param {String/RegExp} name1 The name of global property or the regular expression to match several properties + * @param {String/RegExp} name2 The name of global property or the regular expression to match several properties + * @param {String/RegExp} nameN The name of global property or the regular expression to match several properties + */ + verifyGlobals : function () { + if (this.disableGlobalsCheck) { + this.diag('Testing leakage of global variables is not supported on this platform') + + return + } + + this.expectGlobals.apply(this, arguments) + + var me = this + var expectedStrings = {} + var expectedRegExps = [] + + Joose.A.each(this.expectedGlobals.concat(this.browserGlobals), function (value) { + if (me.typeOf(value) == 'RegExp') + expectedRegExps.push(value) + else + expectedStrings[ value ] = true + }) + + this.diag('Global variables') + + var failed = false + + for (var name in this.global) { + if (expectedStrings[ name ]) continue + + var isExpected = false + + for (var i = 0; i < expectedRegExps.length; i++) { + if (expectedRegExps[ i ].test(name)) { + isExpected = true + break + } + } + + if (!isExpected) { + me.fail('Unexpected global found', 'Global name: ' + name + ', value: ' + Siesta.Util.Serializer.stringify(this.global[name])) + + failed = true + } + } + + if (!failed) this.pass('No unexpected global variables found') + }, + + + // will create a half-realized, "phantom", "isWaitFor" assertion, which is only purposed + // for user to get the instant feedback about "waitFor" actions + // this assertion will be "finalized" and added to the test results in the "finalizeWaiting" + startWaiting : function (description, sourceLine) { + var result = new Siesta.Result.Assertion({ + description : description, + isWaitFor : true, + sourceLine : sourceLine + }); + + this.fireEvent('testupdate', this, result, this.getResults()) + + return result; + }, + + + finalizeWaiting : function (result, passed, desc, annotation, errback) { + // Treat this is an ordinary assertion from now on + result.completed = true; + + if (passed) + this.pass(desc, annotation, result) + else { + this.fail(desc, annotation, result); + + errback && errback() + } + }, + + + /** + * Waits for passed checker method to return true (or any non-false value, like for example DOM element or array), and calls the callback when this happens. + * As an additional feature, the callback will receive the result from the checker method as the 1st argument. + * + + t.waitFor( + function () { return document.getElementById('someEl') }, + function (el) { + // waited for element #someEl to appear + // element will be available in the callback as 1st argument "el" + } + }) + + * You can also call this method with a single Object having the following properties: `method`, `callback`, `scope`, `timeout`, `interval`: + + t.waitFor({ + method : function () { return document.getElementById('someEl') }, + callback : function (el) { + // waited for element #someEl to appear + // element will be available in the callback as 1st argument "el" + } + }) + + * + * @param {Object/Function/Number} method Either a function which should return true when a certain condition has been fulfilled, or a number of ms to wait before calling the callback. + * @param {Function} callback A function to call when the condition has been met. Will receive a result from checker function. + * @param {Object} scope The scope for the callback + * @param {Int} timeout The maximum amount of time (in milliseconds) to wait for the condition to be fulfilled. + * Defaults to the {@link Siesta.Test.ExtJS#waitForTimeout} value. If condition is not fullfilled within this time, a failed assertion will be added to the test. + * @param {Int} [interval=100] The polling interval (in milliseconds) + * + * @return {Object} An object with the following properties: + * @return {Function} return.force A function, that will force this wait operation to immediately complete (and call the callback). + * No call to checker will be performed and callback will not receive a result from it. + */ + waitFor : function (method, callback, scope, timeout, interval) { + var description = ' condition to be fullfilled'; + var assertionName = 'waitFor'; + var errback + + if (arguments.length === 1 && this.typeOf(method) == 'Object') { + var options = method; + + method = options.method; + callback = options.callback; + scope = options.scope; + timeout = options.timeout; + interval = options.interval + + description = options.description || description; + assertionName = options.assertionName || assertionName; + + // errback is called in case "waitFor" has failed + errback = options.errback + } + + var isWaitingForTime = this.typeOf(method) == 'Number' + + var description = isWaitingForTime ? (method + ' ms') : description; + var me = this; + + callback = callback || function () {} + + var sourceLine = me.getSourceLine(); + var originalSetTimeout = me.originalSetTimeout; + var originalClearTimeout = me.originalClearTimeout; + var pollTimeout + + // early notification about the started "waitFor" operation + var waitAssertion = me.startWaiting('Waiting for ' + description, sourceLine); + + interval = interval || this.waitForPollInterval + timeout = timeout || this.waitForTimeout + + // this async frame not supposed to fail, because its delayed to `timeout + 3 * interval` + // failure supposed to be generated in the "pollFunc" and this async frame to be closed + // however, in IE it happens that async frame may end earlier than failure from "pollFunc" + // in such case we report same error as in "pollFunc" + var async = this.beginAsync((isWaitingForTime ? method : timeout) + 3 * interval, function () { + originalClearTimeout(pollTimeout) + + me.finalizeWaiting(waitAssertion, false, 'Waited too long for: ' + description, { + assertionName : assertionName, + annotation : 'Condition was not fullfilled during ' + timeout + 'ms' + }, errback) + + return true + }) + + var isDone = false + + // stop polling, if this test instance has finalized (probably because of exception) + this.on('beforetestfinalize', function () { + if (!isDone) { + isDone = true + + me.finalizeWaiting(waitAssertion, false, 'Waiting aborted'); + me.endAsync(async) + + originalClearTimeout(pollTimeout) + } + }, null, { single : true }) + + if (isWaitingForTime) { + pollTimeout = originalSetTimeout(function() { + isDone = true + + me.finalizeWaiting(waitAssertion, true, 'Waited ' + method + ' ms'); + me.endAsync(async); + me.processCallbackFromTest(callback, [], scope || me) + }, method); + + } else { + + var startDate = new Date() + + var pollFunc = function () { + var time = new Date() - startDate; + + if (time > timeout) { + me.endAsync(async); + + me.finalizeWaiting(waitAssertion, false, 'Waited too long for: ' + description, { + assertionName : assertionName, + annotation : 'Condition was not fullfilled during ' + timeout + 'ms' + }, errback) + + isDone = true + + return + } + + try { + var result = method.call(scope || me); + } catch (e) { + me.endAsync(async); + + me.finalizeWaiting(waitAssertion, false, assertionName + ' checker threw an exception', { + assertionName : assertionName, + got : e.toString(), + gotDesc : "Exception" + }, errback) + + isDone = true + + return + } + + if (result != null && result !== false) { + me.endAsync(async); + + isDone = true + + me.finalizeWaiting(waitAssertion, true, 'Waited ' + time + ' ms for ' + description); + + me.processCallbackFromTest(callback, [ result ], scope || me) + } else + pollTimeout = originalSetTimeout(pollFunc, interval) + } + + pollFunc() + } + + return { + force : function () { + // wait operation already completed + if (isDone) return + + isDone = true + + originalClearTimeout(pollTimeout) + + me.endAsync(async); + + me.finalizeWaiting(waitAssertion, true, 'Forced finalization of waiting for ' + description); + + me.processCallbackFromTest(callback, [], scope || me) + } + } + }, + + /** + * Waits for the number of a number millseconds and calls the callback when after waiting. This is just a convenience synonym for the {@link #waitFor} method. + + t.waitForMs(1500, callback) + + * + * @param {Number} method The number of ms to wait before calling the callback. + * @param {Function} callback A function to call when the condition has been met. Will receive a result from checker function. + * @param {Object} scope The scope for the callback + * @param {Int} timeout The maximum amount of time (in milliseconds) to wait for the condition to be fulfilled. + * Defaults to the {@link Siesta.Test.ExtJS#waitForTimeout} value. If condition is not fullfilled within this time, a failed assertion will be added to the test. + * @param {Int} [interval=100] The polling interval (in milliseconds) + * + * @return {Object} An object with the following properties: + * @return {Function} return.force A function, that will force this wait operation to immediately complete (and call the callback). + * No call to checker will be performed and callback will not receive a result from it. + */ + waitForMs : function() { + return this.waitFor.apply(this, arguments); + }, + + + /** + * Waits for the passed checker method to return true (or any non-false value, like for example DOM element or array), and calls the callback when this happens. + * This is just a convenience synonym for the {@link #waitFor} method. + * + + t.waitForFn(function() { return true; }, callback) + + * + * @param {Function} fn The checker function. + * @param {Function} callback A function to call when the condition has been met. Will receive a result from checker function. + * @param {Object} scope The scope for the callback + * @param {Int} timeout The maximum amount of time (in milliseconds) to wait for the condition to be fulfilled. + * Defaults to the {@link Siesta.Test.ExtJS#waitForTimeout} value. If condition is not fullfilled within this time, a failed assertion will be added to the test. + * @param {Int} [interval=100] The polling interval (in milliseconds) + * + * @return {Object} An object with the following properties: + * @return {Function} return.force A function, that will force this wait operation to immediately complete (and call the callback). + * No call to checker will be performed and callback will not receive a result from it. + */ + waitForFn : function() { + return this.waitFor.apply(this, arguments); + }, + + // takes the step function and tries to analyze if it is missing the call to "next" + // returns "true" if "next" is used, + analyzeChainStep : function (func) { + var sources = func.toString() + var firstArg = sources.match(/function\s*[^(]*\(\s*(.*?)\s*(?:,|\))/)[ 1 ] + + if (!firstArg) return false + + var body = sources.match(/\{([\s\S]*)\}/)[ 1 ] + + return body.indexOf(firstArg) != -1 + }, + + + /** + * This method accept either variable number of arguments (steps) or the array of them. + * Each step should be either a function or configuration object for test actions. + * These functions / actions will be executed in order. + * + * 1) If step is a function, as the 1st argument, it will receive a callback to call when the step is completed. + * As the 2nd and further arguments, the step function will receive the arguments passed to the previous callback. + * + * The last step will receive a no-op callback, which can be ignored or still called. **Note**, that last step is assumed to + * complete synchronously! If you need to launch some asynchronous process in the last step, you may need to add another empty function step + * to the end of the chain. + * + * 2) If a step is presented with action configuration object, then the callback will be called by the action class automatically, + * there's no need to provide any. Configuration object should contain the "action" property, specifying the action class + * and some other config options (depending from the action class). For brevity, instead of "action" property, configuration + * object may contain the property corresponding to the action name itself, with the action's target. See the following examples and also + * refer to the documentation of the action classes. + * + * If configuration object will contain a "desc" property, a passing assertion with it value will be added to the test, after this step completion. + * + * 3) If step is a sub test instance, created with {@link #getSubTest} method, then step will launch it. + * + * Its better to see how it works on the example. For example, when using using only functions: + + t.chain( + // function receives a callback as 1st argument + function (next) { + // we pass that callback to the "click" method + t.click(buttonEl, next) + }, + function (next) { + t.type(fieldEl, 'Something', next) + }, + function (next) { + t.is(fieldEl.value == 'Something', 'Correct value in the field') + + // call the callback with some arguments + next('foo', 'bar') + }, + // those arguments are now available as arguments of next step + function (next, value1, value2) { + t.is(value1, 'foo', 'The arguments for the callback are translated to the arguments of the step') + t.is(value2, 'bar', 'The arguments for the callback are translated to the arguments of the step') + } + ) + + * + * The same example, using action configuration objects for first 2 steps. For the list of available actions please refer to the classes in the Siesta.Test.Action namespace. + + t.chain( + { + action : 'click', + target : buttonEl, + desc : "Clicked on the button" + }, + // or + { + click : buttonEl, + desc : "Clicked on the button" + }, + + { + action : 'type', + target : fieldEl, + text : 'Something', + desc : "Typed in the field" + }, + // or + { + type : 'Something', + target : fieldEl, + desc : "Typed in the field" + }, + + + function (next) { + t.is(fieldEl.value == 'Something', 'Correct value in the field') + + next('foo', 'bar') + }, + ... + ) + + * Please note, that by default, each step is expected to complete within the {@link Siesta.Harness#defaultTimeout} time. + * You can change this with the `timeout` property of the step configuration object, allowing some steps to last longer. + * Steps with sub-tests are expected to complete within {@link Siesta.Harness#subTestTimeout}. + * + * In a special case, `action` property of the step configuration object can be a function. In this case you can also + * provide a `timeout` property, otherwise this case is identical to using functions: + * + + t.chain( + { + action : function (next) { ... }, + // allow 50s for the function to call "next" before step will be considered timed-out + timeout : 50000 + }, + ... + ) + + * **Tip**: + * + * If step is presented with a `null` or `undefined` value it will be ignored. Additionally, the step may be presented + * with an array of steps - all arrays in the input will be flattened. + * + * These tips allows us to implement conditional steps processing, like this: + * + + var el1IsInDom = t.$('.some-class1')[ 0 ] + var el2IsInDom = t.$('.some-class2')[ 0 ] + + t.chain( + { click : '.some-other-el' }, + + el1IsInDom ? [ + { click : el1IsInDom }, + + el2IsInDom ? [ + { click : el1IsInDom }, + ] : null, + ] : null, + + ... + ) + + * + * @param {Function/Object/Array} step1 The function to execute or action configuration, or the array of such + * @param {Function/Object} step2 The function to execute or action configuration + * @param {Function/Object} stepN The function to execute or action configuration + */ + chain : function () { + // inline any arrays in the arguments into one array + var steps = this.flattenArray(arguments) + + var nonEmpty = [] + Joose.A.each(steps, function (step) { if (step) nonEmpty.push(step) }) + + steps = nonEmpty + + var len = steps.length + + // do nothing + if (!len) return; + + var me = this + var self = arguments.callee + + var queue = new Siesta.Util.Queue({ + deferer : this.originalSetTimeout, + deferClearer : this.originalClearTimeout, + + interval : self.hasOwnProperty('actionDelay') ? self.actionDelay : this.actionDelay, + + observeTest : this + }) + + // hack to allow configuration of `actionDelay`... + delete self.actionDelay + + var sourceLine = me.getSourceLine(); + + var args = [] + + Joose.A.each(steps, function (step, index) { + + var isLast = index == len - 1 + + queue.addAsyncStep({ + processor : function (data) { + var isStepWithOwnAsyncFrame = step.action == 'wait' || step.waitFor || (step instanceof Siesta.Test) + + if (!isStepWithOwnAsyncFrame) { + var timeout = step.timeout || me.defaultTimeout + + // + 100 to allow `waitFor` steps (which will be waiting the `timeout` time) to + // generate their own failures + var async = me.beginAsync(timeout + 100, function () { + me.fail( + 'The step in `t.chain()` call did not complete within required timeframe, chain can not proceed', + { + sourceLine : sourceLine, + annotation : 'Step number: ' + (index + 1) + ' (1-based)' + (sourceLine ? '\nAt line : ' + sourceLine : ''), + ownTextOnly : true + } + ) + + return true + }) + } + + var nextFunc = function () { + if (!isStepWithOwnAsyncFrame) me.endAsync(async) + + args = Array.prototype.slice.call(arguments); + + if (step.desc) { + me.pass(step.desc); + } + data.next() + } + + if (step instanceof Siesta.Test) { + me.launchSubTest(step, nextFunc) + } else if (me.typeOf(step) == 'Function' || me.typeOf(step.action) == 'Function') { + var func = me.typeOf(step) == 'Function' ? step : step.action + + // if the last step is a function - then provide "null" as the "next" callback for it + args.unshift(isLast ? function () {} : nextFunc) + + if (!isLast && !me.analyzeChainStep(func)) me.fail('Step function [' + func.toString() + '] does not use provided "next" function anywhere') + + if (me.transparentEx) + func.apply(me, args) + else { + var e = me.getExceptionCatcher()(function () { + func.apply(me, args) + }) + + if (e !== undefined) { + me.fail("Chain step threw an exception", { annotation : e + '' }) + } + } + + // and finalize the async frame manually, as the "nextFunc" for last step will never be called + isLast && me.endAsync(async) + + } else if (me.typeOf(step) == 'String') { + var action = new Siesta.Test.Action.Eval({ + actionString : step, + next : nextFunc, + test : me + }) + + action.process() + + } else { + if (!step.args) step.args = args + + // Don't pass target to next step if it is a waitFor action, it does not make sense and messes up the arguments + if (!isLast && (steps[ index + 1 ].waitFor || steps[ index + 1 ].action == 'wait')) { + step.passTargetToNext = false; + } + + step.next = nextFunc + step.test = me + + var action = Siesta.Test.ActionRegistry().create(step) + + action.process() + } + } + }) + }) + + queue.run() + } + }, + + + after : { + + initialize : function () { + + this.on('beforetestfinalize', function () { + + if (this.autoCheckGlobals && !this.isFailed() && !this.parent) this.verifyGlobals() + + }, this) + } + } + +}) +//eof Siesta.Test.More +; +Class('Siesta.Test.BDD.Placeholder', { + + has : { + clsConstructor : { required : true }, + t : null, + context : null, + + globals : { + init : [ + 'String', + 'Boolean', + 'Number', + 'Date', + 'RegExp', + 'Function', + 'Array', + 'Object' + ] + } + }, + + + methods : { + + getClassName : function (onlyGlobals) { + var clsConstructor = this.getClassConstructor() + var context = this.context + + var clsName + + Joose.A.each(this.globals, function (property) { + if (clsConstructor == context[ property ]) { clsName = property; return false } + }) + + return onlyGlobals ? clsName : clsName || clsConstructor + '' + }, + + + getClassConstructor : function () { + return this.clsConstructor + }, + + + equalsTo : function (value) { + var clsConstructor = this.getClassConstructor() + + if (!clsConstructor) return true + + if (value instanceof Siesta.Test.BDD.Placeholder) { + var ownClassName = this.getClassName(true) + + if ( + value.getClassName(true) == 'Object' && ( + ownClassName == 'Date' || + ownClassName == 'RegExp' || + ownClassName == 'Function'|| + ownClassName == 'Array' + ) + ) { + return true + } + + return clsConstructor == value.getClassConstructor() + } + + var isEqual = false + + var globalCls = this.getClassName(true) + + if (globalCls) + isEqual = this.t.typeOf(value) == globalCls || (value instanceof this.context[ globalCls ]) + + return isEqual || (value instanceof clsConstructor) + }, + + + toString : function () { + return 'any ' + this.getClassName() + } + } +}) +; +/** +@class Siesta.Test.BDD.Expectation + +This class is a central point for writing assertions in the BDD style. Instances of this class can be generated with the {@link Siesta.Test#expect expect} +method. Then, calling some method on the instance will create a new assertion in the test. + +* **Note**, that to negate any assertion, you can use a special property {@link #not}, that also contains an expectation instance, but with the opposite meaning. + +For example: + + t.expect(1).toBe(1) + t.expect(1).not.toBe(2) + + t.expect('Foo').toContain('oo') + t.expect('Foo').not.toContain('bar') + + +*/ +Class('Siesta.Test.BDD.Expectation', { + + has : { + value : null, + + isNot : false, + + /** + * @property {Siesta.Test.BDD.Expectation} not Another expectation instance with the negated meaning. + */ + not : null, + + t : null + }, + + + methods : { + + initialize : function () { + if (!this.isNot) this.not = new this.constructor({ + isNot : true, + t : this.t, + + value : this.value + }) + }, + + + process : function (passed, config) { + var isNot = this.isNot + config = config || {} + + config.not = config.not || isNot ? 'not ' : '' + config.got = config.hasOwnProperty('got') ? config.got : this.value + + if (config.noGot) delete config.got + + var assertionName = config.assertionName + + if (assertionName && isNot) config.assertionName = assertionName.replace(/^(expect\(.+?\)\.)/, '$1not.') + + passed = isNot ? !passed : passed + + this.t[ passed ? 'pass' : 'fail' ](null, config) + }, + + + /** + * This assertion compares the value provided to the {@link Siesta.Test#expect expect} method with the `expectedValue` argument. + * Comparison is done with `===` operator, so it should be used only with the primitivies - numbers, strings, booleans etc. + * To deeply compare JSON objects and arrays, use {@link #toEqual} method. + * + * This method works correctly with the placeholders generated with {@link Siesta.Test#any any} method + * + * @param {Primitive} expectedValue An expected value + */ + toBe : function (expectedValue) { + this.process(this.t.compareObjects(this.value, expectedValue, true, true), { + descTpl : 'Expect {got} {!not}to be {need}', + assertionName : 'expect(got).toBe(need)', + need : expectedValue, + needDesc : this.isNot ? 'Need not' : 'Need' + }) + }, + + + /** + * This assertion compares the value provided to the {@link Siesta.Test#expect expect} method with the `expectedValue` argument. + * Comparison works for JSON objects and/or arrays, it is performed "deeply". Right now the values should not contain cyclic references. + * + * This method works correctly with the placeholders generated with {@link Siesta.Test#any any} method + * + * @param {Mixed} expectedValue An expected value + */ + toEqual : function (expectedValue) { + this.process(this.t.compareObjects(this.value, expectedValue, true), { + descTpl : 'Expect {got} {!not}to be equal to {need}', + assertionName : 'expect(got).toEqual(need)', + need : expectedValue, + needDesc : this.isNot ? 'Need not' : 'Need' + }) + }, + + + /** + * This assertion passes, when value provided to the {@link Siesta.Test#expect expect} method is `null`. + */ + toBeNull : function () { + this.process(this.t.compareObjects(this.value, null, true, true), { + descTpl : 'Expect {got} {!not}to be null', + assertionName : 'expect(got).toBeNull()', + need : null, + needDesc : this.isNot ? 'Need not' : 'Need' + }) + }, + + + /** + * This assertion passes, when value provided to the {@link Siesta.Test#expect expect} method is `NaN`. + */ + toBeNaN : function () { + var value = this.value + + this.process(this.t.typeOf(value) == 'Number' && value != value, { + descTpl : 'Expect {got} {!not}to be NaN', + assertionName : 'expect(got).toBeNaN()', + need : NaN, + needDesc : this.isNot ? 'Need not' : 'Need' + }) + }, + + + /** + * This assertion passes, when value provided to the {@link Siesta.Test#expect expect} method is not the `undefined` value. + */ + toBeDefined : function () { + this.process(this.value !== undefined, { + descTpl : 'Expect {got} {!not}to be defined', + assertionName : 'expect(got).toBeDefined()' + }) + }, + + + /** + * This assertion passes, when value provided to the {@link Siesta.Test#expect expect} method is the `undefined` value. + */ + toBeUndefined : function (value) { + this.process(this.value === undefined, { + descTpl : 'Expect {got} {!not}to be undefined', + assertionName : 'expect(got).toBeUndefined()' + }) + }, + + + /** + * This assertion passes, when value provided to the {@link Siesta.Test#expect expect} method is "truthy" - evaluates to `true`. + * For example - non empty strings, numbers except the 0, objects, arrays etc. + */ + toBeTruthy : function () { + this.process(this.value, { + descTpl : 'Expect {got} {!not}to be truthy', + assertionName : 'expect(got).toBeTruthy()' + }) + }, + + + /** + * This assertion passes, when value provided to the {@link Siesta.Test#expect expect} method is "falsy" - evaluates to `false`. + * For example - empty strings, number 0, `null`, `undefined`, etc. + */ + toBeFalsy : function () { + this.process(!this.value, { + descTpl : 'Expect {got} {!not}to be falsy', + assertionName : 'expect(got).toBeFalsy()' + }) + }, + + + /** + * This assertion passes, when the string provided to the {@link Siesta.Test#expect expect} method matches the regular expression. + * + * @param {RegExp} regexp The regular expression to match the string against + */ + toMatch : function (regexp) { + if (this.t.typeOf(regexp) != 'RegExp') throw new Error("`expect().toMatch()` matcher expects a regular expression") + + this.process(new RegExp(regexp).test(this.value), { + descTpl : 'Expect {got} {!not}to match {need}', + assertionName : 'expect(got).toMatch(need)', + need : regexp, + needDesc : this.isNot ? 'Need not matching' : 'Need matching' + }) + }, + + + /** + * This assertion passes in 2 cases: + * + * 1) When the value provided to the {@link Siesta.Test#expect expect} method is a string, and it contains a passed substring. + * 2) When the value provided to the {@link Siesta.Test#expect expect} method is an array (or array-like), and it contains a passed element. + * + * @param {String/Mixed} element The element of the array or a sub-string + */ + toContain : function (element) { + var value = this.value + var t = this.t + + var passed = false + + if (t.typeOf(value) == 'String') { + this.process(value.indexOf(element) >= 0, { + descTpl : 'Expect {got} {!not}to contain {need}', + assertionName : 'expect(got).toContain(need)', + need : element, + needDesc : this.isNot ? 'Need string not containing' : 'Need string containing' + }) + } else { + // Normalize to allow NodeList, Arguments etc. + value = Array.prototype.slice.call(value); + + for (var i = 0; i < value.length; i++) + if (t.compareObjects(element, value[ i ], true)) { + passed = true + break + } + + this.process(passed, { + descTpl : 'Expect {got} {!not}to contain {need}', + assertionName : 'expect(got).toContain(need)', + need : element, + needDesc : this.isNot ? 'Need array not containing' : 'Need array containing' + }) + + } + }, + + + /** + * This assertion passes, when the number provided to the {@link Siesta.Test#expect expect} method is less than the + * expected number. + * + * @param {Number} expectedValue The number to compare with + */ + toBeLessThan : function (expectedValue) { + this.process(this.value < expectedValue, { + descTpl : 'Expect {got} {!not}to be less than {need}', + assertionName : 'expect(got).toBeLessThan(need)', + need : expectedValue, + needDesc : this.isNot ? 'Need value bigger or equal than' : 'Need value less than' + }) + }, + + + /** + * This assertion passes, when the number provided to the {@link Siesta.Test#expect expect} method is greater than the + * expected number. + * + * @param {Number} expectedValue The number to compare with + */ + toBeGreaterThan : function (expectedValue) { + this.process(this.value > expectedValue, { + descTpl : 'Expect {got} {!not}to be greater than {need}', + assertionName : 'expect(got).toBeGreaterThan(need)', + need : expectedValue, + needDesc : this.isNot ? 'Need value less or equal than' : 'Need value greater than' + }) + }, + + + /** + * This assertion passes, when the number provided to the {@link Siesta.Test#expect expect} method is approximately equal + * the given number. The proximity can be defined as the `precision` argument + * + * @param {Number} expectedValue The number to compare with + * @param {Number} [precision=2] The number of digits after dot (comma) that should be same in both numbers. + */ + toBeCloseTo : function (expectedValue, precision) { + precision = precision != null ? precision : 2 + + // not sure why we divide the precision by 2, but jasmine does that for some reason + var threshold = Math.pow(10, -precision) / 2 + var delta = Math.abs(this.value - expectedValue) + + this.process(delta < threshold, { + descTpl : 'Expect {got} {!not}to be close to {need}', + assertionName : 'expect(got).toBeCloseTo(need)', + need : expectedValue, + needDesc : this.isNot ? 'Need value not close to' : 'Need value close to', + annotation : delta ? "Threshold is " + threshold : 'Exact match' + }) + }, + + + /** + * This assertion passes when the function, provided to the {@link Siesta.Test#expect expect} method, throws any exception + * during its execution. + */ + toThrow : function () { + var func = this.value + var t = this.t + + if (t.typeOf(func) != 'Function') throw new Error("`expect().toMatch()` matcher expects a function") + + var e = t.getExceptionCatcher()(func) + + if (e instanceof t.getTestErrorClass()) + //IE uses non-standard 'description' property for error msg + e = e.message || e.description + + this.process(e !== undefined, { + descTpl : 'Expect function {!not}to throw exception', + assertionName : 'expect(func).toThrow()', + annotation : e ? "Thrown exception: " + Siesta.Util.Serializer.stringify(e) : 'No exception thrown', + + noGot : true + }) + }, + + + // TODO + toHaveBeenCalled : function () { + }, + + + // TODO + toHaveBeenCalledWith : function () { + } + } +}) +; +/** +@class Siesta.Test.BDD + +A mixin providing a BDD style layer for most of the assertion methods. +It is consumed by {@link Siesta.Test}, so all of its methods are available in all tests. + +*/ +Role('Siesta.Test.BDD', { + + requires : [ + 'getSubTest', 'chain' + ], + + has : { + specType : null, // `describe` or `it` + + sequentialSubTests : Joose.I.Array, + + // flag, whether the "run" function of the test (containing actual test code) have been already run + codeProcessed : false, + + launchTimeout : null, + + // Siesta.Test.BDD.Expectation should already present on the page + expectationClass : Siesta.Test.BDD.Expectation + }, + + + methods : { + + checkSpecFunction : function (func, type, name) { + if (!func) throw new Error("Code body is not provided for " + (type == 'describe' ? 'suite' : 'spec') + ' [' + name + ']') + if (!func.length) throw new Error("Code body of " + (type == 'describe' ? 'suite' : 'spec') + ' [' + name + '] does not declare a test instance as 1st argument') + }, + + + /** + * This is an "exclusive" version of the regular {@link #describe} suite. When such suites presents in some test file, + * the other regular suites at the same level will not be executed, only "exclusive" ones. + * + * @param {String} name The name or description of the suite + * @param {Function} code The code function for this suite. It will receive a test instance as the first argument which should be used for all assertion methods. + * @param {Number} [timeout] A maximum duration for this suite. If not provided {@link Siesta.Harness#subTestTimeout} value is used. + */ + ddescribe : function (name, code, timeout) { + this.describe(name, code, timeout, true) + }, + + + /** + * This is a no-op method, allowing you to quickly ignore some suites. + */ + xdescribe : function () { + }, + + + /** + * This method starts a sub test with *suite* (in BDD terms). Such suite consists from one or more *specs* (see method {@link #it}} or other suites. + * The number of nesting levels is not limited. All suites of the same nesting level are executed sequentially. + * + * For example: + * + t.describe('A product', function (t) { + + t.it('should have feature X', function (t) { + ... + }) + + t.describe('feature X', function (t) { + t.it('should be cool', function (t) { + ... + }) + }) + }) + * + * See also {@link #xdescribe}, {@link #ddescribe} + * + * @param {String} name The name or description of the suite + * @param {Function} code The code function for this suite. It will receive a test instance as the first argument which should be used for all assertion methods. + * @param {Number} [timeout] A maximum duration for this suite. If not provided {@link Siesta.Harness#subTestTimeout} value is used. + */ + describe : function (name, code, timeout, isExclusive) { + this.checkSpecFunction(code, 'describe', name) + + var subTest = this.getSubTest({ + name : name, + run : code, + + isExclusive : isExclusive, + + specType : 'describe', + timeout : timeout + }) + + if (this.codeProcessed) this.scheduleSpecsLaunch() + + this.sequentialSubTests.push(subTest) + }, + + + /** + * This is an "exclusive" version of the regular {@link #it} spec. When such specs presents in some suite, + * the other regular specs at the same level will not be executed, only "exclusive" ones. Note, that even "regular" suites (`t.describe`) sections + * will be ignored, if they are on the same level with the exclusive `iit` section. + * + * @param {String} name The name or description of the spec + * @param {Function} code The code function for this spec. It will receive a test instance as the first argument which should be used for all assertion methods. + * @param {Number} [timeout] A maximum duration for this spec. If not provided {@link Siesta.Harness#subTestTimeout} value is used. + */ + iit : function (name, code, timeout) { + this.it(name, code, timeout, true) + }, + + + /** + * This is a no-op method, allowing you to quickly ignore some specs. + */ + xit : function () { + }, + + + /** + * This method starts a sub test with *spec* (in BDD terms). Such spec consists from one or more assertions (or *expectations*, *matchers*, etc) or other nested specs + * and/or suites. See the {@link #expect} method. The number of nesting levels is not limited. All specs of the same nesting level are executed sequentially. + * + * For example: + * + t.describe('A product', function (t) { + + t.it('should have feature X', function (t) { + ... + }) + + t.it('should have feature Y', function (t) { + ... + }) + }) + * + * See also {@link #xit}, {@link #iit} + * + * @param {String} name The name or description of the spec + * @param {Function} code The code function for this spec. It will receive a test instance as the first argument which should be used for all assertion methods. + * @param {Number} [timeout] A maximum duration for this spec. If not provided {@link Siesta.Harness#subTestTimeout} value is used. + */ + it : function (name, code, timeout, isExclusive) { + this.checkSpecFunction(code, 'it', name) + + var subTest = this.getSubTest({ + name : name, + run : code, + + isExclusive : isExclusive, + + specType : 'it', + timeout : timeout + }) + + if (this.codeProcessed) this.scheduleSpecsLaunch() + + this.sequentialSubTests.push(subTest) + }, + + + /** + * This method returns an "expectation" instance, which can be used to check various assertions about the passed value. + * + * **Note**, that every expectation has a special property `not`, that contains another expectation, but with the negated meaning. + * + * For example: + * + + t.expect(1).toBe(1) + t.expect(1).not.toBe(2) + + t.expect('Foo').toContain('oo') + t.expect('Foo').not.toContain('bar') + + + * Please refer to the documentation of the {@link Siesta.Test.BDD.Expectation} class for the list of available methods. + * + * @param {Mixed} value Any value, that will be assert about + * @return {Siesta.Test.BDD.Expectation} Expectation instance + */ + expect : function (value) { + return new this.expectationClass({ + t : this, + value : value + }) + }, + + + /** + * This method returns a *placeholder*, denoting any instance of the provided class constructor. Such placeholder can be used in various + * comparison assertions, like {@link #is}, {@link #isDeeply}, {@link Siesta.Test.BDD.Expectation#toBe expect().toBe()}, + * {@link Siesta.Test.BDD.Expectation#toBe expect().toEqual()} and so on. + * + * For example: + + t.is(1, t.any(Number)) + + t.expect(1).toBe(t.any(Number)) + + t.isDeeply({ name : 'John', age : 45 }, { name : 'John', age : t.any(Number)) + + t.expect({ name : 'John', age : 45 }).toEqual({ name : 'John', age : t.any(Number)) + + t.is(NaN, t.any(), 'When class constructor is not provided `t.any()` should match anything') + + * + * @param {Function} clsConstructor A class constructor instances of which are denoted with this placeholder. As a special case if this argument + * is not provided, a placeholder will match any value. + * + * @return {Object} A placeholder object + */ + any : function (clsConstructor) { + return new Siesta.Test.BDD.Placeholder({ + clsConstructor : clsConstructor, + t : this, + context : this.global + }) + }, + + + scheduleSpecsLaunch : function () { + if (this.launchTimeout) return + + var async = this.beginAsync() + var originalSetTimeout = this.originalSetTimeout + var me = this + + this.launchTimeout = originalSetTimeout(function () { + me.endAsync(async) + me.launchTimeout = null + + me.launchSpecs() + }, 0) + }, + + + launchSpecs : function () { + var me = this + var sequentialSubTests = this.sequentialSubTests + + this.sequentialSubTests = [] + + // hackish way to pass a config to `t.chain` + this.chain.actionDelay = 0 + + var exclusiveSubTests = [] + + Joose.A.each(sequentialSubTests, function (subTest) { + if (subTest.isExclusive) exclusiveSubTests.push(subTest) + }) + + this.chain(exclusiveSubTests.length ? exclusiveSubTests : sequentialSubTests) + } + }, + + + override : { + afterLaunch : function () { + this.codeProcessed = true + + this.launchSpecs() + + this.SUPERARG(arguments) + } + } + +}) +//eof Siesta.Test.BDD +; +Role('Siesta.Test.Sub', { + + has : { + isExclusive : false, + parent : { required : true } + }, + + + methods : { + + getExceptionCatcher : function () { + return this.parent.getExceptionCatcher() + }, + + + getTestErrorClass : function () { + return this.parent.getTestErrorClass() + }, + + + getStartTestAnchor : function () { + return this.parent.getStartTestAnchor() + }, + + + expectGlobals : function () { + return this.parent.expectGlobals.apply(this.parent, arguments) + } + } + +}) +//eof Siesta.Test +; +/** +@class Siesta.Test +@mixin Siesta.Test.More +@mixin Siesta.Test.Date +@mixin Siesta.Test.Function +@mixin Siesta.Test.BDD + +`Siesta.Test` is a base testing class in Siesta hierarchy. Its not supposed to be created manually, instead, the harness will create it for you. + +This file is a reference only, for a getting start guide and manual, please refer to Getting Started Guide. + +Please note: Each test will be run in **its own**, completely **isolated** and **clean** global scope. **There is no need to cleanup anything**. + +SYNOPSIS +======== + + StartTest(function(t) { + t.diag("Sanity") + + t.ok($, 'jQuery is here') + + t.ok(Your.Project, 'My project is here') + t.ok(Your.Project.Util, '.. indeed') + + setTimeout(function () { + + t.ok(true, "True is ok") + + }, 500) + }) + + +*/ + +Class('Siesta.Test', { + + does : [ + Siesta.Util.Role.CanFormatStrings, + Siesta.Test.More, + Siesta.Test.Date, + Siesta.Test.Function, + Siesta.Test.BDD, + JooseX.Observable + ], + + + has : { + name : null, + + url : { required : true }, + urlExtractRegex : { + is : 'rwc', + lazy : function () { + return new RegExp(this.url.replace(/([.*+?^${}()|[\]\/\\])/g, "\\$1") + ':(\\d+)') + } + }, + + assertPlanned : null, + assertCount : 0, + + // whether this test contains only "todo" assertions + isTodo : false, + + results : { + lazy : function () { + return new Siesta.Result.SubTest({ description : this.name || 'Root', test : this }) + } + }, + + run : { required : true }, + startTestAnchor : null, + exceptionCatcher : null, + testErrorClass : null, + + generation : function () { + return Math.random() + }, + + parent : null, + harness : { required : true }, + + /** + * @cfg {Number} isReadyTimeout + * + * Timeout in milliseconds to wait for test start. Default value is 10000. See also {@link #isReady} + */ + isReadyTimeout : 10000, + + // indicates that a test has thrown an exception (not related to failed assertions) + failed : false, + failedException : null, // stringified exception + failedExceptionType : null, // type of exception + + // start and end date are stored as numbers (new Date() - 0) + // this is to allow sharing date instances between different contexts + startDate : null, + endDate : null, + lastActivityDate : null, + contentManager : null, + + // the scope provider for the context of the test page + scopeProvider : null, + // the context of the test page + global : { required : true }, + + // the scope provider for the context of the test script + // usually the same as the `scopeProvider`, but may be different in case of using `separateContext` option + scriptScopeProvider : null, + + transparentEx : false, + + needDone : false, + isDone : false, + + defaultTimeout : 15000, + // a default timeout for sub tests + subTestTimeout : null, + // a timeout of this particular test + timeout : null, + + timeoutsCount : 1, + timeoutIds : Joose.I.Object, + idsToIndex : Joose.I.Object, + waitTitles : Joose.I.Object, + + + // indicates that test function has completed the execution (test may be still running due to async) + processed : false, + + callback : null, + + // Nbr of exceptions detected while running the test + nbrExceptions : 0, + testEndReported : false, + + // only used for testing itself, otherwise should be always `true` + needToCleanup : true, + + overrideSetTimeout : false, + + originalSetTimeout : { required : true }, + originalClearTimeout : { required : true }, + + sourceLineForAllAssertions : false, + + $passCount : null, + $failCount : null + }, + + + methods : { + + initialize : function () { + // suppress bubblings of some events (JooseX.Observable does not provide better mechanism for that, yet) + this.on('teststart', function (event) { + if (this.parent) event.stopPropagation() + }) + + this.on('testfinalize', function (event) { + if (this.parent) event.stopPropagation() + }) + + this.on('beforetestfinalize', function (event) { + if (this.parent) event.stopPropagation() + }) + + this.on('beforetestfinalizeearly', function (event) { + if (this.parent) event.stopPropagation() + }) + + this.subTestTimeout = 2 * this.defaultTimeout + }, + + /** + * This method allows you to delay the start of the test, for example for performing some asynchronous setup code (like login into application). + * + * It is supposed to be overriden in the subclass of Siesta.Test and should return object with properties "ready" and "reason" + * ("reason" is only meaningful for "ready : false"). Test instance will poll this method and will only launch + * the test, when this method will return "ready : true". If waiting for this will take longer than {@link #isReadyTimeout} then, test + * will be launched anyway, but a failing assertion will be added to it. + * + * **Important** This method should always check the value returned by `this.SUPER` call. + * + * Typical example of using this method will be: + * + + Class('My.Test.Class', { + + isa : Siesta.Test.Browser, + + has : { + isCustomSetupDone : false + }, + + override : { + + isReady : function () { + var result = this.SUPERARG(arguments); + + if (!result.ready) return result; + + if (!this.isCustomSetupDone) return { + ready : false, + reason : "Waiting for `isCustomSetupDone` took too long - something wrong?" + } + + return { + ready : true + } + }, + + + start : function () { + var me = this; + + Ext.Ajax.request({ + url : 'do_login.php', + + params : { ... }, + + success : function () { + me.isCustomSetupDone = true + } + }) + + this.SUPERARG(arguments) + } + }, + + .... + }) + + * + * @return {Object} Object with properties `{ ready : true/false, reason : 'description' }` + */ + isReady: function() { + // this should allow us to wait until the presense of "run" function + // it will become available after call to StartTest method + // which some users may call asynchronously, after some delay + // see https://www.assembla.com/spaces/bryntum/tickets/379 + // in this case test can not be configured using object as 1st argument for StartTest + this.run = this.run || this.getStartTestAnchor().args && this.getStartTestAnchor().args[ 0 ] + + return { + ready : this.typeOf(this.run) == 'Function', + reason : 'No code provided to test' + } + }, + + + isFromTheSameGeneration : function (test2) { + return this.generation == test2.generation + }, + + + toString : function() { + return this.url + }, + + + // deprecated + plan : function (value) { + if (this.assertPlanned != null) throw new Error("Test plan can't be changed") + + this.assertPlanned = value + }, + + + addResult : function (result) { + var isAssertion = result instanceof Siesta.Result.Assertion + + if (isAssertion) result.isTodo = this.isTodo + + // only allow to add diagnostic results and todo results after the end of test + // and only if "needDone" is enabled + if (isAssertion && (this.isDone || this.isFinished()) && !result.isTodo) { + if (!this.testEndReported) { + this.testEndReported = true + + this.fail("Adding assertions after the test has finished.") + } + } + + if (isAssertion && !result.index) { + result.index = ++this.assertCount + } + + this.getResults().push(result) + + // clear the cache + this.$passCount = this.$failCount = null + + /** + * This event is fired when an individual test case receives a new result (assertion or diagnostic message). + * + * This event bubbles up to the {@link Siesta.Harness harness}, so you can observe it on the harness as well. + * + * @event testupdate + * @member Siesta.Test + * @param {JooseX.Observable.Event} event The event instance + * @param {Siesta.Test} test The test instance that just has started + * @param {Siesta.Result} result The new result. Instance of Siesta.Result.Assertion or Siesta.Result.Diagnostic classes + */ + this.fireEvent('testupdate', this, result, this.getResults()) + + this.lastActivityDate = new Date(); + }, + + + /** + * This method output the diagnostic message. + * @param {String} desc The text of diagnostic message + */ + diag : function (desc) { + this.addResult(new Siesta.Result.Diagnostic({ + description : desc + })) + }, + + + /** + * This method add the passed assertion to this test. + * + * @param {String} desc The description of the assertion + * @param {String/Object} annotation The string with additional description how exactly this assertion passes. Will be shown with monospace font. + * Can be also an object with the following properties: + * @param {String} annotation.annotation The actual annotation text + * @param {String} annotation.descTpl The template for the default description text. Will be used if user did not provide any description for + * assertion. Template can contain variables in braces. The values for variables are taken as properties of `annotation` parameters with the same name: + * + + this.pass(desc, { + descTpl : '{value1} sounds like {value2}', + value1 : '1', + value2 : 'one + }) + + * + */ + pass : function (desc, annotation, result) { + if (annotation && this.typeOf(annotation) != 'String') { + // create a default assertion description + if (!desc && annotation.descTpl) desc = this.formatString(annotation.descTpl, annotation) + + // actual annotation + annotation = annotation.annotation + } + + if (result) { + result.passed = true + result.description = desc || '' + result.annotation = annotation + } + + this.addResult(result || new Siesta.Result.Assertion({ + passed : true, + + annotation : annotation, + description : desc || '', + sourceLine : (result && result.sourceLine) || (annotation && annotation.sourceLine) || this.sourceLineForAllAssertions && this.getSourceLine() || null + })) + }, + + + /** + * This method returns a result of `Object.prototype.toString` applied to the passed argument. The `[object` and trailing `]` are trimmed. + * + * @param {Mixed} object + * @return {String} The name of the "type" for this object. + */ + typeOf : function (object) { + return Object.prototype.toString.call(object).replace(/^\[object /, '').replace(/\]$/, '') + }, + + /** + * This method add the failed assertion to this test. + * + * @param {String} desc The description of the assertion + * @param {String/Object} annotation The additional description how exactly this assertion fails. Will be shown with monospace font. + * + * Can be either string or an object with the following properties. In the latter case a string will be constructed from the properties of the object. + * + * - `assertionName` - the name of assertion, will be shown in the 1st line, along with originating source line (in FF and Chrome only) + * - `got` - an arbitrary JavaScript object, when provided will be shown on the next line + * - `need` - an arbitrary JavaScript object, when provided will be shown on the next line + * - `gotDesc` - a prompt for "got", default value is "Got", but can be for example: "We have" + * - `needDesc` - a prompt for "need", default value is "Need", but can be for example: "We need" + * - `annotation` - A text to append on the last line, can contain some additional explanations + * + * The "got" and "need" values will be stringified to the "not quite JSON" notation. Notably the points of circular references will be + * marked with `[Circular]` marks and the values at 4th (and following) level of depth will be marked with triple points: `[ [ [ ... ] ] ]` + */ + fail : function (desc, annotation, result) { + var sourceLine = (result && result.sourceLine) || (annotation && annotation.sourceLine) || this.getSourceLine() + + if (annotation && this.typeOf(annotation) != 'String') { + if (!desc && annotation.descTpl) desc = this.formatString(annotation.descTpl, annotation) + + var strings = [] + + var params = annotation + var annotation = params.annotation + var assertionName = params.assertionName + var hasGot = params.hasOwnProperty('got') + var hasNeed = params.hasOwnProperty('need') + var gotDesc = params.gotDesc || 'Got' + var needDesc = params.needDesc || 'Need' + + if (!params.ownTextOnly && (assertionName || sourceLine)) strings.push( + 'Failed assertion ' + (assertionName ? '`' + assertionName + '` ' : '') + this.formatSourceLine(sourceLine) + ) + + if (hasGot && hasNeed) { + var max = Math.max(gotDesc.length, needDesc.length) + + gotDesc = this.appendSpaces(gotDesc, max - gotDesc.length + 1) + needDesc = this.appendSpaces(needDesc, max - needDesc.length + 1) + } + + if (hasGot) strings.push(gotDesc + ': ' + Siesta.Util.Serializer.stringify(params.got)) + if (hasNeed) strings.push(needDesc + ': ' + Siesta.Util.Serializer.stringify(params.need)) + + if (annotation) strings.push(annotation) + + annotation = strings.join('\n') + } + + if (result) { + // Failing a pending waitFor operation + result.name = assertionName; + result.passed = false; + result.annotation = annotation; + result.description = desc; + } + + this.addResult(result || new Siesta.Result.Assertion({ + name : assertionName, + passed : false, + sourceLine : sourceLine, + + annotation : annotation, + description : desc + })) + + if (this.harness.activateDebuggerOnFail) { + eval("debugger"); + } + + if (this.harness.breakOnFail) { + this.finalize(true); + throw 'Assertion failed, test execution aborted'; + } + }, + + + getSource : function () { + return this.contentManager.getContentOf(this.url) + }, + + + getSourceLine : function () { + try { + throw new Error() + } catch (e) { + if (e.stack) { + var match = e.stack.match(this.urlExtractRegex()) + + if (match) return match[ 1 ] + } + + return null + } + }, + + + getStartTestAnchor : function () { + return this.startTestAnchor + }, + + + getExceptionCatcher : function () { + return this.exceptionCatcher + }, + + + getTestErrorClass : function () { + return this.testErrorClass + }, + + + processCallbackFromTest : function (callback, args, scope) { + var me = this + + if (!callback) return true; + + if (this.transparentEx) { + callback.apply(scope || this.global, args || []) + } else { + var e = this.getExceptionCatcher()(function(){ + callback.apply(scope || me.global, args || []) + }) + + if (e) { + this.failWithException(e) + + // flow should be interrupted - exception detected + return false + } + } + + // flow can be continued + return true + }, + + + getStackTrace : function (e) { + if (Object(e) !== e) return null + if (!e.stack) return null + + var text = e.stack + ''; + var isFirefox = /^@/.test(text) + var lines = text.split('\n') + + var result = [] + var match + + for (var i = 0; i < lines.length; i++) { + if (!lines[ i ]) continue + + if (!i) { + if (isFirefox) + result.push(e + '') + else { + result.push(lines[ i ]) + continue; + } + } + + if (isFirefox) { + match = /@(.*?):(\d+)/.exec(lines[ i ]); + + // the format of stack trace in Firefox has changed, 080_exception_parsing should fail + if (!match) return null + + result.push(' at line ' + match[ 2 ] + ' of ' + match[ 1 ]) + } else { + match = /\s*at\s(.*?):(\d+):(\d+)/.exec(lines[ i ]); + + // the format of stack trace in Chrome has changed, 080_exception_parsing should fail + if (!match) return null + + result.push(' at line ' + match[ 2 ] + ', character ' + match[ 3 ] + ', of ' + match[ 1 ]) + } + } + + if (!result.length) return null + + return result + }, + + + formatSourceLine : function (sourceLine) { + return sourceLine ? 'at line ' + sourceLine + ' of ' + this.url : '' + }, + + + appendSpaces : function (str, num) { + var spaces = '' + + while (num--) spaces += ' ' + + return str + spaces + }, + + + eachAssertion : function (func, scope) { + scope = scope || this + + this.getResults().each(function (result) { + if (result instanceof Siesta.Result.Assertion) func.call(scope, result) + }) + }, + + + eachSubTest : function (func, scope) { + scope = scope || this + + this.getResults().each(function (result) { + if (result instanceof Siesta.Result.SubTest) func.call(scope, result.test) + }) + }, + + + eachChildTest : function (func, scope) { + scope = scope || this + + this.getResults().eachChild(function (result) { + if (result instanceof Siesta.Result.SubTest) func.call(scope, result.test) + }) + }, + + + countKeys : function (object) { + var counter = 0 + + Joose.O.eachOwn(object, function () { + counter++ + }) + + return counter + }, + + + /** + * This method performs a deep comparison of the passed JSON objects. Objects must not contain cyclic references. + * You can use this method in your own assertions. + * + * @param {Mixed} obj1 The 1st object to compare + * @param {Mixed} obj2 The 2nd object to compare + * @param {Boolean} strict When passed the `true` value, the comparison of the primitive values will be performed with the + * `===` operator (so [ 1 ] and [ "1" ] object will be different). Additionally, when this flag is set to `true`, then + * when comparing Function, RegExp and Date instances, additional check that objects contains the same set of own properties ("hasOwnProperty") + * will be performed. + * @param {Boolean} onlyPrimitives When set to `true`, the function will not recurse into composite objects (like [] or {}) and will just report that + * objects are different. Use this mode when you are only interesetd in comparison of primitive values (numbers, strings, etc). + * @param {Boolean} asObjects When set to `true`, the function will compare various special Object instances, like Functions, RegExp etc, + * by comparison of there properties only and not taking the anything else into account. + * @return {Boolean} `true` if the passed objects are equal + */ + compareObjects : function (obj1, obj2, strict, onlyPrimitives, asObjects) { + var obj1IsPlaceholder = obj1 instanceof Siesta.Test.BDD.Placeholder + var obj2IsPlaceholder = obj2 instanceof Siesta.Test.BDD.Placeholder + + if (strict) { + if (obj1 === obj2) return true + } else + if (obj1 == obj2) return true + + if (obj1IsPlaceholder && obj2IsPlaceholder) + return obj1.equalsTo(obj2) + else if (obj2IsPlaceholder) + return obj2.equalsTo(obj1) + else if (obj1IsPlaceholder) + return obj1.equalsTo(obj2) + + if (onlyPrimitives) return false + + var type1 = this.typeOf(obj1) + var type2 = this.typeOf(obj2) + + if (type1 != type2) return false + + var me = this + + if (type1 == 'Object' || asObjects) + if (this.countKeys(obj1) != this.countKeys(obj2)) + return false + else { + var res = Joose.O.eachOwn(obj1, function (value, name) { + + if (!me.compareObjects(value, obj2[ name ], strict)) return false + }) + + return res === false ? false : true + } + + if (type1 == 'Array') + if (obj1.length != obj2.length) + return false + else { + for (var i = 0; i < obj1.length; i++) + if (!this.compareObjects(obj1[ i ], obj2[ i ], strict)) return false + + return true + } + + if (type1 == 'Function') + return obj1.toString() == obj2.toString() && (!strict || this.compareObjects(obj1, obj2, strict, false, true)) + + if (type1 == 'RegExp') + return obj1.source == obj2.source && obj1.global == obj2.global && obj1.ignoreCase == obj2.ignoreCase + && obj1.multiline == obj2.multiline && (!strict || this.compareObjects(obj1, obj2, strict, false, true)) + + if (type1 == 'Date') return !Boolean(obj1 - obj2) && (!strict || this.compareObjects(obj1, obj2, strict, false, true)) + + return false + }, + + + /** + * This assertion passes when the supplied `value` evalutes to `true` and fails otherwise. + * + * @param {Mixed} value The value, indicating wheter assertions passes or fails + * @param {String} desc The description of the assertion + */ + ok : function (value, desc) { + if (value) + this.pass(desc, { + descTpl : '`{value}` is a "truthy" value', + value : value + }) + else + this.fail(desc, { + assertionName : 'ok', + got : value, + annotation : 'Need "truthy" value' + }) + }, + + + notok : function () { + this.notOk.apply(this, arguments) + }, + + /** + * This assertion passes when the supplied `value` evalutes to `false` and fails otherwise. + * + * It has a synonym - `notok`. + * + * @param {Mixed} value The value, indicating wheter assertions passes or fails + * @param {String} desc The description of the assertion + */ + notOk : function (value, desc) { + if (!value) + this.pass(desc, { + descTpl : '`{value}` is not a "truthy" value', + value : value + }) + else + this.fail(desc, { + assertionName : 'notOk', + got : value, + annotation : 'Need "falsy" value' + }) + }, + + + /** + * This assertion passes when the comparison of 1st and 2nd arguments with `==` operator returns true and fails otherwise. + * + * As a special case, one or both arguments can be *placeholders*, generated with method {@link #any}. + * + * @param {Mixed} got The value "we have" - will be shown as "Got:" in case of failure + * @param {Mixed} expected The value "we expect" - will be shown as "Need:" in case of failure + * @param {String} desc The description of the assertion + */ + is : function (got, expected, desc) { + if (expected && got instanceof this.global.Date) { + this.isDateEqual(got, expected, desc); + } else if (this.compareObjects(got, expected, false, true)) + this.pass(desc, { + descTpl : '`{got}` is equal to `{expected}`', + got : got, + expected : expected + }) + else + this.fail(desc, { + assertionName : 'is', + got : got, + need : expected + }) + }, + + + + isnot : function () { + this.isNot.apply(this, arguments) + }, + + isnt : function () { + this.isNot.apply(this, arguments) + }, + + + /** + * This assertion passes when the comparison of 1st and 2nd arguments with `!=` operator returns true and fails otherwise. + * It has synonyms - `isnot` and `isnt`. + * + * As a special case, one or both arguments can be instance of {@link Siesta.Test.BDD.Placeholder} class, generated with method {@link #any}. + * + * @param {Mixed} got The value "we have" - will be shown as "Got:" in case of failure + * @param {Mixed} expected The value "we expect" - will be shown as "Need:" in case of failure + * @param {String} desc The description of the assertion + */ + isNot : function (got, expected, desc) { + if (!this.compareObjects(got, expected, false, true)) + this.pass(desc, { + descTpl : '`{got}` is not equal to `{expected}`', + got : got, + expected : expected + }) + else + this.fail(desc, { + assertionName : 'isnt', + got : got, + need : expected, + needDesc : 'Need, not' + }) + }, + + + /** + * This assertion passes when the comparison of 1st and 2nd arguments with `===` operator returns true and fails otherwise. + * + * As a special case, one or both arguments can be instance of {@link Siesta.Test.BDD.Placeholder} class, generated with method {@link #any}. + * + * @param {Mixed} got The value "we have" - will be shown as "Got:" in case of failure + * @param {Mixed} expected The value "we expect" - will be shown as "Need:" in case of failure + * @param {String} desc The description of the assertion + */ + isStrict : function (got, expected, desc) { + if (this.compareObjects(got, expected, true, true)) + this.pass(desc, { + descTpl : '`{got}` is strictly equal to `{expected}`', + got : got, + expected : expected + }) + else + this.fail(desc, { + assertionName : 'isStrict', + got : got, + need : expected, + needDesc : 'Need strictly' + }) + }, + + + isntStrict : function () { + this.isNotStrict.apply(this, arguments) + }, + + /** + * This assertion passes when the comparison of 1st and 2nd arguments with `!==` operator returns true and fails otherwise. + * It has synonyms - `isntStrict`. + * + * As a special case, one or both arguments can be instance of {@link Siesta.Test.BDD.Placeholder} class, generated with method {@link #any}. + * + * @param {Mixed} got The value "we have" - will be shown as "Got:" in case of failure + * @param {Mixed} expected The value "we expect" - will be shown as "Need:" in case of failure + * @param {String} desc The description of the assertion + */ + isNotStrict : function (got, expected, desc) { + if (!this.compareObjects(got, expected, true, true)) + this.pass(desc, { + descTpl : '`{got}` is not strictly equal to `{expected}`', + got : got, + expected : expected + }) + else + this.fail(desc, { + assertionName : 'isntStrict', + got : got, + need : expected, + needDesc : 'Need, strictly not' + }) + }, + + + /** + * This method starts the "asynchronous frame". The test will wait for all asynchronous frames to complete before it will finalize. + * The frame can be finished with the {@link #endWait} call. Unlike the {@link #beginAsync}, this method requires you to provide + * the unique id for the asynchronous frame. + * + * For example: + * + * t.wait("require") + * + * Ext.require('Some.Class', function () { + * + * t.ok(Some.Class, 'Some class was loaded') + * + * t.endWait("require") + * }) + * + * + * @param {String} title The unique id for the asynchronous frame. + * @param {String} howLong The maximum time (in ms) to wait until force the finalization of this async frame. Optional. Default time is 15000 ms. + */ + wait : function (title, howLong) { + if (this.waitTitles.hasOwnProperty(title)) throw new Error("Already doing a `wait` with title [" + title + "]") + + return this.waitTitles[ title ] = this.beginAsync(howLong) + }, + + + /** + * This method finalize the "asynchronous frame" started with {@link #wait}. + * + * @param {String} title The id of frame to finalize, which was previously passed to {@link #wait} method + */ + endWait : function (title) { + if (!this.waitTitles.hasOwnProperty(title)) throw new Error("There were no call to `wait` with title [" + title + "]") + + this.endAsync(this.waitTitles[ title ]) + + delete this.waitTitles[ title ] + }, + + + + /** + * This method starts the "asynchronous frame". The test will wait for all asynchronous frames to complete before it will finalize. + * The frame should be finished with the {@link #endAsync} call within the provided `time`, otherwise a failure will be reported. + * + * For example: + * + * var async = t.beginAsync() + * + * Ext.require('Some.Class', function () { + * + * t.ok(Some.Class, 'Some class was loaded') + * + * t.endAsync(async) + * }) + * + * + * @param {Number} time The maximum time (in ms) to wait until force the finalization of this async frame. Optional. Default time is 15000 ms. + * @param {Function} errback Optional. The function to call in case the call to {@link #endAsync} was not detected withing `time`. If function + * will return any "truthy" value, the failure will not be reported (you can report own failure with this errback). + * + * @return {Object} The frame object, which can be used in {@link #endAsync} call + */ + beginAsync : function (time, errback) { + time = time || this.defaultTimeout + + var me = this + var originalSetTimeout = this.originalSetTimeout + + var index = this.timeoutsCount++ + + // in NodeJS `setTimeout` returns an object and not a simple ID, so we try hard to store that object under unique index + // also using `setTimeout` from the scope of test - as timeouts in different scopes in browsers are mis-synchronized + // can't just use `this.originalSetTimeout` because of scoping issues + var timeoutId = originalSetTimeout(function () { + + if (me.hasAsyncFrame(index)) { + if (!errback || !errback.call(me, me)) me.fail('No matching `endAsync` call within ' + time + 'ms') + + me.endAsync(index) + } + }, time) + + this.timeoutIds[ index ] = timeoutId + + return index + }, + + + hasAsyncFrame : function (index) { + return this.timeoutIds.hasOwnProperty(index) + }, + + + /** + * This method finalize the "asynchronous frame" started with {@link #beginAsync}. + * + * @param {Object} frame The frame to finalize (returned by {@link #beginAsync} method + */ + endAsync : function (index) { + var originalSetTimeout = this.originalSetTimeout + var originalClearTimeout = this.originalClearTimeout || this.global.clearTimeout + var counter = 0 + + if (index == null) Joose.O.each(this.timeoutIds, function (timeoutId, indx) { + index = indx + if (counter++) throw new Error("Calls to endAsync without argument should only be performed if you have single beginAsync statement") + }) + + var timeoutId = this.timeoutIds[ index ] + + // need to call in this way for IE < 9 + originalClearTimeout(timeoutId) + delete this.timeoutIds[ index ] + + var me = this + + if (this.processed && !this.isFinished()) + // to allow potential call to `done` after `endAsync` + originalSetTimeout(function () { + me.finalize() + }, 1) + }, + + + clearTimeouts : function () { + var originalClearTimeout = this.originalClearTimeout + + Joose.O.each(this.timeoutIds, function (value, id) { + originalClearTimeout(value) + }) + + this.timeoutIds = {} + }, + + + // deprecated + skipIf : function (condition, why, code, howMany) { + howMany = howMany || 1 + + if (condition) { + + for (var i = 1; i <= howMany; i++) this.addResult(new Siesta.Result.Assertion({ + passed : true, + isSkipped : true, + + description : 'SKIPPED: ' + why + })) + + } else + code() + }, + + + // deprecated + skip : function (why, code, howMany) { + this.skipIf(true, why, code, howMany) + }, + + + processSubTestConfig : function (config) { + return Joose.O.extend({ + trait : Siesta.Test.Sub, + + parent : this, + + isTodo : this.isTodo, + transparentEx : this.transparentEx, + + waitForTimeout : this.waitForTimeout, + waitForPollInterval : this.waitForPollInterval, + defaultTimeout : this.defaultTimeout, + timeout : this.subTestTimeout, + + global : this.global, + url : this.url, + scopeProvider : this.scopeProvider, + harness : this.harness, + generation : this.generation, + + overrideSetTimeout : false, + originalSetTimeout : this.originalSetTimeout, + originalClearTimeout : this.originalClearTimeout, + + autoCheckGlobals : false, + needToCleanup : false + }, config) + }, + + + /** + * Returns a new instance of the test class, configured as being a "sub test" of the current test. + * + * The number of nesting levels is not limited - ie sub-tests may have own sub-tests. + * + * Note, that this method does not starts the sub test, but only instatiate it. To start the sub test, use {@link #launchSubTest} method. + * + * @param {String} name The name of the test. Will be used in the UI, as the parent node name in the assertions tree + * @param {Function} code A function with test code. Will receive a test instance as the 1st argument. + * @param {Number} [timeout] A maximum duration (in ms) for this sub test. If test will not complete within this time, + * it will be considered failed. If not provided, the {@link Siesta.Harness#subTestTimeout} value is used. + * + * @return {Siesta.Test} A sub test instance + */ + getSubTest : function (arg1, arg2, arg3) { + var config + + if (arguments.length == 2 || arguments.length == 3) + config = { + name : arg1, + run : arg2, + timeout : arg3 + } + else if (arguments.length == 1 && this.typeOf(arg1) == 'Function') + config = { + name : 'Sub test', + run : arg1 + } + + config = config || arg1 || {} + + // pass-through only valid timeout values + if (config.timeout == null) delete config.timeout + + var name = config.name + + if (!config.run) { + this.failWithException("Code body is not provided for sub test [" + name + "]") + throw new Error("Code body is not provided for sub test [" + name + "]") + } + if (!config.run.length) { + this.failWithException('Code body of sub test [' + name + '] does not declare a test instance as 1st argument') + throw new Error('Code body of sub test [' + name + '] does not declare a test instance as 1st argument') + } + + return new (config.meta || this.constructor)(this.processSubTestConfig(config)) + }, + + + /** + * This method launch the provided sub test instance. + * + * @param {Siesta.Test} subTest A test instance to launch + * @param {Function} callback A function to call, after the test is completed. This function is called regardless from the test execution result. + */ + launchSubTest : function (subTest, callback) { + var me = this + + var async = this.beginAsync(subTest.timeout || this.subTestTimeout, function () { + me.fail('Subtest ' + (subTest.name ? '[' + subTest.name + ']' : '') +' failed to finish within ' + this.subTestTimeout + 'ms') + + testEndListener.remove() + + subTest.finalize(true) + + callback && callback(subTest) + + return true + }) + + var testEndListener = subTest.on('testfinalize', function () { + me.endAsync(async) + + callback && callback(subTest) + }) + + this.addResult(subTest.getResults()) + + subTest.start() + }, + + + /** + * With this method you can mark a group of assertions as "todo", assuming they most likely will fail, + * but it's still worth to try to run them. + * The supplied `code` function will be run, it will receive a new test instance as the 1st argument, + * which should be used for assertion checks (and not the primary test instance, received from `StartTest`). + * + * Assertions, failed inside of the `code` block will be still treated by harness as "green". + * Assertions, passed inside of the `code` block will be treated by harness as bonus ones and highlighted. + * + * See also {@link Siesta.Test.ExtJS#knownBugIn} method. Note, that this method will start a new {@link #subTest sub test}. + * + * For example: + + t.todo('Scheduled for 4.1.x release', function (todo) { + + var treePanel = new Ext.tree.Panel() + + todo.is(treePanel.getView().store, treePanel.store, 'NodeStore and TreeStore have been merged and there is only 1 store now'); + }) + + * @param {String} why The reason/description for the todo + * @param {Function} code A function, wrapping the "todo" assertions. This function will receive a special test class instance + * which should be used for assertion checks + */ + todo : function (why, code, callback) { + if (this.typeOf(why) == 'Function') why = [ code, code = why ][ 0 ] + + var todo = this.getSubTest({ + name : why, + + run : code, + + isTodo : true, + transparentEx : false + }) + + this.launchSubTest(todo, callback) + }, + + + /** + * This method starts a new sub test. Sub tests have separate order of assertions. In the browser UI, + * sub tests are presented with the "parent" node of the assertions tree. Sub tests are useful if you want to test + * several asynchronous processes in parallel, and would like to see assertions from every process separated. + * + * Sub tests may have their own sub tests, the number of nesting levels is not limited. + * + * Sub test can contain asynchronous methods as any other tests. Sub tests are considered completed + * only when all of its asynchronous methods have completed *and* all of its sub-tests are completed too. + * + * For example: + * + + t.subTest('Load 1st store', function (t) { + var async = t.beginAsync() + + store1.load({ + callback : function () { + t.endAsync(async); + t.isGreater(store1.getCount(), 0, "Store1 has been loaded") + } + }) + }) + + t.subTest('Load 2nd store', function (t) { + var async = t.beginAsync() + + store2.load({ + callback : function () { + t.endAsync(async); + t.isGreater(store2.getCount(), 0, "Store2 has been loaded") + } + }) + }) + + * Note, that sub test starts right away, w/o waiting for any previous sub tests to complete. If you'd like to run several sub-tests + * sequentially, use {@link #chain} method in combination with {@link #getSubTest} method. + * + * @param {String} desc The name of the sub test. Will be shown as the name of the parent node in assertion tree. + * @param {Function} code The test function to execute. It will receive a test instance as 1st argument. This test instance *must* be + * used for assertions inside of the test function + * @param {Function} callback The callback to execute after the sub test completes (either successfully or not) + * @param {Number} [timeout] A maximum duration (in ms) for this sub test. If test will not complete within this time, + * it will be considered failed. If not provided, the {@link Siesta.Harness#subTestTimeout} value is used. + */ + subTest : function (desc, code, callback, timeout) { + var subTest = this.getSubTest({ + name : desc || "Sub test", + + timeout : timeout, + + run : code + }) + + this.launchSubTest(subTest, callback) + }, + + + failWithException : function (e) { + this.failed = true + + var stackTrace = this.getStackTrace(e) + var stringified = e + '' + var annotation = (stackTrace || []).join('\n') + + this.failedException = stringified + this.failedExceptionType = this.typeOf(e) + + // prepend the exception message to the stack trace if its not already there + if (annotation.indexOf(stringified) == -1) annotation = stringified + annotation + + this.addResult(new Siesta.Result.Assertion({ + isException : true, + exceptionType : this.failedExceptionType, + passed : false, + description : (this.parent ? "Sub-test `" + this.name + "`" : 'Test ') + ' threw an exception', + annotation : annotation + })) + + + /** + * This event is fired when an individual test case has thrown an exception. + * + * This event bubbles up to the {@link Siesta.Harness harness}, so you can observe it on the harness as well. + * + * @event testfailedwithexception + * @member Siesta.Test + * @param {JooseX.Observable.Event} event The event instance + * @param {Siesta.Test} test The test instance that just threw an exception + * @param {Object} exception The exception thrown + */ + this.fireEvent('testfailedwithexception', this, e, stackTrace); + + this.finalize(true) + }, + + + start : function (alreadyFailedWithException) { + if (this.startDate) { + throw 'Test has already been started'; + } + + this.startDate = new Date() - 0 + + /** + * This event is fired when an individual test case starts. When *started*, the test may still be waiting for the {@link #isReady} condition + * to be fullfilled. Once all conditions are fullfilled the test will be *launched*. + * + * This event bubbles up to the {@link Siesta.Harness harness}, you can observe it on harness as well. + * + * @event teststart + * @member Siesta.Test + * @param {JooseX.Observable.Event} event The event instance + * @param {Siesta.Test} test The test instance that just has started + */ + this.fireEvent('teststart', this); + + if (alreadyFailedWithException) { + this.failWithException(alreadyFailedWithException) + + return + } + + var me = this; + var errorMessage; + var readyRes = me.isReady(); + + if (readyRes.ready) { + // We're ready to go + me.launch(); + } else { + // Need to wait for isReady to give green light + var timeout = setTimeout(function () { + clearInterval(interval) + me.launch(errorMessage) + + }, me.isReadyTimeout) + + var interval = setInterval(function(){ + readyRes = me.isReady(); + + if (readyRes.ready) { + clearInterval(interval) + clearTimeout(timeout) + me.launch(); + } else { + errorMessage = readyRes.reason || errorMessage; + } + }, 100); + } + }, + + + launch : function (errorMessage) { + if (errorMessage) { + this.fail('Wait for test start condition took too long', { + annotation : errorMessage + }) + } + + var me = this + var global = this.global + + var scopeProvider = this.scopeProvider + + var originalSetTimeout = this.originalSetTimeout + var originalClearTimeout = this.originalClearTimeout + + // this.overrideSetTimeout + if (this.overrideSetTimeout) { + // see http://www.adequatelygood.com/2011/4/Replacing-setTimeout-Globally + scopeProvider.runCode('var setTimeout, clearTimeout;') + + global.setTimeout = function (func, delay) { + + var index = me.timeoutsCount++ + + // in NodeJS `setTimeout` returns an object and not a simple ID, so we try hard to store that object under unique index + // also using `setTimeout` from the scope of test - as timeouts in different scopes in browsers are mis-synchronized + var timeoutId = originalSetTimeout(function () { + originalClearTimeout(timeoutId) + delete me.timeoutIds[ index ] + + // if the test func has been executed, but the test was not finalized yet - then we should try to finalize it + if (me.processed && !me.isFinished()) + // we are doing that after slight delay, potentially allowing to setup some other async frames in the "func" below + originalSetTimeout(function () { + me.finalize() + }, 1) + + func() + + }, delay) + + // in NodeJS saves the index of the timeout descriptor to the descriptor + if (typeof timeoutId == 'object') + timeoutId.__index = index + else + // in browser (where `timeoutId` is a number) - to the `idsToIndex` hash + me.idsToIndex[ timeoutId ] = index + + return me.timeoutIds[ index ] = timeoutId + } + + global.clearTimeout = function (id) { + if (id == null) return + + var index + + // in NodeJS `setTimeout` returns an object and not a simple ID + if (typeof id == 'object') { + index = id.__index + if (me.timeoutIds[ index ] != id) throw "Incorrect state" + } else { + index = me.idsToIndex[ id ] + + delete me.idsToIndex[ id ] + } + + originalClearTimeout(id) + + if (index != null) delete me.timeoutIds[ index ] + + // if the test func has been executed, but the test was not finalized yet - then we should try to finalize it + if (me.processed && !me.isFinished()) + // we are doing that after slight delay, potentially allowing to setup some other async frames after the "clearTimeout" will complete + originalSetTimeout(function () { + me.finalize() + }, 1) + } + } + // eof this.overrideSetTimeout + + // we only don't need to cleanup up when doing a self-testing or for sub-tests + if (this.needToCleanup) { + scopeProvider.beforeCleanupCallback = function () { + // if scope cleanup happens most probably user has restarted the test and is not interested in the results + // of previous launch + // finalizing the previous test in such case + if (!me.isFinished()) me.finalize(true) + + if (me.overrideSetTimeout) { + global.setTimeout = originalSetTimeout + global.clearTimeout = originalClearTimeout + } + + // cleanup the closures just in case (probably useful for IE) + originalSetTimeout = originalClearTimeout = null + global = run = null + + me.eachSubTest(function (subTest) { + subTest.originalSetTimeout = subTest.originalClearTimeout = null + subTest.global = subTest.run = null + subTest.exceptionCatcher = subTest.testErrorClass = null + subTest.startTestAnchor = null + }) + } + } + + var run = this.run + + if (this.transparentEx) + run(me) + else + var e = this.getExceptionCatcher()(function(){ + run(me) + }) + + this.afterLaunch(e) + }, + + // a method executed after the "run" function has been ran - used in BDD role for example + afterLaunch : function (e) { + if (e) + this.failWithException(e) + else + this.finalize() + }, + + + finalize : function (force) { + if (this.isFinished()) return + + this.processed = true + + if (force) { + this.clearTimeouts() + +// this.eachChildTest(function (childTest) { childTest.finalize(true) }) + } + + if (!Joose.O.isEmpty(this.timeoutIds)) { + if ( + !this.__timeoutWarning && this.overrideSetTimeout && this.lastActivityDate && + new Date() - this.lastActivityDate > this.defaultTimeout * 2 + ) { + this.diag('Your test is still considered to be running, if this is unexpected please see console for more information'); + this.warn('Your test [' + this.url + '] has not finalized, most likely since a timer (setTimeout) is still active. ' + + 'If this is the expected behavior, try setting "overrideSetTimeout : false" on your Harness configuration.'); + this.__timeoutWarning = true; + } + + return + } + + if (!this.needDone && !this.isDone) { + // this is early "testfinalize" hook, we need "early" and "usual" hooks, since we want globals check to be the last assertion + this.fireEvent('beforetestfinalizeearly') + + /** + * This event is fired before the individual test case ends (no any corresponded harness actions will be run yet). + * + * This event bubbles up to the {@link Siesta.Harness harness}, you can observe it on harness as well. + * + * @event beforetestfinalize + * @member Siesta.Test + * @param {JooseX.Observable.Event} event The event instance + * @param {Siesta.Test} test The test instance that is about to finalize + */ + this.fireEvent('beforetestfinalize'); + } + + this.endDate = new Date() - 0 + + if (!this.parent) this.addResult(new Siesta.Result.Summary({ + isFailed : this.isFailed(), + description : this.getSummaryMessage() + })) + + /** + * This event is fired when an individual test case ends (either because it has completed correctly or thrown an exception). + * + * This event bubbles up to the {@link Siesta.Harness harness}, you can observe it on the harness as well. + * + * @event testfinalize + * @member Siesta.Test + * @param {JooseX.Observable.Event} event The event instance + * @param {Siesta.Test} test The test instance that just has completed + */ + this.fireEvent('testfinalize', this); + + // a test end event that bubbles + this.fireEvent('testendbubbling', this); + + this.callback && this.callback() + }, + + + getSummaryMessage : function (lineBreaks) { + var res = [] + + var passCount = this.getPassCount() + var failCount = this.getFailCount() + var assertPlanned = this.assertPlanned + var total = failCount + passCount + + res.push('Passed: ' + passCount) + res.push('Failed: ' + failCount) + + if (!this.failed) { + // there was a t.plan() call + if (assertPlanned != null) { + if (total < assertPlanned) + res.push('Looks like you planned ' + assertPlanned + ' tests, but ran only ' + total) + + if (total > assertPlanned) + res.push('Looks like you planned ' + assertPlanned + ' tests, but ran ' + (total - assertPlanned) + ' extra tests, ' + total + ' total.') + + if (total == assertPlanned && !failCount) res.push('All tests passed') + } else { + if (!this.isDoneCorrectly()) res.push('Test has completed, but there were no `t.done()` call. Add it at the bottom, or use `t.beginAsync()` for asynchronous code') + + if (this.isDoneCorrectly() && !failCount) res.push('All tests passed') + } + } + + return lineBreaks ? res.join(lineBreaks) : res + }, + + + /** + * This method indicates that test has completed at the expected point and no more assertions are planned. Adding assertions after the call to `done` + * will add a failing assertion "Adding assertion after test completion". + * + * @param {Number} delay Optional. When provided, the test will not complete right away, but will wait for `delay` milliseconds for additional assertions. + */ + done : function (delay) { + var me = this + + if (delay) { + var async = this.beginAsync() + + var originalSetTimeout = this.originalSetTimeout + + originalSetTimeout(function () { + + me.endAsync(async) + me.done() + + }, delay) + + } else { + this.fireEvent('beforetestfinalizeearly') + this.fireEvent('beforetestfinalize'); + + this.isDone = true + + if (this.processed) this.finalize() + } + }, + + // `isDoneCorrectly` means that either test does not need the call to `done` + // or the call to `done` has been already made + isDoneCorrectly : function () { + return !this.needDone || this.isDone + }, + + + getAssertionCount : function (excludeTodo) { + var count = 0 + + this.eachAssertion(function (assertion) { + if (!excludeTodo || !assertion.isTodo) count++ + }) + + return count + }, + + + // cached method except the "includeTodo" case + getPassCount : function (includeTodo) { + if (this.$passCount != null && !includeTodo) return this.$passCount + + var passCount = 0 + + this.eachAssertion(function (assertion) { + if (assertion.passed && (includeTodo || !assertion.isTodo)) passCount++ + }) + + return includeTodo ? passCount : this.$passCount = passCount + }, + + getTodoPassCount : function () { + var todoCount = 0; + + this.eachAssertion(function (assertion) { + if (assertion.isTodo && assertion.passed) todoCount++; + }); + + return todoCount; + }, + + getTodoFailCount : function () { + var todoCount = 0; + + this.eachAssertion(function (assertion) { + if (assertion.isTodo && !assertion.passed) todoCount++; + }); + + return todoCount; + }, + + + // cached method except the "includeTodo" case + getFailCount : function (includeTodo) { + if (this.$failCount != null && !includeTodo) return this.$failCount + + var failCount = 0 + + this.eachAssertion(function (assertion) { + if (!assertion.passed && (includeTodo || !assertion.isTodo)) failCount++ + }) + + return includeTodo ? failCount : this.$failCount = failCount + }, + + + getFailedAssertions : function () { + var failed = []; + + this.eachAssertion(function (assertion) { + if (!assertion.isPassed()) failed.push(assertion) + }) + + return failed + }, + + + isPassed : function () { + var passCount = this.getPassCount() + var failCount = this.getFailCount() + var assertPlanned = this.assertPlanned + + return this.isFinished() && !this.failed && !failCount && ( + assertPlanned != null && passCount == assertPlanned + || + assertPlanned == null && this.isDoneCorrectly() + ) + }, + + + isFailed : function () { + var passCount = this.getPassCount() + var failCount = this.getFailCount() + var assertPlanned = this.assertPlanned + + return this.failed || failCount || ( + + this.isFinished() && ( + assertPlanned != null && passCount != assertPlanned + || + assertPlanned == null && !this.isDoneCorrectly() + ) + ) + }, + + + isFailedWithException : function () { + return this.failed + }, + + + isStarted : function () { + return this.startDate != null + }, + + + isFinished : function () { + return this.endDate != null + }, + + + getDuration : function () { + return this.endDate - this.startDate + }, + + + getBubbleTarget : function () { + return this.parent || this.harness; + }, + + + warn : function (message) { + this.addResult(new Siesta.Result.Diagnostic({ + description : message, + isWarning : true + })) + }, + + + flattenArray : function (array) { + var me = this + var result = [] + + Joose.A.each(array, function (el) { + if (me.typeOf(el) == 'Array') + result.push.apply(result, me.flattenArray(el)) + else + result.push(el) + }) + + return result + } + } + // eof methods + +}) +//eof Siesta.Test; +Singleton('Siesta.Test.ActionRegistry', { + + has : { + actionClasses : Joose.I.Object, + + targetShortcuts : function () { + return [ + 'waitFor', + 'click', + 'rightClick', + 'doubleClick', + 'dblClick', + 'doubleTap', + 'drag', + 'longpress', + 'mouseDown', + 'mouseUp', + 'moveCursorTo', + 'swipe', + 'tap', + 'type' + ] + } + }, + + + methods : { + + registerAction : function (name, constructor) { + this.actionClasses[ name.toLowerCase() ] = constructor + }, + + + getActionClass : function (name) { + return this.actionClasses[ name.toLowerCase() ] + }, + + + create : function (obj) { + if (obj !== Object(obj)) throw "Action configuration should be an Object instance" + + if (!obj.action) { + var lowerCasedKeys = {} + + Joose.O.eachOwn(obj, function (value, key) { + lowerCasedKeys[ key.toLowerCase() ] = key + }) + + var me = this + + Joose.A.each(this.targetShortcuts, function (shortcut) { + shortcut = shortcut.toLowerCase() + + if (lowerCasedKeys.hasOwnProperty(shortcut)) { + obj.action = shortcut + + switch (shortcut) { + case 'waitfor' : + // do nothing + break + + case 'type' : + obj.text = obj[ lowerCasedKeys[ shortcut ] ] + break + + default : + obj.target = obj[ lowerCasedKeys[ shortcut ] ] + } + + return false + } + }) + } + + if (!obj.action) throw "Need to include `action` property or shortuct property in the step config" + + var actionClass = this.getActionClass(obj.action) + + return new actionClass(obj) + } + } +}); +; +/** +@class Siesta.Test.Action + +Base class for {@link Siesta.Test#chain} actions. + +*/ +Class('Siesta.Test.Action', { + + has : { + args : null, + + /** + * @cfg {String} desc When provided, once step is completed, a passing assertion with this text will be added to a test. + * This configuration option can be useful to indicate the progress of "wait" steps + */ + desc : null, + test : { required : true }, + next : { required : true }, + + requiredTestMethod : null + }, + + + methods : { + + initialize : function () { + var requiredTestMethod = this.requiredTestMethod + + // additional sanity check + if (requiredTestMethod && !this.test[ requiredTestMethod ]) + throw new Error("Action [" + this + "] requires `" + requiredTestMethod + "` method in your test class") + }, + + + process : function () { + this.next() + } + } +}); +; +/** + +@class Siesta.Test.Action.Done +@extends Siesta.Test.Action + +This action can be included in the `t.chain` call with "done" shortcut: + + t.chain( + { + action : 'done' + } + ) + +This action will just call the {@link Siesta.Test#done done} method of the test. + +*/ +Class('Siesta.Test.Action.Done', { + + isa : Siesta.Test.Action, + + has : { + /** + * @cfg {Number} delay + * + * An optional `delay` argument for {@link Siesta.Test#done done} call. + */ + delay : null + }, + + + methods : { + + process : function () { + this.test.done(this.delay) + + this.next() + } + } +}); + + +Siesta.Test.ActionRegistry().registerAction('done', Siesta.Test.Action.Done); +/** + +@class Siesta.Test.Action.Wait +@extends Siesta.Test.Action + +This action can be included in the `t.chain` call with "wait" or "delay" shortcuts: + + t.chain( + { + action : 'wait', // or "delay" + delay : 1000 // 1 second + } + ) + +Alternatively, for convenience, this action can be included in the chain using "waitFor" config (the "action" property can be omitted): + + t.chain( + { + waitFor : 'selector', // or any other waitFor* method name + args : [ '.x-grid-row' ] // an array of arguments for the specified method + } + ) + + t.chain( + { + waitFor : 'rowsVisible', // or any other waitFor* method name + args : [ grid ] // an array of arguments for the specified method + } + ) + + t.chain( + { + waitFor : 'waitForRowsVisible', // full method name is also ok + args : grid // a single value will be converted to array automatically + } + ) + +In the latter case, this action will perform a call to the one of the `waitFor*` methods of the test instance. +The name of the method is computed by prepending the uppercased value of `waitFor` config with the string "waitFor" +(unless it doesn't already start with "waitFor"). +The arguments for method call can be provided as the "args" array. Any non-array value for "args" will be converted to an array with one element. +* **Note**, that this action will provide a `callback`, `scope`, and `timeout` arguments for `waitFor*` methods - you should not specify them. + + +As a special case, the value of `waitFor` config can be a Number or Function - that will trigger the call to {@link Siesta.Test#waitFor} method with provided value: + + t.chain( + { + waitFor : 500 + }, + // same as + { + waitFor : '', + args : [ 500 ] + }, + { + waitFor : function () { return document.body.className.match(/someClass/) } + } + ) + +*/ +Class('Siesta.Test.Action.Wait', { + + isa : Siesta.Test.Action, + + has : { + /** + * @cfg {Number} delay + * + * A number of milliseconds to wait before continuing. + */ + delay : 1000, + + /** + * @cfg {Number} timeout + * + * The maximum amount of time to wait for the condition to be fulfilled. Defaults to the {@link Siesta.Test.ExtJS#waitForTimeout} value. + */ + timeout : null, + + /** + * @cfg {Array/Function} args + * + * The array of arguments to pass to waitForXXX method. You should omit the 3 last parameters: callback, scope, timeout. Any non-array value will be converted to + * a single-value array. Can be also a function, returning either an array of a single value, which will be converted to array. + * Function will be called using test instance as a "this" scope. + * If you need to pass a function, as an argument, wrap in the array. Compare: + { + waitFor : 'SomeCondition', + // will be called when processing the action, should return an array of arguments + args : function () {} + } + + { + waitFor : 'SomeCondition', + // won't be called, instead will be passed as 1st argument + args : [ function () {} ] + } + * + */ + args : null, + + /** + * @cfg {String} waitFor + * + * The name of the `waitFor` method to call. You can omit the leading "waitFor": + * + + t.chain( + { + waitFor : 'selector', + ... + }, + // same as + { + waitFor : 'waitForSelector', + ... + } + ) + * + */ + waitFor : null + }, + + + methods : { + + process : function () { + var waitFor = this.waitFor; + var test = this.test + + if (test.typeOf(waitFor) === 'Number' || test.typeOf(waitFor) === 'Function') { + // Caller supplied a function returning true when done waiting or + // a number of milliseconds to wait for. + this.args = [ waitFor ]; + waitFor = ''; + } + + if (waitFor == null) { + this.args = [ this.delay ]; + waitFor = ''; + } + + if (test.typeOf(this.args) === "Function") { + this.args = this.args.call(test, this); + } + + if (test.typeOf(this.args) !== "Array") { + this.args = [ this.args ]; + } + + // also allow full method names + waitFor = waitFor.replace(/^waitFor/, '') + var methodName = 'waitFor' + Joose.S.uppercaseFirst(waitFor); + + if (!test[methodName]){ + throw 'Could not find a waitFor method named ' + methodName; + } + + // If using simple waitFor statement, use the object notation to be able to pass a description + // which gives better debugging help than "Waited too long for condition to be fulfilled". + if (methodName === 'waitFor') { + test[methodName]({ + method : this.args[ 0 ], + callback : this.next, + scope : test, + timeout : this.timeout || test.waitForTimeout, + description : this.desc || '' + }); + } else { + test[methodName].apply(test, this.args.concat(this.next, test, this.timeout || test.waitForTimeout)); + } + } + } +}); + +Joose.A.each([ 'wait', 'waitFor', 'delay' ], function(name) { + Siesta.Test.ActionRegistry().registerAction(name, Siesta.Test.Action.Wait); +});; +/** + +@class Siesta.Test.Action.Eval +@extends Siesta.Test.Action + +This action can be included in the `t.chain` steps only with a plain string. Siesta will examine the passed string, +and call an apropriate method of the test class. String should have the following format: + + methodName(params) + +Method name is anything until the first parenthes. Method name may have an optional prefix `t.`. +Everything in between of outermost parentheses will be treated as parameters for method call. For example: + + t.chain( + // string should look like a usual method call, + // but arguments can't reference any variables + // strings should be quoted, to include quoting symbol in string use double slash: \\ + 't.click("combo[type=some\\"Type] => .x-form-trigger")', + + // leading "t." is optional, but quoting is not + 'waitForComponent("combo[type=someType]")', + + // JSON objects are ok, but they should be a valid JSON - ie object properties should be quoted + 'myClick([ 10, 10 ], { "foo" : "bar" })', + ) + +* **Note** You can pass the JSON objects as arguments, but they should be serialized as valid JSON - ie object properties should be quoted. + +* **Note** A callback for next step in chain will be always appended to provided parameters. Make sure it is placed in a correct spot! +For example if method signature is `t.someMethod(param1, param2, callback)` and you are calling this method as: + + t.chain( + `t.someMethod("text")` + ) +it will fail - callback will be provided in place of `param2`. Instead call it as: + + t.chain( + `t.someMethod("text", null)` + ) + +This action may save you few keystrokes, when you need to perform some action with static arguments (known prior the action). + +*/ +Class('Siesta.Test.Action.Eval', { + + isa : Siesta.Test.Action, + + has : { + /** + * @cfg {Object} options + * + * Any options that will be used when simulating the event. For information about possible + * config options, please see: + */ + actionString : null + }, + + + methods : { + + process : function () { + var test = this.test + var parsed = this.parseActionString(this.actionString) + + if (parsed.error) { + test.fail(parsed.error) + this.next() + return + } + + var methodName = parsed.methodName + + if (!methodName || test.typeOf(test[ methodName ]) != 'Function') { + test.fail("Invalid method name: " + methodName) + this.next() + return + } + + parsed.params.push(this.next) + + test[ methodName ].apply(test, parsed.params) + }, + + + parseActionString : function (actionString) { + var match = /^\s*(.+?)\(\s*(.*)\s*\)\s*$/.exec(actionString) + + if (!match) return { + error : "Wrong format of the action string: " + actionString + } + + var methodName = match[ 1 ].replace(/^t\./, '') + + try { + var params = JSON.parse('[' + match[ 2 ] + ']') + } catch (e) { + return { + error : "Can't parse arguments: " + match[ 2 ] + } + } + + return { + methodName : methodName, + params : params + } + } + } +}); +; +/** + +@class Siesta.Harness +@mixin Siesta.Role.CanStyleOutput + +`Siesta.Harness` is an abstract base harness class in Siesta hierarchy. This class provides no UI, +you should use one of it subclasses, for example {@link Siesta.Harness.Browser} + +This file is a reference only, for a getting start guide and manual, please refer to Getting Started Guide. + + +Synopsys +======== + + var Harness, + isNode = typeof process != 'undefined' && process.pid + + if (isNode) { + Harness = require('siesta'); + } else { + Harness = Siesta.Harness.Browser; + } + + + Harness.configure({ + title : 'Awesome Test Suite', + + transparentEx : true, + + autoCheckGlobals : true, + expectedGlobals : [ + 'Ext', + 'Sch' + ], + + preload : [ + "http://cdn.sencha.io/ext-4.0.2a/ext-all-debug.js", + "../awesome-project-all.js", + { + text : "console.log('preload completed')" + } + ] + }) + + + Harness.start( + // simple string - url relative to harness file + 'sanity.t.js', + + // test file descriptor with own configuration options + { + url : 'basic.t.js', + + // replace `preload` option of harness + preload : [ + "http://cdn.sencha.io/ext-4.0.6/ext-all-debug.js", + "../awesome-project-all.js" + ] + }, + + // groups ("folders") of test files (possibly with own options) + { + group : 'Sanity', + + autoCheckGlobals : false, + + items : [ + 'data/crud.t.js', + ... + ] + }, + ... + ) + + +*/ + + +Class('Siesta.Harness', { + + does : [ + JooseX.Observable + ], + + has : { + /** + * @cfg {String} title The title of the test suite. Can contain HTML. When provided in the test file descriptor - will change the name of test in the harness UI. + */ + title : null, + + /** + * @cfg {Class} testClass The test class which will be used for creating test instances, defaults to {@link Siesta.Test}. + * You can subclass {@link Siesta.Test} and provide a new class. + * + * This option can be also specified in the test file descriptor. + */ + testClass : Siesta.Test, + contentManagerClass : Siesta.Content.Manager, + + // fields of test descriptor: + // - id - either `url` or wbs + group - computed + // - url + // - isMissing - true if test file is missing + // - testCode - a test code source (can be provided by user) + // - testConfig - config object provided to the StartTest + // - index - (in the group) computed + // - scopeProvider + // - scopeProviderConfig + // - preload + // - alsoPreload + // - parent - parent descriptor (or harness for top-most ones) - computed + // - preset - computed by harness - instance of Siesta.Content.Preset + // - forceDOMVisible - true to show the