From a0e90123a44e8df3b78910cefe2be3fc52a7cafb Mon Sep 17 00:00:00 2001 From: Matt Perejda Date: Tue, 11 Nov 2014 18:38:09 -0500 Subject: [PATCH 1/3] kill workers in UI, add plugins --- Gemfile | 4 + Gemfile.lock | 195 ++--- .../resque_web/workers_controller.rb | 13 + app/views/resque_web/workers/show.html.erb | 13 + .../resque_web/working/_working.html.erb | 6 + config/initializers/resque_plugins.rb | 3 + config/routes.rb | 7 +- lib/resque_history/.document | 5 + lib/resque_history/.gitignore | 58 ++ lib/resque_history/.travis.yml | 9 + lib/resque_history/Changelog.md | 45 + lib/resque_history/Gemfile | 16 + lib/resque_history/Gemfile.lock | 92 ++ lib/resque_history/LICENSE | 21 + lib/resque_history/README.md | 89 ++ lib/resque_history/Rakefile | 25 + lib/resque_history/VERSION | 1 + lib/resque_history/lib/resque-history.rb | 3 + .../lib/resque-history/helpers/helper.rb | 28 + .../lib/resque-history/plugins/history.rb | 46 + .../lib/resque-history/server.rb | 52 ++ .../resque-history/server/views/history.erb | 62 ++ .../server/views/navigation.erb | 20 + lib/resque_history/lib/version.rb | 7 + lib/resque_history/resque-history.gemspec | 85 ++ lib/resque_history/spec/redis-test.conf | 16 + lib/resque_history/spec/redis/.keep | 0 .../resque-history/plugins/history_spec.rb | 217 +++++ .../resque_history_helper_spec.rb | 36 + lib/resque_history/spec/resque-web_spec.rb | 57 ++ lib/resque_history/spec/spec_helper.rb | 64 ++ lib/resque_history/test/helper.rb | 18 + .../test/test_resque-history.rb | 7 + lib/resque_sliders/.gitignore | 7 + lib/resque_sliders/.travis.yml | 8 + lib/resque_sliders/Gemfile | 15 + lib/resque_sliders/MIT-LICENSE | 20 + lib/resque_sliders/README.md | 135 +++ lib/resque_sliders/Rakefile | 41 + lib/resque_sliders/bin/kewatcher | 86 ++ lib/resque_sliders/config/config_example.yml | 11 + lib/resque_sliders/helpers/resque_init.rb | 8 + lib/resque_sliders/helpers/resque_job.rb | 33 + lib/resque_sliders/helpers/resque_run.rb | 12 + lib/resque_sliders/lib/resque-sliders.rb | 9 + .../lib/resque-sliders/commander.rb | 84 ++ .../lib/resque-sliders/helpers.rb | 104 +++ .../lib/resque-sliders/kewatcher.rb | 440 ++++++++++ .../lib/resque-sliders/server.rb | 101 +++ .../blitzer/jquery-ui.custom.css | 568 +++++++++++++ .../server/public/css/sliders.css | 32 + .../ui-bg_diagonals-thick_75_f3d8d8_40x40.png | Bin 0 -> 256 bytes .../images/ui-bg_dots-small_65_a6a6a6_2x2.png | Bin 0 -> 83 bytes .../images/ui-bg_flat_0_333333_40x100.png | Bin 0 -> 180 bytes .../images/ui-bg_flat_65_ffffff_40x100.png | Bin 0 -> 178 bytes .../images/ui-bg_flat_75_ffffff_40x100.png | Bin 0 -> 178 bytes .../images/ui-bg_glass_55_fbf8ee_1x400.png | Bin 0 -> 143 bytes .../ui-bg_highlight-hard_100_eeeeee_1x100.png | Bin 0 -> 94 bytes .../ui-bg_highlight-hard_100_f6f6f6_1x100.png | Bin 0 -> 89 bytes .../ui-bg_highlight-soft_15_cc0000_1x100.png | Bin 0 -> 108 bytes .../public/images/ui-icons_004276_256x240.png | Bin 0 -> 4369 bytes .../public/images/ui-icons_cc0000_256x240.png | Bin 0 -> 4369 bytes .../public/images/ui-icons_ffffff_256x240.png | Bin 0 -> 4369 bytes .../public/js/jquery-ui-1.8.16.custom.min.js | 791 ++++++++++++++++++ .../server/public/js/sliders.js | 98 +++ .../lib/resque-sliders/server/views/index.erb | 57 ++ .../lib/resque-sliders/version.rb | 7 + .../misc/resque-sliders_host-view.png | Bin 0 -> 52662 bytes .../misc/resque-sliders_main-view.png | Bin 0 -> 54388 bytes lib/resque_sliders/resque-sliders.gemspec | 30 + lib/resque_sliders/test/kewatcher_test.rb | 44 + lib/resque_sliders/test/redis-test.conf | 115 +++ lib/resque_sliders/test/test_helper.rb | 74 ++ 73 files changed, 4152 insertions(+), 98 deletions(-) create mode 100644 config/initializers/resque_plugins.rb create mode 100755 lib/resque_history/.document create mode 100755 lib/resque_history/.gitignore create mode 100755 lib/resque_history/.travis.yml create mode 100755 lib/resque_history/Changelog.md create mode 100755 lib/resque_history/Gemfile create mode 100755 lib/resque_history/Gemfile.lock create mode 100755 lib/resque_history/LICENSE create mode 100755 lib/resque_history/README.md create mode 100755 lib/resque_history/Rakefile create mode 100755 lib/resque_history/VERSION create mode 100755 lib/resque_history/lib/resque-history.rb create mode 100755 lib/resque_history/lib/resque-history/helpers/helper.rb create mode 100755 lib/resque_history/lib/resque-history/plugins/history.rb create mode 100755 lib/resque_history/lib/resque-history/server.rb create mode 100755 lib/resque_history/lib/resque-history/server/views/history.erb create mode 100755 lib/resque_history/lib/resque-history/server/views/navigation.erb create mode 100755 lib/resque_history/lib/version.rb create mode 100755 lib/resque_history/resque-history.gemspec create mode 100755 lib/resque_history/spec/redis-test.conf create mode 100755 lib/resque_history/spec/redis/.keep create mode 100755 lib/resque_history/spec/resque-history/plugins/history_spec.rb create mode 100755 lib/resque_history/spec/resque-history/resque_history_helper_spec.rb create mode 100755 lib/resque_history/spec/resque-web_spec.rb create mode 100755 lib/resque_history/spec/spec_helper.rb create mode 100755 lib/resque_history/test/helper.rb create mode 100755 lib/resque_history/test/test_resque-history.rb create mode 100755 lib/resque_sliders/.gitignore create mode 100755 lib/resque_sliders/.travis.yml create mode 100755 lib/resque_sliders/Gemfile create mode 100755 lib/resque_sliders/MIT-LICENSE create mode 100755 lib/resque_sliders/README.md create mode 100755 lib/resque_sliders/Rakefile create mode 100755 lib/resque_sliders/bin/kewatcher create mode 100755 lib/resque_sliders/config/config_example.yml create mode 100755 lib/resque_sliders/helpers/resque_init.rb create mode 100755 lib/resque_sliders/helpers/resque_job.rb create mode 100755 lib/resque_sliders/helpers/resque_run.rb create mode 100755 lib/resque_sliders/lib/resque-sliders.rb create mode 100755 lib/resque_sliders/lib/resque-sliders/commander.rb create mode 100755 lib/resque_sliders/lib/resque-sliders/helpers.rb create mode 100755 lib/resque_sliders/lib/resque-sliders/kewatcher.rb create mode 100755 lib/resque_sliders/lib/resque-sliders/server.rb create mode 100755 lib/resque_sliders/lib/resque-sliders/server/public/css/jqueryui-1.8.16/blitzer/jquery-ui.custom.css create mode 100755 lib/resque_sliders/lib/resque-sliders/server/public/css/sliders.css create mode 100755 lib/resque_sliders/lib/resque-sliders/server/public/images/ui-bg_diagonals-thick_75_f3d8d8_40x40.png create mode 100755 lib/resque_sliders/lib/resque-sliders/server/public/images/ui-bg_dots-small_65_a6a6a6_2x2.png create mode 100755 lib/resque_sliders/lib/resque-sliders/server/public/images/ui-bg_flat_0_333333_40x100.png create mode 100755 lib/resque_sliders/lib/resque-sliders/server/public/images/ui-bg_flat_65_ffffff_40x100.png create mode 100755 lib/resque_sliders/lib/resque-sliders/server/public/images/ui-bg_flat_75_ffffff_40x100.png create mode 100755 lib/resque_sliders/lib/resque-sliders/server/public/images/ui-bg_glass_55_fbf8ee_1x400.png create mode 100755 lib/resque_sliders/lib/resque-sliders/server/public/images/ui-bg_highlight-hard_100_eeeeee_1x100.png create mode 100755 lib/resque_sliders/lib/resque-sliders/server/public/images/ui-bg_highlight-hard_100_f6f6f6_1x100.png create mode 100755 lib/resque_sliders/lib/resque-sliders/server/public/images/ui-bg_highlight-soft_15_cc0000_1x100.png create mode 100755 lib/resque_sliders/lib/resque-sliders/server/public/images/ui-icons_004276_256x240.png create mode 100755 lib/resque_sliders/lib/resque-sliders/server/public/images/ui-icons_cc0000_256x240.png create mode 100755 lib/resque_sliders/lib/resque-sliders/server/public/images/ui-icons_ffffff_256x240.png create mode 100755 lib/resque_sliders/lib/resque-sliders/server/public/js/jquery-ui-1.8.16.custom.min.js create mode 100755 lib/resque_sliders/lib/resque-sliders/server/public/js/sliders.js create mode 100755 lib/resque_sliders/lib/resque-sliders/server/views/index.erb create mode 100755 lib/resque_sliders/lib/resque-sliders/version.rb create mode 100755 lib/resque_sliders/misc/resque-sliders_host-view.png create mode 100755 lib/resque_sliders/misc/resque-sliders_main-view.png create mode 100755 lib/resque_sliders/resque-sliders.gemspec create mode 100755 lib/resque_sliders/test/kewatcher_test.rb create mode 100755 lib/resque_sliders/test/redis-test.conf create mode 100755 lib/resque_sliders/test/test_helper.rb diff --git a/Gemfile b/Gemfile index 18172d2..f8c41fa 100644 --- a/Gemfile +++ b/Gemfile @@ -4,6 +4,10 @@ gemspec gem 'rails', '~> 4.0.3' gem 'resque', :git => 'https://github.com/resque/resque.git', :branch => "1-x-stable" +#add functionality w/ two new plugins, encountered difficulties +gem 'resque-sliders' +gem 'resque-history' + gem 'sqlite3', :platforms => :ruby gem 'activerecord-jdbcsqlite3-adapter', :platforms => :jruby diff --git a/Gemfile.lock b/Gemfile.lock index 182a315..34080e2 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,9 +1,9 @@ GIT remote: https://github.com/resque/resque.git - revision: aee359b79ed58799a9d1463b47da6533395e1185 + revision: 41469a3eaa9394a60a2ff249c4d00a41f06b4b22 branch: 1-x-stable specs: - resque (1.25.1) + resque (1.25.2) mono_logger (~> 1.0) multi_json (~> 1.0) redis-namespace (~> 1.3) @@ -23,113 +23,117 @@ PATH GEM remote: https://rubygems.org/ specs: - actionmailer (4.0.3) - actionpack (= 4.0.3) - mail (~> 2.5.4) - actionpack (4.0.3) - activesupport (= 4.0.3) + actionmailer (4.0.10) + actionpack (= 4.0.10) + mail (~> 2.5, >= 2.5.4) + actionpack (4.0.10) + activesupport (= 4.0.10) builder (~> 3.1.0) erubis (~> 2.7.0) rack (~> 1.5.2) rack-test (~> 0.6.2) - activemodel (4.0.3) - activesupport (= 4.0.3) + activemodel (4.0.10) + activesupport (= 4.0.10) builder (~> 3.1.0) - activerecord (4.0.3) - activemodel (= 4.0.3) + activerecord (4.0.10) + activemodel (= 4.0.10) activerecord-deprecated_finders (~> 1.0.2) - activesupport (= 4.0.3) + activesupport (= 4.0.10) arel (~> 4.0.0) activerecord-deprecated_finders (1.0.3) - activerecord-jdbc-adapter (1.2.9.1) - activerecord-jdbcsqlite3-adapter (1.2.9) - activerecord-jdbc-adapter (~> 1.2.9) + activerecord-jdbc-adapter (1.3.11) + activerecord (>= 2.2) + activerecord-jdbcsqlite3-adapter (1.3.11) + activerecord-jdbc-adapter (~> 1.3.11) jdbc-sqlite3 (~> 3.7.2) - activesupport (4.0.3) - i18n (~> 0.6, >= 0.6.4) + activesupport (4.0.10) + i18n (~> 0.6, >= 0.6.9) minitest (~> 4.2) multi_json (~> 1.3) thread_safe (~> 0.1) tzinfo (~> 0.3.37) arel (4.0.2) - atomic (1.1.15) - atomic (1.1.15-java) builder (3.1.4) - coffee-rails (4.0.1) + coffee-rails (4.1.0) coffee-script (>= 2.2.0) railties (>= 4.0.0, < 5.0) coffee-script (2.3.0) coffee-script-source execjs - coffee-script-source (1.7.1) - colorize (0.5.8) - coveralls (0.6.7) - colorize + coffee-script-source (1.8.0) + coveralls (0.7.1) multi_json (~> 1.3) rest-client simplecov (>= 0.7) + term-ansicolor thor - dotenv (0.9.0) - dotenv-rails (0.9.0) - dotenv (= 0.9.0) + docile (1.1.5) + dotenv (1.0.2) + dotenv-rails (1.0.2) + dotenv (= 1.0.2) erubis (2.7.0) - execjs (2.0.1) + execjs (2.2.2) ffi2-generators (0.1.1) hike (1.2.3) - i18n (0.6.9) + i18n (0.6.11) jdbc-sqlite3 (3.7.2.1) - jquery-rails (3.1.1) + jquery-rails (3.1.2) railties (>= 3.0, < 5.0) thor (>= 0.14, < 2.0) json (1.8.1) json (1.8.1-java) - libv8 (3.16.14.3) - mail (2.5.4) - mime-types (~> 1.16) - treetop (~> 1.4.8) - metaclass (0.0.1) - mime-types (1.25.1) + libv8 (3.16.14.7) + mail (2.6.3) + mime-types (>= 1.16, < 3) + metaclass (0.0.4) + mime-types (2.4.3) minitest (4.7.5) - minitest-spec-rails (4.7.6) + minitest-spec-rails (4.7.7) minitest (~> 4.7) rails (>= 3.0, < 4.1) - mocha (0.14.0) + mocha (1.1.0) metaclass (~> 0.0.1) mono_logger (1.1.0) - multi_json (1.8.4) - polyglot (0.3.4) - racc (1.4.10) + multi_json (1.10.1) + netrc (0.8.0) + racc (1.4.12) rack (1.5.2) - rack-protection (1.5.2) + rack-protection (1.5.3) rack rack-test (0.6.2) rack (>= 1.0) - rails (4.0.3) - actionmailer (= 4.0.3) - actionpack (= 4.0.3) - activerecord (= 4.0.3) - activesupport (= 4.0.3) + rails (4.0.10) + actionmailer (= 4.0.10) + actionpack (= 4.0.10) + activerecord (= 4.0.10) + activesupport (= 4.0.10) bundler (>= 1.3.0, < 2.0) - railties (= 4.0.3) - sprockets-rails (~> 2.0.0) - railties (4.0.3) - actionpack (= 4.0.3) - activesupport (= 4.0.3) + railties (= 4.0.10) + sprockets-rails (~> 2.0) + railties (4.0.10) + actionpack (= 4.0.10) + activesupport (= 4.0.10) rake (>= 0.8.7) thor (>= 0.18.1, < 2.0) - rake (10.1.1) - rdoc (4.0.1) + rake (10.3.2) + rb-readline (0.5.1) + rdoc (4.1.2) json (~> 1.4) redcard (1.1.0) - redis (3.0.7) - redis-namespace (1.4.1) - redis (~> 3.0.4) + redis (3.1.0) + redis-namespace (1.5.1) + redis (~> 3.0, >= 3.0.4) ref (1.0.5) - rest-client (1.6.7) - mime-types (>= 1.16) + resque-history (1.12.2) + resque + resque-sliders (0.2.3) + resque (>= 1.15.0, < 2.0) + rest-client (1.7.2) + mime-types (>= 1.16, < 3.0) + netrc (~> 0.7) rubinius-coverage (2.0.3) - rubinius-profiler (2.0.0) - rubysl (2.0.15) + rubinius-profiler (2.0.1) + rubysl (2.1.0) rubysl-abbrev (~> 2.0) rubysl-base64 (~> 2.0) rubysl-benchmark (~> 2.0) @@ -163,7 +167,7 @@ GEM rubysl-io-nonblock (~> 2.0) rubysl-io-wait (~> 2.0) rubysl-ipaddr (~> 2.0) - rubysl-irb (~> 2.0) + rubysl-irb (~> 2.1) rubysl-logger (~> 2.0) rubysl-mathn (~> 2.0) rubysl-matrix (~> 2.0) @@ -192,7 +196,6 @@ GEM rubysl-pstore (~> 2.0) rubysl-pty (~> 2.0) rubysl-rational (~> 2.0) - rubysl-readline (~> 2.0) rubysl-resolv (~> 2.0) rubysl-rexml (~> 2.0) rubysl-rinda (~> 2.0) @@ -234,7 +237,7 @@ GEM rubysl-csv (2.0.2) rubysl-english (~> 2.0) rubysl-curses (2.0.1) - rubysl-date (2.0.6) + rubysl-date (2.0.8) rubysl-delegate (2.0.1) rubysl-digest (2.0.3) rubysl-drb (2.0.1) @@ -259,10 +262,10 @@ GEM rubysl-io-nonblock (2.0.0) rubysl-io-wait (2.0.0) rubysl-ipaddr (2.0.0) - rubysl-irb (2.0.4) + rubysl-irb (2.1.0) + rb-readline (~> 0.5) rubysl-e2mmap (~> 2.0) rubysl-mathn (~> 2.0) - rubysl-readline (~> 2.0) rubysl-thread (~> 2.0) rubysl-logger (2.0.0) rubysl-mathn (2.0.0) @@ -287,22 +290,21 @@ GEM rubysl-observer (2.0.0) rubysl-open-uri (2.0.0) rubysl-open3 (2.0.0) - rubysl-openssl (2.0.5) + rubysl-openssl (2.2.1) rubysl-optparse (2.0.1) rubysl-shellwords (~> 2.0) rubysl-ostruct (2.0.4) - rubysl-pathname (2.0.0) - rubysl-prettyprint (2.0.2) + rubysl-pathname (2.1.0) + rubysl-prettyprint (2.0.3) rubysl-prime (2.0.1) rubysl-profile (2.0.0) rubysl-profiler (2.0.1) rubysl-pstore (2.0.0) rubysl-pty (2.0.2) rubysl-rational (2.0.1) - rubysl-readline (2.0.2) - rubysl-resolv (2.0.0) - rubysl-rexml (2.0.2) - rubysl-rinda (2.0.0) + rubysl-resolv (2.1.0) + rubysl-rexml (2.0.3) + rubysl-rinda (2.0.1) rubysl-rss (2.0.0) rubysl-scanf (2.0.0) rubysl-securerandom (2.0.0) @@ -320,7 +322,7 @@ GEM rubysl-thwait (2.0.0) rubysl-time (2.0.3) rubysl-timeout (2.0.0) - rubysl-tmpdir (2.0.0) + rubysl-tmpdir (2.0.1) rubysl-tsort (2.0.1) rubysl-un (2.0.0) rubysl-fileutils (~> 2.0) @@ -332,53 +334,52 @@ GEM rubysl-yaml (2.0.4) rubysl-zlib (2.0.1) sass (3.2.19) - sass-rails (4.0.3) + sass-rails (4.0.4) railties (>= 4.0.0, < 5.0) - sass (~> 3.2.0) - sprockets (~> 2.8, <= 2.11.0) + sass (~> 3.2.2) + sprockets (~> 2.8, < 2.12) sprockets-rails (~> 2.0) - simplecov (0.7.1) + simplecov (0.9.1) + docile (~> 1.1.0) multi_json (~> 1.0) - simplecov-html (~> 0.7.1) - simplecov-html (0.7.1) - sinatra (1.4.4) + simplecov-html (~> 0.8.0) + simplecov-html (0.8.0) + sinatra (1.4.5) rack (~> 1.4) rack-protection (~> 1.4) tilt (~> 1.3, >= 1.3.4) - sprockets (2.11.0) + sprockets (2.11.3) hike (~> 1.2) multi_json (~> 1.0) rack (~> 1.0) tilt (~> 1.1, != 1.3.0) - sprockets-rails (2.0.1) + sprockets-rails (2.2.0) actionpack (>= 3.0) activesupport (>= 3.0) - sprockets (~> 2.8) - sqlite3 (1.3.8) + sprockets (>= 2.8, < 4.0) + sqlite3 (1.3.10) + term-ansicolor (1.3.0) + tins (~> 1.0) therubyracer (0.12.1) libv8 (~> 3.16.14.0) ref therubyrhino (2.0.2) therubyrhino_jar (>= 1.7.3) therubyrhino_jar (1.7.4) - thor (0.18.1) - thread_safe (0.2.0) - atomic (>= 1.1.7, < 2) - thread_safe (0.2.0-java) - atomic (>= 1.1.7, < 2) + thor (0.19.1) + thread_safe (0.3.4) + thread_safe (0.3.4-java) tilt (1.4.1) - treetop (1.4.15) - polyglot - polyglot (>= 0.3.1) + tins (1.3.3) twitter-bootstrap-rails (2.2.8) actionpack (>= 3.1) execjs rails (>= 3.1) railties (>= 3.1) - tzinfo (0.3.38) - uglifier (2.2.0) + tzinfo (0.3.42) + uglifier (2.5.3) execjs (>= 0.3.0) - multi_json (~> 1.0, >= 1.0.2) + json (>= 1.8.0) vegas (0.1.11) rack (>= 1.0.0) @@ -398,6 +399,8 @@ DEPENDENCIES rdoc redcard resque! + resque-history + resque-sliders resque-web! rubinius-coverage rubinius-profiler diff --git a/app/controllers/resque_web/workers_controller.rb b/app/controllers/resque_web/workers_controller.rb index cf18c15..52d58bb 100644 --- a/app/controllers/resque_web/workers_controller.rb +++ b/app/controllers/resque_web/workers_controller.rb @@ -13,6 +13,19 @@ def show end end + #kills all workers on a given host + def destroy + @workers = Resque.workers + @workers.each { |worker| worker.unregister_worker} + redirect_to workers_path + end + + #kills worker by by worker id + def kill_worker + Resque::Worker.find(params[:id]).unregister_worker + redirect_to workers_path + end + private def display_subtabs diff --git a/app/views/resque_web/workers/show.html.erb b/app/views/resque_web/workers/show.html.erb index f1c2a03..3fe9913 100644 --- a/app/views/resque_web/workers/show.html.erb +++ b/app/views/resque_web/workers/show.html.erb @@ -1,12 +1,21 @@

<%= @workers.size %> Workers

The workers listed below are all registered as active on your system.

+ + <%= form_tag(worker_path(params[:id]), :method => :delete, :class => 'remove-queue') do %> + <%= submit_tag "Kill All Workers", :class => 'btn btn-danger', :data => { :confirm => "Are you sure you want to kill all workers on this host?" } %> + <% end %> + + + + + <% @workers.each do |worker| %> @@ -27,7 +36,11 @@ <% else %> Waiting for a job... <% end %> + + + <% end %> <% if @workers.empty? %> diff --git a/app/views/resque_web/working/_working.html.erb b/app/views/resque_web/working/_working.html.erb index afde5ca..5575646 100644 --- a/app/views/resque_web/working/_working.html.erb +++ b/app/views/resque_web/working/_working.html.erb @@ -6,6 +6,7 @@ + <% if worker_jobs.empty? %> @@ -29,6 +30,11 @@ Waiting for a job... <% end %> + + + <% end %>
  Where Queues ProcessingKill Worker?
+ <%= link_to "Kill Worker", kill_worker_path(worker), :method=> :delete, :data => { :confirm => "Are you sure you want to kill #{worker}?"} %>
Where Queue Processing Kill Worker?
+ <%= link_to " Kill Worker", kill_worker_path(worker), :method=> :delete, :data=> {:confirm => "Are you sure you wnat to kill #{worker}"} %> +
diff --git a/config/initializers/resque_plugins.rb b/config/initializers/resque_plugins.rb new file mode 100644 index 0000000..60ac2da --- /dev/null +++ b/config/initializers/resque_plugins.rb @@ -0,0 +1,3 @@ +#Encountered difficulty installing plugnins via gemfile. Tried to add plugins to web-app manually. +require "resque-sliders" +require "resque-history" diff --git a/config/routes.rb b/config/routes.rb index 10c0644..e6e41f6 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -11,10 +11,10 @@ resources :working, :only => [:index] resources :queues, :only => [:index,:show,:destroy], :constraints => {:id => id_pattern} do member do - put 'clear' + put 'clear' end end - resources :workers, :only => [:index,:show], :constraints => {:id => id_pattern} + resources :workers, :only => [:index,:show,:destroy], :constraints => {:id => id_pattern} resources :failures, :only => [:show,:index,:destroy] do member do put 'retry' @@ -29,6 +29,9 @@ get '/stats/:action', :controller => :stats get '/stats/:action/:id', :controller => :stats, :constraints => {:id => id_pattern}, :as => :statistic + #route pass worker id to controller method that unregisteres worker by id + delete '/kill_worker/:id' => "workers#kill_worker", :as => :kill_worker + root :to => 'overview#show' end diff --git a/lib/resque_history/.document b/lib/resque_history/.document new file mode 100755 index 0000000..3d618dd --- /dev/null +++ b/lib/resque_history/.document @@ -0,0 +1,5 @@ +lib/**/*.rb +bin/* +- +features/**/*.feature +LICENSE.txt diff --git a/lib/resque_history/.gitignore b/lib/resque_history/.gitignore new file mode 100755 index 0000000..361607b --- /dev/null +++ b/lib/resque_history/.gitignore @@ -0,0 +1,58 @@ +# rcov generated +coverage + +# rdoc generated +rdoc + +# yard generated +doc +.yardoc + +# bundler +.bundle + +# jeweler generated +pkg + +# Have editor/IDE/OS specific files you need to ignore? Consider using a global gitignore: +# +# * Create a file at ~/.gitignore +# * Include files you want ignored +# * Run: git config --global core.excludesfile ~/.gitignore +# +# After doing this, these files will be ignored in all your git projects, +# saving you from having to 'pollute' every project you touch with them +# +# Not sure what to needs to be ignored for particular editors/OSes? Here's some ideas to get you started. (Remember, remove the leading # of the line) +# +# For MacOS: +# +#.DS_Store + +# For TextMate +#*.tmproj +#tmtags + +# For emacs: +#*~ +#\#* +#.\#* + +# For vim: +#*.swp + +# For redcar: +#.redcar + +# For rubinius: +#*.rbc +.idea/ +*.gem +.rspec + +.ruby-* +.rbenv-* + +spec/redis/redis-test.pid +spec/redis/stdout +spec/redis/dump.rdb diff --git a/lib/resque_history/.travis.yml b/lib/resque_history/.travis.yml new file mode 100755 index 0000000..4fc36de --- /dev/null +++ b/lib/resque_history/.travis.yml @@ -0,0 +1,9 @@ +language: ruby +rvm: + - 1.9.2 + - 1.9.3 + - 2.0.0 + - jruby-18mode # JRuby in 1.8 mode + - jruby-19mode # JRuby in 1.9 mode +services: + - redis-server diff --git a/lib/resque_history/Changelog.md b/lib/resque_history/Changelog.md new file mode 100755 index 0000000..b2d7e1e --- /dev/null +++ b/lib/resque_history/Changelog.md @@ -0,0 +1,45 @@ +Changelog +========= + +## 1.9.3 (Jul 30, 2012) + +Bug fixes + + - fix for yajl parser (@kevintom #10) + - formatting improvements to comply with resque (@kevintom #10) + +## 1.9.1 (Jul 22, 2012) + +Bug fixes + + - using symbolize keys instead of strings for hashes + +## 1.9.0 (May 9, 2012) + +Features: + + - Record failed jobs + +## 1.8.2 (May 7, 2012) + +Features: + + - Record execution time + +## 1.7.0 (April 17, 2012) + +Features: + + - Added button to clear history + +### 1.6.1 (April 16, 2012) + +Bug fixes + + - updated readme and fixed typo in maximum history size variable (@fred #1) + +## 1.6.0 (April 16, 2012) + +Features: + + - Added simple pagination \ No newline at end of file diff --git a/lib/resque_history/Gemfile b/lib/resque_history/Gemfile new file mode 100755 index 0000000..bfa155f --- /dev/null +++ b/lib/resque_history/Gemfile @@ -0,0 +1,16 @@ +source "http://rubygems.org" + +# Specify your gem's dependencies in resque-history.gemspec +# gemspec + +gem "resque" + +group :development, :test do + gem "rake" + gem "bundler" + gem "jeweler" + gem "rspec-rails" + gem "rspec", ">2.12.0" + gem "rack-test" + gem "timecop" +end diff --git a/lib/resque_history/Gemfile.lock b/lib/resque_history/Gemfile.lock new file mode 100755 index 0000000..757026f --- /dev/null +++ b/lib/resque_history/Gemfile.lock @@ -0,0 +1,92 @@ +GEM + remote: http://rubygems.org/ + specs: + addressable (2.3.6) + backports (3.1.1) + builder (3.2.2) + diff-lcs (1.2.5) + faraday (0.8.9) + multipart-post (~> 1.2.0) + git (1.2.8) + github_api (0.10.2) + addressable + faraday (~> 0.8.7) + hashie (>= 1.2) + multi_json (~> 1.4) + nokogiri (~> 1.6.0) + oauth2 + hashie (3.3.1) + highline (1.6.21) + jeweler (2.0.1) + builder + bundler (>= 1.0) + git (>= 1.2.5) + github_api + highline (>= 1.6.15) + nokogiri (>= 1.5.10) + rake + rdoc + json (1.8.1) + jwt (1.0.0) + mini_portile (0.6.0) + multi_json (1.7.1) + multi_xml (0.5.5) + multipart-post (1.2.0) + nokogiri (1.6.3.1) + mini_portile (= 0.6.0) + oauth2 (1.0.0) + faraday (>= 0.8, < 0.10) + jwt (~> 1.0) + multi_json (~> 1.3) + multi_xml (~> 0.5) + rack (~> 1.2) + rack (1.4.5) + rack-test (0.6.2) + rack (>= 1.0) + rake (10.3.2) + rdoc (4.1.1) + json (~> 1.4) + redis (3.0.3) + redis-namespace (1.2.1) + redis (~> 3.0.0) + resque (1.23.1) + multi_json (~> 1.0) + redis-namespace (~> 1.0) + sinatra (>= 0.9.2) + vegas (~> 0.1.2) + rspec (3.1.0) + rspec-core (~> 3.1.0) + rspec-expectations (~> 3.1.0) + rspec-mocks (~> 3.1.0) + rspec-core (3.1.1) + rspec-support (~> 3.1.0) + rspec-expectations (3.1.0) + diff-lcs (>= 1.2.0, < 2.0) + rspec-support (~> 3.1.0) + rspec-mocks (3.1.0) + rspec-support (~> 3.1.0) + rspec-rails (1.3.2) + rack (>= 1.0.0) + rspec (>= 1.3.0) + rspec-support (3.1.0) + sinatra (1.2.9) + backports + rack (~> 1.1, < 1.5) + tilt (>= 1.2.2, < 2.0) + tilt (1.3.6) + timecop (0.6.1) + vegas (0.1.11) + rack (>= 1.0.0) + +PLATFORMS + ruby + +DEPENDENCIES + bundler + jeweler + rack-test + rake + resque + rspec (> 2.12.0) + rspec-rails + timecop diff --git a/lib/resque_history/LICENSE b/lib/resque_history/LICENSE new file mode 100755 index 0000000..ffa5c02 --- /dev/null +++ b/lib/resque_history/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2013 Ilya Katz + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/lib/resque_history/README.md b/lib/resque_history/README.md new file mode 100755 index 0000000..b42fb02 --- /dev/null +++ b/lib/resque_history/README.md @@ -0,0 +1,89 @@ +# Resque History +[![alt build status][1]][2] +[![Dependency Status](http://img.shields.io/gemnasium/ilyakatz/he.svg)](https://gemnasium.com/ilyakatz/resque-history) +[![Code Climate](http://img.shields.io/codeclimate/github/ilyakatz/resque-history.svg)](https://codeclimate.com/github/ilyakatz/resque-history) +[![Gem Version](http://img.shields.io/gem/v/resque-history.svg)](http://badge.fury.io/rb/resque-history) + +[1]: http://img.shields.io/travis/ilyakatz/resque-history.svg +[2]: http://travis-ci.org/#!/ilyakatz/resque-history + + +A [Resque][rq] plugin. Requires Resque + +resque-history adds functionality record recently history of job executions + +Usage / Examples +---------------- + +### Single Job Instance + +```ruby + require 'resque-history' + + class UpdateNetworkGraph + extend Resque::Plugins::History + @queue = :network_graph + + def self.perform(some_id) + do_stuff(some_id) + end + end +``` + + +### Job History + +By default resque-history stores 500 history items on redis, +but if you want to store less items, assign @max_history in the job class. + +```ruby + require 'resque-history' + + class UpdateNetworkGraph + extend Resque::Plugins::History + @queue = :network_graph + @max_history = 50 # max number of histories to be kept + + def self.perform(some_id) + do_stuff(some_id) + end + end +``` + +### 3rd Party classes + +If you want to use resque history with 3rd party resque jobs, +extended the classes that you want to be recorded in history + +```ruby +[ + CarrierWave::Workers::ProcessAsset, + CarrierWave::Workers::StoreAsset, + ActionMailer::DeliveryMethods +].each do |klazz| + klazz.class_eval do + extend Resque::Plugins::History + end +end +``` + +Resque-Web integration +---------------------- + +'History' tab in resque web GUI + +![Resque History GUI](https://img.skitch.com/20120510-x4egbeih39bb2xe82c2mtapmp9.jpg) + + +Install +======= + +Add to your Gemfile + + $ gem "resque-history" + +Add to routes.rb file + + require 'resque-history/server' + +[rq]: http://github.com/defunkt/resque diff --git a/lib/resque_history/Rakefile b/lib/resque_history/Rakefile new file mode 100755 index 0000000..911042e --- /dev/null +++ b/lib/resque_history/Rakefile @@ -0,0 +1,25 @@ +require 'bundler' +Bundler::GemHelper.install_tasks + +require "rspec/core/rake_task" + +desc "Run all examples" +RSpec::Core::RakeTask.new(:spec) + +task :default => :spec + + +begin + require 'jeweler' + Jeweler::Tasks.new do |gem| + gem.name = "resque-history" + gem.summary = %Q{Show history of recently executed jobs} + gem.description = %Q{Show history of recently executed jobs} + gem.email = "ilyakatz@gmail.com" + gem.homepage = "https://github.com/ilyakatz/resque-history" + gem.authors = ["Katzmopolitan"] + end + Jeweler::GemcutterTasks.new +rescue LoadError + puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler" +end \ No newline at end of file diff --git a/lib/resque_history/VERSION b/lib/resque_history/VERSION new file mode 100755 index 0000000..69669de --- /dev/null +++ b/lib/resque_history/VERSION @@ -0,0 +1 @@ +1.12.2 \ No newline at end of file diff --git a/lib/resque_history/lib/resque-history.rb b/lib/resque_history/lib/resque-history.rb new file mode 100755 index 0000000..a32b0c7 --- /dev/null +++ b/lib/resque_history/lib/resque-history.rb @@ -0,0 +1,3 @@ +require 'resque' +require File.expand_path(File.join('resque-history', 'plugins', 'history'), File.dirname(__FILE__)) +require File.expand_path(File.join('resque-history', 'helpers', 'helper'), File.dirname(__FILE__)) \ No newline at end of file diff --git a/lib/resque_history/lib/resque-history/helpers/helper.rb b/lib/resque_history/lib/resque-history/helpers/helper.rb new file mode 100755 index 0000000..fe3e7e0 --- /dev/null +++ b/lib/resque_history/lib/resque-history/helpers/helper.rb @@ -0,0 +1,28 @@ +module Resque + module History + module Helper + + def format_execution(seconds) + if seconds.nil? + "" + elsif seconds < 60 + "#{seconds} secs" + elsif seconds < 60 * 60 + "#{(seconds/60).to_i} minutes" + elsif seconds < 60 * 60 * 24 + "#{(((seconds.to_f/60/60)*100).truncate.to_f)/100} hours" + elsif seconds < 60 * 60 * 24 * 7 + "#{(((seconds.to_f/60/60/24)*100).truncate.to_f)/100} days" + else + "too long" + end + end + + def resque_history_total_jobs + Resque.redis.llen(Resque::Plugins::History::HISTORY_SET_NAME) + end + + end + end + +end diff --git a/lib/resque_history/lib/resque-history/plugins/history.rb b/lib/resque_history/lib/resque-history/plugins/history.rb new file mode 100755 index 0000000..8659988 --- /dev/null +++ b/lib/resque_history/lib/resque-history/plugins/history.rb @@ -0,0 +1,46 @@ +module Resque + module Plugins + module History + + MAX_HISTORY_SIZE = 500 + HISTORY_SET_NAME = "resque_history" + + def maximum_history_size + @max_history ||= MAX_HISTORY_SIZE + end + + def on_failure_history(exception, *args) + Resque.redis.lpush(HISTORY_SET_NAME, {:class => "#{self}", + :time => Time.now.strftime("%Y-%m-%d %H:%M:%S %z"), + :args => args, + :error => exception.message + }.to_json) + + if Resque.redis.llen(HISTORY_SET_NAME) > maximum_history_size + Resque.redis.rpop(HISTORY_SET_NAME) + end + + end + + + def before_perform_history(*args) + @start_time = Time.now + end + + def after_perform_history(*args) + elapsed_seconds = (Time.now - @start_time).to_i + Resque.redis.lpush(HISTORY_SET_NAME, {:class => "#{self}", + :args => args, + :time => Time.now.strftime("%Y-%m-%d %H:%M"), + :execution =>elapsed_seconds + }.to_json) + + if Resque.redis.llen(HISTORY_SET_NAME) > maximum_history_size + Resque.redis.rpop(HISTORY_SET_NAME) + end + + end + + end + end +end diff --git a/lib/resque_history/lib/resque-history/server.rb b/lib/resque_history/lib/resque-history/server.rb new file mode 100755 index 0000000..8f42cf6 --- /dev/null +++ b/lib/resque_history/lib/resque-history/server.rb @@ -0,0 +1,52 @@ +require 'resque' +require 'resque/server' +require 'resque-history' + +# Extends Resque Web Based UI. +# Structure has been borrowed from ResqueScheduler. +module ResqueHistory + module Server + include Resque::History::Helper + + def self.erb_path(filename) + File.join(File.dirname(__FILE__), 'server', 'views', filename) + end + + def self.public_path(filename) + File.join(File.dirname(__FILE__), 'server', 'public', filename) + end + + def self.included(base) + + base.class_eval do + + get '/history' do + erb File.read(ResqueHistory::Server.erb_path('history.erb')) + end + + post "/history/clear" do + Resque.reset_history + redirect u('history') + end + + end + end + + Resque::Server.tabs << 'History' + end + + # Clears all historical jobs + def reset_history + size = Resque.redis.llen(Resque::Plugins::History::HISTORY_SET_NAME) + + size.times do + Resque.redis.lpop(Resque::Plugins::History::HISTORY_SET_NAME) + end + + end +end + +Resque.extend ResqueHistory +Resque::Server.class_eval do + include ResqueHistory::Server +end \ No newline at end of file diff --git a/lib/resque_history/lib/resque-history/server/views/history.erb b/lib/resque_history/lib/resque-history/server/views/history.erb new file mode 100755 index 0000000..ffe5408 --- /dev/null +++ b/lib/resque_history/lib/resque-history/server/views/history.erb @@ -0,0 +1,62 @@ +<% size = resque_history_total_jobs %> +<% start = params[:start].to_i %> +<% history = Resque.redis.lrange(Resque::Plugins::History::HISTORY_SET_NAME, start, start + 20)%> + +

Job history

+ +<% if size > 0 %> +
+ +
+<% end %> + +

Showing <%= start %> to + <% if size > 20 %> + <%= start + 20 %> of <%= size %> + <% else %> + <%= size %> + <% end %>jobs

+ +
+ <%= erb File.read(ResqueHistory::Server.erb_path('navigation.erb')), {}, + :start => params[:start].to_i, :size => size %> + + + + + + + + + <% history.each do |history| %> + <% j = JSON.parse(history, :symbolize_names => true, :symbolize_keys => true) %> + + + + + + + <% end %> +
JobArgumentsTimeExecution
<%= j[:class] %>
<%= j[:args] ? show_args(j[:args]) : '' %>
<%= j[:time] %><%= format_execution(j[:execution]) %>
+ + <%= erb File.read(ResqueHistory::Server.erb_path('navigation.erb')), {}, + :start => params[:start].to_i, :size => size %> +
+ + diff --git a/lib/resque_history/lib/resque-history/server/views/navigation.erb b/lib/resque_history/lib/resque-history/server/views/navigation.erb new file mode 100755 index 0000000..755c810 --- /dev/null +++ b/lib/resque_history/lib/resque-history/server/views/navigation.erb @@ -0,0 +1,20 @@ +<% per_page ||= 20 %> +<%if start - per_page >= 0 || start + per_page <= size%> +

+ <% if start - per_page >= 0 %> + « Previous + <% end %> + + <% (0...(size / per_page.to_f).ceil).each do |page_num| %> + <% if start == page_num * per_page %> + <%= page_num + 1 %> + <% else %> + <%= page_num + 1 %> + <% end %> + <% end %> + + <% if start + per_page <= size %> + Next » + <% end %> +

+<%end%> diff --git a/lib/resque_history/lib/version.rb b/lib/resque_history/lib/version.rb new file mode 100755 index 0000000..8717fb3 --- /dev/null +++ b/lib/resque_history/lib/version.rb @@ -0,0 +1,7 @@ +module Resque + module Plugins + module History + VERSION = "0.0.1" + end + end +end diff --git a/lib/resque_history/resque-history.gemspec b/lib/resque_history/resque-history.gemspec new file mode 100755 index 0000000..c0c62fd --- /dev/null +++ b/lib/resque_history/resque-history.gemspec @@ -0,0 +1,85 @@ +# Generated by jeweler +# DO NOT EDIT THIS FILE DIRECTLY +# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec' +# -*- encoding: utf-8 -*- +# stub: resque-history 1.12.2 ruby lib + +Gem::Specification.new do |s| + s.name = "resque-history" + s.version = "1.12.2" + + s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib"] + s.authors = ["Katzmopolitan"] + s.date = "2014-09-08" + s.description = "Show history of recently executed jobs" + s.email = "ilyakatz@gmail.com" + s.extra_rdoc_files = [ + "LICENSE", + "README.md" + ] + s.files = [ + ".document", + ".travis.yml", + "Changelog.md", + "Gemfile", + "Gemfile.lock", + "LICENSE", + "README.md", + "Rakefile", + "VERSION", + "lib/resque-history.rb", + "lib/resque-history/helpers/helper.rb", + "lib/resque-history/plugins/history.rb", + "lib/resque-history/server.rb", + "lib/resque-history/server/views/history.erb", + "lib/resque-history/server/views/navigation.erb", + "lib/version.rb", + "resque-history.gemspec", + "spec/redis-test.conf", + "spec/redis/.keep", + "spec/resque-history/plugins/history_spec.rb", + "spec/resque-history/resque_history_helper_spec.rb", + "spec/resque-web_spec.rb", + "spec/spec_helper.rb", + "test/helper.rb", + "test/test_resque-history.rb" + ] + s.homepage = "https://github.com/ilyakatz/resque-history" + s.rubygems_version = "2.2.0" + s.summary = "Show history of recently executed jobs" + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q, [">= 0"]) + s.add_development_dependency(%q, [">= 0"]) + s.add_development_dependency(%q, [">= 0"]) + s.add_development_dependency(%q, [">= 0"]) + s.add_development_dependency(%q, [">= 0"]) + s.add_development_dependency(%q, ["> 2.12.0"]) + s.add_development_dependency(%q, [">= 0"]) + s.add_development_dependency(%q, [">= 0"]) + else + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, ["> 2.12.0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + end + else + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, ["> 2.12.0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + end +end + diff --git a/lib/resque_history/spec/redis-test.conf b/lib/resque_history/spec/redis-test.conf new file mode 100755 index 0000000..f97eeec --- /dev/null +++ b/lib/resque_history/spec/redis-test.conf @@ -0,0 +1,16 @@ +daemonize yes +pidfile redis-test.pid +port 9736 +timeout 300 + +save 900 1 +save 300 10 +save 60 10000 + +dbfilename dump.rdb + +dir ./spec/redis + +loglevel debug +logfile stdout +databases 1 diff --git a/lib/resque_history/spec/redis/.keep b/lib/resque_history/spec/redis/.keep new file mode 100755 index 0000000..e69de29 diff --git a/lib/resque_history/spec/resque-history/plugins/history_spec.rb b/lib/resque_history/spec/resque-history/plugins/history_spec.rb new file mode 100755 index 0000000..e57314c --- /dev/null +++ b/lib/resque_history/spec/resque-history/plugins/history_spec.rb @@ -0,0 +1,217 @@ +require 'spec_helper' +require 'timecop' + +class HistoryJob + extend Resque::Plugins::History + @queue = :test + + def self.perform(*args) + end +end + +class MaxHistoryJob + extend Resque::Plugins::History + @queue = :test2 + @max_history = 15 + + def self.perform(*args) + end +end + +describe Resque::Plugins::History do + + it "should be compliance with Resqu::Plugin document" do + expect { Resque::Plugin.lint(Resque::Plugins::History) }.to_not raise_error + end + + it "should store history of the job" do + Timecop.freeze(Time.local(2000, 9, 1, 12, 0, 0)) do + Resque.enqueue(HistoryJob, 12) + + job = Resque.reserve('test') + job.perform + + arr = Resque.redis.lrange(Resque::Plugins::History::HISTORY_SET_NAME, 0, -1) + + arr.count.should == 1 + expected = { + "class" => "HistoryJob", "args" => [12], + "time" => "2000-09-01 12:00", "execution" => 0 + } + expect(JSON.parse(arr.first)).to eq(expected) + end + end + + it "should use the max_history size of the history list" do + expect(MaxHistoryJob.maximum_history_size).to eq 15 + end + + it "should set the default size of the history list to be 500" do + HistoryJob.maximum_history_size.should == 500 + end + + it "should truncate the maximum" do + + expect(HistoryJob).to receive(:maximum_history_size).at_least(:once).and_return(3) + + Resque.enqueue(HistoryJob, 15) + Resque.enqueue(HistoryJob, 13) + Resque.enqueue(HistoryJob, 12) + Resque.enqueue(HistoryJob, 11) + + Timecop.freeze(Time.local(2000, 9, 1, 12, 0, 0)) do + job = Resque.reserve('test') + job.perform + job = Resque.reserve('test') + job.perform + job = Resque.reserve('test') + job.perform + job = Resque.reserve('test') + job.perform + + arr = Resque.redis.lrange(Resque::Plugins::History::HISTORY_SET_NAME, 0, -1) + + arr.count.should == 3 + + JSON.parse(arr[0]).should == {"class"=>"HistoryJob", "args"=>[11], "time"=>"2000-09-01 12:00", "execution"=>0} + JSON.parse(arr[1]).should == {"class"=>"HistoryJob", "args"=>[12], "time"=>"2000-09-01 12:00", "execution"=>0} + JSON.parse(arr[2]).should == {"class"=>"HistoryJob", "args"=>[13], "time"=>"2000-09-01 12:00", "execution"=>0} + + end + + end + + it "should allow to remove history" do + + Resque.enqueue(HistoryJob, 15) + Resque.enqueue(HistoryJob, 13) + + job = Resque.reserve('test') + job.perform + job = Resque.reserve('test') + job.perform + + arr = Resque.redis.lrange(Resque::Plugins::History::HISTORY_SET_NAME, 0, -1) + + arr.count.should == 2 + + Resque.reset_history + + arr = Resque.redis.lrange(Resque::Plugins::History::HISTORY_SET_NAME, 0, -1) + + arr.count.should == 0 + + end + + describe "record execution time" do + + it "should record execution time" do + + Resque.enqueue(SlowHistoryJob, 10) + + Timecop.freeze(Time.local(2000, 9, 1, 12, 0, 0)) do + job = Resque.reserve('test') + job.perform + end + + arr = Resque.redis.lrange(Resque::Plugins::History::HISTORY_SET_NAME, 0, -1) + + arr.count.should == 1 + JSON.parse(arr[0]).should == {"class"=>"SlowHistoryJob", "args"=>[10], "time"=>"2000-09-01 12:10", "execution"=>600} + + end + + it "should not confuse different job times" do + + Resque.enqueue(SlowHistoryJob, 10) + Resque.enqueue(SlowHistoryJob, 5) + + Timecop.freeze(Time.local(2000, 9, 1, 12, 0, 0)) do + job = Resque.reserve('test') + job.perform + + job = Resque.reserve('test') + job.perform + + end + + arr = Resque.redis.lrange(Resque::Plugins::History::HISTORY_SET_NAME, 0, -1) + + arr.count.should == 2 + + JSON.parse(arr[0]).should == {"class"=>"SlowHistoryJob", "args"=>[5], "time"=>"2000-09-01 12:15", "execution"=>300} + JSON.parse(arr[1]).should == {"class"=>"SlowHistoryJob", "args"=>[10], "time"=>"2000-09-01 12:10", "execution"=>600} + + end + + it "should record times in the order of completion not in order of starting" do + + #start the longer job first but it should finish last + Resque.enqueue(SleepyHistoryJob, 3) + Resque.enqueue(SleepyHistoryJob, 1) + + job = Resque.reserve('test') + job.perform + + job = Resque.reserve('test') + job.perform + + arr = Resque.redis.lrange(Resque::Plugins::History::HISTORY_SET_NAME, 0, -1) + + JSON.parse(arr.first)["class"].should =="SleepyHistoryJob" + JSON.parse(arr.first)["args"].should ==[1] + JSON.parse(arr.first)["execution"].should ==1 + + JSON.parse(arr.last)["class"].should =="SleepyHistoryJob" + JSON.parse(arr.last)["args"].should ==[3] + JSON.parse(arr.last)["execution"].should ==3 + + end + + it "should record failed jobs" do + + Resque.enqueue(ExceptionJob,"nothing") + + job = Resque.reserve('test') + + lambda { job.perform }.should raise_exception + arr = Resque.redis.lrange(Resque::Plugins::History::HISTORY_SET_NAME, 0, -1) + + arr.count.should == 1 + + JSON.parse(arr.first)["class"].should =="ExceptionJob" + JSON.parse(arr.first)["args"].should == ["nothing"] + JSON.parse(arr.first)["execution"].should == nil + JSON.parse(arr.first)["error"].should == "I'm an error" + end + + end + +end + +class SlowHistoryJob + extend Resque::Plugins::History + @queue = :test + + def self.perform(time_in_minutes) + Timecop.travel(Time.now + 60*time_in_minutes) + end +end + +class SleepyHistoryJob + extend Resque::Plugins::History + @queue = :test + + def self.perform(time_in_seconds) + sleep(time_in_seconds) + end +end + +class ExceptionJob + extend Resque::Plugins::History + @queue = :test + + def self.perform(arg) + raise StandardError, "I'm an error" + end +end diff --git a/lib/resque_history/spec/resque-history/resque_history_helper_spec.rb b/lib/resque_history/spec/resque-history/resque_history_helper_spec.rb new file mode 100755 index 0000000..e6d7dad --- /dev/null +++ b/lib/resque_history/spec/resque-history/resque_history_helper_spec.rb @@ -0,0 +1,36 @@ +require 'spec_helper' +require 'resque-history/helpers/helper' + +describe Resque::History::Helper do + + include Resque::History::Helper + + it "should show correct number of seconds" do + format_execution(40).should == "40 secs" + end + + it "should show correct number of minutes" do + format_execution(600).should == "10 minutes" + format_execution(659).should == "10 minutes" + format_execution(660).should == "11 minutes" + end + + it "should show correct number of hours" do + format_execution(3600).should == "1.0 hours" + format_execution(7200).should == "2.0 hours" + format_execution(5400).should == "1.5 hours" + format_execution(5403).should == "1.5 hours" + format_execution(5703).should == "1.58 hours" + end + + it "should show correct number of days" do + format_execution(86400).should == "1.0 days" + format_execution(129600).should == "1.5 days" + format_execution(518400).should == "6.0 days" + end + + it "should show that job is too long" do + format_execution(604800).should == "too long" + end + +end \ No newline at end of file diff --git a/lib/resque_history/spec/resque-web_spec.rb b/lib/resque_history/spec/resque-web_spec.rb new file mode 100755 index 0000000..74ba02b --- /dev/null +++ b/lib/resque_history/spec/resque-web_spec.rb @@ -0,0 +1,57 @@ +require 'spec_helper' +require 'timecop' + + +describe ResqueHistory::Server do + include Rack::Test::Methods + + def app + @app ||= Resque::Server.new + end + + let :queues do + Resque.redis.sadd(:queues, "queue1") + Resque.redis.sadd(:queues, "queue2") + Resque.redis.sadd(:queues, "queue3") + end + + before do + queues + Resque.enqueue(HistoryJob, 12) + job = Resque.reserve('test') + Timecop.freeze(2008, 10, 5, 10, 12) do + job.perform + end + end + + it "should respond to /history" do + get '/history' + last_response.should be_ok + last_response.body.should include("HistoryJob") + last_response.body.should include("0 secs") + last_response.body.should include("2008-10-05 10:12") + end + + it "should respond to remove history" do + get '/history' + last_response.body.should include("HistoryJob") + post "/history/clear" + last_response.should be_redirect + get '/history' + last_response.body.should_not include("HistoryJob") + end + + it "should not show full message if there is small number of jobs in the history" do + get '/history' + last_response.body.should =~ /Showing 0 to.*jobs/m + end + +end + +class HistoryJob + extend Resque::Plugins::History + @queue = :test + + def self.perform(*args) + end +end diff --git a/lib/resque_history/spec/spec_helper.rb b/lib/resque_history/spec/spec_helper.rb new file mode 100755 index 0000000..fb8965d --- /dev/null +++ b/lib/resque_history/spec/spec_helper.rb @@ -0,0 +1,64 @@ +require 'rack/test' +if !system("which redis-server") + puts '', "** can't find `redis-server` in your path" + abort '' +end + +#begin +# require 'simplecov' +# SimpleCov.start do +# add_filter '/spec/' +# end +# SimpleCov.coverage_dir 'coverage' +#rescue LoadError +# ignore simplecov in ruby < 1.9 +#end + +#begin +# require 'bundler' +# Bundler.setup +# Bundler.require(:default, :development) +#rescue LoadError +# puts 'Bundler is not installed, you need to gem install it in order to run the specs.' +# exit 1 +#end + +# Requires supporting files with custom matchers and macros, etc, +# in ./support/ and its subdirectories. +Dir[File.expand_path('support/**/*.rb', File.dirname(__FILE__))].each { |f| require f } + +# Requires lib. +Dir[File.expand_path('../lib/**/*.rb', File.dirname(__FILE__))].each { |f| require f } + +RSpec.configure do |config| + # == Mock Framework + # + # If you prefer to use mocha, flexmock or RR, uncomment the appropriate line: + # + # config.mock_with :mocha + # config.mock_with :flexmock + # config.mock_with :rr + config.mock_with :rspec + + config.before(:suite) do + puts "Starting redis for testing at localhost:9736..." + `redis-server #{File.dirname(File.expand_path(__FILE__))}/redis-test.conf` + pid = '' + while pid.empty? do + pid = `cat #{File.dirname(File.expand_path(__FILE__))}/redis/redis-test.pid` + end + puts "redis pid is #{pid}" + Resque.redis = '127.0.0.1:9736' + end + + config.before(:each) do + Resque.redis.flushall + end + + config.after(:suite) do + pid = `cat #{File.dirname(File.expand_path(__FILE__))}/redis/redis-test.pid` + puts "Killing test redis server (pid: #{pid})..." + Process.kill("KILL", pid.to_i) + `rm -f #{File.dirname(File.expand_path(__FILE__))}/dump.rdb` + end +end diff --git a/lib/resque_history/test/helper.rb b/lib/resque_history/test/helper.rb new file mode 100755 index 0000000..722901e --- /dev/null +++ b/lib/resque_history/test/helper.rb @@ -0,0 +1,18 @@ +require 'rubygems' +require 'bundler' +begin + Bundler.setup(:default, :development) +rescue Bundler::BundlerError => e + $stderr.puts e.message + $stderr.puts "Run `bundle install` to install missing gems" + exit e.status_code +end +require 'test/unit' +require 'shoulda' + +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib')) +$LOAD_PATH.unshift(File.dirname(__FILE__)) +require 'resque-history' + +class Test::Unit::TestCase +end diff --git a/lib/resque_history/test/test_resque-history.rb b/lib/resque_history/test/test_resque-history.rb new file mode 100755 index 0000000..8eb8d20 --- /dev/null +++ b/lib/resque_history/test/test_resque-history.rb @@ -0,0 +1,7 @@ +require 'helper' + +class TestResqueHistory < Test::Unit::TestCase + should "probably rename this file and start testing for real" do + flunk "hey buddy, you should probably rename this file and start testing for real" + end +end diff --git a/lib/resque_sliders/.gitignore b/lib/resque_sliders/.gitignore new file mode 100755 index 0000000..a936280 --- /dev/null +++ b/lib/resque_sliders/.gitignore @@ -0,0 +1,7 @@ +.rvmrc +*.swp +*.log +pkg/ +Gemfile.lock +.DS_Store +.ruby-* diff --git a/lib/resque_sliders/.travis.yml b/lib/resque_sliders/.travis.yml new file mode 100755 index 0000000..9130df3 --- /dev/null +++ b/lib/resque_sliders/.travis.yml @@ -0,0 +1,8 @@ +language: ruby +rvm: + - 1.9.3 + - ree + +branches: + only: + - master diff --git a/lib/resque_sliders/Gemfile b/lib/resque_sliders/Gemfile new file mode 100755 index 0000000..3230950 --- /dev/null +++ b/lib/resque_sliders/Gemfile @@ -0,0 +1,15 @@ +source "https://rubygems.org" + +gemspec + +gem 'resque', ['>= 1.15.0', '< 2.0'] + +group :development do + gem 'shotgun' + gem 'json' + gem 'rake' +end + +group :test do + gem 'minitest' +end diff --git a/lib/resque_sliders/MIT-LICENSE b/lib/resque_sliders/MIT-LICENSE new file mode 100755 index 0000000..63505ce --- /dev/null +++ b/lib/resque_sliders/MIT-LICENSE @@ -0,0 +1,20 @@ +Copyright (c) Kevin Mullin + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/lib/resque_sliders/README.md b/lib/resque_sliders/README.md new file mode 100755 index 0000000..c74be5c --- /dev/null +++ b/lib/resque_sliders/README.md @@ -0,0 +1,135 @@ +Resque Sliders [![Build Status](https://secure.travis-ci.org/kmullin/resque-sliders.png)](http://travis-ci.org/kmullin/resque-sliders) +============== + +[github.com/kmullin/resque-sliders](https://github.com/kmullin/resque-sliders) + + +Description +----------- + +ResqueSliders is a [Resque](https://github.com/defunkt/resque) plugin which allows you +to control Resque workers from the Web-UI. + +From the Resque-Web UI, you can: + +* Start workers with any queue, or combination of queues on any host, and specify how many of each should be running +* Pause / Stop / Restart ALL running workers + +ResqueSliders comes in two parts: + +* `KEWatcher`: A daemon that runs on any machine that needs to run Resque workers, watches over the workers and controls which ones are running +* `Resque-Web Plugin`: A bunch of slider bars, with text-input box to specify what queues to run on the workers + + +Installation +------------ + +Install as a gem: + + $ gem install resque-sliders + +### KEWatcher + +This is the daemon component that runs on any host that you want to run Resque workers on. The daemon's job is to manage **how many** Resque workers should be running, and **what** they should be running. It also provides an easy way to stop all workers during maintenance or deploys. + +When the daemon first runs, it will register itself, by hostname with Redis: + +* Adds a few persistent settings to the hash key `resque:plugins:resque-sliders:host_configs` (max_children, current_children) +* Gets any queues that need to be running on the host by looking at `resque:plugins:resque-sliders:` + `hostname` + +``` +Usage: kewatcher [options] + +Options: + -c, --config CONFIG Resque Config (Yaml) + -r, --rakefile RAKEFILE Rakefile location + -p, --pidfile PIDFILE PID File location + -f, --force FORCE KILL ANY OTHER RUNNING KEWATCHERS + -v, --verbose Verbosity (Can be specified more than once, -vv) + -m, --max MAX Max Children (default: 10) + -w, --wait WAIT_TIME Time (in seconds) to wait for worker to die before sending TERM signal (default: 20 seconds) + -t, --time MAX_TIME Max Time (in seconds) to wait for worker to die before sending KILL (-9) signal (FORCE QUIT) (default: 60) + NOTE: With Resque >= 1.22.0 force quit is handled for you so by default this is the same as: + RESQUE_TERM_TIMEOUT=40 or the difference of MAX_TIME and WAIT_TIME + more info: http://hone.heroku.com/resque/2012/08/21/resque-signals.html + -a, --async Do NOT wait for Resque workers to die completely before spawning new workers (default: false) + -V, --version Prints Version +``` + +#### Important Options + +``` + -m|--max MAX (Max Children): Maximum number of workers to run on host (default: 10) + -w|--wait WAIT_TIME (Wait Time): How long to wait before sending TERM to zombies (default: 20 seconds) + -t|--time TIME (Total Time): How long to wait before sending KILL to zombies (default: 60 seconds) + NOTE: Resque >= 1.22.0 includes signal handling of its own to force quit, so we use it if its there, and override with our own timeout here + -a|--async (Async): Should we spawn new workers before old ones have fully terminated (default: false) + -r|--rakefile RAKEFILE (Rakefile): Pass along a rakefile to use when calling rake ... resque:work - shouldn't be needed if run from project directory + -f|--force (Force): Force any currently running KEWatcher processes to quit, waiting for it to do so, and starting in its place + RAILS_ENV: If you're using rails, you need to set your RAILS_ENV variable +``` + +#### Controlling the Daemon + +Once the daemon is running on each host that is going to run Resque workers, you'll need to tell them which queues to run. + +#### Signals + +KEWatcher supports all the [same signals as Resque](https://github.com/defunkt/resque#signals): + +* `TERM` / `INT` / `QUIT` - Shutdown. Gracefully kill all child Resque workers, and wait for them to finish before exiting +* `HUP` - Restart all Resque workers by gracefully killing them, and starting new ones in their place +* `USR1` - Stop all Resque workers, and don't start any more +* `USR2` - Pause spawning of new queues, but leave current ones running +* `CONT` - Unpause. Continue spawning/managing child Resque workers + +The queue configuration is done via Resque-Web interface + +#### Resque-Web + +See below for screenshots + +Buttons: + +* `Play` / `Pause` - Start or Pause +* `Stop` - Stop all workers +* `Reload` - Sends HUP signal to running KEWatcher + + +### Resque-Web Integration + +**Main Screen:** showing 3 hosts, and showing that one of the nodes is not running KEWatcher +![Screen 1](https://github.com/kmullin/resque-sliders/raw/master/misc/resque-sliders_main-view.png) + +**Host Screen:** showing different `QUEUE` combinations (comma separated) and slider bars indicating how many of each of them should run +![Screen 2](https://github.com/kmullin/resque-sliders/raw/master/misc/resque-sliders_host-view.png) + +To enable the Resque-Web Integration you'll need to load ResqueSliders to enable the Sliders tab. Just add: + +```ruby +require 'resque-sliders' +``` +to a file, like resque-web_init.rb, and run resque-web: + + resque-web resque-web_init.rb + + +Works on +-------- + +`resque-sliders` has been tested on the following platforms: + +#### Ruby + +* 1.9.3 +* 1.8.7 (ree) +* probabaly more... + +Contributing +------------ + +Want to fix a bug? See a new feature? + +1. [Fork](https://github.com/kmullin/resque-sliders/fork_select) me +2. Create a new branch +3. Open a [Pull Request](https://github.com/kmullin/resque-sliders/pull/new) diff --git a/lib/resque_sliders/Rakefile b/lib/resque_sliders/Rakefile new file mode 100755 index 0000000..77e17f5 --- /dev/null +++ b/lib/resque_sliders/Rakefile @@ -0,0 +1,41 @@ +$LOAD_PATH.unshift 'helpers' +$LOAD_PATH.unshift 'lib' +# +# Setup +# + + +require 'bundler/gem_tasks' +require 'resque/tasks' +require 'resque_job' + +def command?(command) + system("type #{command} > /dev/null 2>&1") +end + + +# +# Tests +# + +task :default => :test + +desc "Run the test suite" +task :test do + rg = command?(:rg) + Dir['test/**/*_test.rb'].each do |f| + rg ? sh("rg #{f}") : ruby(f) + end +end + +desc "Bump version" +task :git_tag_version do + require 'resque-sliders/version' + git_tags = `git tag -l`.split.map { |x| x.gsub(/v/, '') } + version = Resque::Plugins::ResqueSliders::Version + commit_sha = `git log -1 HEAD|head -n1|awk '{print $2}'` + unless git_tags.include?(version) + (puts version, commit_sha; `git tag v#{version} #{commit_sha}`) + `rake build` + end +end diff --git a/lib/resque_sliders/bin/kewatcher b/lib/resque_sliders/bin/kewatcher new file mode 100755 index 0000000..b766189 --- /dev/null +++ b/lib/resque_sliders/bin/kewatcher @@ -0,0 +1,86 @@ +#!/usr/bin/env ruby + +$LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + '/../lib') + +require 'rubygems' +require 'yaml' +require 'optparse' +require 'resque-sliders/kewatcher' +require 'resque-sliders/version' + +options = { + :verbosity => 0, + :max_children => 10 +} + +OptionParser.new do |opt| + opt.banner = "Usage: #{File.basename($0)} [options]" + opt.version = Resque::Plugins::ResqueSliders::Version + + opt.separator "" + opt.separator "Options:" + + opt.on("-c", "--config CONFIG", "Resque Config (Yaml)") do |config| + options[:config] = YAML.load_file(File.expand_path(config)) rescue nil + options[:config] ||= config + end + + opt.on("-r", "--rakefile RAKEFILE", "Rakefile location") do |rakefile| + options[:rakefile] = rakefile + end + + opt.on("-p", "--pidfile PIDFILE", "PID File location") do |pidfile| + options[:pidfile] = pidfile + end + + opt.on("-f", "--force", "FORCE KILL ANY OTHER RUNNING KEWATCHERS") do + options[:force] = true + end + + opt.on("-v", "--verbose", "Verbosity (Can be specified more than once, -vv)") do + options[:verbosity] += 1 + end + + opt.on("-m", "--max MAX", Integer, "Max Children (default: 10)") do |max| + options[:max_children] = max + end + + opt.on("-w", "--wait WAIT_TIME", Float, "Time (in seconds) to wait for worker to die before sending TERM signal (default: 20 seconds)") do |wait| + options[:zombie_term_wait] = wait + end + + opt.on("-t", "--time MAX_TIME", Float, + "Max Time (in seconds) to wait for worker to die before sending KILL (-9) signal (FORCE QUIT) (default: 60)", + "NOTE: With Resque >= 1.22.0 force quit is handled for you so by default this is the same as:", + " RESQUE_TERM_TIMEOUT=40 or the difference of MAX_TIME and WAIT_TIME", + " more info: http://hone.heroku.com/resque/2012/08/21/resque-signals.html") do |wait| + options[:zombie_kill_wait] = wait + end + + opt.on("-a", "--async", "Do NOT wait for Resque workers to die completely before spawning new workers (default: false)") do + options[:async] = true + end + + opt.on("-V", "--version", "Prints Version") do + puts opt.version + exit + end + +end.parse! + +begin + options[:config] = case options[:config] + when Hash + options[:config][ENV['RAILS_ENV'] || 'development'] + when String + options[:config] + end +rescue Object => e + puts e + exit 1 +end + +options[:config] ||= 'localhost:6379' + +kewatcher = Resque::Plugins::ResqueSliders::KEWatcher.new(options) +kewatcher.run! diff --git a/lib/resque_sliders/config/config_example.yml b/lib/resque_sliders/config/config_example.yml new file mode 100755 index 0000000..0d602d8 --- /dev/null +++ b/lib/resque_sliders/config/config_example.yml @@ -0,0 +1,11 @@ +development: + localhost:6379 + +test: + localhost:6379 + +staging: + localhost:6379 + +production: + 192.168.0.1:6379 diff --git a/lib/resque_sliders/helpers/resque_init.rb b/lib/resque_sliders/helpers/resque_init.rb new file mode 100755 index 0000000..72715ac --- /dev/null +++ b/lib/resque_sliders/helpers/resque_init.rb @@ -0,0 +1,8 @@ +require 'resque' + +# Include resque-sliders +if RUBY_VERSION > '1.8.7' + require_relative '../lib/resque-sliders' +else + require File.join(File.dirname(__FILE__), '../lib/resque-sliders') +end diff --git a/lib/resque_sliders/helpers/resque_job.rb b/lib/resque_sliders/helpers/resque_job.rb new file mode 100755 index 0000000..c4ec5f9 --- /dev/null +++ b/lib/resque_sliders/helpers/resque_job.rb @@ -0,0 +1,33 @@ +# test job class for resque + +module Jobs + class Stuff + @queue = :stuff + + def self.perform(stuff=rand(30)) + begin + sleep(stuff) + rescue Resque::TermException + sleep(stuff) + end + end + + + end + + class Things < Stuff + @queue = :things + end + + class Email < Stuff + @queue = :email + end + + class Support < Stuff + @queue = :support + end + + class Notification < Stuff + @queue = :notification + end +end diff --git a/lib/resque_sliders/helpers/resque_run.rb b/lib/resque_sliders/helpers/resque_run.rb new file mode 100755 index 0000000..72da1af --- /dev/null +++ b/lib/resque_sliders/helpers/resque_run.rb @@ -0,0 +1,12 @@ +#!/usr/bin/env ruby + +require 'rubygems' +require 'resque' + +require File.expand_path(File.dirname(__FILE__) + "/resque_job") + +Resque.enqueue(Jobs::Stuff, rand(1000)) +Resque.enqueue(Jobs::Things, 3000) +Resque.enqueue(Jobs::Support, rand(1000)) +Resque.enqueue(Jobs::Email, rand(1000)) +Resque.enqueue(Jobs::Notification, rand(1000)) diff --git a/lib/resque_sliders/lib/resque-sliders.rb b/lib/resque_sliders/lib/resque-sliders.rb new file mode 100755 index 0000000..ce4523e --- /dev/null +++ b/lib/resque_sliders/lib/resque-sliders.rb @@ -0,0 +1,9 @@ +$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__) + '/../lib')) + +require 'resque' +require 'resque/server' + +require 'resque-sliders/helpers' +require 'resque-sliders/commander' +require 'resque-sliders/server' +require 'resque-sliders/version' diff --git a/lib/resque_sliders/lib/resque-sliders/commander.rb b/lib/resque_sliders/lib/resque-sliders/commander.rb new file mode 100755 index 0000000..015ff99 --- /dev/null +++ b/lib/resque_sliders/lib/resque-sliders/commander.rb @@ -0,0 +1,84 @@ +module Resque + module Plugins + module ResqueSliders + class Commander + + include Helpers + + # Hosts that have config data (queues and values), but the host is not running the daemon. + attr_reader :stale_hosts + + def initialize + @host_status = redis_get_hash(host_config_key) + @stale_hosts = Resque.redis.smembers(known_hosts_key) - hosts + end + + # Return Array of currently online hosts + def hosts + Set.new.tap do |l| + @host_status.keys.each do |x| + x = x.split(':') + l << x.first unless %w(reload pause stop).include?(x.last) + end + end.to_a.sort + end + + # Array of all hosts (current + stale) + def all_hosts + (hosts + stale_hosts).sort + end + + # Remove all keys for a host (clean) + def remove_all_host_keys(hostname) + # expensive process O(N) + keys_to_delete = Resque.redis.keys("#{key_prefix}:*").select { |k| name = k.split(':').last; hostname == name } + # look at config hash, remove fields if relate to this hostname + fields_to_delete = redis_get_hash(host_config_key).keys.select { |k| name = k.split(':').first; hostname == name } + # do delete + Resque.redis.del(keys_to_delete) unless keys_to_delete.empty? + redis_del_hash(host_config_key, fields_to_delete) unless fields_to_delete.empty? + del_from_known_hosts(hostname) + end + + # Return current children count or nil if Host hasn't registered itself. + def current_children(host) + @host_status["#{host}:current_children"].to_i if max_children(host) + end + + # Return max children count or nil if Host hasn't registered itself. + def max_children(host) + max = @host_status["#{host}:max_children"].to_i + max == 0 ? nil : max # if Max isn't set its not running + end + + # Override max_children on host (Dangerous!) + def max_children!(host, count) + @hostname = host + register_setting('max_children', count) + end + + # Return Array of queues on host + def queues_on(host) + queue_values(host).keys if all_hosts.include?(host) + end + + # Changes queues to quantiy for host. + # Returns boolean. + def change(host, queue, quantity) + # queue is sanitized by: + # replacing punctuation with spaces, strip end spaces, split on remaining whitespace, and join again on comma. + queue2 = queue.gsub(/['":]/, '').strip.gsub(/\s+/, ',').split(/, */).reject { |x| x.nil? or x.empty? }.join(',') + raise 'Queue Different' unless queue == queue2 + redis_set_hash("#{key_prefix}:#{host}", queue2, quantity) unless queue2.empty? + end + + # Deletes queue for host. + # Returns boolean. + def delete(host, queue) + redis_del_hash("#{key_prefix}:#{host}", queue) + end + + end + end + end +end diff --git a/lib/resque_sliders/lib/resque-sliders/helpers.rb b/lib/resque_sliders/lib/resque-sliders/helpers.rb new file mode 100755 index 0000000..e75f4f7 --- /dev/null +++ b/lib/resque_sliders/lib/resque-sliders/helpers.rb @@ -0,0 +1,104 @@ +module Resque + module Plugins + module ResqueSliders + module Helpers + + # prefix to all keys our plugin uses in redis + def key_prefix + "plugins:resque-sliders" + end + + # we store everything in this hash + def host_config_key + "#{key_prefix}:host_configs" + end + + # used to keep track of hosts we know about + def known_hosts_key + "#{key_prefix}:known_hosts" + end + + def add_to_known_hosts(hostname) + # add a hostname to the hosts set + Resque.redis.sadd(known_hosts_key, hostname) + end + + def del_from_known_hosts(hostname) + Resque.redis.srem(known_hosts_key, hostname) + end + + def redis_get_hash(key) + Resque.redis.hgetall(key) + end + + def redis_get_hash_field(key, field) + Resque.redis.hget(key, field) + end + + def redis_set_hash(key, field, fvalue) + Resque.redis.hset(key, field, fvalue) == 1 + end + + def redis_del_hash(key, field) + Resque.redis.hdel(key, field) == 1 + end + + # Return Hash: { queue => # } + def queue_values(host) + redis_get_hash("#{key_prefix}:#{host}") + end + + def register_setting(setting, value) + redis_set_hash(host_config_key, "#{@hostname}:#{setting}", value) + end + + def unregister_setting(setting) + redis_del_hash(host_config_key, "#{@hostname}:#{setting}") + end + + # Signal Checking + + # Gets signal field in redis config_key for this host. Don't call directly + def check_signal(host) + sig = caller[0][/`([^']*)'/, 1].gsub('?', '') + raise 'Dont call me that' unless %w(reload pause stop).include?(sig) + if @hostname + # if instance variable set from running daemon, make a freshy + redis_get_hash_field(host_config_key, "#{@hostname}:#{sig}").to_i == 1 + else + # otherwise cache call in a Hash + @host_signal_map ||= {} + @host_signal_map[host] ||= {} + unless @host_signal_map[host].has_key?(sig) + @host_signal_map[host] = {sig => redis_get_hash_field(host_config_key, "#{host}:#{sig}").to_i == 1}.update(@host_signal_map[host]) + end + @host_signal_map[host][sig] + end + end + + def reload?(host) + check_signal(host) + end + + def pause?(host) + check_signal(host) + end + + def stop?(host) + check_signal(host) + end + + # Set signal key given signal, host + def set_signal_flag(sig, host=@hostname) + @hostname ||= host + if sig == 'play' + %w(pause stop).each { |x| unregister_setting(x) } + else + register_setting(sig, 1) + end + end + + end + end + end +end diff --git a/lib/resque_sliders/lib/resque-sliders/kewatcher.rb b/lib/resque_sliders/lib/resque-sliders/kewatcher.rb new file mode 100755 index 0000000..89841da --- /dev/null +++ b/lib/resque_sliders/lib/resque-sliders/kewatcher.rb @@ -0,0 +1,440 @@ +require 'resque' +require 'timeout' +require 'fileutils' + +require 'resque-sliders/helpers' + +module Resque + module Plugins + module ResqueSliders + # KEWatcher class provides a daemon to run on host that are running resque workers. + class KEWatcher + include Helpers + + # Verbosity level (Integer) + attr_accessor :verbosity + + attr_reader :pidfile, :zombie_term_wait, :zombie_kill_wait, :max_children + + # Initialize daemon with options from command-line. + def initialize(options={}) + @verbosity = (options[:verbosity] || 0).to_i # verbosity level + @zombie_term_wait = options[:zombie_term_wait] || 20 # time to wait before TERM + @zombie_kill_wait = ENV['RESQUE_TERM_TIMEOUT'].to_i + @zombie_term_wait unless ENV['RESQUE_TERM_TIMEOUT'].nil? + @zombie_kill_wait ||= options[:zombie_kill_wait] || 60 # time to wait before -9 + @hostile_takeover = options[:force] # kill running kewatcher? + @rakefile = File.expand_path(options[:rakefile]) rescue nil + @rakefile = File.exists?(@rakefile) ? @rakefile : nil if @rakefile + @pidfile = File.expand_path(options[:pidfile]) rescue nil + @pidfile = @pidfile =~ /\.pid$/ ? @pidfile : @pidfile + '.pid' if @pidfile + save_pid! + + @max_children = options[:max_children] || 10 + @hostname = `hostname -s`.chomp.downcase + @pids = Hash.new # init pids array to track running children + @need_queues = Array.new # keep track of pids that are needed + @dead_queues = Array.new # keep track of pids that are dead + @zombie_pids = Hash.new # keep track of zombie's we kill and dont watch(), with elapsed time we've waited for it to die + @async = options[:async] || false # sync and wait by default + @hupped = 0 + + Resque.redis = case options[:config] + when Hash + [options[:config]['host'], options[:config]['port'], options[:config]['db'] || 0].join(':') + else + options[:config] + end + end + + # run the daemon + def run!(interval=0.1) + interval = Float(interval) + if running? + unless @hostile_takeover + puts "Already running. Restart Not Forced exiting..." + exit + end + restart_running! + end + $0 = "KEWatcher: Starting" + startup + + count = 0 + old = 0 # know when to tell redis we have new different current pids + loop do + break if shutdown? + count += 1 + log! ["watching:", @pids.keys.join(', '), "(#{@pids.keys.length})"].delete_if { |x| x == (nil || '') }.join(' ') if count % (10 / interval) == 1 + + tick = count % (20 / interval) == 1 + (log! "checking signals..."; check_signals) if tick + if not (paused? || shutdown?) + queue_diff! if tick # do first and also about every 20 seconds so we can throttle calls to redis + + while @pids.keys.length < @max_children && (@need_queues.length > 0 || @dead_queues.length > 0) + queue = @dead_queues.shift || @need_queues.shift + exec_string = "" + exec_string << 'rake' + exec_string << " -f #{@rakefile}" if @rakefile + exec_string << ' environment' if ENV['RAILS_ENV'] + exec_string << ' resque:work' + env_opts = {"QUEUE" => queue} + if Resque::Version >= '1.22.0' # when API changed for signals + term_timeout = @zombie_kill_wait - @zombie_term_wait + term_timeout = term_timeout > 0 ? term_timeout : 1 + env_opts.merge!({ + 'TERM_CHILD' => '1', + 'RESQUE_TERM_TIMEOUT' => term_timeout.to_s # use new signal handling + }) + end + exec_args = if RUBY_VERSION < '1.9' + [exec_string, env_opts.map {|k,v| "#{k}=#{v}"}].flatten.join(' ') + else + [env_opts, exec_string] # 1.9.x exec + end + pid = fork do + srand # seed + exec(*exec_args) + end + @pids.store(pid, queue) # store pid and queue its running if fork() ? + procline + end + end + + register_setting('current_children', @pids.keys.length) if old != @pids.length + old = @pids.length + + procline if tick + + sleep(interval) # microsleep + kill_zombies! unless shutdown? # need to cleanup ones we've killed + if @hupped > 0 + log "HUP received; purging children..." + signal_hup + do_reload! + @hupped -= 1 + end + + @pids.keys.each do |pid| + begin + # check to see if pid is running, by waiting for it, with a timeout + # Im sure Ruby 1.9 has some better helpers here + Timeout::timeout(interval / 100) { Process.wait(pid) } + rescue Timeout::Error + # Timeout expired, goto next pid + next + rescue Errno::ECHILD + # if no pid exists to wait for, remove it + log! (paused? || shutdown?) ? "#{pid} (#{@pids[pid]}) child died; no one cares..." : "#{pid} (#{@pids[pid]}) child died; spawning another..." + remove pid + break + end + end + end + end + + # Returns PID if already running, false otherwise + def running? + pid = `ps x -o pid,command|grep [K]EWatcher|awk '{print $1}'`.to_i + pid == 0 ? false : pid + end + + private + + # Forces (via signal QUIT) any KEWatcher process running, located by ps and grep + def restart_running! + count = 0 + while pid = running? + (puts "#{pid} wont die; giving up"; exit 2) if count > 6 + count += 1 + if count % 5 == 1 + puts "Killing running KEWatcher: #{pid}" + Process.kill(:TERM, pid) + end + s = 3 * count + puts "Waiting #{s}s for it to die..." + sleep(s) + end + end + + def startup + log! "Found RAILS_ENV=#{ENV['RAILS_ENV']}" if ENV['RAILS_ENV'] + enable_gc_optimizations + register_signal_handlers + clean_signal_settings + register_setting('max_children', @max_children) + add_to_known_hosts(@hostname) + log! "Registered Max Children with Redis" + $stdout.sync = true + end + + def enable_gc_optimizations + if GC.respond_to?(:copy_on_write_friendly=) + GC.copy_on_write_friendly = true + end + end + + def register_signal_handlers + trap('TERM') { shutdown! } + trap('INT') { shutdown! } + + begin + trap('QUIT') { shutdown! } + trap('HUP') { @hupped += 1 } + trap('USR1') { log "USR1 received; killing little children..."; set_signal_flag('stop'); signal_usr1 } + trap('USR2') { log "USR2 received; not making babies"; set_signal_flag('pause'); signal_usr2 } + trap('CONT') { log "CONT received; making babies..."; set_signal_flag('play'); signal_cont } + rescue ArgumentError + warn "Signals QUIT, USR1, USR2, and/or CONT not supported." + end + + log! "Registered signals" + end + + def clean_signal_settings + %w(pause stop reload).each { |x| unregister_setting(x) } + end + + # Check signals, do appropriate thing + def check_signals + if reload?(@hostname) + log ' -> RELOAD from web-ui' + signal_hup + do_reload! + elsif stop?(@hostname) + log ' -> STOPPED from web-ui' if not paused? or @pids.keys.length > 0 + signal_usr1 + elsif pause?(@hostname) + log ' -> PAUSED from web-ui' unless paused? + signal_usr2 + else + log! ' -> Continuing; no signal found' + signal_cont + end + end + + def procline + status ||= 'stopped' if paused? and (@pids.keys.empty? and @zombie_pids.keys.empty?) + status ||= 'paused' if paused? + status = "#{[@pids.keys.length, @zombie_pids.keys.length, status].compact.join('-')}" unless status == 'stopped' + name = "KEWatcher" + pid_str = [] + pid_str << "R:#{@pids.keys.join(',')}" unless @pids.keys.empty? + pid_str << "Z:#{@zombie_pids.keys.join(',')}" unless @zombie_pids.keys.empty? + $0 = "#{name} (#{status}): #{pid_str.join(' ')}" + log! $0 + end + + def queue_diff! + # Forces queue diff + # Overrides what needs to start from Redis + to_start, to_kill = queue_diff + to_kill.each { |pid| remove! pid } + @need_queues = to_start # authoritative answer from redis of what needs to be running + @dead_queues = Array.new + end + + def queue_diff + # Queries Redis to get Hash of what should running + # figures what is running and does a diff + # returns an Array of 2 Arrays: to_start, to_kill + + goal, to_start, to_kill = [], [], [] + queue_values(@hostname).each_pair { |queue,count| goal += [queue] * count.to_i } + + running_queues = @pids.values # check list + goal.each do |q| + if running_queues.include?(q) + # delete from checklist cause its already running + running_queues.delete_at(running_queues.index(q)) + else + # not included in running queue, need to start + to_start << q + end + end + + @pids.dup.each_pair do |k,v| + if running_queues.include?(v) + # whatever is left over in this checklist shouldn't be running + to_kill << k + running_queues.delete_at(running_queues.index(v)) + end + end + + if (to_start.length + @pids.keys.length - to_kill.length) > @max_children + # if to_start with existing minus whats to be killed is still greater than max children + log "WARN: need to start too many children, please raise max children" + end + + kill_queues = to_kill.map { |x| @pids[x] } + log! ["GOTTA START:", to_start.map { |x| "#{x} (#{to_start.count(x)})" }.uniq.join(', '), "= #{to_start.length}"].delete_if { |x| x == (nil || '') }.join(' ') + log! ["GOTTA KILL:", kill_queues.map { |x| "#{x} (#{kill_queues.count(x)})" }.uniq.join(', '), "= #{to_kill.length}"].delete_if { |x| x == (nil || '') }.join(' ') + + [to_start, to_kill] # return whats left + end + + # removes pid completely, ignores its queues + def remove!(pid) + kill_child pid + @pids.delete(pid) + procline + end + + # remove pid, and respawn same queues + def remove(pid) + @dead_queues.unshift(@pids[pid]) # keep track of queues that pid was running, put it at front of list + @pids.delete(pid) + procline + end + + def do_reload! + while not @async and @zombie_pids.length > 0 + kill_zombies! + end + end + + def shutdown! + log "Exiting..." + @shutdown = true + kill_children + while @zombie_pids.keys.length > 0 + kill_zombies! + end + %w(current max).each { |x| unregister_setting("#{x}_children") } + log! "Unregistered Max Children" + Process.waitall() + remove_pidfile! + end + + def shutdown? + @shutdown + end + + def paused? + @paused + end + + # Reload + def signal_hup + clean_signal_settings + kill_children + @paused = false # unpause after kill (restart child) + end + + # Stop + def signal_usr1 + kill_children + @paused = true # pause after kill cause we're paused + end + + # Pause + def signal_usr2 + @paused = true # paused again + end + + # Continue + def signal_cont + @paused = false # unpause + end + + def kill_zombies! + return if @zombie_pids.empty? + local_zombies = @zombie_pids.dup + to_delete = [] + local_zombies.each do |pid,kill_data| + begin + when_killed, times_killed = kill_data + elapsed = Time.now - when_killed + sig = if elapsed >= @zombie_term_wait and times_killed == 1 + :TERM + elsif elapsed >= @zombie_kill_wait and not Resque::Version >= '1.22.0' + :KILL + else + nil + end + unless sig.nil? + log "Waited more than #{@zombie_term_wait} seconds for #{pid}. Sending #{sig}..." + Process.kill(sig, pid) + @zombie_pids.merge!({pid => [when_killed, times_killed + 1]}) + end + wait = !@async ? (@zombie_term_wait - elapsed) / @zombie_pids.length : 0.01 + wait = wait > 0 ? wait : 0.01 + # Issue wait() to make sure pid isn't forgotten + Timeout::timeout(wait) { Process.wait(pid) } + to_delete << pid + rescue Timeout::Error + # waited too long so just catch and ignore, and continue + rescue Errno::ESRCH, Errno::ECHILD # child is gone + to_delete << pid + end + end + to_delete.each { |pid| @zombie_pids.delete(pid) } + end + + def kill_child(pid) + begin + Process.kill(:QUIT, pid) # try graceful shutdown + log! "Child #{pid} killed. (#{@pids.keys.length-1})" + rescue Object => e # dunno what this does but it works; dont know exception + log! "Child #{pid} already dead, sad day. (#{@pids.keys.length-1}) #{e}" + ensure + # Keep track of ones we've killed + @zombie_pids[pid] = [Time.now, 1] # set to current time, killed # + end + end + + def kill_children + @pids.dup.keys.each do |pid| + kill_child pid + remove pid + end + end + + + def log(message) + if verbosity == 1 + puts "* #{message}" + elsif verbosity > 1 + time = Time.now.strftime('%H:%M:%S %Y-%m-%d') + puts "*** [#{time}] #$$: #{message}" + end + end + + def log!(message) + log message if verbosity > 1 + end + + def save_pid! + if @pidfile + begin + log "Saving pid to => #{@pidfile}" + File.open(@pidfile, 'w') { |f| f.write(Process.pid) } + rescue Errno::EACCES => e + puts "Cannot write pidfile => #{e}" + exit 1 + rescue Errno::ENOENT => e + dir = File.dirname(@pidfile) + begin + log! "#{dir} doesnt exist; Creating it..." + FileUtils.mkdir_p(dir) + rescue Errno::EACCES => e + puts "Cannot create directory => #{e}" + exit 1 + end + begin + save_pid! # after creating dir, do save again + rescue # rescue anything else to stop loop + exit 2 + end + end + end + end + + def remove_pidfile! + File.exists?(@pidfile) && File.delete(@pidfile) if @pidfile + end + + end + end + end +end diff --git a/lib/resque_sliders/lib/resque-sliders/server.rb b/lib/resque_sliders/lib/resque-sliders/server.rb new file mode 100755 index 0000000..4b00365 --- /dev/null +++ b/lib/resque_sliders/lib/resque-sliders/server.rb @@ -0,0 +1,101 @@ +module Resque + module Plugins + module ResqueSliders + module Server + + VIEW_PATH = File.join(File.dirname(__FILE__), 'server', 'views') + PUBLIC_PATH = File.join(File.dirname(__FILE__), 'server', 'public') + + def self.registered(app) + require 'json' + + app.get '/sliders' do + key = params.keys.first + if %w(img css js).include? key + public_view(params[key], key == 'img' ? 'images' : key) + else + @sliders = Commander.new + redirect url_path("/sliders/#{@sliders.all_hosts.first}") if @sliders.all_hosts.length == 1 + slider_view :index + end + end + + app.get '/sliders/:host' do + @sliders = Commander.new + slider_view :index + end + + app.post '/sliders/:host' do + signals = params.reject { |x,y| x unless %w(pause stop play reload).include? x.to_s and y } + if params[:quantity] && params[:queue] + sliders = Commander.new + queue = params[:queue].split.first + quantity = params[:quantity].to_i + if quantity.zero? + sliders.delete(params[:host], queue) + else + sliders.change(params[:host], queue, quantity) + end + elsif signals.length == 1 + sliders = Commander.new + sig = signals.keys.first.to_s + sliders.set_signal_flag(sig, params[:host]) + content_type :json + {:signal => sig, :host => params[:host]}.to_json + end + end + + # we need the ability to remove old hosts + app.delete '/sliders/:host' do + Commander.new.remove_all_host_keys(params[:host]) + end + + app.helpers do + def slider_view(filename, options={}, locals={}) + erb(File.read(File.join(VIEW_PATH, "#{filename}.erb")), options, locals) + end + + def public_view(filename, dir='') + file = File.join(PUBLIC_PATH, dir, filename) + begin + cache_control :public, :max_age => 1800 + send_file file + rescue Errno::ENOENT + 404 + end + end + + def daemon_buttons(host, list=true) + html_out = [] + icon_base = 'ui-icon ui-corner-all ui-state-default' + case + when @sliders.reload?(host) + %w(pause stop alert) + when (@sliders.pause?(host) or @sliders.stop?(host)) + %w(play stop refresh) + else + %w(pause stop refresh) + end.each do |i| + id = "#{host}:#{i.upcase}" + klass = "#{icon_base} ui-icon-#{i}" + klass += ' corner' unless list + html_out << "" + end + if list + '
  • ' + html_out.join("
  • ") + '
  • ' + else + html_out.reverse.join + end + end + end + + app.tabs << "Sliders" + + end + + end + end + end +end + +Resque::Server.register Resque::Plugins::ResqueSliders::Server diff --git a/lib/resque_sliders/lib/resque-sliders/server/public/css/jqueryui-1.8.16/blitzer/jquery-ui.custom.css b/lib/resque_sliders/lib/resque-sliders/server/public/css/jqueryui-1.8.16/blitzer/jquery-ui.custom.css new file mode 100755 index 0000000..f99fa81 --- /dev/null +++ b/lib/resque_sliders/lib/resque-sliders/server/public/css/jqueryui-1.8.16/blitzer/jquery-ui.custom.css @@ -0,0 +1,568 @@ +/* + * jQuery UI CSS Framework 1.8.16 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + */ + +/* Layout helpers +----------------------------------*/ +.ui-helper-hidden { display: none; } +.ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); } +.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; } +.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } +.ui-helper-clearfix { display: inline-block; } +/* required comment for clearfix to work in Opera \*/ +* html .ui-helper-clearfix { height:1%; } +.ui-helper-clearfix { display:block; } +/* end clearfix */ +.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); } + + +/* Interaction Cues +----------------------------------*/ +.ui-state-disabled { cursor: default !important; } + + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; } + + +/* Misc visuals +----------------------------------*/ + +/* Overlays */ +.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } + + +/* + * jQuery UI CSS Framework 1.8.16 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + * + * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Arial,sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=cc0000&bgTextureHeader=03_highlight_soft.png&bgImgOpacityHeader=15&borderColorHeader=e3a1a1&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=ffffff&bgTextureContent=01_flat.png&bgImgOpacityContent=75&borderColorContent=eeeeee&fcContent=333333&iconColorContent=cc0000&bgColorDefault=eeeeee&bgTextureDefault=04_highlight_hard.png&bgImgOpacityDefault=100&borderColorDefault=d8dcdf&fcDefault=004276&iconColorDefault=cc0000&bgColorHover=f6f6f6&bgTextureHover=04_highlight_hard.png&bgImgOpacityHover=100&borderColorHover=cdd5da&fcHover=111111&iconColorHover=cc0000&bgColorActive=ffffff&bgTextureActive=01_flat.png&bgImgOpacityActive=65&borderColorActive=eeeeee&fcActive=cc0000&iconColorActive=cc0000&bgColorHighlight=fbf8ee&bgTextureHighlight=02_glass.png&bgImgOpacityHighlight=55&borderColorHighlight=fcd3a1&fcHighlight=444444&iconColorHighlight=004276&bgColorError=f3d8d8&bgTextureError=08_diagonals_thick.png&bgImgOpacityError=75&borderColorError=cc0000&fcError=2e2e2e&iconColorError=cc0000&bgColorOverlay=a6a6a6&bgTextureOverlay=09_dots_small.png&bgImgOpacityOverlay=65&opacityOverlay=40&bgColorShadow=333333&bgTextureShadow=01_flat.png&bgImgOpacityShadow=0&opacityShadow=10&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px + */ + + +/* Component containers +----------------------------------*/ +.ui-widget { font-family: Arial,sans-serif; font-size: 1.1em; } +.ui-widget .ui-widget { font-size: 1em; } +.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Arial,sans-serif; font-size: 1em; } +.ui-widget-content { border: 1px solid #eeeeee; background: #ffffff url(?img=ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x; color: #333333; } +.ui-widget-content a { color: #333333; } +.ui-widget-header { border: 1px solid #e3a1a1; background: #cc0000 url(?img=ui-bg_highlight-soft_15_cc0000_1x100.png) 50% 50% repeat-x; color: #ffffff; font-weight: bold; } +.ui-widget-header a { color: #ffffff; } + +/* Interaction states +----------------------------------*/ +.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d8dcdf; background: #eeeeee url(?img=ui-bg_highlight-hard_100_eeeeee_1x100.png) 50% 50% repeat-x; font-weight: bold; color: #004276; } +.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #004276; text-decoration: none; } +.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #cdd5da; background: #f6f6f6 url(?img=ui-bg_highlight-hard_100_f6f6f6_1x100.png) 50% 50% repeat-x; font-weight: bold; color: #111111; } +.ui-state-hover a, .ui-state-hover a:hover { color: #111111; text-decoration: none; } +.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #eeeeee; background: #ffffff url(?img=ui-bg_flat_65_ffffff_40x100.png) 50% 50% repeat-x; font-weight: bold; color: #cc0000; } +.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #cc0000; text-decoration: none; } +.ui-widget :active { outline: none; } + +/* Interaction Cues +----------------------------------*/ +.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fcd3a1; background: #fbf8ee url(?img=ui-bg_glass_55_fbf8ee_1x400.png) 50% 50% repeat-x; color: #444444; } +.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #444444; } +.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cc0000; background: #f3d8d8 url(?img=ui-bg_diagonals-thick_75_f3d8d8_40x40.png) 50% 50% repeat; color: #2e2e2e; } +.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #2e2e2e; } +.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #2e2e2e; } +.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; } +.ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; } +.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; } + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { width: 16px; height: 16px; background-image: url(?img=ui-icons_cc0000_256x240.png); } +.ui-widget-content .ui-icon {background-image: url(?img=ui-icons_cc0000_256x240.png); } +.ui-widget-header .ui-icon {background-image: url(?img=ui-icons_ffffff_256x240.png); } +.ui-state-default .ui-icon { background-image: url(?img=ui-icons_cc0000_256x240.png); } +.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(?img=ui-icons_cc0000_256x240.png); } +.ui-state-active .ui-icon {background-image: url(?img=ui-icons_cc0000_256x240.png); } +.ui-state-highlight .ui-icon {background-image: url(?img=ui-icons_004276_256x240.png); } +.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(?img=ui-icons_cc0000_256x240.png); } + +/* positioning */ +.ui-icon-carat-1-n { background-position: 0 0; } +.ui-icon-carat-1-ne { background-position: -16px 0; } +.ui-icon-carat-1-e { background-position: -32px 0; } +.ui-icon-carat-1-se { background-position: -48px 0; } +.ui-icon-carat-1-s { background-position: -64px 0; } +.ui-icon-carat-1-sw { background-position: -80px 0; } +.ui-icon-carat-1-w { background-position: -96px 0; } +.ui-icon-carat-1-nw { background-position: -112px 0; } +.ui-icon-carat-2-n-s { background-position: -128px 0; } +.ui-icon-carat-2-e-w { background-position: -144px 0; } +.ui-icon-triangle-1-n { background-position: 0 -16px; } +.ui-icon-triangle-1-ne { background-position: -16px -16px; } +.ui-icon-triangle-1-e { background-position: -32px -16px; } +.ui-icon-triangle-1-se { background-position: -48px -16px; } +.ui-icon-triangle-1-s { background-position: -64px -16px; } +.ui-icon-triangle-1-sw { background-position: -80px -16px; } +.ui-icon-triangle-1-w { background-position: -96px -16px; } +.ui-icon-triangle-1-nw { background-position: -112px -16px; } +.ui-icon-triangle-2-n-s { background-position: -128px -16px; } +.ui-icon-triangle-2-e-w { background-position: -144px -16px; } +.ui-icon-arrow-1-n { background-position: 0 -32px; } +.ui-icon-arrow-1-ne { background-position: -16px -32px; } +.ui-icon-arrow-1-e { background-position: -32px -32px; } +.ui-icon-arrow-1-se { background-position: -48px -32px; } +.ui-icon-arrow-1-s { background-position: -64px -32px; } +.ui-icon-arrow-1-sw { background-position: -80px -32px; } +.ui-icon-arrow-1-w { background-position: -96px -32px; } +.ui-icon-arrow-1-nw { background-position: -112px -32px; } +.ui-icon-arrow-2-n-s { background-position: -128px -32px; } +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } +.ui-icon-arrow-2-e-w { background-position: -160px -32px; } +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } +.ui-icon-arrowstop-1-n { background-position: -192px -32px; } +.ui-icon-arrowstop-1-e { background-position: -208px -32px; } +.ui-icon-arrowstop-1-s { background-position: -224px -32px; } +.ui-icon-arrowstop-1-w { background-position: -240px -32px; } +.ui-icon-arrowthick-1-n { background-position: 0 -48px; } +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } +.ui-icon-arrowthick-1-e { background-position: -32px -48px; } +.ui-icon-arrowthick-1-se { background-position: -48px -48px; } +.ui-icon-arrowthick-1-s { background-position: -64px -48px; } +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } +.ui-icon-arrowthick-1-w { background-position: -96px -48px; } +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } +.ui-icon-arrow-4 { background-position: 0 -80px; } +.ui-icon-arrow-4-diag { background-position: -16px -80px; } +.ui-icon-extlink { background-position: -32px -80px; } +.ui-icon-newwin { background-position: -48px -80px; } +.ui-icon-refresh { background-position: -64px -80px; } +.ui-icon-shuffle { background-position: -80px -80px; } +.ui-icon-transfer-e-w { background-position: -96px -80px; } +.ui-icon-transferthick-e-w { background-position: -112px -80px; } +.ui-icon-folder-collapsed { background-position: 0 -96px; } +.ui-icon-folder-open { background-position: -16px -96px; } +.ui-icon-document { background-position: -32px -96px; } +.ui-icon-document-b { background-position: -48px -96px; } +.ui-icon-note { background-position: -64px -96px; } +.ui-icon-mail-closed { background-position: -80px -96px; } +.ui-icon-mail-open { background-position: -96px -96px; } +.ui-icon-suitcase { background-position: -112px -96px; } +.ui-icon-comment { background-position: -128px -96px; } +.ui-icon-person { background-position: -144px -96px; } +.ui-icon-print { background-position: -160px -96px; } +.ui-icon-trash { background-position: -176px -96px; } +.ui-icon-locked { background-position: -192px -96px; } +.ui-icon-unlocked { background-position: -208px -96px; } +.ui-icon-bookmark { background-position: -224px -96px; } +.ui-icon-tag { background-position: -240px -96px; } +.ui-icon-home { background-position: 0 -112px; } +.ui-icon-flag { background-position: -16px -112px; } +.ui-icon-calendar { background-position: -32px -112px; } +.ui-icon-cart { background-position: -48px -112px; } +.ui-icon-pencil { background-position: -64px -112px; } +.ui-icon-clock { background-position: -80px -112px; } +.ui-icon-disk { background-position: -96px -112px; } +.ui-icon-calculator { background-position: -112px -112px; } +.ui-icon-zoomin { background-position: -128px -112px; } +.ui-icon-zoomout { background-position: -144px -112px; } +.ui-icon-search { background-position: -160px -112px; } +.ui-icon-wrench { background-position: -176px -112px; } +.ui-icon-gear { background-position: -192px -112px; } +.ui-icon-heart { background-position: -208px -112px; } +.ui-icon-star { background-position: -224px -112px; } +.ui-icon-link { background-position: -240px -112px; } +.ui-icon-cancel { background-position: 0 -128px; } +.ui-icon-plus { background-position: -16px -128px; } +.ui-icon-plusthick { background-position: -32px -128px; } +.ui-icon-minus { background-position: -48px -128px; } +.ui-icon-minusthick { background-position: -64px -128px; } +.ui-icon-close { background-position: -80px -128px; } +.ui-icon-closethick { background-position: -96px -128px; } +.ui-icon-key { background-position: -112px -128px; } +.ui-icon-lightbulb { background-position: -128px -128px; } +.ui-icon-scissors { background-position: -144px -128px; } +.ui-icon-clipboard { background-position: -160px -128px; } +.ui-icon-copy { background-position: -176px -128px; } +.ui-icon-contact { background-position: -192px -128px; } +.ui-icon-image { background-position: -208px -128px; } +.ui-icon-video { background-position: -224px -128px; } +.ui-icon-script { background-position: -240px -128px; } +.ui-icon-alert { background-position: 0 -144px; } +.ui-icon-info { background-position: -16px -144px; } +.ui-icon-notice { background-position: -32px -144px; } +.ui-icon-help { background-position: -48px -144px; } +.ui-icon-check { background-position: -64px -144px; } +.ui-icon-bullet { background-position: -80px -144px; } +.ui-icon-radio-off { background-position: -96px -144px; } +.ui-icon-radio-on { background-position: -112px -144px; } +.ui-icon-pin-w { background-position: -128px -144px; } +.ui-icon-pin-s { background-position: -144px -144px; } +.ui-icon-play { background-position: 0 -160px; } +.ui-icon-pause { background-position: -16px -160px; } +.ui-icon-seek-next { background-position: -32px -160px; } +.ui-icon-seek-prev { background-position: -48px -160px; } +.ui-icon-seek-end { background-position: -64px -160px; } +.ui-icon-seek-start { background-position: -80px -160px; } +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ +.ui-icon-seek-first { background-position: -80px -160px; } +.ui-icon-stop { background-position: -96px -160px; } +.ui-icon-eject { background-position: -112px -160px; } +.ui-icon-volume-off { background-position: -128px -160px; } +.ui-icon-volume-on { background-position: -144px -160px; } +.ui-icon-power { background-position: 0 -176px; } +.ui-icon-signal-diag { background-position: -16px -176px; } +.ui-icon-signal { background-position: -32px -176px; } +.ui-icon-battery-0 { background-position: -48px -176px; } +.ui-icon-battery-1 { background-position: -64px -176px; } +.ui-icon-battery-2 { background-position: -80px -176px; } +.ui-icon-battery-3 { background-position: -96px -176px; } +.ui-icon-circle-plus { background-position: 0 -192px; } +.ui-icon-circle-minus { background-position: -16px -192px; } +.ui-icon-circle-close { background-position: -32px -192px; } +.ui-icon-circle-triangle-e { background-position: -48px -192px; } +.ui-icon-circle-triangle-s { background-position: -64px -192px; } +.ui-icon-circle-triangle-w { background-position: -80px -192px; } +.ui-icon-circle-triangle-n { background-position: -96px -192px; } +.ui-icon-circle-arrow-e { background-position: -112px -192px; } +.ui-icon-circle-arrow-s { background-position: -128px -192px; } +.ui-icon-circle-arrow-w { background-position: -144px -192px; } +.ui-icon-circle-arrow-n { background-position: -160px -192px; } +.ui-icon-circle-zoomin { background-position: -176px -192px; } +.ui-icon-circle-zoomout { background-position: -192px -192px; } +.ui-icon-circle-check { background-position: -208px -192px; } +.ui-icon-circlesmall-plus { background-position: 0 -208px; } +.ui-icon-circlesmall-minus { background-position: -16px -208px; } +.ui-icon-circlesmall-close { background-position: -32px -208px; } +.ui-icon-squaresmall-plus { background-position: -48px -208px; } +.ui-icon-squaresmall-minus { background-position: -64px -208px; } +.ui-icon-squaresmall-close { background-position: -80px -208px; } +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } +.ui-icon-grip-solid-vertical { background-position: -32px -224px; } +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } +.ui-icon-grip-diagonal-se { background-position: -80px -224px; } + + +/* Misc visuals +----------------------------------*/ + +/* Corner radius */ +.ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; -khtml-border-top-left-radius: 6px; border-top-left-radius: 6px; } +.ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; -khtml-border-top-right-radius: 6px; border-top-right-radius: 6px; } +.ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { -moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; -khtml-border-bottom-left-radius: 6px; border-bottom-left-radius: 6px; } +.ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { -moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; -khtml-border-bottom-right-radius: 6px; border-bottom-right-radius: 6px; } + +/* Overlays */ +.ui-widget-overlay { background: #a6a6a6 url(?img=ui-bg_dots-small_65_a6a6a6_2x2.png) 50% 50% repeat; opacity: .40;filter:Alpha(Opacity=40); } +.ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #333333 url(?img=ui-bg_flat_0_333333_40x100.png) 50% 50% repeat-x; opacity: .10;filter:Alpha(Opacity=10); -moz-border-radius: 8px; -khtml-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; }/* + * jQuery UI Resizable 1.8.16 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Resizable#theming + */ +.ui-resizable { position: relative;} +.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block; } +.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; } +.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; } +.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; } +.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; } +.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; } +.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; } +.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; } +.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; } +.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/* + * jQuery UI Selectable 1.8.16 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Selectable#theming + */ +.ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; } +/* + * jQuery UI Accordion 1.8.16 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Accordion#theming + */ +/* IE/Win - Fix animation bug - #4615 */ +.ui-accordion { width: 100%; } +.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; } +.ui-accordion .ui-accordion-li-fix { display: inline; } +.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; } +.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; } +.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; } +.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; } +.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; } +.ui-accordion .ui-accordion-content-active { display: block; } +/* + * jQuery UI Autocomplete 1.8.16 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Autocomplete#theming + */ +.ui-autocomplete { position: absolute; cursor: default; } + +/* workarounds */ +* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */ + +/* + * jQuery UI Menu 1.8.16 + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Menu#theming + */ +.ui-menu { + list-style:none; + padding: 2px; + margin: 0; + display:block; + float: left; +} +.ui-menu .ui-menu { + margin-top: -3px; +} +.ui-menu .ui-menu-item { + margin:0; + padding: 0; + zoom: 1; + float: left; + clear: left; + width: 100%; +} +.ui-menu .ui-menu-item a { + text-decoration:none; + display:block; + padding:.2em .4em; + line-height:1.5; + zoom:1; +} +.ui-menu .ui-menu-item a.ui-state-hover, +.ui-menu .ui-menu-item a.ui-state-active { + font-weight: normal; + margin: -1px; +} +/* + * jQuery UI Button 1.8.16 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Button#theming + */ +.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */ +.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */ +button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */ +.ui-button-icons-only { width: 3.4em; } +button.ui-button-icons-only { width: 3.7em; } + +/*button text element */ +.ui-button .ui-button-text { display: block; line-height: 1.4; } +.ui-button-text-only .ui-button-text { padding: .4em 1em; } +.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; } +.ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; } +.ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; } +.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; } +/* no icon support for input elements, provide padding by default */ +input.ui-button { padding: .4em 1em; } + +/*button icon element(s) */ +.ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; } +.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; } +.ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; } +.ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; } +.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; } + +/*button sets*/ +.ui-buttonset { margin-right: 7px; } +.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; } + +/* workarounds */ +button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */ +/* + * jQuery UI Dialog 1.8.16 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Dialog#theming + */ +.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; } +.ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative; } +.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; } +.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; } +.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; } +.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; } +.ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; } +.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; } +.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; } +.ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; } +.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; } +.ui-draggable .ui-dialog-titlebar { cursor: move; } +/* + * jQuery UI Slider 1.8.16 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Slider#theming + */ +.ui-slider { position: relative; text-align: left; } +.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; } +.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; } + +.ui-slider-horizontal { height: .8em; } +.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; } +.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; } +.ui-slider-horizontal .ui-slider-range-min { left: 0; } +.ui-slider-horizontal .ui-slider-range-max { right: 0; } + +.ui-slider-vertical { width: .8em; height: 100px; } +.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; } +.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; } +.ui-slider-vertical .ui-slider-range-min { bottom: 0; } +.ui-slider-vertical .ui-slider-range-max { top: 0; }/* + * jQuery UI Tabs 1.8.16 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Tabs#theming + */ +.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ +.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; } +.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; } +.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; } +.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; } +.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; } +.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */ +.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; } +.ui-tabs .ui-tabs-hide { display: none !important; } +/* + * jQuery UI Datepicker 1.8.16 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Datepicker#theming + */ +.ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; } +.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; } +.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; } +.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; } +.ui-datepicker .ui-datepicker-prev { left:2px; } +.ui-datepicker .ui-datepicker-next { right:2px; } +.ui-datepicker .ui-datepicker-prev-hover { left:1px; } +.ui-datepicker .ui-datepicker-next-hover { right:1px; } +.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; } +.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; } +.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; } +.ui-datepicker select.ui-datepicker-month-year {width: 100%;} +.ui-datepicker select.ui-datepicker-month, +.ui-datepicker select.ui-datepicker-year { width: 49%;} +.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; } +.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; } +.ui-datepicker td { border: 0; padding: 1px; } +.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; } +.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; } +.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; } +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; } + +/* with multiple calendars */ +.ui-datepicker.ui-datepicker-multi { width:auto; } +.ui-datepicker-multi .ui-datepicker-group { float:left; } +.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; } +.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; } +.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; } +.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; } +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; } +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; } +.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; } +.ui-datepicker-row-break { clear:both; width:100%; font-size:0em; } + +/* RTL support */ +.ui-datepicker-rtl { direction: rtl; } +.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; } +.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; } +.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; } +.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; } +.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; } +.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; } +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; } +.ui-datepicker-rtl .ui-datepicker-group { float:right; } +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; } +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; } + +/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */ +.ui-datepicker-cover { + display: none; /*sorry for IE5*/ + display/**/: block; /*sorry for IE5*/ + position: absolute; /*must have*/ + z-index: -1; /*must have*/ + filter: mask(); /*must have*/ + top: -4px; /*must have*/ + left: -4px; /*must have*/ + width: 200px; /*must have*/ + height: 200px; /*must have*/ +}/* + * jQuery UI Progressbar 1.8.16 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Progressbar#theming + */ +.ui-progressbar { height:2em; text-align: left; } +.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; } diff --git a/lib/resque_sliders/lib/resque-sliders/server/public/css/sliders.css b/lib/resque_sliders/lib/resque-sliders/server/public/css/sliders.css new file mode 100755 index 0000000..3325fd4 --- /dev/null +++ b/lib/resque_sliders/lib/resque-sliders/server/public/css/sliders.css @@ -0,0 +1,32 @@ +.icons { + float: left; + margin: 0 2.5px 0 2.5px; +} +.corner { + float: right; + margin: 2px 2.5px 0 2.5px; +} +#sliders { + padding: 10px; + width: 600px; + margin: 0px 20px; +} +#sliders > p { + padding: 0px; + margin: 10px 0px; +} +#sliders form { + padding: 10px 0px; + float: left; + margin: 0px auto; +} +.values,#max,#total { + border: 0; + color: #CE1212; + font-weight: bold; + font-size: 105%; +} +.slider { + width: 500px; + margin: 0px 20px; +} diff --git a/lib/resque_sliders/lib/resque-sliders/server/public/images/ui-bg_diagonals-thick_75_f3d8d8_40x40.png b/lib/resque_sliders/lib/resque-sliders/server/public/images/ui-bg_diagonals-thick_75_f3d8d8_40x40.png new file mode 100755 index 0000000000000000000000000000000000000000..13a229fbd619180ea24cfdb8f30dbe95cddd63a9 GIT binary patch literal 256 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dE$30yfLn2z=UU%ebHV|ofxPM{x z`+6t-2g_zV?cO+H*-7uDDLhZl2BrKEF*);g<2wCGHrsXgewqAxQ^}wAYo_hLqmp0p^NY}(hv&?JUSjZc^>bP0l+XkKhP7#@ literal 0 HcmV?d00001 diff --git a/lib/resque_sliders/lib/resque-sliders/server/public/images/ui-bg_dots-small_65_a6a6a6_2x2.png b/lib/resque_sliders/lib/resque-sliders/server/public/images/ui-bg_dots-small_65_a6a6a6_2x2.png new file mode 100755 index 0000000000000000000000000000000000000000..b2d1a1ef3a0659d21c5bf42df62b2a6c87ad53e4 GIT binary patch literal 83 zcmeAS@N?(olHy`uVBq!ia0vp^Od!m`1|*BN@u~nRDNh&25RRG2G23!(*0TYD8iN1x91EQ4=4yQ7#_Iv z`+As4$%zYm;;c7~Kd+Iuj%U9o62cnl7#bi-T}qs{k}2VRN1x91EQ4=4yQYz+E8 zPo9&<{J;c_6SHRil>2s{Zw^OT)6@jj2u|u!(plXsM>LJD`vD!n;OXk;vd$@?2>^GI BH@yG= literal 0 HcmV?d00001 diff --git a/lib/resque_sliders/lib/resque-sliders/server/public/images/ui-bg_flat_75_ffffff_40x100.png b/lib/resque_sliders/lib/resque-sliders/server/public/images/ui-bg_flat_75_ffffff_40x100.png new file mode 100755 index 0000000000000000000000000000000000000000..ac8b229af950c29356abf64a6c4aa894575445f0 GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F!3HG1q!d*FsY*{5$B>N1x91EQ4=4yQYz+E8 zPo9&<{J;c_6SHRil>2s{Zw^OT)6@jj2u|u!(plXsM>LJD`vD!n;OXk;vd$@?2>^GI BH@yG= literal 0 HcmV?d00001 diff --git a/lib/resque_sliders/lib/resque-sliders/server/public/images/ui-bg_glass_55_fbf8ee_1x400.png b/lib/resque_sliders/lib/resque-sliders/server/public/images/ui-bg_glass_55_fbf8ee_1x400.png new file mode 100755 index 0000000000000000000000000000000000000000..fb056ebe8bf69a6760bdf45e382854d343d36b21 GIT binary patch literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAGVZ#9R3S1;RXC978O6-%i=c+h8ETeBSMi zy|${*Lro@S6+NfoP5U;k*?y)}F13MWm6V$_o4=X*{Fr-%S93n+eA0NA6=B4t8a4gU sA^Ujo+PLbAl~b3zS5v+A{J4kB2~MSrU+M(Bfi^IBy85}Sb4q9e09p7i@Bjb+ literal 0 HcmV?d00001 diff --git a/lib/resque_sliders/lib/resque-sliders/server/public/images/ui-bg_highlight-hard_100_eeeeee_1x100.png b/lib/resque_sliders/lib/resque-sliders/server/public/images/ui-bg_highlight-hard_100_eeeeee_1x100.png new file mode 100755 index 0000000000000000000000000000000000000000..7c77ea7ed16cccb199ed82d4145a788ac8396686 GIT binary patch literal 94 zcmeAS@N?(olHy`uVBq!ia0vp^j6j^i!3HGVb)pi0l&YtTV~E7m3f3H_#V`FPe n^!W4tzr3}$G`Dnlg%E@O4&fD5bIWf7)iQXx`njxgN@xNAhL{*f literal 0 HcmV?d00001 diff --git a/lib/resque_sliders/lib/resque-sliders/server/public/images/ui-bg_highlight-soft_15_cc0000_1x100.png b/lib/resque_sliders/lib/resque-sliders/server/public/images/ui-bg_highlight-soft_15_cc0000_1x100.png new file mode 100755 index 0000000000000000000000000000000000000000..834797a8bf999f510e08932375b8f58d34e4dc92 GIT binary patch literal 108 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 literal 0 HcmV?d00001 diff --git a/lib/resque_sliders/lib/resque-sliders/server/public/images/ui-icons_cc0000_256x240.png b/lib/resque_sliders/lib/resque-sliders/server/public/images/ui-icons_cc0000_256x240.png new file mode 100755 index 0000000000000000000000000000000000000000..03a953b0dd87d7a6893b2d150ebc1beab6d8a384 GIT binary patch literal 4369 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 literal 0 HcmV?d00001 diff --git a/lib/resque_sliders/lib/resque-sliders/server/public/js/jquery-ui-1.8.16.custom.min.js b/lib/resque_sliders/lib/resque-sliders/server/public/js/jquery-ui-1.8.16.custom.min.js new file mode 100755 index 0000000..14c9064 --- /dev/null +++ b/lib/resque_sliders/lib/resque-sliders/server/public/js/jquery-ui-1.8.16.custom.min.js @@ -0,0 +1,791 @@ +/*! + * jQuery UI 1.8.16 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI + */ +(function(c,j){function k(a,b){var d=a.nodeName.toLowerCase();if("area"===d){b=a.parentNode;d=b.name;if(!a.href||!d||b.nodeName.toLowerCase()!=="map")return false;a=c("img[usemap=#"+d+"]")[0];return!!a&&l(a)}return(/input|select|textarea|button|object/.test(d)?!a.disabled:"a"==d?a.href||b:b)&&l(a)}function l(a){return!c(a).parents().andSelf().filter(function(){return c.curCSS(this,"visibility")==="hidden"||c.expr.filters.hidden(this)}).length}c.ui=c.ui||{};if(!c.ui.version){c.extend(c.ui,{version:"1.8.16", +keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});c.fn.extend({propAttr:c.fn.prop||c.fn.attr,_focus:c.fn.focus,focus:function(a,b){return typeof a==="number"?this.each(function(){var d= +this;setTimeout(function(){c(d).focus();b&&b.call(d)},a)}):this._focus.apply(this,arguments)},scrollParent:function(){var a;a=c.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(c.curCSS(this,"position",1))&&/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(c.curCSS(this, +"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!a.length?c(document):a},zIndex:function(a){if(a!==j)return this.css("zIndex",a);if(this.length){a=c(this[0]);for(var b;a.length&&a[0]!==document;){b=a.css("position");if(b==="absolute"||b==="relative"||b==="fixed"){b=parseInt(a.css("zIndex"),10);if(!isNaN(b)&&b!==0)return b}a=a.parent()}}return 0},disableSelection:function(){return this.bind((c.support.selectstart?"selectstart": +"mousedown")+".ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});c.each(["Width","Height"],function(a,b){function d(f,g,m,n){c.each(e,function(){g-=parseFloat(c.curCSS(f,"padding"+this,true))||0;if(m)g-=parseFloat(c.curCSS(f,"border"+this+"Width",true))||0;if(n)g-=parseFloat(c.curCSS(f,"margin"+this,true))||0});return g}var e=b==="Width"?["Left","Right"]:["Top","Bottom"],h=b.toLowerCase(),i={innerWidth:c.fn.innerWidth,innerHeight:c.fn.innerHeight, +outerWidth:c.fn.outerWidth,outerHeight:c.fn.outerHeight};c.fn["inner"+b]=function(f){if(f===j)return i["inner"+b].call(this);return this.each(function(){c(this).css(h,d(this,f)+"px")})};c.fn["outer"+b]=function(f,g){if(typeof f!=="number")return i["outer"+b].call(this,f);return this.each(function(){c(this).css(h,d(this,f,true,g)+"px")})}});c.extend(c.expr[":"],{data:function(a,b,d){return!!c.data(a,d[3])},focusable:function(a){return k(a,!isNaN(c.attr(a,"tabindex")))},tabbable:function(a){var b=c.attr(a, +"tabindex"),d=isNaN(b);return(d||b>=0)&&k(a,!d)}});c(function(){var a=document.body,b=a.appendChild(b=document.createElement("div"));c.extend(b.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});c.support.minHeight=b.offsetHeight===100;c.support.selectstart="onselectstart"in b;a.removeChild(b).style.display="none"});c.extend(c.ui,{plugin:{add:function(a,b,d){a=c.ui[a].prototype;for(var e in d){a.plugins[e]=a.plugins[e]||[];a.plugins[e].push([b,d[e]])}},call:function(a,b,d){if((b=a.plugins[b])&& +a.element[0].parentNode)for(var e=0;e0)return true;a[b]=1;d=a[b]>0;a[b]=0;return d},isOverAxis:function(a,b,d){return a>b&&a=9)&&!a.button)return this._mouseUp(a);if(this._mouseStarted){this._mouseDrag(a);return a.preventDefault()}if(this._mouseDistanceMet(a)&&this._mouseDelayMet(a))(this._mouseStarted=this._mouseStart(this._mouseDownEvent,a)!==false)?this._mouseDrag(a):this._mouseUp(a);return!this._mouseStarted},_mouseUp:function(a){b(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted= +false;a.target==this._mouseDownEvent.target&&b.data(a.target,this.widgetName+".preventClickEvent",true);this._mouseStop(a)}return false},_mouseDistanceMet:function(a){return Math.max(Math.abs(this._mouseDownEvent.pageX-a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return true}})})(jQuery); +;/* + * jQuery UI Position 1.8.16 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Position + */ +(function(c){c.ui=c.ui||{};var n=/left|center|right/,o=/top|center|bottom/,t=c.fn.position,u=c.fn.offset;c.fn.position=function(b){if(!b||!b.of)return t.apply(this,arguments);b=c.extend({},b);var a=c(b.of),d=a[0],g=(b.collision||"flip").split(" "),e=b.offset?b.offset.split(" "):[0,0],h,k,j;if(d.nodeType===9){h=a.width();k=a.height();j={top:0,left:0}}else if(d.setTimeout){h=a.width();k=a.height();j={top:a.scrollTop(),left:a.scrollLeft()}}else if(d.preventDefault){b.at="left top";h=k=0;j={top:b.of.pageY, +left:b.of.pageX}}else{h=a.outerWidth();k=a.outerHeight();j=a.offset()}c.each(["my","at"],function(){var f=(b[this]||"").split(" ");if(f.length===1)f=n.test(f[0])?f.concat(["center"]):o.test(f[0])?["center"].concat(f):["center","center"];f[0]=n.test(f[0])?f[0]:"center";f[1]=o.test(f[1])?f[1]:"center";b[this]=f});if(g.length===1)g[1]=g[0];e[0]=parseInt(e[0],10)||0;if(e.length===1)e[1]=e[0];e[1]=parseInt(e[1],10)||0;if(b.at[0]==="right")j.left+=h;else if(b.at[0]==="center")j.left+=h/2;if(b.at[1]==="bottom")j.top+= +k;else if(b.at[1]==="center")j.top+=k/2;j.left+=e[0];j.top+=e[1];return this.each(function(){var f=c(this),l=f.outerWidth(),m=f.outerHeight(),p=parseInt(c.curCSS(this,"marginLeft",true))||0,q=parseInt(c.curCSS(this,"marginTop",true))||0,v=l+p+(parseInt(c.curCSS(this,"marginRight",true))||0),w=m+q+(parseInt(c.curCSS(this,"marginBottom",true))||0),i=c.extend({},j),r;if(b.my[0]==="right")i.left-=l;else if(b.my[0]==="center")i.left-=l/2;if(b.my[1]==="bottom")i.top-=m;else if(b.my[1]==="center")i.top-= +m/2;i.left=Math.round(i.left);i.top=Math.round(i.top);r={left:i.left-p,top:i.top-q};c.each(["left","top"],function(s,x){c.ui.position[g[s]]&&c.ui.position[g[s]][x](i,{targetWidth:h,targetHeight:k,elemWidth:l,elemHeight:m,collisionPosition:r,collisionWidth:v,collisionHeight:w,offset:e,my:b.my,at:b.at})});c.fn.bgiframe&&f.bgiframe();f.offset(c.extend(i,{using:b.using}))})};c.ui.position={fit:{left:function(b,a){var d=c(window);d=a.collisionPosition.left+a.collisionWidth-d.width()-d.scrollLeft();b.left= +d>0?b.left-d:Math.max(b.left-a.collisionPosition.left,b.left)},top:function(b,a){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();b.top=d>0?b.top-d:Math.max(b.top-a.collisionPosition.top,b.top)}},flip:{left:function(b,a){if(a.at[0]!=="center"){var d=c(window);d=a.collisionPosition.left+a.collisionWidth-d.width()-d.scrollLeft();var g=a.my[0]==="left"?-a.elemWidth:a.my[0]==="right"?a.elemWidth:0,e=a.at[0]==="left"?a.targetWidth:-a.targetWidth,h=-2*a.offset[0];b.left+= +a.collisionPosition.left<0?g+e+h:d>0?g+e+h:0}},top:function(b,a){if(a.at[1]!=="center"){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();var g=a.my[1]==="top"?-a.elemHeight:a.my[1]==="bottom"?a.elemHeight:0,e=a.at[1]==="top"?a.targetHeight:-a.targetHeight,h=-2*a.offset[1];b.top+=a.collisionPosition.top<0?g+e+h:d>0?g+e+h:0}}}};if(!c.offset.setOffset){c.offset.setOffset=function(b,a){if(/static/.test(c.curCSS(b,"position")))b.style.position="relative";var d=c(b), +g=d.offset(),e=parseInt(c.curCSS(b,"top",true),10)||0,h=parseInt(c.curCSS(b,"left",true),10)||0;g={top:a.top-g.top+e,left:a.left-g.left+h};"using"in a?a.using.call(b,g):d.css(g)};c.fn.offset=function(b){var a=this[0];if(!a||!a.ownerDocument)return null;if(b)return this.each(function(){c.offset.setOffset(this,b)});return u.call(this)}}})(jQuery); +;/* + * jQuery UI Draggable 1.8.16 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Draggables + * + * Depends: + * jquery.ui.core.js + * jquery.ui.mouse.js + * jquery.ui.widget.js + */ +(function(d){d.widget("ui.draggable",d.ui.mouse,{widgetEventPrefix:"drag",options:{addClasses:true,appendTo:"parent",axis:false,connectToSortable:false,containment:false,cursor:"auto",cursorAt:false,grid:false,handle:false,helper:"original",iframeFix:false,opacity:false,refreshPositions:false,revert:false,revertDuration:500,scope:"default",scroll:true,scrollSensitivity:20,scrollSpeed:20,snap:false,snapMode:"both",snapTolerance:20,stack:false,zIndex:false},_create:function(){if(this.options.helper== +"original"&&!/^(?:r|a|f)/.test(this.element.css("position")))this.element[0].style.position="relative";this.options.addClasses&&this.element.addClass("ui-draggable");this.options.disabled&&this.element.addClass("ui-draggable-disabled");this._mouseInit()},destroy:function(){if(this.element.data("draggable")){this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled");this._mouseDestroy();return this}},_mouseCapture:function(a){var b= +this.options;if(this.helper||b.disabled||d(a.target).is(".ui-resizable-handle"))return false;this.handle=this._getHandle(a);if(!this.handle)return false;if(b.iframeFix)d(b.iframeFix===true?"iframe":b.iframeFix).each(function(){d('
    ').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1E3}).css(d(this).offset()).appendTo("body")});return true},_mouseStart:function(a){var b=this.options; +this.helper=this._createHelper(a);this._cacheHelperProportions();if(d.ui.ddmanager)d.ui.ddmanager.current=this;this._cacheMargins();this.cssPosition=this.helper.css("position");this.scrollParent=this.helper.scrollParent();this.offset=this.positionAbs=this.element.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left};d.extend(this.offset,{click:{left:a.pageX-this.offset.left,top:a.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}); +this.originalPosition=this.position=this._generatePosition(a);this.originalPageX=a.pageX;this.originalPageY=a.pageY;b.cursorAt&&this._adjustOffsetFromHelper(b.cursorAt);b.containment&&this._setContainment();if(this._trigger("start",a)===false){this._clear();return false}this._cacheHelperProportions();d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a);this.helper.addClass("ui-draggable-dragging");this._mouseDrag(a,true);d.ui.ddmanager&&d.ui.ddmanager.dragStart(this,a);return true}, +_mouseDrag:function(a,b){this.position=this._generatePosition(a);this.positionAbs=this._convertPositionTo("absolute");if(!b){b=this._uiHash();if(this._trigger("drag",a,b)===false){this._mouseUp({});return false}this.position=b.position}if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis||this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";d.ui.ddmanager&&d.ui.ddmanager.drag(this,a);return false},_mouseStop:function(a){var b= +false;if(d.ui.ddmanager&&!this.options.dropBehaviour)b=d.ui.ddmanager.drop(this,a);if(this.dropped){b=this.dropped;this.dropped=false}if((!this.element[0]||!this.element[0].parentNode)&&this.options.helper=="original")return false;if(this.options.revert=="invalid"&&!b||this.options.revert=="valid"&&b||this.options.revert===true||d.isFunction(this.options.revert)&&this.options.revert.call(this.element,b)){var c=this;d(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration, +10),function(){c._trigger("stop",a)!==false&&c._clear()})}else this._trigger("stop",a)!==false&&this._clear();return false},_mouseUp:function(a){this.options.iframeFix===true&&d("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)});d.ui.ddmanager&&d.ui.ddmanager.dragStop(this,a);return d.ui.mouse.prototype._mouseUp.call(this,a)},cancel:function(){this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear();return this},_getHandle:function(a){var b=!this.options.handle|| +!d(this.options.handle,this.element).length?true:false;d(this.options.handle,this.element).find("*").andSelf().each(function(){if(this==a.target)b=true});return b},_createHelper:function(a){var b=this.options;a=d.isFunction(b.helper)?d(b.helper.apply(this.element[0],[a])):b.helper=="clone"?this.element.clone().removeAttr("id"):this.element;a.parents("body").length||a.appendTo(b.appendTo=="parent"?this.element[0].parentNode:b.appendTo);a[0]!=this.element[0]&&!/(fixed|absolute)/.test(a.css("position"))&& +a.css("position","absolute");return a},_adjustOffsetFromHelper:function(a){if(typeof a=="string")a=a.split(" ");if(d.isArray(a))a={left:+a[0],top:+a[1]||0};if("left"in a)this.offset.click.left=a.left+this.margins.left;if("right"in a)this.offset.click.left=this.helperProportions.width-a.right+this.margins.left;if("top"in a)this.offset.click.top=a.top+this.margins.top;if("bottom"in a)this.offset.click.top=this.helperProportions.height-a.bottom+this.margins.top},_getParentOffset:function(){this.offsetParent= +this.helper.offsetParent();var a=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0])){a.left+=this.scrollParent.scrollLeft();a.top+=this.scrollParent.scrollTop()}if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&d.browser.msie)a={top:0,left:0};return{top:a.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:a.left+(parseInt(this.offsetParent.css("borderLeftWidth"), +10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.element.position();return{top:a.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"), +10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var a=this.options;if(a.containment=="parent")a.containment=this.helper[0].parentNode;if(a.containment=="document"||a.containment=="window")this.containment=[a.containment=="document"?0:d(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,a.containment=="document"?0:d(window).scrollTop()-this.offset.relative.top-this.offset.parent.top, +(a.containment=="document"?0:d(window).scrollLeft())+d(a.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(a.containment=="document"?0:d(window).scrollTop())+(d(a.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(a.containment)&&a.containment.constructor!=Array){a=d(a.containment);var b=a[0];if(b){a.offset();var c=d(b).css("overflow")!= +"hidden";this.containment=[(parseInt(d(b).css("borderLeftWidth"),10)||0)+(parseInt(d(b).css("paddingLeft"),10)||0),(parseInt(d(b).css("borderTopWidth"),10)||0)+(parseInt(d(b).css("paddingTop"),10)||0),(c?Math.max(b.scrollWidth,b.offsetWidth):b.offsetWidth)-(parseInt(d(b).css("borderLeftWidth"),10)||0)-(parseInt(d(b).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(c?Math.max(b.scrollHeight,b.offsetHeight):b.offsetHeight)-(parseInt(d(b).css("borderTopWidth"), +10)||0)-(parseInt(d(b).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom];this.relative_container=a}}else if(a.containment.constructor==Array)this.containment=a.containment},_convertPositionTo:function(a,b){if(!b)b=this.position;a=a=="absolute"?1:-1;var c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(c[0].tagName);return{top:b.top+ +this.offset.relative.top*a+this.offset.parent.top*a-(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:c.scrollTop())*a),left:b.left+this.offset.relative.left*a+this.offset.parent.left*a-(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():f?0:c.scrollLeft())*a)}},_generatePosition:function(a){var b=this.options,c=this.cssPosition=="absolute"&& +!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(c[0].tagName),e=a.pageX,h=a.pageY;if(this.originalPosition){var g;if(this.containment){if(this.relative_container){g=this.relative_container.offset();g=[this.containment[0]+g.left,this.containment[1]+g.top,this.containment[2]+g.left,this.containment[3]+g.top]}else g=this.containment;if(a.pageX-this.offset.click.leftg[2])e=g[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>g[3])h=g[3]+this.offset.click.top}if(b.grid){h=b.grid[1]?this.originalPageY+Math.round((h-this.originalPageY)/b.grid[1])*b.grid[1]:this.originalPageY;h=g?!(h-this.offset.click.topg[3])?h:!(h-this.offset.click.topg[2])?e:!(e-this.offset.click.left=0;i--){var j=c.snapElements[i].left,l=j+c.snapElements[i].width,k=c.snapElements[i].top,m=k+c.snapElements[i].height;if(j-e=j&&f<=l||h>=j&&h<=l||fl)&&(e>= +i&&e<=k||g>=i&&g<=k||ek);default:return false}};d.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(a,b){var c=d.ui.ddmanager.droppables[a.options.scope]||[],e=b?b.type:null,g=(a.currentItem||a.element).find(":data(droppable)").andSelf(),f=0;a:for(;f').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(), +top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle= +this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=a.handles||(!e(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne", +nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all")this.handles="n,e,s,w,se,sw,ne,nw";var c=this.handles.split(",");this.handles={};for(var d=0;d');/sw|se|ne|nw/.test(f)&&g.css({zIndex:++a.zIndex});"se"==f&&g.addClass("ui-icon ui-icon-gripsmall-diagonal-se");this.handles[f]=".ui-resizable-"+f;this.element.append(g)}}this._renderAxis=function(h){h=h||this.element;for(var i in this.handles){if(this.handles[i].constructor== +String)this.handles[i]=e(this.handles[i],this.element).show();if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var j=e(this.handles[i],this.element),l=0;l=/sw|ne|nw|se|n|s/.test(i)?j.outerHeight():j.outerWidth();j=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join("");h.css(j,l);this._proportionallyResize()}e(this.handles[i])}};this._renderAxis(this.element);this._handles=e(".ui-resizable-handle",this.element).disableSelection(); +this._handles.mouseover(function(){if(!b.resizing){if(this.className)var h=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);b.axis=h&&h[1]?h[1]:"se"}});if(a.autoHide){this._handles.hide();e(this.element).addClass("ui-resizable-autohide").hover(function(){if(!a.disabled){e(this).removeClass("ui-resizable-autohide");b._handles.show()}},function(){if(!a.disabled)if(!b.resizing){e(this).addClass("ui-resizable-autohide");b._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy(); +var b=function(c){e(c).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){b(this.element);var a=this.element;a.after(this.originalElement.css({position:a.css("position"),width:a.outerWidth(),height:a.outerHeight(),top:a.css("top"),left:a.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);b(this.originalElement);return this},_mouseCapture:function(b){var a= +false;for(var c in this.handles)if(e(this.handles[c])[0]==b.target)a=true;return!this.options.disabled&&a},_mouseStart:function(b){var a=this.options,c=this.element.position(),d=this.element;this.resizing=true;this.documentScroll={top:e(document).scrollTop(),left:e(document).scrollLeft()};if(d.is(".ui-draggable")||/absolute/.test(d.css("position")))d.css({position:"absolute",top:c.top,left:c.left});e.browser.opera&&/relative/.test(d.css("position"))&&d.css({position:"relative",top:"auto",left:"auto"}); +this._renderProxy();c=m(this.helper.css("left"));var f=m(this.helper.css("top"));if(a.containment){c+=e(a.containment).scrollLeft()||0;f+=e(a.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:c,top:f};this.size=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalSize=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalPosition={left:c,top:f};this.sizeDiff= +{width:d.outerWidth()-d.width(),height:d.outerHeight()-d.height()};this.originalMousePosition={left:b.pageX,top:b.pageY};this.aspectRatio=typeof a.aspectRatio=="number"?a.aspectRatio:this.originalSize.width/this.originalSize.height||1;a=e(".ui-resizable-"+this.axis).css("cursor");e("body").css("cursor",a=="auto"?this.axis+"-resize":a);d.addClass("ui-resizable-resizing");this._propagate("start",b);return true},_mouseDrag:function(b){var a=this.helper,c=this.originalMousePosition,d=this._change[this.axis]; +if(!d)return false;c=d.apply(this,[b,b.pageX-c.left||0,b.pageY-c.top||0]);this._updateVirtualBoundaries(b.shiftKey);if(this._aspectRatio||b.shiftKey)c=this._updateRatio(c,b);c=this._respectSize(c,b);this._propagate("resize",b);a.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize();this._updateCache(c);this._trigger("resize",b,this.ui());return false}, +_mouseStop:function(b){this.resizing=false;var a=this.options,c=this;if(this._helper){var d=this._proportionallyResizeElements,f=d.length&&/textarea/i.test(d[0].nodeName);d=f&&e.ui.hasScroll(d[0],"left")?0:c.sizeDiff.height;f=f?0:c.sizeDiff.width;f={width:c.helper.width()-f,height:c.helper.height()-d};d=parseInt(c.element.css("left"),10)+(c.position.left-c.originalPosition.left)||null;var g=parseInt(c.element.css("top"),10)+(c.position.top-c.originalPosition.top)||null;a.animate||this.element.css(e.extend(f, +{top:g,left:d}));c.helper.height(c.size.height);c.helper.width(c.size.width);this._helper&&!a.animate&&this._proportionallyResize()}e("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",b);this._helper&&this.helper.remove();return false},_updateVirtualBoundaries:function(b){var a=this.options,c,d,f;a={minWidth:k(a.minWidth)?a.minWidth:0,maxWidth:k(a.maxWidth)?a.maxWidth:Infinity,minHeight:k(a.minHeight)?a.minHeight:0,maxHeight:k(a.maxHeight)?a.maxHeight: +Infinity};if(this._aspectRatio||b){b=a.minHeight*this.aspectRatio;d=a.minWidth/this.aspectRatio;c=a.maxHeight*this.aspectRatio;f=a.maxWidth/this.aspectRatio;if(b>a.minWidth)a.minWidth=b;if(d>a.minHeight)a.minHeight=d;if(cb.width,h=k(b.height)&&a.minHeight&&a.minHeight>b.height;if(g)b.width=a.minWidth;if(h)b.height=a.minHeight;if(d)b.width=a.maxWidth;if(f)b.height=a.maxHeight;var i=this.originalPosition.left+this.originalSize.width,j=this.position.top+this.size.height,l=/sw|nw|w/.test(c);c=/nw|ne|n/.test(c);if(g&&l)b.left=i-a.minWidth;if(d&&l)b.left=i-a.maxWidth;if(h&&c)b.top=j-a.minHeight;if(f&&c)b.top=j-a.maxHeight;if((a=!b.width&&!b.height)&&!b.left&&b.top)b.top=null;else if(a&&!b.top&&b.left)b.left= +null;return b},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var b=this.helper||this.element,a=0;a');var a=e.browser.msie&&e.browser.version<7,c=a?1:0;a=a?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+ +a,height:this.element.outerHeight()+a,position:"absolute",left:this.elementOffset.left-c+"px",top:this.elementOffset.top-c+"px",zIndex:++b.zIndex});this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(b,a){return{width:this.originalSize.width+a}},w:function(b,a){return{left:this.originalPosition.left+a,width:this.originalSize.width-a}},n:function(b,a,c){return{top:this.originalPosition.top+c,height:this.originalSize.height-c}},s:function(b,a,c){return{height:this.originalSize.height+ +c}},se:function(b,a,c){return e.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[b,a,c]))},sw:function(b,a,c){return e.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[b,a,c]))},ne:function(b,a,c){return e.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[b,a,c]))},nw:function(b,a,c){return e.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[b,a,c]))}},_propagate:function(b,a){e.ui.plugin.call(this,b,[a,this.ui()]); +b!="resize"&&this._trigger(b,a,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});e.extend(e.ui.resizable,{version:"1.8.16"});e.ui.plugin.add("resizable","alsoResize",{start:function(){var b=e(this).data("resizable").options,a=function(c){e(c).each(function(){var d=e(this);d.data("resizable-alsoresize",{width:parseInt(d.width(), +10),height:parseInt(d.height(),10),left:parseInt(d.css("left"),10),top:parseInt(d.css("top"),10),position:d.css("position")})})};if(typeof b.alsoResize=="object"&&!b.alsoResize.parentNode)if(b.alsoResize.length){b.alsoResize=b.alsoResize[0];a(b.alsoResize)}else e.each(b.alsoResize,function(c){a(c)});else a(b.alsoResize)},resize:function(b,a){var c=e(this).data("resizable");b=c.options;var d=c.originalSize,f=c.originalPosition,g={height:c.size.height-d.height||0,width:c.size.width-d.width||0,top:c.position.top- +f.top||0,left:c.position.left-f.left||0},h=function(i,j){e(i).each(function(){var l=e(this),q=e(this).data("resizable-alsoresize"),p={},r=j&&j.length?j:l.parents(a.originalElement[0]).length?["width","height"]:["width","height","top","left"];e.each(r,function(n,o){if((n=(q[o]||0)+(g[o]||0))&&n>=0)p[o]=n||null});if(e.browser.opera&&/relative/.test(l.css("position"))){c._revertToRelativePosition=true;l.css({position:"absolute",top:"auto",left:"auto"})}l.css(p)})};typeof b.alsoResize=="object"&&!b.alsoResize.nodeType? +e.each(b.alsoResize,function(i,j){h(i,j)}):h(b.alsoResize)},stop:function(){var b=e(this).data("resizable"),a=b.options,c=function(d){e(d).each(function(){var f=e(this);f.css({position:f.data("resizable-alsoresize").position})})};if(b._revertToRelativePosition){b._revertToRelativePosition=false;typeof a.alsoResize=="object"&&!a.alsoResize.nodeType?e.each(a.alsoResize,function(d){c(d)}):c(a.alsoResize)}e(this).removeData("resizable-alsoresize")}});e.ui.plugin.add("resizable","animate",{stop:function(b){var a= +e(this).data("resizable"),c=a.options,d=a._proportionallyResizeElements,f=d.length&&/textarea/i.test(d[0].nodeName),g=f&&e.ui.hasScroll(d[0],"left")?0:a.sizeDiff.height;f={width:a.size.width-(f?0:a.sizeDiff.width),height:a.size.height-g};g=parseInt(a.element.css("left"),10)+(a.position.left-a.originalPosition.left)||null;var h=parseInt(a.element.css("top"),10)+(a.position.top-a.originalPosition.top)||null;a.element.animate(e.extend(f,h&&g?{top:h,left:g}:{}),{duration:c.animateDuration,easing:c.animateEasing, +step:function(){var i={width:parseInt(a.element.css("width"),10),height:parseInt(a.element.css("height"),10),top:parseInt(a.element.css("top"),10),left:parseInt(a.element.css("left"),10)};d&&d.length&&e(d[0]).css({width:i.width,height:i.height});a._updateCache(i);a._propagate("resize",b)}})}});e.ui.plugin.add("resizable","containment",{start:function(){var b=e(this).data("resizable"),a=b.element,c=b.options.containment;if(a=c instanceof e?c.get(0):/parent/.test(c)?a.parent().get(0):c){b.containerElement= +e(a);if(/document/.test(c)||c==document){b.containerOffset={left:0,top:0};b.containerPosition={left:0,top:0};b.parentData={element:e(document),left:0,top:0,width:e(document).width(),height:e(document).height()||document.body.parentNode.scrollHeight}}else{var d=e(a),f=[];e(["Top","Right","Left","Bottom"]).each(function(i,j){f[i]=m(d.css("padding"+j))});b.containerOffset=d.offset();b.containerPosition=d.position();b.containerSize={height:d.innerHeight()-f[3],width:d.innerWidth()-f[1]};c=b.containerOffset; +var g=b.containerSize.height,h=b.containerSize.width;h=e.ui.hasScroll(a,"left")?a.scrollWidth:h;g=e.ui.hasScroll(a)?a.scrollHeight:g;b.parentData={element:a,left:c.left,top:c.top,width:h,height:g}}}},resize:function(b){var a=e(this).data("resizable"),c=a.options,d=a.containerOffset,f=a.position;b=a._aspectRatio||b.shiftKey;var g={top:0,left:0},h=a.containerElement;if(h[0]!=document&&/static/.test(h.css("position")))g=d;if(f.left<(a._helper?d.left:0)){a.size.width+=a._helper?a.position.left-d.left: +a.position.left-g.left;if(b)a.size.height=a.size.width/c.aspectRatio;a.position.left=c.helper?d.left:0}if(f.top<(a._helper?d.top:0)){a.size.height+=a._helper?a.position.top-d.top:a.position.top;if(b)a.size.width=a.size.height*c.aspectRatio;a.position.top=a._helper?d.top:0}a.offset.left=a.parentData.left+a.position.left;a.offset.top=a.parentData.top+a.position.top;c=Math.abs((a._helper?a.offset.left-g.left:a.offset.left-g.left)+a.sizeDiff.width);d=Math.abs((a._helper?a.offset.top-g.top:a.offset.top- +d.top)+a.sizeDiff.height);f=a.containerElement.get(0)==a.element.parent().get(0);g=/relative|absolute/.test(a.containerElement.css("position"));if(f&&g)c-=a.parentData.left;if(c+a.size.width>=a.parentData.width){a.size.width=a.parentData.width-c;if(b)a.size.height=a.size.width/a.aspectRatio}if(d+a.size.height>=a.parentData.height){a.size.height=a.parentData.height-d;if(b)a.size.width=a.size.height*a.aspectRatio}},stop:function(){var b=e(this).data("resizable"),a=b.options,c=b.containerOffset,d=b.containerPosition, +f=b.containerElement,g=e(b.helper),h=g.offset(),i=g.outerWidth()-b.sizeDiff.width;g=g.outerHeight()-b.sizeDiff.height;b._helper&&!a.animate&&/relative/.test(f.css("position"))&&e(this).css({left:h.left-d.left-c.left,width:i,height:g});b._helper&&!a.animate&&/static/.test(f.css("position"))&&e(this).css({left:h.left-d.left-c.left,width:i,height:g})}});e.ui.plugin.add("resizable","ghost",{start:function(){var b=e(this).data("resizable"),a=b.options,c=b.size;b.ghost=b.originalElement.clone();b.ghost.css({opacity:0.25, +display:"block",position:"relative",height:c.height,width:c.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof a.ghost=="string"?a.ghost:"");b.ghost.appendTo(b.helper)},resize:function(){var b=e(this).data("resizable");b.ghost&&b.ghost.css({position:"relative",height:b.size.height,width:b.size.width})},stop:function(){var b=e(this).data("resizable");b.ghost&&b.helper&&b.helper.get(0).removeChild(b.ghost.get(0))}});e.ui.plugin.add("resizable","grid",{resize:function(){var b= +e(this).data("resizable"),a=b.options,c=b.size,d=b.originalSize,f=b.originalPosition,g=b.axis;a.grid=typeof a.grid=="number"?[a.grid,a.grid]:a.grid;var h=Math.round((c.width-d.width)/(a.grid[0]||1))*(a.grid[0]||1);a=Math.round((c.height-d.height)/(a.grid[1]||1))*(a.grid[1]||1);if(/^(se|s|e)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a}else if(/^(ne)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a;b.position.top=f.top-a}else{if(/^(sw)$/.test(g)){b.size.width=d.width+h;b.size.height= +d.height+a}else{b.size.width=d.width+h;b.size.height=d.height+a;b.position.top=f.top-a}b.position.left=f.left-h}}});var m=function(b){return parseInt(b,10)||0},k=function(b){return!isNaN(parseInt(b,10))}})(jQuery); +;/* + * jQuery UI Selectable 1.8.16 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Selectables + * + * Depends: + * jquery.ui.core.js + * jquery.ui.mouse.js + * jquery.ui.widget.js + */ +(function(e){e.widget("ui.selectable",e.ui.mouse,{options:{appendTo:"body",autoRefresh:true,distance:0,filter:"*",tolerance:"touch"},_create:function(){var c=this;this.element.addClass("ui-selectable");this.dragged=false;var f;this.refresh=function(){f=e(c.options.filter,c.element[0]);f.each(function(){var d=e(this),b=d.offset();e.data(this,"selectable-item",{element:this,$element:d,left:b.left,top:b.top,right:b.left+d.outerWidth(),bottom:b.top+d.outerHeight(),startselected:false,selected:d.hasClass("ui-selected"), +selecting:d.hasClass("ui-selecting"),unselecting:d.hasClass("ui-unselecting")})})};this.refresh();this.selectees=f.addClass("ui-selectee");this._mouseInit();this.helper=e("
    ")},destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item");this.element.removeClass("ui-selectable ui-selectable-disabled").removeData("selectable").unbind(".selectable");this._mouseDestroy();return this},_mouseStart:function(c){var f=this;this.opos=[c.pageX, +c.pageY];if(!this.options.disabled){var d=this.options;this.selectees=e(d.filter,this.element[0]);this._trigger("start",c);e(d.appendTo).append(this.helper);this.helper.css({left:c.clientX,top:c.clientY,width:0,height:0});d.autoRefresh&&this.refresh();this.selectees.filter(".ui-selected").each(function(){var b=e.data(this,"selectable-item");b.startselected=true;if(!c.metaKey){b.$element.removeClass("ui-selected");b.selected=false;b.$element.addClass("ui-unselecting");b.unselecting=true;f._trigger("unselecting", +c,{unselecting:b.element})}});e(c.target).parents().andSelf().each(function(){var b=e.data(this,"selectable-item");if(b){var g=!c.metaKey||!b.$element.hasClass("ui-selected");b.$element.removeClass(g?"ui-unselecting":"ui-selected").addClass(g?"ui-selecting":"ui-unselecting");b.unselecting=!g;b.selecting=g;(b.selected=g)?f._trigger("selecting",c,{selecting:b.element}):f._trigger("unselecting",c,{unselecting:b.element});return false}})}},_mouseDrag:function(c){var f=this;this.dragged=true;if(!this.options.disabled){var d= +this.options,b=this.opos[0],g=this.opos[1],h=c.pageX,i=c.pageY;if(b>h){var j=h;h=b;b=j}if(g>i){j=i;i=g;g=j}this.helper.css({left:b,top:g,width:h-b,height:i-g});this.selectees.each(function(){var a=e.data(this,"selectable-item");if(!(!a||a.element==f.element[0])){var k=false;if(d.tolerance=="touch")k=!(a.left>h||a.righti||a.bottomb&&a.rightg&&a.bottom *",opacity:false,placeholder:false,revert:false,scroll:true,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1E3},_create:function(){var a=this.options;this.containerCache={};this.element.addClass("ui-sortable"); +this.refresh();this.floating=this.items.length?a.axis==="x"||/left|right/.test(this.items[0].item.css("float"))||/inline|table-cell/.test(this.items[0].item.css("display")):false;this.offset=this.element.offset();this._mouseInit()},destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled").removeData("sortable").unbind(".sortable");this._mouseDestroy();for(var a=this.items.length-1;a>=0;a--)this.items[a].item.removeData("sortable-item");return this},_setOption:function(a,b){if(a=== +"disabled"){this.options[a]=b;this.widget()[b?"addClass":"removeClass"]("ui-sortable-disabled")}else d.Widget.prototype._setOption.apply(this,arguments)},_mouseCapture:function(a,b){if(this.reverting)return false;if(this.options.disabled||this.options.type=="static")return false;this._refreshItems(a);var c=null,e=this;d(a.target).parents().each(function(){if(d.data(this,"sortable-item")==e){c=d(this);return false}});if(d.data(a.target,"sortable-item")==e)c=d(a.target);if(!c)return false;if(this.options.handle&& +!b){var f=false;d(this.options.handle,c).find("*").andSelf().each(function(){if(this==a.target)f=true});if(!f)return false}this.currentItem=c;this._removeCurrentsFromItems();return true},_mouseStart:function(a,b,c){b=this.options;var e=this;this.currentContainer=this;this.refreshPositions();this.helper=this._createHelper(a);this._cacheHelperProportions();this._cacheMargins();this.scrollParent=this.helper.scrollParent();this.offset=this.currentItem.offset();this.offset={top:this.offset.top-this.margins.top, +left:this.offset.left-this.margins.left};this.helper.css("position","absolute");this.cssPosition=this.helper.css("position");d.extend(this.offset,{click:{left:a.pageX-this.offset.left,top:a.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this._generatePosition(a);this.originalPageX=a.pageX;this.originalPageY=a.pageY;b.cursorAt&&this._adjustOffsetFromHelper(b.cursorAt);this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]}; +this.helper[0]!=this.currentItem[0]&&this.currentItem.hide();this._createPlaceholder();b.containment&&this._setContainment();if(b.cursor){if(d("body").css("cursor"))this._storedCursor=d("body").css("cursor");d("body").css("cursor",b.cursor)}if(b.opacity){if(this.helper.css("opacity"))this._storedOpacity=this.helper.css("opacity");this.helper.css("opacity",b.opacity)}if(b.zIndex){if(this.helper.css("zIndex"))this._storedZIndex=this.helper.css("zIndex");this.helper.css("zIndex",b.zIndex)}if(this.scrollParent[0]!= +document&&this.scrollParent[0].tagName!="HTML")this.overflowOffset=this.scrollParent.offset();this._trigger("start",a,this._uiHash());this._preserveHelperProportions||this._cacheHelperProportions();if(!c)for(c=this.containers.length-1;c>=0;c--)this.containers[c]._trigger("activate",a,e._uiHash(this));if(d.ui.ddmanager)d.ui.ddmanager.current=this;d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a);this.dragging=true;this.helper.addClass("ui-sortable-helper");this._mouseDrag(a); +return true},_mouseDrag:function(a){this.position=this._generatePosition(a);this.positionAbs=this._convertPositionTo("absolute");if(!this.lastPositionAbs)this.lastPositionAbs=this.positionAbs;if(this.options.scroll){var b=this.options,c=false;if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"){if(this.overflowOffset.top+this.scrollParent[0].offsetHeight-a.pageY=0;b--){c=this.items[b];var e=c.item[0],f=this._intersectsWithPointer(c);if(f)if(e!=this.currentItem[0]&&this.placeholder[f==1?"next":"prev"]()[0]!=e&&!d.ui.contains(this.placeholder[0],e)&&(this.options.type=="semi-dynamic"?!d.ui.contains(this.element[0], +e):true)){this.direction=f==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(c))this._rearrange(a,c);else break;this._trigger("change",a,this._uiHash());break}}this._contactContainers(a);d.ui.ddmanager&&d.ui.ddmanager.drag(this,a);this._trigger("sort",a,this._uiHash());this.lastPositionAbs=this.positionAbs;return false},_mouseStop:function(a,b){if(a){d.ui.ddmanager&&!this.options.dropBehaviour&&d.ui.ddmanager.drop(this,a);if(this.options.revert){var c=this;b=c.placeholder.offset(); +c.reverting=true;d(this.helper).animate({left:b.left-this.offset.parent.left-c.margins.left+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollLeft),top:b.top-this.offset.parent.top-c.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){c._clear(a)})}else this._clear(a,b);return false}},cancel:function(){var a=this;if(this.dragging){this._mouseUp({target:null});this.options.helper=="original"?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"): +this.currentItem.show();for(var b=this.containers.length-1;b>=0;b--){this.containers[b]._trigger("deactivate",null,a._uiHash(this));if(this.containers[b].containerCache.over){this.containers[b]._trigger("out",null,a._uiHash(this));this.containers[b].containerCache.over=0}}}if(this.placeholder){this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]);this.options.helper!="original"&&this.helper&&this.helper[0].parentNode&&this.helper.remove();d.extend(this,{helper:null, +dragging:false,reverting:false,_noFinalSort:null});this.domPosition.prev?d(this.domPosition.prev).after(this.currentItem):d(this.domPosition.parent).prepend(this.currentItem)}return this},serialize:function(a){var b=this._getItemsAsjQuery(a&&a.connected),c=[];a=a||{};d(b).each(function(){var e=(d(a.item||this).attr(a.attribute||"id")||"").match(a.expression||/(.+)[-=_](.+)/);if(e)c.push((a.key||e[1]+"[]")+"="+(a.key&&a.expression?e[1]:e[2]))});!c.length&&a.key&&c.push(a.key+"=");return c.join("&")}, +toArray:function(a){var b=this._getItemsAsjQuery(a&&a.connected),c=[];a=a||{};b.each(function(){c.push(d(a.item||this).attr(a.attribute||"id")||"")});return c},_intersectsWith:function(a){var b=this.positionAbs.left,c=b+this.helperProportions.width,e=this.positionAbs.top,f=e+this.helperProportions.height,g=a.left,h=g+a.width,i=a.top,k=i+a.height,j=this.offset.click.top,l=this.offset.click.left;j=e+j>i&&e+jg&&b+la[this.floating?"width":"height"]?j:g0?"down":"up")},_getDragHorizontalDirection:function(){var a=this.positionAbs.left-this.lastPositionAbs.left;return a!=0&&(a>0?"right":"left")},refresh:function(a){this._refreshItems(a);this.refreshPositions();return this},_connectWith:function(){var a=this.options;return a.connectWith.constructor==String?[a.connectWith]:a.connectWith},_getItemsAsjQuery:function(a){var b=[],c=[],e=this._connectWith(); +if(e&&a)for(a=e.length-1;a>=0;a--)for(var f=d(e[a]),g=f.length-1;g>=0;g--){var h=d.data(f[g],"sortable");if(h&&h!=this&&!h.options.disabled)c.push([d.isFunction(h.options.items)?h.options.items.call(h.element):d(h.options.items,h.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),h])}c.push([d.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):d(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"), +this]);for(a=c.length-1;a>=0;a--)c[a][0].each(function(){b.push(this)});return d(b)},_removeCurrentsFromItems:function(){for(var a=this.currentItem.find(":data(sortable-item)"),b=0;b=0;f--)for(var g=d(e[f]),h=g.length-1;h>=0;h--){var i=d.data(g[h],"sortable");if(i&&i!=this&&!i.options.disabled){c.push([d.isFunction(i.options.items)?i.options.items.call(i.element[0],a,{item:this.currentItem}):d(i.options.items,i.element),i]);this.containers.push(i)}}for(f=c.length-1;f>=0;f--){a=c[f][1];e=c[f][0];h=0;for(g=e.length;h=0;b--){var c=this.items[b];if(!(c.instance!=this.currentContainer&&this.currentContainer&&c.item[0]!=this.currentItem[0])){var e=this.options.toleranceElement?d(this.options.toleranceElement,c.item):c.item;if(!a){c.width=e.outerWidth();c.height=e.outerHeight()}e=e.offset();c.left=e.left;c.top=e.top}}if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(b= +this.containers.length-1;b>=0;b--){e=this.containers[b].element.offset();this.containers[b].containerCache.left=e.left;this.containers[b].containerCache.top=e.top;this.containers[b].containerCache.width=this.containers[b].element.outerWidth();this.containers[b].containerCache.height=this.containers[b].element.outerHeight()}return this},_createPlaceholder:function(a){var b=a||this,c=b.options;if(!c.placeholder||c.placeholder.constructor==String){var e=c.placeholder;c.placeholder={element:function(){var f= +d(document.createElement(b.currentItem[0].nodeName)).addClass(e||b.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];if(!e)f.style.visibility="hidden";return f},update:function(f,g){if(!(e&&!c.forcePlaceholderSize)){g.height()||g.height(b.currentItem.innerHeight()-parseInt(b.currentItem.css("paddingTop")||0,10)-parseInt(b.currentItem.css("paddingBottom")||0,10));g.width()||g.width(b.currentItem.innerWidth()-parseInt(b.currentItem.css("paddingLeft")||0,10)-parseInt(b.currentItem.css("paddingRight")|| +0,10))}}}}b.placeholder=d(c.placeholder.element.call(b.element,b.currentItem));b.currentItem.after(b.placeholder);c.placeholder.update(b,b.placeholder)},_contactContainers:function(a){for(var b=null,c=null,e=this.containers.length-1;e>=0;e--)if(!d.ui.contains(this.currentItem[0],this.containers[e].element[0]))if(this._intersectsWith(this.containers[e].containerCache)){if(!(b&&d.ui.contains(this.containers[e].element[0],b.element[0]))){b=this.containers[e];c=e}}else if(this.containers[e].containerCache.over){this.containers[e]._trigger("out", +a,this._uiHash(this));this.containers[e].containerCache.over=0}if(b)if(this.containers.length===1){this.containers[c]._trigger("over",a,this._uiHash(this));this.containers[c].containerCache.over=1}else if(this.currentContainer!=this.containers[c]){b=1E4;e=null;for(var f=this.positionAbs[this.containers[c].floating?"left":"top"],g=this.items.length-1;g>=0;g--)if(d.ui.contains(this.containers[c].element[0],this.items[g].item[0])){var h=this.items[g][this.containers[c].floating?"left":"top"];if(Math.abs(h- +f)this.containment[2])f=this.containment[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>this.containment[3])g=this.containment[3]+this.offset.click.top}if(b.grid){g=this.originalPageY+Math.round((g- +this.originalPageY)/b.grid[1])*b.grid[1];g=this.containment?!(g-this.offset.click.topthis.containment[3])?g:!(g-this.offset.click.topthis.containment[2])?f:!(f-this.offset.click.left=0;e--)if(d.ui.contains(this.containers[e].element[0],this.currentItem[0])&&!b){c.push(function(f){return function(g){f._trigger("receive",g,this._uiHash(this))}}.call(this,this.containers[e]));c.push(function(f){return function(g){f._trigger("update",g,this._uiHash(this))}}.call(this,this.containers[e]))}}for(e=this.containers.length-1;e>=0;e--){b||c.push(function(f){return function(g){f._trigger("deactivate",g,this._uiHash(this))}}.call(this, +this.containers[e]));if(this.containers[e].containerCache.over){c.push(function(f){return function(g){f._trigger("out",g,this._uiHash(this))}}.call(this,this.containers[e]));this.containers[e].containerCache.over=0}}this._storedCursor&&d("body").css("cursor",this._storedCursor);this._storedOpacity&&this.helper.css("opacity",this._storedOpacity);if(this._storedZIndex)this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex);this.dragging=false;if(this.cancelHelperRemoval){if(!b){this._trigger("beforeStop", +a,this._uiHash());for(e=0;e li > :first-child,> :not(li):even",icons:{header:"ui-icon-triangle-1-e",headerSelected:"ui-icon-triangle-1-s"},navigation:false,navigationFilter:function(){return this.href.toLowerCase()===location.href.toLowerCase()}},_create:function(){var a=this,b=a.options;a.running=0;a.element.addClass("ui-accordion ui-widget ui-helper-reset").children("li").addClass("ui-accordion-li-fix"); +a.headers=a.element.find(b.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all").bind("mouseenter.accordion",function(){b.disabled||c(this).addClass("ui-state-hover")}).bind("mouseleave.accordion",function(){b.disabled||c(this).removeClass("ui-state-hover")}).bind("focus.accordion",function(){b.disabled||c(this).addClass("ui-state-focus")}).bind("blur.accordion",function(){b.disabled||c(this).removeClass("ui-state-focus")});a.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom"); +if(b.navigation){var d=a.element.find("a").filter(b.navigationFilter).eq(0);if(d.length){var h=d.closest(".ui-accordion-header");a.active=h.length?h:d.closest(".ui-accordion-content").prev()}}a.active=a._findActive(a.active||b.active).addClass("ui-state-default ui-state-active").toggleClass("ui-corner-all").toggleClass("ui-corner-top");a.active.next().addClass("ui-accordion-content-active");a._createIcons();a.resize();a.element.attr("role","tablist");a.headers.attr("role","tab").bind("keydown.accordion", +function(f){return a._keydown(f)}).next().attr("role","tabpanel");a.headers.not(a.active||"").attr({"aria-expanded":"false","aria-selected":"false",tabIndex:-1}).next().hide();a.active.length?a.active.attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}):a.headers.eq(0).attr("tabIndex",0);c.browser.safari||a.headers.find("a").attr("tabIndex",-1);b.event&&a.headers.bind(b.event.split(" ").join(".accordion ")+".accordion",function(f){a._clickHandler.call(a,f,this);f.preventDefault()})},_createIcons:function(){var a= +this.options;if(a.icons){c("").addClass("ui-icon "+a.icons.header).prependTo(this.headers);this.active.children(".ui-icon").toggleClass(a.icons.header).toggleClass(a.icons.headerSelected);this.element.addClass("ui-accordion-icons")}},_destroyIcons:function(){this.headers.children(".ui-icon").remove();this.element.removeClass("ui-accordion-icons")},destroy:function(){var a=this.options;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role");this.headers.unbind(".accordion").removeClass("ui-accordion-header ui-accordion-disabled ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("aria-selected").removeAttr("tabIndex"); +this.headers.find("a").removeAttr("tabIndex");this._destroyIcons();var b=this.headers.next().css("display","").removeAttr("role").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-accordion-disabled ui-state-disabled");if(a.autoHeight||a.fillHeight)b.css("height","");return c.Widget.prototype.destroy.call(this)},_setOption:function(a,b){c.Widget.prototype._setOption.apply(this,arguments);a=="active"&&this.activate(b);if(a=="icons"){this._destroyIcons(); +b&&this._createIcons()}if(a=="disabled")this.headers.add(this.headers.next())[b?"addClass":"removeClass"]("ui-accordion-disabled ui-state-disabled")},_keydown:function(a){if(!(this.options.disabled||a.altKey||a.ctrlKey)){var b=c.ui.keyCode,d=this.headers.length,h=this.headers.index(a.target),f=false;switch(a.keyCode){case b.RIGHT:case b.DOWN:f=this.headers[(h+1)%d];break;case b.LEFT:case b.UP:f=this.headers[(h-1+d)%d];break;case b.SPACE:case b.ENTER:this._clickHandler({target:a.target},a.target); +a.preventDefault()}if(f){c(a.target).attr("tabIndex",-1);c(f).attr("tabIndex",0);f.focus();return false}return true}},resize:function(){var a=this.options,b;if(a.fillSpace){if(c.browser.msie){var d=this.element.parent().css("overflow");this.element.parent().css("overflow","hidden")}b=this.element.parent().height();c.browser.msie&&this.element.parent().css("overflow",d);this.headers.each(function(){b-=c(this).outerHeight(true)});this.headers.next().each(function(){c(this).height(Math.max(0,b-c(this).innerHeight()+ +c(this).height()))}).css("overflow","auto")}else if(a.autoHeight){b=0;this.headers.next().each(function(){b=Math.max(b,c(this).height("").height())}).height(b)}return this},activate:function(a){this.options.active=a;a=this._findActive(a)[0];this._clickHandler({target:a},a);return this},_findActive:function(a){return a?typeof a==="number"?this.headers.filter(":eq("+a+")"):this.headers.not(this.headers.not(a)):a===false?c([]):this.headers.filter(":eq(0)")},_clickHandler:function(a,b){var d=this.options; +if(!d.disabled)if(a.target){a=c(a.currentTarget||b);b=a[0]===this.active[0];d.active=d.collapsible&&b?false:this.headers.index(a);if(!(this.running||!d.collapsible&&b)){var h=this.active;j=a.next();g=this.active.next();e={options:d,newHeader:b&&d.collapsible?c([]):a,oldHeader:this.active,newContent:b&&d.collapsible?c([]):j,oldContent:g};var f=this.headers.index(this.active[0])>this.headers.index(a[0]);this.active=b?c([]):a;this._toggle(j,g,e,b,f);h.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header); +if(!b){a.removeClass("ui-state-default ui-corner-all").addClass("ui-state-active ui-corner-top").children(".ui-icon").removeClass(d.icons.header).addClass(d.icons.headerSelected);a.next().addClass("ui-accordion-content-active")}}}else if(d.collapsible){this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header);this.active.next().addClass("ui-accordion-content-active");var g=this.active.next(), +e={options:d,newHeader:c([]),oldHeader:d.active,newContent:c([]),oldContent:g},j=this.active=c([]);this._toggle(j,g,e)}},_toggle:function(a,b,d,h,f){var g=this,e=g.options;g.toShow=a;g.toHide=b;g.data=d;var j=function(){if(g)return g._completed.apply(g,arguments)};g._trigger("changestart",null,g.data);g.running=b.size()===0?a.size():b.size();if(e.animated){d={};d=e.collapsible&&h?{toShow:c([]),toHide:b,complete:j,down:f,autoHeight:e.autoHeight||e.fillSpace}:{toShow:a,toHide:b,complete:j,down:f,autoHeight:e.autoHeight|| +e.fillSpace};if(!e.proxied)e.proxied=e.animated;if(!e.proxiedDuration)e.proxiedDuration=e.duration;e.animated=c.isFunction(e.proxied)?e.proxied(d):e.proxied;e.duration=c.isFunction(e.proxiedDuration)?e.proxiedDuration(d):e.proxiedDuration;h=c.ui.accordion.animations;var i=e.duration,k=e.animated;if(k&&!h[k]&&!c.easing[k])k="slide";h[k]||(h[k]=function(l){this.slide(l,{easing:k,duration:i||700})});h[k](d)}else{if(e.collapsible&&h)a.toggle();else{b.hide();a.show()}j(true)}b.prev().attr({"aria-expanded":"false", +"aria-selected":"false",tabIndex:-1}).blur();a.prev().attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}).focus()},_completed:function(a){this.running=a?0:--this.running;if(!this.running){this.options.clearStyle&&this.toShow.add(this.toHide).css({height:"",overflow:""});this.toHide.removeClass("ui-accordion-content-active");if(this.toHide.length)this.toHide.parent()[0].className=this.toHide.parent()[0].className;this._trigger("change",null,this.data)}}});c.extend(c.ui.accordion,{version:"1.8.16", +animations:{slide:function(a,b){a=c.extend({easing:"swing",duration:300},a,b);if(a.toHide.size())if(a.toShow.size()){var d=a.toShow.css("overflow"),h=0,f={},g={},e;b=a.toShow;e=b[0].style.width;b.width(parseInt(b.parent().width(),10)-parseInt(b.css("paddingLeft"),10)-parseInt(b.css("paddingRight"),10)-(parseInt(b.css("borderLeftWidth"),10)||0)-(parseInt(b.css("borderRightWidth"),10)||0));c.each(["height","paddingTop","paddingBottom"],function(j,i){g[i]="hide";j=(""+c.css(a.toShow[0],i)).match(/^([\d+-.]+)(.*)$/); +f[i]={value:j[1],unit:j[2]||"px"}});a.toShow.css({height:0,overflow:"hidden"}).show();a.toHide.filter(":hidden").each(a.complete).end().filter(":visible").animate(g,{step:function(j,i){if(i.prop=="height")h=i.end-i.start===0?0:(i.now-i.start)/(i.end-i.start);a.toShow[0].style[i.prop]=h*f[i.prop].value+f[i.prop].unit},duration:a.duration,easing:a.easing,complete:function(){a.autoHeight||a.toShow.css("height","");a.toShow.css({width:e,overflow:d});a.complete()}})}else a.toHide.animate({height:"hide", +paddingTop:"hide",paddingBottom:"hide"},a);else a.toShow.animate({height:"show",paddingTop:"show",paddingBottom:"show"},a)},bounceslide:function(a){this.slide(a,{easing:a.down?"easeOutBounce":"swing",duration:a.down?1E3:200})}}})})(jQuery); +;/* + * jQuery UI Autocomplete 1.8.16 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Autocomplete + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + * jquery.ui.position.js + */ +(function(d){var e=0;d.widget("ui.autocomplete",{options:{appendTo:"body",autoFocus:false,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null},pending:0,_create:function(){var a=this,b=this.element[0].ownerDocument,g;this.element.addClass("ui-autocomplete-input").attr("autocomplete","off").attr({role:"textbox","aria-autocomplete":"list","aria-haspopup":"true"}).bind("keydown.autocomplete",function(c){if(!(a.options.disabled||a.element.propAttr("readOnly"))){g= +false;var f=d.ui.keyCode;switch(c.keyCode){case f.PAGE_UP:a._move("previousPage",c);break;case f.PAGE_DOWN:a._move("nextPage",c);break;case f.UP:a._move("previous",c);c.preventDefault();break;case f.DOWN:a._move("next",c);c.preventDefault();break;case f.ENTER:case f.NUMPAD_ENTER:if(a.menu.active){g=true;c.preventDefault()}case f.TAB:if(!a.menu.active)return;a.menu.select(c);break;case f.ESCAPE:a.element.val(a.term);a.close(c);break;default:clearTimeout(a.searching);a.searching=setTimeout(function(){if(a.term!= +a.element.val()){a.selectedItem=null;a.search(null,c)}},a.options.delay);break}}}).bind("keypress.autocomplete",function(c){if(g){g=false;c.preventDefault()}}).bind("focus.autocomplete",function(){if(!a.options.disabled){a.selectedItem=null;a.previous=a.element.val()}}).bind("blur.autocomplete",function(c){if(!a.options.disabled){clearTimeout(a.searching);a.closing=setTimeout(function(){a.close(c);a._change(c)},150)}});this._initSource();this.response=function(){return a._response.apply(a,arguments)}; +this.menu=d("
      ").addClass("ui-autocomplete").appendTo(d(this.options.appendTo||"body",b)[0]).mousedown(function(c){var f=a.menu.element[0];d(c.target).closest(".ui-menu-item").length||setTimeout(function(){d(document).one("mousedown",function(h){h.target!==a.element[0]&&h.target!==f&&!d.ui.contains(f,h.target)&&a.close()})},1);setTimeout(function(){clearTimeout(a.closing)},13)}).menu({focus:function(c,f){f=f.item.data("item.autocomplete");false!==a._trigger("focus",c,{item:f})&&/^key/.test(c.originalEvent.type)&& +a.element.val(f.value)},selected:function(c,f){var h=f.item.data("item.autocomplete"),i=a.previous;if(a.element[0]!==b.activeElement){a.element.focus();a.previous=i;setTimeout(function(){a.previous=i;a.selectedItem=h},1)}false!==a._trigger("select",c,{item:h})&&a.element.val(h.value);a.term=a.element.val();a.close(c);a.selectedItem=h},blur:function(){a.menu.element.is(":visible")&&a.element.val()!==a.term&&a.element.val(a.term)}}).zIndex(this.element.zIndex()+1).css({top:0,left:0}).hide().data("menu"); +d.fn.bgiframe&&this.menu.element.bgiframe()},destroy:function(){this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete").removeAttr("role").removeAttr("aria-autocomplete").removeAttr("aria-haspopup");this.menu.element.remove();d.Widget.prototype.destroy.call(this)},_setOption:function(a,b){d.Widget.prototype._setOption.apply(this,arguments);a==="source"&&this._initSource();if(a==="appendTo")this.menu.element.appendTo(d(b||"body",this.element[0].ownerDocument)[0]);a==="disabled"&& +b&&this.xhr&&this.xhr.abort()},_initSource:function(){var a=this,b,g;if(d.isArray(this.options.source)){b=this.options.source;this.source=function(c,f){f(d.ui.autocomplete.filter(b,c.term))}}else if(typeof this.options.source==="string"){g=this.options.source;this.source=function(c,f){a.xhr&&a.xhr.abort();a.xhr=d.ajax({url:g,data:c,dataType:"json",autocompleteRequest:++e,success:function(h){this.autocompleteRequest===e&&f(h)},error:function(){this.autocompleteRequest===e&&f([])}})}}else this.source= +this.options.source},search:function(a,b){a=a!=null?a:this.element.val();this.term=this.element.val();if(a.length").data("item.autocomplete",b).append(d("").text(b.label)).appendTo(a)},_move:function(a,b){if(this.menu.element.is(":visible"))if(this.menu.first()&&/^previous/.test(a)||this.menu.last()&&/^next/.test(a)){this.element.val(this.term);this.menu.deactivate()}else this.menu[a](b);else this.search(null,b)},widget:function(){return this.menu.element}});d.extend(d.ui.autocomplete,{escapeRegex:function(a){return a.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, +"\\$&")},filter:function(a,b){var g=new RegExp(d.ui.autocomplete.escapeRegex(b),"i");return d.grep(a,function(c){return g.test(c.label||c.value||c)})}})})(jQuery); +(function(d){d.widget("ui.menu",{_create:function(){var e=this;this.element.addClass("ui-menu ui-widget ui-widget-content ui-corner-all").attr({role:"listbox","aria-activedescendant":"ui-active-menuitem"}).click(function(a){if(d(a.target).closest(".ui-menu-item a").length){a.preventDefault();e.select(a)}});this.refresh()},refresh:function(){var e=this;this.element.children("li:not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","menuitem").children("a").addClass("ui-corner-all").attr("tabindex", +-1).mouseenter(function(a){e.activate(a,d(this).parent())}).mouseleave(function(){e.deactivate()})},activate:function(e,a){this.deactivate();if(this.hasScroll()){var b=a.offset().top-this.element.offset().top,g=this.element.scrollTop(),c=this.element.height();if(b<0)this.element.scrollTop(g+b);else b>=c&&this.element.scrollTop(g+b-c+a.height())}this.active=a.eq(0).children("a").addClass("ui-state-hover").attr("id","ui-active-menuitem").end();this._trigger("focus",e,{item:a})},deactivate:function(){if(this.active){this.active.children("a").removeClass("ui-state-hover").removeAttr("id"); +this._trigger("blur");this.active=null}},next:function(e){this.move("next",".ui-menu-item:first",e)},previous:function(e){this.move("prev",".ui-menu-item:last",e)},first:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},last:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},move:function(e,a,b){if(this.active){e=this.active[e+"All"](".ui-menu-item").eq(0);e.length?this.activate(b,e):this.activate(b,this.element.children(a))}else this.activate(b, +this.element.children(a))},nextPage:function(e){if(this.hasScroll())if(!this.active||this.last())this.activate(e,this.element.children(".ui-menu-item:first"));else{var a=this.active.offset().top,b=this.element.height(),g=this.element.children(".ui-menu-item").filter(function(){var c=d(this).offset().top-a-b+d(this).height();return c<10&&c>-10});g.length||(g=this.element.children(".ui-menu-item:last"));this.activate(e,g)}else this.activate(e,this.element.children(".ui-menu-item").filter(!this.active|| +this.last()?":first":":last"))},previousPage:function(e){if(this.hasScroll())if(!this.active||this.first())this.activate(e,this.element.children(".ui-menu-item:last"));else{var a=this.active.offset().top,b=this.element.height();result=this.element.children(".ui-menu-item").filter(function(){var g=d(this).offset().top-a+b-d(this).height();return g<10&&g>-10});result.length||(result=this.element.children(".ui-menu-item:first"));this.activate(e,result)}else this.activate(e,this.element.children(".ui-menu-item").filter(!this.active|| +this.first()?":last":":first"))},hasScroll:function(){return this.element.height()").addClass("ui-button-text").html(this.options.label).appendTo(a.empty()).text(),e=this.options.icons,f=e.primary&&e.secondary,d=[];if(e.primary||e.secondary){if(this.options.text)d.push("ui-button-text-icon"+(f?"s":e.primary?"-primary":"-secondary"));e.primary&&a.prepend("");e.secondary&&a.append("");if(!this.options.text){d.push(f?"ui-button-icons-only": +"ui-button-icon-only");this.hasTitle||a.attr("title",c)}}else d.push("ui-button-text-only");a.addClass(d.join(" "))}}});b.widget("ui.buttonset",{options:{items:":button, :submit, :reset, :checkbox, :radio, a, :data(button)"},_create:function(){this.element.addClass("ui-buttonset")},_init:function(){this.refresh()},_setOption:function(a,c){a==="disabled"&&this.buttons.button("option",a,c);b.Widget.prototype._setOption.apply(this,arguments)},refresh:function(){var a=this.element.css("direction")=== +"ltr";this.buttons=this.element.find(this.options.items).filter(":ui-button").button("refresh").end().not(":ui-button").button().end().map(function(){return b(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass(a?"ui-corner-left":"ui-corner-right").end().filter(":last").addClass(a?"ui-corner-right":"ui-corner-left").end().end()},destroy:function(){this.element.removeClass("ui-buttonset");this.buttons.map(function(){return b(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy"); +b.Widget.prototype.destroy.call(this)}})})(jQuery); +;/* + * jQuery UI Dialog 1.8.16 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Dialog + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + * jquery.ui.button.js + * jquery.ui.draggable.js + * jquery.ui.mouse.js + * jquery.ui.position.js + * jquery.ui.resizable.js + */ +(function(c,l){var m={buttons:true,height:true,maxHeight:true,maxWidth:true,minHeight:true,minWidth:true,width:true},n={maxHeight:true,maxWidth:true,minHeight:true,minWidth:true},o=c.attrFn||{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true,click:true};c.widget("ui.dialog",{options:{autoOpen:true,buttons:{},closeOnEscape:true,closeText:"close",dialogClass:"",draggable:true,hide:null,height:"auto",maxHeight:false,maxWidth:false,minHeight:150,minWidth:150,modal:false, +position:{my:"center",at:"center",collision:"fit",using:function(a){var b=c(this).css(a).offset().top;b<0&&c(this).css("top",a.top-b)}},resizable:true,show:null,stack:true,title:"",width:300,zIndex:1E3},_create:function(){this.originalTitle=this.element.attr("title");if(typeof this.originalTitle!=="string")this.originalTitle="";this.options.title=this.options.title||this.originalTitle;var a=this,b=a.options,d=b.title||" ",e=c.ui.dialog.getTitleId(a.element),g=(a.uiDialog=c("
      ")).appendTo(document.body).hide().addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+ +b.dialogClass).css({zIndex:b.zIndex}).attr("tabIndex",-1).css("outline",0).keydown(function(i){if(b.closeOnEscape&&!i.isDefaultPrevented()&&i.keyCode&&i.keyCode===c.ui.keyCode.ESCAPE){a.close(i);i.preventDefault()}}).attr({role:"dialog","aria-labelledby":e}).mousedown(function(i){a.moveToTop(false,i)});a.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(g);var f=(a.uiDialogTitlebar=c("
      ")).addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(g), +h=c('').addClass("ui-dialog-titlebar-close ui-corner-all").attr("role","button").hover(function(){h.addClass("ui-state-hover")},function(){h.removeClass("ui-state-hover")}).focus(function(){h.addClass("ui-state-focus")}).blur(function(){h.removeClass("ui-state-focus")}).click(function(i){a.close(i);return false}).appendTo(f);(a.uiDialogTitlebarCloseText=c("")).addClass("ui-icon ui-icon-closethick").text(b.closeText).appendTo(h);c("").addClass("ui-dialog-title").attr("id", +e).html(d).prependTo(f);if(c.isFunction(b.beforeclose)&&!c.isFunction(b.beforeClose))b.beforeClose=b.beforeclose;f.find("*").add(f).disableSelection();b.draggable&&c.fn.draggable&&a._makeDraggable();b.resizable&&c.fn.resizable&&a._makeResizable();a._createButtons(b.buttons);a._isOpen=false;c.fn.bgiframe&&g.bgiframe()},_init:function(){this.options.autoOpen&&this.open()},destroy:function(){var a=this;a.overlay&&a.overlay.destroy();a.uiDialog.hide();a.element.unbind(".dialog").removeData("dialog").removeClass("ui-dialog-content ui-widget-content").hide().appendTo("body"); +a.uiDialog.remove();a.originalTitle&&a.element.attr("title",a.originalTitle);return a},widget:function(){return this.uiDialog},close:function(a){var b=this,d,e;if(false!==b._trigger("beforeClose",a)){b.overlay&&b.overlay.destroy();b.uiDialog.unbind("keypress.ui-dialog");b._isOpen=false;if(b.options.hide)b.uiDialog.hide(b.options.hide,function(){b._trigger("close",a)});else{b.uiDialog.hide();b._trigger("close",a)}c.ui.dialog.overlay.resize();if(b.options.modal){d=0;c(".ui-dialog").each(function(){if(this!== +b.uiDialog[0]){e=c(this).css("z-index");isNaN(e)||(d=Math.max(d,e))}});c.ui.dialog.maxZ=d}return b}},isOpen:function(){return this._isOpen},moveToTop:function(a,b){var d=this,e=d.options;if(e.modal&&!a||!e.stack&&!e.modal)return d._trigger("focus",b);if(e.zIndex>c.ui.dialog.maxZ)c.ui.dialog.maxZ=e.zIndex;if(d.overlay){c.ui.dialog.maxZ+=1;d.overlay.$el.css("z-index",c.ui.dialog.overlay.maxZ=c.ui.dialog.maxZ)}a={scrollTop:d.element.scrollTop(),scrollLeft:d.element.scrollLeft()};c.ui.dialog.maxZ+=1; +d.uiDialog.css("z-index",c.ui.dialog.maxZ);d.element.attr(a);d._trigger("focus",b);return d},open:function(){if(!this._isOpen){var a=this,b=a.options,d=a.uiDialog;a.overlay=b.modal?new c.ui.dialog.overlay(a):null;a._size();a._position(b.position);d.show(b.show);a.moveToTop(true);b.modal&&d.bind("keypress.ui-dialog",function(e){if(e.keyCode===c.ui.keyCode.TAB){var g=c(":tabbable",this),f=g.filter(":first");g=g.filter(":last");if(e.target===g[0]&&!e.shiftKey){f.focus(1);return false}else if(e.target=== +f[0]&&e.shiftKey){g.focus(1);return false}}});c(a.element.find(":tabbable").get().concat(d.find(".ui-dialog-buttonpane :tabbable").get().concat(d.get()))).eq(0).focus();a._isOpen=true;a._trigger("open");return a}},_createButtons:function(a){var b=this,d=false,e=c("
      ").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),g=c("
      ").addClass("ui-dialog-buttonset").appendTo(e);b.uiDialog.find(".ui-dialog-buttonpane").remove();typeof a==="object"&&a!==null&&c.each(a, +function(){return!(d=true)});if(d){c.each(a,function(f,h){h=c.isFunction(h)?{click:h,text:f}:h;var i=c('').click(function(){h.click.apply(b.element[0],arguments)}).appendTo(g);c.each(h,function(j,k){if(j!=="click")j in o?i[j](k):i.attr(j,k)});c.fn.button&&i.button()});e.appendTo(b.uiDialog)}},_makeDraggable:function(){function a(f){return{position:f.position,offset:f.offset}}var b=this,d=b.options,e=c(document),g;b.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close", +handle:".ui-dialog-titlebar",containment:"document",start:function(f,h){g=d.height==="auto"?"auto":c(this).height();c(this).height(c(this).height()).addClass("ui-dialog-dragging");b._trigger("dragStart",f,a(h))},drag:function(f,h){b._trigger("drag",f,a(h))},stop:function(f,h){d.position=[h.position.left-e.scrollLeft(),h.position.top-e.scrollTop()];c(this).removeClass("ui-dialog-dragging").height(g);b._trigger("dragStop",f,a(h));c.ui.dialog.overlay.resize()}})},_makeResizable:function(a){function b(f){return{originalPosition:f.originalPosition, +originalSize:f.originalSize,position:f.position,size:f.size}}a=a===l?this.options.resizable:a;var d=this,e=d.options,g=d.uiDialog.css("position");a=typeof a==="string"?a:"n,e,s,w,se,sw,ne,nw";d.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:d.element,maxWidth:e.maxWidth,maxHeight:e.maxHeight,minWidth:e.minWidth,minHeight:d._minHeight(),handles:a,start:function(f,h){c(this).addClass("ui-dialog-resizing");d._trigger("resizeStart",f,b(h))},resize:function(f,h){d._trigger("resize", +f,b(h))},stop:function(f,h){c(this).removeClass("ui-dialog-resizing");e.height=c(this).height();e.width=c(this).width();d._trigger("resizeStop",f,b(h));c.ui.dialog.overlay.resize()}}).css("position",g).find(".ui-resizable-se").addClass("ui-icon ui-icon-grip-diagonal-se")},_minHeight:function(){var a=this.options;return a.height==="auto"?a.minHeight:Math.min(a.minHeight,a.height)},_position:function(a){var b=[],d=[0,0],e;if(a){if(typeof a==="string"||typeof a==="object"&&"0"in a){b=a.split?a.split(" "): +[a[0],a[1]];if(b.length===1)b[1]=b[0];c.each(["left","top"],function(g,f){if(+b[g]===b[g]){d[g]=b[g];b[g]=f}});a={my:b.join(" "),at:b.join(" "),offset:d.join(" ")}}a=c.extend({},c.ui.dialog.prototype.options.position,a)}else a=c.ui.dialog.prototype.options.position;(e=this.uiDialog.is(":visible"))||this.uiDialog.show();this.uiDialog.css({top:0,left:0}).position(c.extend({of:window},a));e||this.uiDialog.hide()},_setOptions:function(a){var b=this,d={},e=false;c.each(a,function(g,f){b._setOption(g,f); +if(g in m)e=true;if(g in n)d[g]=f});e&&this._size();this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option",d)},_setOption:function(a,b){var d=this,e=d.uiDialog;switch(a){case "beforeclose":a="beforeClose";break;case "buttons":d._createButtons(b);break;case "closeText":d.uiDialogTitlebarCloseText.text(""+b);break;case "dialogClass":e.removeClass(d.options.dialogClass).addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+b);break;case "disabled":b?e.addClass("ui-dialog-disabled"): +e.removeClass("ui-dialog-disabled");break;case "draggable":var g=e.is(":data(draggable)");g&&!b&&e.draggable("destroy");!g&&b&&d._makeDraggable();break;case "position":d._position(b);break;case "resizable":(g=e.is(":data(resizable)"))&&!b&&e.resizable("destroy");g&&typeof b==="string"&&e.resizable("option","handles",b);!g&&b!==false&&d._makeResizable(b);break;case "title":c(".ui-dialog-title",d.uiDialogTitlebar).html(""+(b||" "));break}c.Widget.prototype._setOption.apply(d,arguments)},_size:function(){var a= +this.options,b,d,e=this.uiDialog.is(":visible");this.element.show().css({width:"auto",minHeight:0,height:0});if(a.minWidth>a.width)a.width=a.minWidth;b=this.uiDialog.css({height:"auto",width:a.width}).height();d=Math.max(0,a.minHeight-b);if(a.height==="auto")if(c.support.minHeight)this.element.css({minHeight:d,height:"auto"});else{this.uiDialog.show();a=this.element.css("height","auto").height();e||this.uiDialog.hide();this.element.height(Math.max(a,d))}else this.element.height(Math.max(a.height- +b,0));this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())}});c.extend(c.ui.dialog,{version:"1.8.16",uuid:0,maxZ:0,getTitleId:function(a){a=a.attr("id");if(!a){this.uuid+=1;a=this.uuid}return"ui-dialog-title-"+a},overlay:function(a){this.$el=c.ui.dialog.overlay.create(a)}});c.extend(c.ui.dialog.overlay,{instances:[],oldInstances:[],maxZ:0,events:c.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),function(a){return a+".dialog-overlay"}).join(" "), +create:function(a){if(this.instances.length===0){setTimeout(function(){c.ui.dialog.overlay.instances.length&&c(document).bind(c.ui.dialog.overlay.events,function(d){if(c(d.target).zIndex()").addClass("ui-widget-overlay")).appendTo(document.body).css({width:this.width(),height:this.height()});c.fn.bgiframe&&b.bgiframe();this.instances.push(b);return b},destroy:function(a){var b=c.inArray(a,this.instances);b!=-1&&this.oldInstances.push(this.instances.splice(b,1)[0]);this.instances.length===0&&c([document,window]).unbind(".dialog-overlay");a.remove();var d=0;c.each(this.instances,function(){d=Math.max(d,this.css("z-index"))});this.maxZ=d},height:function(){var a,b;if(c.browser.msie&& +c.browser.version<7){a=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight);b=Math.max(document.documentElement.offsetHeight,document.body.offsetHeight);return a").appendTo(this.element).addClass("ui-slider-range ui-widget-header"+(b.range==="min"||b.range==="max"?" ui-slider-range-"+b.range:""))}for(var j=c.length;j"); +this.handles=c.add(d(e.join("")).appendTo(a.element));this.handle=this.handles.eq(0);this.handles.add(this.range).filter("a").click(function(g){g.preventDefault()}).hover(function(){b.disabled||d(this).addClass("ui-state-hover")},function(){d(this).removeClass("ui-state-hover")}).focus(function(){if(b.disabled)d(this).blur();else{d(".ui-slider .ui-state-focus").removeClass("ui-state-focus");d(this).addClass("ui-state-focus")}}).blur(function(){d(this).removeClass("ui-state-focus")});this.handles.each(function(g){d(this).data("index.ui-slider-handle", +g)});this.handles.keydown(function(g){var k=true,l=d(this).data("index.ui-slider-handle"),i,h,m;if(!a.options.disabled){switch(g.keyCode){case d.ui.keyCode.HOME:case d.ui.keyCode.END:case d.ui.keyCode.PAGE_UP:case d.ui.keyCode.PAGE_DOWN:case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:k=false;if(!a._keySliding){a._keySliding=true;d(this).addClass("ui-state-active");i=a._start(g,l);if(i===false)return}break}m=a.options.step;i=a.options.values&&a.options.values.length? +(h=a.values(l)):(h=a.value());switch(g.keyCode){case d.ui.keyCode.HOME:h=a._valueMin();break;case d.ui.keyCode.END:h=a._valueMax();break;case d.ui.keyCode.PAGE_UP:h=a._trimAlignValue(i+(a._valueMax()-a._valueMin())/5);break;case d.ui.keyCode.PAGE_DOWN:h=a._trimAlignValue(i-(a._valueMax()-a._valueMin())/5);break;case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:if(i===a._valueMax())return;h=a._trimAlignValue(i+m);break;case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:if(i===a._valueMin())return;h=a._trimAlignValue(i- +m);break}a._slide(g,l,h);return k}}).keyup(function(g){var k=d(this).data("index.ui-slider-handle");if(a._keySliding){a._keySliding=false;a._stop(g,k);a._change(g,k);d(this).removeClass("ui-state-active")}});this._refreshValue();this._animateOff=false},destroy:function(){this.handles.remove();this.range.remove();this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-slider-disabled ui-widget ui-widget-content ui-corner-all").removeData("slider").unbind(".slider");this._mouseDestroy(); +return this},_mouseCapture:function(a){var b=this.options,c,f,e,j,g;if(b.disabled)return false;this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()};this.elementOffset=this.element.offset();c=this._normValueFromMouse({x:a.pageX,y:a.pageY});f=this._valueMax()-this._valueMin()+1;j=this;this.handles.each(function(k){var l=Math.abs(c-j.values(k));if(f>l){f=l;e=d(this);g=k}});if(b.range===true&&this.values(1)===b.min){g+=1;e=d(this.handles[g])}if(this._start(a,g)===false)return false; +this._mouseSliding=true;j._handleIndex=g;e.addClass("ui-state-active").focus();b=e.offset();this._clickOffset=!d(a.target).parents().andSelf().is(".ui-slider-handle")?{left:0,top:0}:{left:a.pageX-b.left-e.width()/2,top:a.pageY-b.top-e.height()/2-(parseInt(e.css("borderTopWidth"),10)||0)-(parseInt(e.css("borderBottomWidth"),10)||0)+(parseInt(e.css("marginTop"),10)||0)};this.handles.hasClass("ui-state-hover")||this._slide(a,g,c);return this._animateOff=true},_mouseStart:function(){return true},_mouseDrag:function(a){var b= +this._normValueFromMouse({x:a.pageX,y:a.pageY});this._slide(a,this._handleIndex,b);return false},_mouseStop:function(a){this.handles.removeClass("ui-state-active");this._mouseSliding=false;this._stop(a,this._handleIndex);this._change(a,this._handleIndex);this._clickOffset=this._handleIndex=null;return this._animateOff=false},_detectOrientation:function(){this.orientation=this.options.orientation==="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(a){var b;if(this.orientation==="horizontal"){b= +this.elementSize.width;a=a.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)}else{b=this.elementSize.height;a=a.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)}b=a/b;if(b>1)b=1;if(b<0)b=0;if(this.orientation==="vertical")b=1-b;a=this._valueMax()-this._valueMin();return this._trimAlignValue(this._valueMin()+b*a)},_start:function(a,b){var c={handle:this.handles[b],value:this.value()};if(this.options.values&&this.options.values.length){c.value=this.values(b); +c.values=this.values()}return this._trigger("start",a,c)},_slide:function(a,b,c){var f;if(this.options.values&&this.options.values.length){f=this.values(b?0:1);if(this.options.values.length===2&&this.options.range===true&&(b===0&&c>f||b===1&&c1){this.options.values[a]=this._trimAlignValue(b);this._refreshValue();this._change(null,a)}else if(arguments.length)if(d.isArray(arguments[0])){c=this.options.values;f=arguments[0];for(e=0;e=this._valueMax())return this._valueMax();var b=this.options.step>0?this.options.step:1,c=(a-this._valueMin())%b;a=a-c;if(Math.abs(c)*2>=b)a+=c>0?b:-b;return parseFloat(a.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},_refreshValue:function(){var a= +this.options.range,b=this.options,c=this,f=!this._animateOff?b.animate:false,e,j={},g,k,l,i;if(this.options.values&&this.options.values.length)this.handles.each(function(h){e=(c.values(h)-c._valueMin())/(c._valueMax()-c._valueMin())*100;j[c.orientation==="horizontal"?"left":"bottom"]=e+"%";d(this).stop(1,1)[f?"animate":"css"](j,b.animate);if(c.options.range===true)if(c.orientation==="horizontal"){if(h===0)c.range.stop(1,1)[f?"animate":"css"]({left:e+"%"},b.animate);if(h===1)c.range[f?"animate":"css"]({width:e- +g+"%"},{queue:false,duration:b.animate})}else{if(h===0)c.range.stop(1,1)[f?"animate":"css"]({bottom:e+"%"},b.animate);if(h===1)c.range[f?"animate":"css"]({height:e-g+"%"},{queue:false,duration:b.animate})}g=e});else{k=this.value();l=this._valueMin();i=this._valueMax();e=i!==l?(k-l)/(i-l)*100:0;j[c.orientation==="horizontal"?"left":"bottom"]=e+"%";this.handle.stop(1,1)[f?"animate":"css"](j,b.animate);if(a==="min"&&this.orientation==="horizontal")this.range.stop(1,1)[f?"animate":"css"]({width:e+"%"}, +b.animate);if(a==="max"&&this.orientation==="horizontal")this.range[f?"animate":"css"]({width:100-e+"%"},{queue:false,duration:b.animate});if(a==="min"&&this.orientation==="vertical")this.range.stop(1,1)[f?"animate":"css"]({height:e+"%"},b.animate);if(a==="max"&&this.orientation==="vertical")this.range[f?"animate":"css"]({height:100-e+"%"},{queue:false,duration:b.animate})}}});d.extend(d.ui.slider,{version:"1.8.16"})})(jQuery); +;/* + * jQuery UI Tabs 1.8.16 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Tabs + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + */ +(function(d,p){function u(){return++v}function w(){return++x}var v=0,x=0;d.widget("ui.tabs",{options:{add:null,ajaxOptions:null,cache:false,cookie:null,collapsible:false,disable:null,disabled:[],enable:null,event:"click",fx:null,idPrefix:"ui-tabs-",load:null,panelTemplate:"
      ",remove:null,select:null,show:null,spinner:"Loading…",tabTemplate:"
    • #{label}
    • "},_create:function(){this._tabify(true)},_setOption:function(b,e){if(b=="selected")this.options.collapsible&& +e==this.options.selected||this.select(e);else{this.options[b]=e;this._tabify()}},_tabId:function(b){return b.title&&b.title.replace(/\s/g,"_").replace(/[^\w\u00c0-\uFFFF-]/g,"")||this.options.idPrefix+u()},_sanitizeSelector:function(b){return b.replace(/:/g,"\\:")},_cookie:function(){var b=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+w());return d.cookie.apply(null,[b].concat(d.makeArray(arguments)))},_ui:function(b,e){return{tab:b,panel:e,index:this.anchors.index(b)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var b= +d(this);b.html(b.data("label.tabs")).removeData("label.tabs")})},_tabify:function(b){function e(g,f){g.css("display","");!d.support.opacity&&f.opacity&&g[0].style.removeAttribute("filter")}var a=this,c=this.options,h=/^#.+/;this.list=this.element.find("ol,ul").eq(0);this.lis=d(" > li:has(a[href])",this.list);this.anchors=this.lis.map(function(){return d("a",this)[0]});this.panels=d([]);this.anchors.each(function(g,f){var i=d(f).attr("href"),l=i.split("#")[0],q;if(l&&(l===location.toString().split("#")[0]|| +(q=d("base")[0])&&l===q.href)){i=f.hash;f.href=i}if(h.test(i))a.panels=a.panels.add(a.element.find(a._sanitizeSelector(i)));else if(i&&i!=="#"){d.data(f,"href.tabs",i);d.data(f,"load.tabs",i.replace(/#.*$/,""));i=a._tabId(f);f.href="#"+i;f=a.element.find("#"+i);if(!f.length){f=d(c.panelTemplate).attr("id",i).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(a.panels[g-1]||a.list);f.data("destroy.tabs",true)}a.panels=a.panels.add(f)}else c.disabled.push(g)});if(b){this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all"); +this.list.addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.lis.addClass("ui-state-default ui-corner-top");this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom");if(c.selected===p){location.hash&&this.anchors.each(function(g,f){if(f.hash==location.hash){c.selected=g;return false}});if(typeof c.selected!=="number"&&c.cookie)c.selected=parseInt(a._cookie(),10);if(typeof c.selected!=="number"&&this.lis.filter(".ui-tabs-selected").length)c.selected= +this.lis.index(this.lis.filter(".ui-tabs-selected"));c.selected=c.selected||(this.lis.length?0:-1)}else if(c.selected===null)c.selected=-1;c.selected=c.selected>=0&&this.anchors[c.selected]||c.selected<0?c.selected:0;c.disabled=d.unique(c.disabled.concat(d.map(this.lis.filter(".ui-state-disabled"),function(g){return a.lis.index(g)}))).sort();d.inArray(c.selected,c.disabled)!=-1&&c.disabled.splice(d.inArray(c.selected,c.disabled),1);this.panels.addClass("ui-tabs-hide");this.lis.removeClass("ui-tabs-selected ui-state-active"); +if(c.selected>=0&&this.anchors.length){a.element.find(a._sanitizeSelector(a.anchors[c.selected].hash)).removeClass("ui-tabs-hide");this.lis.eq(c.selected).addClass("ui-tabs-selected ui-state-active");a.element.queue("tabs",function(){a._trigger("show",null,a._ui(a.anchors[c.selected],a.element.find(a._sanitizeSelector(a.anchors[c.selected].hash))[0]))});this.load(c.selected)}d(window).bind("unload",function(){a.lis.add(a.anchors).unbind(".tabs");a.lis=a.anchors=a.panels=null})}else c.selected=this.lis.index(this.lis.filter(".ui-tabs-selected")); +this.element[c.collapsible?"addClass":"removeClass"]("ui-tabs-collapsible");c.cookie&&this._cookie(c.selected,c.cookie);b=0;for(var j;j=this.lis[b];b++)d(j)[d.inArray(b,c.disabled)!=-1&&!d(j).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled");c.cache===false&&this.anchors.removeData("cache.tabs");this.lis.add(this.anchors).unbind(".tabs");if(c.event!=="mouseover"){var k=function(g,f){f.is(":not(.ui-state-disabled)")&&f.addClass("ui-state-"+g)},n=function(g,f){f.removeClass("ui-state-"+ +g)};this.lis.bind("mouseover.tabs",function(){k("hover",d(this))});this.lis.bind("mouseout.tabs",function(){n("hover",d(this))});this.anchors.bind("focus.tabs",function(){k("focus",d(this).closest("li"))});this.anchors.bind("blur.tabs",function(){n("focus",d(this).closest("li"))})}var m,o;if(c.fx)if(d.isArray(c.fx)){m=c.fx[0];o=c.fx[1]}else m=o=c.fx;var r=o?function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.hide().removeClass("ui-tabs-hide").animate(o,o.duration||"normal", +function(){e(f,o);a._trigger("show",null,a._ui(g,f[0]))})}:function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.removeClass("ui-tabs-hide");a._trigger("show",null,a._ui(g,f[0]))},s=m?function(g,f){f.animate(m,m.duration||"normal",function(){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");e(f,m);a.element.dequeue("tabs")})}:function(g,f){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");a.element.dequeue("tabs")}; +this.anchors.bind(c.event+".tabs",function(){var g=this,f=d(g).closest("li"),i=a.panels.filter(":not(.ui-tabs-hide)"),l=a.element.find(a._sanitizeSelector(g.hash));if(f.hasClass("ui-tabs-selected")&&!c.collapsible||f.hasClass("ui-state-disabled")||f.hasClass("ui-state-processing")||a.panels.filter(":animated").length||a._trigger("select",null,a._ui(this,l[0]))===false){this.blur();return false}c.selected=a.anchors.index(this);a.abort();if(c.collapsible)if(f.hasClass("ui-tabs-selected")){c.selected= +-1;c.cookie&&a._cookie(c.selected,c.cookie);a.element.queue("tabs",function(){s(g,i)}).dequeue("tabs");this.blur();return false}else if(!i.length){c.cookie&&a._cookie(c.selected,c.cookie);a.element.queue("tabs",function(){r(g,l)});a.load(a.anchors.index(this));this.blur();return false}c.cookie&&a._cookie(c.selected,c.cookie);if(l.length){i.length&&a.element.queue("tabs",function(){s(g,i)});a.element.queue("tabs",function(){r(g,l)});a.load(a.anchors.index(this))}else throw"jQuery UI Tabs: Mismatching fragment identifier."; +d.browser.msie&&this.blur()});this.anchors.bind("click.tabs",function(){return false})},_getIndex:function(b){if(typeof b=="string")b=this.anchors.index(this.anchors.filter("[href$="+b+"]"));return b},destroy:function(){var b=this.options;this.abort();this.element.unbind(".tabs").removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible").removeData("tabs");this.list.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.anchors.each(function(){var e= +d.data(this,"href.tabs");if(e)this.href=e;var a=d(this).unbind(".tabs");d.each(["href","load","cache"],function(c,h){a.removeData(h+".tabs")})});this.lis.unbind(".tabs").add(this.panels).each(function(){d.data(this,"destroy.tabs")?d(this).remove():d(this).removeClass("ui-state-default ui-corner-top ui-tabs-selected ui-state-active ui-state-hover ui-state-focus ui-state-disabled ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide")});b.cookie&&this._cookie(null,b.cookie);return this},add:function(b, +e,a){if(a===p)a=this.anchors.length;var c=this,h=this.options;e=d(h.tabTemplate.replace(/#\{href\}/g,b).replace(/#\{label\}/g,e));b=!b.indexOf("#")?b.replace("#",""):this._tabId(d("a",e)[0]);e.addClass("ui-state-default ui-corner-top").data("destroy.tabs",true);var j=c.element.find("#"+b);j.length||(j=d(h.panelTemplate).attr("id",b).data("destroy.tabs",true));j.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide");if(a>=this.lis.length){e.appendTo(this.list);j.appendTo(this.list[0].parentNode)}else{e.insertBefore(this.lis[a]); +j.insertBefore(this.panels[a])}h.disabled=d.map(h.disabled,function(k){return k>=a?++k:k});this._tabify();if(this.anchors.length==1){h.selected=0;e.addClass("ui-tabs-selected ui-state-active");j.removeClass("ui-tabs-hide");this.element.queue("tabs",function(){c._trigger("show",null,c._ui(c.anchors[0],c.panels[0]))});this.load(0)}this._trigger("add",null,this._ui(this.anchors[a],this.panels[a]));return this},remove:function(b){b=this._getIndex(b);var e=this.options,a=this.lis.eq(b).remove(),c=this.panels.eq(b).remove(); +if(a.hasClass("ui-tabs-selected")&&this.anchors.length>1)this.select(b+(b+1=b?--h:h});this._tabify();this._trigger("remove",null,this._ui(a.find("a")[0],c[0]));return this},enable:function(b){b=this._getIndex(b);var e=this.options;if(d.inArray(b,e.disabled)!=-1){this.lis.eq(b).removeClass("ui-state-disabled");e.disabled=d.grep(e.disabled,function(a){return a!=b});this._trigger("enable",null, +this._ui(this.anchors[b],this.panels[b]));return this}},disable:function(b){b=this._getIndex(b);var e=this.options;if(b!=e.selected){this.lis.eq(b).addClass("ui-state-disabled");e.disabled.push(b);e.disabled.sort();this._trigger("disable",null,this._ui(this.anchors[b],this.panels[b]))}return this},select:function(b){b=this._getIndex(b);if(b==-1)if(this.options.collapsible&&this.options.selected!=-1)b=this.options.selected;else return this;this.anchors.eq(b).trigger(this.options.event+".tabs");return this}, +load:function(b){b=this._getIndex(b);var e=this,a=this.options,c=this.anchors.eq(b)[0],h=d.data(c,"load.tabs");this.abort();if(!h||this.element.queue("tabs").length!==0&&d.data(c,"cache.tabs"))this.element.dequeue("tabs");else{this.lis.eq(b).addClass("ui-state-processing");if(a.spinner){var j=d("span",c);j.data("label.tabs",j.html()).html(a.spinner)}this.xhr=d.ajax(d.extend({},a.ajaxOptions,{url:h,success:function(k,n){e.element.find(e._sanitizeSelector(c.hash)).html(k);e._cleanup();a.cache&&d.data(c, +"cache.tabs",true);e._trigger("load",null,e._ui(e.anchors[b],e.panels[b]));try{a.ajaxOptions.success(k,n)}catch(m){}},error:function(k,n){e._cleanup();e._trigger("load",null,e._ui(e.anchors[b],e.panels[b]));try{a.ajaxOptions.error(k,n,b,c)}catch(m){}}}));e.element.dequeue("tabs");return this}},abort:function(){this.element.queue([]);this.panels.stop(false,true);this.element.queue("tabs",this.element.queue("tabs").splice(-2,2));if(this.xhr){this.xhr.abort();delete this.xhr}this._cleanup();return this}, +url:function(b,e){this.anchors.eq(b).removeData("cache.tabs").data("load.tabs",e);return this},length:function(){return this.anchors.length}});d.extend(d.ui.tabs,{version:"1.8.16"});d.extend(d.ui.tabs.prototype,{rotation:null,rotate:function(b,e){var a=this,c=this.options,h=a._rotate||(a._rotate=function(j){clearTimeout(a.rotation);a.rotation=setTimeout(function(){var k=c.selected;a.select(++k'))}function N(a){return a.bind("mouseout", +function(b){b=d(b.target).closest("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a");b.length&&b.removeClass("ui-state-hover ui-datepicker-prev-hover ui-datepicker-next-hover")}).bind("mouseover",function(b){b=d(b.target).closest("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a");if(!(d.datepicker._isDisabledDatepicker(J.inline?a.parent()[0]:J.input[0])||!b.length)){b.parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"); +b.addClass("ui-state-hover");b.hasClass("ui-datepicker-prev")&&b.addClass("ui-datepicker-prev-hover");b.hasClass("ui-datepicker-next")&&b.addClass("ui-datepicker-next-hover")}})}function H(a,b){d.extend(a,b);for(var c in b)if(b[c]==null||b[c]==C)a[c]=b[c];return a}d.extend(d.ui,{datepicker:{version:"1.8.16"}});var B=(new Date).getTime(),J;d.extend(M.prototype,{markerClassName:"hasDatepicker",maxRows:4,log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv}, +setDefaults:function(a){H(this._defaults,a||{});return this},_attachDatepicker:function(a,b){var c=null;for(var e in this._defaults){var f=a.getAttribute("date:"+e);if(f){c=c||{};try{c[e]=eval(f)}catch(h){c[e]=f}}}e=a.nodeName.toLowerCase();f=e=="div"||e=="span";if(!a.id){this.uuid+=1;a.id="dp"+this.uuid}var i=this._newInst(d(a),f);i.settings=d.extend({},b||{},c||{});if(e=="input")this._connectDatepicker(a,i);else f&&this._inlineDatepicker(a,i)},_newInst:function(a,b){return{id:a[0].id.replace(/([^A-Za-z0-9_-])/g, +"\\\\$1"),input:a,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:b,dpDiv:!b?this.dpDiv:N(d('
      '))}},_connectDatepicker:function(a,b){var c=d(a);b.append=d([]);b.trigger=d([]);if(!c.hasClass(this.markerClassName)){this._attachments(c,b);c.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker", +function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});this._autoSize(b);d.data(a,"datepicker",b);b.settings.disabled&&this._disableDatepicker(a)}},_attachments:function(a,b){var c=this._get(b,"appendText"),e=this._get(b,"isRTL");b.append&&b.append.remove();if(c){b.append=d(''+c+"");a[e?"before":"after"](b.append)}a.unbind("focus",this._showDatepicker);b.trigger&&b.trigger.remove();c=this._get(b,"showOn");if(c== +"focus"||c=="both")a.focus(this._showDatepicker);if(c=="button"||c=="both"){c=this._get(b,"buttonText");var f=this._get(b,"buttonImage");b.trigger=d(this._get(b,"buttonImageOnly")?d("").addClass(this._triggerClass).attr({src:f,alt:c,title:c}):d('').addClass(this._triggerClass).html(f==""?c:d("").attr({src:f,alt:c,title:c})));a[e?"before":"after"](b.trigger);b.trigger.click(function(){d.datepicker._datepickerShowing&&d.datepicker._lastInput==a[0]?d.datepicker._hideDatepicker(): +d.datepicker._showDatepicker(a[0]);return false})}},_autoSize:function(a){if(this._get(a,"autoSize")&&!a.inline){var b=new Date(2009,11,20),c=this._get(a,"dateFormat");if(c.match(/[DM]/)){var e=function(f){for(var h=0,i=0,g=0;gh){h=f[g].length;i=g}return i};b.setMonth(e(this._get(a,c.match(/MM/)?"monthNames":"monthNamesShort")));b.setDate(e(this._get(a,c.match(/DD/)?"dayNames":"dayNamesShort"))+20-b.getDay())}a.input.attr("size",this._formatDate(a,b).length)}},_inlineDatepicker:function(a, +b){var c=d(a);if(!c.hasClass(this.markerClassName)){c.addClass(this.markerClassName).append(b.dpDiv).bind("setData.datepicker",function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});d.data(a,"datepicker",b);this._setDate(b,this._getDefaultDate(b),true);this._updateDatepicker(b);this._updateAlternate(b);b.settings.disabled&&this._disableDatepicker(a);b.dpDiv.css("display","block")}},_dialogDatepicker:function(a,b,c,e,f){a=this._dialogInst;if(!a){this.uuid+= +1;this._dialogInput=d('');this._dialogInput.keydown(this._doKeyDown);d("body").append(this._dialogInput);a=this._dialogInst=this._newInst(this._dialogInput,false);a.settings={};d.data(this._dialogInput[0],"datepicker",a)}H(a.settings,e||{});b=b&&b.constructor==Date?this._formatDate(a,b):b;this._dialogInput.val(b);this._pos=f?f.length?f:[f.pageX,f.pageY]:null;if(!this._pos)this._pos=[document.documentElement.clientWidth/ +2-100+(document.documentElement.scrollLeft||document.body.scrollLeft),document.documentElement.clientHeight/2-150+(document.documentElement.scrollTop||document.body.scrollTop)];this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px");a.settings.onSelect=c;this._inDialog=true;this.dpDiv.addClass(this._dialogClass);this._showDatepicker(this._dialogInput[0]);d.blockUI&&d.blockUI(this.dpDiv);d.data(this._dialogInput[0],"datepicker",a);return this},_destroyDatepicker:function(a){var b= +d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();d.removeData(a,"datepicker");if(e=="input"){c.append.remove();c.trigger.remove();b.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)}else if(e=="div"||e=="span")b.removeClass(this.markerClassName).empty()}},_enableDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e= +a.nodeName.toLowerCase();if(e=="input"){a.disabled=false;c.trigger.filter("button").each(function(){this.disabled=false}).end().filter("img").css({opacity:"1.0",cursor:""})}else if(e=="div"||e=="span"){b=b.children("."+this._inlineClass);b.children().removeClass("ui-state-disabled");b.find("select.ui-datepicker-month, select.ui-datepicker-year").removeAttr("disabled")}this._disabledInputs=d.map(this._disabledInputs,function(f){return f==a?null:f})}},_disableDatepicker:function(a){var b=d(a),c=d.data(a, +"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled=true;c.trigger.filter("button").each(function(){this.disabled=true}).end().filter("img").css({opacity:"0.5",cursor:"default"})}else if(e=="div"||e=="span"){b=b.children("."+this._inlineClass);b.children().addClass("ui-state-disabled");b.find("select.ui-datepicker-month, select.ui-datepicker-year").attr("disabled","disabled")}this._disabledInputs=d.map(this._disabledInputs,function(f){return f== +a?null:f});this._disabledInputs[this._disabledInputs.length]=a}},_isDisabledDatepicker:function(a){if(!a)return false;for(var b=0;b-1}},_doKeyUp:function(a){a=d.datepicker._getInst(a.target);if(a.input.val()!=a.lastVal)try{if(d.datepicker.parseDate(d.datepicker._get(a,"dateFormat"),a.input?a.input.val():null,d.datepicker._getFormatConfig(a))){d.datepicker._setDateFromField(a);d.datepicker._updateAlternate(a);d.datepicker._updateDatepicker(a)}}catch(b){d.datepicker.log(b)}return true},_showDatepicker:function(a){a=a.target||a;if(a.nodeName.toLowerCase()!="input")a=d("input", +a.parentNode)[0];if(!(d.datepicker._isDisabledDatepicker(a)||d.datepicker._lastInput==a)){var b=d.datepicker._getInst(a);if(d.datepicker._curInst&&d.datepicker._curInst!=b){d.datepicker._datepickerShowing&&d.datepicker._triggerOnClose(d.datepicker._curInst);d.datepicker._curInst.dpDiv.stop(true,true)}var c=d.datepicker._get(b,"beforeShow");c=c?c.apply(a,[a,b]):{};if(c!==false){H(b.settings,c);b.lastVal=null;d.datepicker._lastInput=a;d.datepicker._setDateFromField(b);if(d.datepicker._inDialog)a.value= +"";if(!d.datepicker._pos){d.datepicker._pos=d.datepicker._findPos(a);d.datepicker._pos[1]+=a.offsetHeight}var e=false;d(a).parents().each(function(){e|=d(this).css("position")=="fixed";return!e});if(e&&d.browser.opera){d.datepicker._pos[0]-=document.documentElement.scrollLeft;d.datepicker._pos[1]-=document.documentElement.scrollTop}c={left:d.datepicker._pos[0],top:d.datepicker._pos[1]};d.datepicker._pos=null;b.dpDiv.empty();b.dpDiv.css({position:"absolute",display:"block",top:"-1000px"});d.datepicker._updateDatepicker(b); +c=d.datepicker._checkOffset(b,c,e);b.dpDiv.css({position:d.datepicker._inDialog&&d.blockUI?"static":e?"fixed":"absolute",display:"none",left:c.left+"px",top:c.top+"px"});if(!b.inline){c=d.datepicker._get(b,"showAnim");var f=d.datepicker._get(b,"duration"),h=function(){var i=b.dpDiv.find("iframe.ui-datepicker-cover");if(i.length){var g=d.datepicker._getBorders(b.dpDiv);i.css({left:-g[0],top:-g[1],width:b.dpDiv.outerWidth(),height:b.dpDiv.outerHeight()})}};b.dpDiv.zIndex(d(a).zIndex()+1);d.datepicker._datepickerShowing= +true;d.effects&&d.effects[c]?b.dpDiv.show(c,d.datepicker._get(b,"showOptions"),f,h):b.dpDiv[c||"show"](c?f:null,h);if(!c||!f)h();b.input.is(":visible")&&!b.input.is(":disabled")&&b.input.focus();d.datepicker._curInst=b}}}},_updateDatepicker:function(a){this.maxRows=4;var b=d.datepicker._getBorders(a.dpDiv);J=a;a.dpDiv.empty().append(this._generateHTML(a));var c=a.dpDiv.find("iframe.ui-datepicker-cover");c.length&&c.css({left:-b[0],top:-b[1],width:a.dpDiv.outerWidth(),height:a.dpDiv.outerHeight()}); +a.dpDiv.find("."+this._dayOverClass+" a").mouseover();b=this._getNumberOfMonths(a);c=b[1];a.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("");c>1&&a.dpDiv.addClass("ui-datepicker-multi-"+c).css("width",17*c+"em");a.dpDiv[(b[0]!=1||b[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi");a.dpDiv[(this._get(a,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl");a==d.datepicker._curInst&&d.datepicker._datepickerShowing&&a.input&&a.input.is(":visible")&& +!a.input.is(":disabled")&&a.input[0]!=document.activeElement&&a.input.focus();if(a.yearshtml){var e=a.yearshtml;setTimeout(function(){e===a.yearshtml&&a.yearshtml&&a.dpDiv.find("select.ui-datepicker-year:first").replaceWith(a.yearshtml);e=a.yearshtml=null},0)}},_getBorders:function(a){var b=function(c){return{thin:1,medium:2,thick:3}[c]||c};return[parseFloat(b(a.css("border-left-width"))),parseFloat(b(a.css("border-top-width")))]},_checkOffset:function(a,b,c){var e=a.dpDiv.outerWidth(),f=a.dpDiv.outerHeight(), +h=a.input?a.input.outerWidth():0,i=a.input?a.input.outerHeight():0,g=document.documentElement.clientWidth+d(document).scrollLeft(),j=document.documentElement.clientHeight+d(document).scrollTop();b.left-=this._get(a,"isRTL")?e-h:0;b.left-=c&&b.left==a.input.offset().left?d(document).scrollLeft():0;b.top-=c&&b.top==a.input.offset().top+i?d(document).scrollTop():0;b.left-=Math.min(b.left,b.left+e>g&&g>e?Math.abs(b.left+e-g):0);b.top-=Math.min(b.top,b.top+f>j&&j>f?Math.abs(f+i):0);return b},_findPos:function(a){for(var b= +this._get(this._getInst(a),"isRTL");a&&(a.type=="hidden"||a.nodeType!=1||d.expr.filters.hidden(a));)a=a[b?"previousSibling":"nextSibling"];a=d(a).offset();return[a.left,a.top]},_triggerOnClose:function(a){var b=this._get(a,"onClose");if(b)b.apply(a.input?a.input[0]:null,[a.input?a.input.val():"",a])},_hideDatepicker:function(a){var b=this._curInst;if(!(!b||a&&b!=d.data(a,"datepicker")))if(this._datepickerShowing){a=this._get(b,"showAnim");var c=this._get(b,"duration"),e=function(){d.datepicker._tidyDialog(b); +this._curInst=null};d.effects&&d.effects[a]?b.dpDiv.hide(a,d.datepicker._get(b,"showOptions"),c,e):b.dpDiv[a=="slideDown"?"slideUp":a=="fadeIn"?"fadeOut":"hide"](a?c:null,e);a||e();d.datepicker._triggerOnClose(b);this._datepickerShowing=false;this._lastInput=null;if(this._inDialog){this._dialogInput.css({position:"absolute",left:"0",top:"-100px"});if(d.blockUI){d.unblockUI();d("body").append(this.dpDiv)}}this._inDialog=false}},_tidyDialog:function(a){a.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")}, +_checkExternalClick:function(a){if(d.datepicker._curInst){a=d(a.target);a[0].id!=d.datepicker._mainDivId&&a.parents("#"+d.datepicker._mainDivId).length==0&&!a.hasClass(d.datepicker.markerClassName)&&!a.hasClass(d.datepicker._triggerClass)&&d.datepicker._datepickerShowing&&!(d.datepicker._inDialog&&d.blockUI)&&d.datepicker._hideDatepicker()}},_adjustDate:function(a,b,c){a=d(a);var e=this._getInst(a[0]);if(!this._isDisabledDatepicker(a[0])){this._adjustInstDate(e,b+(c=="M"?this._get(e,"showCurrentAtPos"): +0),c);this._updateDatepicker(e)}},_gotoToday:function(a){a=d(a);var b=this._getInst(a[0]);if(this._get(b,"gotoCurrent")&&b.currentDay){b.selectedDay=b.currentDay;b.drawMonth=b.selectedMonth=b.currentMonth;b.drawYear=b.selectedYear=b.currentYear}else{var c=new Date;b.selectedDay=c.getDate();b.drawMonth=b.selectedMonth=c.getMonth();b.drawYear=b.selectedYear=c.getFullYear()}this._notifyChange(b);this._adjustDate(a)},_selectMonthYear:function(a,b,c){a=d(a);var e=this._getInst(a[0]);e["selected"+(c=="M"? +"Month":"Year")]=e["draw"+(c=="M"?"Month":"Year")]=parseInt(b.options[b.selectedIndex].value,10);this._notifyChange(e);this._adjustDate(a)},_selectDay:function(a,b,c,e){var f=d(a);if(!(d(e).hasClass(this._unselectableClass)||this._isDisabledDatepicker(f[0]))){f=this._getInst(f[0]);f.selectedDay=f.currentDay=d("a",e).html();f.selectedMonth=f.currentMonth=b;f.selectedYear=f.currentYear=c;this._selectDate(a,this._formatDate(f,f.currentDay,f.currentMonth,f.currentYear))}},_clearDate:function(a){a=d(a); +this._getInst(a[0]);this._selectDate(a,"")},_selectDate:function(a,b){a=this._getInst(d(a)[0]);b=b!=null?b:this._formatDate(a);a.input&&a.input.val(b);this._updateAlternate(a);var c=this._get(a,"onSelect");if(c)c.apply(a.input?a.input[0]:null,[b,a]);else a.input&&a.input.trigger("change");if(a.inline)this._updateDatepicker(a);else{this._hideDatepicker();this._lastInput=a.input[0];typeof a.input[0]!="object"&&a.input.focus();this._lastInput=null}},_updateAlternate:function(a){var b=this._get(a,"altField"); +if(b){var c=this._get(a,"altFormat")||this._get(a,"dateFormat"),e=this._getDate(a),f=this.formatDate(c,e,this._getFormatConfig(a));d(b).each(function(){d(this).val(f)})}},noWeekends:function(a){a=a.getDay();return[a>0&&a<6,""]},iso8601Week:function(a){a=new Date(a.getTime());a.setDate(a.getDate()+4-(a.getDay()||7));var b=a.getTime();a.setMonth(0);a.setDate(1);return Math.floor(Math.round((b-a)/864E5)/7)+1},parseDate:function(a,b,c){if(a==null||b==null)throw"Invalid arguments";b=typeof b=="object"? +b.toString():b+"";if(b=="")return null;var e=(c?c.shortYearCutoff:null)||this._defaults.shortYearCutoff;e=typeof e!="string"?e:(new Date).getFullYear()%100+parseInt(e,10);for(var f=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,h=(c?c.dayNames:null)||this._defaults.dayNames,i=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort,g=(c?c.monthNames:null)||this._defaults.monthNames,j=c=-1,l=-1,u=-1,k=false,o=function(p){(p=A+1-1){j=1;l=u;do{e=this._getDaysInMonth(c,j-1);if(l<=e)break;j++;l-=e}while(1)}v=this._daylightSavingAdjust(new Date(c,j-1,l));if(v.getFullYear()!=c||v.getMonth()+1!=j||v.getDate()!=l)throw"Invalid date";return v},ATOM:"yy-mm-dd", +COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*24*60*60*1E7,formatDate:function(a,b,c){if(!b)return"";var e=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,f=(c?c.dayNames:null)||this._defaults.dayNames,h=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort;c=(c?c.monthNames: +null)||this._defaults.monthNames;var i=function(o){(o=k+1 +12?a.getHours()+2:0);return a},_setDate:function(a,b,c){var e=!b,f=a.selectedMonth,h=a.selectedYear;b=this._restrictMinMax(a,this._determineDate(a,b,new Date));a.selectedDay=a.currentDay=b.getDate();a.drawMonth=a.selectedMonth=a.currentMonth=b.getMonth();a.drawYear=a.selectedYear=a.currentYear=b.getFullYear();if((f!=a.selectedMonth||h!=a.selectedYear)&&!c)this._notifyChange(a);this._adjustInstDate(a);if(a.input)a.input.val(e?"":this._formatDate(a))},_getDate:function(a){return!a.currentYear||a.input&& +a.input.val()==""?null:this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay))},_generateHTML:function(a){var b=new Date;b=this._daylightSavingAdjust(new Date(b.getFullYear(),b.getMonth(),b.getDate()));var c=this._get(a,"isRTL"),e=this._get(a,"showButtonPanel"),f=this._get(a,"hideIfNoPrevNext"),h=this._get(a,"navigationAsDateFormat"),i=this._getNumberOfMonths(a),g=this._get(a,"showCurrentAtPos"),j=this._get(a,"stepMonths"),l=i[0]!=1||i[1]!=1,u=this._daylightSavingAdjust(!a.currentDay? +new Date(9999,9,9):new Date(a.currentYear,a.currentMonth,a.currentDay)),k=this._getMinMaxDate(a,"min"),o=this._getMinMaxDate(a,"max");g=a.drawMonth-g;var m=a.drawYear;if(g<0){g+=12;m--}if(o){var n=this._daylightSavingAdjust(new Date(o.getFullYear(),o.getMonth()-i[0]*i[1]+1,o.getDate()));for(n=k&&nn;){g--;if(g<0){g=11;m--}}}a.drawMonth=g;a.drawYear=m;n=this._get(a,"prevText");n=!h?n:this.formatDate(n,this._daylightSavingAdjust(new Date(m,g-j,1)),this._getFormatConfig(a)); +n=this._canAdjustMonth(a,-1,m,g)?''+n+"":f?"":''+n+"";var s=this._get(a,"nextText");s=!h?s:this.formatDate(s,this._daylightSavingAdjust(new Date(m, +g+j,1)),this._getFormatConfig(a));f=this._canAdjustMonth(a,+1,m,g)?''+s+"":f?"":''+s+"";j=this._get(a,"currentText");s=this._get(a,"gotoCurrent")&& +a.currentDay?u:b;j=!h?j:this.formatDate(j,s,this._getFormatConfig(a));h=!a.inline?'":"";e=e?'
      '+(c?h:"")+(this._isInRange(a,s)?'":"")+(c?"":h)+"
      ":"";h=parseInt(this._get(a,"firstDay"),10);h=isNaN(h)?0:h;j=this._get(a,"showWeek");s=this._get(a,"dayNames");this._get(a,"dayNamesShort");var q=this._get(a,"dayNamesMin"),A=this._get(a,"monthNames"),v=this._get(a,"monthNamesShort"),p=this._get(a,"beforeShowDay"),D=this._get(a,"showOtherMonths"),K=this._get(a,"selectOtherMonths");this._get(a,"calculateWeek");for(var E=this._getDefaultDate(a),w="",x=0;x1)switch(G){case 0:y+=" ui-datepicker-group-first";t=" ui-corner-"+(c?"right":"left");break;case i[1]-1:y+=" ui-datepicker-group-last";t=" ui-corner-"+(c?"left":"right");break;default:y+=" ui-datepicker-group-middle";t="";break}y+='">'}y+='
      '+(/all|left/.test(t)&& +x==0?c?f:n:"")+(/all|right/.test(t)&&x==0?c?n:f:"")+this._generateMonthYearHeader(a,g,m,k,o,x>0||G>0,A,v)+'
      ';var z=j?'":"";for(t=0;t<7;t++){var r=(t+h)%7;z+="=5?' class="ui-datepicker-week-end"':"")+'>'+q[r]+""}y+=z+"";z=this._getDaysInMonth(m,g);if(m==a.selectedYear&&g==a.selectedMonth)a.selectedDay=Math.min(a.selectedDay, +z);t=(this._getFirstDayOfMonth(m,g)-h+7)%7;z=Math.ceil((t+z)/7);this.maxRows=z=l?this.maxRows>z?this.maxRows:z:z;r=this._daylightSavingAdjust(new Date(m,g,1-t));for(var Q=0;Q";var R=!j?"":'";for(t=0;t<7;t++){var I=p?p.apply(a.input?a.input[0]:null,[r]):[true,""],F=r.getMonth()!=g,L=F&&!K||!I[0]||k&&ro;R+='";r.setDate(r.getDate()+1);r=this._daylightSavingAdjust(r)}y+=R+""}g++;if(g>11){g=0;m++}y+="
      '+this._get(a,"weekHeader")+"
      '+this._get(a,"calculateWeek")(r)+""+(F&&!D?" ":L?''+ +r.getDate()+"":''+r.getDate()+"")+"
      "+(l?""+(i[0]>0&&G==i[1]-1?'
      ':""):"");O+=y}w+=O}w+=e+(d.browser.msie&&parseInt(d.browser.version,10)<7&&!a.inline?'': +"");a._keyEvent=false;return w},_generateMonthYearHeader:function(a,b,c,e,f,h,i,g){var j=this._get(a,"changeMonth"),l=this._get(a,"changeYear"),u=this._get(a,"showMonthAfterYear"),k='
      ',o="";if(h||!j)o+=''+i[b]+"";else{i=e&&e.getFullYear()==c;var m=f&&f.getFullYear()==c;o+='"}u||(k+=o+(h||!(j&&l)?" ":""));if(!a.yearshtml){a.yearshtml="";if(h||!l)k+=''+c+"";else{g=this._get(a,"yearRange").split(":");var s=(new Date).getFullYear();i=function(q){q=q.match(/c[+-].*/)?c+parseInt(q.substring(1),10):q.match(/[+-].*/)?s+parseInt(q,10):parseInt(q,10);return isNaN(q)?s:q};b=i(g[0]);g=Math.max(b,i(g[1]||""));b=e?Math.max(b, +e.getFullYear()):b;g=f?Math.min(g,f.getFullYear()):g;for(a.yearshtml+='";k+=a.yearshtml;a.yearshtml=null}}k+=this._get(a,"yearSuffix");if(u)k+=(h||!(j&&l)?" ":"")+o;k+="
      ";return k},_adjustInstDate:function(a,b,c){var e=a.drawYear+(c=="Y"?b:0),f=a.drawMonth+ +(c=="M"?b:0);b=Math.min(a.selectedDay,this._getDaysInMonth(e,f))+(c=="D"?b:0);e=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(e,f,b)));a.selectedDay=e.getDate();a.drawMonth=a.selectedMonth=e.getMonth();a.drawYear=a.selectedYear=e.getFullYear();if(c=="M"||c=="Y")this._notifyChange(a)},_restrictMinMax:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");b=c&&ba?a:b},_notifyChange:function(a){var b=this._get(a,"onChangeMonthYear");if(b)b.apply(a.input? +a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){a=this._get(a,"numberOfMonths");return a==null?[1,1]:typeof a=="number"?[1,a]:a},_getMinMaxDate:function(a,b){return this._determineDate(a,this._get(a,b+"Date"),null)},_getDaysInMonth:function(a,b){return 32-this._daylightSavingAdjust(new Date(a,b,32)).getDate()},_getFirstDayOfMonth:function(a,b){return(new Date(a,b,1)).getDay()},_canAdjustMonth:function(a,b,c,e){var f=this._getNumberOfMonths(a);c=this._daylightSavingAdjust(new Date(c, +e+(b<0?b:f[0]*f[1]),1));b<0&&c.setDate(this._getDaysInMonth(c.getFullYear(),c.getMonth()));return this._isInRange(a,c)},_isInRange:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");return(!c||b.getTime()>=c.getTime())&&(!a||b.getTime()<=a.getTime())},_getFormatConfig:function(a){var b=this._get(a,"shortYearCutoff");b=typeof b!="string"?b:(new Date).getFullYear()%100+parseInt(b,10);return{shortYearCutoff:b,dayNamesShort:this._get(a,"dayNamesShort"),dayNames:this._get(a, +"dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,b,c,e){if(!b){a.currentDay=a.selectedDay;a.currentMonth=a.selectedMonth;a.currentYear=a.selectedYear}b=b?typeof b=="object"?b:this._daylightSavingAdjust(new Date(e,c,b)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return this.formatDate(this._get(a,"dateFormat"),b,this._getFormatConfig(a))}});d.fn.datepicker=function(a){if(!this.length)return this; +if(!d.datepicker.initialized){d(document).mousedown(d.datepicker._checkExternalClick).find("body").append(d.datepicker.dpDiv);d.datepicker.initialized=true}var b=Array.prototype.slice.call(arguments,1);if(typeof a=="string"&&(a=="isDisabled"||a=="getDate"||a=="widget"))return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));if(a=="option"&&arguments.length==2&&typeof arguments[1]=="string")return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));return this.each(function(){typeof a== +"string"?d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this].concat(b)):d.datepicker._attachDatepicker(this,a)})};d.datepicker=new M;d.datepicker.initialized=false;d.datepicker.uuid=(new Date).getTime();d.datepicker.version="1.8.16";window["DP_jQuery_"+B]=d})(jQuery); +;/* + * jQuery UI Progressbar 1.8.16 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Progressbar + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + */ +(function(b,d){b.widget("ui.progressbar",{options:{value:0,max:100},min:0,_create:function(){this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min,"aria-valuemax":this.options.max,"aria-valuenow":this._value()});this.valueDiv=b("
      ").appendTo(this.element);this.oldValue=this._value();this._refreshValue()},destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"); +this.valueDiv.remove();b.Widget.prototype.destroy.apply(this,arguments)},value:function(a){if(a===d)return this._value();this._setOption("value",a);return this},_setOption:function(a,c){if(a==="value"){this.options.value=c;this._refreshValue();this._value()===this.options.max&&this._trigger("complete")}b.Widget.prototype._setOption.apply(this,arguments)},_value:function(){var a=this.options.value;if(typeof a!=="number")a=0;return Math.min(this.options.max,Math.max(this.min,a))},_percentage:function(){return 100* +this._value()/this.options.max},_refreshValue:function(){var a=this.value(),c=this._percentage();if(this.oldValue!==a){this.oldValue=a;this._trigger("change")}this.valueDiv.toggle(a>this.min).toggleClass("ui-corner-right",a===this.options.max).width(c.toFixed(0)+"%");this.element.attr("aria-valuenow",a)}});b.extend(b.ui.progressbar,{version:"1.8.16"})})(jQuery); +;/* + * jQuery UI Effects 1.8.16 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Effects/ + */ +jQuery.effects||function(f,j){function m(c){var a;if(c&&c.constructor==Array&&c.length==3)return c;if(a=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(c))return[parseInt(a[1],10),parseInt(a[2],10),parseInt(a[3],10)];if(a=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(c))return[parseFloat(a[1])*2.55,parseFloat(a[2])*2.55,parseFloat(a[3])*2.55];if(a=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(c))return[parseInt(a[1], +16),parseInt(a[2],16),parseInt(a[3],16)];if(a=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(c))return[parseInt(a[1]+a[1],16),parseInt(a[2]+a[2],16),parseInt(a[3]+a[3],16)];if(/rgba\(0, 0, 0, 0\)/.exec(c))return n.transparent;return n[f.trim(c).toLowerCase()]}function s(c,a){var b;do{b=f.curCSS(c,a);if(b!=""&&b!="transparent"||f.nodeName(c,"body"))break;a="backgroundColor"}while(c=c.parentNode);return m(b)}function o(){var c=document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle, +a={},b,d;if(c&&c.length&&c[0]&&c[c[0]])for(var e=c.length;e--;){b=c[e];if(typeof c[b]=="string"){d=b.replace(/\-(\w)/g,function(g,h){return h.toUpperCase()});a[d]=c[b]}}else for(b in c)if(typeof c[b]==="string")a[b]=c[b];return a}function p(c){var a,b;for(a in c){b=c[a];if(b==null||f.isFunction(b)||a in t||/scrollbar/.test(a)||!/color/i.test(a)&&isNaN(parseFloat(b)))delete c[a]}return c}function u(c,a){var b={_:0},d;for(d in a)if(c[d]!=a[d])b[d]=a[d];return b}function k(c,a,b,d){if(typeof c=="object"){d= +a;b=null;a=c;c=a.effect}if(f.isFunction(a)){d=a;b=null;a={}}if(typeof a=="number"||f.fx.speeds[a]){d=b;b=a;a={}}if(f.isFunction(b)){d=b;b=null}a=a||{};b=b||a.duration;b=f.fx.off?0:typeof b=="number"?b:b in f.fx.speeds?f.fx.speeds[b]:f.fx.speeds._default;d=d||a.complete;return[c,a,b,d]}function l(c){if(!c||typeof c==="number"||f.fx.speeds[c])return true;if(typeof c==="string"&&!f.effects[c])return true;return false}f.effects={};f.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor", +"borderTopColor","borderColor","color","outlineColor"],function(c,a){f.fx.step[a]=function(b){if(!b.colorInit){b.start=s(b.elem,a);b.end=m(b.end);b.colorInit=true}b.elem.style[a]="rgb("+Math.max(Math.min(parseInt(b.pos*(b.end[0]-b.start[0])+b.start[0],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[1]-b.start[1])+b.start[1],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[2]-b.start[2])+b.start[2],10),255),0)+")"}});var n={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0, +0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211, +211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]},q=["add","remove","toggle"],t={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};f.effects.animateClass=function(c,a,b, +d){if(f.isFunction(b)){d=b;b=null}return this.queue(function(){var e=f(this),g=e.attr("style")||" ",h=p(o.call(this)),r,v=e.attr("class");f.each(q,function(w,i){c[i]&&e[i+"Class"](c[i])});r=p(o.call(this));e.attr("class",v);e.animate(u(h,r),{queue:false,duration:a,easing:b,complete:function(){f.each(q,function(w,i){c[i]&&e[i+"Class"](c[i])});if(typeof e.attr("style")=="object"){e.attr("style").cssText="";e.attr("style").cssText=g}else e.attr("style",g);d&&d.apply(this,arguments);f.dequeue(this)}})})}; +f.fn.extend({_addClass:f.fn.addClass,addClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{add:c},a,b,d]):this._addClass(c)},_removeClass:f.fn.removeClass,removeClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{remove:c},a,b,d]):this._removeClass(c)},_toggleClass:f.fn.toggleClass,toggleClass:function(c,a,b,d,e){return typeof a=="boolean"||a===j?b?f.effects.animateClass.apply(this,[a?{add:c}:{remove:c},b,d,e]):this._toggleClass(c,a):f.effects.animateClass.apply(this, +[{toggle:c},a,b,d])},switchClass:function(c,a,b,d,e){return f.effects.animateClass.apply(this,[{add:a,remove:c},b,d,e])}});f.extend(f.effects,{version:"1.8.16",save:function(c,a){for(var b=0;b").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}), +d=document.activeElement;c.wrap(b);if(c[0]===d||f.contains(c[0],d))f(d).focus();b=c.parent();if(c.css("position")=="static"){b.css({position:"relative"});c.css({position:"relative"})}else{f.extend(a,{position:c.css("position"),zIndex:c.css("z-index")});f.each(["top","left","bottom","right"],function(e,g){a[g]=c.css(g);if(isNaN(parseInt(a[g],10)))a[g]="auto"});c.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})}return b.css(a).show()},removeWrapper:function(c){var a,b=document.activeElement; +if(c.parent().is(".ui-effects-wrapper")){a=c.parent().replaceWith(c);if(c[0]===b||f.contains(c[0],b))f(b).focus();return a}return c},setTransition:function(c,a,b,d){d=d||{};f.each(a,function(e,g){unit=c.cssUnit(g);if(unit[0]>0)d[g]=unit[0]*b+unit[1]});return d}});f.fn.extend({effect:function(c){var a=k.apply(this,arguments),b={options:a[1],duration:a[2],callback:a[3]};a=b.options.mode;var d=f.effects[c];if(f.fx.off||!d)return a?this[a](b.duration,b.callback):this.each(function(){b.callback&&b.callback.call(this)}); +return d.call(this,b)},_show:f.fn.show,show:function(c){if(l(c))return this._show.apply(this,arguments);else{var a=k.apply(this,arguments);a[1].mode="show";return this.effect.apply(this,a)}},_hide:f.fn.hide,hide:function(c){if(l(c))return this._hide.apply(this,arguments);else{var a=k.apply(this,arguments);a[1].mode="hide";return this.effect.apply(this,a)}},__toggle:f.fn.toggle,toggle:function(c){if(l(c)||typeof c==="boolean"||f.isFunction(c))return this.__toggle.apply(this,arguments);else{var a=k.apply(this, +arguments);a[1].mode="toggle";return this.effect.apply(this,a)}},cssUnit:function(c){var a=this.css(c),b=[];f.each(["em","px","%","pt"],function(d,e){if(a.indexOf(e)>0)b=[parseFloat(a),e]});return b}});f.easing.jswing=f.easing.swing;f.extend(f.easing,{def:"easeOutQuad",swing:function(c,a,b,d,e){return f.easing[f.easing.def](c,a,b,d,e)},easeInQuad:function(c,a,b,d,e){return d*(a/=e)*a+b},easeOutQuad:function(c,a,b,d,e){return-d*(a/=e)*(a-2)+b},easeInOutQuad:function(c,a,b,d,e){if((a/=e/2)<1)return d/ +2*a*a+b;return-d/2*(--a*(a-2)-1)+b},easeInCubic:function(c,a,b,d,e){return d*(a/=e)*a*a+b},easeOutCubic:function(c,a,b,d,e){return d*((a=a/e-1)*a*a+1)+b},easeInOutCubic:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a+b;return d/2*((a-=2)*a*a+2)+b},easeInQuart:function(c,a,b,d,e){return d*(a/=e)*a*a*a+b},easeOutQuart:function(c,a,b,d,e){return-d*((a=a/e-1)*a*a*a-1)+b},easeInOutQuart:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a+b;return-d/2*((a-=2)*a*a*a-2)+b},easeInQuint:function(c,a,b, +d,e){return d*(a/=e)*a*a*a*a+b},easeOutQuint:function(c,a,b,d,e){return d*((a=a/e-1)*a*a*a*a+1)+b},easeInOutQuint:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a*a+b;return d/2*((a-=2)*a*a*a*a+2)+b},easeInSine:function(c,a,b,d,e){return-d*Math.cos(a/e*(Math.PI/2))+d+b},easeOutSine:function(c,a,b,d,e){return d*Math.sin(a/e*(Math.PI/2))+b},easeInOutSine:function(c,a,b,d,e){return-d/2*(Math.cos(Math.PI*a/e)-1)+b},easeInExpo:function(c,a,b,d,e){return a==0?b:d*Math.pow(2,10*(a/e-1))+b},easeOutExpo:function(c, +a,b,d,e){return a==e?b+d:d*(-Math.pow(2,-10*a/e)+1)+b},easeInOutExpo:function(c,a,b,d,e){if(a==0)return b;if(a==e)return b+d;if((a/=e/2)<1)return d/2*Math.pow(2,10*(a-1))+b;return d/2*(-Math.pow(2,-10*--a)+2)+b},easeInCirc:function(c,a,b,d,e){return-d*(Math.sqrt(1-(a/=e)*a)-1)+b},easeOutCirc:function(c,a,b,d,e){return d*Math.sqrt(1-(a=a/e-1)*a)+b},easeInOutCirc:function(c,a,b,d,e){if((a/=e/2)<1)return-d/2*(Math.sqrt(1-a*a)-1)+b;return d/2*(Math.sqrt(1-(a-=2)*a)+1)+b},easeInElastic:function(c,a,b, +d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e)==1)return b+d;g||(g=e*0.3);if(h").css({position:"absolute",visibility:"visible",left:-f*(h/d),top:-e*(i/c)}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:h/d,height:i/c,left:g.left+f*(h/d)+(a.options.mode=="show"?(f-Math.floor(d/2))*(h/d):0),top:g.top+e*(i/c)+(a.options.mode=="show"?(e-Math.floor(c/2))*(i/c):0),opacity:a.options.mode=="show"?0:1}).animate({left:g.left+f*(h/d)+(a.options.mode=="show"?0:(f-Math.floor(d/2))*(h/d)),top:g.top+ +e*(i/c)+(a.options.mode=="show"?0:(e-Math.floor(c/2))*(i/c)),opacity:a.options.mode=="show"?1:0},a.duration||500);setTimeout(function(){a.options.mode=="show"?b.css({visibility:"visible"}):b.css({visibility:"visible"}).hide();a.callback&&a.callback.apply(b[0]);b.dequeue();j("div.ui-effects-explode").remove()},a.duration||500)})}})(jQuery); +;/* + * jQuery UI Effects Fade 1.8.16 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Effects/Fade + * + * Depends: + * jquery.effects.core.js + */ +(function(b){b.effects.fade=function(a){return this.queue(function(){var c=b(this),d=b.effects.setMode(c,a.options.mode||"hide");c.animate({opacity:d},{queue:false,duration:a.duration,easing:a.options.easing,complete:function(){a.callback&&a.callback.apply(this,arguments);c.dequeue()}})})}})(jQuery); +;/* + * jQuery UI Effects Fold 1.8.16 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Effects/Fold + * + * Depends: + * jquery.effects.core.js + */ +(function(c){c.effects.fold=function(a){return this.queue(function(){var b=c(this),j=["position","top","bottom","left","right"],d=c.effects.setMode(b,a.options.mode||"hide"),g=a.options.size||15,h=!!a.options.horizFirst,k=a.duration?a.duration/2:c.fx.speeds._default/2;c.effects.save(b,j);b.show();var e=c.effects.createWrapper(b).css({overflow:"hidden"}),f=d=="show"!=h,l=f?["width","height"]:["height","width"];f=f?[e.width(),e.height()]:[e.height(),e.width()];var i=/([0-9]+)%/.exec(g);if(i)g=parseInt(i[1], +10)/100*f[d=="hide"?0:1];if(d=="show")e.css(h?{height:0,width:g}:{height:g,width:0});h={};i={};h[l[0]]=d=="show"?f[0]:g;i[l[1]]=d=="show"?f[1]:0;e.animate(h,k,a.options.easing).animate(i,k,a.options.easing,function(){d=="hide"&&b.hide();c.effects.restore(b,j);c.effects.removeWrapper(b);a.callback&&a.callback.apply(b[0],arguments);b.dequeue()})})}})(jQuery); +;/* + * jQuery UI Effects Highlight 1.8.16 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Effects/Highlight + * + * Depends: + * jquery.effects.core.js + */ +(function(b){b.effects.highlight=function(c){return this.queue(function(){var a=b(this),e=["backgroundImage","backgroundColor","opacity"],d=b.effects.setMode(a,c.options.mode||"show"),f={backgroundColor:a.css("backgroundColor")};if(d=="hide")f.opacity=0;b.effects.save(a,e);a.show().css({backgroundImage:"none",backgroundColor:c.options.color||"#ffff99"}).animate(f,{queue:false,duration:c.duration,easing:c.options.easing,complete:function(){d=="hide"&&a.hide();b.effects.restore(a,e);d=="show"&&!b.support.opacity&& +this.style.removeAttribute("filter");c.callback&&c.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery); +;/* + * jQuery UI Effects Pulsate 1.8.16 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Effects/Pulsate + * + * Depends: + * jquery.effects.core.js + */ +(function(d){d.effects.pulsate=function(a){return this.queue(function(){var b=d(this),c=d.effects.setMode(b,a.options.mode||"show");times=(a.options.times||5)*2-1;duration=a.duration?a.duration/2:d.fx.speeds._default/2;isVisible=b.is(":visible");animateTo=0;if(!isVisible){b.css("opacity",0).show();animateTo=1}if(c=="hide"&&isVisible||c=="show"&&!isVisible)times--;for(c=0;c').appendTo(document.body).addClass(a.options.className).css({top:d.top,left:d.left,height:b.innerHeight(),width:b.innerWidth(),position:"absolute"}).animate(c,a.duration,a.options.easing,function(){f.remove();a.callback&&a.callback.apply(b[0],arguments); +b.dequeue()})})}})(jQuery); +; \ No newline at end of file diff --git a/lib/resque_sliders/lib/resque-sliders/server/public/js/sliders.js b/lib/resque_sliders/lib/resque-sliders/server/public/js/sliders.js new file mode 100755 index 0000000..377a0b9 --- /dev/null +++ b/lib/resque_sliders/lib/resque-sliders/server/public/js/sliders.js @@ -0,0 +1,98 @@ +$(document).ready(function() { + function set_total() { + var total = 0; + $(".values").each(function () { + total += parseInt($(this).val()); + }); + $("#total").text(total); + }; + function sanitize_input(s) { + // delete non-friendly chars, replace spaces in words with commas for resque + var ary = s.replace(/['":]/g, '').replace(/^\s+|\s+$/g, '').replace(/\s+/g, ',').split(/, */); + var new_ary = []; + // remove empties from array + $.each(ary, function() { + if (this != '') { + new_ary.push($.trim(this)); + } + }); + return new_ary.join(','); + }; + // Click function for all icons + $(".controls").find("span").click(function() { + var host_sig = $(this).attr("id").split(':'); + var host = host_sig[0]; + switch(host_sig[1]) + { + case 'REFRESH': + sig = 'reload'; + break; + case 'ALERT': + return false; + default: + sig = host_sig[1].toLowerCase(); + } + var signal = {}; + signal[sig] = true; + + var span = $(this); + var re = new RegExp('/' + host + '$'); + var url = window.location.pathname.replace(re, '') + '/' + host; + $.post(url, signal, function(data) { + switch(data.signal) { + case 'reload': + span.removeClass('ui-icon-refresh').addClass('ui-icon-alert').attr('id', [host, 'ALERT'].join(':')); + break; + case 'pause': + span.removeClass('ui-icon-pause').addClass('ui-icon-play').attr('id', [host, 'PLAY'].join(':')); + break; + case 'play': + span.removeClass('ui-icon-play').addClass('ui-icon-pause').attr('id', [host, 'PAUSE'].join(':')); + break; + case 'stop': + $('#'+host+'\\:PAUSE').removeClass('ui-icon-pause').addClass('ui-icon-play').attr('id', [host, 'PLAY'].join(':')); + break; + } + }, "json"); + }); + $('.new_form').submit(function(e) { + e.preventDefault(); + var queue = sanitize_input($("#new_queue").val()); + var host = $(this).attr("id"); + if (queue != '') { + $.post(host, { quantity: 1, queue: queue }, function(data) { + // reload window + window.location.reload(true); + }); + } + }); + $("#plus-one").click(function() { + $('.new_form').submit(); + }); + // make each slider, get input from div content passed from erb + $(".slider").each(function() { + var slidy = $(this); + var max_childs = parseInt($("#max").text()); + if (max_childs) { max_childs = max_childs; } + else { max_childs = 50; } + var value = parseInt( slidy.text() ); + var queue = slidy.attr("id").replace("-slider", "").replace(/:/g, ",").replace(/^\s+|\s+$/g, ''); + var host = window.location.pathname.split('/').slice(-1); + slidy.prev().find("input").val( value ); + slidy.empty().slider({ + range: "min", + value: value, + min: 0, + max: max_childs, + slide: function( event, ui ) { + slidy.prev().find("input").val( ui.value ); + set_total(); + }, + change: function( event, ui ) { + $.post('', { quantity: ui.value, queue: queue }, function(data) { + }); + }, + }); + }); + set_total(); // do this initially +}); diff --git a/lib/resque_sliders/lib/resque-sliders/server/views/index.erb b/lib/resque_sliders/lib/resque-sliders/server/views/index.erb new file mode 100755 index 0000000..9c6b4f1 --- /dev/null +++ b/lib/resque_sliders/lib/resque-sliders/server/views/index.erb @@ -0,0 +1,57 @@ +<% @subtabs = @sliders.all_hosts unless @sliders.all_hosts.length == 1 %> + +

      Sliders

      + +
      + " rel="stylesheet" type="text/css" /> + " rel="stylesheet" type="text/css" /> + + +<% if params[:host] || @sliders.all_hosts.length == 1 %> + <% host = params[:host] || @sliders.all_hosts.first %> + <% max = @sliders.max_children(host) || 'Not running' %> + +

      <%= "#{host} (Total: Max: #{max})" %> + + <%= daemon_buttons(host, false) %> + +

      + <% @sliders.queue_values(host).each_pair do |queue,value| %> +

      + + +

      +
      <%= value %>
      + <% end %> +
      + + +
      +<% else %> + + + + + + + <% @sliders.all_hosts.each do |host| %> + + + + + + <% end %> +
      HostnameCurrent / Max WorkersControls
      "><%= host %><% if @sliders.stale_hosts.include?(host) %> + Not Checked in (Stale) + <% else %> + <%= [@sliders.current_children(host), @sliders.max_children(host)].compact.join(' / ') %> + <% end %> + +
        + + <%= daemon_buttons(host) %> + +
      +
      +<% end %> +
      diff --git a/lib/resque_sliders/lib/resque-sliders/version.rb b/lib/resque_sliders/lib/resque-sliders/version.rb new file mode 100755 index 0000000..00512a1 --- /dev/null +++ b/lib/resque_sliders/lib/resque-sliders/version.rb @@ -0,0 +1,7 @@ +module Resque + module Plugins + module ResqueSliders + Version = VERSION = '0.2.3' + end + end +end diff --git a/lib/resque_sliders/misc/resque-sliders_host-view.png b/lib/resque_sliders/misc/resque-sliders_host-view.png new file mode 100755 index 0000000000000000000000000000000000000000..94caa6b42afe5235af47015137e6cf558babce0e GIT binary patch literal 52662 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 literal 0 HcmV?d00001 diff --git a/lib/resque_sliders/misc/resque-sliders_main-view.png b/lib/resque_sliders/misc/resque-sliders_main-view.png new file mode 100755 index 0000000000000000000000000000000000000000..cb8aff04b180e10843d6d21394daaa093081981f GIT binary patch literal 54388 zcmcG#V|e7t6E>V|vaz$VHn#1Jv9WF2wr$(CZQFJ>ww*k4_MHFw{k@*+`7m?+rl-5Q ztGcV|uDfSKWu!!4p)jFp70im&*3JA!E2?+d@ zv9mTZwJ-z%QVDES1(#8njL&{zp*@eYpJG4C;ENLs6`x8a21i7Q$@!TR;**y{kmpAx z8%IW#7eZDNB8~t_pz}*c<}%l7`>DI_ZFx~~^I@susXQwyYlfR~(;8Su{Wc;5!q*fS z0yey8CGGf*gT4KFj|2#`BqsYu&h33v*i3y>6VO*uR}}sn1b6J(?8DW;r+VJqP2?>Y zP@Qm1vUGwonV&Tf(3!i4Odjwr%b)MNEyoa``B(TUv3@WJy~vy^U#wc2y;|LLU?0DS zww8c;D}Z)Nxw*+dfnq=rd8{j%dGmq|Ab^s1CP?XEfWSyW&E3IWUV(a)!bU`cf`YDg zI3Z9UUeUNezr>1{w>h}EKfZ>#k8Z=SgM4KX@v|Vm#t)ve$(e`_t9g!N`EgL|+=p2v zL{pz`n3zPiGDKf65O2qgLSP0iv6_Z2;gewQ)+`^u&EI4rEWMipD+u!*oaq>NM`#Jw z);{5RiRpWEo}_pocn+})?~}6_`Lc{SSqKSRVv+RQ!FxwAe{sv!ItfDvb3wVKqw8Ef ziyVeWSMTESz`T9OO#ke?_nj@`^rR<9;bq&{cy!jTVW0!Y??D>?g1Utf;F|r04%E*p zO}+!p6`Q6~Km!Hp?+gJaq!vJE*@rmsCNj0tZ4=?$cqg*vSPTw(Em=j8}hS7H{nsO&v2U=Mv%C7*5N3x@R}pVaJ;@pI0AG%}n*x zJ>cgWE05c-FH9dH5}EHO@N9?M$kapPA7L~ zV(2o^AtN}3e(VR_3=inm(GjOWr;teC8U0`ke+e7ZORXhPK{=UT`kI|3+99JCkpTNy)=3(We7Z1-u&tuKL%^1%p&u;9sLphKr~VZ=6I z8=e`a8xJx3q03|lqc@@7(Z@E>GA1}(F!HD8$F#!K!YI>dgdVC9iy@pYjgFN8uKwp# z-(cSG-gsQUU7}%tVP>MgV)9}#b8=&rW5NR`7HvABI-NScI`lfF6H_}|JFGkQo9QFZ zBQcyX94wr5ltz?rl&w^Xe8zkdV`zQa9qdj~=}^@;V8O`Yb$I!9K{qnG8K zU7o%lLMC5|f2Ob%3b84hu_YgbIi6PMV>8>fEuwl=Lhb%$nu+%_DY zs^_*UI`!WK9|y0nZ1kO>ZOM?3MD*yKIm@Vlm*CFQy4}m?x zMwf0D=SClyf|~J2r^(Vu_A$;k?0))^^Cw~}VWCLV-N$V(R06aV-XJb4Cx=pryi09J6U0UPpRI=;S9Y+%7$r!iTbj#rlVd2Upk}{36|(wBg2D;k%)&v$EytErd4N z*@2mabr@z+rs^ip28kw)W*#d>^E1n36YDl|&-x<&>imxQ()yh6mBiV`&CHd~CFI$9 zhw-l^iE8(&@pY-@?5)~X#s%Xo=j!d2uSd7M<*?1XOCB4{d5m^vp}X;)#YNKKBF@n~xa*9M@2gwJ@zb7J)7=oR zH?~|(9(RVPphg5wC>P~%%Nf<>TOpmL*$P?b84MY2be60ic0=xmAL}K}>h%~`qF3UF zE{A4E2S=Q!5okeZnrOz`A|2ZrW3RuSa`jXlUWURh$NUwG7gwVbqSv$Gyp7&8?u2fB zU!^^)omJ;*vo71SuCUN}$$vOKweLT*PPR~QD4oF9;$84gdP`XZTUm>^$Z>fGej_XB z@$v%lDC67nG$wLJ2lEmA%#?q}|AFMuGlCT?2xTM+N(T~3_~ZmX0VdMFPbR-$*#P-U zPV(b-@WmkUej_AXAEh3a;&(^j(jYFr-@lEevis?J1cy744;Zl0HskZ-!;|0Wropn| zzgl*za)A*sW<6@3kc#3G<+Kf945CM1DPw*-B<3YhD!3_-E_#{Nn24K{nqr--oVuL} zofxBM&{Z&=vUus$)tIkGjB3pF^~^as=O|V<7D>ih7HVdCLf4&v27zd2fW3IG#hs=n_dy}gm!s(v3z0z`}zLqsphlxdlN7dhz<}6SQjc0tP`=4)e?CS zR30`MdL2w1`b~s@jEam$#7vZYIV~E>iI6HT_FH0_+l3{c@oo~IzsX2S(8_UZ1yQfd zi0^oIK2Si2H%biGnR=9aR)a%TSg}fB*NfuFLH}U9{+OcFEZ81=O1tB_#V9}NDNac9 z_F#w-?`#nZs;W}Mx$~xEwd}w&-N^lZaxE&9rpzi3H&{KkGqoA|D&aoy9&Kx~%h_gU z=7Z2*1lNEk0@u!i=)=Um<;Zp}m_?HF!}4%*y>`{tx%tp)s+qchI?Fq|`^Q_a<*JF0UZRuZ#r|_~)wFT9LDhE; zX6@uvofVZYmYYuFdNa!X;4A5V%g+nTflrm5D8b;H9Qe>>9#(aNxt3louWP4 zoz8(~>KxJ(k_GAx;xYnMA}?`0ncH}#_z1sq8g^w@??BN((873(Jd5XOr1lEu5tcFIRn;sl(p0FhlWZ0b=-Ea zw|VzEoILE!42et>jTVjCs__xA?GvSotTV(*)2qT`$qVj_`9t-cqoZn!Uuf4f*G4kB zHP#_+WRk}cD!*Nv0_+Pw_s|4njq}Lq!D=OH?QJb@f{{0n4C8kSj7J~d?&SF4&&8M} z1-=gBG0XL8T)*qiN(Z@qALCzL5|*f14c8jkI5dTO1CuOX-84&qr1a}Qim zlBHp@Kiz`9DjXMkPn+!VXhoL=wK`Xc-QDz zt}V`A&ckVGWsxJQ1GLJ!YE$mB%d)gwC>hRfY0NL@-ZukF2P27Z!E+5WQI;1MqWiN^ zx_(r9YBg`R++;d3+MDkiZ_vKw1LGioxARdP^X<7gl3|+p>aHO1fLP~k$UM!a9UDbZ z6rq_%X7&>AvR^wxiiB(_q%B}C@QTg<;Y%Y~yK^YKe}P$zNR?2XaHSfoNVIS~uf)#G z$kfo>*yPgeV0}q@J_D74JcJyCxI&plIY0x^qa9Qyx+TIXa4AGBOgE4-oIFT5DEf2u zL+^)U0))79f^;cp2}PMziDRj;S&I3bd6c=LDfr3AnZ?QD8OrGuBLb@mYlo$R&bb+Z z-mR%}vT0SSKYR9zd$`f~!X~QHgp&M{Ba3Vkrc=$P=UW~(4O|DDeUx&hUIw#BmE6MRXw~xoUrB4ZBY|Z7>PYew^$F0Zcixnv2)+01$|S< z6EE;5BR1nUqZiz;(WwdY(axAs&9%G6-*}y%!R6s0MKntQkKNaABQW1g7k$@h}fR<>1X2Rov z7+PPSKKQ;7h$dZu!{Mjy1G&J*;^s8hOEhv60mM-E~S#~4Jabz5<J8V8qEEP? zl*eRDefbd%Gj6G*yu{qZ@5KH{ifx;rkNV*7$m=vr=GXMRhTdtXW(Xvw%HEcCiqi^h63ic(5->W4e3>d9K!O5iO0c)J?hf_L4aPhj2P zsAC&@ve*tEOTN+?mn@Quo)Vuhq@AEnrP6*CePcJh=nvX{YQ;nBo`T2x32X5Sh74qL zhg$Ias6dqrSlkUfKc%QsHJp3Tstw5dw?KY7Cu0Q?KxGP>7LY;Fdu(?vK=hT=|ExoS z&_1t2UBkZO&PFhWq#S@X482SKto4l%KVU}s$Il{UFoegi7@Ot6`P z**uf_lMx5f3)Azu^LXsRjP{lpjm`~l*9g~A z*Wu@~=X}tJ@2%fi1BL?B1*bx?5Ga34Cyyjk#Zkm}{hTLqm%eO#ZzG70YpZJ(?=mZ1 z3k!-VYFBD~{HxaaPGlYx_; z0hLkR2Gi=bF??QhaCszqyn4`hPPlXSM|o!(@0w7Qo{jF0!|}ci8$ZvSe;l48qZ>~W zi4^e`AwF#_v#AyD@30f!kJ3ofaPaR8kA_Kx+|x#*wo}}hPmduAULJhj_~x=MH~#x| z#0Q0c;@J-tP==+$6}GssR3tsCZv4iD94rMg-%!@do3Zw=46CMD7aKsE#2UR%O|HbR zYL5+Dx#yQ{SY3N8VlH~GXR<^Xqmi?1cyTbt-K|(@xPUv;yykfoS>@?|r`D_Qs8nbm zz1Ua^xjP=mza1quE;yz|#&5T>QhL{XQ9T=aqvn7U{33P%Z9-gs<0H-GIcA)IU+=@P zf$j*{6JW=G^8||IH_u0&r9NhkKq5h%4;|F0tT|W_$^g40v%<9w;T7pYCV)T|gw}&k zgwiwhJOw8*o+Drn3<@psT?%_7)P(G0`S{jPF3d@SH1BzcjS8*gwq)CMcm4y8TMBII zN#kSV$feH3|KavL&j1T6h`wpx&{v`6kP$!b)BoQ^JS?c73INBEGuqY zk&X?IgpZOBZP29e=|NNh!~xbq!tzG>mHJh~vxD+TStO;T*^;>&2-zITmk!r_MP5qo zO?p!HSxdXV9!Gvpf#ib@!)4+IQVp34G-p*aT#Fi^?E1EkE{o~*dq?{;_nHP}5A6$H zsUCwzW+EW-jUhw5Sb3s{ce#s2l?NowB1%Vg&HB@oTA}O1R~Ap;o1Ppw?%kKbcl{-~ zZ~fTOAi^}fs@N##_8v)}?|b2I`}MTVTC-h;u7vcZOocp^-1%=x&Ps2YuNh+<8-C9O zU+%YWfrU-*w&UXCzbTKDGkKACojh*eB;Hyd#sH$jni_BNpNl7^eJ!(b-b7x=-#>w%WzRr-Tsu2IRMEvK!hoJ-TRJ;c8#_PpF~wL& zfQ}(wKD-C3+k;Sj!cM)PBJX*D!fU-G))pd{09-nxji{9tw*eUpLE{)bTidX5T;siSh(d(PT9Iuu6z&6sW<jQ+LaLid$J;96tboAL5_4d*-&SE#Uus+%t*kq5SWwJn6XqpU({Uk8s$M zX+@@;o$&ukhp?rR_k31uT)T0yK++5Rcg{R#Z0p_U6xa?Vi~m~oo^2|?cJ(Q)adk%$ zeW?Chz-In9-;D}XcPFk(K1?f8$p1Qz;D{kaxNL60b$24U%SrvMqd~VI{H#h|HdXs6ca{GW zz(oM-CnDF6<+Pav(Ivut?S$myKY3;bYrVq-+47%Kh^aj~D~oCyI(Pgu-VFj*vd|ry zKO6{4UlQLu{x^}^?9!I7e7w5^=ypC}l`!qGpqkVJ_fun`MqU4z{=NB_3PM;e980Xy zW`KEEgz(cRm%-6VlE0ILU!gW%{ z>lYSn|JzB$StlA4nt`C#R?0JnjFm|I#`SO30lKVfIas4E1qZ_Xel`Dg-E%>c962-l zbz#9ZXBTaDe38_%E~(pGZ-X`YE(2f|B>%I;CzgY<{DJ7o)sRT^pKy>!MAgAB*q8s$nwTKQi6tlXcTU{&l0( zetL3bq=kis#)?1LN##Gi1`th6OacYLJ&C6AInOMr zZC%22#NL-wKr?WwtUP>dTqUVnvA;}lUUhKO&|FfKFNV#ZoX>qi{pUGs3}F7gD=R7% zEb2G=(Y&7uva+)*J2B2qI+8XeBvV%1HzEAi${^KMcS3MzMfnsVm$m$AJvq?m(jA9s z=2LTL56Y@ksF3adQ#Cw8iWD{cyX1Ubb?aeTy^kQ=w5=~YeBO9y@ClKB(1PaEweTFd zLW$8tu2c|MN)SArSLCMERng{;|0LKJoI7#$2g7%Rk?me{l@LCA_F(p2oxm2UUtU~9 z^0trlk(XJn_De zMz?uvMNC$G+ywiSZ3=4{PyvI*ndtfSw`tYHt|;H#`2AEA!d+B`|Lq!E=NS6EqWS)x2K%@h*?4O{+H&BN!Bo zHPKUg6wB}+&Xk$;I{i87E6uC3j7kZvP5Vt!eir z6IST~csh9EhQo@OX>>t6d zIdJ)RKc_s^`Q~$-7iO$ugeO{DBuK#DwpIDwQzB{%mzZ(?T)o~8O>>`AY8f^p_FnzbSc8NrmMn`Uv065^LWd3eBE7>mTAIX#9AkysJNY<^L z(koo!{>&r7)PEv7TLf+Q%TPXK=PoF08z4c=F5EhmCLhvqxG%^QGq-tFa~!|d4^GWR zA0Ii9B#^UvhKW<1Y z)n61nPSBzb*#8Wu?C|%(r{uBb8$Br&p!HalM6AE=#=pkUtLp&yo&<+b8mG^PZ!`tT z5nGRU9kXlCecZbS12go@Sg)tYD}u`r!Yw{(y4hoHbr%{x;Mj-*w&>G@ru+RsvqPgX z7QE?DDC>i&lr-zK6^x@+D{v8zF>Db_>U*G@j&og{pEb_R?L5(JdZJb$V{#;sHO zXVs6L>J4Fs$g931#+(G^TaVWcWtQi?Y}VJzo%hUy5be!OBB^Uwlf}WRUwX%xX3s@8 z=3w!cpL=#kWGp>(h59=si*#EuCoL9a5ByoyPFCdpv-+o@%i3$h^_4Po>%|Q#aLdjk zKW-W)iYYh|U?s^f3>ma7EgxQRs9GTD6yWA-5+R0psJ1(iJFOzS-)gQDk65=-l8>9O z6|FT-ckGabn~?~aydK$qK|(S#nxlZ`PPO~5r~ZIq3qUT+IA3o|La_$6C!tfRwkh}I zvY*Ayn)V8S|MWzB+ot|Aw80frt=fz6q3QAQq>=S?O|kXvpXKHqbDAH5y2kA1MJ2OJ0n3>DD!yH@i+{>TPA{GXp$Go z7x7K&^Uv>3QuCmNTL4Trmi)w^p}T+Gp2w(?T-wIUdk%%xVI3 zNp(FKAztjb%>y&~F-trkpqFPXDtb+&)95$oH>KA*vmjAE8RdE%Q^Plx$psob6~coL z=cz%}rb3uD3IPUUlEbc1vZOR~LI(ub3F&P2%n*E!7q)IRY(a;lPlsSkhh$8ryOb{D zGih49x*8^V)Dr~VEJ;sfSOTgASfMOb`*()hFc&M-4dxG27ADqNn;Cu>osdZIoz(T} zgVZKRh8FUz5IK&b_i5hIb$j-3FDI06wouNmhLp1@^q_SUPzH1q^ZeB!;7aT|HZJvh zu&t&eI+w3Y%0wWSqgLi~AnVQkiRQH@76EIEa$rW{&3GK|>P^0UkI@;)^+f<9P0 zWO8p$@5fsxyP?L)&r&(*1DQM2IZ2WRm3Y$g*Kf3#;`Vu_S%;Hq<>5gj;1mxFHHJm- zY^l`D+4=*&D)5J}TqXz5xu#baO*s;tW-{S8Bf-_!97jx%TmljDL|i`)AH&1@Qyie8 z(GF}csh{eO1G;a$movlW*Fbyn77yO<7oM9OEnvY-Yg%jDf*HPO*He|dGnesN6a3b{ zBo1E(3pmw$D?Pkx5^HZrfGm>Krq{-*7h`3waGYi9k3f!{tBkv*esRUzgrjuaot0j= zpVir3>j(^N>i&Z-MSN-7`G((|@f`+DYSgw$a0Pyt)*oJ$>_!$jvD&oi=(3iPOnyvp z_^(-R*W#crSM#=cjmD&a+HR4OVMgZ6?=P8pY|lXS2hCnpjP9o68D~Ua+*O`$Zcl_H z2-3OqRTa(W{y2sKlX}G%w^HqYC-t5(-`_e63Y~xX9!{Rp z7~(~{(f5q3SF+s>tv-e>{N#LlwRok&_CY0ulO(z}1M@T0KoT+82}<54SewddVRGKa ziW2|H*&BpLI9Fy&$ei1P>@BQJ;<@XY$Lr~v4Smj!F{ZTaEpPf|u8jV@hNBeEN1KdD z@Rde9DNgQ8ye(RTDS!9p?PXjN%E^WDVkrpx0dJfy@!tomlgjhZv5qn*X03!!f|`&W znyucfD-Ba=tRf2iXLDGhZ7v*dUmxFXg+U1Q_UQ%&0a;GIzx>38UGv<`v}j1@=Sv^7 z?J4YWU&7fO#!PhTXcpd*-f40VBq4ZCt|QyNmCkk-$)gf$4yP%Jl;$%7bMsK@3FC^! z2TfyWSTC;Q!v;MAvSQlGQueZ0Gtvnp#YUnOFj&rDY;t!wwg4%qi&T-+(jgU{&>$uv!+ zIqPQ-+PZ+&?)2ep53H7V;H_zF-%*%rdQ^8xaSZoU14zJ0MCcH!r+t3~-!?IG1#x5t za(-RGW2+FeFTvcD;ie02<5ljT&sW|l|LUN}^Sqzs+{qo)gMO%i^d-G z@fsaSn*>t1U^&IaWS40~_8d})I5}CdV7Y&tiGF@aTy5({+WeFQD||BUnIYQS*fawkYl!^sN0`fzQp2M_;ot~6*XXTawxqi83&wp4n+Baq32NEn? znq^Fe&cGpq9?Keg%@+dARTuHSG(IpEEDI@^J=YBwI5-@Wjs&h~w+hH(5XgeMW~bvV zAcel8aa?uWRRMK@Xf!Otz7BzCZvt2Q?soxmI60x5CyJ&qIWu1ewJD>mfs}u_%&e*V zfop%ck|rl5eG+bTkr&#uZw?F%A(b!7D>p%E+9TU;xx1*RrP~e<$1|8BDJ4S#YE-FW z!VSw&oG~U7?2T7?FcD@*TdNtSv~)+dh*Fq|l%U1ZJeqkEmYRcLZ+YwWz^$E=hJh2h zIa(*sVpvX);7JVGe+o6XXesMo#pD`N%EL$G$M?sMm{!Ti&O6?<9Nb`;LF*?4t*1CN z?I+Y>TVIs<`tQr%iy0+M9+Gl5Xf%Q?e*xh4vFcH__h+<^rOUT6YY0>aPl1}9Gd!!0 z;SUfxUtZ^N?v6|c6%;mF4TQ_{txX-~Uc~QqK5)N6 zs2i7$R@?;S%gRP}L*H@6BG~5`)EzSz?qMblO)U-EIt*D@g|&+i_(QUe>^LA$e(nn z(~Hd6DmFY_J1yZWwmcBvmlJ9JIaXfiS@}#|4PR8~mxnkk+q-}`|5TZ@+F=782VJ@qUifWK zr;EqFFo@vV@voR1HFdUywRQJ@hz0E0eg^E|<*ip}rS!9IiDs}|04vc8S5SXAk-2m) ze*I4w0O%H?ucR{qtC)^eL0cjdO%~S1dMML&$KK()pPK}|II1{fG}+aIb-F0xSBo%Q z+++2P|Kr@-+TD5X!~w@EDQXWO0s=n|=^1;gN8<=8WodOkuy1o3t1*AIVAY#zZEdRw zH^URp&a=8}E2?*XHh%oTES)x2Ib=V)$kftTzIwUYaj(b}Gp%UXseN55QEu}S_sMd5 znXpZ&Sb&^3_b;_ZVAu5y7VIp8B8D0;!`vxyF8a-yC{ytz2^t$-d2loLarwdtZ^^uN z{-mI>F)=L-Q%z0H#PVSS)UmmX?$-v9L@n zEeB5=oX*hHyL`-wC~$;;vcl>YAF8;^I)tn$9?okdT(l0)TA{A3w+|Ee&nn_Da`m zcZy9*3tP1q+O@H{-r-A-D<~|CO-KlsH923h7UJ z+!g=i9efvptNl?(I)}4z{GkkfOFc!L4*1nu!D{Y2g|@wLa6g}=B{hJVnn+^~2WXa- zp1z*O0*xO<>(+^zKRfcUtSxP8OW)Yo2!qWQ^ZM!rposQ|02PB%bL0836h~%MOAFgj z6wdfkr8>LI^-qBy7*ltul)vB;f!|^5OKY>|%>}G!arNPhBR4@lUbtSuSK zHpdxUCr`XzSXfxCuczgJMa1S%4%kjP({|0D{PBaP$tfub@dW{&TUZzfK_s+c!xnK| z-!bjtG8jQ{x>y^`;R6sR8gk=*xno3(FR75-YYDW9r^B9?XUXs~ux3V){CSFOoyjzi zBS*E5i*3Hdt1O=M$)H)2gc?dgygj>CI?PBw60l&wqNb)!ktk|%zl%1qESC!dC0;Dnw`;r`J91zQzopsALOc%n+EVw4E8ppn^e&{UtcADh!O4I!L6PPyN zOit%It4)rw^77WN&o|fS-C*G7QE9JlJ>#_9Ff%N))YOqD^TqL5S-1ze5cqBBS05L4 ztpMfFVS;cWJ9bRB&TZHLdRb-~{geIpL!<)F;>j24W|OuL)VA|KRPscNzC%yre5
      96ZR(EY0xLJ-(?ktzTQ2%8UXG>+6TXGK(jntZ)t#Ny7FEUJ6#=2fE7;Iu62mi^ z=oY@CH|lIR7>|eQPtd+o`#(0URjWj-Cgfj#-Mi4ZPiI{t&9H+V&vuES9D+aY%tRWF z?7`I9MpK^+n2seBX-Y()*50`&HCp%^t2_l)B#v0CLbw=l?=qFXhY_8FX)awjIX};w zL3j7^%xrmoeY`(5cSo8HUv__a-QL~htBHUXGp_i^zwDoN8~-}M^mJ(-UKi8N<8#@*#^ue>iccuj-b;g!l0s~49A zdVdh?e%$)k5L~!%o8uE0>hv3Zf5)Abw_|wogxi+qp3~L6E0x!d6HV(M;3k!gmP&P( zojBc%w;*HH@g~+5gB9YA+QGdS*I^Fa=i1^9-QWGq*s-UkJR ziGiw(mc(#w6dluRkC)sH7K)Ob-h&=X^8KhgtG&+D?xXNZ)sBz)(hY|#1QsP~15xX2 zBE&dan^(W;uaDQEL)|0`d|A^n&rgBBUmUOlu27gc7nm+;)KaQE zL=)kgHiwmu%xW9#cJsU$_5;UV^)59t9>oxiGdN&X1UxN4{H3~56a=`}o!4y1u+*14 zL?w(+;d$&aBQk~HlvWFEUm1`T^<`Zws-!p98O$Yi#C>>sJghW|8eY}*Kk?jmb`y3+ zv(SyaZjHx+Zv4vaYx?Vd5ae;j=T40kQ%M*1{cE!oyRgfD*!Mtgx{X>8PJ>hwt zbrzoXd7gLtRj86mmJoZ%_k4|PT55+P_IJ@PbtWYPH(tvVEj$c?@w#WkFD2n^PQt*s zC^cRov_II>JI$>R(3+c)?T721VlejovblTSn`sSK`=MPzu`g4-X`*TFEW`%0M=Dix|TH4I*wn?Na0JLJ)4n}De=f99;W!w zd#!l$7ZC?xLgu9%<%j|v1RTxjXVu-|OG(0NYL>@RY}v(t0bk7PKp>EiBx+PFpAFV{ z((US|78ZO2lYou;d<0ODTSv1z!Oew*g_Rvu=l);Z9diADp@{8(M=R|DczHgmQ|{3f zVCy6uYhKd6_Jcj532))syN--riAYG~R8>byWb+Bua&b7FVp39ERM_*(HIm#cK6zPL zb)KqitgQx$Oplph)znKZA2rsa1R5$>`}W#(H_5oYi--R5W;5HZ;K2||L?Z| z#?xRqMMWg17wsBVP2G$$4{CaUfyWm?u9=m<_f6c+;^uY`>lS0mK=mPSx8OAGuOs_5 zfa9vG+p=L>-hG=)q4)m>s2&~~0rrgM^Ld!}o6WnU$bKG;0ibG(V)Raj3c3-Sje{f7b-Mv$C=ho5KMje|E(Q-a4nDf$8@4 zc7_Qye6a7z>xna`Gd2Ipc$=&6hf=wsnM*XXRWV9%Q7+NIqnJ2(gfQXT)78~Al~$%y zaPJJGcNGBM|5N^XYZoN_1uuKgjuYTo+LKlNyFEtrwZ_x9Q`}D*G1H^>)MxVmzFoKL zYufiN0HO0Y`5@p=iT&x;U1Dx-98T>x`LpPX@rQ)5F)=-#A8%r!qCZ(!nkt=?&0PQH znJDRDj~z#V4Vl~9ov*-jP8UjVM-cE|OYWvPqn)=s0cAHT95&l8J39uF_)-xwm-)H5 zl_pE9^=4~QK&%f400mr({==gFQ}`{=u&z|q+rAy1p2}wwbhSQkZH?7jr(pEa%SxMp{Go?s<|J9hSFtD6>acvz2 z+#QzXxWoUeqFV(ihEJ7cI2ap|K8TEGizW#5C#kcP&W9a zq@-wVQU0?k2tztEc%r-K>`@LY_v=vii+$WZ=;qZ7m znw|OnMhO6AW-GdO@)!I98jj=tp{M?$@c+x_sF$O^lJcG`#Klf7G>_@yPfy+4(Ezd? z7)y8mW=Fu1XGz6&{$D&_5Vr;nDl9GNI;zyNEXmg9rgT(fZTLfzSFMPR3e>yV)94DvBEo%#F4E&V0C$Fq1vQYF=I50k}EGTQs@cY@F{H|!Ip!~yLSJ|l} z+3=t`udXa?Y)rg6H|(@*XZUpbtK}|yyxjqg;Z8|TRa4l@X!)_5^8hVTMpZL-(QI%{ zMZon$+%DSpgG0&S5Jgs1UdXmH`xE-Hg#n93SNJ~LBU)6ag3LreL!q=DBR!NraUoc&X)B2Pbi}}7{bIPW;(Z13^q`bV(#<06W6-P(_?umH6fzf}_65mf4Uo0A! zVd`6{&JwC~VkV(^`yqoAOFk?f9@-nVJ?+cBraqtA+ta2%s66j99?V+yTmogR_)okF z6(LePF_gDA9Cc2>>Fm?aa|CU!6vS@GVtXlm?LTJVf=9+$u`=!ghF=T4bRkJ4=P zWZZzz$U>z9q4JcpLg{Uj_REsSM%WgwK-bNw`j4!R$2WyHGn z`dXS(*>tu2$BwU)Y&by6S<$O*H$+`87u%-af5zgsb_4fZ0NLaKl`YlYy(F)G6r_UcY3e173E@?lM)MdqU6Y^@!sI$bUES8j5<&-t|Qln_)v0VsCJ-b<=CI5GOj4 ziNI3YGrF2sGDm$BP7tKer3sgfQ<~f-m10t=t}W$p1jmJ?HC-qwE6kZZeBwsSs=88^ znmIIF)aTcR5nPFx@m}^M@@vM=IKi=48`axgS8Hd$;_x0mww%#q!eH-|sxsb8KT}$z zPMl^+!Q>mur5v=9tW`UYP>}VWnp6W%smk$Z_P@C+!;OU}yCkcJFYZ3MPf_KJ=^6^? zHdW`u98oellP7u|br?kw&zyFfzNprV{P_ ziQgmjwNSDuFMSB|2**QCKR7FD8~z*(szdk{6mO*y?tTX{+S{hLp7l z8pc(!s3gjXmxjR_mUTEZu3_e7K&KXt;fO18#pgrFA6kc%C&)#bnWBbO@GBMrWXhr# z=8tIPohHaF4!U+aNhK$#C)OpEQptQTbQCWYPfSlOE=!PeEc^~-rw}MtX4{YS-L^8Vq#3zyqx=}v4Ktm_;i$^ zTrSFvdHjh}Q9KciRxwb>yz{6^#n6v}qM4!)yR4%{2IWUmLuPm3YNs=f5n7V#qqAi# z1gZ!By(qe zyqPs~-+OD;oFBc;+I{+*-L-4i{%U_!b&@L764ih!Ud+xyEU0g*lbA}r6nk6V-e~8a zdKNP)%Q`vF{7}tYRsFsARj);_8sk&K7o0jKqK|e}FlpBTHLWazbB@~@a!WrmN(B$Y z*G)f&7VBu|USNJx`IvEIFRAcQSD;e2sH9dtOSqB)8;}InAvItLlgNOUS}xanR>rdP zbnuTnCiV`cgc*;O7TKD>_!<~afMu}TY7{v+U#QCD?J_YR^xbIs$|Sf`Q55GFe@I9y z{es-2X$ygT6ZSi`9{#5K-Y!u~b6>OGWg9;sNx$$@NvW-$mk`?ngt9}DFE2NUg6Z3^ zDk@Hi6&qCgSc7AtWpt*ve!`jJs8#TzZL>v+(_5H4wun z4-VsB*5#Cfgjy7M)x8E(qZS=Me_LE{TUneg{k)`hs`80(ySzjNRg6j5E!12Mav&rm zlDN{WXY&0$3Q06%-Q1&kNkv%G4nNbzoiwx5oh$Q*A77DBt|tx~b#v$&qerzdekKb^ z41;#+xrsbM=8P!o2Ivgx1YU* z;I6O8dc*yIL-?CBPCL;D8{UAJHSr42K3&XytC6Xu6n3#%f$efO1LTW2QG7`aP(nK4Zv8A7W55Q z^F1Yz;-{dD3g^j>4V4}ftm#h2TsCx0eNo4}<<=*%#=~23Y|We6r{u&%c8%)`sds*$loTHi!09yNcLCu*Oi)llM|0rANjjJy zgJ(i4l@Lrmv>cjczBx;ZKgA_r-*0oGUyoy*P{4OR#K30+f9>-~7m+x3F($-*KB?^P z{2av$XnYW}S!k#7PtNT$Wfmb52r0)qtY9-4p?VIO*|?PBNDe0xi;4x?Z1fIPU^Yh= z3~@C!`Nwmkz#9O8l-dl@yJ909*DNMT8l7u0Pw)(N;N^ja&C|6`N(PRw=Q&+CkNTqP z){z}}#J5lxQO?(>h}nJgKkdtQl=cUX?s{}pM9-knlO!c%Z)8_0ljS4M-Q5v|RW7dqUjUvv|P|`>Vfq7so(R0NCd2p>69$$B|2peM%{&1 zV_)g|wo!N*eN4H{eAoO;2?B73mZ0YLWX`alcw8y7!2T+z6^JDt^zG`+cixPb1`iCU z4HX^F#`W_%aR4U)8^p>=XYmJ{P(-XJ5&gU?D$Yqr1Lq-mNGd#JLHK-jfx^vvFKEA# zGdq0)`EmVk^@j_}X1^yS|{ETs9@b}n} z4EOEvB)M8E>E@6#r)8%nA8hkU^AgGGryqb2yqXXHJW?*uUmoj%?_1;FXy~;d>Vy^@ zuKqnUIvgURonHui zLqi3TUq9AC+h+9dC1INTk&Nl*^@?2KCro^N)Cv3h7-3AgtPji7%tF3bTJDsse>Nff zr_Zhno%mFa;Cnny7>BWwlSY04HUm8C%b7zr7(DE8Bipb2njRjXHTa$a``#G`?ixe# z3(7xC@$krRUfwBId0q+GEUw>uSk^iuTKEvZ$?l!f7w=t-+H-q2m||k~z)(@WF_l5w z4>kmOa0|^PkrNVosyL#ju{yYcY*0RfL)ks743avo@d!~kt<_MD7&ot+&eAEkjq_`7 zTv8KXqQ0Q_7X(^9>!_UuoI6wIyd8{k3eAAj`z-bQ8f>K;7twnydSH#0Q1AuE)tMmP zj1tF~Zpw~!SP7=)pFg^p&tohkI?RFjmx^3JEEZnYZ<8IfN+HDB;v0VSsxBjM1FpIq|x7eb#)Wbmi=iW}fuL z=;>IkZaNr6diG7jJHBiZZnfd{BJM41A^LdNn02B8LM6K~$mB^Q*{^)k&s6HZSHCN! z><6dzQ6FeR)i_I6rCxs*wX}LTNZBMY4LPt)Ya@ufb+@;R3>GOlHF<_;bLN7LTpcM( zp{ZI7l}~x~&bgKlpyim=w@k0=N+&L741qoskZo%JWt02GWAiaxzQV=;|J7th*#f^K zv^)6ml;F5-@h~E5YamX4fUvT#M-O}Jd~Ov?Gjq-x1IilNhyAnw#~yn_^ID@tQo(pH zqbc`^E{U_RBY=JN=Xn>@a23TKRa?@yfQrXO(qH0!>~b3Aum*e98pjt;*b1}k z+HjrsUiyYY9Q*Yj)CjkJ#Hsfl6cBM)s}UkDwlClK^-7&NJ-VvxY$QOt!{HGX+F3L~ z7dQM~WU&jkCaMPBCzdN`MsNom>#D2fnHvrB8)Y)fclL_lsy=XgAEkk3msR4<_IK^d zZv}QBIP(PkM$XA|ct!=5)iP=!bCN4MCx~*MFBMaiZ`KkbRf!Q@Y+vjBXOZwY!Y`k{ z^#1r&*DByA-1gg0nU3_(Z>@zw=4GOa1H?kSlkI`30ncmx&>WD)WJ}x+ji3DG?R4?& z?Qn*KeO91X!OO}S6mxd(h~deEHNyAJ@ZG@irM;={>7}Pf1h{tObE^E zP;6$*LC{b^?H1cT;w!RQWY#4#o|E5Q7ux0KW0cZab;$`$%x_C7yY>L_6pT*Y9U6{bJ`}O(k4$#Ic}e(6 zS+n5-x`0&(Uvyfx=^DEU5F(y1dF5YUjl_S`h*MreHysZFDbOaDekq zwshzI39H7yR6_EQGXYm?_naHYek+=5SJNPKub62t%8=!Ja2zLGLk#1mq>{16&hnVT$fW2l_msTbv{zU)9I`H4p zW~fnQ&~U3Ks7$-;nTu;$PcP;LWQc8h3ThUgyAW@sWu~a-7MDF!1WgyJ-f3b~tEPw- zeai#j#dD9;9B~6O;=`>@ZAx^uzgitW7M0ib_+HI^ugjgD@{yPE4c*UFurJL7xp|N5 zRD9vZ>DaU>RS5=U0)tJXKJnUF9A*zrg=={2erjT7j{ovW_0?_(!wAbKO;P2Vuj!EJ zZIj{z(-~We>ggH4bk&5VYN5~I=e%d4uQ>{;YBP*^2P%eyz5~Z(?5ad=o=;oF*c4_= z+lStT>J=HK-l|%fbA}bAQLeTbRta0?jMbQ`39IFEDk@B&6;pgl$bH+xP^W6Oq~cb& zmnKE3uY67CR7+qf^tDWncf*XAZr-zM771FZaSJ1-HNvXaL+UaZYU% zY;_d=Oxh_#mm;q7tEESInF>=@voObXdT}_K0$(+e1^u%^KGUMoZ^MQDVf=)tv|Sc% zecM8eJtdi$qRG4_+tWJi6*0-^Z?tu}xz#;CW?rcd|6CLjgy`27RK$V=Js0Dh>h2AD zK-ZxBR-5gTnYng_65+PhI#(@I_2M$+VtGbq)iKcZYo}@8fDeRWr3mNbQp_l{x)i8l zdvQ2k?7Ogh{gmR7Ra|!BagxEiU3_r>iWV0v`vG%VO!hV$VAJub!K(uH8aJjbm*__-x0FhwW(`H2uQKiV3~PIR1xEOb(Bty&q}EF(tTCF zRw`%ISdo4KkV2y#aZF+JuEeNmn^?3@a{-Wx z_vHHGh68l0*l@rs9 zvd1>*FFzBs*OMFaFMb7$Mk0&uA2|Z!q5kvdE~8?JdmZ}$H-A{HJ&}tPSQOwd{-W~o z26q~k|G&rw3P{Ww!4*1i`odC+Loey4Prvk}q91Oj6O8{vy~E-KJ!p7a|DM4)yqkD(k#`voNDx8ih)*7_>~wrmW-&pfX&sLaQgEv1~zTU3u) zLy4aU9~D{%<`h!;*4_k1dfYprfYYLP((w2L;BVLsd#ej%#xTv*9NF)+45R$U{Tb68LmL2mCYbVA2iOVF~cOz(P4(G1I9v%?b`VePJ^x< zx(u{*uB3HLwjPrQoDp| zAetVIpbne=%1G600a`^m1#Ah;lqquMJB5*s(w=2Dn@>f!mFd4fZenu2`EZ!;ZmFR@ zQJ-mfk4+~}8sfZ!44*(q3b2^M|j)-Hc#Tmc8|JbTQ!>@X87b1evX z5>tU*%cT1s2ED=}=On*+^Wcsj!l)zb`Ia(>aP=Y@!#^TpwG zRkA0d#PPmt?(~9jPs`UINu)9T?Wy37wLP_?3dYIP>iF3PY5KcSY;|K3F|QMiNbJgU z9)@&3l6+gj4WsOnSbe8L1P^QW*ICWc@HJl+8ax%*Dfo#&sUI%@3^~rT6PIB1O5fGV zA;&sJPJKhdpP~D+4w9k6*Q8l${t&8Ab&n%Z%NgicttZ|1@|f5WPZWsqCPeO zeKu-p<@;fm5D{Kn0_^$X^HS~;fEyIZ>?xwbfA`^tGPQmwTwbp8dcMsYN^ViafbZ4+ z=2A9v7W*OQ-tkZoWTXVr=nT)PC)o@_r;FyQay}ox@_1zY5&G^BWQ9dQ|J{3iUuE^4 zttRHAEU@3^jZk>21FN-F%u-p!!Cv<&~+yk?Z|2b`fP`f9IdBRR{b>}!IfmE%Qb zKYvCBJfTtyi~go5p`7v|GQk+T1oOR3J^9gPDd`p#3RUf>*Me!#Banc2bn2G1)g9v|9iFLT+JHYU$w>k%bxU(5A4K_#Uk z`!7LVLZ2?60rhPGW@?Ag+#`dd6D>pOTWY%v%lR+moomY=Tz;{4%m&TtcpEz64Wg{-XdsI9%Ju5ng<2f!q4tVX3;ATbDln{au_He}&lIbSMIi*MsL?icPN@@mc zQ@f(<$LxIPI+S23(2riZV{NhbAx8cFI0(Ta##q#Zz~ngI=t6@kRvtL5nJeZ=foPUH ziB%|$x@0ZhR&m0r?Vt}xe0E>LB*UUfep} z|Mnz^rs_u(v6Ie&ZWsJ&_lcswt+3NBfGU>fJ(mz!K0>&t6C@Cid7E6blyA(bO%sE3 z|LWnnzC40G?l@Mq@9oNx$y~??&d&6D^5}Wtv8gS5=~Y`)W5uW>{}Ioqf7#^HQPZ}U zRz~(sIj&`HnZ|kpvQTsVCt2-K+mb-9rPN72)=WhLN4lqbT&z|*_(a^3&c(^6fh7dhvIb++w-Ry;%YV?fb7JuMIbhZ~-V>CxZ zBXu+)7UDOZZwOYjq0&eQL9gLIOa|e|h`Td%hzUv+Of^yKj6K|Ws0iw+uG;$??j1Z& z-)OHcYI5qM=b>U+Krk^`&)Qakpa{;)XpQTf_(URVZD{7^a?{Q2G_-#X%9m$)YFIZJD9w!iD*>Nkq1XUYV_c#%+g7JhHFR|Q>sSBr0mr03vFo}4-fY2Jwr z_kVa+QBG4+!YX@S*GISSNNNQz`{Uba<4#`hq;b@( z;UO4dBPEwK$V7}AbmFi^`NvH;uXd^}fAe=9zvws75hEWMACl>m*L4KL*YY6_RPFW~ z2;9Ar^5u?ks-f83*Xte2asXP1_>?tdXu-StFHlsXDh+rpVKSnUYZEy>o&stukXbjp z#*42eioG&FO2Cd@m}Bf6j0Csqr10)YB&guc2PN9|oD(>OO@XR}4Foh#3!WVZ3&5l1 zSLW2x%q4ent<`sjkm#GgFEfBl92 z*w+(uBO8=$Cn4;@?GWjlRKA+;39EG@1^5{hL#BZF70vq~35jHV`R9{BbW?+jMh7v1 z(Ii?6FM^K3aQkWi=Ibu^l`!iEw>_?~!cfZ2$vSNFjzJ`2_r>R)u@}C~u{}Si86qI> zi)y{x5RN66!?+u;4X2=Z1Ot`j0uH8Xtq$CMA75OKvvUq0O>FE)g*7(unu?uv>J50J z#+x|R!^w%*_gH|}bw2Z~=TK5V&MMRe?lM<@`8)XP>@#P2DBB*F*%29B42?E@=?_y& zFZ&f49v9{;AT00jX5D=iEoIR2>{)2faC5?d1(V7|S*SygwvaFGG3iwg!I zLZwa$D8hhyocK(s`-=_F;g46ron#uD=JCi29t+i|X$TAct;3KcJ^;_%Tda5=gfatg#gAwja;zJ#dxt2fuvu z#Va$5q%}+QqDsh`2UVpo3xLg559QH=?H|L{I(!oMzVW1w(Vs>^%VK>}2!_*>o=;5h zU`MRA%sU|Pw>vKi5|WA<>7C~lZ*3v5F!Y8TORqvQMm=yq3DB->=5gyq)RCH`xVP3N zuR!pEGH?PbdU;W`ygyk&zz43teQNWJSkBC0XJ@u}-x@DY8uP(1J(!mOxmSf{_uZ3f z%f}LRejo*#NgEBh@voHX&8B!@S(aB?dVlO;+s1ohf~C%Vo%G=L$=mtp_v^$<$&PpP zYME@Sp5hV7#9H%;b1PD=s&kh^j$<$2P(96=5{;_1X!;9D1WLO2NQw z^*6`NiWTvuIcPgdtNzF#x|M2=*Q>Yeqh&P^8gn~}G5bRqnj6a@wYAP z_6>6DzqXB}muKJpHR^xq{C{4USMppXA%clf?t=I4`MpX0{>-{xJ&QvAcRTdI-Sht| zEvzuCpQmM|COqft#YSVcq5Lz8MJ0U{&CIgUdI2KVDD_F13yKDdynOLYwn1w zq4vOMZ}lc_o}skM61&>`M}m{0YNgy`i3|9Vmz69@>#w}GQh(8pCA|Zlm>->Jx>stO zPU%FiET;4#ZyH{n@(3|YW%~YVCY(`jJ$;ER zZe~#96^&lbeRJV#Zq>@}%v0x03E~ls_&fB2b)V#6!Rt@d=2p{3{RGWxetQmzOsr#) z!?sOZ?8#kK>PeoXHQ&Ex`G)2t<#inehK&9)2IJqPLB_eN)_GLf=miM>>SR;@+cjIW za&a-Qz6AaWLyd~!2NOgVP6-$~c05^wQrj2O(TFG7@H<(Pu-U+!BI zExy%)0+98g5&-`u3Ys3t7Yl$wJZpo2dLS#ZcKv2Gq8o=xQ%cy+8-wu61BwyLytl^e zY;ox1IC75s_aL}l*^-i_Jjr;+AMdU5Elr^(JjR>;Ipa?`5Hi_Pi%(}TAn z73sIwH(iwePJZbcr2^Hlv1GY{J_2tArls0=?uutjsnF%F6F0m^o;$I(gZ206Hy>Vt zGW3`Ycq4ri_K^MPDx+~~mea|z_9>38=`O{H#@&XEdHb7pBB|MzWHyB*m&lwLb+nvy zT4JCIyA}NS4+Fc_l>TY?KUzj+2V4J{u7iT%T3PD7_SK2~m^|{wq~I%%yWM&Tx!x^P z!L##ge&Lm~r!U3wv5NK`m-sy+MXD z3SE;EqwP@PcZUHYmcQFjY0v|RYVZGP$%;ykmkhBb_YUiq8otTvy8+VlmMwKef%pY) z-ZndeJ&yjGF&8PpR>8jAbkHUs9@xq+EEaV}?67d$c%*<}PxXm8X5Vz_8s;wo-%{jb z^`H^c#)TinA>l|xwHmUaDhooyd#S7QJ7m@umZa19({lA=a(uL?zOpoGZLJ51-jTESfUei0Yi`gNR7RYY9fYT=1ZE^2Uu z*BnXc^rDz$NrEC%$yC1)bDcLXY0h;rXmbq1!JXzR82rZ#cOkqa!-rxLCCD<0;o$ z;e^`DuW8JFv_bl}mf>27EtcA(6Z_#JQ{D_^b~vKhQpywq(f}dznl)8ysLvLjdbl|aEI=uSd%^60c=7d@yiDSe}_DN5WOCoXWwlCG;iMdT(q|+P~S`4R=HXtpq!tNqv+GEoe2_Y}xbz=19t|-NxU_LJV z{7}}pfYh#siuO&q%rH@um!94E0631j&a=rJr;fp6zXBa2q6?o;oLX#VnUK?V2Bh~- z9fD!%U?vAlE&QnrXc~4t!qphaQ`Q$7wT14lMA-C`Nj@a$Y|G6?A-h+1rWR*vf^L#`|jmRbfxO<5%Cb{LBrJy=Ow!lFz%fy)Fj} z-n=v`GsJJ0c36F#HB)i#=2! z39Bc$5&fLgCYU%}L~&G~T$y~UXIM8mca=HFga5quWRXw)i3n8o>S)rBKBM*2{l6|% z?=U>rk)63@^vQFkzN&N1OaZF)t9HXzlKZe@=;qRNeT0g3cwWb{KL+11U_7K8XfxFPmz^=oYy>qKGVx|Fi zW_EVJ(+zdVuwa&7vNQ5We{>E*H1waQD!DD21+smXIXpLXY^cN^y3r%CtOcT^7JsB0 zH;0o6sw#4=|QZu(z|z^8V0y0{h11# z+nfR-{Yk2k5brC>;kM@+-nAz!Jw>IGr8n$>iLn%xB)}9RtJ)Xy=Ll&sWUNSUX7mre zef162R7fP4Q7F#Ug~kNwQLaF&!LBqZw1Xn(ALZ=U<< z%Aa$m*q3MbvAMaq%(_TT7$)ZChZ-+pOHx6~POO6u3ihF5Ji5bH)yY%^NB)XDbSo_1+(K+9KskWUt&+z}b9>TxA-a0I z#9qLmm3Y*4Z?S~RCoYH03vh%CNayMu{~1-ZgEa6t@p)g?GurbjTN$%t#`4f`)I%4s z-08!~n|9vxm4=k776k-Y?&6W%FZnvc2{atH3hl9zn)PLoS}HsgA)z@R1vPk=4lj=1 zujNj_iiB9+g|QJ1wpH z8<^{j3d#Zmu!@BmsrRAH0TndLw$k6)d772SJ({i;*o?AS&2kN!8Z8a{=qs7`>HXyJ zP)}@ocQk*=$m~X_Gi%hS;5*Q5YCU-Eh_lXL3|K&}>r9HrV zF}lf?=>E4W=4UejpEcC>M_=56<8k_WGWX>fg1OAoA=JU=AM&=Sj&X+UOVM?-qFY!( z*RRIu`BH=)3XI?t%xq1aci@kRe{VkI8Hr}}Emq(XP@1lt1rQ_~+y7EekFakz=^`N? zfz|zGSi~}ixYg{JP^3GN${g|f`>JQ7Oi~>$RU?y)8}C`%yKw}Hgm$p#g-)f$^sE~# zEtWNIJWO_Yy+m%|KfgM!$7*j8GOy-?T&+6?ed(>*czaLRbCNT2dMbN5bUv0gAM1=^ zyi|@QeJC5h@P2j&o80=9>|jdPf;wE)P{Sm99YssWD)PJQq!LS^J-ucrRjGyoob7iS z7^ zUy%cdx+!k1N`^aZKS<5DrELbgHP;J&Eu)=#3>^5$u(jCvaxRvyQJ~owbJdKZKRTs1 z^J#DC4Te;}L$VzO21E3MOxrHKdl44v`lYBS)Cm`KR=zyNo}%2s51ENZ6o|6j=cSI? zddrQhw{(5-%xU8DBmyWnPG0JrghUJN;r~oEYVw`-%B1~D=<03$%Eb2i+-Eu}kQc;{ z$a(a;d)>Kg?FjvwxYvb4$Mw;2b#Q4c-76nKlL%l7M#Sn^OogxGHF=377g2UcM1=1#nZ z!Z9=vTu%`^%={aNff(y$mcVH2Q;N-sdvv{-kW_Vj<(rX^k~LJ(-?f1od=xS^=3COU zgzX}pgzD#v(OVQI1B%E69WQw60$ z1|`nNxm6&i4G%^n`nbuT8=id;6AU@B{Z)`wCnXNV%j9z^rD)7#9Z9Yf_4GT(FO-Wl=BT9B^Hio{Eopt5_D>#AK z=5KsJ-^N;g+R`3J4lG>mf4R=MTB&DU=&)kd1dbo?yc{jKuJN6@nNK@^`=Y6t*CDg` zPzdwjS+v-(JwO>1$H~Eu5LNM&F_z_!`v_5u>CJnKDHQYP_p^S@$-fIkN?eakO2>D< zNNj24`QHc{@ub00^ODDAUOikd+gt>IEMJp|nh3mp=nL4S7Q)GL2OEg=|7>-pyV@K0 zz9je}A@vin!G5MB%%XqO=<61F9pYf`>BrJ}P7q8?>&fMGD{>i)+qLi1oP?_)$@wHH z-2a`X!4QGg-Y1#nCLd4tbN<&rFGsiu3L*Tts@DPUKwXcr?LLoLKdl&UvFNdR)4YkX z{D+)Z-kp$$WEO6lxmczLyl1bj6#ng94E0ezsRya2louh76<`Hn3Zv_gykTJ4xP+eCJjoQk5ZbRo5 zbVMM=Cbp382t8%MM+E};3GiP7p2S0PV&WVNTCD#(Noq;9WUSUM%V zO9PHX?p`F14i1EHJcdh!BjWfzyxwKvQ@Rkz@wncnkw{x!a)c(bZo&T!6_qfu7HHh1 zejz;&&Dq;uhx!TNy-_+>FW+Z?R9SthL|GQ+=>Qe?Q4;x~BX%IBICGbgU|g~JFsOFu ztqjy7y*jGFI^8i+6h(4t4;=`>S`UwX;#fBrh|b|9Dh20-4f4vu!=^L3MkBM20IW)^ zxyQY(22;P<$Lv>iHf7@C%cqEooJY?~doOKwregz5j^{^zD7N=}-YJ$=kLyB?Z-Vk8 zlz*kts5W9vh`f}4_*(p!=!yc8zs1yjq9 z17jmhv+GFSigf-Q7Kn&@d{TsHG_zq!^%3X%EN@oLnZq6bcB48V!MV`l{(aX*+(n1B zOO<;L1m3=IeHpMh{n;jHf~NZhyJo!#U1Eb;tmCD!3&UctO2{6LTe)8MqI}wdJ{n$T zXapeHK-o3iI_px4fWSWB3$q$(Z{L7XxZB+Q&aP(Hbij22#cyKmiE3JTX=?wH;)%eY zd8fzq4@*>zN+Dhe8Cxe$v28$wUpbo=RLegOe!wR;na)4CoW6{LOygaf9~+EqBy0h^ z%~&@=Nd*;W&NH@)%VW!~e6|j~jZ3i#f3tE$mNAJ&lm&7kDhOM9Ts6JKYf5BXYm07V z>PV-U(cj89aOZCXEHyZ;?TOBouVQP2*)=7_%-M8NUSUc`whrh%Sc$1$rFHvqr6Dr- z@N>H%T>tt2*L)+JWBt)o*YKGnrn?a;&;~_abaPm(u#VpE(rutqN>3UfafOjtaxN`( zLQ2E=Z4kHMJ z?K`42&?OIzIP()#RI%y;OSM`<+O91^qP^qwCg`&@GIj=CbDtq9N))S_j+|vaJ3G(O zMZk7PK^hJ|kgm8j1|4zb@pEDZ0N~x=M!-ic`cqexvYg9@?W07wDTYS{rk+onYArE0 zY3GZHxX^pokVlr;axHM|7tFR3D#8)0>e6CK)u2;e@`^mHHOY_fHbjm{wr%GL6Po^ zrK&TB``$p#Qwzb~;N}ucakEaTOCh#cZEr|NIhU7*5bjzu>#S-Xo@>x2Dr@uQZt`Naxe`pCW&{BjclB>6^Tx%=FkW6iitg-05&$ zvl+9|Za54=rsl|uwuKvYk&Z;l_W9z4l`Kth{UW1>+ImE5)|`@tqnxPce&9h*rqhCh zU;=`(AqQKFZ;)2qsD8heKhmg)e5H+J6fXPII=*P9o=0M;L7!{OwAyBZiwi<7akD4Y zx~MShn%fRh(OuOHH!FlZ6!zck=!}tIea7-Fq%zF+t}oRT---RQ;rUw;dOHlaC?Ojs znnX)GSM3kWDQ{-@L*6_eZqCe&|1vszTy^H~Xd@NT!=@D9zO~!l-agfRw7TzzjKuo! z;|CipDv?_YV%&mG4SexP!0+{9-j#KS@otmi8snb_!Xq4M>__k+Y@rmPBMx2r73vEM z3sC}u%MVKi9L5)mt!$x)TFHeqrq1HP)X^1+fH^=%&*zY#95|eo48oNG1LaR^mCCcf zszy4_Oa(X$+dG2=j@)!YLMHiLwZG|Tvt0|T?z*dq0D)Qdt$-u9!W-@a@b(qGkWku6 zo0tB+QJBsZ0s=xmf|tXp(#DB=t*3)$B-&gq%YVcIu$K_;-W`auh&5;zY|fy z#hJ_|tkJGB!jUrOI%lBHzWqy7i1ztsJGiS4)-zu3=ZU||d+z^NckWTz&FwmY?W@ik z7nZQW8HHU&m}@}}^CR&@$aUekxVZi_tIF>(HW8YbnCR@&hDmcP#r@qFz{C5Wa7zCp zH~1j$&t_q{7F$vT!lC6iaN?Rn^FhX(3D1jV!LYD14lGvE_I$sx9adV}sDi&YDF38T z5SN|rQv&nr&(jLOj?8dM9(# z?x<9axqIT+4qicUSwJ ztOp~7%ku?pYZEryQu*Do!$Z!fF#ceaVX&NUs~D^~MRJRYXypEtxRDpPp(gzA9?azL zD`_+}^)uX1H#2soY+0{})BSo~IkM@b6z4>T)># zsxWCp*vPyfw`gCx4A@b7nZ??~1aW)y$}!tkCGM}VrsQcS-zqQ=BL+&tkwOS)Ae#+? zCUj}-z@(SlSYbl4&>{QE!#P>N<*Ks3%;V#3QaI9yMNQ26j^F-Q!M+lDlXc%m^ZZN@ zH|LvdDH+X(iPb+GaC0wQrFHz+Fdo=}Hl}7g{>T({i)6J%R&#9!SRAhm( z&m4aJ>L$6IC$K@%QdOum=k~kE{^qhSEc`@p0bhCkG#Pca99B%tWV%Oe@S4o8+Ho^E z=GNkhz2xiCkEvk)jAD!rO%gWV4JH6Niv246O!&l_b%s^jX!j>mdc@TespJ?-F`q}S z5#@r5byV;iv7eJ7JxBC<+wY>tbHtQ13@SUJN$(Pv`9#*gX{WRx>#JJdkGFen98Zm=oB6%Z3|l#5pkAip832mw3}N8^6lH#++TC2aCu{BDpZ>L z^uhwjE;jueZp|LtS-gDUxTS8)@6AK2VBd_zDA1T3d}v>44|l?qf601itWd;iS`szv-wGuWeRzSma*ryg zSB~wJLAFB7C(63JyqzJ6Ke36!RK-nSu+Y+uDZ;R@G1FhZ}i0sb&c75 zrR3G2;K4uu39Pp(=fUnTDbS|Cn%M?nr^BCo{dqNmbfh@@_9|M?v zG-O<9qvnQJmKtWtuwl%ut^gwXPgQ;!Atr>E1P0YXaApW4JG_&5V7Tm8{c1G+ZOtd( z<=_W`PMmncS8$aEHhvp%c55NIbSU!AWaD`UdJ0;qPpHXg=S->t5B=w}r>h%V*TH8E zj4VTyd?SmW5J~6R6RzzwFmfjMmwSbtWECg^5x|^$?GJ}2D5A-qD0KD1!*t?@I~y#z zx|wz3B{_paW`VdcZl8x8xpfW@TITko2WpRk698wxkIsms0dT8!zPC&8-|# z8yeCC2M4D=0tu*mctRTA5hM~1F1I!?X}D27#76nQ83ZwauQt~2QdCE{CHp21f0SlS zn{?x2lJP;0s`TBe$kEU*qOELgo*+*BQH^;+B1?T&d{}j2jjudZgwyd#dL^9^dl(xruH+NSv1sK`j%pUXreYEAWHc;Hm07U-)zjRtJaS$4#|_D`1y2_%Ng7_XE1?g zR$e&IZk!b~-5{fQy?9;k^9V!~cG33EajvjgAP0^F=GFu_RMRVEs}$Vi2=-aBtwdPzv(ieGrPcCutIzKmZJ>U| z%?0VOwuD3~eRgXmf%Ut0GYgAzB^5tE_O0D@>>8YT@_M$C3Wp4z{~jJ0S#7zUx%7i= zY+s)Ie(2_QSgcz7#EBAOcpfdwl&{&{?X5>srCBBrCE3kVXKj(e$IMrNC!6fviS3q_ z@P)y3hnXm!bKrx|L!U?>g*9W)j39Ap_C<1akl_RlAs%iNK#^h)@Zs*668v@|e z!Kr>)!N_}AHObwytel3YRt7k-?K;s>CQ(iR4-an~Ao7mnM9S}f7PoW7eJS{YlF~OX zV%!2YKVTd1bI3VwMt5smOUyY4+^Sedqs+RyRZ5s?iRc?$U%YvfM?@Y^n6y|`i_?5? zQO-VZ`_>*0&r%RJ2jP)pX=$Cx!qKb)%Nm2ae;IX)2d2f>R~8Z%jC_;lpT|lISi2>UMD+g`|jX?!I()fy1_ry3*Ek2oA%?`WiU8KKD+8vnTFd zt+7AySK$25=708~86wQu8LPCQKRu@VC4*-+T`3JzX zLI_#ItjON0ETL`xY0l^4{!eoU)3P;GL$DY7On&@c5)_S$*R;4V{Dzh`DG)(VY!X(# z=^s^LVzT$&sEYBABzVyOH#7z8QGX(s>U7wMkY}f0;H7KbWk#rC$buRse!O)G()hQS zbNLJ`1|iqdh2--e94lB}%~kCjjqt+CQeHN$3Y3ipL#J@8@{--+UpYy!w#dhNwl8#R zJpTe(c^IH21*eRB-JjA-v9+E)x?Yys0Vji;;|jR_OzGWXENA~a#FRR8UvK4kL&!d> zJCe*}iL!KIZRcoyqAr(qiL-Dmh(DXW@JS)MZbj3HYmUQuQu$9=+v_!t70vpn;hcP# z5v$yt;i;5|SKRbtuLlO;fgVpf^kZ5*$gJI&eYKRh)xT(s{~%m5xs9$`o=HmYZWr$szFrhMrIgEPOf$G=TjPz&=k4q5hy2XexM)#^QpC^{nq8evN6z3X6NU$&AhsTjK!A(6qhbIJ53>pg;{H1vw2wSH8o3xm`8(ezuo-`xY7(Nbh9{Ru|{?oD$oT_1uS zp<$GAdr$ODL`uG~%s+2!(7OV5U~e9`u={wv@S}vwUi~v3>Y^ks;P2f1O-CEG;qsM} zBMd2^r>k*~Jx9xi*lph&C|H60&vlkBPpiRt=Glr7NUMz7BX#4^ef5W!rdDolEI|l!zS)gk&#Bch8Oe4GHOq^&^_0JycJs=@jlN6 z8wt*h(8q6%E;~;Z^ye2Du|$=yIh)k8-)+I848R}&_gnVebtSvU;B!s%yc??+d4bir|1cj$^Y#p$yV{OTvgscs%m-YCJL1g~C! zvIjB^UXK?${SryLi$hh-#oS%r&-#w*A9b2!7qlz+{RC#t(d~$dh+ByQdY7ysX<)^yiC>yH)Wj`5K@sJrc!t{^)Ux{sm@b zMWB()u~r$&S0gxUU6vz-O!=%4?)~bDURM1WRux~PUU6sAW)FC@54+E1QK_kok}CQS z1u~#+-qGV(=%EEyAY@;A~-H{qkUe< z^AQa$dh)<+aA(Ww_BLuRET?yu52VE%Q#)*mjC3|#`s!9Io!9zf)YCO6we%popH8wZ zahSQ|DFR$etDe(*;v+K7S1gHLbn|dO$>#=pjYXNgr@|Ma?B-FJvabK1^b;-?{=-jz z^N)kP+p&z<(Fz_I%yr})aH;~mlkn36?#iN62eb?{r;&KgS}fKO63loZ2~CL_fPX%f zrls}E?ia~v$B7@Y_DG|C$%6Xh(*J&M5Y>A8nBGK=f|DQ7XI-^pqL;~^#&F-O5|vuR z6y_>)bG99-ta&+UAUbb~SUO5JnS$=zTgJa4Pn({gK|1a&mbx>SE)Gvr6kf0$1w;+K8cee!h;BLWfa0VX;0TKuhNMP^@ z!QB~Pa0qU}-6i3h!a{JQ(m_rCrr zCHkD!s?UUE&BGb-b^a$|E=S@rS1QISFaXOnpV`*TNh8!`r|@8ZZjB&u1Y$6p{)H>P zPBbjTSc*C5lI=9uB_?ibSa51E1yehc$ef4S@2~LKY};aGXpV$H43MFKC)k}!P|Og=)HDx04Tn2-P(zvtLr|e^aYX-11Jsuug0ZyMt+NEW zB+^O<;PF}8ljfAmg^$l6L$@#XjI9(8lV#`X4cV!m9;urSBb}Ck`2m*XN;KLRXKQLC zZ`p*ar}_txmTeE#!ifhMwn(_A90=7;rR;F`YbW1suL=XU3!%+4X(QgkHnpN}9p1P`Y7{AC!kUmfkrq=&9s}}xt2qs7$=30KB7P@t>u}1*TW+@WrzZ*b6%D# z8y9!O#-vB0rQ(4n(|nNzx9#&@m8Bon_;yYYNL8fcl$-~EAI|5xw`Q&{JxsC6?|EZ< zlAg^06`2y}$UdK!qz|ZLovdAW&82*-cYt&GS-ouH2f64f7+adUGA80%(>Qh0cFN|w z%~VUq&&ukuJ90{rM$vaE^H8CV8`kr8#UF_kYCV}G(7!Z}$RUMjwaucnJHr`>(?h3n4gIaU5w z+tC%MQeY74dqYolu*{ohQa1vU)Q>&K%-70c#bM&wicg*?p3&sUH!dZ`ip_ZH?6a6R z%cOkSOT{6|k`%>uOE{bK_u15o_=LIhUKiInYfpM6)mX=E&qa+Fq(4k|=mFUj~GHd%m7b5V{sAd9YOs@^igPFIV`W$`AGG#29uJP`iCkVkH zzlxSEk1usBhq}><1zEc4PMpJd77by=z5W_Rvkag7qtF=+HxVo0d zzNUi(q~jd;f~qUuP0hSBL_qoTra(UTO?t@AFgj64;jcWu!(qN3V6e8CS?v0Tx?Xv3 zQqByyg$OKGcbd+wJh}bC(1{hJOQ%KLuy=Rca?R9g*0xltRaoVbQelOo>s#GmX6=F_ z{H^RJmpT4lL@l|*jMyEiF4%1HGZ%kXbsA%?T6gCxvcq%4AS;*dZBx`p-#C}1y<1K3 z%cz)5F+%senskpIbu0|uATwq41I*0r_rLvPr;pg?{eKv!lSZ`!rTqz`-L5VPEQu6CEDTv?P49_kt_7{o&PZT9{%<;x~277&7}!(t*vAYr zlUnTipb6V0OpjaemZUDVla-QEVRY_!_bneE`EQS_J6oPu{}VPId5`(;n6o0s=7voi z*iMInW@*BqjiRLt3g;HhRSEm*c%O_=GmK};o zE})cHv|BTa-$x!4l2<;qFi)G=^U6=?mR8$5XE0;mn{%p#9e=g8=(wINH>AfCcl})d z&q`_iCxruwHgA)KdVTN}J0Sg5}dWa*EIBw;}O-+di3i-waI z82sE3wC~JQIzABrHRIDKG|MZ`V#pME!WJiR%-`DNKO=tDIbmh|hI$eV6V-q5+M9Zh zp!uD+Z657)LPtCBkJx!)l#-|6u|^R0!Sed>IJ$xV@f6s#;%^yC%H;;VSuvl~XOR0- zx{a8PzLux7uL}1R@j}(JlHG(3>!wpl*VaEdW+72K$OhU{h_vo(nr*>_`Ywdi?c|%f zRxY`8hc0gxxKb`?GSDl>T9@f^EG~IkW0jO%P=WQMAWiIw# z`!|E9-~UT+pl_a~8(?A-4NtY01>tkBVvXEOV24c?|5=}0;n9gb(lax=Tl!s|cR$eE z`xC_qB+EqYrZA}&#lwvk4cyfD&97pRJi^8#SWJ@tM=?3~yxcy2C~C-|>-iRqTiBv) z?hok>M~?TL-EwreiIl?3`{X>+2sG3D#fZ|0r`@>oJ>GQs>dtyp!^~U8%kKV4adPv5 zWACm`Ead51cSyE)+P@6hcJA;$x39D~U-}_XR~eA;w8o-P!0N#3@ODd}oG&_Gb@8(? z@T*kL?}-ev4PN^}zg_8JA|vcn2ft7#3#3mkg)EQNtDZYbuCz#c*_Qxbh2gV|y+XPH!DY@dcR^pSn+#f0@s%Zu4+=-_e zVsDe0Pm%0v0_vJVFSy;9lcw;lJ2YfI(_`RR3Tz^$a}}c3_#+R4a-(1BhoTa|G`J{?YTQq`>~Z63#x=T$od1|&@PF@7 zC~`6C%~5*+wfU#6RlgEWFZ16Ppum3wC179>$CHVUDBm&vC*}ITiE#173FA9V+xD~( zr06vS{8s#w_C(KCJeR6YJkr(4>Z)HEL_0sAY4#=8cEh!)4-i}oCnIVmOs{T_uAaQl zuqN6&j#38)-YE)xjG8A;e&+Tm`YLkEhlQfDm-QwsPI~44up^XeD6fln8gd7TvQ@jN zDf?Vh-&=IE7}m0ExLRFpTvGc8YG3APmKg4(2)I07XHl~{zA~L?y>wysWsUKJ?appr z&L;~x(28VIh#(AGEl9t2YkcSy8?axaXJmNyHj4y>U-{a*eIJjA#Imv{k`6tqG5?3# zJ-|=pr@}`~*PMoOF>&t^P>z+Y9?(GELP9FBGb}lH*<#7G;z!e%Eoc5jUy?{18~{X& z6+LfM0H16u7M^BSwj4g1Iv6z5kp`b9iSjP|u6Y}jB4YQnr}#WO=J$xKJCcv?`I1B` zKC!~6h_%sBh=FVlItpKWLcnkCb|vk}hRP~lr2FLlU*r;z#O=d%kH^Wy{m{|qX|lIo1TGFm<=SnOLyxY_<_ za8K?()ZtAlR`Mx7-{mZ9gry9;GKLyMl~8+%SCdoyS1y3kd0erz9c!&pQI)o(#I}u_ zu~(0|1DzkK z7cR04NA}z`Lq#s1KHKFTnYy;lLIg2k?BiN zLnQcqgUYKmC{5q|I^eFnys2HN`IpxzxWog%^8`VoDQ);4S;#jR&rC&0h=`M~d7aL61S_-n6#|8CKJu zhE0cdpu;EAt=Gol*Kg{{?MGPdCy_e=>-Sq=kfjK5b_D=RU2!yqErewv-XqzsdoWUk z&{$=IxJFZ7_kqrk*7vK+l^kBw*BW<^1cRfnF&?i^bhahla6ruy08oo(F*svFj5Fbv zS>yR=20p8|d*xbBl9-0XQDUyA-TXcZPGLy`MU~%=fY46e-{AHjZyv+BE?q%40!dsh zo3qOo$eT(1m64W)Fih048qO{E-fX2RkQLAsSNX}{#aLNJaJXv|y7~3_eXkvDN$&Zo z_YDMeBYv|9+E}p(nav>^eq3ep_>i#1THT-CGo<8lTSgE(aQC7i3w2mk^GRrTTDMk4(PC zkm5I#dJZ}H9^uH0qB0ik!*SR@D1X`lFu5b=_Qr?v4tDHT&R$e&?6NVpt}*#3vI!ZNYGs*oC~!PRMD-h>(M-c z`7J9XdF%c;BUvy(SUWxVatAcu(`|l5_@m)0k!evk0kM_X9HF1UUtI!U+B^ZX0N+Rk z>_(!Q4B(@C0&a9Sj0j-?-HokN6N{K_bWQ$A(PUg6$7^y+pgr9dL`L}^6ETPQMw#@W zAhPYGd)zxquOEN@=wB=ga$&yIC04HmU-p?Ftq28Qj*s6J8z8i)R(qE{Zu~`%I7dfe z?QGB)U!|x}xBx66XMUh9V7gaM(zW&=r5pp);d=K6Nl~A^`ga&KP<}%ZxCzW$|2`5( zauIYF=Xzkb;z753{~aV0Y-f{PeS^3mg~ym*W1d53UydV1@2_yFE)vZzX=fdnnF0hs zz7b~k+M;@(@I@A^-t=3d*4dMRisO;Xe2q_zFX7h147;A{V{iwiyiY{VL>+f1PJ*u|>7d7_zA@XXSgX#g7&_pkAvVhanbf{1$gB$+qM`qI) zozd%^ACFe2?f-gCM8mJ`!{6_XjKbP(k;_tNvcM3OuBuDK+jgZl?C{1hPznVQ>=@r( z|K1nL8Q1fEwU~Ytut!eOx8(JjX4uT~u-O~9P{kI$SeV42lq!iDW7=N6QM#&6fwaU8 zbTXPW@ekf2cJl>}eyenvu)Rozs4u$@lug+97ul#JaaX8j0gzBUIO?aV#W%eHh{J>k}s67-{6c!&X(uB?;uDb(8sA0|C>r0X-HPvO-(~!ho}1j)&fq@2*(;Ow zDZY!v(AG$G$?EVE(OYbvKYrdE^HT!Y5nC6Lrm%*&mPGHN+HoT@z{+bF5~)g=X;P7} z4KdYZmR>T97~Z!-h9YW!fhk*VVF=9q<=VIw69;KbCum@1lE3hHZ8TnLK zj7!Qb9ehp$yKDAdB-Im|T+ZW&M=6`mhm~fU1Pv27`7KeQ#Oc^KfE(`H<;M>!>Y20)~v(yqU^*nZl5wDqll&sPv8p{0gk7 zX{>D{t-%!f;(&%`y7Pn2im(`xW_`ngN@EbxXgVELU6}Enh%qc}{YqtXihFX@KyA7{&xqrG9U^sG@mU{LsAMsB~;L4Cn^;l~S3%i^ptc6tBH} zJV%LxT7=;FV&t_wz!hgOWApts&#uul;%4_ZUZ!t&^EKgkoeK^Aq)QS?%A7Rol??aC z$r(+WlO+x-p>l83&8g`}o=MGDM}AM~n5oy{8*y>4TZx?a3s{xU1bNV>5C_b7GWB_K zi4WYolj3TfK&>3!+7`4OEW2HaSjR238p`9UCk*&fu zcUql24E+kXeRcy9ViYlMiKZ=~NJO4WZKj*dI&$lGKJ$-Lzn3-ZRFmo%0c zSqUncum1=+6jP>O`#kJmB6rMO0r1Es|Y$N1t`>b!KrjgSA-;#09mauDcs#y01u zvEs=@)NiywS5x&}MKZ9*DBS&ZkP6Bw>8!ApD8Qc<&{)(nR+pGe`c6GcSQPwi7-ba9 z*RAv7V^9+ulPS001F)HEBgQmiQn!s>*b9hBZ-4{^+AyI^XRp}TQB}{?M#*bxOb+KbYYJ$J)EQ`0vLy3p zYH=d;E@bMn4jl}~3vVP%;wYi_T#KZRwx8a@Ue2@96~@&@I}>lL`tp5|tiTZVbtB8_ zln^;C^&=;%Od7QO(vvSJ$4F{me;Kh?M z1p6q5bM)DZh$S1}K3xkULjDOf0rqRz)bW(hT>G5HCDk`+bdHT zn*$*dj81D>?R(P1WLQ-a&QB3bx0fZ&XACh{;TRQqu~@bi^=jhJ&=MJRd~~McWTYfJ z7roJQ^ahT}6f&15Na|L$wlth%80>TKK^Z*GJVrR4Al_XFu`?9jW|HBr1gxF{iV{V} ze`jJg^P^0Kg=|T&xbTu~w$X;-h&nJ_=9-|g#>)Hkfcl+X(&t?<4%Cq9AWz|IXM&!< z5x9Ce`3JafzL@p-c|OlDd@NDK!yEJ z#T%^I2o;tBodi|D&`M$SQo=kx2PD0j#LZJdsfG$?nARC$w#J4wjBMERd~n|DXwTB^ zmW#L2-2J09ynoKx&DUX!cK|ZlVl+pqQN7)z8Osz<7+}pf-r%BhzbfICIXF7kk}^4D zm5~v?_-`T~Uv9A2{R{*}^5(Sd$J8FpgFa%kI%7r=+ z$&j(D%N#wus+Q}u6AnHV@7sDck?<>*LoJW1vzd^e2Xq{k<3S;BzmetjF?9~h;uG5! z{-L2EZeP^Cp2M1WG|h7nqT~&-AIyk{h8(csXjVpN2PUS5F#Sa&zCDf*Ih%T1CbwAQ zD0rIT2d4hEBl0#vG>Nk${3=&mOQ<8wH8bB`*H~6#p>oEM8pNylD=Ws1R)x>2>bthg z@2Uez5d@>pzNqZM*k+9sER*?Vn#MOXGzkTbgvSxrOIv|&(8)qOUh#_b+WCvjHaj3QHgs(qtdo(C*X3s$#4m;!v#sfmy^9$<_7W%kN4=PetIse$HvrhpPc-$ zevT6qIa7K246XDa&CrCeu0^B7dCeLrHCE?!(i~1K@SV3mQ30GavfGyRUyx_r?bKr^AiTq}*Z)h2&X^m7x@&JoJx-h8Zd&as3nX(`hv3cI(0J07#3li&& zQ%My_qs@*G&xbWO%q{hHY#Gs-w{(gC0>bjMYn>-M&G4ZYF+)r%UZt(j6S)o!c zYtmNqCH3Wpk2)Vhz0lOW5kI^IhyBgF8f?k&obn&(t;TpoHJAB`g_zLhE8Fn{Bd*aCF>HY zErIUxuhbw@Ts*E=Lfn=}^X#kBpzB5!=h`;?f!4HA4 zqXwa!DRN(3!w-@NX@b03o^*)4Y^U!~A%iUn+Tr-3^0=0#$*6{7O0-;={NXr`TU=nV z#3?W_P38R%RH#9~#Q$k1u*7+3iFI}TcaP3O7^x|=we_O9(;5M7N#BP*laXnk=Du7z z1%IcaWhOKkAmIDa?6Zfj?Yt-qEawsDAM_edGO-O&Efd~BB#WmEa<|j}Uf@n?$CC*K zv0nzpnsA=7dXCve@>)kQbMmo6Xg+ZB$pVT%LYJ1jog{aENIk8wuqklv^K}M!exwWw zzMvSk?!~iVDP^c1DFQ%I4!X;lX{u{j=z4k8(Tv~Az8Sv6EWaV+j;XTlEtv$*iVnWcMi|R^HBxc;tbxjC{_>Ws3X%#e@0KSul-G z4Hc)c5Q3~}(je*P!Bm-L`2o|k{s8vZqlZ-2N5o_x6H^$fcL9u;M|cD0G}g_7VFtFDWnTiIicwS`Y@ zE&~NsVjrE=5`%`w5F+v(a=W`uN@xwMxEmfyfSX{BgrV5BPl8|jY^s^Gq;V4Z;G|pi zZuAOS92Ggo-nqL@jF7~%bo{a3pW zT&Kv2{zi)_^p%rPbxI?Z_C}Qn+i+f;pyNRza&M;TTTyAo%wkqDV;Y+oT_z1}=0x2G z$pOV!rFqlA?OxL`oxcW&Vi8v3WJ)=XO0Sp+2x&XV&VPsji0gzPj2ifbsj`=TQGQho zPJ`-`TEr%rW@k+v4Z)GKO|bD)j;GMs%QUIh zkgG9ko4QMRMr>hy#cF^i&PkAv0OJjYKk}2V9kkDoNlG z%UZ1!nZ4<9`|fXn^ce($>7t!IYPGU8AHvKJBTF)01zg9Zj9!k!2VwULK&wleQ`Xun z%@&YYLB**Q{s(A`xS1d3t6g4T$0631IQ{9aJ!W0VZ)O4h@|1pu;rN3Zc;n4hWK!Zy zKeizzzE<}`sCUZHhN4`)9UngUa0RYiz{}f-vkKgbi!VM?!wqe>Ul@L`LaKrKWGTn) z-a{J4;pc)_Fi>0Ea;vK@Ym9`%$I+F-)Kya;#t3PPd()sYK&Fm&#j^cd6V^^ zaLt;D*13wZH8$v57i|X99Q2+l{L@ zgvWN}o@J8`KB0alIbjo7Y)eNRE@W#!V2n5vE!fIu>HT{3JD7a0hE*u8{*rM-Fg1bR@fTss((N?x}tFztu2dAfI=r(noS}dGT#l z5Zi%T?FKdhVyvaud9f~O&gA}w%SU>GquI{B!3)_!+syef^;_u%Pcd$%mbm{W5d0!~ zG>{IP9!B&N2KVpAntxad(40^I>2ys{R_AIXJg08bJl|3_Ic#29oUQ z+x`_7ZaMrwQ#@5SUg5?5GjDerWBN7Pm(&+;LY%ow^A+q3k<`&LA}9tpA*Ftt>rtRy zP0n9&&{K?1A+U%-EHf<)q~YufX{=W!%RtrB?aP%N+O0C9p8hO|2lxBLTfb?a;K14p z7l@LFAo#=CI^wUGXH>Cg>W=TKlGfAYRsbJiZueBmfKBL&KG{o`zf^Z2)&t)MHP9vy z@US=j5#?wm%OG!Xk<-I~e_*?kp((O-#P-dxMToyCGpWx1<;Zc6sWqkkpGr#+fzIX| z3w^S30l^dd6Uy*~Am^(w!~`K^EmtDamjxkQ`t;{FtKWHCe*|5V_01PLN0$2D51_|p zn78GT34T-G5N-^>&cIHps`U=JW#KDXm}!p+e;Ruf{3Xnl**DmfPwc#Ndzy2rE0av5 zb>)rO%&0uW^2i}rROA$nDZa3*q*0cl##Qru_^c|xjx2nwEBc7Ed`VhmL>Ex8sKPwy9pYBF3{fyHStt(}gODa1M6A1`Tmh(g_t3){jHIq#PK%n>cAZLkr z!IABYOt3HF;4LlWHqMJyY@|qyt3o`(V&yO3yxHRucBXk(dnUb}B=VKsVB~svAcSw5 zcMu{r^+PwUMb@}c*r$Zx>^OG{wDF#~6U1j^{5L(Fjd&oauldPU3eva4_Vd4ByS1$`y?|5%_tT($VzURfJ>3&dYe5^wD$U)xbci3IN zewo!!7`{n>os=oj_O0Ea2>0)Xv~`^>!E#5()ygwSF1Kq*^Y+MTJRm4t_OEA=gTRQ; z+m_br?pVc%u?elBIRZ~NS0R4!?q6-Ie??~GvJQDN9aE_h&--Sdm35m9MY3Qd{K%u6 z|An#2_9%4<@ayT{qfFtzcB?%@^JHuj2Bp};MOdLzft9uWC+l_XKnEGB!YizoJ?&ti zoBtyN_zShrR)bH_tUN)v)l)INQd3n-!(hp8VT4PJDu|e%B=Vx7MU-<1O$!Cezp7^u zIHz?<4yCs@I)fW*=Cq`2#+XuzgTB;Rhgu_e#{{JP-*EKFm{1S@G13mP##QN&ADv40 z0J2SX=EeT%W^qJ|77_82`;-$*M_s&M8*5Gl`+yMCLuv_IkYNNo=A55bUW z!#-*n`Bf~U#Q}Mlf##UzpalG$a*8X!LmHf*6v0J+rY0^9ayA`e(;M}^dWHgLo?ZMg ze~q^Ds-{Np+m2s!W;}+P6SS%>m()Y%D_ZzCHo4RAv-c~`_pfjmM^C)?p8jlcpuiOt z%6e58@qdilE!SGONPi*sqDV%L7Z%2;_vS`^x4-3;Uc8p6sHtfs{?-~f+ct(xhW_*r z0{)1xQQi6901g^dLvMuZkgwDQ_{ZvQ95Mk)+WTB+D&2AP;x~$nuC$^GfCHmCNg*&a z&f9%=?G>jr&Ns>pk3+{Uog&2=G` z(OeQ@aGZmC2A_Q`G~&_wktzi;H=moUv8Va%XQn21COCCFYi-Z?C5C6VCJ=x7nbm#F zSNgMMGv~Q^;G~L`O{HHVDF2EP1ufZ8=8FQIlIbdkp02d~Cj6?w*ENe6t!kt{6>*a! zqK9NTq1-yp7;$7SOMUR}_O-|qHpd>_m;GJBc0~iqXSbl9t}IQ{r0jWcqbpBz&-|0o z8Xw#}qg~637xO@x)kWv|3meimdXmsYn-r*@%{@KAIhW1Zn$CtGyUC>b_)hcw(o%qx z94@8eW8^ISbPfe+c)?H@u?{{iS*|bQ7X5_1<(LsF+;&KYtaQ8OYwLmp5eNUo3jWFR z)I`d-o`>P>j)DjJZW8>0m{6-1Gn~!Dk`oC(?_%EMJ+-k2cAF6>=)U{5jD|*?t0enY z#|g0c1$+A&i_&U8_It3c^Ay!yYTzxPB85n5knM-77LqI1W%h%?`I8-e^R@TL;48YB zuC?RYq#Dlcb`dM8V4J@<-a9W`HD*qg{-EuGs~iTzvAEK=_fw!dOVgbzSFx3JyEb#W zbLC+@pxz~vGvyfcb<>Gj<4iyemhgAjz{cWBY7w6iSsz&#l;FvjuWLp zlOJwr*wJ`EU8L3GwXi^a<`AK3a{St4hk*)j&ujyd9AB-phSOYbeHP+j&HZ6y3ngG# zk`%x)T-um%J7r|-GA$X|`*J&Aoq%ubzi4}SPycsCflk~I+lr0FxK_`u35s1 zdhvw(`vr%nn7Gl2_bNp`A{>1}ey$czNV(Xn@y|+@s=|8|s+jhUtS;z${^;7jv@fY8kC3{?=nd?c4`qDGX+T47puIUXy=7=ZGe)s6hAENN2{~i1Zf@rcI?a z;U21eQQ%S#7O%pzCGck<-4;HBPLR>8S|o{o>Q*I%yCK}-N_ZV-*9{Ujw_!5xY{uvI z*ug=hraGv1e!+|s7SpmmYzpYhkW>c|M0GYdd1t*BJT<$u_;mF+I@C-ZX%{Lk(G!O` z#Qymz2qaO-WPi=Fr}RAwQLFtz`^^>xxNKr{VnH?aEdjMim(Aho9oAow;3#(Pg@7nT zmK*`(l1R*l=9kZo#~j2|gZNwNiJwA)3WdE%XXB&>T-r1fHQyVAmITU^roEaaoxS%wWhYAOFrYsB*{*`ouTd6`*6i)Fv3kbheA z3yS>%%a_JXo@HQbMA$^fr;$zk@n$C}3QEKK6a^(b{P;dR&D|gAe&vLeV6_5$vTDrJ zQv$6=q>?w!OoY2qvKXub{Ic_ISlfbme$K8`$iM%GPDBf|{91~;=}FFEA$@b8L^0=nmgn|)B~hXL z)O`o<^EWf~yBOD^z!PTas`xXiBu&p;=_r}~%O!Nt%;nzj#p{`d+o5Aa{VGdC%v$G_ z%1~3U!x`FzU!$Z`-^{-K+8(7fGlwRgv0?w+U+BA-s<0i`&Z4V*>ZnZ&4efe2RST`C z-g_oRb@3dsSRb``ElS}^5W_Y-t_S&uzxQ{!78GdyilUsv)LbWMfYnI-&~hYt{lLZE za(oRwmyL9~%F;_f2^(~ct~mAQ+ebp>$vWP4XbsErolRmS&l|n6WoemP=c&5%oPd#N z>V_66Qklb`mpxg{V#1F`NBg&Qag{bt*e#@Bb*|V6{9gq=26pa#wwmc*la<+UPuuXn zCT2IM^Das2WigsrY>qsz!q2rCVm@?HjI6`e!tJRmKPV(sr~7Mtt)w_L8ABK4F#ws# zJB{)#p}s)R5HoLbPtOEIAeW=Xp=@t}OCuT_g>Hw#%x^I@N;8^=5YdbdhZl&OVK;WoqkR#9DbX{!iHQG1F59{LtA=LjB_G_yS?jA-` z-P>|y?*A$tRY!E#X3o_oMZ-|6?(3||19Mo)Z-I)xDLz-N%fDlf@4t_gIvIF3{}S_~ zas*4t?R{C?pOvgDr!ty4@luIm6vMbK$uoHv(z0RK$RJ`Da`M3f-*{jbJ zQ;1ZhZPzJ&JssgVm-OV$sO*EOw#pCu?ZkIt3mq*@lRn@S&eaVAuf1 zy=|S4N2bTTIp29t_}V0O_{!NJ$+^DnwrbH}gFkV922#5&yWb_b5CoYlaBO9Ad?M9y z!91(H2T|wIWL@^$CY;5a8QdJ3<3|$URYrTfG;u5wndM>D9FBRb95wbyvfBB5k zKsz4_?ErLfV6At1t!9)j5?5JmT9lUu@L>*gKH)(AQ;~~@mS9@U`e+F}Txif%Gvho8 zDwsX;!Cv|^8sJ<1uL1%x0+^6HzH5W3uW|M2!ILJTd3eEwEB8N!S=@V_8GMsYF=CO! zy71+=t2|vzD%;Tqrf80sbVCJIeFQYeWO_4>e_of$*RCjjeAYhfAKNoXmNk5_O`vIV zt1gA0O_yU^kF{yM0q$EQ<}KI!@LVOj(83Ntmq62apZBD73q`}9$%EZ76Sehzmz?&0 z6jVuu$xn-)oqY5AftrBp#k71X-~92<%D`0|aP?8|-O__>UP6U}`|{$E(1oBB*3C9J zZxK)FS79fwnw!&V+o4pF8%kfUAoWiXEEt`(=zXJbS&NzdHsr>|HY%ad1h+?J^NV+! zzx`{6&Up2F5WX+&YqaSQ6n&8UjuoE@Kai_gxl=h*SUA0n`!#VY%5$BYh1LgIPBNWo zc4N3U_k~igY{bW5;SDqPto2_BYM-z~n`H9f&QNIAKMw61 zK>y>x6*dD24sMYPEE!k0g!quoETE`Pcl^#FZ3l;I!CpsLHVO8vVPUaJSxm5ql3JYm z%V>qHMT=q9$R_JQ-t7w^ZC&31n+iA*&dsVyr+e^u!ofI450$(i)0{0n zHRHUAfbmAQqBsegQ<@GlU-i8@ZCT-1Y`LpN00ELUxH$!0LNAMGzkOXV5m8L zWVHIAelPS<(pY-9#o$1*vsPtQiOuvHDohJw_-G?sdrVWaI{>*coJer^N^SkBrRHkV zDBMsLZ*r;TfsZh@n3KvmwE51ZVdRKny$^U}Wj6g%J+&uF6}XxwbX1gDjm z2yM9`H#~HgEcER##@jaf0Xq^!9aNdjj#U3NZN1C{y5`8*w7McT>6MtIUr3{QfKOO# z+o%ZLLmAj=ofdMdfQHzcY%9Uy87D`!7plHmq4teu&i^dW3;KFGLzrASD-dPl{DDO< zVg3FyMyYEmY`h|=s#Y`* zy?rpuu|)f?~<7^s6rpy$h5b`HGbfiYD&T1Q*+k z%TzoXu;jd52$q8=m|fj+%Ld!U1hDDEUhFqgXXcp*+5Tgr=hPSJh{WLhO3W;$+Fujb zo!;_jZ!iIGdn7Kq&1bjh^V_V@pnft?Odx?c+9;eDl>G{Tb|lC@s#prJo??N?4m(VY z^l~dyx{w9u52ilWW2$3NGSMu85?=T#>AUrQ(;li}H_f*KtSfqs*Inq@+1e4yDNPQ# zxn)D`{VojL>;}j9KzB|x!tZPy?LGKvli>|DlAj6M9_+(Qs6c0uBL=dY(x^FomW11z zn7L~Frew)Oe=8yFY18VibA!W2*2RN4$Tpv1VHY=+d<0zY+db*x@=cRFsGK*muyd6GG)9MyvAThL$A4@aJ#w_(icbCbir&jhNW4e^6xcgOIEqvOYScBusdi;7%x1(#}yFkDlp z^ySo*H(`PbG0`~C_Gcy*yJZ9IXR%mGn46G36zS)oW!+zpux7t=xwzITcN3`B>cxlV zo9J&9eFO*ym3&Mqhexp0Yj*zXaD~q;{47u)d0ak@AGzu=vK(XN8vnO~>h6KY^iYYH z3M9J)T-+7G*0%ayY?3Ck6A?MD^Co#&=Qoh~Xw2k!Nd*=aNm*M&xT}sX4m7;Y?%nc$ zw`EzK3PPvzfzPzFUSx8PQosfi;JU|KvVNc)Ct2n|sgryo54J9iFJq&Ce$k0~YIFbO zqcA|dlLs6yl$~|FN|xm}&>WfnKxfRUFQ`ip)lC!tjqO930iQDW^D7v%#rg2aFworMh7$avtF_GWd$F#Og`8O{%@2OntVac=1pJ543B8l7ZZ0( z(L89$RX!?lz}l!xVb=3wGbI$$eO+4TZ#?AD(OKkRo@@D_zNhY_BKBrWyPSiA0!{6#fLw=uT~JtO|029-?5r_cm7sp|liNc#HO{M|gnYbGP&T^x z&N=s)31BgC&TkwrZS{rK+mj%e0O(g{+pr0UB{3P+(KV6zHz>e{bVB)9+vH=|gcgTB zEmG{YP;cfn@^|I{hNiJKj{QWB#)G=vHx!kbCO>pzVdFPrz=e*bZxL!&Vcz~agl!{V zC&weR`khhZEAb4cpzNiApt7yhMQ+TBe|=WSyst*$H4v0p)K4X_tfuSdD!AWquro%j zQ>em6wBCRFn?4Y{?bxUU)*%kDYx3fJkOcU%N+_I_uOzj?c&MJRl*)6IL)SN}h}AXs zD6yz+yl}&x#rC0G(UQ(vp_`z_#N`4@?eGJN(!-8}Vt9lrweDd+#qsK{tH9ptA^oxs z)B-^-IxFt(&kwDY-jYXQ{4Kt_k2{njZqo~T_)oCc@_Vt@pvy!=)-;hl;a+T zi-y)#oflJ~cdR8lX25BP;?hi=@V0 z{#@Bw!oGolhBi@%A6a^EwEPLT#yIN4oQPb`=ZFx0g1S;z*5<3wyVxiJ&%=6TfjR+j z1GcF(o30EIeMD8cGyn^qPmg=jl>5jE^IQB$hqRO{XJTgQ5$zy_} u-i`ZJC>g5Qo2N~vQ>scUk5T26TeGstxh0EkFHz^vl;qT9%idXh{NDg7JkUY_ literal 0 HcmV?d00001 diff --git a/lib/resque_sliders/resque-sliders.gemspec b/lib/resque_sliders/resque-sliders.gemspec new file mode 100755 index 0000000..42399f0 --- /dev/null +++ b/lib/resque_sliders/resque-sliders.gemspec @@ -0,0 +1,30 @@ +# -*- encoding: utf-8 -*- +$:.push File.expand_path("../lib", __FILE__) +require "resque-sliders/version" + +Gem::Specification.new do |s| + s.name = "resque-sliders" + s.version = Resque::Plugins::ResqueSliders::Version + s.authors = "Kevin Mullin" + s.email = "kevin@kpmullin.com" + s.date = Time.now.strftime('%Y-%m-%d') + s.homepage = "https://github.com/kmullin/resque-sliders" + s.summary = %q{Resque-Sliders: a plugin for resque that controls which resque workers are running on each host, from within Resque-web} + + s.add_dependency 'resque', ['>= 1.15.0', '< 2.0'] + s.extra_rdoc_files = ["README.md", "MIT-LICENSE"] + + s.license = 'MIT' + s.files = `git ls-files`.split("\n") + s.files -= %w(.gitignore Gemfile Gemfile.lock resque-sliders.gemspec Rakefile .travis.yml) + s.files -= s.files.grep(%r{^(misc|helpers)/}) + s.test_files = s.files.grep(%r{^(test|spec|features)/}) + s.executables = s.files.grep(%r{^bin/}).map { |f| File.basename(f) } + s.require_paths = ["lib"] + s.description = < pidfile.path, + :config => '127.0.0.1:9736' + } + @kewatcher = Resque::Plugins::ResqueSliders::KEWatcher.new(@options) + end + + teardown do + pid = @kewatcher.running? + Process.kill(:TERM, pid) if pid + end + + test "kewatcher" do + assert_instance_of Resque::Plugins::ResqueSliders::KEWatcher, @kewatcher + end + + test "saves pidfile" do + assert File.exists?(@kewatcher.pidfile) + end + + test "kewatcher runs" do + `(bundle exec kewatcher --config #{@options[:config]}) >/dev/null 2>&1 & sleep 3` + assert @kewatcher.running? + end + + test "kewatcher wont run twice" do + `(bundle exec kewatcher --config #{@options[:config]}) >/dev/null 2>&1 &` + sleep 3 + output = `bundle exec kewatcher --config #{@options[:config]}` + assert_match %r{Already running}, output + end + + test "system forks" do + assert fork { exit } + end + +end diff --git a/lib/resque_sliders/test/redis-test.conf b/lib/resque_sliders/test/redis-test.conf new file mode 100755 index 0000000..e1f70f6 --- /dev/null +++ b/lib/resque_sliders/test/redis-test.conf @@ -0,0 +1,115 @@ +# Redis configuration file example + +# By default Redis does not run as a daemon. Use 'yes' if you need it. +# Note that Redis will write a pid file in /var/run/redis.pid when daemonized. +daemonize yes + +# When run as a daemon, Redis write a pid file in /var/run/redis.pid by default. +# You can specify a custom pid file location here. +pidfile ./test/redis-test.pid + +# Accept connections on the specified port, default is 6379 +port 9736 + +# If you want you can bind a single interface, if the bind option is not +# specified all the interfaces will listen for connections. +# +bind 127.0.0.1 + +# Close the connection after a client is idle for N seconds (0 to disable) +timeout 300 + +# Save the DB on disk: +# +# save +# +# Will save the DB if both the given number of seconds and the given +# number of write operations against the DB occurred. +# +# In the example below the behaviour will be to save: +# after 900 sec (15 min) if at least 1 key changed +# after 300 sec (5 min) if at least 10 keys changed +# after 60 sec if at least 10000 keys changed +save 900 1 +save 300 10 +save 60 10000 + +# The filename where to dump the DB +dbfilename dump.rdb + +# For default save/load DB in/from the working directory +# Note that you must specify a directory not a file name. +dir ./test/ + +# Set server verbosity to 'debug' +# it can be one of: +# debug (a lot of information, useful for development/testing) +# notice (moderately verbose, what you want in production probably) +# warning (only very important / critical messages are logged) +loglevel debug + +# Specify the log file name. Also 'stdout' can be used to force +# the demon to log on the standard output. Note that if you use standard +# output for logging but daemonize, logs will be sent to /dev/null +logfile stdout + +# Set the number of databases. The default database is DB 0, you can select +# a different one on a per-connection basis using SELECT where +# dbid is a number between 0 and 'databases'-1 +databases 16 + +################################# REPLICATION ################################# + +# Master-Slave replication. Use slaveof to make a Redis instance a copy of +# another Redis server. Note that the configuration is local to the slave +# so for example it is possible to configure the slave to save the DB with a +# different interval, or to listen to another port, and so on. + +# slaveof + +################################## SECURITY ################################### + +# Require clients to issue AUTH before processing any other +# commands. This might be useful in environments in which you do not trust +# others with access to the host running redis-server. +# +# This should stay commented out for backward compatibility and because most +# people do not need auth (e.g. they run their own servers). + +# requirepass foobared + +################################### LIMITS #################################### + +# Set the max number of connected clients at the same time. By default there +# is no limit, and it's up to the number of file descriptors the Redis process +# is able to open. The special value '0' means no limts. +# Once the limit is reached Redis will close all the new connections sending +# an error 'max number of clients reached'. + +# maxclients 128 + +# Don't use more memory than the specified amount of bytes. +# When the memory limit is reached Redis will try to remove keys with an +# EXPIRE set. It will try to start freeing keys that are going to expire +# in little time and preserve keys with a longer time to live. +# Redis will also try to remove objects from free lists if possible. +# +# If all this fails, Redis will start to reply with errors to commands +# that will use more memory, like SET, LPUSH, and so on, and will continue +# to reply to most read-only commands like GET. +# +# WARNING: maxmemory can be a good idea mainly if you want to use Redis as a +# 'state' server or cache, not as a real DB. When Redis is used as a real +# database the memory usage will grow over the weeks, it will be obvious if +# it is going to use too much memory in the long run, and you'll have the time +# to upgrade. With maxmemory after the limit is reached you'll start to get +# errors for write operations, and this may even lead to DB inconsistency. + +# maxmemory + +############################### ADVANCED CONFIG ############################### + +# Glue small output buffers together in order to send small replies in a +# single TCP packet. Uses a bit more CPU but most of the times it is a win +# in terms of number of queries per second. Use 'yes' if unsure. +#glueoutputbuf yes diff --git a/lib/resque_sliders/test/test_helper.rb b/lib/resque_sliders/test/test_helper.rb new file mode 100755 index 0000000..67e6b3d --- /dev/null +++ b/lib/resque_sliders/test/test_helper.rb @@ -0,0 +1,74 @@ +# Mostly copied from Resque in order to have similar test environment. +# https://github.com/defunkt/resque/blob/master/test/test_helper.rb + +dir = File.dirname(File.expand_path(__FILE__)) +$LOAD_PATH.unshift dir + '/../lib' +$TESTING = true +require 'test/unit' +require 'rubygems' +require 'resque' + +begin + require 'leftright' +rescue LoadError +end +require 'resque' +require 'resque-sliders/kewatcher' + +# +# make sure we can run redis +# + +if !system("which redis-server") + puts '', "** can't find `redis-server` in your path" + puts "** try running `sudo rake install`" + abort '' +end + + +# +# start our own redis when the tests start, +# kill it when they end +# + +at_exit do + next if $! + + if defined?(MiniTest) + exit_code = MiniTest::Unit.new.run(ARGV) + else + exit_code = Test::Unit::AutoRunner.run + end + + pid = `ps -A -o pid,command | grep [r]edis-test`.split(" ")[0] + puts "Killing test redis server..." + `rm -f #{dir}/dump.rdb` + Process.kill("KILL", pid.to_i) + exit exit_code +end + +puts "Starting redis for testing at localhost:9736..." +`redis-server #{dir}/redis-test.conf` +Resque.redis = 'localhost:9736' + + +## +# test/spec/mini 3 +# http://gist.github.com/25455 +# chris@ozmm.org +# file:lib/test/spec/mini.rb +# +def context(*args, &block) + return super unless (name = args.first) && block + require 'test/unit' + klass = Class.new(defined?(ActiveSupport::TestCase) ? ActiveSupport::TestCase : Test::Unit::TestCase) do + def self.test(name, &block) + define_method("test_#{name.gsub(/\W/,'_')}", &block) if block + end + def self.xtest(*args) end + def self.setup(&block) define_method(:setup, &block) end + def self.teardown(&block) define_method(:teardown, &block) end + end + (class << klass; self end).send(:define_method, :name) { name.gsub(/\W/,'_') } + klass.class_eval &block +end From a623eae705d6b19cedd4ea2e4fe8d1ac7e546fab Mon Sep 17 00:00:00 2001 From: Matt Perejda Date: Mon, 24 Nov 2014 16:33:14 -0500 Subject: [PATCH 2/3] kill workers(s) w/ UI button --- lib/resque_history/.document | 5 - lib/resque_history/.gitignore | 58 -- lib/resque_history/.travis.yml | 9 - lib/resque_history/Changelog.md | 45 - lib/resque_history/Gemfile | 16 - lib/resque_history/Gemfile.lock | 92 -- lib/resque_history/LICENSE | 21 - lib/resque_history/README.md | 89 -- lib/resque_history/Rakefile | 25 - lib/resque_history/VERSION | 1 - lib/resque_history/lib/resque-history.rb | 3 - .../lib/resque-history/helpers/helper.rb | 28 - .../lib/resque-history/plugins/history.rb | 46 - .../lib/resque-history/server.rb | 52 -- .../resque-history/server/views/history.erb | 62 -- .../server/views/navigation.erb | 20 - lib/resque_history/lib/version.rb | 7 - lib/resque_history/resque-history.gemspec | 85 -- lib/resque_history/spec/redis-test.conf | 16 - lib/resque_history/spec/redis/.keep | 0 .../resque-history/plugins/history_spec.rb | 217 ----- .../resque_history_helper_spec.rb | 36 - lib/resque_history/spec/resque-web_spec.rb | 57 -- lib/resque_history/spec/spec_helper.rb | 64 -- lib/resque_history/test/helper.rb | 18 - .../test/test_resque-history.rb | 7 - lib/resque_sliders/.gitignore | 7 - lib/resque_sliders/.travis.yml | 8 - lib/resque_sliders/Gemfile | 15 - lib/resque_sliders/MIT-LICENSE | 20 - lib/resque_sliders/README.md | 135 --- lib/resque_sliders/Rakefile | 41 - lib/resque_sliders/bin/kewatcher | 86 -- lib/resque_sliders/config/config_example.yml | 11 - lib/resque_sliders/helpers/resque_init.rb | 8 - lib/resque_sliders/helpers/resque_job.rb | 33 - lib/resque_sliders/helpers/resque_run.rb | 12 - lib/resque_sliders/lib/resque-sliders.rb | 9 - .../lib/resque-sliders/commander.rb | 84 -- .../lib/resque-sliders/helpers.rb | 104 --- .../lib/resque-sliders/kewatcher.rb | 440 ---------- .../lib/resque-sliders/server.rb | 101 --- .../blitzer/jquery-ui.custom.css | 568 ------------- .../server/public/css/sliders.css | 32 - .../ui-bg_diagonals-thick_75_f3d8d8_40x40.png | Bin 256 -> 0 bytes .../images/ui-bg_dots-small_65_a6a6a6_2x2.png | Bin 83 -> 0 bytes .../images/ui-bg_flat_0_333333_40x100.png | Bin 180 -> 0 bytes .../images/ui-bg_flat_65_ffffff_40x100.png | Bin 178 -> 0 bytes .../images/ui-bg_flat_75_ffffff_40x100.png | Bin 178 -> 0 bytes .../images/ui-bg_glass_55_fbf8ee_1x400.png | Bin 143 -> 0 bytes .../ui-bg_highlight-hard_100_eeeeee_1x100.png | Bin 94 -> 0 bytes .../ui-bg_highlight-hard_100_f6f6f6_1x100.png | Bin 89 -> 0 bytes .../ui-bg_highlight-soft_15_cc0000_1x100.png | Bin 108 -> 0 bytes .../public/images/ui-icons_004276_256x240.png | Bin 4369 -> 0 bytes .../public/images/ui-icons_cc0000_256x240.png | Bin 4369 -> 0 bytes .../public/images/ui-icons_ffffff_256x240.png | Bin 4369 -> 0 bytes .../public/js/jquery-ui-1.8.16.custom.min.js | 791 ------------------ .../server/public/js/sliders.js | 98 --- .../lib/resque-sliders/server/views/index.erb | 57 -- .../lib/resque-sliders/version.rb | 7 - .../misc/resque-sliders_host-view.png | Bin 52662 -> 0 bytes .../misc/resque-sliders_main-view.png | Bin 54388 -> 0 bytes lib/resque_sliders/resque-sliders.gemspec | 30 - lib/resque_sliders/test/kewatcher_test.rb | 44 - lib/resque_sliders/test/redis-test.conf | 115 --- lib/resque_sliders/test/test_helper.rb | 74 -- 66 files changed, 4009 deletions(-) delete mode 100755 lib/resque_history/.document delete mode 100755 lib/resque_history/.gitignore delete mode 100755 lib/resque_history/.travis.yml delete mode 100755 lib/resque_history/Changelog.md delete mode 100755 lib/resque_history/Gemfile delete mode 100755 lib/resque_history/Gemfile.lock delete mode 100755 lib/resque_history/LICENSE delete mode 100755 lib/resque_history/README.md delete mode 100755 lib/resque_history/Rakefile delete mode 100755 lib/resque_history/VERSION delete mode 100755 lib/resque_history/lib/resque-history.rb delete mode 100755 lib/resque_history/lib/resque-history/helpers/helper.rb delete mode 100755 lib/resque_history/lib/resque-history/plugins/history.rb delete mode 100755 lib/resque_history/lib/resque-history/server.rb delete mode 100755 lib/resque_history/lib/resque-history/server/views/history.erb delete mode 100755 lib/resque_history/lib/resque-history/server/views/navigation.erb delete mode 100755 lib/resque_history/lib/version.rb delete mode 100755 lib/resque_history/resque-history.gemspec delete mode 100755 lib/resque_history/spec/redis-test.conf delete mode 100755 lib/resque_history/spec/redis/.keep delete mode 100755 lib/resque_history/spec/resque-history/plugins/history_spec.rb delete mode 100755 lib/resque_history/spec/resque-history/resque_history_helper_spec.rb delete mode 100755 lib/resque_history/spec/resque-web_spec.rb delete mode 100755 lib/resque_history/spec/spec_helper.rb delete mode 100755 lib/resque_history/test/helper.rb delete mode 100755 lib/resque_history/test/test_resque-history.rb delete mode 100755 lib/resque_sliders/.gitignore delete mode 100755 lib/resque_sliders/.travis.yml delete mode 100755 lib/resque_sliders/Gemfile delete mode 100755 lib/resque_sliders/MIT-LICENSE delete mode 100755 lib/resque_sliders/README.md delete mode 100755 lib/resque_sliders/Rakefile delete mode 100755 lib/resque_sliders/bin/kewatcher delete mode 100755 lib/resque_sliders/config/config_example.yml delete mode 100755 lib/resque_sliders/helpers/resque_init.rb delete mode 100755 lib/resque_sliders/helpers/resque_job.rb delete mode 100755 lib/resque_sliders/helpers/resque_run.rb delete mode 100755 lib/resque_sliders/lib/resque-sliders.rb delete mode 100755 lib/resque_sliders/lib/resque-sliders/commander.rb delete mode 100755 lib/resque_sliders/lib/resque-sliders/helpers.rb delete mode 100755 lib/resque_sliders/lib/resque-sliders/kewatcher.rb delete mode 100755 lib/resque_sliders/lib/resque-sliders/server.rb delete mode 100755 lib/resque_sliders/lib/resque-sliders/server/public/css/jqueryui-1.8.16/blitzer/jquery-ui.custom.css delete mode 100755 lib/resque_sliders/lib/resque-sliders/server/public/css/sliders.css delete mode 100755 lib/resque_sliders/lib/resque-sliders/server/public/images/ui-bg_diagonals-thick_75_f3d8d8_40x40.png delete mode 100755 lib/resque_sliders/lib/resque-sliders/server/public/images/ui-bg_dots-small_65_a6a6a6_2x2.png delete mode 100755 lib/resque_sliders/lib/resque-sliders/server/public/images/ui-bg_flat_0_333333_40x100.png delete mode 100755 lib/resque_sliders/lib/resque-sliders/server/public/images/ui-bg_flat_65_ffffff_40x100.png delete mode 100755 lib/resque_sliders/lib/resque-sliders/server/public/images/ui-bg_flat_75_ffffff_40x100.png delete mode 100755 lib/resque_sliders/lib/resque-sliders/server/public/images/ui-bg_glass_55_fbf8ee_1x400.png delete mode 100755 lib/resque_sliders/lib/resque-sliders/server/public/images/ui-bg_highlight-hard_100_eeeeee_1x100.png delete mode 100755 lib/resque_sliders/lib/resque-sliders/server/public/images/ui-bg_highlight-hard_100_f6f6f6_1x100.png delete mode 100755 lib/resque_sliders/lib/resque-sliders/server/public/images/ui-bg_highlight-soft_15_cc0000_1x100.png delete mode 100755 lib/resque_sliders/lib/resque-sliders/server/public/images/ui-icons_004276_256x240.png delete mode 100755 lib/resque_sliders/lib/resque-sliders/server/public/images/ui-icons_cc0000_256x240.png delete mode 100755 lib/resque_sliders/lib/resque-sliders/server/public/images/ui-icons_ffffff_256x240.png delete mode 100755 lib/resque_sliders/lib/resque-sliders/server/public/js/jquery-ui-1.8.16.custom.min.js delete mode 100755 lib/resque_sliders/lib/resque-sliders/server/public/js/sliders.js delete mode 100755 lib/resque_sliders/lib/resque-sliders/server/views/index.erb delete mode 100755 lib/resque_sliders/lib/resque-sliders/version.rb delete mode 100755 lib/resque_sliders/misc/resque-sliders_host-view.png delete mode 100755 lib/resque_sliders/misc/resque-sliders_main-view.png delete mode 100755 lib/resque_sliders/resque-sliders.gemspec delete mode 100755 lib/resque_sliders/test/kewatcher_test.rb delete mode 100755 lib/resque_sliders/test/redis-test.conf delete mode 100755 lib/resque_sliders/test/test_helper.rb diff --git a/lib/resque_history/.document b/lib/resque_history/.document deleted file mode 100755 index 3d618dd..0000000 --- a/lib/resque_history/.document +++ /dev/null @@ -1,5 +0,0 @@ -lib/**/*.rb -bin/* -- -features/**/*.feature -LICENSE.txt diff --git a/lib/resque_history/.gitignore b/lib/resque_history/.gitignore deleted file mode 100755 index 361607b..0000000 --- a/lib/resque_history/.gitignore +++ /dev/null @@ -1,58 +0,0 @@ -# rcov generated -coverage - -# rdoc generated -rdoc - -# yard generated -doc -.yardoc - -# bundler -.bundle - -# jeweler generated -pkg - -# Have editor/IDE/OS specific files you need to ignore? Consider using a global gitignore: -# -# * Create a file at ~/.gitignore -# * Include files you want ignored -# * Run: git config --global core.excludesfile ~/.gitignore -# -# After doing this, these files will be ignored in all your git projects, -# saving you from having to 'pollute' every project you touch with them -# -# Not sure what to needs to be ignored for particular editors/OSes? Here's some ideas to get you started. (Remember, remove the leading # of the line) -# -# For MacOS: -# -#.DS_Store - -# For TextMate -#*.tmproj -#tmtags - -# For emacs: -#*~ -#\#* -#.\#* - -# For vim: -#*.swp - -# For redcar: -#.redcar - -# For rubinius: -#*.rbc -.idea/ -*.gem -.rspec - -.ruby-* -.rbenv-* - -spec/redis/redis-test.pid -spec/redis/stdout -spec/redis/dump.rdb diff --git a/lib/resque_history/.travis.yml b/lib/resque_history/.travis.yml deleted file mode 100755 index 4fc36de..0000000 --- a/lib/resque_history/.travis.yml +++ /dev/null @@ -1,9 +0,0 @@ -language: ruby -rvm: - - 1.9.2 - - 1.9.3 - - 2.0.0 - - jruby-18mode # JRuby in 1.8 mode - - jruby-19mode # JRuby in 1.9 mode -services: - - redis-server diff --git a/lib/resque_history/Changelog.md b/lib/resque_history/Changelog.md deleted file mode 100755 index b2d7e1e..0000000 --- a/lib/resque_history/Changelog.md +++ /dev/null @@ -1,45 +0,0 @@ -Changelog -========= - -## 1.9.3 (Jul 30, 2012) - -Bug fixes - - - fix for yajl parser (@kevintom #10) - - formatting improvements to comply with resque (@kevintom #10) - -## 1.9.1 (Jul 22, 2012) - -Bug fixes - - - using symbolize keys instead of strings for hashes - -## 1.9.0 (May 9, 2012) - -Features: - - - Record failed jobs - -## 1.8.2 (May 7, 2012) - -Features: - - - Record execution time - -## 1.7.0 (April 17, 2012) - -Features: - - - Added button to clear history - -### 1.6.1 (April 16, 2012) - -Bug fixes - - - updated readme and fixed typo in maximum history size variable (@fred #1) - -## 1.6.0 (April 16, 2012) - -Features: - - - Added simple pagination \ No newline at end of file diff --git a/lib/resque_history/Gemfile b/lib/resque_history/Gemfile deleted file mode 100755 index bfa155f..0000000 --- a/lib/resque_history/Gemfile +++ /dev/null @@ -1,16 +0,0 @@ -source "http://rubygems.org" - -# Specify your gem's dependencies in resque-history.gemspec -# gemspec - -gem "resque" - -group :development, :test do - gem "rake" - gem "bundler" - gem "jeweler" - gem "rspec-rails" - gem "rspec", ">2.12.0" - gem "rack-test" - gem "timecop" -end diff --git a/lib/resque_history/Gemfile.lock b/lib/resque_history/Gemfile.lock deleted file mode 100755 index 757026f..0000000 --- a/lib/resque_history/Gemfile.lock +++ /dev/null @@ -1,92 +0,0 @@ -GEM - remote: http://rubygems.org/ - specs: - addressable (2.3.6) - backports (3.1.1) - builder (3.2.2) - diff-lcs (1.2.5) - faraday (0.8.9) - multipart-post (~> 1.2.0) - git (1.2.8) - github_api (0.10.2) - addressable - faraday (~> 0.8.7) - hashie (>= 1.2) - multi_json (~> 1.4) - nokogiri (~> 1.6.0) - oauth2 - hashie (3.3.1) - highline (1.6.21) - jeweler (2.0.1) - builder - bundler (>= 1.0) - git (>= 1.2.5) - github_api - highline (>= 1.6.15) - nokogiri (>= 1.5.10) - rake - rdoc - json (1.8.1) - jwt (1.0.0) - mini_portile (0.6.0) - multi_json (1.7.1) - multi_xml (0.5.5) - multipart-post (1.2.0) - nokogiri (1.6.3.1) - mini_portile (= 0.6.0) - oauth2 (1.0.0) - faraday (>= 0.8, < 0.10) - jwt (~> 1.0) - multi_json (~> 1.3) - multi_xml (~> 0.5) - rack (~> 1.2) - rack (1.4.5) - rack-test (0.6.2) - rack (>= 1.0) - rake (10.3.2) - rdoc (4.1.1) - json (~> 1.4) - redis (3.0.3) - redis-namespace (1.2.1) - redis (~> 3.0.0) - resque (1.23.1) - multi_json (~> 1.0) - redis-namespace (~> 1.0) - sinatra (>= 0.9.2) - vegas (~> 0.1.2) - rspec (3.1.0) - rspec-core (~> 3.1.0) - rspec-expectations (~> 3.1.0) - rspec-mocks (~> 3.1.0) - rspec-core (3.1.1) - rspec-support (~> 3.1.0) - rspec-expectations (3.1.0) - diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.1.0) - rspec-mocks (3.1.0) - rspec-support (~> 3.1.0) - rspec-rails (1.3.2) - rack (>= 1.0.0) - rspec (>= 1.3.0) - rspec-support (3.1.0) - sinatra (1.2.9) - backports - rack (~> 1.1, < 1.5) - tilt (>= 1.2.2, < 2.0) - tilt (1.3.6) - timecop (0.6.1) - vegas (0.1.11) - rack (>= 1.0.0) - -PLATFORMS - ruby - -DEPENDENCIES - bundler - jeweler - rack-test - rake - resque - rspec (> 2.12.0) - rspec-rails - timecop diff --git a/lib/resque_history/LICENSE b/lib/resque_history/LICENSE deleted file mode 100755 index ffa5c02..0000000 --- a/lib/resque_history/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2013 Ilya Katz - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/lib/resque_history/README.md b/lib/resque_history/README.md deleted file mode 100755 index b42fb02..0000000 --- a/lib/resque_history/README.md +++ /dev/null @@ -1,89 +0,0 @@ -# Resque History -[![alt build status][1]][2] -[![Dependency Status](http://img.shields.io/gemnasium/ilyakatz/he.svg)](https://gemnasium.com/ilyakatz/resque-history) -[![Code Climate](http://img.shields.io/codeclimate/github/ilyakatz/resque-history.svg)](https://codeclimate.com/github/ilyakatz/resque-history) -[![Gem Version](http://img.shields.io/gem/v/resque-history.svg)](http://badge.fury.io/rb/resque-history) - -[1]: http://img.shields.io/travis/ilyakatz/resque-history.svg -[2]: http://travis-ci.org/#!/ilyakatz/resque-history - - -A [Resque][rq] plugin. Requires Resque - -resque-history adds functionality record recently history of job executions - -Usage / Examples ----------------- - -### Single Job Instance - -```ruby - require 'resque-history' - - class UpdateNetworkGraph - extend Resque::Plugins::History - @queue = :network_graph - - def self.perform(some_id) - do_stuff(some_id) - end - end -``` - - -### Job History - -By default resque-history stores 500 history items on redis, -but if you want to store less items, assign @max_history in the job class. - -```ruby - require 'resque-history' - - class UpdateNetworkGraph - extend Resque::Plugins::History - @queue = :network_graph - @max_history = 50 # max number of histories to be kept - - def self.perform(some_id) - do_stuff(some_id) - end - end -``` - -### 3rd Party classes - -If you want to use resque history with 3rd party resque jobs, -extended the classes that you want to be recorded in history - -```ruby -[ - CarrierWave::Workers::ProcessAsset, - CarrierWave::Workers::StoreAsset, - ActionMailer::DeliveryMethods -].each do |klazz| - klazz.class_eval do - extend Resque::Plugins::History - end -end -``` - -Resque-Web integration ----------------------- - -'History' tab in resque web GUI - -![Resque History GUI](https://img.skitch.com/20120510-x4egbeih39bb2xe82c2mtapmp9.jpg) - - -Install -======= - -Add to your Gemfile - - $ gem "resque-history" - -Add to routes.rb file - - require 'resque-history/server' - -[rq]: http://github.com/defunkt/resque diff --git a/lib/resque_history/Rakefile b/lib/resque_history/Rakefile deleted file mode 100755 index 911042e..0000000 --- a/lib/resque_history/Rakefile +++ /dev/null @@ -1,25 +0,0 @@ -require 'bundler' -Bundler::GemHelper.install_tasks - -require "rspec/core/rake_task" - -desc "Run all examples" -RSpec::Core::RakeTask.new(:spec) - -task :default => :spec - - -begin - require 'jeweler' - Jeweler::Tasks.new do |gem| - gem.name = "resque-history" - gem.summary = %Q{Show history of recently executed jobs} - gem.description = %Q{Show history of recently executed jobs} - gem.email = "ilyakatz@gmail.com" - gem.homepage = "https://github.com/ilyakatz/resque-history" - gem.authors = ["Katzmopolitan"] - end - Jeweler::GemcutterTasks.new -rescue LoadError - puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler" -end \ No newline at end of file diff --git a/lib/resque_history/VERSION b/lib/resque_history/VERSION deleted file mode 100755 index 69669de..0000000 --- a/lib/resque_history/VERSION +++ /dev/null @@ -1 +0,0 @@ -1.12.2 \ No newline at end of file diff --git a/lib/resque_history/lib/resque-history.rb b/lib/resque_history/lib/resque-history.rb deleted file mode 100755 index a32b0c7..0000000 --- a/lib/resque_history/lib/resque-history.rb +++ /dev/null @@ -1,3 +0,0 @@ -require 'resque' -require File.expand_path(File.join('resque-history', 'plugins', 'history'), File.dirname(__FILE__)) -require File.expand_path(File.join('resque-history', 'helpers', 'helper'), File.dirname(__FILE__)) \ No newline at end of file diff --git a/lib/resque_history/lib/resque-history/helpers/helper.rb b/lib/resque_history/lib/resque-history/helpers/helper.rb deleted file mode 100755 index fe3e7e0..0000000 --- a/lib/resque_history/lib/resque-history/helpers/helper.rb +++ /dev/null @@ -1,28 +0,0 @@ -module Resque - module History - module Helper - - def format_execution(seconds) - if seconds.nil? - "" - elsif seconds < 60 - "#{seconds} secs" - elsif seconds < 60 * 60 - "#{(seconds/60).to_i} minutes" - elsif seconds < 60 * 60 * 24 - "#{(((seconds.to_f/60/60)*100).truncate.to_f)/100} hours" - elsif seconds < 60 * 60 * 24 * 7 - "#{(((seconds.to_f/60/60/24)*100).truncate.to_f)/100} days" - else - "too long" - end - end - - def resque_history_total_jobs - Resque.redis.llen(Resque::Plugins::History::HISTORY_SET_NAME) - end - - end - end - -end diff --git a/lib/resque_history/lib/resque-history/plugins/history.rb b/lib/resque_history/lib/resque-history/plugins/history.rb deleted file mode 100755 index 8659988..0000000 --- a/lib/resque_history/lib/resque-history/plugins/history.rb +++ /dev/null @@ -1,46 +0,0 @@ -module Resque - module Plugins - module History - - MAX_HISTORY_SIZE = 500 - HISTORY_SET_NAME = "resque_history" - - def maximum_history_size - @max_history ||= MAX_HISTORY_SIZE - end - - def on_failure_history(exception, *args) - Resque.redis.lpush(HISTORY_SET_NAME, {:class => "#{self}", - :time => Time.now.strftime("%Y-%m-%d %H:%M:%S %z"), - :args => args, - :error => exception.message - }.to_json) - - if Resque.redis.llen(HISTORY_SET_NAME) > maximum_history_size - Resque.redis.rpop(HISTORY_SET_NAME) - end - - end - - - def before_perform_history(*args) - @start_time = Time.now - end - - def after_perform_history(*args) - elapsed_seconds = (Time.now - @start_time).to_i - Resque.redis.lpush(HISTORY_SET_NAME, {:class => "#{self}", - :args => args, - :time => Time.now.strftime("%Y-%m-%d %H:%M"), - :execution =>elapsed_seconds - }.to_json) - - if Resque.redis.llen(HISTORY_SET_NAME) > maximum_history_size - Resque.redis.rpop(HISTORY_SET_NAME) - end - - end - - end - end -end diff --git a/lib/resque_history/lib/resque-history/server.rb b/lib/resque_history/lib/resque-history/server.rb deleted file mode 100755 index 8f42cf6..0000000 --- a/lib/resque_history/lib/resque-history/server.rb +++ /dev/null @@ -1,52 +0,0 @@ -require 'resque' -require 'resque/server' -require 'resque-history' - -# Extends Resque Web Based UI. -# Structure has been borrowed from ResqueScheduler. -module ResqueHistory - module Server - include Resque::History::Helper - - def self.erb_path(filename) - File.join(File.dirname(__FILE__), 'server', 'views', filename) - end - - def self.public_path(filename) - File.join(File.dirname(__FILE__), 'server', 'public', filename) - end - - def self.included(base) - - base.class_eval do - - get '/history' do - erb File.read(ResqueHistory::Server.erb_path('history.erb')) - end - - post "/history/clear" do - Resque.reset_history - redirect u('history') - end - - end - end - - Resque::Server.tabs << 'History' - end - - # Clears all historical jobs - def reset_history - size = Resque.redis.llen(Resque::Plugins::History::HISTORY_SET_NAME) - - size.times do - Resque.redis.lpop(Resque::Plugins::History::HISTORY_SET_NAME) - end - - end -end - -Resque.extend ResqueHistory -Resque::Server.class_eval do - include ResqueHistory::Server -end \ No newline at end of file diff --git a/lib/resque_history/lib/resque-history/server/views/history.erb b/lib/resque_history/lib/resque-history/server/views/history.erb deleted file mode 100755 index ffe5408..0000000 --- a/lib/resque_history/lib/resque-history/server/views/history.erb +++ /dev/null @@ -1,62 +0,0 @@ -<% size = resque_history_total_jobs %> -<% start = params[:start].to_i %> -<% history = Resque.redis.lrange(Resque::Plugins::History::HISTORY_SET_NAME, start, start + 20)%> - -

      Job history

      - -<% if size > 0 %> -
      - -
      -<% end %> - -

      Showing <%= start %> to - <% if size > 20 %> - <%= start + 20 %> of <%= size %> - <% else %> - <%= size %> - <% end %>jobs

      - -
      - <%= erb File.read(ResqueHistory::Server.erb_path('navigation.erb')), {}, - :start => params[:start].to_i, :size => size %> - - - - - - - - - <% history.each do |history| %> - <% j = JSON.parse(history, :symbolize_names => true, :symbolize_keys => true) %> - - - - - - - <% end %> -
      JobArgumentsTimeExecution
      <%= j[:class] %>
      <%= j[:args] ? show_args(j[:args]) : '' %>
      <%= j[:time] %><%= format_execution(j[:execution]) %>
      - - <%= erb File.read(ResqueHistory::Server.erb_path('navigation.erb')), {}, - :start => params[:start].to_i, :size => size %> -
      - - diff --git a/lib/resque_history/lib/resque-history/server/views/navigation.erb b/lib/resque_history/lib/resque-history/server/views/navigation.erb deleted file mode 100755 index 755c810..0000000 --- a/lib/resque_history/lib/resque-history/server/views/navigation.erb +++ /dev/null @@ -1,20 +0,0 @@ -<% per_page ||= 20 %> -<%if start - per_page >= 0 || start + per_page <= size%> -
      -<%end%> diff --git a/lib/resque_history/lib/version.rb b/lib/resque_history/lib/version.rb deleted file mode 100755 index 8717fb3..0000000 --- a/lib/resque_history/lib/version.rb +++ /dev/null @@ -1,7 +0,0 @@ -module Resque - module Plugins - module History - VERSION = "0.0.1" - end - end -end diff --git a/lib/resque_history/resque-history.gemspec b/lib/resque_history/resque-history.gemspec deleted file mode 100755 index c0c62fd..0000000 --- a/lib/resque_history/resque-history.gemspec +++ /dev/null @@ -1,85 +0,0 @@ -# Generated by jeweler -# DO NOT EDIT THIS FILE DIRECTLY -# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec' -# -*- encoding: utf-8 -*- -# stub: resque-history 1.12.2 ruby lib - -Gem::Specification.new do |s| - s.name = "resque-history" - s.version = "1.12.2" - - s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= - s.require_paths = ["lib"] - s.authors = ["Katzmopolitan"] - s.date = "2014-09-08" - s.description = "Show history of recently executed jobs" - s.email = "ilyakatz@gmail.com" - s.extra_rdoc_files = [ - "LICENSE", - "README.md" - ] - s.files = [ - ".document", - ".travis.yml", - "Changelog.md", - "Gemfile", - "Gemfile.lock", - "LICENSE", - "README.md", - "Rakefile", - "VERSION", - "lib/resque-history.rb", - "lib/resque-history/helpers/helper.rb", - "lib/resque-history/plugins/history.rb", - "lib/resque-history/server.rb", - "lib/resque-history/server/views/history.erb", - "lib/resque-history/server/views/navigation.erb", - "lib/version.rb", - "resque-history.gemspec", - "spec/redis-test.conf", - "spec/redis/.keep", - "spec/resque-history/plugins/history_spec.rb", - "spec/resque-history/resque_history_helper_spec.rb", - "spec/resque-web_spec.rb", - "spec/spec_helper.rb", - "test/helper.rb", - "test/test_resque-history.rb" - ] - s.homepage = "https://github.com/ilyakatz/resque-history" - s.rubygems_version = "2.2.0" - s.summary = "Show history of recently executed jobs" - - if s.respond_to? :specification_version then - s.specification_version = 4 - - if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then - s.add_runtime_dependency(%q, [">= 0"]) - s.add_development_dependency(%q, [">= 0"]) - s.add_development_dependency(%q, [">= 0"]) - s.add_development_dependency(%q, [">= 0"]) - s.add_development_dependency(%q, [">= 0"]) - s.add_development_dependency(%q, ["> 2.12.0"]) - s.add_development_dependency(%q, [">= 0"]) - s.add_development_dependency(%q, [">= 0"]) - else - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, ["> 2.12.0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - end - else - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, ["> 2.12.0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - end -end - diff --git a/lib/resque_history/spec/redis-test.conf b/lib/resque_history/spec/redis-test.conf deleted file mode 100755 index f97eeec..0000000 --- a/lib/resque_history/spec/redis-test.conf +++ /dev/null @@ -1,16 +0,0 @@ -daemonize yes -pidfile redis-test.pid -port 9736 -timeout 300 - -save 900 1 -save 300 10 -save 60 10000 - -dbfilename dump.rdb - -dir ./spec/redis - -loglevel debug -logfile stdout -databases 1 diff --git a/lib/resque_history/spec/redis/.keep b/lib/resque_history/spec/redis/.keep deleted file mode 100755 index e69de29..0000000 diff --git a/lib/resque_history/spec/resque-history/plugins/history_spec.rb b/lib/resque_history/spec/resque-history/plugins/history_spec.rb deleted file mode 100755 index e57314c..0000000 --- a/lib/resque_history/spec/resque-history/plugins/history_spec.rb +++ /dev/null @@ -1,217 +0,0 @@ -require 'spec_helper' -require 'timecop' - -class HistoryJob - extend Resque::Plugins::History - @queue = :test - - def self.perform(*args) - end -end - -class MaxHistoryJob - extend Resque::Plugins::History - @queue = :test2 - @max_history = 15 - - def self.perform(*args) - end -end - -describe Resque::Plugins::History do - - it "should be compliance with Resqu::Plugin document" do - expect { Resque::Plugin.lint(Resque::Plugins::History) }.to_not raise_error - end - - it "should store history of the job" do - Timecop.freeze(Time.local(2000, 9, 1, 12, 0, 0)) do - Resque.enqueue(HistoryJob, 12) - - job = Resque.reserve('test') - job.perform - - arr = Resque.redis.lrange(Resque::Plugins::History::HISTORY_SET_NAME, 0, -1) - - arr.count.should == 1 - expected = { - "class" => "HistoryJob", "args" => [12], - "time" => "2000-09-01 12:00", "execution" => 0 - } - expect(JSON.parse(arr.first)).to eq(expected) - end - end - - it "should use the max_history size of the history list" do - expect(MaxHistoryJob.maximum_history_size).to eq 15 - end - - it "should set the default size of the history list to be 500" do - HistoryJob.maximum_history_size.should == 500 - end - - it "should truncate the maximum" do - - expect(HistoryJob).to receive(:maximum_history_size).at_least(:once).and_return(3) - - Resque.enqueue(HistoryJob, 15) - Resque.enqueue(HistoryJob, 13) - Resque.enqueue(HistoryJob, 12) - Resque.enqueue(HistoryJob, 11) - - Timecop.freeze(Time.local(2000, 9, 1, 12, 0, 0)) do - job = Resque.reserve('test') - job.perform - job = Resque.reserve('test') - job.perform - job = Resque.reserve('test') - job.perform - job = Resque.reserve('test') - job.perform - - arr = Resque.redis.lrange(Resque::Plugins::History::HISTORY_SET_NAME, 0, -1) - - arr.count.should == 3 - - JSON.parse(arr[0]).should == {"class"=>"HistoryJob", "args"=>[11], "time"=>"2000-09-01 12:00", "execution"=>0} - JSON.parse(arr[1]).should == {"class"=>"HistoryJob", "args"=>[12], "time"=>"2000-09-01 12:00", "execution"=>0} - JSON.parse(arr[2]).should == {"class"=>"HistoryJob", "args"=>[13], "time"=>"2000-09-01 12:00", "execution"=>0} - - end - - end - - it "should allow to remove history" do - - Resque.enqueue(HistoryJob, 15) - Resque.enqueue(HistoryJob, 13) - - job = Resque.reserve('test') - job.perform - job = Resque.reserve('test') - job.perform - - arr = Resque.redis.lrange(Resque::Plugins::History::HISTORY_SET_NAME, 0, -1) - - arr.count.should == 2 - - Resque.reset_history - - arr = Resque.redis.lrange(Resque::Plugins::History::HISTORY_SET_NAME, 0, -1) - - arr.count.should == 0 - - end - - describe "record execution time" do - - it "should record execution time" do - - Resque.enqueue(SlowHistoryJob, 10) - - Timecop.freeze(Time.local(2000, 9, 1, 12, 0, 0)) do - job = Resque.reserve('test') - job.perform - end - - arr = Resque.redis.lrange(Resque::Plugins::History::HISTORY_SET_NAME, 0, -1) - - arr.count.should == 1 - JSON.parse(arr[0]).should == {"class"=>"SlowHistoryJob", "args"=>[10], "time"=>"2000-09-01 12:10", "execution"=>600} - - end - - it "should not confuse different job times" do - - Resque.enqueue(SlowHistoryJob, 10) - Resque.enqueue(SlowHistoryJob, 5) - - Timecop.freeze(Time.local(2000, 9, 1, 12, 0, 0)) do - job = Resque.reserve('test') - job.perform - - job = Resque.reserve('test') - job.perform - - end - - arr = Resque.redis.lrange(Resque::Plugins::History::HISTORY_SET_NAME, 0, -1) - - arr.count.should == 2 - - JSON.parse(arr[0]).should == {"class"=>"SlowHistoryJob", "args"=>[5], "time"=>"2000-09-01 12:15", "execution"=>300} - JSON.parse(arr[1]).should == {"class"=>"SlowHistoryJob", "args"=>[10], "time"=>"2000-09-01 12:10", "execution"=>600} - - end - - it "should record times in the order of completion not in order of starting" do - - #start the longer job first but it should finish last - Resque.enqueue(SleepyHistoryJob, 3) - Resque.enqueue(SleepyHistoryJob, 1) - - job = Resque.reserve('test') - job.perform - - job = Resque.reserve('test') - job.perform - - arr = Resque.redis.lrange(Resque::Plugins::History::HISTORY_SET_NAME, 0, -1) - - JSON.parse(arr.first)["class"].should =="SleepyHistoryJob" - JSON.parse(arr.first)["args"].should ==[1] - JSON.parse(arr.first)["execution"].should ==1 - - JSON.parse(arr.last)["class"].should =="SleepyHistoryJob" - JSON.parse(arr.last)["args"].should ==[3] - JSON.parse(arr.last)["execution"].should ==3 - - end - - it "should record failed jobs" do - - Resque.enqueue(ExceptionJob,"nothing") - - job = Resque.reserve('test') - - lambda { job.perform }.should raise_exception - arr = Resque.redis.lrange(Resque::Plugins::History::HISTORY_SET_NAME, 0, -1) - - arr.count.should == 1 - - JSON.parse(arr.first)["class"].should =="ExceptionJob" - JSON.parse(arr.first)["args"].should == ["nothing"] - JSON.parse(arr.first)["execution"].should == nil - JSON.parse(arr.first)["error"].should == "I'm an error" - end - - end - -end - -class SlowHistoryJob - extend Resque::Plugins::History - @queue = :test - - def self.perform(time_in_minutes) - Timecop.travel(Time.now + 60*time_in_minutes) - end -end - -class SleepyHistoryJob - extend Resque::Plugins::History - @queue = :test - - def self.perform(time_in_seconds) - sleep(time_in_seconds) - end -end - -class ExceptionJob - extend Resque::Plugins::History - @queue = :test - - def self.perform(arg) - raise StandardError, "I'm an error" - end -end diff --git a/lib/resque_history/spec/resque-history/resque_history_helper_spec.rb b/lib/resque_history/spec/resque-history/resque_history_helper_spec.rb deleted file mode 100755 index e6d7dad..0000000 --- a/lib/resque_history/spec/resque-history/resque_history_helper_spec.rb +++ /dev/null @@ -1,36 +0,0 @@ -require 'spec_helper' -require 'resque-history/helpers/helper' - -describe Resque::History::Helper do - - include Resque::History::Helper - - it "should show correct number of seconds" do - format_execution(40).should == "40 secs" - end - - it "should show correct number of minutes" do - format_execution(600).should == "10 minutes" - format_execution(659).should == "10 minutes" - format_execution(660).should == "11 minutes" - end - - it "should show correct number of hours" do - format_execution(3600).should == "1.0 hours" - format_execution(7200).should == "2.0 hours" - format_execution(5400).should == "1.5 hours" - format_execution(5403).should == "1.5 hours" - format_execution(5703).should == "1.58 hours" - end - - it "should show correct number of days" do - format_execution(86400).should == "1.0 days" - format_execution(129600).should == "1.5 days" - format_execution(518400).should == "6.0 days" - end - - it "should show that job is too long" do - format_execution(604800).should == "too long" - end - -end \ No newline at end of file diff --git a/lib/resque_history/spec/resque-web_spec.rb b/lib/resque_history/spec/resque-web_spec.rb deleted file mode 100755 index 74ba02b..0000000 --- a/lib/resque_history/spec/resque-web_spec.rb +++ /dev/null @@ -1,57 +0,0 @@ -require 'spec_helper' -require 'timecop' - - -describe ResqueHistory::Server do - include Rack::Test::Methods - - def app - @app ||= Resque::Server.new - end - - let :queues do - Resque.redis.sadd(:queues, "queue1") - Resque.redis.sadd(:queues, "queue2") - Resque.redis.sadd(:queues, "queue3") - end - - before do - queues - Resque.enqueue(HistoryJob, 12) - job = Resque.reserve('test') - Timecop.freeze(2008, 10, 5, 10, 12) do - job.perform - end - end - - it "should respond to /history" do - get '/history' - last_response.should be_ok - last_response.body.should include("HistoryJob") - last_response.body.should include("0 secs") - last_response.body.should include("2008-10-05 10:12") - end - - it "should respond to remove history" do - get '/history' - last_response.body.should include("HistoryJob") - post "/history/clear" - last_response.should be_redirect - get '/history' - last_response.body.should_not include("HistoryJob") - end - - it "should not show full message if there is small number of jobs in the history" do - get '/history' - last_response.body.should =~ /Showing 0 to.*jobs/m - end - -end - -class HistoryJob - extend Resque::Plugins::History - @queue = :test - - def self.perform(*args) - end -end diff --git a/lib/resque_history/spec/spec_helper.rb b/lib/resque_history/spec/spec_helper.rb deleted file mode 100755 index fb8965d..0000000 --- a/lib/resque_history/spec/spec_helper.rb +++ /dev/null @@ -1,64 +0,0 @@ -require 'rack/test' -if !system("which redis-server") - puts '', "** can't find `redis-server` in your path" - abort '' -end - -#begin -# require 'simplecov' -# SimpleCov.start do -# add_filter '/spec/' -# end -# SimpleCov.coverage_dir 'coverage' -#rescue LoadError -# ignore simplecov in ruby < 1.9 -#end - -#begin -# require 'bundler' -# Bundler.setup -# Bundler.require(:default, :development) -#rescue LoadError -# puts 'Bundler is not installed, you need to gem install it in order to run the specs.' -# exit 1 -#end - -# Requires supporting files with custom matchers and macros, etc, -# in ./support/ and its subdirectories. -Dir[File.expand_path('support/**/*.rb', File.dirname(__FILE__))].each { |f| require f } - -# Requires lib. -Dir[File.expand_path('../lib/**/*.rb', File.dirname(__FILE__))].each { |f| require f } - -RSpec.configure do |config| - # == Mock Framework - # - # If you prefer to use mocha, flexmock or RR, uncomment the appropriate line: - # - # config.mock_with :mocha - # config.mock_with :flexmock - # config.mock_with :rr - config.mock_with :rspec - - config.before(:suite) do - puts "Starting redis for testing at localhost:9736..." - `redis-server #{File.dirname(File.expand_path(__FILE__))}/redis-test.conf` - pid = '' - while pid.empty? do - pid = `cat #{File.dirname(File.expand_path(__FILE__))}/redis/redis-test.pid` - end - puts "redis pid is #{pid}" - Resque.redis = '127.0.0.1:9736' - end - - config.before(:each) do - Resque.redis.flushall - end - - config.after(:suite) do - pid = `cat #{File.dirname(File.expand_path(__FILE__))}/redis/redis-test.pid` - puts "Killing test redis server (pid: #{pid})..." - Process.kill("KILL", pid.to_i) - `rm -f #{File.dirname(File.expand_path(__FILE__))}/dump.rdb` - end -end diff --git a/lib/resque_history/test/helper.rb b/lib/resque_history/test/helper.rb deleted file mode 100755 index 722901e..0000000 --- a/lib/resque_history/test/helper.rb +++ /dev/null @@ -1,18 +0,0 @@ -require 'rubygems' -require 'bundler' -begin - Bundler.setup(:default, :development) -rescue Bundler::BundlerError => e - $stderr.puts e.message - $stderr.puts "Run `bundle install` to install missing gems" - exit e.status_code -end -require 'test/unit' -require 'shoulda' - -$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib')) -$LOAD_PATH.unshift(File.dirname(__FILE__)) -require 'resque-history' - -class Test::Unit::TestCase -end diff --git a/lib/resque_history/test/test_resque-history.rb b/lib/resque_history/test/test_resque-history.rb deleted file mode 100755 index 8eb8d20..0000000 --- a/lib/resque_history/test/test_resque-history.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'helper' - -class TestResqueHistory < Test::Unit::TestCase - should "probably rename this file and start testing for real" do - flunk "hey buddy, you should probably rename this file and start testing for real" - end -end diff --git a/lib/resque_sliders/.gitignore b/lib/resque_sliders/.gitignore deleted file mode 100755 index a936280..0000000 --- a/lib/resque_sliders/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -.rvmrc -*.swp -*.log -pkg/ -Gemfile.lock -.DS_Store -.ruby-* diff --git a/lib/resque_sliders/.travis.yml b/lib/resque_sliders/.travis.yml deleted file mode 100755 index 9130df3..0000000 --- a/lib/resque_sliders/.travis.yml +++ /dev/null @@ -1,8 +0,0 @@ -language: ruby -rvm: - - 1.9.3 - - ree - -branches: - only: - - master diff --git a/lib/resque_sliders/Gemfile b/lib/resque_sliders/Gemfile deleted file mode 100755 index 3230950..0000000 --- a/lib/resque_sliders/Gemfile +++ /dev/null @@ -1,15 +0,0 @@ -source "https://rubygems.org" - -gemspec - -gem 'resque', ['>= 1.15.0', '< 2.0'] - -group :development do - gem 'shotgun' - gem 'json' - gem 'rake' -end - -group :test do - gem 'minitest' -end diff --git a/lib/resque_sliders/MIT-LICENSE b/lib/resque_sliders/MIT-LICENSE deleted file mode 100755 index 63505ce..0000000 --- a/lib/resque_sliders/MIT-LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (c) Kevin Mullin - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/lib/resque_sliders/README.md b/lib/resque_sliders/README.md deleted file mode 100755 index c74be5c..0000000 --- a/lib/resque_sliders/README.md +++ /dev/null @@ -1,135 +0,0 @@ -Resque Sliders [![Build Status](https://secure.travis-ci.org/kmullin/resque-sliders.png)](http://travis-ci.org/kmullin/resque-sliders) -============== - -[github.com/kmullin/resque-sliders](https://github.com/kmullin/resque-sliders) - - -Description ------------ - -ResqueSliders is a [Resque](https://github.com/defunkt/resque) plugin which allows you -to control Resque workers from the Web-UI. - -From the Resque-Web UI, you can: - -* Start workers with any queue, or combination of queues on any host, and specify how many of each should be running -* Pause / Stop / Restart ALL running workers - -ResqueSliders comes in two parts: - -* `KEWatcher`: A daemon that runs on any machine that needs to run Resque workers, watches over the workers and controls which ones are running -* `Resque-Web Plugin`: A bunch of slider bars, with text-input box to specify what queues to run on the workers - - -Installation ------------- - -Install as a gem: - - $ gem install resque-sliders - -### KEWatcher - -This is the daemon component that runs on any host that you want to run Resque workers on. The daemon's job is to manage **how many** Resque workers should be running, and **what** they should be running. It also provides an easy way to stop all workers during maintenance or deploys. - -When the daemon first runs, it will register itself, by hostname with Redis: - -* Adds a few persistent settings to the hash key `resque:plugins:resque-sliders:host_configs` (max_children, current_children) -* Gets any queues that need to be running on the host by looking at `resque:plugins:resque-sliders:` + `hostname` - -``` -Usage: kewatcher [options] - -Options: - -c, --config CONFIG Resque Config (Yaml) - -r, --rakefile RAKEFILE Rakefile location - -p, --pidfile PIDFILE PID File location - -f, --force FORCE KILL ANY OTHER RUNNING KEWATCHERS - -v, --verbose Verbosity (Can be specified more than once, -vv) - -m, --max MAX Max Children (default: 10) - -w, --wait WAIT_TIME Time (in seconds) to wait for worker to die before sending TERM signal (default: 20 seconds) - -t, --time MAX_TIME Max Time (in seconds) to wait for worker to die before sending KILL (-9) signal (FORCE QUIT) (default: 60) - NOTE: With Resque >= 1.22.0 force quit is handled for you so by default this is the same as: - RESQUE_TERM_TIMEOUT=40 or the difference of MAX_TIME and WAIT_TIME - more info: http://hone.heroku.com/resque/2012/08/21/resque-signals.html - -a, --async Do NOT wait for Resque workers to die completely before spawning new workers (default: false) - -V, --version Prints Version -``` - -#### Important Options - -``` - -m|--max MAX (Max Children): Maximum number of workers to run on host (default: 10) - -w|--wait WAIT_TIME (Wait Time): How long to wait before sending TERM to zombies (default: 20 seconds) - -t|--time TIME (Total Time): How long to wait before sending KILL to zombies (default: 60 seconds) - NOTE: Resque >= 1.22.0 includes signal handling of its own to force quit, so we use it if its there, and override with our own timeout here - -a|--async (Async): Should we spawn new workers before old ones have fully terminated (default: false) - -r|--rakefile RAKEFILE (Rakefile): Pass along a rakefile to use when calling rake ... resque:work - shouldn't be needed if run from project directory - -f|--force (Force): Force any currently running KEWatcher processes to quit, waiting for it to do so, and starting in its place - RAILS_ENV: If you're using rails, you need to set your RAILS_ENV variable -``` - -#### Controlling the Daemon - -Once the daemon is running on each host that is going to run Resque workers, you'll need to tell them which queues to run. - -#### Signals - -KEWatcher supports all the [same signals as Resque](https://github.com/defunkt/resque#signals): - -* `TERM` / `INT` / `QUIT` - Shutdown. Gracefully kill all child Resque workers, and wait for them to finish before exiting -* `HUP` - Restart all Resque workers by gracefully killing them, and starting new ones in their place -* `USR1` - Stop all Resque workers, and don't start any more -* `USR2` - Pause spawning of new queues, but leave current ones running -* `CONT` - Unpause. Continue spawning/managing child Resque workers - -The queue configuration is done via Resque-Web interface - -#### Resque-Web - -See below for screenshots - -Buttons: - -* `Play` / `Pause` - Start or Pause -* `Stop` - Stop all workers -* `Reload` - Sends HUP signal to running KEWatcher - - -### Resque-Web Integration - -**Main Screen:** showing 3 hosts, and showing that one of the nodes is not running KEWatcher -![Screen 1](https://github.com/kmullin/resque-sliders/raw/master/misc/resque-sliders_main-view.png) - -**Host Screen:** showing different `QUEUE` combinations (comma separated) and slider bars indicating how many of each of them should run -![Screen 2](https://github.com/kmullin/resque-sliders/raw/master/misc/resque-sliders_host-view.png) - -To enable the Resque-Web Integration you'll need to load ResqueSliders to enable the Sliders tab. Just add: - -```ruby -require 'resque-sliders' -``` -to a file, like resque-web_init.rb, and run resque-web: - - resque-web resque-web_init.rb - - -Works on --------- - -`resque-sliders` has been tested on the following platforms: - -#### Ruby - -* 1.9.3 -* 1.8.7 (ree) -* probabaly more... - -Contributing ------------- - -Want to fix a bug? See a new feature? - -1. [Fork](https://github.com/kmullin/resque-sliders/fork_select) me -2. Create a new branch -3. Open a [Pull Request](https://github.com/kmullin/resque-sliders/pull/new) diff --git a/lib/resque_sliders/Rakefile b/lib/resque_sliders/Rakefile deleted file mode 100755 index 77e17f5..0000000 --- a/lib/resque_sliders/Rakefile +++ /dev/null @@ -1,41 +0,0 @@ -$LOAD_PATH.unshift 'helpers' -$LOAD_PATH.unshift 'lib' -# -# Setup -# - - -require 'bundler/gem_tasks' -require 'resque/tasks' -require 'resque_job' - -def command?(command) - system("type #{command} > /dev/null 2>&1") -end - - -# -# Tests -# - -task :default => :test - -desc "Run the test suite" -task :test do - rg = command?(:rg) - Dir['test/**/*_test.rb'].each do |f| - rg ? sh("rg #{f}") : ruby(f) - end -end - -desc "Bump version" -task :git_tag_version do - require 'resque-sliders/version' - git_tags = `git tag -l`.split.map { |x| x.gsub(/v/, '') } - version = Resque::Plugins::ResqueSliders::Version - commit_sha = `git log -1 HEAD|head -n1|awk '{print $2}'` - unless git_tags.include?(version) - (puts version, commit_sha; `git tag v#{version} #{commit_sha}`) - `rake build` - end -end diff --git a/lib/resque_sliders/bin/kewatcher b/lib/resque_sliders/bin/kewatcher deleted file mode 100755 index b766189..0000000 --- a/lib/resque_sliders/bin/kewatcher +++ /dev/null @@ -1,86 +0,0 @@ -#!/usr/bin/env ruby - -$LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + '/../lib') - -require 'rubygems' -require 'yaml' -require 'optparse' -require 'resque-sliders/kewatcher' -require 'resque-sliders/version' - -options = { - :verbosity => 0, - :max_children => 10 -} - -OptionParser.new do |opt| - opt.banner = "Usage: #{File.basename($0)} [options]" - opt.version = Resque::Plugins::ResqueSliders::Version - - opt.separator "" - opt.separator "Options:" - - opt.on("-c", "--config CONFIG", "Resque Config (Yaml)") do |config| - options[:config] = YAML.load_file(File.expand_path(config)) rescue nil - options[:config] ||= config - end - - opt.on("-r", "--rakefile RAKEFILE", "Rakefile location") do |rakefile| - options[:rakefile] = rakefile - end - - opt.on("-p", "--pidfile PIDFILE", "PID File location") do |pidfile| - options[:pidfile] = pidfile - end - - opt.on("-f", "--force", "FORCE KILL ANY OTHER RUNNING KEWATCHERS") do - options[:force] = true - end - - opt.on("-v", "--verbose", "Verbosity (Can be specified more than once, -vv)") do - options[:verbosity] += 1 - end - - opt.on("-m", "--max MAX", Integer, "Max Children (default: 10)") do |max| - options[:max_children] = max - end - - opt.on("-w", "--wait WAIT_TIME", Float, "Time (in seconds) to wait for worker to die before sending TERM signal (default: 20 seconds)") do |wait| - options[:zombie_term_wait] = wait - end - - opt.on("-t", "--time MAX_TIME", Float, - "Max Time (in seconds) to wait for worker to die before sending KILL (-9) signal (FORCE QUIT) (default: 60)", - "NOTE: With Resque >= 1.22.0 force quit is handled for you so by default this is the same as:", - " RESQUE_TERM_TIMEOUT=40 or the difference of MAX_TIME and WAIT_TIME", - " more info: http://hone.heroku.com/resque/2012/08/21/resque-signals.html") do |wait| - options[:zombie_kill_wait] = wait - end - - opt.on("-a", "--async", "Do NOT wait for Resque workers to die completely before spawning new workers (default: false)") do - options[:async] = true - end - - opt.on("-V", "--version", "Prints Version") do - puts opt.version - exit - end - -end.parse! - -begin - options[:config] = case options[:config] - when Hash - options[:config][ENV['RAILS_ENV'] || 'development'] - when String - options[:config] - end -rescue Object => e - puts e - exit 1 -end - -options[:config] ||= 'localhost:6379' - -kewatcher = Resque::Plugins::ResqueSliders::KEWatcher.new(options) -kewatcher.run! diff --git a/lib/resque_sliders/config/config_example.yml b/lib/resque_sliders/config/config_example.yml deleted file mode 100755 index 0d602d8..0000000 --- a/lib/resque_sliders/config/config_example.yml +++ /dev/null @@ -1,11 +0,0 @@ -development: - localhost:6379 - -test: - localhost:6379 - -staging: - localhost:6379 - -production: - 192.168.0.1:6379 diff --git a/lib/resque_sliders/helpers/resque_init.rb b/lib/resque_sliders/helpers/resque_init.rb deleted file mode 100755 index 72715ac..0000000 --- a/lib/resque_sliders/helpers/resque_init.rb +++ /dev/null @@ -1,8 +0,0 @@ -require 'resque' - -# Include resque-sliders -if RUBY_VERSION > '1.8.7' - require_relative '../lib/resque-sliders' -else - require File.join(File.dirname(__FILE__), '../lib/resque-sliders') -end diff --git a/lib/resque_sliders/helpers/resque_job.rb b/lib/resque_sliders/helpers/resque_job.rb deleted file mode 100755 index c4ec5f9..0000000 --- a/lib/resque_sliders/helpers/resque_job.rb +++ /dev/null @@ -1,33 +0,0 @@ -# test job class for resque - -module Jobs - class Stuff - @queue = :stuff - - def self.perform(stuff=rand(30)) - begin - sleep(stuff) - rescue Resque::TermException - sleep(stuff) - end - end - - - end - - class Things < Stuff - @queue = :things - end - - class Email < Stuff - @queue = :email - end - - class Support < Stuff - @queue = :support - end - - class Notification < Stuff - @queue = :notification - end -end diff --git a/lib/resque_sliders/helpers/resque_run.rb b/lib/resque_sliders/helpers/resque_run.rb deleted file mode 100755 index 72da1af..0000000 --- a/lib/resque_sliders/helpers/resque_run.rb +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env ruby - -require 'rubygems' -require 'resque' - -require File.expand_path(File.dirname(__FILE__) + "/resque_job") - -Resque.enqueue(Jobs::Stuff, rand(1000)) -Resque.enqueue(Jobs::Things, 3000) -Resque.enqueue(Jobs::Support, rand(1000)) -Resque.enqueue(Jobs::Email, rand(1000)) -Resque.enqueue(Jobs::Notification, rand(1000)) diff --git a/lib/resque_sliders/lib/resque-sliders.rb b/lib/resque_sliders/lib/resque-sliders.rb deleted file mode 100755 index ce4523e..0000000 --- a/lib/resque_sliders/lib/resque-sliders.rb +++ /dev/null @@ -1,9 +0,0 @@ -$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__) + '/../lib')) - -require 'resque' -require 'resque/server' - -require 'resque-sliders/helpers' -require 'resque-sliders/commander' -require 'resque-sliders/server' -require 'resque-sliders/version' diff --git a/lib/resque_sliders/lib/resque-sliders/commander.rb b/lib/resque_sliders/lib/resque-sliders/commander.rb deleted file mode 100755 index 015ff99..0000000 --- a/lib/resque_sliders/lib/resque-sliders/commander.rb +++ /dev/null @@ -1,84 +0,0 @@ -module Resque - module Plugins - module ResqueSliders - class Commander - - include Helpers - - # Hosts that have config data (queues and values), but the host is not running the daemon. - attr_reader :stale_hosts - - def initialize - @host_status = redis_get_hash(host_config_key) - @stale_hosts = Resque.redis.smembers(known_hosts_key) - hosts - end - - # Return Array of currently online hosts - def hosts - Set.new.tap do |l| - @host_status.keys.each do |x| - x = x.split(':') - l << x.first unless %w(reload pause stop).include?(x.last) - end - end.to_a.sort - end - - # Array of all hosts (current + stale) - def all_hosts - (hosts + stale_hosts).sort - end - - # Remove all keys for a host (clean) - def remove_all_host_keys(hostname) - # expensive process O(N) - keys_to_delete = Resque.redis.keys("#{key_prefix}:*").select { |k| name = k.split(':').last; hostname == name } - # look at config hash, remove fields if relate to this hostname - fields_to_delete = redis_get_hash(host_config_key).keys.select { |k| name = k.split(':').first; hostname == name } - # do delete - Resque.redis.del(keys_to_delete) unless keys_to_delete.empty? - redis_del_hash(host_config_key, fields_to_delete) unless fields_to_delete.empty? - del_from_known_hosts(hostname) - end - - # Return current children count or nil if Host hasn't registered itself. - def current_children(host) - @host_status["#{host}:current_children"].to_i if max_children(host) - end - - # Return max children count or nil if Host hasn't registered itself. - def max_children(host) - max = @host_status["#{host}:max_children"].to_i - max == 0 ? nil : max # if Max isn't set its not running - end - - # Override max_children on host (Dangerous!) - def max_children!(host, count) - @hostname = host - register_setting('max_children', count) - end - - # Return Array of queues on host - def queues_on(host) - queue_values(host).keys if all_hosts.include?(host) - end - - # Changes queues to quantiy for host. - # Returns boolean. - def change(host, queue, quantity) - # queue is sanitized by: - # replacing punctuation with spaces, strip end spaces, split on remaining whitespace, and join again on comma. - queue2 = queue.gsub(/['":]/, '').strip.gsub(/\s+/, ',').split(/, */).reject { |x| x.nil? or x.empty? }.join(',') - raise 'Queue Different' unless queue == queue2 - redis_set_hash("#{key_prefix}:#{host}", queue2, quantity) unless queue2.empty? - end - - # Deletes queue for host. - # Returns boolean. - def delete(host, queue) - redis_del_hash("#{key_prefix}:#{host}", queue) - end - - end - end - end -end diff --git a/lib/resque_sliders/lib/resque-sliders/helpers.rb b/lib/resque_sliders/lib/resque-sliders/helpers.rb deleted file mode 100755 index e75f4f7..0000000 --- a/lib/resque_sliders/lib/resque-sliders/helpers.rb +++ /dev/null @@ -1,104 +0,0 @@ -module Resque - module Plugins - module ResqueSliders - module Helpers - - # prefix to all keys our plugin uses in redis - def key_prefix - "plugins:resque-sliders" - end - - # we store everything in this hash - def host_config_key - "#{key_prefix}:host_configs" - end - - # used to keep track of hosts we know about - def known_hosts_key - "#{key_prefix}:known_hosts" - end - - def add_to_known_hosts(hostname) - # add a hostname to the hosts set - Resque.redis.sadd(known_hosts_key, hostname) - end - - def del_from_known_hosts(hostname) - Resque.redis.srem(known_hosts_key, hostname) - end - - def redis_get_hash(key) - Resque.redis.hgetall(key) - end - - def redis_get_hash_field(key, field) - Resque.redis.hget(key, field) - end - - def redis_set_hash(key, field, fvalue) - Resque.redis.hset(key, field, fvalue) == 1 - end - - def redis_del_hash(key, field) - Resque.redis.hdel(key, field) == 1 - end - - # Return Hash: { queue => # } - def queue_values(host) - redis_get_hash("#{key_prefix}:#{host}") - end - - def register_setting(setting, value) - redis_set_hash(host_config_key, "#{@hostname}:#{setting}", value) - end - - def unregister_setting(setting) - redis_del_hash(host_config_key, "#{@hostname}:#{setting}") - end - - # Signal Checking - - # Gets signal field in redis config_key for this host. Don't call directly - def check_signal(host) - sig = caller[0][/`([^']*)'/, 1].gsub('?', '') - raise 'Dont call me that' unless %w(reload pause stop).include?(sig) - if @hostname - # if instance variable set from running daemon, make a freshy - redis_get_hash_field(host_config_key, "#{@hostname}:#{sig}").to_i == 1 - else - # otherwise cache call in a Hash - @host_signal_map ||= {} - @host_signal_map[host] ||= {} - unless @host_signal_map[host].has_key?(sig) - @host_signal_map[host] = {sig => redis_get_hash_field(host_config_key, "#{host}:#{sig}").to_i == 1}.update(@host_signal_map[host]) - end - @host_signal_map[host][sig] - end - end - - def reload?(host) - check_signal(host) - end - - def pause?(host) - check_signal(host) - end - - def stop?(host) - check_signal(host) - end - - # Set signal key given signal, host - def set_signal_flag(sig, host=@hostname) - @hostname ||= host - if sig == 'play' - %w(pause stop).each { |x| unregister_setting(x) } - else - register_setting(sig, 1) - end - end - - end - end - end -end diff --git a/lib/resque_sliders/lib/resque-sliders/kewatcher.rb b/lib/resque_sliders/lib/resque-sliders/kewatcher.rb deleted file mode 100755 index 89841da..0000000 --- a/lib/resque_sliders/lib/resque-sliders/kewatcher.rb +++ /dev/null @@ -1,440 +0,0 @@ -require 'resque' -require 'timeout' -require 'fileutils' - -require 'resque-sliders/helpers' - -module Resque - module Plugins - module ResqueSliders - # KEWatcher class provides a daemon to run on host that are running resque workers. - class KEWatcher - include Helpers - - # Verbosity level (Integer) - attr_accessor :verbosity - - attr_reader :pidfile, :zombie_term_wait, :zombie_kill_wait, :max_children - - # Initialize daemon with options from command-line. - def initialize(options={}) - @verbosity = (options[:verbosity] || 0).to_i # verbosity level - @zombie_term_wait = options[:zombie_term_wait] || 20 # time to wait before TERM - @zombie_kill_wait = ENV['RESQUE_TERM_TIMEOUT'].to_i + @zombie_term_wait unless ENV['RESQUE_TERM_TIMEOUT'].nil? - @zombie_kill_wait ||= options[:zombie_kill_wait] || 60 # time to wait before -9 - @hostile_takeover = options[:force] # kill running kewatcher? - @rakefile = File.expand_path(options[:rakefile]) rescue nil - @rakefile = File.exists?(@rakefile) ? @rakefile : nil if @rakefile - @pidfile = File.expand_path(options[:pidfile]) rescue nil - @pidfile = @pidfile =~ /\.pid$/ ? @pidfile : @pidfile + '.pid' if @pidfile - save_pid! - - @max_children = options[:max_children] || 10 - @hostname = `hostname -s`.chomp.downcase - @pids = Hash.new # init pids array to track running children - @need_queues = Array.new # keep track of pids that are needed - @dead_queues = Array.new # keep track of pids that are dead - @zombie_pids = Hash.new # keep track of zombie's we kill and dont watch(), with elapsed time we've waited for it to die - @async = options[:async] || false # sync and wait by default - @hupped = 0 - - Resque.redis = case options[:config] - when Hash - [options[:config]['host'], options[:config]['port'], options[:config]['db'] || 0].join(':') - else - options[:config] - end - end - - # run the daemon - def run!(interval=0.1) - interval = Float(interval) - if running? - unless @hostile_takeover - puts "Already running. Restart Not Forced exiting..." - exit - end - restart_running! - end - $0 = "KEWatcher: Starting" - startup - - count = 0 - old = 0 # know when to tell redis we have new different current pids - loop do - break if shutdown? - count += 1 - log! ["watching:", @pids.keys.join(', '), "(#{@pids.keys.length})"].delete_if { |x| x == (nil || '') }.join(' ') if count % (10 / interval) == 1 - - tick = count % (20 / interval) == 1 - (log! "checking signals..."; check_signals) if tick - if not (paused? || shutdown?) - queue_diff! if tick # do first and also about every 20 seconds so we can throttle calls to redis - - while @pids.keys.length < @max_children && (@need_queues.length > 0 || @dead_queues.length > 0) - queue = @dead_queues.shift || @need_queues.shift - exec_string = "" - exec_string << 'rake' - exec_string << " -f #{@rakefile}" if @rakefile - exec_string << ' environment' if ENV['RAILS_ENV'] - exec_string << ' resque:work' - env_opts = {"QUEUE" => queue} - if Resque::Version >= '1.22.0' # when API changed for signals - term_timeout = @zombie_kill_wait - @zombie_term_wait - term_timeout = term_timeout > 0 ? term_timeout : 1 - env_opts.merge!({ - 'TERM_CHILD' => '1', - 'RESQUE_TERM_TIMEOUT' => term_timeout.to_s # use new signal handling - }) - end - exec_args = if RUBY_VERSION < '1.9' - [exec_string, env_opts.map {|k,v| "#{k}=#{v}"}].flatten.join(' ') - else - [env_opts, exec_string] # 1.9.x exec - end - pid = fork do - srand # seed - exec(*exec_args) - end - @pids.store(pid, queue) # store pid and queue its running if fork() ? - procline - end - end - - register_setting('current_children', @pids.keys.length) if old != @pids.length - old = @pids.length - - procline if tick - - sleep(interval) # microsleep - kill_zombies! unless shutdown? # need to cleanup ones we've killed - if @hupped > 0 - log "HUP received; purging children..." - signal_hup - do_reload! - @hupped -= 1 - end - - @pids.keys.each do |pid| - begin - # check to see if pid is running, by waiting for it, with a timeout - # Im sure Ruby 1.9 has some better helpers here - Timeout::timeout(interval / 100) { Process.wait(pid) } - rescue Timeout::Error - # Timeout expired, goto next pid - next - rescue Errno::ECHILD - # if no pid exists to wait for, remove it - log! (paused? || shutdown?) ? "#{pid} (#{@pids[pid]}) child died; no one cares..." : "#{pid} (#{@pids[pid]}) child died; spawning another..." - remove pid - break - end - end - end - end - - # Returns PID if already running, false otherwise - def running? - pid = `ps x -o pid,command|grep [K]EWatcher|awk '{print $1}'`.to_i - pid == 0 ? false : pid - end - - private - - # Forces (via signal QUIT) any KEWatcher process running, located by ps and grep - def restart_running! - count = 0 - while pid = running? - (puts "#{pid} wont die; giving up"; exit 2) if count > 6 - count += 1 - if count % 5 == 1 - puts "Killing running KEWatcher: #{pid}" - Process.kill(:TERM, pid) - end - s = 3 * count - puts "Waiting #{s}s for it to die..." - sleep(s) - end - end - - def startup - log! "Found RAILS_ENV=#{ENV['RAILS_ENV']}" if ENV['RAILS_ENV'] - enable_gc_optimizations - register_signal_handlers - clean_signal_settings - register_setting('max_children', @max_children) - add_to_known_hosts(@hostname) - log! "Registered Max Children with Redis" - $stdout.sync = true - end - - def enable_gc_optimizations - if GC.respond_to?(:copy_on_write_friendly=) - GC.copy_on_write_friendly = true - end - end - - def register_signal_handlers - trap('TERM') { shutdown! } - trap('INT') { shutdown! } - - begin - trap('QUIT') { shutdown! } - trap('HUP') { @hupped += 1 } - trap('USR1') { log "USR1 received; killing little children..."; set_signal_flag('stop'); signal_usr1 } - trap('USR2') { log "USR2 received; not making babies"; set_signal_flag('pause'); signal_usr2 } - trap('CONT') { log "CONT received; making babies..."; set_signal_flag('play'); signal_cont } - rescue ArgumentError - warn "Signals QUIT, USR1, USR2, and/or CONT not supported." - end - - log! "Registered signals" - end - - def clean_signal_settings - %w(pause stop reload).each { |x| unregister_setting(x) } - end - - # Check signals, do appropriate thing - def check_signals - if reload?(@hostname) - log ' -> RELOAD from web-ui' - signal_hup - do_reload! - elsif stop?(@hostname) - log ' -> STOPPED from web-ui' if not paused? or @pids.keys.length > 0 - signal_usr1 - elsif pause?(@hostname) - log ' -> PAUSED from web-ui' unless paused? - signal_usr2 - else - log! ' -> Continuing; no signal found' - signal_cont - end - end - - def procline - status ||= 'stopped' if paused? and (@pids.keys.empty? and @zombie_pids.keys.empty?) - status ||= 'paused' if paused? - status = "#{[@pids.keys.length, @zombie_pids.keys.length, status].compact.join('-')}" unless status == 'stopped' - name = "KEWatcher" - pid_str = [] - pid_str << "R:#{@pids.keys.join(',')}" unless @pids.keys.empty? - pid_str << "Z:#{@zombie_pids.keys.join(',')}" unless @zombie_pids.keys.empty? - $0 = "#{name} (#{status}): #{pid_str.join(' ')}" - log! $0 - end - - def queue_diff! - # Forces queue diff - # Overrides what needs to start from Redis - to_start, to_kill = queue_diff - to_kill.each { |pid| remove! pid } - @need_queues = to_start # authoritative answer from redis of what needs to be running - @dead_queues = Array.new - end - - def queue_diff - # Queries Redis to get Hash of what should running - # figures what is running and does a diff - # returns an Array of 2 Arrays: to_start, to_kill - - goal, to_start, to_kill = [], [], [] - queue_values(@hostname).each_pair { |queue,count| goal += [queue] * count.to_i } - - running_queues = @pids.values # check list - goal.each do |q| - if running_queues.include?(q) - # delete from checklist cause its already running - running_queues.delete_at(running_queues.index(q)) - else - # not included in running queue, need to start - to_start << q - end - end - - @pids.dup.each_pair do |k,v| - if running_queues.include?(v) - # whatever is left over in this checklist shouldn't be running - to_kill << k - running_queues.delete_at(running_queues.index(v)) - end - end - - if (to_start.length + @pids.keys.length - to_kill.length) > @max_children - # if to_start with existing minus whats to be killed is still greater than max children - log "WARN: need to start too many children, please raise max children" - end - - kill_queues = to_kill.map { |x| @pids[x] } - log! ["GOTTA START:", to_start.map { |x| "#{x} (#{to_start.count(x)})" }.uniq.join(', '), "= #{to_start.length}"].delete_if { |x| x == (nil || '') }.join(' ') - log! ["GOTTA KILL:", kill_queues.map { |x| "#{x} (#{kill_queues.count(x)})" }.uniq.join(', '), "= #{to_kill.length}"].delete_if { |x| x == (nil || '') }.join(' ') - - [to_start, to_kill] # return whats left - end - - # removes pid completely, ignores its queues - def remove!(pid) - kill_child pid - @pids.delete(pid) - procline - end - - # remove pid, and respawn same queues - def remove(pid) - @dead_queues.unshift(@pids[pid]) # keep track of queues that pid was running, put it at front of list - @pids.delete(pid) - procline - end - - def do_reload! - while not @async and @zombie_pids.length > 0 - kill_zombies! - end - end - - def shutdown! - log "Exiting..." - @shutdown = true - kill_children - while @zombie_pids.keys.length > 0 - kill_zombies! - end - %w(current max).each { |x| unregister_setting("#{x}_children") } - log! "Unregistered Max Children" - Process.waitall() - remove_pidfile! - end - - def shutdown? - @shutdown - end - - def paused? - @paused - end - - # Reload - def signal_hup - clean_signal_settings - kill_children - @paused = false # unpause after kill (restart child) - end - - # Stop - def signal_usr1 - kill_children - @paused = true # pause after kill cause we're paused - end - - # Pause - def signal_usr2 - @paused = true # paused again - end - - # Continue - def signal_cont - @paused = false # unpause - end - - def kill_zombies! - return if @zombie_pids.empty? - local_zombies = @zombie_pids.dup - to_delete = [] - local_zombies.each do |pid,kill_data| - begin - when_killed, times_killed = kill_data - elapsed = Time.now - when_killed - sig = if elapsed >= @zombie_term_wait and times_killed == 1 - :TERM - elsif elapsed >= @zombie_kill_wait and not Resque::Version >= '1.22.0' - :KILL - else - nil - end - unless sig.nil? - log "Waited more than #{@zombie_term_wait} seconds for #{pid}. Sending #{sig}..." - Process.kill(sig, pid) - @zombie_pids.merge!({pid => [when_killed, times_killed + 1]}) - end - wait = !@async ? (@zombie_term_wait - elapsed) / @zombie_pids.length : 0.01 - wait = wait > 0 ? wait : 0.01 - # Issue wait() to make sure pid isn't forgotten - Timeout::timeout(wait) { Process.wait(pid) } - to_delete << pid - rescue Timeout::Error - # waited too long so just catch and ignore, and continue - rescue Errno::ESRCH, Errno::ECHILD # child is gone - to_delete << pid - end - end - to_delete.each { |pid| @zombie_pids.delete(pid) } - end - - def kill_child(pid) - begin - Process.kill(:QUIT, pid) # try graceful shutdown - log! "Child #{pid} killed. (#{@pids.keys.length-1})" - rescue Object => e # dunno what this does but it works; dont know exception - log! "Child #{pid} already dead, sad day. (#{@pids.keys.length-1}) #{e}" - ensure - # Keep track of ones we've killed - @zombie_pids[pid] = [Time.now, 1] # set to current time, killed # - end - end - - def kill_children - @pids.dup.keys.each do |pid| - kill_child pid - remove pid - end - end - - - def log(message) - if verbosity == 1 - puts "* #{message}" - elsif verbosity > 1 - time = Time.now.strftime('%H:%M:%S %Y-%m-%d') - puts "*** [#{time}] #$$: #{message}" - end - end - - def log!(message) - log message if verbosity > 1 - end - - def save_pid! - if @pidfile - begin - log "Saving pid to => #{@pidfile}" - File.open(@pidfile, 'w') { |f| f.write(Process.pid) } - rescue Errno::EACCES => e - puts "Cannot write pidfile => #{e}" - exit 1 - rescue Errno::ENOENT => e - dir = File.dirname(@pidfile) - begin - log! "#{dir} doesnt exist; Creating it..." - FileUtils.mkdir_p(dir) - rescue Errno::EACCES => e - puts "Cannot create directory => #{e}" - exit 1 - end - begin - save_pid! # after creating dir, do save again - rescue # rescue anything else to stop loop - exit 2 - end - end - end - end - - def remove_pidfile! - File.exists?(@pidfile) && File.delete(@pidfile) if @pidfile - end - - end - end - end -end diff --git a/lib/resque_sliders/lib/resque-sliders/server.rb b/lib/resque_sliders/lib/resque-sliders/server.rb deleted file mode 100755 index 4b00365..0000000 --- a/lib/resque_sliders/lib/resque-sliders/server.rb +++ /dev/null @@ -1,101 +0,0 @@ -module Resque - module Plugins - module ResqueSliders - module Server - - VIEW_PATH = File.join(File.dirname(__FILE__), 'server', 'views') - PUBLIC_PATH = File.join(File.dirname(__FILE__), 'server', 'public') - - def self.registered(app) - require 'json' - - app.get '/sliders' do - key = params.keys.first - if %w(img css js).include? key - public_view(params[key], key == 'img' ? 'images' : key) - else - @sliders = Commander.new - redirect url_path("/sliders/#{@sliders.all_hosts.first}") if @sliders.all_hosts.length == 1 - slider_view :index - end - end - - app.get '/sliders/:host' do - @sliders = Commander.new - slider_view :index - end - - app.post '/sliders/:host' do - signals = params.reject { |x,y| x unless %w(pause stop play reload).include? x.to_s and y } - if params[:quantity] && params[:queue] - sliders = Commander.new - queue = params[:queue].split.first - quantity = params[:quantity].to_i - if quantity.zero? - sliders.delete(params[:host], queue) - else - sliders.change(params[:host], queue, quantity) - end - elsif signals.length == 1 - sliders = Commander.new - sig = signals.keys.first.to_s - sliders.set_signal_flag(sig, params[:host]) - content_type :json - {:signal => sig, :host => params[:host]}.to_json - end - end - - # we need the ability to remove old hosts - app.delete '/sliders/:host' do - Commander.new.remove_all_host_keys(params[:host]) - end - - app.helpers do - def slider_view(filename, options={}, locals={}) - erb(File.read(File.join(VIEW_PATH, "#{filename}.erb")), options, locals) - end - - def public_view(filename, dir='') - file = File.join(PUBLIC_PATH, dir, filename) - begin - cache_control :public, :max_age => 1800 - send_file file - rescue Errno::ENOENT - 404 - end - end - - def daemon_buttons(host, list=true) - html_out = [] - icon_base = 'ui-icon ui-corner-all ui-state-default' - case - when @sliders.reload?(host) - %w(pause stop alert) - when (@sliders.pause?(host) or @sliders.stop?(host)) - %w(play stop refresh) - else - %w(pause stop refresh) - end.each do |i| - id = "#{host}:#{i.upcase}" - klass = "#{icon_base} ui-icon-#{i}" - klass += ' corner' unless list - html_out << "" - end - if list - '
    • ' + html_out.join("
    • ") + '
    • ' - else - html_out.reverse.join - end - end - end - - app.tabs << "Sliders" - - end - - end - end - end -end - -Resque::Server.register Resque::Plugins::ResqueSliders::Server diff --git a/lib/resque_sliders/lib/resque-sliders/server/public/css/jqueryui-1.8.16/blitzer/jquery-ui.custom.css b/lib/resque_sliders/lib/resque-sliders/server/public/css/jqueryui-1.8.16/blitzer/jquery-ui.custom.css deleted file mode 100755 index f99fa81..0000000 --- a/lib/resque_sliders/lib/resque-sliders/server/public/css/jqueryui-1.8.16/blitzer/jquery-ui.custom.css +++ /dev/null @@ -1,568 +0,0 @@ -/* - * jQuery UI CSS Framework 1.8.16 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Theming/API - */ - -/* Layout helpers -----------------------------------*/ -.ui-helper-hidden { display: none; } -.ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); } -.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; } -.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } -.ui-helper-clearfix { display: inline-block; } -/* required comment for clearfix to work in Opera \*/ -* html .ui-helper-clearfix { height:1%; } -.ui-helper-clearfix { display:block; } -/* end clearfix */ -.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); } - - -/* Interaction Cues -----------------------------------*/ -.ui-state-disabled { cursor: default !important; } - - -/* Icons -----------------------------------*/ - -/* states and images */ -.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; } - - -/* Misc visuals -----------------------------------*/ - -/* Overlays */ -.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } - - -/* - * jQuery UI CSS Framework 1.8.16 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Theming/API - * - * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Arial,sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=cc0000&bgTextureHeader=03_highlight_soft.png&bgImgOpacityHeader=15&borderColorHeader=e3a1a1&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=ffffff&bgTextureContent=01_flat.png&bgImgOpacityContent=75&borderColorContent=eeeeee&fcContent=333333&iconColorContent=cc0000&bgColorDefault=eeeeee&bgTextureDefault=04_highlight_hard.png&bgImgOpacityDefault=100&borderColorDefault=d8dcdf&fcDefault=004276&iconColorDefault=cc0000&bgColorHover=f6f6f6&bgTextureHover=04_highlight_hard.png&bgImgOpacityHover=100&borderColorHover=cdd5da&fcHover=111111&iconColorHover=cc0000&bgColorActive=ffffff&bgTextureActive=01_flat.png&bgImgOpacityActive=65&borderColorActive=eeeeee&fcActive=cc0000&iconColorActive=cc0000&bgColorHighlight=fbf8ee&bgTextureHighlight=02_glass.png&bgImgOpacityHighlight=55&borderColorHighlight=fcd3a1&fcHighlight=444444&iconColorHighlight=004276&bgColorError=f3d8d8&bgTextureError=08_diagonals_thick.png&bgImgOpacityError=75&borderColorError=cc0000&fcError=2e2e2e&iconColorError=cc0000&bgColorOverlay=a6a6a6&bgTextureOverlay=09_dots_small.png&bgImgOpacityOverlay=65&opacityOverlay=40&bgColorShadow=333333&bgTextureShadow=01_flat.png&bgImgOpacityShadow=0&opacityShadow=10&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px - */ - - -/* Component containers -----------------------------------*/ -.ui-widget { font-family: Arial,sans-serif; font-size: 1.1em; } -.ui-widget .ui-widget { font-size: 1em; } -.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Arial,sans-serif; font-size: 1em; } -.ui-widget-content { border: 1px solid #eeeeee; background: #ffffff url(?img=ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x; color: #333333; } -.ui-widget-content a { color: #333333; } -.ui-widget-header { border: 1px solid #e3a1a1; background: #cc0000 url(?img=ui-bg_highlight-soft_15_cc0000_1x100.png) 50% 50% repeat-x; color: #ffffff; font-weight: bold; } -.ui-widget-header a { color: #ffffff; } - -/* Interaction states -----------------------------------*/ -.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d8dcdf; background: #eeeeee url(?img=ui-bg_highlight-hard_100_eeeeee_1x100.png) 50% 50% repeat-x; font-weight: bold; color: #004276; } -.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #004276; text-decoration: none; } -.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #cdd5da; background: #f6f6f6 url(?img=ui-bg_highlight-hard_100_f6f6f6_1x100.png) 50% 50% repeat-x; font-weight: bold; color: #111111; } -.ui-state-hover a, .ui-state-hover a:hover { color: #111111; text-decoration: none; } -.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #eeeeee; background: #ffffff url(?img=ui-bg_flat_65_ffffff_40x100.png) 50% 50% repeat-x; font-weight: bold; color: #cc0000; } -.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #cc0000; text-decoration: none; } -.ui-widget :active { outline: none; } - -/* Interaction Cues -----------------------------------*/ -.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fcd3a1; background: #fbf8ee url(?img=ui-bg_glass_55_fbf8ee_1x400.png) 50% 50% repeat-x; color: #444444; } -.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #444444; } -.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cc0000; background: #f3d8d8 url(?img=ui-bg_diagonals-thick_75_f3d8d8_40x40.png) 50% 50% repeat; color: #2e2e2e; } -.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #2e2e2e; } -.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #2e2e2e; } -.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; } -.ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; } -.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; } - -/* Icons -----------------------------------*/ - -/* states and images */ -.ui-icon { width: 16px; height: 16px; background-image: url(?img=ui-icons_cc0000_256x240.png); } -.ui-widget-content .ui-icon {background-image: url(?img=ui-icons_cc0000_256x240.png); } -.ui-widget-header .ui-icon {background-image: url(?img=ui-icons_ffffff_256x240.png); } -.ui-state-default .ui-icon { background-image: url(?img=ui-icons_cc0000_256x240.png); } -.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(?img=ui-icons_cc0000_256x240.png); } -.ui-state-active .ui-icon {background-image: url(?img=ui-icons_cc0000_256x240.png); } -.ui-state-highlight .ui-icon {background-image: url(?img=ui-icons_004276_256x240.png); } -.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(?img=ui-icons_cc0000_256x240.png); } - -/* positioning */ -.ui-icon-carat-1-n { background-position: 0 0; } -.ui-icon-carat-1-ne { background-position: -16px 0; } -.ui-icon-carat-1-e { background-position: -32px 0; } -.ui-icon-carat-1-se { background-position: -48px 0; } -.ui-icon-carat-1-s { background-position: -64px 0; } -.ui-icon-carat-1-sw { background-position: -80px 0; } -.ui-icon-carat-1-w { background-position: -96px 0; } -.ui-icon-carat-1-nw { background-position: -112px 0; } -.ui-icon-carat-2-n-s { background-position: -128px 0; } -.ui-icon-carat-2-e-w { background-position: -144px 0; } -.ui-icon-triangle-1-n { background-position: 0 -16px; } -.ui-icon-triangle-1-ne { background-position: -16px -16px; } -.ui-icon-triangle-1-e { background-position: -32px -16px; } -.ui-icon-triangle-1-se { background-position: -48px -16px; } -.ui-icon-triangle-1-s { background-position: -64px -16px; } -.ui-icon-triangle-1-sw { background-position: -80px -16px; } -.ui-icon-triangle-1-w { background-position: -96px -16px; } -.ui-icon-triangle-1-nw { background-position: -112px -16px; } -.ui-icon-triangle-2-n-s { background-position: -128px -16px; } -.ui-icon-triangle-2-e-w { background-position: -144px -16px; } -.ui-icon-arrow-1-n { background-position: 0 -32px; } -.ui-icon-arrow-1-ne { background-position: -16px -32px; } -.ui-icon-arrow-1-e { background-position: -32px -32px; } -.ui-icon-arrow-1-se { background-position: -48px -32px; } -.ui-icon-arrow-1-s { background-position: -64px -32px; } -.ui-icon-arrow-1-sw { background-position: -80px -32px; } -.ui-icon-arrow-1-w { background-position: -96px -32px; } -.ui-icon-arrow-1-nw { background-position: -112px -32px; } -.ui-icon-arrow-2-n-s { background-position: -128px -32px; } -.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } -.ui-icon-arrow-2-e-w { background-position: -160px -32px; } -.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } -.ui-icon-arrowstop-1-n { background-position: -192px -32px; } -.ui-icon-arrowstop-1-e { background-position: -208px -32px; } -.ui-icon-arrowstop-1-s { background-position: -224px -32px; } -.ui-icon-arrowstop-1-w { background-position: -240px -32px; } -.ui-icon-arrowthick-1-n { background-position: 0 -48px; } -.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } -.ui-icon-arrowthick-1-e { background-position: -32px -48px; } -.ui-icon-arrowthick-1-se { background-position: -48px -48px; } -.ui-icon-arrowthick-1-s { background-position: -64px -48px; } -.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } -.ui-icon-arrowthick-1-w { background-position: -96px -48px; } -.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } -.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } -.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } -.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } -.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } -.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } -.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } -.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } -.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } -.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } -.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } -.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } -.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } -.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } -.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } -.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } -.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } -.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } -.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } -.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } -.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } -.ui-icon-arrow-4 { background-position: 0 -80px; } -.ui-icon-arrow-4-diag { background-position: -16px -80px; } -.ui-icon-extlink { background-position: -32px -80px; } -.ui-icon-newwin { background-position: -48px -80px; } -.ui-icon-refresh { background-position: -64px -80px; } -.ui-icon-shuffle { background-position: -80px -80px; } -.ui-icon-transfer-e-w { background-position: -96px -80px; } -.ui-icon-transferthick-e-w { background-position: -112px -80px; } -.ui-icon-folder-collapsed { background-position: 0 -96px; } -.ui-icon-folder-open { background-position: -16px -96px; } -.ui-icon-document { background-position: -32px -96px; } -.ui-icon-document-b { background-position: -48px -96px; } -.ui-icon-note { background-position: -64px -96px; } -.ui-icon-mail-closed { background-position: -80px -96px; } -.ui-icon-mail-open { background-position: -96px -96px; } -.ui-icon-suitcase { background-position: -112px -96px; } -.ui-icon-comment { background-position: -128px -96px; } -.ui-icon-person { background-position: -144px -96px; } -.ui-icon-print { background-position: -160px -96px; } -.ui-icon-trash { background-position: -176px -96px; } -.ui-icon-locked { background-position: -192px -96px; } -.ui-icon-unlocked { background-position: -208px -96px; } -.ui-icon-bookmark { background-position: -224px -96px; } -.ui-icon-tag { background-position: -240px -96px; } -.ui-icon-home { background-position: 0 -112px; } -.ui-icon-flag { background-position: -16px -112px; } -.ui-icon-calendar { background-position: -32px -112px; } -.ui-icon-cart { background-position: -48px -112px; } -.ui-icon-pencil { background-position: -64px -112px; } -.ui-icon-clock { background-position: -80px -112px; } -.ui-icon-disk { background-position: -96px -112px; } -.ui-icon-calculator { background-position: -112px -112px; } -.ui-icon-zoomin { background-position: -128px -112px; } -.ui-icon-zoomout { background-position: -144px -112px; } -.ui-icon-search { background-position: -160px -112px; } -.ui-icon-wrench { background-position: -176px -112px; } -.ui-icon-gear { background-position: -192px -112px; } -.ui-icon-heart { background-position: -208px -112px; } -.ui-icon-star { background-position: -224px -112px; } -.ui-icon-link { background-position: -240px -112px; } -.ui-icon-cancel { background-position: 0 -128px; } -.ui-icon-plus { background-position: -16px -128px; } -.ui-icon-plusthick { background-position: -32px -128px; } -.ui-icon-minus { background-position: -48px -128px; } -.ui-icon-minusthick { background-position: -64px -128px; } -.ui-icon-close { background-position: -80px -128px; } -.ui-icon-closethick { background-position: -96px -128px; } -.ui-icon-key { background-position: -112px -128px; } -.ui-icon-lightbulb { background-position: -128px -128px; } -.ui-icon-scissors { background-position: -144px -128px; } -.ui-icon-clipboard { background-position: -160px -128px; } -.ui-icon-copy { background-position: -176px -128px; } -.ui-icon-contact { background-position: -192px -128px; } -.ui-icon-image { background-position: -208px -128px; } -.ui-icon-video { background-position: -224px -128px; } -.ui-icon-script { background-position: -240px -128px; } -.ui-icon-alert { background-position: 0 -144px; } -.ui-icon-info { background-position: -16px -144px; } -.ui-icon-notice { background-position: -32px -144px; } -.ui-icon-help { background-position: -48px -144px; } -.ui-icon-check { background-position: -64px -144px; } -.ui-icon-bullet { background-position: -80px -144px; } -.ui-icon-radio-off { background-position: -96px -144px; } -.ui-icon-radio-on { background-position: -112px -144px; } -.ui-icon-pin-w { background-position: -128px -144px; } -.ui-icon-pin-s { background-position: -144px -144px; } -.ui-icon-play { background-position: 0 -160px; } -.ui-icon-pause { background-position: -16px -160px; } -.ui-icon-seek-next { background-position: -32px -160px; } -.ui-icon-seek-prev { background-position: -48px -160px; } -.ui-icon-seek-end { background-position: -64px -160px; } -.ui-icon-seek-start { background-position: -80px -160px; } -/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ -.ui-icon-seek-first { background-position: -80px -160px; } -.ui-icon-stop { background-position: -96px -160px; } -.ui-icon-eject { background-position: -112px -160px; } -.ui-icon-volume-off { background-position: -128px -160px; } -.ui-icon-volume-on { background-position: -144px -160px; } -.ui-icon-power { background-position: 0 -176px; } -.ui-icon-signal-diag { background-position: -16px -176px; } -.ui-icon-signal { background-position: -32px -176px; } -.ui-icon-battery-0 { background-position: -48px -176px; } -.ui-icon-battery-1 { background-position: -64px -176px; } -.ui-icon-battery-2 { background-position: -80px -176px; } -.ui-icon-battery-3 { background-position: -96px -176px; } -.ui-icon-circle-plus { background-position: 0 -192px; } -.ui-icon-circle-minus { background-position: -16px -192px; } -.ui-icon-circle-close { background-position: -32px -192px; } -.ui-icon-circle-triangle-e { background-position: -48px -192px; } -.ui-icon-circle-triangle-s { background-position: -64px -192px; } -.ui-icon-circle-triangle-w { background-position: -80px -192px; } -.ui-icon-circle-triangle-n { background-position: -96px -192px; } -.ui-icon-circle-arrow-e { background-position: -112px -192px; } -.ui-icon-circle-arrow-s { background-position: -128px -192px; } -.ui-icon-circle-arrow-w { background-position: -144px -192px; } -.ui-icon-circle-arrow-n { background-position: -160px -192px; } -.ui-icon-circle-zoomin { background-position: -176px -192px; } -.ui-icon-circle-zoomout { background-position: -192px -192px; } -.ui-icon-circle-check { background-position: -208px -192px; } -.ui-icon-circlesmall-plus { background-position: 0 -208px; } -.ui-icon-circlesmall-minus { background-position: -16px -208px; } -.ui-icon-circlesmall-close { background-position: -32px -208px; } -.ui-icon-squaresmall-plus { background-position: -48px -208px; } -.ui-icon-squaresmall-minus { background-position: -64px -208px; } -.ui-icon-squaresmall-close { background-position: -80px -208px; } -.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } -.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } -.ui-icon-grip-solid-vertical { background-position: -32px -224px; } -.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } -.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } -.ui-icon-grip-diagonal-se { background-position: -80px -224px; } - - -/* Misc visuals -----------------------------------*/ - -/* Corner radius */ -.ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; -khtml-border-top-left-radius: 6px; border-top-left-radius: 6px; } -.ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; -khtml-border-top-right-radius: 6px; border-top-right-radius: 6px; } -.ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { -moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; -khtml-border-bottom-left-radius: 6px; border-bottom-left-radius: 6px; } -.ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { -moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; -khtml-border-bottom-right-radius: 6px; border-bottom-right-radius: 6px; } - -/* Overlays */ -.ui-widget-overlay { background: #a6a6a6 url(?img=ui-bg_dots-small_65_a6a6a6_2x2.png) 50% 50% repeat; opacity: .40;filter:Alpha(Opacity=40); } -.ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #333333 url(?img=ui-bg_flat_0_333333_40x100.png) 50% 50% repeat-x; opacity: .10;filter:Alpha(Opacity=10); -moz-border-radius: 8px; -khtml-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; }/* - * jQuery UI Resizable 1.8.16 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Resizable#theming - */ -.ui-resizable { position: relative;} -.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block; } -.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; } -.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; } -.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; } -.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; } -.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; } -.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; } -.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; } -.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; } -.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/* - * jQuery UI Selectable 1.8.16 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Selectable#theming - */ -.ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; } -/* - * jQuery UI Accordion 1.8.16 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Accordion#theming - */ -/* IE/Win - Fix animation bug - #4615 */ -.ui-accordion { width: 100%; } -.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; } -.ui-accordion .ui-accordion-li-fix { display: inline; } -.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; } -.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; } -.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; } -.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; } -.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; } -.ui-accordion .ui-accordion-content-active { display: block; } -/* - * jQuery UI Autocomplete 1.8.16 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Autocomplete#theming - */ -.ui-autocomplete { position: absolute; cursor: default; } - -/* workarounds */ -* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */ - -/* - * jQuery UI Menu 1.8.16 - * - * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Menu#theming - */ -.ui-menu { - list-style:none; - padding: 2px; - margin: 0; - display:block; - float: left; -} -.ui-menu .ui-menu { - margin-top: -3px; -} -.ui-menu .ui-menu-item { - margin:0; - padding: 0; - zoom: 1; - float: left; - clear: left; - width: 100%; -} -.ui-menu .ui-menu-item a { - text-decoration:none; - display:block; - padding:.2em .4em; - line-height:1.5; - zoom:1; -} -.ui-menu .ui-menu-item a.ui-state-hover, -.ui-menu .ui-menu-item a.ui-state-active { - font-weight: normal; - margin: -1px; -} -/* - * jQuery UI Button 1.8.16 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Button#theming - */ -.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */ -.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */ -button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */ -.ui-button-icons-only { width: 3.4em; } -button.ui-button-icons-only { width: 3.7em; } - -/*button text element */ -.ui-button .ui-button-text { display: block; line-height: 1.4; } -.ui-button-text-only .ui-button-text { padding: .4em 1em; } -.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; } -.ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; } -.ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; } -.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; } -/* no icon support for input elements, provide padding by default */ -input.ui-button { padding: .4em 1em; } - -/*button icon element(s) */ -.ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; } -.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; } -.ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; } -.ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; } -.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; } - -/*button sets*/ -.ui-buttonset { margin-right: 7px; } -.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; } - -/* workarounds */ -button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */ -/* - * jQuery UI Dialog 1.8.16 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Dialog#theming - */ -.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; } -.ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative; } -.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; } -.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; } -.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; } -.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; } -.ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; } -.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; } -.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; } -.ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; } -.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; } -.ui-draggable .ui-dialog-titlebar { cursor: move; } -/* - * jQuery UI Slider 1.8.16 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Slider#theming - */ -.ui-slider { position: relative; text-align: left; } -.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; } -.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; } - -.ui-slider-horizontal { height: .8em; } -.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; } -.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; } -.ui-slider-horizontal .ui-slider-range-min { left: 0; } -.ui-slider-horizontal .ui-slider-range-max { right: 0; } - -.ui-slider-vertical { width: .8em; height: 100px; } -.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; } -.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; } -.ui-slider-vertical .ui-slider-range-min { bottom: 0; } -.ui-slider-vertical .ui-slider-range-max { top: 0; }/* - * jQuery UI Tabs 1.8.16 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Tabs#theming - */ -.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ -.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; } -.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; } -.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; } -.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; } -.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; } -.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */ -.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; } -.ui-tabs .ui-tabs-hide { display: none !important; } -/* - * jQuery UI Datepicker 1.8.16 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Datepicker#theming - */ -.ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; } -.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; } -.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; } -.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; } -.ui-datepicker .ui-datepicker-prev { left:2px; } -.ui-datepicker .ui-datepicker-next { right:2px; } -.ui-datepicker .ui-datepicker-prev-hover { left:1px; } -.ui-datepicker .ui-datepicker-next-hover { right:1px; } -.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; } -.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; } -.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; } -.ui-datepicker select.ui-datepicker-month-year {width: 100%;} -.ui-datepicker select.ui-datepicker-month, -.ui-datepicker select.ui-datepicker-year { width: 49%;} -.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; } -.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; } -.ui-datepicker td { border: 0; padding: 1px; } -.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; } -.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; } -.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; } -.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; } - -/* with multiple calendars */ -.ui-datepicker.ui-datepicker-multi { width:auto; } -.ui-datepicker-multi .ui-datepicker-group { float:left; } -.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; } -.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; } -.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; } -.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; } -.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; } -.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; } -.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; } -.ui-datepicker-row-break { clear:both; width:100%; font-size:0em; } - -/* RTL support */ -.ui-datepicker-rtl { direction: rtl; } -.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; } -.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; } -.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; } -.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; } -.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; } -.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; } -.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; } -.ui-datepicker-rtl .ui-datepicker-group { float:right; } -.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; } -.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; } - -/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */ -.ui-datepicker-cover { - display: none; /*sorry for IE5*/ - display/**/: block; /*sorry for IE5*/ - position: absolute; /*must have*/ - z-index: -1; /*must have*/ - filter: mask(); /*must have*/ - top: -4px; /*must have*/ - left: -4px; /*must have*/ - width: 200px; /*must have*/ - height: 200px; /*must have*/ -}/* - * jQuery UI Progressbar 1.8.16 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Progressbar#theming - */ -.ui-progressbar { height:2em; text-align: left; } -.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; } diff --git a/lib/resque_sliders/lib/resque-sliders/server/public/css/sliders.css b/lib/resque_sliders/lib/resque-sliders/server/public/css/sliders.css deleted file mode 100755 index 3325fd4..0000000 --- a/lib/resque_sliders/lib/resque-sliders/server/public/css/sliders.css +++ /dev/null @@ -1,32 +0,0 @@ -.icons { - float: left; - margin: 0 2.5px 0 2.5px; -} -.corner { - float: right; - margin: 2px 2.5px 0 2.5px; -} -#sliders { - padding: 10px; - width: 600px; - margin: 0px 20px; -} -#sliders > p { - padding: 0px; - margin: 10px 0px; -} -#sliders form { - padding: 10px 0px; - float: left; - margin: 0px auto; -} -.values,#max,#total { - border: 0; - color: #CE1212; - font-weight: bold; - font-size: 105%; -} -.slider { - width: 500px; - margin: 0px 20px; -} diff --git a/lib/resque_sliders/lib/resque-sliders/server/public/images/ui-bg_diagonals-thick_75_f3d8d8_40x40.png b/lib/resque_sliders/lib/resque-sliders/server/public/images/ui-bg_diagonals-thick_75_f3d8d8_40x40.png deleted file mode 100755 index 13a229fbd619180ea24cfdb8f30dbe95cddd63a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 256 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dE$30yfLn2z=UU%ebHV|ofxPM{x z`+6t-2g_zV?cO+H*-7uDDLhZl2BrKEF*);g<2wCGHrsXgewqAxQ^}wAYo_hLqmp0p^NY}(hv&?JUSjZc^>bP0l+XkKhP7#@ diff --git a/lib/resque_sliders/lib/resque-sliders/server/public/images/ui-bg_dots-small_65_a6a6a6_2x2.png b/lib/resque_sliders/lib/resque-sliders/server/public/images/ui-bg_dots-small_65_a6a6a6_2x2.png deleted file mode 100755 index b2d1a1ef3a0659d21c5bf42df62b2a6c87ad53e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 83 zcmeAS@N?(olHy`uVBq!ia0vp^Od!m`1|*BN@u~nRDNh&25RRG2G23!(*0TYD8iN1x91EQ4=4yQ7#_Iv z`+As4$%zYm;;c7~Kd+Iuj%U9o62cnl7#bi-T}qs{k}2VRN1x91EQ4=4yQYz+E8 zPo9&<{J;c_6SHRil>2s{Zw^OT)6@jj2u|u!(plXsM>LJD`vD!n;OXk;vd$@?2>^GI BH@yG= diff --git a/lib/resque_sliders/lib/resque-sliders/server/public/images/ui-bg_flat_75_ffffff_40x100.png b/lib/resque_sliders/lib/resque-sliders/server/public/images/ui-bg_flat_75_ffffff_40x100.png deleted file mode 100755 index ac8b229af950c29356abf64a6c4aa894575445f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F!3HG1q!d*FsY*{5$B>N1x91EQ4=4yQYz+E8 zPo9&<{J;c_6SHRil>2s{Zw^OT)6@jj2u|u!(plXsM>LJD`vD!n;OXk;vd$@?2>^GI BH@yG= diff --git a/lib/resque_sliders/lib/resque-sliders/server/public/images/ui-bg_glass_55_fbf8ee_1x400.png b/lib/resque_sliders/lib/resque-sliders/server/public/images/ui-bg_glass_55_fbf8ee_1x400.png deleted file mode 100755 index fb056ebe8bf69a6760bdf45e382854d343d36b21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAGVZ#9R3S1;RXC978O6-%i=c+h8ETeBSMi zy|${*Lro@S6+NfoP5U;k*?y)}F13MWm6V$_o4=X*{Fr-%S93n+eA0NA6=B4t8a4gU sA^Ujo+PLbAl~b3zS5v+A{J4kB2~MSrU+M(Bfi^IBy85}Sb4q9e09p7i@Bjb+ diff --git a/lib/resque_sliders/lib/resque-sliders/server/public/images/ui-bg_highlight-hard_100_eeeeee_1x100.png b/lib/resque_sliders/lib/resque-sliders/server/public/images/ui-bg_highlight-hard_100_eeeeee_1x100.png deleted file mode 100755 index 7c77ea7ed16cccb199ed82d4145a788ac8396686..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 94 zcmeAS@N?(olHy`uVBq!ia0vp^j6j^i!3HGVb)pi0l&YtTV~E7m3f3H_#V`FPe n^!W4tzr3}$G`Dnlg%E@O4&fD5bIWf7)iQXx`njxgN@xNAhL{*f diff --git a/lib/resque_sliders/lib/resque-sliders/server/public/images/ui-bg_highlight-soft_15_cc0000_1x100.png b/lib/resque_sliders/lib/resque-sliders/server/public/images/ui-bg_highlight-soft_15_cc0000_1x100.png deleted file mode 100755 index 834797a8bf999f510e08932375b8f58d34e4dc92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 108 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 diff --git a/lib/resque_sliders/lib/resque-sliders/server/public/images/ui-icons_cc0000_256x240.png b/lib/resque_sliders/lib/resque-sliders/server/public/images/ui-icons_cc0000_256x240.png deleted file mode 100755 index 03a953b0dd87d7a6893b2d150ebc1beab6d8a384..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4369 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 diff --git a/lib/resque_sliders/lib/resque-sliders/server/public/js/jquery-ui-1.8.16.custom.min.js b/lib/resque_sliders/lib/resque-sliders/server/public/js/jquery-ui-1.8.16.custom.min.js deleted file mode 100755 index 14c9064..0000000 --- a/lib/resque_sliders/lib/resque-sliders/server/public/js/jquery-ui-1.8.16.custom.min.js +++ /dev/null @@ -1,791 +0,0 @@ -/*! - * jQuery UI 1.8.16 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI - */ -(function(c,j){function k(a,b){var d=a.nodeName.toLowerCase();if("area"===d){b=a.parentNode;d=b.name;if(!a.href||!d||b.nodeName.toLowerCase()!=="map")return false;a=c("img[usemap=#"+d+"]")[0];return!!a&&l(a)}return(/input|select|textarea|button|object/.test(d)?!a.disabled:"a"==d?a.href||b:b)&&l(a)}function l(a){return!c(a).parents().andSelf().filter(function(){return c.curCSS(this,"visibility")==="hidden"||c.expr.filters.hidden(this)}).length}c.ui=c.ui||{};if(!c.ui.version){c.extend(c.ui,{version:"1.8.16", -keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});c.fn.extend({propAttr:c.fn.prop||c.fn.attr,_focus:c.fn.focus,focus:function(a,b){return typeof a==="number"?this.each(function(){var d= -this;setTimeout(function(){c(d).focus();b&&b.call(d)},a)}):this._focus.apply(this,arguments)},scrollParent:function(){var a;a=c.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(c.curCSS(this,"position",1))&&/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(c.curCSS(this, -"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!a.length?c(document):a},zIndex:function(a){if(a!==j)return this.css("zIndex",a);if(this.length){a=c(this[0]);for(var b;a.length&&a[0]!==document;){b=a.css("position");if(b==="absolute"||b==="relative"||b==="fixed"){b=parseInt(a.css("zIndex"),10);if(!isNaN(b)&&b!==0)return b}a=a.parent()}}return 0},disableSelection:function(){return this.bind((c.support.selectstart?"selectstart": -"mousedown")+".ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});c.each(["Width","Height"],function(a,b){function d(f,g,m,n){c.each(e,function(){g-=parseFloat(c.curCSS(f,"padding"+this,true))||0;if(m)g-=parseFloat(c.curCSS(f,"border"+this+"Width",true))||0;if(n)g-=parseFloat(c.curCSS(f,"margin"+this,true))||0});return g}var e=b==="Width"?["Left","Right"]:["Top","Bottom"],h=b.toLowerCase(),i={innerWidth:c.fn.innerWidth,innerHeight:c.fn.innerHeight, -outerWidth:c.fn.outerWidth,outerHeight:c.fn.outerHeight};c.fn["inner"+b]=function(f){if(f===j)return i["inner"+b].call(this);return this.each(function(){c(this).css(h,d(this,f)+"px")})};c.fn["outer"+b]=function(f,g){if(typeof f!=="number")return i["outer"+b].call(this,f);return this.each(function(){c(this).css(h,d(this,f,true,g)+"px")})}});c.extend(c.expr[":"],{data:function(a,b,d){return!!c.data(a,d[3])},focusable:function(a){return k(a,!isNaN(c.attr(a,"tabindex")))},tabbable:function(a){var b=c.attr(a, -"tabindex"),d=isNaN(b);return(d||b>=0)&&k(a,!d)}});c(function(){var a=document.body,b=a.appendChild(b=document.createElement("div"));c.extend(b.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});c.support.minHeight=b.offsetHeight===100;c.support.selectstart="onselectstart"in b;a.removeChild(b).style.display="none"});c.extend(c.ui,{plugin:{add:function(a,b,d){a=c.ui[a].prototype;for(var e in d){a.plugins[e]=a.plugins[e]||[];a.plugins[e].push([b,d[e]])}},call:function(a,b,d){if((b=a.plugins[b])&& -a.element[0].parentNode)for(var e=0;e0)return true;a[b]=1;d=a[b]>0;a[b]=0;return d},isOverAxis:function(a,b,d){return a>b&&a=9)&&!a.button)return this._mouseUp(a);if(this._mouseStarted){this._mouseDrag(a);return a.preventDefault()}if(this._mouseDistanceMet(a)&&this._mouseDelayMet(a))(this._mouseStarted=this._mouseStart(this._mouseDownEvent,a)!==false)?this._mouseDrag(a):this._mouseUp(a);return!this._mouseStarted},_mouseUp:function(a){b(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted= -false;a.target==this._mouseDownEvent.target&&b.data(a.target,this.widgetName+".preventClickEvent",true);this._mouseStop(a)}return false},_mouseDistanceMet:function(a){return Math.max(Math.abs(this._mouseDownEvent.pageX-a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return true}})})(jQuery); -;/* - * jQuery UI Position 1.8.16 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Position - */ -(function(c){c.ui=c.ui||{};var n=/left|center|right/,o=/top|center|bottom/,t=c.fn.position,u=c.fn.offset;c.fn.position=function(b){if(!b||!b.of)return t.apply(this,arguments);b=c.extend({},b);var a=c(b.of),d=a[0],g=(b.collision||"flip").split(" "),e=b.offset?b.offset.split(" "):[0,0],h,k,j;if(d.nodeType===9){h=a.width();k=a.height();j={top:0,left:0}}else if(d.setTimeout){h=a.width();k=a.height();j={top:a.scrollTop(),left:a.scrollLeft()}}else if(d.preventDefault){b.at="left top";h=k=0;j={top:b.of.pageY, -left:b.of.pageX}}else{h=a.outerWidth();k=a.outerHeight();j=a.offset()}c.each(["my","at"],function(){var f=(b[this]||"").split(" ");if(f.length===1)f=n.test(f[0])?f.concat(["center"]):o.test(f[0])?["center"].concat(f):["center","center"];f[0]=n.test(f[0])?f[0]:"center";f[1]=o.test(f[1])?f[1]:"center";b[this]=f});if(g.length===1)g[1]=g[0];e[0]=parseInt(e[0],10)||0;if(e.length===1)e[1]=e[0];e[1]=parseInt(e[1],10)||0;if(b.at[0]==="right")j.left+=h;else if(b.at[0]==="center")j.left+=h/2;if(b.at[1]==="bottom")j.top+= -k;else if(b.at[1]==="center")j.top+=k/2;j.left+=e[0];j.top+=e[1];return this.each(function(){var f=c(this),l=f.outerWidth(),m=f.outerHeight(),p=parseInt(c.curCSS(this,"marginLeft",true))||0,q=parseInt(c.curCSS(this,"marginTop",true))||0,v=l+p+(parseInt(c.curCSS(this,"marginRight",true))||0),w=m+q+(parseInt(c.curCSS(this,"marginBottom",true))||0),i=c.extend({},j),r;if(b.my[0]==="right")i.left-=l;else if(b.my[0]==="center")i.left-=l/2;if(b.my[1]==="bottom")i.top-=m;else if(b.my[1]==="center")i.top-= -m/2;i.left=Math.round(i.left);i.top=Math.round(i.top);r={left:i.left-p,top:i.top-q};c.each(["left","top"],function(s,x){c.ui.position[g[s]]&&c.ui.position[g[s]][x](i,{targetWidth:h,targetHeight:k,elemWidth:l,elemHeight:m,collisionPosition:r,collisionWidth:v,collisionHeight:w,offset:e,my:b.my,at:b.at})});c.fn.bgiframe&&f.bgiframe();f.offset(c.extend(i,{using:b.using}))})};c.ui.position={fit:{left:function(b,a){var d=c(window);d=a.collisionPosition.left+a.collisionWidth-d.width()-d.scrollLeft();b.left= -d>0?b.left-d:Math.max(b.left-a.collisionPosition.left,b.left)},top:function(b,a){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();b.top=d>0?b.top-d:Math.max(b.top-a.collisionPosition.top,b.top)}},flip:{left:function(b,a){if(a.at[0]!=="center"){var d=c(window);d=a.collisionPosition.left+a.collisionWidth-d.width()-d.scrollLeft();var g=a.my[0]==="left"?-a.elemWidth:a.my[0]==="right"?a.elemWidth:0,e=a.at[0]==="left"?a.targetWidth:-a.targetWidth,h=-2*a.offset[0];b.left+= -a.collisionPosition.left<0?g+e+h:d>0?g+e+h:0}},top:function(b,a){if(a.at[1]!=="center"){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();var g=a.my[1]==="top"?-a.elemHeight:a.my[1]==="bottom"?a.elemHeight:0,e=a.at[1]==="top"?a.targetHeight:-a.targetHeight,h=-2*a.offset[1];b.top+=a.collisionPosition.top<0?g+e+h:d>0?g+e+h:0}}}};if(!c.offset.setOffset){c.offset.setOffset=function(b,a){if(/static/.test(c.curCSS(b,"position")))b.style.position="relative";var d=c(b), -g=d.offset(),e=parseInt(c.curCSS(b,"top",true),10)||0,h=parseInt(c.curCSS(b,"left",true),10)||0;g={top:a.top-g.top+e,left:a.left-g.left+h};"using"in a?a.using.call(b,g):d.css(g)};c.fn.offset=function(b){var a=this[0];if(!a||!a.ownerDocument)return null;if(b)return this.each(function(){c.offset.setOffset(this,b)});return u.call(this)}}})(jQuery); -;/* - * jQuery UI Draggable 1.8.16 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Draggables - * - * Depends: - * jquery.ui.core.js - * jquery.ui.mouse.js - * jquery.ui.widget.js - */ -(function(d){d.widget("ui.draggable",d.ui.mouse,{widgetEventPrefix:"drag",options:{addClasses:true,appendTo:"parent",axis:false,connectToSortable:false,containment:false,cursor:"auto",cursorAt:false,grid:false,handle:false,helper:"original",iframeFix:false,opacity:false,refreshPositions:false,revert:false,revertDuration:500,scope:"default",scroll:true,scrollSensitivity:20,scrollSpeed:20,snap:false,snapMode:"both",snapTolerance:20,stack:false,zIndex:false},_create:function(){if(this.options.helper== -"original"&&!/^(?:r|a|f)/.test(this.element.css("position")))this.element[0].style.position="relative";this.options.addClasses&&this.element.addClass("ui-draggable");this.options.disabled&&this.element.addClass("ui-draggable-disabled");this._mouseInit()},destroy:function(){if(this.element.data("draggable")){this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled");this._mouseDestroy();return this}},_mouseCapture:function(a){var b= -this.options;if(this.helper||b.disabled||d(a.target).is(".ui-resizable-handle"))return false;this.handle=this._getHandle(a);if(!this.handle)return false;if(b.iframeFix)d(b.iframeFix===true?"iframe":b.iframeFix).each(function(){d('
      ').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1E3}).css(d(this).offset()).appendTo("body")});return true},_mouseStart:function(a){var b=this.options; -this.helper=this._createHelper(a);this._cacheHelperProportions();if(d.ui.ddmanager)d.ui.ddmanager.current=this;this._cacheMargins();this.cssPosition=this.helper.css("position");this.scrollParent=this.helper.scrollParent();this.offset=this.positionAbs=this.element.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left};d.extend(this.offset,{click:{left:a.pageX-this.offset.left,top:a.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}); -this.originalPosition=this.position=this._generatePosition(a);this.originalPageX=a.pageX;this.originalPageY=a.pageY;b.cursorAt&&this._adjustOffsetFromHelper(b.cursorAt);b.containment&&this._setContainment();if(this._trigger("start",a)===false){this._clear();return false}this._cacheHelperProportions();d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a);this.helper.addClass("ui-draggable-dragging");this._mouseDrag(a,true);d.ui.ddmanager&&d.ui.ddmanager.dragStart(this,a);return true}, -_mouseDrag:function(a,b){this.position=this._generatePosition(a);this.positionAbs=this._convertPositionTo("absolute");if(!b){b=this._uiHash();if(this._trigger("drag",a,b)===false){this._mouseUp({});return false}this.position=b.position}if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis||this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";d.ui.ddmanager&&d.ui.ddmanager.drag(this,a);return false},_mouseStop:function(a){var b= -false;if(d.ui.ddmanager&&!this.options.dropBehaviour)b=d.ui.ddmanager.drop(this,a);if(this.dropped){b=this.dropped;this.dropped=false}if((!this.element[0]||!this.element[0].parentNode)&&this.options.helper=="original")return false;if(this.options.revert=="invalid"&&!b||this.options.revert=="valid"&&b||this.options.revert===true||d.isFunction(this.options.revert)&&this.options.revert.call(this.element,b)){var c=this;d(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration, -10),function(){c._trigger("stop",a)!==false&&c._clear()})}else this._trigger("stop",a)!==false&&this._clear();return false},_mouseUp:function(a){this.options.iframeFix===true&&d("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)});d.ui.ddmanager&&d.ui.ddmanager.dragStop(this,a);return d.ui.mouse.prototype._mouseUp.call(this,a)},cancel:function(){this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear();return this},_getHandle:function(a){var b=!this.options.handle|| -!d(this.options.handle,this.element).length?true:false;d(this.options.handle,this.element).find("*").andSelf().each(function(){if(this==a.target)b=true});return b},_createHelper:function(a){var b=this.options;a=d.isFunction(b.helper)?d(b.helper.apply(this.element[0],[a])):b.helper=="clone"?this.element.clone().removeAttr("id"):this.element;a.parents("body").length||a.appendTo(b.appendTo=="parent"?this.element[0].parentNode:b.appendTo);a[0]!=this.element[0]&&!/(fixed|absolute)/.test(a.css("position"))&& -a.css("position","absolute");return a},_adjustOffsetFromHelper:function(a){if(typeof a=="string")a=a.split(" ");if(d.isArray(a))a={left:+a[0],top:+a[1]||0};if("left"in a)this.offset.click.left=a.left+this.margins.left;if("right"in a)this.offset.click.left=this.helperProportions.width-a.right+this.margins.left;if("top"in a)this.offset.click.top=a.top+this.margins.top;if("bottom"in a)this.offset.click.top=this.helperProportions.height-a.bottom+this.margins.top},_getParentOffset:function(){this.offsetParent= -this.helper.offsetParent();var a=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0])){a.left+=this.scrollParent.scrollLeft();a.top+=this.scrollParent.scrollTop()}if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&d.browser.msie)a={top:0,left:0};return{top:a.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:a.left+(parseInt(this.offsetParent.css("borderLeftWidth"), -10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.element.position();return{top:a.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"), -10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var a=this.options;if(a.containment=="parent")a.containment=this.helper[0].parentNode;if(a.containment=="document"||a.containment=="window")this.containment=[a.containment=="document"?0:d(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,a.containment=="document"?0:d(window).scrollTop()-this.offset.relative.top-this.offset.parent.top, -(a.containment=="document"?0:d(window).scrollLeft())+d(a.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(a.containment=="document"?0:d(window).scrollTop())+(d(a.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(a.containment)&&a.containment.constructor!=Array){a=d(a.containment);var b=a[0];if(b){a.offset();var c=d(b).css("overflow")!= -"hidden";this.containment=[(parseInt(d(b).css("borderLeftWidth"),10)||0)+(parseInt(d(b).css("paddingLeft"),10)||0),(parseInt(d(b).css("borderTopWidth"),10)||0)+(parseInt(d(b).css("paddingTop"),10)||0),(c?Math.max(b.scrollWidth,b.offsetWidth):b.offsetWidth)-(parseInt(d(b).css("borderLeftWidth"),10)||0)-(parseInt(d(b).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(c?Math.max(b.scrollHeight,b.offsetHeight):b.offsetHeight)-(parseInt(d(b).css("borderTopWidth"), -10)||0)-(parseInt(d(b).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom];this.relative_container=a}}else if(a.containment.constructor==Array)this.containment=a.containment},_convertPositionTo:function(a,b){if(!b)b=this.position;a=a=="absolute"?1:-1;var c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(c[0].tagName);return{top:b.top+ -this.offset.relative.top*a+this.offset.parent.top*a-(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:c.scrollTop())*a),left:b.left+this.offset.relative.left*a+this.offset.parent.left*a-(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():f?0:c.scrollLeft())*a)}},_generatePosition:function(a){var b=this.options,c=this.cssPosition=="absolute"&& -!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(c[0].tagName),e=a.pageX,h=a.pageY;if(this.originalPosition){var g;if(this.containment){if(this.relative_container){g=this.relative_container.offset();g=[this.containment[0]+g.left,this.containment[1]+g.top,this.containment[2]+g.left,this.containment[3]+g.top]}else g=this.containment;if(a.pageX-this.offset.click.leftg[2])e=g[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>g[3])h=g[3]+this.offset.click.top}if(b.grid){h=b.grid[1]?this.originalPageY+Math.round((h-this.originalPageY)/b.grid[1])*b.grid[1]:this.originalPageY;h=g?!(h-this.offset.click.topg[3])?h:!(h-this.offset.click.topg[2])?e:!(e-this.offset.click.left=0;i--){var j=c.snapElements[i].left,l=j+c.snapElements[i].width,k=c.snapElements[i].top,m=k+c.snapElements[i].height;if(j-e=j&&f<=l||h>=j&&h<=l||fl)&&(e>= -i&&e<=k||g>=i&&g<=k||ek);default:return false}};d.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(a,b){var c=d.ui.ddmanager.droppables[a.options.scope]||[],e=b?b.type:null,g=(a.currentItem||a.element).find(":data(droppable)").andSelf(),f=0;a:for(;f').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(), -top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle= -this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=a.handles||(!e(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne", -nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all")this.handles="n,e,s,w,se,sw,ne,nw";var c=this.handles.split(",");this.handles={};for(var d=0;d');/sw|se|ne|nw/.test(f)&&g.css({zIndex:++a.zIndex});"se"==f&&g.addClass("ui-icon ui-icon-gripsmall-diagonal-se");this.handles[f]=".ui-resizable-"+f;this.element.append(g)}}this._renderAxis=function(h){h=h||this.element;for(var i in this.handles){if(this.handles[i].constructor== -String)this.handles[i]=e(this.handles[i],this.element).show();if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var j=e(this.handles[i],this.element),l=0;l=/sw|ne|nw|se|n|s/.test(i)?j.outerHeight():j.outerWidth();j=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join("");h.css(j,l);this._proportionallyResize()}e(this.handles[i])}};this._renderAxis(this.element);this._handles=e(".ui-resizable-handle",this.element).disableSelection(); -this._handles.mouseover(function(){if(!b.resizing){if(this.className)var h=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);b.axis=h&&h[1]?h[1]:"se"}});if(a.autoHide){this._handles.hide();e(this.element).addClass("ui-resizable-autohide").hover(function(){if(!a.disabled){e(this).removeClass("ui-resizable-autohide");b._handles.show()}},function(){if(!a.disabled)if(!b.resizing){e(this).addClass("ui-resizable-autohide");b._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy(); -var b=function(c){e(c).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){b(this.element);var a=this.element;a.after(this.originalElement.css({position:a.css("position"),width:a.outerWidth(),height:a.outerHeight(),top:a.css("top"),left:a.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);b(this.originalElement);return this},_mouseCapture:function(b){var a= -false;for(var c in this.handles)if(e(this.handles[c])[0]==b.target)a=true;return!this.options.disabled&&a},_mouseStart:function(b){var a=this.options,c=this.element.position(),d=this.element;this.resizing=true;this.documentScroll={top:e(document).scrollTop(),left:e(document).scrollLeft()};if(d.is(".ui-draggable")||/absolute/.test(d.css("position")))d.css({position:"absolute",top:c.top,left:c.left});e.browser.opera&&/relative/.test(d.css("position"))&&d.css({position:"relative",top:"auto",left:"auto"}); -this._renderProxy();c=m(this.helper.css("left"));var f=m(this.helper.css("top"));if(a.containment){c+=e(a.containment).scrollLeft()||0;f+=e(a.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:c,top:f};this.size=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalSize=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalPosition={left:c,top:f};this.sizeDiff= -{width:d.outerWidth()-d.width(),height:d.outerHeight()-d.height()};this.originalMousePosition={left:b.pageX,top:b.pageY};this.aspectRatio=typeof a.aspectRatio=="number"?a.aspectRatio:this.originalSize.width/this.originalSize.height||1;a=e(".ui-resizable-"+this.axis).css("cursor");e("body").css("cursor",a=="auto"?this.axis+"-resize":a);d.addClass("ui-resizable-resizing");this._propagate("start",b);return true},_mouseDrag:function(b){var a=this.helper,c=this.originalMousePosition,d=this._change[this.axis]; -if(!d)return false;c=d.apply(this,[b,b.pageX-c.left||0,b.pageY-c.top||0]);this._updateVirtualBoundaries(b.shiftKey);if(this._aspectRatio||b.shiftKey)c=this._updateRatio(c,b);c=this._respectSize(c,b);this._propagate("resize",b);a.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize();this._updateCache(c);this._trigger("resize",b,this.ui());return false}, -_mouseStop:function(b){this.resizing=false;var a=this.options,c=this;if(this._helper){var d=this._proportionallyResizeElements,f=d.length&&/textarea/i.test(d[0].nodeName);d=f&&e.ui.hasScroll(d[0],"left")?0:c.sizeDiff.height;f=f?0:c.sizeDiff.width;f={width:c.helper.width()-f,height:c.helper.height()-d};d=parseInt(c.element.css("left"),10)+(c.position.left-c.originalPosition.left)||null;var g=parseInt(c.element.css("top"),10)+(c.position.top-c.originalPosition.top)||null;a.animate||this.element.css(e.extend(f, -{top:g,left:d}));c.helper.height(c.size.height);c.helper.width(c.size.width);this._helper&&!a.animate&&this._proportionallyResize()}e("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",b);this._helper&&this.helper.remove();return false},_updateVirtualBoundaries:function(b){var a=this.options,c,d,f;a={minWidth:k(a.minWidth)?a.minWidth:0,maxWidth:k(a.maxWidth)?a.maxWidth:Infinity,minHeight:k(a.minHeight)?a.minHeight:0,maxHeight:k(a.maxHeight)?a.maxHeight: -Infinity};if(this._aspectRatio||b){b=a.minHeight*this.aspectRatio;d=a.minWidth/this.aspectRatio;c=a.maxHeight*this.aspectRatio;f=a.maxWidth/this.aspectRatio;if(b>a.minWidth)a.minWidth=b;if(d>a.minHeight)a.minHeight=d;if(cb.width,h=k(b.height)&&a.minHeight&&a.minHeight>b.height;if(g)b.width=a.minWidth;if(h)b.height=a.minHeight;if(d)b.width=a.maxWidth;if(f)b.height=a.maxHeight;var i=this.originalPosition.left+this.originalSize.width,j=this.position.top+this.size.height,l=/sw|nw|w/.test(c);c=/nw|ne|n/.test(c);if(g&&l)b.left=i-a.minWidth;if(d&&l)b.left=i-a.maxWidth;if(h&&c)b.top=j-a.minHeight;if(f&&c)b.top=j-a.maxHeight;if((a=!b.width&&!b.height)&&!b.left&&b.top)b.top=null;else if(a&&!b.top&&b.left)b.left= -null;return b},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var b=this.helper||this.element,a=0;a');var a=e.browser.msie&&e.browser.version<7,c=a?1:0;a=a?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+ -a,height:this.element.outerHeight()+a,position:"absolute",left:this.elementOffset.left-c+"px",top:this.elementOffset.top-c+"px",zIndex:++b.zIndex});this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(b,a){return{width:this.originalSize.width+a}},w:function(b,a){return{left:this.originalPosition.left+a,width:this.originalSize.width-a}},n:function(b,a,c){return{top:this.originalPosition.top+c,height:this.originalSize.height-c}},s:function(b,a,c){return{height:this.originalSize.height+ -c}},se:function(b,a,c){return e.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[b,a,c]))},sw:function(b,a,c){return e.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[b,a,c]))},ne:function(b,a,c){return e.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[b,a,c]))},nw:function(b,a,c){return e.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[b,a,c]))}},_propagate:function(b,a){e.ui.plugin.call(this,b,[a,this.ui()]); -b!="resize"&&this._trigger(b,a,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});e.extend(e.ui.resizable,{version:"1.8.16"});e.ui.plugin.add("resizable","alsoResize",{start:function(){var b=e(this).data("resizable").options,a=function(c){e(c).each(function(){var d=e(this);d.data("resizable-alsoresize",{width:parseInt(d.width(), -10),height:parseInt(d.height(),10),left:parseInt(d.css("left"),10),top:parseInt(d.css("top"),10),position:d.css("position")})})};if(typeof b.alsoResize=="object"&&!b.alsoResize.parentNode)if(b.alsoResize.length){b.alsoResize=b.alsoResize[0];a(b.alsoResize)}else e.each(b.alsoResize,function(c){a(c)});else a(b.alsoResize)},resize:function(b,a){var c=e(this).data("resizable");b=c.options;var d=c.originalSize,f=c.originalPosition,g={height:c.size.height-d.height||0,width:c.size.width-d.width||0,top:c.position.top- -f.top||0,left:c.position.left-f.left||0},h=function(i,j){e(i).each(function(){var l=e(this),q=e(this).data("resizable-alsoresize"),p={},r=j&&j.length?j:l.parents(a.originalElement[0]).length?["width","height"]:["width","height","top","left"];e.each(r,function(n,o){if((n=(q[o]||0)+(g[o]||0))&&n>=0)p[o]=n||null});if(e.browser.opera&&/relative/.test(l.css("position"))){c._revertToRelativePosition=true;l.css({position:"absolute",top:"auto",left:"auto"})}l.css(p)})};typeof b.alsoResize=="object"&&!b.alsoResize.nodeType? -e.each(b.alsoResize,function(i,j){h(i,j)}):h(b.alsoResize)},stop:function(){var b=e(this).data("resizable"),a=b.options,c=function(d){e(d).each(function(){var f=e(this);f.css({position:f.data("resizable-alsoresize").position})})};if(b._revertToRelativePosition){b._revertToRelativePosition=false;typeof a.alsoResize=="object"&&!a.alsoResize.nodeType?e.each(a.alsoResize,function(d){c(d)}):c(a.alsoResize)}e(this).removeData("resizable-alsoresize")}});e.ui.plugin.add("resizable","animate",{stop:function(b){var a= -e(this).data("resizable"),c=a.options,d=a._proportionallyResizeElements,f=d.length&&/textarea/i.test(d[0].nodeName),g=f&&e.ui.hasScroll(d[0],"left")?0:a.sizeDiff.height;f={width:a.size.width-(f?0:a.sizeDiff.width),height:a.size.height-g};g=parseInt(a.element.css("left"),10)+(a.position.left-a.originalPosition.left)||null;var h=parseInt(a.element.css("top"),10)+(a.position.top-a.originalPosition.top)||null;a.element.animate(e.extend(f,h&&g?{top:h,left:g}:{}),{duration:c.animateDuration,easing:c.animateEasing, -step:function(){var i={width:parseInt(a.element.css("width"),10),height:parseInt(a.element.css("height"),10),top:parseInt(a.element.css("top"),10),left:parseInt(a.element.css("left"),10)};d&&d.length&&e(d[0]).css({width:i.width,height:i.height});a._updateCache(i);a._propagate("resize",b)}})}});e.ui.plugin.add("resizable","containment",{start:function(){var b=e(this).data("resizable"),a=b.element,c=b.options.containment;if(a=c instanceof e?c.get(0):/parent/.test(c)?a.parent().get(0):c){b.containerElement= -e(a);if(/document/.test(c)||c==document){b.containerOffset={left:0,top:0};b.containerPosition={left:0,top:0};b.parentData={element:e(document),left:0,top:0,width:e(document).width(),height:e(document).height()||document.body.parentNode.scrollHeight}}else{var d=e(a),f=[];e(["Top","Right","Left","Bottom"]).each(function(i,j){f[i]=m(d.css("padding"+j))});b.containerOffset=d.offset();b.containerPosition=d.position();b.containerSize={height:d.innerHeight()-f[3],width:d.innerWidth()-f[1]};c=b.containerOffset; -var g=b.containerSize.height,h=b.containerSize.width;h=e.ui.hasScroll(a,"left")?a.scrollWidth:h;g=e.ui.hasScroll(a)?a.scrollHeight:g;b.parentData={element:a,left:c.left,top:c.top,width:h,height:g}}}},resize:function(b){var a=e(this).data("resizable"),c=a.options,d=a.containerOffset,f=a.position;b=a._aspectRatio||b.shiftKey;var g={top:0,left:0},h=a.containerElement;if(h[0]!=document&&/static/.test(h.css("position")))g=d;if(f.left<(a._helper?d.left:0)){a.size.width+=a._helper?a.position.left-d.left: -a.position.left-g.left;if(b)a.size.height=a.size.width/c.aspectRatio;a.position.left=c.helper?d.left:0}if(f.top<(a._helper?d.top:0)){a.size.height+=a._helper?a.position.top-d.top:a.position.top;if(b)a.size.width=a.size.height*c.aspectRatio;a.position.top=a._helper?d.top:0}a.offset.left=a.parentData.left+a.position.left;a.offset.top=a.parentData.top+a.position.top;c=Math.abs((a._helper?a.offset.left-g.left:a.offset.left-g.left)+a.sizeDiff.width);d=Math.abs((a._helper?a.offset.top-g.top:a.offset.top- -d.top)+a.sizeDiff.height);f=a.containerElement.get(0)==a.element.parent().get(0);g=/relative|absolute/.test(a.containerElement.css("position"));if(f&&g)c-=a.parentData.left;if(c+a.size.width>=a.parentData.width){a.size.width=a.parentData.width-c;if(b)a.size.height=a.size.width/a.aspectRatio}if(d+a.size.height>=a.parentData.height){a.size.height=a.parentData.height-d;if(b)a.size.width=a.size.height*a.aspectRatio}},stop:function(){var b=e(this).data("resizable"),a=b.options,c=b.containerOffset,d=b.containerPosition, -f=b.containerElement,g=e(b.helper),h=g.offset(),i=g.outerWidth()-b.sizeDiff.width;g=g.outerHeight()-b.sizeDiff.height;b._helper&&!a.animate&&/relative/.test(f.css("position"))&&e(this).css({left:h.left-d.left-c.left,width:i,height:g});b._helper&&!a.animate&&/static/.test(f.css("position"))&&e(this).css({left:h.left-d.left-c.left,width:i,height:g})}});e.ui.plugin.add("resizable","ghost",{start:function(){var b=e(this).data("resizable"),a=b.options,c=b.size;b.ghost=b.originalElement.clone();b.ghost.css({opacity:0.25, -display:"block",position:"relative",height:c.height,width:c.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof a.ghost=="string"?a.ghost:"");b.ghost.appendTo(b.helper)},resize:function(){var b=e(this).data("resizable");b.ghost&&b.ghost.css({position:"relative",height:b.size.height,width:b.size.width})},stop:function(){var b=e(this).data("resizable");b.ghost&&b.helper&&b.helper.get(0).removeChild(b.ghost.get(0))}});e.ui.plugin.add("resizable","grid",{resize:function(){var b= -e(this).data("resizable"),a=b.options,c=b.size,d=b.originalSize,f=b.originalPosition,g=b.axis;a.grid=typeof a.grid=="number"?[a.grid,a.grid]:a.grid;var h=Math.round((c.width-d.width)/(a.grid[0]||1))*(a.grid[0]||1);a=Math.round((c.height-d.height)/(a.grid[1]||1))*(a.grid[1]||1);if(/^(se|s|e)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a}else if(/^(ne)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a;b.position.top=f.top-a}else{if(/^(sw)$/.test(g)){b.size.width=d.width+h;b.size.height= -d.height+a}else{b.size.width=d.width+h;b.size.height=d.height+a;b.position.top=f.top-a}b.position.left=f.left-h}}});var m=function(b){return parseInt(b,10)||0},k=function(b){return!isNaN(parseInt(b,10))}})(jQuery); -;/* - * jQuery UI Selectable 1.8.16 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Selectables - * - * Depends: - * jquery.ui.core.js - * jquery.ui.mouse.js - * jquery.ui.widget.js - */ -(function(e){e.widget("ui.selectable",e.ui.mouse,{options:{appendTo:"body",autoRefresh:true,distance:0,filter:"*",tolerance:"touch"},_create:function(){var c=this;this.element.addClass("ui-selectable");this.dragged=false;var f;this.refresh=function(){f=e(c.options.filter,c.element[0]);f.each(function(){var d=e(this),b=d.offset();e.data(this,"selectable-item",{element:this,$element:d,left:b.left,top:b.top,right:b.left+d.outerWidth(),bottom:b.top+d.outerHeight(),startselected:false,selected:d.hasClass("ui-selected"), -selecting:d.hasClass("ui-selecting"),unselecting:d.hasClass("ui-unselecting")})})};this.refresh();this.selectees=f.addClass("ui-selectee");this._mouseInit();this.helper=e("
      ")},destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item");this.element.removeClass("ui-selectable ui-selectable-disabled").removeData("selectable").unbind(".selectable");this._mouseDestroy();return this},_mouseStart:function(c){var f=this;this.opos=[c.pageX, -c.pageY];if(!this.options.disabled){var d=this.options;this.selectees=e(d.filter,this.element[0]);this._trigger("start",c);e(d.appendTo).append(this.helper);this.helper.css({left:c.clientX,top:c.clientY,width:0,height:0});d.autoRefresh&&this.refresh();this.selectees.filter(".ui-selected").each(function(){var b=e.data(this,"selectable-item");b.startselected=true;if(!c.metaKey){b.$element.removeClass("ui-selected");b.selected=false;b.$element.addClass("ui-unselecting");b.unselecting=true;f._trigger("unselecting", -c,{unselecting:b.element})}});e(c.target).parents().andSelf().each(function(){var b=e.data(this,"selectable-item");if(b){var g=!c.metaKey||!b.$element.hasClass("ui-selected");b.$element.removeClass(g?"ui-unselecting":"ui-selected").addClass(g?"ui-selecting":"ui-unselecting");b.unselecting=!g;b.selecting=g;(b.selected=g)?f._trigger("selecting",c,{selecting:b.element}):f._trigger("unselecting",c,{unselecting:b.element});return false}})}},_mouseDrag:function(c){var f=this;this.dragged=true;if(!this.options.disabled){var d= -this.options,b=this.opos[0],g=this.opos[1],h=c.pageX,i=c.pageY;if(b>h){var j=h;h=b;b=j}if(g>i){j=i;i=g;g=j}this.helper.css({left:b,top:g,width:h-b,height:i-g});this.selectees.each(function(){var a=e.data(this,"selectable-item");if(!(!a||a.element==f.element[0])){var k=false;if(d.tolerance=="touch")k=!(a.left>h||a.righti||a.bottomb&&a.rightg&&a.bottom *",opacity:false,placeholder:false,revert:false,scroll:true,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1E3},_create:function(){var a=this.options;this.containerCache={};this.element.addClass("ui-sortable"); -this.refresh();this.floating=this.items.length?a.axis==="x"||/left|right/.test(this.items[0].item.css("float"))||/inline|table-cell/.test(this.items[0].item.css("display")):false;this.offset=this.element.offset();this._mouseInit()},destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled").removeData("sortable").unbind(".sortable");this._mouseDestroy();for(var a=this.items.length-1;a>=0;a--)this.items[a].item.removeData("sortable-item");return this},_setOption:function(a,b){if(a=== -"disabled"){this.options[a]=b;this.widget()[b?"addClass":"removeClass"]("ui-sortable-disabled")}else d.Widget.prototype._setOption.apply(this,arguments)},_mouseCapture:function(a,b){if(this.reverting)return false;if(this.options.disabled||this.options.type=="static")return false;this._refreshItems(a);var c=null,e=this;d(a.target).parents().each(function(){if(d.data(this,"sortable-item")==e){c=d(this);return false}});if(d.data(a.target,"sortable-item")==e)c=d(a.target);if(!c)return false;if(this.options.handle&& -!b){var f=false;d(this.options.handle,c).find("*").andSelf().each(function(){if(this==a.target)f=true});if(!f)return false}this.currentItem=c;this._removeCurrentsFromItems();return true},_mouseStart:function(a,b,c){b=this.options;var e=this;this.currentContainer=this;this.refreshPositions();this.helper=this._createHelper(a);this._cacheHelperProportions();this._cacheMargins();this.scrollParent=this.helper.scrollParent();this.offset=this.currentItem.offset();this.offset={top:this.offset.top-this.margins.top, -left:this.offset.left-this.margins.left};this.helper.css("position","absolute");this.cssPosition=this.helper.css("position");d.extend(this.offset,{click:{left:a.pageX-this.offset.left,top:a.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this._generatePosition(a);this.originalPageX=a.pageX;this.originalPageY=a.pageY;b.cursorAt&&this._adjustOffsetFromHelper(b.cursorAt);this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]}; -this.helper[0]!=this.currentItem[0]&&this.currentItem.hide();this._createPlaceholder();b.containment&&this._setContainment();if(b.cursor){if(d("body").css("cursor"))this._storedCursor=d("body").css("cursor");d("body").css("cursor",b.cursor)}if(b.opacity){if(this.helper.css("opacity"))this._storedOpacity=this.helper.css("opacity");this.helper.css("opacity",b.opacity)}if(b.zIndex){if(this.helper.css("zIndex"))this._storedZIndex=this.helper.css("zIndex");this.helper.css("zIndex",b.zIndex)}if(this.scrollParent[0]!= -document&&this.scrollParent[0].tagName!="HTML")this.overflowOffset=this.scrollParent.offset();this._trigger("start",a,this._uiHash());this._preserveHelperProportions||this._cacheHelperProportions();if(!c)for(c=this.containers.length-1;c>=0;c--)this.containers[c]._trigger("activate",a,e._uiHash(this));if(d.ui.ddmanager)d.ui.ddmanager.current=this;d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a);this.dragging=true;this.helper.addClass("ui-sortable-helper");this._mouseDrag(a); -return true},_mouseDrag:function(a){this.position=this._generatePosition(a);this.positionAbs=this._convertPositionTo("absolute");if(!this.lastPositionAbs)this.lastPositionAbs=this.positionAbs;if(this.options.scroll){var b=this.options,c=false;if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"){if(this.overflowOffset.top+this.scrollParent[0].offsetHeight-a.pageY=0;b--){c=this.items[b];var e=c.item[0],f=this._intersectsWithPointer(c);if(f)if(e!=this.currentItem[0]&&this.placeholder[f==1?"next":"prev"]()[0]!=e&&!d.ui.contains(this.placeholder[0],e)&&(this.options.type=="semi-dynamic"?!d.ui.contains(this.element[0], -e):true)){this.direction=f==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(c))this._rearrange(a,c);else break;this._trigger("change",a,this._uiHash());break}}this._contactContainers(a);d.ui.ddmanager&&d.ui.ddmanager.drag(this,a);this._trigger("sort",a,this._uiHash());this.lastPositionAbs=this.positionAbs;return false},_mouseStop:function(a,b){if(a){d.ui.ddmanager&&!this.options.dropBehaviour&&d.ui.ddmanager.drop(this,a);if(this.options.revert){var c=this;b=c.placeholder.offset(); -c.reverting=true;d(this.helper).animate({left:b.left-this.offset.parent.left-c.margins.left+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollLeft),top:b.top-this.offset.parent.top-c.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){c._clear(a)})}else this._clear(a,b);return false}},cancel:function(){var a=this;if(this.dragging){this._mouseUp({target:null});this.options.helper=="original"?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"): -this.currentItem.show();for(var b=this.containers.length-1;b>=0;b--){this.containers[b]._trigger("deactivate",null,a._uiHash(this));if(this.containers[b].containerCache.over){this.containers[b]._trigger("out",null,a._uiHash(this));this.containers[b].containerCache.over=0}}}if(this.placeholder){this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]);this.options.helper!="original"&&this.helper&&this.helper[0].parentNode&&this.helper.remove();d.extend(this,{helper:null, -dragging:false,reverting:false,_noFinalSort:null});this.domPosition.prev?d(this.domPosition.prev).after(this.currentItem):d(this.domPosition.parent).prepend(this.currentItem)}return this},serialize:function(a){var b=this._getItemsAsjQuery(a&&a.connected),c=[];a=a||{};d(b).each(function(){var e=(d(a.item||this).attr(a.attribute||"id")||"").match(a.expression||/(.+)[-=_](.+)/);if(e)c.push((a.key||e[1]+"[]")+"="+(a.key&&a.expression?e[1]:e[2]))});!c.length&&a.key&&c.push(a.key+"=");return c.join("&")}, -toArray:function(a){var b=this._getItemsAsjQuery(a&&a.connected),c=[];a=a||{};b.each(function(){c.push(d(a.item||this).attr(a.attribute||"id")||"")});return c},_intersectsWith:function(a){var b=this.positionAbs.left,c=b+this.helperProportions.width,e=this.positionAbs.top,f=e+this.helperProportions.height,g=a.left,h=g+a.width,i=a.top,k=i+a.height,j=this.offset.click.top,l=this.offset.click.left;j=e+j>i&&e+jg&&b+la[this.floating?"width":"height"]?j:g0?"down":"up")},_getDragHorizontalDirection:function(){var a=this.positionAbs.left-this.lastPositionAbs.left;return a!=0&&(a>0?"right":"left")},refresh:function(a){this._refreshItems(a);this.refreshPositions();return this},_connectWith:function(){var a=this.options;return a.connectWith.constructor==String?[a.connectWith]:a.connectWith},_getItemsAsjQuery:function(a){var b=[],c=[],e=this._connectWith(); -if(e&&a)for(a=e.length-1;a>=0;a--)for(var f=d(e[a]),g=f.length-1;g>=0;g--){var h=d.data(f[g],"sortable");if(h&&h!=this&&!h.options.disabled)c.push([d.isFunction(h.options.items)?h.options.items.call(h.element):d(h.options.items,h.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),h])}c.push([d.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):d(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"), -this]);for(a=c.length-1;a>=0;a--)c[a][0].each(function(){b.push(this)});return d(b)},_removeCurrentsFromItems:function(){for(var a=this.currentItem.find(":data(sortable-item)"),b=0;b=0;f--)for(var g=d(e[f]),h=g.length-1;h>=0;h--){var i=d.data(g[h],"sortable");if(i&&i!=this&&!i.options.disabled){c.push([d.isFunction(i.options.items)?i.options.items.call(i.element[0],a,{item:this.currentItem}):d(i.options.items,i.element),i]);this.containers.push(i)}}for(f=c.length-1;f>=0;f--){a=c[f][1];e=c[f][0];h=0;for(g=e.length;h=0;b--){var c=this.items[b];if(!(c.instance!=this.currentContainer&&this.currentContainer&&c.item[0]!=this.currentItem[0])){var e=this.options.toleranceElement?d(this.options.toleranceElement,c.item):c.item;if(!a){c.width=e.outerWidth();c.height=e.outerHeight()}e=e.offset();c.left=e.left;c.top=e.top}}if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(b= -this.containers.length-1;b>=0;b--){e=this.containers[b].element.offset();this.containers[b].containerCache.left=e.left;this.containers[b].containerCache.top=e.top;this.containers[b].containerCache.width=this.containers[b].element.outerWidth();this.containers[b].containerCache.height=this.containers[b].element.outerHeight()}return this},_createPlaceholder:function(a){var b=a||this,c=b.options;if(!c.placeholder||c.placeholder.constructor==String){var e=c.placeholder;c.placeholder={element:function(){var f= -d(document.createElement(b.currentItem[0].nodeName)).addClass(e||b.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];if(!e)f.style.visibility="hidden";return f},update:function(f,g){if(!(e&&!c.forcePlaceholderSize)){g.height()||g.height(b.currentItem.innerHeight()-parseInt(b.currentItem.css("paddingTop")||0,10)-parseInt(b.currentItem.css("paddingBottom")||0,10));g.width()||g.width(b.currentItem.innerWidth()-parseInt(b.currentItem.css("paddingLeft")||0,10)-parseInt(b.currentItem.css("paddingRight")|| -0,10))}}}}b.placeholder=d(c.placeholder.element.call(b.element,b.currentItem));b.currentItem.after(b.placeholder);c.placeholder.update(b,b.placeholder)},_contactContainers:function(a){for(var b=null,c=null,e=this.containers.length-1;e>=0;e--)if(!d.ui.contains(this.currentItem[0],this.containers[e].element[0]))if(this._intersectsWith(this.containers[e].containerCache)){if(!(b&&d.ui.contains(this.containers[e].element[0],b.element[0]))){b=this.containers[e];c=e}}else if(this.containers[e].containerCache.over){this.containers[e]._trigger("out", -a,this._uiHash(this));this.containers[e].containerCache.over=0}if(b)if(this.containers.length===1){this.containers[c]._trigger("over",a,this._uiHash(this));this.containers[c].containerCache.over=1}else if(this.currentContainer!=this.containers[c]){b=1E4;e=null;for(var f=this.positionAbs[this.containers[c].floating?"left":"top"],g=this.items.length-1;g>=0;g--)if(d.ui.contains(this.containers[c].element[0],this.items[g].item[0])){var h=this.items[g][this.containers[c].floating?"left":"top"];if(Math.abs(h- -f)this.containment[2])f=this.containment[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>this.containment[3])g=this.containment[3]+this.offset.click.top}if(b.grid){g=this.originalPageY+Math.round((g- -this.originalPageY)/b.grid[1])*b.grid[1];g=this.containment?!(g-this.offset.click.topthis.containment[3])?g:!(g-this.offset.click.topthis.containment[2])?f:!(f-this.offset.click.left=0;e--)if(d.ui.contains(this.containers[e].element[0],this.currentItem[0])&&!b){c.push(function(f){return function(g){f._trigger("receive",g,this._uiHash(this))}}.call(this,this.containers[e]));c.push(function(f){return function(g){f._trigger("update",g,this._uiHash(this))}}.call(this,this.containers[e]))}}for(e=this.containers.length-1;e>=0;e--){b||c.push(function(f){return function(g){f._trigger("deactivate",g,this._uiHash(this))}}.call(this, -this.containers[e]));if(this.containers[e].containerCache.over){c.push(function(f){return function(g){f._trigger("out",g,this._uiHash(this))}}.call(this,this.containers[e]));this.containers[e].containerCache.over=0}}this._storedCursor&&d("body").css("cursor",this._storedCursor);this._storedOpacity&&this.helper.css("opacity",this._storedOpacity);if(this._storedZIndex)this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex);this.dragging=false;if(this.cancelHelperRemoval){if(!b){this._trigger("beforeStop", -a,this._uiHash());for(e=0;e li > :first-child,> :not(li):even",icons:{header:"ui-icon-triangle-1-e",headerSelected:"ui-icon-triangle-1-s"},navigation:false,navigationFilter:function(){return this.href.toLowerCase()===location.href.toLowerCase()}},_create:function(){var a=this,b=a.options;a.running=0;a.element.addClass("ui-accordion ui-widget ui-helper-reset").children("li").addClass("ui-accordion-li-fix"); -a.headers=a.element.find(b.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all").bind("mouseenter.accordion",function(){b.disabled||c(this).addClass("ui-state-hover")}).bind("mouseleave.accordion",function(){b.disabled||c(this).removeClass("ui-state-hover")}).bind("focus.accordion",function(){b.disabled||c(this).addClass("ui-state-focus")}).bind("blur.accordion",function(){b.disabled||c(this).removeClass("ui-state-focus")});a.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom"); -if(b.navigation){var d=a.element.find("a").filter(b.navigationFilter).eq(0);if(d.length){var h=d.closest(".ui-accordion-header");a.active=h.length?h:d.closest(".ui-accordion-content").prev()}}a.active=a._findActive(a.active||b.active).addClass("ui-state-default ui-state-active").toggleClass("ui-corner-all").toggleClass("ui-corner-top");a.active.next().addClass("ui-accordion-content-active");a._createIcons();a.resize();a.element.attr("role","tablist");a.headers.attr("role","tab").bind("keydown.accordion", -function(f){return a._keydown(f)}).next().attr("role","tabpanel");a.headers.not(a.active||"").attr({"aria-expanded":"false","aria-selected":"false",tabIndex:-1}).next().hide();a.active.length?a.active.attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}):a.headers.eq(0).attr("tabIndex",0);c.browser.safari||a.headers.find("a").attr("tabIndex",-1);b.event&&a.headers.bind(b.event.split(" ").join(".accordion ")+".accordion",function(f){a._clickHandler.call(a,f,this);f.preventDefault()})},_createIcons:function(){var a= -this.options;if(a.icons){c("").addClass("ui-icon "+a.icons.header).prependTo(this.headers);this.active.children(".ui-icon").toggleClass(a.icons.header).toggleClass(a.icons.headerSelected);this.element.addClass("ui-accordion-icons")}},_destroyIcons:function(){this.headers.children(".ui-icon").remove();this.element.removeClass("ui-accordion-icons")},destroy:function(){var a=this.options;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role");this.headers.unbind(".accordion").removeClass("ui-accordion-header ui-accordion-disabled ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("aria-selected").removeAttr("tabIndex"); -this.headers.find("a").removeAttr("tabIndex");this._destroyIcons();var b=this.headers.next().css("display","").removeAttr("role").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-accordion-disabled ui-state-disabled");if(a.autoHeight||a.fillHeight)b.css("height","");return c.Widget.prototype.destroy.call(this)},_setOption:function(a,b){c.Widget.prototype._setOption.apply(this,arguments);a=="active"&&this.activate(b);if(a=="icons"){this._destroyIcons(); -b&&this._createIcons()}if(a=="disabled")this.headers.add(this.headers.next())[b?"addClass":"removeClass"]("ui-accordion-disabled ui-state-disabled")},_keydown:function(a){if(!(this.options.disabled||a.altKey||a.ctrlKey)){var b=c.ui.keyCode,d=this.headers.length,h=this.headers.index(a.target),f=false;switch(a.keyCode){case b.RIGHT:case b.DOWN:f=this.headers[(h+1)%d];break;case b.LEFT:case b.UP:f=this.headers[(h-1+d)%d];break;case b.SPACE:case b.ENTER:this._clickHandler({target:a.target},a.target); -a.preventDefault()}if(f){c(a.target).attr("tabIndex",-1);c(f).attr("tabIndex",0);f.focus();return false}return true}},resize:function(){var a=this.options,b;if(a.fillSpace){if(c.browser.msie){var d=this.element.parent().css("overflow");this.element.parent().css("overflow","hidden")}b=this.element.parent().height();c.browser.msie&&this.element.parent().css("overflow",d);this.headers.each(function(){b-=c(this).outerHeight(true)});this.headers.next().each(function(){c(this).height(Math.max(0,b-c(this).innerHeight()+ -c(this).height()))}).css("overflow","auto")}else if(a.autoHeight){b=0;this.headers.next().each(function(){b=Math.max(b,c(this).height("").height())}).height(b)}return this},activate:function(a){this.options.active=a;a=this._findActive(a)[0];this._clickHandler({target:a},a);return this},_findActive:function(a){return a?typeof a==="number"?this.headers.filter(":eq("+a+")"):this.headers.not(this.headers.not(a)):a===false?c([]):this.headers.filter(":eq(0)")},_clickHandler:function(a,b){var d=this.options; -if(!d.disabled)if(a.target){a=c(a.currentTarget||b);b=a[0]===this.active[0];d.active=d.collapsible&&b?false:this.headers.index(a);if(!(this.running||!d.collapsible&&b)){var h=this.active;j=a.next();g=this.active.next();e={options:d,newHeader:b&&d.collapsible?c([]):a,oldHeader:this.active,newContent:b&&d.collapsible?c([]):j,oldContent:g};var f=this.headers.index(this.active[0])>this.headers.index(a[0]);this.active=b?c([]):a;this._toggle(j,g,e,b,f);h.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header); -if(!b){a.removeClass("ui-state-default ui-corner-all").addClass("ui-state-active ui-corner-top").children(".ui-icon").removeClass(d.icons.header).addClass(d.icons.headerSelected);a.next().addClass("ui-accordion-content-active")}}}else if(d.collapsible){this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header);this.active.next().addClass("ui-accordion-content-active");var g=this.active.next(), -e={options:d,newHeader:c([]),oldHeader:d.active,newContent:c([]),oldContent:g},j=this.active=c([]);this._toggle(j,g,e)}},_toggle:function(a,b,d,h,f){var g=this,e=g.options;g.toShow=a;g.toHide=b;g.data=d;var j=function(){if(g)return g._completed.apply(g,arguments)};g._trigger("changestart",null,g.data);g.running=b.size()===0?a.size():b.size();if(e.animated){d={};d=e.collapsible&&h?{toShow:c([]),toHide:b,complete:j,down:f,autoHeight:e.autoHeight||e.fillSpace}:{toShow:a,toHide:b,complete:j,down:f,autoHeight:e.autoHeight|| -e.fillSpace};if(!e.proxied)e.proxied=e.animated;if(!e.proxiedDuration)e.proxiedDuration=e.duration;e.animated=c.isFunction(e.proxied)?e.proxied(d):e.proxied;e.duration=c.isFunction(e.proxiedDuration)?e.proxiedDuration(d):e.proxiedDuration;h=c.ui.accordion.animations;var i=e.duration,k=e.animated;if(k&&!h[k]&&!c.easing[k])k="slide";h[k]||(h[k]=function(l){this.slide(l,{easing:k,duration:i||700})});h[k](d)}else{if(e.collapsible&&h)a.toggle();else{b.hide();a.show()}j(true)}b.prev().attr({"aria-expanded":"false", -"aria-selected":"false",tabIndex:-1}).blur();a.prev().attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}).focus()},_completed:function(a){this.running=a?0:--this.running;if(!this.running){this.options.clearStyle&&this.toShow.add(this.toHide).css({height:"",overflow:""});this.toHide.removeClass("ui-accordion-content-active");if(this.toHide.length)this.toHide.parent()[0].className=this.toHide.parent()[0].className;this._trigger("change",null,this.data)}}});c.extend(c.ui.accordion,{version:"1.8.16", -animations:{slide:function(a,b){a=c.extend({easing:"swing",duration:300},a,b);if(a.toHide.size())if(a.toShow.size()){var d=a.toShow.css("overflow"),h=0,f={},g={},e;b=a.toShow;e=b[0].style.width;b.width(parseInt(b.parent().width(),10)-parseInt(b.css("paddingLeft"),10)-parseInt(b.css("paddingRight"),10)-(parseInt(b.css("borderLeftWidth"),10)||0)-(parseInt(b.css("borderRightWidth"),10)||0));c.each(["height","paddingTop","paddingBottom"],function(j,i){g[i]="hide";j=(""+c.css(a.toShow[0],i)).match(/^([\d+-.]+)(.*)$/); -f[i]={value:j[1],unit:j[2]||"px"}});a.toShow.css({height:0,overflow:"hidden"}).show();a.toHide.filter(":hidden").each(a.complete).end().filter(":visible").animate(g,{step:function(j,i){if(i.prop=="height")h=i.end-i.start===0?0:(i.now-i.start)/(i.end-i.start);a.toShow[0].style[i.prop]=h*f[i.prop].value+f[i.prop].unit},duration:a.duration,easing:a.easing,complete:function(){a.autoHeight||a.toShow.css("height","");a.toShow.css({width:e,overflow:d});a.complete()}})}else a.toHide.animate({height:"hide", -paddingTop:"hide",paddingBottom:"hide"},a);else a.toShow.animate({height:"show",paddingTop:"show",paddingBottom:"show"},a)},bounceslide:function(a){this.slide(a,{easing:a.down?"easeOutBounce":"swing",duration:a.down?1E3:200})}}})})(jQuery); -;/* - * jQuery UI Autocomplete 1.8.16 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Autocomplete - * - * Depends: - * jquery.ui.core.js - * jquery.ui.widget.js - * jquery.ui.position.js - */ -(function(d){var e=0;d.widget("ui.autocomplete",{options:{appendTo:"body",autoFocus:false,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null},pending:0,_create:function(){var a=this,b=this.element[0].ownerDocument,g;this.element.addClass("ui-autocomplete-input").attr("autocomplete","off").attr({role:"textbox","aria-autocomplete":"list","aria-haspopup":"true"}).bind("keydown.autocomplete",function(c){if(!(a.options.disabled||a.element.propAttr("readOnly"))){g= -false;var f=d.ui.keyCode;switch(c.keyCode){case f.PAGE_UP:a._move("previousPage",c);break;case f.PAGE_DOWN:a._move("nextPage",c);break;case f.UP:a._move("previous",c);c.preventDefault();break;case f.DOWN:a._move("next",c);c.preventDefault();break;case f.ENTER:case f.NUMPAD_ENTER:if(a.menu.active){g=true;c.preventDefault()}case f.TAB:if(!a.menu.active)return;a.menu.select(c);break;case f.ESCAPE:a.element.val(a.term);a.close(c);break;default:clearTimeout(a.searching);a.searching=setTimeout(function(){if(a.term!= -a.element.val()){a.selectedItem=null;a.search(null,c)}},a.options.delay);break}}}).bind("keypress.autocomplete",function(c){if(g){g=false;c.preventDefault()}}).bind("focus.autocomplete",function(){if(!a.options.disabled){a.selectedItem=null;a.previous=a.element.val()}}).bind("blur.autocomplete",function(c){if(!a.options.disabled){clearTimeout(a.searching);a.closing=setTimeout(function(){a.close(c);a._change(c)},150)}});this._initSource();this.response=function(){return a._response.apply(a,arguments)}; -this.menu=d("
        ").addClass("ui-autocomplete").appendTo(d(this.options.appendTo||"body",b)[0]).mousedown(function(c){var f=a.menu.element[0];d(c.target).closest(".ui-menu-item").length||setTimeout(function(){d(document).one("mousedown",function(h){h.target!==a.element[0]&&h.target!==f&&!d.ui.contains(f,h.target)&&a.close()})},1);setTimeout(function(){clearTimeout(a.closing)},13)}).menu({focus:function(c,f){f=f.item.data("item.autocomplete");false!==a._trigger("focus",c,{item:f})&&/^key/.test(c.originalEvent.type)&& -a.element.val(f.value)},selected:function(c,f){var h=f.item.data("item.autocomplete"),i=a.previous;if(a.element[0]!==b.activeElement){a.element.focus();a.previous=i;setTimeout(function(){a.previous=i;a.selectedItem=h},1)}false!==a._trigger("select",c,{item:h})&&a.element.val(h.value);a.term=a.element.val();a.close(c);a.selectedItem=h},blur:function(){a.menu.element.is(":visible")&&a.element.val()!==a.term&&a.element.val(a.term)}}).zIndex(this.element.zIndex()+1).css({top:0,left:0}).hide().data("menu"); -d.fn.bgiframe&&this.menu.element.bgiframe()},destroy:function(){this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete").removeAttr("role").removeAttr("aria-autocomplete").removeAttr("aria-haspopup");this.menu.element.remove();d.Widget.prototype.destroy.call(this)},_setOption:function(a,b){d.Widget.prototype._setOption.apply(this,arguments);a==="source"&&this._initSource();if(a==="appendTo")this.menu.element.appendTo(d(b||"body",this.element[0].ownerDocument)[0]);a==="disabled"&& -b&&this.xhr&&this.xhr.abort()},_initSource:function(){var a=this,b,g;if(d.isArray(this.options.source)){b=this.options.source;this.source=function(c,f){f(d.ui.autocomplete.filter(b,c.term))}}else if(typeof this.options.source==="string"){g=this.options.source;this.source=function(c,f){a.xhr&&a.xhr.abort();a.xhr=d.ajax({url:g,data:c,dataType:"json",autocompleteRequest:++e,success:function(h){this.autocompleteRequest===e&&f(h)},error:function(){this.autocompleteRequest===e&&f([])}})}}else this.source= -this.options.source},search:function(a,b){a=a!=null?a:this.element.val();this.term=this.element.val();if(a.length").data("item.autocomplete",b).append(d("").text(b.label)).appendTo(a)},_move:function(a,b){if(this.menu.element.is(":visible"))if(this.menu.first()&&/^previous/.test(a)||this.menu.last()&&/^next/.test(a)){this.element.val(this.term);this.menu.deactivate()}else this.menu[a](b);else this.search(null,b)},widget:function(){return this.menu.element}});d.extend(d.ui.autocomplete,{escapeRegex:function(a){return a.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, -"\\$&")},filter:function(a,b){var g=new RegExp(d.ui.autocomplete.escapeRegex(b),"i");return d.grep(a,function(c){return g.test(c.label||c.value||c)})}})})(jQuery); -(function(d){d.widget("ui.menu",{_create:function(){var e=this;this.element.addClass("ui-menu ui-widget ui-widget-content ui-corner-all").attr({role:"listbox","aria-activedescendant":"ui-active-menuitem"}).click(function(a){if(d(a.target).closest(".ui-menu-item a").length){a.preventDefault();e.select(a)}});this.refresh()},refresh:function(){var e=this;this.element.children("li:not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","menuitem").children("a").addClass("ui-corner-all").attr("tabindex", --1).mouseenter(function(a){e.activate(a,d(this).parent())}).mouseleave(function(){e.deactivate()})},activate:function(e,a){this.deactivate();if(this.hasScroll()){var b=a.offset().top-this.element.offset().top,g=this.element.scrollTop(),c=this.element.height();if(b<0)this.element.scrollTop(g+b);else b>=c&&this.element.scrollTop(g+b-c+a.height())}this.active=a.eq(0).children("a").addClass("ui-state-hover").attr("id","ui-active-menuitem").end();this._trigger("focus",e,{item:a})},deactivate:function(){if(this.active){this.active.children("a").removeClass("ui-state-hover").removeAttr("id"); -this._trigger("blur");this.active=null}},next:function(e){this.move("next",".ui-menu-item:first",e)},previous:function(e){this.move("prev",".ui-menu-item:last",e)},first:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},last:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},move:function(e,a,b){if(this.active){e=this.active[e+"All"](".ui-menu-item").eq(0);e.length?this.activate(b,e):this.activate(b,this.element.children(a))}else this.activate(b, -this.element.children(a))},nextPage:function(e){if(this.hasScroll())if(!this.active||this.last())this.activate(e,this.element.children(".ui-menu-item:first"));else{var a=this.active.offset().top,b=this.element.height(),g=this.element.children(".ui-menu-item").filter(function(){var c=d(this).offset().top-a-b+d(this).height();return c<10&&c>-10});g.length||(g=this.element.children(".ui-menu-item:last"));this.activate(e,g)}else this.activate(e,this.element.children(".ui-menu-item").filter(!this.active|| -this.last()?":first":":last"))},previousPage:function(e){if(this.hasScroll())if(!this.active||this.first())this.activate(e,this.element.children(".ui-menu-item:last"));else{var a=this.active.offset().top,b=this.element.height();result=this.element.children(".ui-menu-item").filter(function(){var g=d(this).offset().top-a+b-d(this).height();return g<10&&g>-10});result.length||(result=this.element.children(".ui-menu-item:first"));this.activate(e,result)}else this.activate(e,this.element.children(".ui-menu-item").filter(!this.active|| -this.first()?":last":":first"))},hasScroll:function(){return this.element.height()").addClass("ui-button-text").html(this.options.label).appendTo(a.empty()).text(),e=this.options.icons,f=e.primary&&e.secondary,d=[];if(e.primary||e.secondary){if(this.options.text)d.push("ui-button-text-icon"+(f?"s":e.primary?"-primary":"-secondary"));e.primary&&a.prepend("");e.secondary&&a.append("");if(!this.options.text){d.push(f?"ui-button-icons-only": -"ui-button-icon-only");this.hasTitle||a.attr("title",c)}}else d.push("ui-button-text-only");a.addClass(d.join(" "))}}});b.widget("ui.buttonset",{options:{items:":button, :submit, :reset, :checkbox, :radio, a, :data(button)"},_create:function(){this.element.addClass("ui-buttonset")},_init:function(){this.refresh()},_setOption:function(a,c){a==="disabled"&&this.buttons.button("option",a,c);b.Widget.prototype._setOption.apply(this,arguments)},refresh:function(){var a=this.element.css("direction")=== -"ltr";this.buttons=this.element.find(this.options.items).filter(":ui-button").button("refresh").end().not(":ui-button").button().end().map(function(){return b(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass(a?"ui-corner-left":"ui-corner-right").end().filter(":last").addClass(a?"ui-corner-right":"ui-corner-left").end().end()},destroy:function(){this.element.removeClass("ui-buttonset");this.buttons.map(function(){return b(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy"); -b.Widget.prototype.destroy.call(this)}})})(jQuery); -;/* - * jQuery UI Dialog 1.8.16 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Dialog - * - * Depends: - * jquery.ui.core.js - * jquery.ui.widget.js - * jquery.ui.button.js - * jquery.ui.draggable.js - * jquery.ui.mouse.js - * jquery.ui.position.js - * jquery.ui.resizable.js - */ -(function(c,l){var m={buttons:true,height:true,maxHeight:true,maxWidth:true,minHeight:true,minWidth:true,width:true},n={maxHeight:true,maxWidth:true,minHeight:true,minWidth:true},o=c.attrFn||{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true,click:true};c.widget("ui.dialog",{options:{autoOpen:true,buttons:{},closeOnEscape:true,closeText:"close",dialogClass:"",draggable:true,hide:null,height:"auto",maxHeight:false,maxWidth:false,minHeight:150,minWidth:150,modal:false, -position:{my:"center",at:"center",collision:"fit",using:function(a){var b=c(this).css(a).offset().top;b<0&&c(this).css("top",a.top-b)}},resizable:true,show:null,stack:true,title:"",width:300,zIndex:1E3},_create:function(){this.originalTitle=this.element.attr("title");if(typeof this.originalTitle!=="string")this.originalTitle="";this.options.title=this.options.title||this.originalTitle;var a=this,b=a.options,d=b.title||" ",e=c.ui.dialog.getTitleId(a.element),g=(a.uiDialog=c("
        ")).appendTo(document.body).hide().addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+ -b.dialogClass).css({zIndex:b.zIndex}).attr("tabIndex",-1).css("outline",0).keydown(function(i){if(b.closeOnEscape&&!i.isDefaultPrevented()&&i.keyCode&&i.keyCode===c.ui.keyCode.ESCAPE){a.close(i);i.preventDefault()}}).attr({role:"dialog","aria-labelledby":e}).mousedown(function(i){a.moveToTop(false,i)});a.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(g);var f=(a.uiDialogTitlebar=c("
        ")).addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(g), -h=c('').addClass("ui-dialog-titlebar-close ui-corner-all").attr("role","button").hover(function(){h.addClass("ui-state-hover")},function(){h.removeClass("ui-state-hover")}).focus(function(){h.addClass("ui-state-focus")}).blur(function(){h.removeClass("ui-state-focus")}).click(function(i){a.close(i);return false}).appendTo(f);(a.uiDialogTitlebarCloseText=c("")).addClass("ui-icon ui-icon-closethick").text(b.closeText).appendTo(h);c("").addClass("ui-dialog-title").attr("id", -e).html(d).prependTo(f);if(c.isFunction(b.beforeclose)&&!c.isFunction(b.beforeClose))b.beforeClose=b.beforeclose;f.find("*").add(f).disableSelection();b.draggable&&c.fn.draggable&&a._makeDraggable();b.resizable&&c.fn.resizable&&a._makeResizable();a._createButtons(b.buttons);a._isOpen=false;c.fn.bgiframe&&g.bgiframe()},_init:function(){this.options.autoOpen&&this.open()},destroy:function(){var a=this;a.overlay&&a.overlay.destroy();a.uiDialog.hide();a.element.unbind(".dialog").removeData("dialog").removeClass("ui-dialog-content ui-widget-content").hide().appendTo("body"); -a.uiDialog.remove();a.originalTitle&&a.element.attr("title",a.originalTitle);return a},widget:function(){return this.uiDialog},close:function(a){var b=this,d,e;if(false!==b._trigger("beforeClose",a)){b.overlay&&b.overlay.destroy();b.uiDialog.unbind("keypress.ui-dialog");b._isOpen=false;if(b.options.hide)b.uiDialog.hide(b.options.hide,function(){b._trigger("close",a)});else{b.uiDialog.hide();b._trigger("close",a)}c.ui.dialog.overlay.resize();if(b.options.modal){d=0;c(".ui-dialog").each(function(){if(this!== -b.uiDialog[0]){e=c(this).css("z-index");isNaN(e)||(d=Math.max(d,e))}});c.ui.dialog.maxZ=d}return b}},isOpen:function(){return this._isOpen},moveToTop:function(a,b){var d=this,e=d.options;if(e.modal&&!a||!e.stack&&!e.modal)return d._trigger("focus",b);if(e.zIndex>c.ui.dialog.maxZ)c.ui.dialog.maxZ=e.zIndex;if(d.overlay){c.ui.dialog.maxZ+=1;d.overlay.$el.css("z-index",c.ui.dialog.overlay.maxZ=c.ui.dialog.maxZ)}a={scrollTop:d.element.scrollTop(),scrollLeft:d.element.scrollLeft()};c.ui.dialog.maxZ+=1; -d.uiDialog.css("z-index",c.ui.dialog.maxZ);d.element.attr(a);d._trigger("focus",b);return d},open:function(){if(!this._isOpen){var a=this,b=a.options,d=a.uiDialog;a.overlay=b.modal?new c.ui.dialog.overlay(a):null;a._size();a._position(b.position);d.show(b.show);a.moveToTop(true);b.modal&&d.bind("keypress.ui-dialog",function(e){if(e.keyCode===c.ui.keyCode.TAB){var g=c(":tabbable",this),f=g.filter(":first");g=g.filter(":last");if(e.target===g[0]&&!e.shiftKey){f.focus(1);return false}else if(e.target=== -f[0]&&e.shiftKey){g.focus(1);return false}}});c(a.element.find(":tabbable").get().concat(d.find(".ui-dialog-buttonpane :tabbable").get().concat(d.get()))).eq(0).focus();a._isOpen=true;a._trigger("open");return a}},_createButtons:function(a){var b=this,d=false,e=c("
        ").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),g=c("
        ").addClass("ui-dialog-buttonset").appendTo(e);b.uiDialog.find(".ui-dialog-buttonpane").remove();typeof a==="object"&&a!==null&&c.each(a, -function(){return!(d=true)});if(d){c.each(a,function(f,h){h=c.isFunction(h)?{click:h,text:f}:h;var i=c('').click(function(){h.click.apply(b.element[0],arguments)}).appendTo(g);c.each(h,function(j,k){if(j!=="click")j in o?i[j](k):i.attr(j,k)});c.fn.button&&i.button()});e.appendTo(b.uiDialog)}},_makeDraggable:function(){function a(f){return{position:f.position,offset:f.offset}}var b=this,d=b.options,e=c(document),g;b.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close", -handle:".ui-dialog-titlebar",containment:"document",start:function(f,h){g=d.height==="auto"?"auto":c(this).height();c(this).height(c(this).height()).addClass("ui-dialog-dragging");b._trigger("dragStart",f,a(h))},drag:function(f,h){b._trigger("drag",f,a(h))},stop:function(f,h){d.position=[h.position.left-e.scrollLeft(),h.position.top-e.scrollTop()];c(this).removeClass("ui-dialog-dragging").height(g);b._trigger("dragStop",f,a(h));c.ui.dialog.overlay.resize()}})},_makeResizable:function(a){function b(f){return{originalPosition:f.originalPosition, -originalSize:f.originalSize,position:f.position,size:f.size}}a=a===l?this.options.resizable:a;var d=this,e=d.options,g=d.uiDialog.css("position");a=typeof a==="string"?a:"n,e,s,w,se,sw,ne,nw";d.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:d.element,maxWidth:e.maxWidth,maxHeight:e.maxHeight,minWidth:e.minWidth,minHeight:d._minHeight(),handles:a,start:function(f,h){c(this).addClass("ui-dialog-resizing");d._trigger("resizeStart",f,b(h))},resize:function(f,h){d._trigger("resize", -f,b(h))},stop:function(f,h){c(this).removeClass("ui-dialog-resizing");e.height=c(this).height();e.width=c(this).width();d._trigger("resizeStop",f,b(h));c.ui.dialog.overlay.resize()}}).css("position",g).find(".ui-resizable-se").addClass("ui-icon ui-icon-grip-diagonal-se")},_minHeight:function(){var a=this.options;return a.height==="auto"?a.minHeight:Math.min(a.minHeight,a.height)},_position:function(a){var b=[],d=[0,0],e;if(a){if(typeof a==="string"||typeof a==="object"&&"0"in a){b=a.split?a.split(" "): -[a[0],a[1]];if(b.length===1)b[1]=b[0];c.each(["left","top"],function(g,f){if(+b[g]===b[g]){d[g]=b[g];b[g]=f}});a={my:b.join(" "),at:b.join(" "),offset:d.join(" ")}}a=c.extend({},c.ui.dialog.prototype.options.position,a)}else a=c.ui.dialog.prototype.options.position;(e=this.uiDialog.is(":visible"))||this.uiDialog.show();this.uiDialog.css({top:0,left:0}).position(c.extend({of:window},a));e||this.uiDialog.hide()},_setOptions:function(a){var b=this,d={},e=false;c.each(a,function(g,f){b._setOption(g,f); -if(g in m)e=true;if(g in n)d[g]=f});e&&this._size();this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option",d)},_setOption:function(a,b){var d=this,e=d.uiDialog;switch(a){case "beforeclose":a="beforeClose";break;case "buttons":d._createButtons(b);break;case "closeText":d.uiDialogTitlebarCloseText.text(""+b);break;case "dialogClass":e.removeClass(d.options.dialogClass).addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+b);break;case "disabled":b?e.addClass("ui-dialog-disabled"): -e.removeClass("ui-dialog-disabled");break;case "draggable":var g=e.is(":data(draggable)");g&&!b&&e.draggable("destroy");!g&&b&&d._makeDraggable();break;case "position":d._position(b);break;case "resizable":(g=e.is(":data(resizable)"))&&!b&&e.resizable("destroy");g&&typeof b==="string"&&e.resizable("option","handles",b);!g&&b!==false&&d._makeResizable(b);break;case "title":c(".ui-dialog-title",d.uiDialogTitlebar).html(""+(b||" "));break}c.Widget.prototype._setOption.apply(d,arguments)},_size:function(){var a= -this.options,b,d,e=this.uiDialog.is(":visible");this.element.show().css({width:"auto",minHeight:0,height:0});if(a.minWidth>a.width)a.width=a.minWidth;b=this.uiDialog.css({height:"auto",width:a.width}).height();d=Math.max(0,a.minHeight-b);if(a.height==="auto")if(c.support.minHeight)this.element.css({minHeight:d,height:"auto"});else{this.uiDialog.show();a=this.element.css("height","auto").height();e||this.uiDialog.hide();this.element.height(Math.max(a,d))}else this.element.height(Math.max(a.height- -b,0));this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())}});c.extend(c.ui.dialog,{version:"1.8.16",uuid:0,maxZ:0,getTitleId:function(a){a=a.attr("id");if(!a){this.uuid+=1;a=this.uuid}return"ui-dialog-title-"+a},overlay:function(a){this.$el=c.ui.dialog.overlay.create(a)}});c.extend(c.ui.dialog.overlay,{instances:[],oldInstances:[],maxZ:0,events:c.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),function(a){return a+".dialog-overlay"}).join(" "), -create:function(a){if(this.instances.length===0){setTimeout(function(){c.ui.dialog.overlay.instances.length&&c(document).bind(c.ui.dialog.overlay.events,function(d){if(c(d.target).zIndex()").addClass("ui-widget-overlay")).appendTo(document.body).css({width:this.width(),height:this.height()});c.fn.bgiframe&&b.bgiframe();this.instances.push(b);return b},destroy:function(a){var b=c.inArray(a,this.instances);b!=-1&&this.oldInstances.push(this.instances.splice(b,1)[0]);this.instances.length===0&&c([document,window]).unbind(".dialog-overlay");a.remove();var d=0;c.each(this.instances,function(){d=Math.max(d,this.css("z-index"))});this.maxZ=d},height:function(){var a,b;if(c.browser.msie&& -c.browser.version<7){a=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight);b=Math.max(document.documentElement.offsetHeight,document.body.offsetHeight);return a").appendTo(this.element).addClass("ui-slider-range ui-widget-header"+(b.range==="min"||b.range==="max"?" ui-slider-range-"+b.range:""))}for(var j=c.length;j"); -this.handles=c.add(d(e.join("")).appendTo(a.element));this.handle=this.handles.eq(0);this.handles.add(this.range).filter("a").click(function(g){g.preventDefault()}).hover(function(){b.disabled||d(this).addClass("ui-state-hover")},function(){d(this).removeClass("ui-state-hover")}).focus(function(){if(b.disabled)d(this).blur();else{d(".ui-slider .ui-state-focus").removeClass("ui-state-focus");d(this).addClass("ui-state-focus")}}).blur(function(){d(this).removeClass("ui-state-focus")});this.handles.each(function(g){d(this).data("index.ui-slider-handle", -g)});this.handles.keydown(function(g){var k=true,l=d(this).data("index.ui-slider-handle"),i,h,m;if(!a.options.disabled){switch(g.keyCode){case d.ui.keyCode.HOME:case d.ui.keyCode.END:case d.ui.keyCode.PAGE_UP:case d.ui.keyCode.PAGE_DOWN:case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:k=false;if(!a._keySliding){a._keySliding=true;d(this).addClass("ui-state-active");i=a._start(g,l);if(i===false)return}break}m=a.options.step;i=a.options.values&&a.options.values.length? -(h=a.values(l)):(h=a.value());switch(g.keyCode){case d.ui.keyCode.HOME:h=a._valueMin();break;case d.ui.keyCode.END:h=a._valueMax();break;case d.ui.keyCode.PAGE_UP:h=a._trimAlignValue(i+(a._valueMax()-a._valueMin())/5);break;case d.ui.keyCode.PAGE_DOWN:h=a._trimAlignValue(i-(a._valueMax()-a._valueMin())/5);break;case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:if(i===a._valueMax())return;h=a._trimAlignValue(i+m);break;case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:if(i===a._valueMin())return;h=a._trimAlignValue(i- -m);break}a._slide(g,l,h);return k}}).keyup(function(g){var k=d(this).data("index.ui-slider-handle");if(a._keySliding){a._keySliding=false;a._stop(g,k);a._change(g,k);d(this).removeClass("ui-state-active")}});this._refreshValue();this._animateOff=false},destroy:function(){this.handles.remove();this.range.remove();this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-slider-disabled ui-widget ui-widget-content ui-corner-all").removeData("slider").unbind(".slider");this._mouseDestroy(); -return this},_mouseCapture:function(a){var b=this.options,c,f,e,j,g;if(b.disabled)return false;this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()};this.elementOffset=this.element.offset();c=this._normValueFromMouse({x:a.pageX,y:a.pageY});f=this._valueMax()-this._valueMin()+1;j=this;this.handles.each(function(k){var l=Math.abs(c-j.values(k));if(f>l){f=l;e=d(this);g=k}});if(b.range===true&&this.values(1)===b.min){g+=1;e=d(this.handles[g])}if(this._start(a,g)===false)return false; -this._mouseSliding=true;j._handleIndex=g;e.addClass("ui-state-active").focus();b=e.offset();this._clickOffset=!d(a.target).parents().andSelf().is(".ui-slider-handle")?{left:0,top:0}:{left:a.pageX-b.left-e.width()/2,top:a.pageY-b.top-e.height()/2-(parseInt(e.css("borderTopWidth"),10)||0)-(parseInt(e.css("borderBottomWidth"),10)||0)+(parseInt(e.css("marginTop"),10)||0)};this.handles.hasClass("ui-state-hover")||this._slide(a,g,c);return this._animateOff=true},_mouseStart:function(){return true},_mouseDrag:function(a){var b= -this._normValueFromMouse({x:a.pageX,y:a.pageY});this._slide(a,this._handleIndex,b);return false},_mouseStop:function(a){this.handles.removeClass("ui-state-active");this._mouseSliding=false;this._stop(a,this._handleIndex);this._change(a,this._handleIndex);this._clickOffset=this._handleIndex=null;return this._animateOff=false},_detectOrientation:function(){this.orientation=this.options.orientation==="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(a){var b;if(this.orientation==="horizontal"){b= -this.elementSize.width;a=a.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)}else{b=this.elementSize.height;a=a.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)}b=a/b;if(b>1)b=1;if(b<0)b=0;if(this.orientation==="vertical")b=1-b;a=this._valueMax()-this._valueMin();return this._trimAlignValue(this._valueMin()+b*a)},_start:function(a,b){var c={handle:this.handles[b],value:this.value()};if(this.options.values&&this.options.values.length){c.value=this.values(b); -c.values=this.values()}return this._trigger("start",a,c)},_slide:function(a,b,c){var f;if(this.options.values&&this.options.values.length){f=this.values(b?0:1);if(this.options.values.length===2&&this.options.range===true&&(b===0&&c>f||b===1&&c1){this.options.values[a]=this._trimAlignValue(b);this._refreshValue();this._change(null,a)}else if(arguments.length)if(d.isArray(arguments[0])){c=this.options.values;f=arguments[0];for(e=0;e=this._valueMax())return this._valueMax();var b=this.options.step>0?this.options.step:1,c=(a-this._valueMin())%b;a=a-c;if(Math.abs(c)*2>=b)a+=c>0?b:-b;return parseFloat(a.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},_refreshValue:function(){var a= -this.options.range,b=this.options,c=this,f=!this._animateOff?b.animate:false,e,j={},g,k,l,i;if(this.options.values&&this.options.values.length)this.handles.each(function(h){e=(c.values(h)-c._valueMin())/(c._valueMax()-c._valueMin())*100;j[c.orientation==="horizontal"?"left":"bottom"]=e+"%";d(this).stop(1,1)[f?"animate":"css"](j,b.animate);if(c.options.range===true)if(c.orientation==="horizontal"){if(h===0)c.range.stop(1,1)[f?"animate":"css"]({left:e+"%"},b.animate);if(h===1)c.range[f?"animate":"css"]({width:e- -g+"%"},{queue:false,duration:b.animate})}else{if(h===0)c.range.stop(1,1)[f?"animate":"css"]({bottom:e+"%"},b.animate);if(h===1)c.range[f?"animate":"css"]({height:e-g+"%"},{queue:false,duration:b.animate})}g=e});else{k=this.value();l=this._valueMin();i=this._valueMax();e=i!==l?(k-l)/(i-l)*100:0;j[c.orientation==="horizontal"?"left":"bottom"]=e+"%";this.handle.stop(1,1)[f?"animate":"css"](j,b.animate);if(a==="min"&&this.orientation==="horizontal")this.range.stop(1,1)[f?"animate":"css"]({width:e+"%"}, -b.animate);if(a==="max"&&this.orientation==="horizontal")this.range[f?"animate":"css"]({width:100-e+"%"},{queue:false,duration:b.animate});if(a==="min"&&this.orientation==="vertical")this.range.stop(1,1)[f?"animate":"css"]({height:e+"%"},b.animate);if(a==="max"&&this.orientation==="vertical")this.range[f?"animate":"css"]({height:100-e+"%"},{queue:false,duration:b.animate})}}});d.extend(d.ui.slider,{version:"1.8.16"})})(jQuery); -;/* - * jQuery UI Tabs 1.8.16 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Tabs - * - * Depends: - * jquery.ui.core.js - * jquery.ui.widget.js - */ -(function(d,p){function u(){return++v}function w(){return++x}var v=0,x=0;d.widget("ui.tabs",{options:{add:null,ajaxOptions:null,cache:false,cookie:null,collapsible:false,disable:null,disabled:[],enable:null,event:"click",fx:null,idPrefix:"ui-tabs-",load:null,panelTemplate:"
        ",remove:null,select:null,show:null,spinner:"Loading…",tabTemplate:"
      • #{label}
      • "},_create:function(){this._tabify(true)},_setOption:function(b,e){if(b=="selected")this.options.collapsible&& -e==this.options.selected||this.select(e);else{this.options[b]=e;this._tabify()}},_tabId:function(b){return b.title&&b.title.replace(/\s/g,"_").replace(/[^\w\u00c0-\uFFFF-]/g,"")||this.options.idPrefix+u()},_sanitizeSelector:function(b){return b.replace(/:/g,"\\:")},_cookie:function(){var b=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+w());return d.cookie.apply(null,[b].concat(d.makeArray(arguments)))},_ui:function(b,e){return{tab:b,panel:e,index:this.anchors.index(b)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var b= -d(this);b.html(b.data("label.tabs")).removeData("label.tabs")})},_tabify:function(b){function e(g,f){g.css("display","");!d.support.opacity&&f.opacity&&g[0].style.removeAttribute("filter")}var a=this,c=this.options,h=/^#.+/;this.list=this.element.find("ol,ul").eq(0);this.lis=d(" > li:has(a[href])",this.list);this.anchors=this.lis.map(function(){return d("a",this)[0]});this.panels=d([]);this.anchors.each(function(g,f){var i=d(f).attr("href"),l=i.split("#")[0],q;if(l&&(l===location.toString().split("#")[0]|| -(q=d("base")[0])&&l===q.href)){i=f.hash;f.href=i}if(h.test(i))a.panels=a.panels.add(a.element.find(a._sanitizeSelector(i)));else if(i&&i!=="#"){d.data(f,"href.tabs",i);d.data(f,"load.tabs",i.replace(/#.*$/,""));i=a._tabId(f);f.href="#"+i;f=a.element.find("#"+i);if(!f.length){f=d(c.panelTemplate).attr("id",i).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(a.panels[g-1]||a.list);f.data("destroy.tabs",true)}a.panels=a.panels.add(f)}else c.disabled.push(g)});if(b){this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all"); -this.list.addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.lis.addClass("ui-state-default ui-corner-top");this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom");if(c.selected===p){location.hash&&this.anchors.each(function(g,f){if(f.hash==location.hash){c.selected=g;return false}});if(typeof c.selected!=="number"&&c.cookie)c.selected=parseInt(a._cookie(),10);if(typeof c.selected!=="number"&&this.lis.filter(".ui-tabs-selected").length)c.selected= -this.lis.index(this.lis.filter(".ui-tabs-selected"));c.selected=c.selected||(this.lis.length?0:-1)}else if(c.selected===null)c.selected=-1;c.selected=c.selected>=0&&this.anchors[c.selected]||c.selected<0?c.selected:0;c.disabled=d.unique(c.disabled.concat(d.map(this.lis.filter(".ui-state-disabled"),function(g){return a.lis.index(g)}))).sort();d.inArray(c.selected,c.disabled)!=-1&&c.disabled.splice(d.inArray(c.selected,c.disabled),1);this.panels.addClass("ui-tabs-hide");this.lis.removeClass("ui-tabs-selected ui-state-active"); -if(c.selected>=0&&this.anchors.length){a.element.find(a._sanitizeSelector(a.anchors[c.selected].hash)).removeClass("ui-tabs-hide");this.lis.eq(c.selected).addClass("ui-tabs-selected ui-state-active");a.element.queue("tabs",function(){a._trigger("show",null,a._ui(a.anchors[c.selected],a.element.find(a._sanitizeSelector(a.anchors[c.selected].hash))[0]))});this.load(c.selected)}d(window).bind("unload",function(){a.lis.add(a.anchors).unbind(".tabs");a.lis=a.anchors=a.panels=null})}else c.selected=this.lis.index(this.lis.filter(".ui-tabs-selected")); -this.element[c.collapsible?"addClass":"removeClass"]("ui-tabs-collapsible");c.cookie&&this._cookie(c.selected,c.cookie);b=0;for(var j;j=this.lis[b];b++)d(j)[d.inArray(b,c.disabled)!=-1&&!d(j).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled");c.cache===false&&this.anchors.removeData("cache.tabs");this.lis.add(this.anchors).unbind(".tabs");if(c.event!=="mouseover"){var k=function(g,f){f.is(":not(.ui-state-disabled)")&&f.addClass("ui-state-"+g)},n=function(g,f){f.removeClass("ui-state-"+ -g)};this.lis.bind("mouseover.tabs",function(){k("hover",d(this))});this.lis.bind("mouseout.tabs",function(){n("hover",d(this))});this.anchors.bind("focus.tabs",function(){k("focus",d(this).closest("li"))});this.anchors.bind("blur.tabs",function(){n("focus",d(this).closest("li"))})}var m,o;if(c.fx)if(d.isArray(c.fx)){m=c.fx[0];o=c.fx[1]}else m=o=c.fx;var r=o?function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.hide().removeClass("ui-tabs-hide").animate(o,o.duration||"normal", -function(){e(f,o);a._trigger("show",null,a._ui(g,f[0]))})}:function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.removeClass("ui-tabs-hide");a._trigger("show",null,a._ui(g,f[0]))},s=m?function(g,f){f.animate(m,m.duration||"normal",function(){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");e(f,m);a.element.dequeue("tabs")})}:function(g,f){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");a.element.dequeue("tabs")}; -this.anchors.bind(c.event+".tabs",function(){var g=this,f=d(g).closest("li"),i=a.panels.filter(":not(.ui-tabs-hide)"),l=a.element.find(a._sanitizeSelector(g.hash));if(f.hasClass("ui-tabs-selected")&&!c.collapsible||f.hasClass("ui-state-disabled")||f.hasClass("ui-state-processing")||a.panels.filter(":animated").length||a._trigger("select",null,a._ui(this,l[0]))===false){this.blur();return false}c.selected=a.anchors.index(this);a.abort();if(c.collapsible)if(f.hasClass("ui-tabs-selected")){c.selected= --1;c.cookie&&a._cookie(c.selected,c.cookie);a.element.queue("tabs",function(){s(g,i)}).dequeue("tabs");this.blur();return false}else if(!i.length){c.cookie&&a._cookie(c.selected,c.cookie);a.element.queue("tabs",function(){r(g,l)});a.load(a.anchors.index(this));this.blur();return false}c.cookie&&a._cookie(c.selected,c.cookie);if(l.length){i.length&&a.element.queue("tabs",function(){s(g,i)});a.element.queue("tabs",function(){r(g,l)});a.load(a.anchors.index(this))}else throw"jQuery UI Tabs: Mismatching fragment identifier."; -d.browser.msie&&this.blur()});this.anchors.bind("click.tabs",function(){return false})},_getIndex:function(b){if(typeof b=="string")b=this.anchors.index(this.anchors.filter("[href$="+b+"]"));return b},destroy:function(){var b=this.options;this.abort();this.element.unbind(".tabs").removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible").removeData("tabs");this.list.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.anchors.each(function(){var e= -d.data(this,"href.tabs");if(e)this.href=e;var a=d(this).unbind(".tabs");d.each(["href","load","cache"],function(c,h){a.removeData(h+".tabs")})});this.lis.unbind(".tabs").add(this.panels).each(function(){d.data(this,"destroy.tabs")?d(this).remove():d(this).removeClass("ui-state-default ui-corner-top ui-tabs-selected ui-state-active ui-state-hover ui-state-focus ui-state-disabled ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide")});b.cookie&&this._cookie(null,b.cookie);return this},add:function(b, -e,a){if(a===p)a=this.anchors.length;var c=this,h=this.options;e=d(h.tabTemplate.replace(/#\{href\}/g,b).replace(/#\{label\}/g,e));b=!b.indexOf("#")?b.replace("#",""):this._tabId(d("a",e)[0]);e.addClass("ui-state-default ui-corner-top").data("destroy.tabs",true);var j=c.element.find("#"+b);j.length||(j=d(h.panelTemplate).attr("id",b).data("destroy.tabs",true));j.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide");if(a>=this.lis.length){e.appendTo(this.list);j.appendTo(this.list[0].parentNode)}else{e.insertBefore(this.lis[a]); -j.insertBefore(this.panels[a])}h.disabled=d.map(h.disabled,function(k){return k>=a?++k:k});this._tabify();if(this.anchors.length==1){h.selected=0;e.addClass("ui-tabs-selected ui-state-active");j.removeClass("ui-tabs-hide");this.element.queue("tabs",function(){c._trigger("show",null,c._ui(c.anchors[0],c.panels[0]))});this.load(0)}this._trigger("add",null,this._ui(this.anchors[a],this.panels[a]));return this},remove:function(b){b=this._getIndex(b);var e=this.options,a=this.lis.eq(b).remove(),c=this.panels.eq(b).remove(); -if(a.hasClass("ui-tabs-selected")&&this.anchors.length>1)this.select(b+(b+1=b?--h:h});this._tabify();this._trigger("remove",null,this._ui(a.find("a")[0],c[0]));return this},enable:function(b){b=this._getIndex(b);var e=this.options;if(d.inArray(b,e.disabled)!=-1){this.lis.eq(b).removeClass("ui-state-disabled");e.disabled=d.grep(e.disabled,function(a){return a!=b});this._trigger("enable",null, -this._ui(this.anchors[b],this.panels[b]));return this}},disable:function(b){b=this._getIndex(b);var e=this.options;if(b!=e.selected){this.lis.eq(b).addClass("ui-state-disabled");e.disabled.push(b);e.disabled.sort();this._trigger("disable",null,this._ui(this.anchors[b],this.panels[b]))}return this},select:function(b){b=this._getIndex(b);if(b==-1)if(this.options.collapsible&&this.options.selected!=-1)b=this.options.selected;else return this;this.anchors.eq(b).trigger(this.options.event+".tabs");return this}, -load:function(b){b=this._getIndex(b);var e=this,a=this.options,c=this.anchors.eq(b)[0],h=d.data(c,"load.tabs");this.abort();if(!h||this.element.queue("tabs").length!==0&&d.data(c,"cache.tabs"))this.element.dequeue("tabs");else{this.lis.eq(b).addClass("ui-state-processing");if(a.spinner){var j=d("span",c);j.data("label.tabs",j.html()).html(a.spinner)}this.xhr=d.ajax(d.extend({},a.ajaxOptions,{url:h,success:function(k,n){e.element.find(e._sanitizeSelector(c.hash)).html(k);e._cleanup();a.cache&&d.data(c, -"cache.tabs",true);e._trigger("load",null,e._ui(e.anchors[b],e.panels[b]));try{a.ajaxOptions.success(k,n)}catch(m){}},error:function(k,n){e._cleanup();e._trigger("load",null,e._ui(e.anchors[b],e.panels[b]));try{a.ajaxOptions.error(k,n,b,c)}catch(m){}}}));e.element.dequeue("tabs");return this}},abort:function(){this.element.queue([]);this.panels.stop(false,true);this.element.queue("tabs",this.element.queue("tabs").splice(-2,2));if(this.xhr){this.xhr.abort();delete this.xhr}this._cleanup();return this}, -url:function(b,e){this.anchors.eq(b).removeData("cache.tabs").data("load.tabs",e);return this},length:function(){return this.anchors.length}});d.extend(d.ui.tabs,{version:"1.8.16"});d.extend(d.ui.tabs.prototype,{rotation:null,rotate:function(b,e){var a=this,c=this.options,h=a._rotate||(a._rotate=function(j){clearTimeout(a.rotation);a.rotation=setTimeout(function(){var k=c.selected;a.select(++k'))}function N(a){return a.bind("mouseout", -function(b){b=d(b.target).closest("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a");b.length&&b.removeClass("ui-state-hover ui-datepicker-prev-hover ui-datepicker-next-hover")}).bind("mouseover",function(b){b=d(b.target).closest("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a");if(!(d.datepicker._isDisabledDatepicker(J.inline?a.parent()[0]:J.input[0])||!b.length)){b.parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"); -b.addClass("ui-state-hover");b.hasClass("ui-datepicker-prev")&&b.addClass("ui-datepicker-prev-hover");b.hasClass("ui-datepicker-next")&&b.addClass("ui-datepicker-next-hover")}})}function H(a,b){d.extend(a,b);for(var c in b)if(b[c]==null||b[c]==C)a[c]=b[c];return a}d.extend(d.ui,{datepicker:{version:"1.8.16"}});var B=(new Date).getTime(),J;d.extend(M.prototype,{markerClassName:"hasDatepicker",maxRows:4,log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv}, -setDefaults:function(a){H(this._defaults,a||{});return this},_attachDatepicker:function(a,b){var c=null;for(var e in this._defaults){var f=a.getAttribute("date:"+e);if(f){c=c||{};try{c[e]=eval(f)}catch(h){c[e]=f}}}e=a.nodeName.toLowerCase();f=e=="div"||e=="span";if(!a.id){this.uuid+=1;a.id="dp"+this.uuid}var i=this._newInst(d(a),f);i.settings=d.extend({},b||{},c||{});if(e=="input")this._connectDatepicker(a,i);else f&&this._inlineDatepicker(a,i)},_newInst:function(a,b){return{id:a[0].id.replace(/([^A-Za-z0-9_-])/g, -"\\\\$1"),input:a,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:b,dpDiv:!b?this.dpDiv:N(d('
        '))}},_connectDatepicker:function(a,b){var c=d(a);b.append=d([]);b.trigger=d([]);if(!c.hasClass(this.markerClassName)){this._attachments(c,b);c.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker", -function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});this._autoSize(b);d.data(a,"datepicker",b);b.settings.disabled&&this._disableDatepicker(a)}},_attachments:function(a,b){var c=this._get(b,"appendText"),e=this._get(b,"isRTL");b.append&&b.append.remove();if(c){b.append=d(''+c+"");a[e?"before":"after"](b.append)}a.unbind("focus",this._showDatepicker);b.trigger&&b.trigger.remove();c=this._get(b,"showOn");if(c== -"focus"||c=="both")a.focus(this._showDatepicker);if(c=="button"||c=="both"){c=this._get(b,"buttonText");var f=this._get(b,"buttonImage");b.trigger=d(this._get(b,"buttonImageOnly")?d("").addClass(this._triggerClass).attr({src:f,alt:c,title:c}):d('').addClass(this._triggerClass).html(f==""?c:d("").attr({src:f,alt:c,title:c})));a[e?"before":"after"](b.trigger);b.trigger.click(function(){d.datepicker._datepickerShowing&&d.datepicker._lastInput==a[0]?d.datepicker._hideDatepicker(): -d.datepicker._showDatepicker(a[0]);return false})}},_autoSize:function(a){if(this._get(a,"autoSize")&&!a.inline){var b=new Date(2009,11,20),c=this._get(a,"dateFormat");if(c.match(/[DM]/)){var e=function(f){for(var h=0,i=0,g=0;gh){h=f[g].length;i=g}return i};b.setMonth(e(this._get(a,c.match(/MM/)?"monthNames":"monthNamesShort")));b.setDate(e(this._get(a,c.match(/DD/)?"dayNames":"dayNamesShort"))+20-b.getDay())}a.input.attr("size",this._formatDate(a,b).length)}},_inlineDatepicker:function(a, -b){var c=d(a);if(!c.hasClass(this.markerClassName)){c.addClass(this.markerClassName).append(b.dpDiv).bind("setData.datepicker",function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});d.data(a,"datepicker",b);this._setDate(b,this._getDefaultDate(b),true);this._updateDatepicker(b);this._updateAlternate(b);b.settings.disabled&&this._disableDatepicker(a);b.dpDiv.css("display","block")}},_dialogDatepicker:function(a,b,c,e,f){a=this._dialogInst;if(!a){this.uuid+= -1;this._dialogInput=d('');this._dialogInput.keydown(this._doKeyDown);d("body").append(this._dialogInput);a=this._dialogInst=this._newInst(this._dialogInput,false);a.settings={};d.data(this._dialogInput[0],"datepicker",a)}H(a.settings,e||{});b=b&&b.constructor==Date?this._formatDate(a,b):b;this._dialogInput.val(b);this._pos=f?f.length?f:[f.pageX,f.pageY]:null;if(!this._pos)this._pos=[document.documentElement.clientWidth/ -2-100+(document.documentElement.scrollLeft||document.body.scrollLeft),document.documentElement.clientHeight/2-150+(document.documentElement.scrollTop||document.body.scrollTop)];this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px");a.settings.onSelect=c;this._inDialog=true;this.dpDiv.addClass(this._dialogClass);this._showDatepicker(this._dialogInput[0]);d.blockUI&&d.blockUI(this.dpDiv);d.data(this._dialogInput[0],"datepicker",a);return this},_destroyDatepicker:function(a){var b= -d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();d.removeData(a,"datepicker");if(e=="input"){c.append.remove();c.trigger.remove();b.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)}else if(e=="div"||e=="span")b.removeClass(this.markerClassName).empty()}},_enableDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e= -a.nodeName.toLowerCase();if(e=="input"){a.disabled=false;c.trigger.filter("button").each(function(){this.disabled=false}).end().filter("img").css({opacity:"1.0",cursor:""})}else if(e=="div"||e=="span"){b=b.children("."+this._inlineClass);b.children().removeClass("ui-state-disabled");b.find("select.ui-datepicker-month, select.ui-datepicker-year").removeAttr("disabled")}this._disabledInputs=d.map(this._disabledInputs,function(f){return f==a?null:f})}},_disableDatepicker:function(a){var b=d(a),c=d.data(a, -"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled=true;c.trigger.filter("button").each(function(){this.disabled=true}).end().filter("img").css({opacity:"0.5",cursor:"default"})}else if(e=="div"||e=="span"){b=b.children("."+this._inlineClass);b.children().addClass("ui-state-disabled");b.find("select.ui-datepicker-month, select.ui-datepicker-year").attr("disabled","disabled")}this._disabledInputs=d.map(this._disabledInputs,function(f){return f== -a?null:f});this._disabledInputs[this._disabledInputs.length]=a}},_isDisabledDatepicker:function(a){if(!a)return false;for(var b=0;b-1}},_doKeyUp:function(a){a=d.datepicker._getInst(a.target);if(a.input.val()!=a.lastVal)try{if(d.datepicker.parseDate(d.datepicker._get(a,"dateFormat"),a.input?a.input.val():null,d.datepicker._getFormatConfig(a))){d.datepicker._setDateFromField(a);d.datepicker._updateAlternate(a);d.datepicker._updateDatepicker(a)}}catch(b){d.datepicker.log(b)}return true},_showDatepicker:function(a){a=a.target||a;if(a.nodeName.toLowerCase()!="input")a=d("input", -a.parentNode)[0];if(!(d.datepicker._isDisabledDatepicker(a)||d.datepicker._lastInput==a)){var b=d.datepicker._getInst(a);if(d.datepicker._curInst&&d.datepicker._curInst!=b){d.datepicker._datepickerShowing&&d.datepicker._triggerOnClose(d.datepicker._curInst);d.datepicker._curInst.dpDiv.stop(true,true)}var c=d.datepicker._get(b,"beforeShow");c=c?c.apply(a,[a,b]):{};if(c!==false){H(b.settings,c);b.lastVal=null;d.datepicker._lastInput=a;d.datepicker._setDateFromField(b);if(d.datepicker._inDialog)a.value= -"";if(!d.datepicker._pos){d.datepicker._pos=d.datepicker._findPos(a);d.datepicker._pos[1]+=a.offsetHeight}var e=false;d(a).parents().each(function(){e|=d(this).css("position")=="fixed";return!e});if(e&&d.browser.opera){d.datepicker._pos[0]-=document.documentElement.scrollLeft;d.datepicker._pos[1]-=document.documentElement.scrollTop}c={left:d.datepicker._pos[0],top:d.datepicker._pos[1]};d.datepicker._pos=null;b.dpDiv.empty();b.dpDiv.css({position:"absolute",display:"block",top:"-1000px"});d.datepicker._updateDatepicker(b); -c=d.datepicker._checkOffset(b,c,e);b.dpDiv.css({position:d.datepicker._inDialog&&d.blockUI?"static":e?"fixed":"absolute",display:"none",left:c.left+"px",top:c.top+"px"});if(!b.inline){c=d.datepicker._get(b,"showAnim");var f=d.datepicker._get(b,"duration"),h=function(){var i=b.dpDiv.find("iframe.ui-datepicker-cover");if(i.length){var g=d.datepicker._getBorders(b.dpDiv);i.css({left:-g[0],top:-g[1],width:b.dpDiv.outerWidth(),height:b.dpDiv.outerHeight()})}};b.dpDiv.zIndex(d(a).zIndex()+1);d.datepicker._datepickerShowing= -true;d.effects&&d.effects[c]?b.dpDiv.show(c,d.datepicker._get(b,"showOptions"),f,h):b.dpDiv[c||"show"](c?f:null,h);if(!c||!f)h();b.input.is(":visible")&&!b.input.is(":disabled")&&b.input.focus();d.datepicker._curInst=b}}}},_updateDatepicker:function(a){this.maxRows=4;var b=d.datepicker._getBorders(a.dpDiv);J=a;a.dpDiv.empty().append(this._generateHTML(a));var c=a.dpDiv.find("iframe.ui-datepicker-cover");c.length&&c.css({left:-b[0],top:-b[1],width:a.dpDiv.outerWidth(),height:a.dpDiv.outerHeight()}); -a.dpDiv.find("."+this._dayOverClass+" a").mouseover();b=this._getNumberOfMonths(a);c=b[1];a.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("");c>1&&a.dpDiv.addClass("ui-datepicker-multi-"+c).css("width",17*c+"em");a.dpDiv[(b[0]!=1||b[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi");a.dpDiv[(this._get(a,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl");a==d.datepicker._curInst&&d.datepicker._datepickerShowing&&a.input&&a.input.is(":visible")&& -!a.input.is(":disabled")&&a.input[0]!=document.activeElement&&a.input.focus();if(a.yearshtml){var e=a.yearshtml;setTimeout(function(){e===a.yearshtml&&a.yearshtml&&a.dpDiv.find("select.ui-datepicker-year:first").replaceWith(a.yearshtml);e=a.yearshtml=null},0)}},_getBorders:function(a){var b=function(c){return{thin:1,medium:2,thick:3}[c]||c};return[parseFloat(b(a.css("border-left-width"))),parseFloat(b(a.css("border-top-width")))]},_checkOffset:function(a,b,c){var e=a.dpDiv.outerWidth(),f=a.dpDiv.outerHeight(), -h=a.input?a.input.outerWidth():0,i=a.input?a.input.outerHeight():0,g=document.documentElement.clientWidth+d(document).scrollLeft(),j=document.documentElement.clientHeight+d(document).scrollTop();b.left-=this._get(a,"isRTL")?e-h:0;b.left-=c&&b.left==a.input.offset().left?d(document).scrollLeft():0;b.top-=c&&b.top==a.input.offset().top+i?d(document).scrollTop():0;b.left-=Math.min(b.left,b.left+e>g&&g>e?Math.abs(b.left+e-g):0);b.top-=Math.min(b.top,b.top+f>j&&j>f?Math.abs(f+i):0);return b},_findPos:function(a){for(var b= -this._get(this._getInst(a),"isRTL");a&&(a.type=="hidden"||a.nodeType!=1||d.expr.filters.hidden(a));)a=a[b?"previousSibling":"nextSibling"];a=d(a).offset();return[a.left,a.top]},_triggerOnClose:function(a){var b=this._get(a,"onClose");if(b)b.apply(a.input?a.input[0]:null,[a.input?a.input.val():"",a])},_hideDatepicker:function(a){var b=this._curInst;if(!(!b||a&&b!=d.data(a,"datepicker")))if(this._datepickerShowing){a=this._get(b,"showAnim");var c=this._get(b,"duration"),e=function(){d.datepicker._tidyDialog(b); -this._curInst=null};d.effects&&d.effects[a]?b.dpDiv.hide(a,d.datepicker._get(b,"showOptions"),c,e):b.dpDiv[a=="slideDown"?"slideUp":a=="fadeIn"?"fadeOut":"hide"](a?c:null,e);a||e();d.datepicker._triggerOnClose(b);this._datepickerShowing=false;this._lastInput=null;if(this._inDialog){this._dialogInput.css({position:"absolute",left:"0",top:"-100px"});if(d.blockUI){d.unblockUI();d("body").append(this.dpDiv)}}this._inDialog=false}},_tidyDialog:function(a){a.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")}, -_checkExternalClick:function(a){if(d.datepicker._curInst){a=d(a.target);a[0].id!=d.datepicker._mainDivId&&a.parents("#"+d.datepicker._mainDivId).length==0&&!a.hasClass(d.datepicker.markerClassName)&&!a.hasClass(d.datepicker._triggerClass)&&d.datepicker._datepickerShowing&&!(d.datepicker._inDialog&&d.blockUI)&&d.datepicker._hideDatepicker()}},_adjustDate:function(a,b,c){a=d(a);var e=this._getInst(a[0]);if(!this._isDisabledDatepicker(a[0])){this._adjustInstDate(e,b+(c=="M"?this._get(e,"showCurrentAtPos"): -0),c);this._updateDatepicker(e)}},_gotoToday:function(a){a=d(a);var b=this._getInst(a[0]);if(this._get(b,"gotoCurrent")&&b.currentDay){b.selectedDay=b.currentDay;b.drawMonth=b.selectedMonth=b.currentMonth;b.drawYear=b.selectedYear=b.currentYear}else{var c=new Date;b.selectedDay=c.getDate();b.drawMonth=b.selectedMonth=c.getMonth();b.drawYear=b.selectedYear=c.getFullYear()}this._notifyChange(b);this._adjustDate(a)},_selectMonthYear:function(a,b,c){a=d(a);var e=this._getInst(a[0]);e["selected"+(c=="M"? -"Month":"Year")]=e["draw"+(c=="M"?"Month":"Year")]=parseInt(b.options[b.selectedIndex].value,10);this._notifyChange(e);this._adjustDate(a)},_selectDay:function(a,b,c,e){var f=d(a);if(!(d(e).hasClass(this._unselectableClass)||this._isDisabledDatepicker(f[0]))){f=this._getInst(f[0]);f.selectedDay=f.currentDay=d("a",e).html();f.selectedMonth=f.currentMonth=b;f.selectedYear=f.currentYear=c;this._selectDate(a,this._formatDate(f,f.currentDay,f.currentMonth,f.currentYear))}},_clearDate:function(a){a=d(a); -this._getInst(a[0]);this._selectDate(a,"")},_selectDate:function(a,b){a=this._getInst(d(a)[0]);b=b!=null?b:this._formatDate(a);a.input&&a.input.val(b);this._updateAlternate(a);var c=this._get(a,"onSelect");if(c)c.apply(a.input?a.input[0]:null,[b,a]);else a.input&&a.input.trigger("change");if(a.inline)this._updateDatepicker(a);else{this._hideDatepicker();this._lastInput=a.input[0];typeof a.input[0]!="object"&&a.input.focus();this._lastInput=null}},_updateAlternate:function(a){var b=this._get(a,"altField"); -if(b){var c=this._get(a,"altFormat")||this._get(a,"dateFormat"),e=this._getDate(a),f=this.formatDate(c,e,this._getFormatConfig(a));d(b).each(function(){d(this).val(f)})}},noWeekends:function(a){a=a.getDay();return[a>0&&a<6,""]},iso8601Week:function(a){a=new Date(a.getTime());a.setDate(a.getDate()+4-(a.getDay()||7));var b=a.getTime();a.setMonth(0);a.setDate(1);return Math.floor(Math.round((b-a)/864E5)/7)+1},parseDate:function(a,b,c){if(a==null||b==null)throw"Invalid arguments";b=typeof b=="object"? -b.toString():b+"";if(b=="")return null;var e=(c?c.shortYearCutoff:null)||this._defaults.shortYearCutoff;e=typeof e!="string"?e:(new Date).getFullYear()%100+parseInt(e,10);for(var f=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,h=(c?c.dayNames:null)||this._defaults.dayNames,i=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort,g=(c?c.monthNames:null)||this._defaults.monthNames,j=c=-1,l=-1,u=-1,k=false,o=function(p){(p=A+1-1){j=1;l=u;do{e=this._getDaysInMonth(c,j-1);if(l<=e)break;j++;l-=e}while(1)}v=this._daylightSavingAdjust(new Date(c,j-1,l));if(v.getFullYear()!=c||v.getMonth()+1!=j||v.getDate()!=l)throw"Invalid date";return v},ATOM:"yy-mm-dd", -COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*24*60*60*1E7,formatDate:function(a,b,c){if(!b)return"";var e=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,f=(c?c.dayNames:null)||this._defaults.dayNames,h=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort;c=(c?c.monthNames: -null)||this._defaults.monthNames;var i=function(o){(o=k+1 -12?a.getHours()+2:0);return a},_setDate:function(a,b,c){var e=!b,f=a.selectedMonth,h=a.selectedYear;b=this._restrictMinMax(a,this._determineDate(a,b,new Date));a.selectedDay=a.currentDay=b.getDate();a.drawMonth=a.selectedMonth=a.currentMonth=b.getMonth();a.drawYear=a.selectedYear=a.currentYear=b.getFullYear();if((f!=a.selectedMonth||h!=a.selectedYear)&&!c)this._notifyChange(a);this._adjustInstDate(a);if(a.input)a.input.val(e?"":this._formatDate(a))},_getDate:function(a){return!a.currentYear||a.input&& -a.input.val()==""?null:this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay))},_generateHTML:function(a){var b=new Date;b=this._daylightSavingAdjust(new Date(b.getFullYear(),b.getMonth(),b.getDate()));var c=this._get(a,"isRTL"),e=this._get(a,"showButtonPanel"),f=this._get(a,"hideIfNoPrevNext"),h=this._get(a,"navigationAsDateFormat"),i=this._getNumberOfMonths(a),g=this._get(a,"showCurrentAtPos"),j=this._get(a,"stepMonths"),l=i[0]!=1||i[1]!=1,u=this._daylightSavingAdjust(!a.currentDay? -new Date(9999,9,9):new Date(a.currentYear,a.currentMonth,a.currentDay)),k=this._getMinMaxDate(a,"min"),o=this._getMinMaxDate(a,"max");g=a.drawMonth-g;var m=a.drawYear;if(g<0){g+=12;m--}if(o){var n=this._daylightSavingAdjust(new Date(o.getFullYear(),o.getMonth()-i[0]*i[1]+1,o.getDate()));for(n=k&&nn;){g--;if(g<0){g=11;m--}}}a.drawMonth=g;a.drawYear=m;n=this._get(a,"prevText");n=!h?n:this.formatDate(n,this._daylightSavingAdjust(new Date(m,g-j,1)),this._getFormatConfig(a)); -n=this._canAdjustMonth(a,-1,m,g)?''+n+"":f?"":''+n+"";var s=this._get(a,"nextText");s=!h?s:this.formatDate(s,this._daylightSavingAdjust(new Date(m, -g+j,1)),this._getFormatConfig(a));f=this._canAdjustMonth(a,+1,m,g)?''+s+"":f?"":''+s+"";j=this._get(a,"currentText");s=this._get(a,"gotoCurrent")&& -a.currentDay?u:b;j=!h?j:this.formatDate(j,s,this._getFormatConfig(a));h=!a.inline?'":"";e=e?'
        '+(c?h:"")+(this._isInRange(a,s)?'":"")+(c?"":h)+"
        ":"";h=parseInt(this._get(a,"firstDay"),10);h=isNaN(h)?0:h;j=this._get(a,"showWeek");s=this._get(a,"dayNames");this._get(a,"dayNamesShort");var q=this._get(a,"dayNamesMin"),A=this._get(a,"monthNames"),v=this._get(a,"monthNamesShort"),p=this._get(a,"beforeShowDay"),D=this._get(a,"showOtherMonths"),K=this._get(a,"selectOtherMonths");this._get(a,"calculateWeek");for(var E=this._getDefaultDate(a),w="",x=0;x1)switch(G){case 0:y+=" ui-datepicker-group-first";t=" ui-corner-"+(c?"right":"left");break;case i[1]-1:y+=" ui-datepicker-group-last";t=" ui-corner-"+(c?"left":"right");break;default:y+=" ui-datepicker-group-middle";t="";break}y+='">'}y+='
        '+(/all|left/.test(t)&& -x==0?c?f:n:"")+(/all|right/.test(t)&&x==0?c?n:f:"")+this._generateMonthYearHeader(a,g,m,k,o,x>0||G>0,A,v)+'
        ';var z=j?'":"";for(t=0;t<7;t++){var r=(t+h)%7;z+="=5?' class="ui-datepicker-week-end"':"")+'>'+q[r]+""}y+=z+"";z=this._getDaysInMonth(m,g);if(m==a.selectedYear&&g==a.selectedMonth)a.selectedDay=Math.min(a.selectedDay, -z);t=(this._getFirstDayOfMonth(m,g)-h+7)%7;z=Math.ceil((t+z)/7);this.maxRows=z=l?this.maxRows>z?this.maxRows:z:z;r=this._daylightSavingAdjust(new Date(m,g,1-t));for(var Q=0;Q";var R=!j?"":'";for(t=0;t<7;t++){var I=p?p.apply(a.input?a.input[0]:null,[r]):[true,""],F=r.getMonth()!=g,L=F&&!K||!I[0]||k&&ro;R+='";r.setDate(r.getDate()+1);r=this._daylightSavingAdjust(r)}y+=R+""}g++;if(g>11){g=0;m++}y+="
        '+this._get(a,"weekHeader")+"
        '+this._get(a,"calculateWeek")(r)+""+(F&&!D?" ":L?''+ -r.getDate()+"":''+r.getDate()+"")+"
        "+(l?""+(i[0]>0&&G==i[1]-1?'
        ':""):"");O+=y}w+=O}w+=e+(d.browser.msie&&parseInt(d.browser.version,10)<7&&!a.inline?'': -"");a._keyEvent=false;return w},_generateMonthYearHeader:function(a,b,c,e,f,h,i,g){var j=this._get(a,"changeMonth"),l=this._get(a,"changeYear"),u=this._get(a,"showMonthAfterYear"),k='
        ',o="";if(h||!j)o+=''+i[b]+"";else{i=e&&e.getFullYear()==c;var m=f&&f.getFullYear()==c;o+='"}u||(k+=o+(h||!(j&&l)?" ":""));if(!a.yearshtml){a.yearshtml="";if(h||!l)k+=''+c+"";else{g=this._get(a,"yearRange").split(":");var s=(new Date).getFullYear();i=function(q){q=q.match(/c[+-].*/)?c+parseInt(q.substring(1),10):q.match(/[+-].*/)?s+parseInt(q,10):parseInt(q,10);return isNaN(q)?s:q};b=i(g[0]);g=Math.max(b,i(g[1]||""));b=e?Math.max(b, -e.getFullYear()):b;g=f?Math.min(g,f.getFullYear()):g;for(a.yearshtml+='";k+=a.yearshtml;a.yearshtml=null}}k+=this._get(a,"yearSuffix");if(u)k+=(h||!(j&&l)?" ":"")+o;k+="
        ";return k},_adjustInstDate:function(a,b,c){var e=a.drawYear+(c=="Y"?b:0),f=a.drawMonth+ -(c=="M"?b:0);b=Math.min(a.selectedDay,this._getDaysInMonth(e,f))+(c=="D"?b:0);e=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(e,f,b)));a.selectedDay=e.getDate();a.drawMonth=a.selectedMonth=e.getMonth();a.drawYear=a.selectedYear=e.getFullYear();if(c=="M"||c=="Y")this._notifyChange(a)},_restrictMinMax:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");b=c&&ba?a:b},_notifyChange:function(a){var b=this._get(a,"onChangeMonthYear");if(b)b.apply(a.input? -a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){a=this._get(a,"numberOfMonths");return a==null?[1,1]:typeof a=="number"?[1,a]:a},_getMinMaxDate:function(a,b){return this._determineDate(a,this._get(a,b+"Date"),null)},_getDaysInMonth:function(a,b){return 32-this._daylightSavingAdjust(new Date(a,b,32)).getDate()},_getFirstDayOfMonth:function(a,b){return(new Date(a,b,1)).getDay()},_canAdjustMonth:function(a,b,c,e){var f=this._getNumberOfMonths(a);c=this._daylightSavingAdjust(new Date(c, -e+(b<0?b:f[0]*f[1]),1));b<0&&c.setDate(this._getDaysInMonth(c.getFullYear(),c.getMonth()));return this._isInRange(a,c)},_isInRange:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");return(!c||b.getTime()>=c.getTime())&&(!a||b.getTime()<=a.getTime())},_getFormatConfig:function(a){var b=this._get(a,"shortYearCutoff");b=typeof b!="string"?b:(new Date).getFullYear()%100+parseInt(b,10);return{shortYearCutoff:b,dayNamesShort:this._get(a,"dayNamesShort"),dayNames:this._get(a, -"dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,b,c,e){if(!b){a.currentDay=a.selectedDay;a.currentMonth=a.selectedMonth;a.currentYear=a.selectedYear}b=b?typeof b=="object"?b:this._daylightSavingAdjust(new Date(e,c,b)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return this.formatDate(this._get(a,"dateFormat"),b,this._getFormatConfig(a))}});d.fn.datepicker=function(a){if(!this.length)return this; -if(!d.datepicker.initialized){d(document).mousedown(d.datepicker._checkExternalClick).find("body").append(d.datepicker.dpDiv);d.datepicker.initialized=true}var b=Array.prototype.slice.call(arguments,1);if(typeof a=="string"&&(a=="isDisabled"||a=="getDate"||a=="widget"))return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));if(a=="option"&&arguments.length==2&&typeof arguments[1]=="string")return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));return this.each(function(){typeof a== -"string"?d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this].concat(b)):d.datepicker._attachDatepicker(this,a)})};d.datepicker=new M;d.datepicker.initialized=false;d.datepicker.uuid=(new Date).getTime();d.datepicker.version="1.8.16";window["DP_jQuery_"+B]=d})(jQuery); -;/* - * jQuery UI Progressbar 1.8.16 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Progressbar - * - * Depends: - * jquery.ui.core.js - * jquery.ui.widget.js - */ -(function(b,d){b.widget("ui.progressbar",{options:{value:0,max:100},min:0,_create:function(){this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min,"aria-valuemax":this.options.max,"aria-valuenow":this._value()});this.valueDiv=b("
        ").appendTo(this.element);this.oldValue=this._value();this._refreshValue()},destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"); -this.valueDiv.remove();b.Widget.prototype.destroy.apply(this,arguments)},value:function(a){if(a===d)return this._value();this._setOption("value",a);return this},_setOption:function(a,c){if(a==="value"){this.options.value=c;this._refreshValue();this._value()===this.options.max&&this._trigger("complete")}b.Widget.prototype._setOption.apply(this,arguments)},_value:function(){var a=this.options.value;if(typeof a!=="number")a=0;return Math.min(this.options.max,Math.max(this.min,a))},_percentage:function(){return 100* -this._value()/this.options.max},_refreshValue:function(){var a=this.value(),c=this._percentage();if(this.oldValue!==a){this.oldValue=a;this._trigger("change")}this.valueDiv.toggle(a>this.min).toggleClass("ui-corner-right",a===this.options.max).width(c.toFixed(0)+"%");this.element.attr("aria-valuenow",a)}});b.extend(b.ui.progressbar,{version:"1.8.16"})})(jQuery); -;/* - * jQuery UI Effects 1.8.16 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Effects/ - */ -jQuery.effects||function(f,j){function m(c){var a;if(c&&c.constructor==Array&&c.length==3)return c;if(a=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(c))return[parseInt(a[1],10),parseInt(a[2],10),parseInt(a[3],10)];if(a=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(c))return[parseFloat(a[1])*2.55,parseFloat(a[2])*2.55,parseFloat(a[3])*2.55];if(a=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(c))return[parseInt(a[1], -16),parseInt(a[2],16),parseInt(a[3],16)];if(a=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(c))return[parseInt(a[1]+a[1],16),parseInt(a[2]+a[2],16),parseInt(a[3]+a[3],16)];if(/rgba\(0, 0, 0, 0\)/.exec(c))return n.transparent;return n[f.trim(c).toLowerCase()]}function s(c,a){var b;do{b=f.curCSS(c,a);if(b!=""&&b!="transparent"||f.nodeName(c,"body"))break;a="backgroundColor"}while(c=c.parentNode);return m(b)}function o(){var c=document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle, -a={},b,d;if(c&&c.length&&c[0]&&c[c[0]])for(var e=c.length;e--;){b=c[e];if(typeof c[b]=="string"){d=b.replace(/\-(\w)/g,function(g,h){return h.toUpperCase()});a[d]=c[b]}}else for(b in c)if(typeof c[b]==="string")a[b]=c[b];return a}function p(c){var a,b;for(a in c){b=c[a];if(b==null||f.isFunction(b)||a in t||/scrollbar/.test(a)||!/color/i.test(a)&&isNaN(parseFloat(b)))delete c[a]}return c}function u(c,a){var b={_:0},d;for(d in a)if(c[d]!=a[d])b[d]=a[d];return b}function k(c,a,b,d){if(typeof c=="object"){d= -a;b=null;a=c;c=a.effect}if(f.isFunction(a)){d=a;b=null;a={}}if(typeof a=="number"||f.fx.speeds[a]){d=b;b=a;a={}}if(f.isFunction(b)){d=b;b=null}a=a||{};b=b||a.duration;b=f.fx.off?0:typeof b=="number"?b:b in f.fx.speeds?f.fx.speeds[b]:f.fx.speeds._default;d=d||a.complete;return[c,a,b,d]}function l(c){if(!c||typeof c==="number"||f.fx.speeds[c])return true;if(typeof c==="string"&&!f.effects[c])return true;return false}f.effects={};f.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor", -"borderTopColor","borderColor","color","outlineColor"],function(c,a){f.fx.step[a]=function(b){if(!b.colorInit){b.start=s(b.elem,a);b.end=m(b.end);b.colorInit=true}b.elem.style[a]="rgb("+Math.max(Math.min(parseInt(b.pos*(b.end[0]-b.start[0])+b.start[0],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[1]-b.start[1])+b.start[1],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[2]-b.start[2])+b.start[2],10),255),0)+")"}});var n={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0, -0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211, -211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]},q=["add","remove","toggle"],t={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};f.effects.animateClass=function(c,a,b, -d){if(f.isFunction(b)){d=b;b=null}return this.queue(function(){var e=f(this),g=e.attr("style")||" ",h=p(o.call(this)),r,v=e.attr("class");f.each(q,function(w,i){c[i]&&e[i+"Class"](c[i])});r=p(o.call(this));e.attr("class",v);e.animate(u(h,r),{queue:false,duration:a,easing:b,complete:function(){f.each(q,function(w,i){c[i]&&e[i+"Class"](c[i])});if(typeof e.attr("style")=="object"){e.attr("style").cssText="";e.attr("style").cssText=g}else e.attr("style",g);d&&d.apply(this,arguments);f.dequeue(this)}})})}; -f.fn.extend({_addClass:f.fn.addClass,addClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{add:c},a,b,d]):this._addClass(c)},_removeClass:f.fn.removeClass,removeClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{remove:c},a,b,d]):this._removeClass(c)},_toggleClass:f.fn.toggleClass,toggleClass:function(c,a,b,d,e){return typeof a=="boolean"||a===j?b?f.effects.animateClass.apply(this,[a?{add:c}:{remove:c},b,d,e]):this._toggleClass(c,a):f.effects.animateClass.apply(this, -[{toggle:c},a,b,d])},switchClass:function(c,a,b,d,e){return f.effects.animateClass.apply(this,[{add:a,remove:c},b,d,e])}});f.extend(f.effects,{version:"1.8.16",save:function(c,a){for(var b=0;b").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}), -d=document.activeElement;c.wrap(b);if(c[0]===d||f.contains(c[0],d))f(d).focus();b=c.parent();if(c.css("position")=="static"){b.css({position:"relative"});c.css({position:"relative"})}else{f.extend(a,{position:c.css("position"),zIndex:c.css("z-index")});f.each(["top","left","bottom","right"],function(e,g){a[g]=c.css(g);if(isNaN(parseInt(a[g],10)))a[g]="auto"});c.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})}return b.css(a).show()},removeWrapper:function(c){var a,b=document.activeElement; -if(c.parent().is(".ui-effects-wrapper")){a=c.parent().replaceWith(c);if(c[0]===b||f.contains(c[0],b))f(b).focus();return a}return c},setTransition:function(c,a,b,d){d=d||{};f.each(a,function(e,g){unit=c.cssUnit(g);if(unit[0]>0)d[g]=unit[0]*b+unit[1]});return d}});f.fn.extend({effect:function(c){var a=k.apply(this,arguments),b={options:a[1],duration:a[2],callback:a[3]};a=b.options.mode;var d=f.effects[c];if(f.fx.off||!d)return a?this[a](b.duration,b.callback):this.each(function(){b.callback&&b.callback.call(this)}); -return d.call(this,b)},_show:f.fn.show,show:function(c){if(l(c))return this._show.apply(this,arguments);else{var a=k.apply(this,arguments);a[1].mode="show";return this.effect.apply(this,a)}},_hide:f.fn.hide,hide:function(c){if(l(c))return this._hide.apply(this,arguments);else{var a=k.apply(this,arguments);a[1].mode="hide";return this.effect.apply(this,a)}},__toggle:f.fn.toggle,toggle:function(c){if(l(c)||typeof c==="boolean"||f.isFunction(c))return this.__toggle.apply(this,arguments);else{var a=k.apply(this, -arguments);a[1].mode="toggle";return this.effect.apply(this,a)}},cssUnit:function(c){var a=this.css(c),b=[];f.each(["em","px","%","pt"],function(d,e){if(a.indexOf(e)>0)b=[parseFloat(a),e]});return b}});f.easing.jswing=f.easing.swing;f.extend(f.easing,{def:"easeOutQuad",swing:function(c,a,b,d,e){return f.easing[f.easing.def](c,a,b,d,e)},easeInQuad:function(c,a,b,d,e){return d*(a/=e)*a+b},easeOutQuad:function(c,a,b,d,e){return-d*(a/=e)*(a-2)+b},easeInOutQuad:function(c,a,b,d,e){if((a/=e/2)<1)return d/ -2*a*a+b;return-d/2*(--a*(a-2)-1)+b},easeInCubic:function(c,a,b,d,e){return d*(a/=e)*a*a+b},easeOutCubic:function(c,a,b,d,e){return d*((a=a/e-1)*a*a+1)+b},easeInOutCubic:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a+b;return d/2*((a-=2)*a*a+2)+b},easeInQuart:function(c,a,b,d,e){return d*(a/=e)*a*a*a+b},easeOutQuart:function(c,a,b,d,e){return-d*((a=a/e-1)*a*a*a-1)+b},easeInOutQuart:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a+b;return-d/2*((a-=2)*a*a*a-2)+b},easeInQuint:function(c,a,b, -d,e){return d*(a/=e)*a*a*a*a+b},easeOutQuint:function(c,a,b,d,e){return d*((a=a/e-1)*a*a*a*a+1)+b},easeInOutQuint:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a*a+b;return d/2*((a-=2)*a*a*a*a+2)+b},easeInSine:function(c,a,b,d,e){return-d*Math.cos(a/e*(Math.PI/2))+d+b},easeOutSine:function(c,a,b,d,e){return d*Math.sin(a/e*(Math.PI/2))+b},easeInOutSine:function(c,a,b,d,e){return-d/2*(Math.cos(Math.PI*a/e)-1)+b},easeInExpo:function(c,a,b,d,e){return a==0?b:d*Math.pow(2,10*(a/e-1))+b},easeOutExpo:function(c, -a,b,d,e){return a==e?b+d:d*(-Math.pow(2,-10*a/e)+1)+b},easeInOutExpo:function(c,a,b,d,e){if(a==0)return b;if(a==e)return b+d;if((a/=e/2)<1)return d/2*Math.pow(2,10*(a-1))+b;return d/2*(-Math.pow(2,-10*--a)+2)+b},easeInCirc:function(c,a,b,d,e){return-d*(Math.sqrt(1-(a/=e)*a)-1)+b},easeOutCirc:function(c,a,b,d,e){return d*Math.sqrt(1-(a=a/e-1)*a)+b},easeInOutCirc:function(c,a,b,d,e){if((a/=e/2)<1)return-d/2*(Math.sqrt(1-a*a)-1)+b;return d/2*(Math.sqrt(1-(a-=2)*a)+1)+b},easeInElastic:function(c,a,b, -d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e)==1)return b+d;g||(g=e*0.3);if(h").css({position:"absolute",visibility:"visible",left:-f*(h/d),top:-e*(i/c)}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:h/d,height:i/c,left:g.left+f*(h/d)+(a.options.mode=="show"?(f-Math.floor(d/2))*(h/d):0),top:g.top+e*(i/c)+(a.options.mode=="show"?(e-Math.floor(c/2))*(i/c):0),opacity:a.options.mode=="show"?0:1}).animate({left:g.left+f*(h/d)+(a.options.mode=="show"?0:(f-Math.floor(d/2))*(h/d)),top:g.top+ -e*(i/c)+(a.options.mode=="show"?0:(e-Math.floor(c/2))*(i/c)),opacity:a.options.mode=="show"?1:0},a.duration||500);setTimeout(function(){a.options.mode=="show"?b.css({visibility:"visible"}):b.css({visibility:"visible"}).hide();a.callback&&a.callback.apply(b[0]);b.dequeue();j("div.ui-effects-explode").remove()},a.duration||500)})}})(jQuery); -;/* - * jQuery UI Effects Fade 1.8.16 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Effects/Fade - * - * Depends: - * jquery.effects.core.js - */ -(function(b){b.effects.fade=function(a){return this.queue(function(){var c=b(this),d=b.effects.setMode(c,a.options.mode||"hide");c.animate({opacity:d},{queue:false,duration:a.duration,easing:a.options.easing,complete:function(){a.callback&&a.callback.apply(this,arguments);c.dequeue()}})})}})(jQuery); -;/* - * jQuery UI Effects Fold 1.8.16 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Effects/Fold - * - * Depends: - * jquery.effects.core.js - */ -(function(c){c.effects.fold=function(a){return this.queue(function(){var b=c(this),j=["position","top","bottom","left","right"],d=c.effects.setMode(b,a.options.mode||"hide"),g=a.options.size||15,h=!!a.options.horizFirst,k=a.duration?a.duration/2:c.fx.speeds._default/2;c.effects.save(b,j);b.show();var e=c.effects.createWrapper(b).css({overflow:"hidden"}),f=d=="show"!=h,l=f?["width","height"]:["height","width"];f=f?[e.width(),e.height()]:[e.height(),e.width()];var i=/([0-9]+)%/.exec(g);if(i)g=parseInt(i[1], -10)/100*f[d=="hide"?0:1];if(d=="show")e.css(h?{height:0,width:g}:{height:g,width:0});h={};i={};h[l[0]]=d=="show"?f[0]:g;i[l[1]]=d=="show"?f[1]:0;e.animate(h,k,a.options.easing).animate(i,k,a.options.easing,function(){d=="hide"&&b.hide();c.effects.restore(b,j);c.effects.removeWrapper(b);a.callback&&a.callback.apply(b[0],arguments);b.dequeue()})})}})(jQuery); -;/* - * jQuery UI Effects Highlight 1.8.16 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Effects/Highlight - * - * Depends: - * jquery.effects.core.js - */ -(function(b){b.effects.highlight=function(c){return this.queue(function(){var a=b(this),e=["backgroundImage","backgroundColor","opacity"],d=b.effects.setMode(a,c.options.mode||"show"),f={backgroundColor:a.css("backgroundColor")};if(d=="hide")f.opacity=0;b.effects.save(a,e);a.show().css({backgroundImage:"none",backgroundColor:c.options.color||"#ffff99"}).animate(f,{queue:false,duration:c.duration,easing:c.options.easing,complete:function(){d=="hide"&&a.hide();b.effects.restore(a,e);d=="show"&&!b.support.opacity&& -this.style.removeAttribute("filter");c.callback&&c.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery); -;/* - * jQuery UI Effects Pulsate 1.8.16 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Effects/Pulsate - * - * Depends: - * jquery.effects.core.js - */ -(function(d){d.effects.pulsate=function(a){return this.queue(function(){var b=d(this),c=d.effects.setMode(b,a.options.mode||"show");times=(a.options.times||5)*2-1;duration=a.duration?a.duration/2:d.fx.speeds._default/2;isVisible=b.is(":visible");animateTo=0;if(!isVisible){b.css("opacity",0).show();animateTo=1}if(c=="hide"&&isVisible||c=="show"&&!isVisible)times--;for(c=0;c').appendTo(document.body).addClass(a.options.className).css({top:d.top,left:d.left,height:b.innerHeight(),width:b.innerWidth(),position:"absolute"}).animate(c,a.duration,a.options.easing,function(){f.remove();a.callback&&a.callback.apply(b[0],arguments); -b.dequeue()})})}})(jQuery); -; \ No newline at end of file diff --git a/lib/resque_sliders/lib/resque-sliders/server/public/js/sliders.js b/lib/resque_sliders/lib/resque-sliders/server/public/js/sliders.js deleted file mode 100755 index 377a0b9..0000000 --- a/lib/resque_sliders/lib/resque-sliders/server/public/js/sliders.js +++ /dev/null @@ -1,98 +0,0 @@ -$(document).ready(function() { - function set_total() { - var total = 0; - $(".values").each(function () { - total += parseInt($(this).val()); - }); - $("#total").text(total); - }; - function sanitize_input(s) { - // delete non-friendly chars, replace spaces in words with commas for resque - var ary = s.replace(/['":]/g, '').replace(/^\s+|\s+$/g, '').replace(/\s+/g, ',').split(/, */); - var new_ary = []; - // remove empties from array - $.each(ary, function() { - if (this != '') { - new_ary.push($.trim(this)); - } - }); - return new_ary.join(','); - }; - // Click function for all icons - $(".controls").find("span").click(function() { - var host_sig = $(this).attr("id").split(':'); - var host = host_sig[0]; - switch(host_sig[1]) - { - case 'REFRESH': - sig = 'reload'; - break; - case 'ALERT': - return false; - default: - sig = host_sig[1].toLowerCase(); - } - var signal = {}; - signal[sig] = true; - - var span = $(this); - var re = new RegExp('/' + host + '$'); - var url = window.location.pathname.replace(re, '') + '/' + host; - $.post(url, signal, function(data) { - switch(data.signal) { - case 'reload': - span.removeClass('ui-icon-refresh').addClass('ui-icon-alert').attr('id', [host, 'ALERT'].join(':')); - break; - case 'pause': - span.removeClass('ui-icon-pause').addClass('ui-icon-play').attr('id', [host, 'PLAY'].join(':')); - break; - case 'play': - span.removeClass('ui-icon-play').addClass('ui-icon-pause').attr('id', [host, 'PAUSE'].join(':')); - break; - case 'stop': - $('#'+host+'\\:PAUSE').removeClass('ui-icon-pause').addClass('ui-icon-play').attr('id', [host, 'PLAY'].join(':')); - break; - } - }, "json"); - }); - $('.new_form').submit(function(e) { - e.preventDefault(); - var queue = sanitize_input($("#new_queue").val()); - var host = $(this).attr("id"); - if (queue != '') { - $.post(host, { quantity: 1, queue: queue }, function(data) { - // reload window - window.location.reload(true); - }); - } - }); - $("#plus-one").click(function() { - $('.new_form').submit(); - }); - // make each slider, get input from div content passed from erb - $(".slider").each(function() { - var slidy = $(this); - var max_childs = parseInt($("#max").text()); - if (max_childs) { max_childs = max_childs; } - else { max_childs = 50; } - var value = parseInt( slidy.text() ); - var queue = slidy.attr("id").replace("-slider", "").replace(/:/g, ",").replace(/^\s+|\s+$/g, ''); - var host = window.location.pathname.split('/').slice(-1); - slidy.prev().find("input").val( value ); - slidy.empty().slider({ - range: "min", - value: value, - min: 0, - max: max_childs, - slide: function( event, ui ) { - slidy.prev().find("input").val( ui.value ); - set_total(); - }, - change: function( event, ui ) { - $.post('', { quantity: ui.value, queue: queue }, function(data) { - }); - }, - }); - }); - set_total(); // do this initially -}); diff --git a/lib/resque_sliders/lib/resque-sliders/server/views/index.erb b/lib/resque_sliders/lib/resque-sliders/server/views/index.erb deleted file mode 100755 index 9c6b4f1..0000000 --- a/lib/resque_sliders/lib/resque-sliders/server/views/index.erb +++ /dev/null @@ -1,57 +0,0 @@ -<% @subtabs = @sliders.all_hosts unless @sliders.all_hosts.length == 1 %> - -

        Sliders

        - -
        - " rel="stylesheet" type="text/css" /> - " rel="stylesheet" type="text/css" /> - - -<% if params[:host] || @sliders.all_hosts.length == 1 %> - <% host = params[:host] || @sliders.all_hosts.first %> - <% max = @sliders.max_children(host) || 'Not running' %> - -

        <%= "#{host} (Total: Max: #{max})" %> - - <%= daemon_buttons(host, false) %> - -

        - <% @sliders.queue_values(host).each_pair do |queue,value| %> -

        - - -

        -
        <%= value %>
        - <% end %> -
        - - -
        -<% else %> - - - - - - - <% @sliders.all_hosts.each do |host| %> - - - - - - <% end %> -
        HostnameCurrent / Max WorkersControls
        "><%= host %><% if @sliders.stale_hosts.include?(host) %> - Not Checked in (Stale) - <% else %> - <%= [@sliders.current_children(host), @sliders.max_children(host)].compact.join(' / ') %> - <% end %> - -
          - - <%= daemon_buttons(host) %> - -
        -
        -<% end %> -
        diff --git a/lib/resque_sliders/lib/resque-sliders/version.rb b/lib/resque_sliders/lib/resque-sliders/version.rb deleted file mode 100755 index 00512a1..0000000 --- a/lib/resque_sliders/lib/resque-sliders/version.rb +++ /dev/null @@ -1,7 +0,0 @@ -module Resque - module Plugins - module ResqueSliders - Version = VERSION = '0.2.3' - end - end -end diff --git a/lib/resque_sliders/misc/resque-sliders_host-view.png b/lib/resque_sliders/misc/resque-sliders_host-view.png deleted file mode 100755 index 94caa6b42afe5235af47015137e6cf558babce0e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52662 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 diff --git a/lib/resque_sliders/misc/resque-sliders_main-view.png b/lib/resque_sliders/misc/resque-sliders_main-view.png deleted file mode 100755 index cb8aff04b180e10843d6d21394daaa093081981f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54388 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 diff --git a/lib/resque_sliders/resque-sliders.gemspec b/lib/resque_sliders/resque-sliders.gemspec deleted file mode 100755 index 42399f0..0000000 --- a/lib/resque_sliders/resque-sliders.gemspec +++ /dev/null @@ -1,30 +0,0 @@ -# -*- encoding: utf-8 -*- -$:.push File.expand_path("../lib", __FILE__) -require "resque-sliders/version" - -Gem::Specification.new do |s| - s.name = "resque-sliders" - s.version = Resque::Plugins::ResqueSliders::Version - s.authors = "Kevin Mullin" - s.email = "kevin@kpmullin.com" - s.date = Time.now.strftime('%Y-%m-%d') - s.homepage = "https://github.com/kmullin/resque-sliders" - s.summary = %q{Resque-Sliders: a plugin for resque that controls which resque workers are running on each host, from within Resque-web} - - s.add_dependency 'resque', ['>= 1.15.0', '< 2.0'] - s.extra_rdoc_files = ["README.md", "MIT-LICENSE"] - - s.license = 'MIT' - s.files = `git ls-files`.split("\n") - s.files -= %w(.gitignore Gemfile Gemfile.lock resque-sliders.gemspec Rakefile .travis.yml) - s.files -= s.files.grep(%r{^(misc|helpers)/}) - s.test_files = s.files.grep(%r{^(test|spec|features)/}) - s.executables = s.files.grep(%r{^bin/}).map { |f| File.basename(f) } - s.require_paths = ["lib"] - s.description = < pidfile.path, - :config => '127.0.0.1:9736' - } - @kewatcher = Resque::Plugins::ResqueSliders::KEWatcher.new(@options) - end - - teardown do - pid = @kewatcher.running? - Process.kill(:TERM, pid) if pid - end - - test "kewatcher" do - assert_instance_of Resque::Plugins::ResqueSliders::KEWatcher, @kewatcher - end - - test "saves pidfile" do - assert File.exists?(@kewatcher.pidfile) - end - - test "kewatcher runs" do - `(bundle exec kewatcher --config #{@options[:config]}) >/dev/null 2>&1 & sleep 3` - assert @kewatcher.running? - end - - test "kewatcher wont run twice" do - `(bundle exec kewatcher --config #{@options[:config]}) >/dev/null 2>&1 &` - sleep 3 - output = `bundle exec kewatcher --config #{@options[:config]}` - assert_match %r{Already running}, output - end - - test "system forks" do - assert fork { exit } - end - -end diff --git a/lib/resque_sliders/test/redis-test.conf b/lib/resque_sliders/test/redis-test.conf deleted file mode 100755 index e1f70f6..0000000 --- a/lib/resque_sliders/test/redis-test.conf +++ /dev/null @@ -1,115 +0,0 @@ -# Redis configuration file example - -# By default Redis does not run as a daemon. Use 'yes' if you need it. -# Note that Redis will write a pid file in /var/run/redis.pid when daemonized. -daemonize yes - -# When run as a daemon, Redis write a pid file in /var/run/redis.pid by default. -# You can specify a custom pid file location here. -pidfile ./test/redis-test.pid - -# Accept connections on the specified port, default is 6379 -port 9736 - -# If you want you can bind a single interface, if the bind option is not -# specified all the interfaces will listen for connections. -# -bind 127.0.0.1 - -# Close the connection after a client is idle for N seconds (0 to disable) -timeout 300 - -# Save the DB on disk: -# -# save -# -# Will save the DB if both the given number of seconds and the given -# number of write operations against the DB occurred. -# -# In the example below the behaviour will be to save: -# after 900 sec (15 min) if at least 1 key changed -# after 300 sec (5 min) if at least 10 keys changed -# after 60 sec if at least 10000 keys changed -save 900 1 -save 300 10 -save 60 10000 - -# The filename where to dump the DB -dbfilename dump.rdb - -# For default save/load DB in/from the working directory -# Note that you must specify a directory not a file name. -dir ./test/ - -# Set server verbosity to 'debug' -# it can be one of: -# debug (a lot of information, useful for development/testing) -# notice (moderately verbose, what you want in production probably) -# warning (only very important / critical messages are logged) -loglevel debug - -# Specify the log file name. Also 'stdout' can be used to force -# the demon to log on the standard output. Note that if you use standard -# output for logging but daemonize, logs will be sent to /dev/null -logfile stdout - -# Set the number of databases. The default database is DB 0, you can select -# a different one on a per-connection basis using SELECT where -# dbid is a number between 0 and 'databases'-1 -databases 16 - -################################# REPLICATION ################################# - -# Master-Slave replication. Use slaveof to make a Redis instance a copy of -# another Redis server. Note that the configuration is local to the slave -# so for example it is possible to configure the slave to save the DB with a -# different interval, or to listen to another port, and so on. - -# slaveof - -################################## SECURITY ################################### - -# Require clients to issue AUTH before processing any other -# commands. This might be useful in environments in which you do not trust -# others with access to the host running redis-server. -# -# This should stay commented out for backward compatibility and because most -# people do not need auth (e.g. they run their own servers). - -# requirepass foobared - -################################### LIMITS #################################### - -# Set the max number of connected clients at the same time. By default there -# is no limit, and it's up to the number of file descriptors the Redis process -# is able to open. The special value '0' means no limts. -# Once the limit is reached Redis will close all the new connections sending -# an error 'max number of clients reached'. - -# maxclients 128 - -# Don't use more memory than the specified amount of bytes. -# When the memory limit is reached Redis will try to remove keys with an -# EXPIRE set. It will try to start freeing keys that are going to expire -# in little time and preserve keys with a longer time to live. -# Redis will also try to remove objects from free lists if possible. -# -# If all this fails, Redis will start to reply with errors to commands -# that will use more memory, like SET, LPUSH, and so on, and will continue -# to reply to most read-only commands like GET. -# -# WARNING: maxmemory can be a good idea mainly if you want to use Redis as a -# 'state' server or cache, not as a real DB. When Redis is used as a real -# database the memory usage will grow over the weeks, it will be obvious if -# it is going to use too much memory in the long run, and you'll have the time -# to upgrade. With maxmemory after the limit is reached you'll start to get -# errors for write operations, and this may even lead to DB inconsistency. - -# maxmemory - -############################### ADVANCED CONFIG ############################### - -# Glue small output buffers together in order to send small replies in a -# single TCP packet. Uses a bit more CPU but most of the times it is a win -# in terms of number of queries per second. Use 'yes' if unsure. -#glueoutputbuf yes diff --git a/lib/resque_sliders/test/test_helper.rb b/lib/resque_sliders/test/test_helper.rb deleted file mode 100755 index 67e6b3d..0000000 --- a/lib/resque_sliders/test/test_helper.rb +++ /dev/null @@ -1,74 +0,0 @@ -# Mostly copied from Resque in order to have similar test environment. -# https://github.com/defunkt/resque/blob/master/test/test_helper.rb - -dir = File.dirname(File.expand_path(__FILE__)) -$LOAD_PATH.unshift dir + '/../lib' -$TESTING = true -require 'test/unit' -require 'rubygems' -require 'resque' - -begin - require 'leftright' -rescue LoadError -end -require 'resque' -require 'resque-sliders/kewatcher' - -# -# make sure we can run redis -# - -if !system("which redis-server") - puts '', "** can't find `redis-server` in your path" - puts "** try running `sudo rake install`" - abort '' -end - - -# -# start our own redis when the tests start, -# kill it when they end -# - -at_exit do - next if $! - - if defined?(MiniTest) - exit_code = MiniTest::Unit.new.run(ARGV) - else - exit_code = Test::Unit::AutoRunner.run - end - - pid = `ps -A -o pid,command | grep [r]edis-test`.split(" ")[0] - puts "Killing test redis server..." - `rm -f #{dir}/dump.rdb` - Process.kill("KILL", pid.to_i) - exit exit_code -end - -puts "Starting redis for testing at localhost:9736..." -`redis-server #{dir}/redis-test.conf` -Resque.redis = 'localhost:9736' - - -## -# test/spec/mini 3 -# http://gist.github.com/25455 -# chris@ozmm.org -# file:lib/test/spec/mini.rb -# -def context(*args, &block) - return super unless (name = args.first) && block - require 'test/unit' - klass = Class.new(defined?(ActiveSupport::TestCase) ? ActiveSupport::TestCase : Test::Unit::TestCase) do - def self.test(name, &block) - define_method("test_#{name.gsub(/\W/,'_')}", &block) if block - end - def self.xtest(*args) end - def self.setup(&block) define_method(:setup, &block) end - def self.teardown(&block) define_method(:teardown, &block) end - end - (class << klass; self end).send(:define_method, :name) { name.gsub(/\W/,'_') } - klass.class_eval &block -end From 53dda34097c710b574095ca19d98a6512ad82d72 Mon Sep 17 00:00:00 2001 From: Matt Perejda Date: Mon, 24 Nov 2014 16:35:06 -0500 Subject: [PATCH 3/3] kill worker(s) w/ UI button --- Gemfile | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Gemfile b/Gemfile index f8c41fa..18172d2 100644 --- a/Gemfile +++ b/Gemfile @@ -4,10 +4,6 @@ gemspec gem 'rails', '~> 4.0.3' gem 'resque', :git => 'https://github.com/resque/resque.git', :branch => "1-x-stable" -#add functionality w/ two new plugins, encountered difficulties -gem 'resque-sliders' -gem 'resque-history' - gem 'sqlite3', :platforms => :ruby gem 'activerecord-jdbcsqlite3-adapter', :platforms => :jruby

        - <% if start - per_page >= 0 %> - « Previous - <% end %> - - <% (0...(size / per_page.to_f).ceil).each do |page_num| %> - <% if start == page_num * per_page %> - <%= page_num + 1 %> - <% else %> - <%= page_num + 1 %> - <% end %> - <% end %> - - <% if start + per_page <= size %> - Next » - <% end %> -