How to manage an FTP site in IIS using C#

Recently, I was tasked with providing an interface for stopping and starting an FTP site in IIS using managed C# code. Microsoft provides a great deal of really useful documentation with regards to the Microsoft.Web.Administration and Microsoft.Web.Management libraries, unfortunately I had a great deal of trouble finding out how to start or stop an FTP in IIS using this documentation. When I finally stumbled upon a way to do this, I decided I would share this knowledge with others. So here goes.

I wanted to start with a fairly simple class that would act as wrapper over the Microsoft.Web.Administration objects and methods. This is what I came up with:

using Microsoft.Web.Administration;

namespace Com.DustyHoppe.Examples
{
    public class FtpSite
    {
        // Binding protocol for all ftp sites
        private static readonly string bindingProtocol = "ftp";
        
        // Instance specific data members
        private string sitename = "";
        private string serverIp = "";
        private string physicalPath = "";
        
        // Default ftp port number
        private int port = 21;
        
        // Constructor
        public FtpSite(string sitename, string serverIp, int port)
        {
            this.sitename = sitename;
            this.serverIp = serverIp;
            this.port = port;
        }
        
        // Construct chaining to the previous constructor
        public FtpSite(string sitename, string serverIp)
            this (sitename, serverIp, 21) { }
        
        // Static method on the FtpSite class to create a new ftp site within IIS
        public static FtpSite Create(string sitename, string serverIp, string physicalPath, int portNumber = 21)
        {
            using(ServerManager serverManager = ServerManager.OpenRemote(serverIp))
            {
                // Build the binding information
                string bindingInformation = string.Format("{0}:{1}:{2}", serverIp, portNumber, sitename);
                serverManager.Sites.Add(sitename, bindingProtocol, bindingInformation, physicalPath);
                serverManager.CommitChanges();
            }
            
            return new FtpSite(sitename, serverIp)
        }

        // Method to stop the FTP site 
        public void Stop()
        {
            using(ServerManager serverManager = ServerManager.OpenRemote(serverIp))
            {
                Site site = serverManager.Sites[sitename];
                if(site == null)
                {
                    throw new ApplicationException(string.Format("Cannot find sitename '{0}' on server '{1}'", sitename, serverIp));
                }
                
                ConfigurationElement ftpServer = site.GetChildElement("ftpServer");
                
                if(ftpServer == null)
                {
                    throw new ApplicationException(string.Format("Sitename '{0}' does not contain 'ftpServer' child element", sitename));
                }
                
                ftpServer.Methods["Stop"].CreateInstance().Execute();
            }
        }
        
        // Method to start the FTP site
        public void Start()
        {
            using(ServerManager serverManager = ServerManager.OpenRemote(serverIp))
            {
                Site site = serverManager.Sites[sitename];
                if(site == null)
                {
                    throw new ApplicationException(string.Format("Cannot find sitename '{0}' on server '{1}'", sitename, serverIp));
                }
                
                ConfigurationElement ftpServer = site.GetChildElement("ftpServer");
                
                if(ftpServer == null)
                {
                    throw new ApplicationException(string.Format("Sitename '{0}' does not contain 'ftpServer' child element", sitename));
                }
                
                ftpServer.Methods["Start"].CreateInstance().Execute();
            }
        }
        
        #region Properties
        
        public int Port
        {
            get { return port; }
            set { port = value; }
        }
        
        public string SiteName
        {
            get { return sitename; }
            set { sitename = value; }
        }
        
        #endregion
    }
}

Now that we have our class to wrap the FTP site, we must start by creating an FTP site in IIS.

string sitename = "MyFtpSite";
string serverIp = "204.193.45.12";
string physicalPath = "C:\FtpRoot";

FtpSite myFtpSite = FtpSite.Create(sitename, serverIp, physicalPath);

Now that we have our site created, we begin to manage it using this wrapper class. To get a new instance of an already created site on a specific server, use one of the constructors. Once you have the instance of the site, you can call the start and stop methods on the site to start/stop it from managed code.

string sitename = "MyFtpSite";
string serverIp = "204.193.45.12";

FtpSite myFtpSIte = new FtpSite(sitename, serverIp);

// Start the site
myFtpSite.Start();

// Stop the site
myFtpSite.Stop();

Publishing a schema as a WCF Service using BizTalk 2010

Overview

One of the useful features I’ve found when doing BizTalk 2010 development is the BizTalk WCF Service Publishing Wizard. This tool allows you to publish a schema or BizTalk orchestration as WCF Service. Typically, it is a best practice to expose a schema as a WCF Service as opposed to exposing an orchestration as WCF Service. By doing so, you can expose a schema as a WCF Service and bind a port within an orchestration to this published service. This allows you to change the port binding and/or protocol without redeploying the orchestration as well as modify the published schema without having to redeploy the orchestration that consumes it. In this tutorial, I will be describing the steps to publish a schema as a WCF Service and show how this service can be consumed within a BizTalk orchestration. This tutorial, as well as the rest in the BizTalk 2010 series, will be following a problem-design-solution format.

Problem

In this scenario, we will be developing a BizTalk messaging solution for the well known pharmaceutical company Wonderful Drugs Inc. Wonderful Drugs Inc. is currently sponsoring a clinical trial for a new drug they hope to release to the public. Typically, Wonderful Drugs Inc. pays medical institutions to manage and enroll patients into their clinical trials. Unfortunately, there is not a standardized format of patient demographics when enrolling patients into a clinical trial. Each of the multiple institutions enrolling patients collects demographics in a different format. Our objective is to provide an endpoint for a single institution to submit enrollment information to Wonderful Drugs Inc. using the institutions proprietary format. Fortunately, the first institution we will provide an endpoint for has given us an XSD schema describing the patient enrollments they will be submitting.

Design

To solve the problem at hand, we will be designing a BizTalk orchestration to receive enrollment information from ABC Institution and store those enrollments some where. For the time being, we will be storing the enrollments to the local file system. In later tutorials, we will be changing how the enrollments are stored.

Once our orchestration is configured, we will be exposing the XSD schema provided to us by ABC Institution as a WCF service so that they can consume this service. This service will be the endpoint at which ABC Institution will be submitting subjects to be enrolled within our clinical trial.

Enrollments submitted to the WCF endpoint will be similar to the one below:

<Enrollment TrialID="TRL25949">
<Patient SSN="510-26-7612">
  <Name>John Q. Smith</Name>
  <DOB>04/25/1959</DOB>
  <MedicalRecordNumber>BCG-627-DQP</MedicalRecordNumber>
  <Gender>Male</Gender>
  <Race>Caucasian</Race>
</Patient>
</Enrollment>

The design of this solution is very simple and very straight forward. Let’s get started!

Solution

1. To begin, open Visual Studio 2010 and create a new Solution with the name of WonderfulDrugs.BizTalk.

