
    hm                     N   d dl mZ d dlmZ d dlmZ d dlmZmZ d dl	m
Z
 d dlmZ d dlmZmZmZmZ d dlmZ d d	lmZmZmZ d d
lmZ d dlmZ d dlmZ d dlmZm Z m!Z! d dl"m#Z#m$Z$m%Z% d dl&m'Z' d dl(m)Z)m*Z*m+Z+m,Z,m-Z- d dl.m/Z/m0Z0m1Z1 d dl2m3Z3 d dl4m5Z5m6Z6m7Z7 d dl8m9Z9 d dl:m;Z; d dl<Z<d dl=m>Z>m?Z?  G d dee       Z@ G d de       ZA G d dee$      ZB G d dee$      ZCd  ZD G d! d"e#      ZE G d# d$e#      ZFd% ZG G d& d'e%      ZH G d( d)ee      ZI G d* d+ee      ZJ G d, d-ee      ZK G d. d/ee!      ZL G d0 d1ee%      ZM G d2 d3ee$      ZN G d4 d5e#e      ZO G d6 d7e#e      ZP G d8 d9e%e      ZQ G d: d;e      ZRd< ZSd= ZTd> ZU G d? d@e'      ZVdA ZW G dB dCe ee      ZXdD ZYdE ZZy)F    )settings)messages)login)LoginRequiredMixinUserPassesTestMixin)User)	send_mail)QAvgExistsOuterRefHttpResponse)renderget_object_or_404redirectreverse)timezone)	urlencode)TemplateView
DetailViewListView)FormView
UpdateView
CreateView)RegistrationView)SetUpFlowOneFormCarerSearchForm
ReviewFormFileUploadFormActivationPasswordForm)send_staff_welcome_emailsend_admin_welcome_emailsend_organisation_welcome_email)process_excel_file)ProfileReviewUserActivationCode)Organisation)FakerN)QuizCompletedQuizc                   0     e Zd ZdZdZeZd Z fdZ xZ	S )UserProfileDetailViewzDThis is a logged in user profile page, to see their own profile pagecarers/profile_detail.htmlc                 L    t        t        | j                  j                        S Nuser)r   r'   requestr4   selfs    8/var/www/peopleoo.sandbox-dev.co.uk/apps/carers/views.py
get_objectz UserProfileDetailView.get_object)   s     !t||/@/@AA    c           
         t        t        | 
  di |}d|d<   | j                  j	                  d      d d |d<   | j
                  j                  j                         |d<   t        j                  j                  | j
                  j                  d      j                  d      |d	<   t        j                  j                  d
      j                  t        t         j                  j                  | j
                  t#        d                        }|j%                         }|j                  d
      j%                         }||d<   ||d<   ||d<   |dkD  r||z  dz  nd}t'        |d      |d<   |S )NFvisitor/base_urlstaff_link_requestr4   is_flagged_for_review-created_atreviewsT)is_publishedpk)profilequiz)is_completequizzestotal_quizzes_countcompleted_quizzes_countr   d      completed_percentage )superr/   get_context_datar5   build_absolute_uriobjectstafflinkrequest_setfirstr(   objectsfilterr4   order_byr,   annotater   r-   r   countround)r7   kwargscontextrJ   total_quizzesrL   rO   	__class__s          r8   rR   z&UserProfileDetailView.get_context_data.   si   -tEOO"	"ll==cB3BG
(,(H(H(N(N(P$%#^^228H8H`e2foop}~	,,%%4%8AA%%,,T[[xPT~,V B 

  ")..T."B"H"H"J$	)6%&-D)* @Mq?P$}4s:VW 	 +00Da*H&'r:   
__name__
__module____qualname____doc__template_namer'   modelr9   rR   __classcell__r`   s   @r8   r/   r/   $   s     N0MEB
 r:   r/   c                   0     e Zd ZdZdZeZd Z fdZ xZ	S )UserProfileVisitorDetailViewzCThis is a user profile page for a user to see other people profilesr0   c                 \    | j                   j                  dd       }t        t        |      S )Npinrm   )r]   getr   r'   )r7   rm   s     r8   r9   z'UserProfileVisitorDetailView.get_objectQ   s#    kkooeT* c22r:   c                     t        t        | 
  di |}d|d<   t        j                  j                  | j                  j                  d      j                  d      |d<   |S )NTr<   FrA   rC   rD   rP   )	rQ   rk   rR   r(   rW   rX   rT   r4   rY   r7   r]   r^   r`   s      r8   rR   z-UserProfileVisitorDetailView.get_context_dataV   s\    4dLVvV!	#^^228H8H`e2foop}~	r:   ra   ri   s   @r8   rk   rk   L   s    M0ME3
 r:   rk   c                   F     e Zd ZdZeZdZeZddZ	 fdZ
 fdZd Z xZS )SetUpFlowOneFormViewaInitial redirect after sign up, allows user to add basic detail to their carer profile, name, etccarers/set-up-flow-1.htmlc                 t    t         j                  j                  | j                  j                        \  }}|S r2   r'   rW   get_or_creater5   r4   r7   querysetobjcreateds       r8   r9   zSetUpFlowOneFormView.get_objectd   ,    44$,,:K:K4LW
