devise_cloudfuji_authenticatable 1.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. data/.gitignore +4 -0
  2. data/.project +12 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +6 -0
  5. data/Gemfile +10 -0
  6. data/README.md +121 -0
  7. data/Rakefile +1 -0
  8. data/app/controllers/devise/cas_sessions_controller.rb +101 -0
  9. data/app/views/devise/cas_sessions/new.html.erb +1 -0
  10. data/app/views/devise/cas_sessions/unregistered.html.erb +150 -0
  11. data/app/views/devise/cas_sessions/unregistered.html.erb.old +2 -0
  12. data/devise_cloudfuji_authenticatable.gemspec +36 -0
  13. data/lib/devise_cas_authenticatable.rb +135 -0
  14. data/lib/devise_cas_authenticatable/exceptions.rb +10 -0
  15. data/lib/devise_cas_authenticatable/missing_session_helpers.rb +9 -0
  16. data/lib/devise_cas_authenticatable/model.rb +56 -0
  17. data/lib/devise_cas_authenticatable/routes.rb +37 -0
  18. data/lib/devise_cas_authenticatable/schema.rb +13 -0
  19. data/lib/devise_cas_authenticatable/single_sign_out.rb +22 -0
  20. data/lib/devise_cas_authenticatable/single_sign_out/session_store/active_record.rb +12 -0
  21. data/lib/devise_cas_authenticatable/single_sign_out/session_store/redis.rb +27 -0
  22. data/lib/devise_cas_authenticatable/single_sign_out/strategies.rb +58 -0
  23. data/lib/devise_cas_authenticatable/single_sign_out/strategies/base.rb +11 -0
  24. data/lib/devise_cas_authenticatable/single_sign_out/strategies/rails_cache.rb +31 -0
  25. data/lib/devise_cas_authenticatable/strategy.rb +56 -0
  26. data/lib/devise_cloudfuji_authenticatable.rb +8 -0
  27. data/lib/devise_cloudfuji_authenticatable/version.rb +3 -0
  28. data/rails/init.rb +1 -0
  29. data/spec/devise_cas_authenticatable/model_spec.rb +39 -0
  30. data/spec/routes_spec.rb +38 -0
  31. data/spec/scenario/.gitignore +4 -0
  32. data/spec/scenario/app/controllers/application_controller.rb +3 -0
  33. data/spec/scenario/app/controllers/home_controller.rb +7 -0
  34. data/spec/scenario/app/models/user.rb +3 -0
  35. data/spec/scenario/app/views/layouts/application.html.erb +17 -0
  36. data/spec/scenario/config.ru +4 -0
  37. data/spec/scenario/config/application.rb +38 -0
  38. data/spec/scenario/config/boot.rb +13 -0
  39. data/spec/scenario/config/castronaut.yml +32 -0
  40. data/spec/scenario/config/database.yml +22 -0
  41. data/spec/scenario/config/environment.rb +5 -0
  42. data/spec/scenario/config/environments/development.rb +25 -0
  43. data/spec/scenario/config/environments/production.rb +49 -0
  44. data/spec/scenario/config/environments/test.rb +35 -0
  45. data/spec/scenario/config/initializers/backtrace_silencers.rb +7 -0
  46. data/spec/scenario/config/initializers/castronaut.rb +1 -0
  47. data/spec/scenario/config/initializers/devise.rb +3 -0
  48. data/spec/scenario/config/initializers/inflections.rb +10 -0
  49. data/spec/scenario/config/initializers/mime_types.rb +5 -0
  50. data/spec/scenario/config/initializers/secret_token.rb +7 -0
  51. data/spec/scenario/config/initializers/session_store.rb +8 -0
  52. data/spec/scenario/config/locales/en.yml +5 -0
  53. data/spec/scenario/config/routes.rb +8 -0
  54. data/spec/scenario/config/rubycas-server.yml +13 -0
  55. data/spec/scenario/db/migrate/20100401102949_create_tables.rb +15 -0
  56. data/spec/scenario/db/migrate/20111002012903_add_sessions_table.rb +16 -0
  57. data/spec/scenario/db/schema.rb +25 -0
  58. data/spec/scenario/public/.gitkeep +0 -0
  59. data/spec/spec_helper.rb +23 -0
  60. data/spec/strategy_spec.rb +87 -0
  61. data/spec/support/migrations.rb +4 -0
  62. metadata +236 -0
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
@@ -0,0 +1,12 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <projectDescription>
3
+ <name>devise_cas_authenticatable</name>
4
+ <comment></comment>
5
+ <projects>
6
+ </projects>
7
+ <buildSpec>
8
+ </buildSpec>
9
+ <natures>
10
+ <nature>org.radrails.rails.core.railsnature</nature>
11
+ </natures>
12
+ </projectDescription>
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format documentation
@@ -0,0 +1,6 @@
1
+ rvm:
2
+ - 1.8.7 # (current default)
3
+ - 1.9.2
4
+ gemfile:
5
+ - Gemfile
6
+ script: "bundle exec rake spec"
data/Gemfile ADDED
@@ -0,0 +1,10 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in devise_cloudfuji_authenticatable.gemspec
4
+ gemspec
5
+
6
+ group :test do
7
+ gem "rails", ">= 2.3"
8
+ gem "rspec-rails"
9
+ gem 'castronaut', :git => 'https://github.com/nbudin/castronaut.git', :branch => 'dam5s-merge'
10
+ end
@@ -0,0 +1,121 @@
1
+ devise_cloudfuji_authenticatable
2
+ =======
3
+
4
+ devise_cloudfuji_authenticatable provides single sign-on support for Cloudfuji applications, that use
5
+ [Devise](http://github.com/plataformatec/devise) for authentication. It acts as a **replacement for the database_authenticatable option that devise provides**
6
+
7
+ For applications running on Cloudfuji, the authentication server provides the following user data:
8
+
9
+ * ido_id - a string that is unique to the user
10
+ * email - user's email address
11
+ * first_name - user's first name
12
+ * last_name - user's last name
13
+ * locale - user's locale
14
+
15
+
16
+ Requirements
17
+ ------------
18
+
19
+ - Rails 2.3 or 3.0
20
+ - Devise 1.0 or greater
21
+
22
+ Installation
23
+ ------------
24
+
25
+ gem install --pre devise_cloudfuji_authenticatable
26
+
27
+ ### Rails 3.x: Add the following to your Gemfile
28
+
29
+ gem 'devise'
30
+ gem 'devise_cloudfuji_authenticatable'
31
+
32
+ This has been tested with 3.1 rc5 too. So feel safe to use it :)
33
+
34
+ ### Rails 2.3: Add the following in your config/environment.rb
35
+
36
+ config.gem 'devise', :version => '~> 1.0.6'
37
+ config.gem 'devise_cloudfuji_authenticatable'
38
+
39
+
40
+ Setup
41
+ -----
42
+
43
+ ### 1.) Add the following to your devise model
44
+
45
+ attr_accessor :ido_id
46
+ devise :cloudfuji_authenticatable
47
+
48
+ To the devise() method, you can add other modules like trackable, but **do not use database_authenticatable**. cloudfuji_authenticatable is a replacement for that.
49
+
50
+ ### 2.) Modify schema migration
51
+
52
+ Add the field required for the auth to work. For example, if the devise model is called User, add *cloudfuji_authenticatable* to the schema like below.
53
+
54
+ create_table :users do |t|
55
+ t.cloudfuji_authenticatable
56
+ end
57
+
58
+ That will add a string field called *ido_id*, which is unique to each Cloudfuji user.
59
+
60
+
61
+ ### 3.) [OPTIONAL] Add ido_id to be indexed
62
+
63
+ add_index :users, :ido_id, :unique => true
64
+
65
+
66
+ Extra attributes
67
+ ----------------
68
+
69
+ When the user is authenticated, Cloudfuji passed along the following extra attributes:
70
+
71
+ * email - user's email address
72
+ * first_name - user's first name
73
+ * last_name - user's last name
74
+ * locale - user's locale
75
+
76
+ If you find any of these attributes useful and want to capture them, add a cloudfuji_extra_attributes method to your User model (or whichever is your devise model). Below is an example that saves the email and the locale of a user.
77
+
78
+ class User < ActiveRecord::Base
79
+ attr_accessor :ido_id
80
+ devise :cloudfuji_authenticatable
81
+
82
+ def cloudfuji_extra_attributes(extra_attributes)
83
+ extra_attributes.each do |name, value|
84
+ case name.to_sym
85
+ when :email
86
+ self.email = value
87
+ when :locale
88
+ self.locale = value
89
+ end
90
+ end
91
+ end
92
+ end
93
+
94
+ The example above assumes that you have created fields called "email" and "locale" to save the attributes to. This gem doesn't create that for you. It has to be created manually and are optional.
95
+
96
+ __Note that these attributes might change anytime and are hence passed on as extra attributes. If defined, this method is called whenever the user logs into your app (starts a session). So when any of these are changed, your application will be able to capture those.__
97
+
98
+ **It is not advisable to use the user's email address to identify the user. Use the ido_id field for that purpose.**
99
+
100
+ Credits
101
+ --------
102
+ Based on [devise_cas_authenticatable](http://github.com/nbudin/devise_cas_authenticatable) by Nat Budin.
103
+
104
+ #### Tweaks by:
105
+
106
+ * Sean Grove
107
+ * Akash Manohar
108
+
109
+ [When contributing, add your name above and commit]
110
+
111
+ See also
112
+ --------
113
+
114
+ * [Devise](http://github.com/plataformatec/devise)
115
+ * [Warden](http://github.com/hassox/warden)
116
+
117
+
118
+ TODO
119
+ ----
120
+
121
+ * Test on non-ActiveRecord ORMs
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,101 @@
1
+ class Devise::CasSessionsController < Devise::SessionsController
2
+
3
+ def new
4
+ redirect_to(cas_login_url) unless returning_from_cas?
5
+ end
6
+
7
+ def service
8
+ warden.authenticate!(:scope => resource_name)
9
+ return redirect_to params[:redirect] if params[:redirect]
10
+ return redirect_to after_sign_in_path_for(resource_name)
11
+ end
12
+
13
+ def unregistered
14
+ end
15
+
16
+ def destroy
17
+ # Delete the ticket->session ID mapping if one exists for this session
18
+ if ticket = session['cas_last_valid_ticket']
19
+ ::DeviseCasAuthenticatable::SingleSignOut::Strategies.current_strategy.delete_session_index(ticket)
20
+ end
21
+
22
+ # if :cas_create_user is false a CAS session might be open but not signed_in
23
+ # in such case we destroy the session here
24
+ if signed_in?(resource_name)
25
+ sign_out(resource_name)
26
+ else
27
+ reset_session
28
+ end
29
+ redirect_to(::Devise.cas_client.logout_url)
30
+ end
31
+
32
+ def single_sign_out
33
+ if ::Devise.cas_enable_single_sign_out
34
+ session_index = read_session_index
35
+ if session_index
36
+ logger.info "Intercepted single-sign-out request for CAS session #{session_index}."
37
+ session_id = ::DeviseCasAuthenticatable::SingleSignOut::Strategies.current_strategy.find_session_id_by_index(session_index)
38
+ destroy_cas_session(session_id, session_index) if session_id
39
+ else
40
+ logger.warn "Ignoring CAS single-sign-out request as no session index could be parsed from the parameters."
41
+ end
42
+ else
43
+ logger.warn "Ignoring CAS single-sign-out request as feature is not currently enabled."
44
+ end
45
+
46
+ render :nothing => true
47
+ end
48
+
49
+ protected
50
+
51
+ def read_session_index
52
+ if request.headers['CONTENT_TYPE'] =~ %r{^multipart/}
53
+ false
54
+ elsif request.post? && params['logoutRequest'] =~
55
+ %r{^<samlp:LogoutRequest.*?<samlp:SessionIndex>(.*)</samlp:SessionIndex>}m
56
+ $~[1]
57
+ else
58
+ false
59
+ end
60
+ end
61
+
62
+ def destroy_cas_session(session_id, session_index)
63
+ if session_store && session_store.new.respond_to?(:destroy)
64
+ if session_store.respond_to? :find_by_session_id
65
+ user_session = session_store.find_by_session_id(session_id)
66
+ elsif session_store.respond_to? :find
67
+ user_session = session_store.find(session_id)
68
+ end
69
+ user_session.destroy if user_session
70
+ else
71
+ logger.info "A single sign out request was received for ticket #{session_index} but the Rails session_store is not a type supported for single-sign-out by devise_cas_authenticatable."
72
+ end
73
+ ::DeviseCasAuthenticatable::SingleSignOut::Strategies.current_strategy.delete_session_index(session_index)
74
+ end
75
+
76
+ def session_store
77
+ if ::Rails.respond_to? :application
78
+ return @session_store ||= Rails.application.config.session_store.session_class
79
+ elsif ::ActionController::Base.respond_to? :session_store
80
+ return @session_store ||= ActionController::Base.session_store.session_class
81
+ end
82
+ end
83
+
84
+ def returning_from_cas?
85
+ params[:ticket] || request.referer =~ /^#{::Devise.cas_client.cas_base_url}/
86
+ end
87
+
88
+ def cas_return_to_url
89
+ resource_or_scope = ::Devise.mappings.keys.first rescue 'user'
90
+ session["#{resource_or_scope}_return_to"].nil? ? '/' : session["#{resource_or_scope}_return_to"].to_s
91
+ end
92
+
93
+ def cas_login_url
94
+ login_url = ::Devise.cas_client.add_service_to_login_url(::Devise.cas_service_url(request.url, devise_mapping))
95
+
96
+ redirect_url = "&redirect=#{cas_return_to_url}"
97
+
98
+ return "#{login_url}#{redirect_url}"
99
+ end
100
+ helper_method :cas_login_url
101
+ end
@@ -0,0 +1 @@
1
+ <p>Click <%= link_to "here", cas_login_url %> to sign in.</p>
@@ -0,0 +1,150 @@
1
+ <!doctype html>
2
+
3
+ <!-- paulirish.com/2008/conditional-stylesheets-vs-css-hacks-answer-neither/ -->
4
+ <!--[if lt IE 7 ]> <html lang="en" class="no-js ie6"> <![endif]-->
5
+ <!--[if IE 7 ]> <html lang="en" class="no-js ie7"> <![endif]-->
6
+ <!--[if IE 8 ]> <html lang="en" class="no-js ie8"> <![endif]-->
7
+ <!--[if IE 9 ]> <html lang="en" class="no-js ie9"> <![endif]-->
8
+ <!--[if (gt IE 9)|!(IE)]><!--> <html lang="en" class="no-js"> <!--<![endif]-->
9
+ <head>
10
+ <meta charset="utf-8">
11
+
12
+ <!-- Always force latest IE rendering engine (even in intranet) & Chrome Frame
13
+ Remove this if you use the .htaccess -->
14
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
15
+
16
+ <title>Beta Signups | Cloudfuji</title>
17
+ <meta name="description" content="">
18
+ <meta name="author" content="">
19
+
20
+ <!-- Mobile viewport optimized: j.mp/bplateviewport -->
21
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
22
+
23
+ <!-- Place favicon.ico & apple-touch-icon.png in the root of your domain and delete these references -->
24
+ <link rel="shortcut icon" href="/favicon.ico">
25
+ <link rel="apple-touch-icon" href="/apple-touch-icon.png" >
26
+
27
+ <!--[if (!IE)|(gte IE 8)]><!-->
28
+ <link href="/packages/common-datauri.css?1307048615" media="all" rel="stylesheet" type="text/css" />
29
+ <!--<![endif]-->
30
+ <!--[if lte IE 7]>
31
+ <link href="/packages/common-mhtml.css?1307084302" media="all" rel="stylesheet" type="text/css" />
32
+ <![endif]-->
33
+ <!--[if (!IE)|(gte IE 8)]><!-->
34
+ <link href="/packages/print-datauri.css?1307048614" media="print" rel="stylesheet" type="text/css" />
35
+ <!--<![endif]-->
36
+ <!--[if lte IE 7]>
37
+ <link href="/packages/print-mhtml.css?1307084303" media="print" rel="stylesheet" type="text/css" />
38
+ <![endif]-->
39
+
40
+ <!--[if IE]>
41
+ <link href="/stylesheets/ie.css?1307048560" media="screen, projection" rel="stylesheet" type="text/css" />
42
+ <![endif]-->
43
+ <!--[if !IE 7]>
44
+ <style type="text/css">
45
+ #wrap {display:table;height:100%}
46
+ </style>
47
+ <![endif]-->
48
+ <meta name="csrf-param" content="authenticity_token"/>
49
+ <meta name="csrf-token" content="P8qAtaA1MPX7p14725fxZyM3sFbvx4bSjokKHFmIs04="/>
50
+
51
+ <!-- Uncomment if you are specifically targeting less enabled mobile browsers
52
+ <link rel="stylesheet" media="handheld" href="css/handheld.css?v=2"> -->
53
+ <style>
54
+ @charset "UTF-8";.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}/*\*/* html .ui-helper-clearfix{height:1%}.ui-helper-clearfix{display:block}/**/.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:absolute;top:0;left:0;width:100%;height:100%}.ui-widget{font-family:Verdana,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:Verdana,Arial,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #aaa;background:#fff url(../javascripts/vendor/jquery-ui-1.8.12.custom/css/smoothness/images/ui-bg_flat_75_ffffff_40x100.png?1307048560) 50% 50% repeat-x;color:#222}.ui-widget-content a{color:#222}.ui-widget-header{border:1px solid #aaa;background:#ccc url(../javascripts/vendor/jquery-ui-1.8.12.custom/css/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png?1307048560) 50% 50% repeat-x;color:#222;font-weight:bold}.ui-widget-header a{color:#222}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #d3d3d3;background:#e6e6e6 url(../javascripts/vendor/jquery-ui-1.8.12.custom/css/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png?1307048560) 50% 50% repeat-x;font-weight:normal;color:#555}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#555;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 #999;background:#dadada url(../javascripts/vendor/jquery-ui-1.8.12.custom/css/smoothness/images/ui-bg_glass_75_dadada_1x400.png?1307048560) 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-state-hover a,.ui-state-hover a:hover{color:#212121;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #aaa;background:#fff url(../javascripts/vendor/jquery-ui-1.8.12.custom/css/smoothness/images/ui-bg_glass_65_ffffff_1x400.png?1307048560) 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#212121;text-decoration:none}.ui-widget :active{outline:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fcefa1;background:#fbf9ee url(../javascripts/vendor/jquery-ui-1.8.12.custom/css/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png?1307048560) 50% 50% repeat-x;color:#363636}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#fef1ec url(../javascripts/vendor/jquery-ui-1.8.12.custom/css/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png?1307048560) 50% 50% repeat-x;color:#cd0a0a}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#cd0a0a}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#cd0a0a}.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}.ui-icon{width:16px;height:16px;background-image:url(../javascripts/vendor/jquery-ui-1.8.12.custom/css/smoothness/images/ui-icons_222222_256x240.png?1307048560)}.ui-widget-content .ui-icon{background-image:url(../javascripts/vendor/jquery-ui-1.8.12.custom/css/smoothness/images/ui-icons_222222_256x240.png?1307048560)}.ui-widget-header .ui-icon{background-image:url(../javascripts/vendor/jquery-ui-1.8.12.custom/css/smoothness/images/ui-icons_222222_256x240.png?1307048560)}.ui-state-default .ui-icon{background-image:url(../javascripts/vendor/jquery-ui-1.8.12.custom/css/smoothness/images/ui-icons_888888_256x240.png?1307048560)}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url(../javascripts/vendor/jquery-ui-1.8.12.custom/css/smoothness/images/ui-icons_454545_256x240.png?1307048560)}.ui-state-active .ui-icon{background-image:url(../javascripts/vendor/jquery-ui-1.8.12.custom/css/smoothness/images/ui-icons_454545_256x240.png?1307048560)}.ui-state-highlight .ui-icon{background-image:url(../javascripts/vendor/jquery-ui-1.8.12.custom/css/smoothness/images/ui-icons_2e83ff_256x240.png?1307048560)}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url(../javascripts/vendor/jquery-ui-1.8.12.custom/css/smoothness/images/ui-icons_cd0a0a_256x240.png?1307048560)}.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{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}.ui-corner-tl{-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px}.ui-corner-tr{-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px}.ui-corner-bl{-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px}.ui-corner-br{-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px}.ui-corner-top{-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px}.ui-corner-bottom{-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px}.ui-corner-right{-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px}.ui-corner-left{-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px}.ui-corner-all{-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px}.ui-widget-overlay{background:#aaa url(../javascripts/vendor/jquery-ui-1.8.12.custom/css/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png?1307048560) 50% 50% repeat-x;opacity:.30;filter:Alpha(Opacity=30)}.ui-widget-shadow{margin:-8px 0 0 -8px;padding:8px;background:#aaa url(../javascripts/vendor/jquery-ui-1.8.12.custom/css/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png?1307048560) 50% 50% repeat-x;opacity:.30;filter:Alpha(Opacity=30);-moz-border-radius:8px;-webkit-border-radius:8px;border-radius:8px}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:.1px;z-index:99999;display:block;background-image:url(data:)}.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}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.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}.ui-autocomplete{position:absolute;cursor:default}* html .ui-autocomplete{width:1px}.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}.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}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.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}input.ui-button{padding:.4em 1em}.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}.ui-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}button.ui-button::-moz-focus-inner{border:0;padding:0}.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}.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}.ui-tabs{position:relative;padding:.2em;zoom:1}.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}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tabs .ui-tabs-hide{display:none!important}.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}.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%}.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}.ui-datepicker-cover{display:none;display:block;position:absolute;z-index:-1;filter:mask();top:-4px;left:-4px;width:200px;height:200px}.ui-progressbar{height:2em;text-align:left}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.terminal .clipboard{position:absolute;bottom:0;left:0;opacity:.01;filter:alpha(opacity = .01);filter:alpha(opacity=0.01)}.cmd>.clipboard{position:fixed}.terminal{padding:10px;position:relative;overflow:hidden}.cmd{padding:0;margin:0;height:1.3em}.terminal .terminal-output div{display:block}.terminal,.terminal .terminal-output,.terminal .terminal-output div,.terminal .terminal-output div div,.cmd,.terminal .cmd span,.terminal .cmd div{font-family:monospace;color:#aaa;background-color:#000;font-size:12px}.terminal .cmd span{float:left}.terminal div::selection,.terminal span::selection{background-color:#aaa;color:#000}.terminal .cmd span.inverted{background-color:#aaa;color:#000}.terminal div::-moz-selection,.terminal span::-moz-selection{background-color:#aaa;color:#000}.terminal .terminal-output div.error,.terminal .terminal-output div.error div{color:red}.tilda{position:fixed;top:0;left:0;width:100%;z-index:1100}.inputContainer{position:relative;float:left}.formError{position:absolute;top:300px;left:300px;display:block;z-index:5000;cursor:pointer}.ajaxSubmit{padding:20px;background:#55ea55;border:1px solid #999;display:none}.formError .formErrorContent{width:100%;background:#ee0101;position:relative;z-index:5001;color:#fff;width:150px;font-family:tahoma;font-size:11px;border:2px solid #ddd;box-shadow:0 0 6px #000;-moz-box-shadow:0 0 6px #000;-webkit-box-shadow:0 0 6px #000;padding:4px 10px 4px 10px;border-radius:6px;-moz-border-radius:6px;-webkit-border-radius:6px}.greenPopup .formErrorContent{background:#33be40}.blackPopup .formErrorContent{background:#393939;color:#FFF}.formError .formErrorArrow{width:15px;margin:-2px 0 0 13px;position:relative;z-index:5006}.formError .formErrorArrowBottom{box-shadow:none;-moz-box-shadow:none;-webkit-box-shadow:none;margin:0 0 0 12px;top:2px}.formError .formErrorArrow div{border-left:2px solid #ddd;border-right:2px solid #ddd;box-shadow:0 2px 3px #444;-moz-box-shadow:0 2px 3px #444;-webkit-box-shadow:0 2px 3px #444;font-size:0;height:1px;background:#ee0101;margin:0 auto;line-height:0;font-size:0;display:block}.formError .formErrorArrowBottom div{box-shadow:none;-moz-box-shadow:none;-webkit-box-shadow:none}.greenPopup .formErrorArrow div{background:#33be40}.blackPopup .formErrorArrow div{background:#393939;color:#FFF}.formError .formErrorArrow .line10{width:15px;border:none}.formError .formErrorArrow .line9{width:13px;border:none}.formError .formErrorArrow .line8{width:11px}.formError .formErrorArrow .line7{width:9px}.formError .formErrorArrow .line6{width:7px}.formError .formErrorArrow .line5{width:5px}.formError .formErrorArrow .line4{width:3px}.formError .formErrorArrow .line3{width:1px;border-left:2px solid #ddd;border-right:2px solid #ddd;border-bottom:0 solid #ddd}.formError .formErrorArrow .line2{width:3px;border:none;background:#ddd}.formError .formErrorArrow .line1{width:1px;border:none;background:#ddd}#facebox{position:absolute;top:0;left:0;z-index:100;text-align:left}#facebox .popup{position:relative;border:3px solid rgba(0,0,0,0);-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;-webkit-box-shadow:0 0 18px rgba(0,0,0,0.4);-moz-box-shadow:0 0 18px rgba(0,0,0,0.4);box-shadow:0 0 18px rgba(0,0,0,0.4)}#facebox .content{display:table;width:370px;padding:10px;background:#fff;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}#facebox .content>p:first-child{margin-top:0}#facebox .content>p:last-child{margin-bottom:0}#facebox .close{position:absolute;top:5px;right:5px;padding:2px;background:#fff}#facebox .close img{opacity:.3}#facebox .close:hover img{opacity:1.0}#facebox .loading{text-align:center}#facebox .image{text-align:center}#facebox img{border:0;margin:0}#facebox_overlay{position:fixed;top:0;left:0;height:100%;width:100%}.facebox_hide{z-index:-100}.facebox_overlayBG{background-color:#000;z-index:99}html,body,div,span,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,abbr,address,cite,code,del,dfn,em,img,ins,kbd,q,samp,small,strong,sub,sup,var,b,i,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,figcaption,figure,footer,header,hgroup,menu,nav,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}blockquote,q{quotes:none}blockquote:before,blockquote:after{content:"";content:none}q:before,q:after{content:"";content:none}ins{background-color:#ff9;color:black;text-decoration:none}mark{background-color:#ff9;color:black;font-style:italic;font-weight:bold}del{text-decoration:line-through}abbr[title],dfn[title]{border-bottom:1px dotted;cursor:help}table{border-collapse:collapse;border-spacing:0}hr{display:block;height:1px;border:0;border-top:1px solid #ccc;margin:1em 0;padding:0}input,select{vertical-align:middle}body{font:13px/1.231 sans-serif;*font-size:small}select,input,textarea,button{font:99% sans-serif}pre,code,kbd,samp{font-family:monospace,sans-serif}html{overflow-y:scroll}a:hover,a:active{outline:none}ul{margin-left:2em}ol{margin-left:2em;list-style-type:decimal}nav ul,nav li{margin:0;list-style:none;list-style-image:none}small{font-size:85%}strong,th{font-weight:bold}td{vertical-align:top}sub{font-size:75%;line-height:0;position:relative}sup{font-size:75%;line-height:0;position:relative;top:-0.5em}sub{bottom:-0.25em}pre{white-space:pre;white-space:pre-wrap;word-wrap:break-word;padding:15px}textarea{overflow:auto}.ie6 legend,.ie7 legend{margin-left:-7px}input[type="radio"]{vertical-align:text-bottom}input[type="checkbox"]{vertical-align:bottom}.ie7 input[type="checkbox"]{vertical-align:baseline}.ie6 input{vertical-align:text-bottom}label{cursor:pointer}input[type="button"],input[type="submit"],input[type="image"]{cursor:pointer}button{cursor:pointer;margin:0}input,select,textarea{margin:0}input:invalid,textarea:invalid{border-radius:1px;-moz-box-shadow:0 0 5px red;-webkit-box-shadow:0 0 5px red;box-shadow:0 0 5px red}.no-boxshadow input:invalid,.no-boxshadow textarea:invalid{background-color:#f0dddd}button{width:auto;overflow:visible}.ie7 img{-ms-interpolation-mode:bicubic}body,select,input,textarea{color:#444}.ir{display:block;text-indent:-999em;overflow:hidden;background-repeat:no-repeat;text-align:left;direction:ltr}.hidden{display:none;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.clearfix{zoom:1}.clearfix:before{content:"\0020";display:block;height:0;overflow:hidden}.clearfix:after{content:"\0020";display:block;height:0;overflow:hidden;clear:both}@media print{*{background:transparent!important;color:black!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a{color:#444!important;text-decoration:underline}a:visited{color:#444!important;text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after{content:""}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}@page{margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}.fancy-button-reset-base-class,button,.button,button.hot,.button.hot,button.cool,.button.cool{font-family:"Lucida Grande",Lucida,Arial,sans-serif;background:url(../images/button_bg.png) repeat-x bottom left;margin:0;width:auto;overflow:visible;display:inline-block;cursor:pointer;text-decoration:none;border-style:solid;font-weight:bold}.fancy-button-reset-base-class::-moz-focus-inner,button::-moz-focus-inner,.button::-moz-focus-inner,button.hot::-moz-focus-inner,.button.hot::-moz-focus-inner,button.cool::-moz-focus-inner,.button.cool::-moz-focus-inner{border:none;padding:0}.fancy-button-reset-base-class:focus,button:focus,.button:focus,button.hot:focus,.button.hot:focus,button.cool:focus,.button.cool:focus{outline:none}.l{float:left}.r{float:right}.alpha{margin-left:0!important;padding-left:0!important}.omega{margin-right:0!important;padding-right:0!important}button,.button{-moz-border-radius:6px;-webkit-border-radius:6px;-o-border-radius:6px;-ms-border-radius:6px;-khtml-border-radius:6px;border-radius:6px;font-size:18px;line-height:1.2em;padding:.3em 1em;border-width:1px;background-color:#444;background-image:-webkit-gradient(linear,0% 0,0% 100%,color-stop(0%,#989898),color-stop(10%,#6a6a6a),color-stop(50%,#3d3d3d),color-stop(50%,#353535),color-stop(100%,#4f4f4f));background-image:-moz-linear-gradient(top,#989898 0,#6a6a6a 10%,#3d3d3d 50%,#353535 50%,#4f4f4f 100%);background-image:linear-gradient(top,#989898 0,#6a6a6a 10%,#3d3d3d 50%,#353535 50%,#4f4f4f 100%);border-color:#1e1e1e;text-shadow:#040404 0 1px 1px;-moz-box-shadow:rgba(255,255,255,0.27) 0 0 .1em 1px inset;-webkit-box-shadow:rgba(255,255,255,0.27) 0 0 .1em 1px inset;-o-box-shadow:rgba(255,255,255,0.27) 0 0 .1em 1px inset;box-shadow:rgba(255,255,255,0.27) 0 0 .1em 1px inset;-moz-background-clip:padding;-webkit-background-clip:padding;-o-background-clip:padding-box;-ms-background-clip:padding-box;-khtml-background-clip:padding-box;background-clip:padding-box;font-weight:normal!important;font-size:1em!important}button,button:visited,.button,.button:visited{color:white}button:hover,button:focus,.button:hover,.button:focus{background-color:#3c3c3c;background-image:-webkit-gradient(linear,0% 0,0% 100%,color-stop(0%,#909090),color-stop(10%,#626262),color-stop(50%,#353535),color-stop(50%,#2d2d2d),color-stop(100%,#474747));background-image:-moz-linear-gradient(top,#909090 0,#626262 10%,#353535 50%,#2d2d2d 50%,#474747 100%);background-image:linear-gradient(top,#909090 0,#626262 10%,#353535 50%,#2d2d2d 50%,#474747 100%);border-color:#161616;text-shadow:black 0 1px 1px}button:hover,button:hover:visited,button:focus,button:focus:visited,.button:hover,.button:hover:visited,.button:focus,.button:focus:visited{color:white}button:active,.button:active{background-color:#353535;background-image:-webkit-gradient(linear,0% 0,0% 100%,color-stop(0%,#353535),color-stop(30%,#3a3a3a),color-stop(50%,#303030),color-stop(50%,#292929),color-stop(100%,#4a4a4a));background-image:-moz-linear-gradient(top,#353535 0,#3a3a3a 30%,#303030 50%,#292929 50%,#4a4a4a 100%);background-image:linear-gradient(top,#353535 0,#3a3a3a 30%,#303030 50%,#292929 50%,#4a4a4a 100%);border-color:#0f0f0f;text-shadow:black 0 -1px -1px;-moz-box-shadow:#1e1e1e 0 .08em .1em 1px inset;-webkit-box-shadow:#1e1e1e 0 .08em .1em 1px inset;-o-box-shadow:#1e1e1e 0 .08em .1em 1px inset;box-shadow:#1e1e1e 0 .08em .1em 1px inset}button:active,button:active:visited,.button:active,.button:active:visited{color:white}button.hot,.button.hot{-moz-border-radius:6px;-webkit-border-radius:6px;-o-border-radius:6px;-ms-border-radius:6px;-khtml-border-radius:6px;border-radius:6px;font-size:18px;line-height:1.2em;padding:.3em 1em;border-width:1px;background-color:#ff1c1c;background-image:-webkit-gradient(linear,0% 0,0% 100%,color-stop(0%,#f8cbcb),color-stop(10%,#ed7a7a),color-stop(50%,#e22929),color-stop(50%,#de1e1e),color-stop(100%,#e64949));background-image:-moz-linear-gradient(top,#f8cbcb 0,#ed7a7a 10%,#e22929 50%,#de1e1e 50%,#e64949 100%);background-image:linear-gradient(top,#f8cbcb 0,#ed7a7a 10%,#e22929 50%,#de1e1e 50%,#e64949 100%);border-color:#b61919;text-shadow:#9c0000 0 1px 1px;-moz-box-shadow:rgba(255,255,255,0.55) 0 0 .1em 1px inset;-webkit-box-shadow:rgba(255,255,255,0.55) 0 0 .1em 1px inset;-o-box-shadow:rgba(255,255,255,0.55) 0 0 .1em 1px inset;box-shadow:rgba(255,255,255,0.55) 0 0 .1em 1px inset;-moz-background-clip:padding;-webkit-background-clip:padding;-o-background-clip:padding-box;-ms-background-clip:padding-box;-khtml-background-clip:padding-box;background-clip:padding-box}button.hot,button.hot:visited,.button.hot,.button.hot:visited{color:white}button.hot:hover,button.hot:focus,.button.hot:hover,.button.hot:focus{background-color:#ff0d0d;background-image:-webkit-gradient(linear,0% 0,0% 100%,color-stop(0%,#f6bebe),color-stop(10%,#eb6d6d),color-stop(50%,#de1e1e),color-stop(50%,#d11c1c),color-stop(100%,#e53b3b));background-image:-moz-linear-gradient(top,#f6bebe 0,#eb6d6d 10%,#de1e1e 50%,#d11c1c 50%,#e53b3b 100%);background-image:linear-gradient(top,#f6bebe 0,#eb6d6d 10%,#de1e1e 50%,#d11c1c 50%,#e53b3b 100%);border-color:#a91717;text-shadow:#8d0000 0 1px 1px}button.hot:hover,button.hot:hover:visited,button.hot:focus,button.hot:focus:visited,.button.hot:hover,.button.hot:hover:visited,.button.hot:focus,.button.hot:focus:visited{color:white}button.hot:active,.button.hot:active{background-color:#fc0000;background-image:-webkit-gradient(linear,0% 0,0% 100%,color-stop(0%,#de1e1e),color-stop(30%,#e22424),color-stop(50%,#d51c1c),color-stop(50%,#c71b1b),color-stop(100%,#e53f3f));background-image:-moz-linear-gradient(top,#de1e1e 0,#e22424 30%,#d51c1c 50%,#c71b1b 50%,#e53f3f 100%);background-image:linear-gradient(top,#de1e1e 0,#e22424 30%,#d51c1c 50%,#c71b1b 50%,#e53f3f 100%);border-color:#9b1515;text-shadow:#7d0000 0 -1px -1px;-moz-box-shadow:#b61919 0 .08em .1em 1px inset;-webkit-box-shadow:#b61919 0 .08em .1em 1px inset;-o-box-shadow:#b61919 0 .08em .1em 1px inset;box-shadow:#b61919 0 .08em .1em 1px inset}button.hot:active,button.hot:active:visited,.button.hot:active,.button.hot:active:visited{color:white}button.cool,.button.cool{-moz-border-radius:6px;-webkit-border-radius:6px;-o-border-radius:6px;-ms-border-radius:6px;-khtml-border-radius:6px;border-radius:6px;font-size:18px;line-height:1.2em;padding:.3em 1em;border-width:1px;background-color:#0d225d;background-image:-webkit-gradient(linear,0% 0,0% 100%,color-stop(0%,#6075b3),color-stop(10%,#3b4c7c),color-stop(50%,#1d253d),color-stop(50%,#181f33),color-stop(100%,#283456));background-image:-moz-linear-gradient(top,#6075b3 0,#3b4c7c 10%,#1d253d 50%,#181f33 50%,#283456 100%);background-image:linear-gradient(top,#6075b3 0,#3b4c7c 10%,#1d253d 50%,#181f33 50%,#283456 100%);border-color:#090c14;text-shadow:black 0 1px 1px;-moz-box-shadow:rgba(255,255,255,0.21) 0 0 .1em 1px inset;-webkit-box-shadow:rgba(255,255,255,0.21) 0 0 .1em 1px inset;-o-box-shadow:rgba(255,255,255,0.21) 0 0 .1em 1px inset;box-shadow:rgba(255,255,255,0.21) 0 0 .1em 1px inset;-moz-background-clip:padding;-webkit-background-clip:padding;-o-background-clip:padding-box;-ms-background-clip:padding-box;-khtml-background-clip:padding-box;background-clip:padding-box}button.cool,button.cool:visited,.button.cool,.button.cool:visited{color:white}button.cool:hover,button.cool:focus,.button.cool:hover,.button.cool:focus{background-color:#0b1e50;background-image:-webkit-gradient(linear,0% 0,0% 100%,color-stop(0%,#546daf),color-stop(10%,#354672),color-stop(50%,#181f33),color-stop(50%,#131929),color-stop(100%,#232e4c));background-image:-moz-linear-gradient(top,#546daf 0,#354672 10%,#181f33 50%,#131929 50%,#232e4c 100%);background-image:linear-gradient(top,#546daf 0,#354672 10%,#181f33 50%,#131929 50%,#232e4c 100%);border-color:#05060a;text-shadow:black 0 1px 1px}button.cool:hover,button.cool:hover:visited,button.cool:focus,button.cool:focus:visited,.button.cool:hover,.button.cool:hover:visited,.button.cool:focus,.button.cool:focus:visited{color:white}button.cool:active,.button.cool:active{background-color:#091842;background-image:-webkit-gradient(linear,0% 0,0% 100%,color-stop(0%,#181f33),color-stop(30%,#1b233a),color-stop(50%,#141a2c),color-stop(50%,#101421),color-stop(100%,#252f4f));background-image:-moz-linear-gradient(top,#181f33 0,#1b233a 30%,#141a2c 50%,#101421 50%,#252f4f 100%);background-image:linear-gradient(top,#181f33 0,#1b233a 30%,#141a2c 50%,#101421 50%,#252f4f 100%);border-color:black;text-shadow:black 0 -1px -1px;-moz-box-shadow:#090c14 0 .08em .1em 1px inset;-webkit-box-shadow:#090c14 0 .08em .1em 1px inset;-o-box-shadow:#090c14 0 .08em .1em 1px inset;box-shadow:#090c14 0 .08em .1em 1px inset}button.cool:active,button.cool:active:visited,.button.cool:active,.button.cool:active:visited{color:white}input[type="text"],.text,.password,input[type="password"]{padding:7px;border:2px solid #bcc3c8;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px;color:#222c48;background:url(/images/input-sliver.png?1307048560) repeat-x}.app_cell{border-radius:10px;-moz-border-radius:10px;-webkit-border-radius:10px;background:#f5f6f2;width:910px;height:90px;margin:20px auto 0 auto;padding:10px}.app_cell .delete_app{color:#e43737;text-decoration:none;text-shadow:none!important}.app_cell .delete_app:hover{text-decoration:underline}.app_details{margin-left:10px;color:#222548;text-shadow:2px 2px 0 white}.app_details h2{font-size:1.6em}.app_details h2 a{color:#222548;text-decoration:none}.app_details p{font-size:1.2em}.app_control{display:block;width:60px;text-align:center;margin-right:10px;text-decoration:none;color:#e43737}.app_control:hover .app_control_caption{text-decoration:underline}.app_control_caption{padding-top:5px}.control_frame{display:block;clear:both;width:60px;height:55px;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px;line-height:60px;text-align:center;padding-top:15px;margin-bottom:5px;background:#e1e3e0}.control_icon{display:block;height:40px;width:40px;margin:0 auto;background:#e1e3e0 url(/images/actions-icons.png?1307048560) no-repeat}.logs_icon{background-position:0 -80px}.update_icon{background-position:0 -40px}.console_icon{background-position:0 -120px}.url-box{color:#002060;font-size:1.3em;padding:10px;width:434px;border:2px solid #002060;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px}.url-form{float:left}.url-holder{padding-bottom:15px}.url-holder h2{font-size:1.3em;font-weight:bold;margin:10px 0;color:#002060;float:left;clear:right;padding-left:10px}.url-holder h3{font-size:1.4em;margin-bottom:10px}.title{margin-bottom:20px}.title h1{font-size:1.4em;font-weight:bold;color:#c1af8a}.error-logs{height:200px;border:1px solid;overflow:scroll;padding:10px}.progress{display:none;width:530px;height:68px;font-size:1.3em;border-radius:16px;-moz-border-radius:16px;-webkit-border-radius:16px}.progress-percent{float:left;margin:0 15px}.throbber-holder{float:left;margin-right:15px;position:relative;top:10px}.progress-overlay{position:absolute;width:0;height:68px;opacity:.4;background-image:-webkit-gradient(linear,left bottom,left top,color-stop(0.08,#002060),color-stop(0.54,#364363));background-image:-moz-linear-gradient(center bottom,#002060 8%,#364363 54%)}.progress-box{position:relative;line-height:68px;background-image:-webkit-gradient(linear,left bottom,left top,color-stop(0.05,#323232),color-stop(0.1,#616161),color-stop(0.6,#c8c8c8),color-stop(0.8,#d6d6d6),color-stop(0.9,#e6e6e6));background-image:-moz-linear-gradient(center bottom,#323232 5%,#616161 10%,#c8c8c8 60%,#d6d6d6 80%,#e6e6e6 90%);color:#333}.progress-todo-list{list-style:none;position:absolute;left:65px}.showcase_app{float:left;display:block;width:279px;height:129px;padding:11px;background:#f5f6f2;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px;text-decoration:none}.showcase_app:hover span{text-decoration:underline}.showcase_app h3{color:#e43737;font-size:1.5em}.showcase_app cite{color:#222c48}.showcase_images{float:left;margin-right:10px}.showcase_text{width:180px}#customizer{background:white;padding:30px;width:520px}#customizer h2{color:#7b8287;font-size:1.5em}#customizer ul{border:1px solid #bcc3c8;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px;display:block;list-style-type:none;margin-left:0}#customizer ul li{border-bottom:1px solid #bcc3c8;padding:7px}#customizer p.domain_widget{padding-top:11px}#customizer .domain_input{width:388px;margin-right:4px}#variable_controls{padding-top:28px}.save_strip{height:40px;background:#f5f6f2;width:520px;text-align:center;padding:10px}body.logs_show,body.logs_index,body.console_index{background:white!important}body.logs_show #main,body.logs_index #main,body.console_index #main{padding:0;margin:0}body.logs_show .cursor,body.logs_index .cursor,body.console_index .cursor{background:#0e1e3a!important}.log_header{position:fixed;z-index:9000;width:100%}.log_body{padding-top:60px;font-family:sans-serif,monofont}.console_input{width:100%;display:inline}.terminal .clipboard{position:absolute;bottom:0;left:0;opacity:.01;filter:alpha(opacity=0.01);filter:alpha(opacity=0.01)}.cmd>.clipboard{position:fixed}.terminal{padding-left:10px;padding-right:10px;position:relative;overflow:hidden}.cmd{padding:0;margin:0;height:1.3em}.terminal{font-family:monospace;color:black;background-color:white;font-size:12px}.terminal .terminal-output{font-family:monospace;color:black;background-color:white;font-size:12px}.terminal .terminal-output div{display:block;font-family:monospace;color:black;background-color:white;font-size:12px}.terminal .terminal-output div div{font-family:monospace;color:black;background-color:white;font-size:12px}.cmd{font-family:monospace;color:black;background-color:white;font-size:12px}.terminal .cmd span,.terminal .cmd div{font-family:monospace;color:black;background-color:white;font-size:12px}.terminal .cmd span{float:left}.terminal div::selection,.terminal span::selection,.terminal .cmd span.inverted,.terminal div::-moz-selection,.terminal span::-moz-selection{background-color:black;color:white}.terminal .terminal-output div.error{color:red}.terminal .terminal-output div.error div{color:red}.tilda{position:fixed;top:0;left:0;width:100%;z-index:1100}.log_info{display:block;height:50px;line-height:50px;padding-left:15px}.log_controls{height:50px;line-height:50px}.sessions-holder{background:#f5f6f2;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px;padding:30px;width:310px}.sessions-holder a{text-decoration:none;color:#e43737}.sessions-holder a:hover{text-decoration:underline}.sessions-holder p{padding-bottom:20px}.sessions-holder label{color:#7b8287;font-weight:bold;text-shadow:0 0 2px white}.sessions-holder input[type="text"],.sessions-holder input[type="password"]{margin-top:8px}.sessions_title{color:#222c48;padding-bottom:15px}.sessions_title a{text-decoration:none;color:#e43737}.sessions_title a:hover{text-decoration:underline}html{height:100%}body{height:100%;background:#eeeded url(/images/pattern-bg.png?1307048560) repeat;color:#222548}body>div#root{height:auto;min-height:100%}div#root{height:100%;width:990px;margin:0 auto;background:white;-moz-box-shadow:0 0 10px #888;-webkit-box-shadow:0 0 10px #888;box-shadow:0 0 10px #888}.main_header{display:block;height:100px}#footer{display:block;background:#222c48 url(/images/footer-bg.png?1307048560);width:960px;margin:0 auto;height:70px;margin-top:-70px!important;color:white;padding:15px}#footer ul{float:left;display:block;margin-right:72px;list-style-type:none;margin-left:0}#main{display:block;padding-bottom:100px;background:white}#content{padding:15px}.main_header,.log_header{height:50px;background:#222c48;border-bottom:5px solid #e43737}.main_header a,.log_header a{text-decoration:none;color:#e43737}.main_header a.logo,.log_header a.logo{color:white;padding:15px 0 0 15px}.main_header span,.log_header span{color:white}.main_site_nav a{display:block;height:50px;float:left;padding-right:25px;text-shadow:0 0 3px black;text-align:center;margin-top:17px}.main_site_nav span{color:#e43737!important}.main_site_nav a.hot .flag{display:block;border-color:transparent transparent #e43737 transparent;border-style:solid;border-width:9px;margin:0 auto;width:0;height:0}#auth_links{padding:16px 15px 0}#auth_links .flag{display:block;border-color:white transparent transparent transparent;border-style:solid;border-width:7px;float:right;margin:5px 0 0 5px;width:0;height:0}.section_header{background:#f5f6f2 url(/images/title-bg.png?1307048560);padding:30px 15px}.section_logo{height:66px;height:66px;padding-left:65px}.section_title{color:#e43737;line-height:66px;font-size:2.8em;display:block;height:66px;padding-left:15px}.section_logo{background:url(/images/title-icons.png?1307048560)}.apps{background-position:0 -65px}.sign_up{background-position:0 -130px}.section_text{height:66px;line-height:66px;font-size:1.3em;color:#222c48}.section_text a{color:#e43737;text-decoration:none}.section_text a:hover{text-decoration:underline}.divider{height:40px;width:960px;padding:0 15px;line-height:40px}.divider label{color:#7b8287;text-shadow:0 0 3px white}.divider input[type="text"]{margin-left:15px;height:22px;width:120px;padding:0 10px;border:2px solid #7b8287;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px}.divider.dark{background:#bbc2c7;-moz-box-shadow:inset 0 2px 5px #888,inset 0 -2px 5px #888;-webkit-box-shadow:inset 0 2px 5px #888,inset 0 -2px 5px #888;box-shadow:inset 0 2px 5px #888,inset 0 -2px 5px #888}.bushi_box{background:#f5f6f2;@rounded_corners(10px);padding:30px;font-weight:bold;color:#7b8287}.bushi_box a{color:#e43737;text-decoration:none}.bushi_box a:hover{text-decoration:underline}#auth_links{display:block;background:#222c48}#auth_links nav{display:none;padding:10px 0;background:#222c48}#auth_links.open{-moz-box-shadow:inset 0 5px 5px #888,0px 5px 5px #888;-webkit-box-shadow:inset 0 5px 5px #888,0px 5px 5px #888;box-shadow:inset 0 5px 5px #888,0px 5px 5px #888;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px}
55
+ </style>
56
+ </head>
57
+
58
+ <body class="static_splash">
59
+
60
+ <div id="root">
61
+ <div class="clearfix main_header">
62
+ <a href="http://cloudfuji.com" class="logo l clearfix">
63
+ <img src="http://cloudfuji.com/images/header-logo.png" class="l" style="position:relative;bottom:10px;">
64
+ <img src="http://cloudfuji.com/images/logo.png" height="20" width="93" alt="cloudfuji" class="l logo_text" style="margin-left:10px;">
65
+ </a>
66
+ </div>
67
+
68
+ <section id="main">
69
+ <h1>The user <%=h params[:username] %> is not registered with this site.
70
+ Please <%= link_to "sign in using a different account", Devise.cas_client.logout_url(new_session_path(resource_name)) %>.</h1>
71
+ </section>
72
+
73
+ </div> <!-- end of #ro0t -->
74
+
75
+ <footer id="footer">
76
+ <div class="main_footer clearfix">
77
+ <!-- <div class="footer_disclaimer">
78
+
79
+ </div> -->
80
+ </div>
81
+
82
+ </footer>
83
+ <!-- Javascript at the bottom for fast page loading -->
84
+
85
+ <!-- Grab Google CDNs jQuery. fall back to local if necessary -->
86
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.0/jquery.min.js"></script>
87
+
88
+ <script type="text/javascript">
89
+ (function () {
90
+ var $name = $("#name");
91
+ var $url = $("#url");
92
+ var $source = $("#source");
93
+ var $message = $("#message");
94
+
95
+ var cloudfujiName = location.hostname.split(".cloudfuji.com")[0];
96
+
97
+ $name.text("Your app's Cloudfuji name is '" + cloudfujiName + "'.");
98
+ $url.html("The full address for the app is <a href='http://" + cloudfujiName + ".cloudfuji.com/'>http://" + cloudfujiName + ".cloudfuji.com/</a>");
99
+
100
+ var issueAppCommand = function(command, cb) {
101
+ //console.log("Updating app status for " + cloudfujiName);
102
+ $.ajax({
103
+ url: "http://cloudfuji.com/apps/" + cloudfujiName + "/command",
104
+ type: "get",
105
+ dataType: "jsonp",
106
+ data: {
107
+ command: command
108
+ },
109
+ error: function(err, status, xhr){
110
+ //console.log(err, status, xhr);
111
+ return cb(err);
112
+ },
113
+ success: function(data, status, xhr){
114
+ return cb(null, data);
115
+ }
116
+ });
117
+ };
118
+
119
+ var checkIntervalHandle;
120
+
121
+ var updateAppStatus = function() {
122
+ issueAppCommand("status", function(err, data) {
123
+ if (err) {
124
+ $message.html("We're experiencing some difficulty right now. Please try refreshing. If that doesn't work, shoot us an email at support@cloudfuji.com and we'll get on it as soon as we can.");
125
+ } else if ("stopped" === data.status) {
126
+ issueAppCommand("start", function() {});
127
+ } else {
128
+ $message.html("Your app is currently <strong>" + data.status + "</strong>");
129
+ $source.html("This app was deployed from " + data.app.app.url);
130
+
131
+ if ("running" === data.status) {
132
+ window.location = window.location;
133
+ clearInterval(checkIntervalHandle);
134
+ }
135
+ }
136
+ });
137
+ };
138
+
139
+ updateAppStatus();
140
+ checkIntervalHandle = setInterval(updateAppStatus, 1000);
141
+ })();
142
+ </script>
143
+
144
+ <!--[if lt IE 7 ]>
145
+ <script src="js/libs/dd_belatedpng.js"></script>
146
+ <script> DD_belatedPNG.fix('img, .png_bg'); //fix any <img> or .png_bg background-images </script>
147
+ <![endif]-->y
148
+ </body>
149
+ </html>
150
+
@@ -0,0 +1,2 @@
1
+ <p>The user <%=h params[:username] %> is not registered with this site.
2
+ Please <%= link_to "sign in using a different account", Devise.cas_client.logout_url(new_session_url(resource_name)) %>.</p>
@@ -0,0 +1,36 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "devise_cloudfuji_authenticatable/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "devise_cloudfuji_authenticatable"
7
+ s.version = DeviseCloudfujiAuthenticatable::VERSION
8
+ s.authors = ["Akash Manohar J", "Sean Grove", "Didier Lafforgue"]
9
+ s.email = "s@cloudfuji.com"
10
+ s.homepage = "http://github.com/cloudfuji/cloudfuji_cas_authenticatable"
11
+ s.summary = %q{Cloudfuji SSO authentication module for Devise}
12
+ s.description = %q{Cloudfuji SSO authentication module for Devise. A slight variant of the excellent work from Nat Budlin on devise_cas_authenticatable.}
13
+
14
+ s.rubyforge_project = "devise_cloudfuji_authenticatable"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ # specify any dependencies here; for example:
22
+ # s.add_development_dependency "rspec"
23
+ # s.add_runtime_dependency "rest-client"
24
+ s.add_runtime_dependency(%q<devise>, ["= 1.5.3"])
25
+ s.add_runtime_dependency(%q<rubycas-client>, [">= 2.2.1"])
26
+
27
+ s.add_development_dependency("rspec")
28
+ s.add_development_dependency("mocha")
29
+ s.add_development_dependency("shoulda")
30
+ s.add_development_dependency("sqlite3-ruby")
31
+ s.add_development_dependency("sham_rack")
32
+ s.add_development_dependency("capybara")
33
+ s.add_development_dependency('crypt-isaac')
34
+ s.add_development_dependency('launchy')
35
+ s.add_development_dependency('pry')
36
+ end