From feb45a07bf3a5a690d001b62bf91c958d415d7eb Mon Sep 17 00:00:00 2001 From: cxt Date: Tue, 26 Jul 2016 16:45:36 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AF=BE=E7=A8=8B=E5=88=97=E8=A1=A8=E5=88=86?= =?UTF-8?q?=E4=B8=BA=E6=88=91=E5=88=9B=E5=BB=BA=E7=9A=84=E8=AF=BE=E7=A8=8B?= =?UTF-8?q?=E5=92=8C=E6=88=91=E5=8A=A0=E5=85=A5=E7=9A=84=E8=AF=BE=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/users_controller.rb | 78 +++++++--- app/helpers/users_helper.rb | 14 ++ app/views/users/_courses_list.html.erb | 28 ++++ .../users/_syllabus_course_list.html.erb | 61 ++++++++ .../users/_user_join_syllabus_list.html.erb | 3 + app/views/users/_user_syllabus_list.html.erb | 135 +----------------- app/views/users/expand_courses.js.erb | 5 + app/views/users/sort_syllabus_list.js.erb | 5 + app/views/users/user_courselist.html.erb | 36 ++++- config/routes.rb | 3 + public/images/syllabus/icons_syllabus.png | Bin 21845 -> 22951 bytes 11 files changed, 214 insertions(+), 154 deletions(-) create mode 100644 app/views/users/_courses_list.html.erb create mode 100644 app/views/users/_syllabus_course_list.html.erb create mode 100644 app/views/users/_user_join_syllabus_list.html.erb create mode 100644 app/views/users/expand_courses.js.erb create mode 100644 app/views/users/sort_syllabus_list.js.erb diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 30f78d9a5..45330b236 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -41,7 +41,7 @@ class UsersController < ApplicationController :activity_score_index, :influence_score_index, :score_index,:show_new_score, :topic_new_score_index, :project_new_score_index, :activity_new_score_index, :influence_new_score_index, :score_new_index,:user_projects_index,:user_resource, :user_courses4show,:user_projects4show,:user_course_activities,:user_project_activities,:user_feedback4show,:user_visitorlist,:user_messages,:edit_brief_introduction, - :user_import_homeworks,:user_search_homeworks,:user_import_resource, :user_system_messages,:choose_user_course,:user_courselist,:user_projectlist] + :user_import_homeworks,:user_search_homeworks,:user_import_resource, :user_system_messages,:choose_user_course,:user_courselist,:user_projectlist,:sort_syllabus_list] before_filter :auth_user_extension, only: :show #before_filter :rest_user_score, only: :show #before_filter :select_entry, only: :user_projects @@ -3228,7 +3228,35 @@ class UsersController < ApplicationController end def user_courselist - @order, @c_sort,@type = params[:order] || 1, params[:sort] || 1, params[:type] || 1 + @order, @c_sort, @type, @list_type = 1, 2, 1, 1 + + @my_syllabuses = @user.syllabuses + + sy_courses = @user.courses.visible.where("is_delete =? and tea_id != ?", 0, @user.id) + syllabus_ids = sy_courses.empty? ? '(-1)' : "(" + sy_courses.map{|course| !course.syllabus_id.nil? && course.syllabus_id}.join(",") + ")" + @join_syllabuses = Syllabus.where("id in #{syllabus_ids} and user_id != #{@user.id}") + + @my_syllabuses = syllabus_course_list_sort @my_syllabuses + @join_syllabuses = syllabus_course_list_sort @join_syllabuses + @my_syllabuses = @my_syllabuses.sort{|x,y| y[:last_update] <=> x[:last_update]} + @join_syllabuses = @join_syllabuses.sort{|x,y| y[:last_update] <=> x[:last_update]} + + #分页 + # @limit = 10 + # @is_remote = true + # @atta_count = @syllabus.count + # @atta_pages = Paginator.new @atta_count, @limit, params['page'] || 1 + # @offset ||= @atta_pages.offset + # @syllabus = paginateHelper @syllabus,@limit + + respond_to do |format| + format.html {render :layout => 'new_base_user'} + end + end + + #课程列表的排序 + def sort_syllabus_list + @order, @c_sort, @type, @list_type = params[:order] || 1, params[:sort] || 1, params[:type] || 1, params[:list_type] || 1 #确定 sort_type if @order.to_i == @type.to_i @@ -3238,40 +3266,48 @@ class UsersController < ApplicationController end sort_name = "updated_at" - sort_type = @c_sort == 1 ? "asc" : "desc" - @courses = @user.courses.visible.where("is_delete =?", 0) - syllabus_ids = @courses.empty? ? '(-1)' : "(" + @courses.map{|course| !course.syllabus_id.nil? && course.syllabus_id}.join(",") + ")" - @syllabus = Syllabus.where("id in #{syllabus_ids} or user_id = #{User.current.id}").order("#{sort_name} #{sort_type}") + if @list_type.to_i == 1 + @syllabuses = @user.syllabuses.order("updated_at desc") + else + sy_courses = @user.courses.visible.where("is_delete =? and tea_id != ?", 0, @user.id) + syllabus_ids = sy_courses.empty? ? '(-1)' : "(" + sy_courses.map{|course| !course.syllabus_id.nil? && course.syllabus_id}.join(",") + ")" + @syllabuses = Syllabus.where("id in #{syllabus_ids} and user_id != #{@user.id}").order("updated_at desc") + end - #根据 作业+资源数排序 - if @order.to_i == 2 + if @order.to_i == 1 #根据 班级更新时间排序 + @syllabuses = syllabus_course_list_sort @syllabuses + @c_sort == 1 ? (@syllabuses = @syllabuses.sort{|x,y| x[:last_update] <=> y[:last_update] }) : (@syllabuses = @syllabuses.sort{|x,y| y[:last_update] <=> x[:last_update]}) + @type = 1 + elsif @order.to_i == 2 #根据 作业+资源数排序 @type = 2 - @syllabus.each do |syllabus| + @syllabuses.each do |syllabus| count = 0 - courses = @courses.where("syllabus_id = #{syllabus.id}") + courses = syllabus.courses.not_deleted courses.each do |c| count += (User.current.admin? || User.current.allowed_to?(:as_teacher,c)) ? (c.homework_commons.count + visable_attachemnts_incourse(c).count) : (c.homework_commons.where("publish_time <= '#{Date.today}'").count + visable_attachemnts_incourse(c).count) end syllabus[:infocount] = count end - @c_sort == 1 ? (@syllabus = @syllabus.sort{|x,y| x[:infocount] <=> y[:infocount] }) : (@syllabus = @syllabus.sort{|x,y| y[:infocount] <=> x[:infocount]}) - @syllabus = sortby_time_countcommon_nosticky @syllabus,sort_name + @c_sort == 1 ? (@syllabuses = @syllabuses.sort{|x,y| x[:infocount] <=> y[:infocount] }) : (@syllabuses = @syllabuses.sort{|x,y| y[:infocount] <=> x[:infocount]}) + @syllabuses = sortby_time_countcommon_nosticky @syllabuses,sort_name else @type = 1 end - #分页 - @limit = 10 - @is_remote = true - @atta_count = @syllabus.count - @atta_pages = Paginator.new @atta_count, @limit, params['page'] || 1 - @offset ||= @atta_pages.offset - @syllabus = paginateHelper @syllabus,@limit - respond_to do |format| format.js - format.html {render :layout => 'new_base_user'} + end + end + + #展开课程下的班级 + def expand_courses + @syllabus = Syllabus.where("id = #{params[:syllabus_id]}").first + unless @syllabus.nil? + @courses = @syllabus.courses.not_deleted.select("courses.*,(SELECT MAX(updated_at) FROM `course_activities` WHERE course_activities.course_id = courses.id) AS updatetime").order("updatetime desc") + respond_to do |format| + format.js + end end end diff --git a/app/helpers/users_helper.rb b/app/helpers/users_helper.rb index 98b993183..6493993b0 100644 --- a/app/helpers/users_helper.rb +++ b/app/helpers/users_helper.rb @@ -690,4 +690,18 @@ module UsersHelper end result_ids end + + #课程的班级列表最近更新时间 + def syllabus_course_list_sort syllabuses + syllabuses.each do |sy| + updated_at = sy.updated_at + courses = sy.courses.not_deleted + unless courses.empty? + course_ids = "(" + courses.map { |course| course.id}.join(",") + ")" + updated_at = CourseActivity.where("course_id in #{course_ids}").order("updated_at desc").first.updated_at + end + sy[:last_update] = updated_at + end + syllabuses + end end diff --git a/app/views/users/_courses_list.html.erb b/app/views/users/_courses_list.html.erb new file mode 100644 index 000000000..29983bf34 --- /dev/null +++ b/app/views/users/_courses_list.html.erb @@ -0,0 +1,28 @@ +<% unless courses.nil? %> + <% courses.each_with_index do |course, i| %> +
  • + + +
    +
    +

    <%=course.name %>

    + +
    +
    +
    +

    更新:<%=format_date Time.at(course.updatetime) %>学期:<%=current_time_and_term(course) %>

    +

    <%=studentCount course %>学生|<%=visable_course_homework course %>作业|<%=visable_attachemnts_incourse(@course).count %>资源

    +
    +
    +
    + +
    +
    +
  • + <% end %> + <% if courses.count > 3 %> +
  • + 共<%=courses.count %>个班级,点击全部展开 +
  • + <% end %> +<% end %> \ No newline at end of file diff --git a/app/views/users/_syllabus_course_list.html.erb b/app/views/users/_syllabus_course_list.html.erb new file mode 100644 index 000000000..06dff2b49 --- /dev/null +++ b/app/views/users/_syllabus_course_list.html.erb @@ -0,0 +1,61 @@ +
    + <% if @type.to_i == 2 %> + <%= link_to "", {:controller => 'users', :action => 'sort_syllabus_list', :id =>@user,:list_type => list_type, :type => @type, :sort => @c_sort, :order => 2 }, :class => "#{@c_sort.to_i == 1 ? 'sortupbtn' : 'sortdownbtn'} fr", :style => "margin-right: 5px;", :remote => true %> + <% else %> + <%= link_to "", {:controller => 'users', :action => 'sort_syllabus_list', :id =>@user,:list_type => list_type, :type => @type, :sort => @c_sort, :order => 2 }, :class => "sortdownbtn sort_no fr", :style => "margin-right: 5px;", :remote => true %> + <% end %> + <%= link_to "人气", {:controller => 'users', :action => 'sort_syllabus_list', :id =>@user,:list_type => list_type, :type => @type, :sort => @c_sort, :order => 2 }, :class => "sortTxt fr", :remote => true %> + <% if @type.to_i == 1 %> + <%= link_to "", {:controller => 'users', :action => 'sort_syllabus_list', :id =>@user,:list_type => list_type, :type => @type, :sort => @c_sort, :order => 1 }, :class => "#{@c_sort.to_i == 1 ? 'sortupbtn' : 'sortdownbtn'} fr", :remote => true %> + <% else %> + <%= link_to "", {:controller => 'users', :action => 'sort_syllabus_list', :id =>@user,:list_type => list_type, :type => @type, :sort => @c_sort, :order => 1 }, :class => "sortdownbtn sort_no fr", :remote => true %> + <% end %> + <%= link_to "时间", {:controller => 'users', :action => 'sort_syllabus_list', :id =>@user,:list_type => list_type, :type => @type, :sort => @c_sort, :order => 1 }, :class => "sortTxt fr", :remote => true %> + 我<%= list_type == 1 ? "创建" : "加入"%>的课程 +
    +
    + +<% if syllabuses.any? %> + <% syllabuses.each_with_index do |syllabus, index|%> +
    + <% course_count = syllabus.courses.not_deleted.count %> +
    +
    + +

    <%=syllabus.title %>

    +
    +

    更新时间:<%=format_date syllabus.updated_at %> + 创建老师:<%=syllabus.user.show_name %> + 班级:<%=course_count %> +

    +
    +
    + +
    +
      + <% if index == 0 %> + <% courses = syllabus.courses.not_deleted.select("courses.*,(SELECT MAX(updated_at) FROM `course_activities` WHERE course_activities.course_id = courses.id) AS updatetime").order("updatetime desc") %> + <%= render :partial => 'users/courses_list', :locals => {:courses => courses, :syllabus => syllabus}%> + <% end %> +
    +
    + +
    +
      +
    • +
        +
      • + <%=link_to '查看课程', syllabus_path(syllabus.id), :class => 'postOptionLink',:target =>'_blank', :title => '查看课程' %> +
      • + <% if User.current == syllabus.user %> +
      • <%=link_to '删除课程', delete_syllabus_syllabus_path(syllabus), :class => 'postOptionLink', :remote => 'true'%>
      • + <% end %> +
      +
    • +
    +
    +
    + <% end %> +<% else %> +

    <%= l(:label_no_data) %>

    +<% end %> \ No newline at end of file diff --git a/app/views/users/_user_join_syllabus_list.html.erb b/app/views/users/_user_join_syllabus_list.html.erb new file mode 100644 index 000000000..7faab0017 --- /dev/null +++ b/app/views/users/_user_join_syllabus_list.html.erb @@ -0,0 +1,3 @@ +
    + <%= render :partial => "users/syllabus_course_list", :locals => {:syllabuses => @join_syllabuses, :list_type => 2} %> +
    diff --git a/app/views/users/_user_syllabus_list.html.erb b/app/views/users/_user_syllabus_list.html.erb index 9fa93c76e..b6c767771 100644 --- a/app/views/users/_user_syllabus_list.html.erb +++ b/app/views/users/_user_syllabus_list.html.erb @@ -1,132 +1,3 @@ -
    -

    课程列表

    -
    - 排序: - <%= link_to "时间", {:controller => 'users', :action => 'user_courselist', :id =>@user, :type => @type, :sort => @c_sort, :order => 1 }, :class => "sortTxt fl", :remote => true %> - <% if @type.to_i == 1 %> - <%= link_to "", {:controller => 'users', :action => 'user_courselist', :id =>@user, :type => @type, :sort => @c_sort, :order => 1 }, :class => "#{@c_sort.to_i == 1 ? 'sortupbtn' : 'sortdownbtn'} fl", :remote => true %> - <% else %> - <%= link_to "", {:controller => 'users', :action => 'user_courselist', :id =>@user, :type => @type, :sort => @c_sort, :order => 1 }, :class => "sortdownbtn sort_no fl", :remote => true %> - <% end %> - <%= link_to "人气", {:controller => 'users', :action => 'user_courselist', :id =>@user, :type => @type, :sort => @c_sort, :order => 2 }, :class => "sortTxt fl", :remote => true %> - <% if @type.to_i == 2 %> - <%= link_to "", {:controller => 'users', :action => 'user_courselist', :id =>@user, :type => @type, :sort => @c_sort, :order => 2 }, :class => "#{@c_sort.to_i == 1 ? 'sortupbtn' : 'sortdownbtn'} fl", :remote => true %> - <% else %> - <%= link_to "", {:controller => 'users', :action => 'user_courselist', :id =>@user, :type => @type, :sort => @c_sort, :order => 2 }, :class => "sortdownbtn sort_no fl", :remote => true %> - <% end %> -
    -
    - - <% if @syllabus.any? %> - <% @syllabus.each_with_index do |syllabus, index|%> -
    - <% courses = @courses.where("syllabus_id = #{syllabus.id}").select("courses.*,(SELECT MAX(updated_at) FROM `course_activities` WHERE course_activities.course_id = courses.id) AS updatetime").order("time desc") %> -
    -
    - -

    <%=syllabus.title %>

    -
    -

    更新时间:<%=format_date syllabus.updated_at %> - 创建老师:<%=syllabus.user.show_name %> - 班级:<%=courses.count %> -

    -
    -
    - - - -
    -
      -
    • -
        -
      • - <%=link_to '查看课程', syllabus_path(syllabus.id), :class => 'postOptionLink',:target =>'_blank', :title => '查看课程' %> -
      • - <% if User.current == syllabus.user %> -
      • <%=link_to '删除课程', delete_syllabus_syllabus_path(syllabus), :class => 'postOptionLink', :remote => 'true'%>
      • - <% end %> -
      -
    • -
    -
    -
    - <% end %> -
    -
      - <%= pagination_links_full @atta_pages, @atta_count, :per_page_links => false, :remote => @is_remote, :flag => true %> -
    -
    -
    - <% else %> -

    <%= l(:label_no_data) %>

    - <% end %> -
    - - \ No newline at end of file +
    + <%= render :partial => "users/syllabus_course_list", :locals => {:syllabuses => @my_syllabuses, :list_type => 1} %> +
    \ No newline at end of file diff --git a/app/views/users/expand_courses.js.erb b/app/views/users/expand_courses.js.erb new file mode 100644 index 000000000..3b2291e1d --- /dev/null +++ b/app/views/users/expand_courses.js.erb @@ -0,0 +1,5 @@ +<% unless @courses.empty? %> + $("#syllabus_course_ul_<%=@syllabus.id %>").html("<%=escape_javascript(render :partial => 'users/courses_list', :locals => {:courses => @courses, :syllabus => @syllabus}) %>"); + $("#syllabus_course_ul_<%=@syllabus.id %>").parent().show(); + $("#syllabus_course_ul_<%=@syllabus.id %>").parent().prev().children(":first-child").children(":first-child").toggleClass("icons_sy_close").toggleClass("icons_sy_open"); +<% end %> \ No newline at end of file diff --git a/app/views/users/sort_syllabus_list.js.erb b/app/views/users/sort_syllabus_list.js.erb new file mode 100644 index 000000000..e353109f4 --- /dev/null +++ b/app/views/users/sort_syllabus_list.js.erb @@ -0,0 +1,5 @@ +<% if @list_type.to_i == 1 %> +$("#user_syllabus_list").html('<%= escape_javascript(render :partial => "users/syllabus_course_list", :locals => {:syllabuses => @syllabuses, :list_type => 1}) %>'); +<% else %> +$("#user_join_syllabus_list").html('<%= escape_javascript(render :partial => "users/syllabus_course_list", :locals => {:syllabuses => @syllabuses, :list_type => 2}) %>'); +<% end %> \ No newline at end of file diff --git a/app/views/users/user_courselist.html.erb b/app/views/users/user_courselist.html.erb index 148cc1703..25bf2354d 100644 --- a/app/views/users/user_courselist.html.erb +++ b/app/views/users/user_courselist.html.erb @@ -1 +1,35 @@ -<%= render :partial => 'users/user_syllabus_list'%> +
    +

    课程列表

    + + <%= render :partial => 'users/user_syllabus_list'%> +
    + <%= render :partial => 'users/user_join_syllabus_list'%> +
    + + + \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index 5439da9f4..6c16dbd7d 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -563,6 +563,7 @@ RedmineApp::Application.routes.draw do post "user_commit_homework" post 'user_select_homework' get 'all_journals' + get 'expand_courses' end member do @@ -619,6 +620,8 @@ RedmineApp::Application.routes.draw do match 'user_courselist', :to => 'users#user_courselist', :via => :get, :as => "user_courselist" match 'user_projectlist', :to => 'users#user_projectlist', :via => :get, :as => "user_projectlist" + match 'sort_syllabus_list', :to => 'users#sort_syllabus_list', :via => :get, :as => "sort_syllabus_list" + get 'edit_brief_introduction' get "user_resource" get "import_resources" diff --git a/public/images/syllabus/icons_syllabus.png b/public/images/syllabus/icons_syllabus.png index 7f6c4987cc280922e84f6cc32ed3750b0af87e52..4afdb729f96ffa021e9e40a271718a7ea3883b63 100644 GIT binary patch delta 2548 zcmbW1dpMN&0>@`C4Pql~CDu@p+PB`@yze^*b1{wkX|aTjxf<=(xGaaTGdf*Z(qw9N zL@p_tA`z>LODVCV?26E;BbQ{^C6|Owd#2j+&pyxYbDs12>v#EnKi}`~dEe*PT}Cdg zCRZNQ*V;Z=t@GsYIMaR-Tz6cda{c6LrBL;b@i{S=d~R8BAGz!Ad(3qMGjF?*_X0d zsVvF?gvCOPE))T}Ko|(XzzHE86Nz931N#d*#wQR6!bJb49hZnu6ekb>#s%Wv(;-3# z5SS3g7<3%s!-OW?o(3WW2thas;xLF25Ja#c)Qv+R3z6J&}XZ>&z-~cPk1zumz3roU~$)Fd>!8F5&PK-GuBDR6IG9j z&s7(l7~%400%Os!OSvW4Hb(nt6Gz`f6`2QbHn!$b*40LBXfC(#+|wKwpQOjS#&b5Q z_S&;J^rmH7?EL-q`q;_#`*HHHy7v6*qy3ZZ3;i>%@?+!6I>*qm?{~O-C(pQ?H8K`- zcebGBybp-^o-%U-^w00aUB;Q}|5LZm+oOLx# z^GN0R1(y2g1FVtp{^fw26*;<#W7rlraF83kpdZTDkyiEVKN+v=DIYN7>ZYXWHTfD0 z>J)-nFReFOiqF3V+8a@dKcV$hEDQZSOq#Siu<-SKOKGIxj({M;bh~m%c=?SKhZAWv zIjx)2ROuxijain+3rGgQTZGll;>nOL1=5Gggido^C$Z^Dc~e?KXRy{q&kcecR#nU# z`5V%>!t;dgdP+&E?a;q7wHExi`x@{0nG+PRDEHcB30qEIIiwZfh6zunC@whHKh9)0 z#x){W0?4^Xj(x&w)S6M88a`>)W6R4m=3Wm=ciwQpI(oD@)W+9ju%qdUzfJtZx|h*T zk$b4|s9qgBlL(zU(s9ITk6SYSFK5?~v)#&=S?l`f zjwiGB=DhwNWw%GzqmIe*$cvJ>%C0SnrI9$}C=0@No!nAE&2);*c(u17MRB#>umm4e z&MTNP4VzA1sV!Z38IWWe`3Cu!;<%9<5^VFc$6R{6g#hzy>1s3IUUk;m zEC1v@x!lyr+tpSHorjF>eM7f5@QpxK-m z`|;JFo2f+}so%c)6O_82D|94#<);kWskYi@E|n?87bZ3#ncP87c(9|rX zoE)0|&LMo|)cThbWBT@W0{<-qJbdRoNgg(`vE(Dj^arw2(1A;*d{<3XSR7_gr=!ZB zDp$Q3Pad|ix%WNCDlujusHr+;Lhq(sr|TklGTfKF)O}>yf5p`E9Cc}9v@=-fJDl2{ zeZMBioBGkTvLe*^7GcYa?#J2%<6XYFV=ImO21`)i)Nj*=T&7uHYEM?)Q!Pf+A7 zZBcPm)W*yXvjK~~%~?HbMsa2Rc>wVKRDM*$fIW8M+8s+b?w)E=QwE++Es&+Hs=epb zHIJK2HRrObvP`=lFTEbN&+#4poVV(48TC2#GcG27S4$)6JR8nTFP6V3`EBgx)}dJH z)OGDH8TX!4b*}9I*ne2lcR~fp-;~Fgc1jcTWucDGt;1R(3ZqwKzENMidM2iSXrRVm z{R2^o>8*O_S*2}32W9B>q(W1w%J7v#Q%VEXdG7s1V<<~5>G#c|k1lUQni@aqd^U6S zi@Y%X=O&4?f7T|ZcKFO})$3}QIcAsRyR9-ftHnt3Rdm8Hc*znX<)6lr=g9@8Psg7j z<_SBpqOBJ=@yErxFPT0JP0U{V{Ir1+zo)g|59zL%Kdp71x%O}mn zbyJYr*B*TNjZw?TRp05&F=&pY4^h)6ulJVp8FxmkJ_GL4iX>;-|B7J%}B3{d0#`q&!8Z#`-?~NT&uI%jrA3|6hk%wDz8Ma77c*j zrF5&Yaj?DVhs=jAwE2pgXS9Ty%c@A^x-|*R!A$#@Jx6EP0M-u;PHd-@ZMiBjz9 dUtjtgm6Y~)ONCkAnrxD0xV!mqDp=wB{{wkeF=qe( delta 1877 zcma)5XHb)g7X4D_U0_2~`Ua6K5CRg!5K0h~8iIg46{HE$T&WUBA}v6Czy@*Y0#X7Y zs35Q+CJsdbsUa(6DK0t-p_fpE^*wgp{@P#f&fFjO&Y648oqKLw3y9YMdX_H^wi9Zh zi}ymL%n(Qv!PwLSdENqPL=Tci|D)3=9i(G~@()4=BmEIU#^$#WC^QO*K%@PUh+vZd zv%rABTLD4-CM_tL4AK7!NuPt6|AS=Y)L_fH(mt3zqAp5rIpavjsXNj?o@A(oW6P07 zjxjXUG#XFO#v79EI@(zi5~f#6BdCg=O7BQ_GE@x$n|@&a;=gNMhb;6amiUb7-MgYY zEwjgPCZ?AZ$U$us(o(`JmAuc%SIQ{sJ?~|CuU@@y=R273U@g_b!D~xb3Tncb$wW7X zglx+hqQysJpY9Zi0ckvX`Ay1KeiE?2vN z3$99~isM8y-S7Zj66>wk3y2m#v6mHzvITe{L$@l%@I2#4V*dJ;%k|RlCHz)?ZHmSB zoQ>gYfwWF(fbA6OJYbGea$>UoD+?af9?9#(XqnpSV4+k8a-hd~Tex+OTaCs36P(^M z>9>H1JiO2u)VRLq0$AIc?#W!}mQKo1e9dvFlo0(@P`+)XPUXp!&otGuK8ga686=6K$`kDYiDNtWrX)M&#}zk&|+sd+lE!DXB>{t_Wn!m~WM zX|~zE;ssB3@IT1M{T`VI63=@2mAzV9Qw!ImflHJ_F;4CdsP6y>B^?B&Om>QOu!iH! z(TmwZou>=e{#{>f3!1Ln{+CFbj=f-DysQ{Va&69oAku*H2Xz`t`N*uq1IwOv^^ z4~k)3Q|8R;T-C)++#cwDV^ap9N~VaGPv|QW5I^~ zf?Blw!x-Rd*hl6=($=ij5pV~t`abZ3?VM0>{Z845M00etYlXIV+XeYa24>i;n>(k2 zX@G3(4B^H%`}Zt+>V!D%gK_adMPutb%Ju2@a4CdaHRH#lr#Ec%$1=kSr}?Dmv^8u# z(W+j|*LtYFkq4jIk?l$xw}E#iPqjUjwHPa@`w7ESuplwABd{kc-%gJo?pGeVyP+tn zcY1Mg#TD?8sq9&T4`QZRnxXnD=Q3X0d!7x?_}gSUSR`{<-f3bTD1?jvS17-5tiq1V zMKB=Y($c$#ti#RCXgzfSYw2Zvx8l*g1W!ckB>uAE}X}lA?X0RRmQZnk3=mIJ_ zZQH=jdC7w-LC`8<csH1V~%SVGQoE7yE)*2-KCY%Cc! z^ge39h*sRJNopj^Cp5+kQiNj-yh7oGa+E-LQ*DmqTaGXdG@zxBKY4gfk&aKTAF{j7 zzhsn$_^SGtHCN)kECbRtyOPb|9C9Yv+Ap15JMoi!2;YP^Grv984x4<;_D0?FnlUg# zlwVYtPEhJ7wV|gsD5r8#IsNW>FMkW{l5AB&$HtOulz^jcm@+0-@%7K#J%x(J2M?n0 z*2>W0u*3qM^yb*s6$)&X{iyEZmyj*n#LhxWE9jW{m4+YRZhiDAF&Gf=i75z(SQD}@ z;}7sn@IHj?F2w#|QiR}l$(+3b| z0rO6TS~_JQ30)JiBzyx}&Wcs~+T&Ky#2z_t9;>!!@>8=R$Y}ua5JN^{pVp(jGQP#gZ~0Pk5q~P