r:   c                 0    t        |   di |}d|d<   |S )NzSet up your carer profile
page_titlerP   rQ   rR   rq   s      r8   rR   z%SetUpFlowOneFormView.get_context_datai   s$    '*4V4 ;r:   c                 F   | j                   j                  }|j                  d   |_        |j                  d   |_        |j                          |j                  j                  dd       }|r{	 t        j                  j                  |      }|j                  j                  | j                         |j                  | j                  _        | j                  j                          t"        | I  |      S # t        j                  $ r}t!        |       Y d }~2d }~ww xY w)N
first_name	last_namesignup)unique_code)r5   r4   cleaned_datar   r   savedataro   r*   rW   staffaddrT   nameemployer_nameDoesNotExistprintrQ   
form_valid)r7   formr4   unique_organisation_codeorganisationer`   s         r8   r   zSetUpFlowOneFormView.form_valido   s    
 ||  ++L9**;7		 $(99==4#@ #+3377D\7]""&&t{{3,8,=,=)  " w!$''	  ,, as   /A:C8 8D DD c                     t        d      S NrG   r   r6   s    r8   get_success_urlz$SetUpFlowOneFormView.get_success_url       y!!r:   N)rb   rc   rd   re   r'   rg   rf   r   
form_classr9   rR   r   r   rh   ri   s   @r8   rs   rs   ^   s)    kE/M!J
(2"r:   rs   c                   P     e Zd ZdZeZdZeZddZ	 fdZ
 fdZ fdZd Z xZS )	EditProfileFormViewrt   ru   c                 t    t         j                  j                  | j                  j                        \  }}|S r2   rw   ry   s       r8   r9   zEditProfileFormView.get_object   r}   r:   c                     t         |          }| j                  j                  }|j                  |d<   |j
                  |d<   |S Nr   r   )rQ   get_initialr5   r4   r   r   )r7   initialr4   r`   s      r8   r   zEditProfileFormView.get_initial   sB     '%'||   $#~~r:   c                 :    t        |   di |}d|d<   d|d<   |S )NTeditzEdit Profiler   rP   r   rq   s      r8   rR   z$EditProfileFormView.get_context_data   s-    '*4V4 .r:   c                     | j                   j                  }|j                  d   |_        |j                  d   |_        |j                          t        |   |      S r   )r5   r4   r   r   r   r   rQ   r   )r7   r   r4   r`   s      r8   r   zEditProfileFormView.form_valid   sQ    
 ||  ++L9**;7		w!$''r:   c                     t        d      S r   r   r6   s    r8   r   z#EditProfileFormView.get_success_url   r   r:   r   )rb   rc   rd   re   r'   rg   rf   r   r   r9   r   rR   r   r   rh   ri   s   @r8   r   r      s.    kE/M!J