2. Right click on the new solution and select “Add -> New Project”. Under the BizTalk Projects section of the installed templates, select Empty BizTalk Server Project. Finish by naming the project WonderfulDrugs.BizTalk.ExternalSchemas.

clip_image002

3. Now we need to configure this project to deploy properly. Right click on the ExternalSchemas project and click “Properties.” On the Properties page select the click the “Signing” tab. Each BizTalk project must be signed with a Strong Name Key. Now click the “Sign the assembly” checkbox. The “Choose a strong name key file:” dropdown will appear and select “<New…>”. Give the strong name key file the same name as the project (i.e. WonderfulDrugs.BizTalk.ExternalSchemas.snk).

clip_image004

4. Now select the Deployment tab on the properties page so we can set the Application Name that this project will be deployed to. Set the Application Name property to “WonderfulDrugs.BizTalk.ExternalSchemas”.

clip_image006

5. We are now ready to add our first BizTalk artifact. Right click on the ExternalSchemas project and select “Add -> New Item”. Then select “Schema” and change the name of the schema to ABCInstitution.Enrollment.xsd. Typically, a schema would be given to you by the institution, client, or vender, but we are going to create it instead.

clip_image008

6. Open the schema you just created.

a. Right click on the root element and select “Rename”. Rename the element to “Enrollment.”

b. Right click on the “Enrollment” element and select “Insert Schema Node -> Child Field Attribute”. Name the new child attribute “TrialID.” Then ensure the data type of this attribute is xs:string. You can do this by right-clicking the attribute, selecting properties and reviewing the “Data Type” property.

c. Now we need to add a Patient element to the enrollment. Right click on the “Enrollment” node and select “Insert Schema Node -> Child Record”. Now name the record “Patient”. On the Properties page, set the Max Occurs and Min Occurs to 1.

d. Now add a “Child Field Attribute” to the “Patient” node and give it the name “SSN” and a data type of xs:string.

e. Now add a “Child Field Element” to the “Patient” node and give it the name of “Name” and a data type of xs:string. On the Properties page, set the Max Occurs and Min Occurs to 1.

f. Now add a “Child Field Element” to the “Patient” node and give it the name of “DOB” and a data type of xs:date. On the Properties page, set the Max Occurs and Min Occurs to 1.

g. Now add a “Child Field Element” to the “Patient” node and give it the name of “MedicalRecordNumber” and a data type of xs:string. On the Properties page, set the Max Occurs and Min Occurs to 1.

h. Now add a “Child Field Element” to the “Patient” node and give it the name of “Gender” and a data type of xs:string. On the Properties page, set the Max Occurs and Min Occurs to 1.

i. Now add a “Child Field Element” to the “Patient” node and give it the name of “Race” and a data type of xs:string. On the Properties page, set the Max Occurs and Min Occurs to 1.

clip_image010

7. Now that your external schema has been created, we need a project to hold our orchestrations. Right click on the solution and select “Add->New Project”. From the BizTalk Projects template store select “Emtpy BizTalk Server Project” and give it the name of WonderfulDrugs.BizTalk.Orchestrations. Then click “OK”.

clip_image012

8. As we did before with the External Schemas project, we need to configure the Deployment and Signing for the Orchestrations project. Open the project properties and set the Application Name on the Deployment tab to WonderfulDrugs.BizTalk.Orchestrations and add a strong name key to the assembly.

clip_image014

9. You need to add a reference to the ExternalSchemas project. Right click on the “References” folder on the Orchestration project and select “Add Reference…” The Add Reference dialog box should appear. Select the Projects tab and double click the WonderfulDrugs.BizTalk.ExternalSchemas project. You should now be able to reference the schemas within the ExternalSchemas project.

10. Now we need to add an orchestration to our new project. Right click on the Orchestrations project and select “Add->New Item”. Select the BizTalk Orchestration item and name it WonderfulDrugs.Receive.odx and click Add.

clip_image016

11. You should now see an empty design surface for your BizTalk orchestration. From your Toolbox in Visual Studio drag a Receive shape onto the design surface. This shape will be used to receive messages from a port we will configure a little bit later on.

clip_image018

12. Now we must activate this receive shape. Right click on the shape and select “Properties Window”. Within the Properties Window change the Activate property from False to True.

image

13. The next shape we will add is a Send shape. In our example, this shape will just send the message that is passed by the receive shape to a file drop on the local file system. All we need to do is drag this shape from the Toolbox onto the design surface between the receive shape and the end of the orchestration which is signified by the red dot.

clip_image021

14. Our next step will be to add a new Port to the design surface that can be used as our endpoint to receive messages from the external clients or services. To do this, Right Click on the design surface in the are labeled “Port Surface”. The select the New Configured Port… option. This will start the Port Configuration Wizard.

a. The Port Configuration Wizard looks as follows. On the first screen click Next.

image 

b. Now you must name the port to be configured. We will choose to name the port “ABCInstitutionReceivePort”.

image

c. The next screen will allow us to select a port type. We will be creating a new port type for our configured port. Under the “Port Type Name”, name your port “ABCInstitutionReceivePortType”. For the “Communication Pattern” leave it marked as One-Way since we will only be receiving on this port and not sending a response. As for the “Access Restriction” select “Public – no limit”.

image

d. On the Port Binding screen, leave the defaults selected. They should be marked as “I’ll always be receiving messages on this port” for the port direction of communication and “Specify Later” for the port binding.

image

e. One final screen, you will see a summary of your configured port. When finished reviewing click the “Finish” button.

image 

15.  After you finish the wizard, you will be able to see your newly configured port located on the “Port Surface.” Now you will need to set the operation name of the new port. Start by right clicking on the port’s only operation and clicking “Properties Window.” In the Properties Window change the Identifier or the operation from Operation_1 to “EnrollSubject”. This will be important down the road when we eventually publish the enrollment ABCInstitution.Enrollment schema as a WCF service.

image

16. Now we need to add another configured port to the Port Surface. Follow the same steps as the previous port, but use the following criteria:

Port Name: SubjectEnrollmentSendPort
Port Type: Create a new Port Type
Port Type Name: SubjectEnrollmentSendPortType
Communication Pattern: One-Way
Access Restrictions: Private – limited to the containing module
Port Direction of Communication: I’ll always be sending messages on this port.
Port Binding: Specify Later

Your Port Configuration Wizard Summary should look like the one below:

image

17. Now you must add a message to this orchestration. Open the “Orchestration View” so that you can add a new Message. Typically, you can open this view by clicking the tab on your View Pane named Orchestration View.

image

Now right click the “Messages” folder within the Orchestration View  and select “New Message.”  A new message will appear. Open the Properties Window for this message and change the Identifier property from Message_1 to SubjectEnrollmentRequest.

image

