ࡱ> ` bjbj ' $ $ $ 4D%h4,D4qtH ^***d D2Yq[q[q[q[q[q[q$NshuRq$ F"h"q **qttt 8*$ *YqtYqtt'a $ h*< # wm,jcJUkq0qdwHwhhw$ Yitqq^qD4D4D4DVDTD4D4D4X $|     TITLE \* MERGEFORMAT SharePoint PREP Technical Documentation Author:  AUTHOR \* MERGEFORMAT Chris Felknor Last Modified:  SAVEDATE \@ "M/d/yy" 12/21/06 By:  LASTSAVEDBY \* MERGEFORMAT Chris Felknor Table of Contents  TOC \o "2-4" \h \z \t "Heading 1,1"  HYPERLINK \l "_Toc155268020" Table of Contents  PAGEREF _Toc155268020 \h 2  HYPERLINK \l "_Toc155268021" Overview  PAGEREF _Toc155268021 \h 4  HYPERLINK \l "_Toc155268022" PREP Overview  PAGEREF _Toc155268022 \h 4  HYPERLINK \l "_Toc155268023" Design  PAGEREF _Toc155268023 \h 4  HYPERLINK \l "_Toc155268024" Design Principles  PAGEREF _Toc155268024 \h 4  HYPERLINK \l "_Toc155268025" Design Components  PAGEREF _Toc155268025 \h 5  HYPERLINK \l "_Toc155268026" Classes and Students  PAGEREF _Toc155268026 \h 5  HYPERLINK \l "_Toc155268027" SharePoint Representation  PAGEREF _Toc155268027 \h 5  HYPERLINK \l "_Toc155268028" PREP Assignments  PAGEREF _Toc155268028 \h 5  HYPERLINK \l "_Toc155268029" SharePoint Representation  PAGEREF _Toc155268029 \h 6  HYPERLINK \l "_Toc155268030" PREP Tasks  PAGEREF _Toc155268030 \h 6  HYPERLINK \l "_Toc155268031" SharePoint Representation  PAGEREF _Toc155268031 \h 6  HYPERLINK \l "_Toc155268032" PREP Documents  PAGEREF _Toc155268032 \h 7  HYPERLINK \l "_Toc155268033" SharePoint Representation  PAGEREF _Toc155268033 \h 7  HYPERLINK \l "_Toc155268034" Folder Structure  PAGEREF _Toc155268034 \h 7  HYPERLINK \l "_Toc155268035" Identification  PAGEREF _Toc155268035 \h 7  HYPERLINK \l "_Toc155268036" Software Architecture  PAGEREF _Toc155268036 \h 8  HYPERLINK \l "_Toc155268037" Assemblies  PAGEREF _Toc155268037 \h 8  HYPERLINK \l "_Toc155268038" Web Parts  PAGEREF _Toc155268038 \h 8  HYPERLINK \l "_Toc155268039" PREP Matrix  PAGEREF _Toc155268039 \h 9  HYPERLINK \l "_Toc155268040" Building the PREP Matrix  PAGEREF _Toc155268040 \h 9  HYPERLINK \l "_Toc155268041" PREP Administration  PAGEREF _Toc155268041 \h 10  HYPERLINK \l "_Toc155268042" Event Handler  PAGEREF _Toc155268042 \h 11  HYPERLINK \l "_Toc155268043" Insert  PAGEREF _Toc155268043 \h 11  HYPERLINK \l "_Toc155268044" Update  PAGEREF _Toc155268044 \h 12  HYPERLINK \l "_Toc155268045" Delete  PAGEREF _Toc155268045 \h 15  HYPERLINK \l "_Toc155268046" HTTPHandlers  PAGEREF _Toc155268046 \h 15  HYPERLINK \l "_Toc155268047" PREPUploadDownloadHandler  PAGEREF _Toc155268047 \h 15  HYPERLINK \l "_Toc155268048" Upload  PAGEREF _Toc155268048 \h 16  HYPERLINK \l "_Toc155268049" Download  PAGEREF _Toc155268049 \h 16  HYPERLINK \l "_Toc155268050" Checkout  PAGEREF _Toc155268050 \h 16  HYPERLINK \l "_Toc155268051" Business Objects  PAGEREF _Toc155268051 \h 16  HYPERLINK \l "_Toc155268052" PREPAssignment  PAGEREF _Toc155268052 \h 17  HYPERLINK \l "_Toc155268053" Public Instance Properties  PAGEREF _Toc155268053 \h 17  HYPERLINK \l "_Toc155268054" Public Static Methods  PAGEREF _Toc155268054 \h 17  HYPERLINK \l "_Toc155268055" PREPTask  PAGEREF _Toc155268055 \h 17  HYPERLINK \l "_Toc155268056" Public Instance Properties  PAGEREF _Toc155268056 \h 17  HYPERLINK \l "_Toc155268057" Public Static Methods  PAGEREF _Toc155268057 \h 18  HYPERLINK \l "_Toc155268058" PREPDocument  PAGEREF _Toc155268058 \h 19  HYPERLINK \l "_Toc155268059" Public Instance Properties  PAGEREF _Toc155268059 \h 19  HYPERLINK \l "_Toc155268060" Public Static Methods  PAGEREF _Toc155268060 \h 20  HYPERLINK \l "_Toc155268061" PREPRole  PAGEREF _Toc155268061 \h 21  HYPERLINK \l "_Toc155268062" Public Instance Properties  PAGEREF _Toc155268062 \h 22  HYPERLINK \l "_Toc155268063" PREPImpersonation  PAGEREF _Toc155268063 \h 22  HYPERLINK \l "_Toc155268064" Public Instance Methods  PAGEREF _Toc155268064 \h 22  HYPERLINK \l "_Toc155268065" Technical Walk-through  PAGEREF _Toc155268065 \h 22  HYPERLINK \l "_Toc155268066" PREP Matrix  PAGEREF _Toc155268066 \h 22  HYPERLINK \l "_Toc155268067" Event Handler  PAGEREF _Toc155268067 \h 27  HYPERLINK \l "_Toc155268068" Upload an Ideas Document  PAGEREF _Toc155268068 \h 27  HYPERLINK \l "_Toc155268069" Review Someone Elses Ideas Document  PAGEREF _Toc155268069 \h 27  HYPERLINK \l "_Toc155268070" Upload a Review  PAGEREF _Toc155268070 \h 28  HYPERLINK \l "_Toc155268071" Development  PAGEREF _Toc155268071 \h 29  HYPERLINK \l "_Toc155268072" Custom Web Parts  PAGEREF _Toc155268072 \h 29  HYPERLINK \l "_Toc155268073" Visual Studio.NET Template  PAGEREF _Toc155268073 \h 29  HYPERLINK \l "_Toc155268074" Visual Studio.NET Project  PAGEREF _Toc155268074 \h 29  HYPERLINK \l "_Toc155268075" Installing the Web Part  PAGEREF _Toc155268075 \h 29  HYPERLINK \l "_Toc155268076" Server  PAGEREF _Toc155268076 \h 29  HYPERLINK \l "_Toc155268077" SharePoint Site  PAGEREF _Toc155268077 \h 30  HYPERLINK \l "_Toc155268078" Document Event Handlers  PAGEREF _Toc155268078 \h 30  HYPERLINK \l "_Toc155268079" .NET Project  PAGEREF _Toc155268079 \h 30  HYPERLINK \l "_Toc155268080" Installation in SharePoint  PAGEREF _Toc155268080 \h 30  HYPERLINK \l "_Toc155268081" Enable Custom Event Handlers in SharePoint  PAGEREF _Toc155268081 \h 30  HYPERLINK \l "_Toc155268082" Install the Assembly into the GAC  PAGEREF _Toc155268082 \h 31  HYPERLINK \l "_Toc155268083" Wiring the Event Handler to Your SharePoint Site  PAGEREF _Toc155268083 \h 31  HYPERLINK \l "_Toc155268084" Debugging  PAGEREF _Toc155268084 \h 32  HYPERLINK \l "_Toc155268085" Security Considerations  PAGEREF _Toc155268085 \h 32  HYPERLINK \l "_Toc155268086" Impersonation  PAGEREF _Toc155268086 \h 32  HYPERLINK \l "_Toc155268087" Strong Names  PAGEREF _Toc155268087 \h 32  HYPERLINK \l "_Toc155268088" Custom Web Pages  PAGEREF _Toc155268088 \h 33  HYPERLINK \l "_Toc155268089" ASP.NET Project  PAGEREF _Toc155268089 \h 33  HYPERLINK \l "_Toc155268090" Security Issues  PAGEREF _Toc155268090 \h 33  HYPERLINK \l "_Toc155268091" Debugging  PAGEREF _Toc155268091 \h 34  Overview This document describes the implementation of the PREP Process within Microsoft SharePoint Services. It is intended for is developers who want to understand or work on the code. It is assumed that you have a general understanding of SharePoint, including how custom development is done within the product, and that you are at least somewhat familiar with PREP. For more information on these topics, please see the section on SharePoint development starting on p.  PAGEREF _Ref154461863 \h 29, and refer to the following documents: Installing SharePoint on a Windows 2003 Server: SharePoint PREP Installation (SharePoint PREP Installation.doc MS Word document) For an introduction to SharePoint PREP from a users perspective: SharePoint PREP Version 2.0 (SharePoint PREP 2.0.ppt MS PowerPoint presentation) PREP Overview PREP stands for Peer Review Evaluation Process. It is a workflow for design engineers, the goal of which is to help team of 4-6 designers produce the best possible design. PREP requires a team and a design problem. Everyone on the team is given the task of independently coming up with a possible solution to the problem. Once this is complete, everyone on the team critiques everyone elses designs. Then a team meeting is held, the outcome of which should be the teams best design. This process makes it possible for ideas to be evaluated independently of personalities. If the team meeting that is the final stage of PREP were held without the individual designs and critiques, designers who do not have dominant personalities might never have their ideas heard. Since there is no correlation between personality type and the quality of an idea, an open forum could prevent some good ideas from being heard and evaluated. In addition to being a good general design methodology, PREP helps to correct this problem. The optimum team size is 4-6 persons. Too few persons produce too few ideas, and too many persons can make it difficult to reach consensus in the final meeting. Design Design Principles We wanted to put PREP on the Web, in order to enable people who were distributed in space and time to be able to participate in the process. A PREP web site would require a way to manage membership, documents, and tasks. Since these capabilities are already built into Microsoft SharePoint, we decided to use SharePoint as a foundation for our PREP implementation. A key design principle was to leverage what already exists in SharePoint wherever possible. Therefore, every attempt was made to resist the temptation to create a separate database or a directory of custom .aspx pages. Every piece of data is persisted by SharePoint using its own API, the interfaces were done using SharePoint Web Parts, and the logic around what happens to the documents and tasks was done in a SharePoint Document Event Handler. Design Components This section describes the logical components of PREP, followed by a description of the way these components are represented within SharePoint. Classes and Students SharePoint is physically implemented as an ISAPI filter in IIS. It intercepts all HTTP requests to the web site and maps them to a SharePoint virtual site. All of the myriad sites and sub-sites in a SharePoint implementation do not exist in the file system of the server. Everything, including the files in a document library, is stored in a Microsoft SQL Server database. The SharePoint ISAPI filter interprets the URL path, then creates and returns the correct pages to the web browser. Each SharePoint sub-site can have its own collection of users. These users must be implemented as Windows Domain Accounts. A key constraint of the SharePoint product is that it must exist within a Windows Domain. Each SharePoint PREP site typically contains the students and teachers of one class, although a site could also just contain the members of one team. SharePoint Representation A Class is represented as one SharePoint site. The users of the site (students and teachers) are members of the class. PREP Assignments A PREP Assignment is defined by its name, and three dates: Begin Date for the assignment, i.e. the date the assignment is given to the students Ideas Due Date the date by which each student is required to create and upload an Ideas Document Reviews Due Date the date by which each student is required to create and upload a document containing a review of the other team members ideas. There should be one review document for each other member of the team. SharePoint Representation A PREP Assignment is represented in SharePoint as three Events on the Events List (the built-in SharePoint calendar). In addition to being a convenient way to persist this data, this also allows these important dates to appear on the calendar. The three Events are: Assignment Given Ideas Due Reviews Due These Events are identified as belonging to PREP via two custom fields: Milestone (which contains values of Assignment Given, Ideas Due, or Reviews Due) Assignment Name. PREP Tasks There are two kinds of tasks in PREP: Ideas Task. Each user has one. It is their obligation to create and upload an Ideas Document for the assignment. Review Task. Each user has one for every other member of the team (so if there are 6 team members, each user will have 5 Review Tasks). This is the obligation to review other team members ideas. SharePoint Representation SharePoint has a built in Task List which already contains information about the task, its priority, its status (Not Started, In Progress, or Completed), and who it is assigned to. For PREP we use a custom task list called PREP Review Tasks. This is exactly like the built-in task list, with the addition of four custom fields: Document Name. This is the name of the Ideas Document the task pertains to. Document Author. This is the author of the Ideas Document the task pertains to. Assignment Name. The PREP Assignment name AssignedTo Login. The string Login Name of the user the task is assigned to. There is actually an AssignedTo field in a SharePoint task list, but this is set to an SPUser object. This object has a login name property, but it contains domain information and some other characters. We use just the string login name across the PREP application to determine the user. PREP Documents There are two kinds of PREP documents: an Ideas Document, and a Review document. Ideas Document: This contains a team members individual design solution. Review Document: This contains a critique of another team members Ideas Document. There are no restrictions on what type of document may be a PREP document, or what it should be named. SharePoint Representation SharePoint comes with what are called Document Libraries. These are similar to file folders in Windows, except that they also include metadata (fields of information about the document), and are capable of versioning (storing prior versions, with check-out and check-in). SharePoint accomplishes these capabilities by actually storing all file data as BLOBs in SQL Server. For PREP, we use a custom Document Library called PREP Documents. This library has two custom (meta-data) fields unique to PREP: PREP. This is a logical (Yes/No) field; the value will be set to Yes if this is a PREP Document (i.e., a document the Event Handler should care about). PREP Document Type. For PREP Documents, this can have one of two possible values: Ideas, or Review. Folder Structure PREP Documents are stored in a specific folder structure: /PREPDocuments/UserLoginName/PREPAssignmentName PREPDocuments is a fixed string, UserLoginName and PREPAssignmentName are variables. Identification PREP uses a combination of the PREP bit (Y/N field), the document author, and the UserLoginName portion of the folder name to identify its documents, as follows: Document TypeAuthor / FolderPREP BitIdeasAuthorLogin == FolderNameYesReviewAuthorLogin != FolderNameYesNon-PREPAny Author, FolderNo Software Architecture Assemblies SharePoint PREP is organized into two .NET assemblies, PREPMatrixWebPart and PREPWorkflow. There are no .aspx or .html files in the file system; the only site assets used by the PREP application other than the assemblies are a handful of image files used to support the PREP Matrix. These assemblies live in two Visual Studio projects, PREPWorkflow and PREPWebPartLibrary. The content of these assemblies is as follows: PREPWorkflow Document Event Handler Business Objects HTTPHandlers PREPWebPartLibrary Web Parts Web Parts SharePoint Web Parts are sub-units of a web page that may be dragged onto any SharePoint page. They typically completely encapsulate a particular piece of functionality, and are the basic building blocks of all SharePoint web pages. For PREP, we have two custom Web Parts: The PREP Matrix, which is the main user interface to PREP, and the PREP Administration Web Part. The PREP Web Parts are kept in one assembly, which is produced by one Visual Studio Solution called PREPWebPartLibrary. Each Web Part lives in its own class file. PREP Matrix  The PREP Matrix Web Part is the main user interface to PREP. It contains one row and one column for each member of the team. The intersection of a users row and column contains an icon representing that users Ideas Document. All other boxes contain Review Tasks. For a complete discussion of how the PREP interface works from a users perspective, please see the PowerPoint presentation entitled SharePoint PREP Version 2.0. Building the PREP Matrix The PREP Matrix is constructed using a few concentric loops. The outermost loop is the collection of PREP Assignments for the site, an ArrayList of PREPAssignment objects (see  REF _Ref148337012 \h PREPAssignment_Collection on p.  PAGEREF _Ref148337012 \h 17). This collection will control the number of PREP Matrices, i.e. one for each assignment. Inside of each assignment is a collection of users for that assignment, kept in SharePoint as a custom SPRole object called PREPRole (see description on p.  PAGEREF _Ref148342179 \h 21). This loop controls the user rows and columns for each PREP Assignment. Each user in an assignments PREP Role will cause a row to be written to the Matrix. For each user, the same role collection (represented by a different instance of the object) will be iterated through to create the columns. The icons inside the boxes display state information, and contain hyperlinks to documents and tasks. If the user row and column are the same, the matrix will look for an ideas document. If its not there, it will look for an ideas task. Otherwise, it will look through the collection of PREP Tasks for the site to find the task that belongs in the current box in the matrix. There is logic (implemented as methods on the PREP business objects) to determine all of the state information and data (names and locations) needed to complete the icons on the matrix. See PREPDocument.GetIdeasDoc on p.  PAGEREF _Ref148766059 \h 20; PREPDocument.GetReviewDoc on p.  PAGEREF _Ref148766110 \h 20; PREPTask.GetIdeasTask on p.  PAGEREF _Ref148766140 \h 19; and PREPTask.GetReviewTask on p.  PAGEREF _Ref148766170 \h 19. PREP Administration  The PREP Administration Web Part is the Administrators interface. It is actually possible to create everything you will need for a PREP assignment using web pages that already exist within SharePoint, since all of the data is standard SharePoint data. For example, since a PREP Assignment is defined by three events on the Events List, you could simply create these events using the Events List. However, this method is error-prone because failure to create everything the program is looking for will cause the PREP Matrix and Event Handler to malfunction. To avoid this problem, the PREP Administration Web Part was created. In addition to reducing errors, it greatly simplifies the task of administering PREP assignments. The PREP Administration Web Part does three things: Create Events on the Event List in order to define PREP Assignments Create custom SharePoint roles to define users on PREP Assignments Add or Delete users from the custom SharePoint roles When users are added or deleted from roles, their tasks are added or deleted as well. Any documents they may have created are left alone. Event Handler SharePoint has the ability to handle events on Document Libraries. The events it can respond to are insert, update, delete, copy, move, check-in, check-out, and un-check-out. There are specific rules for writing Event Handlers within SharePoint. To simplify implementation, we have used Microsofts Event Handler Toolkit, available at  HYPERLINK "http://www.microsoft.com/downloads/details.aspx?FamilyID=4b2c2f1b-d74a-482a-903a-45bb44c5dec4&DisplayLang=en" http://www.microsoft.com/downloads/details.aspx?FamilyID=4b2c2f1b-d74a-482a-903a-45bb44c5dec4&DisplayLang=en We used an abstract class called BaseEventSink.cs, from the SampleEventSinks project. It encapsulates all of the basic functionality needed for a custom Event Handler. Our derived class for the PREP Event Handler is called PREPEventSink. It lives in an assembly and Visual Studio Project called PREPWorkflow. The events handled by PREP are Insert, Delete, and Update. Following is a description of what happens when these events fire. Insert This is the event that fires when any document is uploaded to the PREP document library. Our handler only responds to valid PREP documents upon first-time upload. The first thing the PREP Event handler does on an Insert is perform a number of checks to see if the document that was just uploaded needs to be processed. These checks are: Was the Insert triggered by a document or a folder? If a folder was created, no further processing is needed. Does the uploaded document have a valid PREP folder structure (PREPDocuments/UserName/AssignmentName)? If not, exit. Does the UserName exist? Does the Assignment name exist? Does the UserName belong to the Assignment? If not, exit. Does this user already have a PREP document in the current folder? If so, exit. There should only be one PREP document per folder per user. If it is a valid PREP document that has been inserted, the first thing the event handler does is to change the custom PREP field (the PREP bit) to Yes. This is important, because PREP uses this to identify the documents that belong to it. The next thing it has to do is determine whether the uploaded document is an Ideas Document or a Review document. This is accomplished by comparing the user login to the user name portion of the folder name (see above). Once this is done, it creates or updates the appropriate tasks on the PREP Task list. Document TypeHow DeterminedAction TakenIdeasAuthorLogin == FolderNameUpdate users Ideas Task. Fill in the tasks Document Name field, and set the Status to Completed Create a Review Task for each other user on the Assignment.ReviewAuthorLogin != FolderNameSet Users Review Task Status to Completed. If this is the last review, send an email to the Instructors Group (i.e. a custom SharePoint Role named Instructors) to inform them that the assignment is complete. Update One of the problems we experienced in earlier versions of SharePoint PREP was that students inadvertently overwrote other students documents. A common reason for this was that students would often create review documents from a copy of the ideas document. They would simply write on the original ideas document and upload it again. This worked fine if they remembered to rename their new document, but it caused problems if they did not. A simple solution to this problem would be to evaluate the filename during an upload and not allow overwrites. However, we need to use SharePoints built-in upload mechanism because SharePoint is not a standard file system-based environment. Also, in keeping with our design principle, we want to use built-in SharePoint functionality whenever possible. So its not possible to alter SharePoints built-in file uploader to include some custom validation. This leaves us with the Event Handler, which runs after something has already happened. So in order to prevent an accidental overwrite, we have to undo the upload. Fortunately, SharePoint Document Libraries come with version control. This is turned off by default, but it is turned on in our PREP Document Libraries. This allows us to restore an earlier version of a document using the SharePoint object model. Doing this also automatically turns the just-uploaded version of the document into the new prior version, so it is not actually removed from the site. Another problem that happens when SharePoint updates a document is that it overwrites the metadata (the SharePoint custom fields). It does this because it expects the user to fill in the values for the metadata fields on the upload form. This creates a problem for PREP, however, because our metadata is hidden from the user and only written by the system. Therefore, since the Event Handler runs after the file has already been uploaded, we have to put it back. This is more difficult than it would seem because PREP needs the metadata to identify its files! So, although we know what file was updated, and what folder it lives in, we have to indirectly figure out what its metadata should have been or whether it was a PREP file at all. Since we have lost our metadata, we use the PREP Task list to figure out whether the updated file is one of our PREP files. This is easy to do in the case of an Ideas Document, because each users Ideas Task (their task to upload an Ideas document) contains the file name in the Document Name custom field. Its a little more difficult in the case of Review Task, since the Document Name field carries the name of the Ideas Document, not the Review Document. For all of the Review Tasks for the current assignment that pertain to the Ideas author referenced by the folder name, we can narrow the selection down to tasks that have a status of Completed. These are the ones that should have a corresponding Review Document. From these, we will look for missing documents. If we find that one is missing, we will assume that it is the one which was updated and that its metadata was removed. Sometimes the document exists and its metadata is still intact. In these cases, we can compare the file name of the document to the uploaded file name. If they match, we can know with complete certainty which Review Document was just updated. Here is a summary of what the Update Event Handler does: Determine whether we need to process the uploaded file Determine who the original author of the file was. Determine what kind of PREP document it is Ideas or Review. Take appropriate action, as follows: Document TypeAuthorActions TakenNon-PREPAnyoneNoneIdeasUploader == Original AuthorRestore MetadataIdeasUploader != Original AuthorRestore prior version Restore Metadata Email the Uploader (to inform them that they have to rename their file and upload it again)ReviewUploader == Original AuthorRestore MetadataReviewUploader != Original AuthorRestore prior version Restore Metadata Email the Uploader (to inform them that they have to rename their file and upload it again) Delete If an Ideas Document is deleted from a PREP folder, all Review Tasks related to that document will also be deleted. The authors Ideas Task will have its status reset to Not Started. If a Review Document is deleted, no action is taken. HTTPHandlers There is one custom web page that has been written for PREP. In order to avoid having to put any .aspx pages on the server, this has been implemented as an HTTPHandler. PREPUploadDownloadHandler This class creates the page PrepUploadDownload.aspx. It is a ghost page that is, it has no interface, and is simply passed through. It performs a few tasks, and then redirects the browser to its eventual destination. This is the page that is linked to by the icons on the PREP Matrix. The behavior of this page is affected by four Querystring variables: filename, assignmentName, ideasAuthorName, and prepAction. Before any file processing is done, checking is done on assignmentName and ideasAuthorName. If the assignment does not exist, or the ideas author does not belong to the assignment, an exception is thrown. These values should never be incorrect if the page is linked to from the PREP Matrix, but these checks were put in place to discourage URL hacking. There is a switch statement controlled by prepAction. If that variable is incorrect, nothing will happen. Following is a description of the different actions taken by this HTTP Handler. Upload When a user uploads an ideas document, this branch checks to see if the correct folder structure (PREPDocuments/UserName/AssignmentName) exists. If it does not exist, it is created. Then, the browser is redirected to the standard SharePoint upload page. This page has a very complex querystring which tells SharePoint which folder the file should go into, and where the browser should be redirected to after the upload is complete. We had to code this carefully in order for our page to imitate the querystring SharePoint would have manufactured on its own. The Event Handler takes care of all of the processing that should happen after an upload is complete. So if a user gets to this page by accident or decides not to upload a file, nothing happens to the PREP tasks or the state of the PREP Matrix. It will, however, create a folder but not one that is not appropriate for this site or assignment. Download The download case is simple. The page simply figures out what the path to the document should be (based on the assignment name and user name), and redirects to that path. Some file types (i.e. text or MS Office documents) will open right in the browser. Others will cause a download pop-up to appear. Checkout This is not a true checkout in the sense that a file is checked out in a Document Library. Rather, it simply sets a Review Task status to In Progress when a user clicks on one of their Review icons in the PREP Matrix, then redirects them to download the appropriate Ideas Document. Business Objects Much of the functionality in PREP is encapsulated in a set of four business objects: PREPAssignment, PREPTask, PREPDocument, and PREPRole. The discussion below covers the main methods and properties of these objects; for a complete object model reference, please see the Windows Help File SharePointPREP.chm (created using nDoc, available from http://ndoc.sourceforge.net/). PREPAssignment An instance of a PREPAssignment object represents one PREP Assignment. It is constructed by reading through the standard SharePoint Events list on the site, looking for events that have a value in the Assignment Name field. Public Instance Properties  INCLUDEPICTURE "mk:@MSITStore:D:\\iCampus\\PREP\\MIT%20SharePoint%20PREP%20Solution\\Version%202.0\\SharePointPREP.chm::/pubproperty.gif" \* MERGEFORMATINET Assigned DateDate this PREP Assignment begins.  INCLUDEPICTURE "mk:@MSITStore:D:\\iCampus\\PREP\\MIT%20SharePoint%20PREP%20Solution\\Version%202.0\\SharePointPREP.chm::/pubproperty.gif" \* MERGEFORMATINET Assignment NameThe PREP Assignment name  INCLUDEPICTURE "mk:@MSITStore:D:\\iCampus\\PREP\\MIT%20SharePoint%20PREP%20Solution\\Version%202.0\\SharePointPREP.chm::/pubproperty.gif" \* MERGEFORMATINET DescriptionPREP Assignment description.  INCLUDEPICTURE "mk:@MSITStore:D:\\iCampus\\PREP\\MIT%20SharePoint%20PREP%20Solution\\Version%202.0\\SharePointPREP.chm::/pubproperty.gif" \* MERGEFORMATINET IdeasDueDateDate on which an Ideas document is due for this PREP Assignment.  INCLUDEPICTURE "mk:@MSITStore:D:\\iCampus\\PREP\\MIT%20SharePoint%20PREP%20Solution\\Version%202.0\\SharePointPREP.chm::/pubproperty.gif" \* MERGEFORMATINET ReviewsDueDateDate on which the Review documents are due for this PREP Assignment.  Public Static Methods PREPAssignment_Collection Returns an ArrayList of PREPAssignment objects representing all of the valid PREP Assignments for this site. These objects are created by reading the Events list, looking for PREP Assignment events. Create Creates a PREP Assignment and returns the number of Events that were created. Delete Deletes a PREP Assignment and returns the number of Events that were deleted PREPTask This class represents a PREP Task. An instance is constructed by taking a task from the PREP Task List (the SharePoint list) and populating the public instance properties. Public Instance Properties  INCLUDEPICTURE "mk:@MSITStore:D:\\iCampus\\PREP\\MIT%20SharePoint%20PREP%20Solution\\Version%202.0\\SharePointPREP.chm::/pubproperty.gif" \* MERGEFORMATINET AssignedToLogin Name of the User the task is assigned to.  INCLUDEPICTURE "mk:@MSITStore:D:\\iCampus\\PREP\\MIT%20SharePoint%20PREP%20Solution\\Version%202.0\\SharePointPREP.chm::/pubproperty.gif" \* MERGEFORMATINET AssignmentNameThe PREP Assignment Name.  INCLUDEPICTURE "mk:@MSITStore:D:\\iCampus\\PREP\\MIT%20SharePoint%20PREP%20Solution\\Version%202.0\\SharePointPREP.chm::/pubproperty.gif" \* MERGEFORMATINET DocumentAuthorIdeas Document Author. This field names the Ideas Document Author, regardless of whether the task is an Ideas Task (an obligation to upload an Ideas Document) or a Review Task (an obligation to Review an Ideas Document). If this is an ideas task, the person named in the Document Author field will equal the person named in the AssignedTo field. INCLUDEPICTURE "mk:@MSITStore:D:\\iCampus\\PREP\\MIT%20SharePoint%20PREP%20Solution\\Version%202.0\\SharePointPREP.chm::/pubproperty.gif" \* MERGEFORMATINET DocumentNameIdeas Document Name. This field names the Ideas Document, regardless of whether the task is an Ideas Task (an obligation to upload an Ideas Document) or a Review Task (an obligation to Review an Ideas Document).  INCLUDEPICTURE "mk:@MSITStore:D:\\iCampus\\PREP\\MIT%20SharePoint%20PREP%20Solution\\Version%202.0\\SharePointPREP.chm::/pubproperty.gif" \* MERGEFORMATINET DueDateDate the Task is due.  INCLUDEPICTURE "mk:@MSITStore:D:\\iCampus\\PREP\\MIT%20SharePoint%20PREP%20Solution\\Version%202.0\\SharePointPREP.chm::/pubproperty.gif" \* MERGEFORMATINET ExistsReturns true if the constructor for the current instance was able to locate a persisted record corresponding to the requested key.  INCLUDEPICTURE "mk:@MSITStore:D:\\iCampus\\PREP\\MIT%20SharePoint%20PREP%20Solution\\Version%202.0\\SharePointPREP.chm::/pubproperty.gif" \* MERGEFORMATINET SPListItemObjectThe complete SPList object taken from the SharePoint list. This has all of the properties, as well as the Update() method.  INCLUDEPICTURE "mk:@MSITStore:D:\\iCampus\\PREP\\MIT%20SharePoint%20PREP%20Solution\\Version%202.0\\SharePointPREP.chm::/pubproperty.gif" \* MERGEFORMATINET StartDateDate the Task is assigned.  INCLUDEPICTURE "mk:@MSITStore:D:\\iCampus\\PREP\\MIT%20SharePoint%20PREP%20Solution\\Version%202.0\\SharePointPREP.chm::/pubproperty.gif" \* MERGEFORMATINET StatusTask Status: Not Started, In Progress, or Completed  INCLUDEPICTURE "mk:@MSITStore:D:\\iCampus\\PREP\\MIT%20SharePoint%20PREP%20Solution\\Version%202.0\\SharePointPREP.chm::/pubproperty.gif" \* MERGEFORMATINET TitleTask title. Contains information about the ideas document author, the assignment name, and the user it is assigned to. Public Static Methods Create This method will create a PREP Task, assigned to one user, for the passed in assignmentName. The docAuthorLogin is the login of the author of the Ideas Document this task pertains to. The user is the user who the task is assigned to. If the docAuthorLogin == the user, this is the user's task to upload an ideas document. If the docAuthorLogin != the user, this is the user's task to review the docAuthor's ideas document. DeleteTasksAssignedToUser This will delete all tasks for one user for one assignment. This should be run if a user is removed from an assignment. DeleteTasksRelatedToDocument Deletes all PREP Tasks pertaining to a document, meaning the document's name is in the PREPTask object's DocumentName field. The DocumentName field holds the name of the Ideas Document the task pertains to. The ideas task will be left in place, and its status will be reset to "Not Started". DeleteTasksRelatedToUser This will delete all tasks related to a user's Ideas Document for one assignment. It will include the user's own task to create an Ideas Document, as well as other assignment members tasks to review that Ideas Document. This should be run if a user is removed from an assignment. GetIdeasTask Returns a user's (represented as userLoginName) "ideas" task - a task obligating them to create and upload an ideas document. If no such task exists, the Boolean "Exists" is set to false. GetReviewTask Returns a "review" task directing userLoginName to review ideasAuthorLoginName's ideas document. Boolean "Exists" is set to false if no such task exists. PREPTask_Collection An ArrayList of PREPTask objects. There are two versions of this: one contains all of the PREP Tasks for a site, and one contains all of the PREP tasks for one assignment. PREPDocument This is an object which represents a PREP Ideas or Review document. It may be constructed either from an SPFile object in the PREP Document library, or from an SPListEvent object inside the Event Handler. Public Instance Properties  INCLUDEPICTURE "mk:@MSITStore:D:\\iCampus\\PREP\\MIT%20SharePoint%20PREP%20Solution\\Version%202.0\\SharePointPREP.chm::/pubproperty.gif" \* MERGEFORMATINET AssignmentNameThe PREP Assignment name  INCLUDEPICTURE "mk:@MSITStore:D:\\iCampus\\PREP\\MIT%20SharePoint%20PREP%20Solution\\Version%202.0\\SharePointPREP.chm::/pubproperty.gif" \* MERGEFORMATINET DocTypeThe PREP Document Type. May be one of two values: Ideas or Review.  INCLUDEPICTURE "mk:@MSITStore:D:\\iCampus\\PREP\\MIT%20SharePoint%20PREP%20Solution\\Version%202.0\\SharePointPREP.chm::/pubproperty.gif" \* MERGEFORMATINET EventUserLoginLogin Name of the user whose action triggered the event on the document library. This field is only used in the Event Handler. INCLUDEPICTURE "mk:@MSITStore:D:\\iCampus\\PREP\\MIT%20SharePoint%20PREP%20Solution\\Version%202.0\\SharePointPREP.chm::/pubproperty.gif" \* MERGEFORMATINET EventUserNameDisplay Name of the user whose action triggered the event on the document library. This field is only used in the Event Handler. INCLUDEPICTURE "mk:@MSITStore:D:\\iCampus\\PREP\\MIT%20SharePoint%20PREP%20Solution\\Version%202.0\\SharePointPREP.chm::/pubproperty.gif" \* MERGEFORMATINET ExistsTrue if a document exists for a given user and assignment.  INCLUDEPICTURE "mk:@MSITStore:D:\\iCampus\\PREP\\MIT%20SharePoint%20PREP%20Solution\\Version%202.0\\SharePointPREP.chm::/pubproperty.gif" \* MERGEFORMATINET FileNameThe file name of the PREP document that triggered the event  INCLUDEPICTURE "mk:@MSITStore:D:\\iCampus\\PREP\\MIT%20SharePoint%20PREP%20Solution\\Version%202.0\\SharePointPREP.chm::/pubproperty.gif" \* MERGEFORMATINET FolderThe folder where the document resides (e.g. PREPDocuments/UserID/AssignmentName)  INCLUDEPICTURE "mk:@MSITStore:D:\\iCampus\\PREP\\MIT%20SharePoint%20PREP%20Solution\\Version%202.0\\SharePointPREP.chm::/pubproperty.gif" \* MERGEFORMATINET IdeasAuthorLoginLogin Name of the author of the ideas document that this document pertains to  INCLUDEPICTURE "mk:@MSITStore:D:\\iCampus\\PREP\\MIT%20SharePoint%20PREP%20Solution\\Version%202.0\\SharePointPREP.chm::/pubproperty.gif" \* MERGEFORMATINET PREPPREP Bit. If True, this is a PREP Document. if PREP == true AND the document author userID == the folder name, it is an ideas document. if PREP == true AND the document author userID != the folder name, it is a review. if PREP == false, it is an extra document uploaded to the folder.  INCLUDEPICTURE "mk:@MSITStore:D:\\iCampus\\PREP\\MIT%20SharePoint%20PREP%20Solution\\Version%202.0\\SharePointPREP.chm::/pubproperty.gif" \* MERGEFORMATINET SPFileObjectThe complete SPFile object Public Static Methods GetDocInfoFromURL Takes a URL and returns a DocInfo struct. This struct breaks the URL out into IdeasAuthorLoginName, AssignmentName, and FileName. Additionally, there is a boolean IsValid which is set to false if the URL is not in the proper format. It does not check the validity of any of the data (i.e. it doesn't know if the user does not exist or the assignment name does not exist). GetIdeasDoc Returns the PREP Document object representing the Ideas Document for a given user (passed in as userLoginName) for a given assignment (assignmentName). If no such document can be found, Boolean field Exists is set to false. GetReviewDoc Returns the PREP Document object representing the Review Document for a given reviewer (reviewAuthorLoginName), reviewing the ideas of a given author (ideasAuthorLoginName), for a given assignment (assignmentName). If no such document can be found, Boolean field Exists is set to false. IsNewPREPDocument Returns true if the author of the passed-in document name does not already have a PREP document in the current folder. Used in the Event Handler to make sure that each user has only one PREP document in a given folder. IsPREPFolder Validates the following: The folder structure is in the correct format (PREP Documents/userName/assignmentName) The assignment exists The userName exists The userName belongs to the assignment PREPDocument_Collection Returns an ArrayList of all PREPDocument objects in a folder. PREPRole In Version 1.0 of SharePoint PREP, users on an assignment were always equal to the users of the site. In other words, every user on a site was included as a member of every PREP assignment. In practice, this turned out to be impractical; even if all of the students were on the assignment, the instructor was not. In keeping with the design goal of storing all PREP data in standard SharePoint objects, this problem was solved by using custom SharePoint roles to contain the students on an assignment. SharePoint roles (the SPRole object) are essentially just collections of users (SPUser objects), with privilege attributes. They were designed to handle authorization groups in SharePoint. This worked great but posed another problem. Since SharePoint uses these groups for authorization, it limits code access to the SPRole object to users who are in the Administrator Role. And even though SharePoint utilizes the Windows Identity Context to determine who its users are, it wont allow access to the SPRole object via Windows Impersonation. It always considers the original user context, which it knows through properties in its own object model. In practical terms this meant that the PREP Matrix Web Part with student lists based on SPRole was only accessible to an Administrator. SharePoint created this condition out concern for protecting the security of its roles, and thus offered no workaround. Therefore, we created our own custom Role object called PREPRole. This is nothing but a lightweight, read-only version of SPRole that anyone can use. It is constructed simply by using the same Stored Procedures used by SharePoint to read the tables which store the data which supports the SPRole object. Since the student lists on PREP Assignments are controlled by Administrators, we simply use the standard SPRole object in the PREP Administration Web Part to create and update the roles. When we need to read out the users in the PREP Matrix, we use PREPRole. Public Instance Properties  INCLUDEPICTURE "mk:@MSITStore:D:\\iCampus\\PREP\\MIT%20SharePoint%20PREP%20Solution\\Version%202.0\\SharePointPREP.chm::/pubproperty.gif" \* MERGEFORMATINET DescriptionRole Description.  INCLUDEPICTURE "mk:@MSITStore:D:\\iCampus\\PREP\\MIT%20SharePoint%20PREP%20Solution\\Version%202.0\\SharePointPREP.chm::/pubproperty.gif" \* MERGEFORMATINET ExistsTrue if the Role name requested in the constructor actually exists in the site (i.e, has been persisted in the database).  INCLUDEPICTURE "mk:@MSITStore:D:\\iCampus\\PREP\\MIT%20SharePoint%20PREP%20Solution\\Version%202.0\\SharePointPREP.chm::/pubproperty.gif" \* MERGEFORMATINET NameRole Name.  INCLUDEPICTURE "mk:@MSITStore:D:\\iCampus\\PREP\\MIT%20SharePoint%20PREP%20Solution\\Version%202.0\\SharePointPREP.chm::/pubproperty.gif" \* MERGEFORMATINET UsersArrayList of UserInfo structs, containing User LoginName, email, etc.  PREPImpersonation This object allows code to impersonate a Windows user that is different from the logged-in user. Typically impersonation is used to execute code that requires a higher level of privilege than the user possesses (e.g. something that requires an Administrator). We use it to allow the PREPRole object to execute SQL calls. Public Instance Methods Impersonate Begins impersonating the user specified in the constructor, which takes arguments consisting of user id, domain, and password. UnImpersonate Stops impersonating the user specified in the constructor. Technical Walk-through The purpose of this section is to present the material described elsewhere in this document in a more narrative fashion, in order to offer an alternative and perhaps more interesting way of learning it. Well provide a behind-the-scenes look at what is happening during the normal operation of SharePoint PREP. PREP Matrix When a user opens a web browser to a SharePoint PREP site, the PREP Matrix Web part is activated. This Web Part is featured prominently on the page.  The PREP Matrix is created by looping through three objects: PREPTask.PREPTaskCollection (an ArrayList of PREPTask objects). There is one PREP Matrix per assignment. Each iteration of this outermost portion of the loop creates one PREP Matrix. PREPRole(assignmentName). This object contains the users on an assignment. Each iteration of this loop creates one row of the PREP Matrix. PREPRole(assignmentName). This is actually a copy of the previous PREPRole object (it is a copy because it contains exactly the same information, but its index is at a different place). Each iteration of this loop creates the columns on the PREP Matrix. The column contains an icon, which indicates state information.  The logic behind the creation of the icons is determined by a number of factors: Who the logged-in user is Which user is on the current row of the matrix Which user is on the current column of the matrix Whether an ideas or review task exists for a user The status of the ideas or review task for a user (Not started, In Progress, etc.) Whether an ideas or review document exists for a user The rows contain information about a user, i.e. what that users tasks are. The columns contain information about a document, i.e. different users tasks regarding that document. Referring to the screen shot above, here is the underlying logic that drives the display. Icons described with call-out balloons are explained in detail in the following table. In this example, the logged-in user is chris. IdeasMikeChrisJenniferAmandaMikeRow user == column user, so look for Ideas task/document Ideas Task Status = Completed, so look for a document Result: Show document icon, link to Ideas document Logged-in user? N But all users see a link to the ideas document Row user != column user, so look for a Review task Review Task Status == In Progress Logged-in User? N Result: Show a non-clickable Review In Progress icon (yellow dot)ChrisRow user != column user, so look for a Review task Review Task Status == In Progress Logged-in User? Y Result: Show clickable Review In progress icon (yellow arrow). Clicking the icon allows the user to upload a ReviewRow user != column user, so look for a Review task Review Task Status == Not Started Logged-in User? Y (meaning the row user, in this case chris) Result: Show clickable Review Not Started icon (green arrow). Clicking the icon allows the user to download the Ideas Document that they are to review.JenniferAmandaRow user != column user, so look for a Review task Review Task status == Not Started Logged-in user? N Result: Show non-clickable black Review not started iconRow user != column user, so look for a Review task Review Task Status == Completed Logged-in User? N Result: Show a clickable Review Completed icon (file folder w/check mark). All users may click on this icon to download the Review document. Event Handler This section tracks what happens when a user clicks on different icons in the PREP Matrix. Upload an Ideas Document  Here is the sequence of events behind an upload: User clicks the pencil icon to write or upload an ideas document User is sent to PREPUploadDownload.aspx, which Creates folders if they do not exist in the form /PREPDocuments/UserLoginName/PREPAssignmentName Redirects the user to the SharePoint upload page within the correct folders. User browses to and actually uploads a document (if the user cancels and does not actually upload anything nothing further happens) The Insert branch of the Event Handler fires, and Determines that this is an Ideas Document Creates review tasks for other users to review this document Redirects the user to the folder which now contains the uploaded document. Review Someone Elses Ideas Document  User clicks the green arrow icon to download someone elses ideas document. User is sent to PREPUploadDownload.aspx, which determines what the folder structure of the ideas document to review, and Sets the status of the Users Review Task to In Progress using the SharePoint object model. Download of Ideas Document to be reviewed is initiated. User may save the document to their hard drive or open it from SharePoint (if it is a text document or another format that can be opened in the browser). Actual review of the document is performed off line, and should result in a new document which contains the review (shown in the next step). Upload a Review  User clicks the yellow icon to upload a review User is sent to PREPUploadDownload.aspx, which Determines the correct folder for the review (the folder where the Ideas Document lives) Redirects the user to the SharePoint upload page within the correct folder, using the correct query string (which insures post-upload redirection) User browses to and actually uploads a review document (if the user cancels and does not actually upload anything nothing further happens) The Insert branch of the Event Handler fires. It Determines that this is a Review Document Sets the Users Review Task Status to Completed Development This section contains some general information about development within SharePoint. It should be noted that SharePoint development must be done on a Windows 2003 Server that has SharePoint installed on it. You can actually compile the code on a machine that just has the SharePoint dlls copied to it (in order to satisfy the code references), but you can only run or test it on a SharePoint server. Custom Web Parts Here is how to create a custom Web Part that will work in SharePoint. Visual Studio.NET Template Before beginning to develop custom Web Parts, download the template for Visual Studio.NET, from this location:  HYPERLINK "http://www.microsoft.com/downloads/details.aspx?familyid=CAC3E0D2-BEC1-494C-A74E-75936B88E3B5&displaylang=en" http://www.microsoft.com/downloads/details.aspx?familyid=CAC3E0D2-BEC1-494C-A74E-75936B88E3B5&displaylang=en This puts a new template in Visual Studio when you go to create a project. Visual Studio.NET Project Create a new project using the Web Part Library Template. Each class in this project will encapsulate one Web Part. Before installation, the assembly will need a Strong Name. See the Security section on p.  PAGEREF _Ref154463718 \h 32 for more information. Installing the Web Part Server There is a very nice Web Part Installation Utility called InstallAssemblies here:  HYPERLINK "http://www.bluedoglimited.com/Downloads/pages/Web%20Part%20Toolkit.aspx" http://www.bluedoglimited.com/Downloads/pages/Web%20Part%20Toolkit.aspx Instructions for InstallAssemblies: Double-click InstallAssemblies.exe Click the Select Assemblies button Browse to your web part dll and click Open Under Install location, make sure you choose the option to install it into the Global Assembly Cache (GAC). Click the Install button. After you see the "All done" message, close the InstallAssemblies window. SharePoint Site Once your custom web part has been installed on the server, you can add it to a SharePoint page with: Modify Shared Page -> Add Web Parts -> Browse When you have located your web part, drag it onto your page. Document Event Handlers This section contains some general information about development of document event handlers in SharePoint. .NET Project Create a class library project. When the project is created, add a .NET reference to Windows SharePoint Services. The class you create has to have using Microsoft.SharePoint;, and it must implement the IListEventSink interface. This interface has one method, OnEvent, which will be invoked when an event occurs in a document library. For a good example of how to do this, look at Microsofts Event Handler Toolkit  HYPERLINK "http://www.microsoft.com/downloads/details.aspx?FamilyID=4b2c2f1b-d74a-482a-903a-45bb44c5dec4&DisplayLang=en" http://www.microsoft.com/downloads/details.aspx?FamilyID=4b2c2f1b-d74a-482a-903a-45bb44c5dec4&DisplayLang=en Look in the SampleEventSinks project, at BaseEventSink.cs. This has been implemented as an abstract class, which your custom classes can inherit from. It encapsulates all of the basic functionality you will need for your custom event handler. Installation in SharePoint Enable Custom Event Handlers in SharePoint Your SharePoint site has to be configured to allow custom event handlers. By default, it will not allow them. Go to SharePoint Central Administration: Under Virtual Server Administration, click Configure virtual Server Settings. Select the web site that your SharePoint virtual server is running on. Under Virtual Server Management, click Virtual Server General Settings. Scroll to the bottom of the page. Under the section marked Event Handlers, Click the radio button for Event Handlers are: on, and click OK. Install the Assembly into the GAC The assembly must be installed in the Global Assembly Cache in order to be used by SharePoint. Before installation, the assembly will need a Strong Name. See the Security section on p.  PAGEREF _Ref154463718 \h 32 for more information. Here is a batch file that will install the assembly into the GAC: @echo off setlocal set FrameworkDir="%windir%\microsoft.net\framework\v1.1.4322" set gacutil="%FrameworkDir%\gacutil.exe" echo Installing YourCustomEventHandler.dll into the GAC. %gacutil% /if bin\YourCustomEventHandler.dll Wiring the Event Handler to Your SharePoint Site Once the Event Handler has been created, compiled, signed, and installed in the GAC, it must be known to a SharePoint document library before it can process events. Here is how: Browse to the doc library on the SharePoint site Modify Settings and columns. In the General Settings section, click Change advanced settings. In the boxes, type: Assembly Name YourCustomEventHandler, Version=1.0.0.0, Culture=neutral, PublicKeyToken=a96de2e4f2537f8d (You will have different values for these. The Assembly name, version, and PublicKeyToken may be found by looking in the GAC, at C:\Windows\assembly) Class Name YourCustomEventHandler.YourClassName (change this to your own values) Debugging Because custom event handler and web parts must run as assemblies installed into the GAC (see below), debugging must be done by attaching Visual Studio.NET to the w3wp.exe process. With your Visual Studio.NET project open, set the desired breakpoints. Click on Tools->Debug Processes Check the box for Show Processes in All Sessions. If you do not see w3wp.exe in the list of available processes, access your SharePoint site with a browser to in order to start it (usually necessary after an iisreset). Then hit the refresh button in the Processes box. It should now appear. Select w3wp.exe and click the Attach button. Select Common Language Runtime, Click OK, and click Close Do something that will activate your event handler or web part. The code should break on a breakpoint set in step 1. Another thing you can do is have your event handler write to the Application Event Log, like so: using System.Diagnostics; EventLog.WriteEntry("YourAppName", "Text to write to the event log"); Security Considerations Impersonation One of the things your Event Handler code must do is impersonate a Windows account with authority on your SharePoint site. This bit of functionality is encapsulated in BaseEventSink.cs, mentioned above. Strong Names The assembly must be signed, because it eventually will need to be installed in the GAC. To do this, you will need to have installed the .NET Framework 1.1 SDK, because you will need the Strong Name Utility sn.exe. It may be found here: C:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\Bin\sn.exe To use it, open the Visual Studio 2003 Command Prompt and navigate to the directory where your compiled dll is. Issue this command: sn -k keyfile.snk Copy keyfile.snk to your project directory. Open AssemblyInfo.cs, and find [assembly: AssemblyKeyFile()] Change it to [assembly: AssemblyKeyFile(@"..\..\keyfile.snk")] (NOTE: If you are going to compile from the command line, and not in Visual Studio, change it to [assembly: AssemblyKeyFile(@"keyfile.snk")] Custom Web Pages This section describes how to code custom .aspx pages that will work within SharePoint. We have not done this for PREP, but have included this material for reference. ASP.NET Project The easiest way to create a custom web page is to create an ASP.NET project as a subdirectory of the \_layouts directory in the SharePoint Site. Once you have created this project, add a .NET reference to Windows SharePoint Services. At a minimum, add a reference to Microsoft.Sharepoint on any page in which you are going to call the Object Model. You may want to add some other namespaces, as well: using Microsoft.SharePoint; using Microsoft.SharePoint.WebControls; using Microsoft.SharePoint.Administration; using Microsoft.SharePoint.Utilities; Security Issues If these pages are going to simply list things from SharePoint, there will be no security problem. If they are going to update the Sharepoint database, however, you will need to add this to the .aspx page: <%@ Register Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=11.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> Just under the
tag, add this: Debugging You may notice that your site will not run in the IDE. This is because the IDE may not have the correct path to the SharePoint site you are trying to debug. Since all SharePoint sites share the same code base, and their URL is a virtual construction whose origin is in the database, you just need to correct the URL once the debugger has started. For example: URL to your page from Visual Studio: http://localhost/_layouts/ProjectName/WebForm1.aspx SharePoint URL to your page in the SubSPSite project: http://localhost/TopSPSite/SubSPSite/_layouts/ProjectName/WebForm1.aspx In this example, Visual Studio would start debugging with the first URL. You would manually correct the URL in the address box to the second one. An easy way to deal with this is to create a default.aspx page which contains a link to the real site you are working on (e.g., the second URL above).      TITLE \* MERGEFORMAT SharePoint PREP Technical Documentation  TITLE SharePoint PREP Technical DocumentationPage  PAGE 6 of  NUMPAGES 34 SAVEDATE \@ "M/d/yy"12/21/06 EFQZ[st# $ % & B C D E V ´´ϧ۔}c2jhnmhnm>*B*UmHnHphuhnmmHnHuhhnm0JmHnHu$jhhnm0JUmHnHujhOB*UphfffhnmB*mHnHphfffujh@B*Uphfffh@B*phfffhnmjh@Uh@h@mHnHujh@CJUmHnHu&GHIJKLMNOPQx  \   !  !  !V W X r s t u v w x y z ­Ÿ|Ÿk­ŸQ2jhnmhnm>*B*UmHnHphu jwhnmUmHnHu2jhnmhnm>*B*UmHnHphuhnmmHnHuhhnm0JmHnHu)hnm56OJQJ\]aJmHnHu$jhhnm0JUmHnHu j}hnmUmHnHujhnmUmHnHuhnmmHnHu         1 2 3 4 : ; < V W X Y Z [ \ ] ^ z { ׳q׳\)hnm56OJQJ\]aJmHnHu jkhnmUmHnHu2jhnmhnm>*B*UmHnHphuhnmmHnHuhnm5\aJmHnHu$jhhnm0JUmHnHu jqhnmUmHnHujhnmUmHnHuhnmmHnHuhhnm0JmHnHu{ | }       " # źӌŃiźXӌŃ j_hnmUmHnHu2jhnmhnm>*B*UmHnHphuhnmmHnHuhnm5\aJmHnHu jehnmUmHnHujhnmUmHnHuhnmmHnHuhhnm0JmHnHu$jhhnm0JUmHnHu2jhnmhnm>*B*UmHnHphu # $ % 9 : ; U V W X Y Z [ \ ] y z { | źӑőwźfӑő jShnmUmHnHu2jhnmhnm>*B*UmHnHphuhnmmHnHu jYhnmUmHnHujhnmUmHnHuhnmmHnHuhhnm0JmHnHu$jhhnm0JUmHnHu2jhnmhnm>*B*UmHnHphu  [ f  ` `QQ6-wc !  !  !  !       ( ) * + D E F ` a b c d e f g h źӑőwźfӑő jG hnmUmHnHu2jhnmhnm>*B*UmHnHphuhnmmHnHu jMhnmUmHnHujhnmUmHnHuhnmmHnHuhhnm0JmHnHu$jhhnm0JUmHnHu2jhnmhnm>*B*UmHnHphu     - . źӑőwźfӑő j; hnmUmHnHu2j hnmhnm>*B*UmHnHphuhnmmHnHu jA hnmUmHnHujhnmUmHnHuhnmmHnHuhhnm0JmHnHu$jhhnm0JUmHnHu2j hnmhnm>*B*UmHnHphu . / 0 > ? @ Z [ \ ] ^ _ ` a b ~  źӑőwźfӑő j/ hnmUmHnHu2j hnmhnm>*B*UmHnHphuhnmmHnHu j5 hnmUmHnHujhnmUmHnHuhnmmHnHuhhnm0JmHnHu$jhhnm0JUmHnHu2j hnmhnm>*B*UmHnHphu     -./0>?@Z[\]^_`ab~źӑőwźfӑő j#hnmUmHnHu2jhnmhnm>*B*UmHnHphuhnmmHnHu j)hnmUmHnHujhnmUmHnHuhnmmHnHuhhnm0JmHnHu$jhhnm0JUmHnHu2j hnmhnm>*B*UmHnHphu źӅ|bźQ jhnmUmHnHu2jhnmhnm>*B*UmHnHphuhnmmHnHu)hnm56OJQJ\]aJmHnHu jhnmUmHnHujhnmUmHnHuhnmmHnHuhhnm0JmHnHu$jhhnm0JUmHnHu2jhnmhnm>*B*UmHnHphu#$%&/01KLMNOPQRSopqr}~ЭТhТW j hnmUmHnHu2jhnmhnm>*B*UmHnHphu jhnmUmHnHujhnmUmHnHuhnmmHnHu2jhnmhnm>*B*UmHnHphuhnmmHnHuhhnm0JmHnHu$jhhnm0JUmHnHuhnm5\aJmHnHu"./0JKLNOPQRSopλ񰡰v񰡰e jhnmUmHnHu2jhnmhnm>*B*UmHnHphu jhnmUmHnHujhnmUmHnHuhnmmHnHu$jhhnm0JUmHnHu2jhnmhnm>*B*UmHnHphuhnmmHnHuhhnm0JmHnHu#pqr  źӌŃiźXӃŃ jhnmUmHnHu2jvhnmhnm>*B*UmHnHphuhnmmHnHuhnm5\aJmHnHu jhnmUmHnHujhnmUmHnHuhnmmHnHuhhnm0JmHnHu$jhhnm0JUmHnHu2j|hnmhnm>*B*UmHnHphu   /01345678TUVW]^_yz{}~źӑőwźfӑő jhnmUmHnHu2jjhnmhnm>*B*UmHnHphuhnmmHnHu jhnmUmHnHujhnmUmHnHuhnmmHnHuhhnm0JmHnHu$jhhnm0JUmHnHu2jphnmhnm>*B*UmHnHphu    &'(*+,-./KLźӌŃiźXӃŃ jhnmUmHnHu2j^hnmhnm>*B*UmHnHphuhnmmHnHuhnm5\aJmHnHu jhnmUmHnHujhnmUmHnHuhnmmHnHuhhnm0JmHnHu$jhhnm0JUmHnHu2jdhnmhnm>*B*UmHnHphu LMNTUVpqrtuvwxyźӑőwźfӑő jhnmUmHnHu2jRhnmhnm>*B*UmHnHphuhnmmHnHu jhnmUmHnHujhnmUmHnHuhnmmHnHuhhnm0JmHnHu$jhhnm0JUmHnHu2jXhnmhnm>*B*UmHnHphu     -./0@AB\]^`abcdeźӑőwźfXőhnm5\aJmHnHu jhnmUmHnHu2jFhnmhnm>*B*UmHnHphuhnmmHnHu jhnmUmHnHujhnmUmHnHuhnmmHnHuhhnm0JmHnHu$jhhnm0JUmHnHu2jLhnmhnm>*B*UmHnHphu   12źӑőwźfӑő j hnmUmHnHu2j: hnmhnm>*B*UmHnHphuhnmmHnHu jhnmUmHnHujhnmUmHnHuhnmmHnHuhhnm0JmHnHu$jhhnm0JUmHnHu2j@hnmhnm>*B*UmHnHphu clov u*y&0?7 !  !  !  ! 234IJKefgijklmnźӑőwźfӑő j"hnmUmHnHu2j."hnmhnm>*B*UmHnHphuhnmmHnHu j!hnmUmHnHujhnmUmHnHuhnmmHnHuhhnm0JmHnHu$jhhnm0JUmHnHu2j4!hnmhnm>*B*UmHnHphu 4567LMNhijlmnopqźӑőwźfӑő j$hnmUmHnHu2j"$hnmhnm>*B*UmHnHphuhnmmHnHu j#hnmUmHnHujhnmUmHnHuhnmmHnHuhhnm0JmHnHu$jhhnm0JUmHnHu2j(#hnmhnm>*B*UmHnHphu ;<źӑőwźfӑő j&hnmUmHnHu2j&hnmhnm>*B*UmHnHphuhnmmHnHu j%hnmUmHnHujhnmUmHnHuhnmmHnHuhhnm0JmHnHu$jhhnm0JUmHnHu2j%hnmhnm>*B*UmHnHphu <=>STUopqstuvwxźӑőwźfӑő j(hnmUmHnHu2j (hnmhnm>*B*UmHnHphuhnmmHnHu j'hnmUmHnHujhnmUmHnHuhnmmHnHuhhnm0JmHnHu$jhhnm0JUmHnHu2j'hnmhnm>*B*UmHnHphu  !">?@ARSTnoprstuvwźӑőwźfӑő j{*hnmUmHnHu2j)hnmhnm>*B*UmHnHphuhnmmHnHu j)hnmUmHnHujhnmUmHnHuhnmmHnHuhhnm0JmHnHu$jhhnm0JUmHnHu2j)hnmhnm>*B*UmHnHphu  #$%'()*+,HźӑőwźfQő)hnm56OJQJ\]aJmHnHu jo,hnmUmHnHu2j+hnmhnm>*B*UmHnHphuhnmmHnHu ju+hnmUmHnHujhnmUmHnHuhnmmHnHuhhnm0JmHnHu$jhhnm0JUmHnHu2j*hnmhnm>*B*UmHnHphuHIJKVWXrstvwxyz{񹪹ċh񹪹Wċ jc.hnmUmHnHu2j-hnmhnm>*B*UmHnHphuhnmmHnHuhnm5\aJmHnHu ji-hnmUmHnHujhnmUmHnHuhnmmHnHu$jhhnm0JUmHnHu2j,hnmhnm>*B*UmHnHphuhhnm0JmHnHu! !#$%&'(DEFGklmźӑőwźfӑő jW0hnmUmHnHu2j/hnmhnm>*B*UmHnHphuhnmmHnHu j]/hnmUmHnHujhnmUmHnHuhnmmHnHuhhnm0JmHnHu$jhhnm0JUmHnHu2j.hnmhnm>*B*UmHnHphu  )*+-./012NźӑőwźfQő)hnm56OJQJ\]aJmHnHu jK2hnmUmHnHu2j1hnmhnm>*B*UmHnHphuhnmmHnHu jQ1hnmUmHnHujhnmUmHnHuhnmmHnHuhhnm0JmHnHu$jhhnm0JUmHnHu2j0hnmhnm>*B*UmHnHphuNOPQabc}~񹪹ċh񹪹WĂ j?4hnmUmHnHu2j3hnmhnm>*B*UmHnHphuhnmmHnHuhnm5\aJmHnHu jE3hnmUmHnHujhnmUmHnHuhnmmHnHu$jhhnm0JUmHnHu2j2hnmhnm>*B*UmHnHphuhhnm0JmHnHu!89:<=>?@A]^_`wxyźӑőwźfӑő j36hnmUmHnHu2j5hnmhnm>*B*UmHnHphuhnmmHnHu j95hnmUmHnHujhnmUmHnHuhnmmHnHuhhnm0JmHnHu$jhhnm0JUmHnHu2j4hnmhnm>*B*UmHnHphu 012456789UVźӑőwźfӑő j'8hnmUmHnHu2j7hnmhnm>*B*UmHnHphuhnmmHnHu j-7hnmUmHnHujhnmUmHnHuhnmmHnHuhhnm0JmHnHu$jhhnm0JUmHnHu2j6hnmhnm>*B*UmHnHphu VWXopqźӌŃiźXӃŃ j:hnmUmHnHu2j9hnmhnm>*B*UmHnHphuhnmmHnHuhnm5\aJmHnHu j!9hnmUmHnHujhnmUmHnHuhnmmHnHuhhnm0JmHnHu$jhhnm0JUmHnHu2j8hnmhnm>*B*UmHnHphu 7@/$ w !!#!:##S$a$ %F&[((gd|gd & FgdKogd mSgd mS !  !  ! 9:;=>?@AB^_`aźӑőwźfӑő j<hnmUmHnHu2j;hnmhnm>*B*UmHnHphuhnmmHnHu j;hnmUmHnHujhnmUmHnHuhnmmHnHuhhnm0JmHnHu$jhhnm0JUmHnHu2j:hnmhnm>*B*UmHnHphu   1234defźӑőwźfӑő j>hnmUmHnHu2j=hnmhnm>*B*UmHnHphuhnmmHnHu j =hnmUmHnHujhnmUmHnHuhnmmHnHuhhnm0JmHnHu$jhhnm0JUmHnHu2j<hnmhnm>*B*UmHnHphu   ()*,-./01MNźӌŃiźXӌŃ j?hnmUmHnHu2jz?hnmhnm>*B*UmHnHphuhnmmHnHuhnm5\aJmHnHu j>hnmUmHnHujhnmUmHnHuhnmmHnHuhhnm0JmHnHu$jhhnm0JUmHnHu2j>hnmhnm>*B*UmHnHphu NOP]^_yz{}~źӑőwźfӑő jAhnmUmHnHu2jnAhnmhnm>*B*UmHnHphuhnmmHnHu j@hnmUmHnHujhnmUmHnHuhnmmHnHuhhnm0JmHnHu$jhhnm0JUmHnHu2jt@hnmhnm>*B*UmHnHphu       ! " # $ % & B C D E T U V p q r t u v w x y źӌŃiźXӃŃ jChnmUmHnHu2jbChnmhnm>*B*UmHnHphuhnmmHnHuhnm5\aJmHnHu jBhnmUmHnHujhnmUmHnHuhnmmHnHuhhnm0JmHnHu$jhhnm0JUmHnHu2jhBhnmhnm>*B*UmHnHphu !!!!!!!!!"!#!!źӑőwźfӑ^ZVZVh mSh@jh@U jEhnmUmHnHu2jVEhnmhnm>*B*UmHnHphuhnmmHnHu jDhnmUmHnHujhnmUmHnHuhnmmHnHuhhnm0JmHnHu$jhhnm0JUmHnHu2j\Dhnmhnm>*B*UmHnHphu!!!!!!!""" ########.#8#j#####$$$$$4$R$S$|$$$$$$$ %&D&''';(<(A([((((()))7)@))h M h|h>h>hUh*h| hKohKohKohH[i5hKohf^5hKohKo5hnmmHnHujPFhDUjhVBUhVBhKohf^h mSh`:()))*C,U,,,./O0i000,11122333 & F gd,gd,gd M & Fgd,gd,gd gd gd^9gd Mgd Mgd M)**#*-***C,U,,,,J-i-{-|-}---D.J....."//// 0N0O00000000+1,1&464?4B4J4R4S444444466667&7~77778)8D8ݾݾ𶯶hhO5 h ,hOhOh8.h , h,h,h.X)hGh&$whh*h,h h^9h^9h^9h MhUh`h9B3 4S44444W56566~778D899:\::;gdy & Fgd*gd gd  & F gdOgd ,gdO & F gdOgdOgd M & F gd8.gd, & F gd,D8T88999:: :!:\:k:l::<<==%=&=*=h====>>??'?6????8@9@O@Y@Z@@@@@@@@@AAtAAAA BABTB^BhBϿϳåÑh2%h2%5hJfFh2%h 5 h2%h2% hh h h 5h^Ih h2%h2%h5hhh5hyhyhy5h*h hhOhhO59;0;<&==">3>>>????? $Ifgdgdgd & Fgdgdygdy ?????qhhh $IfgdkdF$$IflF ,"  D t06    44 la???@@qhhh $IfgdkdBG$$IflF ,"  D t06    44 la@@!@4@7@qhhh $IfgdkdG$$IflF ,"  D t06    44 la7@8@9@O@Z@A B"B3Bqlgb]UMM & Fgd2% & Fgd2%gd gd2%gd gdkd,H$$IflF ,"  D t06    44 la3BABTB^BhBC}DDDE6FOFGHILLL.MOO9P|P & FgdJfFgdH[igds^gds^gdK]gdK]gd gd  & Fgd2% & Fgd2%hBC}CCCCCCQD|DDDDDDDlEEEEEEEEEEF4F5F6FNFFFFGGGG1G2G9G:GTGUGVGXGYG[GGG HPHQHмjh-Uh-hnmmHnHujb^hHWUhnmj]hHWUjhHWUhHWhh2%h2%5h2%hs^h^IhH[ihjHhUhJfFh h2%hK]5hK]h 4QHkHlHmHoHpHHHHHHI[IiIsI{IIJJKKK L L LLL1L2LLLMLNLPLQLoLpLLLLLLLLLLLLLLLLLLԽԲԧԣԘȣhK] hs^h-j`hkOUh{jV`hkOUj_hkOUj\_hkOUjh2%Uh"Ih2%hJfFhHWhnmmHnHujh-Uj^hacUh-4LLL-M.MMMNNNOOOOOOOOO9P{P|P:Q;QIQQQQ?R\RhRRRRRRSSSSSSbToTTTThvGh k5hX7h k0Jj5h kU hosh kjh kU h kh kh~bh k5hh kh@hh hK]hehK]hehJfF hH[ihH[ihN<hvGhH[ihjPahU.|PP;QIQQRST6U=UUVVqWWpXbYZZZZ $Ifgd}gdR & FgddGgdgdgd@gd kgd gd  & Fgde & FgdJfFTTTT6UZUU VVWWpXXXXYYYYYY Z%Z0Z(.39BIJOBkd-$$Iflrm wS,"; t0644 la $IfgdjO2345h $Ifgd~OU $Ifgd'? $Ifgdj >H???6? $Ifgd'? $Ifgdjkdx.$$Ifl4rm wS,"; t0644 laf4>PƼX $IfgdO8 $IfgdjKBBBBB $Ifgdjkd/$$Iflrm wS,"; t0644 la;]oKBBBBBB $Ifgdjkd/$$Iflrm wS,"; t0644 la޾9kda0$$Iflrm wS,"; t0644 la $Ifgdj $IfgdO8 %'X-z0Z U- & FgdZ;\ & FgdZ;\gdO & FgdO & FgdOgdOgd"]gdUgdjUsb~iCgdgdgdDgdgd kgd` & Fgdq & FgdqgdZ;\gdZ;\ b~ghiBCq|->EFRҸï֧֣֣{s֓hOh5h~hnmmHnHujhDUjh)Uh~h)5h)hCJaJh;hD0Jj5hDUjhDU hDhDhDh h khnmhnmh kh`h7V hqhqhqhZ;\+E -P{K[,D. 9[Fgd#gdgd#gd# & F"gd)gd)L]Lgd)gdgdgdR,-07HlvzJKu+,DOTj9[ƻ´ƢƔƌh~bh5hCJOJQJ^JaJ#hB*CJOJQJ^JaJph hh h^ hhh hGh)hGh)5h4h)0Jjh)Ujh)Uh) hyh)4[\hDE99ALb.<Yo{}~/:[\vwxz{^tJKOP\lԿԿԸԴԅԅԅԴԴԴԴ hJAh#hnmmHnHujAh~Ujh~Uh~h~5h~h) hZh#hZh#5 h#5hZh#5h#hX7h0JjhU hoshhjhU4F9Td%N' & F!gd# gd#gd~gd#gd#gd#gd';I9DI:*pan[&gdgd & F gdgdgd#gd# & F!gd#;I89Dh7?[&(49lxo[&7Dop'(9Y ǹ嵮ǜ#hB*CJOJQJ^JaJph h~h~h~ h h ho,hhCJOJQJ^JaJhkah5h;h5h hdAQh#h)hE^h#5h#=&8p(8" 8^n<jkugd 7$8$H$gdgdw)gd~gdw)gd 8=^<j'67IVo/02ȼۼȷмۼۼۼаhnmjhdZeCJUmHnHuhdZejhdZeU h kh k hP%kh~ h5 hP%kh h~5h9ph5h~ hTMhhhCJOJQJ^JaJ#hB*CJOJQJ^JaJph267oJ12d$If &dPgdgd~gd23:;bcijpqrswx h kh kh@h*hdZehnm6]mHnHuhnm0J6]mHnHuhdZe0J6]jhdZe0J6U] hnm6] hdZe6]jhdZe6U]gdZkd$$IflFZ," H 6    4 law 0+p,p-p.p1h/R!/ =!"#$% 456701h/R!/ =!"#$% 01h/R!/ =!"#$% nEU~Z; EPNG  IHDR^ ~gPLTEտ@h`2y rP0|pПּʗģ ele~?&rXKq{voŬ^٨4tRNSKW"ebKGD37|^ cmPPJCmp0712HsIDATx^낛8Y|i\;d$3{ߕyw[Q$$!c?3ic>RQI4)OZ]/cD-/tx~Q$\lBj< $"X˶$FFel[  8=^ƞv&˶e*'^/ۮ3I /O聧֨Lw*Ϥxח$Owu*x˪+IT9u>[zE J x>HgĻgVo}$yn̎ '"IiKxH8Y/MJ id7)ޤ6NKxH8Y/MJ id7)ޤ6NKxHڸޱVa fyQa`Yk;r"DZ ^ i]-ew4L֫YoY!^g>VGxx%&.ɄWëcF*%zܫOdhMZQh.Ikdmn.Ix;K o^6+P̞ goY?z{ en,PK09]~ixJqogI:q[m63 rQ*C(uą]}\/HBXݘ8+Vը!.VHWlM7R=HՑoW+^Vתya#cNbO/?rV'p. srjRp4ye?ա 7 ȇH+dqV!;RQqu894dm\@E%lO Yo(^/zVx#u}Pe /tn뵔x{A"xQR6~VF'?g{=J`zˣ;rp}"=^[Hx+wdȴ$>zG[ZzqKr4:h@:DȨIUG^>erIGњ@ PeG|1!iX\JS9>t'"'9EČղ[i$lF[7^&PYo-H$ib$"\bd1LF9+VBuo WIgZ4͹ %y{7ZwdXQ_v\[ oj1%k~HR `OI:]^yX[_dSgC̕Nq)|95?33AzЊ3K-Tv6C3B|߀?E' _׸HvjIڳ ~NV8^޸:Ž~B:Gci^!,Mi+oWNOW zvRcJ43$HWno(b)p]*[n7Z&߀g²J8=g"Vk|+x7 .Î; ~%s(sY  ':_JrxxhďW}J-ߝ_t n"pfHo\+m뮐4 # д5ѬX]b\!pF k2lO(O9⯿~Bq.n8G2_h/b}m}B};O>uE^a=xŬx}U}m`qd!1-^q!% x=[x̻^D^Lxy[׋«DЧg؋S7^vQjœ> rzٌWx!s_lVįc&)ixo ٬hAH㭽,98DK}>f)4y:VUNEz([g/#Z(oҩ6ҧFFۧ86rؙ:["i xP×fE"#k|, W=txV^rW2C;}*w<խZNH9VshoG? 6C{5GvCܻ]/^e]pI;zq$m @uOn Hz")^D@-?Bά)9>%)#kIDx52EVBо5qɵejt%Vm= 71^xTx*9j+1 +6Zam{7+j]CB8,ooz(H|^8rqonZ]x)#)oz6?ceߺ^.Eu&4έ̠gE5~0܃_%^ɴ.M9TeJ!/KT!4$$&rKݓ } uK%Bhn8-6H9$B}W5ZPٵJ.p)GI < bɭ%?]c&4]iQpLWYKmV<=Jjǖq\q^ q]ٕO#+%e=&&MAe}Uʭv ZYFYK3e`x;IeG^~xz^yN9ޏ_(G}ũ  }^OY1u̷2*xZFE]x7yZɲvQ\~l2;s9gΜ33yf9̚aH"{Hc/{6>h"  5|~WܿNpq"@j `2@ 5(>t|cp\"Dr0L `਻d}h ]$;|ޅ0Kyi @Ԡ;;^?:i[@*T*@Ƣ"@j#Ț#@j59˪+0.l"0H v&qYvpd+ @j9".61e[ 5X^t +kR}eS8W' a}tv1vhqY!f 585$㲚@}XE`Ơ>б9S=H X;qf\VEXiH M#tvYRCE,'>- }XaH .wǸ,s 54>0%L3A!k. "@H \D!@A'"Cб p=Xt RC&%zpb)"1H p!@jÉ@ 5tl9\"A'"Cб p=Xt RC&%zpb)"1H p!@jÉ@ 5tl9\"P^u"DaJ_XjsTD@lڅg5a"@چ@Z֗xh۔sx0\!HE@N7}"#7W%/3g>OA2xӷ/+O^V} p3E^Xqڱ,>vLe8N@#lѭ'qvZ?([g eFbuc`}ܑ$pd^I:n5@5r# c_6؊ BE0*OG=Z!e=cAn|g ZNG_h_⿕zE7x 1|!Bt@@%-m}Y,`<^@;&dUR M%uL 6<+v*`(m> IG:Žŗf}?`VR҄RZcu4/)P \z-hkdtHguXNL~.t\{ŅHh$ ٖFYH'S\*AQ%}T}{@M[M.,:Y!;#Ogwa֝?״U,9>''& jxc3{Z"5B2vf< HAyΞϱe^[C'C# 5jxx]-"ex qp@nxUDOC-"{@| Y\8p"q5t|8|" fpf/D 2⣆oF3%>->j@73JcA#l󲦚ˠ)g 0VԀ7zYcCnXџ GG"\!DM b2GcyfF8s~_h+ŋϟ;wn}Bt;Б(>94 y%lGIO?6}uv?gZZ:SJ Y)0:ztX[KPK ϯ/[  H'A^wojfHԀ x[@j$i j[L3B"PdԱUTn(BZAD |⣆]+>`ڢQ#(V_! tj9r ,ʐڱ_"*HRȺ>G4F@UUj-YGOً;4y~GP B} d"uρŃVnZi F^#M;EL)#l}pq\ M؆5ڍNN gk8b`Jyuu2I)l|v?엥 BئI _O3A j)Appf*5,Yf?H>/JӖuh+p3>73*ǡ/g;b04) $<fH[v@͐b$z:Jc`bH.t dc룸 ' Jrc(nF'->EaDFJ pLz&hyfq9 E^HŃ yC@_ 7#v|fp0ĻG1F ^G(,} / =rz8z4y0j̛ꢞjrc1tG筺<lua7α^|R8U9>j@ĩ3_Sgۂ;j/3ɠ00LOP-@f!'^-܊p hG:^O7tw]DB@b)L߭D[zR*X%Ȃ'h՝߽X# L^FKmw|-ħx2>Jybw9VlqPȌVSi*,*a#\ p* `Vb@|TC" 1 &l$UiH좪d^Rʃ퇺t"}AUDyJPO\3$ԟNg,c 5[=Edo7`f/(ߦu4ƅxV]j3eڕŒ*Yu쬜O=WVT?p[%!-D,N "1ƹ]g5$T"Ls,%C~ʾg{f^Ȑ쬉>D-BQ&u< N$뷽&iCwl.Ć%K( a9U2- ^^jnuDZe:][+IyA _T=b͝U|xjHC*-)u ]Eb\:Y!d|p\ڝfZ ͱ/vPu+]|>^ NCٓ*~ οXݤX]=aO r/Ԩe禦נ i,\6&Ŏ$f,KZZ^Ȗ񖶏/tB+UB:ԮIM 4ާUQ5$[tcL@vo[7RSW4"vy@|KIY:#&YAiX߇uduxN5_(lDδӼ*g$LH 5 wVyUN:AX@M j 8JiuuރXj]EM HZ 룿sOlk{>BwKVrZ)Wk@oo."ۣ{[D!\۟B#i`baeq^(x}1oX͑"-ԂxɂfȚ㡺 PXfOBċ8!Dz0>k0;x QS$51KO@o^aAw/{h0vDCH(y.v^+ >APW^W,e@qqWSS2Pv6^> ='Ϭ%+ .;<*RV tAq]hpS,}R anmD$570u8 g@ DXe%]ǶbiD~ -7pupw6Ít@魳gkwlI{H:ޘښ>| T evքXGRJv/եAH$)P $AdS+H/嵤`17d2-ww{:*:z-NKˈu3:>Qjj4~¼wإ;]%%w~wF&h 0";Un,3>;=$!$ቴT:ԀyBWuR hYWy<֪.]_5V+oZp{AJb/e3)}2K Pjenem>]n_ҏhg{Cޢ{vBj":%ޭNH-C~of f^.7H.4IFA̯kj@9LM@T Z:%IĄ5.`%ItN;E*tHƨlw4^8n3IHlv :fG$Ȑع@X BD~THPۂK=:ztj_͔\`f*K+2) ^ב,Z*DlqH4Dyonh zfq}],tPި*>LJ[Aq3j /hbD@ @JB #/Au7j8D 7-+u =y)l` nNÂ+CA^h\#aNWw( Wo1!RR;ZB:̞=Kб Hp]4-Z9&D!Rx:dîa,N$-xo;bua]"YB1H'ԙ=2É@ \jhCz/<1vbq.#45M x+y+cw@LpoMG+vA3I:|9|wD @-EhN^p,2]<Ŗۮ;lՉP" 4p@|^_˂Ȩ%KA &j /4& Py4@@^hrM/"@^J%#ր h~YG"45 S5˔4@)_ $J Q"wMw" ) :( p@XZy|}"@@@^М3#  5lvA~fI"@\#89fD@^03V!  L0 fxلh?@^hfv 0F5g@c4M Ʀ:4G Ϛ=8Mue]"@A˃y @$IENDB`}DyK _Toc155268020}DyK _Toc155268020}DyK _Toc155268021}DyK _Toc155268021}DyK _Toc155268022}DyK _Toc155268022}DyK _Toc155268023}DyK _Toc155268023}DyK _Toc155268024}DyK _Toc155268024}DyK _Toc155268025}DyK _Toc155268025}DyK _Toc155268026}DyK _Toc155268026}DyK _Toc155268027}DyK _Toc155268027}DyK _Toc155268028}DyK _Toc155268028}DyK _Toc155268029}DyK _Toc155268029}DyK _Toc155268030}DyK _Toc155268030}DyK _Toc155268031}DyK _Toc155268031}DyK _Toc155268032}DyK _Toc155268032}DyK _Toc155268033}DyK _Toc155268033}DyK _Toc155268034}DyK _Toc155268034}DyK _Toc155268035}DyK _Toc155268035}DyK _Toc155268036}DyK _Toc155268036}DyK _Toc155268037}DyK _Toc155268037}DyK _Toc155268038}DyK _Toc155268038}DyK _Toc155268039}DyK _Toc155268039}DyK _Toc155268040}DyK _Toc155268040}DyK _Toc155268041}DyK _Toc155268041}DyK _Toc155268042}DyK _Toc155268042}DyK _Toc155268043}DyK _Toc155268043}DyK _Toc155268044}DyK _Toc155268044}DyK _Toc155268045}DyK _Toc155268045}DyK _Toc155268046}DyK _Toc155268046}DyK _Toc155268047}DyK _Toc155268047}DyK _Toc155268048}DyK _Toc155268048}DyK _Toc155268049}DyK _Toc155268049}DyK _Toc155268050}DyK _Toc155268050}DyK _Toc155268051}DyK _Toc155268051}DyK _Toc155268052}DyK _Toc155268052}DyK _Toc155268053}DyK _Toc155268053}DyK _Toc155268054}DyK _Toc155268054}DyK _Toc155268055}DyK _Toc155268055}DyK _Toc155268056}DyK _Toc155268056}DyK _Toc155268057}DyK _Toc155268057}DyK _Toc155268058}DyK _Toc155268058}DyK _Toc155268059}DyK _Toc155268059}DyK _Toc155268060}DyK _Toc155268060}DyK _Toc155268061}DyK _Toc155268061}DyK _Toc155268062}DyK _Toc155268062}DyK _Toc155268063}DyK _Toc155268063}DyK _Toc155268064}DyK _Toc155268064}DyK _Toc155268065}DyK _Toc155268065}DyK _Toc155268066}DyK _Toc155268066}DyK _Toc155268067}DyK _Toc155268067}DyK _Toc155268068}DyK _Toc155268068}DyK _Toc155268069}DyK _Toc155268069}DyK _Toc155268070}DyK _Toc155268070}DyK _Toc155268071}DyK _Toc155268071}DyK _Toc155268072}DyK _Toc155268072}DyK _Toc155268073}DyK _Toc155268073}DyK _Toc155268074}DyK _Toc155268074}DyK _Toc155268075}DyK _Toc155268075}DyK _Toc155268076}DyK _Toc155268076}DyK _Toc155268077}DyK _Toc155268077}DyK _Toc155268078}DyK _Toc155268078}DyK _Toc155268079}DyK _Toc155268079}DyK _Toc155268080}DyK _Toc155268080}DyK _Toc155268081}DyK _Toc155268081}DyK _Toc155268082}DyK _Toc155268082}DyK _Toc155268083}DyK _Toc155268083}DyK _Toc155268084}DyK _Toc155268084}DyK _Toc155268085}DyK _Toc155268085}DyK _Toc155268086}DyK _Toc155268086}DyK _Toc155268087}DyK _Toc155268087}DyK _Toc155268088}DyK _Toc155268088}DyK _Toc155268089}DyK _Toc155268089}DyK _Toc155268090}DyK _Toc155268090}DyK _Toc155268091}DyK _Toc155268091}DyK _Ref154461863s$$If!vh5 5 5D #v #v #vD :V!l t65 5 5D s$$If!vh5 5 5D #v #v #vD :V!l t65 5 5D s$$If!vh5 5 5D #v #v #vD :V!l t65 5 5D s$$If!vh5 5 5D #v #v #vD :V!l t65 5 5D DDd"=t  C PA8PREP_11 Matrix Fully Loadedb|&_ O4BXHnP&_ O4BPNG  IHDRFT)PLTE3𠠤6bKGDH cmPPJCmp0712HsIDATx^]뚣:ٳ{foss`K|C'Ⱥ Y&Df T@~F$AH RLA+4Ra ҨTq1>BF4̏)8=_pq#{ ЅAY ;7r4ڲ`c#نDĜ(Uy߆K}_|?T1Q'<yNn 7)a,}j|?IH <ɣRpSWa0W{}6_^5EY& ,ppb)C`ѷw+ѿY˯sw~τ/G1_doðĂw|"v/WpvpbK3++ݞG6U-C{u)?JEoR,A$t8e7E'G ? J""D |%P"(ݼ(#yD"PB4"e$F([@4"5: `elf_U<~$e+(%w\_Z~W+cP(pǗJ#P(!_\Eڱƨhb4^nitq2'Z~~5[nBc>V/FF>>z=;.p&A@B׬B5^{-GE"ӈmozbYuۚ,S%'5+ zm3!oF,3)oM2H7!q/*4/,-Ѩ9&\:m 5C^Fv=FaKQhۄT"]r@{V_j dVlB8 {cװg{]DNWN#{Do*~vӑh%pFz˖2ԜD@a\Fo+h]bQt Q g4Zwk (P U( U\{SZ|mV)T&5Iusyo> obT1d,ͮPѮ[[l_ h9Cq_a>RhJZ7I-ioԺ (Θz% `1T7fiݜHE3F&YX$?d=o|.WjR`IbϘԸhKܐ$~X' FYH#HF lvٚ)lA o3PCZ'܍Px}#U~ekvHFPXίM҈4 IM֩JF݀&ZKͲmvHިxǏ'>eey!$¬+fA <faaI#'@DډpRK-w9FJcW *.\=83'sRDA=qRK'◑ό4 H"4@kV#؞%KNՈHǜ7ԸRkQﴩCވ{ur"j[kwQDJ7[goHu +0o$!,qpj{%uGU? GQQw$!E0G&]DՎJ'PHCjiQFW#y =iǺFK ʖ%XEc#J˫ c/͏k-2 ZgqxP!o r_05tmi((L nm}[nXI5 A5jQ-xjXШݘD0)Q{ۣi6*: Qj%x ByO ,In%j$K'-L ndŬFxd@1^R(I#8^p/F;`L(f>:$ߏ;&ct]$Ec2G uH?%__&$')Q&+hsCPD8McuwmB mB 6!6!з-> 8 x* p6#xWŻl.>UuՅ4ɫtu?6x^ H EBF HAh!`B-^b+6"@T8-ѡ[ ^t(d+'@sYbK4GIrc" 60x_y9ɌMwSoڣ{} ]%2NJ6:z٩s{' #a@5( }|a9d .`%'`6LNC!2[jje6׽ojMK5zKi2h(2#֙1]8cs;S`DsLKrBCź%`\0G dӸL\h::2究(ѷ`9+ Wq]x9xPuJgZ/Z}WUTU S$/#"% s[U-B+yx,k Q]' V [0o;jĠ`7MA kQ')))uڱ k_ߣX< \=\P,I-޺Ȥm"O`C8ل4++bf䖕@ 'u2/Pu I,m"Vj1+8J+D]fd(vA^t5Y#Ag늡gḮl .h %ܹQG# & khN`D.pfv̀ J]:[ kě VEU:G#b46;PD#Px _JT( ]]=hq++d"Z)^3^^g [*i|TUJ]d"ȽH+YȩfVS W&FhMh0N@Z:@15!0N@Z:@15!0N@Z&y>-At]*HS| A'`3w8\+ ،]Nf6 p6#xWŻl.$ēVjgh+zxRnZ_>a"NGdcfxS/75!=ty/#'0 ={suzfZsXx|yY6SL1Ύ0q)uWfC$! txl.4V@`}p1^ <ͥvAwW`Bd.\8Dr'=q詩S=pR% FRlX:oL%c:أ.!qG4S;t2OCg <`iA'/}蹭Gt#5`[J߈l0Zr BcoZwH猌1+ :'$:|\.1[Eʱ8Z1WN\A8&{#x0 Sp-"^ !Ŋ_ԞN &l7Žz\1W%:Nf6/;`,joOcQ²B&gHBt,HԀ'`9I ߍ~;k5Gv(}e7=^5}uUw꿫#|zRH/ ƭ nnN'DN5QR*,bA/D*xGN¹_|Ȧ u?R$ź JwZZM[,'warJԥ(u{~)u `.{T& [JJ{<'EDsUTn;+Zw z\( 4SwN%w &nVEh =DߕC^YuAru]~\մ~^l (C1ƃ(ryxpՃ;+.aR\j܎WAHT*5=oo}Q}6ItbUn;4@q̐|:&_.(B%dLw4f`W(r6v(@]{,Z+rng;)Ź,Y|5? hgu 3 OQLL' "q=/܄Yic. 1 TR@q쨉 9 Xy>'p$wK`] `6 fZ+cƀ},,2 ؋ }hV^yw}:4"<N&36)L|3 )y&.5|q>&83rj(`jp᫄ g!i2LNa侚4F2xX"=%4 cv429ﮝ +Htkx%7*HjRUO=C)n} 'X 6c"z:J-]WnsB2`(]])3%);I\{>S1 AkFZW Tmڱ0VVfsBͮ+ y\m hAifWLtm10+뮀+fwFܾ+`/d1I| lYW@3TSaք vtte`iAW@'`]ƀvstCf` 1WhY\`r f`!W pF\F@q Cg` #dux˄+|3nCxӀ+&7nx;+6 ng` du8l0 QFWf\esA9d0a&W!\fqm qW1\'wCeׄĮ vtt5%+` F]PMJ lYW@#PӒAdD6v445+`*]MN yW^}{G/'ǀ含} ؋ǀrB K_Cf1_Nb_W=RNjc+`9C <\  ;+Wz2n| XN_-< 7tC(o'V3y͙N& V=@MӁ֌N T;l:`H@æ֌N T;l'I:oJ@zc7J@wO[ Xs' XK/d~ׂrzQh1#Ls^sJ2i' @ 3O|&i= hx@Y k2>V2! h!h8fejm xDEfDQ @' )rd!/Sh7vWED>JO d4> Sr0B 轈KO'@ry8Eh|¨GnxlA]_9T:c V M;+ pL uIgzϐdw3 ̍lF`s'`3w8\|1֤׍b{*MO4("p{m\F_c, ) d -1cH (z ]mS 9-Dps ;Zx[t*~B H@!i3$ݲJNrBc<$ !\\(0s՗(rpDhk[D_ߛު UvHɸ&%rad hi^"'`M&%zOjsi7%9Gi6~W ty: ksv'9 ?O}*=!i<?Eς!H>48րL"&By![oparV)ؙIz >O-PK}:Œl@5oCϷ 8QPRbw"t~1vX!@OHnKO%@;;gЀJݜ}JQSpOi> u_1'V Xt' BM#b:PYh= X좜_wl.lF`s'`3yD".vh74XXzä1a"Z˳i:ɰ햯kh t܇=`!Iqdaq pq ~ yܱ9u_䟱y  4ؕ%p$"QdI͍"$QqEW$ ,XLSq) o,v]=ܳCr{34<~@Jte B(H{7M#? ax~%QTHT_$ZG3Qf4]ʻ$TUz\XR> " Ot6C }ڶ -h]5Mp}]dBbijr8  zVA2( pܫx8ofPWG3f%lUU3Uo>gN : 1A `Ioqs|oŹ7XxÆp<ߋ̛0wJC?;vzʐȏ%b'L11|>AEF(DS{p~N@bz(F8 RKՊX/ 28§PIwVQKEp!ݿ?K&@H=$4}$T8%DJg4ވO"kO%`C.,\8ViDg]U. f>s ~d:Nf6 p6#xW8 _D}.?tNT!1\1{?v\/.CT¾YǸ |qLrf&0! byWpbS2 uZd߬W=mWЪYC uRcqk]Nu2 ߬ 7ϊ9. =2tlY."qlF`s'`3w8\+ ،N?7V)~Zʢ''T.:`¥`'`;N FV V9y!0R/kVpTܰ8<ꊀjaZpҵE@s {5QxAQ?|5N+0P7dVU ]ؼ1U@-ȏU qf+ Н"4$ 5:H}-({\y[M <GrK_ c NL `٣pv5[EQԯ4؍ەM'@g­g.i26(@ShfW>񪅮j%`BY|$#OoZ&lUutm4o:Vރdh;O25{.C횽 M'Dݚ9w F~Iajb*\O;z:Ӱ68Nf6 p6#xWŻl. RK6{cfޝ'`3w<p80IENDB`KDyK yK http://www.microsoft.com/downloads/details.aspx?FamilyID=4b2c2f1b-d74a-482a-903a-45bb44c5dec4&DisplayLang=ens$$If!vh5 5 5 #v #v #v :V!l t65 5 5 s$$If!vh5 5 5 #v #v #v :V!l t65 5 5 s$$If!vh5 5 5 #v #v #v :V!l t65 5 5 W$$If!vh5 5 5 #v :V!l t65 W$$If!vh5 5 5 #v :V!l t65 ]$$If!vh5 5 5 #v :V!l4 t65 f4W$$If!vh5 5 5 #v :V!l t65 W$$If!vh5 5 5 #v :V!l t65 W$$If!vh5 5 5 #v :V!l t65 Dd ooV & C 2pubproperty$$If!vh55#v:V 065 34Dd ooV ' C 2pubproperty$$If!vh55#v:V 065 34Dd ooV ( C 2pubproperty$$If!vh55#v:V 065 34Dd ooV ) C 2pubproperty$$If!vh55#v:V 065 34Dd ooV * C 2pubproperty$$If!vh55#v:V 065 34Dd ooV  C 2pubproperty$$If!vh55#v:V 065 34Dd ooV  C 2pubproperty$$If!vh55#v:V 065 34Dd ooV  C 2pubproperty$$If!vh55#v:V 4065 34f4Dd ooV  C 2pubproperty$$If!vh55#v:V 065 34Dd ooV  C 2pubproperty$$If!vh55#v:V 065 34Dd ooV  C 2pubproperty$$If!vh55#v:V 065 34Dd ooV   C 2pubproperty$$If!vh55#v:V 065 34Dd ooV   C 2pubproperty$$If!vh55#v:V 065 34Dd ooV ! C 2pubproperty$$If!vh55#v:V 065 34Dd ooV   C 2pubproperty $$If!vh55#v:V 065 34Dd ooV  C 2pubproperty$$If!vh55 #v#v :V 065 34Dd ooV  C 2pubproperty$$If!vh55 #v#v :V 065 34Dd ooV  C 2pubproperty$$If!vh55 #v#v :V 065 34Dd ooV  C 2pubproperty$$If!vh55 #v#v :V 4065 34f4Dd ooV   C 2pubproperty $$If!vh55 #v#v :V 065 34Dd ooV   C 2pubproperty $$If!vh55 #v#v :V 065 34Dd ooV   C 2pubproperty $$If!vh55 #v#v :V 065 34Dd ooV  C 2pubproperty $$If!vh55 #v#v :V 065 34Dd ooV  C 2pubproperty$$If!vh55 #v#v :V 065 34Dd ooV  C 2pubproperty$$If!vh55 #v#v :V 065 34Dd ooV  C 2pubproperty$$If!vh55#v:V 065 34Dd ooV  C 2pubproperty$$If!vh55#v:V 065 34Dd ooV  C 2pubproperty$$If!vh55#v:V 065 34Dd ooV  C 2pubproperty$$If!vh55#v:V 065 34UDd:"??j  C FA.PREP_00 Full Screen 00bTS pn2#AGRm4thtT1nTS pn2#AGRm4thtPNG  IHDRRtOPLTE3@hw   ; >k k +C+-)9EO&_'m8 *9'v(##$#);,=*D/I(Y3d))).-11113J19-B;99<;=V=`C9.@@@BrDBBCBMWeH0J`NJQUG;PLLUUZ`yYZqh^P``h&&kpjiioouG qwyKKUKzl\}~,{|KKffsʼnAAg*g7mӖ̘H?C2=zD/$ #>(;KԞF49ijB %5ƋTѦ3I0dgZ B:0HO/ - o޸U__7W}ޯOyyzo|iˠ5 GI7VȟTVlQ0dIJI.Nv JG=mL<8hP@ɠKDՒ5/Vxo?޼HDs@(cŶby jiV/+z+so٨_-56ʈ5LkWzk/յV_Buxtm_42I4wa⢔Vr:hP[ Bn|?9x ?'N&/9~2_ħAIhFbV~C ҧ/ 7 ֩S%ٚ(!Q ࡽ3ȿ|ov{w=qߘL:|N;Jpo (a&N|XuWD?﹛T o~`~tF:9:HZpNHtN\nH' GqL_?WG]&]wpH?qC9tYt`P7nTP$U?J@;VMKL[lfo-iu?s БS9H0-i$v\$7y 5{{Gj{LߞB:ɑuF*@0t3!#o(`f4I>vPhFm?N?~*? j|?M,rDxm.gFd&)C55~]w[\ox9~ӟVZStӅgK^RkagZ!I/~qՑ~]wMw2'g謻 }QyU\8ڵwHw~ee{y*OK&~u;9F}/?|?}VNӥ:݁k/ nUNgsɵUy7~]ĠS$5c2}a9BPjԹfAN@?=s t }OS : #7q~  yB4@ҏl$uQ8|,=H?8bC1&򱘏ާβ5G*\V-K͕ҁ~Pz;XЇ>t0L*Ot@Ss6I?z숼W.Hg*LNu WQl.5N>"gNv6uI/rٻ]= *0ĨOw6nɽt7Hq1p;A(0tvA=ְw9um9W5CL G .@'{)CG؎'gK|&SH I%,18K~L{o2l66 k:E.)'U&ɸ¢q@Y(pv渺nsItt QE% :mi/b8/!*7!qxowO:yLNÑx=54(03{5wti*gvAP(PDNt=o.H];6j"BǸzfwDpg~ IBqptңED(C<>Gs\,HB@@zp@(06cG ԦH튡P F@]1 (cTC(PӧS1\m*P` H5 } o)>\DĀW / *I?=>J>nJjW@5I˒}L@ᅽ|E+C$m:b'-zN2{ T! ܻ9Ng{LF:?%UdF˂r V)F[0- Z) !ݼ&SZcgt,^ɶͱr腵> C !^sD.+RSt4S /?t Μ1E2!loͷKK'q!SZ>Ma9صYn5tq;X^ZZ&@sœX{38t=WnӅ7'Q5)tmLnelio/5ͷi|$2+Azîwxg^g}tP(P˻lsV3rb^Lޥkӫ+`NۚƓr˂@)H:E;MsFȨ]I:]H?uj. f$]5CI3Ձ+ H&rasi. f&]rbwg&2FW@.@@ cIiy6p6@3rt}:[MUNHn,R ~~lݏ&<꽒 gGe27NטYo<"'j, =nO*O7 =~>te꺨[IW:ͩ=oL%txXB˃A:KOz:$)~@\XI%~`:(Ǚ 6d%b2o{+]&k߫b{aZ"V3rsx/rc4OP~^)z ]@}˾5IS/w 'ƇyIJ:hڶ|QszMg&*t4N~5>}5XK_^.UڦywH;lK d"mňRszz_mEfQZcV HWtNě_^ҕs^S.'$. N7{aY7b75Ym>d{&TKi@Χ3r)+%>o:͏M%׌rIF!G W%o.[jS]7)n5"$rb{fD`s3}ucN񲏑Wt=ZӸdA6U25\H1Lu31i76]i?8@M#7Z S#5d%h?($}HY\6>c8@M#7Z 0媛EWd|l@qk޼Z8@r@1915A(ӭf1XW @ z"5(0M@4 J* I7rWcW h_ KH(*G(Z|(ĊFJdmCrp֑E omoßHojciN8P5}=vNR|_)s۩hH@9*"[)'I|/r!ko?I0?tjiKgSа, 41<R2:%fYIdf%uS&,ӷJd "M).kf iw˖qody,m72ͽ7cH?hGeG;G#$ U(/R0axR2FpAzo!2Yλd @Ftn"Ho{F%UBlO*dM0Ĭ̴ ň8t#[C^U|t>z4HotTW]?8gRʸB"dEl4\5;'Y;^1eGr`.]vcloG]"tӲVM dΟxsMJ{8m]ҽy86]SյLVEhS䜸vIlȓ93^sZgw;s&?@.7m[!ٸi`ќ,ZI 4=aaͶo>ohNѫU_H^y1\ .}2gkN˙#FګW o oMNnXv9L9ՌZT!#V/,Kz3}[ LŲ^*!<ݚjH9 9'ԗl)lL7#p{FPmT_]0knnQ]0s^oRwugh͵3gp@|7w%JO*jtLwØ7Mt/ ?=yBV>T\*hg\DPV{subʮf +CexM&L=n'3M!5˧Yi"T@IYXB^X`$?=s}pun6k-yx7ݧw-X-F:uǦ_E_ {BbȦ~M'6FrYg|)eդ@$]:QmtRjrH'םnCAbG{[Y }V ZYN5Hw_4W?r! 4H]'\yZ}P`5gFG#}І#+PfR h} A:V.^|axI^M/j0|BFSg1S TxQ*P Ģ7_wkf>ĽqbP:#!GIFF 5vԣSyQ*B^;n`\ta2St}l S}nІjW!] vwٚKjpI7g kK5t+jeW]tVUIw7̿k"II.\驛3rt='5.ݠ)O:\TDy!] .USo6(_u p 72>Rý$F ~Zf& f@+z;i>kʰ횶++h(zJz.$r ֤Zl|=y5(d3Q:V<O[96?km P[?I9tڊT$#""j0DK3T3r\*{י(l:F^S@n[T|nzX">P03vA@zN5OS. =T)5+Owڦ,LЇe5+C)*K:Cl>ū2A@`.`zJN2*2yom)ʶN*ܺaq>s&EFjP@>9uJE %]wLtL(YiOq>[C̕DrP` h [l'h{qۮ?sɪ/@(Yt ojn;%Dd2 J ɋ\8.>sʵz43W@.z ~ԋGg4l6n&]ͽϢɡ(P=+@Hmk3M =)ǝ~*H/Rno}n͠} R(fһ0HD`jt[B{l]'L0EG FS86!mQoݺ1#7jf ].O( p96&rn|%nwƍфguz,ri. *5$8 o ;6>7{NdN1VeBɫt ??+)p\8thWukNSQNA׸Qa9yW6.ciZ; 'p@HI_L0iźtXq†r}uX Sva \c8@,&&],nin2jwHg\ISuRȋhPbh(n s&ȁG0(pIo*r'ly,CD$ ]peɹՕyHz ΁. _Ux73rWaK7͌'-T݋̏{H$Iwɼq,.,cӉwwFآDo0!Ч,G5꒚+tqs穱I}t?pxi7N.|?Anl&DMҵuWV+p;L;P~)ՋD_}D\nʙ\љ. / N} g8k67(0IY99L ?b9-5!}ZbkXn9+ҥ3oF )H,Vvthn0vz T1#',p x)=;Z˘}yO_zFNϐ0iUܜ~ ]_@"=\)_c X-%F/P*Hmͦ_< H՚:<:ļ Q>hmTO Qp0.tM M2?_B:>G]94mRAAG} \/!<ׯ{TŪl g 繒H%PW'9jwO, t5ΌϹ/ ~Cd5/X@BW9Ex=`q :yag'g\҅޴v@Gڬg5(gS>A 6ҹ>[⇱%%soW9ߔғ9ӈGGk>*{H'{orU\L<3rꆨZ7CR~Ui{.5[5IrLEy. =5zmOMD)p<4\XѨxrx\2&MiDg(6|ة "*R.9gfqaXu,ztBo`47\ \2b!Vnm8Ca+nbgC[mz$\?g|vͽJ |@2Q-Tv 6֦| P҅NsNN a}V9ɾtcAY*wו`ɽ@PpG6}mP.שaM%rM'v9?7 LNFcMT}KA5+Hs ҍO[w_Mim%^jZ^yڽ_t{DK)`Nް<(&ԌqAdL։t)vW<%mg @b]m(:?)1@ o^A,!lϾ_G3Z+ȯMz]ҭa7;Q@ϓ3/{ZiC%:싍=N[16 ;A#27NM b kVx.7&@JgE70'kj12vrAOwZ[ 'v8qrp&l!<OLҥ'70]*d ో/Ctp}VaI{77KQ.j~IEqYAt8um{RހGkxh_sJUs''YHtC/csS}Я8+ak8 G  [V.Ao`'t[K`@LN͕$׈x̃IgYLSJ4m(5j:wqRW!} y*I7m9֖Hҟy$mo /A w,c fB<=HZ4^cK;ޘ&ָw5g''i9lz|#Fw +[eC((Q ֤t*`ލTr1qPWJH,ՏѧʽzQ#iUt sB/d**E.1+/0ZrRH` Ⱦ@/ﴚ b-a+}Q*RD팹j*NU6.^3gu\Ly &SH&ZeӍ1SS'z$ӦC@e ]Hi(kflOⴐסwPZ@j_=fXYtM5~\L[ME>IM?Ut<, !@M6V`Jsw<aڅw"X΁iDm-W΄Lœ`RI:} } h-Y0# Z5ta-Ml!%ᇫ7]`(ZHt ]m&me0751qr$@&j"L!o𠶺1QVޙ[LqcW%{=#'u]U,>m:nov WLTNuRZ8Wԙs']{QepѶ=!;`cgg)nݤ@o}rƴjWWk 7FS&jD4nˮH7e͛-S\gZrONTn9D3I7ӴgXmK.~5ȟ1@bA)5M0Ӡ|t=y"TqݫuKce ahn]uĸo^‡gfM H^>KpX6 xŊwI 뿥'쎇Y Z[¨5Wgٛ>T[@/Y [6 O^2;ɱ&t4c(ih>ҍl ]Otr.Da5BY)`1:ʖp䛬I75t{0"}qC);)[̉ScrEIwֹξ5#'b)!L"7#1lzD0oaj)EAz^=Zu 4+N]SYZ& "! N^%C)nbuuv˻ۙk 3 *VWMn =w;w* !\ = nIǴd1G>`0LW὿mz1@\;ͧd}Z>. W!J'^9IWo=9DEDoi؁kOlb_ G0i_c=fUM#%]x˩}FB~ T +VW?ܥ%*"6+2G҅&\COdpsg ]÷ cr7Sznx ӆ}f8k; +|&APp=i5/2ƒ9fH>WW>0 I*HЬ6f]^5lh GhR!c(P ⋇C`@zT*VW|Pt(H @ />HlQ֒HX TH¡P` }\ *UWzPl(0H>H.*+p(6H$XGGLZ!3nZZp p! ? SqBb ?*(w!-VL {$$Eh֦GU8 rfR` Gͪ}gj?H,=vQæ)I+'}yP X3r{3)"E(S jQ1#o[NXd _ dSg A +0m0t /%y&)H_B_b' (EK` u g 77W C7JѪ =DڪINYC655I?21 _}.j< Nδ5&\bIοf턡hs!}[e}}VWv"((%hށ:ESO%u{JI s{鷓pm8@r9핐ӥk-γ19WNmH.LNvrsAQ AzUocsS}w"`"CZ"hVX722pӶ?wo %e!x0K*s D1="MQVU@BRa=T8O;֍ g:m? D*0aF)ڴI? D*0 NtڤJzsz LQҧFQ ӄ36p8@l EؘN.H;Pww3 } ,A>+|zO.}R>3@5u B*38ȫSY+>;ΰ6 =gݴQ9K>Wҥ1Wf/}>WE;HSO Ӎ:k.jܾ膿æ̦61>1_\[_vAHk̸קl!wfq@@rHh2[@Hl(sͽ"RvjIRfT֗pkAJ>#T#iI> 8Hs_qg6} <-7O:<)X+'(w^fIFhoh+rZngHOZeA6zh >^2ҵ1HӦ+-\.MOqH֝B٤txj<=6ZxRB"3W٨y򑯫%2e685#]*G~-LzWX%kڇֽ"y|vH|jш%loM }֤"6tޛ7b {ti$żK;&=Fav3 utEr2@+U_ ۆ{>+ҝs&Noekmy3d7dzr.jX"s@>O=g&gk E쾴&LX>+ts*r &JձX AzPC*rK8Hb }7Uyk X[?X_ARVq@ ]b-hjU{PG Azs)Y"Iz2CXu"!{@鱤Z$QK88K=HQt\JH\ RD: jW =% {fV$ZK88K=HQҽsr= H\(pPq{@ /D^xϒ'{ e-%fA}TF'^Ħ/ck^zŋ~Op^@ۨYm.lA^Po֋WG}TF'^ƦKҥgAw?6=! %HO#Ͻ_ncwwwW^wW:>*v#dHoTju_q9SL>lf H/2#m"Hɱ"="tRj؍y`>S$L~  .^|iw|]q~1yRSZFq%=6Ely1L~:;t{J^鬍{'xE?/Hz:8ALzJ^餏{ 55ƭtjE?fŇ8]^hM92&;|v%@pCSܳ7'Xg瘛й6B:Η =.tx?3V̤t#3T%Mkr~c̢ճ+v^SJ'} 4I'Y7[l귟_{O+5M}X(\ݤCtII/eٓqgW7r`-7&7GgF̽@tg8ݾB14oO|˾(Wή(symzJ^餏,PH/@{\X3YwB7=2CIo{ WjZ2 {J\{nz'LzJ^鬍[k@zײOwWgy!}׊2i_FHkvw/0~y]'ZH/2]Ggck߇ZJMs_+f '^d?ɓ'zĉYgRJgm'ZH/bS.J=q{AY3% H/bS.Y)Wm=qA:HemsiX.Kz /VFY,:K=HQHSZ1$%T%$Ш@:HAz.%KAzvs)Y"s+Kt]\JH\ RD: jW =% =W鹔,NU>L 6Y^Q*RXr RͨX˭/0ւB 9tbXPA:Hj(@Zng#z+q$ȹ[!q ۼqmӽ[7# H"!F= ]jh;AA U6>E[Q9U/`cۼqqz%AzlE~| >Yr'EID:sυL9H'իW\\8bm`%2L U-J:i /8_ISI_ܻ"=Iϓ{.$fNOC''UΤ%$/M>ϮEJS* =ϔ\ժ Iy1L~:;tD}]6=g=3MGz_^BwrGH砧.Rt3>SBsU6҉#[~t&*sd*MwJ~d]uJ#=FBxC{H3)3;<_Κ){!3~|"qEz܇6t$\_N?Gwg1~#WϮۉ˦T"̹/ܡ՝ºggt귟_潯˦Sb+m _!bl.kctd M 6B:=5Jd!=g #whu+#O5"wwO3cHIͷ컁~슂NH?WMOD:s6ҳ vOg ;7 %}4]tÏXKD$Ў 3Ss;tvg\*T"̹m H'sX eV"s_C Ikvw {sHhӣ+m ңI9#8z*{ZT/` Az@z$Oa~6#.Rt3>/,Ee37anA:HTkws =Ek{ QYSւB Azl*rK8Hb }uaO{j-Ff-qaacQ1nK8Hb }a6zhuaaӃ@ ҇ҷ @ܡytq@ >u = } 3|U>S.:@WS_AVq@U5+U֗pŪUAAE5HoX˭/6ZZTQ>j =J5EK&ݻbEe4njQ.қQ+W7\(H _It>˕/tQ n\yܣ[k$pSFqY7( G"?HKxg,9|':/bg,pHNGS2/'H%K_׮/>6#rK%'}DbBMA> ǒAyY&^*.jyCcPS҇*K/]zq'~JMO)Ha#Ip8ԭ&Ӌ%JCQMO)Hz@z҉⨋W&ӭ3t>TT 9}ޱ әy_s􈚂66Co 39L/^|iw|]ɗg ={“15s'~9K>/WV/^g6}w~˗/$^,t>TH˫WNҋ%<9RS>W3 %8œtd3}Lűɸ] /$<9"!H9 ƷCge|:#~`߽ҙEp> OԦ/tnK /~9ϯ>sY[zv%@N X“)5xC)TKcͺmڥM_NN)ϯ8@@#WԢooދ%<9RS>}WJz>To>ٓqgW7r`-7&7D$WHt㷡J l;O3NIͷ컁~슂NH?`Ӌ%<9RӁW+1TBKN4֝s aP)ދ%gӍqCc.̩jr7מ[~`gI';RH/lzJMAzh+"}hNwWg=" >Z6JzlMAж #]1 ̤#GNhӣk API9#8z+ӾlOYKţl_B>æG?ɓ'zĉ3rMO)HC$=%y Lxap`݃ҜS >ްy9zt5sH_2/PjZqsl@Iem3KY 9s5qY7\K\k\= =Wqsϥat@:HպemsiX.sqY7\K\k\= =Wqsϥat"A@zw/Q^Q*RXr/gg2HooFZn} T tضUJ$ȹl:lz>W3l:lzT!lK8nE AzTe|{tKc@:HN HgVAU 1Nj8m [M/D^xϒ'{N$%)RJ^\=#BææG5>◾L]{/^|mF> JGzB^YH]uXAyY&^*a ye! `Ӄz K/]zq'~JWaӃ(G~qw[LKSєrysp tӣN8݂+xj8X}D.=o` G5` IkoN_w, =w]G䕅tO1C=nBAgB^#_6'< aCw͵V;١w ҋ%!%,æ0AiG)$d}wuV+aѓI/p y"kق@MIkvw tsHIR&a?y"kْ!JGN!{E-b2Fz畅t̽Q#H$ ~<̏'O>Љ'LJg%)RJ^YH8=AiHch%jao Bs =@ t@:H8(HBn@ ah(/P3K0Ad AzXHIϕH&U֗pŪ{-ur¦æqP @!7R ҃0G8([  ҃)HA#A-HAȍ*[Ps?}B(PMܨI> UVI> UVI> UVI> U`4IENDB`X+Dd)"[  C pAXprep_review_02 chris r jennifer 4 Annotatedbp**;FS(:sݫL*nD**;FS(:sݫPNG  IHDRGmPLTE¦3   (t1{ 4&>} """!! &((9(A*C'(**)!)(2D0B//11//>O=S899BAYBAB9CBBBJJSiQPRRZRZYapauabffcckpjjhhuqq}yx~~{…ӇlqsǍƔҋwz|˖~ҝӤBFͺֽഺIJNR#ŜR!X)i̤\-g a0nը͉֬Ȓf5sw q}ݯπk:~ ١{&2AOALQCcYZZ %-0=)39IRAZcBNlUZhrz)1<9ZbksӁ׉BUZct}܏Zs|𠠤|޽bKGDH cmPPJCmp0712Hs&IDATx^\G}UBErAT@H$ʺfk9|&"=D-! iS%oA@HB&XŲBi]\Jj"Mp,'N#H vk#rwf{|g̻ݽ7ywΛ7|g;鬴5ЩDB[+-G-1jst m ր(۰ZZb@QZlhٶΧ,Ͳj…3  ^ɺ:oEu}ڞQ:HYV%B#3 LLk?mU>%3g0;[3C <*Ff/=*f$nL(_Qej`(kȋˣR$.9D4M%AN3|Y2UmiD H@![C^ 2FJtBT)Mi"mh?Yj{}#D4qD-"쳼A}e~m약?U,-ьKV$O4%%%վ_ U1Pxh߰(x*3DŽWwml5smhk tjC[5sgmhk Z+ͨ# ӆkn=i<׆jEƫZ\R-G-1j#eYr^Q6IO{efRrzs IoY>UY5ƑG''i[H "!P&ZjnB9fnrH pfZ]|Z9}q<9:PՋP-}ƨ8rCqԎƒ㈐Yejk ?`0y *!cr[;d2y Z+U$~-UJҝNVbRͯqa^%'=ʤLMy>eC%roJ$#qR:wG*n8&FRff3ž%5物az*mRbL1KD'⒑oXf T}gdU-Dl*?l"55^vLzhKTkN6GEJV/0R=V[H|pO[Z]k\Gq7L O X>3* $D!5\!RI[Hmk<_b]ڃ>{=|<.GF~pmv~PĞ$/ fb("ۥ,\x…ϝ;;}٧:w ]hx21 zLER~MoK'OqFOՏhy kQ7K^PDv/_=GIk$0t29atS95rwulX[B9j.Hufʫd_ɶ}>o;GFqlZ^խ-ɟxӠvc%P4a ? yK\; qit<2G$GH#Q-Ƙ#љDsK˜e RuZٶO.. GF'#Z^#F@HaT$/x'z=SC"4rRˣ:c+wd'?u܏8ڰaOذA Hf[ݡ:36q*0J'7ŋ_GwG刖rĤD<ѡ`(k rqaV[F` T($C\A$5ֶpw+yH`#w^#Oi9nXcw'Q֜#h[vf7m_R @`, HC}ctGv[ӌ#.xQ-/őGWWYjNq=[(FY][֘3 s!CF0Gȣ/r.\W~co! F_%G@>W8([=( wG\ֳUg_صg3˝P (b#~0xq18_+6G\}X\hy!E @9/.lb gv5ŏ=wZ~,!S:P)2yuo^2 -SM' F>_epqD/@-/D<Y˵K]Zȷ\ZgB#\+Rʣ/pΞ;/xFǎ}0*GtFC/@!D\m%R|#RHzg7)$ѯ_ύdat\`#R^##IQc`c+ 񍖞K6C=fqNp$.DS[|]Տ>"j}qGLŖG2vta]1_A%} B29Ϻ2$HW=hG$5^Kס53[OYkJMoD yC?I$iRWP,1(%7Mۯ ݺ6XbdGW&" ׏m We˰-j)lMg4Vgk9Z(ȖO3y8MG*Mf'9$Z&#[>aMƶ1VV&[>1ƺI|N]4k9BzJAW#-A1&<=:iG9!?#\쳓}_fyc3yc>?Flп~`4 [ɶ8^sR%GfNp/'q0؄>^8s|}{YQ_ێ +7C7׈#G#KPlGxqKM8#\ E:|DH+ƅA_4 0=gv+?سgOm`}W}5cϑpIޛ.9ҝ@UpTrL l}%!U+G9lDSe?ww?,rڝ DJy~wƏ2GPؚ܁7\nJ!GNU*׳; /:wR%7s8YGGZDSi?w)9pFQ‹f(Nnu;vrm3 |8D"|h4K:44چ>Ȣ㈗i[F̢՝NK{l0n >{l**d7saԸrm'o7,P"TK3ύf*AZtoʼnln/\z㈗q*3`UO|6-j=*ˮr[WAq䛋9Ew8e8[e&]u,ʣ]y͛_|MpˎqK6\u\1z7umz뭷r{oo7r_~W_7_v_?ν9rgge;Ipv}Eʽq*OYp##) ㈲gƲ.8%G>z9왱*g;x>SHG^R^捭ׯ)GUf.&G4R?jBReF9)]ASoY `[j#=3uKMr.4YF=3qh ,\Vvy&8b&[Œs!9G^PlCԹbi8~Nͺ( JHPOk=3ٹY-GnPlP$E8 3ט?6-wB.RROkF~FǞ#_-b chlmiMp HmvhZq˨iX5.Z+e=ɃN:_nn7Z"F h#yT#nΏT,#cnSYB>mv?x<4v;q*wo9Xӳ$HY#=d^l`k>yB6?;oPt ebXʗF)0*19Z hs IK^àNz\.,ɑs!{>BYAH! 1F:.ۭYZյůQIW∹TM#~ÛWرGQX~mg>V^ ~ LˆΑ>F} ~FSsĎ`]P\\L4}Z3qBG0j#;m/GMzT),H#1,pDr?O\ c?xQٝ@oܟL}y0#20-uIY#sthHqQg]|eH{(X ȢkFe3a!Ic0x/2GGÆSr?G^NՏ\>O|ǻgr' o{= ~qNM G+01䮪K.رp0(ů&cHsh_:2UkeYgdc`_j//7AZ>#~8&fwerk#Dd΃#ٵ^QEF Q!>JƑ$ԄrDq2-@<5kAh_y9Ƙ,\+V) 4wqj6#RpwYeI%I2gSΑ_ώWqLA9J(p7;kcɋ#sVm3loF|엥w,.^b/^##P:~'?61m(ޗנ_;'hQTƕ# kC"v Z6a&68fb8m,"'zb 39y9BI Ҳ888fb8Gد1y$9* qǚ#l#'G} = 㜚eGQj>4OY#czYy&9@Z zoe?CT*# ~i E3R•,cQ~A;?=[{bQa/Vx4ͳYy&lѱť\Lx}zyHz㎯~D~G@rlN[Vc]|bUaBnmQ۫L&jdQNY_>-^Na6MAZ`+ en`ͦJ"հ |ڱҏp6v+Zޗ#Վۍe[yOҁQH{Ss]Q];٬oER-Ys'K؃!ت;%*(EY)mnJa&{Г-j=+k#cd7xs{G=GyC={ec `J_WB}3pT+%cÑ㰝6zƍsV~EWB|,3m:n.$P4Y۱Y֓&:mq錪VcZ8Z^)$ҵ[1x풪HDw*GBӦǧ@s_5GP=|$r~c0q0v߳J97aa;1r7EGWEmrc q+Gd*}'K0&mFkA=}lX%vCΗK.9Uˑ$MnO߄Hnϝ-#\\SvwO6׽<\a;гq3Zv}wM^SΪH7_+v D+ȣl#d mG_⨕Gmnr{&KTJym(@tkҒOz\rd2y ꬂ#Ɣ=(t,HP5oHJL3'Gc)H21 d܄ggΥSv9wǁ9E.s'ѶZ~xb JR["qB^ѣ[E U^2);?Kz, 6`@v 0os/*"@^  n_ +~n~h8"qߍՀ: rfJeyc+d|$x2*)-/-#Cww A.BUF!%I_@$˚rU}7 4VWDO5=[n% ]>3t v_1<ޮXl@8 K/iS% g0!__SsC}G龡{ٺYEG:T-\P2<9q pOOQ9!rc!de\ot{.-8}|`qbhա#շM$.h9vq~u?z.`  WT 2(pҥŵg wptieD=-٩t]míwXfG,u 0t B+uBt*9d||C5EE'.3),$F2oO{Oyzۏ=к|'h.3{J"+=b?K끘]90FS#]m~ms}i@̕ѳcSڶUkw  Bra  >!/5 UǙ_AA_NH3!vzr@Kkm,Y'ىk{{w @rF!@l?>͞1]3]OiH @BZMRMm鏗ސ_]~rux_Q}Drb!TV gɾ_{叟,v5+ϼԕT|h  `3ȕ̀Vg;jgًKGGxnyJdpں<@ X Wdk!]C'0[Dmr ?,yA_׎nmڶitQuyYyX h  'pn![ "?j=FJhNdvq~٫[V*we;fI]}i=@#r%QzWNlonj޵eLQr%6MEHyD*8 mR xˑ+R5dU᱑ \I$Ar ,Wl_O~m9 My Vұ?T7JW}aݷ=^p@Nre"Z:-h&*+t\^KG.~*;^Thْ;V=s@a9ɕiFARHCSoٛOw̝{V}>W+2e!A/Jzd%}P\) t`V>&ZE-z_ݿxTB@@\/tc-Ydq ,'nYx~}U,+FVYXK\Y>x,d%@/ WN{ݟÉSid̦p^ŇB3= rfՄJfVplw<]ؘCbgskEr|2/+̦jJJK ysU0 :k;*ZbބJ%'.4s/<<;Vdf`76&ήf2>R±ڑP!ZW=a+10-/{hcQ7k'G/ģ3dÜo`vf, ]IS~KQ0yĄdb`,5}MӲ=]onbYa_\sq醟XYR1Ąg㲯GB`ve_![0ʥdyuovTu^PRSѶGNErံ.0#WV-~gܺH]^5L!=>3П=q`oϏW6槣6է{g2:J*b1CW0\+R?*@`KDFƣ]=ں}ZߪfOlM޽dDj,% D\ uc ѪO?wתOIc}mDcÑء=;?M6b4S r%[\3t v_1<ޮ#+vɎ..AQrH|b00c@R}M c7WIfFKwJff<><6RpAh/!N?+YʙPT}V`cL(wmt:q=Oo>>081UKБ&eO;^U8iu}b=}r+:PNiAxv)?.ttXxab]C.l}%;m֬Ț%Wv3@&f~M TCViW܆I[%\4 1BJR]AN E3H*ϝ@ -V,[ e)U`  <br%=6aBF  +{jwU <{ǭM4!kr,.Ir B5E vgy.: dI1ORL/Ҙ\xnkː#RЙ+m A[;]!9;D$T]bm!ƋU _Yw-=HsY,+D!&ko)ZOTh9u0;eA@,&(܁AreUbp  `ȕT@@b+ WvPO +m qIENDB`1Dd `'YY0  # A"b(1j&\HD) ;1Nn0j&\HD) ;PNG  IHDRRsRGB0IDATx^{UuN$7Sދ(|csK|^J'@) UXS^ ?ԥ2zrpHQ4 ,DԐߧ^ݫ{ukש}z[^{¶m  zXP@< PC| J @?N P o;~%|i +F!@@O -Xm╺ @[d瓱?ZLK^e?ɣrmQ@u .IFgBWt:fժ\2`I@U&+qڟ @0/>2 y2?=o^ueIъ,ZTzw2ZM:6+ގ^hҎڒаU@Ax}_|*˭߾/W5Fg#M )Ru*>I)_>Vodsfz[ -s,`G+Q%&%!TPq>^0ulЏޝl7~*ƔEFߐ+m4t&X,Uu{e0*>?-w<: 1  u_316Qo`_ݝ_&_/# +^Rd# -)U6~AǂvDzw#;!Tǝ.xW'5(_јQeF ZH>QoEWsUT{ةu'QNz{#(|n*J`SQ:3,w{zmek\jlѷBzmYX94ВAb#ȝ !& ]w?川wB@=ztDk/:q@fOloeO-@@>x҂[bsdU>CFf9ML( @vUդP,oo' @ 7X|n4 1E;R B'< N)!@~ ^\2n/K; @`<\_xq3x!R}zWe!yJB O` ^e޾Dܫ'پ޻?tNWg| @0j:o@:@(/n%m@,7v4 Ԇ۽.O B+ފALG @Ⱦ^0!BU:1nO2GsA@hs3FBh22x":& 4?{|?>Qpbwwz^ը+D[Z&a]Nn)XB/%ʝG5CWҩCO=L7x9 hLF9N]t$PCCpϗD2:!r,0|DG&q{>ufIܠ x:I.ŘN84CLjjYc)Wi̘ĘR"]7_Qb;(x[@ﬔ/'A>]!t.yR-qZXݨYMrL.e #0*zhO{3J[w+x% ²"g}gy{=@jry,F U PF-Y/(m@aL7 ݅ q' 9ab"url(SPEY#/vA %!@:f +0h)g1e4ȑCa@Qj_C|Yt렚¦cvvs ?N,8υdr#FEr[e:3E*6!@%@KCt@uP& @d\/;z^ѳuR^|6zz8Ʃ qSЋ렚¦a"10Qa^Ge:#:iX5=kwοvr> NoHj AwR]]oE`'.iT$n?P u8ٺQZ4^65 k2u};;/ڝ֠euZΞ~ˑ~~2n ,qN O:35{Ӛ"dK)͙FՂpNUl _f7"Aw]n"M+ ZK7ZE#E25e-9ҚM:Ju'ou\#M`؄( /9[SNM$bssq=nnrN^ns]w^MO[v@FEvW+0[g#yACuPMaSӰ뱊/\zm\H1NDku'mTy2E_E)ٜiT-7S:jSvݭK,z.㟭cOvf酐iy!ꋖZ& M筬WqݿGsix6kׯXhurwWݺI4*2ZE:k$>I|K^^DW+~?/?Vprc~/uw;pG^uz^Ku)w>㫫iTdv u4#{:Wlbi|ȏ 4NWn>$\B,Ùm=F&[_ ̫S/V\~emAu/#%4`ZofJ+o''꺻p&*VR-szz!×ۙK>,Q9|N0'D4g[^ /9M = VYs ^<ƻIet;3sO[KξX7_YڻJ7W3NWm{sb dx$q'r^eIXEw`!;dŭWv*z}̻& AI tzYc |Pp3yn*#Z )lMʯ] Z|.~$k7\x0=" 'P*g9ָ7<ˁmgGnxb7Tp_) 5οtsU Cl7Vq!}6Ԋ!P޳Smz/T9v~x;6xCgK.%o֯\ԇVȋ_ Uw!38 PƣF x3z^ndZ# +r7o^ܳ}ۦu?ӝѫZeq!GTBT/;B߫1%ef_&>Fټ$,޳r<35wlY}x4 `hr:9}.JglVdend-y_򱛮d#=~0u}y?٣ci]"l5|^TuD A5MMÚ ^`Uw:zsD8@HOOό  dN  T@1Ԫ";vQjXj<%Pa/<;|sGA@@c 0E;t=/- Ilb0*r Y*SO+‚x5y,K25ȧ%|vBeҏg7Nq}];U+gPk{3NoVg۾mlgk;kИ/n\-R$Zk8-&.fWY7)HܾMA}LogS}x'}Mwgg;V@s|Ԭ/SbuK冲rWZ][I?gf-銗-^;'&w.|u|WgE%ouKo\j=mr꧱rBF }𪭴7s|oܶEj4Skfa5f}M&FH{1 0$@U! ű%ԛ_һ@+2Fϛ@- #H͈^@!3 ®h x̀1 oX鮹xscg F߮3͝0YS"ԎcHAβ639%>-4C`$T5<)@z1cT?&$Xzج??bj:cv_ǓDD5?9S$)?~LYdpl*fV]LfQ(ŕdtJԳF|GuX@@Tʑ#`6ZʛBi6̒_& G&bFuu2]P/"%Ev*koR"@+wʶZg0h{܌oT Q <-X Dv硷 (BFIY|8|Att$(DC%h6a*.3PTjI]v[ u7_cuumkۖQg`uzsEV|^(E/t0ӅBmb w נvR3=F |{EGIVe:/1*"> CԞxcHI'iTB>&L>z3fK FKLy_ "yu( -X[֠euZΞ~ˑ~~2n ,qN O:35{eGר%x_z'P{ z;3PYoZ&[ LT^aՐ/ 64uMvmi!56CgףN\cS%(<4vAQD$flZ2X <2̯4+tW&]/\jM.u,Zj--MZSהHkJ|4|*] $q5xO\t&d>fSZx KS'!fMJH>AIP#yE6r'/Sk`nDWSyNM$bssq=nnrN^ns]w^MO[veptM](t٦Q(ݑٿ,XL/w mŻ32QSQspy;C>t!8 'i57?{vIL=Q!H#գk:Vk|+DNOv?1p]g>߶{N)QQsM"[d9}p|;+>effQ817X,TVUڔD|t_B<;z*&Q|e;_|>OB  VOH/t%A,~AO#zt(-[ok? C}yaHӨ|FR+>ӭJ/B+,'5% >K+Q ]u?ۃ{_u$/ EBD뾒:ܙ[d ϢO#y'al1ر>#׎<Κst=PbsO>gSk ?-gm1w[?K躻#~vxfE.]~ ,P$q5VYDA\dIe P T?*ʎΎU;7~̶^=T~ՙ?%0+ ! Wu9`=r33/_vC|ɇpuWʩ >@]H$؄D($<ͥ7W) x|MUؽfm~̭or2kׯ}uL\;\u/q6cRxWw#QSRsٷ>9xoOp-jlկ>1++cTGa zP唻O;ݯ#j>&IF!S;d债"_ڹgO>|](SG wQldQ{|{*cSSʭ|y(gQMN/F0@nSBwcBmNأLεsrr?O+ϝd { 3I('$#fٰHN#&2wxTxOszd'Ju߸ia ^_`|㮙w݇kڑ# 4dDnfjJ2aQPּIܙ P! {g/;1PdwUrYu-wlח\K_prwn0zr~Y՛AHӒe:bF9X7|={}N!5f3fl1Uw/X,g?xfj?~3򥳆.yY1B{}wijy{N3\z99ULr5=p֓ F @F7Y7UF_Y\v~Kfђ+íG;h3pݥm z^=@|Ă*za^~ΘbQ,x 6ソw_~uT RϨ8 oBKA78fǾDZwRǝ%Dkq V]pכ{0x?p=tpӄBm{R.8s$PY@ T#%%M=[hݭ֌PwqB # M"?ҔGGR@+C#u2y{ ߾㼟сL i gxnV؇@ U CZQtϮ{mr3.v{iw{Ž?^}Gu0M"ۙ3lQ 'KKFe (3xpu'REXJ:io!0LU7i5*e]Fӎ7j{j:@%K+d!hԨ%I;ecILE>õ)yDuPMaa.)Fs},+A)zT @(_rh *6!@%@KCt@uP& @d|y@؄ L }%L P;?;U3}^j$@(Ă3JK& 0@v#-SMu[N,@ħ?pza鵇;ݶm9uV7Wmg;).._zkw;E޹slvtO(I :eXZ|3R. P+W-XhwXi9{-G=-o[ȸ539 l5rk}i p%^/vu,r1-/D}ђPuWH>m֍|-7m EKmAalWuΥ_?w~;o7Z]=-KiA*zsFE=F*U4TJ_Z{5E0|u^:p kB]h|a9^qiwUTC"ĨWӄM{4Qutk߲֓{u֩Y+vv_g6u]ϧ:2%_E+ ׌_&HY Q3U(w4>2rU]gnq# Qj?tɗ|XZWw* r}$/E[KQnj,W+h 7fE6*AOnR/Xue@WR'sCrwWmJ(I2Wٱ^,ȒW;GP%jyڬvf8d{Gt;p_ܺ{/k[P݇ϼ3xGoH X-VKazƒ0>;d )F~n;vs'Yu3dclfasV˫i}3#Y sӦU=x#+QsPĄfVNfc)Y߸R7n­~W,دlίiUAż <+M F&iQϏpgug3ܱ:__r/y|coo~§>B^tp^oPΓ exyݷn$BK&> y]W3Q^xܼuvf˓[l{qm]OwFVmF ^s$c/Y̓B46~`'ޡ~ϸ~7ls]ێ:̼?GFwL{XI~.֜1V'3"-@LR"lw柾sׯ|+-v5u{ϱ" %@_re 4?kǾRpZޑrD97X-w]o8Y^:'x֍"9|Ocd\0VXqxa#]=|BK f82LG{a. >|JDk(ɯ]{:ƞKoemr_S Ww>{G_#%U3VJE aPvYE_P@1^']lCJ"}I5jJ\jE#Pn j9#l;bJ@KFPe hNHxA %!@: :b P2< @@^UlBJ&  렊M@@_4@#nrij B ;sGA@@c #  @||1@@ܑb P> @ w|H1@(_~  ;>w O/?x@ȝ;R B'< N)!@@ˏ@r'T(\SIENDB`DdQ' F C \ADPREP_Review_02 Chris R Jennifer 5b[܄TG$4]&tn[܄TG$4]&tPNG  IHDRVTPLTE¦3   (t2{&=} ""! ! (9(A)B'()(**)!)(01,,2D0B11>O=S779B;;AYBACBHHSiKKQPZYZZapauabffcckpjjsqqqq}yzz…ӇlqsƎ΋wz|ʖ͙~ҝӤBFͺֽഺIJO T%U&Y*iɠZ)g a0nӨ͉Ȓf5sw q}ܯπk:| ١#2;DMAM=Sc\RZZ !)0)3=HR9ARZaBNgUZnu)4>Vbks|Ճ؋>H`t}ߓVf|𠠤p7bKGDH cmPPJCmp0712Hs:IDATx^WuJ[ DAA@Z mZڮׂX/ڒBںl[QHlT0-MVIvNܒV N&r,;q;iQ6H3ws̻L~;sν~{w 䛁|F% A >sn*I 3֡|~ʀgR_AħgiUO! 9mV |y94*ht:Gx_83ۊYlYS|*tn^QtŒ?kM9#+GŎzaQh\eʌ3*wfeŢ2ުX}g+CU'I¨(_ڡ7]ԝ*7y gϦ1M2Kw!|B"JKCTrUM=5%"@ (dz>U{ޗV;⇛39E?y wӌX]e ;cz_Zw+ ff$wS\s\bC~+4%>K8XTQ)M|V^*~ţt̑f_PlϏA8: A8: c@{RY e">ELOLȶ }ga2Rj님ڑ3 O=E,$φOR(_~kl\2J.Sk.rɥih >B1@n|)">`>f򶾝PSdza3S}$H>)O/Uy ȂOWI7]֕f>@P 2 d'H?$txAZ裻?9YF*Q{FJ 祟=$Y'rnD]}Lj )A "QwN ]UԲܖ.k63]OӼ Tfb!%e=qoTgUUҽqc+eV1 NxneQHB(Bz>5mE.y']v`ZqC^ ֞PZoQoDrGf+C/Ӽ4DrEbeľ)Z+ouCCA.~֮k%ٖ>;9̏ڕc-ek7{gH.>SOLCĵ^6!?K,TYaTWԃN>C:=O,D>{$1A?kCm}~Ļ5.8i~uٻO!­O;Z1rtϏfLxK8$Y@ʣ5Q|'t0k ZjJF|1J֐Cj?ywe'[62`GS/A$ԓ9U|\- R1 >MNO߄+̑=f18N; *Us<}G?;g?Nh YltuFǪ+/K_'}=.i;OqJK/; PNʣ?C>πXg|Z|={ =Qwq'?ymi\>bC>u? ?O; E|Ϧ̅'NL*@9'?Cbd|l(8&L=O>ϐXqd 5/O\$(+Ӆ|NJ籸XQau4hȹxZk q|&Ͽ|P Sc OgahTץ 3~ f]{qe ϣq3$VD>%!&g5Ha޿W\gJ?.|m][/">-#&SGg8g ϵMһ.{Lz=ϐX' _ N>gL?L <{t'3O7_O5pD?cS4! xNk~F?ه~[+ σ O6F B,d@K^18wCb.v[@Ãhg-+ǂ|犥J=%j̏^.gNB~=uLqVg3$=Iw{uO!L2;nOǭя~qKqtS\>CbD?]ÚeW߉O }uv껍H? /uc"TX+z jd 1N|0EtG'@&ifwMW$>1$>1CI|y{9A 2cPҿӾ}@W~TdՂEɎ5a4eBxFߣ xg$q+,7'H&uc:+ԿZt\1GI?## gR|7S`* I|b.1u?sǟ Ђ\'44rZOXħg֪a|~Y%>M>V gmFϘ3n_WV }--H?8V Ӳ|_>u奥/sq?څ[7mڸ??l[/{׸D֪|Z] ދ}̙S88q;7|n۶y뽣z[/~gǗM;Ol[زy㕞NgԿ2+4tvlg'}̩'bѿYj~eg!7߰񎞏~&Y0U[?8{,}{» <ܸ O8 >[q o\><[kؿ~nݱv#Џ_aPKy)+~)é[v:ulgt{7m&񪟁icYY}8ӯck0>}Nj3ϜG/yd@ . uٱj}NjxYJ_fB_/;z#\I}+z^g[ٷ~..-x.Daօ[~o+.'s~][1_>;V oy򙗫Ϗz򍛷lټzť굾͘M۝nZ5Ͼs/,n[Goظi֊WOɧck0>Ϻ{bsO!As7z;7k.pW_u%\|ww{יo֪a|_~߮ݻw.oW민7_WjRB|slg/Җ|g@HTȣck`>{ċo';V gGq!F[S}%>ï2dt\~ďd5'(M#'Q|΁ fC|ʑϲW/SG̈́,d @u (qիYBS@tw՜A 5dy&pq 4c;$I qzvyx8/ J(YC9.&E'|>ym6Aurl&Õ)!YhE$>FqWzђ!v w'UFkM@&'0Qnd DL-O5u}@ #؊aj3[d=Fɪ*JщOPFmT \9?кc،ם%-'zF 7}hZdaJ/Ǎ>ώ |u=TGtHI#hl΋,۹s?2_Uo|e}ei# s7&U,Rƺ8ë.)i)W EUzEHOS2[Mv*ro§z! B{kD1%OB6EAe%"Zyi=(>vE:n)3oް;l DF`sZ{.Ǵ׭Ruk!~:ʊRr,Q_wn¯2Q!t;>)N@iO҆pXR U,> N0KZ]cOEF6uZ\P-{;jt!s#CSP>%1kZ󩹌9qp%S|D1D/A8/I});CX F]&Vœ{=8󫎟|AK?c!$Tuj.H>'<'FIx\hp5'ncxE᳭ jvO[fjw>;8t6 j`.,h'͇d[σGC"߲p6"3v0|V/X9xMLc$WX[jE_|林>Tв8#N>ϖO5WK}I[kCbʬR#)ިjI@_Pz.+'6dG[#5\z-N,[A>SWL:8g5dA0!mx&.5PhRR# Wz^3Wl:5>&{/tO (.|v@F6Z~VvۦW 5KUwL6?駘;A{wl&\eҪ}+ _r)tXJE OpsvcH|"kr_ ~~m1RQ"3u)Aͼ϶;r1JjiSQCj\-bUyřڌ,H|Fᢛϝ[]]Pؑ8X Om dP|:_Ezϝ>ɓ;vPσo {vUӱ?`4ǟ&`} 1| 6EΆrqܾ-.ejJwt'8ǍO!~;+Rca- K|S$ħXA|Ⓡu]~uVN|[62K8'@Wifw~; 1RIV,~0!UodkĴ?O¥i ƈ cVV& 1Cx,ߑ) 2G+ǎMn5S 4XC/!ܯᱎ"gxX9Ѳq|O& t2<ر-8nQ(pbI JɄ&cP=*~ G?Wt\X=Rhr2 iAVdhz%>l)49dEA6h M|YQs6BiAVdhz%>l)Ӈρ$IENDB`KDyK yK http://www.microsoft.com/downloads/details.aspx?familyid=CAC3E0D2-BEC1-494C-A74E-75936B88E3B5&displaylang=en}DyK _Ref154463718DyK yK http://www.bluedoglimited.com/Downloads/pages/Web Part Toolkit.aspxKDyK yK http://www.microsoft.com/downloads/details.aspx?FamilyID=4b2c2f1b-d74a-482a-903a-45bb44c5dec4&DisplayLang=en}DyK _Ref154463718v$$If!vh5>5 5#v>#v #v:V l655 5H 4"@@@ NormalCJ_HaJmH sH tH Z@Z Heading 1$<@&5CJ KH OJQJ\^JaJ f@f Heading 2$<@&)56B* CJOJQJ\]^JaJph3fb@b DrV Heading 3$<@&&56B*CJOJQJ\^JaJph3fD@D Heading 4$<@&\aJN@N Heading 5 <@&56CJ\]aJH@H Heading 6 <@&5CJ\aJ:@: Heading 7 <@&@@@ Heading 8 <@&6]N @N Heading 9 <@&CJOJQJ^JaJDA@D Default Paragraph FontVi@V  Table Normal :V 44 la (k(No List 4@4 Header  !:O: iCampus d\$OJQJ`>@` Title$<@&a$'5B*CJ0KHOJQJ\^JaJ ph3f4 @"4 Footer  !.)@1. Page Number<@< TOC 2x^ 5\aJ:@: TOC 1x56\]aJ.@. TOC 3 ^.@. TOC 4 ^.@. TOC 5 ^.@. TOC 6 ^.@. TOC 7 ^.@. TOC 8 ^.@. TOC 9 ^6U@6 Hyperlink >*B*phFV@F FollowedHyperlink >*B* ph:O: iCampusCode \$:O: Code 5OJQJ\^JaJj@j  Table Grid7:V!0!y"z!z!z!z!z!z!z!z! z! z! z! z! z!z!z!z!z!z!z!z!z!z!z!z!z!z!z!z!z!z!z! z!!z!"zl !q*17}<oCLGN6V.abhvqzNsK '|ƴX D8kL Ne u u  X yv,LNFL !GHIJKLMNOPQ#:Sa F[ !!!"C$U$$$&'O(i(((,)))**+++ ,S,,,,,W-.5..~//0D0112\223034&55"6366677777777777888!848788898O8Z89 :":3:A:T:^:h:;}<<<=6>O>?@ADDD.EGG9H|HH;IIIIJKL6M=MMNNqOOpPbQRRRRRRRCSSSSSSvTwTxTT6VWX1Z]K^`aaa)bgbbbbbbbbbbbbbbcccccccccc}d~ddd@euee,fFfhgij jj8lmmGnnnoovqqerr0sSsTst t!ttttuuuvvvvv www%x,xyxzxx/yJyy(z)zzzz{}}}~~1HIvw*SopNOop4Ndž< $=JŠn{Id/0ڍЎOPS+ghPQLMOPŖ ~n| $9b{œuȡps<OPtu()ѧ,0mZ[\sKMBͭ ^xٯ ^G(.39BIJO2345h>ƴX;]o޶ %'X̸-z0Z Uϻ-ͽUsϿb~iCE -P{K[,D. 9[F9Td%N';I9DI:*pan[&8p(8" 8^n<jku67oJ2d!!Y!Y!!!!!!!!!!!=!=!!=!=!=!! !!=!=!=!=!!!=!=!=!!=!!=!=!=!a!D!!=!!! !a!=!=!=!=!=!!!!=!! !a!=!=!!!!|!!=!!D!=!a!=!=!>A!D!a!=!=!a!= = =l =< = =l =< = =l =< = =l =<!=!!!=!!=!=!=!!=!!=!=!!"!=!=!a!=!=!= !=!!)P!= !=!=!!!!=!!=!=!=!=!=!!=!=!=!=!=!=!=!= =A = =< =A = = =mP =A = = =!=!!=!=!=!= !=!=!=!=!=!=!=!=!= = = =< = = =< = = =yf = = =k3 = = =yf = = =k3!=!!=!=!!=!!=!=!=!a!=!=!=!a!=!=!a!=!!=!!=!a6&5&6&5&6&5&6&Y6&Y!=!a!!!!!!!!!=!a6&Y6&5&6& 6&N 6&5&6&4 6&6&5&6&Y6&!a!!!!!!!!!!!!!!!!!!=!a6&5&6&Y6&6&6&Y6&Y6&Y6&Y6&hd6&5&!a!!!!!!!!!!!!!!!!!!=!=!=!=!=!a6&5&6&6&5&6&Y!!!=!=!a!!!!!!!=!!=!!=!1!=!=!=!=!6%#!=!!!!!!!=!==c====<=c=c=c=c=c=c=======H=c==========c====<=c=c=c=c======= >F!=!=!!:8!=!=!=!=!=!=!=!=!=!=!!D!=!=!=!=!=!=!!0$!=!=!=!=!=!=!=!=!!!=!=!!=!!=!=!=!!=!=!!a!=!=!=!=!=!=!=!=!=!a!=!=!=!!=!!=! !=!=!=!=!!a!=!=!=!=!=!=!a!=!=!=!a!a!a!a!a!a!=!a!=!=!=!=!=!=!=!=!=!!=!=!=!=!=!=!=!=!=!1!1!!!=!!=!=!=!=!=!=!!-!!=!!=!=!=!1!1!1!1!!=!!!=!!=!!=!!!!!!!=!=!!f Y!GHIJKLMNOPQx\[ f``QQ6 - w  c  l  o v u*y&0?7@/$w#:Sa F[ !!!"C$U$$$&'O(i(((,)))**+++ ,S,,,,,W-.5..~//0D0112\223034&55"6366677777777777888!848788898O8Z89 :":3:A:T:^:h:;}<<<=6>O>?@ADDD.EGG9H|HH;IIIIJKL6M=MMNNqOOpPbQRRRRRRRCSSSSSSvTwTxTT6VWX1Z]K^`aaa)bgbbbbbbbbbbbbbbbcccccccccc}d~ddd@euee,fFfhgij jj8lmmGnnnoovqqerr0sSsTst t!ttttuuuvvvvv www%x,xyxzxx/yJyy(z)zzzz{}}}~~1HIvw*SopNOop4Ndž< $=JŠn{Id/0ڍЎOPS+ghPQLMOPŖ ~n| $9b{œuȡps<OPtu()ѧ,0mZ[\sKMBͭ ^xٯ ^G&(.39BIJO2345h>PƴX;]o޶ %'X̸-z0Z Uϻ-ͽUsϿb~iCE -P{K[,D. 9[F9Td%N';I9DI:*pan[&8p(8" 8^n<jku67oJ12d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0 000S0S0S0S00 0!0!0!0 0C$(0C$0$0$0$80$ 0O((0C$0( 0( 0( 0(80(0* 0* 0* 0*0) 0*) 0*)(08#0+ 0+ 0+80+0-0- 0- 0- 0- 0-(08#00 00 00008000 20 2 0 2 0 280005058000505 05 05 05 05 05 05 05 05 05 05 05 05 05 05 05 0500.70D7 0D7 08D7 08D7 08D7 0D7 069D70.70S90S9(0S90r;0r;0r;80r;0+=0+=0+=0+=(0S90C0C0C0C 0C 0C 0C 0qGC0.700H00H00H00H00H(00H0+L0+L 0+L 0+L 0+L 0+L0+L0+L0+L 0+L 0+L 0+L 0+L 0+L 0+L0+L 0+L 0+L 0+L 0+L0+L 0+L 0+L(00H0mS0mS0mS0mS0mS0mS0mS0mS0mS 0mS 0mS 0mS 0mS0mS0mS 0mS 0mS 0mS 0mS 0mS 0mS 0mS 0mS 0mS 0mS 0mS 0mS 0mS 0mS 0mS 0mS 0mS 0mS 0mS 0mS 0mS 0mS 0mS 0mS(00H0tc0tc0.70jd(0jd0!e0!e0!e80!e0h0h0h80!e0l0l80!e0m0.70n(0n0kp80kp0Zq 0Zq 0Zq 0Zq 0Zq 0Zq 0Zq 0Zq 0Zq 0Zq 0Zq 0Zq 0Zq 0Zq 0Zq 0Zq80kpH0u0uH0u0vH0u0w0w(0n0ow80ow0$x 0$x 0$x 0$x 0$x 0$x 0$x 0$x 0$x 0$x 0$x 0$x 0$x 0$x 0$x 0$x 0$x 0$x 0$x 0$x 0$x 0$x 0$x 0$x 0$x 0$x 0$x 0$x 0$x 0$x 80owH0e0{H0e0)H0e00H0e00H0e02H0e0H0e0(0n0c80c0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0>0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 0> 80cH0ו0H0ו0sH0ו0cH0ו0H0ו0 0 0 0 0H0ו0W(0n00000800h 0h 0h 0h 0h 0h 0h 0h 0h 0h 0h 0h (0n(0n0080H0b0z0zH0b00000Q0Q000 0 0 0700 0 0 0 0 0 00000 0 0 0 0 0 0 000000 0 0 0000 0 0 0 0 0000 0000 0 0 0 0 0 0 0 0 0000 0 0000 0 0 00Q0(000 0 0 0 0 0 0 0 0 0(00׹ 0׹ 0׹ 0J׹ 0J׹ 0׹ 0׹(00 0 0 0¼ 0¼ 0 0 0h 0h0 00000b*0b000*0b0z0z*0b:0000" 0" 0" 0" 0" 0" 0:000000*00t0t0t0t0t0t*0:0000000:00D0D0D 0D 0D 0D 0D 0D 0D0D:00z! 0z! 0z! 0z! 0z0z0z0z0z00O 0O 0O 0O 0O 0O 0O 0O0000*00*00000000000*00000000*0000000*00000000000@0{00@0{00@0{00@0{000@00 0 0 0 0@0{000y00!GHIJKLMNOPQx\[ f``QQ6 - w  c  l  o v u*y&0?7@/$w#:Sa F[ !!!"C$U$$$&'O(i(((,)))**+++ ,S,,,,,W-.5..~//0D0112\223034&55"6366677777777777888!848788898O8Z89 :":3:A:T:^:h:;}<<<=6>O>?@ADDD.EGG9H|HH;IIIIJKL6M=MMNNqOOpPbQRRRRRRRCSSSSSSvTwTxTT6VWX1Z]K^`aaa)bgbbbbbbbbbbbbbbbcccccccccc}d~ddd@euee,fFfhgij jj8lmmGnnnoovqqerr0sSsTst t!ttttuuuvvvvv www%x,xyxzxx/yJyy(z)zzzz{}}}~~1HIvw*SopNOop4Ndž< $=JŠn{Id/0ڍЎOPS+ghPQLMOPŖ ~n| $9b{œuȡps<OPtu()ѧ,0mZ[\sKMBͭ ^xٯ ^G&(.39BIJO2345h>PƴX;]o޶ %'X̸-z0Z Uϻ-ͽUsϿb~iCE -P{K[,D. 9[F9Td%N';I9DI:*pan[&8p(8" 8^n<jku67oJ00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0 000R0R0R0R00 0!0!0!0 0B$(0B$0$0$0$80$ 0N((0B$0( 0( 0( 0(80(0* 0* 0* 0*0* 0+* 0+*(0B$0, 0, 0,80,0.0. 0. 0. 0. 0.(0B$01 01 01018010303 03 038010!60!680106060606060606060606060606060606060600880N8 0N8 09N8 09N8 09N8 0N8 0@:N80880]:0]:(0]:0|<0|<0|<80|<05>05>05>05>(0]:0D0D0D0D 0D 0D 0D 0{HD0880:I0:I0:I0:I0:I(0:I05M05M 05M 05M 05M 05M05M05M05M05M05M05M05M05M05M05M05M05M05M05M05M05M05M(0:I0wT0wT0wT0wT0wT0wT0wT0wT0wT 0wT 0wT 0wT 0wT0wT0wT 0wT 0wT 0wT 0wT 0wT 0wT 0wT 0wT 0wT 0wT 0wT 0wT 0wT 0wT 0wT 0wT 0wT 0wT 0wT 0wT 0wT 0wT 0wT0wT(0:I0~d0~d0880te(0te0+f0+f0+f80+f0j0j0j80+f0m0m80+f0n0880o(0o0uq80uq0dr0dr0dr 0dr0dr0dr 0dr0dr0dr 0dr0dr0dr 0dr0dr0dr 0dr80uqH0v0vH0v0wH0v0$x0$x(0o0yx80yx0.y0.y0.y 0.y 0.y 0.y 0.y 0.y 0.y 0.y 0.y 0.y 0.y 0.y 0.y 0.y 0.y 0.y 0.y 0.y 0.y 0.y 0.y 0.y 0.y 0.y 0.y 0.y 0.y 0.y 80yxH0o0H0o03H0o0ƆH0ƆH0o0 H0 H0o0<H0o0H0o0(0o0m80m0H 0H 0Ht 0H 0H 0Ht 0H 0H 0Ht 0H 0H0H 0Ht 0H 0H 0Ht 0H 0H 0Ht 0H 0H 0Ht 0H 0H 0Ht 0H 0H 0Ht 0H 0H 0Ht 80mH00H00}H00mH00H00 0 0 0 0H00a(0o00000800r0r0r 0r0r0r 0r0r0r 0r0r0r (0o(0o0080H0l00H0l00000[0[000 0 0 0A00 0 0 0 0 0 000000000000000000000000 000000000000 000000 000000000000 00[0(00 0  0  0  0  0  0  0  0  0  0 (00 0 0 0T 0T 0 0(00 0 0 0̽ 0̽ 0 0 0r 0ry0)2u000y0+2r0(0`0q0q0q(0`00(0`80000" 0" 0" 0" 0" 0" 08000000(00{0{0{0{0{0{(0800 0 0 0 0 0 80y0V2E@0k0K 0K 0K 0K 0K 0K 0K0K800! 0! 0! 0! 0@0@0@0@0(0ľ0N 0N 0N 0N 0N 0N 0N 0N0N0N0N0(00(000000000@0@0@0 @0 @0 @0 @0@0@0@0@0 @0/ @0/ @0/ @0/ @0/ @0/ @0 @0<@0<@0<@0<@0<@0<y02y02@0<0{0j5y0 y0  PPV { # . p L2<HNVN !)D8hBQHLTew~IR[ 2wz{|} c7(3;??@7@3B|PZ[v\ijjkk}lhoS{ ||}~HvoNoOgPLO Ot([(O>F'&x~yEZs#$DWsuvx3;WYZ\|$:VXY[{ *Eacdf   /?[]^`   /?[]^`%0LNOQq~/KNOQq  0 3 4 6 V ^ z } ~ ' * + - M U q t u w  / A ] ` a c    3 J f i j l     6 M i l m o =Tpstv @Sorsu$'(*JWsvwy #$&Fl*-.0Pb~9<=?_x1457Wp:=>@` 3e ),-/O^z}~!"$DUqtuw>?1?9?U?X?P@l@o@C DD1DMDPDoDDDDDDJKKrs!sTsss!ttttuuuvvJyyy)zzzz{{}}}~&(IwFHpOd0ύэP!#h QMP-/Pu)ȧʧ~gE[D[wz TX%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%̕%%%%%%%XCCCCCCCCCCCCCCCCCCCCCCCCCCCCCX%XX% %MPX!$   _b$U~Z; EMb$ʼЈo%&W"*b$%guD;IK6MxTdue,fjmnovqervvzx/yp=nI~nsm\ KK,, 99TTpppaapp((^^kk @ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLM@N@OPQRSTUVWXYZ[\]^_`abcdefgE"`!!T$$h((*,4.1/3267N8Y8g:<N>DHI K._-z_q+sh ^`hH.h ^`hH.h pLp^p`LhH.h @ @ ^@ `hH.h ^`hH.h L^`LhH.h ^`hH.h ^`hH.h PLP^P`LhH.h^`OJQJo(hHh^`OJQJ^Jo(hHohpp^p`OJQJo(hHh@ @ ^@ `OJQJo(hHh^`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHohPP^P`OJQJo(hHh ^`hH.h ^`hH.h pLp^p`LhH.h @ @ ^@ `hH.h ^`hH.h L^`LhH.h ^`hH.h ^`hH.h PLP^P`LhH.h ^`o(hH.h^`OJQJ^Jo(hHohpp^p`OJQJo(hHh@ @ ^@ `OJQJo(hHh^`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHohPP^P`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHohpp^p`OJQJo(hHh@ @ ^@ `OJQJo(hHh^`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHohPP^P`OJQJo(hH808^8`0o(.0^`0o(.pLp^p`L.@ @ ^@ `.^`.L^`L.^`.^`.PLP^P`L.h ^`OJQJo(h ^`OJQJo(oh pp^p`OJQJo(h @ @ ^@ `OJQJo(h ^`OJQJo(oh ^`OJQJo(h ^`OJQJo(h ^`OJQJo(oh PP^P`OJQJo(h^`OJQJo(hHh^`OJQJ^Jo(hHohpp^p`OJQJo(hHh@ @ ^@ `OJQJo(hHh^`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHohPP^P`OJQJo(hHh ^`hH.h ^`hH.h pLp^p`LhH.h @ @ ^@ `hH.h ^`hH.h L^`LhH.h ^`hH.h ^`hH.h PLP^P`LhH.h^`OJQJo(hHh^`OJQJ^Jo(hHohpp^p`OJQJo(hHh@ @ ^@ `OJQJo(hHh^`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHohPP^P`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHohpp^p`OJQJo(hHh@ @ ^@ `OJQJo(hHh^`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHohPP^P`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHohpp^p`OJQJo(hHh@ @ ^@ `OJQJo(hHh^`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHohPP^P`OJQJo(hH^`o(. ^`hH. pLp^p`LhH. @ @ ^@ `hH. ^`hH. L^`LhH. ^`hH. ^`hH. PLP^P`LhH.h ^`o(hH.h^`OJQJ^Jo(hHohpp^p`OJQJo(hHh@ @ ^@ `OJQJo(hHh^`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHohPP^P`OJQJo(hHh ^`hH.h ^`hH.h pLp^p`LhH.h @ @ ^@ `hH.h ^`hH.h L^`LhH.h ^`hH.h ^`hH.h PLP^P`LhH.h^`OJQJo(hHh^`OJQJ^Jo(hHohpp^p`OJQJo(hHh@ @ ^@ `OJQJo(hHh^`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHohPP^P`OJQJo(hHh^`CJOJQJo(qh^`CJo(hH)hpp^p`CJOJQJo(hHh @ @ ^@ `OJQJo(h ^`OJQJo(oh ^`OJQJo(h ^`OJQJo(h ^`OJQJo(oh PP^P`OJQJo(h^`OJQJo(hHh^`OJQJ^Jo(hHohpp^p`OJQJo(hHh@ @ ^@ `OJQJo(hHh^`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHohPP^P`OJQJo(hH^`o() ^`hH. pLp^p`LhH. @ @ ^@ `hH. ^`hH. L^`LhH. ^`hH. ^`hH. PLP^P`LhH.h^`o(.h^`.hpLp^p`L.h@ @ ^@ `.h^`.hL^`L.h^`.h^`.hPLP^P`L.h^`o(.h^`.hpLp^p`L.h@ @ ^@ `.h^`.hL^`L.h^`.h^`.hPLP^P`L.h^`OJQJo(hHh^`OJQJ^Jo(hHohpp^p`OJQJo(hHh@ @ ^@ `OJQJo(hHh^`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHohPP^P`OJQJo(hHh ^`OJQJo(h ^`OJQJo(oh pp^p`OJQJo(h @ @ ^@ `OJQJo(h ^`OJQJo(oh ^`OJQJo(h ^`OJQJo(h ^`OJQJo(oh PP^P`OJQJo(h^`OJQJo(hHh^`OJQJ^Jo(hHohpp^p`OJQJo(hHh@ @ ^@ `OJQJo(hHh^`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHohPP^P`OJQJo(hH^`o() ^`hH. pLp^p`LhH. @ @ ^@ `hH. ^`hH. L^`LhH. ^`hH. ^`hH. PLP^P`LhH.hh^h`)^`)88^8`)^`()^`()pp^p`()  ^ `.@ @ ^@ `.  ^ `.h^`OJQJo(hHh^`OJQJ^Jo(hHohpp^p`OJQJo(hHh@ @ ^@ `OJQJo(hHh^`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHohPP^P`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHohpp^p`OJQJo(hHh@ @ ^@ `OJQJo(hHh^`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHohPP^P`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHohpp^p`OJQJo(hHh@ @ ^@ `OJQJo(hHh^`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHohPP^P`OJQJo(hHh ^`hH)h ^`hH.h pLp^p`LhH.h @ @ ^@ `hH.h ^`hH.h L^`LhH.h ^`hH.h ^`hH.h PLP^P`LhH.h ^`o(hH)h^`OJQJo(hHhpp^p`OJQJo(hHh@ @ ^@ `OJQJo(hHh^`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHohPP^P`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHohpp^p`OJQJo(hHh@ @ ^@ `OJQJo(hHh^`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHohPP^P`OJQJo(hHh^`o(.h^`.hpLp^p`L.h@ @ ^@ `.h^`.hL^`L.h^`.h^`.hPLP^P`L.h^`OJQJo(hHh^`OJQJ^Jo(hHohpp^p`OJQJo(hHh@ @ ^@ `OJQJo(hHh^`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHohPP^P`OJQJo(hH"E!j{WmL_-z% P& b_q+: v31RvzjTKbR,HC?yko[)F@'S Oo9CH=bI7Ev1u@nm=^9)"]Z`*U,|^"I K^^I kQf~jOsbK]Ko '?q0#7777777777888!8487888RRRRRRRSSSSvTwTbbbbbbbbbbbbbcccccccccc}d~derr0sSsTst t!ttttuuuvvvJyy(z)zzzz{}}}~~1HIvw*SopNOopd/0ڍЎOP+ghPQLMOPŖ<OPtu()ѧ(.39BIJO345ƴJ12d@$p@UnknownGz Times New Roman5Symbol3& z Arial?5 z Courier NewA& Trebuchet MS;Wingdings"1hRF;1d""t""t!4dnn 3qHX)?f^2SC:\Documents and Settings\Felknorc\Application Data\Microsoft\Templates\iCampus.dot'SharePoint PREP Technical Documentation Chris Felknor Chris Felknor"                           ! Oh+'0   8D d p | (SharePoint PREP Technical DocumentationChris Felknor iCampus.dotChris Felknor49Microsoft Office Word@X@B@P}@h[m,""՜.+,D՜.+,\ hp   MIT iCampustn (SharePoint PREP Technical Documentation Title 8@ _PID_HLINKSAp :mhttp://www.microsoft.com/downloads/details.aspx?FamilyID=4b2c2f1b-d74a-482a-903a-45bb44c5dec4&DisplayLang=en 7Dhttp://www.bluedoglimited.com/Downloads/pages/Web Part Toolkit.aspx 1mhttp://www.microsoft.com/downloads/details.aspx?familyid=CAC3E0D2-BEC1-494C-A74E-75936B88E3B5&displaylang=en mhttp://www.microsoft.com/downloads/details.aspx?FamilyID=4b2c2f1b-d74a-482a-903a-45bb44c5dec4&DisplayLang=en2_Toc1552680912_Toc1552680902_Toc1552680892_Toc1552680882_Toc1552680872_Toc1552680862_Toc1552680852_Toc1552680842_Toc1552680832_Toc1552680822|_Toc1552680812v_Toc1552680802p_Toc1552680792j_Toc1552680782d_Toc1552680772^_Toc1552680762X_Toc1552680752R_Toc1552680742L_Toc1552680732F_Toc1552680722@_Toc1552680712:_Toc15526807024_Toc1552680692._Toc1552680682(_Toc1552680672"_Toc1552680662_Toc1552680652_Toc1552680642_Toc1552680632 _Toc1552680622_Toc1552680612_Toc1552680602_Toc1552680592_Toc1552680582_Toc1552680572_Toc1552680562_Toc1552680552_Toc1552680542_Toc1552680532_Toc1552680522_Toc1552680512_Toc1552680502_Toc1552680492_Toc1552680482_Toc1552680472_Toc1552680462_Toc1552680452_Toc1552680442_Toc1552680432_Toc1552680422_Toc1552680412_Toc1552680402_Toc1552680392z_Toc1552680382t_Toc1552680372n_Toc1552680362h_Toc1552680352b_Toc1552680342\_Toc1552680332V_Toc1552680322P_Toc1552680312J_Toc1552680302D_Toc1552680292>_Toc15526802828_Toc15526802722_Toc1552680262,_Toc1552680252&_Toc1552680242 _Toc1552680232_Toc1552680222_Toc1552680212_Toc155268020  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~Root Entry Fa&wm,Data 61TablewWordDocument'SummaryInformation(DocumentSummaryInformation8CompObjq  FMicrosoft Office Word Document MSWordDocWord.Document.89q