From 47a8ed6b04a9cae5eeb3fc8c7ca907f8dff961c7 Mon Sep 17 00:00:00 2001 From: Thomas Neumann <57959550+tommyneu@users.noreply.github.com> Date: Mon, 19 Aug 2024 15:57:29 -0500 Subject: [PATCH] Split service space (#90) * Added engineering garage as a service space * Added config for app and made sure things are using it * Removed deploy.rb * Added more config * Fixed error * Removed maker request from engineering garage and updated nav bar * Removed HRC stuff from non innovation studio spaces * Removed tours from non innovation studio spaces * Remove export from non innovation studio spaces * Remove training docs from non innovation studio spaces * Moved emails to template files * Use config values * Removed old font references, added npm to compile less * Updated innovation studio css to main css, added cache busting to config * Moved email templates to sub-folder, updated templates * Make sure users are in this service space * Split items per service space * Added service space to studio spaces, email presets, and event presets * Fix email template paths * Fix color of tool reservation calendar block * Added conditional if captcha site key is empty * Added new event types and added displays for training and workshops * Updated alerts and my alerts * Updated footers * Added email templates for engineering garage * Fixed no toolbar view and removed unused erb file * Fix announcement notice * default config * Updated DB dump and readme * Fix config stuff * Fix more config stuff * Remove duplicate double slash * Make sure to check the user has an email before sending it * Updated readme * Added section for email testing * remove stank from readme file * Remove Stank * Fixed sample files * Added missing require statements in scripts * Fix logic for setting dates on load * Added attended orientation email * Added logic for active/inactive users and prevent inactive users from doing things * Moved active to it's own DB column * Remove active check for things --- .gitignore | 1 + Guardfile | 2 +- README.md | 101 ++--- app.rb | 49 ++- classes/emailer.rb | 17 +- config.ru | 5 +- config/config.json | 12 + data/{db_2024_02_15.sql => db_2024_08_01.sql} | 43 +- data/updates/0006_engineering_garage.sql | 21 + deploy.rb | 45 --- models/alert.rb | 24 +- models/event.rb | 37 +- models/resource.rb | 10 + models/user.rb | 286 +++++++------ package-lock.json | 216 ++++++++++ package.json | 14 + public/css/innovation_studio.css | 1 - public/css/jquery-ui.min-custom.css | 6 +- public/css/main.css | 376 ++++++++++++++++++ routes/admin/agenda.rb | 2 +- routes/admin/emails.rb | 24 +- routes/admin/events.rb | 36 +- routes/admin/orientation_attended.rb | 2 +- routes/admin/tools.rb | 2 +- routes/admin/users.rb | 10 +- routes/admin/view_check_in.rb | 17 +- routes/alert_center.rb | 94 +++-- routes/auth.rb | 12 +- routes/check_in.rb | 2 +- routes/events.rb | 41 +- routes/export.rb | 2 + routes/home.rb | 1 - routes/maker_request.rb | 24 ++ routes/new_members.rb | 68 ++-- routes/tools.rb | 47 ++- routes/tours.rb | 6 + routes/training_documents.rb | 4 + routes/vehicles.rb | 6 +- routes/workshops.rb | 59 ++- scripts/email_expiring_users.rb | 4 +- .../email_expiring_users_vehicle_update.rb | 6 +- scripts/email_unconfirmed_trainers.rb | 4 +- src/less/lib/eventicon-embedded.less | 18 - src/less/lib/fonts.less | 23 -- .../{innovation_studio.less => main.less} | 8 +- startup.sh.sample | 2 +- unicorn.rb.sample | 1 - views/admin/edit_user.erb | 26 +- views/admin/emails.erb | 2 +- views/admin/new_event.erb | 108 +++-- views/alert_center.erb | 79 +--- views/auto_updating_announcement.erb | 13 +- views/calendar.erb | 2 +- views/engineering_garage/alert_center.erb | 18 + .../email_templates/activation_email.erb | 29 ++ .../attended_orientation_email.erb | 15 + .../broken_equipment_email.erb | 3 + .../confirmation_reminder_email.erb | 3 + .../email_templates/deleted_event_email.erb | 5 + .../email_templates/event_signup_email.erb | 7 + .../event_signup_nonmember_email.erb | 7 + .../email_templates/expiring_email.erb | 8 + .../email_templates/hrc_signup_email.erb | 2 + .../email_templates/modified_event_email.erb | 8 + .../email_templates/new_event_email.erb | 7 + .../email_templates/new_member_email.erb | 7 + .../email_templates/password_email.erb | 7 + .../email_templates/remove_event_email.erb | 5 + .../email_templates/training_signup_email.erb | 7 + .../email_templates/vehicle_info_email.erb | 6 + .../email_templates/workshop_signup_email.erb | 7 + .../event_listing_table.erb | 75 ++++ views/engineering_garage/footer.erb | 22 + .../membership_expiration.erb | 9 + views/engineering_garage/my_alerts.erb | 42 ++ views/engineering_garage/trainings.erb | 14 + .../engineering_garage/workshop_listings.erb | 2 + views/engineering_garage/workshops.erb | 5 + views/fixed.erb | 10 +- views/fixed_no_toolbar.erb | 75 +++- views/home.erb | 79 +--- views/innovationstudio/alert_center.erb | 60 +++ .../email_templates/activation_email.erb | 29 ++ .../attended_orientation_email.erb | 15 + .../broken_equipment_email.erb | 3 + .../confirmation_reminder_email.erb | 3 + .../email_templates/deleted_event_email.erb | 5 + .../email_templates/event_signup_email.erb | 7 + .../event_signup_nonmember_email.erb | 7 + .../email_templates/expiring_email.erb | 8 + .../email_templates/hrc_signup_email.erb | 2 + .../email_templates/modified_event_email.erb | 8 + .../email_templates/new_event_email.erb | 7 + .../email_templates/new_member_email.erb | 11 + .../email_templates/password_email.erb | 7 + .../email_templates/remove_event_email.erb | 5 + .../email_templates/training_signup_email.erb | 7 + .../email_templates/vehicle_info_email.erb | 5 + .../email_templates/workshop_signup_email.erb | 7 + .../event_listing_table.erb | 0 views/innovationstudio/footer.erb | 24 ++ .../membership_expiration.erb | 9 + views/innovationstudio/my_alerts.erb | 54 +++ views/innovationstudio/trainings.erb | 14 + views/innovationstudio/workshop_listings.erb | 9 + views/innovationstudio/workshops.erb | 3 + views/local_footer.erb | 23 +- views/me.erb | 2 +- views/navigation.erb | 86 ++-- views/new_members.erb | 2 +- views/new_members_hrc.erb | 2 +- views/scriptsandstyles.erb | 7 - views/trainings.erb | 28 +- views/workshop_listings.erb | 9 - views/workshops.erb | 16 +- 115 files changed, 2177 insertions(+), 812 deletions(-) rename data/{db_2024_02_15.sql => db_2024_08_01.sql} (99%) create mode 100644 data/updates/0006_engineering_garage.sql delete mode 100644 deploy.rb create mode 100644 package-lock.json create mode 100644 package.json delete mode 100644 public/css/innovation_studio.css create mode 100644 public/css/main.css delete mode 100644 src/less/lib/fonts.less rename src/less/{innovation_studio.less => main.less} (89%) create mode 100644 views/engineering_garage/alert_center.erb create mode 100644 views/engineering_garage/email_templates/activation_email.erb create mode 100644 views/engineering_garage/email_templates/attended_orientation_email.erb create mode 100644 views/engineering_garage/email_templates/broken_equipment_email.erb create mode 100644 views/engineering_garage/email_templates/confirmation_reminder_email.erb create mode 100644 views/engineering_garage/email_templates/deleted_event_email.erb create mode 100644 views/engineering_garage/email_templates/event_signup_email.erb create mode 100644 views/engineering_garage/email_templates/event_signup_nonmember_email.erb create mode 100644 views/engineering_garage/email_templates/expiring_email.erb create mode 100644 views/engineering_garage/email_templates/hrc_signup_email.erb create mode 100644 views/engineering_garage/email_templates/modified_event_email.erb create mode 100644 views/engineering_garage/email_templates/new_event_email.erb create mode 100644 views/engineering_garage/email_templates/new_member_email.erb create mode 100644 views/engineering_garage/email_templates/password_email.erb create mode 100644 views/engineering_garage/email_templates/remove_event_email.erb create mode 100644 views/engineering_garage/email_templates/training_signup_email.erb create mode 100644 views/engineering_garage/email_templates/vehicle_info_email.erb create mode 100644 views/engineering_garage/email_templates/workshop_signup_email.erb create mode 100644 views/engineering_garage/event_listing_table.erb create mode 100644 views/engineering_garage/footer.erb create mode 100644 views/engineering_garage/membership_expiration.erb create mode 100644 views/engineering_garage/my_alerts.erb create mode 100644 views/engineering_garage/trainings.erb create mode 100644 views/engineering_garage/workshop_listings.erb create mode 100644 views/engineering_garage/workshops.erb create mode 100644 views/innovationstudio/alert_center.erb create mode 100644 views/innovationstudio/email_templates/activation_email.erb create mode 100644 views/innovationstudio/email_templates/attended_orientation_email.erb create mode 100644 views/innovationstudio/email_templates/broken_equipment_email.erb create mode 100644 views/innovationstudio/email_templates/confirmation_reminder_email.erb create mode 100644 views/innovationstudio/email_templates/deleted_event_email.erb create mode 100644 views/innovationstudio/email_templates/event_signup_email.erb create mode 100644 views/innovationstudio/email_templates/event_signup_nonmember_email.erb create mode 100644 views/innovationstudio/email_templates/expiring_email.erb create mode 100644 views/innovationstudio/email_templates/hrc_signup_email.erb create mode 100644 views/innovationstudio/email_templates/modified_event_email.erb create mode 100644 views/innovationstudio/email_templates/new_event_email.erb create mode 100644 views/innovationstudio/email_templates/new_member_email.erb create mode 100644 views/innovationstudio/email_templates/password_email.erb create mode 100644 views/innovationstudio/email_templates/remove_event_email.erb create mode 100644 views/innovationstudio/email_templates/training_signup_email.erb create mode 100644 views/innovationstudio/email_templates/vehicle_info_email.erb create mode 100644 views/innovationstudio/email_templates/workshop_signup_email.erb rename views/{ => innovationstudio}/event_listing_table.erb (100%) create mode 100644 views/innovationstudio/footer.erb create mode 100644 views/innovationstudio/membership_expiration.erb create mode 100644 views/innovationstudio/my_alerts.erb create mode 100644 views/innovationstudio/trainings.erb create mode 100644 views/innovationstudio/workshop_listings.erb create mode 100644 views/innovationstudio/workshops.erb delete mode 100644 views/scriptsandstyles.erb delete mode 100644 views/workshop_listings.erb diff --git a/.gitignore b/.gitignore index bf774dcd..908c9393 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,7 @@ /public/wdn /db/scripts/private/ .idea +node_modules ## Service start up configs .config diff --git a/Guardfile b/Guardfile index a538af8f..030dea2c 100644 --- a/Guardfile +++ b/Guardfile @@ -15,7 +15,7 @@ less_options = { all_on_start: true, all_after_change: true, - patterns: ['Guardfile', 'src/less/innovation_studio.less'], + patterns: ['Guardfile', 'src/less/main.less'], output: 'public/css', compress: true } diff --git a/README.md b/README.md index b9fd218d..186d169c 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ UNL reservation system for schedule resources, classes, etc. 1. Service spaces refer to different silos of the University that will utilize resources. E.g. the math department, the Honors program, or University Communication. 2. Super Admins of a space can do anything, including giving others access and privileges to the space. -3. Resources are created, and then may be reserved by anyone who has the User Access privilege in the space. +3. Resources are created, and then may be reserved by anyone who has the User Access privilege in the space. 4. Events *may* include a resource reservation but do not have to. 5. Admins with the right privilege can set the *hours* of the space, which indicate when reservations can be made. 6. The agenda is a quick overview of the day for Admins to look at. @@ -18,13 +18,29 @@ UNL reservation system for schedule resources, classes, etc. 2. Now using RVM, install the ruby with `rvm install 2.6.5`. 3. You probably do not have the `bundler` gem. Check with `bundle`. If not, install it with `gem install bundler`. 4. In the project root, install the gems using `bundle install`. -5. Create a mysql database you'd like to use, you can typically use one on your computer. `brew install mysql` if necessary. -6. `config/config.json` is a committed file, and a template for the configuration. Create a copy in the same directoy named `server.json` and edit it to match your database. You will also need to include your site keys for google reCaptcha which can be generated at https://www.google.com/recaptcha/ for the V2 checkbox. -7. Your database is currently blank. Run any sql queries in `./data` to install database and the updates to it. +5. Create a mysql database you'd like to use, you can typically use one on your computer. `brew install mysql` if necessary. +6. `config/config.json` is a committed file, and a template for the configuration. Create a copy in the same directory named `server.json` and edit it to match your database. You will also need to include your site keys for google reCaptcha which can be generated at [https://www.google.com/recaptcha/](https://www.google.com/recaptcha/) for the V2 checkbox. +7. Your database is currently blank. Install database schema by running `./data/db_2024_08_01.sql` and any updates greater than `0006`. 8. Install the WDN Framework into the `public/wdn` directory...see [WDN Documentation](http://wdn.unl.edu/documentation). 9. Start the server by going to the root directory and doing `bundle exec shotgun -o 0.0.0.0 -p 9393`. This launches the server on localhost port 9393, listening everywhere (you can use your iimlemburg.unl.edu or whichever), and the server will automatically update to new code. If you add gems to the bundle, you will need to re-execute this command. 10. Navigate to `localhost:9393/` or similar and begin! -11. In another terminal, type `bundle exec guard` in the project root to execute LESS compilation. + +### Less + +I couldn't get Guard to work for me locally so I also added a npm version of less complication + +The traditional way to compile less `bundle exec guard` + +The NPM way to compile less + +1. Run `npm ci` to install less +2. Run `npm run less` to compile less + +### Local Email Testing + +A quick way to test emails without having to set up email stuff is to run a SMTP debug server in python + +`sudo python -m smtpd -n -c DebuggingServer localhost:25` ## Installation on server @@ -32,7 +48,7 @@ UNL reservation system for schedule resources, classes, etc. 2. Run `cp ./config/config.json ./config/server.json` to copy config file and customize it to your environment 3. Run `ln -s {path to WDN Templates} {path to project root}/public/wdn` to symlink WDN Templates to your project 4. Run `/bin/bundler install` to install dependencies -5. Install database schema running files in `./data` +5. Install database schema by running `./data/db_2024_08_01.sql` and any updates greater than `0006` 6. You will need to get a service running for unicorn using systemd 1. Run `cp ./startup.sh.sample ./startup.sh` and customize file for your domain and sock 2. Run `cp ./unicorn.rb.sample ./unicorn.rb` and customize file for your domain and sock @@ -41,65 +57,24 @@ UNL reservation system for schedule resources, classes, etc. 7. Run `systemctl --user start unicorn` to start the service 8. Run `systemctl --user enable unicorn` to start the service on boot -## Deploying Updates on Staging - -1. Run these commands to restart the unicorn server. - - ``` bash - cat innovationstudio-manager-test.pid - sudo -u innovationstudio-test kill -9 [replace with PID from first command] - sudo -u innovationstudio-test ./startup.sh - ``` - -2. After restarting the unicorn server make sure that there are only two scheduler processes running. The scheduler processes handle sending out automated emails on a daily basis. There should be one for the staging environment and one for the production environment. If more than 2 processes are running then users will receive duplicate emails. Run the command below to check if multiple processes are running. You should only get 2 process IDs back. - - ``` bash - pgrep ruby - ``` +## Deploying Updates on Production/Staging -3. If you get more than 2 processes IDs then you need to check which users started each process. There should be one process started by the innovationstudio-test user(the staging user) and one process started by the innovationstudio user. You can check the user of a process with this command where pid is the process ID. +1. SSH into server and switch to site's user `sudo -u {USER} -s` +2. Run `git pull origin master` to pull latest changes +3. Update database using SQL files in `./data/updates` +4. Update any gems using `bundle install` +5. Restart unicorn `systemctl --user restart unicorn` +6. Double check service is running `systemctl --user status unicorn` +7. Check for errors `journalctl --user -u unicorn -f` - ``` bash - ps -o user= -p pid - ``` +### Other helpful commands -4. Once you determine which processes are extra (if any) then kill them with this command. - - ``` bash - sudo -u innovationstudio kill -9 pid - ``` - -## Deploying Updates on Production - -1. Run these commands to restart the unicorn server. - - ``` bash - sudo -u innovationstudio -s -H - systemctl --user restart unicorn - ``` - -2. If the production environment fails to start after executing those commands then an error must have occurred. You can view the error log with the following command. This command will print the last 50 lines of the error log: - - ``` bash - cat error.log | tail -n 50 - ``` - -3. If the error log happens to say that the unicorn server cannot start because the process already exists (even though the server is still down) you can run the following commands to determine the process ID and to kill the processe. After killing the existing process and trying to restart the server you should get a more helpful error message in the error log if the server still fails to start. -Use this command to find the process ID. The process you're looking for should have this in the command column: - - ``` bash - unicorn master -l /run/httpd-local/innovationstudio.sock -E production -c /var/www/html/innovationstudio-manager.unl.edu/unicorn.rb - ``` - - ``` bash - ps aux - ``` - - Use this command to kill the process ID - - ``` bash - sudo -u innovationstudio kill -9 pid - ``` +- Starting unicorn `systemctl --user start unicorn` +- Stopping unicorn `systemctl --user stop unicorn` +- Start unicorn on boot `systemctl --user enable unicorn` +- Don't start unicorn on boot `systemctl --user disable unicorn` +- Check if unicorn is enabled `systemctl --user is-enabled unicorn` +- Update systemctl when changes made to service file `systemctl --user daemon-reload` ## CRON @@ -107,6 +82,4 @@ Use this command to find the process ID. The process you're looking for should h 0 12 * * * ruby ././scripts/email_expiring_users.rb 0 12 * * * ruby ././scripts/email_unconfirmed_trainers.rb 0 22 * * * ruby ././scripts/email_expiring_users_vehicle_update.rb - -#@reboot /var/www/html/innovationstudio-manager.unl.edu/startup.sh ``` diff --git a/app.rb b/app.rb index 72b17895..d3a01f56 100644 --- a/app.rb +++ b/app.rb @@ -5,7 +5,7 @@ use Rack::Session::Cookie, :key => 'rack.session', :path => '/', - :domain => (ENV['RACK_ENV'] == 'development' ? nil : 'innovationstudio-manager.unl.edu'), + :domain => CONFIG['app']['cookie_domain'], :secret => 'averymanteroldfatherbesseyhamilton', :old_secret => 'averymanteroldfatherbesseyhamilton', :expire_after => 30*24*60*60 @@ -22,12 +22,14 @@ def flash(type, header, message) } end -SS_ID = ServiceSpace.where(:name => 'Innovation Studio').first.id +SS_ID = ServiceSpace.where(:id => CONFIG['app']['service_space_id']).first.id before do # site defaults @inline_body_script_content = '' - @title = 'Innovation Studio Manager' + @affiliation = 'Nebraska Innovation Campus' + @affiliation_link = 'https://innovate.unl.edu/' + CONFIG['app']['title'] = 'Innovation Studio Manager' @breadcrumbs = [ { :href => 'https://www.unl.edu/', @@ -40,10 +42,32 @@ def flash(type, header, message) }, { :href => '/', - :text => 'Innovation Studio Manager' + :text => CONFIG['app']['title'] } ] + if SS_ID == 8 + @inline_body_script_content = '' + @affiliation = 'College of Engineering' + @affiliation_link = 'https://engineering.unl.edu/' + CONFIG['app']['title'] = 'Engineering Garage' + @breadcrumbs = [ + { + :href => 'https://www.unl.edu/', + :text => 'Nebraska', + :title => 'University of Nebraska–Lincoln Home' + }, + { + :href => 'https://engineering.unl.edu/', + :text => 'College of Engineering' + }, + { + :href => '/', + :text => CONFIG['app']['title'] + } + ] + end + session[:init] = true # check if the user is currently logged in @@ -77,6 +101,21 @@ def require_login(redirect_after_login=nil) end end +def require_active(redirect_to=nil) + if !@user.nil? && !@user.is_active && !@user.is_super_user? + if SS_ID == 1 + flash(:alert, 'You Must Be An Active User', 'That page requires you to be an active user. To activate your account please visit Innovation Studio.') + elsif SS_ID == 8 + flash(:alert, 'You Must Be An Active User', 'That page requires you to be an active user. To activate your account please visit the Engineering Garage.') + end + if redirect_to.nil? + redirect '/' + else + redirect redirect_to + end + end +end + def drupal_link_lookup(key) # Leading and Trailing Slash IMPORTANT nodes = { @@ -103,7 +142,7 @@ def drupal_link_lookup(key) end get '/images/user/:user_id/?' do - user = User.find_by(:id => params[:user_id]) + user = User.find_by(:id => params[:user_id], :service_space_id => SS_ID) if user.nil? || user.imagedata.nil? raise Sinatra::NotFound end diff --git a/classes/emailer.rb b/classes/emailer.rb index 54147349..2d5b1d95 100644 --- a/classes/emailer.rb +++ b/classes/emailer.rb @@ -28,7 +28,7 @@ def self.mail(to, subject, body, bcc = "", attachments = nil) :bcc => bcc_group, :subject => subject, :html_body => body, - :from => 'innovationstudio@unl.edu', + :from => CONFIG['app']['email_from'], :via => self.method, :via_options => self.method_options, :attachments => attachments @@ -40,7 +40,7 @@ def self.mail(to, subject, body, bcc = "", attachments = nil) :bcc => bcc, :subject => subject, :html_body => body, - :from => 'innovationstudio@unl.edu', + :from => CONFIG['app']['email_from'], :via => self.method, :via_options => self.method_options, :attachments => attachments @@ -69,18 +69,21 @@ def self.breakup_recipient(recipient) def self.method if ENV['RACK_ENV'] == 'development' - :sendmail -# :smtp + if CONFIG['email']['via'] == ":smtp" + :smtp + else + :sendmail + end else :sendmail end end def self.method_options - if ENV['RACK_ENV'] == 'development' + if ENV['RACK_ENV'] == 'development' && !CONFIG['email']['via_address'].empty? { - :address => '127.0.0.1', - :port => '1025' + :address => CONFIG['email']['via_address'], + :port => CONFIG['email']['via_port'] } else {} diff --git a/config.ru b/config.ru index 3be9493d..45858f0c 100644 --- a/config.ru +++ b/config.ru @@ -10,11 +10,10 @@ require 'utils/database' require 'sinatra' require 'app' -if ENV['RACK_ENV'] == 'development' - # weird workaround for localhost cookie things +if CONFIG['app']['cookie_domain'].empty? set :cookie_options, :domain => nil else - set :cookie_options, :domain => 'innovationstudio-manager.unl.edu' + set :cookie_options, :domain => CONFIG['app']['cookie_domain'] end # start scheduler on new thread so program doesn't hang waiting for it to finish diff --git a/config/config.json b/config/config.json index 0b7ba0a1..387fbb80 100644 --- a/config/config.json +++ b/config/config.json @@ -10,5 +10,17 @@ "reCaptcha" : { "site_key" : "", "secret_key" : "" + }, + "app" : { + "service_space_id": "1", + "URL": "https://innovationstudio-manager.unl.edu/", + "cookie_domain": "innovationstudio-manager.unl.edu", + "email_from": "innovationstudio@unl.edu", + "cb_version": "2024022701" + }, + "email" : { + "via": ":smtp", + "via_address": "localhost", + "via_port": "25" } } \ No newline at end of file diff --git a/data/db_2024_02_15.sql b/data/db_2024_08_01.sql similarity index 99% rename from data/db_2024_02_15.sql rename to data/db_2024_08_01.sql index 227e613f..fa2fc589 100644 --- a/data/db_2024_02_15.sql +++ b/data/db_2024_08_01.sql @@ -172,6 +172,8 @@ CREATE TABLE `events` ( `trainer_id` int(11) DEFAULT NULL, `trainer_confirmed` tinyint(4) DEFAULT 0, `is_private` tinyint(1) DEFAULT 0, + `hrc_feed` tinyint(1) NOT NULL DEFAULT 0, + `hrc_parking` tinyint(1) NOT NULL DEFAULT 1, `event_code` varchar(255) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci; @@ -241,7 +243,10 @@ INSERT INTO `event_types` (`id`, `description`, `service_space_id`) VALUES (8, 'Tour', 1), (9, 'Conference', 4), (10, 'Scheduling', 1), -(11, 'HRC Training', 1); +(11, 'HRC Training', 1), +(12, 'New Membership Orientation', 8), +(13, 'Machine Training', 8), +(14, 'General Workshop', 8); -- -------------------------------------------------------- @@ -360,7 +365,8 @@ INSERT INTO `permissions` (`id`, `name`) VALUES (6, 'Manage Events'), (7, 'See Agenda'), (8, 'User Access'), -(9, 'Events Admin Read-only'); +(9, 'Events Admin Read-only'), +(10, 'Sub-Super User'); -- -------------------------------------------------------- @@ -372,7 +378,8 @@ CREATE TABLE `preset_emails` ( `id` int(11) NOT NULL, `name` varchar(255) DEFAULT NULL, `subject` varchar(255) DEFAULT NULL, - `body` varchar(10000) DEFAULT NULL + `body` varchar(10000) DEFAULT NULL, + `service_space_id` int(11) DEFAULT 1 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; -- @@ -401,7 +408,8 @@ CREATE TABLE `preset_events` ( `description` varchar(4000) DEFAULT NULL, `event_type_id` int(11) DEFAULT NULL, `max_signups` int(11) DEFAULT NULL, - `duration` int(11) DEFAULT NULL + `duration` int(11) DEFAULT NULL, + `service_space_id` int(11) DEFAULT 1 ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci; -- @@ -3104,6 +3112,8 @@ INSERT INTO `service_spaces` (`id`, `name`, `url_name`, `imagedata`, `imagemime` (6, 'Honke_Demo', 'honke', NULL, NULL); INSERT INTO `service_spaces` (`id`, `name`, `url_name`, `imagedata`, `imagemime`) VALUES (7, 'College of Engineering', 'engineering', 0xffd8ffe000104a46494600010201004800480000ffe1181f4578696600004d4d002a000000080007011200030000000100010000011a00050000000100000062011b0005000000010000006a012800030000000100020000013100020000001e000000720132000200000014000000908769000400000001000000a4000000d0000afc8000002710000afc800000271041646f62652050686f746f73686f7020435333204d6163696e746f736800323030393a30353a32362031363a30373a3533000003a00100030000000100010000a0020004000000010000012ca003000400000001000000c80000000000000006010300030000000100060000011a0005000000010000011e011b0005000000010000012601280003000000010002000002010004000000010000012e0202000400000001000016e90000000000000048000000010000004800000001ffd8ffe000104a46494600010200004800480000ffed000c41646f62655f434d0001ffee000e41646f626500648000000001ffdb0084000c08080809080c09090c110b0a0b11150f0c0c0f1518131315131318110c0c0c0c0c0c110c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c010d0b0b0d0e0d100e0e10140e0e0e14140e0e0e0e14110c0c0c0c0c11110c0c0c0c0c0c110c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0cffc0001108006b00a003012200021101031101ffdd0004000affc4013f0000010501010101010100000000000000030001020405060708090a0b0100010501010101010100000000000000010002030405060708090a0b1000010401030204020507060805030c33010002110304211231054151611322718132061491a1b14223241552c16233347282d14307259253f0e1f163733516a2b283264493546445c2a3743617d255e265f2b384c3d375e3f3462794a485b495c4d4e4f4a5b5c5d5e5f55666768696a6b6c6d6e6f637475767778797a7b7c7d7e7f711000202010204040304050607070605350100021103213112044151617122130532819114a1b14223c152d1f0332462e1728292435315637334f1250616a2b283072635c2d2449354a317644555367465e2f2b384c3d375e3f34694a485b495c4d4e4f4a5b5c5d5e5f55666768696a6b6c6d6e6f62737475767778797a7b7c7ffda000c03010002110311003f00f4e7da59bdcfb19556c206e78d350d3abb7b3f790c665278cba3ef1ffa550baa37760e48ff0084aff2d2b1db580a486312164f55b295177bed757fdcaa3f0ffd2aa15f51c4b4d82acdc6b0d4f355a1ae69db637e9d5645becb19fb8b1db587380f1207deb17eacb43b17a8de3fed4754cdb3fe9b59ff007c4ef6858168e2f07b5fb653ff0072a8fc3ff4aa6fb653ff0072e8fbc7fe955825aa25a8fb23b9571f83d07db68ffb9747de3ff4aa5f6ea3fee5e3fde3ff004aae74b144b11f623dcab8cf67a3fb763ffdccc7fbc7fe954bedf8dff7331fef1ffa5573458140b3c91fbbc7b94719ecf51fb4317fee6e3fde3ff4aa6fda18bff7371bef1ffa5572c58a25897dde3fbc55ee1ecf57fb4717fee6e37f9c3ff4aa5fb4713fee6e37f9cdff00d2ab932c512c47eed1fde2af70f67aefda589ff73b1bfce6ff00e954bf6961ff00dcec6ff39bff00a55723b144b12fbb47f78a3dc3d9ebff0069e1ff00dcec6ff39bff00a552fda985ff0073f17fce6ffe955c79afc944d611fbb47f78abdd3d9ec0f57e9ede7a8e20f8bdbffa595b6bacf5363c822244023bff0059cbcf3228058ed3b2f44ff0ff00d8fe2a2cd8843868dddfe0ba1232bd1fffd0f47ce138b903f96cff00d14b3035697512e6e1e4b9bcb5ec3f77a4b25f6ec64b41707096b888feaeefeb297190226fbac90d53d2dfd357fd66fe5581f5306ffab78f6ffa6bb2ac3f3bed6ffdf16fd360dbeb76602ff9346efe0b0bea43a81f553a6562d61b3d27b9cddc2417db6d9ee6ff00693ef51e48ad1d7daa25aad3a8bbd236b6b75801000689264c7b63f7154bb3fa6e2388ea390dc42d1b8b2c7343e3e1b9db7fcc47dc88357a8570959c0012e21a240926049fa2dd7f39ca2caadb6c1556d2eb0f61e1fbdfd554faae77d5feb989574ec5ea58f5b597b6eb36cbdc03058d76d6c3f75dbdecfe73ff003057f01f878f48c5e9e4574970369dff00a57692e758efcdf70f4f657ecff44a19735c26b87caff82f1881fd241d7adc6e898345f936fe92eb85461a5ec6fb1f66d76cf7fe67f38a8e2f57c2cbd297b2d3dfd27027e753b6d89bfc63cfec4c4d207db047fdb57ae12ea2b1656002dde0193db58dcde108e69ea6d71c51d3f96cfa30b2971da1e03bf74e87ee7291afc42e031f3faad0e355192e7b582435e43db03c1b76ff00faa5b9d37eb15471d872aefb35e6779da452449dae6b9dea31bedfa6a61cc57cc298ce3ad41b7a12c4db16551f5afa73de6bb2c64b5c5bea1f635c01fe72bb3f4943d8efec2d5ab3312e6ee65836fef1fa3ff6e37757ff0049491cb03b15a6046e162c4db15caf16eb803556eb01e1cd12dff3fe8259b8df60c4b32b2ecaea65604b0b86ed486ff53ba71c911b940892d22c512c46a6ca6f687d4e0e044fcbfd7f7548b1112bd46a8a6a5954b0cc05dbff0087fec7f15c8bebf695d77f87fec7f1507307e5faafc7d5ffd1f48cc8fb3e4023702f6023c8fa4173b6dd5398e7388690d6b5ed1f48c1d8d7bc7eebdbf47fc22e96f00d57823702f6c8f956b9a65f8ecc96bacd8eab1f24fab00bb616fb2a73fdaef7eeb5eeaead9f4ff49ff0884a55036401afcdb286ed8bbf43d33a83cd936578d90ed83961f4deef7ff29bed62f1fc6686d1547b4ec6ea343c792f52eab7df7743eb192d1b6b38f93739cee4b3d3b5b453f9adf6eef7b7f7d79bb7a675214d6e18b6b9858d2d735bb810402d3ed4d8cb8e375e5fdd5f1001fa27e97d5ba8e2e6d25b9770a03836da4dae0db1aef69add2e5d3f5be8bd1466dc063ee2c6164bec703cfa4edfb7e0b8c6576d19549bd8ea01b1bfceb76cebdbd4ff00beaeb3aef55e9edcfc869ba1ce7386d0d7f67bb737e8fd26fee3958c15ad9af362cdbe9f83530fa66063e4efa6af4ad7904d8db5c1c27df3b67f3ffe9a3ddd2e8fb2bebadd6d0ef537bed63839e4967bdadddf419eeaff00eda43a32b15c69cf0e6973bd9ea473b3415bf6377fb7ddfce2b7eb535e3936bab0771d8d71da63f3bdee1f9beef7aaf9a5738915bf090243d538cf87f9712e80a89dfece85c1cbbb3eb7646364655b7d02c6dacaec2768243855e931c5eeaf632eb99feb5a587881f43ed7098d59060882d76e6ebf9ffbca39ccb33336f3881f94d66965950360dd0df6b4b377d09fce57715d6bad607d4fadadab639f631cc1a01ec68b87bacf77a9bda9b9ac465206a8d8f11fd56489d0346d65b438bdef697968dc1fc924496b00fdcf62b989d372733a3938f6561ce2eadb5d92d101f2f9b59ea7d269ff00469afb302eea6f392e6d95398ffb3d4c79647b41a9ff00bcc73acff04abd56e562746b3269cabb1edacc9ac387a73b9cd739d8f6b5f5b5db5adddf413b148d6a77089815f635db51a31df896b1a72697b584b758d9babb5ac70fcc723b76d0e7df896160aee68ac349daee5cfdc016bacff06c720d7bb2f0efea16da3d5616bed6edd5eeb1cf05ecf4ff00475b59e9ef562cc5c86b2e692dbdf8cea88731dba7d615ec631cedafb7dcff007ffa37b11bf05d5e2dfafeb5752aecb0e3b5b47a60970658f6b6c0d3fa4b76fb7d26d5b5ccf77adeabff00e296a63fd716de0e0750a1d4d991fa2de61a1ae746cdce86effccfd13aafd27efae73aae560e4e6babc2c77559557a8dca68ac0dc07b8fbaa2f6dde9fe9fd47aad4dbbf2b185cff4da2faeddc748dbb763bddedf7b595b5385710f021657a0f9176bea79753d7fecc1c763d990c2d07da4b3ded76cfa3fe0d7706b5c4f436b29fae9456c76e165b7378882faeedccfecd9ed5dfba9735bbdcd2d68e5ce1035d3e91536235123c4b1e4d483dc34df5fb4ae9bfc3ff63f8ac2bea3554eb6e1e956d12e7bfdad038f717c2ddff0ff00d8fe2866375f54406eff00ffd2effafe43717a466dce121ae60fa459ab8d2c6bb7321dedddf43fc27d05ccf4dead5750ea5e8edd973ad6dbeb12c21a2a66fb9eefcc63ecb1d5ff00995ffd6f5bebed2ebbeaaf51ad8d2e26dc63b5a24c36ec57ba07f55ab83e8df6ae91d55bd4ee2e6e374fc7731bbdaedbb8d6f6d6ecada3d8df7b6df536fe9ac50ceccc478b490a31f39246de4f57f59b36aa7eab755adb6bb2eebb1ec659611b43439b6105db46cf57f47b762e5adebb8982daf16c63df632aa816d6018fd1b1daeedbf9a8fd67eb132ee859f80fa0b2eb697bb7b4fb499b5df45c37ff00da859797d3acb7272b3a58ca6aa6b7b1f66e8712d66254c1b5befb1b92eab7d5ff0009ff00189d02784709b24d24817af65ba8e4e2752aaabcfab5b6b3686490c21c1b5bf7376977d16fd1da83d3317a58b458400d0d26d2f739d325c1ae735e5dbddea3bf756a61fd55ea399d0b707d74db8f7decc8fb5914ed69632bfb41f443dbe8fa81f5b7d2f5564b71a8aedc8aebb5b7d0cdb532c66f1b9c05791ea45a1bed7bdcff00d1fe8fd2fd1ff389fad6bbf88fd8b48ecef518781434d5535ac1c87f816805ccb2d76efa5f9e87761e1e48fb43839849683e999644435ad6eddbed86b3fc1ffdb8aab732dbba955631fb4b9c046e2d07786b7e97f34dbaaf4fdafb1069cacf18de960576dd45cd696dcc6170fd1b5f533d0dcd6edf59eff7fb944211123326ff00adf2fcdaaed6ab674ba753562e7e7e3d20868b01971f7173aba5dfa49f6ff9aaedbd431bd3706e431d6805a2b0483b9bf4d9b9f0dfa4b068afeb53726fbfec36586e87173c3185ce0d657f9d655b1bfa3fdc4cde9fd7c641b2fe9ed6545eeb1e5d7d5201f77d1163ff00cd4f33c4450c801f3e2fa70acd6de889a2c699b282f643b63cb438ceef1fa1f47daaadd9587874b9d6b3d3a48f51e5b51757fd670adaff00dcfdd58f974fd63ca22cab0ab630f3bb26a3301cd3b4b1edfdf45cf6f5fcbc5b71bf6606b2c6399ea0c9a5c46e047ef37f7908e5c62c7b9127c4851742ac2e9bd4182ea58d35d92e0e6b8d12013c56e357bb77e6fa691e854371edb83af6349630b8d9bbdc3f46c86bc3bdccdedd8f58f6d5d5fecf8b58e9b797d0f7be5a5ae0e0e059b5aeacd9f4bf3d5b197962afb4df836b1f4d226988b6196b2aafda19bb6bdfbfdffe8abdff00e0de9fc70274313e5f8a813dcadfb27a7d996ecbc4cb2cbc879b5cd7b6d686b87a71e9b5cc755bb73bf3d032fa4d8fc7dbf6e658d0297b5bb4ee2da07d9ea2df7bfe830ec59bf6ebda331a71ac61ca6398c0d6966c2435ad7436bfcdd899bfb4c32b7fd9322c63711f8af2e6d9b5ce717bbd7fe69df47d4478a1bd85711aa74faf62e70b733a9e35ada9d5eebd8e6b9cdb184175e1cc735bf49bfd6576bfaeedeabd233707aa9f4b3acc7b3d0c96c8aed781beb0e6ff00da5c9decf6ff0080b1ff00e8573873eea3a63309f8d2e7556546c738b480e3637e8babff008458ff00ac376ecd8e88dcd2e1ac76fa4d7212e1975f15d0991f93d7744bb3f23eae753fb6e45b66364d0ff45b6975bef07f4990c2fdf77d36ecf4dbfcefd35ed1ff006a3fb1fc5786bbaae133a354c64bad0d22d6346c35c1f4eb6ed739b57ba5f7535d165ffa3fd35bfa65ee5fe1ff00b1fc54788cc99990ab3e91fd55d33623adbfffd3ef7eb1582be9198e276fe92ad609d4be81c3571efe9d91982d0eaad7d791b3d4019e9348ac6d60f56e7d0fd9fe97dffa5f62ee7a89230f29c1db76b9a4bbc00f48bbc3f35713775dc8b08f4036a63b50f7439f1db7cfb772a9cc884642729481ae10200717a4f17cd25357eb6e16457f567a864dcda810c6b4416bac05f6555fb1cc6bb6eefcff00d2ab9f5846163f42c965f946f0c6d6e1562b6b639ae6babf49e373b63bd27ecfcefdcf62c5facf956ddd13305af75876d63dc74136d5f99f47fe8a5d7ac03a564bec21a2ad96003592d73432a6ff005bff0052218728e2c2220913c928fae72e9eda09d0af95d6312bfabd855556655cfcab999b78bb73da68aac34b9b36fe8bdb91fe069fd1fda3fe33df6306b8e934cb9963c59f6e70f49ae79bac78ca76bb86d7b6bf4ebd9fe8fd8b27231ea761b5ae73b66374ac72c22769b6e7fafab776d6faacad8c5bfea32b6b69008d2009681a7d2dbed4ee7320e181048e39132ff16193fe8e654646fc92bdad7faac7b5b6577eddec0d2c043437e8ec77b3d46b7f4bb7fcc50a2bc9634575d75866ae76d2f92f3abec15fd06faaff00d259b506ab2a6542ad5e691e9b9d20eac3e97e9086fd3f6a9fab4f76827c25d323b3be8aa52991703d0fe5e94db65b5641d453bfe6e80a36b2f611faa831c4bc8fc21527518373dce7d1597705e771307cd8e562b0da99b696068274680e2278fcf7fe726823cffc155accb08f73f15cc24c11be3fefaeff00aa526df4900bf1ec6fc5ed27f10a5b9c1c36bb6c760d09cbad8265cd8e48db03e28fd07d8ab28453d3838bc5160ddee32644fddb589df5e0905e197d646c01e1c6637fe6169fcdf52cff003d11c6d125d6068f19109edf5aa603610007b353db5e784f8137a02743d122d10fb308fd364d73c1dce9fc4d89a69690e667e403d89dc47cc3bd8acd60be9becf53dd40612d6ff002deda7ddb47e66f6b905cf693ac7c4871281d2891ba162fddb5cdce0e247b8bdadd403ecdbb0d7b79517d38d698b1f4d83b87b413ff82296e69e403f1684d0d3a866df0fefd12b535b23a4747b30b298fae98734381ac8aa4b776df53d0fe7d8ddff00ccaf50ff000ffd8fe2bcd5d2c6b9cd21848edcfdebd2bfc3ff0063f8abbcacee2627f47fee94ff00ffd4eefeb45eec7e83d46c60974b1804c7d334d5ff007f5e74db1dbe371dad0034797d105e577df5cde19f56fa8389db1651a9d39b31979c8c8adc0b86d20032ed6440f0dcb3f9ebe38f6e1fdaa575c31d1b2819322a0d275ff0d4fe72b1978d564b5f8f7b05b56fd44b9a0913b7df5fbbdaefccdc85f5830b2eae82722ca320b729cc6d01ac2f90c7b2f73eed87f57ab6b3f43edf7a7c4ea14e532b3bd94db6b779a5e65e0c9dd537d5d9eb3bfe2d33832470e3980470ca52b1fa3c5c1c32ff009a8457f496bfd8326ca00ad94fa4d0d7b0b2968653fbb63fe97b37bd1461f51637637abd9a68d3e8b0998fa3ed77bddaa317b24c9dc468660347f29db7faa9d9652618d73091a363e8e839734b77261cd9240032e21fd61197f57f4a3fbb14d35bd1eb6d68b0f51aac749019663344ff005deddaefa4958dfaca3dd5d986f6b4490d0e68fed6ef67b55d2e6869dc46ddb33238e3711fcaf7a7711b800e064e8d71691a8eec0d77d1fdd484e4752227ce31534abc9facc1d2fc4c5b0b752c6bdb5bb5fed1456f50eaad01cfe94e20ebedbab275f25618ea4b01915874183b5ae93c69b7e93d4cdb8ee710d21c0ba0edf23f9fb5a367d2fec25c43ac63ff003bfef914d7afa8e73e18fe99733b971b6a0d83e2ef62b14fab640763bea822373d8e9f2dd4bddfda4ff686ba4b6041120eb04cb5bba3f94126b83dbb9d6b5f5bbda035c0363f92424483d00f2e2526f4c377196bb8e47b4ed3b9a76bb6edf729d8f7e9b2d731f10030b4348f9b7f47f47f3100da1d264024e87c87d196bbf9281665e2566b0ec8ac3dd2e6d65c09740fa51fbbb528990f9490b812364fb5c2ac9a6abe3ed41a0b8343dcc2db1992d735f2d73fdf5fd1ff0044a2e3901c5a2c0d133b76be0796ef59db93639c9cf70a3a7d17643ccedb1d53eaac37fd259758daaaff00c137ad2c7fab9d5ae6d9f69b28c06cfe898d06f7f9bdfb1cca9bfbbb7d6b14bc19a75636ea400a367773c0b8377389249d000e1ff54e2856e553501eadbb6481f4bb91206c6ef7ae95bf56ba4066dc875d94e92775969673a1686637a5ed72bb45189880370e8ab1c34403531ad23fb63de9f1e54fe9480f2453c93703a9e654463e1e5091adb7edc6af513ff6a87aaffeab2a5e9dfe1ffb1fc57377da0871264c724ae93fc3ff0063f8ab58b1461757af753fffd5f48cc656e65955f4579555ae0ef49e3703b4363731cc7b3daf66e594f662b346fd5fa9c06a36b6affc82df7f6e3e69bfcd4d3c1fa55f553817660b8017740f540000de2a768386fb9aaad8de9af2d367d55a9e5bab4baaa0c7f5658ba9ff00353fdc9da29e6bed58f047fcdc10753ecabff2291cda3ff9dd1fe6d5ff00915d2fdc9fee4dfd5ff57f053cd0cda46a3eaec1f26d5ff91516e462098fab6d1220c329d473fbaba7fb92fb92fd5ff554f3232714191f57003e21957fe4549b99434437eaf40f00cabff22ba4fb92fb90fd5ff554f37f6bc788ff009bda1e46cabff2290cac61a0fabc20f3ecabff0022ba4efd92fb91f47f554f34ec8c576aefab81c78d6ba8ff00df541b6e03276fd5a636798aa913dff717509bee4470f4a53887af64b843ba45c40e012d297ed9b8ff00de35bff416e7dc9bee474538a3aadc7fef19ff00f4149b9f73bfef1dc3e26bfee5b3f7247e4968a731960b86db7a6b1ad3c87ed23f06396857bdcff50c06c40824f7f36b54bfcd4ede3b7c9253ffd9ffed3ac850686f746f73686f7020332e30003842494d04040000000000071c020000020000003842494d0425000000000010e8f15cf32fc118a1a27b67adc564d5ba3842494d03ea000000001db03c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d38223f3e0a3c21444f435459504520706c697374205055424c494320222d2f2f4170706c6520436f6d70757465722f2f44544420504c49535420312e302f2f454e222022687474703a2f2f7777772e6170706c652e636f6d2f445444732f50726f70657274794c6973742d312e302e647464223e0a3c706c6973742076657273696f6e3d22312e30223e0a3c646963743e0a093c6b65793e636f6d2e6170706c652e7072696e742e50616765466f726d61742e504d486f72697a6f6e74616c5265733c2f6b65793e0a093c646963743e0a09093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e63726561746f723c2f6b65793e0a09093c737472696e673e636f6d2e6170706c652e7072696e74696e676d616e616765723c2f737472696e673e0a09093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e6974656d41727261793c2f6b65793e0a09093c61727261793e0a0909093c646963743e0a090909093c6b65793e636f6d2e6170706c652e7072696e742e50616765466f726d61742e504d486f72697a6f6e74616c5265733c2f6b65793e0a090909093c7265616c3e37323c2f7265616c3e0a090909093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e636c69656e743c2f6b65793e0a090909093c737472696e673e636f6d2e6170706c652e7072696e74696e676d616e616765723c2f737472696e673e0a090909093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e6d6f64446174653c2f6b65793e0a090909093c646174653e323030382d30352d33305431343a31333a32335a3c2f646174653e0a090909093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e7374617465466c61673c2f6b65793e0a090909093c696e74656765723e303c2f696e74656765723e0a0909093c2f646963743e0a09093c2f61727261793e0a093c2f646963743e0a093c6b65793e636f6d2e6170706c652e7072696e742e50616765466f726d61742e504d4f7269656e746174696f6e3c2f6b65793e0a093c646963743e0a09093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e63726561746f723c2f6b65793e0a09093c737472696e673e636f6d2e6170706c652e7072696e74696e676d616e616765723c2f737472696e673e0a09093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e6974656d41727261793c2f6b65793e0a09093c61727261793e0a0909093c646963743e0a090909093c6b65793e636f6d2e6170706c652e7072696e742e50616765466f726d61742e504d4f7269656e746174696f6e3c2f6b65793e0a090909093c696e74656765723e313c2f696e74656765723e0a090909093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e636c69656e743c2f6b65793e0a090909093c737472696e673e636f6d2e6170706c652e7072696e74696e676d616e616765723c2f737472696e673e0a090909093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e6d6f64446174653c2f6b65793e0a090909093c646174653e323030382d30352d33305431343a31333a32335a3c2f646174653e0a090909093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e7374617465466c61673c2f6b65793e0a090909093c696e74656765723e303c2f696e74656765723e0a0909093c2f646963743e0a09093c2f61727261793e0a093c2f646963743e0a093c6b65793e636f6d2e6170706c652e7072696e742e50616765466f726d61742e504d5363616c696e673c2f6b65793e0a093c646963743e0a09093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e63726561746f723c2f6b65793e0a09093c737472696e673e636f6d2e6170706c652e7072696e74696e676d616e616765723c2f737472696e673e0a09093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e6974656d41727261793c2f6b65793e0a09093c61727261793e0a0909093c646963743e0a090909093c6b65793e636f6d2e6170706c652e7072696e742e50616765466f726d61742e504d5363616c696e673c2f6b65793e0a090909093c7265616c3e313c2f7265616c3e0a090909093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e636c69656e743c2f6b65793e0a090909093c737472696e673e636f6d2e6170706c652e7072696e74696e676d616e616765723c2f737472696e673e0a090909093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e6d6f64446174653c2f6b65793e0a090909093c646174653e323030382d30352d33305431343a31333a32335a3c2f646174653e0a090909093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e7374617465466c61673c2f6b65793e0a090909093c696e74656765723e303c2f696e74656765723e0a0909093c2f646963743e0a09093c2f61727261793e0a093c2f646963743e0a093c6b65793e636f6d2e6170706c652e7072696e742e50616765466f726d61742e504d566572746963616c5265733c2f6b65793e0a093c646963743e0a09093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e63726561746f723c2f6b65793e0a09093c737472696e673e636f6d2e6170706c652e7072696e74696e676d616e616765723c2f737472696e673e0a09093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e6974656d41727261793c2f6b65793e0a09093c61727261793e0a0909093c646963743e0a090909093c6b65793e636f6d2e6170706c652e7072696e742e50616765466f726d61742e504d566572746963616c5265733c2f6b65793e0a090909093c7265616c3e37323c2f7265616c3e0a090909093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e636c69656e743c2f6b65793e0a090909093c737472696e673e636f6d2e6170706c652e7072696e74696e676d616e616765723c2f737472696e673e0a090909093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e6d6f64446174653c2f6b65793e0a090909093c646174653e323030382d30352d33305431343a31333a32335a3c2f646174653e0a090909093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e7374617465466c61673c2f6b65793e0a090909093c696e74656765723e303c2f696e74656765723e0a0909093c2f646963743e0a09093c2f61727261793e0a093c2f646963743e0a093c6b65793e636f6d2e6170706c652e7072696e742e50616765466f726d61742e504d566572746963616c5363616c696e673c2f6b65793e0a093c646963743e0a09093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e63726561746f723c2f6b65793e0a09093c737472696e673e636f6d2e6170706c652e7072696e74696e676d616e616765723c2f737472696e673e0a09093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e6974656d41727261793c2f6b65793e0a09093c61727261793e0a0909093c646963743e0a090909093c6b65793e636f6d2e6170706c652e7072696e742e50616765466f726d61742e504d566572746963616c5363616c696e673c2f6b65793e0a090909093c7265616c3e313c2f7265616c3e0a090909093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e636c69656e743c2f6b65793e0a090909093c737472696e673e636f6d2e6170706c652e7072696e74696e676d616e616765723c2f737472696e673e0a090909093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e6d6f64446174653c2f6b65793e0a090909093c646174653e323030382d30352d33305431343a31333a32335a3c2f646174653e0a090909093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e7374617465466c61673c2f6b65793e0a090909093c696e74656765723e303c2f696e74656765723e0a0909093c2f646963743e0a09093c2f61727261793e0a093c2f646963743e0a093c6b65793e636f6d2e6170706c652e7072696e742e7375625469636b65742e70617065725f696e666f5f7469636b65743c2f6b65793e0a093c646963743e0a09093c6b65793e636f6d2e6170706c652e7072696e742e50616765466f726d61742e504d41646a757374656450616765526563743c2f6b65793e0a09093c646963743e0a0909093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e63726561746f723c2f6b65793e0a0909093c737472696e673e636f6d2e6170706c652e7072696e74696e676d616e616765723c2f737472696e673e0a0909093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e6974656d41727261793c2f6b65793e0a0909093c61727261793e0a090909093c646963743e0a09090909093c6b65793e636f6d2e6170706c652e7072696e742e50616765466f726d61742e504d41646a757374656450616765526563743c2f6b65793e0a09090909093c61727261793e0a0909090909093c7265616c3e302e303c2f7265616c3e0a0909090909093c7265616c3e302e303c2f7265616c3e0a0909090909093c7265616c3e3733343c2f7265616c3e0a0909090909093c7265616c3e3537363c2f7265616c3e0a09090909093c2f61727261793e0a09090909093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e636c69656e743c2f6b65793e0a09090909093c737472696e673e636f6d2e6170706c652e7072696e74696e676d616e616765723c2f737472696e673e0a09090909093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e6d6f64446174653c2f6b65793e0a09090909093c646174653e323030392d30352d32365432303a33353a32395a3c2f646174653e0a09090909093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e7374617465466c61673c2f6b65793e0a09090909093c696e74656765723e303c2f696e74656765723e0a090909093c2f646963743e0a0909093c2f61727261793e0a09093c2f646963743e0a09093c6b65793e636f6d2e6170706c652e7072696e742e50616765466f726d61742e504d41646a75737465645061706572526563743c2f6b65793e0a09093c646963743e0a0909093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e63726561746f723c2f6b65793e0a0909093c737472696e673e636f6d2e6170706c652e7072696e74696e676d616e616765723c2f737472696e673e0a0909093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e6974656d41727261793c2f6b65793e0a0909093c61727261793e0a090909093c646963743e0a09090909093c6b65793e636f6d2e6170706c652e7072696e742e50616765466f726d61742e504d41646a75737465645061706572526563743c2f6b65793e0a09090909093c61727261793e0a0909090909093c7265616c3e2d31383c2f7265616c3e0a0909090909093c7265616c3e2d31383c2f7265616c3e0a0909090909093c7265616c3e3737343c2f7265616c3e0a0909090909093c7265616c3e3539343c2f7265616c3e0a09090909093c2f61727261793e0a09090909093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e636c69656e743c2f6b65793e0a09090909093c737472696e673e636f6d2e6170706c652e7072696e74696e676d616e616765723c2f737472696e673e0a09090909093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e6d6f64446174653c2f6b65793e0a09090909093c646174653e323030392d30352d32365432303a33353a32395a3c2f646174653e0a09090909093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e7374617465466c61673c2f6b65793e0a09090909093c696e74656765723e303c2f696e74656765723e0a090909093c2f646963743e0a0909093c2f61727261793e0a09093c2f646963743e0a09093c6b65793e636f6d2e6170706c652e7072696e742e5061706572496e666f2e504d50617065724e616d653c2f6b65793e0a09093c646963743e0a0909093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e63726561746f723c2f6b65793e0a0909093c737472696e673e636f6d2e6170706c652e7072696e742e706d2e506f73745363726970743c2f737472696e673e0a0909093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e6974656d41727261793c2f6b65793e0a0909093c61727261793e0a090909093c646963743e0a09090909093c6b65793e636f6d2e6170706c652e7072696e742e5061706572496e666f2e504d50617065724e616d653c2f6b65793e0a09090909093c737472696e673e6e612d6c65747465723c2f737472696e673e0a09090909093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e636c69656e743c2f6b65793e0a09090909093c737472696e673e636f6d2e6170706c652e7072696e742e706d2e506f73745363726970743c2f737472696e673e0a09090909093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e6d6f64446174653c2f6b65793e0a09090909093c646174653e323030332d30372d30315431373a34393a33365a3c2f646174653e0a09090909093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e7374617465466c61673c2f6b65793e0a09090909093c696e74656765723e313c2f696e74656765723e0a090909093c2f646963743e0a0909093c2f61727261793e0a09093c2f646963743e0a09093c6b65793e636f6d2e6170706c652e7072696e742e5061706572496e666f2e504d556e61646a757374656450616765526563743c2f6b65793e0a09093c646963743e0a0909093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e63726561746f723c2f6b65793e0a0909093c737472696e673e636f6d2e6170706c652e7072696e742e706d2e506f73745363726970743c2f737472696e673e0a0909093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e6974656d41727261793c2f6b65793e0a0909093c61727261793e0a090909093c646963743e0a09090909093c6b65793e636f6d2e6170706c652e7072696e742e5061706572496e666f2e504d556e61646a757374656450616765526563743c2f6b65793e0a09090909093c61727261793e0a0909090909093c7265616c3e302e303c2f7265616c3e0a0909090909093c7265616c3e302e303c2f7265616c3e0a0909090909093c7265616c3e3733343c2f7265616c3e0a0909090909093c7265616c3e3537363c2f7265616c3e0a09090909093c2f61727261793e0a09090909093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e636c69656e743c2f6b65793e0a09090909093c737472696e673e636f6d2e6170706c652e7072696e74696e676d616e616765723c2f737472696e673e0a09090909093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e6d6f64446174653c2f6b65793e0a09090909093c646174653e323030382d30352d33305431343a31333a32335a3c2f646174653e0a09090909093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e7374617465466c61673c2f6b65793e0a09090909093c696e74656765723e303c2f696e74656765723e0a090909093c2f646963743e0a0909093c2f61727261793e0a09093c2f646963743e0a09093c6b65793e636f6d2e6170706c652e7072696e742e5061706572496e666f2e504d556e61646a75737465645061706572526563743c2f6b65793e0a09093c646963743e0a0909093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e63726561746f723c2f6b65793e0a0909093c737472696e673e636f6d2e6170706c652e7072696e742e706d2e506f73745363726970743c2f737472696e673e0a0909093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e6974656d41727261793c2f6b65793e0a0909093c61727261793e0a090909093c646963743e0a09090909093c6b65793e636f6d2e6170706c652e7072696e742e5061706572496e666f2e504d556e61646a75737465645061706572526563743c2f6b65793e0a09090909093c61727261793e0a0909090909093c7265616c3e2d31383c2f7265616c3e0a0909090909093c7265616c3e2d31383c2f7265616c3e0a0909090909093c7265616c3e3737343c2f7265616c3e0a0909090909093c7265616c3e3539343c2f7265616c3e0a09090909093c2f61727261793e0a09090909093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e636c69656e743c2f6b65793e0a09090909093c737472696e673e636f6d2e6170706c652e7072696e74696e676d616e616765723c2f737472696e673e0a09090909093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e6d6f64446174653c2f6b65793e0a09090909093c646174653e323030382d30352d33305431343a31333a32335a3c2f646174653e0a09090909093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e7374617465466c61673c2f6b65793e0a09090909093c696e74656765723e303c2f696e74656765723e0a090909093c2f646963743e0a0909093c2f61727261793e0a09093c2f646963743e0a09093c6b65793e636f6d2e6170706c652e7072696e742e5061706572496e666f2e7070642e504d50617065724e616d653c2f6b65793e0a09093c646963743e0a0909093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e63726561746f723c2f6b65793e0a0909093c737472696e673e636f6d2e6170706c652e7072696e742e706d2e506f73745363726970743c2f737472696e673e0a0909093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e6974656d41727261793c2f6b65793e0a0909093c61727261793e0a090909093c646963743e0a09090909093c6b65793e636f6d2e6170706c652e7072696e742e5061706572496e666f2e7070642e504d50617065724e616d653c2f6b65793e0a09090909093c737472696e673e5553204c65747465723c2f737472696e673e0a09090909093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e636c69656e743c2f6b65793e0a09090909093c737472696e673e636f6d2e6170706c652e7072696e742e706d2e506f73745363726970743c2f737472696e673e0a09090909093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e6d6f64446174653c2f6b65793e0a09090909093c646174653e323030332d30372d30315431373a34393a33365a3c2f646174653e0a09090909093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e7374617465466c61673c2f6b65793e0a09090909093c696e74656765723e313c2f696e74656765723e0a090909093c2f646963743e0a0909093c2f61727261793e0a09093c2f646963743e0a09093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e41504956657273696f6e3c2f6b65793e0a09093c737472696e673e30302e32303c2f737472696e673e0a09093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e707269766174654c6f636b3c2f6b65793e0a09093c66616c73652f3e0a09093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e747970653c2f6b65793e0a09093c737472696e673e636f6d2e6170706c652e7072696e742e5061706572496e666f5469636b65743c2f737472696e673e0a093c2f646963743e0a093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e41504956657273696f6e3c2f6b65793e0a093c737472696e673e30302e32303c2f737472696e673e0a093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e707269766174654c6f636b3c2f6b65793e0a093c66616c73652f3e0a093c6b65793e636f6d2e6170706c652e7072696e742e7469636b65742e747970653c2f6b65793e0a093c737472696e673e636f6d2e6170706c652e7072696e742e50616765466f726d61745469636b65743c2f737472696e673e0a3c2f646963743e0a3c2f706c6973743e0a3842494d03ed000000000010004800000001000100480000000100013842494d042600000000000e000000000000000000003f8000003842494d040d000000000004000000783842494d04190000000000040000001e3842494d03f3000000000009000000000000000001003842494d040a00000000000100003842494d271000000000000a000100000000000000013842494d03f5000000000048002f66660001006c66660006000000000001002f6666000100a1999a0006000000000001003200000001005a00000006000000000001003500000001002d000000060000000000013842494d03f80000000000700000ffffffffffffffffffffffffffffffffffffffffffff03e800000000ffffffffffffffffffffffffffffffffffffffffffff03e800000000ffffffffffffffffffffffffffffffffffffffffffff03e800000000ffffffffffffffffffffffffffffffffffffffffffff03e800003842494d040800000000003800000001000002400000024000000008000000e00100001780010000009d00000024a00000000157000000019e01000023a0000000169c013842494d041e000000000004000000003842494d041a00000000035b000000060000000000000000000000c80000012c00000013004200750069006c00640069006e00670073002d004f00740068006d0065007200330030003000000001000000000000000000000000000000000000000100000000000000000000012c000000c800000000000000000000000000000000010000000000000000000000000000000000000010000000010000000000006e756c6c0000000200000006626f756e64734f626a6300000001000000000000526374310000000400000000546f70206c6f6e6700000000000000004c6566746c6f6e67000000000000000042746f6d6c6f6e67000000c800000000526768746c6f6e670000012c00000006736c69636573566c4c73000000014f626a6300000001000000000005736c6963650000001200000007736c69636549446c6f6e67000000000000000767726f757049446c6f6e6700000000000000066f726967696e656e756d0000000c45536c6963654f726967696e0000000d6175746f47656e6572617465640000000054797065656e756d0000000a45536c6963655479706500000000496d672000000006626f756e64734f626a6300000001000000000000526374310000000400000000546f70206c6f6e6700000000000000004c6566746c6f6e67000000000000000042746f6d6c6f6e67000000c800000000526768746c6f6e670000012c0000000375726c54455854000000010000000000006e756c6c54455854000000010000000000004d7367655445585400000001000000000006616c74546167544558540000000100000000000e63656c6c54657874497348544d4c626f6f6c010000000863656c6c546578745445585400000001000000000009686f727a416c69676e656e756d0000000f45536c696365486f727a416c69676e0000000764656661756c740000000976657274416c69676e656e756d0000000f45536c69636556657274416c69676e0000000764656661756c740000000b6267436f6c6f7254797065656e756d0000001145536c6963654247436f6c6f7254797065000000004e6f6e6500000009746f704f75747365746c6f6e67000000000000000a6c6566744f75747365746c6f6e67000000000000000c626f74746f6d4f75747365746c6f6e67000000000000000b72696768744f75747365746c6f6e6700000000003842494d042800000000000c000000013ff00000000000003842494d04140000000000040000000f3842494d040c00000000170500000001000000a00000006b000001e00000c8a0000016e900180001ffd8ffe000104a46494600010200004800480000ffed000c41646f62655f434d0001ffee000e41646f626500648000000001ffdb0084000c08080809080c09090c110b0a0b11150f0c0c0f1518131315131318110c0c0c0c0c0c110c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c010d0b0b0d0e0d100e0e10140e0e0e14140e0e0e0e14110c0c0c0c0c11110c0c0c0c0c0c110c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0cffc0001108006b00a003012200021101031101ffdd0004000affc4013f0000010501010101010100000000000000030001020405060708090a0b0100010501010101010100000000000000010002030405060708090a0b1000010401030204020507060805030c33010002110304211231054151611322718132061491a1b14223241552c16233347282d14307259253f0e1f163733516a2b283264493546445c2a3743617d255e265f2b384c3d375e3f3462794a485b495c4d4e4f4a5b5c5d5e5f55666768696a6b6c6d6e6f637475767778797a7b7c7d7e7f711000202010204040304050607070605350100021103213112044151617122130532819114a1b14223c152d1f0332462e1728292435315637334f1250616a2b283072635c2d2449354a317644555367465e2f2b384c3d375e3f34694a485b495c4d4e4f4a5b5c5d5e5f55666768696a6b6c6d6e6f62737475767778797a7b7c7ffda000c03010002110311003f00f4e7da59bdcfb19556c206e78d350d3abb7b3f790c665278cba3ef1ffa550baa37760e48ff0084aff2d2b1db580a486312164f55b295177bed757fdcaa3f0ffd2aa15f51c4b4d82acdc6b0d4f355a1ae69db637e9d5645becb19fb8b1db587380f1207deb17eacb43b17a8de3fed4754cdb3fe9b59ff007c4ef6858168e2f07b5fb653ff0072a8fc3ff4aa6fb653ff0072e8fbc7fe955825aa25a8fb23b9571f83d07db68ffb9747de3ff4aa5f6ea3fee5e3fde3ff004aae74b144b11f623dcab8cf67a3fb763ffdccc7fbc7fe954bedf8dff7331fef1ffa5573458140b3c91fbbc7b94719ecf51fb4317fee6e3fde3ff4aa6fda18bff7371bef1ffa5572c58a25897dde3fbc55ee1ecf57fb4717fee6e37f9c3ff4aa5fb4713fee6e37f9cdff00d2ab932c512c47eed1fde2af70f67aefda589ff73b1bfce6ff00e954bf6961ff00dcec6ff39bff00a55723b144b12fbb47f78a3dc3d9ebff0069e1ff00dcec6ff39bff00a552fda985ff0073f17fce6ffe955c79afc944d611fbb47f78abdd3d9ec0f57e9ede7a8e20f8bdbffa595b6bacf5363c822244023bff0059cbcf3228058ed3b2f44ff0ff00d8fe2a2cd8843868dddfe0ba1232bd1fffd0f47ce138b903f96cff00d14b3035697512e6e1e4b9bcb5ec3f77a4b25f6ec64b41707096b888feaeefeb297190226fbac90d53d2dfd357fd66fe5581f5306ffab78f6ffa6bb2ac3f3bed6ffdf16fd360dbeb76602ff9346efe0b0bea43a81f553a6562d61b3d27b9cddc2417db6d9ee6ff00693ef51e48ad1d7daa25aad3a8bbd236b6b75801000689264c7b63f7154bb3fa6e2388ea390dc42d1b8b2c7343e3e1b9db7fcc47dc88357a8570959c0012e21a240926049fa2dd7f39ca2caadb6c1556d2eb0f61e1fbdfd554faae77d5feb989574ec5ea58f5b597b6eb36cbdc03058d76d6c3f75dbdecfe73ff003057f01f878f48c5e9e4574970369dff00a57692e758efcdf70f4f657ecff44a19735c26b87caff82f1881fd241d7adc6e898345f936fe92eb85461a5ec6fb1f66d76cf7fe67f38a8e2f57c2cbd297b2d3dfd27027e753b6d89bfc63cfec4c4d207db047fdb57ae12ea2b1656002dde0193db58dcde108e69ea6d71c51d3f96cfa30b2971da1e03bf74e87ee7291afc42e031f3faad0e355192e7b582435e43db03c1b76ff00faa5b9d37eb15471d872aefb35e6779da452449dae6b9dea31bedfa6a61cc57cc298ce3ad41b7a12c4db16551f5afa73de6bb2c64b5c5bea1f635c01fe72bb3f4943d8efec2d5ab3312e6ee65836fef1fa3ff6e37757ff0049491cb03b15a6046e162c4db15caf16eb803556eb01e1cd12dff3fe8259b8df60c4b32b2ecaea65604b0b86ed486ff53ba71c911b940892d22c512c46a6ca6f687d4e0e044fcbfd7f7548b1112bd46a8a6a5954b0cc05dbff0087fec7f15c8bebf695d77f87fec7f1507307e5faafc7d5ffd1f48cc8fb3e4023702f6023c8fa4173b6dd5398e7388690d6b5ed1f48c1d8d7bc7eebdbf47fc22e96f00d57823702f6c8f956b9a65f8ecc96bacd8eab1f24fab00bb616fb2a73fdaef7eeb5eeaead9f4ff49ff0884a55036401afcdb286ed8bbf43d33a83cd936578d90ed83961f4deef7ff29bed62f1fc6686d1547b4ec6ea343c792f52eab7df7743eb192d1b6b38f93739cee4b3d3b5b453f9adf6eef7b7f7d79bb7a675214d6e18b6b9858d2d735bb810402d3ed4d8cb8e375e5fdd5f1001fa27e97d5ba8e2e6d25b9770a03836da4dae0db1aef69add2e5d3f5be8bd1466dc063ee2c6164bec703cfa4edfb7e0b8c6576d19549bd8ea01b1bfceb76cebdbd4ff00beaeb3aef55e9edcfc869ba1ce7386d0d7f67bb737e8fd26fee3958c15ad9af362cdbe9f83530fa66063e4efa6af4ad7904d8db5c1c27df3b67f3ffe9a3ddd2e8fb2bebadd6d0ef537bed63839e4967bdadddf419eeaff00eda43a32b15c69cf0e6973bd9ea473b3415bf6377fb7ddfce2b7eb535e3936bab0771d8d71da63f3bdee1f9beef7aaf9a5738915bf090243d538cf87f9712e80a89dfece85c1cbbb3eb7646364655b7d02c6dacaec2768243855e931c5eeaf632eb99feb5a587881f43ed7098d59060882d76e6ebf9ffbca39ccb33336f3881f94d66965950360dd0df6b4b377d09fce57715d6bad607d4fadadab639f631cc1a01ec68b87bacf77a9bda9b9ac465206a8d8f11fd56489d0346d65b438bdef697968dc1fc924496b00fdcf62b989d372733a3938f6561ce2eadb5d92d101f2f9b59ea7d269ff00469afb302eea6f392e6d95398ffb3d4c79647b41a9ff00bcc73acff04abd56e562746b3269cabb1edacc9ac387a73b9cd739d8f6b5f5b5db5adddf413b148d6a77089815f635db51a31df896b1a72697b584b758d9babb5ac70fcc723b76d0e7df896160aee68ac349daee5cfdc016bacff06c720d7bb2f0efea16da3d5616bed6edd5eeb1cf05ecf4ff00475b59e9ef562cc5c86b2e692dbdf8cea88731dba7d615ec631cedafb7dcff007ffa37b11bf05d5e2dfafeb5752aecb0e3b5b47a60970658f6b6c0d3fa4b76fb7d26d5b5ccf77adeabff00e296a63fd716de0e0750a1d4d991fa2de61a1ae746cdce86effccfd13aafd27efae73aae560e4e6babc2c77559557a8dca68ac0dc07b8fbaa2f6dde9fe9fd47aad4dbbf2b185cff4da2faeddc748dbb763bddedf7b595b5385710f021657a0f9176bea79753d7fecc1c763d990c2d07da4b3ded76cfa3fe0d7706b5c4f436b29fae9456c76e165b7378882faeedccfecd9ed5dfba9735bbdcd2d68e5ce1035d3e91536235123c4b1e4d483dc34df5fb4ae9bfc3ff63f8ac2bea3554eb6e1e956d12e7bfdad038f717c2ddff0ff00d8fe2866375f54406eff00ffd2effafe43717a466dce121ae60fa459ab8d2c6bb7321dedddf43fc27d05ccf4dead5750ea5e8edd973ad6dbeb12c21a2a66fb9eefcc63ecb1d5ff00995ffd6f5bebed2ebbeaaf51ad8d2e26dc63b5a24c36ec57ba07f55ab83e8df6ae91d55bd4ee2e6e374fc7731bbdaedbb8d6f6d6ecada3d8df7b6df536fe9ac50ceccc478b490a31f39246de4f57f59b36aa7eab755adb6bb2eebb1ec659611b43439b6105db46cf57f47b762e5adebb8982daf16c63df632aa816d6018fd1b1daeedbf9a8fd67eb132ee859f80fa0b2eb697bb7b4fb499b5df45c37ff00da859797d3acb7272b3a58ca6aa6b7b1f66e8712d66254c1b5befb1b92eab7d5ff0009ff00189d02784709b24d24817af65ba8e4e2752aaabcfab5b6b3686490c21c1b5bf7376977d16fd1da83d3317a58b458400d0d26d2f739d325c1ae735e5dbddea3bf756a61fd55ea399d0b707d74db8f7decc8fb5914ed69632bfb41f443dbe8fa81f5b7d2f5564b71a8aedc8aebb5b7d0cdb532c66f1b9c05791ea45a1bed7bdcff00d1fe8fd2fd1ff389fad6bbf88fd8b48ecef518781434d5535ac1c87f816805ccb2d76efa5f9e87761e1e48fb43839849683e999644435ad6eddbed86b3fc1ffdb8aab732dbba955631fb4b9c046e2d07786b7e97f34dbaaf4fdafb1069cacf18de960576dd45cd696dcc6170fd1b5f533d0dcd6edf59eff7fb944211123326ff00adf2fcdaaed6ab674ba753562e7e7e3d20868b01971f7173aba5dfa49f6ff9aaedbd431bd3706e431d6805a2b0483b9bf4d9b9f0dfa4b068afeb53726fbfec36586e87173c3185ce0d657f9d655b1bfa3fdc4cde9fd7c641b2fe9ed6545eeb1e5d7d5201f77d1163ff00cd4f33c4450c801f3e2fa70acd6de889a2c699b282f643b63cb438ceef1fa1f47daaadd9587874b9d6b3d3a48f51e5b51757fd670adaff00dcfdd58f974fd63ca22cab0ab630f3bb26a3301cd3b4b1edfdf45cf6f5fcbc5b71bf6606b2c6399ea0c9a5c46e047ef37f7908e5c62c7b9127c4851742ac2e9bd4182ea58d35d92e0e6b8d12013c56e357bb77e6fa691e854371edb83af6349630b8d9bbdc3f46c86bc3bdccdedd8f58f6d5d5fecf8b58e9b797d0f7be5a5ae0e0e059b5aeacd9f4bf3d5b197962afb4df836b1f4d226988b6196b2aafda19bb6bdfbfdffe8abdff00e0de9fc70274313e5f8a813dcadfb27a7d996ecbc4cb2cbc879b5cd7b6d686b87a71e9b5cc755bb73bf3d032fa4d8fc7dbf6e658d0297b5bb4ee2da07d9ea2df7bfe830ec59bf6ebda331a71ac61ca6398c0d6966c2435ad7436bfcdd899bfb4c32b7fd9322c63711f8af2e6d9b5ce717bbd7fe69df47d4478a1bd85711aa74faf62e70b733a9e35ada9d5eebd8e6b9cdb184175e1cc735bf49bfd6576bfaeedeabd233707aa9f4b3acc7b3d0c96c8aed781beb0e6ff00da5c9decf6ff0080b1ff00e8573873eea3a63309f8d2e7556546c738b480e3637e8babff008458ff00ac376ecd8e88dcd2e1ac76fa4d7212e1975f15d0991f93d7744bb3f23eae753fb6e45b66364d0ff45b6975bef07f4990c2fdf77d36ecf4dbfcefd35ed1ff006a3fb1fc5786bbaae133a354c64bad0d22d6346c35c1f4eb6ed739b57ba5f7535d165ffa3fd35bfa65ee5fe1ff00b1fc54788cc99990ab3e91fd55d33623adbfffd3ef7eb1582be9198e276fe92ad609d4be81c3571efe9d91982d0eaad7d791b3d4019e9348ac6d60f56e7d0fd9fe97dffa5f62ee7a89230f29c1db76b9a4bbc00f48bbc3f35713775dc8b08f4036a63b50f7439f1db7cfb772a9cc884642729481ae10200717a4f17cd25357eb6e16457f567a864dcda810c6b4416bac05f6555fb1cc6bb6eefcff00d2ab9f5846163f42c965f946f0c6d6e1562b6b639ae6babf49e373b63bd27ecfcefdcf62c5facf956ddd13305af75876d63dc74136d5f99f47fe8a5d7ac03a564bec21a2ad96003592d73432a6ff005bff0052218728e2c2220913c928fae72e9eda09d0af95d6312bfabd855556655cfcab999b78bb73da68aac34b9b36fe8bdb91fe069fd1fda3fe33df6306b8e934cb9963c59f6e70f49ae79bac78ca76bb86d7b6bf4ebd9fe8fd8b27231ea761b5ae73b66374ac72c22769b6e7fafab776d6faacad8c5bfea32b6b69008d2009681a7d2dbed4ee7320e181048e39132ff16193fe8e654646fc92bdad7faac7b5b6577eddec0d2c043437e8ec77b3d46b7f4bb7fcc50a2bc9634575d75866ae76d2f92f3abec15fd06faaff00d259b506ab2a6542ad5e691e9b9d20eac3e97e9086fd3f6a9fab4f76827c25d323b3be8aa52991703d0fe5e94db65b5641d453bfe6e80a36b2f611faa831c4bc8fc21527518373dce7d1597705e771307cd8e562b0da99b696068274680e2278fcf7fe726823cffc155accb08f73f15cc24c11be3fefaeff00aa526df4900bf1ec6fc5ed27f10a5b9c1c36bb6c760d09cbad8265cd8e48db03e28fd07d8ab28453d3838bc5160ddee32644fddb589df5e0905e197d646c01e1c6637fe6169fcdf52cff003d11c6d125d6068f19109edf5aa603610007b353db5e784f8137a02743d122d10fb308fd364d73c1dce9fc4d89a69690e667e403d89dc47cc3bd8acd60be9becf53dd40612d6ff002deda7ddb47e66f6b905cf693ac7c4871281d2891ba162fddb5cdce0e247b8bdadd403ecdbb0d7b79517d38d698b1f4d83b87b413ff82296e69e403f1684d0d3a866df0fefd12b535b23a4747b30b298fae98734381ac8aa4b776df53d0fe7d8ddff00ccaf50ff000ffd8fe2bcd5d2c6b9cd21848edcfdebd2bfc3ff0063f8abbcacee2627f47fee94ff00ffd4eefeb45eec7e83d46c60974b1804c7d334d5ff007f5e74db1dbe371dad0034797d105e577df5cde19f56fa8389db1651a9d39b31979c8c8adc0b86d20032ed6440f0dcb3f9ebe38f6e1fdaa575c31d1b2819322a0d275ff0d4fe72b1978d564b5f8f7b05b56fd44b9a0913b7df5fbbdaefccdc85f5830b2eae82722ca320b729cc6d01ac2f90c7b2f73eed87f57ab6b3f43edf7a7c4ea14e532b3bd94db6b779a5e65e0c9dd537d5d9eb3bfe2d33832470e3980470ca52b1fa3c5c1c32ff009a8457f496bfd8326ca00ad94fa4d0d7b0b2968653fbb63fe97b37bd1461f51637637abd9a68d3e8b0998fa3ed77bddaa317b24c9dc468660347f29db7faa9d9652618d73091a363e8e839734b77261cd9240032e21fd61197f57f4a3fbb14d35bd1eb6d68b0f51aac749019663344ff005deddaefa4958dfaca3dd5d986f6b4490d0e68fed6ef67b55d2e6869dc46ddb33238e3711fcaf7a7711b800e064e8d71691a8eec0d77d1fdd484e4752227ce31534abc9facc1d2fc4c5b0b752c6bdb5bb5fed1456f50eaad01cfe94e20ebedbab275f25618ea4b01915874183b5ae93c69b7e93d4cdb8ee710d21c0ba0edf23f9fb5a367d2fec25c43ac63ff003bfef914d7afa8e73e18fe99733b971b6a0d83e2ef62b14fab640763bea822373d8e9f2dd4bddfda4ff686ba4b6041120eb04cb5bba3f94126b83dbb9d6b5f5bbda035c0363f92424483d00f2e2526f4c377196bb8e47b4ed3b9a76bb6edf729d8f7e9b2d731f10030b4348f9b7f47f47f3100da1d264024e87c87d196bbf9281665e2566b0ec8ac3dd2e6d65c09740fa51fbbb528990f9490b812364fb5c2ac9a6abe3ed41a0b8343dcc2db1992d735f2d73fdf5fd1ff0044a2e3901c5a2c0d133b76be0796ef59db93639c9cf70a3a7d17643ccedb1d53eaac37fd259758daaaff00c137ad2c7fab9d5ae6d9f69b28c06cfe898d06f7f9bdfb1cca9bfbbb7d6b14bc19a75636ea400a367773c0b8377389249d000e1ff54e2856e553501eadbb6481f4bb91206c6ef7ae95bf56ba4066dc875d94e92775969673a1686637a5ed72bb45189880370e8ab1c34403531ad23fb63de9f1e54fe9480f2453c93703a9e654463e1e5091adb7edc6af513ff6a87aaffeab2a5e9dfe1ffb1fc57377da0871264c724ae93fc3ff0063f8ab58b1461757af753fffd5f48cc656e65955f4579555ae0ef49e3703b4363731cc7b3daf66e594f662b346fd5fa9c06a36b6affc82df7f6e3e69bfcd4d3c1fa55f553817660b8017740f540000de2a768386fb9aaad8de9af2d367d55a9e5bab4baaa0c7f5658ba9ff00353fdc9da29e6bed58f047fcdc10753ecabff2291cda3ff9dd1fe6d5ff00915d2fdc9fee4dfd5ff57f053cd0cda46a3eaec1f26d5ff91516e462098fab6d1220c329d473fbaba7fb92fb92fd5ff554f3232714191f57003e21957fe4549b99434437eaf40f00cabff22ba4fb92fb90fd5ff554f37f6bc788ff009bda1e46cabff2290cac61a0fabc20f3ecabff0022ba4efd92fb91f47f554f34ec8c576aefab81c78d6ba8ff00df541b6e03276fd5a636798aa913dff717509bee4470f4a53887af64b843ba45c40e012d297ed9b8ff00de35bff416e7dc9bee474538a3aadc7fef19ff00f4149b9f73bfef1dc3e26bfee5b3f7247e4968a731960b86db7a6b1ad3c87ed23f06396857bdcff50c06c40824f7f36b54bfcd4ede3b7c9253ffd9003842494d042100000000005500000001010000000f00410064006f00620065002000500068006f0074006f00730068006f00700000001300410064006f00620065002000500068006f0074006f00730068006f0070002000430053003300000001003842494d04060000000000070004000000010100ffe10fd0687474703a2f2f6e732e61646f62652e636f6d2f7861702f312e302f003c3f787061636b657420626567696e3d22efbbbf222069643d2257354d304d7043656869487a7265537a4e54637a6b633964223f3e203c783a786d706d65746120786d6c6e733a783d2261646f62653a6e733a6d6574612f2220783a786d70746b3d2241646f626520584d5020436f726520342e312d633033362034362e3237363732302c204d6f6e2046656220313920323030372032323a31333a34332020202020202020223e203c7264663a52444620786d6c6e733a7264663d22687474703a2f2f7777772e77332e6f72672f313939392f30322f32322d7264662d73796e7461782d6e7323223e203c7264663a4465736372697074696f6e207264663a61626f75743d222220786d6c6e733a64633d22687474703a2f2f7075726c2e6f72672f64632f656c656d656e74732f312e312f2220786d6c6e733a7861703d22687474703a2f2f6e732e61646f62652e636f6d2f7861702f312e302f2220786d6c6e733a7861704d4d3d22687474703a2f2f6e732e61646f62652e636f6d2f7861702f312e302f6d6d2f2220786d6c6e733a73745265663d22687474703a2f2f6e732e61646f62652e636f6d2f7861702f312e302f73547970652f5265736f75726365526566232220786d6c6e733a746966663d22687474703a2f2f6e732e61646f62652e636f6d2f746966662f312e302f2220786d6c6e733a657869663d22687474703a2f2f6e732e61646f62652e636f6d2f657869662f312e302f2220786d6c6e733a70686f746f73686f703d22687474703a2f2f6e732e61646f62652e636f6d2f70686f746f73686f702f312e302f222064633a666f726d61743d22696d6167652f6a70656722207861703a43726561746f72546f6f6c3d2241646f62652050686f746f73686f7020435333204d6163696e746f736822207861703a437265617465446174653d22323030392d30352d32365431363a30373a35332d30353a303022207861703a4d6f64696679446174653d22323030392d30352d32365431363a30373a35332d30353a303022207861703a4d65746164617461446174653d22323030392d30352d32365431363a30373a35332d30353a303022207861704d4d3a446f63756d656e7449443d22757569643a323132363238344639453442444531314237393041324239333532443643394222207861704d4d3a496e7374616e636549443d22757569643a32323236323834463945344244453131423739304132423933353244364339422220746966663a4f7269656e746174696f6e3d22312220746966663a585265736f6c7574696f6e3d223732303030302f31303030302220746966663a595265736f6c7574696f6e3d223732303030302f31303030302220746966663a5265736f6c7574696f6e556e69743d22322220746966663a4e61746976654469676573743d223235362c3235372c3235382c3235392c3236322c3237342c3237372c3238342c3533302c3533312c3238322c3238332c3239362c3330312c3331382c3331392c3532392c3533322c3330362c3237302c3237312c3237322c3330352c3331352c33333433323b32303938333131464445433145373338463039433535304645444339393046462220657869663a506978656c5844696d656e73696f6e3d223330302220657869663a506978656c5944696d656e73696f6e3d223230302220657869663a436f6c6f7253706163653d22312220657869663a4e61746976654469676573743d2233363836342c34303936302c34303936312c33373132312c33373132322c34303936322c34303936332c33373531302c34303936342c33363836372c33363836382c33333433342c33333433372c33343835302c33343835322c33343835352c33343835362c33373337372c33373337382c33373337392c33373338302c33373338312c33373338322c33373338332c33373338342c33373338352c33373338362c33373339362c34313438332c34313438342c34313438362c34313438372c34313438382c34313439322c34313439332c34313439352c34313732382c34313732392c34313733302c34313938352c34313938362c34313938372c34313938382c34313938392c34313939302c34313939312c34313939322c34313939332c34313939342c34313939352c34313939362c34323031362c302c322c342c352c362c372c382c392c31302c31312c31322c31332c31342c31352c31362c31372c31382c32302c32322c32332c32342c32352c32362c32372c32382c33303b3744364130313537383430343939313330384637353335414334313930453641222070686f746f73686f703a436f6c6f724d6f64653d2233222070686f746f73686f703a49434350726f66696c653d22735247422049454336313936362d322e31222070686f746f73686f703a486973746f72793d22223e203c7861704d4d3a4465726976656446726f6d2073745265663a696e7374616e636549443d22757569643a4443453037383637424332464444313141424441463535433246414541463533222073745265663a646f63756d656e7449443d22757569643a4442453037383637424332464444313141424441463535433246414541463533222f3e203c2f7264663a4465736372697074696f6e3e203c2f7264663a5244463e203c2f783a786d706d6574613e2020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020203c3f787061636b657420656e643d2277223f3effe20c584943435f50524f46494c4500010100000c484c696e6f021000006d6e74725247422058595a2007ce00020009000600310000616373704d5346540000000049454320735247420000000000000000000000010000f6d6000100000000d32d4850202000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001163707274000001500000003364657363000001840000006c77747074000001f000000014626b707400000204000000147258595a00000218000000146758595a0000022c000000146258595a0000024000000014646d6e640000025400000070646d6464000002c400000088767565640000034c0000008676696577000003d4000000246c756d69000003f8000000146d6561730000040c0000002474656368000004300000000c725452430000043c0000080c675452430000043c0000080c625452430000043c0000080c7465787400000000436f70797269676874202863292031393938204865776c6574742d5061636b61726420436f6d70616e790000646573630000000000000012735247422049454336313936362d322e31000000000000000000000012735247422049454336313936362d322e31000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058595a20000000000000f35100010000000116cc58595a200000000000000000000000000000000058595a200000000000006fa2000038f50000039058595a2000000000000062990000b785000018da58595a2000000000000024a000000f840000b6cf64657363000000000000001649454320687474703a2f2f7777772e6965632e636800000000000000000000001649454320687474703a2f2f7777772e6965632e63680000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064657363000000000000002e4945432036313936362d322e312044656661756c742052474220636f6c6f7572207370616365202d207352474200000000000000000000002e4945432036313936362d322e312044656661756c742052474220636f6c6f7572207370616365202d20735247420000000000000000000000000000000000000000000064657363000000000000002c5265666572656e63652056696577696e6720436f6e646974696f6e20696e2049454336313936362d322e3100000000000000000000002c5265666572656e63652056696577696e6720436f6e646974696f6e20696e2049454336313936362d322e31000000000000000000000000000000000000000000000000000076696577000000000013a4fe00145f2e0010cf140003edcc0004130b00035c9e0000000158595a2000000000004c09560050000000571fe76d6561730000000000000001000000000000000000000000000000000000028f0000000273696720000000004352542063757276000000000000040000000005000a000f00140019001e00230028002d00320037003b00400045004a004f00540059005e00630068006d00720077007c00810086008b00900095009a009f00a400a900ae00b200b700bc00c100c600cb00d000d500db00e000e500eb00f000f600fb01010107010d01130119011f0125012b01320138013e0145014c0152015901600167016e0175017c0183018b0192019a01a101a901b101b901c101c901d101d901e101e901f201fa0203020c0214021d0226022f02380241024b0254025d02670271027a0284028e029802a202ac02b602c102cb02d502e002eb02f50300030b03160321032d03380343034f035a03660372037e038a039603a203ae03ba03c703d303e003ec03f9040604130420042d043b0448045504630471047e048c049a04a804b604c404d304e104f004fe050d051c052b053a05490558056705770586059605a605b505c505d505e505f6060606160627063706480659066a067b068c069d06af06c006d106e306f507070719072b073d074f076107740786079907ac07bf07d207e507f8080b081f08320846085a086e0882089608aa08be08d208e708fb09100925093a094f09640979098f09a409ba09cf09e509fb0a110a270a3d0a540a6a0a810a980aae0ac50adc0af30b0b0b220b390b510b690b800b980bb00bc80be10bf90c120c2a0c430c5c0c750c8e0ca70cc00cd90cf30d0d0d260d400d5a0d740d8e0da90dc30dde0df80e130e2e0e490e640e7f0e9b0eb60ed20eee0f090f250f410f5e0f7a0f960fb30fcf0fec1009102610431061107e109b10b910d710f511131131114f116d118c11aa11c911e81207122612451264128412a312c312e31303132313431363138313a413c513e5140614271449146a148b14ad14ce14f01512153415561578159b15bd15e0160316261649166c168f16b216d616fa171d17411765178917ae17d217f7181b18401865188a18af18d518fa19201945196b199119b719dd1a041a2a1a511a771a9e1ac51aec1b141b3b1b631b8a1bb21bda1c021c2a1c521c7b1ca31ccc1cf51d1e1d471d701d991dc31dec1e161e401e6a1e941ebe1ee91f131f3e1f691f941fbf1fea20152041206c209820c420f0211c2148217521a121ce21fb22272255228222af22dd230a23382366239423c223f0241f244d247c24ab24da250925382568259725c725f726272657268726b726e827182749277a27ab27dc280d283f287128a228d429062938296b299d29d02a022a352a682a9b2acf2b022b362b692b9d2bd12c052c392c6e2ca22cd72d0c2d412d762dab2de12e162e4c2e822eb72eee2f242f5a2f912fc72ffe3035306c30a430db3112314a318231ba31f2322a3263329b32d4330d3346337f33b833f1342b3465349e34d83513354d358735c235fd3637367236ae36e937243760379c37d738143850388c38c839053942397f39bc39f93a363a743ab23aef3b2d3b6b3baa3be83c273c653ca43ce33d223d613da13de03e203e603ea03ee03f213f613fa23fe24023406440a640e74129416a41ac41ee4230427242b542f7433a437d43c044034447448a44ce45124555459a45de4622466746ab46f04735477b47c04805484b489148d7491d496349a949f04a374a7d4ac44b0c4b534b9a4be24c2a4c724cba4d024d4a4d934ddc4e254e6e4eb74f004f494f934fdd5027507150bb51065150519b51e65231527c52c75313535f53aa53f65442548f54db5528557555c2560f565c56a956f75744579257e0582f587d58cb591a596959b85a075a565aa65af55b455b955be55c355c865cd65d275d785dc95e1a5e6c5ebd5f0f5f615fb36005605760aa60fc614f61a261f56249629c62f06343639763eb6440649464e9653d659265e7663d669266e8673d679367e9683f689668ec6943699a69f16a486a9f6af76b4f6ba76bff6c576caf6d086d606db96e126e6b6ec46f1e6f786fd1702b708670e0713a719571f0724b72a67301735d73b87414747074cc7528758575e1763e769b76f8775677b37811786e78cc792a798979e77a467aa57b047b637bc27c217c817ce17d417da17e017e627ec27f237f847fe5804780a8810a816b81cd8230829282f4835783ba841d848084e3854785ab860e867286d7873b879f8804886988ce8933899989fe8a648aca8b308b968bfc8c638cca8d318d988dff8e668ece8f368f9e9006906e90d6913f91a89211927a92e3934d93b69420948a94f4955f95c99634969f970a977597e0984c98b89924999099fc9a689ad59b429baf9c1c9c899cf79d649dd29e409eae9f1d9f8b9ffaa069a0d8a147a1b6a226a296a306a376a3e6a456a4c7a538a5a9a61aa68ba6fda76ea7e0a852a8c4a937a9a9aa1caa8fab02ab75abe9ac5cacd0ad44adb8ae2daea1af16af8bb000b075b0eab160b1d6b24bb2c2b338b3aeb425b49cb513b58ab601b679b6f0b768b7e0b859b8d1b94ab9c2ba3bbab5bb2ebba7bc21bc9bbd15bd8fbe0abe84beffbf7abff5c070c0ecc167c1e3c25fc2dbc358c3d4c451c4cec54bc5c8c646c6c3c741c7bfc83dc8bcc93ac9b9ca38cab7cb36cbb6cc35ccb5cd35cdb5ce36ceb6cf37cfb8d039d0bad13cd1bed23fd2c1d344d3c6d449d4cbd54ed5d1d655d6d8d75cd7e0d864d8e8d96cd9f1da76dafbdb80dc05dc8add10dd96de1cdea2df29dfafe036e0bde144e1cce253e2dbe363e3ebe473e4fce584e60de696e71fe7a9e832e8bce946e9d0ea5beae5eb70ebfbec86ed11ed9cee28eeb4ef40efccf058f0e5f172f1fff28cf319f3a7f434f4c2f550f5def66df6fbf78af819f8a8f938f9c7fa57fae7fb77fc07fc98fd29fdbafe4bfedcff6dffffffee000e41646f626500640000000001ffdb0084000604040405040605050609060506090b080606080b0c0a0a0b0a0a0c100c0c0c0c0c0c100c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c010707070d0c0d18101018140e0e0e14140e0e0e0e14110c0c0c0c0c11110c0c0c0c0c0c110c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0cffc000110800c8012c03011100021101031101ffdd00040026ffc401a20000000701010101010000000000000000040503020601000708090a0b0100020203010101010100000000000000010002030405060708090a0b1000020103030204020607030402060273010203110400052112314151061361227181143291a10715b14223c152d1e1331662f0247282f12543345392a2b26373c235442793a3b33617546474c3d2e2082683090a181984944546a4b456d355281af2e3f3c4d4e4f465758595a5b5c5d5e5f566768696a6b6c6d6e6f637475767778797a7b7c7d7e7f738485868788898a8b8c8d8e8f82939495969798999a9b9c9d9e9f92a3a4a5a6a7a8a9aaabacadaeafa110002020102030505040506040803036d0100021103042112314105511361220671819132a1b1f014c1d1e1234215526272f1332434438216925325a263b2c20773d235e2448317549308090a18192636451a2764745537f2a3b3c32829d3e3f38494a4b4c4d4e4f465758595a5b5c5d5e5f5465666768696a6b6c6d6e6f6475767778797a7b7c7d7e7f738485868788898a8b8c8d8e8f839495969798999a9b9c9d9e9f92a3a4a5a6a7a8a9aaabacadaeafaffda000c03010002110311003f00f514d770c2caafc8b38254223b9201009f843788c556fe9083f926ff0091137fcd18abbf4841fc937fc889bfe68c55dfa420fe49bfe444dff3462aefd2107f2cdff2226ff9a31577e9083f926ff91137fcd18abbf4841fcb37fc889bfe68c55dfa420fe49bfe444dff003462aefd2107f24dff002226ff009a31577e9083f926ff0091137fcd18abbf4841fc937fc889bfe68c55dfa420fe49bfe444dff3462aefd2107f2cdff2226ff9a31577e9083f966ff91137fcd18abbf4841fc937fc889bfe68c55dfa420fe59bfe444dff003462aefd2107f2cdff002226ff009a31577e9083f926ff0091137fcd18abbf4841fc937fc889bfe68c55dfa420fe49bfe444dff3462aefd2107f24dff2226ff9a31577e9083f966ff91137fcd18abbf4841fc937fc889bfe68c55dfa420fe49bfe444dff003462aefd2107f24dff002226ff009a31577e9083f926ff0091137fcd18abbf4841fc937fc889bfe68c55dfa420fe49bfe444dff3462aefd2107f24dff2226ff9a31577e9083f926ff91137fcd18abbf4841fc937fc889bfe68c55dfa420fe59bfe444dff003462aefd2107f24dff002226ff009a31577e9083f926ff0091137fcd18abbf4841fc937fc889bfe68c55dfa420fe49bfe444dff3462adc77b04b2889798720b00f1ba6c0807ed28f1c5511bd3df157ffd0f5049ff1d283fe30cdff00128b154bb56f33d8e9774b6d711cceec8240630a450923bb2ff2e5d8f04a62c3094c02865f3ce947fdd371ff00029ff35e1fcacbbc23c50bc79d34b3fee99ffe053fe6bc3f969792f881dfe33d33fdf53ffc0a7fcd783f2b2f25f10285ff009fb47b2b1babd962b8f46d2192e25a2a5784485da80b8de8304b4f202d3e204b3ca7f9bde5cf34690355b0b5bd8ad8c8f1059e3895ea94a9a24ae29bff003631d3c88b5330139ff1ae97fefa9ffe053fe6bc3f95977847881dfe36d2bfdf33ff00c0a7fcd787f2b2ef0be206bfc6da57fbe67ff814ff009af1fcacbbc2f881dfe38d27fdf371ff00029ff35e3f9597785f1435fe3ad27fdf571ff029ff0035e3f949f785f1435fe3bd23fdf371ff00029ff35e1fca4fbc2f8a16ff008f748ff7cdc7fc0a7fcd78fe4e7de17c50d7f8fb48ff007cdcff00c0c7ff0035e3f939f785f1435ff2b0346ff7cdcffc0c7ff35e1fc9cbc91e306bfe560e8dfef9b9ff00818ffe6bc7f272f25f183bfe561e8dfef9b9ff00818ffe6bc3f939f92f8c169fcc5d1bfe59eebfe023ff00aa983f253ef0be3077fcac6d17fe59ee7fe023ff00aa987f2593bc2f8c1aff009591a27fbe2ebfe023ff00aa98fe467de17c60d7fcac9d13fdf175ff00011ffd54c7f233ef08f183bfe565689fef8baff808ff00eaa63f919f78fc7c17c60eff009597a1ff00be2ebfe023ff00aa98fe467de3f1f05f1e2d7fcacbd0bfe59eebfe023ffaa98fe467de3f1f05f1e2d7fcacdd07fe59eebfe023ff00aa98fe467de3f1f05f1e2eff009599a17fcb3dd7fc047ff5531fc8e4ef0be3c5aff959ba0ffcb3ddff00c047ff005531fc8cfbe2be345dff002b3f40ff00967bbff808ff00eaa61fc8cfbe2be3c5aff95a1a07fcb3ddff00c047ff005531fc8e4ef0be3c5aff0095a5e5ff00f967bbff00808ffeaa63f909f7c57c78b47f34bcbfff002cf77ff0117fd54c7f213ef8af8f15a7f357cbdff2cf79ff000117fd54c7f213ef8af8f15a7f363cbc3adb5e7fc045ff005570fe427df147e622a6df9c1e5a5eb6b7bff22e2ffaab8ff27cfbe2bf988f9a63e5afcc1d1fcc3a83d8d941731cd1c466669d6355e2aca87757735ab8cab369658c59219433091a0c81f7d460ff008c337fc4a2cc76d4562aff00ffd1f5049ff1d283fe30cdff00128b1561de788f96b309ff009775ff0089be66e97e9f8b8f979a4c90ed9936c15826d91b4b8c786d520f3ec9f57f2379865e94d3e751f375e1ff001b65598fa531e690fe4adb7a5f977a79a7f7b24f27df295ff8d7278fe9099f3671c726c5a2b855a2b8a1695c2ab4a61558531558530aad2986d8ad299255853155a53142c298aad29855614c2ad14c50b4a62ad14c2ab4a62ad70c2ad70c50d70c55a298aad298aad31e1b55a63c6d5698f1b429b455186d50d2c1841432dfca28b8799ee4ff00cb9483fe4ac5987da1f40feb3760fa9eb0ff00f1d283fe30cdff00128b34ee6227157fffd2f5049ff1d283fe30cdff00128b1562de704aeab19ff8a17fe26f99ba6fa7e2d1939a50a9990c1771c8a5ae38ab0efcdf9bd0fcb7d70ffbf228e2ff00839906579b924735df95507a5f977a10a5395b97ff0083919bf8e590e4112e6cab8e4d0d15c55a2b8aad2b850b4ae2ab4a61558570aad2b855695c55694c2c5614c92ad298aad298a1694c55694c2ab4a62ad14c55694c2868a636ad70c55ae18ab5c3155a530ab463c50d7a78daad31e36ab4c78aa9490d70dab2afcac8f8f98ee0ff00cb9bff00c9d8f3135c7d03dedb839bd31ffe3a507fc619bfe25166a5cb44e2afffd3f5049ff1d283fe30cdff00128b15639e6a5aea51ff00c615ff00893665e9be969c9cd280b97b06f862ad71c55e7ff9ecfe9fe5adf7f97716a9ff0025797fc6b95663b328a7fe42b6f47c91a0c74e96301ff8240dfc72e8f26279a78532486b8e2ad15c2ab4ae2ab4ae155ac98a144b52a1b66f03f3c5569fb61475debf2f1c36a9d68de59b9bfa4b2560b5ece47c4c3fc91ff1b663e5d488f2dcb38e3279b18d5af9acb56bbb5445782295d23a921a8ac40df7cae3a93d52718538f57b46fef2b11f7151f78cbe3a989e7b303028a468651ca37571e2a41fd5978903c9890d94c285a5324ad18f155a53143453155a531568a62ad70c6d5ae186d5af4f1b56bd3c6d5a31e3685a63c6d5af4f155a63c55618abdb0dab28fcb688a6bd70694ff457ff009391e626b8fa07bdbb00dde84fff001d183fe30cdff128b356e4a2bb62afffd4f5049ff1d283fe30cdff00128b1563fe67a7e914f110a9ff00866ccbd3fd2d3939a509b81e397305d4ed8abb8e15799ffce433f0fcbc09fefdbeb71ff02aedfc329cbd19459c79621f4fcb3a4253ecd95b0ff922b97041e69894c3685a530dab4531b42d2986d5b8ade59a458a252eedd1460320059502d22f3eebcbe55934c88426edaf3d56b875600288f88f841fb5f6b3027aea3b7272a3a6b081d3fcd106a57315a456d38ba928123e1cb906f0e35db043b4e12d87341d2483d034fd12cec42dc6a4c8d29fb29d514b014ff5ce1cdabe839231e1f9a6efa8c92205847a71f453dc8fe198864e40877be46f37eabaa5979df5d369752c3fe9f71b2b1e27f787f64ed86322ccc417597e62ebf0516e562ba4efc97837fc12edff000b93132c0e10c934ff00cccd11c28b98a6b4905016039afceabf17fc2e4c646a384b29d3fcd76d7601b1bf8ae47742416fa41a3e64475121d6da658fbc27116b2a40f5a22bee9bfe072f8ea8750c0e345c17b653d3d39454fecb7c27ee397c72c65c8b031215cc7963168c78daad298ab5c324ad70c50d70c55a31e2ad7a78ab5c3156bd3c16ab4a61568c78dab5c69d3ae2ac97f2f8b7e9b9ea76fab37fc9c4cc2d68f47c5bb0f3676fff001d283fe30cdff128b35ee4227b62afffd5f5049ff1d283fe30cdff00128b1562be6f768f5ab635a46f0ac6e0fbbb1afe199380d45aa7cd2d67f40292494dcb3374a9048fc32d948446ec2aca83de9796131fc692d1582efc49ee72b8e7b3b72ff73fd667c1b6e8f87e305aa08a9e34f0cb632b0c087947fce494bc7ca5a65b8eb35fd69fea44dff3565797984c79bd4b4e83d2d36ce2a53d38224a7faa8065c82ae530a1cd138b796e38931422ae47ce995e4ca21cd94624a0c5fd9b75938ffac08c8c75303d5271c91d656f6f72431b88c454a9e2c0b93e017233d54472651c44a6b198234f4a0091af7a10598ff94dd4e6164c929737261011611e7cf22ea3e6ed63495897d3d3ede2985ddd31a2a1765a2a8dcb39a7d9ff0086cc79891fa5b8480e68ed1f4fd1bcbf6089a6c00cd511cf3b90d2acb27c3f17f921fe1e198f74091cd68c8f923c4f25c6aec2e119841d2a68bf1500a7f9238e4ef8a5b8fa59014364e55fe223b5680f6d80cbd83e48f3dffca6baef6ff4fb8ff93872419a1350b6b7484c888b1b2b84f858904107a824f8665e7c5188062e2e1c9291a283b7b3371ce8eb194a7daad0d6be00f86558f14a7c9b6790479a9b432c529461fbc46e3b6fb8db6a640ecc81b4c6cfcc7e62d34f086ee5403fdd327c6bff0002f5a6224506112f53d1b55b3d474fb691678a4b96890cf1a30a872a390e3d46f97020b8721451b73aa1d321fac3dd1b7814a872e7e01c8d0541af7cb06494791470da3acfcd2b344245f4ee62a54c90b0fe15197c7547a86071a6b0eab612804c9e993da4dbf1e997c73c4b03028b0aac39290ca7a106a32eb43bd3c6d8b5e9e36aad6fa7dddc9a5bc2f29ff24123efe9919648c79964224bb55d36e34ab78a7bf021499ca26f52081cbe2a569950d4c09ab64719a4246639503c6c1d0f46535197837c9ae9bf4f0ab463c6d5698f1b55a63c5591f90529ac4c7fe5ddbfe4e2662eb3e81ef6cc5cd9b3ff00c7460ff8c337fc4e2cd739289c55ffd6f5049ff1d283fe30cdff00128b1562fe79859dc38e822a311d47dba1fbce64e1171af36a9f3492f0b42f1c5e8868589f88eebba9e47ad76c8e4990771e94c45f5dd2f764374234a98d9aa7d23c4800fda27a0ad38e6178beae5e9feb7fb293656c9be9d74ad1549a221e0a15680d3c333f1640621a6437793ffce4e37a769e5a82bf1492dc4c57c0008abfaf2339d94c424363f9e5e6380225c45ea2a803e17f0f6756cac679379c013fb2ff009c8186a16eecdc0eedc54ffc459726352581c0598e95f9fbe43bb11e9d74b25b8b9fdca2aab12cefb2aee06ee7f6b96512f51b65c242df3079facecac6e5f45d2e1e51dbfab0cf705a56352a07c238ff00378e5f0d30ab699663c9e51a8fe64f9da7d62e6da3648edc4b2a011db8278af2eec1bc32d1862030e32c3ee3cf7f9811476ceb3cbca48cb495b64ebcd80fd8f0192e08a2cb2ef27f9ef5ee0f26a974d1a816e7988ca1ac9f6f65e229be6b75d190fa0717a5c9c355ba7cff00989a9c3ab0b1b65766242caf5a10bbba3ee5aa4fc3fecbf6731b4d8aa26522dd399ba09add7e6ebe9b732c77d092e5d4b3305ab465b829fb48c03396c961c5e20bfc7f5532ca62693db5fcf9f28c3742d2fb9432fa811a31c815a91c9b8b28aaa7da6f8bece5820692276f1bf3b98e5f376b93a3738defa768dd4d5594bb1e40f7188e4da965cdf4771070f478484862c18953407f648dbaff00365d3ca6428b4431089b0bacc7a0f2c533fa2cc1685c120f7ec0d363874d9844da33e3321b294d256f4b2b871ea5790e877ed9027d56d807a515ac17a421d5832971f1f5a7c276ae64eae564168d28a051d169713a5bc88590b7d5aac2869eac6493e3f6972bfcb022c7f47fd9354f2112a48afbcc5ae35d2e98f7cd2e9d2005a26f8ab4351bb548a1195511d5bb151dd5a08f51822faf5b7a9146adc4cd19e346f03435ef840356dc48268a6f65e78f31db001e61751d68526504efb755e2d844cb138a259258fe655ac2409239addb7e7242dc9411d7e13c4e4e39886a96067da7f98ee02c524ea2e6060188fb0e4115d9a847fc2e648d448071ce30cc34af37f92444ad2d9c90cc3fe5a0071f3e55e3ff000b94cf34cf56c84229f1f33faf08360b17a5fb2ca43edf46d9872ca5cb8611dec13f335f56bdd32da54d42585a29851004311251fed295dcff00b2ccdd1c44e26dc5d57a4ecf21d27f326eed65e37b012ca7899adcf063c4fed29f84e42394c4b3386debba06a30eada3daea10b168e7524161c4d4315351f319b3c53b882e1ce34691c63cb2d83463c6d5698f1b5641e465a6ad31ff008a1bfe26998bacfa7e2db8b9b3093fe3a507fc619bfe25166039089ed8abffd7f5049ff1d283fe30cdff00138b15639e6a3caee4818831cb6b4a134a1e4fbd46e2bff1ae5d8f2000ff0047d4d731658b0ba9b50857e20a226fde7a838860f1d6809ea09fdac84a7e20fe6c6fd5c4c80e1287736cb77c5157fbb8c153508c50710a06fd5ce438e264470fa7f1e9fe92d1a4f34bd22084abccc5bd12cd4276a9df6029d49ff81cb0c638e3b7f9a888322f17ff009c9c99a4d63cba8c77f4a7723dd9d47f0cab1f22d93fa9e47df2b7256b74c92a9456c97175173e544911942920f2076e9be1835657d2de44d4a3bbf24c325c451a5dab88792a700cb1b2d0540fb541f6732f1c760e1cca433dc922e485414f52a7e2af7ccce1d9a2d219fd627990bce8bc451a9d4d7f0c88982484989a57b49e679a286448fd0aab36c7dabd7c331f551021290078a9b3112481d118b143098c9b54b89e590c4cdd189a029423a7c25bf6b34190895d9e08c63e9feb717adcf8d84bbcc1a0e877d7725cdec4f24c63447ea17e03541f09ec69fec732747c7c0230a1bfd5fcefe77a64d594812b2c0fccba2d9daeadf598dde6927494f294fd97240eb4f0cd86a21c3c23c98619d92a172be8aa42410ca370db301f2ed9831362dcd4568d68669249bb5ba8765a956e24d0b83fe4e51a8c9400fe7320136d6a13c0a943ce48848dc7ec8e217635a9cc4d2cfcfaa94baeb4565b8f42dd5cb4718699988a73201a2d3e7c732e1a81567bd52eb949a2710cac494fd9a920577cc812b62cf3cbde5a8ee74bb3bd170e1a536d218989e2042cc1c0eff1afd9fe5cce8643c35f8f4b83920388b07d53c93e6cd3645bed423865b7818f39e0714e2cd45aa9e2ddff0097289c5b7111748c82f02e893da99389793908d94efb0dc353db18e4f418b3940f1892f836d0dd8af211cea4fb74c98af08f7f17f9c837e20f72db8b28174881c0a4b24cfcdf7a151b0ad720623804bcd9099e3215dfce7e60d1f4f8e486e16f235501209c0247c20d01d9fe1aff00360f50692012ba3f31ebd1a35c472325c3b19aeedd6b2430f23f628d5eff00f03f6700916ee015ba6da57e665edb4aad7300257632dbb18dfee248c3c77cd1e15722cdacbf31a0f31d949a614f5909471348a5258e45a9a6c78b065cbb0fa45c5a32d9352791eab6e2df55bc840f86399d457ad031a6532e6e547907b6fe51cbeb792605ff007ccf3c7ff0dcbfe36cd8e98fa1c1ce3d4598fa797db53463c6d5698f0daa79e4d5a6a927fc606ff89a662eabe9f8b662e6cadffe3a507fc619bfe25166137a27157fffd0f5049ff1d283fe30cdff00128b15487cd3006944be9abd22e2d5a56953d2be1f6b2cc5c984d84c5a6c92ddc2b2c8ca2d9a66998ee80441951581d986ebfeae43c291065229e21d11de4cd216f677d5aea645de967130064110623d46069c59ff0065b312103b4cfa647fd3c5b36aa5fa438b9be96449a496053cda492a0f235aaf870419440ca590924f0b7c00117877fce42ea4b7fe65d09d0718fea65912a0901a4ee47cb3618c8e1b0e39fade6a4e56e4ac6634c92ad8a421ebcfd3f89413bf4dcf6eb928b4e57bd7910c89f9776a824e49f5c97e33b1a826bb7d199f839070b2256d71c12e81562183ee0f43befd333251240680505c9a5d3ae544e12ee45510cf21feedb8b1ad4f5a81f6735d9e5284aa3172718121b953f2fadfb5ca4577372238c6f3a37156151d0115dd7ed6475794f8175eaae2e15c51f5f9276679a4bb48cb51919e48e3269f18a22f1dd79165cd163c371e2aff003bfddff9bc4e699b77a93005643cd38f2451c77ec58852402d993a7d6c4c8180f5fd3ff13c3f4fa5ae78b6a276613e739e37960b7894a7c0ec54f1a20a8e4db54bb7f95fb3995384ac4a5ddfe9bfe258e322e83139a732b990fed6e3f86574e58662211a7dac2f6e5d242c88b3515cf16df7a0ae3abd0c447889e212fe168c59cca54426f6d6c2f6481bd40c6e158fa476a063405cff00934f8734023b98fd3c1fceff007ae412c67cd124514ef1461d6e399fac3d41e6dd29507b66cb4d097f122ed27bfd3352b0282f6da5b73254c7ea290180eb43dfae66a82cbbcbfe7dd2b4ed2adb4fbeb7bb89a150ab70212f130776e25594934a8e3f67ed65d098a71320f5157f3079bbcb5ab797ef21b2d46292e24506380d524628eac78ab85276c3290a5c60db07e4c8bd6a5bf1194396be39ad9978cc8cad4a7ab19edfe529fb54ff005970aa617e6e0c56f1ac84dab2288428628580dcad457954fc58d9aa450e69a47e51bcd434fb1d42d25884b1c25f84ca4032702aadc857a370cb7980e31a122c76ce3bbd2d2ef4fbc60b7211a09b8fc60b06e5d4631970d8ef6c31e2a28892e2de4b1d391923e503c8b3536775670d47fa3ece3628268d952d2d843e75b18e3678a06b891447523628dc6a3bd065f800e3ae8e3ea09e00511e61529af6a0b5ad277dfd89ae559854cb7e23710f61fc906e7e52b85ee97b27e31a1ccbd31f4b8da8fa9e8263cc8b685a63c6d5a31e36a9cf94969a94bff185bfe24b98fa93e9f8b662e6c964ff008e941ff1866ff8945986de89c55fffd1f5049ff1d283fe30cdff00128b154af5c72b380778cc63928fb4284ef4fdacb310d9849e745a28a5d4249a505e0596384aa8af26a3290b5e25aa7314cfc3e67f1fd1675c4119a3f996df49d2eead6e9849751718a381be22a89180e4b01d2bfb3fcd987aad788995f3fe67f47fa4db186c290ba3c37535bc56465e4aedea4c23f863a101c4648ad5becf2fd9ca31629ce2013fe97e89370229e39f9f1a65c41e7ed2b4b8d39dc47a75ba8863dfe362c4aaf8e6df1c78614e2ddced834ba36b31ff0079633ad3ad637fe991a2e4710ef40cb15c26cf13a9ff002948fd785545072a5539d1c54578814563563e192835657b7793f56b083c8d670cb38e7f599c848aaea28ec284af2f8b6fe6ccdc738c46fc9c29824ecc7ae7cd9a1567896f0b4aaac591636a81befd07866678d0e4d3c1252d275eb1bcbc30dbce3d5e0b246655a0f8549fb241ae6076966c6311be2dff009adda784b8826af756e9a8b2492340c78f08bd26e437049a53a7c5983a4d563380097abf9dfef5bf262971d8445acab777514c2e3d69982cb182849654668e9b745e5ff02b9478d1c503188e08d707d5f4ff00c549b0e33220945ea575145271b4b9803ad4342cea0f23bd287c6b95f6760c7c24cc9feb7fd22b9a52e4184f9dee6384c76b0fef1e78dfd59c10430460788dbecd4ff37c4d9b0c92390891fa6b8611ff008afeb30c43876ebfc4c61a2923897923558752ac001ed5194972c14e7f4c2145fa87acd7605427006941b952a58edfeae4f519632851d9a71e23195b2fd2da1b2b784dcbaaa2c4099031a8e7f12aab75dbfe133473df21a6e258bead15bc173717571224ef2bd614048a003b75e999a2ced1d828e48bf3b6a535fdb69cb48ca21728621fb52015e447ed6d99a4506b81dd1fa212ba2a0762b4b4b4f7feef5373f857250dc3565e6f33bb0f0eb3381095e37d28e2fb31224d8efd0e031d99e33bb36d3f4bd22f344d56fee2468ae6d113ea91063c4b052191a8b4fb43fc9c800db296e85d3f4217da46ab7f1dd2c434e45916dda85a40c68d4dc538e1532a2881a7dd4be5dfd2312078ad7d2894d6acad2f324d3c3f97fcac09b465bf9d5b40d06c56f6c5a5864056dfd2900919391019d585054abffc2ff365b1938f38eec62fb58b6d56f6e350b65648ae1cb0470030d8020d09c8cb9b7439287a95dc9ae0649b79412ddfcc113caaac62e2d1b37ec9e5c6a3e86cbb0b4671b04d7cef1e9eb7a1e2012e416fac0018faacea195cb1d8715fd95c8ccefbae206bc9e89f90337a9a3eaf01eb1dcc6f4ff5e323fe34ccad31d8b56a07a9ea4506645b8ed18e9d76c6d69a10bb7d952df204e3c41349a796405d4e6426922c479a7ed0ab29dc751946720c7e2cf18dd90c9ff1d283fe30cdff00128b315b913db157ffd2f5049ff1d283fe30cdff00128b15635e70d42fac6eede7558cd8d2313312438ab90d4143cb6e3f0e4259250dff00856812c1ff0045db4de65945a2fa536a53da7c4cdc846ab1c93cb44ee5e18d51bfd6fb58e1c42f8ab7ff0072a4ed4ab6d26936d36ad75a98370c2473ea3a064470ae5401e25fe3e3f65113966a8010c9296407eaf47fc75b87d200645e5ef46e25536d0d21789421a0454a054a28af2e91fdae1c73284f8a5e9e491b078afe6f82df9fb671935f4aded87dd13377cd843938a7994d9586e3a64c2a1ee0a906bb8f0c6d8bcdff00316ca5bab8b18e0b73255672c156a3ec802b8094863e66f37c96d6ba45b47f53b0b2b8e6089123691a49d9d99893ca815b8aae1f136a5e117689d23cb9aa5c5e2c57e12aacfe94b13c7cb8b2114603ed74cc7a9095c373fcd666408a29cc3e4bbf82f9ae2394a4300a47313434e27ed20f8b2e9649186e05d7ae3fcd6b1100f36537ba188d16592492f1f8a290cc6bf6940e2086d91bf679673f09e432e1e018bf1fef9ccf4f3bb57d574fbdb6b60b66cf2b212662dc53f74ab508ae9515e47fe6ae595609f1ccf10e1fe0ff003ff9dc2d92d86cc4a6b1d5a41e94f14bb26ebf112fc46e4961bff92cd9b98d44538e77425af976ea1f39db5eb22dbc4b1ceccb23355c9d94229f6cb31e6a2054b7f26128ecf56b67e5670d77d80dc5464e79aba16221e6aed0da32106388970430e0b5607b74c880399f50fe74949280bbd3b4b21217b588465cd140e20911f2db8d3288e9ae5c4599c882bcf2668177592689cb814e6b2b0fc2a465b0f0e22ba7fba5e392193c97a6a5b9589a4897ad5b83b6fd454ad6987f2c246ecaf8e517a7e83656b622d98994053189375213d5f5c2800ed49332230a0d73959b49352fcb9d01dee2f2132a5d4923dceee0a191cf235f86bc6b919e3b0cf1ce8a83796b5bb2b7bcb6b330b4571c54b1720b38f1242d1be2f872984254dd39c6d2f3a2f98ad61ba8574d67176abc8a3292ae0d49500ff364c408419c4f557b6835dfd0cd653d8cd007ba84191178008a1dc965effb5feafc391e12178813b14bbcc767ac6aba4d8cb6f612ca637689230839c70c72111061ec87be4e3134d7396e95f9327b9d0b5165bf845bc9e95c44d15ca91b4f09515069d6bf0b6464376dbb1b2a8b9b6ff0cb5afa51fd6d2f04827dbd5f4cc454affa9c87fc1646995eea3aab5a47e65b292d22305b7d62d1d6304900164e5bf705b3221427b38f324c37649f980a916a370aa28395b353fd68194fe2987503d49d31f4a97903f345bc8faedbfad109b4bd4a511df0e21ca8446e0eabfb542df66b954644020364e20916fa3b4ff3a2ea9651dee997104d6928ac7340aa47b8f1561fcadf1662cb34ef77223a78747997e6afe66f9a3ca3e62b3d4ec1e399ee2ccc3c2e539a0fde9ab00a57e2192c532519714400a1e47ff9c82d7358bb8b4ed6e91cd70e12dee6d178af263b2bc7b951fe5aff00b2c394102ed8e311ba219b7e5e5edf4bf9d3acc534ef245269026556351cbd5b75a8c96195846a2001d9ebf27fc74a0ff8c337fc4a2cb9c644f6c55fffd3f5049ff1d283fe30cdff00128b15790fe746a6d6dafdb4225fb7691916e7e25a9965f8c8d8aeca7e25cd5ebb88cb6eefc70b6e3aa79e1f396ad6fab4b7a6e2332a22855e5d5e9c7d652001eafa5f07dafda6e5f6f28c5aac938d5faa5fc5fcdfe8b230887ad7946e624f2e0d52ef8b49772c8fe8caa4bf093651c7a96e03e3ccd3b0e23ea635d1303e69b0800b5d341964297065962468c092240ebb90159559f231cd107845da4c6c5be75d6a6b8b9fcd6d3dae1cb4a96507372493b5b13d4fcf33f0df00b68973280d57f30aeacaea782dc7ab246ec839001450d373df31ce4903cdb86314804fcc3f3031a3c50126a4fc2c3a7c9b0f8d25f0a2985f6b13cd69617770238fd7596a28db05f002be19646648dda65116941d4e21a94919fd89a35d94f52e17c727b31a4ff43bcb3f59af1e4a456c499051436c0f40ce09cae79b80ec3d4a216ca62d434f9ecfd515647a14e340d4fda15e9bd330354279237c3c33e197ab8bea6dc75135688b5bb0cf2412ab05566456563f01aedbf607210889423cb8ff009ffceff8632248250d6f35256582592e9f90089c854c487d32c0484d230e9f137da91fe2e399583156e40e2ff65fe991292b5c5c01728ec8f248ea14395630b1a8dd680fc2b5ff002732298da47e7190b79934469178482d1c15fe6a9352bed97621bb5cd9259b72b28979f1a28df253e5cad886a3f33f97429ab30686b1bc92256ac0d3e1f6a8ca35119ff00df87e9fc7a5313de846d56cae6ea09ada6536d5732c446ea550af255d8fda398025281e02271c9fd1f541b79efd137b3bbd14cf1477d7d123bf32d6ecae7e0084f2fbf2d8e232de7fe6add7242ddfe8ff005227b4ba5b9570494e54643e3dcf16ff002b33b144f536d5240ea3aadcd9f2ff004192e225824ba32c6f10fddc442c878bb29aa965ff005bf672c33a348a489bf3174a7bab8d31ed6ee3ba426270510a86e9f695c8a611305262cc20b7fad4c5564588000fc47ed83b71503ed36333481baebbb69626e4596706bc6643d78352a47f959184ad3208ad4f4c9acb4b966b94465474047daa736540dd3aab95c89982699014903ea7a7248526b989245019d1dd55a87a6c48eb96db0a5b1c5a65d3cd34d1437318a0e642483ecf4aefe189a482507fa27ca5741e4fa9dbd137938fc0147bd08a6011894f892ef4b2ff0042f2dac505e584287e3d8ab33ad577e8c4ee0e18c05d844a648476b3a2596a8eb25c19159b82b32b6f4557e3d41fe6c128d9dd309988d9e77f98de5db6d26d2c6e6de6924a5dac64381b0656dea29e19130a6c192d0fe52f3bebbe5abbfac69b3d23723eb16aff00145281d997c7fcb5f8b2b9c04b9b742663c9917e6bf9e748f35e91a5ddda2b417707a91ddda49bb254a302ac36743f171ff88e518f198c9bb264128aafe56e8ed17a5ac5c22b46e58408dc83874a71700a1f1fb4adf6735fda1aa00f006188eef70fcacb9b79bf35af68acd3ae8cea67fd9216e61056a77246d991a2248d8fa596a48203d95ffe3a507fc619bfe27166c1c34576c55fffd4f5049ff1d283fe30cdff00128b157cbfff0039432ddffcaccd3e2b70cc468b1baaad6a585c5cf81037cc6cc0732af36d47563696161146152e4c463be71bb3b8e24250fd98c06fb5f69b30a38c1049e5c5e86ce2a7d09e44d5ec60fca7b1bfd5944179a9add24574eacccc5393736735f4fe04fdae2b994220c370937d134d1cc11dbc4e5ebfb8d54d49ad4fee9078f864e118c4001656f13d61797e6faa8fd8b2807dd68bfd732a3c8341e6580ea11f3bfbc7ad434cc7e7f1573108ddc88bb569e3b3d40582412dd5ef1e527a7408aae79577dda81b18c6f749ee653afda70d1f4707f775497ed900ee48ef4cba23934498c0b3b896ff0052ba12c496f693437133bc8aa162494723bf535f878fda6cb0d0e6802d1da2a4975a75f3dbc88f4432171caaaadf083b8eed8642c16b32e120165f0dd245e548e16e3cc2b7a6f527600f7dbc70c318e1b1d51227896d8eb57675dbe8ae6781994f2b4121152a0f12b41c695cc23a1c709121c8e2950b421b8b9b5376f05a5b891aea6e76a0c9e9462395b8056046c0a7d8fe5fd9cb84a23995e1b09df98bcdf651bf382312490dbc7eb176229201c82a13b05ff9ab252900c4449627e61f37c17baee957b2466de1b781a224b732cd4353b6c00cbb0640c32419358f9ab4b9218a92854a519d815a3f65dfb9c992096145894b7d6e2eeedda54e06426bf36396f1b1e14f7cbad17acd38649086755646af5415072a331293311a0bf5dd562b3b832bbaa058a43b95047c341bb114eb98f906e5b23c90fe58d6d2eeec05b812816eadc790635a005b62dd725886e58cd916ad776f258d091cce9ba9af1deb506265c9486e81c9e7974e8fe70d5e60ecd1bcbce32fd77f6ed9380448b25f395e3c70e97344c4bc7700aa8150d54e8c7f641fe6c196361963a4d7cb3a9a738cdcabb2488e258d681e3e454b10bfb5c7fe6aca71b292e8e7b968eee2f55d8a88498c927e1fac271602a766aa71ff0025b230bb652e4c63cf6ba7a8979c26e6e582ab0a8f4f882869506bd57fe6f5fdbba42cb5dd05686ee58fca9aa9b70b118622f0c71280aa78d7e15dfc32d94683006d20d0f59d56e343f303ccdfbf82243055147d97249a002bb646374ce50000a5fa76a37773e4dd4a495b84b1ce9c5d47034e29928b02291de45bfbab9d2ee85ccd2398a681e36666269c5852a49dab802a13f32c03e5dd9cb986e606ab1a9d815fe386636650e6c03eb210549db29b6e32a57d3ef347bb256f679228948aa2c658b8f1041f848ff2b2bcbc43e965190eaf6ed1e374d2217691d122548eda03cbe140b40ce06cf403fcaf87f6b399c84199ae6e5c477337fc87b99a4f3edd2b5cbdcb3699726666000aadcdb7a640ad56aacff0f145cdce8a207215b3466f7bde9ffe3a307fc619bfe27166c1c74576c55fffd5f5049ff1d283fe30cdff00128b157817e7e683ab5f79ff004dbeb206448f4e863685509a9f5ee2a4b8741c68dd3fe6acd6eb734048464ce269e773f9225b9d4ad6d6e21292a45713428c12921568d4b3d09f84f2fe6ca639e3e1937fc4cec5a61aaead7b6efa5e85a859dc1bb9219190432d553772c682abf1a7ecff009399f832c7f2e65d1a8caf26c97dceadade9ced4927b62aac1be22b40fbb28a1fdacc0812793944da596d7b7371f98e6ebe296436b10f8419188fab20da9d73718fe90e1cb99641a0f9011bccccd796aff00a26e6268d432d4c52c9170370e4d14ac6fca6e3feae63917f0f57fa5f537c66024d2e887586d4ef7411e8476b74da7c71cd579ae45aa88d667936024987f7bf0fa6bfb3c733ff2b1386321f570789fe9fd4d11ce788df2b7b7d9f913cb1abf92743b1bf7586ef4ab5885f0ead09259e4a7ec991e56e3cbe25e39871d9b32804dbcabf30dbf2e74bd1f56d3341d21644904121d5a47792495ca09800ec7ecf1fb4abfccbf0e5a071736174c705b1b382de66b578277468d83728e302542c1786dcfe2ff0080ff00679562ca058b4e681910405593d75b49e296270fe991182a41341efdb7cc6811c5cdba52d9bb4b4896ea26bdb196dede225a6b88e01cd29b96f8881d7ed7f938c671268cb9a38bb974c2f758d5b54b3b2b69647b29658ae8569eab49248449b0a84707fe095972cd4e6c71a32eeff72d71340a9da7913cd9e9ccbe9223dc7c2c1f9b00a3a100d02ec33167da188f240243a6fc9ef325d4b048f7b6b02c49c69fbc6ad46ed4a01911da701c814145ff00ca9fd5dd228df5f8618e2fd98a027e21d5be26eb83f950740821a6fc938c3179bcc32bb31ab70845493f37c87f2a126abfd92882e7fcb3b4b1b36b44d76e7f7b32caf3247f12f0461c4056df916f8bfd5cbc6ae557e9bfeb33f08d7352ff0095456574bebdc6bb76dea752f17c54f7ab9cc79f699079061c25a8bf27f4d8588875cba8ea29511536f03c586d911daa7b91c25a7fc9c89cf25f3048682839a38201edfde64bf953c9784a1a7fcae9125674f30a19a5dd99848acdee58139747b4bc8a38176a5e42f345d7059756b7b9540a117d49140e2366a04fb54fdacb076a8ae451c054acff002dfced6b7b0b453fc0f222c8d15c9278161ca81a84ed821da302685ee9a29c268da80b5d626d345c7a905bc96766365a9378a8569ccf1789d1de0e3c97d3978f2fdd665e69881a27906c376585def95bce32ff00bd7657b30a53e22ce283e44e5035d03fc41ab84a9fe81f353c325bfd4efda1968248b8cbc580d8576f7c9fe723fce4514458f903ce0d14915be99710c3382b2876f495d4f50dc98572275d11fc4bc256cbf965e6a810afe8c97875291caa47ce81f2235d03fc49a2a11f94b5bb4b5be492c2ee112c482803d0913210071277cb23a889e525a292cfe5db9a30960ba00eec1849434f10c32632f9a374249a4475a348ea4766a7eaa64b8d36a56fa54f6b32cf6776d0ca86aaea3715dbc70ca57b109e27a0d9f9d6eee346b5d23d26835069f95f6a31ccc126846e23f45eaa8dc47f3f16fe5cc5fcae326e9bf1e69134f44ff9c5bd52f2e7f31355865bf92f205d32e1e1e7b2f1fadc01485214a77fe6e5fe4f1f8b2618440ec16677abb7d3f27fc74a0ff8c337fc4a2cb9ad13db157fffd6f5049ff1d283fe30cdff00128b15798fe6a4c91f986dc3452c87ea686b19551fdec9e3f2cd1f68c719c838bf9bfefa5fd1641e7d7664935bb0be4b09a4b5b78ae21b88ccea923994a14e26ac00ac7f16511c98063e13dffd24a1edb469a4d75357ba329912ab15b27111a25180150dcd8a87fb5cb07e7a31c7e1c47a6d8988bb4e6686c5c30b8b45922eadea82569efc9fdf2b1da32fe6c5971979e684a87f38b51582d44d1c11c821b78d1980091205e2a86bf08cde67c93184180b97a58479bd86d21d5a7430258b599b8528b27178d9598501a55cafc5fe4e538659e46a718c632f4cbf9deaf4b22f238fcbfe6bd3351bab18ae4585b317bb2bb49209e597e2a3854e29fc9fb59bdc30ca3008c8c78a3e8e287fa9c63fd2fe268e28f1727a579a27d77cbbf971089f50935194dc4725c5cce02c8f6fcf8d3e127bbf1f8be2e0b9810165ba45e452db1d4e1f28e8c213f563ea4d3489f6a44facbbc94e5e11c0917c58336618e06458f57a079b0dbeab61301a3347221492de604111bc52066fb27ab5387d9cd31d5891e4e44324811ba2b517b1bcd2e6863b29ade4b940209958b282c41a956af6cab164c7c57c1fe964d520793b50b4b5d4f4796ca78a681ae555279e12ac0a9239d035681f270c6232128e397fa65e02974169a4db5e3ea2c2582e6ddef2dd8c7c784b6ef72d244189eaa9f6e3ff0059bf672ed463e22470ca43eae7fc49e128e8f54d3660cd04c5f81e2f401883e06876cc09e2844ee27142b09a16fb12965a7c4405a8f9fc595d63fe92ab016840533311dcba549ede387861de55a7163f67eb14e3d8238fbe95c7c3877aa1d9f4a552ad791827a8a303f71187c11deb61a5b4b276052e223ee7e2fc31f0bcd361146d0103fd2235e5b9ad057e8c1e08ef4d8541a796dd248c8eedb9fe18f823bc2d852bbf2fbdd47e934b1aa9ebdcfe2a7251c75c8c5894be2f278b741135d2cea0ecaf5a807fcaf6fd9cb250beb14522e3f2e7a7224d6f3244f090cbc429208f0d97e2ff006586102083c514ec97cbe513696522db4ef1aa4b0fa08b23200d2ccb51b13551cbf97ed7c59950b971598faa2ca73e236d8f2e6ac07ef6eae2b5eb1ca08ebdc3015cc5f0bfa8c2dbfd09ac00c629c54ff32a827e6435323e08fe8ada97e8cf332821a67527a3c6e87ee5718f843cbfd32db71af9a61605cfd62bb10f103f82b30c07105055cb6bb716f2b3e9ebc20e32d548463c5c1a056ea72dc38b9eff00c2b6a11dedd3900da5cc43f9b8b11f7d32af08a2db961575ac909907fc5917227efae11192d20e5f2e695720b36991316ff8a117efdb25c7907592f0aed1bc93a1b6af0fa562b6570dcd05daab1f4c3a32b3842dc09553f0e6469b36433009dad3114411cd92fe44791edfcbbe7fd46e0dfc9a95d5de9111fac48a538ab4d1f24a7261d5573753f4cc4472a3feea2c448c8d97bc3ffc74a0ff008c337fc4a2c9a513db157fffd7f5049ff1d283fe30cdff00128b157997e68586b777e64b7fa95aac96e2d1035c3ccb1a86f565aaf1a339da9fb39a8d768679a6083c23fe92563b0f95b537a1b8bc82ddb6a882169cd3fd691e315ff9e79547b1e3fc452985bf94f4c5ff007aaeefaec93520c8b0a7cb8c02334ff659950ecfc51e8a9945a5f972ce307ea312a2efce650e76efca52c7323c3c7017518adbc67c9faa5b597e796bd7720e5152ed51529fb45294ed4a64b519e38f1891e4c62f50bef3afab1bc0907d5d250c8d2f305954a9abd6aa053303076a5e688036e2feb227c8be76b1d57584f37c33d95ddc4f6b3de0821b7ba776531b371a942400c17ecff26749acd41f0e44d7d2e3e31bb36fcc8d5fcd37faf3e89737b1cfa6416cd7165c512206381033a10bf69e32ac9fec728d3e9c7871feab3390da55f96f737316a324f272996d2de58ada314eb34c08515ff28b7fc166a7b5bd2047cdba02c5bd29d9cd934051d418c81402a0d3a9dcf7cd08ef6425bda1aca6296cd035c977b790c6642b4a8a0715e20d2aaeb96ea3178732014ce5baafee0962c50034af2422bee6a06562721d58f11526b7d3aa1dd615a9d9bd3240fc3be26523d4af114447169a89449238c13528a38d69b7d9ef90942fa95b5396e745894faf750464ed47655ad3c436118c9e56b61b89fcbacca16f2d59fb00f17cea77c3e0cba82bb2bb697a64e84ab238a56a8d1814fa0e11b2d206e341b131b7a6c20ad7e25214efeea69844ca0a8c3a3451a34664136db33f22df7a15c9788aa6fa2f38c51025589aac92b023e4477c0322aa2e8e547c3ea1703aaa8fe34c1c7e4aac96b7955fef02ff0094013f81c7629b5fe86a0afcd24007ed2f1a7b78e15b6bd2d45e8bebca8ddcd2a3f5b62295ab84bf8b4f955e62c5e5b74466a9218ca1abb91fc9995a7e533fd156a31aa8357998edb2f0603ef476cc7b0adacfadab502864a7da25ebf772c7655eda8eb2bd628d40e84b56bf45706caa4757d5436f1c6ca47ec549fd670eddeaa8bacdc88f94d6aea7d830fd780856975b0c7fb820f4dd80fd78f0ab86afc8ff00bcc1a9d4ab027f860e15b5e754878f26b793fd88070f0a6d56d35ab68eea19b83811c8adc4a83500d48a7be4b1931903dc516cc3f2b2547f35dcfa501483f47b2a39047d8b85a29a8ecaeb9bd86719320204a3e997d5fd29a23121ea4fff001d283fe30cdff128b32d289ed8abffd0f5049ff1d283fe30cdff00128b15627e730c7558a8a0fee1772694f8df2255815ff9c6c2dcba440cacbb093711d7e8f88e6ab3f6a4206a2388ff00b15499fce1aacee3d161146d4a5050fd258f2cc03da39a7c88805424f7725c7ef2799a57eedceb523e9db30a7c47727890f3dd16748ff3435d90f6338503c79a8cdf76a1ad3c7df14066eccb2db4d00ab7acaea1501e4c48238a9f16cd1e904a59635fce8acb9179bf956d6e1fce7610caa3d480cb733a83555241e24115af5f873aeed49f0e197f4bd3fe99ab18dd907e815d5fcf9aedb5bd7843f598adaad40259cfa63fd8f2e59959b51e10c51fe798c3fd8b5c45da33f2f2d956dee39948e449897ad09e4a855450783166cd3f6f6d28fb9bb09d997b4b12a82f2a576345524f89eb9cff0015b625fa7c26defaf659ae8482e4432c6889c578229881dd8fc744557ff5733b57bc607be0ca52079260de901f14ec68410bbd413d2bb9cc13162b3d6b41cb94d21045680d083d6bedb60e216ab81b27fde5256e5d17916ef4a8a8ef92b0aa17316993d629ed9a607e23cd15c5078ef4eb84640114866d17cbd2208c68f108d0d580893af8ed960d44bbcad22ad6cf4cb663259e9b1424d393a22a1207c8e094cc86e944adc92c57eac815abc4b10771b9c883e486a59ae084348d536038b753daa401d0e1dd2be39ef1528ec838edd59bdba6c31123d556b34edf12caa0f435da9f3ae25548cf7118ab4a48242815402bdfb60ba56bd6998ff784ff0030e5faa94c78bcd5c92dd07353407a1a554fdf82d2dddddc86caa68ccb756a2a29404b9af6ccbd37d33fea2554dcccdc47a9c875a0515cc4b42265b5ba8ec63bf776104eef1a1d87c71d095e9f6a87fd9664474d396339072ff64b68462805192476ebfb54a663d77aac0f1bd4ac60549d9850edb6ddbb64b642f4325680053427e200500fc70809683161574037ee2a29f70c368532b6c694546a1df6a9afcf0daa9b2431d78a28535076e9f763c4aa71d239035bc65597ac8a0d457bd70c6441b090699efe524b3bf99ae9659647a59b92aed51532c5bd3367a1cb294c83dcc8cc97aac9ff001d283fe30cdff138b36cc5138abfffd1f5049ff1d283fe30cdff00128b15603f9bb71e869b3103e29618e2e5d36691abefd330b5f3e1c455e3323d61556552187256d8d41db39b9008548e6e1f0d0229a57a120f89df070d8b56e59eaff1719546c8a2b4f9eddf22363b95611a24889f98de6173f655ee054ef4fdf28f7ce83b585e188f34066c35516bea5d54ff00a3a348b5ad0955277dba669341633c3faeb3e45e69f977a91ff95976ff00583c4dd724e12720ca490dc5969c98d3e1fb3f1675bda188e48088fe7c1ab1ecc9743d46de2b9d7b52f5592737123a920fc414b3afc355ee729ed494bc7c407f3bfdf2318f4946f936f6dfea77109755916e58920fc3f1805687f686d985ed042432c4ff000f0b2c3c9908337d6128aac92f7150411e3b0ec3342234dab6f5a7125b1b7884a81658667505b89aa3a0a11df94999d908969a07f9b2943fdf281cd4e395c23908e240549431f0a54ef4e55f7f8b35f2f20aabf5a9a32814d54d437a816a6a3b6e36a6480ae8ae324cff000c952877e0a154d0741518936ab584c1c7ee9e3e278920ec0edbf5c110a8a8a5918aba86069df6dbb9d85699680557c72c615855b91f8b88a93b9ef4a61e15b5f198431765766d95431f11b9eb86202aee4f5ac61b835579006829f3db1e142d69ed284caff677eb42491b61e1055b59f4f6219cd09a014f8ab5f9d76c14adc7796a247a2728e868005e551ec06c7fd961a002b435088a398e162f1a9695410ccbdfa74ae4847b9970a2b4bb886f612f20eb4601579d108d9b95388aff002fdacc98696f9b68c27abb5089a5b7923b75559ade586e14cbba32a86a730a46c4b665e3c108823f9c1978483bbbeb8b565460b7170c5808e1014fc22bb2b3723944b443a160712733dfc2fe49b566942535568d6bd6ad0540a7d197e2818e0902c0c4849bd57720a4a2adb1aefd477a9cd3d3171374371282686854576fa310ab58b0705cee01a725c2ad02b4e1526836dea3bf85724ae8d6107e0ddff50efe1880ad99101ebbd2a280024e1aa42c6b95d852a7a506e7a7b530a59afe4f5c07f345d4750596c5c91504d3d68876ccfecfbe33eeff007d1487ae49ff001d283fe30cdff138b374a89c55ffd2f5049ff1d283fe30cdff00128b1578ff00e7cea502df5969bc7f7d3c48eeff001502891c28257df966abb4b2d011ef57934f2ccee2242028d8104eebf3ae68a45422a348d47a4bf6796fe9ec29d46fdcff00c1642e90af015e4a011180caa80827e64814db23490c3748ac9f981e61f4cd07a97146ed4130ed515ce93b54d638fbd8c593c922cb04b138630b868d914716e0c3e21b50f16e5fb39a3c729c24240ef14d5a16db48d26cefedef6d74f4d3a7b7a4914b1963c6643c83d0b3966aff00ab99a7b4b29909150004a24fcbeb861ea5beaf307981320648e4353d6adf0d397fad967f299c878a405ffa5620572525f20f98d24325a6b088cbc5842a8c895a9d989241a0cb751dad0ca471c5631a1b220f937ce12034d51259455c906553cbd88a0ed94c75787f9a9dd083cbdf9896d388e0d459f891422e0f10c7a03ccd09ff0082c90d5e12288dbf9a9b354ac6cff32f4f9bd46bb170dc4c854ca9254034dc353c7071e9bb98eed49aff00e63470191acd648811c87d5d181aedd8f2c90c7a7e40ad94acf9abce762d4b8b7f4d937a3c05481eec029ef967e5b11e4bc45131fe6779983032471915e9c1d3e8eb80e871f795e2298597e6a7a429776ce1cf5910ab54104746e072b3a0df62bc48f8bf337420c4319a86bb7a600a7fc136567433e8bc4112bf995e5c30b2fa92a54d0aa4752074a866db11a39af10568bf307cad22b2c976e85a810b23569efc4532274b93b92085ff00e35f28dc0ff8e82a90db55192bb77e4b4c8fe5b20e8b611b6dac6937ac12deea19a46af120d4ad766f96573c72037090984304ed0810295e3f6da83afe3ff1be560da57c5148a4bc04445c802a7627c761e2312a888aea768c89fe3b62557d35048a035a903270cd21d5989c90f716919f8feb722f5aa73247c756d977dffe35f872f8eae4cfc52837d3a49e18de0778ee630de93c80d2a790e678712a6adf6b2d86b77dc2f8aaf7ebaadcf9624d096f230af3a4b6731476646113445483f6b7f8bed7fadf0e5b1d6c40a23663295a0a4b7d5163431b58a49081493d062c481b9e2afb0cc13285f26054da3d40b7231d91de80c7eaa93f35e9ff000dc721c71f34155823bd9650a6185c2f508b2835eedcaa06d8f103dec695a40d1fc25016dc85e4d4a1dbad4e0dd2b404047aa49e23e0009dcf42295031a50b02c6c8cf196627ed9e4e00f11d7b649564ff00a2618d9aeae4c24296e3ea354f1ee77e9938d94b32fc86b9b09fcdf7c6ca59648869ee5b90fddd4cf15083403966c3450909591d1407b949ff001d283fe30cdff128b36ca89c55ffd3f5049ff1d283fe30cdff00128b157877e7d953e6cb21210156c632b526a4b4d3568075fb39a0ed6de607f455e672001e31c987f3d176e940a093d7fe239aa35485786540511502295fddc7cc97a83bf2e3d2b8251dacaa2ccb6deb4443f221c16352106f41df7c61669205b0cf2dcc62f3af98a8c010d72016e9fdf6743dac6b1c7facc63c9994112b7268c96969fccc16a401c89a5734223dea888034703c6cbfb996a5e8dc431f607c3fe1b2679514a10faaaeae050c684ad178fc07c49e9b0fd9c1606caab0cb3132431a30a8e65e84d48ed5e9ff000390e0b09a5ce5c948914f23f114e22bb518771d3044514ae8edd559782324656aca452adf203ad4e127743ae55a5ab07ac6454f2d87c0294ea30814a510924aa811e91c6c6a14292d523c00a74ff88e36ab59ab6ee96f1f3d81624f1a86af6606a708552f4dcc89c2d5500a1f59f7f8812282bf0d77c36555268ad6e814b8b48a46938a86645a93b034aad724252ef28589a2e9a0a45fa3200c29f0889001ee790e59678933d4ad21cf96b4396e0a1d3e1e6c6ac7828ad476a530f8d303ea28e15c9e50f2f3cc0ad840687882cbb8d855b88daa300cd3ef29e10984565120448608fd22df0295534aec0d40e382a47aa400aa2dec603c02a06908f50fc2a3a6e78fdaebcbed61b3d555a19e362f021789623491c6c08a53624531215b170cea59416df88049e9d0529bff00d73913cd6d4c5dbc64d48a1dd77ff26be3da98296d4a4b99b9072a183d1d054568db0ef5dce1add6d55a5bd2ec63644a1343fcabd7e2c8ef69b53f5591b8bc8d45dcf11d491bfb61a2c6d631499a3a46caa2a7929a120545492a49c262ab0d22e4a6421943160adb115a1ed4ef8404aff5f4f4e48ce58814a167f8bbf1dc7be2014f0a56facd8962b0c6f24dcbd38adede33333313f0d38d6b97434f291a017813cd3fcafe72bd3149fa2dada020a869fd385c0a7dae058b0e44e648d0cd408f546d97e516a7723fdceeb2f144e18496564a0035ff008b5b96ff00eaae66434711cd0c834ffcb2f2369d319fea1f5d9f8aa7a978deb1010003e1345edfcb9911c718f20b4cf7ca4d18d4648d15511603c55450001d05001968564eff00f1d283fe30cdff00128b26a89c55ffd4f5049ff1d283fe30cdff00128b157837fce403f0f3a5910ca0fe8e8f9726a507af36e00ab6683b5637907f57fe295e71f5e9284a4a19c37140a360dd0934dce6b04290bd2e7d5e065902464fc6145431dfab53e206983877a54ced2cade6866b8bae50e9d6c39dc5c4919740ab56af1aaaa85a7da6ff0053ed371cc9d0e9bc599e13f4abcbed3ccb63a7f9ab54bbb71f5db5bc9df84c54c64249296e411ff6a87f6b3a4d5e97c5855f09621e9ced3237a5eac6c29f00464641ca94dc13bffc2e7339716486d2890c83beae91801a590d17e2a91cbe335dff00d6072a913cd69a536e844c54c8f41c39bd4906be07e1ff0081c22f956c9a5ea2e820b89087001049723913d450d5856bfe7cb08a55f58480ad5576d9155b930a501a2ee472fb3feae20850d859a3e41abebb900a87663c6b4ea400361fb386412a81d4a95f4dbe16a5797d9e9bd77c110a1b786060aeab23ba0eaa79023a1ad4fbf2c318da147d26491e38a19518d259279240aa9b5283a12bb7f9ae4c81cca156da4b696326252e55a8a81aa4bec3e95a602292888a188cd1b4a920727d35e4e0040bbf8d77c4725b5e5d0825635e319f503962e58548eb92bd90b60b9823e6d1a23228078a0e4cacc7626bbe0e214ad0b9e65b8b50851c81ef4a5683a537c5563b5cb28442be9015dea371bfd9af4c0090a0d2d8ac080ccdc798525d5411f09dfec8ebfe4f2fd9c2644aa29dfd3b7668d7d26d8805b857b53957ad30004a5a6b85a0327046527a1e9b6e724421462847355e25d1e808342154d482ddb010516e9ad9848259018db896043151f0ee28281686b9288ef640a9cb35ba224cf3a7af2eee395154b6c79d40fb34ff0057fcac2405a43dfeaca67105908e5964feecf2e4189d883b6f4fe5cb2388cb765c0dadaf9cafa586d6c74f6924f851a428f6eaac46ce4b851c0532fc3a4323ba08a65e9f94bad4f6b0ade6af0dac88793adbac92ee4824737295e9fc99943400278b6e4c9f4afcbbf2969ceb29b77bc9900a35dbfaaa1a942c10fc353fecb32618211e411653c4b1d3e121adede18997ec948d148edb1032de10adbbb0effc724aa2d2ef5ad705aa8492ae1426be4d70dabcd4dbf70dff00134c42595bff00c7460ff8c337fc4a2c9a1158abffd5f5049ff1d283fe30cdff00128b15796fe6c7e557993ce1e618b50d36ead20b58eca3b668ee1a4572e92c9213f04527c3491735faad34b24811dcac561ff9c7af392f22f7da7b5482a3d59e800f9c1d7304f65e4e862a8db3fc84f310be8a5bcb8b068a36a9f4e49799524720098471f87ece01d959395c590a671ae7e5ec97ba1cba1c363632e9b32f0920966962f841a8de38ddba8cdce3c4202a2384312f26baff009c56d55a7e76716976c01aaf2bbbd9cd3fe7a45c7fe1732232a6062574ff00f38edf9a303a49a56a5a441283f1334b714a5294e22d9972ad4c0658f0cb92c6349c69ff00925f990d6e1754bad21ee450196196e08600ed5536ebc78ff939a89f656fe93fe999da322fc8bf32a44ead3d89918d4112cb4f7049818d321fc9b93be2aa43f21bcd6fbcb796209e5f62496809e94e5030d8fb613d9992f9850aa9f919e6d57f50dfd8b481aa1899361dc01e8fc35c07b33272f4aa222fc99f37c618adce9e095e283d49c8143b31fdd6e70ff264fbc2b49f927e68f40c46f2c909249911a5249fe6a345d77c4767641fcdff00648506fc96f3b84f4a2b9d33d35002564b80dd4f2a9109ebd7fd6c97f274c9e615727e49f9b84659ae34e699f629ea4fc00de946f46bb7fab8ff002764be612b53f243ce10c61219b4b40afcc057b85e5ece4455389ecfca4f38a8544fc94f399e465beb275614f4bd59a95eb527d1a9df232ecdc9d0c55645f923e6dab34f7b672124f14596755029d36871fe4d9ff455147f253cc2aa04371643e0e0dc9e5dc0ff009e541b7f938ff26e4ef0aa769f929e698a58da4bbb3648d48e025980248a0040846c3243b367fd14529bfe4a79c00a417d67102fc9a934e49141f09e50b77fe5e3847674faf0ad2262fc9ff387d5fd37bcb10fb8e4b24db827bfee4576c07b3b27785a5a7f25fcd2d50f7364d4af026498f535e863db11d9d3ef0b4b1ff277cecae0c573a6ec4b234924eec095a1eb0d08ae4bf93e7de13482b8fc98fcc533b3c175a5046d856499766a02580b63c8d0773921a095515d92f1ff0038fdf9873de1babbd62c4f0f862804933a50904924c09ff03c1bfd6cb468a85048a643a57fce3ae94d09975f95aeef9d8b4a21b8912022b5144e0b97434a00dd264cb3cb7f953a0796cb368f630c12b92cf33c92cb2127bf29391cbc4698a7cda1df36dcd29feb37f4c3452a4de5dbeecf17dedff34e3c2516b1bcb7a91e9245f7b7fcd3828a6d61f2cea5fefc8bef6ff9a71e12b6b7fc2da97fbf21ff00826ff9a71e12b6b5bcaba99fdb83ef7ff9a71e12aa2de4dd4986d243ff0004ff00f34e1e1422bcbbe5fd5b4ed4e5b8b9680dbb4263511b3b3f22ca6a792280bf0ff95840294fdffe3a307fc619bfe27164908aaed8abffd6f4eddc771ebc53c4e89c15d1b9a961472a7b32ff002e2a95ddeb9a842c445e94d4ebfbb651f47ef1b1549ae3cefe6288fc3a6c6fff00063f89c34a8393f31bcca9ff004a743fec9f1a5526fccdf328ff00a52a7fc13e34ab0fe69798c75d153fe09b1a5587f35bcc43fe94a9ff0006d8d2b5ff002b5bcc1ff5644ff826fe98ab5ff2b67cc1ff005654ff00827fe98abbfe56cebfff005654ff00827fe98d2bbfe56cf983feaca9ff0004dfd31a577fcad8f307fd5993fe09f1a56ffe56bf983feacabff04f8d2b87e6c6bfdf4651fec9f1a55dff002b5f5eff00ab3afded8d2bbfe56bebbff5675fbdb1a56ffe56b6b9ff005675fbdb1a56ff00e56b6b7ff5685fbdb1a577fcad5d6ffeacebf7b634adff00cad5d6ff00ead0bf7b634aeff95a9adffd5a17ef6c695aff0095abadff00d5a17ef6c695bff95a9adffd5a17ef6c695dff002b535bff00ab42fded8d2ac3f9afadd7fe390bf7be2aeff95afadffd5a17ef6c695dff002b5f5bff00ab42fded8d2b63f35b5bff00ab42fded8d2b63f3575bff00ab42fded8d2b63f34b5c3ff4a85fbdbfae34ab87e67ebc761a42fdedfd71a55e3f32f5f3ff004a85ff0086feb8d2aa2fe62f981bfe952bff000dfd71a5574f3e7985c81fa2d47fc17f5c695196fe6cd765601aca34f7218ffc6d8d2a6f69a9ea139a48f0c24fd9ac6e7fe3718151b0c1766e9669e48d8223228442bf6ca9eeeffcb8aa33b62aff00ffd7f534b189168715427e8e8f7e943855c74d84f500fdd8aad3a4c07aa8fb862ad7e87b4ee8bf70c55afd09675feed7ee18ab4742b13feeb5fb862ad7e80b0ff7d2fdc31577e80b0ff7d2fdc3156bfc3fa7ff00bed71b577f87f4eef12fdc3156ff00c3fa70ff00752fdc31b577e80d3ffdf4bf70c6d5dfa034ff00f7d2fdc31577e80d3ffdf4bf70c55dfa034fff007d2fdc302b7fa034eff7d2fdc31577e80d3bfdf6bf70c2aefd03a7ff00be97ee1815afd0561fefa5fb862adfe81b0ff7d2fdc31577e81b0ff7d2fdc3156ff4169ffefa5fb862aefd05a7ff00be97ee18aad3e5fd3ebfddae2ad7f87b4eff007dafdc30ab7fe1fd3bfdf4bf70c6d5dfa034ff00f7d2fdc3156ff40d803b46bf70c0adfe83b1ff007dafdc30dab6345b11d235fb862ab868f67fefb1f70c55b1a5da8fd81f70c55bfd1b00e8a3ee18aae16110e8062871b14c52898d78803c302aec55ffd9, 'image/jpeg'); +INSERT INTO `service_spaces` (`id`, `name`, `url_name`, `imagedata`, `imagemime`) VALUES +(8, 'Engineering Garage', NULL, NULL, NULL); -- -------------------------------------------------------- @@ -3165,23 +3175,25 @@ CREATE TABLE `space_hours` ( CREATE TABLE `studio_spaces` ( `id` int(11) NOT NULL, - `name` varchar(255) DEFAULT NULL + `name` varchar(255) DEFAULT NULL, + `service_space_id` int(11) DEFAULT 1 ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci; -- -- Dumping data for table `studio_spaces` -- -INSERT INTO `studio_spaces` (`id`, `name`) VALUES -(1, 'Woodshop'), -(2, 'Metalshop'), -(4, 'Digital Fabrication'), -(5, 'Textiles'), -(6, 'Ceramics'), -(7, 'Prototyping'), -(8, 'Art Studio'), -(9, 'Classroom'), -(10, 'General Work Area'); +INSERT INTO `studio_spaces` (`id`, `name`, `service_space_id`) VALUES +(1, 'Woodshop', 1), +(2, 'Metalshop', 1), +(4, 'Digital Fabrication', 1), +(5, 'Textiles', 1), +(6, 'Ceramics', 1), +(7, 'Prototyping', 1), +(8, 'Art Studio', 1), +(9, 'Classroom', 1), +(10, 'General Work Area', 1), +(11, 'Engineering Garage', 8); -- -------------------------------------------------------- @@ -3209,6 +3221,7 @@ CREATE TABLE `users` ( `is_trainer` int(11) DEFAULT 0, `imagedata` longblob DEFAULT NULL, `imagemime` varchar(255) DEFAULT NULL, + `active` tinyint(1) DEFAULT 0, `expiration_date` datetime DEFAULT NULL, `general_email_status` tinyint(1) DEFAULT 1, `promotional_email_status` tinyint(1) DEFAULT 1, diff --git a/data/updates/0006_engineering_garage.sql b/data/updates/0006_engineering_garage.sql new file mode 100644 index 00000000..a7f34781 --- /dev/null +++ b/data/updates/0006_engineering_garage.sql @@ -0,0 +1,21 @@ +INSERT INTO `service_spaces` (`id`, `name`, `url_name`, `imagedata`, `imagemime`) VALUES +(8, 'Engineering Garage', NULL, NULL, NULL); + +ALTER TABLE `preset_events` ADD COLUMN `service_space_id` int(11) DEFAULT 1; +ALTER TABLE `preset_emails` ADD COLUMN `service_space_id` int(11) DEFAULT 1; +ALTER TABLE `studio_spaces` ADD COLUMN `service_space_id` int(11) DEFAULT 1; + +INSERT INTO `studio_spaces` (`name`, `service_space_id`) VALUES +('Engineering Garage', 8); + +INSERT INTO `event_types` (`id`, `description`, `service_space_id`) VALUES +(12, 'New Membership Orientation', 8); + +INSERT INTO `event_types` (`id`, `description`, `service_space_id`) VALUES +(13, 'Machine Training', 8); + +INSERT INTO `event_types` (`id`, `description`, `service_space_id`) VALUES +(14, 'General Workshop', 8); + +ALTER TABLE `users` ADD COLUMN `active` tinyint(1) DEFAULT 0; +UPDATE `users` SET `active` = 1; diff --git a/deploy.rb b/deploy.rb deleted file mode 100644 index 2718cecc..00000000 --- a/deploy.rb +++ /dev/null @@ -1,45 +0,0 @@ -pid_file = '/var/www/html/innovationstudio-manager.unl.edu/innovationstudio-manager.pid' - -def get_exit - $?.exitstatus -end - -pid = (File.read pid_file).to_i - -puts 'Starting new unicorn' -puts "Sending USR2 to #{pid}" -# send USR2 to master unicorn process; this will spawn a new unicorn master -Process.kill('USR2', pid) - -puts 'Waiting for new unicorn to spawn' -sleep 3 -new_pid = (File.read pid_file).to_i - -puts 'Gracefully stopping old workers' -puts "Sending WINCH to #{pid}" -# send WINCH to old master process. this gracefully stops workers -Process.kill('WINCH', pid) - -# decide if things are going well. -puts 'Did it.' -puts 'Check on the website. Are new things enabled and everything looking good?' -puts '(Y) for yes, anything else for no' - -response = STDIN.gets - -if response.capitalize[0] == 'Y' - # if so, send QUIT to old master. It shuts down, and finished. - puts "Sending QUIT to old master at #{pid}" - Process.kill('QUIT', pid) - puts 'QUIT sent' - puts 'We should be good! Nice job.' - puts 'New code deployed' -else - # if not, send HUP to old master to reload and restart workers. - # then send QUIT to new master to stop it and workers. - puts "Dang. Sending HUP to old master at #{pid} to restart workers." - Process.kill('HUP', pid) - puts "Sending QUIT to new master at #{new_pid} to shut that all down." - Process.kill('QUIT', new_pid) - puts 'job is done. Better luck next time!' -end diff --git a/models/alert.rb b/models/alert.rb index f298cbbf..de2cd561 100644 --- a/models/alert.rb +++ b/models/alert.rb @@ -9,14 +9,22 @@ class Alert < ActiveRecord::Base ALERT_CATEGORY_DIGITAL_FABRICATION_ALERTS = 4 ALERT_CATEGORY_ART_ALERTS = 5 - def self.category_options - { - ALERT_CATEGORY_GENERAL_ALERTS => 'General Alerts', - ALERT_CATEGORY_WOODSHOP_ALERTS => 'Woodshop Alerts', - ALERT_CATEGORY_METALSHOP_ALERTS => 'Metalshop Alerts', - ALERT_CATEGORY_DIGITAL_FABRICATION_ALERTS => 'Digital Fabrication Alerts', - ALERT_CATEGORY_ART_ALERTS => 'Art Alerts', - } + ALERT_CATEGORY_ENGINEERING_GENERAL_ALERTS = 6 + + def self.category_options + if SS_ID == 1 + { + ALERT_CATEGORY_GENERAL_ALERTS => 'General Alerts', + ALERT_CATEGORY_WOODSHOP_ALERTS => 'Woodshop Alerts', + ALERT_CATEGORY_METALSHOP_ALERTS => 'Metalshop Alerts', + ALERT_CATEGORY_DIGITAL_FABRICATION_ALERTS => 'Digital Fabrication Alerts', + ALERT_CATEGORY_ART_ALERTS => 'Art Alerts', + } + elsif SS_ID == 8 + { + ALERT_CATEGORY_ENGINEERING_GENERAL_ALERTS => 'General Alerts', + } + end end def self.valid_category_id?(category_id) diff --git a/models/event.rb b/models/event.rb index 4f39b2df..d74eac1c 100644 --- a/models/event.rb +++ b/models/event.rb @@ -9,6 +9,7 @@ class Event < ActiveRecord::Base alias_method :type, :event_type alias_method :signups, :event_signups + # Serivce Space ID 1 EVENT_TYPE_ID_NEW_MEMBER_ORIENTATION = 1 EVENT_TYPE_ID_MACHINE_TRAINING = 2 EVENT_TYPE_ID_ADV_SKILL_BASED_WORKSHOP = 3 @@ -19,17 +20,31 @@ class Event < ActiveRecord::Base EVENT_TYPE_ID_TOUR = 8 EVENT_TYPE_HRC_TRAINING = 11 + # Serivce Space ID 8 + EVENT_TYPE_ID_ENGINEERING_NEW_MEMBER_ORIENTATION = 12 + EVENT_TYPE_ID_ENGINEERING_MACHINE_TRAINING = 13 + EVENT_TYPE_ID_ENGINEERING_GENERAL_WORKSHOP = 14 + def self.type_options - { - EVENT_TYPE_ID_NEW_MEMBER_ORIENTATION => 'New Member Orientation', - EVENT_TYPE_ID_MACHINE_TRAINING => 'Machine Training', - EVENT_TYPE_ID_ADV_SKILL_BASED_WORKSHOP => 'Advanced Skill-Based Workshop', - EVENT_TYPE_ID_CREATION_WORKSHOP => 'Creation Workshop', - EVENT_TYPE_ID_GENERAL_WORKSHOP => 'General Workshop', - EVENT_TYPE_ID_FREE_EVENT => 'Free Event', - EVENT_TYPE_ID_RSVP_ONLY_EVENT => 'RSVP Only Event', - EVENT_TYPE_HRC_TRAINING => 'HRC Training', - } + # These correspond with event_types table + if SS_ID == 1 + { + EVENT_TYPE_ID_NEW_MEMBER_ORIENTATION => 'New Member Orientation', + EVENT_TYPE_ID_MACHINE_TRAINING => 'Machine Training', + EVENT_TYPE_ID_ADV_SKILL_BASED_WORKSHOP => 'Advanced Skill-Based Workshop', + EVENT_TYPE_ID_CREATION_WORKSHOP => 'Creation Workshop', + EVENT_TYPE_ID_GENERAL_WORKSHOP => 'General Workshop', + EVENT_TYPE_ID_FREE_EVENT => 'Free Event', + EVENT_TYPE_ID_RSVP_ONLY_EVENT => 'RSVP Only Event', + EVENT_TYPE_HRC_TRAINING => 'HRC Training', + } + elsif SS_ID == 8 + { + EVENT_TYPE_ID_ENGINEERING_NEW_MEMBER_ORIENTATION => 'New Member Orientation', + EVENT_TYPE_ID_ENGINEERING_MACHINE_TRAINING => 'Machine Training', + EVENT_TYPE_ID_ENGINEERING_GENERAL_WORKSHOP => 'General Workshop', + } + end end EVENT_TYPES_NOT_ALLOWED_FOR_SIGNUP = [] @@ -144,6 +159,6 @@ def hrc_training? end def machine_training_event_type? - self.type.id == EVENT_TYPE_ID_MACHINE_TRAINING + self.type.id == EVENT_TYPE_ID_MACHINE_TRAINING || self.type.id == EVENT_TYPE_ID_ENGINEERING_MACHINE_TRAINING end end \ No newline at end of file diff --git a/models/resource.rb b/models/resource.rb index 2d19aa33..8f7d9eba 100644 --- a/models/resource.rb +++ b/models/resource.rb @@ -17,6 +17,7 @@ class Resource < ActiveRecord::Base has_many :resource_field_datas, dependent: :destroy alias_method :approvers, :resource_approvers + # For sercice space 1 CATEGORY_ART_STUDIO = 1 CATEGORY_GENERAL = 2 CATEGORY_METAL_SHOP = 3 @@ -24,7 +25,11 @@ class Resource < ActiveRecord::Base CATEGORY_TEXTILES = 5 CATEGORY_WOOD_SHOP = 6 + # For service space 8 + CATEGORY_GARAGE = 7 + def self.category_options + if SS_ID == 1 { CATEGORY_ART_STUDIO => 'Art Studio', CATEGORY_GENERAL => 'General', @@ -33,6 +38,11 @@ def self.category_options CATEGORY_TEXTILES => 'Textiles', CATEGORY_WOOD_SHOP => 'Wood Shop', } + elsif SS_ID == 8 + { + CATEGORY_GARAGE => 'Engineering Garage', + } + end end def self.valid_category_id?(category_id) diff --git a/models/user.rb b/models/user.rb index 074cbba8..bd5836b5 100644 --- a/models/user.rb +++ b/models/user.rb @@ -82,6 +82,14 @@ def password=(new_password) self.password_hash = @password end + def is_expired + self.get_expiration_date.nil? || self.get_expiration_date < Date.today + end + + def is_active + self.active + end + def get_expiration_date expiration_date end @@ -100,6 +108,12 @@ def set_expiration_date(exp) self.save end + def set_active(state) + self.active = state ? true : false + self.save + end + + def date_of_birth date_of_birth end @@ -146,19 +160,16 @@ def remove_trainer_status def send_membership_expiring_email if self.email && !self.email.empty? + @user = self -body = <Hello, #{self.full_name.rstrip}. Your Innovation Studio account is expiring soon! Our records show that your account expires on -#{self.expiration_date.strftime('%m-%d-%Y')}. -Please visit us to keep your membership active. -

- -

We hope to see you soon!

- -

Nebraska Innovation Studio

-EMAIL + template_path = "#{ROOT}/views/innovationstudio/email_templates/expiring_email.erb" + if SS_ID == 8 + template_path = "#{ROOT}/views/engineering_garage/email_templates/expiring_email.erb" + end + template = File.read(template_path) + body = ERB.new(template).result(binding) - Emailer.mail(self.email, 'Nebraska Innovation Studio Membership Expiring', body) + Emailer.mail(self.email, "#{CONFIG['app']['title']} Membership Expiring", body) end end @@ -166,170 +177,199 @@ def send_reset_password_email token = '' begin token = String.token - end while User.find_by(:reset_password_token => token) != nil + end while User.find_by(:reset_password_token => token, :service_space_id => SS_ID) != nil self.reset_password_token = token self.reset_password_expiry = Time.now + 1.day self.save -body = <We received a request to reset your Innovation Studio Manager password. Please click the link below to reset your password.

- -

http://#{ENV['RACK_ENV'] == 'development' ? 'localhost:9393' : 'innovationstudio-manager.unl.edu'}/reset_password/#{token}/

- -

This link will only be active for 24 hours. If you did not request to reset your password, you may safely disregard this email.

- -

Nebraska Innovation Studio

-EMAIL + @token = token + if self.email && !self.email.empty? + template_path = "#{ROOT}/views/innovationstudio/email_templates/password_email.erb" + if SS_ID == 8 + template_path = "#{ROOT}/views/engineering_garage/email_templates/password_email.erb" + end + template = File.read(template_path) + body = ERB.new(template).result(binding) - Emailer.mail(self.email, 'Nebraska Innovation Studio Password Reset', body) + Emailer.mail(self.email, "#{CONFIG['app']['title']} Password Reset", body) + end end def notify_trainer_of_new_event(event) -body = <Hi, #{self.full_name.rstrip}. You have been assigned as a trainer for #{event.title}. Don't forget that this event is

- -

#{event.start_time.in_time_zone.strftime('%A, %B %d at %l:%M %P')}.

- -

Please visit your home page to confirm your assignment.

+ if self.email && !self.email.empty? + @user = self + @event = event -

Nebraska Innovation Studio

-EMAIL + template_path = "#{ROOT}/views/innovationstudio/email_templates/new_event_email.erb" + if SS_ID == 8 + template_path = "#{ROOT}/views/engineering_garage/email_templates/new_event_email.erb" + end + template = File.read(template_path) + body = ERB.new(template).result(binding) - Emailer.mail(self.email, "Nebraska Innovation Studio - Assigned as Trainer for #{event.title}", body) + Emailer.mail(self.email, "#{CONFIG['app']['title']} - Assigned as Trainer for #{event.title}", body) + end end def notify_trainer_of_modified_event(event) -body = <Hi, #{self.full_name.rstrip}. You are receiving this email because an event you are training has been modified:

- -

#{event.title}

- -

You can see the event details on your home page.

- + if self.email && !self.email.empty? + @user = self + @event = event -

Nebraska Innovation Studio

-EMAIL + template_path = "#{ROOT}/views/innovationstudio/email_templates/modified_event_email.erb" + if SS_ID == 8 + template_path = "#{ROOT}/views/engineering_garage/email_templates/modified_event_email.erb" + end + template = File.read(template_path) + body = ERB.new(template).result(binding) - Emailer.mail(self.email, "Nebraska Innovation Studio - Event Modified: #{event.title}", body) + Emailer.mail(self.email, "#{CONFIG['app']['title']} - Event Modified: #{event.title}", body) + end end def notify_trainer_of_removal_from_event(event) -body = <Hi, #{self.full_name.rstrip}. You are receiving this email because you are no longer a trainer for the following event:

- -

#{event.title}

+ if self.email && !self.email.empty? + @user = self + @event = event -

Nebraska Innovation Studio

-EMAIL + template_path = "#{ROOT}/views/innovationstudio/email_templates/removed_event_email.erb" + if SS_ID == 8 + template_path = "#{ROOT}/views/engineering_garage/email_templates/removed_event_email.erb" + end + template = File.read(template_path) + body = ERB.new(template).result(binding) - Emailer.mail(self.email, "Nebraska Innovation Studio - Event Modified: #{event.title}", body) + Emailer.mail(self.email, "#{CONFIG['app']['title']} - Event Modified: #{event.title}", body) + end end def notify_trainer_of_deleted_event(event) -body = <Hi, #{self.full_name.rstrip}. You are receiving this email because the following event you are scheduled to train has been deleted:

- -

#{event.title}

+ if self.email && !self.email.empty? + @user = self + @event = event -

Nebraska Innovation Studio

-EMAIL + template_path = "#{ROOT}/views/innovationstudio/email_templates/deleted_event_email.erb" + if SS_ID == 8 + template_path = "#{ROOT}/views/engineering_garage/email_templates/deleted_event_email.erb" + end + template = File.read(template_path) + body = ERB.new(template).result(binding) - Emailer.mail(self.email, "Nebraska Innovation Studio - Event Deleted: #{event.title}", body) + Emailer.mail(self.email, "#{CONFIG['app']['title']} - Event Deleted: #{event.title}", body) + end end def send_trainer_confirmation_reminder -body = <Hi, #{self.full_name.rstrip}. You are receiving this email because you have not confirmed your trainer assignment for one or more events. Please visit your home page to confirm an event.

+ if self.email && !self.email.empty? + @user = self -

Nebraska Innovation Studio

-EMAIL + template_path = "#{ROOT}/views/innovationstudio/email_templates/confirmation_reminder_email.erb" + if SS_ID == 8 + template_path = "#{ROOT}/views/engineering_garage/email_templates/confirmation_reminder_email.erb" + end + template = File.read(template_path) + body = ERB.new(template).result(binding) - Emailer.mail(self.email, "Nebraska Innovation Studio - Unconfirmed Training", body) + Emailer.mail(self.email, "#{CONFIG['app']['title']} - Unconfirmed Training", body) + end end def send_vehicle_information_update - vehicles = Vehicle.where(:user_id => self.id).all - if vehicles.count > 0 - summary = "" - vehicles.each do |vehicle| - summary = summary + "

License Plate: #{vehicle.license_plate}, State: #{vehicle.state}, Make: #{vehicle.make}, Model: #{vehicle.model}

" + if self.email && !self.email.empty? + vehicles = Vehicle.where(:user_id => self.id).all + if vehicles.count > 0 + @summary = "" + @user = self + vehicles.each do |vehicle| + @summary = @summary + "

License Plate: #{vehicle.license_plate}, State: #{vehicle.state}, Make: #{vehicle.make}, Model: #{vehicle.model}

" + end + + template_path = "#{ROOT}/views/innovationstudio/email_templates/vehicle_info_email.erb" + if SS_ID == 8 + template_path = "#{ROOT}/views/engineering_garage/email_templates/vehicle_info_email.erb" + end + template = File.read(template_path) + body = ERB.new(template).result(binding) + + Emailer.mail(self.email, "#{CONFIG['app']['title']} - Vehicle Information Update", body, CONFIG['app']['email_from']) end -body = <Hi, #{self.full_name.rstrip}. You're receiving this email because either your vehicle information has been updated or your account has been activated.

- -

Your most recent vehicle information is as follows:

-#{summary} -

Nebraska Innovation Studio

-EMAIL - Emailer.mail(self.email, "Nebraska Innovation Studio - Vehicle Information Update", body, "innovationstudio@unl.edu") end end def send_vehicle_information_deleted - vehicles = Vehicle.where(:user_id => self.id).all - summary = "

You no longer have any vehicles associated with your account.

" - if vehicles.count > 0 - summary = "" - vehicles.each do |vehicle| - summary = summary + "

License Plate: #{vehicle.license_plate}, State: #{vehicle.state}, Make: #{vehicle.make}, Model: #{vehicle.model}

" + if self.email && !self.email.empty? + vehicles = Vehicle.where(:user_id => self.id).all + @summary = "

You no longer have any vehicles associated with your account.

" + @user = self + if vehicles.count > 0 + @summary = "" + vehicles.each do |vehicle| + @summary = @summary + "

License Plate: #{vehicle.license_plate}, State: #{vehicle.state}, Make: #{vehicle.make}, Model: #{vehicle.model}

" + end end - end -body = <Hi, #{self.full_name.rstrip}. You're receiving this email because either your vehicle information has been updated or your account has been activated.

-

Your most recent vehicle information is as follows:

-#{summary} -

Nebraska Innovation Studio

-EMAIL - Emailer.mail(self.email, "Nebraska Innovation Studio - Vehicle Information Update", body, "innovationstudio@unl.edu") + template_path = "#{ROOT}/views/innovationstudio/email_templates/vehicle_info_email.erb" + if SS_ID == 8 + template_path = "#{ROOT}/views/engineering_garage/email_templates/vehicle_info_email.erb" + end + template = File.read(template_path) + body = ERB.new(template).result(binding) + + Emailer.mail(self.email, "#{CONFIG['app']['title']} - Vehicle Information Update", body, CONFIG['app']['email_from']) + end end def send_activation_email -body = <Thank you for attending New Member Orientation! - -

To activate your user account please go to:

- -

http://#{ENV['RACK_ENV'] == 'development' ? 'localhost:9393' : 'innovationstudio-manager.unl.edu'}/login/ (Bookmark this link for future use) then enter the following:

- -

User Name: #{self.username}

-

Temp Password: Welcome123

- -

After logging in you must:

- -

Click on “My Account” on the far right side of the red banner. -Go to “Add Vehicle”. Add your vehicle information. -You can add up to 3 vehicles. You must park in the lot shown on the attached map. -If any vehicle information changes you must update your account before attending NIS. -FAILURE TO DO SO WILL RESULT IN UP TO A $60 TICKET EVERY TIME YOU PARK.

- -TRAININGS AND RESERVATIONS - -

You are now able to sign up for any trainings or workshops via this webpage by clicking on the VIEW TRAININGS, VIEW WORKSHOPS, VIEW FULL CALENDAR tabs on the main page or under the MANAGE YOUR STUDIO drop down tab.

- -

After you have been through required equipment training you will be able to reserve that equipment on the RESERVE EQUIPMENT tab on the main page or the drop-down tab. Not all equipment requires training or reservations.

+ if self.email && !self.email.empty? + @user = self + template_path = "#{ROOT}/views/innovationstudio/email_templates/activation_email.erb" + if SS_ID == 8 + template_path = "#{ROOT}/views/engineering_garage/email_templates/activation_email.erb" + end + template = File.read(template_path) + body = ERB.new(template).result(binding) + + attachments = {} + if SS_ID == 1 + attachments = { + "new-member-orientation-parking-map.pdf" => File.read(File.expand_path("../public/pdf/new-member-orientation-parking-map.pdf", File.dirname(__FILE__))) + } + end -RENEWING YOUR MEMBERSHIP -

To renew your membership you must do so in person. We accept credit cards and UNL N Cards or cost object numbers. No checks or cash are accepted. Renew as soon as you enter the studio or you will receive a parking ticket.

+ Emailer.mail(self.email, "#{CONFIG['app']['title']} - Getting Started", body, '', attachments) + end + end -

Thank you and welcome aboard!

+ def send_attended_orientation_email + if self.email && !self.email.empty? + @user = self + template_path = "#{ROOT}/views/innovationstudio/email_templates/attended_orientation_email.erb" + if SS_ID == 8 + template_path = "#{ROOT}/views/engineering_garage/email_templates/attended_orientation_email.erb" + end + template = File.read(template_path) + body = ERB.new(template).result(binding) -

Your Studio Staff

-EMAIL - Emailer.mail(self.email, "Nebraska Innovation Studio - Getting Started", body, '', {"new-member-orientation-parking-map.pdf" => File.read(File.expand_path("../public/pdf/new-member-orientation-parking-map.pdf", File.dirname(__FILE__)))}) + Emailer.mail(self.email, "#{CONFIG['app']['title']} - Getting Started", body) + end end def notify_user_of_broken_equipment(reservation) - resource = Resource.find(reservation.resource_id) -body = <Hi, #{self.full_name.rstrip}. You are receiving this email because your reservation for #{resource.name} on #{reservation.start_time.in_time_zone.strftime('%A, %B %d at %l:%M %P')} has been canceled due to broken equipment. We apologize for this inconvenience.

- -

Nebraska Innovation Studio

-EMAIL + if self.email && !self.email.empty? + @reservation = reservation + @resource = Resource.find(reservation.resource_id) + @user = self + template_path = "#{ROOT}/views/innovationstudio/email_templates/broken_equipment_email.erb" + if SS_ID == 8 + template_path = "#{ROOT}/views/engineering_garage/email_templates/broken_equipment_email.erb" + end + template = File.read(template_path) + body = ERB.new(template).result(binding) - Emailer.mail(self.email, "Nebraska Innovation Studio - Reservation Canceled for #{reservation.start_time.strftime('%m-%d-%Y')}", body) + Emailer.mail(self.email, "#{CONFIG['app']['title']} - Reservation Canceled for #{@reservation.start_time.strftime('%m-%d-%Y')}", body) + end end end \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..b4193ef8 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,216 @@ +{ + "name": "reservations", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "reservations", + "version": "1.0.0", + "license": "ISC", + "devDependencies": { + "less": "^4.2.0" + } + }, + "node_modules/copy-anything": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", + "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", + "dev": true, + "dependencies": { + "is-what": "^3.14.1" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "optional": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "optional": true + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", + "dev": true, + "optional": true, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-what": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", + "dev": true + }, + "node_modules/less": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/less/-/less-4.2.0.tgz", + "integrity": "sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==", + "dev": true, + "dependencies": { + "copy-anything": "^2.0.1", + "parse-node-version": "^1.0.1", + "tslib": "^2.3.0" + }, + "bin": { + "lessc": "bin/lessc" + }, + "engines": { + "node": ">=6" + }, + "optionalDependencies": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "needle": "^3.1.0", + "source-map": "~0.6.0" + } + }, + "node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "optional": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "optional": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/needle": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz", + "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==", + "dev": true, + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true, + "optional": true + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "optional": true + }, + "node_modules/sax": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", + "dev": true, + "optional": true + }, + "node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "dev": true + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..be10615d --- /dev/null +++ b/package.json @@ -0,0 +1,14 @@ +{ + "name": "reservations", + "version": "1.0.0", + "description": "UNL reservation system for schedule resources, classes, etc.", + "scripts": { + "less": "npx lessc src/less/main.less public/css/main.css" + }, + "keywords": [], + "author": "", + "license": "ISC", + "devDependencies": { + "less": "^4.2.0" + } +} diff --git a/public/css/innovation_studio.css b/public/css/innovation_studio.css deleted file mode 100644 index d41331ff..00000000 --- a/public/css/innovation_studio.css +++ /dev/null @@ -1 +0,0 @@ -@charset "UTF-8";@font-face{font-family:'eventicon';src:url('font/eventicon.eot?22213170');src:url('font/eventicon.eot?22213170#iefix') format('embedded-opentype'),url('font/eventicon.svg?22213170#eventicon') format('svg');font-weight:normal;font-style:normal}@font-face{font-family:'eventicon';src:url('data:application/octet-stream;base64,d09GRgABAAAAAA+YAA4AAAAAGKQAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAABRAAAAEQAAABWPihJCmNtYXAAAAGIAAAAOgAAAUrQGhm3Y3Z0IAAAAcQAAAAUAAAAHAbZ/wZmcGdtAAAB2AAABPkAAAmRigp4O2dhc3AAAAbUAAAACAAAAAgAAAAQZ2x5ZgAABtwAAAWxAAAHxMhfdCpoZWFkAAAMkAAAADUAAAA2Au9iKmhoZWEAAAzIAAAAHgAAACQHlwNbaG10eAAADOgAAAAiAAAALCXWAABsb2NhAAANDAAAABgAAAAYCUALLm1heHAAAA0kAAAAIAAAACABLQoMbmFtZQAADUQAAAGBAAAC2eMlZdpwb3N0AAAOyAAAAHUAAACicNarb3ByZXAAAA9AAAAAVgAAAFaSoZr/eJxjYGQuZJzAwMrAwVTFtIeBgaEHQjM+YDBkZGJgYGJgZWbACgLSXFMYHF4wvOBkDvqfxRDFHMwwDSjMCJIDAObnC7B4nGNgYGBmgGAZBkYGEHAB8hjBfBYGDSDNBqQZGZgYGF5w/v8PUvCCAURLMELVAwEjG8OIBwBtzAa3AAB4nGNgQANGDEbMwf+zQBgAEdoD43icnVXZdtNWFJU8ZHASOmSgoA7X3DhQ68qEKRgwaSrFdiEdHAitBB2kDHTkncc+62uOQrtWH/m07n09JLR0rbYsls++R1tn2DrnRhwjKn0aiGvUoZKXA6msPZZK90lc13Uvj5UMBnFdthJPSZuonSRKat3sUC7xWOsqWSdYJ+PlIFZPVZ5noAziFB5lSUQbRBuplyZJ4onjJ4kWZxAfJUkgJaMQp9LIUEI1GsRS1aFM6dCr1xNx00DKRqMedVhU90PFJ8c1p9SsA0YqVznCFevVRr4bpwMve5DEOsGzrYcxHnisfpQqkIqR6cg/dkpOlIaBVHHUoVbi6DCTX/eRTCrNQKaMYkWl7oG43f102xYxPXQ6vi5KlUaqurnOKJrt0fGogygP2cbppNzQ2fbw5RlTVKtdcbPtQGYNXErJbHSfRAAdJlLj6QFONZwCqRn1R8XZ588BEslclKo8VTKHegOZMzt7cTHtbiersnCknwcyb3Z2452HQ6dXh3/R+hdM4cxHj+Jifj5C+lBqfiJOJKVGWMzyp4YfcVcgQrkxiAsXyuBThDl0RdrZZl3jtTH2hs/5SqlhPQna6KP4fgr9TiQrHGdRo/VInM1j13Wt3GdQS7W7Fzsyr0OVIu7vCwuuM+eEYZ4WC1VfnvneBTT/Bohn/EDeNIVL+5YpSrRvm6JMu2iKCu0SVKVdNsUU7YoppmnPmmKG9h1TzNKeMzLj/8vc55H7HN7xkJv2XeSmfQ+5ad9HbtoPkJtWITdtHblpLyA3rUZu2lWjOnYEGgZpF1IVQdA0svph3Fab9UDWjDR8aWDyLmLI+upER521tcofxX914gsHcmmip7siF5viLq/bFj483e6rj5pG3bDV+MaR8jAeRnocmtBZ+c3hv+1N3S6a7jKqMugBFUwKwABl7UAC0zrbCaT1mqf48gdgXIZ4zkpDtVSfO4am7+V5X/exOfG+x+3GLrdcd3kJWdYNcmP28N9SZKrrH+UtrVQnR6wrJ49VaxhDKrwour6SlHu0tRu/KKmy8l6U1srnk5CbPYMbQlu27mGwI0xpyiUeXlOlKD3UUo6yQyxvKco84JSLC1qGxLgOdQ9qa8TpoXoYGwshhqG0vRBwSCldFd+0ynfxHqtr2Oj4xRXh6XpyEhGf4ir7UfBU10b96A7avGbdMoMpVaqn+4xPsa/b9lFZaaSOsxe3VAfXNOsaORXTT+Rr4HRvOGjdAz1UfDRBI1U1x+jGKGM0ljXl3wR0MVZ+w2jVYvs93E+dpFWsuUuY7JsT9+C0u/0q+7WcW0bW/dcGvW3kip8jMb8tCvw7B2K3ZA3UO5OBGAvIWdAYxhYmdxiug23EbfY/Jqf/34aFRXJXOxq7eerD1ZNRJXfZ8rjLTXZZ16M2R9VOGvsIjS0PN+bY4XIstsRgQbb+wf8x7gF3aVEC4NDIZZiI2nShnurh6h6rsW04VxIBds2x43QAegAuQd8cu9bzCYD13CPnLsB9cgh2yCH4lByCz8i5BfA5OQRfkEMwIIdgl5w7AA/IIXhIDsEeOQSPyNkE+JIcgq/IIYjJIUjIuQ3wmByCJ+QQfE0OwTdGrk5k/pYH2QD6zqKbQKmdGhzaOGRGrk3Y+zxY9oFFZB9aROqRkesT6lMeLPV7i0j9wSJSfzRyY0L9iQdL/dkiUn+xiNRnxpeZIymvDp7zjg7+BJfqrV4AAAAAAQAB//8AD3ichVVdaBzXFT7nzu/OyLMzs/OzXu3Kq9nVrDJyFXU0O7uW5PXGlSVhO5Fq+cGyTSjFpItiTCh2MLi0ofg5FqowQQTRhDyEhpQEQigk2Cb4oVATGmNC80MIeSql6MHkpUFa9dy1StQY2uXuufeee2bmO+d+373AAHbeFc4LOvTBGLTbh0dQkvejwNhRhUZMllhHRCbITHgOAGQJ5HMgIArzIAh4GlDAuUrVq1SH3Jzqj1hJC+MBNFgwig3Ha4y7juePx2mjTuYwJqFSqSdhrRLIikvGv/zR5p2r8sV733zcedvJ3vCM2ayDNwzPM74fIz575e7ly3f/wc1PaX6D/BTgZOf2TgDYzs7OsvCa0Ad5GISoXdNREG0Cz44SdFEAkaADo+TOAaKO0zmvUnAkh6MWBpjvKL7nyMGTKFeCUUbwW2wU5dbyyusvX5pgx267Byec2xeuLax22iurf10RX/nzOv52YeXiFGt31p65duG2Oxm5t4+1Omvzv1hjK/dfltdhb30DqLWrecKDHI/AQDhHaJDNA2O4CMhwtui7OTH3gzIeQC8+gmnyJDa4CYMsynsK94G+rRf1Q7r+1lu6fkgb0Lb1vRW7YtC63tQHNFrvxW3r8Diu8v/E5T+OS9qDqweJ5speXOjQx4r849sE6hG+vcDms4Sqh/17fLQ/sPMvIUe4VCjDIUjaP3YQgZAxGWQGHRCpE4mEtIUwT3hxURIYRcyG6WQjzNmKN1JP0pjvZGjVk0Y6iQOC78kjGIS1UaRGXnJ6omfvuuujQi0IW2db1PoyWWHp9d+cVNA1TxgO9r3/kmG7Wfwdap9c5c4Fw5MvbHz+ouFc+BF/oIWzJ0xNU07++o2lrG8bL73fhw7WFrKu+uIn3W9Xs56z7+rffv9z1QPOQsqPc3QRKlCDBszCL0+8oy2caT8hMgYZVYWfaaiCIqvKWR0zGVwksaH2E5BlaREkSZem+9vRo9gMqJ3/F7zUto4dPTxRj8ctu14Zz41X+vIjrsULQFUgaXolHN8d+S43liNXBoOwMWgNkgQm8ZFuqUyyK/1gHpXmkqHqUPJpWq0MJThbivBgcWuzFM0K9tbmDU2tqlrP4NuaWuFjMvPsL6UoraaYDKW7XVTarpeiqMSmnudBr/236XH1Y6HMHkIRpmCy3aRjSF4GSZSWOV1J0pwVJO/HeTs1mdafGK4G/QXXUqyRoTT2PaJqECZHsIUkd0WuhZy7XtxAz8ly6dfChIdxZhNZeHQtpImHoTFslstRc/2F5trMWmqa1SA+tVZIjhfwn83mxvGTrdgoRkY8t1Es5tvF2Bw2giBOVy8bRlAdbr6w3lybthOTv2Ts1GrhZFxgzzXXmxtzsTE8YIzNvVo8ni9ohZiHx6ncy3uZPSSuaJCDYnu/iniEp/U8JQiLxCaNTecKtmCTMFPRcx0lgyFtWpwmYSB/iRNf1rsfdj+sf3H++nlq+NmrX7HPN67NdE/hH2euHeW+81zx9J1V4RUhIs1Z4MNc+xi9KycyEekSEKnCIutISIFU5XMy9mpMHePnP8M529YyCLZv+8a+jKVZkggqqmp2BGMwScUm5OLUDMuy6eVcX6lZeO8WGt2H3evdh2jcunn/fvfTBw/+dDP+gxD9x4u/QmPr3gOMeovs4re0ijZdQD0u/J1tQpZq4kM/HIAYrravlOlAfwp0IoUudvYRWJYBttRnUacqGXXJRIVoo8hLWZQ0SkoSlwzkF9nT1AmcLgIdv8V83nFME2EkqlaCweKB4oGBUr4/31/Y7/iO77lmzszZVkaGLBo2z9BzdwVTpz0YR2vQGnIr9cbuH/1KMp7SlVdPYteR+W0oXI8mJqKtr4enpoaF8tbX+Ox3/MdOi9/Jp9P3mpHHNiei7Tf5OjsTTWxPszPbb949e/Zmr3XvzMx4B82FsUuXxhZMpyzDvwHCnnS7AAAAeJxjYGRgYADij/+0l8Tz23xl4GZ+ARRhOP9ldQqELlb5//9/FvML5mAgl4OBCSQKAKmCDzQAAAB4nGNgZGBgDvqfxRDF/IKB4f9fIAkUQQHcAJEoBfgAAHicY37BwMAcCcQLoDQIC0L5CgwMTJ+A9AwgBqoDAIJWBfcAAAAAAAAAZgCwAPwBSAG4AlICzgMCA1gD4gABAAAACwBIAAYAAAAAAAIAJAAxAG4AAACJCZEAAAAAeJx1kL1OwzAUhY+hFLWVGIrE7AVUhJT+AEsHVKkCNoYOZU5T56ekduW4lTrxFrwDD8TKs3CSWhXiJ5aT75x7c++1AbTxCYHdc8u9Y4EG1Y4PcIw7z4f07z3XyE+ej9DCs+c6/ZnnJq7w4rmFU7yxgqg1qBZ49yzQFqeeD3Aizj0f0r/2XCPfez7CmXj2XKe/9NzEVLx6buFCfIzNamuzJHWyM76Ug17/Rs620tDKdJjLcO1SYws5krHRTuW5CSKzVBulXRYZPVHJOg/tXu9hqmyRGS37QW/vPSqtbOjUvOxQbJKBc7GMrVnKB19brqxZqMgFqXOrYbf7vSfGMFhhC4sMCVI4SHToXvI7QA993JBmzJDM3GVl0AiR0wmx5h9pFSmoR9wxlaarmJGTA0R8L6k33GUkqxyNCXXCCjnr2D/iv50pddkpq5TkdAFn/J33WOkyN6wmme/PUDA34ckcV1xNa6vpJB5+zC15L2VsQSeiH1S34+gO0eX655xfTG2H8QAAAHicbcjRDoIwDEDRFhgiGB/kO/ZRTVdhoQ7STRP/HhLjg4nn6eZCBR89/DcAYIU1NuiwxRN2eMYeh8umz+w5GquENgsZzzdKk8p3epV7GX+XxWkuteV8ZVJJgczLYyvvRmNaOl2ZSlyT46MW92KyALADORomRgAAAEu4AMhSWLEBAY5ZuQgACABjILABI0SwAyNwsgQoCUVSRLIKAgcqsQYBRLEkAYhRWLBAiFixBgNEsSYBiFFYuAQAiFixBgFEWVlZWbgB/4WwBI2xBQBEAAA=') format('woff'),url('data:application/octet-stream;base64,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') format('truetype')}[class^="eventicon-"]:before,[class*=" eventicon-"]:before{font-family:"eventicon";font-style:normal;font-weight:normal;speak:none;display:inline-block;text-decoration:inherit;width:1em;margin-right:.2em;text-align:center;font-variant:normal;text-transform:none;line-height:1em;margin-left:.2em}.eventicon-plus-circled:before{content:'\e800'}.eventicon-search:before{content:'\e801'}.eventicon-angle-circled-left:before{content:'\e802'}.eventicon-angle-circled-right:before{content:'\e803'}.eventicon-rss:before{content:'\e804'}.eventicon-calendar-empty:before{content:'\e805'}.eventicon-link:before{content:'\e806'}.eventicon-location:before{content:'\e807'}.eventicon-clock:before{content:'\e808'}.eventicon-vcard:before{content:'\e809'}.clearfix:after{content:" ";visibility:hidden;display:block;height:0;clear:both}select[multiple=multiple]{padding:.25em .75em}.dcf-main-content form.delete-form,.dcf-main-content form.inline-form{display:inline;padding:0}.dcf-main-content form .offset-field-group{border:solid 1px var(--b);background:var(--bg-dialog);border-radius:.5em;padding:1em}.dcf-main-content form .offset-field-group label{color:var(--body)}.table-actions a,.table-actions button{vertical-align:middle}#notice .message-content a{text-decoration:underline}.calendar-container{font-family:"Gotham SSm A","Gotham SSm B",Verdana,"Verdana Ref",Geneva,Tahoma,"Lucida Grande","Lucida Sans Unicode","Lucida Sans","DejaVu Sans","Bitstream Vera Sans","Liberation Sans",sans-serif;width:100%;text-align:center}.calendar-container .time-labels{font-size:80%;text-align:right;display:inline-block;border-right:1px solid #C9C9C9;width:9%;margin:0}.calendar-container .time-labels .calendar-half-hour{padding-right:3px}.calendar-container .calendar-day{vertical-align:bottom;text-align:center;border-left:1px solid #C9C9C9;border-right:1px solid #C9C9C9;display:inline-block;width:12%;margin:0}.calendar-container .calendar-day .day-chart{position:relative}.calendar-container .calendar-half-hour{height:20px;border-top:1px solid #C9C9C9}.calendar-container .calendar-half-hour:last-child{border-bottom:1px solid #C9C9C9}.calendar-container .calendar-half-hour:nth-child(2n){background-color:#EEEEEE}.calendar-container .event,.calendar-container .reservation{position:absolute;overflow-y:auto;background:#78c3f1;border:1px solid #137cbd;border-radius:3px;width:80%;font-size:60%;text-align:left;padding:3px;word-wrap:break-word}.calendar-container .event.new-member-orientation,.calendar-container .reservation.new-member-orientation{background:#FFFFB8;border-color:#b8b800}.calendar-container .event.free-event,.calendar-container .reservation.free-event{background:#F8F8F8;border-color:#797979}.calendar-container .event.machine-training,.calendar-container .reservation.machine-training{background:#58CC2F;border-color:#34791c}.calendar-container .event.rsvp-only-event,.calendar-container .reservation.rsvp-only-event{background:#FFA6F5;border-color:#a60093}.calendar-container .event.hrc-training,.calendar-container .reservation.hrc-training{background:#f4c391;border-color:#7a440c}.calendar-container .event.top-overflow,.calendar-container .reservation.top-overflow{border-top:none;border-top-left-radius:0px;border-top-right-radius:0px}.calendar-container .event.bottom-overflow,.calendar-container .reservation.bottom-overflow{border-bottom:none;border-bottom-left-radius:0px;border-bottom-right-radius:0px}.calendar-container .event.editing,.calendar-container .reservation.editing{border-style:dashed;opacity:.7}.calendar-container .event a,.calendar-container .reservation a{color:black}.calendar-container .event a:hover,.calendar-container .reservation a:hover{text-decoration:underline}.calendar-container .status{position:absolute;background:gray;width:100%;opacity:.5}.calendar-container .status.closed{background-color:#444}.calendar-container .status.open-without-reservations{background-color:#78c3f1}.calendar-container.individual-day{background-color:var(--bg-light-gray);border:1px solid var(--b)}.calendar-container.individual-day .time-labels{width:25%}.calendar-container.individual-day .calendar-day{width:70%}.event-details{margin-bottom:1em;padding:0 23px 1.777em;padding:0 1.425rem 1.777em;border-top:5px solid var(--brand-alpha);background-color:var(--bg-dialog);box-shadow:0 0 0 1px rgba(20,20,20,0.1)}.event-details .date-wrapper,.event-details .time-wrapper,.event-details .location,.event-details .contact{display:block;font-size:13px;font-size:0.802rem}.event-details .date-wrapper:before,.event-details .time-wrapper:before,.event-details .location:before,.event-details .contact:before{color:var(--brand-alpha)}.event-details .description{margin:1em 0 0;padding-top:1em;border-top:1px solid var(--b)}.toolbox,.visual-island{background:var(--bg-light-gray);margin-bottom:1em;word-wrap:break-word;padding:0 !important}.toolbox .tools,.visual-island .tools,.toolbox .details,.visual-island .details{padding:1em;border-left:1px solid var(--b);border-right:1px solid var(--b);border-bottom:1px solid var(--b)}.toolbox .tools.top-border,.visual-island .tools.top-border,.toolbox .details.top-border,.visual-island .details.top-border{border-top:1px solid var(--b)}.toolbox h1,.visual-island h1,.toolbox h2,.visual-island h2,.toolbox h3,.visual-island h3,.toolbox h4,.visual-island h4,.toolbox h5,.visual-island h5,.toolbox h6,.visual-island h6,.toolbox .vi-header,.visual-island .vi-header{display:block;font-size:.802em !important;margin:0;border-bottom:1px solid #474746;font-family:"Gotham SSm A","Gotham SSm B",Verdana,"Verdana Ref",Geneva,Tahoma,"Lucida Grande","Lucida Sans Unicode","Lucida Sans","DejaVu Sans","Bitstream Vera Sans","Liberation Sans",sans-serif;width:100%;background-color:#474746;padding:1em;text-transform:uppercase;color:#fff;font-weight:400;font-style:normal;text-align:center}.toolbox p,.visual-island p{padding:0 1em 1em 1em}.toolbox ul,.visual-island ul{padding:0;padding-left:1em;margin:0}.toolbox ul a,.visual-island ul a{border-bottom:none;font-family:"Gotham SSm A","Gotham SSm B",Verdana,"Verdana Ref",Geneva,Tahoma,"Lucida Grande","Lucida Sans Unicode","Lucida Sans","DejaVu Sans","Bitstream Vera Sans","Liberation Sans",sans-serif}.event-list{background-color:#eae9e6;font-size:80%;line-height:1.4}.event-list .center{text-align:center}.event-list tbody tr{min-height:30px}.event-list ul{padding-left:0;list-style-type:none}.event-list li{padding:5px 0}.event-list li:not(:last-child){border-bottom:1px solid #999999}.date-time-select{padding:1em;background-color:var(--bg-light-gray);border:1px solid var(--b);margin-bottom:0.75em;text-align:center}.date-time-select>*{vertical-align:middle}.expired{color:var(--link);font-weight:bold;font-size:.85em}.sort{display:flex;align-items:center}.sort div{display:flex;flex-direction:column;height:27px;margin-left:5px;cursor:pointer}@media (max-width:767px){.medium-hidden{display:none}.medium-block{display:block !important}} \ No newline at end of file diff --git a/public/css/jquery-ui.min-custom.css b/public/css/jquery-ui.min-custom.css index 3cfc6799..4de643c5 100644 --- a/public/css/jquery-ui.min-custom.css +++ b/public/css/jquery-ui.min-custom.css @@ -1,6 +1,6 @@ .ui-widget { - font-family: "Gotham"; + font-family: Work Sans,"Sans Serif Fallback",sans-serif; } .ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { @@ -24,7 +24,7 @@ border:none; background: #474746; color: #fff; - font-family: "Gotham"; + font-family: Work Sans,"Sans Serif Fallback",sans-serif; font-size: .802em; font-weight: 100; padding: .75em; @@ -45,7 +45,7 @@ border: 1px solid #d5d5d2; padding: 0.5em; text-align: center; - font-family: "Gotham"; + font-family: Work Sans,"Sans Serif Fallback",sans-serif; font-size: .75rem; background-color: #fff; } diff --git a/public/css/main.css b/public/css/main.css new file mode 100644 index 00000000..5f071d79 --- /dev/null +++ b/public/css/main.css @@ -0,0 +1,376 @@ +@charset "UTF-8"; +@font-face { + font-family: 'eventicon'; + src: url('../font/eventicon.eot?22213170'); + src: url('../font/eventicon.eot?22213170#iefix') format('embedded-opentype'), url('../font/eventicon.svg?22213170#eventicon') format('svg'); + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: 'eventicon'; + src: url('data:application/octet-stream;base64,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') format('woff'), url('data:application/octet-stream;base64,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') format('truetype'); +} +[class^="eventicon-"]:before, +[class*=" eventicon-"]:before { + font-family: "eventicon"; + font-style: normal; + font-weight: normal; + speak: none; + display: inline-block; + text-decoration: inherit; + width: 1em; + margin-right: 0.2em; + text-align: center; + /* For safety - reset parent styles, that can break glyph codes*/ + font-variant: normal; + text-transform: none; + /* fix buttons height, for twitter bootstrap */ + line-height: 1em; + /* Animation center compensation - margins should be symmetric */ + /* remove if not needed */ + margin-left: 0.2em; +} +.eventicon-plus-circled:before { + content: '\e800'; +} +/* '' */ +.eventicon-search:before { + content: '\e801'; +} +/* '' */ +.eventicon-angle-circled-left:before { + content: '\e802'; +} +/* '' */ +.eventicon-angle-circled-right:before { + content: '\e803'; +} +/* '' */ +.eventicon-rss:before { + content: '\e804'; +} +/* '' */ +.eventicon-calendar-empty:before { + content: '\e805'; +} +/* '' */ +.eventicon-link:before { + content: '\e806'; +} +/* '' */ +.eventicon-location:before { + content: '\e807'; +} +/* '' */ +.eventicon-clock:before { + content: '\e808'; +} +/* '' */ +.eventicon-vcard:before { + content: '\e809'; +} +/* '' */ +.clearfix:after { + content: " "; + /* Older browsers do not support empty content */ + visibility: hidden; + display: block; + height: 0; + clear: both; +} +select[multiple=multiple] { + padding: 0.25em 0.75em; +} +.dcf-main-content form.delete-form, +.dcf-main-content form.inline-form { + display: inline; + padding: 0; +} +.dcf-main-content form .offset-field-group { + border: solid 1px var(--b); + background: var(--bg-dialog); + border-radius: 0.5em; + padding: 1em; +} +.dcf-main-content form .offset-field-group label { + color: var(--body); +} +.table-actions a, +.table-actions button { + vertical-align: middle; +} +#notice .message-content a { + text-decoration: underline; +} +.calendar-container { + font-family: Work Sans, "Sans Serif Fallback", sans-serif; + width: 100%; + text-align: center; +} +.calendar-container .time-labels { + font-size: 80%; + text-align: right; + display: inline-block; + border-right: 1px solid #C9C9C9; + width: 9%; + margin: 0; +} +.calendar-container .time-labels .calendar-half-hour { + padding-right: 3px; +} +.calendar-container .calendar-day { + vertical-align: bottom; + text-align: center; + border-left: 1px solid #C9C9C9; + border-right: 1px solid #C9C9C9; + display: inline-block; + width: 12%; + margin: 0; +} +.calendar-container .calendar-day .day-chart { + position: relative; +} +.calendar-container .calendar-half-hour { + height: 20px; + border-top: 1px solid #C9C9C9; +} +.calendar-container .calendar-half-hour:last-child { + border-bottom: 1px solid #C9C9C9; +} +.calendar-container .calendar-half-hour:nth-child(2n) { + background-color: #EEEEEE; +} +.calendar-container .event, +.calendar-container .reservation { + position: absolute; + overflow-y: auto; + background: #78c3f1; + border: 1px solid #137cbd; + border-radius: 3px; + width: 80%; + font-size: 60%; + text-align: left; + padding: 3px; + word-wrap: break-word; + color: black; +} +.calendar-container .event.new-member-orientation, +.calendar-container .reservation.new-member-orientation { + background: #FFFFB8; + border-color: #b8b800; +} +.calendar-container .event.free-event, +.calendar-container .reservation.free-event { + background: #F8F8F8; + border-color: #797979; +} +.calendar-container .event.machine-training, +.calendar-container .reservation.machine-training { + background: #58CC2F; + border-color: #34791c; +} +.calendar-container .event.rsvp-only-event, +.calendar-container .reservation.rsvp-only-event { + background: #FFA6F5; + border-color: #a60093; +} +.calendar-container .event.hrc-training, +.calendar-container .reservation.hrc-training { + background: #f4c391; + border-color: #7a440c; +} +.calendar-container .event.top-overflow, +.calendar-container .reservation.top-overflow { + border-top: none; + border-top-left-radius: 0px; + border-top-right-radius: 0px; +} +.calendar-container .event.bottom-overflow, +.calendar-container .reservation.bottom-overflow { + border-bottom: none; + border-bottom-left-radius: 0px; + border-bottom-right-radius: 0px; +} +.calendar-container .event.editing, +.calendar-container .reservation.editing { + border-style: dashed; + opacity: 0.7; +} +.calendar-container .event a, +.calendar-container .reservation a { + color: black; +} +.calendar-container .event a:hover, +.calendar-container .reservation a:hover { + text-decoration: underline; +} +.calendar-container .status { + position: absolute; + background: gray; + width: 100%; + opacity: 0.5; +} +.calendar-container .status.closed { + background-color: #444444; +} +.calendar-container .status.open-without-reservations { + background-color: #78c3f1; +} +.calendar-container.individual-day { + background-color: var(--bg-light-gray); + border: 1px solid var(--b); +} +.calendar-container.individual-day .time-labels { + width: 25%; +} +.calendar-container.individual-day .calendar-day { + width: 70%; +} +.event-details { + margin-bottom: 1em; + padding: 0 23px 1.777em; + padding: 0 1.425rem 1.777em; + border-top: 5px solid var(--brand-alpha); + background-color: var(--bg-dialog); + box-shadow: 0 0 0 1px rgba(20, 20, 20, 0.1); +} +.event-details .date-wrapper, +.event-details .time-wrapper, +.event-details .location, +.event-details .contact { + display: block; + font-size: 13px; + font-size: 0.802rem; +} +.event-details .date-wrapper:before, +.event-details .time-wrapper:before, +.event-details .location:before, +.event-details .contact:before { + color: var(--brand-alpha); +} +.event-details .description { + margin: 1em 0 0; + padding-top: 1em; + border-top: 1px solid var(--b); +} +.toolbox, +.visual-island { + background: var(--bg-light-gray); + margin-bottom: 1em; + word-wrap: break-word; + padding: 0 !important; +} +.toolbox .tools, +.visual-island .tools, +.toolbox .details, +.visual-island .details { + padding: 1em; + border-left: 1px solid var(--b); + border-right: 1px solid var(--b); + border-bottom: 1px solid var(--b); +} +.toolbox .tools.top-border, +.visual-island .tools.top-border, +.toolbox .details.top-border, +.visual-island .details.top-border { + border-top: 1px solid var(--b); +} +.toolbox h1, +.visual-island h1, +.toolbox h2, +.visual-island h2, +.toolbox h3, +.visual-island h3, +.toolbox h4, +.visual-island h4, +.toolbox h5, +.visual-island h5, +.toolbox h6, +.visual-island h6, +.toolbox .vi-header, +.visual-island .vi-header { + display: block; + font-size: 0.802em !important; + margin: 0; + border-bottom: 1px solid #474746; + font-family: Work Sans, "Sans Serif Fallback", sans-serif; + width: 100%; + background-color: #474746; + padding: 1em; + text-transform: uppercase; + color: #fff; + font-weight: 400; + font-style: normal; + text-align: center; +} +.toolbox p, +.visual-island p { + padding: 0 1em 1em 1em; +} +.toolbox ul, +.visual-island ul { + padding: 0; + padding-left: 1em; + margin: 0; +} +.toolbox ul a, +.visual-island ul a { + border-bottom: none; + font-family: Work Sans, "Sans Serif Fallback", sans-serif; +} +.event-list { + background-color: #eae9e6; + font-size: 80%; + line-height: 1.4; +} +.event-list .center { + text-align: center; +} +.event-list tbody tr { + min-height: 30px; +} +.event-list ul { + padding-left: 0; + list-style-type: none; +} +.event-list li { + padding: 5px 0; +} +.event-list li:not(:last-child) { + border-bottom: 1px solid #999999; +} +.date-time-select { + padding: 1em; + background-color: var(--bg-light-gray); + border: 1px solid var(--b); + margin-bottom: 0.75em; + text-align: center; +} +.date-time-select > * { + vertical-align: middle; +} +.expired { + color: var(--link); + font-weight: bold; + font-size: 0.85em; +} +.sort { + display: flex; + align-items: center; +} +.sort div { + display: flex; + flex-direction: column; + height: 27px; + margin-left: 5px; + cursor: pointer; +} +/* for mobile-tablet-ish sizes */ +@media (max-width: 767px) { + .medium-hidden { + display: none; + } + .medium-block { + display: block !important; + } +} diff --git a/routes/admin/agenda.rb b/routes/admin/agenda.rb index 4e1393db..9c73e500 100644 --- a/routes/admin/agenda.rb +++ b/routes/admin/agenda.rb @@ -25,7 +25,7 @@ trainers = {} for event in events - trainer = User.where('id = ?', event.trainer_id) + trainer = User.where(:service_space_id => SS_ID).where('id = ?', event.trainer_id) if !trainer.first.nil? trainers[event.trainer_id] = trainer.first.full_name end diff --git a/routes/admin/emails.rb b/routes/admin/emails.rb index f65fdf9e..9968a25f 100644 --- a/routes/admin/emails.rb +++ b/routes/admin/emails.rb @@ -28,7 +28,7 @@ end get '/admin/email/preset_emails_json/?' do - presets = PresetEmail.all + presets = PresetEmail.where(:service_space_id => SS_ID).all content_type :json presets.to_json end @@ -68,10 +68,10 @@ get '/admin/email/send/?' do @breadcrumbs << {:text => 'Admin Emails', :href => '/admin/email/'} @breadcrumbs << {:text => 'Send Email'} - users = User.all + users = User.where(:service_space_id => SS_ID).all tools = Resource.where(:service_space_id => SS_ID).order(:name).all alerts = Alert.order(:name).all - preset_emails = PresetEmail.all + preset_emails = PresetEmail.where(:service_space_id => SS_ID).all erb :'admin/send_email', :layout => :fixed, :locals => { :users => users, @@ -95,7 +95,7 @@ body = params[:body] body = <<-EMAIL #{body} -
If you no longer want to receive emails from us, please email innovationstudio@unl.edu. +
If you no longer want to receive emails from us, please email #{CONFIG['app']['email_from']}. EMAIL # Promotional emails @@ -105,7 +105,7 @@ body = params[:body] body = <<-EMAIL #{body} -
If you no longer want to receive emails from us you can adjust your email preferences here. +
If you no longer want to receive emails from us you can adjust your email preferences here. EMAIL end @@ -188,7 +188,7 @@ if invalid_emails.count > 0 invalid_emails_body = "Invalid emails were found in the member database: " + invalid_emails.join(',') - Emailer.mail("innovationstudio@unl.edu", "Invalid Emails Found", invalid_emails_body, '', nil) + Emailer.mail(CONFIG['app']['email_from'], "Invalid Emails Found", invalid_emails_body, '', nil) end # correctly choose how to send @@ -210,7 +210,7 @@ get '/admin/email/presets/?' do @breadcrumbs << {:text => 'Admin Emails', :href => '/admin/email/'} << {:text => 'Manage Preset Emails'} - preset_emails = PresetEmail.all + preset_emails = PresetEmail.where(:service_space_id => SS_ID).all erb :'admin/email_presets', :layout => :fixed, :locals => { :preset_emails => preset_emails @@ -221,12 +221,12 @@ @breadcrumbs << {:text => 'Admin Emails', :href => '/admin/email/'} << {:text => 'Manage Preset Emails', :href => '/admin/email/presets/'} << {:text => 'Create Preset Email'} erb :'admin/new_preset_email', :layout => :fixed, :locals => { - :preset_email => PresetEmail.new + :preset_email => PresetEmail.where(:service_space_id => SS_ID).new } end post '/admin/email/presets/create/?' do - preset_email = PresetEmail.new + preset_email = PresetEmail.where(:service_space_id => SS_ID).new name = params[:name] subject = params[:subject] body = params[:body] @@ -252,7 +252,7 @@ get '/admin/email/presets/:preset_id/edit/?' do @breadcrumbs << {:text => 'Admin Emails', :href => '/admin/email/'} << {:text => 'Manage Preset Emails', :href => '/admin/email/presets/'} << {:text => 'Edit Preset Email'} - preset = PresetEmail.find_by(:id => params[:preset_id]) + preset = PresetEmail.where(:service_space_id => SS_ID).find_by(:id => params[:preset_id]) if preset.nil? # that preset does not exist flash(:danger, 'Not Found', 'That preset email does not exist') @@ -268,7 +268,7 @@ name = params[:name] subject = params[:subject] body = params[:body] - preset_email = PresetEmail.find_by(:id => params[:preset_id]) + preset_email = PresetEmail.where(:service_space_id => SS_ID).find_by(:id => params[:preset_id]) if preset_email.nil? # that preset does not exist flash(:danger, 'Not Found', 'That preset email does not exist') @@ -295,7 +295,7 @@ end post '/admin/email/presets/:preset_id/delete/?' do - preset = PresetEmail.find_by(:id => params[:preset_id]) + preset = PresetEmail.where(:service_space_id => SS_ID).find_by(:id => params[:preset_id]) if preset.nil? # that preset does not exist flash(:danger, 'Not Found', 'That preset email does not exist') diff --git a/routes/admin/events.rb b/routes/admin/events.rb index 64d88965..52d50bb9 100644 --- a/routes/admin/events.rb +++ b/routes/admin/events.rb @@ -27,7 +27,7 @@ page = page.to_i >= 1 ? page.to_i : 1 page_size = 10 tab = ['upcoming', 'past'].include?(params[:tab]) ? params[:tab] : 'upcoming' - preset_events = PresetEvents.order(event_name: :asc).all.to_a + preset_events = PresetEvents.where(:service_space_id => SS_ID).order(event_name: :asc).all.to_a event_type = params[:event_type] case tab @@ -107,7 +107,7 @@ signup_record = EventSignup.find_by(:id => signup_id) unless signup_record == nil - user = User.find_by(:id => signup_record.user_id) + user = User.find_by(:id => signup_record.user_id, :service_space_id => SS_ID) if signup_record.attended == 0 signup_record.attended = 1 @@ -126,6 +126,8 @@ :event_id => event.id ) end + + user.send_attended_orientation_email end end end @@ -141,7 +143,7 @@ signup_record = EventSignup.find_by(:id => signup_id) unless signup_record == nil - user = User.find_by(:id => signup_record.user_id) + user = User.find_by(:id => signup_record.user_id, :service_space_id => SS_ID) if !user.nil? && signup_record.attended == 1 && event.event_type_id == new_member_orientation_id orientation_attendance = AttendedOrientation.find_by(:user_id => user.id) if !orientation_attendance.nil? @@ -177,7 +179,7 @@ signup_id = key.split('attendance_')[1].to_i signup_record = EventSignup.find_by(:id => signup_id) - user = User.find_by(:id => signup_record.user_id) + user = User.find_by(:id => signup_record.user_id, :service_space_id => SS_ID) if signup_record.attended == 0 signup_record.attended = 1 @@ -212,7 +214,10 @@ def event_type_allow_signup_deletions(event_type_id) get '/admin/events/create/?' do @breadcrumbs << {:text => 'Admin Events', :href => '/admin/events/'} << {text: 'Create Event'} - hrc_training_id = EventType.find_by(:description => 'HRC Training', :service_space_id => SS_ID).id + hrc_training_id = nil + if SS_ID == 1 + hrc_training_id = EventType.find_by(:description => 'HRC Training', :service_space_id => SS_ID).id + end tools = Resource.where(:service_space_id => SS_ID, :is_reservable => true).order(:name => :asc).all.to_a all_tools = Resource.where(:service_space_id => SS_ID).order(:name).all.to_a all_tools.sort_by! do |tool| @@ -242,7 +247,7 @@ def event_type_allow_signup_deletions(event_type_id) erb :'admin/new_event', :layout => :fixed, :locals => { :event => Event.new, :types => EventType.where(:service_space_id => SS_ID).all, - :trainers => User.where(:is_trainer => 1).all, + :trainers => User.where(:is_trainer => 1, :service_space_id => SS_ID).all, :locations => Location.where(:service_space_id => SS_ID).all, :tools => tools, :all_tools => all_tools, @@ -263,7 +268,7 @@ def event_type_allow_signup_deletions(event_type_id) erb :'admin/new_event', :layout => :fixed, :locals => { :event => event, :types => EventType.where(:service_space_id => SS_ID).all, - :trainers => User.where(:is_trainer => 1).all, + :trainers => User.where(:is_trainer => 1, :service_space_id => SS_ID).all, :locations => Location.where(:service_space_id => SS_ID).all, :tools => tools, :all_tools => all_tools, @@ -389,7 +394,7 @@ def event_type_allow_signup_deletions(event_type_id) end # email the assigned trainer - trainer_to_email = User.where('id = ?', event.trainer_id) + trainer_to_email = User.where(:service_space_id => SS_ID).where('id = ?', event.trainer_id) trainer_to_email.each do |user| user.notify_trainer_of_new_event(event) @@ -402,7 +407,10 @@ def event_type_allow_signup_deletions(event_type_id) get '/admin/events/:event_id/edit/?' do @breadcrumbs << {:text => 'Admin Events', :href => '/admin/events/'} << {text: 'Edit Event'} - hrc_training_id = EventType.find_by(:description => 'HRC Training', :service_space_id => SS_ID).id + hrc_training_id = nil + if SS_ID == 1 + hrc_training_id = EventType.find_by(:description => 'HRC Training', :service_space_id => SS_ID).id + end event = Event.includes(:event_type, :location, :reservation => :resource).find_by(:id => params[:event_id], :service_space_id => SS_ID) all_tools = Resource.where(:service_space_id => SS_ID).order(:name).all.to_a all_tools.sort_by! do |tool| @@ -452,7 +460,7 @@ def event_type_allow_signup_deletions(event_type_id) erb :'admin/new_event', :layout => :fixed, :locals => { :event => event, :types => EventType.where(:service_space_id => SS_ID).all, - :trainers => User.where(:is_trainer => 1).all, + :trainers => User.where(:is_trainer => 1, :service_space_id => SS_ID).all, :locations => Location.where(:service_space_id => SS_ID).all, :tools => tools, :all_tools => all_tools, @@ -487,7 +495,7 @@ def event_type_allow_signup_deletions(event_type_id) redirect back end - old_trainer = User.where('id = ?', event.trainer_id) + old_trainer = User.where(:service_space_id => SS_ID).where('id = ?', event.trainer_id) # remember original start/end times original_event_start_time = event.start_time @@ -678,7 +686,7 @@ def event_type_allow_signup_deletions(event_type_id) end end - trainer_to_email = User.where('id = ?', event.trainer_id) + trainer_to_email = User.where(:service_space_id => SS_ID).where('id = ?', event.trainer_id) # if trainer has changed if(old_trainer != trainer_to_email) @@ -715,7 +723,7 @@ def event_type_allow_signup_deletions(event_type_id) redirect '/admin/events/' end - trainer_to_email = User.where('id = ?', event.trainer_id) + trainer_to_email = User.where(:service_space_id => SS_ID).where('id = ?', event.trainer_id) trainer_to_email.each do |user| user.notify_trainer_of_deleted_event(event) @@ -732,7 +740,7 @@ def event_type_allow_signup_deletions(event_type_id) get '/admin/events/presets/?' do @breadcrumbs << {:text => 'Manage Event Presets', :href => '/admin/events/presets'} - preset_events = PresetEvents.order(event_name: :asc).all.to_a + preset_events = PresetEvents.where(:service_space_id => SS_ID).order(event_name: :asc).all.to_a event_type_objects = EventType.where(:service_space_id => SS_ID) event_types = {} event_type_objects.each do |type| diff --git a/routes/admin/orientation_attended.rb b/routes/admin/orientation_attended.rb index 4f8e9d79..bfa9fc39 100644 --- a/routes/admin/orientation_attended.rb +++ b/routes/admin/orientation_attended.rb @@ -24,7 +24,7 @@ attendees.each do |attendee| if params.has_key?("expiration-date_#{attendee.user_id}") && params["expiration-date_#{attendee.user_id}"] != "" - user = User.find_by(:id => attendee.user_id) + user = User.find_by(:id => attendee.user_id, :service_space_id => SS_ID) user.set_expiration_date(calculate_time(params[:"expiration-date_#{attendee.user_id}"], 0, 0, 'am')) status = "expired" diff --git a/routes/admin/tools.rb b/routes/admin/tools.rb index e6bb9454..d6ae36e0 100644 --- a/routes/admin/tools.rb +++ b/routes/admin/tools.rb @@ -66,7 +66,7 @@ reservations.each do |reservation| - user_to_email = User.where('id = ?', reservation.user_id) + user_to_email = User.where(:service_space_id => SS_ID).where('id = ?', reservation.user_id) user_to_email.each do |user| user.notify_user_of_broken_equipment(reservation) diff --git a/routes/admin/users.rb b/routes/admin/users.rb index a07f6c85..c5352530 100644 --- a/routes/admin/users.rb +++ b/routes/admin/users.rb @@ -48,7 +48,7 @@ get '/admin/users/active_users/download/?' do # load up a CSV with the data - users = User.where("expiration_date >= ?", Date.today) + users = User.where(:service_space_id => SS_ID).where("expiration_date >= ?", Date.today) csv_string = CSV.generate do |csv| csv << ["User ID", "Username", "Email", "First Name", "Last Name", "University Status", "Date Created", "Space Status", "Expiration Date"] users.each do |user| @@ -258,7 +258,7 @@ end # check that username is not taken - name_user = User.find_by(:username => params[:username]) + name_user = User.find_by(:username => params[:username], :service_space_id => SS_ID) unless name_user.nil? || name_user == user flash(:alert, 'Username Taken', 'Sorry, another user has already taken that username.') redirect back @@ -273,6 +273,8 @@ :university_status => params[:university_status] }) + user.set_active(params.checked?('activate')); + if params[:expiration_date].nil? || params[:expiration_date].empty? user.set_expiration_date(nil) else @@ -417,7 +419,7 @@ post '/admin/users/create/?' do # check that username is not taken - unless User.find_by(:username => params[:username]).nil? + unless User.find_by(:username => params[:username], :service_space_id => SS_ID).nil? flash(:alert, 'Username Taken', 'Sorry, another user has already taken that username.') redirect back end @@ -496,7 +498,7 @@ end todays_date = Date.today.strftime("%Y-%m-%d") - users = User.where("expiration_date IS NOT NULL AND STR_TO_DATE(expiration_date, '%Y-%m-%d') >= ?", todays_date).all + users = User.where(:service_space_id => SS_ID).where("expiration_date IS NOT NULL AND STR_TO_DATE(expiration_date, '%Y-%m-%d') >= ?", todays_date).all users_updated = users.length for user in users do user.expiration_date = user.expiration_date + days_to_add.to_i.day diff --git a/routes/admin/view_check_in.rb b/routes/admin/view_check_in.rb index a657f3c2..f56dac7a 100644 --- a/routes/admin/view_check_in.rb +++ b/routes/admin/view_check_in.rb @@ -2,17 +2,6 @@ require 'models/studio_space.rb' -USER_STATII = [ - 'None', - 'NU Student (UNL, UNO, UNMC, UNK)', - 'NU Faculty (UNL, UNO, UNMC, UNK)', - 'NU Staff (UNL, UNO, UNMC, UNK)', - 'NU Alumni (UNL, UNO, UNMC, UNK)', - 'Non-NU Student (All Other Institutions)', - 'NIS/NIC Partner (NIS/NIC Affiliated Business Employee, Military Veterans)', - 'Community' -] - before '/admin/view_check_in*' do unless has_permission?(Permission::MANAGE_USERS) || has_permission?(Permission::SUPER_USER) raise Sinatra::NotFound @@ -65,7 +54,7 @@ checkIns.order(datetime: :desc) - studios = StudioSpace.pluck(:name) + studios = StudioSpace.where(:service_space_id => SS_ID).pluck(:name) counts = CheckIn.where(datetime: (Time.current - 7.days)..Time.current).where(studio_used: studios).group(:studio_used).count total = 0 @@ -93,7 +82,7 @@ end get '/admin/view_check_in/studio_spaces/?' do - studios = StudioSpace.all + studios = StudioSpace.where(:service_space_id => SS_ID).all @breadcrumbs << {:text => 'Manage Studio Spaces'} erb :'admin/manage_studio_spaces', :layout => :fixed, :locals => { :studios => studios @@ -120,7 +109,7 @@ require_login # check that this is a valid studio - studio = StudioSpace.find_by(:id => params[:studio_id]) + studio = StudioSpace.where(:service_space_id => SS_ID).find_by(:id => params[:studio_id]) if studio.nil? flash(:alert, 'Not Found', 'That studio does not exist.') redirect '/admin/view_check_in/studio_spaces/' diff --git a/routes/alert_center.rb b/routes/alert_center.rb index b0b18822..839597f1 100644 --- a/routes/alert_center.rb +++ b/routes/alert_center.rb @@ -10,45 +10,61 @@ alert_ids.append(alert.alert_id) end - generalAlerts = Alert.all.where(category_id: 1).to_a - generalAlerts.sort_by! do |generalAlerts| - [ - generalAlerts.name.to_s.downcase, - generalAlerts.description.to_s.downcase - ] - end - - woodShopAlerts = Alert.all.where(category_id: 2).to_a - woodShopAlerts.sort_by! do |woodShopAlerts| - [ - woodShopAlerts.name.to_s.downcase, - woodShopAlerts.description.to_s.downcase - ] - end - - metalShopAlerts = Alert.all.where(category_id: 3).to_a - metalShopAlerts.sort_by! do |metalShopAlerts| - [ - metalShopAlerts.name.to_s.downcase, - metalShopAlerts.description.to_s.downcase - ] - end - - digitalFabricationAlerts = Alert.all.where(category_id: 4).to_a - digitalFabricationAlerts.sort_by! do |digitalFabricationAlerts| - [ - digitalFabricationAlerts.name.to_s.downcase, - digitalFabricationAlerts.description.to_s.downcase - ] - end - - artAlerts = Alert.all.where(category_id: 5).to_a - artAlerts.sort_by! do |artAlerts| - [ - artAlerts.name.to_s.downcase, - artAlerts.description.to_s.downcase - ] - end + generalAlerts = nil + woodShopAlerts = nil + metalShopAlerts = nil + digitalFabricationAlerts = nil + artAlerts = nil + + if SS_ID == 1 + generalAlerts = Alert.all.where(category_id: 1).to_a + generalAlerts.sort_by! do |generalAlerts| + [ + generalAlerts.name.to_s.downcase, + generalAlerts.description.to_s.downcase + ] + end + + woodShopAlerts = Alert.all.where(category_id: 2).to_a + woodShopAlerts.sort_by! do |woodShopAlerts| + [ + woodShopAlerts.name.to_s.downcase, + woodShopAlerts.description.to_s.downcase + ] + end + + metalShopAlerts = Alert.all.where(category_id: 3).to_a + metalShopAlerts.sort_by! do |metalShopAlerts| + [ + metalShopAlerts.name.to_s.downcase, + metalShopAlerts.description.to_s.downcase + ] + end + + digitalFabricationAlerts = Alert.all.where(category_id: 4).to_a + digitalFabricationAlerts.sort_by! do |digitalFabricationAlerts| + [ + digitalFabricationAlerts.name.to_s.downcase, + digitalFabricationAlerts.description.to_s.downcase + ] + end + + artAlerts = Alert.all.where(category_id: 5).to_a + artAlerts.sort_by! do |artAlerts| + [ + artAlerts.name.to_s.downcase, + artAlerts.description.to_s.downcase + ] + end + elsif SS_ID == 8 + generalAlerts = Alert.all.where(category_id: 6).to_a + generalAlerts.sort_by! do |generalAlerts| + [ + generalAlerts.name.to_s.downcase, + generalAlerts.description.to_s.downcase + ] + end + end erb :alert_center, :layout => :fixed, :locals => { :generalAlerts => generalAlerts, diff --git a/routes/auth.rb b/routes/auth.rb index f4e2893f..438c02a8 100644 --- a/routes/auth.rb +++ b/routes/auth.rb @@ -161,7 +161,7 @@ end post '/check_in_login/?' do - user = User.where(:username => params[:username]).first + user = User.where(:username => params[:username], :service_space_id => SS_ID).first # check user existence and password correctness if user.nil? || user.password != params[:password] flash(:danger, 'Incorrect Password', 'Username/password combination is incorrect.') @@ -178,7 +178,7 @@ end post '/forgot_password_check_in/' do - user = User.find_by(:username => params[:username].trim) + user = User.find_by(:username => params[:username].trim, :service_space_id => SS_ID) unless user.nil? user.send_reset_password_email end @@ -198,7 +198,7 @@ end post '/login/?' do - user = User.where(:username => params[:username]).first + user = User.where(:username => params[:username], :service_space_id => SS_ID).first next_page = params[:next_page] # check user existence and password correctness if user.nil? || user.password != params[:password] @@ -223,7 +223,7 @@ end post '/forgot_password/' do - user = User.find_by(:username => params[:username].trim) + user = User.find_by(:username => params[:username].trim, :service_space_id => SS_ID) unless user.nil? user.send_reset_password_email end @@ -233,7 +233,7 @@ end get '/reset_password/:token/?' do - user = User.find_by(:reset_password_token => params[:token]) + user = User.find_by(:reset_password_token => params[:token], :service_space_id => SS_ID) not_found if user.nil? || user.reset_password_expiry < Time.now @section = nil @@ -243,7 +243,7 @@ end post '/reset_password/?' do - user = User.find_by(:reset_password_token => params[:token]) + user = User.find_by(:reset_password_token => params[:token], :service_space_id => SS_ID) not_found if user.nil? || user.reset_password_expiry + 5.minutes < Time.now # check password is at least 8 characters diff --git a/routes/check_in.rb b/routes/check_in.rb index 46e11009..50c86c61 100644 --- a/routes/check_in.rb +++ b/routes/check_in.rb @@ -3,7 +3,7 @@ get '/check_in/?' do - studios = StudioSpace.pluck(:name) + studios = StudioSpace.where(:service_space_id => SS_ID).pluck(:name) reasons = ['Training', 'Personal Project', 'Business Project', 'Class Project'] diff --git a/routes/events.rb b/routes/events.rb index 04ecea35..c5b90d92 100644 --- a/routes/events.rb +++ b/routes/events.rb @@ -85,17 +85,17 @@ def flash_message(message) :email => params[:email] ) - body = <Thank you, #{params[:name]} for signing up for #{event.title}. Don't forget that this event is

+ @name = params[:name] + @event = event -

#{event.start_time.in_time_zone.strftime('%A, %B %d at %l:%M %P')}.

- -

We'll see you there!

- -

Nebraska Innovation Studio

-EMAIL + template_path = "#{ROOT}/views/innovationstudio/email_templates/event_signup_nonmember_email.erb" + if SS_ID == 8 + template_path = "#{ROOT}/views/engineering_garage/email_templates/event_signup_nonmember_email.erb" + end + template = File.read(template_path) + body = ERB.new(template).result(binding) - Emailer.mail(params[:email], "Nebraska Innovation Studio - #{event.title}", body) + Emailer.mail(params[:email], "#{CONFIG['app']['title']} - #{event.title}", body) # flash a message that this works flash(:success, "You're signed up!", "Thanks for signing up! Don't forget, #{event.title} is #{event.start_time.in_time_zone.strftime('%A, %B %d at %l:%M %P')}.") @@ -145,17 +145,18 @@ def flash_message(message) ) if !event.free_event_type? - body = <Thank you, #{@user.full_name} for signing up for #{event.title}. Don't forget that this event is

- -

#{event.start_time.in_time_zone.strftime('%A, %B %d at %l:%M %P')}.

- -

We'll see you there!

- -

Nebraska Innovation Studio

-EMAIL - - Emailer.mail(@user.email, "Nebraska Innovation Studio - #{event.title}", body) + @event = event + + if @user.email && !@user.email.empty? + template_path = "#{ROOT}/views/innovationstudio/email_templates/event_signup_email.erb" + if SS_ID == 8 + template_path = "#{ROOT}/views/engineering_garage/email_templates/event_signup_email.erb" + end + template = File.read(template_path) + body = ERB.new(template).result(binding) + + Emailer.mail(@user.email, "#{CONFIG['app']['title']} - #{event.title}", body) + end # flash a message that this works flash(:success, "You're signed up!", "Thanks for signing up! Don't forget, #{event.title} is #{event.start_time.in_time_zone.strftime('%A, %B %d at %l:%M %P')}.") diff --git a/routes/export.rb b/routes/export.rb index b23b5b23..0ffef55f 100644 --- a/routes/export.rb +++ b/routes/export.rb @@ -6,6 +6,8 @@ require 'date' get '/export/?' do + not_found if SS_ID != 1 + require_login user_events = Event.includes(:event_type).joins(:event_signups). where(:event_signups => {:user_id => @user.id}). diff --git a/routes/home.rb b/routes/home.rb index 25e7abf7..65a98daa 100644 --- a/routes/home.rb +++ b/routes/home.rb @@ -33,7 +33,6 @@ :events => user_events, :trainer_events => trainer_events, :user_alerts => user_alerts - } end diff --git a/routes/maker_request.rb b/routes/maker_request.rb index 440530bf..74e006df 100644 --- a/routes/maker_request.rb +++ b/routes/maker_request.rb @@ -1,6 +1,8 @@ require 'models/maker_request' get '/maker_request/?' do + not_found if SS_ID != 1 + @breadcrumbs << {:text => 'Create Maker Request'} erb :maker_request, :layout => :fixed, :locals => { @@ -10,6 +12,8 @@ end get '/maker_request/how_to' do + not_found if SS_ID != 1 + @breadcrumbs << {:text => 'How To'} require_login @@ -17,6 +21,8 @@ end get '/maker_request/:maker_request_id/view/?' do + not_found if SS_ID != 1 + @breadcrumbs << {:text => 'View Maker Request'} maker_request = Maker_Request.find(params[:maker_request_id]) @@ -29,6 +35,8 @@ end get '/maker_request/:maker_request_uuid/edit/?' do + not_found if SS_ID != 1 + @breadcrumbs << {:text => 'Edit Maker Request'} maker_request = Maker_Request.find_by(uuid: params[:maker_request_uuid]) @@ -44,6 +52,8 @@ end get '/maker_request/:maker_request_uuid/manage/?' do + not_found if SS_ID != 1 + @breadcrumbs << {:text => 'Manage Maker Request'} maker_request = Maker_Request.find_by(uuid: params[:maker_request_uuid]) @@ -55,6 +65,8 @@ end get '/maker_request/:maker_request_uuid/open/?' do + not_found if SS_ID != 1 + maker_request = Maker_Request.find_by(uuid: params[:maker_request_uuid]) not_found if maker_request.nil? @@ -69,6 +81,8 @@ end get '/maker_request/:maker_request_uuid/close/?' do + not_found if SS_ID != 1 + maker_request = Maker_Request.find_by(uuid: params[:maker_request_uuid]) not_found if maker_request.nil? @@ -83,6 +97,7 @@ end get '/maker_request/:maker_request_uuid/delete/?' do + not_found if SS_ID != 1 maker_request = Maker_Request.find_by(uuid: params[:maker_request_uuid]) not_found if maker_request.nil? @@ -99,6 +114,7 @@ end post '/maker_request/?' do + not_found if SS_ID != 1 extras = { confirm_email: params[:confirm_email], @@ -144,6 +160,8 @@ end post '/maker_request/:maker_request_uuid/edit/?' do + not_found if SS_ID != 1 + maker_request = Maker_Request.find_by(uuid: params[:maker_request_uuid]) not_found if maker_request.nil? @@ -189,6 +207,8 @@ get '/maker_request/list/?' do + not_found if SS_ID != 1 + @breadcrumbs << {:text => 'Maker Request List'} require_login @@ -202,6 +222,8 @@ end get '/maker_request/lookup/?' do + not_found if SS_ID != 1 + @breadcrumbs << {:text => 'Maker Request Lookup'} lookup_email = '' @@ -219,6 +241,8 @@ end post '/maker_request/lookup/?' do + not_found if SS_ID != 1 + maker_requests = [] if params[:lookup_email].nil? || params[:lookup_email].strip.empty? flash :alert, 'Lookup Email', 'Please provide an email to lookup' diff --git a/routes/new_members.rb b/routes/new_members.rb index 4b7f8574..f76bb8e9 100644 --- a/routes/new_members.rb +++ b/routes/new_members.rb @@ -23,6 +23,8 @@ end get '/hrc/?' do + not_found if SS_ID != 1 + @breadcrumbs << {:text => 'HRC Trainings'} hrc_training_id = EventType.find_by(:description => 'HRC Training', :service_space_id => SS_ID).id @@ -40,7 +42,10 @@ get '/new_members/sign_up/:event_id/?' do # check if this is a new member signup orientation new_member_orientation_id = EventType.find_by(:description => 'New Member Orientation', :service_space_id => SS_ID).id - hrc_training_id = EventType.find_by(:description => 'HRC Training', :service_space_id => SS_ID).id + hrc_training_id = nil + if SS_ID == 1 + hrc_training_id = EventType.find_by(:description => 'HRC Training', :service_space_id => SS_ID).id + end event = Event.includes(:event_signups).find_by(:service_space_id => SS_ID, :id => params[:event_id]) if event.nil? || (event.event_type_id != new_member_orientation_id && event.event_type_id != hrc_training_id) @@ -83,7 +88,10 @@ post '/new_members/sign_up/:event_id/?' do # check if this is a new member signup orientation new_member_orientation_id = EventType.find_by(:description => 'New Member Orientation', :service_space_id => SS_ID).id - hrc_training_id = EventType.find_by(:description => 'HRC Training', :service_space_id => SS_ID).id + hrc_training_id = nil + if SS_ID == 1 + hrc_training_id = EventType.find_by(:description => 'HRC Training', :service_space_id => SS_ID).id + end event = Event.includes(:event_signups).find_by(:service_space_id => SS_ID, :id => params[:event_id]) if event.nil? || (event.event_type_id != new_member_orientation_id && event.event_type_id != hrc_training_id) @@ -113,21 +121,6 @@ redirect back end - body = <Thank you, #{params[:name]} for signing up for #{event.title}. Don't forget that the event is

- -

#{event.start_time.in_time_zone.strftime('%A, %B %d at %l:%M %P')}.

- -

Our main entrance is on the northwest side of the Innovation Commons building on 19th St. just off Transformation Drive. Our address is 2021 Transformation Drive, Suite 1500, Entrance B.

- -

For parking, use our new member orientation parking. Vehicles parked at any other location will be ticketed $50.00.

- -

We'll see you there!

- -

Nebraska Innovation Studio

-EMAIL - - VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i if !VALID_EMAIL_REGEX.match(params[:email]) @@ -148,7 +141,7 @@ # Create a new user name based on the username_parameters, if the name already exists, increment the name. counter = 2 while true - if User.find_by(:username => "#{username_parameters + counter.to_s}").nil? + if User.find_by(:username => "#{username_parameters + counter.to_s}", :service_space_id => SS_ID).nil? user.username = "#{username_parameters + counter.to_s}" break end @@ -295,18 +288,38 @@ :user_id => user.id ) - Emailer.mail(params[:email], "Nebraska Innovation Studio - #{event.title}", body) + @name = params[:first_name] + " " + params[:last_name] + @event = event + + template_path = "#{ROOT}/views/innovationstudio/email_templates/new_member_email.erb" + if SS_ID == 8 + template_path = "#{ROOT}/views/engineering_garage/email_templates/new_member_email.erb" + end + template = File.read(template_path) + body = ERB.new(template).result(binding) + + Emailer.mail(params[:email], "#{CONFIG['app']['title']} - #{event.title}", body) # flash a message that this works flash(:success, "You're signed up!", "Thanks for signing up! Don't forget, this is at #{event.start_time.in_time_zone.strftime('%A, %B %d at %l:%M %P')}. Check your email for more information about the event and where to park.") - if event.event_type_id == hrc_training_id - robotics_email = <There was a new sign up for "#{event.title}" that is at #{event.start_time.in_time_zone.strftime('%A, %B %d at %l:%M %P')}.

-

The person who signed up is #{params[:first_name] + " " + params[:last_name]} and their email is #{params[:email]}.

-EMAIL - - Emailer.mail("nisrobotics@unl.edu", "New HRC Training Sign up", robotics_email); - redirect '/hrc/' + if SS_ID == 1 + if event.event_type_id == hrc_training_id + @name = params[:first_name] + " " + params[:last_name] + @email = params[:email] + @event = event + + template_path = "#{ROOT}/views/innovationstudio/email_templates/hrc_signup_email.erb" + if SS_ID == 8 + template_path = "#{ROOT}/views/engineering_garage/email_templates/hrc_signup_email.erb" + end + template = File.read(template_path) + body = ERB.new(template).result(binding) + + Emailer.mail("nisrobotics@unl.edu", "New HRC Training Sign up", robotics_email); + redirect '/hrc/' + else + redirect '/new_members/' + end else redirect '/new_members/' end @@ -323,6 +336,7 @@ def check_form_data(form_data, key) def verify_recaptcha(options = {}) options = {model: options} unless options.is_a? Hash + return true if CONFIG['reCaptcha']['site_key'].empty? return true if Recaptcha.skip_env?(options[:env]) model = options[:model] diff --git a/routes/tools.rb b/routes/tools.rb index 065bd527..65e7dbb9 100644 --- a/routes/tools.rb +++ b/routes/tools.rb @@ -41,21 +41,27 @@ WHERE_CLAUSE = 'start_time >= ?' + events_advanced = nil + events_creation = nil + events_general = nil + machine_training_id = EventType.find_by(:description => 'Machine Training', :service_space_id => SS_ID).id events = Event.includes(:event_signups).where(:service_space_id => SS_ID, :event_type_id => machine_training_id). - where(WHERE_CLAUSE, Time.now).order(:start_time => :asc).all + where(WHERE_CLAUSE, Time.now).order(:start_time => :asc).all - workshop_id = EventType.find_by(:description => 'Advanced Skill-Based Workshop', :service_space_id => SS_ID).id - events_advanced = Event.includes(:event_signups).where(:service_space_id => SS_ID, :event_type_id => workshop_id). - where(WHERE_CLAUSE, Time.now).order(:start_time => :asc).all + if SS_ID == 1 + workshop_id = EventType.find_by(:description => 'Advanced Skill-Based Workshop', :service_space_id => SS_ID).id + events_advanced = Event.includes(:event_signups).where(:service_space_id => SS_ID, :event_type_id => workshop_id). + where(WHERE_CLAUSE, Time.now).order(:start_time => :asc).all - workshop_id = EventType.find_by(:description => 'Creation Workshop', :service_space_id => SS_ID).id - events_creation = Event.includes(:event_signups).where(:service_space_id => SS_ID, :event_type_id => workshop_id). - where(WHERE_CLAUSE, Time.now).order(:start_time => :asc).all + workshop_id = EventType.find_by(:description => 'Creation Workshop', :service_space_id => SS_ID).id + events_creation = Event.includes(:event_signups).where(:service_space_id => SS_ID, :event_type_id => workshop_id). + where(WHERE_CLAUSE, Time.now).order(:start_time => :asc).all - workshop_id = EventType.find_by(:description => 'General Workshop', :service_space_id => SS_ID).id - events_general = Event.includes(:event_signups).where(:service_space_id => SS_ID, :event_type_id => workshop_id). - where(WHERE_CLAUSE, Time.now).order(:start_time => :asc).all + workshop_id = EventType.find_by(:description => 'General Workshop', :service_space_id => SS_ID).id + events_general = Event.includes(:event_signups).where(:service_space_id => SS_ID, :event_type_id => workshop_id). + where(WHERE_CLAUSE, Time.now).order(:start_time => :asc).all + end erb :trainings, :layout => :fixed, :locals => { @@ -105,17 +111,18 @@ :email => @user.email ) - body = <Thank you, #{@user.full_name} for signing up for #{event.title}. Don't forget that this training is

- -

#{event.start_time.in_time_zone.strftime('%A, %B %d at %l:%M %P')}.

- -

We'll see you there!

+ @event = event -

Nebraska Innovation Studio

-EMAIL - - Emailer.mail(@user.email, "Nebraska Innovation Studio - #{event.title}", body) + if @user.email && !@user.email.empty? + template_path = "#{ROOT}/views/innovationstudio/email_templates/training_signup_email.erb" + if SS_ID == 8 + template_path = "#{ROOT}/views/engineering_garage/email_templates/training_signup_email.erb" + end + template = File.read(template_path) + body = ERB.new(template).result(binding) + + Emailer.mail(@user.email, "#{CONFIG['app']['title']} - #{event.title}", body) + end # flash a message that this works flash(:success, "You're signed up!", "Thanks for signing up! Don't forget, #{event.title} is #{event.start_time.in_time_zone.strftime('%A, %B %d at %l:%M %P')}.") diff --git a/routes/tours.rb b/routes/tours.rb index 1ca2cd86..25020491 100644 --- a/routes/tours.rb +++ b/routes/tours.rb @@ -3,6 +3,8 @@ require 'classes/emailer' get '/tours/?' do + not_found if SS_ID != 1 + @breadcrumbs << {:text => 'Tours'} tour_id = EventType.find_by(:description => 'Tour', :service_space_id => SS_ID).id @@ -12,6 +14,8 @@ end get '/tours/sign_up/:event_id/?' do + not_found if SS_ID != 1 + @breadcrumbs << {:text => 'Tours', :href => '/tours/'} << {text: 'Sign Up'} # check if this is a tour signup @@ -33,6 +37,8 @@ end post '/tours/sign_up/:event_id/?' do + not_found if SS_ID != 1 + # check if this is a new member signup orientation tour_id = EventType.find_by(:description => 'Tour', :service_space_id => SS_ID).id event = Event.includes(:event_signups).find_by(:service_space_id => SS_ID, :id => params[:event_id]) diff --git a/routes/training_documents.rb b/routes/training_documents.rb index d2c4b66c..40ce3484 100644 --- a/routes/training_documents.rb +++ b/routes/training_documents.rb @@ -1,11 +1,15 @@ require 'net/http' get '/training-documents/?' do + not_found if SS_ID != 1 + @breadcrumbs << {:text => 'Training Documents'} erb :training_documents, :layout => :fixed end get '/training-documents/sop/?' do + not_found if SS_ID != 1 + @breadcrumbs << {:text => 'Training Documents', :href => '/training-documents'} @breadcrumbs << {:text => 'SOP'} diff --git a/routes/vehicles.rb b/routes/vehicles.rb index e2223f7f..4484f637 100644 --- a/routes/vehicles.rb +++ b/routes/vehicles.rb @@ -63,7 +63,7 @@ vehicle.model = model if params[:user_id].present? - user = User.find_by(:id => params[:user_id]) + user = User.find_by(:id => params[:user_id], :service_space_id => SS_ID) if user.nil? raise StandardError.new "A user does not exist with user ID #{params[:user_id]}" end @@ -113,7 +113,7 @@ vehicle.model = model if params[:user_id].present? - user = User.find_by(:id => params[:user_id]) + user = User.find_by(:id => params[:user_id], :service_space_id => SS_ID) if user.nil? raise StandardError.new "A user does not exist with user ID #{params[:user_id]}" end @@ -160,7 +160,7 @@ vehicle.destroy if params[:user_id].present? - user = User.find_by(:id => params[:user_id]) + user = User.find_by(:id => params[:user_id], :service_space_id => SS_ID) if user.nil? raise StandardError.new "A user does not exist with user ID #{params[:user_id]}" end diff --git a/routes/workshops.rb b/routes/workshops.rb index 74f144ef..9d8fc6d7 100644 --- a/routes/workshops.rb +++ b/routes/workshops.rb @@ -9,30 +9,46 @@ @breadcrumbs << {:text => 'Workshops'} require_login - workshop_id = EventType.find_by(:description => 'Advanced Skill-Based Workshop', :service_space_id => SS_ID).id - events_advanced = Event.includes(:event_signups).where(:service_space_id => SS_ID, :event_type_id => workshop_id). - where('start_time >= ?', Time.now).order(:start_time => :asc).all - - workshop_id = EventType.find_by(:description => 'Creation Workshop', :service_space_id => SS_ID).id - events_creation = Event.includes(:event_signups).where(:service_space_id => SS_ID, :event_type_id => workshop_id). - where('start_time >= ?', Time.now).order(:start_time => :asc).all + events_advanced = nil + events_creation = nil workshop_id = EventType.find_by(:description => 'General Workshop', :service_space_id => SS_ID).id events_general = Event.includes(:event_signups).where(:service_space_id => SS_ID, :event_type_id => workshop_id). where('start_time >= ?', Time.now).order(:start_time => :asc).all + if SS_ID == 1 + workshop_id = EventType.find_by(:description => 'Advanced Skill-Based Workshop', :service_space_id => SS_ID).id + events_advanced = Event.includes(:event_signups).where(:service_space_id => SS_ID, :event_type_id => workshop_id). + where('start_time >= ?', Time.now).order(:start_time => :asc).all + + workshop_id = EventType.find_by(:description => 'Creation Workshop', :service_space_id => SS_ID).id + events_creation = Event.includes(:event_signups).where(:service_space_id => SS_ID, :event_type_id => workshop_id). + where('start_time >= ?', Time.now).order(:start_time => :asc).all + + workshop_id = EventType.find_by(:description => 'General Workshop', :service_space_id => SS_ID).id + events_general = Event.includes(:event_signups).where(:service_space_id => SS_ID, :event_type_id => workshop_id). + where('start_time >= ?', Time.now).order(:start_time => :asc).all + end + erb :workshops, :layout => :fixed, :locals => { - :events_advanced => events_advanced, :events_creation => events_creation, :events_general => events_general + :events_advanced => events_advanced, + :events_creation => events_creation, + :events_general => events_general } end post '/workshops/sign_up/:event_id/?' do require_login + workshop_id_advanced = nil + workshop_id_creation = nil + workshop_id_general = EventType.find_by(:description => 'General Workshop', :service_space_id => SS_ID).id + if SS_ID == 1 + workshop_id_advanced = EventType.find_by(:description => 'Advanced Skill-Based Workshop', :service_space_id => SS_ID).id + workshop_id_creation ||= EventType.find_by(:description => 'Creation Workshop', :service_space_id => SS_ID).id + end + # check that is a valid event - workshop_id_advanced = EventType.find_by(:description => 'Advanced Skill-Based Workshop', :service_space_id => SS_ID).id - workshop_id_creation ||= EventType.find_by(:description => 'Creation Workshop', :service_space_id => SS_ID).id - workshop_id_general ||= EventType.find_by(:description => 'General Workshop', :service_space_id => SS_ID).id event = Event.find_by(:service_space_id => SS_ID, :event_type_id => workshop_id_advanced, :id => params[:event_id]) event ||= Event.find_by(:service_space_id => SS_ID, :event_type_id => workshop_id_creation, :id => params[:event_id]) event ||= Event.find_by(:service_space_id => SS_ID, :event_type_id => workshop_id_general, :id => params[:event_id]) @@ -68,17 +84,18 @@ :email => @user.email ) - body = <Thank you, #{@user.full_name} for signing up for #{event.title}. Don't forget that this workshop is

- -

#{event.start_time.in_time_zone.strftime('%A, %B %d at %l:%M %P')}.

- -

We'll see you there!

+ @event = event -

Nebraska Innovation Studio

-EMAIL - - Emailer.mail(@user.email, "Nebraska Innovation Studio - #{event.title}", body) + if @user.email && !@user.email.empty? + template_path = "#{ROOT}/views/innovationstudio/email_templates/workshop_signup_email.erb" + if SS_ID == 8 + template_path = "#{ROOT}/views/engineering_garage/email_templates/workshop_signup_email.erb" + end + template = File.read(template_path) + body = ERB.new(template).result(binding) + + Emailer.mail(@user.email, "#{CONFIG['app']['title']} - #{event.title}", body) + end # flash a message that this works flash(:success, "You're signed up!", "Thanks for signing up! Don't forget, #{event.title} is #{event.start_time.in_time_zone.strftime('%A, %B %d at %l:%M %P')}.") diff --git a/scripts/email_expiring_users.rb b/scripts/email_expiring_users.rb index 857f343c..cb2c284e 100644 --- a/scripts/email_expiring_users.rb +++ b/scripts/email_expiring_users.rb @@ -1,3 +1,5 @@ +require 'bundler/setup' + require_relative '../utils/language' ENV['RACK_ENV'] ||= 'development' # load the config file @@ -11,7 +13,7 @@ require 'models/service_space' require 'models/expiration_reminder' -SS_ID = ServiceSpace.where(:name => 'Innovation Studio').first.id +SS_ID = ServiceSpace.where(:id => CONFIG['app']['service_space_id']).first.id reminder = ExpirationReminder.first diff --git a/scripts/email_expiring_users_vehicle_update.rb b/scripts/email_expiring_users_vehicle_update.rb index eec2edfe..e442f392 100644 --- a/scripts/email_expiring_users_vehicle_update.rb +++ b/scripts/email_expiring_users_vehicle_update.rb @@ -1,3 +1,5 @@ +require 'bundler/setup' + require_relative '../utils/language' ENV['RACK_ENV'] ||= 'development' # load the config file @@ -10,7 +12,7 @@ require 'models/user' require 'models/service_space' -SS_ID = ServiceSpace.where(:name => 'Innovation Studio').first.id +SS_ID = ServiceSpace.where(:id => CONFIG['app']['service_space_id']).first.id users_expiring_today = User.where(:service_space_id => SS_ID).where('expiration_date >= ? AND expiration_date < ?', Time.now - 1.days, Time.now).all if users_expiring_today.count > 0 @@ -18,5 +20,5 @@ users_expiring_today.each do |user| body = body + "

Full Name: #{user.first_name} #{user.last_name}, Username: #{user.username}

" end - Emailer.mail("innovationstudio@unl.edu", "Expiring Users' Parking Information Update", body, '', nil) + Emailer.mail(CONFIG['app']['email_from'], "Expiring Users' Parking Information Update", body, '', nil) end \ No newline at end of file diff --git a/scripts/email_unconfirmed_trainers.rb b/scripts/email_unconfirmed_trainers.rb index 88943935..47170a7e 100644 --- a/scripts/email_unconfirmed_trainers.rb +++ b/scripts/email_unconfirmed_trainers.rb @@ -1,3 +1,5 @@ +require 'bundler/setup' + require_relative '../utils/language' ENV['RACK_ENV'] ||= 'development' # load the config file @@ -10,7 +12,7 @@ require 'models/user' require 'models/service_space' -SS_ID = ServiceSpace.where(:name => 'Innovation Studio').first.id +SS_ID = ServiceSpace.where(:id => CONFIG['app']['service_space_id']).first.id trainers_to_notify = User. diff --git a/src/less/lib/eventicon-embedded.less b/src/less/lib/eventicon-embedded.less index 45bc3a9f..06d2cd83 100644 --- a/src/less/lib/eventicon-embedded.less +++ b/src/less/lib/eventicon-embedded.less @@ -11,29 +11,17 @@ src: url('data:application/octet-stream;base64,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') format('woff'), url('data:application/octet-stream;base64,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') format('truetype'); } -/* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */ -/* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */ -/* -@media screen and (-webkit-min-device-pixel-ratio:0) { - @font-face { - font-family: 'eventicon'; - src: url('../font/eventicon.svg?22213170#eventicon') format('svg'); - } -} -*/ [class^="eventicon-"]:before, [class*=" eventicon-"]:before { font-family: "eventicon"; font-style: normal; font-weight: normal; speak: none; - display: inline-block; text-decoration: inherit; width: 1em; margin-right: .2em; text-align: center; - /* opacity: .8; */ /* For safety - reset parent styles, that can break glyph codes*/ font-variant: normal; @@ -45,12 +33,6 @@ /* Animation center compensation - margins should be symmetric */ /* remove if not needed */ margin-left: .2em; - - /* you can be more comfortable with increased icons size */ - /* font-size: 120%; */ - - /* Uncomment for 3D effect */ - /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */ } .eventicon-plus-circled:before { content: '\e800'; } /* '' */ .eventicon-search:before { content: '\e801'; } /* '' */ diff --git a/src/less/lib/fonts.less b/src/less/lib/fonts.less deleted file mode 100644 index aa6f2e73..00000000 --- a/src/less/lib/fonts.less +++ /dev/null @@ -1,23 +0,0 @@ -.base-font() { - font-family: "Mercury SSm A", "Mercury SSm B", Georgia, Baskerville, "Baskerville Old Face", "Hoefler Text", Garamond, "Times New Roman", serif; - font-weight: 400; - font-style: normal; -} - -.display-font() { - font-family: "Mercury Display A", "Mercury Display B", Georgia, Baskerville, "Baskerville Old Face", "Hoefler Text", Garamond, "Times New Roman", serif; - font-weight: 400; - font-style: normal; -} - -.brand-font() { - font-family: "Tungsten A", "Tungsten B", "HelveticaNeueCondensed", "HelveticaNeue-Condensed", "Helvetica Neue Condensed", "HelveticaNeueRomanCondensed", "HelveticaNeue-Roman-Condensed", "Helvetica Neue Roman Condensed", "Arial Narrow", "HelveticaNeue", "Helvetica Neue", "HelveticaNeueRoman", "HelveticaNeue-Roman", "Helvetica Neue Roman", "Helvetica", "Tahoma", "Geneva", "Arial", sans-serif; - font-weight: 400; - font-style: normal; -} - -.heading-font() { - font-family: "Tungsten A", "Tungsten B", Impact, Haettenschweiler, "Arial Narrow Bold", "Franklin Gothic Bold", Charcoal, "Helvetica Inserat", "Bitstream Vera Sans Bold", "Arial Black", sans-serif; - font-weight: 600; - font-style: normal; -} diff --git a/src/less/innovation_studio.less b/src/less/main.less similarity index 89% rename from src/less/innovation_studio.less rename to src/less/main.less index 018c2dba..422133f7 100644 --- a/src/less/innovation_studio.less +++ b/src/less/main.less @@ -3,7 +3,6 @@ @import "lib/lesshat.less"; @import "lib/breakpoints.less"; @import "lib/colors.less"; -@import "lib/fonts.less"; @import "lib/eventicon-embedded.less"; .clearfix:after { @@ -46,7 +45,7 @@ select[multiple=multiple] { } .calendar-container { - font-family: "Gotham SSm A","Gotham SSm B",Verdana,"Verdana Ref",Geneva,Tahoma,"Lucida Grande","Lucida Sans Unicode","Lucida Sans","DejaVu Sans","Bitstream Vera Sans","Liberation Sans",sans-serif; + font-family: Work Sans,"Sans Serif Fallback",sans-serif; width: 100%; text-align: center; .time-labels { @@ -93,6 +92,7 @@ select[multiple=multiple] { text-align: left; padding: 3px; word-wrap: break-word; + color: black; &.new-member-orientation { background: #FFFFB8; border-color: darken(#FFFFB8, 50%); @@ -206,7 +206,7 @@ select[multiple=multiple] { font-size: .802em !important; margin: 0; border-bottom: 1px solid #474746; - font-family: "Gotham SSm A","Gotham SSm B",Verdana,"Verdana Ref",Geneva,Tahoma,"Lucida Grande","Lucida Sans Unicode","Lucida Sans","DejaVu Sans","Bitstream Vera Sans","Liberation Sans",sans-serif; + font-family: Work Sans,"Sans Serif Fallback",sans-serif; width: 100%; background-color: #474746; padding: 1em; @@ -225,7 +225,7 @@ select[multiple=multiple] { margin: 0; a { border-bottom: none; - font-family: "Gotham SSm A","Gotham SSm B",Verdana,"Verdana Ref",Geneva,Tahoma,"Lucida Grande","Lucida Sans Unicode","Lucida Sans","DejaVu Sans","Bitstream Vera Sans","Liberation Sans",sans-serif; + font-family: Work Sans,"Sans Serif Fallback",sans-serif; } } } diff --git a/startup.sh.sample b/startup.sh.sample index 6df11011..1786c081 100755 --- a/startup.sh.sample +++ b/startup.sh.sample @@ -3,5 +3,5 @@ export GEM_PATH=/var/www/html/innovationstudio-manager.unl.edu/gems:$GEM_PATH export PATH=/opt/unl.edu/ruby/current/bin:$PATH cd /var/www/html/innovationstudio-manager.unl.edu -/opt/unl.edu/ruby/current/bin/bundle exec unicorn -p 9393 -E production -D -c /var/www/html/innovationstudio-manager.unl.edu/unicorn.rb +/opt/unl.edu/ruby/current/bin/bundle exec unicorn -p 9393 -E production -c /var/www/html/innovationstudio-manager.unl.edu/unicorn.rb diff --git a/unicorn.rb.sample b/unicorn.rb.sample index 1e8e6042..982ae040 100644 --- a/unicorn.rb.sample +++ b/unicorn.rb.sample @@ -1,4 +1,3 @@ worker_processes 1 working_directory '/var/www/html/innovationstudio-manager.unl.edu' pid '/var/www/html/innovationstudio-manager.unl.edu/innovationstudio-manager.pid' -stderr_path '/var/www/html/innovationstudio-manager.unl.edu/error.log' diff --git a/views/admin/edit_user.erb b/views/admin/edit_user.erb index 344c6fc2..c2dddc0d 100644 --- a/views/admin/edit_user.erb +++ b/views/admin/edit_user.erb @@ -49,9 +49,17 @@
-
- - +
Membership
+
+ /> + +
+ +
+
+ + +
@@ -217,3 +225,15 @@ }); }); });]) %> + +<% append_script_declaration(%q[ + let activate_checkbox = document.getElementById('activate'); + let expiration_date_div = document.getElementById('expiration-date'); + activate_checkbox.addEventListener('change', () => { + if ( activate_checkbox.checked ) { + expiration_date_div.classList.remove('dcf-d-none'); + } else { + expiration_date_div.classList.add('dcf-d-none'); + } + }); +]) %> diff --git a/views/admin/emails.erb b/views/admin/emails.erb index c460f040..5a5c03a9 100644 --- a/views/admin/emails.erb +++ b/views/admin/emails.erb @@ -1,4 +1,4 @@ -

Innovation Studio Email

+

<%= CONFIG['app']['title'] %> Email

Send Email to User(s)

Compose diff --git a/views/admin/new_event.erb b/views/admin/new_event.erb index 311cadfa..9ca6dec8 100644 --- a/views/admin/new_event.erb +++ b/views/admin/new_event.erb @@ -56,17 +56,19 @@
-
-
- id="hrc_feed" name="hrc_feed"> + <% if SS_ID == 1 %> +
+
+ id="hrc_feed" name="hrc_feed"> +
-
-
-
- id="hrc_parking" name="hrc_parking"> +
+
+ id="hrc_parking" name="hrc_parking"> +
-
+ <% end %>
@@ -267,6 +269,7 @@
+ <% if SS_ID == 1 %>
@@ -283,6 +286,7 @@
+ <% end %> @@ -296,6 +300,7 @@
<% append_script_declaration("WDN.initializePlugin('datepickers');") %> +<% if SS_ID == 1 %> <% append_script_declaration(%q[ const type_select = document.getElementById('type'); const event_code = document.getElementById('event-code'); @@ -327,44 +332,19 @@ update_hrc_inputs(); type_select.addEventListener('input', update_hrc_inputs); ])%> +<% end %> <% append_script_declaration(%q[WDN.initializePlugin('jqueryui', [function() { $ = require('jquery'); // sets AM/PM radio buttons and mods the time passed if necessary - function setAMPM(time) { - switch (time) { - case 13: - if ($('input[name="start_time_am_pm"]:checked').val() === 'pm') { - $('#end-time-am-pm-pm').prop('checked', true); - $('#end-time-am-pm-am').prop('checked', false); - } else { - $('#end-time-am-pm-am').prop('checked', true); - $('#end-time-am-pm-pm').prop('checked', false); - } - time = 1; - break; - - case 12: - if ($('input[name="start_time_am_pm"]:checked').val() === 'am') { - $('#end-time-am-pm-pm').prop('checked', true); - $('#end-time-am-pm-am').prop('checked', false); - } else { - $('#end-time-am-pm-am').prop('checked', true); - $('#end-time-am-pm-pm').prop('checked', false); - } - break; - - default: - if ($('input[name="start_time_am_pm"]:checked').val() === 'pm') { - $('#end-time-am-pm-pm').prop('checked', true); - $('#end-time-am-pm-am').prop('checked', false); - } else { - $('#end-time-am-pm-am').prop('checked', true); - $('#end-time-am-pm-pm').prop('checked', false); - } - break; + function setEndTimeAMPM(time) { + if (time < 12) { + $('#end-time-am-pm-am').prop('checked', true); + $('#end-time-am-pm-pm').prop('checked', false); + } else { + $('#end-time-am-pm-am').prop('checked', false); + $('#end-time-am-pm-pm').prop('checked', true); } - return time; } @@ -399,33 +379,47 @@ $('#start-time-hour').change(function (change) { start_time_hour = parseInt($('#start-time-hour').val()); duration = parseInt($('#duration').val()); - time = start_time_hour + ((duration - (duration % 60)) / 60); - time = setAMPM(time); - $('#end-time-hour').val(time); + duration_hour_delta = Math.floor(duration / 60) % 24; + new_end_hour = start_time_hour + duration_hour_delta; + + setEndTimeAMPM(new_end_hour); + new_end_hour_in_12 = (new_end_hour % 12); + $('#end-time-hour').val(new_end_hour_in_12); }).change(); $('#start-time-minute').change(function (change) { start_time_minute = parseInt($('#start-time-minute').val()); start_time_hour = parseInt($('#start-time-hour').val()); duration = parseInt($('#duration').val()); - time = start_time_minute + (duration % 60); - hour_time = start_time_hour + ((duration - (duration % 60)) / 60); - hour_time = setAMPM(hour_time); - hour = hour_time + Math.floor(time/60); - if (time >= 60){ - $('#end-time-hour').val(hour % 12); - time = setAMPM(time); - $('#end-time-minute').val(time); + duration_hour_delta = Math.floor(duration / 60) % 24; + duration_minute_delta = duration % 60; + new_end_hour = start_time_hour + duration_hour_delta; + new_end_minute = start_time_minute + duration_minute_delta; + + if (new_end_minute > 60) { + new_end_hour = (new_end_hour + 1) % 12; + new_end_minute = new_end_minute % 60; } - else { - $('#end-time-hour').val(hour); - } - $('#end-time-minute').val(time); + + setEndTimeAMPM(new_end_hour); + new_end_hour_in_12 = (new_end_hour % 12); + $('#end-time-hour').val(new_end_hour_in_12); + $('#end-time-minute').val(new_end_minute); }).change(); $('#start-date').change(function (change) { start_date = $('#start-date').val(); - $('#end-date').val(start_date); + duration = parseInt($('#duration').val()); + duration_day_delta = Math.floor(duration / 60 / 24); + + new_start_date = new Date(start_date); + new_start_date.setDate(new_start_date.getDate() + duration_day_delta); + + let day = ("0" + new_start_date.getDate()).slice(-2); + let month = ("0" + (new_start_date.getMonth() + 1)).slice(-2); + let formatted_date = month + '/' + day + '/' + new_start_date.getFullYear(); + + $('#end-date').val(formatted_date); }).change(); }]);]) %> \ No newline at end of file diff --git a/views/alert_center.erb b/views/alert_center.erb index 123c30e0..ccccb0ba 100644 --- a/views/alert_center.erb +++ b/views/alert_center.erb @@ -1,62 +1,21 @@

Manage Your Alert Groups

-
-
-
- <% if !generalAlerts.empty? %> -

General Alerts

- <% generalAlerts.each do |alert| %> - type="checkbox" name="alert_id_<%=alert.id%>" value=<%=alert.id%> /> <%= alert.name %>
- <% if !alert.description.blank? %> -

- <%=alert.description%>

- <% end %> - <% end %> - <% end %> -
-
- <% if !woodShopAlerts.empty? %> -

Woodshop Alerts

- <% woodShopAlerts.each do |alert| %> - type="checkbox" name="alert_id_<%=alert.id%>" value=<%=alert.id%> /> <%= alert.name %>
- <% if !alert.description.blank? %> -

- <%=alert.description%>

- <% end %> - <% end %> - <% end %> -
-
- <% if !metalShopAlerts.empty? %> -

Metalshop Alerts

- <% metalShopAlerts.each do |alert| %> - type="checkbox" name="alert_id_<%=alert.id%>" value=<%=alert.id%> /> <%= alert.name %>
- <% if !alert.description.blank? %> -

- <%=alert.description%>

- <% end %> - <% end %> - <% end %> -
-
- <% if !digitalFabricationAlerts.empty? %> -

Digital Fabrication Alerts

- <% digitalFabricationAlerts.each do |alert| %> - type="checkbox" name="alert_id_<%=alert.id%>" value=<%=alert.id%> /> <%= alert.name %>
- <% if !alert.description.blank? %> -

- <%=alert.description%>

- <% end %> - <% end %> - <% end %> -
-
- <% if !artAlerts.empty? %> -

Art Alerts

- <% artAlerts.each do |alert| %> - type="checkbox" name="alert_id_<%=alert.id%>" value=<%=alert.id%> /> <%= alert.name %>
- <% if !alert.description.blank? %> -

- <%=alert.description%>

- <% end %> - <% end %> - <% end %> -
- -
-
\ No newline at end of file +<% if SS_ID == 1 %> + <%= erb :'innovationstudio/alert_center', :locals => { + :generalAlerts => generalAlerts, + :woodShopAlerts => woodShopAlerts, + :metalShopAlerts => metalShopAlerts, + :digitalFabricationAlerts => digitalFabricationAlerts, + :artAlerts => artAlerts, + :alert_ids => alert_ids + } %> +<% elsif SS_ID == 8 %> + <%= erb :'engineering_garage/alert_center', :locals => { + :generalAlerts => generalAlerts, + :woodShopAlerts => woodShopAlerts, + :metalShopAlerts => metalShopAlerts, + :digitalFabricationAlerts => digitalFabricationAlerts, + :artAlerts => artAlerts, + :alert_ids => alert_ids + } %> +<% end %> diff --git a/views/auto_updating_announcement.erb b/views/auto_updating_announcement.erb index ba7c38a0..05666418 100644 --- a/views/auto_updating_announcement.erb +++ b/views/auto_updating_announcement.erb @@ -1,7 +1,7 @@
@@ -12,8 +12,13 @@ const announcement_refresh_rate_ms = 30 * 1000; async function fetch_notice() { - const announcement_notice_header = document.getElementById('announcement-header'); - const announcement_notice_body = document.getElementById('announcement-body'); + const announcement_notice_header = announcement_notice.querySelector('.dcf-notice-heading'); + const announcement_notice_body = announcement_notice.querySelector('.dcf-notice-message'); + + if (announcement_notice_header == null || announcement_notice_body == null) { + console.error('Could Not Find Notice Header or Body'); + return; + } try { const response = await fetch(announcement_url); if (!response.ok) { console.err('Could Not Get Announcements'); return;} diff --git a/views/calendar.erb b/views/calendar.erb index 93c93fbb..0a547c85 100644 --- a/views/calendar.erb +++ b/views/calendar.erb @@ -3,7 +3,7 @@ end %>

- Innovation Studio Calendar + <%= CONFIG['app']['title'] %> Calendar See all our upcoming events!

diff --git a/views/engineering_garage/alert_center.erb b/views/engineering_garage/alert_center.erb new file mode 100644 index 00000000..d4d90317 --- /dev/null +++ b/views/engineering_garage/alert_center.erb @@ -0,0 +1,18 @@ +
+
+
+

General Alerts

+ <% if !generalAlerts.empty? %> + <% generalAlerts.each do |alert| %> + type="checkbox" name="alert_id_<%=alert.id%>" value=<%=alert.id%> /> <%= alert.name %>
+ <% if !alert.description.blank? %> +

- <%=alert.description%>

+ <% end %> + <% end %> + <% else %> +

No alerts right now

+ <% end %> +
+ +
+
diff --git a/views/engineering_garage/email_templates/activation_email.erb b/views/engineering_garage/email_templates/activation_email.erb new file mode 100644 index 00000000..521b8cfc --- /dev/null +++ b/views/engineering_garage/email_templates/activation_email.erb @@ -0,0 +1,29 @@ +Thank you for attending New Member Orientation! + +

To activate your user account please go to:

+ +

<%= CONFIG['app']['url'] %>login/ (Bookmark this link for future use) then enter the following:

+ +

User Name: <%= @user.username %>

+

Temp Password: Welcome123

+ +

After logging in you must:

+ +

Click on “My Account” on the far right side of the red banner. +Go to “Add Vehicle”. Add your vehicle information. +You can add up to 3 vehicles. You must park in the lot shown on the attached map. +If any vehicle information changes you must update your account before attending NIS. +FAILURE TO DO SO WILL RESULT IN UP TO A $60 TICKET EVERY TIME YOU PARK.

+ +TRAININGS AND RESERVATIONS + +

You are now able to sign up for any trainings or workshops via this webpage by clicking on the VIEW TRAININGS, VIEW WORKSHOPS, VIEW FULL CALENDAR tabs on the main page or under the MANAGE YOUR STUDIO drop down tab.

+ +

After you have been through required equipment training you will be able to reserve that equipment on the RESERVE EQUIPMENT tab on the main page or the drop-down tab. Not all equipment requires training or reservations.

+ +RENEWING YOUR MEMBERSHIP +

To renew your membership you must do so in person. We accept credit cards and UNL N Cards or cost object numbers. No checks or cash are accepted. Renew as soon as you enter the studio or you will receive a parking ticket.

+ +

Thank you and welcome aboard!

+ +

Your Studio Staff

\ No newline at end of file diff --git a/views/engineering_garage/email_templates/attended_orientation_email.erb b/views/engineering_garage/email_templates/attended_orientation_email.erb new file mode 100644 index 00000000..d5007f6d --- /dev/null +++ b/views/engineering_garage/email_templates/attended_orientation_email.erb @@ -0,0 +1,15 @@ +

Thank you for attending New Member Orientation. You may now join the Engineering Garage Studio at any time.

+ +

In the meantime, please use the following username and default password to access information about upcoming trainings and workshops.

+ +

<%= CONFIG['app']['url'] %>login/ (Bookmark this link for future use) then enter the following:

+

User Name: <%= @user.username %>

+

Temp Password: Welcome123

+ +

+ Your membership – giving you access to the tools, + trainings, and the accompanying parking privileges + – will not begin until you pay. This needs to be done in person. +

+ +

However, with your username and password, you are able to sign up for trainings before you arrive at the garage to pay for your membership.

\ No newline at end of file diff --git a/views/engineering_garage/email_templates/broken_equipment_email.erb b/views/engineering_garage/email_templates/broken_equipment_email.erb new file mode 100644 index 00000000..89fb6bdb --- /dev/null +++ b/views/engineering_garage/email_templates/broken_equipment_email.erb @@ -0,0 +1,3 @@ +

Hi, <%= @user.full_name.rstrip %>. You are receiving this email because your reservation for <%= @resource.name %> on <%= @reservation.start_time.in_time_zone.strftime('%A, %B %d at %l:%M %P') %> has been canceled due to broken equipment. We apologize for this inconvenience.

+ +

Engineering Garage

\ No newline at end of file diff --git a/views/engineering_garage/email_templates/confirmation_reminder_email.erb b/views/engineering_garage/email_templates/confirmation_reminder_email.erb new file mode 100644 index 00000000..8bee908d --- /dev/null +++ b/views/engineering_garage/email_templates/confirmation_reminder_email.erb @@ -0,0 +1,3 @@ +

Hi, <%= @user.full_name.rstrip %>. You are receiving this email because you have not confirmed your trainer assignment for one or more events. Please visit your home page to confirm an event.

+ +

Engineering Garage

\ No newline at end of file diff --git a/views/engineering_garage/email_templates/deleted_event_email.erb b/views/engineering_garage/email_templates/deleted_event_email.erb new file mode 100644 index 00000000..3fca4bea --- /dev/null +++ b/views/engineering_garage/email_templates/deleted_event_email.erb @@ -0,0 +1,5 @@ +

Hi, <%= @user.full_name.rstrip %>. You are receiving this email because the following event you are scheduled to train has been deleted:

+ +

<%= @event.title %>

+ +

Engineering Garage

\ No newline at end of file diff --git a/views/engineering_garage/email_templates/event_signup_email.erb b/views/engineering_garage/email_templates/event_signup_email.erb new file mode 100644 index 00000000..3c6ec6e4 --- /dev/null +++ b/views/engineering_garage/email_templates/event_signup_email.erb @@ -0,0 +1,7 @@ +

Thank you, <%= @user.full_name.rstrip %> for signing up for <%= @event.title %>. Don't forget that this event is

+ +

<%= @event.start_time.in_time_zone.strftime('%A, %B %d at %l:%M %P') %>.

+ +

We'll see you there!

+ +

Engineering Garage

\ No newline at end of file diff --git a/views/engineering_garage/email_templates/event_signup_nonmember_email.erb b/views/engineering_garage/email_templates/event_signup_nonmember_email.erb new file mode 100644 index 00000000..554f3e62 --- /dev/null +++ b/views/engineering_garage/email_templates/event_signup_nonmember_email.erb @@ -0,0 +1,7 @@ +

Thank you, <%= @name %> for signing up for <%= @event.title %>. Don't forget that this event is

+ +

<%= @event.start_time.in_time_zone.strftime('%A, %B %d at %l:%M %P') %>.

+ +

We'll see you there!

+ +

Engineering Garage

\ No newline at end of file diff --git a/views/engineering_garage/email_templates/expiring_email.erb b/views/engineering_garage/email_templates/expiring_email.erb new file mode 100644 index 00000000..54d7ff2a --- /dev/null +++ b/views/engineering_garage/email_templates/expiring_email.erb @@ -0,0 +1,8 @@ +

Hello, <%= @user.full_name.rstrip %>. Your Engineering Garage account is expiring soon! Our records show that your account expires on +<%= @user.expiration_date.strftime('%m-%d-%Y') %>. +Please visit us to keep your membership active. +

+ +

We hope to see you soon!

+ +

Engineering Garage

\ No newline at end of file diff --git a/views/engineering_garage/email_templates/hrc_signup_email.erb b/views/engineering_garage/email_templates/hrc_signup_email.erb new file mode 100644 index 00000000..19a77c9c --- /dev/null +++ b/views/engineering_garage/email_templates/hrc_signup_email.erb @@ -0,0 +1,2 @@ +

There was a new sign up for "<%= @event.title %>" that is at <%= @event.start_time.in_time_zone.strftime('%A, %B %d at %l:%M %P') %>.

+

The person who signed up is <%= @name and their email is <%= @email %>.

\ No newline at end of file diff --git a/views/engineering_garage/email_templates/modified_event_email.erb b/views/engineering_garage/email_templates/modified_event_email.erb new file mode 100644 index 00000000..58c1330f --- /dev/null +++ b/views/engineering_garage/email_templates/modified_event_email.erb @@ -0,0 +1,8 @@ +

Hi, <%= @user.full_name.rstrip %>. You are receiving this email because an event you are training has been modified:

+ +

<%= @event.title %>

+ +

You can see the event details on your home page.

+ + +

Engineering Garage

\ No newline at end of file diff --git a/views/engineering_garage/email_templates/new_event_email.erb b/views/engineering_garage/email_templates/new_event_email.erb new file mode 100644 index 00000000..6488e9a6 --- /dev/null +++ b/views/engineering_garage/email_templates/new_event_email.erb @@ -0,0 +1,7 @@ +

Hi, <%= @user.full_name.rstrip %>. You have been assigned as a trainer for <%= @event.title %>. Don't forget that this event is

+ +

<%= @event.start_time.in_time_zone.strftime('%A, %B %d at %l:%M %P') %>.

+ +

Please visit your home page to confirm your assignment.

+ +

Engineering Garage

\ No newline at end of file diff --git a/views/engineering_garage/email_templates/new_member_email.erb b/views/engineering_garage/email_templates/new_member_email.erb new file mode 100644 index 00000000..dda5c4e4 --- /dev/null +++ b/views/engineering_garage/email_templates/new_member_email.erb @@ -0,0 +1,7 @@ +

Thank you, <%= @name %> for signing up for <%= @event.title %>. Don't forget that the event is

+ +

<%= @event.start_time.in_time_zone.strftime('%A, %B %d at %l:%M %P') %>.

+ +

We'll see you there!

+ +

Engineering Garage

\ No newline at end of file diff --git a/views/engineering_garage/email_templates/password_email.erb b/views/engineering_garage/email_templates/password_email.erb new file mode 100644 index 00000000..55359f9f --- /dev/null +++ b/views/engineering_garage/email_templates/password_email.erb @@ -0,0 +1,7 @@ +

We received a request to reset your Engineering Garage Manager password. Please click the link below to reset your password.

+ +

<%= CONFIG['app']['URL'] %>reset_password/<%= @token %>/

+ +

This link will only be active for 24 hours. If you did not request to reset your password, you may safely disregard this email.

+ +

Engineering Garage

\ No newline at end of file diff --git a/views/engineering_garage/email_templates/remove_event_email.erb b/views/engineering_garage/email_templates/remove_event_email.erb new file mode 100644 index 00000000..e50385ce --- /dev/null +++ b/views/engineering_garage/email_templates/remove_event_email.erb @@ -0,0 +1,5 @@ +

Hi, <%= @user.full_name.rstrip %>. You are receiving this email because you are no longer a trainer for the following event:

+ +

<%= @event.title %>

+ +

Engineering Garage

\ No newline at end of file diff --git a/views/engineering_garage/email_templates/training_signup_email.erb b/views/engineering_garage/email_templates/training_signup_email.erb new file mode 100644 index 00000000..b787869e --- /dev/null +++ b/views/engineering_garage/email_templates/training_signup_email.erb @@ -0,0 +1,7 @@ +

Thank you, <%= @user.full_name.rstrip %> for signing up for <%= @event.title %>. Don't forget that this training is

+ +

<%= @event.start_time.in_time_zone.strftime('%A, %B %d at %l:%M %P') %>.

+ +

We'll see you there!

+ +

Engineering Garage

\ No newline at end of file diff --git a/views/engineering_garage/email_templates/vehicle_info_email.erb b/views/engineering_garage/email_templates/vehicle_info_email.erb new file mode 100644 index 00000000..29398e3e --- /dev/null +++ b/views/engineering_garage/email_templates/vehicle_info_email.erb @@ -0,0 +1,6 @@ +

Hi, <%= @user.full_name.rstrip %>. You're receiving this email because either your vehicle information has been updated or your account has been activated.

+ +

Your most recent vehicle information is as follows:

+<%= @summary %> + +

Engineering Garage

\ No newline at end of file diff --git a/views/engineering_garage/email_templates/workshop_signup_email.erb b/views/engineering_garage/email_templates/workshop_signup_email.erb new file mode 100644 index 00000000..d2377da3 --- /dev/null +++ b/views/engineering_garage/email_templates/workshop_signup_email.erb @@ -0,0 +1,7 @@ +

Thank you, <%= @user.full_name.rstrip %> for signing up for <%= @event.title %>. Don't forget that this workshop is

+ +

<%= @event.start_time.in_time_zone.strftime('%A, %B %d at %l:%M %P') %>.

+ +

We'll see you there!

+ +

Engineering Garage

\ No newline at end of file diff --git a/views/engineering_garage/event_listing_table.erb b/views/engineering_garage/event_listing_table.erb new file mode 100644 index 00000000..33cc5f8f --- /dev/null +++ b/views/engineering_garage/event_listing_table.erb @@ -0,0 +1,75 @@ +
" hidden> +
+
+

Code Required

+ +
+
+

To sign up for this event, please enter the code that you received from event organizer. + +

" action="" method="POST"> +
+ + +
+ +
+
+
+
+ + + + + + + + + + + <% all_private = true %> + <% events.each do |event| %> + <% if !event.is_private || (event.is_private && has_permission?(Permission::MANAGE_EVENTS)) %> + + + + + + <% all_private = false %> + <% end %> + <% end %> + <% if events.count == 0 || all_private %> + + + + <% end %> + +
TitleDate/LocationActions
+ <%= event.title %> + + <%= event.start_time.in_time_zone.strftime('%m/%d/%Y @ %l:%M %P') %>
+ <%= event.location.name %> +
+ <% if @user.signed_up_event_ids.include?(event.id) %> + Signed up! + <% elsif !event.max_signups.nil? && event.signups.count >= event.max_signups %> + Event is full. + <% elsif !event.signup_allowed_for_type? %> + View for details on how to signup. + <% elsif event.machine_training_event_type? %> +
+ +
+ <% else %> +
+ +
+ <% end %> +
No Events Scheduled
+ + \ No newline at end of file diff --git a/views/engineering_garage/footer.erb b/views/engineering_garage/footer.erb new file mode 100644 index 00000000..66e72347 --- /dev/null +++ b/views/engineering_garage/footer.erb @@ -0,0 +1,22 @@ + + \ No newline at end of file diff --git a/views/engineering_garage/membership_expiration.erb b/views/engineering_garage/membership_expiration.erb new file mode 100644 index 00000000..cc682c54 --- /dev/null +++ b/views/engineering_garage/membership_expiration.erb @@ -0,0 +1,9 @@ +<% if !@user.is_active %> +

Your membership is not active.

+
Please visit the Engineering Garage to activate your membership.
+<% elsif !@user.expiration_date.nil? && @user.expiration_date > Date.today %> +

">Your membership will expire on: <%= @user.expiration_date.to_formatted_s(:long_ordinal)[0...-5] %>

+<% else %> +

Your membership is expired.

+
You can still reserve equipment and sign up for trainings. Please visit the Engineering Garage to activate your membership.
+<% end %> diff --git a/views/engineering_garage/my_alerts.erb b/views/engineering_garage/my_alerts.erb new file mode 100644 index 00000000..acaa9d52 --- /dev/null +++ b/views/engineering_garage/my_alerts.erb @@ -0,0 +1,42 @@ +

My Alerts

+

<%= user_alerts.empty? ? "You are not signed up for any alerts. " : "" %>Check out the alert center to sign up for notifications or click a button below to sign up for all alerts of a category.

+
+
+ +
+
+ +<% if !user_alerts.empty? %> +
+ + + + + + + + + + + <% user_alerts.each do |alert| %> + <% alert_data = Alert.find_by(:id => alert.alert_id) %> + + + + + + + <% end %> + +
Alert NameCategoryDescriptionRemove Subscription
+

<%= alert_data.name %>

+
+

<%= alert_data.category_name %>

+
+

<%= alert_data.description %>

+
+
+ +
+
+<% end %> diff --git a/views/engineering_garage/trainings.erb b/views/engineering_garage/trainings.erb new file mode 100644 index 00000000..f408d522 --- /dev/null +++ b/views/engineering_garage/trainings.erb @@ -0,0 +1,14 @@ +

Upcoming Machine Trainings

+ +

+ Welcome to the <%= CONFIG['app']['title'] %>! + Before using our equipment, it is necessary to complete training on each + type of equipment. Here, you can sign up for upcoming trainings. Take a look at our upcoming offerings: +

+ +
+

Trainings

+ + <%= erb :'engineering_garage/event_listing_table', locals: {:id => 1, :events => events} %> + +
diff --git a/views/engineering_garage/workshop_listings.erb b/views/engineering_garage/workshop_listings.erb new file mode 100644 index 00000000..6a2dbe6e --- /dev/null +++ b/views/engineering_garage/workshop_listings.erb @@ -0,0 +1,2 @@ +

General Workshops

+<%= erb :'engineering_garage/event_listing_table', locals: {:id => 3, :events => events_general} %> diff --git a/views/engineering_garage/workshops.erb b/views/engineering_garage/workshops.erb new file mode 100644 index 00000000..84987ebf --- /dev/null +++ b/views/engineering_garage/workshops.erb @@ -0,0 +1,5 @@ +
+ + <%= erb :'engineering_garage/workshop_listings', locals: {:events_general => events_general} %> + +
diff --git a/views/fixed.erb b/views/fixed.erb index 28f68089..a2130312 100644 --- a/views/fixed.erb +++ b/views/fixed.erb @@ -11,13 +11,13 @@ $Id$ --> - <%= @title %> | University of Nebraska–Lincoln + <%= CONFIG['app']['title'] %> | University of Nebraska–Lincoln <%= ERB.new(File.read(File.expand_path("#{ROOT}/public/wdn/templates_5.3/includes/global/head-2-local.html"))).result.gsub('$DEP_VERSION$', template_dep_version) %> - - + + @@ -44,12 +44,12 @@ <%= ERB.new(File.read(File.expand_path("#{ROOT}/public/wdn/templates_5.3/includes/global/logo-lockup-1.html"))).result %> <%= ERB.new(File.read(File.expand_path("#{ROOT}/public/wdn/templates_5.3/includes/global/site-affiliation-1.html"))).result %> - Nebraska Innovation Campus + <%= @affiliation %> <%= ERB.new(File.read(File.expand_path("#{ROOT}/public/wdn/templates_5.3/includes/global/site-affiliation-2.html"))).result %> <%= ERB.new(File.read(File.expand_path("#{ROOT}/public/wdn/templates_5.3/includes/global/site-title-1.html"))).result %> - Nebraska Innovation Studio Manager + <%= CONFIG['app']['title'] %> <%= ERB.new(File.read(File.expand_path("#{ROOT}/public/wdn/templates_5.3/includes/global/site-title-2.html"))).result %> <%= ERB.new(File.read(File.expand_path("#{ROOT}/public/wdn/templates_5.3/includes/global/logo-lockup-2.html"))).result %> diff --git a/views/fixed_no_toolbar.erb b/views/fixed_no_toolbar.erb index 09b53884..1e97f0fc 100644 --- a/views/fixed_no_toolbar.erb +++ b/views/fixed_no_toolbar.erb @@ -11,16 +11,73 @@ $Id$ --> - <%= @title %> | University of Nebraska–Lincoln + <%= CONFIG['app']['title'] %> | University of Nebraska–Lincoln <%= ERB.new(File.read(File.expand_path("#{ROOT}/public/wdn/templates_5.3/includes/global/head-2-local.html"))).result.gsub('$DEP_VERSION$', template_dep_version) %> - - + + -
+ + + <%= ERB.new(File.read(File.expand_path("#{ROOT}/public/wdn/templates_5.3/includes/global/skip-nav.html"))).result %> + +
@@ -54,6 +111,16 @@
+
+ + + <%= ERB.new(File.read(File.expand_path("#{ROOT}/public/wdn/templates_5.3/includes/global/footer-global-1.html"))).result %> + + <%= erb :'local_footer' %> + + <%= ERB.new(File.read(File.expand_path("#{ROOT}/public/wdn/templates_5.3/includes/global/footer-global-2.html"))).result %> + <%= ERB.new(File.read(File.expand_path("#{ROOT}/public/wdn/templates_5.3/includes/global/noscript.html"))).result %> +
<%= ERB.new(File.read(File.expand_path("#{ROOT}/public/wdn/templates_5.3/includes/global/js-body-local.html"))).result.gsub('$DEP_VERSION$', template_dep_version) %> diff --git a/views/home.erb b/views/home.erb index cca2265e..c86cc24c 100644 --- a/views/home.erb +++ b/views/home.erb @@ -1,13 +1,13 @@ -

Welcome to Innovation Studio Manager

+

Welcome to The <%= CONFIG['app']['title'] %>

Hello, <%= @user.full_name %> (<%= @user.username %>)
-<% if !@user.expiration_date.nil? && @user.expiration_date > Date.today %> -

">Your membership will expire on: <%= @user.expiration_date.to_formatted_s(:long_ordinal)[0...-5] %>

-<% else %> -

Your membership is expired.

-
You can still reserve equipment and sign up for trainings. Please visit Nebraska Innovation Studio to activate your membership.
+<% if SS_ID == 1 %> + <%= erb :'innovationstudio/membership_expiration' %> +<% elsif SS_ID == 8 %> + <%= erb :'engineering_garage/membership_expiration' %> <% end %> +

My Reservations

<% if reservations.empty? %>

You have no upcoming reservations. You can view upcoming trainings to get certified, or check out the list of tools you can reserve.

@@ -91,61 +91,14 @@ View Full Calendar

- -

My Alerts

-

<%= user_alerts.empty? ? "You are not signed up for any alerts. " : "" %>Check out the alert center to sign up for notifications or click a button below to sign up for all alerts of a category.

-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -<% if !user_alerts.empty? %> -
- - - - - - - - - - - <% user_alerts.each do |alert| %> - <% alert_data = Alert.find_by(:id => alert.alert_id) %> - - - - - - - <% end %> - -
Alert NameCategoryDescriptionRemove Subscription
-

<%= alert_data.name %>

-
-

<%= alert_data.category_name %>

-
-

<%= alert_data.description %>

-
-
- -
- -
+<% if SS_ID == 1 %> + <%= erb :'innovationstudio/my_alerts', :locals => { + :user_alerts => user_alerts + } %> +<% elsif SS_ID == 8 %> + <%= erb :'engineering_garage/my_alerts', :locals => { + :user_alerts => user_alerts + } %> <% end %> <% if @user.is_trainer == 1 %> @@ -192,7 +145,8 @@ <% end %> <% end %> -

Export Trainings & Events

+<% if SS_ID == 1 %> +

Export Trainings & Events

<% if trainer_events.empty? && events.empty? %>

There are no scheduled trainings or events to export

<% else %> @@ -200,3 +154,4 @@ Export to CSV

<% end %> +<% end %> diff --git a/views/innovationstudio/alert_center.erb b/views/innovationstudio/alert_center.erb new file mode 100644 index 00000000..8173532c --- /dev/null +++ b/views/innovationstudio/alert_center.erb @@ -0,0 +1,60 @@ +
+
+
+ <% if !generalAlerts.empty? %> +

General Alerts

+ <% generalAlerts.each do |alert| %> + type="checkbox" name="alert_id_<%=alert.id%>" value=<%=alert.id%> /> <%= alert.name %>
+ <% if !alert.description.blank? %> +

- <%=alert.description%>

+ <% end %> + <% end %> + <% end %> +
+
+ <% if !woodShopAlerts.empty? %> +

Woodshop Alerts

+ <% woodShopAlerts.each do |alert| %> + type="checkbox" name="alert_id_<%=alert.id%>" value=<%=alert.id%> /> <%= alert.name %>
+ <% if !alert.description.blank? %> +

- <%=alert.description%>

+ <% end %> + <% end %> + <% end %> +
+
+ <% if !metalShopAlerts.empty? %> +

Metalshop Alerts

+ <% metalShopAlerts.each do |alert| %> + type="checkbox" name="alert_id_<%=alert.id%>" value=<%=alert.id%> /> <%= alert.name %>
+ <% if !alert.description.blank? %> +

- <%=alert.description%>

+ <% end %> + <% end %> + <% end %> +
+
+ <% if !digitalFabricationAlerts.empty? %> +

Digital Fabrication Alerts

+ <% digitalFabricationAlerts.each do |alert| %> + type="checkbox" name="alert_id_<%=alert.id%>" value=<%=alert.id%> /> <%= alert.name %>
+ <% if !alert.description.blank? %> +

- <%=alert.description%>

+ <% end %> + <% end %> + <% end %> +
+
+ <% if !artAlerts.empty? %> +

Art Alerts

+ <% artAlerts.each do |alert| %> + type="checkbox" name="alert_id_<%=alert.id%>" value=<%=alert.id%> /> <%= alert.name %>
+ <% if !alert.description.blank? %> +

- <%=alert.description%>

+ <% end %> + <% end %> + <% end %> +
+ +
+
diff --git a/views/innovationstudio/email_templates/activation_email.erb b/views/innovationstudio/email_templates/activation_email.erb new file mode 100644 index 00000000..521b8cfc --- /dev/null +++ b/views/innovationstudio/email_templates/activation_email.erb @@ -0,0 +1,29 @@ +Thank you for attending New Member Orientation! + +

To activate your user account please go to:

+ +

<%= CONFIG['app']['url'] %>login/ (Bookmark this link for future use) then enter the following:

+ +

User Name: <%= @user.username %>

+

Temp Password: Welcome123

+ +

After logging in you must:

+ +

Click on “My Account” on the far right side of the red banner. +Go to “Add Vehicle”. Add your vehicle information. +You can add up to 3 vehicles. You must park in the lot shown on the attached map. +If any vehicle information changes you must update your account before attending NIS. +FAILURE TO DO SO WILL RESULT IN UP TO A $60 TICKET EVERY TIME YOU PARK.

+ +TRAININGS AND RESERVATIONS + +

You are now able to sign up for any trainings or workshops via this webpage by clicking on the VIEW TRAININGS, VIEW WORKSHOPS, VIEW FULL CALENDAR tabs on the main page or under the MANAGE YOUR STUDIO drop down tab.

+ +

After you have been through required equipment training you will be able to reserve that equipment on the RESERVE EQUIPMENT tab on the main page or the drop-down tab. Not all equipment requires training or reservations.

+ +RENEWING YOUR MEMBERSHIP +

To renew your membership you must do so in person. We accept credit cards and UNL N Cards or cost object numbers. No checks or cash are accepted. Renew as soon as you enter the studio or you will receive a parking ticket.

+ +

Thank you and welcome aboard!

+ +

Your Studio Staff

\ No newline at end of file diff --git a/views/innovationstudio/email_templates/attended_orientation_email.erb b/views/innovationstudio/email_templates/attended_orientation_email.erb new file mode 100644 index 00000000..accf942b --- /dev/null +++ b/views/innovationstudio/email_templates/attended_orientation_email.erb @@ -0,0 +1,15 @@ +

Thank you for attending New Member Orientation. You may now join Nebraska Innovation Studio at any time.

+ +

In the meantime, please use the following username and default password to access information about upcoming trainings and workshops.

+ +

<%= CONFIG['app']['url'] %>login/ (Bookmark this link for future use) then enter the following:

+

User Name: <%= @user.username %>

+

Temp Password: Welcome123

+ +

+ Your membership – giving you access to the tools, + trainings, and the accompanying parking privileges + – will not begin until you pay. This needs to be done in person. +

+ +

However, with your username and password, you are able to sign up for trainings before you arrive at NIS to pay for your membership.

\ No newline at end of file diff --git a/views/innovationstudio/email_templates/broken_equipment_email.erb b/views/innovationstudio/email_templates/broken_equipment_email.erb new file mode 100644 index 00000000..5931b005 --- /dev/null +++ b/views/innovationstudio/email_templates/broken_equipment_email.erb @@ -0,0 +1,3 @@ +

Hi, <%= @user.full_name.rstrip %>. You are receiving this email because your reservation for <%= @resource.name %> on <%= @reservation.start_time.in_time_zone.strftime('%A, %B %d at %l:%M %P') %> has been canceled due to broken equipment. We apologize for this inconvenience.

+ +

Nebraska Innovation Studio

\ No newline at end of file diff --git a/views/innovationstudio/email_templates/confirmation_reminder_email.erb b/views/innovationstudio/email_templates/confirmation_reminder_email.erb new file mode 100644 index 00000000..75fec568 --- /dev/null +++ b/views/innovationstudio/email_templates/confirmation_reminder_email.erb @@ -0,0 +1,3 @@ +

Hi, <%= @user.full_name.rstrip %>. You are receiving this email because you have not confirmed your trainer assignment for one or more events. Please visit your home page to confirm an event.

+ +

Nebraska Innovation Studio

\ No newline at end of file diff --git a/views/innovationstudio/email_templates/deleted_event_email.erb b/views/innovationstudio/email_templates/deleted_event_email.erb new file mode 100644 index 00000000..245c584c --- /dev/null +++ b/views/innovationstudio/email_templates/deleted_event_email.erb @@ -0,0 +1,5 @@ +

Hi, <%= @user.full_name.rstrip %>. You are receiving this email because the following event you are scheduled to train has been deleted:

+ +

<%= @event.title %>

+ +

Nebraska Innovation Studio

\ No newline at end of file diff --git a/views/innovationstudio/email_templates/event_signup_email.erb b/views/innovationstudio/email_templates/event_signup_email.erb new file mode 100644 index 00000000..682d79b2 --- /dev/null +++ b/views/innovationstudio/email_templates/event_signup_email.erb @@ -0,0 +1,7 @@ +

Thank you, <%= @user.full_name.rstrip %> for signing up for <%= @event.title %>. Don't forget that this event is

+ +

<%= @event.start_time.in_time_zone.strftime('%A, %B %d at %l:%M %P') %>.

+ +

We'll see you there!

+ +

Nebraska Innovation Studio

\ No newline at end of file diff --git a/views/innovationstudio/email_templates/event_signup_nonmember_email.erb b/views/innovationstudio/email_templates/event_signup_nonmember_email.erb new file mode 100644 index 00000000..e9160ac8 --- /dev/null +++ b/views/innovationstudio/email_templates/event_signup_nonmember_email.erb @@ -0,0 +1,7 @@ +

Thank you, <%= @name %> for signing up for <%= @event.title %>. Don't forget that this event is

+ +

<%= @event.start_time.in_time_zone.strftime('%A, %B %d at %l:%M %P') %>.

+ +

We'll see you there!

+ +

Nebraska Innovation Studio

\ No newline at end of file diff --git a/views/innovationstudio/email_templates/expiring_email.erb b/views/innovationstudio/email_templates/expiring_email.erb new file mode 100644 index 00000000..19a89fd5 --- /dev/null +++ b/views/innovationstudio/email_templates/expiring_email.erb @@ -0,0 +1,8 @@ +

Hello, <%= @user.full_name.rstrip %>. Your Innovation Studio account is expiring soon! Our records show that your account expires on +<%= @user.expiration_date.strftime('%m-%d-%Y') %>. +Please visit us to keep your membership active. +

+ +

We hope to see you soon!

+ +

Nebraska Innovation Studio

\ No newline at end of file diff --git a/views/innovationstudio/email_templates/hrc_signup_email.erb b/views/innovationstudio/email_templates/hrc_signup_email.erb new file mode 100644 index 00000000..19a77c9c --- /dev/null +++ b/views/innovationstudio/email_templates/hrc_signup_email.erb @@ -0,0 +1,2 @@ +

There was a new sign up for "<%= @event.title %>" that is at <%= @event.start_time.in_time_zone.strftime('%A, %B %d at %l:%M %P') %>.

+

The person who signed up is <%= @name and their email is <%= @email %>.

\ No newline at end of file diff --git a/views/innovationstudio/email_templates/modified_event_email.erb b/views/innovationstudio/email_templates/modified_event_email.erb new file mode 100644 index 00000000..7b78c775 --- /dev/null +++ b/views/innovationstudio/email_templates/modified_event_email.erb @@ -0,0 +1,8 @@ +

Hi, <%= @user.full_name.rstrip %>. You are receiving this email because an event you are training has been modified:

+ +

<%= @event.title %>

+ +

You can see the event details on your home page.

+ + +

Nebraska Innovation Studio

\ No newline at end of file diff --git a/views/innovationstudio/email_templates/new_event_email.erb b/views/innovationstudio/email_templates/new_event_email.erb new file mode 100644 index 00000000..4912c38f --- /dev/null +++ b/views/innovationstudio/email_templates/new_event_email.erb @@ -0,0 +1,7 @@ +

Hi, <%= @user.full_name.rstrip %>. You have been assigned as a trainer for <%= @event.title %>. Don't forget that this event is

+ +

<%= @event.start_time.in_time_zone.strftime('%A, %B %d at %l:%M %P') %>.

+ +

Please visit your home page to confirm your assignment.

+ +

Nebraska Innovation Studio

\ No newline at end of file diff --git a/views/innovationstudio/email_templates/new_member_email.erb b/views/innovationstudio/email_templates/new_member_email.erb new file mode 100644 index 00000000..2f0f617d --- /dev/null +++ b/views/innovationstudio/email_templates/new_member_email.erb @@ -0,0 +1,11 @@ +

Thank you, <%= @name %> for signing up for <%= @event.title %>. Don't forget that the event is

+ +

<%= @event.start_time.in_time_zone.strftime('%A, %B %d at %l:%M %P') %>.

+ +

Our main entrance is on the northwest side of the Innovation Commons building on 19th St. just off Transformation Drive. Our address is 2021 Transformation Drive, Suite 1500, Entrance B.

+ +

For parking, use our new member orientation parking. Vehicles parked at any other location will be ticketed $50.00.

+ +

We'll see you there!

+ +

Nebraska Innovation Studio

\ No newline at end of file diff --git a/views/innovationstudio/email_templates/password_email.erb b/views/innovationstudio/email_templates/password_email.erb new file mode 100644 index 00000000..ebca936e --- /dev/null +++ b/views/innovationstudio/email_templates/password_email.erb @@ -0,0 +1,7 @@ +

We received a request to reset your Innovation Studio Manager password. Please click the link below to reset your password.

+ +

<%= CONFIG['app']['URL'] %>reset_password/<%= @token %>/

+ +

This link will only be active for 24 hours. If you did not request to reset your password, you may safely disregard this email.

+ +

Nebraska Innovation Studio

\ No newline at end of file diff --git a/views/innovationstudio/email_templates/remove_event_email.erb b/views/innovationstudio/email_templates/remove_event_email.erb new file mode 100644 index 00000000..0d208fab --- /dev/null +++ b/views/innovationstudio/email_templates/remove_event_email.erb @@ -0,0 +1,5 @@ +

Hi, <%= @user.full_name.rstrip %>. You are receiving this email because you are no longer a trainer for the following event:

+ +

<%= @event.title %>

+ +

Nebraska Innovation Studio

\ No newline at end of file diff --git a/views/innovationstudio/email_templates/training_signup_email.erb b/views/innovationstudio/email_templates/training_signup_email.erb new file mode 100644 index 00000000..a10f8707 --- /dev/null +++ b/views/innovationstudio/email_templates/training_signup_email.erb @@ -0,0 +1,7 @@ +

Thank you, <%= @user.full_name.rstrip %> for signing up for <%= @event.title %>. Don't forget that this training is

+ +

<%= @event.start_time.in_time_zone.strftime('%A, %B %d at %l:%M %P') %>.

+ +

We'll see you there!

+ +

Nebraska Innovation Studio

\ No newline at end of file diff --git a/views/innovationstudio/email_templates/vehicle_info_email.erb b/views/innovationstudio/email_templates/vehicle_info_email.erb new file mode 100644 index 00000000..1fb09ef4 --- /dev/null +++ b/views/innovationstudio/email_templates/vehicle_info_email.erb @@ -0,0 +1,5 @@ +

Hi, <%= @user.full_name.rstrip %>. You're receiving this email because either your vehicle information has been updated or your account has been activated.

+ +

Your most recent vehicle information is as follows:

+<%= @summary %> +

Nebraska Innovation Studio

\ No newline at end of file diff --git a/views/innovationstudio/email_templates/workshop_signup_email.erb b/views/innovationstudio/email_templates/workshop_signup_email.erb new file mode 100644 index 00000000..9199593c --- /dev/null +++ b/views/innovationstudio/email_templates/workshop_signup_email.erb @@ -0,0 +1,7 @@ +

Thank you, <%= @user.full_name.rstrip %> for signing up for <%= @event.title %>. Don't forget that this workshop is

+ +

<%= @event.start_time.in_time_zone.strftime('%A, %B %d at %l:%M %P') %>.

+ +

We'll see you there!

+ +

Nebraska Innovation Studio

\ No newline at end of file diff --git a/views/event_listing_table.erb b/views/innovationstudio/event_listing_table.erb similarity index 100% rename from views/event_listing_table.erb rename to views/innovationstudio/event_listing_table.erb diff --git a/views/innovationstudio/footer.erb b/views/innovationstudio/footer.erb new file mode 100644 index 00000000..cf25efd5 --- /dev/null +++ b/views/innovationstudio/footer.erb @@ -0,0 +1,24 @@ + + \ No newline at end of file diff --git a/views/innovationstudio/membership_expiration.erb b/views/innovationstudio/membership_expiration.erb new file mode 100644 index 00000000..6359e3c3 --- /dev/null +++ b/views/innovationstudio/membership_expiration.erb @@ -0,0 +1,9 @@ +<% if !@user.is_active %> +

Your membership is not active.

+
Please visit Nebraska Innovation Studio to activate your membership.
+<% elsif !@user.expiration_date.nil? && @user.expiration_date > Date.today %> +

">Your membership will expire on: <%= @user.expiration_date.to_formatted_s(:long_ordinal)[0...-5] %>

+<% else %> +

Your membership is expired.

+
You can still reserve equipment and sign up for trainings. Please visit Nebraska Innovation Studio to activate your membership.
+<% end %> diff --git a/views/innovationstudio/my_alerts.erb b/views/innovationstudio/my_alerts.erb new file mode 100644 index 00000000..6aecf1ac --- /dev/null +++ b/views/innovationstudio/my_alerts.erb @@ -0,0 +1,54 @@ +

My Alerts

+

<%= user_alerts.empty? ? "You are not signed up for any alerts. " : "" %>Check out the alert center to sign up for notifications or click a button below to sign up for all alerts of a category.

+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +<% if !user_alerts.empty? %> +
+ + + + + + + + + + + <% user_alerts.each do |alert| %> + <% alert_data = Alert.find_by(:id => alert.alert_id) %> + + + + + + + <% end %> + +
Alert NameCategoryDescriptionRemove Subscription
+

<%= alert_data.name %>

+
+

<%= alert_data.category_name %>

+
+

<%= alert_data.description %>

+
+
+ +
+
+<% end %> diff --git a/views/innovationstudio/trainings.erb b/views/innovationstudio/trainings.erb new file mode 100644 index 00000000..908a44cf --- /dev/null +++ b/views/innovationstudio/trainings.erb @@ -0,0 +1,14 @@ +

Upcoming Machine Trainings and Workshops

+ +

+ Welcome to the <%= CONFIG['app']['title'] %>! + Before using our equipment, it is necessary to complete training workshops on each + type of equipment. Here, you can sign up for upcoming trainings. Take a look at our upcoming offerings: +

+ +
+

Trainings

+ <%= erb :'innovationstudio/event_listing_table', locals: {:id => 4, :events => events, :events_advanced => 'trainings-table'} %> + + <%= erb :'innovationstudio/workshop_listings', locals: {:events_advanced => events_advanced, :events_creation => events_creation, :events_general => events_general} %> +
diff --git a/views/innovationstudio/workshop_listings.erb b/views/innovationstudio/workshop_listings.erb new file mode 100644 index 00000000..4ed14173 --- /dev/null +++ b/views/innovationstudio/workshop_listings.erb @@ -0,0 +1,9 @@ + +

Advanced Skill-Based Workshops

+<%= erb :'innovationstudio/event_listing_table', locals: {:id => 1, :events => events_advanced, :events_advanced => 'adv-skill-based-workshops-table'} %> + +

Creation Workshops

+<%= erb :'innovationstudio/event_listing_table', locals: {:id => 2, :events => events_creation, :events_advanced => 'creation-workshops-table'} %> + +

General Workshops

+<%= erb :'innovationstudio/event_listing_table', locals: {:id => 3, :events => events_general, :events_advanced => 'general-workshops-table'} %> diff --git a/views/innovationstudio/workshops.erb b/views/innovationstudio/workshops.erb new file mode 100644 index 00000000..8b6d1199 --- /dev/null +++ b/views/innovationstudio/workshops.erb @@ -0,0 +1,3 @@ +
+ <%= erb :'innovationstudio/workshop_listings', locals: {:events_advanced => events_advanced, :events_creation => events_creation, :events_general => events_general} %> +
diff --git a/views/local_footer.erb b/views/local_footer.erb index 40b6dcc9..2198063c 100644 --- a/views/local_footer.erb +++ b/views/local_footer.erb @@ -1,18 +1,5 @@ - - \ No newline at end of file +<% if SS_ID == 1 %> + <%= erb :'innovationstudio/footer' %> +<% elsif SS_ID == 8 %> + <%= erb :'engineering_garage/footer' %> +<% end %> diff --git a/views/me.erb b/views/me.erb index 5ade17ba..84c90bc4 100644 --- a/views/me.erb +++ b/views/me.erb @@ -23,7 +23,7 @@
/> - +
diff --git a/views/navigation.erb b/views/navigation.erb index 5373dcb1..4c915a53 100644 --- a/views/navigation.erb +++ b/views/navigation.erb @@ -1,36 +1,40 @@
    <% unless @user.nil? %> -
  • Manage Your Studio - -
  • -
  • Reserve Equipment
  • -
  • Training Documents +
  • Manage Your Studio -
  • + +
  • Reserve Equipment
  • + <% if SS_ID == 1 %> +
  • Training Documents + +
  • + <% end %> <% end %> - <% if @user.nil? %> -
  • Maker Requests - -
  • - <% else %> -
  • Maker Requests - -
  • + <% if SS_ID == 1 %> + <% if @user.nil? %> +
  • Maker Requests + +
  • + <% else %> +
  • Maker Requests + +
  • + <% end %> <% end %> <% @@ -41,38 +45,40 @@ =end %> <% unless @user.nil? || !@user.is_admin? %> -
  • Admin +
  • Admin
      <% if has_permission?(Permission::MANAGE_USERS) || has_permission?(Permission::SUPER_USER) %> -
    • Users
    • +
    • Users
    • <% end %> <% if has_permission?(Permission::MANAGE_EVENTS) || has_permission?(Permission::EVENTS_ADMIN_READ_ONLY) %> -
    • Events
    • +
    • Events
    • <% end %> <% if has_permission?(Permission::MANAGE_RESOURCES) %> -
    • Tools
    • +
    • Tools
    • <% end %> <% if has_permission?(Permission::MANAGE_SPACE_HOURS) %> -
    • Hours
    • +
    • Hours
    • <% end %> <% if has_permission?(Permission::MANAGE_EMAILS) %> -
    • Email
    • +
    • Email
    • <% end %> <% if has_permission?(Permission::SEE_AGENDA) %> -
    • Agenda
    • +
    • Agenda
    • <% end %> <% if has_permission?(Permission::SUPER_USER) %> -
    • Announcements
    • +
    • Announcements
    • <% end %> <% if has_permission?(Permission::MANAGE_RESOURCES) %> -
    • Edit Material Pricing
    • -
    • Edit SOP
    • +
    • Edit Material Pricing
    • + <% if SS_ID == 1 %> +
    • Edit SOP
    • + <% end %> <% end %> <% if has_permission?(Permission::MANAGE_USERS) || has_permission?(Permission::SUPER_USER) %> -
    • Check In Log
    • +
    • Check In Log
    • <% end %> <% if has_permission?(Permission::MANAGE_USERS) || has_permission?(Permission::SUPER_USER) %> -
    • Activate Members
    • +
    • Activate Members
    • <% end %>
  • diff --git a/views/new_members.erb b/views/new_members.erb index e18cb5ae..960ff7c5 100644 --- a/views/new_members.erb +++ b/views/new_members.erb @@ -1,7 +1,7 @@

    New Member Orientations

    -Welcome to the Nebraska Innovation Studio! +Welcome to the <%= CONFIG['app']['title'] %>! New members who wish to use the space must attend an hour-long Member Orientation Training. Here are the upcoming dates we are holding orientations:

    diff --git a/views/new_members_hrc.erb b/views/new_members_hrc.erb index 516cb551..800548a2 100644 --- a/views/new_members_hrc.erb +++ b/views/new_members_hrc.erb @@ -1,7 +1,7 @@

    HRC Events

    -Welcome to the Nebraska Innovation Studio! +Welcome to the <%= CONFIG['app']['title'] %>!

    <% if events.count > 0 %> diff --git a/views/scriptsandstyles.erb b/views/scriptsandstyles.erb deleted file mode 100644 index 54c064dc..00000000 --- a/views/scriptsandstyles.erb +++ /dev/null @@ -1,7 +0,0 @@ -<% UNL_WDN_FRAMEWORK_VERSION = '5.3.10' %> - - - - - - diff --git a/views/trainings.erb b/views/trainings.erb index 5d8e6499..7f38ef71 100644 --- a/views/trainings.erb +++ b/views/trainings.erb @@ -1,17 +1,19 @@

    Alerts

    Check out the alert center to sign up for notifications on upcoming trainings.

    -

    Upcoming Machine Trainings and Workshops

    -

    -Welcome to the Nebraska Innovation Studio! -Before using our equipment, it is necessary to complete training workshops on each -type of equipment. Here, you can sign up for upcoming trainings. Take a look at our upcoming offerings: -

    - -
    -

    Trainings

    - <%= erb :'event_listing_table', locals: {:id => 4, :events => events, :events_advanced => 'trainings-table'} %> - - <%= erb :'workshop_listings', locals: {:events_advanced => events_advanced, :events_creation => events_creation, :events_general => events_general} %> -
    +<% if SS_ID == 1 %> + <%= erb :'innovationstudio/trainings', :locals => { + :events => events, + :events_advanced => events_advanced, + :events_creation => events_creation, + :events_general => events_general + } %> +<% elsif SS_ID == 8 %> + <%= erb :'engineering_garage/trainings', :locals => { + :events => events, + :events_advanced => events_advanced, + :events_creation => events_creation, + :events_general => events_general + } %> +<% end %> diff --git a/views/workshop_listings.erb b/views/workshop_listings.erb deleted file mode 100644 index 0ca54cdc..00000000 --- a/views/workshop_listings.erb +++ /dev/null @@ -1,9 +0,0 @@ - -

    Advanced Skill-Based Workshops

    -<%= erb :'event_listing_table', locals: {:id => 1, :events => events_advanced, :events_advanced => 'adv-skill-based-workshops-table'} %> - -

    Creation Workshops

    -<%= erb :'event_listing_table', locals: {:id => 2, :events => events_creation, :events_advanced => 'creation-workshops-table'} %> - -

    General Workshops

    -<%= erb :'event_listing_table', locals: {:id => 3, :events => events_general, :events_advanced => 'general-workshops-table'} %> diff --git a/views/workshops.erb b/views/workshops.erb index 9ccbce46..923def3b 100644 --- a/views/workshops.erb +++ b/views/workshops.erb @@ -3,6 +3,16 @@

    Upcoming Workshops

    -
    - <%= erb :'workshop_listings', locals: {:events_advanced => events_advanced, :events_creation => events_creation, :events_general => events_general} %> -
    +<% if SS_ID == 1 %> + <%= erb :'innovationstudio/workshops', :locals => { + :events_advanced => events_advanced, + :events_creation => events_creation, + :events_general => events_general + } %> +<% elsif SS_ID == 8 %> + <%= erb :'engineering_garage/workshops', :locals => { + :events_advanced => events_advanced, + :events_creation => events_creation, + :events_general => events_general + } %> +<% end %>