Then select the drop down from the Message Type property. This will allow us to select what type of data the SubjectEnrollmentRequest will be made of. From the drop down, expand the Schemas node and double click <Select from a referenced assembly..>

image

The Select Artifact Type dialog box will appear. In the right pane will be a list of referenced assemblies that you can select a schema type from. You will be looking for the WonderfulDrugs.BizTalk.ExternalSchemas assembly (note: if it is not visible, you either forgot to reference the assembly, or you need to build your solution. Don’t worry if the solution doesn’t build successfully, it shouldn’t at this point.). Once you select the ExternalSchemas assembly, a list of schemas will appear. You should only see the ABCInstitution_Enrollment schema. Select this schema and click the OK button.

18. Now your orchestration needs to utilize the new message that was just created. Right click on the Receive shape in your orchestration and select Properties Window. Once the properties window opens select SubjectEnrollmentRequest for the Message property. This is telling the Receive shape, that it will be receiving messages of the schema type that the SubjectEnrollmentRequest is constructed from.

image

19. Follow the same steps for the Send shape so that this shape knows what type of message it will be sending.

image

20. The next step will be configuring the message types for both the receive and send port. Right click on the Request of the ABCInstitutionReceivePort and open the Properties Window.

image

From the Message Type property, open the drop down, expand the Schemas node and select <Select from a referenced assembly…>.  As you did the step 17, select the ABCInstitution.Enrollment schema from the WonderfulDrugs.BizTalk.ExternalSchemas referenced assembly.

image

21. Do the same for the SubjectEnrollmentSendPort and assign the ABCInstitution.Enrollment schema to the Request’s Message Type.

22. Now that all of the ports and send and receive shapes have been configured with the appropriate message types, it is time to tie the orchestration together. From the ABCInstitutionReceivePort drag the Request  to the endpoint on the Receive shape. This allows for the Receive shape to receive messages on that port. As you can see now, it is important that the receive port and receive shape are configured to receive messages of the same schema type.

image

Do the same to configure the send port by dragging the Request on the SubjectEnrollmentSendPort to the endpoint on the send shape. Your orchestration should now be fully configured and look like the one below:

image

23. Finally, build the entire solution. Your solution should build without errors and if it doesn’t try and work through any errors it produces.

24. This tutorial assumes that you have BizTalk Server 2010 installed and configured on your local machine. This will be crucial for deployment. Right click on the WonderfulDrugs.BizTalk.Orchestrations project and select Deploy. If you receive any errors about access being denied, close Visual Studio and reopen it as an administrator. A successful deployment will look as follows.

image

25. The next step will be to publish the ABCInstitution.Enrollment schema as a WCF service and configure our BizTalk orchestration to use this service as an endpoint for receiving enrollments. To begin, open the BizTalk WCF Service Publishing Wizard. You can start this wizard by clicking Start, pointing to All Programs, pointing to Microsoft BizTalk Server 2010, and then click BizTalk WCF Service Publishing Wizard.

26. The BizTalk WCF Service Publishing Wizard should now be visible.

image

 a. Start the wizard by clicking Next.

b. On the next screen leave the Service endpoint radio button checked as we will actually be receiving messages on the endpoint. From the Adapter name (Transport type): drop down select WCF-BasicHttp. This transport type gives us the most interoperability across multiple platforms. Now, click both the Enable metadata endpoint and Create BizTalk receive locations in the following application checkboxes.  Under the BizTalk application name select WonderfulDrugs.BizTalk.Orchestrations since this is the application we want to create the receive locations within. Then click Next.

image

c. On the Create WCF Service screen select Publish schemas as WCF service. By exposing a schema as a service as opposed to an orchestration, this reduces dependencies and allows the configuration of the orchestration to be more loosely coupled.

image

d.  On the WCF Service screen, it will default to the configuration below:

image

Right click on Operation1 and select Delete web method. We want to create a One-way web method as opposed to a request-response. Right click on Service1 and select Add web method –> One-way. Now right click and rename Operation1 to EnrollSubject (note: this is the same name as was used in the configured receive port in the orchestration). Now right click and rename Service1 to Enrollment. We also want to change the service description from BizTalkWcfService to WonderfulDrugsEnrollmentService. The final step is to right click on the Request  and select the appropriate schema type. Browse to the location of the of the WonderfulDrugs.BizTalk.ExternalSchemas assembly and select the ABCInstitution.Enrollment schema.

image 

The fully configured service should look as follows:

image

e. On the WCF Service Properties screen set the target namespace to http://wonderfuldrugs.com/integration/servicetypes.

image 

f. On the WCF Service Location leave the Location set to http://localhost/WonderfulDrugsEnrollmentService and check the Allow anonymous access to WCF service checkbox.

image

g. The WCF Service Summary screen will appear and complete the wizard by clicking Create.

27. Now that we have a schema published as a WCF service, it needs to be configured within our orchestration. Open the BizTalk Server Administration Console by going to Start –> All Programs –> Microsoft BizTalk Server 2010 –> BizTalk Server Administration.

image

Expand out the Console Root down to BizTalk Server Administration –> BizTalk Group –> Applications –> WonderfulDrugs.BizTalk. Orchestrations. Then right click on the WonderfulDrugs.BizTalk.Orchestrations and select Configure…

 image

Then select Orchestration_1 under the Orchestrations header.

image

a. Set the Host: property to BizTalkServerApplication.

b. Set the ABCInstitutionReceivePort to WcfReceivePort_WOnderfulDrugsEnrollmentService/Enrollment

image

c. Then click the drop down on the SubjectEnrollmentSendPort and click <New send port…>. We need to create a new send port to bind to this configured port from within our orchestration. Configure the send port as follows:

image

d. Click Configure…  to configure the destination folder where this file will be dropped. Leave the File name as %MessageID%.xml and set the Destination folder to C:\WonderfulDrugs\Enrollments\( you may have to create this folder structure if you haven’t done so already ).  When you’ve finished click Apply and then Ok.

image 

28. The final step to completing this tutorial is starting the application. To do so, right click on the WonderfulDrugs.BizTalk.Orchestrations application and click Start…

 

In the upcoming tutorial, I will show you how to consume the schema exposed as a WCF service and how messages our passed through the orchestration. Questions, comments, and general feedback is greatly appreciated.

Sending email attachments using SMTP commands and TELNET

Recently, I had a client that had a need to send a test email message with an attachment via TELNET. If you have ever tried sending an SMTP mail message using TELNET before, you know that it is very finicky. The trickest part of the client’s request was being able to include an attachment within the mail message. To do this, you must manually construct the MIME header with the correct encoding for your attchment.