("r:   r   c                     t        d      S )NzIt worksr   )r5   s    r8   set_up_flow_dummyr      s    
##r:   c                       e Zd ZdZeZy)HomeViewzcarers/home.htmlNrb   rc   rd   rf   r   r   rP   r:   r8   r   r     s    &M Jr:   r   c                       e Zd ZdZeZy)FindACarerViewzcarers/find_a_carer.htmlNr   rP   r:   r8   r   r   #  s    .M Jr:   r   c                    | j                   j                  d      }|rt        j                  j	                  t        |      t        |      z  t        |      z  t        |      z  t        |      z        j                  d      j                  d	      }|D ]#  }t        |j                  j                  d
       % nd }t        | dd|i      S )Nsearch)user__first_name__icontains)preferred_name__icontains)user__last_name__icontains)employer_name__icontainsrn   T)pin__isnull )flushz$components/carer-search-results.htmlresultsr^   )GETro   r'   rW   rX   r
   excluder   r4   usernamer   )r5   termr   ress       r8   carer_searchr   (  s    ;;??8$D //(($/-../ t,- $K	
 'd'
#GGGO 	  	1C#((##40	1 'AIW^K_``r:   c                   V     e Zd ZeZeZdZ fdZ fdZ	d Z
d Zd Z fdZd Z xZS )	CarerReviewViewzcarers/review_form.htmlc                     t         t        |          }| j                  j	                  d      }t        t        |      |d   d<   |S )Nuser_idrF   r   r4   )rQ   r   get_form_kwargsr]   ro   r   r   )r7   r]   r   r`   s      r8   r   zCarerReviewView.get_form_kwargsC  s?    =?++//),$5dw$Gy&!r:   c                 4   t        t        | j                  j                  d            |j                  _        t        t        | #  |      }| j                  |j                  j
                         | j                  |j                  j
                         |S )Nr   r   )r   r   r]   ro   instancer4   rQ   r   r   'send_review_notification_email_to_carer.send_review_notification_email_to_organisation)r7   r   responser`   s      r8   r   zCarerReviewView.form_validJ  sk    .t	8RS$:4@ 	44T]]5G5GH;;DMM<N<NOr:   c                     t        d       y )Nr   )r   )r7   r   s     r8   form_invalidzCarerReviewView.form_invalidU  s	    b	r:   c                     d}| j                   j                  t        d            }d|j                   d| d}|j                  g}t        ||t        j                  |d       y)	ASend an email notifying the user that they received a new review.z'You have received a new Special Mentionr   z
        Hello z,

        You have received a new Special Mention on our platform. To view it, please log in to your account.

        [Click here to log in and view the Special Mention.](z;)

        Best regards,
        The Peopleoo Team
        Ffail_silentlyN)r5   rS   r   rG   emailr	   r   DEFAULT_FROM_EMAIL)r7   r4   subject	login_urlmessagerecipient_lists         r8   r   z7CarerReviewView.send_review_notification_email_to_carerX  st     <LL33GG4DE	||n > ?H[ I		 **''	
r:   c           
         |j                    d|j                   d}| j                  j                  t	        d            }|j
                  j                  j                         }|D ]Z  }d|j                   d|j                    d|j                   d| d	}|j                  g}t        ||t        j                  |d	       \ y
)r    z received a new Special Mention	org_loginz
            Hello z,
    
            z has received a new Special Mention on our platform. To view it, please log in to your account.
    
            [Click here to log in and view the Special Mention.](zK)
    
            Best regards,
            The Peopleoo Team
            Fr   N)r   r   r5   rS   r   rG   organisationsallr   r   r	   r   r   )r7   r4   r   r   r   r   r   r   s           r8   r   z>CarerReviewView.send_review_notification_email_to_organisationq  s     __%Qt~~&66UVLL33GK4HI	33779) 	L
$$% &__Qt~~. /BBK M	G #jj\N++##	r:   c                     t        t        | 
  di |}| j                  j	                  d      }t        t        |      }|j                  |d<   |S )Nr   r   rG   rP   )rQ   r   rR   r]   ro   r   r   rG   )r7   r]   r^   r   r4   r`   s        r8   rR   z CarerReviewView.get_context_data  sH    ?I&I++//), '2!\\	r:   c                     t        d      S )Nthanksr   r6   s    r8   r   zCarerReviewView.get_success_url  s    x  r:   )rb   rc   rd   r(   rg   r    r   rf   r   r   r   r   r   rR   r   rh   ri   s   @r8   r   r   <  s6    EJ-M	
2#J!r:   r   c                   (     e Zd ZdZd Z fdZ xZS )ManagementViewzcarers/manage.htmlc                 B    | j                   j                  j                  S r   r5   r4   is_superuserr6   s    r8   	test_funczManagementView.test_func      ||  ---r:   c                    t        t        | 
  di |}t        j                  j                         |d<   t        j                  j                  d      j                         |d<   t        j                  j                         |d<   t        j                         }|j                  ddddd      }t        j                  j                  |	      j                         |d
<   t        j                  j                  t        d            d   |d<   t        j                  j                  |	      j                  t        d            d   |d<   |S )N	num_usersT)has_completed_setupusers_completed_onboardingnum_reviews   r   )dayhourminutesecondmicrosecond)created_at__gtereviews_this_monthratingrating__avgaverage_scoreaverage_score_this_monthrP   )rQ   r   rR   r'   rW   r[   rX   r(   r   nowreplace	aggregater   )r7   r]   r^   r   start_of_monthr`   s        r8   rR   zManagementView.get_context_data  s&   >HH  '446 180F0F[_0F0`0f0f0h,- "(!5!5!7 lln1QTUV(.(=(=n(=(](c(c(e$% $*>>#;#;CM#J=#Y  /5nn.C.CTb.C.c.m.mnqrzn{.|  ~K  /L*+r:   rb   rc   rd   rf   r   rR   rh   ri   s   @r8   r   r     s    (M. r:   r   c                   (     e Zd ZdZd Z fdZ xZS )ManageReportsViewzcarers/manage_reports.htmlc                 B    | j                   j                  j                  S r   r   r6   s    r8   r   zManageReportsView.test_func  r   r:   c                 t    t        t        | 
  di |}t        j                  j                  d      |d<   |S )NTrB   reported_reviewsrP   )rQ   r   rR   r(   rW   rX   rq   s      r8   rR   z"ManageReportsView.get_context_data  s;    )4AKFK&,nn&;&;RV&;&W"#r:   r   ri   s   @r8   r   r     s    0M. r:   r   c                   (     e Zd ZdZd Z fdZ xZS )ManageUsersViewzcarers/manage_users.htmlc                 B    | j                   j                  j                  S r   r   r6   s    r8   r   zManageUsersView.test_func  r   r:   c                     t        t        | 
  di |}t        j                  j                  d      |d<   t        j                  j                  d      |d<   |S )Nr   )user__first_name__exactusers_completed_setupusers_not_completed_setuprP   )rQ   r   rR   r'   rW   r   rX   rq   s      r8   rR   z ManageUsersView.get_context_data  sX    ?I&I+2??+B+B[]+B+^'(/6/E/E^`/E/a+,r:   r   ri   s   @r8   r   r     s    .M. r:   r   c                       e Zd ZdZdZeZd Zy)ManageOrganisationsz carers/manage_organisations.htmlr   c                 B    | j                   j                  j                  S r   r   r6   s    r8   r   zManageOrganisations.test_func  r   r:   N)rb   rc   rd   rf   context_object_namer*   rg   r   rP   r:   r8   r  r    s    6M)E.r:   r  c                   (    e Zd ZeZg dZdZd Zd Zy)CreateOrganisationr   r   logo'carers/manage_organisations_create.htmlc                 B    | j                   j                  j                  S r   r   r6   s    r8   r   zCreateOrganisation.test_func  r   r:   c                     t        d      S Nmanage_organisationsr   r6   s    r8   r   z"CreateOrganisation.get_success_url      -..r:   N	rb   rc   rd   r*   rg   fieldsrf   r   r   rP   r:   r8   r  r        E&F=M./r:   r  c                   (    e Zd ZeZg dZdZd Zd Zy)UpdateOrganisationr  r  c                 B    | j                   j                  j                  S r   r   r6   s    r8   r   zUpdateOrganisation.test_func  r   r:   c                     t        d      S r  r   r6   s    r8   r   z"UpdateOrganisation.get_success_url  r  r:   Nr  rP   r:   r8   r  r    r  r:   r  c                   2     e Zd ZdZeZd Z fdZd Z xZ	S )OrganisationUploadStaffcarers/manage_csv_upload.htmlc                 B    | j                   j                  j                  S r   r   r6   s    r8   r   z!OrganisationUploadStaff.test_func  r   r:   c           	      &   | j                   j                  d      }t        t        |      }|j                  d   }t        ||d      \  }}t        j                  | j                  t        j                  d| d| d       t        | -  |      S )	NrF   r   fileFadminszStaff File processed. Imported  rows out of .r]   ro   r   r*   r   r&   r   add_messager5   INFOrQ   r   r7   r   organisation_idr   r   num_imported
total_rowsr`   s          r8   r   z"OrganisationUploadStaff.form_valid  s    ++//$/(/J  (#5dLQV#W jT\\8==<[\h[iiv  xB  wC  CD  ;E  	Fw!$''r:   c                     t        d      S r  r   r6   s    r8   r   z'OrganisationUploadStaff.get_success_url  r  r:   )
rb   rc   rd   rf   r!   r   r   r   r   rh   ri   s   @r8   r  r    s    3MJ.(/r:   r  c                   2     e Zd ZdZeZ fdZd Zd Z xZ	S )OrganisationUploadAdminr  c           	      &   | j                   j                  d      }t        t        |      }|j                  d   }t        ||d      \  }}t        j                  | j                  t        j                  d| d| d       t        | -  |      S )	NrF   r   r   Tr!  zAdmin File processed. Imported r#  r$  r%  r(  s          r8   r   z"OrganisationUploadAdmin.form_valid%  s    ++//$/(/J  (#5dLQU#V jT\\8==<[\h[iiv  xB  wC  CD  ;E  	F w!$''r:   c                     t        d      S r  r   r6   s    r8   r   z'OrganisationUploadAdmin.get_success_url/  r  r:   c                 B    | j                   j                  j                  S r   r   r6   s    r8   r   z!OrganisationUploadAdmin.test_func2  r   r:   )
rb   rc   rd   rf   r!   r   r   r   r   rh   ri   s   @r8   r.  r.  !  s    3MJ(/.r:   r.  c                   :     e Zd ZeZg dZdZd Z fdZd Z	 xZ
S )CreateChildOrganisation)parentr   r   r  r  c                 B    | j                   j                  j                  S r   r   r6   s    r8   r   z!CreateChildOrganisation.test_func=  r   r:   c                     t         |          }| j                  j                  d      }t	        t
        |      }||d<   |S )NrF   r   r4  )rQ   r   r]   ro   r   r*   )r7   r   	parent_pkparent_organisationr`   s       r8   r   z#CreateChildOrganisation.get_initialA  s>    '%'KKOOD)	/K/r:   c                     t        d      S r  r   r6   s    r8   r   z'CreateChildOrganisation.get_success_urlJ  r  r:   )rb   rc   rd   r*   rg   r  rf   r   r   r   rh   ri   s   @r8   r3  r3  7  s!    E0F=M./r:   r3  c                       e Zd ZdZy)ReviewThankYouViewzcarers/thanks.htmlN)rb   rc   rd   rf   rP   r:   r8   r;  r;  N  s    (Mr:   r;  c                 h    t        t        |      }d|_        |j                          t	        d      S )Nr   Tz	Reported!)r   r(   rB   r   r   )r5   	review_pkreviews      r8   report_reviewr?  R  s*    v)4F#'F 
KKM$$r:   c                     t        t        |      }d|_        |j                          dt        j                  j                  d      i}t        | d|      S )Nr   Fr   Tr   !components/review_list_table.html)r   r(   rB   r   rW   rX   r   r5   r=  r>  r^   s       r8   keep_reviewrC  Z  sQ    v)4F#(F 
KKM 	FNN111MG '>HHr:   c                     t        t        |      }|j                          dt        j                  j	                  d      i}t        | d|      S )Nr   r   Tr   rA  )r   r(   deleterW   rX   r   rB  s       r8   delete_reviewrF  g  sI    v)4F
MMO 	FNN111MG '>HHr:   c                       e Zd ZdZddZy)CustomRegistrationViewz
    A custom registration view that extends the original RegistrationView
    to append a query parameter to the success URL.
    Nc                     t        t        dd      }| j                  j                  j	                  dd      }|rt        d|i      }| d| }|S )zC
        Override get_success_url to add query parameters.
        SIMPLE_BACKEND_REDIRECT_URLr=   r   N?)getattrr   r5   POSTro   r   )r7   r4   success_urlsignup_paramquery_strings        r8   r   z&CustomRegistrationView.get_success_urly  s[    
 h(EsK ||((,,Xt< $h%=>L(M<.9Kr:   r   )rb   rc   rd   re   r   rP   r:   r8   rH  rH  s  s    
r:   rH  c                 8   t         j                  rt        d      }g }t        d      D ]  }|j	                         }|j                         }|j                         }t        j                  j                  |j                          |j                          | |||      }|j                  |       |j                  j                  d      }t        j                  j                  |      j!                         rt        j                  j                  |t#        j$                  ddg      r|j	                         nd	t#        j$                  ddg      r|j'                         nd	t#        j$                  ddg      r|j                         nd	t#        j$                  ddg      t#        j$                  ddg      r|j	                         nd	
        |D ]  }t        d      D ]  }	t(        j                  j                  |t#        j$                  g d      |j+                  d      |j-                         |j/                         |j                         t#        j$                  g d      t#        j$                  ddg               t1        d       y y )Nen_GB
   )r   r   r   r   z######)textr3   TFr   )r4   middle_namesr   employer_emailr   preferred_name   )r   rN         rX  i,  )max_nb_chars)Friend	ColleagueClientManagerPartner)r4   r   rT  reviewer_namereviewer_phonereviewer_emailrelationship_to_userrB   z+Dummy data creation completed successfully.)r   
IS_STAGINGr+   ranger   r   r   r   rW   createlowerappenduniquenumerifyr'   rX   existsrandomchoicecompanyr(   rT  r   phone_numberr   )
r5   fakerusersir   r   r   r4   rm   _s
             r8   staging_setupru    s   g r 	A))+J)IKKME<<&&&,,./	0A/B1#F%#	 ' D LL ,,''X'6C ??))t)4;;=&&7=}}dE]7S!1!1!3Y[5;]]D%=5Q%--/WY4:MM4-4P5;;=VX(.tUm(D9?e}9U5#3#3#5[] ' %	8  	D1X 
%%!==95"'**,#(#5#5#7#(;;=)/7n)o*0--u*F & 	
	 	BC] r:   c                       e Zd ZdZeZd Zy)ViewOrganisationPeoplezcarers/manage_view_staff.htmlc                 B    | j                   j                  j                  S r   r   r6   s    r8   r   z ViewOrganisationPeople.test_func  r   r:   N)rb   rc   rd   rf   r*   rg   r   rP   r:   r8   rw  rw    s    3ME.r:   rw  c                 L   t        t        |      }|j                  j                         }|j                  j                         }|j
                  s"t        |       d|_        |j                          |D ]<  }|j
                  rt        |j                  |       d|_        |j                          > |D ]<  }|j
                  rt        |j                  |       d|_        |j                          > t        j                  | t        j                  d       t        d      S )Nr   TzWelcome emails sent.r  )r   r*   r   r   r"  sent_welcome_emailr%   r   r#   r4   r$   r   r&  SUCCESSr   )r5   rF   r   r   r"  rG   admins          r8   manage_send_welcome_emailsr}    s    $\b9L""$E  $$&F**'5*.' ))$W\\<@)-G&LLN	  ''$UZZ>'+E$JJL ("2"24JK*++r:   c                    t        t        |      }|j                  }|j                  rt	        d      S | j
                  rt        | j
                        }|j                         r`|j                  |j                  d          d|_        |j                          t        | |       t        |d      }t	        |rd      S d      S t        | dd|i      S t        d|i	      }t        | dd|i
      S )N)uuidrG   new_password2Torg_dashboardz#carers/activation_set_password.htmlr   r  )r   r   )r   r)   r4   	is_activer   rM  r"   is_validset_passwordr   r   r   hasattrr   )r5   r  activation_objectr4   r   profile_existss         r8   activate_accountr    s    )*<4H!!D~~	""||%gll3==?d//@A!DNIIK'4  %T95NIMM_MM gDvtnUU "64.9D'@6SW.YYr:   )[django.confr   django.contribr   django.contrib.authr   django.contrib.auth.mixinsr   r   django.contrib.auth.modelsr   django.core.mailr	   django.db.modelsr
   r   r   r   django.httpr   django.shortcutsr   r   r   django.urlsr   django.utilsr   django.utils.httpr   django.views.genericr   r   r   django.views.generic.editr   r   r   "registration.backends.simple.viewsr   apps.carers.formsr   r   r    r!   r"   apps.carers.lib.emailsr#   r$   r%   apps.carers.lib.process_excelr&   apps.carers.modelsr'   r(   r)   apps.orgs.modelsr*   rq  r+   rm  apps.quiz.modelsr,   r-   r/   rk   rs   r   r   r   r   r   r   r   r   r   r  r  r  r  r.  r3  r;  r?  rC  rF  rH  ru  rw  r}  r  rP   r:   r8   <module>r     s     # % N + & 5 5 $ @ @  ! ' C C F F ? s s v v < B B )   0%.
 %P: $,"-z ,"^*",j *"Z$H!x !
!X !
a(d!j d!R(, B+\ )<  .-x .
/,j 
/
/,j 
//h(; /*.h(; .,/j*= /.) )%	II- H0Dh.Z);=P .,6Zr:   