In the example below, I’ve provided a sample walkthrough for sending a SMTP message via TELNET with an image attached. This walkthrough was conducted on a Windows 7 OS.

  1. Open the windows command prompt by clicking the Start icon and typing cmd into the search box. Then click the command prompt icon to open the application.
  2. Now that the command prompt is open. Type the word telnet and press enter.
  3. Now type set localecho and press enter. This turns on local echoing and allows you to see what you’re typing.
  4. Now type open <smtp server name> 25, to begin your TELNET session with the SMTP server. The last parameter being passed is the port number. The default port number for SMTP is port 25. Replace the smtp server name parameter with the name of the SMTP server you will be using.
  5. Now type EHLO <Domain>and press enter.
  6. Now type MAIL FROM:dustin.hoppe@gmail.comand press enter. The email address you enter will be the email address the message will be sent from. You should receive a response declaring that the sender you entered is OK.
  7. You are now ready to enter the body of the email message. Copy and paste the text below into your TELNET session.

    Subject:Small Koala
    MIME-Version: 1.0
    Content-Type:multipart/mixed;boundary="KkK170891tpbkKk__FV_KKKkkkjjwq"
    --KkK170891tpbkKk__FV_KKKkkkjjwq
    Content-Type:application/octet-stream;name="koala.jpg"
    Content-Transfer-Encoding:base64
    Content-Disposition:attachment;filename="koala.jpg"

    /9j/4AAQSkZJRgABAQEAYABgAAD/4RkWRXhpZgAATU0AKgAAAAgABQEyAAIAAAAUAAAASgE7AAIAAAAHAAAAXkdGAAMAAAABAAQAAEdJAAMAAAABAD8AAIdpAAQAAAABAAAAZgAAAMYyMDA5OjAzOjEyIDEzOjQ4OjI4AENvcmJpcwAAAASQAwACAAAAFAAAAJyQBAACAAAAFAAAALCSkQACAAAAAzE3AACSkgACAAAAAzE3AAAAAAAAMjAwODowMjoxMSAxMTozMjo0MwAyMDA4OjAyOjExIDExOjMyOjQzAAAAAAYBAwADAAAAAQAGAAABGgAFAAAAAQAAARQBGwAFAAAAAQAAARwBKAADAAAAAQACAAACAQAEAAAAAQAAASQCAgAEAAAAAQAAF+kAAAAAAAAAYAAAAAEAAABgAAAAAf/Y/9sAQwAIBgYHBgUIBwcHCQkICgwUDQwLCwwZEhMPFB0aHx4dGhwcICQuJyAiLCMcHCg3KSwwMTQ0NB8nOT04MjwuMzQy/9sAQwEJCQkMCwwYDQ0YMiEcITIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy/8AAEQgAeACgAwEhAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A50JTLgFYjjg1wnStypcRERoQR05NN09DJer3wOoq1sOR2eneFdW1Tm3tH2jqz/KPzNddB4M0Syt449UuZXupeAbdSVTjOCQCM9fSnCF9WZN9iL/hFPDJuFiGuMm7kB1HpnGf89K1LzwTo0kbfZL3aQq/NnK4xgn37H2/Gq9khczOI1fRZtLumjZXMY5VyuARWesTO4UDJPFYtWZZ3ugaIIbXzHHOKg1q6S2BjJwD1xU2udD0icslu0wnjDbt/wAyH+lU7hTlFYYIGDUJ3aOZ72IClMZK1JIivNaNkjQ2rzBARnqe1TU2sC3K9zPJcHljtHQVRkjqoxUVZCbu7gBUVweQvqKRvHcSy0u41a+jsrRRJPKcJkHH/wBavTvD3g7TvCipc6miXernIEMTfIoPfnjjHXpW0ETN9CTVvGVnEz7rnZswmQ4ZR04HIBPXoOP0rEuvE0d0GWF55IWALBgCh9uQD/n2zWhBnSyQ3ymONZYZccMRkfnjn8azLy51a0Sz8rUEhDOYSxZghDYxg9T0JxQI9D03VdO1/T2tNUR45Oscik49OM++eueD1NZsPh2ay1YJIN0X3kkAwGFZVV1NKa1OxkkFtZbRwAteeazdm6umUVmtjWb6FeynWFWifhW5DDqDVW5B+0Nk5yetZpWkY21IintWnp/h651JgEUjjPSqu+ayEzST4fak0ReRUjbPyq8gy1TnwlqEVobZJrTzmP8AqTMN2ew+pq/YzbVyLnPX2gahZCR5bdgsZAfBB2//AFs8ZrHkWm01uOxCBTHjaSQKgJJ46VBtHc9U8KQweG9BluZI8XEi5LOoXGOnPX8q821/W77VNTnMMczRk5ZwxVcep9B+NdC2SIe9zirjUZ1mYwqV29XOWJPoAf61Jo96Beh5SxOcYLZz+HSqJPSrWOze2VnvHiLrwkifuz9cHj/PWsufXIY9SSS4hhaGA+XbrGQUZzwJCDk4wN3P6ZpslMytJ126l1MxLOJYJ3RIlxuKgckjjAyWOAP6CvcdDuYbKxiS4Mpd+TH99VPGMZ6Z44FJ6FR1RoS6vZSLlbWOQcgs4AA456isa6Xw9MZ/tGn28brvXdEwBKj+IAf4VDs+hST7lCHwppN3GZFvLpEPQsoOD78U5/AInxJaalDNgch1wPzGaj2V9mDdnqVU8Ivp7vcXstuY48sVV8kgc8CsebxRey3It7CMRRWsodymQ7Jj5ADjnOM8+3IqqcGndkydy8usx2yx3GpzCJDkwJJK0kpHYkdhzgd8dhjmnfa9oqNv/eS3eRtdBtK8ZBwDnGcdev8ALW4rGjY6jErpeRhXSXcrDeCCuMdD0OVzge/0pmv+GIblY5tJhQMVZmCtgPz2BPGOnWplG6DZnn61t6FHF9oEksIl2njP8J/x/l1rnW5tA7XUXV9PDT2jhT0Ei8ce2f0ritSt2ubcoqFYA2dqfIufX+dboiR51rN1AJ/stoQsYHzMBkE+vvUukWUiypcQfN/e54x75qyOh1Ot6vBFpgWaNFDJ91GwOB15HOT71wOo6tLG88DRsolZTEinnbxwR2yuOPYVRB2Hg3Sbma4ju7mNGkYiS3Vkzgjj9ARxXpkc8xlS1lSC6VlKmSDkq/IXBIH91Tx9KiW5pDYiu4bgwyXFqqpKhG0sCNibicY7due+MVnTQanbTQi6aJgxy2/crNg8qDgtjkcdycVNirmjJqVza+YzlgYmIYE/OeMtjnIA+Xj6/jYi8Uutr5cJLSgtu25IA5Pfpxzj2OMDmgdzK1bxIbuyudtw0kcKYPmDJ4GcY7ZIB59D1rzrw/qFxdahPMl3NnzETMZVSU2k4B6A5J57YFUiJPU7f/hH4J5J5YrmRs8SSSSEv9C3PI+lcT4iVbe+WS1u5VdPkP7zcx9wOT0P0ptCTFg1O4mitxvPmIWjk8pPlyB8hI52nkDgc4rvvDms3M1qLWOWPCMCyOuSgI5UcdM5Pp19aAZyi+1bOnXgtYtrZ8zqv+z+FcvU2p7M1JtXZYfJmaSVyoYLyWH1xwv865zVZriS1Idkht/QjAA+netkRM4Z1LXbeXv8vP3z8q11mirpiQZmhy/UHlgfz4rQzexzfi+SZ45LgsFV/lVBydvv+Qqt4C0GbVdSXUJtrRRlgC56EDJY+wq1sQe9aR4eWKziSXfMX5YxyEYXsPTqx7YPvWvf2yeVaoT8qHbiQn5ccexI/Toe1ZmvkWbaKO5t/MUA5LEow6YJPfqcnr6DIxVKWNZoTMvkjbkB+ykgZOOpGV/SmCMO500rbwCORXKEQmSVSB94Hofugljj6cZ6Vz+u2a2gV2DoWQFcRB1GOcE8YJIxnjrjHGakZ57qGsTveyWu9EVlXiRCCP7345yfWsDSJrzSLwG2lCu3AR1ypBGcEDqeh9j2q4mcmdPfeJDbaINkQmYN93naB3IYHnOc4PSsWbxLPfW3kpAIwf7zk/4UNDjqGlTpBcmWUkEA5AHGccZ/HFeieCrgS291eWshaUR7FAABAA449Bj9PwpIqRmhtgz6U/z9kBb5t/bb1P0rk6m1P4Tp9D0K/j097z7O7+dzgtg49+9UdcsYoY5JZUeWUdI9pwtbx2M5bnLx6XEbqKfVQMMw8qAZJz24FdfNBEIFYBUG3hVH9a1Wxi9zh/FNmb+QQxxsw6FwO9eleBfCg07RrbTzEfNKK9w7AgAH5iPcjgfgfek3oVFane3epqsiJFuERBI27QGHTHPTnA/lmsiPUZJNhd3YAnEpUAjIHHv09Djv04CrFiK5toLaWM5GxcHy/mLdhkc4yAM59feoTfrOxgCIuBtAYDGTjjJ+oP59aQ0UWTcnmu26BE53A5J9MZ9s4IGPxrltdV7uWZ7SXc7YEkm1QIgeMde6nk+hPthAcJ4n0aMwT+QytJCvnLITt3cDIHr94n8PSuFjM89ypVsFT/DlgW/DvVx2M5bnfaFoc+pWwfylmiJ3AMM8fh/nGKr6xpNpbzsyQSJP/FjlR+dDCL1K0Fjb3SKhJSTOFIyc/h6122i2YtbeGaDY2wj5kbBwOx9/rSsU3rYpTavZaxtSztliETESEDqaqT63DodxHOYBMyfLGgGcuemK5krysdLtGJ1umXuvTW6ag37oBQxiY/MfbB7mtO6jl1LTVvpopEYcOmMH2zW5hr1OLu7C9a/SXne+crjiNf8AGtg28/2XaF5Axkjp9KFIlxKmnaHc3euW3n5ESN5jZ4GBzXpf9pPDpkklkiSvk/IWXftXg8ZPHQUJ3GlYx5biXVkSWSPynY/MobbsHGeRyeh9K05tL32TIhSNS25uAcDg9/p+hpgY0sckDiOGUMCNpbORjPU/n1/nUUk4tyUCqPMc7yfmDc4JB649Pb64oAlttQtt6hp4cnh2jHIPsTn8R3FZsiPNdr5JSVowETIIeQY+96d/xoC5w/iWzYvGbeZiZiQ6SLgocFSMjPfNcRaaPNDqG+MhlLHYmCAR6jPpxVrYzluep6QbiJICYyjhR8wON2O4P0PT/wDVWl4jayn0pZJMSufuzRna+c8jNMk4WSxMnlXQUyQjlXjbY2P8eR1/PpXZeH7YSz/aYJH8tsC5j243A/xD0Yf40mir3Oa0G2eCyiyp83blzjqaxfF9ydLawuF/4+El81V9x61yQd5nbUVoMrQ+PNa1GWMyXADBslV7ivfvBGrW3iHSDbXwIunQByOhHb8a3aSOZNsXUtNGj3KrcRB0b5VuD3H9DWBd3aNdAWucA9SOprGTa0NopS1OosrWQ2JcYEzqA7/7ORnNeXeItWvovieuladZKZEliWCfacqowS2Rxjrn61pT1SFJWlY9EnubfSBLdTSMFUbic5yScgAd8+noK5u61/xZqlw09k1rpVqCSI3Xe8vb5uOOlWjN6EGleKZL6V9M1pYVvE+6wOFk4PbGB3p+o6h5cABCmUjryQDj09Pwpk30OejYvJ9plu4IbSTKM8rffz0B9c+1b9vdRB4XguY5yY9u6Niyt24I6dhgigRnXsUt1YtE0mZILh42RyDvAOSD64OevPSuYeUac6zPCzSDkgHgDPI/9BoWgnqdHp9+Ht4pPvR72XyWGQQeR/UU/wAUx2MOmiN4zFHIdzKpyA2fvL6dDz161pfQi2pjeHrSZpprKUk7/mDdN3ufU8dfrXd2AXTI0kQDzPKJkGcdMdfaolKyuXGN2ZGqwx6fOAuFXHArybxzcreakko+6oIA9K5KG6O/EWtJHJoxRwynBByK9f8ABHi77FLApAZWAzjtXVUWhwwep79Za/p2qaeFuhFggbkJyKyrnwXFFd/a7F98X3hEeo+h71jNc603NYPklrsQ6lqB03TANvVwJeM7R2GPriuH1PxDHHfiSCEMWkCmT7+38s1cFokE5e82aXiDUosWmASUTzVDjHXhT+S5/GuZbxFJ5ZAPU4O3rWiRk2Zd7G08kN/kpcwtvVgOo9KkhZby9kWZyyhvmI4BBPShkoxfE11faZdI+lodifKpChiuc9B29z3zXR6FaXUnh6CeQJDelnlcFSN4JHGBwD7e9Fy2bIJkuftSlQHxuUc/wgH+Sj6Duea57UbAtO2NzoRhVVfu9x/hSexJv6dpyXGlxrGwWeMKSO47ipda08a1bWqbN+1tjtnkev5g/oaFLoHL1JtMs4tNaONsMseY89Dnb/8Ar/Oq17cmSVwfVhx/X8qxnLSxvGNtTA8WajicsrZ4wMmvMNWl86Uls+1KktEbVt2Q6joF5p1hbXsqgw3C5BH8Psav+GEljYzdFzgE10cylG5xuLi7HoVnqV1GqCI8dznrXomh+MpW2J5hYltqr/Ssn3Li76Mu+KpI9Ssn+QgvsMhHGOoI/UVgeCdLGtalJ5yIlvFyQqrtGDgAD09+tXHUmWjsebeP/F6SeJb1dPb/AEZXEcZX+6owP5Vydtr7hiXY8ep61aIe50em6y2q3UNsFO1SCxGOgq9rVrfWdxO8a/upnDmUjhR/kn8qGJEul3D/ALtJ5Rcx9RgKGH5muptNRM0WABCiDgYxuHoe/bFIdx9uiW8IjjLAjJfH+1nj+VRypi5WToVX5iGwO/8AOhgjO8NeIY3169s33qJ/9WvJzgZBHbtXSGY7JGXPlTjzEbuGH/6qynpqbU9VYoz3RZ8g5H8zzz+tVmJdix6k5rBs2Rwmu3T3E0jH6L6VzdvavqGqW9rjmRwuPQd61hogqanqt7psN5YfYnUbAoC8dMVhW+li0l+zzRqAv3QBwfephLoRVj1Nq0sOVwAAeBjtXT2nh+QQ/aImLBSDsHerk9DOC1L5LT21ygR9qfMd3P4VirM9lpF59kuFtS8MkYI7M4I3E9iCaqm9Aqbnh+q6RMnm3UTtNGhw5b7y+uaxwjEAjv0FbJ6GbWp3fw606W41R0kQqoQPluhGcV6bq8+m21pLZSgBWBBJOT9fX6f0pXQmjzmW1jjvZ43YyWzn5ZNxLL26H37111msEKhtrSBIip+bOSeN1ICzauPMYgfKAQFPZe1Z+u6omn6RMGQbpE8uPnkmkM5bT7iG2nguoXYywnggbgp6d/XPFdzo+p/2raSRMAs6AMoHc9/x56Upq6KpuzHMpBIPBHBFNC1yHScBfuGgGMZPNS+DLMTeIZJ2GRBHn8TWi2ZUuh6DsyTVa/hja18yRgpU/KalbkS2JdPkwyqrK2O1dpol6crCcLx0HeqkRTN59LjWMyRABTyQR1zXC+INHW0uJrZgVguFyhPoc0U3rYdRaXOV8S+E7a90KK7s8wySRhbhFbCsy8ZI9a89i8NT20hVD8zcZK5x7it72Mkrm+qSeHdDnlt7krduv+sbkn2A7DrU3hzUZptNP27c0+7KyEgk/UUXJaEkuElknaMAMgxhgOvP6VesbwzvnyyG3YYgcHigRfNwSzpECFBwwPZQev581xusavBqGsBomV4oVMKDoCcHJ+mR+tNAyslxcyA7k3bQSdo4Pv8AXH51q6NfPZfZXVxuVsq4yQfY/mabBbneCdbuCK5CqrOPnCnIDUBc1ySVmda1Rynhqytri7eW7jWVIAp8tjwfXNdWX0mW4nudPgjhkIVH8sYDAZx+NW1pcXNrYVJATXIeMtWd5Vs7fJWPlyPWlHcUmSeGPEEVxGImIE6cNnqa7uzvmidZAw54wKckRF2O70y+W5QIxyka84PUmpPEmn22paasLNtkQfu3A5H/ANas46M0krnlV9/aGi3EtvcKJbZxk4PGefmHpnvXO397FAvnGN2HXAHNb3uc+xzE9xc6tdAzKEgX7sY/rWibiOGDbCcLzkg/lTYiCONmSQxPxkfNxnGK0o7+OOyaWZljRcZIHU9KYHN6jr73cflW5McTn5wOSR2BqjbsfNjkJDsmeAuOMDv+NWkSalsYgDv++GwhXOB+GOvUVMWSKT5DsxhlCE8n1PtmgEdd4XuZLiwnRhhEcFOe/Q10CDua5qnxHTF+6cHrWonw5EdNtgPNLZnl/vt7ewxWl4Wee8t5tsLFyQcgdRirkvdJjrI6C5h+y2rN9oTzyMLH6muLl067lWQkByxJc+9Z3S3NYxbehykTXFlrcZt1bzC+0qO9ej6fqjblV/l29Qe1ay1SMWrM7nQtTYxt83ys3XpXW3GoQQ2ZubiQLbxrlmNZJal30PMPEXj/AEqaR1js7iQdA20AH6c151rHiGOZQsFrImT/AB8H9K6Ekznd0YD6tMc/Icn34oTVLjaUEKlvftT5EHMKL++kK5YhQcBVGAacizXTnzZN+1c4YnB7cU7WFcsfZfIiUfLtBzyeF/kKfbRtIVTd8mDs2IDz6Hj60xErIS5KfIBhSe59+enY/jUm/K4aQ7QeSOSR/hSGb/hi58i6Idm2NGwTng854xXawyB0VhwDXPU+I3gdFr3wys/EExlhSFZFOQQ2FrW0LwRPpWmyWpeGePHAXsR0GarVqwaKVzzHxbpuuJq6Rpot4kYbHmKhK/XIFVdTa6t7BgtrOjgbmOw/jWdRXsjei7XbMfwro9zca0+o3lq6JFgoWQjJPStjVdMNvdNdwIxVuWA7Gq2djKWupo6JeuqbWPX5ea0PE+thLBYJDhAAQRyuffHSi1yU7I8u1ZZrl98e4xbAVjZf9YOv4dqx4p4pjveJ/K3YLAbQnHT88gV0paGD3Lb6fH5/k4ZZCMrnnaMdT9aI7GOOPduBIGQNo59efagQxLeOHooZly+9SMgc46/Q+v41ZCuI1j3FXQAskkQAfkcAnJ/pxTAZJP5LMu5nBztDcAc98fy//XVfhiisDtYhRvwc9j/iKQDxJMXIb/VquEQsRnr9aQNLGolV+STgAng44z7f40hnQ+HGIvNuFXIyw75x1/8A1V28T7UUegrnqr3rm9M//9kA/+wAEUR1Y2t5AAEABAAAAGQAAP/hC25odHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+DQo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA0LjEtYzAzNiA0Ni4yNzY3MjAsIE1vbiBGZWIgMTkgMjAwNyAyMjo0MDowOCAgICAgICAgIj4NCgk8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPg0KCQk8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnhhcFJpZ2h0cz0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3JpZ2h0cy8iIHhhcFJpZ2h0czpNYXJrZWQ9IlRydWUiIHhhcFJpZ2h0czpXZWJTdGF0ZW1lbnQ9Imh0dHA6Ly9wcm8uY29yYmlzLmNvbS9zZWFyY2gvc2VhcmNocmVzdWx0cy5hc3A/dHh0PTQyLTE1NTY0OTc4JmFtcDtvcGVuSW1hZ2U9NDItMTU1NjQ5NzgiPg0KCQkJPGRjOnJpZ2h0cz4NCgkJCQk8cmRmOkFsdD4NCgkJCQkJPHJkZjpsaSB4bWw6bGFuZz0ieC1kZWZhdWx0Ij7CqSBDb3JiaXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLjwvcmRmOmxpPg0KCQkJCTwvcmRmOkFsdD4NCgkJCTwvZGM6cmlnaHRzPg0KCQkJPGRjOmNyZWF0b3I+PHJkZjpTZXEgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj48cmRmOmxpPkNvcmJpczwvcmRmOmxpPjwvcmRmOlNlcT4NCgkJCTwvZGM6Y3JlYXRvcj48L3JkZjpEZXNjcmlwdGlvbj4NCgkJPHJkZjpEZXNjcmlwdGlvbiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iPjx4bXA6UmF0aW5nPjQ8L3htcDpSYXRpbmc+PHhtcDpDcmVhdGVEYXRlPjIwMDgtMDItMTFUMTk6MzI6NDMuMTczWjwveG1wOkNyZWF0ZURhdGU+PC9yZGY6RGVzY3JpcHRpb24+PHJkZjpEZXNjcmlwdGlvbiB4bWxuczpNaWNyb3NvZnRQaG90bz0iaHR0cDovL25zLm1pY3Jvc29mdC5jb20vcGhvdG8vMS4wLyI+PE1pY3Jvc29mdFBob3RvOlJhdGluZz42MzwvTWljcm9zb2Z0UGhvdG86UmF0aW5nPjwvcmRmOkRlc2NyaXB0aW9uPjwvcmRmOlJERj4NCjwveDp4bXBtZXRhPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD94cGFja2V0IGVuZD0ndyc/Pv/bAEMAAgEBAgEBAgICAgICAgIDBQMDAwMDBgQEAwUHBgcHBwYHBwgJCwkICAoIBwcKDQoKCwwMDAwHCQ4PDQwOCwwMDP/bAEMBAgICAwMDBgMDBgwIBwgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP/AABEIAJoAzQMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlq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

    --KkK170891tpbkKk__FV_KKKkkkjjwq--

  8. Now press the ENTER key twice followed by a period. Finish the mail message by pressing the ENTER key one more time.

Resizing VirtualBox Hard Drive

I recently ran into an issue where I needed to resize my VirtualBox hard drive after creating the VM. Unfortunately, there currently isn’t a way to do this within the UI.  To perform the resize you must execute the following command from the command line.


VBoxManage modifyhd <HardDiskName>.vdi --resize <Number of MBs>

You can find the VBoxManage executable in the following direction: C:\Program Files\Oracle\VirtualBox

Must declare a body because it is not marked abstract or extern

A few nights ago I ran into an issue while doing a production deployment. After deploying, I received numerous errors in the format [ClassName].[get/set] must declare a body because it is not marked abstract or extern.
After looking at my class definition:

   1:  public class PlanOption
   2:  {
   3:      public int PlanOptionId { get; set; }
   4:      public string PlanOptionName { get; set; }
   5:  }

It was not obvious what exactly was wrong with that ultra simple class definition. After some research it started to become obvious that the problem had to do with the class’ auto properties i.e. ( { get; set; } ). A simple work around was to explicitly code the classes get and set properties, but that was not the answer I was looking for.
In an effort to find a solution, I reviewed my troubled applications web.config file and compared with another application that I wasn’t having the problem with. I noticed that the troubled application’s web.config wasn’t explicitly defining the c# compiler version. After updating the troubled application’s web.config with the snippet below (which targets the .net 3.5 c# compiler) my problem was resolved. For all of you VB.NET coders out there, the snippet should solve your problem as well.

   1:              <system.codedom>
   2:                          <compilers>
   3:                                      <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CSharp.CSharpCodeProvider,System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" warningLevel="4">
   4:                                                  <providerOption name="CompilerVersion" value="v3.5"/>
   5:                                                  <providerOption name="WarnAsError" value="false"/>
   6:                                      </compiler>
   7:                                      <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.VisualBasic.VBCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" warningLevel="4">
   8:                                                  <providerOption name="CompilerVersion" value="v3.5"/>
   9:                                                  <providerOption name="OptionInfer" value="true"/>
  10:                                                  <providerOption name="WarnAsError" value="false"/>
  11:                                      </compiler>
  12:                          </compilers>
  13:              </system.codedom>

SQL Server Database Mirroring in High Availability Mode with Automatic Failover

The premise of setting up a database mirroring configuration in high availability mode is to provide a disaster recovery solution, provide data integrity, and keep your database downtime to a minimum. A high availability scenario consists of three server architecture. The first server is known as the principle server. This server is database server where the initial database resides. The second server in the configuration will be referred to as themirror. The mirror is the server where an offline replica of the principle database resides. The third server in the configuration will be called the witness. The role of the witness is to periodically monitor the state of the two other servers in the configuration. The witness performs this duty by periodically pinging the other two servers ensuring that they are both online.

The goal of this type of scenario is that if the witness server pings the principle and the principle appears to be offline, all traffic is forwarded to the monitor server. For this to work, the mirror server must be taken out of its offline mode and be set as the new principle server in this mirroring configuration. While the previous principle database server is offline, all transactions are written to the mirror servers transaction log and marked as uncommitted to the former principle. When the old principle server comes back online, all uncommitted transactions are applied to the database and the old principle takes on the role of the new mirror server. Ideally, in this type of scenario, there is little to no data loss and virtually no down time for any application running over the top of mirrored database.

n my implementation of the database mirroring scheme, I will be constructing a virtual network of three windows servers. These 3 VMs will live on a NATed virtual network on a Mac Mini. I will be implementing these 3 virtual machines via VMWare Fusion. The network will consist of 1 server running the Windows Server 2008 operating system. This server will act as a domain controller for the network and will also be the only DNS server on the network. The other two servers will be running the Windows Server 2003 operating system. Every one of these VMs will be running SQL Server 2008 Developer Edition for their database management system and be allocated 1GB or RAM.

Computer Name IPv4 Address Database Mirroring Role Operating System
DAHPRIMARY 192.168.99.5 Principle Windows Server 2008
DAHMIRROR 192.168.99.10 Mirror Windows Server 2003
DAHWITNESS 192.168.99.15 Witness Windows Server 2003

As you can see from the table above, all three servers in the configuration will be assigned static IP addresses.

To setup the Domain Controller and DNS server on the Windows Server 2008 instance, the process is as simple as following a wizard, therefore I will not provide any documentation. There is also a best practices for installing and configuring SQL Server 2008. I will briefly touch on some of
these key points in this paper, because they will be critical to the success of this mirroring configuration, but I will not walk through the installation process. To read up on SQL Server 2008 best practices visit the MSDN website. http://msdn.microsoft.com/en-us/sqlserver/bb671432.aspx

When installing each SQL Server instance, it is easiest to install the servers as the default instance on each server. This allows us to follow the naming convention of each SQL Server being named after the server it is installed upon (ex: DAHPRIMARY ).

SETTING UP THE SERVICE ACCOUNTS

  1. As a best practice, when installing SQL Server it is a good idea to have a separate domain account for your SQL Server instance to run as. To do this, open up Active Directory on the Principle server. This can be done by going to Start->Administrative Tools->Active Directory Users and Computers. Under the Users folder, create a new user and give the user a useful name. Since this account was going to be the account running the database engine, I named the account SQLENGINE. Assign the user a password and click ok.
  2. Once we reach the point in the SQL Server installations where we are asked to assign an account to the different database services, we can assign the newly made SQLENGINE account the database engine. Once this has been done we are done setting up service accounts for our configuration.
  3. We will use this account to run as the service account for each of our three SQL Server instances.

CREATE LOGINS ON EACH SERVER

  • The first step is to allow login access on each instance of sql server to the service account running the database engine. The first step is to open SQL Server Management
    Studio(SSMS). You can find this under Start->All Programs->SQL Server 2008->SQL Server Management Studio.
  • Once you have opened SSMS, you should be able to connect to the correct database server by simply clicking connect.
  • When you have SSMS open, click on the New Query button on the top hand left of SSMS.
  • Now you can type a SQL statement into the new query menu. Run this script on all three SQL Server instances.
       1:  CREATE LOGIN [WHODER\SQLENGINE] FROM WINDOWS
       2:  GO
  • This script creates the necessary login for the service account to perform the needed tasks for database mirroring on each server. The WHODER in the newly created login refers to the name of the domain that was created when the domain controller was configured.

CREATING THE ENDPOINTS

By definition, an endpoint in service oriented architecture is an entry point to a service, or process. In our case an endpoint is the entry point for the transmission of database mirroring specific information. We will need to create a database mirroring end point on each database server.

  1. The first step is to create an endpoint on each the principle and the mirror server. The code to do so is the same on each instance.
  2. Run the statement below on both the principle and the mirror.
       1:  CREATE ENDPOINT [Mirroring]
       2:  STATE = STARTED
       3:  AS TCP(LISTENER_PORT = 5033, LISTENER_IP = ALL)
       4:  FOR DATA_MIRRORING
       5:  (
       6:  ROLE = PARTNER,
       7:  AUTHENTICATION = WINDOWS NEGOTIATE,
       8:  ENCRYPTION = REQUIRED ALGORITHM RC4
       9:  )
      10:  GO
  3. By default, SQL Server creates these endpoints on port 5022. As a best practice, it is a good idea to create your endpoints on a different port than the default.
  4. Now run the statement below on the witness server. The only difference is the Role clause of the statement.
       1:  CREATE ENDPOINT [Mirroring]
       2:  STATE = STARTED
       3:  AS TCP(LISTENER_PORT = 5033, LISTENER_IP = ALL)
       4:  FOR DATA_MIRRORING
       5:  (
       6:  ROLE = WITNESS,
       7:  AUTHENTICATION = WINDOWS NEGOTIATE,
       8:  ENCRYPTION = REQUIRED ALGORITHM RC4
       9:  )
      10:  GO

GRANT CONNECT PRIVILEGES

  1. The next step is to grant the connect privileges on the newly created endpoints. We will grant this privilege to the account we created in the first step.
  2. Open SSMS.
  3. Run the script below against each of the three database servers:
       1:  GRANT CONNECT ON ENDPOINT::[Mirroring] TO [WHODER\SQLENGINE]

CREATE A DATABASE AND A TABLE

  1. The next step is to create a database to be mirrored.
  2. Run the following script only on the principle server:
       1:  CREATE DATABASE principle
       2:  GO
       3:  USE principle
       4:  GO
       5:  CREATE TABLE table1
       6:  (
       7:  principleId INT IDENTITY(1,1) PRIMARY KEY,
       8:  col1 INT NULL,
       9:  col2 VARCHAR(40) NULL,
      10:  col3 VARCHAR(90) NULL
      11:  )
  3. The next step is to enter some data into our newly created table:
       1:  INSERT INTO [principle].[dbo].[table1]
       2:  ([col1]
       3:  ,[col2]
       4:  ,[col3])
       5:  VALUES
       6:  (1000
       7:  ,'A string of sorts'
       8:  ,'Another string, containing no meaning')
       9:  GO
      10:  INSERT INTO [principle].[dbo].[table1]
      11:  ([col1]
      12:  ,[col2]
      13:  ,[col3])
      14:  VALUES
      15:  (136
      16:  ,'More fake stuff'
      17:  ,'Nobody likes a phony')
      18:  GO
      19:  INSERT INTO [principle].[dbo].[table1]
      20:  ([col1]
      21:  ,[col2]
      22:  ,[col3])
      23:  VALUES
      24:  (1895
      25:  ,'Testing Testing 123'
      26:  ,'How much wood could a wood chuck, chuck')
      27:  GO

RESTORING A BACKUP TO THE MIRROR

The next step is to take a full backup of the database we created. In a real life scenario, it is important to make sure that the database is in full recovery mode, but since we didn’t state a recovery model, our database defaulted to the full recovery model. After the full backup is taken, we also need to take a transaction log backup as well.

  1. Open SSMS.
  2. Browse to the database node of your server and expand it out. Once you see your principle database, right click on the database.
  3. The select Tasks->Back up…
  4. It should be fine to select the defaults at this point, but make sure that the Backup Type is set to Full. Make note of the location where the backup will be stored. If you have to change this location to a location that is easy to remember. Click OK.
  5. Once again select Tasks->Back up…
  6. This time the Backup Type should be changed to Transaction Log. It should be fine to restore the backup to the same location as the last full backup.
  7. Now browse to the location where our backup’s our stored.
  8. Now copy this single backup file to a network location where the file can be accessed from the mirror server.
  9. Now connect to SSMS on the mirror server to the mirror instance database server.
  10. Now we must create a database to restore our backup too:
       1:  CREATE DATABASE principle
       2:  GO
  11. Now expand the database node of this server instance and right click on the newly created database and select Tasks->Restore->Database.
  12. Select the From Device radio button and click the ellipsis (…) button.
  13. Make sure the Backup Media is set to File and click the Add button.
  14. This will open a file browser. Locate the database backup file that you moved in a previous step.