diff --git a/README.md b/README.md index a5e4133..da967bb 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,4 @@ -> NOTE: [V2.0](https://github.com/EitanBlumin/sql-clr-ics/tree/v2.0) has entered Beta testing stage, be sure to [check it out](https://github.com/EitanBlumin/sql-clr-ics/tree/v2.0) for more features and better functionality - -# sql_clr_ics: clr_send_ics_invite +# sp_send_calendar_event Send Calendar Event / Appointment Invitations (iCal formatted file) from within SQL Server using a CLR stored procedure. @@ -15,61 +13,337 @@ The CLR assembly in this project can only be deployed to a database with the **t ## Installation If you have SSDT, you can open the SQL server project and publish it to your database of choice. -Alternatively, you can use [this simple installation script](https://github.com/EitanBlumin/sql_clr_ics/blob/master/sql_clr_ics/sql_clr_ics_install.sql) that sets everything up for you in your database of choice. +Alternatively, you can use [this simple installation script](https://raw.githubusercontent.com/EitanBlumin/sql-clr-ics/v2.0/sql_clr_ics/sql_clr_ics_install.sql) that sets everything up for you in your database of choice. ## Syntax ``` -exec clr_send_ics_invite - [ @from = ] 'sender' - , [ @to = ] 'recipients [ ; ...n ]' - [ , [ @cc = ] 'copy_recipients [ ; ...n ]' ] +exec sp_send_calendar_event + [ [ @profile_name = ] 'profile_name' ] + [ , [ @recipients = ] 'recipients [ ; ...n ]' ] + [ , [ @copy_recipients = ] 'copy_recipients [ ; ...n ]' ] + [ , [ @blind_copy_recipients = ] 'blind_copy_recipients [ ; ...n ]' ] + [ , [ @from_address = ] 'from_address' ] [ , [ @reply_to = ] 'reply_to' ] [ , [ @subject = ] 'subject' ] [ , [ @body = ] 'body' ] + [ , [ @body_format = ] 'TEXT | HTML' ] + [ , [ @importance = ] 'LOW | NORMAL | HIGH' ] + [ , [ @sensitivity = ] 'PUBLIC | PRIVATE | CONFIDENTIAL' ] + [ , [ @file_attachments = ] 'file_attachments [ ; ...n ]' ] [ , [ @location = ] 'location' ] [ , [ @start_time_utc = ] 'start_time_utc' ] [ , [ @end_time_utc = ] 'end_time_utc' ] [ , [ @timestamp_utc = ] 'timestamp_utc' ] - [ , [ @smtp_server = ] 'smtp_server' ] + [ , [ @method = ] 'PUBLISH | REQUEST | REPLY | CANCEL | ADD | REFRESH | COUNTER | DECLINECOUNTER' ] + [ , [ @sequence = ] sequence ] + [ , [ @prod_id = ] 'prod_id' ] + [ , [ @use_reminder = ] 1 | 0 ] + [ , [ @reminder_minutes = ] reminder_minutes ] + [ , [ @require_rsvp = ] 1 | 0 ] + [ , [ @recipients_role = ] 'REQ-PARTICIPANT | OPT-PARTICIPANT | NON-PARTICIPANT | CHAIR' ] + [ , [ @copy_recipients_role = ] 'REQ-PARTICIPANT | OPT-PARTICIPANT | NON-PARTICIPANT | CHAIR' ] + [ , [ @blind_copy_recipients_role = ] 'REQ-PARTICIPANT | OPT-PARTICIPANT | NON-PARTICIPANT | CHAIR' ] + [ , [ @smtp_servername = ] 'smtp_servername' ] [ , [ @port = ] port ] - [ , [ @use_ssl = ] use_ssl ] + [ , [ @enable_ssl = ] 1 | 0 ] + [ , [ @use_default_credentials = ] 1 | 0 ] [ , [ @username = ] 'username' ] [ , [ @password = ] 'password' ] - [ , [ @use_reminder = ] use_reminder ] - [ , [ @reminder_minutes = ] reminder_minutes ] - [ , [ @require_rsvp = ] require_rsvp ] - [ , [ @cancel_event_identifier = ] 'cancel_event_identifier' ] - [ , [ @event_identifier = ] @event_identifier OUTPUT ] - [ , [ @suppress_info_messages = ] suppress_info_messages ] + [ , [ @suppress_info_messages = ] 1 | 0 ] + [ , [ @event_identifier = ] 'event_identifier' [ OUTPUT ] ] + [ , [ @ics_contents = ] 'ics_contents' [ OUTPUT ] ] ``` -## Arguments - -|Parameter|Type|Default|Description| -|---|---|---|---| -| `@from` | nvarchar(4000) | _no default_ | Must be a valid single e-mail address from which the invite will be sent. | -| `@to` | nvarchar(4000) | _no default_ | Accepts a list of e-mail addresses (at least one) to be invited as required partisipants, separated by either a comma or a semicolon. | -| `@cc` | nvarchar(4000) | _null_ | Optional parameter. Accepts a list of e-mail addresses (at least one) to be used as CC, separated by either a comma or a semicolon. | -| `@reply_to` | nvarchar(4000) | _null_ | Optional parameter. Accepts an e-mail address to be used as the Reply To address (if different from the `@from` address. | -| `@subject` | nvarchar(4000) | _no default_ | Mandatory parameter. A text string to be used as the meeting / e-mail's subject. | -| `@body` | nvarchar(4000) | _null_ | Optional parameter. A text string to be used as the e-mail's HTML body. | -| `@location` | nvarchar(4000) | _null_ | Optional parameter. Sets the location for the meeting. | -| `@start_time_utc` | datetime | _UTC now + 5 hours_ | Optional parameter. Sets the start time (in UTC) of the meeting. If not specified, by default will be set as **UTC now + 5 hours**. | -| `@end_time_utc` | datetime | _@start_time_utc + 1 hour_ | Optional parameter. Sets the end time (in UTC) of the meeting. If not specified, by default will be set as **`@start_time_utc` + 1 hour**. | -| `@timestamp_utc` | datetime | _UTC now_ | Optional parameter. Sets the DTSTAMP section of the iCal (usually used for consistent updating of meeting invites). If not specified, by default will be set as **UTC now**. | -| `@smtp_server` | nvarchar(4000) | _localhost_ | Optional parameter. Sets the SMTP host name to be used for sending the e-mail. If not specified, by default will be set as **"localhost"**. | -| `@port` | int | _25_ | Optional parameter. Sets the SMTP port to be used for sending the e-mail. If not specified, by default will be set as **25**. | -| `@use_ssl` | bit | _0_ | Optional parameter. Sets whether to use SSL authentication for the SMTP server. If not specified, by default will be set as **0 (false)**. | -| `@username` | nvarchar(4000) | _null (use current Network Credentials)_ | Optional parameter. Sets the username to use when authenticating against the SMTP server. If not specified, by default the **current Network Credentials** will be used (of the SQL Server service). | -| `@password` | nvarchar(4000) | _empty string | Optional parameter. Sets the password to use when authenticating against the SMTP server. Only used when `@username` is also specified. By default, will use an **empty string**. | -| `@use_reminder` | bit | _1_ | Optional parameter. Sets whether to set a reminder for the meeting. By default is set to **1 (true)**. | -| `@reminder_minutes` | int | _15_ | If `@use_reminder` is enabled, this parameter will be used for setting the reminder time in minutes. By default is set to **15**. | -| `@require_rsvp` | bit | _0_ | If set to 0 (false), then participants will not be required to respond with RSVP, and their participation is automatically set as ACCEPTED. If set to 1 (true), then participants will be required to respond with RSVP, and their participation is automatically set as NEEDS-ACTION. By default set to **0 (false)**. | -| `@cancel_event_identifier` | uniqueidentifier | _null_ | You may specify a value for this parameter, if you want to cancel an event that you've already sent. Use the corresponding event's identifier. | -| `@event_identifier` | uniqueidentifier | _null_ | Output parameter. Returns the event's GUID, which can later be used for cancellation. If `@cancel_event_identifier` was specified, the same GUID will be returned. | -| `@suppress_info_messages` | bit | _0_ | If set to 0, an informational message will be printed upon successful delivery of the invitation ( ex. "Mail Sent. Event Identifier: 1234-1234-1234-1234" ). If set to 1, this message will not be printed. By default is set to **0 (false)**. | +## Arguments + +`[ @profile_name = ] 'profile_name'` + + Is the name of the profile to send the message from. The *profile_name* is of type **sysname**, with a default of NULL. The *profile_name* must be the name of an existing Database Mail profile. When no *profile_name* is specified, **sp_send_calendar_event** checks whether **@from_address** was specified. If not, it uses the default public profile for the **msdb** database. If **@from_address** wasn't specified, and there is no default public profile for the database, **@profile_name** must be specified. + +`[ @recipients = ] 'recipients [ ; ...n ]'` + + Is a semicolon-delimited list of e-mail addresses to send the message to. The recipients list is of type **nvarchar(max)**. Although this parameter is optional, at least one of **@recipients**, **@copy_recipients**, or **@blind_copy_recipients** must be specified, or **sp_send_calendar_event** returns an error. This parameter maps to the [ATTENDEE property of the iCal spec](https://www.kanzaki.com/docs/ical/attendee.html). + +`[ @copy_recipients = ] 'copy_recipients [ ; ...n ]'` + + Is a semicolon-delimited list of e-mail addresses to carbon copy the message to. The copy recipients list is of type **nvarchar(max)**. Although this parameter is optional, at least one of **@recipients**, **@copy_recipients**, or **@blind_copy_recipients** must be specified, or **sp_send_calendar_event** returns an error. This parameter maps to the [ATTENDEE property of the iCal spec](https://www.kanzaki.com/docs/ical/attendee.html). + +`[ @blind_copy_recipients = ] 'blind_copy_recipients [ ; ...n ]'` + + Is a semicolon-delimited list of e-mail addresses to blind carbon copy the message to. The blind copy recipients list is of type **nvarchar(max)**. Although this parameter is optional, at least one of **@recipients**, **@copy_recipients**, or **@blind_copy_recipients** must be specified, or **sp_send_calendar_event** returns an error. This parameter maps to the [ATTENDEE property of the iCal spec](https://www.kanzaki.com/docs/ical/attendee.html). + +`[ @from_address = ] 'from_address'` + + Is the value of the 'from address' of the email message, and the organizer of the calendar meeting. This is an optional parameter used to override the settings in the mail profile (or if no mail profile was specified). This parameter is of type **nvarchar(max)**. If no parameter is specified, the default is NULL. This parameter maps to the [ORGANIZER property of the iCal spec](https://www.kanzaki.com/docs/ical/organizer.html). + +`[ @reply_to = ] 'reply_to'` + + Is the value of the 'reply to address' of the email message. It accepts only one email address as a valid value. This is an optional parameter used to override the settings in the mail profile (or if no mail profile was specified). This parameter is of type **nvarchar(max)**. If no parameter is specified, the default is NULL. + +`[ @subject = ] 'subject'` + + Is the subject of the e-mail message. The subject is of type **nvarchar(255)**. If no subject is specified, the default is 'SQL Server Meeting'. This parameter maps to the [SUMMARY property of the iCal spec](https://www.kanzaki.com/docs/ical/summary.html). + +`[ @body = ] 'body'` + + Is the body of the e-mail message. The message body is of type **nvarchar(max)**, with a default of NULL. This parameter maps to the [DESCRIPTION property of the iCal spec](https://www.kanzaki.com/docs/ical/description.html). + +`[ @body_format = ] 'TEXT | HTML'` + + Is the format of the message body. The parameter is of type **varchar(20)**. When specified, the headers of the outgoing message are set to indicate that the message body has the specified format. The parameter may contain one of the following values: + +- TEXT +- HTML + + Defaults to TEXT. + +`[ @importance = ] 'LOW | NORMAL | HIGH'` + + Is the importance of the message. The parameter is of type **varchar(6)**. The parameter may contain one of the following values: + +- Low +- Normal +- High + + Defaults to Normal. + + The parameter is implemented using the [System.Net.Mail.MailPriority](https://docs.microsoft.com/en-us/dotnet/api/system.net.mail.mailpriority) enum, and maps to the [PRIORITY property of the iCal spec](https://www.kanzaki.com/docs/ical/priority.html), based on a CUA with a three-level priority scheme. + +`[ @sensitivity = ] 'PUBLIC | PRIVATE | CONFIDENTIAL'` + + Is the sensitivity classification of the message. The parameter is of type **nvarchar(12)**. The parameter may contain one of the following values, as per the [CLASS property of the iCal spec](https://www.kanzaki.com/docs/ical/class.html): + +- Public +- Private +- Confidential + + Defaults to Public. + +`[ @file_attachments = ] 'file_attachments [ ; ...n ]'` + + Is a semicolon-delimited list of file names to attach to the e-mail message. Files in the list must be specified as absolute paths. The attachments list is of type **nvarchar(max)**. By default, Database Mail limits file attachments to 1 MB per file. + +`[ @location = ] 'location'` + + Is the location of the calendar meeting. The parameter is of type **nvarchar(255)**, with a default of NULL. The parameter maps to the [LOCATION property of the iCal spec](https://www.kanzaki.com/docs/ical/location.html). + +`[ @start_time_utc = ] 'start_time_utc'` + + Is the start time of the calendar meeting, in UTC. The parameter is of type **datetime**. If the parameter is not specified, it defaults to **@timestamp_utc** + 5 hours. The parameter maps to the [DTSTART property of the iCal spec](https://www.kanzaki.com/docs/ical/dtstart.html) + +`[ @end_time_utc = ] 'end_time_utc'` + + Is the end time of the calendar meeting, in UTC. The parameter is of type **datetime**. If the parameter is not specified, it defaults to **@start_time_utc** + 1 hour. The parameter maps to the [DTEND property of the iCal spec](https://www.kanzaki.com/docs/ical/dtend.html). + +`[ @timestamp_utc = ] 'timestamp_utc'` + + Is the date and time when the calendar event was created, in UTC. The parameter is of type **datetime**. If the parameter is not specified, it defaults to current UTC time. The parameter maps to the [DTSTAMP property of the iCal spec](https://www.kanzaki.com/docs/ical/dtstamp.html). + +`[ @method = ] 'PUBLISH | REQUEST | REPLY | CANCEL | ADD | REFRESH | COUNTER | DECLINECOUNTER'` + + Is the method of the calendar event message. The parameter is of type **nvarchar(14)**. The parameter may contain one of the following values, as per the [METHOD property of the iCalendar Transport-independent Interoperability Protocol (iTIP)](https://documentation.open-xchange.com/7.10.1/middleware/components/calendar/iTip.html#methods): + +- PUBLISH +- REQUEST +- REPLY +- CANCEL +- ADD +- REFRESH +- COUNTER +- DECLINECOUNTER + + Defaults to REQUEST. + +`[ @sequence = ] sequence` + + Is the sequence of the calendar event message. The parameter is of type **int**, with a default of 0. Unless **@method** is specified as 'CANCEL', in which case the default would be 1. Proper usage of this parameter is important when updating existing calendar events, since each consecutive update must have a higher sequence number than the one before it. This parameter maps to the [SEQUENCE property of the iCal spec](https://www.kanzaki.com/docs/ical/sequence.html). + +`[ @prod_id = ] 'prod_id'` + + Is the PRODID property of the calendar meeting. The parameter is of type **nvarchar(255)**, with a default of 'Schedule a Meeting'. This parameter maps to the [PRODID property of the iCal spec](https://www.kanzaki.com/docs/ical/prodid.html). + +`[ @use_reminder = ] 1 | 0` + + Determines whether to add a reminder to the event. The parameter is of type **bit**, with a default of 1 (true), which adds a [VALARM component](https://www.kanzaki.com/docs/ical/valarm.html) to the iCal document. + +`[ @reminder_minutes = ] reminder_minutes` + + Is the number of minutes to set for the event reminder. The parameter is of type **int**, with a default of 15. The parameter maps to the [TRIGGER property of the iCal spec](https://www.kanzaki.com/docs/ical/trigger.html). + +`[ @require_rsvp = ] 1 | 0` + + Determines whether participants are required to respond with an RSVP. The parameter is of type **bit**, with a default of 0 (false). If this parameter equals to 0 (false), then all participants are assumed to have accepted their invitation, without requesting a response. The parameter maps to the [PARTSTAT](https://www.kanzaki.com/docs/ical/partstat.html) and [RSVP](https://www.kanzaki.com/docs/ical/rsvp.html) properties of the iCal spec. + +`[ @recipients_role = ] 'REQ-PARTICIPANT | OPT-PARTICIPANT | NON-PARTICIPANT | CHAIR'` + + Is the meeting role for the participants specified in the **@recipients** parameter. The parameter is of type **nvarchar(15)**. The parameter may contain one of the following values, as per the [ROLE property of the iCal spec](https://www.kanzaki.com/docs/ical/role.html): + +- REQ-PARTICIPANT +- OPT-PARTICIPANT +- NON-PARTICIPANT +- CHAIR + +Defaults to REQ-PARTICIPANT. + +`[ @copy_recipients_role = ] 'REQ-PARTICIPANT | OPT-PARTICIPANT | NON-PARTICIPANT | CHAIR'` + + Is the meeting role for the participants specified in the **@copy_recipients** parameter. The parameter is of type **nvarchar(15)**. The parameter may contain one of the following values, as per the [ROLE property of the iCal spec](https://www.kanzaki.com/docs/ical/role.html): + +- REQ-PARTICIPANT +- OPT-PARTICIPANT +- NON-PARTICIPANT +- CHAIR + +Defaults to OPT-PARTICIPANT. + +`[ @blind_copy_recipients_role = ] 'REQ-PARTICIPANT | OPT-PARTICIPANT | NON-PARTICIPANT | CHAIR'` + Is the meeting role for the participants specified in the **@blind_copy_recipients** parameter. The parameter is of type **nvarchar(15)**. The parameter may contain one of the following values, as per the [ROLE property of the iCal spec](https://www.kanzaki.com/docs/ical/role.html): + +- REQ-PARTICIPANT +- OPT-PARTICIPANT +- NON-PARTICIPANT +- CHAIR + +Defaults to NON-PARTICIPANT. + +`[ @smtp_servername = ] 'smtp_servername'` + + Is the SMTP server name to be used for sending the e-mail message. This is an optional parameter used to override the settings in the mail profile (or if no mail profile was specified). This parameter is of type **nvarchar(255)**. If no parameter is specified, and no mail profile was used, the default is 'localhost'. + +`[ @port = ] port` + + Is the SMTP server port to be used for sending the e-mail message. This is an optional parameter used to override the settings in the mail profile (or if no mail profile was specified). This parameter is of type **int**. If no parameter is specified, and no mail profile was used, the default is 25. + +`[ @enable_ssl = ] 1 | 0` + + Determines whether the SMTP server should use SSL authentication. This is an optional parameter used to override the settings in the mail profile (or if no mail profile was specified). This parameter is of type **bit**. If no parameter is specified, and no mail profile was used, the default is 0 (false). + +`[ @use_default_credentials = ] 1 | 0` + + Determines whether the SMTP server should use its default network credentials. This is an optional parameter used to override the settings in the mail profile (or if no mail profile was specified). This parameter is of type **bit**. If no parameter is specified, and no mail profile was used, the default is 0 (false). If **@username** is specified, this parameter is ignored. + +`[ @username = ] 'username'` + + Is the userame to be used when authenticating with the SMTP server. This is an optional parameter used to override the settings in the mail profile (or if no mail profile was specified). This parameter is of type **nvarchar(255)**. If no parameter is specified, and no mail profile was used, the default is to use the server's default network credentials instead. + +`[ @password = ] 'password'` + + Is the password to be used when authenticating with the SMTP server. This is an optional parameter used to override the settings in the mail profile (or if no mail profile was specified). This parameter is of type **nvarchar(255)**. If no parameter is specified, the default is to use an empty string for the password. + +| **NOTE:** Unfortunately, since MSDB doesn't allow access to the mail profile passwords, it's impossible to utilize an existing mail profile for getting the password for an SMTP server. Therefore, unless you want to use an empty password or default network credentials, *you must specify a value for this parameter*. | +| --- | + +`[ @suppress_info_messages = ] 1 | 0` + + Determines whether to *NOT* display the success message after sending the e-mail. The parameter is of type **bit**, with a default of 0 (false). + +`[ @event_identifier = ] 'event_identifier' [ OUTPUT ]` + + Optional output parameter returns the *event_identifier* of the calendar meeting. You may also override this value by specifying a parameter with a non-null value for it, in order to uniquely identify a calendar event. If no *event_identifier* was specified, a Global Unique Identifier (Guid) will automatically be generated instead. This parameter must be specified when **@method** is 'CANCEL'. The *event_identifier* is of type **nvarchar(255)**, and maps to the [UID property of the iCal spec](https://www.kanzaki.com/docs/ical/uid.html). + +`[ @ics_contents = ] 'ics_contents' [ OUTPUT ]` + + Optional output parameter returns the entire ICS attachment contents, as per the [iCal standard specifications](https://www.kanzaki.com/docs/ical/) for a **VCALENDAR** document with a **VEVENT** calendar component. The parameter is of type **nvarchar(max)**, with a default of NULL. This value is constructed dynamically based on the previous parameters that you can specify. However, you may also override this value by specifying a parameter with a non-null value for it, in order to completely ignore all the iCal-related parameters of the procedure, and try to send your own custom-made ICS attachment file. This means that you can construct your own VCALENDAR document, and try to implement various advanced functionalities not natively covered by **sp_send_calendar_event**, or even send a calendar component other than VEVENT, such as [VTODO](https://www.kanzaki.com/docs/ical/vtodo.html) or [VJOURNAL](https://www.kanzaki.com/docs/ical/vjournal.html). + +## Result Sets + + On success, returns the message "Mail Sent. Event Identifier: %s" (where %s is replaced with the sent **@event_identifier**), unless **@suppress_info_messages** is specified as 1 (true). + + On Failure, returns an error message specifying the problem. + +## Remarks + +I did my best to align the parameters of this procedure with Microsoft's **sp_send_dbmail** procedure. However, since this is a CLR procedure, there are limitations to what can be done. Specifically, it's impossible to define default values for parameters of type **nvarchar(max)** and **varchar(max)**, and so I had to create a wrapper procedure in T-SQL instead. + +Even though I tried to utilize Microsoft's Database Mail Profile mechanics, I couldn't get access to the account passwords (which is probably a good thing), and so the **@password** parameter becomes mandatory (unless you want to use an empty password or the server's default network credentials). + +I also didn't implement any functionality involving multiple accounts per profile to be used as "failover" accounts. So only the first account per profile is used. + +## Examples + +### A. Send a calendar invitation with RSVP requirement + +``` +DECLARE @EventID nvarchar(255) + +EXEC sp_send_calendar_event + @from_address = N'the_organizer@gmail.com', + @recipients = N'someone@gmail.com,otherguy@outlook.com', + @subject = N'let us meet for pizza!', + @body = N'

Pizza!

Bring your own beer!

', + @body_format = N'HTML', + @location = N'The Pizza place at Hank and Errison corner', + @start_time_utc = '2019-07-02 19:00', + @end_time_utc = '2019-07-02 23:00', + @timestamp_utc = '2019-03-30 18:00', + @smtp_server = 'smtp.gmail.com', + @port = 465, + @enable_ssl = 1, + @username = N'the_organizer@gmail.com', + @password = N'NotActuallyMyPassword', + @use_reminder = 1, + @reminder_minutes = 30, + @require_rsvp = 1, + @event_identifier = @EventID OUTPUT + +SELECT EventID = @EventID +``` + +### B. Cancel the previously sent invitation + +``` +EXEC sp_send_calendar_event + @from_address = N'the_organizer@gmail.com', + @recipients = N'someone@gmail.com,otherguy@outlook.com', + @subject = N'let us meet for pizza!', + @body = N'

Pizza!

Bring your own beer!

', + @body_format = N'HTML', + @location = N'The Pizza place at Hank and Errison corner', + @start_time_utc = '2019-07-02 19:00', + @end_time_utc = '2019-07-02 23:00', + @timestamp_utc = '2019-03-30 18:00', + @smtp_server = 'smtp.gmail.com', + @port = 465, + @enable_ssl = 1, + @username = N'the_organizer@gmail.com', + @password = N'NotActuallyMyPassword', + @require_rsvp = 1, + @method = 'CANCEL', + @event_identifier = @EventID OUTPUT + +SELECT EventID = @EventID +``` + +### C. Send an automated calendar invitation without RSVP requirement (i.e. participants are auto-accepted) + +``` +DECLARE @EventID nvarchar(255) + +EXEC sp_send_calendar_event + @from_address = N'sla_bot@company.com', + @recipients = N'employee1@company.com,employee2@company.com', + @subject = N'Weekly SLA Shift', + @body = N'

You are on-call this week!

This is an automated message

', + @body_format = N'HTML', + @location = N'Our offices', + @start_time_utc = '2019-07-01 00:00', + @end_time_utc = '2019-07-04 23:59', + @timestamp_utc = '2019-05-01 00:00', + @smtp_server = 'smtp.company.com', + @port = 587, + @enable_ssl = 1, + @username = N'sla_bot@company.com', + @password = N'SomethingPassword', + @use_reminder = 1, + @reminder_minutes = 300, + @require_rsvp = 0, + @event_identifier = @EventID OUTPUT + +SELECT EventID = @EventID +``` + ## License and copyright This project is copyrighted by Eitan Blumin, and licensed under the MIT license agreement. @@ -78,10 +352,11 @@ More info in [the license file](https://github.com/EitanBlumin/sql_clr_ics/blob/ ## Acknowledgements -This project was based mostly on the following stack overflow discussion: - -[https://stackoverflow.com/questions/22734403/send-email-to-outlook-with-ics-meeting-appointment](https://stackoverflow.com/questions/22734403/send-email-to-outlook-with-ics-meeting-appointment) +This project was based mostly on the following stack overflow discussion: [Send email to Outlook with ics meeting appointment](https://stackoverflow.com/questions/22734403/send-email-to-outlook-with-ics-meeting-appointment) -Also used the iCal specification for further improvements: +Also used the [RFC 2445 iCalendar specification](https://www.ietf.org/rfc/rfc2445.txt) as reference for further improvements and fine-tuning. -[https://www.kanzaki.com/docs/ical/](https://www.kanzaki.com/docs/ical/) +## See Also + [sp_send_dbmail](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-send-dbmail-transact-sql) + [clr_http_request](https://github.com/EitanBlumin/ClrHttpRequest) + [clr_wmi_request](https://github.com/EitanBlumin/ClrWmiRequest) diff --git a/sql_clr_ics/Properties/AssemblyInfo.cs b/sql_clr_ics/Properties/AssemblyInfo.cs index ad77073..f240707 100644 --- a/sql_clr_ics/Properties/AssemblyInfo.cs +++ b/sql_clr_ics/Properties/AssemblyInfo.cs @@ -19,7 +19,7 @@ // Build Number // Revision // -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: AssemblyVersion("2.0.0.0")] +[assembly: AssemblyFileVersion("2.0.0.0")] [assembly: System.Resources.NeutralResourcesLanguage("en-US")] diff --git a/sql_clr_ics/Script.PostDeployment.sql b/sql_clr_ics/Script.PostDeployment.sql deleted file mode 100644 index 491d354..0000000 --- a/sql_clr_ics/Script.PostDeployment.sql +++ /dev/null @@ -1,38 +0,0 @@ -/* -Post-Deployment Script ---------------------------------------------------- -This script re-creates the CLR stored procedure with default values for parameters -(which is not possible natively) -*/ -IF OBJECT_ID('clr_send_ics_invite') IS NOT NULL DROP PROCEDURE [dbo].[clr_send_ics_invite] -GO -SET ANSI_NULLS OFF -GO -SET QUOTED_IDENTIFIER OFF -GO -CREATE PROCEDURE [dbo].[clr_send_ics_invite] - @from [nvarchar](4000), - @to [nvarchar](4000), - @cc [nvarchar](4000) = null, - @reply_to [nvarchar](4000) = null, - @subject [nvarchar](4000), - @body [nvarchar](4000) = null, - @location [nvarchar](4000) = null, - @start_time_utc [datetime] = null, - @end_time_utc [datetime] = null, - @timestamp_utc [datetime] = null, - @smtp_server [nvarchar](4000) = null, - @port [int] = 25, - @use_ssl [bit] = 0, - @username [nvarchar](4000) = null, - @password [nvarchar](4000) = null, - @use_reminder [bit] = 1, - @reminder_minutes [int] = 15, - @require_rsvp [bit] = 0, - @cancel_event_identifier [uniqueidentifier] = null, - @event_identifier [uniqueidentifier] = null OUTPUT, - @suppress_info_messages [bit] = 0 -WITH EXECUTE AS CALLER -AS -EXTERNAL NAME [sql_clr_ics].[StoredProcedures].[clr_send_ics_invite] -GO \ No newline at end of file diff --git a/sql_clr_ics/clr_send_ics_invite.cs b/sql_clr_ics/clr_send_ics_invite.cs index 1fbf1ce..71ba983 100644 --- a/sql_clr_ics/clr_send_ics_invite.cs +++ b/sql_clr_ics/clr_send_ics_invite.cs @@ -3,181 +3,387 @@ using System.Net; using System.Net.Mail; using System.Data.SqlTypes; +using System.Data.SqlClient; +using Microsoft.SqlServer.Server; public partial class StoredProcedures { - [Microsoft.SqlServer.Server.SqlProcedure] + #region Enums and Constants + private enum iCalMethods + { + PUBLISH, + REQUEST, + REPLY, + CANCEL, + ADD, + REFRESH, + COUNTER, + DECLINECOUNTER + } + + private enum iCalClass + { + PUBLIC, + PRIVATE, + CONFIDENTIAL + } + + private static string[] iCalRoles = { "REQ-PARTICIPANT", "OPT-PARTICIPANT", "NON-PARTICIPANT", "CHAIR" }; + #endregion Enums and Constants + + [SqlProcedure] public static void clr_send_ics_invite( - SqlString from, SqlString to, SqlString cc, SqlString reply_to - , SqlString subject, SqlString body, SqlString location - , SqlDateTime start_time_utc, SqlDateTime end_time_utc, SqlDateTime timestamp_utc - , SqlString smtp_server, SqlInt32 port, SqlBoolean use_ssl, SqlString username, SqlString password + SqlString profile_name + , SqlString recipients, SqlString copy_recipients, SqlString blind_copy_recipients + , SqlString from_address, SqlString reply_to + , SqlString subject, SqlString body, SqlString body_format + , SqlString importance, SqlString sensitivity, SqlString file_attachments + , SqlString location, SqlDateTime start_time_utc, SqlDateTime end_time_utc, SqlDateTime timestamp_utc + , SqlString method, SqlInt32 sequence, SqlString prod_id , SqlBoolean use_reminder, SqlInt32 reminder_minutes, SqlBoolean require_rsvp - , SqlGuid cancel_event_identifier, out SqlGuid event_identifier + , SqlString recipients_role, SqlString copy_recipients_role, SqlString blind_copy_recipients_role + , SqlString smtp_servername, SqlInt32 port, SqlBoolean enable_ssl + , SqlBoolean use_default_credentials, SqlString username, SqlString password , SqlBoolean suppress_info_messages + , ref SqlString event_identifier, ref SqlString ics_contents ) { - #region validations + #region local variable declaration - StringBuilder sb_Errors = new StringBuilder(); + ICredentialsByHost credentials = CredentialCache.DefaultNetworkCredentials; + MailPriority mailPriority; - if (from.IsNull || String.IsNullOrEmpty(from.Value)) sb_Errors.AppendLine("Missing parameter: from"); - if (to.IsNull || String.IsNullOrEmpty(to.Value)) sb_Errors.AppendLine("Missing parameter: to"); - if (subject.IsNull || String.IsNullOrEmpty(subject.Value)) sb_Errors.AppendLine("Missing parameter: subject"); + #endregion local variable declaration - if (sb_Errors.Length > 0) throw new Exception("Unable to send mail due to validation error(s): " + sb_Errors); + #region get missing info from sysmail profile - #endregion validations + if (from_address.IsNull || (username.IsNull && use_default_credentials.IsNull) || !profile_name.IsNull) + { + SqlConnection con = new SqlConnection("context connection=true"); // using existing CLR context connection + SqlCommand cmd = con.CreateCommand(); + con.Open(); + + if (profile_name.IsNull) + { + cmd.CommandText = @"SELECT p.name +FROM [msdb].[dbo].[sysmail_principalprofile] AS pp +INNER JOIN [msdb].[dbo].[sysmail_profile] AS p +ON pp.profile_id = p.profile_id +WHERE pp.is_default = 1"; + + using (SqlDataReader rdr = cmd.ExecuteReader()) + { + if (!rdr.HasRows) + { + rdr.Close(); + con.Close(); + throw new Exception("profile_name not specified and no default profile found"); + } + else + { + profile_name = rdr.GetSqlString(0); + } + rdr.Close(); + } + } + + cmd.CommandText = @"SELECT TOP 1 a.email_address, a.replyto_address, s.servername, s.port, s.enable_ssl, s.use_default_credentials, s.username +FROM [msdb].[dbo].[sysmail_profile] AS p +INNER JOIN [msdb].[dbo].[sysmail_profileaccount] AS pa +ON p.profile_id = pa.profile_id +AND pa.sequence_number >= @Seq +INNER JOIN [msdb].[dbo].[sysmail_account] AS a +ON pa.account_id = a.account_id +INNER JOIN [msdb].[dbo].[sysmail_server] AS s +ON p.profile_id = s.account_id +WHERE p.name = @Profile +ORDER BY pa.sequence_number ASC"; + + cmd.Parameters.AddWithValue("@Seq", 1); + cmd.Parameters.AddWithValue("@Profile", profile_name.Value); + + using (SqlDataReader rdr = cmd.ExecuteReader()) + { + if (!rdr.HasRows) + { + rdr.Close(); + con.Close(); + throw new Exception(string.Format("profile_name '{0}' not found", profile_name.Value)); + } + else + { + if (from_address.IsNull) from_address = rdr.GetSqlString(0); + if (reply_to.IsNull) reply_to = rdr.GetSqlString(1); + if (smtp_servername.IsNull) smtp_servername = rdr.GetSqlString(2); + if (port.IsNull) port = rdr.GetSqlInt32(3); + if (enable_ssl.IsNull) enable_ssl = rdr.GetSqlBoolean(4); + if (use_default_credentials.IsNull) use_default_credentials = rdr.GetSqlBoolean(5).Value; + if (username.IsNull && !use_default_credentials.Value) username = rdr.GetSqlString(6); + } + rdr.Close(); + } + con.Close(); + } + + #endregion get missing info from sysmail profile #region default values initialization - if (start_time_utc.IsNull) start_time_utc = DateTime.Now.AddMinutes(+300); + if (subject.IsNull || string.IsNullOrEmpty(subject.Value)) subject = "SQL Server Meeting"; + if (body_format.IsNull || string.IsNullOrEmpty(body_format.Value)) body_format = "TEXT"; + if (timestamp_utc.IsNull) timestamp_utc = DateTime.UtcNow; + if (start_time_utc.IsNull) start_time_utc = timestamp_utc.Value.AddMinutes(+300); if (end_time_utc.IsNull) end_time_utc = start_time_utc.Value.AddMinutes(+60); if (reminder_minutes.IsNull) reminder_minutes = 15; if (use_reminder.IsNull) use_reminder = true; if (suppress_info_messages.IsNull) suppress_info_messages = false; + if (prod_id.IsNull || string.IsNullOrEmpty(prod_id.Value)) prod_id = "Schedule a Meeting"; + if (importance.IsNull || string.IsNullOrEmpty(importance.Value)) importance = "Normal"; + if (sensitivity.IsNull || string.IsNullOrEmpty(sensitivity.Value)) sensitivity = "Public"; - if (smtp_server.IsNull || String.IsNullOrEmpty(smtp_server.Value)) smtp_server = "localhost"; + if (smtp_servername.IsNull || string.IsNullOrEmpty(smtp_servername.Value)) smtp_servername = "localhost"; if (port.IsNull) port = 25; - if (use_ssl.IsNull) use_ssl = false; - if (timestamp_utc.IsNull) timestamp_utc = DateTime.UtcNow; + if (enable_ssl.IsNull) enable_ssl = false; - bool useDefaultCredentials = false; - ICredentialsByHost credentials = System.Net.CredentialCache.DefaultNetworkCredentials; - - if (username.IsNull || String.IsNullOrEmpty(username.Value)) + if (username.IsNull || string.IsNullOrEmpty(username.Value)) { - useDefaultCredentials = true; + use_default_credentials = true; } else { - if (password.IsNull || String.IsNullOrEmpty(password.Value)) password = ""; + if (password.IsNull || string.IsNullOrEmpty(password.Value)) password = ""; credentials = new NetworkCredential(username.Value, password.Value); } - if (!cancel_event_identifier.IsNull) - event_identifier = cancel_event_identifier.Value; - else - event_identifier = Guid.NewGuid(); + if (recipients_role.IsNull) recipients_role = "REQ-PARTICIPANT"; + if (copy_recipients_role.IsNull) copy_recipients_role = "OPT-PARTICIPANT"; + if (blind_copy_recipients_role.IsNull) blind_copy_recipients_role = "NON-PARTICIPANT"; + + if (method.IsNull) method = "REQUEST"; + if (sequence.IsNull) sequence = (method.Value == "CANCEL" ? 1 : 0); + if (event_identifier.IsNull) event_identifier = Guid.NewGuid().ToString(); #endregion default values initialization + #region validations + + StringBuilder sb_Errors = new StringBuilder(); + + if (from_address.IsNull || string.IsNullOrEmpty(from_address.Value)) sb_Errors.AppendLine("Missing sender: Please specify @from_address"); + if ( + (recipients.IsNull || string.IsNullOrEmpty(recipients.Value)) + && (copy_recipients.IsNull || string.IsNullOrEmpty(copy_recipients.Value)) + && (blind_copy_recipients.IsNull || string.IsNullOrEmpty(blind_copy_recipients.Value)) + ) + sb_Errors.AppendLine("Missing recipients: Please specify either @recipients, @copy_recipients or @blind_copy_recipients"); + + if (body_format.Value != "HTML" && body_format.Value != "TEXT") sb_Errors.AppendLine(string.Format("@body_format {0} is invalid. Valid values: TEXT, HTML", body_format.Value)); + if (!Enum.TryParse(method.Value, true, out iCalMethods method_enumvalue)) sb_Errors.AppendLine(string.Format("@method {0} is invalid. Valid values: {1}", method.Value, Enum.GetNames(typeof(iCalMethods)).ToString().ToUpper())); + if (!Enum.TryParse(sensitivity.Value, true, out iCalClass sensitivity_enumvalue)) sb_Errors.AppendLine(string.Format("sensitivity {0} is invalid. Valid values: {1}", sensitivity.Value, Enum.GetNames(typeof(iCalClass)).ToString().ToUpper())); + if (!Enum.TryParse(importance.Value, true, out mailPriority)) sb_Errors.AppendLine(string.Format("@importance {0} is invalid. Valid values: {1}", importance.Value, Enum.GetNames(typeof(MailPriority)).ToString().ToUpper())); + + bool recipient_role_found = false; + bool copy_recipient_role_found = false; + bool blind_copy_recipient_role_found = false; + + foreach (var item in iCalRoles) + { + if (!recipients.IsNull && item == recipients_role.Value) + { + recipient_role_found = true; + } + if (!copy_recipients.IsNull && item == copy_recipients_role.Value) + { + copy_recipient_role_found = true; + } + if (!blind_copy_recipients.IsNull && item == blind_copy_recipients_role.Value) + { + blind_copy_recipient_role_found = true; + } + if (recipient_role_found && copy_recipient_role_found && blind_copy_recipient_role_found) + { + break; + } + } + + if (!recipients.IsNull && !recipient_role_found) sb_Errors.AppendLine(string.Format("@recipients_role {0} is invalid. Valid values: {1}", recipients_role.Value, iCalRoles.ToString())); + if (!copy_recipients.IsNull && !copy_recipient_role_found) sb_Errors.AppendLine(string.Format("@copy_recipients_role {0} is invalid. Valid values: {1}", copy_recipients_role.Value, iCalRoles.ToString())); + if (!blind_copy_recipients.IsNull && !blind_copy_recipient_role_found) sb_Errors.AppendLine(string.Format("@blind_copy_recipients_role {0} is invalid. Valid values: {1}", blind_copy_recipients_role.Value, iCalRoles.ToString())); + + if (sb_Errors.Length > 0) throw new Exception("Unable to send mail due to validation error(s): " + sb_Errors); + + #endregion validations + #region initialize MailMessage and recipients MailMessage msg = new MailMessage(); msg.Subject = subject.Value; msg.Body = body.Value; + msg.Priority = mailPriority; + msg.IsBodyHtml = (body_format.Value == "HTML"); + + if (!file_attachments.IsNull) + { + foreach (var att_path in file_attachments.Value.Split(';')) + { + try + { + msg.Attachments.Add(new Attachment(att_path)); + } + catch (Exception e) + { + throw new Exception(string.Format("Unable to attach '{0}': {1}", att_path, e.Message)); + } + } + } try { - msg.From = new MailAddress(from.Value); + msg.From = new MailAddress(from_address.Value); } catch (Exception e) { - throw new Exception("From address is invalid: " + e.Message); + throw new Exception("@from_address is invalid: " + e.Message); } try { - if (!reply_to.IsNull && !String.IsNullOrEmpty(reply_to.Value)) msg.ReplyToList.Add(reply_to.Value.Replace(';', ',')); + if (!reply_to.IsNull && !string.IsNullOrEmpty(reply_to.Value)) msg.ReplyToList.Add(reply_to.Value.Replace(';', ',')); } catch (Exception e) { - throw new Exception("ReplyTo address is invalid: " + e.Message); + throw new Exception("@reply_to is invalid: " + e.Message); } try { - msg.To.Add(to.Value.Replace(';', ',')); + msg.To.Add(recipients.Value.Replace(';', ',')); } catch (Exception e) { - throw new Exception("To address is invalid: " + e.Message); + throw new Exception("@recipients is invalid: " + e.Message); } try { - if (!cc.IsNull && !String.IsNullOrEmpty(cc.Value)) msg.CC.Add(cc.Value.Replace(';', ',')); + if (!copy_recipients.IsNull && !string.IsNullOrEmpty(copy_recipients.Value)) msg.CC.Add(copy_recipients.Value.Replace(';', ',')); } catch (Exception e) { - throw new Exception("CC address is invalid: " + e.Message); + throw new Exception("@copy_recipients is invalid: " + e.Message); } - #endregion initialize MailMessage and recipients - - #region construct ICS file contents - - StringBuilder str = new StringBuilder(); - str.AppendLine("BEGIN:VCALENDAR"); - str.AppendLine("PRODID:-//Schedule a Meeting"); - str.AppendLine("VERSION:2.0"); - - if (cancel_event_identifier.IsNull) + try { - str.AppendLine("METHOD:REQUEST"); - str.AppendLine("SEQUENCE:0"); + if (!blind_copy_recipients.IsNull && !string.IsNullOrEmpty(blind_copy_recipients.Value)) msg.Bcc.Add(blind_copy_recipients.Value.Replace(';', ',')); } - else + catch (Exception e) { - str.AppendLine("METHOD:CANCEL"); - str.AppendLine("SEQUENCE:1"); + throw new Exception("@blind_copy_recipients is invalid: " + e.Message); } - str.AppendLine("BEGIN:VEVENT"); - str.AppendLine(string.Format("DTSTART:{0:yyyyMMddTHHmmssZ}", start_time_utc.Value)); - str.AppendLine(string.Format("DTSTAMP:{0:yyyyMMddTHHmmssZ}", timestamp_utc.Value)); - str.AppendLine(string.Format("DTEND:{0:yyyyMMddTHHmmssZ}", end_time_utc.Value)); - if (!location.IsNull) str.AppendLine("LOCATION: " + location.Value); - str.AppendLine(string.Format("UID:{0}", event_identifier.Value)); - str.AppendLine(string.Format("DESCRIPTION:{0}", msg.Body)); - str.AppendLine(string.Format("X-ALT-DESC;FMTTYPE=text/html:{0}", msg.Body)); - str.AppendLine(string.Format("SUMMARY:{0}", msg.Subject)); - str.AppendLine(string.Format("ORGANIZER:MAILTO:{0}", msg.From.Address)); - - string rsvp_string = (require_rsvp.Value ? "PARTSTAT=NEEDS-ACTION;RSVP=TRUE" : "PARTSTAT=ACCEPTED;RSVP=FALSE"); - bool organizer_in_recipients = false; - - foreach (MailAddress addr in msg.To) - { - if (addr.Address == msg.From.Address) organizer_in_recipients = true; - str.AppendLine(string.Format("ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;{2};CN=\"{0}\";X-NUM-GUESTS=0:mailto:{1}", addr.DisplayName, addr.Address, rsvp_string)); - } + #endregion initialize MailMessage and recipients - if (!organizer_in_recipients) str.AppendLine(string.Format("ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=NON-PARTICIPANT;PARTSTAT=ACCEPTED;RSVP=FALSE;CN=\"{0}\";X-NUM-GUESTS=0:mailto:{1}", msg.From.DisplayName, msg.From.Address)); + #region construct ICS file contents - if (use_reminder && cancel_event_identifier.IsNull) + if (ics_contents.IsNull) { - str.AppendLine("BEGIN:VALARM"); - str.AppendLine(string.Format("TRIGGER:-PT{0}M", reminder_minutes.Value)); - str.AppendLine("ACTION:DISPLAY"); - str.AppendLine("DESCRIPTION:Reminder"); - str.AppendLine("END:VALARM"); + StringBuilder ics_contents_str = new StringBuilder(); + ics_contents_str.AppendLine("BEGIN:VCALENDAR"); + ics_contents_str.AppendLine(string.Format("PRODID:-//{0}", prod_id.Value)); + ics_contents_str.AppendLine("VERSION:2.0"); + ics_contents_str.AppendLine(string.Format("METHOD:{0}", method.Value.ToUpper())); + ics_contents_str.AppendLine(string.Format("SEQUENCE:{0}", sequence.Value)); + + ics_contents_str.AppendLine("BEGIN:VEVENT"); + ics_contents_str.AppendLine(string.Format("DTSTART:{0:yyyyMMddTHHmmssZ}", start_time_utc.Value)); + ics_contents_str.AppendLine(string.Format("DTSTAMP:{0:yyyyMMddTHHmmssZ}", timestamp_utc.Value)); + ics_contents_str.AppendLine(string.Format("DTEND:{0:yyyyMMddTHHmmssZ}", end_time_utc.Value)); + if (!location.IsNull) ics_contents_str.AppendLine("LOCATION: " + location.Value); + ics_contents_str.AppendLine(string.Format("UID:{0}", event_identifier.Value)); + ics_contents_str.AppendLine(string.Format("DESCRIPTION:{0}", body.Value)); + ics_contents_str.AppendLine(string.Format("X-ALT-DESC;FMTTYPE={0}:{1}", body_format.Value == "HTML" ? "text/html" : "text/plain", body.Value)); + ics_contents_str.AppendLine(string.Format("SUMMARY:{0}", subject.Value)); + ics_contents_str.AppendLine(string.Format("ORGANIZER:MAILTO:{0}", msg.From.Address)); + ics_contents_str.AppendLine(string.Format("CLASS:{0}", sensitivity.Value.ToUpper())); + + switch (mailPriority) + { + case MailPriority.Normal: + ics_contents_str.AppendLine("PRIORITY:5"); + break; + case MailPriority.Low: + ics_contents_str.AppendLine("PRIORITY:9"); + break; + case MailPriority.High: + ics_contents_str.AppendLine("PRIORITY:1"); + break; + default: + break; + } + + string rsvp_string = (require_rsvp.Value ? "PARTSTAT=NEEDS-ACTION;RSVP=TRUE" : "PARTSTAT=ACCEPTED;RSVP=FALSE"); + bool organizer_in_recipients = false; + + foreach (MailAddress addr in msg.To) + { + if (addr.Address == msg.From.Address) organizer_in_recipients = true; + ics_contents_str.AppendLine(string.Format("ATTENDEE;CUTYPE=INDIVIDUAL;ROLE={3};{2};CN=\"{0}\";X-NUM-GUESTS=0:mailto:{1}", addr.DisplayName, addr.Address, rsvp_string, recipients_role.Value.ToUpper())); + } + + foreach (MailAddress addr in msg.CC) + { + if (addr.Address == msg.From.Address) organizer_in_recipients = true; + ics_contents_str.AppendLine(string.Format("ATTENDEE;CUTYPE=INDIVIDUAL;ROLE={3};{2};CN=\"{0}\";X-NUM-GUESTS=0:mailto:{1}", addr.DisplayName, addr.Address, rsvp_string, copy_recipients_role.Value.ToUpper())); + } + + foreach (MailAddress addr in msg.Bcc) + { + if (addr.Address == msg.From.Address) organizer_in_recipients = true; + ics_contents_str.AppendLine(string.Format("ATTENDEE;CUTYPE=INDIVIDUAL;ROLE={3};{2};CN=\"{0}\";X-NUM-GUESTS=0:mailto:{1}", addr.DisplayName, addr.Address, rsvp_string, blind_copy_recipients_role.Value.ToUpper())); + } + + if (!organizer_in_recipients) + { + msg.Bcc.Add(msg.From); + ics_contents_str.AppendLine(string.Format("ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=NON-PARTICIPANT;PARTSTAT=ACCEPTED;RSVP=FALSE;CN=\"{0}\";X-NUM-GUESTS=0:mailto:{1}", msg.From.DisplayName, msg.From.Address)); + } + + if (use_reminder && method.Value != "CANCEL") + { + ics_contents_str.AppendLine("BEGIN:VALARM"); + ics_contents_str.AppendLine(string.Format("TRIGGER:-PT{0}M", reminder_minutes.Value)); + ics_contents_str.AppendLine("ACTION:DISPLAY"); + ics_contents_str.AppendLine("DESCRIPTION:Reminder"); + ics_contents_str.AppendLine("END:VALARM"); + } + + ics_contents_str.AppendLine("END:VEVENT"); + ics_contents_str.AppendLine("END:VCALENDAR"); + + ics_contents = ics_contents_str.ToString(); } - str.AppendLine("END:VEVENT"); - str.AppendLine("END:VCALENDAR"); - #endregion construct ICS file contents #region initialize and configure SmtpClient - System.Net.Mail.SmtpClient smtpclient = new System.Net.Mail.SmtpClient(); + SmtpClient smtpclient = new SmtpClient(); try { - smtpclient.Host = smtp_server.Value; + smtpclient.Host = smtp_servername.Value; smtpclient.Port = port.Value; - smtpclient.UseDefaultCredentials = useDefaultCredentials; - smtpclient.EnableSsl = use_ssl.Value; + smtpclient.UseDefaultCredentials = use_default_credentials.Value; + smtpclient.EnableSsl = enable_ssl.Value; smtpclient.Credentials = credentials; System.Net.Mime.ContentType contype = new System.Net.Mime.ContentType("text/calendar"); contype.Parameters.Add("method", "REQUEST"); contype.Parameters.Add("name", "Meeting.ics"); - AlternateView HTML = AlternateView.CreateAlternateViewFromString(body.Value, new System.Net.Mime.ContentType("text/html")); - msg.AlternateViews.Add(HTML); - AlternateView avCal = AlternateView.CreateAlternateViewFromString(str.ToString(), contype); + AlternateView avBody = AlternateView.CreateAlternateViewFromString(body.Value, new System.Net.Mime.ContentType(body_format.Value == "HTML" ? "text/html" : "text/plain")); + msg.AlternateViews.Add(avBody); + AlternateView avCal = AlternateView.CreateAlternateViewFromString(ics_contents.Value, contype); msg.AlternateViews.Add(avCal); msg.Headers.Add("Content-class", "urn:content-classes:calendarmessage"); @@ -189,15 +395,19 @@ public static void clr_send_ics_invite( #endregion initialize and configure SmtpClient + #region send mail + try { smtpclient.Send(msg); if (!suppress_info_messages) - Microsoft.SqlServer.Server.SqlContext.Pipe.Send(string.Format("Mail Sent. Event Identifier: {0}", event_identifier.Value)); + SqlContext.Pipe.Send(string.Format("Mail Sent. Event Identifier: {0}", event_identifier.Value)); } catch (Exception e) { throw new Exception("Error sending mail: " + e.Message); } + + #endregion send mail } } \ No newline at end of file diff --git a/sql_clr_ics/sp_send_calendar_event.sql b/sql_clr_ics/sp_send_calendar_event.sql new file mode 100644 index 0000000..1ad7050 --- /dev/null +++ b/sql_clr_ics/sp_send_calendar_event.sql @@ -0,0 +1,48 @@ +/* + sql_clr_ics copyright (c) Eitan Blumin +--------------------------------------------------- +Source: https://github.com/EitanBlumin/sql_clr_ics +License: MIT (https://github.com/EitanBlumin/sql_clr_ics/blob/master/LICENSE) +--------------------------------------------------- +This serves as a wrapper for the CLR stored procedure with default values for parameters +(which is not possible natively for all data types in the CLR procedure itself) +*/ +CREATE PROCEDURE [dbo].[sp_send_calendar_event] + @profile_name [sysname] = NULL, + @recipients [nvarchar](max) = NULL, + @copy_recipients [nvarchar](max) = NULL, + @blind_copy_recipients [nvarchar](max) = NULL, + @from_address [nvarchar](max) = NULL, + @reply_to [nvarchar](max) = NULL, + @subject [nvarchar](255) = N'SQL Server Meeting', + @body [nvarchar](max) = NULL, + @body_format [nvarchar](20) = N'TEXT', + @importance [nvarchar](6) = N'Normal', + @sensitivity [nvarchar](12) = N'Public', + @file_attachments [nvarchar](max) = NULL, + @location [nvarchar](255) = NULL, + @start_time_utc [datetime] = NULL, + @end_time_utc [datetime] = NULL, + @timestamp_utc [datetime] = NULL, + @method [nvarchar](14) = N'REQUEST', + @sequence [int] = 0, + @prod_id [nvarchar](255) = NULL, + @use_reminder [bit] = 1, + @reminder_minutes [int] = 15, + @require_rsvp [bit] = 0, + @recipients_role [nvarchar](15) = N'REQ-PARTICIPANT', + @copy_recipients_role [nvarchar](15) = N'OPT-PARTICIPANT', + @blind_copy_recipients_role [nvarchar](15) = N'NON-PARTICIPANT', + @smtp_servername [nvarchar](255) = N'localhost', + @port [int] = 25, + @enable_ssl [bit] = 0, + @use_default_credentials [bit] = 0, + @username [nvarchar](255) = NULL, + @password [nvarchar](255) = NULL, + @suppress_info_messages [bit] = 0, + @event_identifier [nvarchar](255) = NULL OUTPUT, + @ics_contents [nvarchar](MAX) = NULL OUTPUT +WITH EXECUTE AS CALLER +AS +SET NOCOUNT ON; +EXEC dbo.[clr_send_ics_invite] @profile_name, @recipients, @copy_recipients, @blind_copy_recipients, @from_address, @reply_to, @subject, @body, @body_format, @importance, @sensitivity, @file_attachments, @location, @start_time_utc, @end_time_utc, @timestamp_utc, @method, @sequence, @prod_id, @use_reminder, @reminder_minutes, @require_rsvp, @recipients_role, @copy_recipients_role, @blind_copy_recipients_role, @smtp_servername, @port, @enable_ssl, @use_default_credentials, @username, @password, @suppress_info_messages, @event_identifier OUTPUT, @ics_contents OUTPUT diff --git a/sql_clr_ics/sql_clr_ics.sqlproj b/sql_clr_ics/sql_clr_ics.sqlproj index c5aee45..8c8c78e 100644 --- a/sql_clr_ics/sql_clr_ics.sqlproj +++ b/sql_clr_ics/sql_clr_ics.sqlproj @@ -73,9 +73,6 @@ - - - @@ -84,4 +81,7 @@ PreserveNewest + + + \ No newline at end of file diff --git a/sql_clr_ics/sql_clr_ics_install.sql b/sql_clr_ics/sql_clr_ics_install.sql index 36281e7..7f20f47 100644 --- a/sql_clr_ics/sql_clr_ics_install.sql +++ b/sql_clr_ics/sql_clr_ics_install.sql @@ -46,6 +46,8 @@ BEGIN END END GO +IF OBJECT_ID('sp_send_calendar_event') IS NOT NULL DROP PROCEDURE [dbo].[sp_send_calendar_event] +GO IF OBJECT_ID('clr_send_ics_invite') IS NOT NULL DROP PROCEDURE [dbo].[clr_send_ics_invite] GO IF EXISTS (SELECT * FROM sys.assemblies WHERE name = 'sql_clr_ics') DROP ASSEMBLY [sql_clr_ics]; @@ -54,38 +56,71 @@ PRINT N'Creating Assembly [dbo].[sql_clr_ics]...'; GO CREATE ASSEMBLY [sql_clr_ics] AUTHORIZATION [dbo] - FROM 0x4D5A90000300000004000000FFFF0000B800000000000000400000000000000000000000000000000000000000000000000000000000000000000000800000000E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000504500004C0103007BBEE25C0000000000000000E00022200B013000002200000008000000000000B241000000200000006000000000001000200000000200000400000000000000060000000000000000A000000002000000000000030060850000100000100000000010000010000000000000100000000000000000000000604100004F000000006000000404000000000000000000000000000000000000008000000C000000284000001C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000080000000000000000000000082000004800000000000000000000002E74657874000000B8210000002000000022000000020000000000000000000000000000200000602E7273726300000004040000006000000006000000240000000000000000000000000000400000402E72656C6F6300000C0000000080000000020000002A0000000000000000000000000000400000420000000000000000000000000000000094410000000000004800000002000500902800009817000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001B300500CE0700000100001100730E00000A0A0F00280F00000A2D0E0F00281000000A281100000A2B0117130811082C0C0672010000706F1200000A260F01280F00000A2D0E0F01281000000A281100000A2B0117130911092C0C0672310000706F1200000A260F04280F00000A2D0E0F04281000000A281100000A2B0117130A110A2C0C06725D0000706F1200000A26066F1300000A16FE02130B110B2C11729300007006281400000A731500000A7A0F07281600000A130C110C2C1E281700000A130D120D230000000000C07240281800000A281900000A10070F08281600000A130E110E2C200F07281A00000A130D120D230000000000004E40281800000A281900000A10080F10281B00000A130F110F2C091F0F281C00000A10100F0F281D00000A131011102C0817281E00000A100F0F14281D00000A131111112C0816281E00000A10140F0A280F00000A2D0E0F0A281000000A281100000A2B0117131211122C0C72F5000070281F00000A100A0F0B281B00000A131311132C091F19281C00000A100B0F0C281D00000A131411142C0816281E00000A100C0F09281600000A131511152C0C282000000A281900000A1009160B282100000A0C0F0D280F00000A2D0E0F0D281000000A281100000A2B0117131611162C0600170B002B40000F0E280F00000A2D0E0F0E281000000A281100000A2B0117131711172C0C7209010070281F00000A100E0F0D281000000A0F0E281000000A732200000A0C000F12282300000A16FE01131811182C150E130F12282400000A282500000A81140000012B110E13282600000A282500000A8114000001732700000A0D090F04281000000A6F2800000A00090F05281000000A6F2900000A0000090F00281000000A732A00000A6F2B00000A0000DE1A131900720B01007011196F2C00000A282D00000A731500000A7A00000F03280F00000A2D110F03281000000A281100000A16FE012B0116131A111A2C1C096F2E00000A0F03281000000A1F3B1F2C6F2F00000A6F3000000A0000DE1A131B00723F010070111B6F2C00000A282D00000A731500000A7A0000096F3100000A0F01281000000A1F3B1F2C6F2F00000A6F3000000A0000DE1A131C007279010070111C6F2C00000A282D00000A731500000A7A00000F02280F00000A2D110F02281000000A281100000A16FE012B0116131D111D2C1C096F3200000A0F02281000000A1F3B1F2C6F2F00000A6F3000000A0000DE1A131E0072A9010070111E6F2C00000A282D00000A731500000A7A730E00000A1304110472D90100706F1200000A26110472F90100706F1200000A26110472330200706F1200000A260F12282300000A131F111F2C1E001104724B0200706F1200000A26110472690200706F1200000A26002B1C001104727F0200706F1200000A261104729B0200706F1200000A2600110472B10200706F1200000A26110472CB0200700F07281A00000A8C19000001283300000A6F1200000A26110472050300700F09281A00000A8C19000001283300000A6F1200000A261104723F0300700F08281A00000A8C19000001283300000A6F1200000A260F06280F00000A16FE01132011202C19110472750300700F06281000000A282D00000A6F1200000A261104728B0300700E13282400000A8C22000001283300000A6F1200000A261104729B030070096F3400000A283300000A6F1200000A26110472BB030070096F3400000A283300000A6F1200000A26110472FD030070096F3500000A283300000A6F1200000A2611047215040070096F3600000A6F3700000A283300000A6F1200000A260F11283800000A2D07723F0400702B057279040070130516130600096F3100000A6F3900000A13212B4D11216F3A00000A13220011226F3700000A096F3600000A6F3700000A283B00000A132311232C03171306110472B904007011226F3C00000A11226F3700000A1105283D00000A6F1200000A260011216F3E00000A2DAADE0D11212C0811216F3F00000A00DC110616FE01132411242C2811047268050070096F3600000A6F3C00000A096F3600000A6F3700000A284000000A6F1200000A260E0F13261126284100000A2D1511260F12282300000A281E00000A284200000A2B021126284300000A132511252C5400110472490600706F1200000A26110472630600700F10284400000A8C27000001283300000A6F1200000A26110472830600706F1200000A26110472A10600706F1200000A26110472CB0600706F1200000A2600110472E10600706F1200000A26110472F70600706F1200000A26734500000A13070011070F0A281000000A6F4600000A0011070F0B284400000A6F4700000A001107076F4800000A0011070F0C283800000A6F4900000A001107086F4A00000A007213070070734B00000A132711276F4C00000A722F070070723D0700706F4D00000A0011276F4C00000A724D07007072570700706F4D00000A000F05281000000A726F070070734B00000A284E00000A1328096F4F00000A11286F5000000A0011046F5100000A1127284E00000A1329096F4F00000A11296F5000000A00096F5200000A7283070070729F0700706F5300000A0000DE1A132A0072E7070070112A6F2C00000A282D00000A731500000A7A00001107096F5400000A000E14285500000A284300000A132B112B2C21285600000A722B0800700E13282400000A8C22000001283300000A6F5700000A0000DE1A132C00726D080070112C6F2C00000A282D00000A731500000A7A2A00000158000000006F021786021A1A0000010000A10241E2021A1A0000010000FD02201D031A1A000001000038034179031A1A000001020043055A9D050D0000000000008106D758071A1A0000010000730740B3071A1A0000012202285800000A002A00000042534A4201000100000000000C00000076342E302E33303331390000000005006C000000C8040000237E0000340500007007000023537472696E677300000000A40C000098080000235553003C1500001000000023475549440000004C1500004C02000023426C6F620000000000000002000001471502080900000000FA013300160000010000002C000000020000000200000015000000580000000D00000001000000030000000100000003000000000090030100000000000600760207050600E30207050600C101F4040F00380500000600D501F30306005902F30306003A02F3030600CA02F30306009602F3030600AF02F30306000202F30306001D02F30306009F01270506004F06C1030A00EC01A1040A0013035E050A0046015E050A001C005E050A00DF035E050A00B5005E0506006E04F5060E00D90676060E00F50080030E008D06800306004901C10306004704C10306000E004D000E00220680030E006E0136010E000C07800306003D03C1030E00010176060E004F0376060600C000C1030E00190480030600010061030600C804E80506001101C10306001F00C1030E00440796000E002F0480030E00050496000A000107A1040A006601A1040000000025000000000001000100010010007305000039000100010050200000000096008B01740101008428000000008618E2040600160000000100DA03000002005E04000003004A00000004005804000005006E06000006003F0700000700EA0300000800750000000900680000000A00840000000B00BC0400000C00BB0600000D00B90300000E002D0100000F00D800000010007C04000011008F050000120061040000130089040200140090040000150047050900E20401001100E20406001900E2040A002900E20410003100E20410003900E20410004100E20410004900E20410005100E20410005900E20410006100E20410006900E20410007900E2040600A900E20406008100A0035B00810001035F00F90061076300A90052016800A90044036E00F90041067200D100E20410008900A0035B00C9001A077800C90084057D00890081068300890001038A009100A0035B00910081068F009900A0035B00990081069500810081069B00C900220778000101B005A1000901E204A700A100A0035B00A1000103AD00A1008106B3001101BD00BB00B900E2040600B90062061000B90036071000E100E2041000B900D103C100D100E9005F00F9004106C700B900C006CD00F900E100D300190192001000B9005104CD00B9002E00CD00F9004806D900B9002D075F00B90056065F00B900C803DF00E10016065F00990001035B000C00D404EC0014009806FC00F90055070101E1001D015F00F900480607012901EC065B00310183010600F90048060F0199007A0116019900C5001C0199000B031601910001036E00C100E2040600C100D0061000C100B2060100C100CE052501C100AB032501C100A0052A01E900E2041000E9000706300141019200A700F1001D033601B9002E063E011C0092004C0171003B035F00B900FB05520151019200A700C100D30058019900A4065E0159015D0165016101D30010007100E204060020006B0045022E000B00A3012E001300AC012E001B00CB012E002300D4012E002B00E5012E00330015022E003B001B022E004300D4012E004B001B022E0053001B022E005B002D022E0063003A021500E400F5004401048000000100000000000000000000000000E80400000400000000000000000000006B014100000000000400000000000000000000006B013500000000000400000000000000000000006B01C103000000000000000000436F6C6C656374696F6E60310049456E756D657261746F7260310053716C496E743332003C4D6F64756C653E006765745F43430053797374656D2E44617461006D73636F726C69620063630053797374656D2E436F6C6C656374696F6E732E47656E6572696300656E645F74696D655F7574630073746172745F74696D655F7574630074696D657374616D705F757463004164640053797374656D2E436F6C6C656374696F6E732E5370656369616C697A65640053716C47756964004E657747756964006F705F42697477697365416E640053656E640070617373776F7264005265706C616365006765745F4D657373616765004D61696C4D6573736167650043726564656E7469616C43616368650049446973706F7361626C65006765745F446973706C61794E616D6500757365726E616D650053797374656D2E4E65742E4D696D650053716C4461746554696D6500417070656E644C696E65006765745F506970650053716C5069706500436F6E74656E7454797065006F705F46616C736500446973706F736500636C725F73656E645F6963735F696E76697465004E65757472616C5265736F75726365734C616E67756167654174747269627574650044656275676761626C6541747472696275746500417373656D626C795469746C654174747269627574650053716C50726F63656475726541747472696275746500417373656D626C7954726164656D61726B41747472696275746500417373656D626C7946696C6556657273696F6E41747472696275746500417373656D626C79436F6E66696775726174696F6E41747472696275746500417373656D626C794465736372697074696F6E41747472696275746500436F6D70696C6174696F6E52656C61786174696F6E7341747472696275746500417373656D626C7950726F6475637441747472696275746500417373656D626C79436F7079726967687441747472696275746500417373656D626C79436F6D70616E794174747269627574650052756E74696D65436F6D7061746962696C697479417474726962757465006765745F56616C7565006F705F547275650053716C537472696E6700437265617465416C7465726E6174655669657746726F6D537472696E6700546F537472696E67006765745F4C656E677468004E6574776F726B43726564656E7469616C0053797374656D2E436F6C6C656374696F6E732E4F626A6563744D6F64656C0053797374656D2E4E65742E4D61696C0073716C5F636C725F6963732E646C6C006765745F49734E756C6C007365745F456E61626C6553736C007573655F73736C0053797374656D006765745F46726F6D007365745F46726F6D0066726F6D0053716C426F6F6C65616E006C6F636174696F6E0053797374656D2E5265666C656374696F6E004E616D6556616C7565436F6C6C656374696F6E004D61696C41646472657373436F6C6C656374696F6E00416C7465726E61746556696577436F6C6C656374696F6E00457863657074696F6E006765745F546F007265706C795F746F00726571756972655F7273767000537472696E674275696C646572007573655F72656D696E6465720063616E63656C5F6576656E745F6964656E746966696572004D6963726F736F66742E53716C5365727665722E53657276657200736D74705F7365727665720049456E756D657261746F7200476574456E756D657261746F72002E63746F720073716C5F636C725F6963730053797374656D2E446961676E6F73746963730053797374656D2E52756E74696D652E436F6D70696C657253657276696365730053797374656D2E5265736F757263657300446562756767696E674D6F6465730073757070726573735F696E666F5F6D657373616765730053797374656D2E446174612E53716C54797065730053746F72656450726F63656475726573004164644D696E757465730072656D696E6465725F6D696E75746573007365745F43726564656E7469616C73006765745F44656661756C744E6574776F726B43726564656E7469616C73007365745F55736544656661756C7443726564656E7469616C730053797374656D2E436F6C6C656374696F6E73006765745F48656164657273006765745F506172616D6574657273006765745F41646472657373004D61696C41646472657373006765745F416C7465726E617465566965777300436F6E63617400466F726D6174004F626A656374006765745F5375626A656374007365745F5375626A656374007375626A6563740053797374656D2E4E6574006F705F496D706C6963697400536D7470436C69656E74006765745F43757272656E74006F705F4C6F676963616C4E6F74007365745F506F727400706F7274006765745F5265706C79546F4C697374007365745F486F7374004943726564656E7469616C734279486F7374004D6F76654E6578740053797374656D2E546578740053716C436F6E7465787400416C7465726E61746556696577006765745F4E6F77006765745F5574634E6F77006765745F426F6479007365745F426F647900626F647900537472696E6744696374696F6E617279006F705F457175616C6974790049734E756C6C4F72456D7074790000002F4D0069007300730069006E006700200070006100720061006D0065007400650072003A002000660072006F006D00002B4D0069007300730069006E006700200070006100720061006D0065007400650072003A00200074006F0000354D0069007300730069006E006700200070006100720061006D0065007400650072003A0020007300750062006A00650063007400006155006E00610062006C006500200074006F002000730065006E00640020006D00610069006C002000640075006500200074006F002000760061006C00690064006100740069006F006E0020006500720072006F0072002800730029003A00200000136C006F00630061006C0068006F007300740000010033460072006F006D0020006100640064007200650073007300200069007300200069006E00760061006C00690064003A00200000395200650070006C00790054006F0020006100640064007200650073007300200069007300200069006E00760061006C00690064003A002000002F54006F0020006100640064007200650073007300200069007300200069006E00760061006C00690064003A002000002F4300430020006100640064007200650073007300200069007300200069006E00760061006C00690064003A002000001F42004500470049004E003A005600430041004C0045004E004400410052000039500052004F004400490044003A002D002F002F005300630068006500640075006C0065002000610020004D0065006500740069006E0067000117560045005200530049004F004E003A0032002E003000001D4D004500540048004F0044003A0052004500510055004500530054000015530045005100550045004E00430045003A003000001B4D004500540048004F0044003A00430041004E00430045004C000015530045005100550045004E00430045003A003100001942004500470049004E003A0056004500560045004E005400003944005400530054004100520054003A007B0030003A0079007900790079004D004D00640064005400480048006D006D00730073005A007D000039440054005300540041004D0050003A007B0030003A0079007900790079004D004D00640064005400480048006D006D00730073005A007D0000354400540045004E0044003A007B0030003A0079007900790079004D004D00640064005400480048006D006D00730073005A007D0000154C004F0043004100540049004F004E003A002000000F5500490044003A007B0030007D00001F4400450053004300520049005000540049004F004E003A007B0030007D00004158002D0041004C0054002D0044004500530043003B0046004D00540054005900500045003D0074006500780074002F00680074006D006C003A007B0030007D000117530055004D004D004100520059003A007B0030007D0000294F005200470041004E0049005A00450052003A004D00410049004C0054004F003A007B0030007D000039500041005200540053005400410054003D00410043004300450050005400450044003B0052005300560050003D00460041004C0053004500003F500041005200540053005400410054003D004E0045004500440053002D0041004300540049004F004E003B0052005300560050003D0054005200550045000180AD41005400540045004E004400450045003B004300550054005900500045003D0049004E0044004900560049004400550041004C003B0052004F004C0045003D005200450051002D005000410052005400490043004900500041004E0054003B007B0032007D003B0043004E003D0022007B0030007D0022003B0058002D004E0055004D002D004700550045005300540053003D0030003A006D00610069006C0074006F003A007B0031007D000180DF41005400540045004E004400450045003B004300550054005900500045003D0049004E0044004900560049004400550041004C003B0052004F004C0045003D004E004F004E002D005000410052005400490043004900500041004E0054003B00500041005200540053005400410054003D00410043004300450050005400450044003B0052005300560050003D00460041004C00530045003B0043004E003D0022007B0030007D0022003B0058002D004E0055004D002D004700550045005300540053003D0030003A006D00610069006C0074006F003A007B0031007D00011942004500470049004E003A00560041004C00410052004D00001F54005200490047004700450052003A002D00500054007B0030007D004D00011D41004300540049004F004E003A0044004900530050004C004100590000294400450053004300520049005000540049004F004E003A00520065006D0069006E00640065007200001545004E0044003A00560041004C00410052004D00001545004E0044003A0056004500560045004E005400001B45004E0044003A005600430041004C0045004E00440041005200001B74006500780074002F00630061006C0065006E00640061007200000D6D006500740068006F006400000F520045005100550045005300540000096E0061006D00650000174D0065006500740069006E0067002E00690063007300001374006500780074002F00680074006D006C00001B43006F006E00740065006E0074002D0063006C006100730073000147750072006E003A0063006F006E00740065006E0074002D0063006C00610073007300650073003A00630061006C0065006E006400610072006D00650073007300610067006500014353004D0054005000200043006C00690065006E007400200043006F006E00660069006700750072006100740069006F006E0020004500720072006F0072003A00200000414D00610069006C002000530065006E0074002E0020004500760065006E00740020004900640065006E007400690066006900650072003A0020007B0030007D0000294500720072006F0072002000730065006E00640069006E00670020006D00610069006C003A00200000008B63F2930F18DC4F822439AA2ADA67FB00042001010803200001052001011111042001010E45072D1255021259125D12550E02126102020202021165020202020202020202020212690212691269021269020215126D0112711271020202114D1275127912791269021269032000020320000E040001020E05200112550E032000080500020E1C1C040000116505200111650D060001114511650420001165050001114908050001114D0205000111410E050000128085052002010E0E05200011808907000111511180890500001180890520010112710500020E0E0E05200012808D0520020E03030500020E0E1C0420001271071512809101127108200015126D0113000615126D0112710420001300050002020E0E0700040E0E1C1C1C0600030E0E1C1C05000102114D080002114D114D114D04200101020520010112590520001280A107000212790E12750520001280A507151280910112790520010113000520001280A905200101125D060001114D114D0500001280B108B77A5C561934E0892E001501114111411141114111411141114111451145114511411149114D11411141114D1149114D1151101151114D0801000800000000001E01000100540216577261704E6F6E457863657074696F6E5468726F7773010801000701000000001001000B73716C5F636C725F69637300002F01002A53656E64204943532063616C656E64617220696E7669746573207573696E672053514C2053657276657200000501000000001101000C456974616E20426C756D696E00000C010007312E302E302E3000000A010005656E2D5553000004010000000000000000007BBEE25C00000000020000001C0100004440000044220000525344536F90C957F826E94D9D051ED792100F7E01000000433A5C55736572735C757365725C536F757263655C5265706F735C73716C5F636C725F6963735C73716C5F636C725F6963735C6F626A5C44656275675C73716C5F636C725F6963732E70646200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000884100000000000000000000A241000000200000000000000000000000000000000000000000000094410000000000000000000000005F436F72446C6C4D61696E006D73636F7265652E646C6C0000000000FF250020001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100100000001800008000000000000000000000000000000100010000003000008000000000000000000000000000000100000000004800000058600000A80300000000000000000000A80334000000560053005F00560045005200530049004F004E005F0049004E0046004F0000000000BD04EFFE00000100000001000000000000000100000000003F000000000000000400000002000000000000000000000000000000440000000100560061007200460069006C00650049006E0066006F00000000002400040000005400720061006E0073006C006100740069006F006E00000000000000B00408030000010053007400720069006E006700460069006C00650049006E0066006F000000E402000001003000300030003000300034006200300000006E002B00010043006F006D006D0065006E00740073000000530065006E00640020004900430053002000630061006C0065006E00640061007200200069006E007600690074006500730020007500730069006E0067002000530051004C002000530065007200760065007200000000003A000D00010043006F006D00700061006E0079004E0061006D0065000000000045006900740061006E00200042006C0075006D0069006E000000000040000C000100460069006C0065004400650073006300720069007000740069006F006E0000000000730071006C005F0063006C0072005F006900630073000000300008000100460069006C006500560065007200730069006F006E000000000031002E0030002E0030002E003000000040001000010049006E007400650072006E0061006C004E0061006D0065000000730071006C005F0063006C0072005F006900630073002E0064006C006C0000003E000D0001004C006500670061006C0043006F007000790072006900670068007400000045006900740061006E00200042006C0075006D0069006E000000000042000D0001004C006500670061006C00540072006100640065006D00610072006B0073000000000045006900740061006E00200042006C0075006D0069006E00000000004800100001004F0072006900670069006E0061006C00460069006C0065006E0061006D0065000000730071006C005F0063006C0072005F006900630073002E0064006C006C00000038000C000100500072006F0064007500630074004E0061006D00650000000000730071006C005F0063006C0072005F006900630073000000340008000100500072006F006400750063007400560065007200730069006F006E00000031002E0030002E0030002E003000000038000800010041007300730065006D0062006C0079002000560065007200730069006F006E00000031002E0030002E0030002E00300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000C000000B43100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + FROM 0x4D5A90000300000004000000FFFF0000B800000000000000400000000000000000000000000000000000000000000000000000000000000000000000800000000E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000504500004C010300BE35EA5C0000000000000000E00022200B013000003E00000008000000000000DA5C000000200000006000000000001000200000000200000400000000000000060000000000000000A000000002000000000000030060850000100000100000000010000010000000000000100000000000000000000000885C00004F000000006000000404000000000000000000000000000000000000008000000C000000505B00001C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000080000000000000000000000082000004800000000000000000000002E74657874000000E03C000000200000003E000000020000000000000000000000000000200000602E7273726300000004040000006000000006000000400000000000000000000000000000400000402E72656C6F6300000C0000000080000000020000004600000000000000000000000000004000004200000000000000000000000000000000BC5C0000000000004800000002000500E03200007028000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001B3006000E1100000100001100280E00000A0A0F04280F00000A2D1E0F1D280F00000A2C090F1C281000000A2D0C0F00280F00000A16FE012B0117130A110A39F5010000007201000070731100000A130B110B6F1200000A130C110B6F1300000A000F00280F00000A130D110D2C6900110C72310000706F1400000A00110C6F1500000A130E00110E6F1600000A16FE01130F110F2C1C00110E6F1700000A00110B6F1800000A00728A010070731900000A7A00110E166F1A00000A100000110E6F1700000A0000DE0D110E2C08110E6F1B00000A00DC00110C72FA0100706F1400000A00110C6F1C00000A72EB050070178C2B0000016F1D00000A26110C6F1C00000A72F50500700F00281E00000A6F1D00000A26110C6F1500000A13100011106F1600000A16FE01131111112C280011106F1700000A00110B6F1800000A0072070600700F00281E00000A281F00000A731900000A7A000F04280F00000A131211122C0A1110166F1A00000A10040F05280F00000A131311132C0A1110176F1A00000A10050F19280F00000A131411142C0A1110186F1A00000A10190F1A282000000A131511152C0A1110196F2100000A101A0F1B281000000A131611162C0A11101A6F2200000A101B0F1C281000000A131711172C1811101B6F2200000A13181218282300000A282400000A101C0F1D280F00000A2C0C0F1C282300000A16FE012B0116131911192C0A11101C6F1A00000A101D0011106F1700000A0000DE0D11102C0811106F1B00000A00DC110B6F1800000A00000F06280F00000A2D0E0F06281E00000A282500000A2B0117131A111A2C0C7241060070282600000A10060F08280F00000A2D0E0F08281E00000A282500000A2B0117131B111B2C0C7267060070282600000A10080F0F282700000A131C111C2C0C282800000A282900000A100F0F0D282700000A131D111D2C200F0F282A00000A131E121E230000000000C07240282B00000A282900000A100D0F0E282700000A131F111F2C200F0D282A00000A131E121E230000000000004E40282B00000A282900000A100E0F14282000000A132011202C091F0F282C00000A10140F13281000000A132111212C0817282400000A10130F1F281000000A132211222C0816282400000A101F0F12280F00000A2D0E0F12281E00000A282500000A2B0117132311232C0C7271060070282600000A10120F09280F00000A2D0E0F09281E00000A282500000A2B0117132411242C0C7297060070282600000A10090F0A280F00000A2D0E0F0A281E00000A282500000A2B0117132511252C0C72A5060070282600000A100A0F19280F00000A2D0E0F19281E00000A282500000A2B0117132611262C0C72B3060070282600000A10190F1A282000000A132711272C091F19282C00000A101A0F1B281000000A132811282C0816282400000A101B0F1D280F00000A2D0E0F1D281E00000A282500000A2B0117132911292C0C0017282400000A101C002B40000F1E280F00000A2D0E0F1E281E00000A282500000A2B0117132A112A2C0C72C7060070282600000A101E0F1D281E00000A0F1E281E00000A732D00000A0A000F16280F00000A132B112B2C0C72C9060070282600000A10160F17280F00000A132C112C2C0C72E9060070282600000A10170F18280F00000A132D112D2C0C7209070070282600000A10180F10280F00000A132E112E2C0C7229070070282600000A10100F11282000000A132F112F2C1E0F10281E00000A7239070070282E00000A2D03162B0117282C00000A10110E20280F00000A133011302C200E20282F00000A13311231FE161D0000016F3000000A282600000A8110000001733100000A0C0F04280F00000A2D0E0F04281E00000A282500000A2B0117133211322C0C0872470700706F3200000A260F01280F00000A2D0E0F01281E00000A282500000A2C310F02280F00000A2D0E0F02281E00000A282500000A2C1A0F03280F00000A2D0E0F03281E00000A282500000A2B01172B0116133311332C0C0872A10700706F3200000A260F08281E00000A7266080070283300000A2C130F08281E00000A7267060070283300000A2B0116133411342C180872700800700F08281E00000A281F00000A6F3200000A260F10281E00000A171203280100002B16FE01133511352C310872DC0800700F10281E00000AD003000002283500000A283600000A6F3000000A6F3700000A283800000A6F3200000A260F0A281E00000A171204280200002B16FE01133611362C310872300900700F0A281E00000AD004000002283500000A283600000A6F3000000A6F3700000A283800000A6F3200000A260F09281E00000A171201280300002B16FE01133711372C3108728C0900700F09281E00000AD015000001283500000A283600000A6F3000000A6F3700000A283800000A6F3200000A26161305161306161307007E010000041338161339388F000000113811399A133A000F01280F00000A2D10113A0F16281E00000A282E00000A2B0116133B113B2C0500171305000F02280F00000A2D10113A0F17281E00000A282E00000A2B0116133C113C2C0500171306000F03280F00000A2D10113A0F18281E00000A282E00000A2B0116133D113D2C050017130700110511065F11075F133E113E2C03002B1200113917581339113911388E693F66FFFFFF0F01280F00000A2D07110516FE012B0116133F113F2C220872E80900700F16281E00000A7E010000046F3000000A283800000A6F3200000A260F02280F00000A2D07110616FE012B0116134011402C2208724E0A00700F17281E00000A7E010000046F3000000A283800000A6F3200000A260F03280F00000A2D07110716FE012B0116134111412C220872BE0A00700F18281E00000A7E010000046F3000000A283800000A6F3200000A26086F3900000A16FE02134211422C11723A0B007008283A00000A731900000A7A733B00000A130811080F06281E00000A6F3C00000A0011080F07281E00000A6F3D00000A001108076F3E00000A0011080F08281E00000A7266080070282E00000A6F3F00000A000F0B280F00000A16FE01134311432C6C00000F0B281E00000A178D3000000125161F3B9D6F4000000A13441613452B43114411459A1346000011086F4100000A1146734200000A6F4300000A0000DE1C134700729C0B0070114611476F4400000A283800000A731900000A7A00114517581345114511448E6932B500000011080F04281E00000A734500000A6F4600000A0000DE1A13480072D40B007011486F4400000A284700000A731900000A7A00000F05280F00000A2D110F05281E00000A282500000A16FE012B0116134911492C1D11086F4800000A0F05281E00000A1F3B1F2C6F4900000A6F4A00000A0000DE1A134A00720A0C0070114A6F4400000A284700000A731900000A7A000011086F4B00000A0F01281E00000A1F3B1F2C6F4900000A6F4A00000A0000DE1A134B0072380C0070114B6F4400000A284700000A731900000A7A00000F02280F00000A2D110F02281E00000A282500000A16FE012B0116134C114C2C1D11086F4C00000A0F02281E00000A1F3B1F2C6F4900000A6F4A00000A0000DE1A134D00726A0C0070114D6F4400000A284700000A731900000A7A00000F03280F00000A2D110F03281E00000A282500000A16FE012B0116134E114E2C1D11086F4D00000A0F03281E00000A1F3B1F2C6F4900000A6F4A00000A0000DE1A134F0072A60C0070114F6F4400000A284700000A731900000A7A0E21280F00000A1350115039EC04000000733100000A1351115172EE0C00706F3200000A261151720E0D00700F12281E00000A281F00000A6F3200000A261151722A0D00706F3200000A26115172420D00700F10281E00000A6F3700000A281F00000A6F3200000A26115172580D00700F11284E00000A8C2B000001281F00000A6F3200000A26115172720D00706F3200000A261151728C0D00700F0D282A00000A8C1C000001281F00000A6F3200000A26115172C60D00700F0F282A00000A8C1C000001281F00000A6F3200000A26115172000E00700F0E282A00000A8C1C000001281F00000A6F3200000A260F0C280F00000A16FE01135411542C19115172360E00700F0C281E00000A284700000A6F3200000A261151724C0E00700E20281E00000A281F00000A6F3200000A261151725C0E00700F07281E00000A281F00000A6F3200000A261151727C0E00700F08281E00000A7266080070282E00000A2D0772B20E00702B0572C80E00700F07281E00000A283800000A6F3200000A26115172DC0E00700F06281E00000A281F00000A6F3200000A26115172F40E007011086F4F00000A6F5000000A281F00000A6F3200000A261151721E0F00700F0A281E00000A6F3700000A281F00000A6F3200000A26071355115545030000000200000011000000200000002B2D115172320F00706F3200000A262B20115172480F00706F3200000A262B111151725E0F00706F3200000A262B022B000F15282300000A2D0772740F00702B0572AE0F007013521613530011086F4B00000A6F5100000A13562B6C11566F5200000A13570011576F5000000A11086F4F00000A6F5000000A282E00000A135811582C03171353115172EE0F00701A8D0E000001251611576F5300000AA2251711576F5000000AA225181152A225190F16281E00000A6F3700000AA2285400000A6F3200000A260011566F5500000A2D8BDE0D11562C0811566F1B00000A00DC0011086F4C00000A6F5100000A13592B6C11596F5200000A135A00115A6F5000000A11086F4F00000A6F5000000A282E00000A135B115B2C03171353115172EE0F00701A8D0E0000012516115A6F5300000AA22517115A6F5000000AA225181152A225190F17281E00000A6F3700000AA2285400000A6F3200000A260011596F5500000A2D8BDE0D11592C0811596F1B00000A00DC0011086F4D00000A6F5100000A135C2B6C115C6F5200000A135D00115D6F5000000A11086F4F00000A6F5000000A282E00000A135E115E2C03171353115172EE0F00701A8D0E0000012516115D6F5300000AA22517115D6F5000000AA225181152A225190F18281E00000A6F3700000AA2285400000A6F3200000A2600115C6F5500000A2D8BDE0D115C2C08115C6F1B00000A00DC115316FE01135F115F2C400011086F4D00000A11086F4F00000A6F5600000A001151728510007011086F4F00000A6F5300000A11086F4F00000A6F5000000A283800000A6F3200000A26000E1313181118285700000A2D1F11180F10281E00000A7239070070283300000A282400000A285800000A2B021118285900000A136011602C5400115172661100706F3200000A26115172801100700F14284E00000A8C2B000001281F00000A6F3200000A26115172A01100706F3200000A26115172BE1100706F3200000A26115172E81100706F3200000A2600115172FE1100706F3200000A26115172141200706F3200000A260E2111516F3000000A282600000A811000000100735A00000A13090011090F19281E00000A6F5B00000A0011090F1A284E00000A6F5C00000A0011090F1C282300000A6F5D00000A0011090F1B282300000A6F5E00000A001109066F5F00000A007230120070736000000A136111616F6100000A724C12007072290700706F6200000A0011616F6100000A725A12007072641200706F6200000A000F07281E00000A0F08281E00000A7266080070282E00000A2D0772B20E00702B0572C80E0070736000000A286300000A136211086F6400000A11626F6500000A000E21281E00000A1161286300000A136311086F6400000A11636F6500000A0011086F6600000A727C12007072981200706F6700000A0000DE1A13640072E012007011646F4400000A284700000A731900000A7A0000110911086F6800000A000E1F286900000A285900000A136511652C1C286A00000A72241300700E20281E00000A281F00000A6F6B00000A0000DE1A136600726613007011666F4400000A284700000A731900000A7A2A0000413C0100020000007A00000044000000BE0000000D00000000000000020000001301000004010000170200000D0000000000000000000000D508000018000000ED0800001C0000001E000001000000001A09000018000000320900001A0000001E000001000000004D090000420000008F0900001A0000001E00000100000000AA09000021000000CB0900001A0000001E00000100000000E609000042000000280A00001A0000001E00000100000000430A000042000000850A00001A0000001E00000102000000E50C0000790000005E0D00000D00000000000000020000007A0D000079000000F30D00000D00000000000000020000000F0E000079000000880E00000D0000000000000000000000A20F0000FA0000009C1000001A0000001E00000100000000B71000003C000000F31000001A0000001E0000012202286C00000A002AB21A8D2D000001251672C9060070A2251772E9060070A225187209070070A225197290130070A280010000042A000042534A4201000100000000000C00000076342E302E33303331390000000005006C000000C8060000237E000034070000300A000023537472696E677300000000641100009C1300002355530000250000100000002347554944000000102500006003000023426C6F620000000000000002000001571D0208090A000000FA013300160000010000003A000000040000000E00000003000000220000006C0000000B0000000D0000000100000004000000010000000300000002000000030000000000AD0401000000000006008303DB060600F003DB060600CE02BC060F000C0700000600E2022A05060066032A05060047032A050600D7032A050600A3032A050600BC032A0506000F032A0506002A032A050600AC02FB060600C108F0040A00F9026E060A00300445070A00440245070A001F0045070A00110545070E006609DC080E00080A9D0406002D0682090E0097019D040E000F099D040A00B705F9080A004F01F9080A001106F90806004702F00406002401F0040600C505F00406000E00B1000E002B089D040E006C0234020E00A9099D0406000905F0040E00A301DC080E006C04DC080A00AA05CF050A003701CF050A000406CF050600B301F0040A005005F90806002200F0040A006106F90806005A04F00406007302F0040600BF01F0040600FF05F0040E007D059D040E001A099D04060001007E040E0067059D0406008906E7070E00D009FA000E0092059D040E003C05FA000A009E096E060A0064026E060000000028000000000001000100010010005A07000039000100010003010000CF0600008D000200040003010000150800008D000B00040011003207600206068C00640256805300670256807E00670256808600670256806800670256803F00670256804B00670256807600670256806F00670206068C006402568038006B02568043006B0256805B006B02502000000000960098026F020100A832000000008618A30606002300B132000000009118A906B9022300000001000E02000002004F08000003004A0800000400440800000500370800000600E90500000700D40800000800CB0900000900B50800000A00770100000B00150A00000C006A0800000D00210500000E00D90000000F00CC0000001000E800000011005F01000012008201000013001901000014003B0600001500760700001600F20500001700EE0100001800E90100001900E30100001A00240200001B00480900001C00E50400001D00CF0700001E001B0200001F006601000020001B07000021004806000022007B080900A30601001100A30606001900A3060A002900A30610003100A30610003900A30610004100A30610004900A30610005100A30610005900A30610006100A30610006900A30610007900A306060021019707B8008100BD04BE009900BD04BE00C900A3061000C9004101C20031011C05060039018E091000D1001F06C70041019B08BE00410181020600310181020600F100A3061000D9002D04CC00490187020600D1000608D20051011804D80081000E04E0006901AE08E4009100BD04BE00D9001C00EA00D9000E05F00099000E04BE009900E708F6006901210AFC008100E70801018900BD04BE00E100B70907018900E7080C0189000E041301E1006B0718019100E7081E012901A30624016901E1092A01E9002101300171005804E000B100A3060600B100500235016901ED092A0119018F023B017101D1014A0119013C07530169015906E0006901AE085B01B10061046C016901A7087001B900A3060600B900C8081000B900C2091000B900FB097601B900C8047C016901F3088101B9005A0888019101A30610000C00F6009701F1008B01E0000101A3061000B90000059D016901A708A401B9004D09AA0169016F01B001A101F6001000B900E205AA01B9003100AA01B900A900AA0191000E046C01B900F704B60101011F08E00014009506C5011C002509D6010101FE01E0006901AE08DB01A9017909BE001400F600970199007802E20199002901E80199002504E201C100A3060600C1005D091000C1003F090100C100B5077C01C100D7047C01C1008707F1010901A306100009010608F701B101F600240111013A04FD01B900880807022400F6009701B900FA071602C101F6002401C1005A011C02990031092202C9015B022902D1015A0110007100A306060008000C003802080010003D0208001400420208001800470208001C004C02080020005102080024005602080028005B02080030003802080034003D0208003800420220006B003D022E000B00BD022E001300C6022E001B00E5022E002300EE022E002B00FF022E0033002F032E003B0035032E004300EE022E004B0035032E00530035032E005B0047032E006300540315008E01BC01CE010D02048000000200000000000000000000000000B00600000400000000000000000000002F02A000000000000400000000000000000000002F029400000000000400000000000000000000002F02F0040000000003000200040002006900450169006201690067010000000000436F6C6C656374696F6E60310049456E756D657261746F7260310047657453716C496E743332003C4D6F64756C653E006765745F4343005055424C49430041444400505249564154450052454652455348005055424C49534800434F4E464944454E5449414C0043414E43454C004445434C494E45434F554E5445520052455155455354005245504C590076616C75655F5F0053797374656D2E44617461006D73636F726C6962006765745F4263630053797374656D2E436F6C6C656374696F6E732E47656E6572696300656E645F74696D655F7574630073746172745F74696D655F7574630074696D657374616D705F757463004164640053797374656D2E436F6C6C656374696F6E732E5370656369616C697A65640070726F645F6964004E657747756964006F705F42697477697365416E64004462436F6D6D616E6400437265617465436F6D6D616E640053716C436F6D6D616E640053656E64006D6574686F640070617373776F7264005265706C61636500696D706F7274616E63650073657175656E6365006765745F4D657373616765004D61696C4D6573736167650043726564656E7469616C43616368650049446973706F7361626C650052756E74696D655479706548616E646C65004765745479706546726F6D48616E646C6500626C696E645F636F70795F726563697069656E74735F726F6C65006765745F446973706C61794E616D650070726F66696C655F6E616D6500757365726E616D6500736D74705F7365727665726E616D650053797374656D2E4E65742E4D696D650053716C4461746554696D6500417070656E644C696E65006765745F506970650053716C5069706500436F6E74656E7454797065006F705F46616C736500436C6F736500446973706F736500547279506172736500636C725F73656E645F6963735F696E76697465004E65757472616C5265736F75726365734C616E67756167654174747269627574650044656275676761626C6541747472696275746500417373656D626C795469746C654174747269627574650053716C50726F63656475726541747472696275746500417373656D626C7954726164656D61726B41747472696275746500417373656D626C7946696C6556657273696F6E41747472696275746500417373656D626C79436F6E66696775726174696F6E41747472696275746500417373656D626C794465736372697074696F6E41747472696275746500436F6D70696C6174696F6E52656C61786174696F6E7341747472696275746500417373656D626C7950726F6475637441747472696275746500417373656D626C79436F7079726967687441747472696275746500417373656D626C79436F6D70616E794174747269627574650052756E74696D65436F6D7061746962696C697479417474726962757465006765745F56616C7565004164645769746856616C7565006F705F547275650047657453716C537472696E6700437265617465416C7465726E6174655669657746726F6D537472696E6700546F537472696E67006765745F4C656E677468004E6574776F726B43726564656E7469616C0053797374656D2E436F6C6C656374696F6E732E4F626A6563744D6F64656C0053797374656D2E4E65742E4D61696C0073716C5F636C725F6963732E646C6C006765745F49734E756C6C007365745F4973426F647948746D6C007365745F456E61626C6553736C00656E61626C655F73736C0053797374656D006765745F46726F6D007365745F46726F6D00456E756D0047657453716C426F6F6C65616E004F70656E006C6F636174696F6E0053797374656D2E5265666C656374696F6E004E616D6556616C7565436F6C6C656374696F6E0053716C506172616D65746572436F6C6C656374696F6E004D61696C41646472657373436F6C6C656374696F6E004174746163686D656E74436F6C6C656374696F6E00416C7465726E61746556696577436F6C6C656374696F6E004462436F6E6E656374696F6E0053716C436F6E6E656374696F6E00457863657074696F6E0053797374656D2E446174612E436F6D6D6F6E006765745F546F007265706C795F746F00726571756972655F727376700043686172004462446174615265616465720053716C44617461526561646572004578656375746552656164657200537472696E674275696C646572007573655F72656D696E646572006576656E745F6964656E74696669657200546F55707065720053716C506172616D65746572004D6963726F736F66742E53716C5365727665722E5365727665720049456E756D657261746F7200476574456E756D657261746F72002E63746F72002E6363746F720073716C5F636C725F6963730053797374656D2E446961676E6F7374696373006943616C4D6574686F64730053797374656D2E52756E74696D652E436F6D70696C657253657276696365730053797374656D2E5265736F757263657300446562756767696E674D6F6465730073757070726573735F696E666F5F6D65737361676573006943616C526F6C6573004765744E616D65730053797374656D2E446174612E53716C54797065730053746F72656450726F63656475726573004164644D696E757465730072656D696E6465725F6D696E75746573007365745F43726564656E7469616C73006765745F44656661756C744E6574776F726B43726564656E7469616C73007365745F55736544656661756C7443726564656E7469616C73007573655F64656661756C745F63726564656E7469616C730053797374656D2E436F6C6C656374696F6E73006765745F48656164657273006765745F506172616D6574657273006943616C436C617373006765745F41646472657373004D61696C416464726573730066726F6D5F6164647265737300626C696E645F636F70795F726563697069656E7473006765745F4174746163686D656E74730066696C655F6174746163686D656E7473006963735F636F6E74656E7473006765745F416C7465726E6174655669657773006765745F486173526F777300436F6E63617400466F726D617400626F64795F666F726D6174004F626A656374007365745F5375626A656374007375626A6563740053797374656D2E4E6574006F705F496D706C696369740053706C69740053797374656D2E446174612E53716C436C69656E7400536D7470436C69656E74004174746163686D656E74006765745F43757272656E74006F705F4C6F676963616C4E6F74007365745F506F727400706F7274006765745F5265706C79546F4C697374007365745F486F7374004943726564656E7469616C734279486F7374004D6F76654E6578740053797374656D2E54657874007365745F436F6D6D616E64546578740053716C436F6E7465787400416C7465726E61746556696577006765745F5574634E6F77007365745F426F647900626F647900537472696E6744696374696F6E617279006F705F457175616C697479006F705F496E657175616C697479007365745F5072696F72697479004D61696C5072696F726974790073656E73697469766974790049734E756C6C4F72456D7074790000002F63006F006E007400650078007400200063006F006E006E0065006300740069006F006E003D007400720075006500008157530045004C00450043005400200070002E006E0061006D0065000D000A00460052004F004D0020005B006D007300640062005D002E005B00640062006F005D002E005B007300790073006D00610069006C005F007000720069006E0063006900700061006C00700072006F00660069006C0065005D002000410053002000700070000D000A0049004E004E004500520020004A004F0049004E0020005B006D007300640062005D002E005B00640062006F005D002E005B007300790073006D00610069006C005F00700072006F00660069006C0065005D00200041005300200070000D000A004F004E002000700070002E00700072006F00660069006C0065005F006900640020003D00200070002E00700072006F00660069006C0065005F00690064000D000A00570048004500520045002000700070002E00690073005F00640065006600610075006C00740020003D0020003100006F700072006F00660069006C0065005F006E0061006D00650020006E006F0074002000730070006500630069006600690065006400200061006E00640020006E006F002000640065006600610075006C0074002000700072006F00660069006C006500200066006F0075006E0064000083EF530045004C00450043005400200054004F00500020003100200061002E0065006D00610069006C005F0061006400640072006500730073002C00200061002E007200650070006C00790074006F005F0061006400640072006500730073002C00200073002E007300650072007600650072006E0061006D0065002C00200073002E0070006F00720074002C00200073002E0065006E00610062006C0065005F00730073006C002C00200073002E007500730065005F00640065006600610075006C0074005F00630072006500640065006E007400690061006C0073002C00200073002E0075007300650072006E0061006D0065000D000A00460052004F004D0020005B006D007300640062005D002E005B00640062006F005D002E005B007300790073006D00610069006C005F00700072006F00660069006C0065005D00200041005300200070000D000A0049004E004E004500520020004A004F0049004E0020005B006D007300640062005D002E005B00640062006F005D002E005B007300790073006D00610069006C005F00700072006F00660069006C0065006100630063006F0075006E0074005D002000410053002000700061000D000A004F004E00200070002E00700072006F00660069006C0065005F006900640020003D002000700061002E00700072006F00660069006C0065005F00690064000D000A0041004E0044002000700061002E00730065007100750065006E00630065005F006E0075006D0062006500720020003E003D00200040005300650071000D000A0049004E004E004500520020004A004F0049004E0020005B006D007300640062005D002E005B00640062006F005D002E005B007300790073006D00610069006C005F006100630063006F0075006E0074005D00200041005300200061000D000A004F004E002000700061002E006100630063006F0075006E0074005F006900640020003D00200061002E006100630063006F0075006E0074005F00690064000D000A0049004E004E004500520020004A004F0049004E0020005B006D007300640062005D002E005B00640062006F005D002E005B007300790073006D00610069006C005F007300650072007600650072005D00200041005300200073000D000A004F004E00200070002E00700072006F00660069006C0065005F006900640020003D00200073002E006100630063006F0075006E0074005F00690064000D000A0057004800450052004500200070002E006E0061006D00650020003D0020004000500072006F00660069006C0065000D000A004F0052004400450052002000420059002000700061002E00730065007100750065006E00630065005F006E0075006D0062006500720020004100530043000009400053006500710000114000500072006F00660069006C0065000039700072006F00660069006C0065005F006E0061006D006500200027007B0030007D00270020006E006F007400200066006F0075006E0064000125530051004C00200053006500720076006500720020004D0065006500740069006E0067000009540045005800540000255300630068006500640075006C0065002000610020004D0065006500740069006E006700000D4E006F0072006D0061006C00000D5000750062006C006900630000136C006F00630061006C0068006F00730074000001001F5200450051002D005000410052005400490043004900500041004E005400011F4F00500054002D005000410052005400490043004900500041004E005400011F4E004F004E002D005000410052005400490043004900500041004E005400010F5200450051005500450053005400000D430041004E00430045004C0000594D0069007300730069006E0067002000730065006E006400650072003A00200050006C0065006100730065002000730070006500630069006600790020004000660072006F006D005F0061006400640072006500730073000080C34D0069007300730069006E006700200072006500630069007000690065006E00740073003A00200050006C0065006100730065002000730070006500630069006600790020006500690074006800650072002000400072006500630069007000690065006E00740073002C002000400063006F00700079005F0072006500630069007000690065006E007400730020006F0072002000400062006C0069006E0064005F0063006F00700079005F0072006500630069007000690065006E00740073000009480054004D004C00006B400062006F00640079005F0066006F0072006D006100740020007B0030007D00200069007300200069006E00760061006C00690064002E002000560061006C00690064002000760061006C007500650073003A00200054004500580054002C002000480054004D004C00005340006D006500740068006F00640020007B0030007D00200069007300200069006E00760061006C00690064002E002000560061006C00690064002000760061006C007500650073003A0020007B0031007D00005B730065006E007300690074006900760069007400790020007B0030007D00200069007300200069006E00760061006C00690064002E002000560061006C00690064002000760061006C007500650073003A0020007B0031007D00005B400069006D0070006F007200740061006E006300650020007B0030007D00200069007300200069006E00760061006C00690064002E002000560061006C00690064002000760061006C007500650073003A0020007B0031007D000065400072006500630069007000690065006E00740073005F0072006F006C00650020007B0030007D00200069007300200069006E00760061006C00690064002E002000560061006C00690064002000760061006C007500650073003A0020007B0031007D00006F400063006F00700079005F0072006500630069007000690065006E00740073005F0072006F006C00650020007B0030007D00200069007300200069006E00760061006C00690064002E002000560061006C00690064002000760061006C007500650073003A0020007B0031007D00007B400062006C0069006E0064005F0063006F00700079005F0072006500630069007000690065006E00740073005F0072006F006C00650020007B0030007D00200069007300200069006E00760061006C00690064002E002000560061006C00690064002000760061006C007500650073003A0020007B0031007D00006155006E00610062006C006500200074006F002000730065006E00640020006D00610069006C002000640075006500200074006F002000760061006C00690064006100740069006F006E0020006500720072006F0072002800730029003A002000003755006E00610062006C006500200074006F002000610074007400610063006800200027007B0030007D0027003A0020007B0031007D0001354000660072006F006D005F006100640064007200650073007300200069007300200069006E00760061006C00690064003A002000002D40007200650070006C0079005F0074006F00200069007300200069006E00760061006C00690064003A0020000031400072006500630069007000690065006E0074007300200069007300200069006E00760061006C00690064003A002000003B400063006F00700079005F0072006500630069007000690065006E0074007300200069007300200069006E00760061006C00690064003A0020000047400062006C0069006E0064005F0063006F00700079005F0072006500630069007000690065006E0074007300200069007300200069006E00760061006C00690064003A002000001F42004500470049004E003A005600430041004C0045004E00440041005200001B500052004F004400490044003A002D002F002F007B0030007D000117560045005200530049004F004E003A0032002E00300000154D004500540048004F0044003A007B0030007D000019530045005100550045004E00430045003A007B0030007D00001942004500470049004E003A0056004500560045004E005400003944005400530054004100520054003A007B0030003A0079007900790079004D004D00640064005400480048006D006D00730073005A007D000039440054005300540041004D0050003A007B0030003A0079007900790079004D004D00640064005400480048006D006D00730073005A007D0000354400540045004E0044003A007B0030003A0079007900790079004D004D00640064005400480048006D006D00730073005A007D0000154C004F0043004100540049004F004E003A002000000F5500490044003A007B0030007D00001F4400450053004300520049005000540049004F004E003A007B0030007D00003558002D0041004C0054002D0044004500530043003B0046004D00540054005900500045003D007B0030007D003A007B0031007D00011574006500780074002F0070006C00610069006E00001374006500780074002F00680074006D006C000017530055004D004D004100520059003A007B0030007D0000294F005200470041004E0049005A00450052003A004D00410049004C0054004F003A007B0030007D00001343004C004100530053003A007B0030007D0000155000520049004F0052004900540059003A00350000155000520049004F0052004900540059003A00390000155000520049004F0052004900540059003A0031000039500041005200540053005400410054003D00410043004300450050005400450044003B0052005300560050003D00460041004C0053004500003F500041005200540053005400410054003D004E0045004500440053002D0041004300540049004F004E003B0052005300560050003D00540052005500450001809541005400540045004E004400450045003B004300550054005900500045003D0049004E0044004900560049004400550041004C003B0052004F004C0045003D007B0033007D003B007B0032007D003B0043004E003D0022007B0030007D0022003B0058002D004E0055004D002D004700550045005300540053003D0030003A006D00610069006C0074006F003A007B0031007D000180DF41005400540045004E004400450045003B004300550054005900500045003D0049004E0044004900560049004400550041004C003B0052004F004C0045003D004E004F004E002D005000410052005400490043004900500041004E0054003B00500041005200540053005400410054003D00410043004300450050005400450044003B0052005300560050003D00460041004C00530045003B0043004E003D0022007B0030007D0022003B0058002D004E0055004D002D004700550045005300540053003D0030003A006D00610069006C0074006F003A007B0031007D00011942004500470049004E003A00560041004C00410052004D00001F54005200490047004700450052003A002D00500054007B0030007D004D00011D41004300540049004F004E003A0044004900530050004C004100590000294400450053004300520049005000540049004F004E003A00520065006D0069006E00640065007200001545004E0044003A00560041004C00410052004D00001545004E0044003A0056004500560045004E005400001B45004E0044003A005600430041004C0045004E00440041005200001B74006500780074002F00630061006C0065006E00640061007200000D6D006500740068006F00640000096E0061006D00650000174D0065006500740069006E0067002E00690063007300001B43006F006E00740065006E0074002D0063006C006100730073000147750072006E003A0063006F006E00740065006E0074002D0063006C00610073007300650073003A00630061006C0065006E006400610072006D00650073007300610067006500014353004D0054005000200043006C00690065006E007400200043006F006E00660069006700750072006100740069006F006E0020004500720072006F0072003A00200000414D00610069006C002000530065006E0074002E0020004500760065006E00740020004900640065006E007400690066006900650072003A0020007B0030007D0000294500720072006F0072002000730065006E00640069006E00670020006D00610069006C003A002000000B4300480041004900520000B7AA02735A6E32448C978C58AA75F9E700042001010803200001052001011111042001010E80A10767125111551259110C1110020202125D1261021265126902126D02126D02020202020202114D0202020202117102020202020202020202020202020202020211750202020202021D0E080E0202020202020202021D0E080E1279127902127912790212790212790212590E0202115515127D011280811280810215127D011280811280810215127D011280811280810202021280851280891280891279021279050000128095032000020420001269042000126D0520011141080520001280A90720021280B10E1C0320000E0500020E0E1C052001114908052001114D08050001114D02040001020E05000111410E040000117106000111451171042000117105200111710D050001114908052002010E0E050002020E0E040000117505200112590E09100103020E02101E00040A01110C0800011280B91180BD0700011D0E1280B90600030E0E1C1C040A011110040A011155032000080500020E1C1C05200101115504200101020620011D0E1D030520001280C508151280CD011280C9052001011300062001011280810500020E0E0E0520001280D10520020E030305200012808108151280CD0112808108200015127D0113000715127D0112808104200013000600020E0E1D1C05000102114D080002114D114D114D0520010112510520001280D90900021280890E1280850520001280DD08151280CD011280890520001280E105200101125D060001114D114D0500001280E908B77A5C561934E0890400000000040100000004020000000403000000040400000004050000000406000000040700000003061D0E0206080306110C03061110490022011141114111411141114111411141114111411141114111411141114511451145114111491141114D1149114D11411141114111411149114D114D11411141114D101141101141030000010801000800000000001E01000100540216577261704E6F6E457863657074696F6E5468726F7773010801000701000000001001000B73716C5F636C725F69637300002F01002A53656E64204943532063616C656E64617220696E7669746573207573696E672053514C2053657276657200000501000000001101000C456974616E20426C756D696E00000C010007322E302E302E3000000A010005656E2D555300000000000000BD35EA5C00000000020000001C0100006C5B00006C3D0000525344534221EEC2CD07384D8DE1547ADD0CF7D801000000433A5C55736572735C656974616E2E626C756D696E5C536F757263655C5265706F735C73716C5F636C725F6963735C73716C5F636C725F6963735C6F626A5C44656275675C73716C5F636C725F6963732E7064620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B05C00000000000000000000CA5C0000002000000000000000000000000000000000000000000000BC5C0000000000000000000000005F436F72446C6C4D61696E006D73636F7265652E646C6C0000000000FF250020001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100100000001800008000000000000000000000000000000100010000003000008000000000000000000000000000000100000000004800000058600000A80300000000000000000000A80334000000560053005F00560045005200530049004F004E005F0049004E0046004F0000000000BD04EFFE00000100000002000000000000000200000000003F000000000000000400000002000000000000000000000000000000440000000100560061007200460069006C00650049006E0066006F00000000002400040000005400720061006E0073006C006100740069006F006E00000000000000B00408030000010053007400720069006E006700460069006C00650049006E0066006F000000E402000001003000300030003000300034006200300000006E002B00010043006F006D006D0065006E00740073000000530065006E00640020004900430053002000630061006C0065006E00640061007200200069006E007600690074006500730020007500730069006E0067002000530051004C002000530065007200760065007200000000003A000D00010043006F006D00700061006E0079004E0061006D0065000000000045006900740061006E00200042006C0075006D0069006E000000000040000C000100460069006C0065004400650073006300720069007000740069006F006E0000000000730071006C005F0063006C0072005F006900630073000000300008000100460069006C006500560065007200730069006F006E000000000032002E0030002E0030002E003000000040001000010049006E007400650072006E0061006C004E0061006D0065000000730071006C005F0063006C0072005F006900630073002E0064006C006C0000003E000D0001004C006500670061006C0043006F007000790072006900670068007400000045006900740061006E00200042006C0075006D0069006E000000000042000D0001004C006500670061006C00540072006100640065006D00610072006B0073000000000045006900740061006E00200042006C0075006D0069006E00000000004800100001004F0072006900670069006E0061006C00460069006C0065006E0061006D0065000000730071006C005F0063006C0072005F006900630073002E0064006C006C00000038000C000100500072006F0064007500630074004E0061006D00650000000000730071006C005F0063006C0072005F006900630073000000340008000100500072006F006400750063007400560065007200730069006F006E00000032002E0030002E0030002E003000000038000800010041007300730065006D0062006C0079002000560065007200730069006F006E00000032002E0030002E0030002E00300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005000000C000000DC3C00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 WITH PERMISSION_SET = UNSAFE; GO ALTER ASSEMBLY [sql_clr_ics] DROP FILE ALL - ADD FILE FROM 0x4D6963726F736F667420432F432B2B204D534620372E30300D0A1A445300000000020000020000001B0000008C000000000000001A000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF380000F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0BCA3101380000000010000000100000000000000E00FFFF04000000FFFF03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000BCA3101380000000010000000100000000000000F00FFFF04000000FFFF0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000942E31017BBEE25C010000006F90C957F826E94D9D051ED792100F7E00000000000000000100000001000000000000000000000000000000DC51330100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000BCA310138000000001000000010000000000000FFFFFFFF04000000FFFF030000000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000BCA310138000000001000000010000000000000FFFFFFFF04000000FFFF030000000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F862513FC607D311905300C04FA302A1C4454B99E9E6D211903F00C04FA302A10B9D865A1166D311BD2A0000F80849BDEC1618FF5EAA104D87F76F496383346014000000000000001AB91FB23E0162314ECD74DC1F3BEEE69189979C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000CE07000000000000CE070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FEEFFEEF010000009600000000433A5C55736572735C757365725C536F757263655C5265706F735C73716C5F636C725F6963735C73716C5F636C725F6963735C636C725F73656E645F6963735F696E766974652E63730000633A5C75736572735C757365725C736F757263655C7265706F735C73716C5F636C725F6963735C73716C5F636C725F6963735C636C725F73656E645F6963735F696E766974652E63730004000000010000004B0000004C000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001BE2300180000000EADC753B1B0FD50101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000020000000100000001000000000000004C000000280000001BE23001349634835C000000010000004B0000004C000000650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000003E002A11000000006804000000000000CE070000000000000000000001000006000000000100000000636C725F73656E645F6963735F696E76697465000000001600031104000000A8030000CE07000000000000010000000A0024115553797374656D00120024115553797374656D2E54657874000000000E0024115553797374656D2E4E657400160024115553797374656D2E4E65742E4D61696C000000001A0024115553797374656D2E446174612E53716C54797065730000001E0020110000000001000011000000000000000073625F4572726F72730000002A0020110100000001000011000000000000000075736544656661756C7443726564656E7469616C730000001E0020110200000001000011000000000000000063726564656E7469616C730016002011030000000100001100000000000000006D7367001600201104000000010000110000000000000000737472001E00201105000000010000110000000000000000727376705F737472696E67002A002011060000000100001100000000000000006F7267616E697A65725F696E5F726563697069656E7473001E00201107000000010000110000000000000000736D7470636C69656E7400001600031144000000F80100001A00000086020000010000001600201119000000010000110000000000000000650000000200060016000311440000002C0200001A000000E202000001000000160020111B00000001000011000000000000000065000000020006001600031144000000600200001A0000001D03000001000000160020111C00000001000011000000000000000065000000020006001600031144000000940200001A0000007903000001000000160020111E00000001000011000000000000000065000000020006001600031144000000CC0200004D00000045050000010000001A0020112200000001000011000000000000000061646472000000000200060016000311440000003C030000D500000081060000010000001A00201127000000010000110000000000000000636F6E74797065001A0020112800000001000011000000000000000048544D4C000000001A00201129000000010000110000000000000000617643616C000000020006001600031144000000700300001A0000005807000001000000160020112A00000001000011000000000000000065000000020006001600031144000000A40300001A000000B307000001000000160020112C000000010000110000000000000000650000000200060002000600BA000404C93FEAC6B359D649BC250902BBABB460000000004D0044003200000004020000040000000C00000001000500040600038C00000001390184F60185310187FE018CC10191A10192180196B602650280D402813D0281B7028284000282D802832F02836C0283A30283F102845802847D0284AB0285800286240286D80188C602895C0189EC018AC7028B5B018BD0028D74028FCE069244019244029281029392029477000198320199010199B5019AA1029B9C019C6000000002000600F2000000640800000000000001000100CE07000000000000B10000005808000000000000130000800100000016000080070000001800008021000000EEEFFE80250000001800008031000000190000804B000000EEEFFE804F000000190000805B0000001A00008075000000EEEFFE80790000001A000080850000001C00008090000000EEEFFE80940000001C000080A500000022000080AE000000EEEFFE80B200000022000080D000000023000080D9000000EEEFFE80DD00000023000080FD0000002400008006010000EEEFFE800A0100002400008013010000250000801C010000EEEFFE802001000025000080280100002600008031010000EEEFFE8035010000260000803D0100002800008057010000EEEFFE805B01000028000080670100002900008070010000EEEFFE8074010000290000807D0100002A00008086010000EEEFFE808A0100002A000080920100002B0000809B010000EEEFFE809F0100002B000080AB0100002D000080AD0100002E000080B301000030000080CD010000EEEFFE80D101000031000080D201000032000080D401000033000080D701000035000080D801000036000080F2010000EEEFFE80F60100003600008002020000370000801602000038000080170200003A00008023020000EEEFFE80270200003B0000803C0200003D0000804D02000043000080530200004400008061020000450000806F020000480000807002000049000080830200004A000080860200004B000080880200004C000080890200004D000080A0020000EEEFFE80A102000051000080A202000052000080BF020000EEEFFE80C302000052000080DF02000053000080E202000054000080E402000055000080E502000056000080FC020000EEEFFE80FD0200005A000080FE0200005B0000801A0300005C0000801D0300005D0000801F0300005E000080200300005F00008037030000EEEFFE803803000063000080390300006400008056030000EEEFFE805A03000064000080760300006500008079030000660000807B030000670000807C03000068000080930300006F0000809A03000070000080A703000071000080B403000072000080C103000074000080CA030000EEEFFE80CE03000075000080CF03000076000080DC03000077000080E903000078000080EC0300007A000080ED0300007B000080FA0300007C000080070400007D000080080400007F0000801504000080000080330400008100008051040000820000806F040000830000807B040000EEEFFE807F040000830000809804000084000080B604000085000080CE04000086000080E604000087000080FE040000880000801B0500008A000080320500008B000080350500008D000080360500008D00008043050000EEEFFE80450500008D0000804E0500008E0000804F0500008F00008068050000EEEFFE806C0500008F0000806F050000900000809105000091000080920500008D0000809D050000EEEFFE80A9050000EEEFFE80AA05000093000080B1050000EEEFFE80B505000093000080DD0500009500008008060000EEEFFE800C060000960000800D060000970000801A060000980000803806000099000080450600009A000080520600009B0000805F0600009C000080600600009E0000806D0600009F0000807A060000A500008081060000A800008082060000A900008091060000AA000080A0060000AB000080A9060000AC000080B8060000AD000080C1060000AE000080CD060000AF000080E4060000B0000080FB060000B200008013070000B300008021070000B400008031070000B50000803F070000B700008055070000B800008058070000B90000805A070000BA0000805B070000BB00008072070000EEEFFE8073070000C100008074070000C20000807D070000C30000808B070000EEEFFE808F070000C4000080B0070000C5000080B3070000C6000080B5070000C7000080B6070000C8000080CD070000CA000080050006000900370009003D00000000003E006E0009003900000000003A006800090043000000000044007700090022000000000023007700090023000000000024005300090021000000000022005600090025000000000026003C0009002100000000002200360009002B00000000002C004B0009004B00000000004C00660009001900000000001A00240009001C00000000001D002D0009002200000000002300430009002C0009005F00090045000000000009000A000D002A0009000A0009000A000D004900000000004A0058000D00510009000A0009002D00000000000D003E000D002F0009002D000900250009001F0009000A000D00340009000A0009001C0009000A000D004A000000000009000A000D004B00000000004C00820009000A0009001C0009000A000D004D000000000009000A000D00340009000A0009001C0009000A000D0048000000000009000A000D003F00000000004000670009000A0009001C0009000A000D0048000900310009002B00090038000900270009002C000000000009000A000D002E000D002A0009000A0009000A000D002D000D002A0009000A000900280009005D0009005C000900590009001E00000000001F004D0009004A00090044000900550009004300090051000900780009002E000900100026002C00000000001200220009000A000D00320000000000330052000D00B40009000A0023002500000000000000000009002600000000002700E20009003C000000000009000A000D002C000D0056000D002E000D0034000D002A0009000A0009002600090029000900520009000A000D0031000D002A000D0046000D0032000D0032000D0064000D0039000D003B000D0088000D002A000D0068000D002B000D00550009000A0009001C0009000A000D0052000000000009000A000D0022000D0029000000000011008C0009000A0009001C0009000A000D00450005000600F400000008000000010000000000000008000000000000002400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFF1A092FF1100000000C02000025000000010000000100000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002200251100000000040000000100636C725F73656E645F6963735F696E76697465000000160029110000000004000000010030363030303030310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000FFFFFFFF1A092FF10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFF77093101010000000B00108E0C0084690D0006005C000000200000002C00000058000000000000000000000016000000190000000000EEC00000000000000000FFFF000000000000FFFFFFFF00000000FFFF0000000000000000000000000A006C040000000000007C0800000100000000000000000000000000000053746F72656450726F636564757265730043444135313336460000002DBA2EF10100000000000000CE07000000000000000000000000000000000000020002000D01000000000100FFFFFFFF00000000CE0700000802000000000000FFFFFFFF00000000FFFFFFFF010001000000010000000000433A5C55736572735C757365725C536F757263655C5265706F735C73716C5F636C725F6963735C73716C5F636C725F6963735C636C725F73656E645F6963735F696E766974652E6373000000FEEFFEEF010000000100000000010000000000000000000000FFFFFFFFFFFFFFFFFFFF0900FFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000942E31017BBEE25C010000006F90C957F826E94D9D051ED792100F7E770000002F4C696E6B496E666F002F6E616D6573002F7372632F686561646572626C6F636B002F7372632F66696C65732F633A5C75736572735C757365725C736F757263655C7265706F735C73716C5F636C725F6963735C73716C5F636C725F6963735C636C725F73656E645F6963735F696E766974652E6373000400000006000000010000001B00000000000000220000000800000011000000070000000A00000006000000000000000500000000000000DC513301000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E00000020000000D3000000380000006F0100003800000000000000BA000000800000005C00000028000000F40C00002C0200002C0000003C00000003000000180000000600000017000000070000000A0000000B00000008000000090000000C0000000D0000000E0000000F000000100000001100000012000000130000001400000016000000150000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 AS N'sql_clr_ics.pdb'; + ADD FILE FROM 0x4D6963726F736F667420432F432B2B204D534620372E30300D0A1A4453000000000200000200000023000000A80000000000000021000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38000000FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0BCA3101380000000010000000100000000000000E00FFFF04000000FFFF03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000BCA3101380000000010000000100000000000000F00FFFF04000000FFFF0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000942E3101BD35EA5C010000004221EEC2CD07384D8DE1547ADD0CF7D800000000000000000100000001000000000000000000000000000000DC51330100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000BCA310138000000001000000010000000000000FFFFFFFF04000000FFFF030000000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000BCA310138000000001000000010000000000000FFFFFFFF04000000FFFF030000000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F862513FC607D311905300C04FA302A1C4454B99E9E6D211903F00C04FA302A10B9D865A1166D311BD2A0000F80849BDEC1618FF5EAA104D87F76F496383346014000000000000009788B1BF12207E15F6496BC0ED4D3C583A2CD83300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003A110000000000003A110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FEEFFEEF01000000A600000000433A5C55736572735C656974616E2E626C756D696E5C536F757263655C5265706F735C73716C5F636C725F6963735C73716C5F636C725F6963735C636C725F73656E645F6963735F696E766974652E63730000633A5C75736572735C656974616E2E626C756D696E5C736F757263655C7265706F735C73716C5F636C725F6963735C73716C5F636C725F6963735C636C725F73656E645F6963735F696E766974652E637300040000005300000000000000010000005400000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001BE2300180000000FFBFA66E8E13D501010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000200000001000000010000000000000054000000280000001BE23001742080655C000000010000005300000054000000650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000003E002A11000000005C080000000000000E110000000000000000000001000006000000000100000000636C725F73656E645F6963735F696E76697465000000001600031104000000EC0600000E11000000000000010000000A0024115553797374656D00120024115553797374656D2E54657874000000000E0024115553797374656D2E4E657400160024115553797374656D2E4E65742E4D61696C000000001A0024115553797374656D2E446174612E53716C54797065730000001A0024115553797374656D2E446174612E53716C436C69656E7400001E002411554D6963726F736F66742E53716C5365727665722E536572766572001E0020110000000001000011000000000000000063726564656E7469616C730022002011010000000100001100000000000000006D61696C5072696F72697479000000001E0020110200000001000011000000000000000073625F4572726F727300000026002011030000000100001100000000000000006D6574686F645F656E756D76616C7565000000002A0020110400000001000011000000000000000073656E73697469766974795F656E756D76616C75650000002A00201105000000010000110000000000000000726563697069656E745F726F6C655F666F756E64000000002E00201106000000010000110000000000000000636F70795F726563697069656E745F726F6C655F666F756E640000003200201107000000010000110000000000000000626C696E645F636F70795F726563697069656E745F726F6C655F666F756E640016002011080000000100001100000000000000006D7367001E00201109000000010000110000000000000000736D7470636C69656E74000016000311440000002C030000F50100003800000001000000160020110B000000010000110000000000000000636F6E00160020110C000000010000110000000000000000636D6400160003117C020000F40200005A0000007100000001000000160020110E0000000100001100000000000000007264720002000600160003117C020000280300001A0100000A01000001000000160020111000000001000011000000000000000072647200020006000200060016000311440000006403000089000000F1060000010000001A0020113A0000000100001100000000000000006974656D00000000020006001600031144000000D40300003D000000CD080000010000001E002011460000000100001100000000000000006174745F70617468000000001600031168030000D00300001C000000ED0800000100000016002011470000000100001100000000000000006500000002000600020006001600031144000000080400001A00000032090000010000001600201148000000010000110000000000000000650000000200060016000311440000003C0400001A0000008F09000001000000160020114A00000001000011000000000000000065000000020006001600031144000000700400001A000000CB09000001000000160020114B00000001000011000000000000000065000000020006001600031144000000A40400001A000000280A000001000000160020114D00000001000011000000000000000065000000020006001600031144000000D80400001A000000850A000001000000160020114F0000000100001100000000000000006500000002000600160003114400000010060000EC040000AF0A00000100000026002011510000000100001100000000000000006963735F636F6E74656E74735F737472000000001E00201152000000010000110000000000000000727376705F737472696E67002A002011530000000100001100000000000000006F7267616E697A65725F696E5F726563697069656E74730016000311DC0400009C0500006C000000E70C0000010000001A0020115700000001000011000000000000000061646472000000000200060016000311DC040000D40500006C0000007C0D0000010000001A0020115A00000001000011000000000000000061646472000000000200060016000311DC0400000C0600006C000000110E0000010000001A0020115D00000001000011000000000000000061646472000000000200060002000600160003114400000080060000F8000000A20F0000010000001A00201161000000010000110000000000000000636F6E74797065001A002011620000000100001100000000000000006176426F647900001A00201163000000010000110000000000000000617643616C000000020006001600031144000000B40600001A0000009C10000001000000160020116400000001000011000000000000000065000000020006001600031144000000E80600001A000000F31000000100000016002011660000000100001100000000000000006500000002000600020006006A010404C93FEAC6B359D649BC250902BBABB460000000004D0044003200000004020000040000000C00000001000700040600003C010000014D01809C0194D7019839019928019AD9019B05019B3601A19701BBF102811F0181AD0182220282650183880283CB01884B0288860289AD0289FF028A49028AA1028AE2028B3100028BA0028CD4028D38028D9A028DDE00028E39028E90028ECD028F04028F50028FB402901502907B0290EE0291130291490291EF0292A30292ED0293410293A30293D3029420000295030295970297480298020298EE0299E9079B6A099B6A019B6A029BA2029C34029CD5029D88029E2E029EF0029FC602A0B602A26007A29609A29601A29601A37701A4A302A53A01A5CA01A6A702A73C01A7D802A87201A92102AA1001AA4F01B26E01B2E902AD8F02B05E06B31901B31902B35E06B49D01B49D02B4E206B62601B62602B66C02B7B602B90301BD6C01BE3B01BF2001C000401002C000412801C00041D1020006002E002A1100000000C0080000000000002C0000000000000000000000030000060E11000001000000002E6363746F72002E000404C93FEAC6B359D649BC250902BBABB460000000004D0044003200000004010000040100000C0000000100000602000600F20000002412000000000000010001000E11000000000000810100001812000000000000320000800100000035000080070000003C00008031000000EEEFFE80380000003D000080390000003E000080450000003F0000804E0000004000008056000000420000805F000000EEEFFE8063000000430000806400000044000084710000004A0000807A0000004B0000807B0000004C00008087000000EEEFFE808B0000004D0000808C0000004E000080940000004F0000809C00000050000080A700000053000080A800000054000080B200000055000080B300000056000080BB00000057000080BE000000EEEFFE80CA000000EEEFFE80CB00000058000080CC0000005A00008AD900000066000080F1000000670000800A01000069000080130100006A000080140100006B00008020010000EEEFFE80240100006C000080250100006D0000802D0100006E000080350100006F0000804C010000720000804D0100007300008056010000EEEFFE805A0100007300008064010000740000806D010000EEEFFE8071010000740000807B0100007500008084010000EEEFFE80880100007500008092010000760000809B010000EEEFFE809F01000076000080A901000077000080B2010000EEEFFE80B601000077000080C001000078000080C9010000EEEFFE80CD01000078000080E501000079000080FD010000EEEFFE8001020000790000800B0200007A0000800C0200007B000080140200007C00008017020000EEEFFE8023020000EEEFFE80240200007D0000802C0200007E0000802D0200008400008047020000EEEFFE804B02000084000080570200008500008071020000EEEFFE80750200008500008081020000860000808A020000EEEFFE808E020000860000809A02000087000080A3020000EEEFFE80A702000087000080C702000088000080D0020000EEEFFE80D402000088000080F402000089000080FD020000EEEFFE8001030000890000800A0300008A00008013030000EEEFFE80170300008A0000801F0300008B00008028030000EEEFFE802C0300008B000080340300008C0000804E030000EEEFFE80520300008C0000805E0300008D00008078030000EEEFFE807C0300008D000080880300008E000080A2030000EEEFFE80A60300008E000080B203000090000080CC030000EEEFFE80D003000090000080DC03000091000080E5030000EEEFFE80E903000091000080F203000092000080FB030000EEEFFE80FF03000092000080070400009400008021040000EEEFFE80250400009500008026040000960000802E040000970000803104000099000080320400009A0000804C040000EEEFFE80500400009A0000805C0400009B000080700400009C000080710400009E0000807A040000EEEFFE807E0400009E0000808A0400009F00008093040000EEEFFE80970400009F000080A3040000A0000080AC040000EEEFFE80B0040000A0000080BC040000A2000080C5040000EEEFFE80C9040000A2000080D5040000A3000080DE040000EEEFFE80E2040000A300008000050000A400008009050000EEEFFE800D050000A40000802D050000AA00008033050000AC0000804D050000EEEFFE8051050000AC0000805D050000AD000084A8050000EEEFFE80AC050000B2000080B8050000B4000080E1050000EEEFFE80E5050000B4000080FD050000B500008011060000EEEFFE8015060000B500008046060000B60000805A060000EEEFFE805E060000B60000808F060000B7000080A3060000EEEFFE80A7060000B7000080D8060000B9000080DB060000BA000080DE060000BB000080E1060000BD000080E2060000BD000080EC060000EEEFFE80F1060000BD000080F8060000BE000080F9060000BF00008015070000EEEFFE8019070000C00000801A070000C10000801D070000C20000801E070000C30000803A070000EEEFFE803E070000C40000803F070000C500008042070000C600008043070000C70000805F070000EEEFFE8063070000C800008064070000C900008067070000CA00008068070000CB00008072070000EEEFFE8076070000CC00008077070000CD00008079070000CF0000807A070000EEEFFE8080070000BD0000808B070000D10000809E070000EEEFFE80A2070000D1000080C4070000D2000080D7070000EEEFFE80DB070000D2000080FD070000D300008010080000EEEFFE8014080000D300008036080000D500008041080000EEEFFE8045080000D500008056080000DB0000805D080000DC0000806C080000DD0000807B080000DE00008084080000DF0000809D080000E1000080A9080000EEEFFE80AD080000E2000080AE080000E3000080AF080000E3000080CB080000EEEFFE80CD080000E3000080D4080000E4000080D5080000E6000080D6080000E7000080EA080000E8000080ED080000E9000080EF080000EA000080F0080000EB00008009090000ED0000800A090000EEEFFE8010090000E300008018090000EE00008019090000EEEFFE801A090000F10000801B090000F20000802F090000F300008032090000F400008034090000F500008035090000F60000804C090000EEEFFE804D090000FA0000804E090000FB0000806B090000EEEFFE806F090000FB0000808C090000FC0000808F090000FD00008091090000FE00008092090000FF000080A9090000EEEFFE80AA09000003010080AB09000004010080C809000005010080CB09000006010080CD09000007010080CE09000008010080E5090000EEEFFE80E60900000C010080E70900000D010080040A0000EEEFFE80080A00000D010080250A00000E010080280A00000F0100802A0A0000100100802B0A000011010080420A0000EEEFFE80430A000015010080440A000016010080610A0000EEEFFE80650A000016010080820A000017010080850A000018010080870A000019010080880A00001A0100809F0A000021010080A80A0000EEEFFE80AF0A000022010080B00A000023010080B70A000024010080C40A000025010080DD0A000026010080EA0A000027010080080B000028010080260B00002A010080330B00002B010080510B00002C0100806F0B00002D0100808D0B00002E010080990B0000EEEFFE809D0B00002E010080B60B00002F010080CF0B000030010080E80B000031010080200C000032010080390C000033010080570C000034010080750C000036010080780C0000EEEFFE808D0C0000390100809A0C00003A0100809C0C00003C010080A90C00003D010080AB0C00003F010080B80C000040010080BA0C000042010080BC0C000045010080D30C000046010080D60C000048010080D70C000048010080E50C0000EEEFFE80E70C000048010080F00C000049010080F10C00004A0100800B0D0000EEEFFE800F0D00004A010080120D00004B010080520D00004C010080530D0000480100805E0D0000EEEFFE806A0D0000EEEFFE806B0D00004E0100806C0D00004E0100807A0D0000EEEFFE807C0D00004E010080850D00004F010080860D000050010080A00D0000EEEFFE80A40D000050010080A70D000051010080E70D000052010080E80D00004E010080F30D0000EEEFFE80FF0D0000EEEFFE80000E000054010080010E0000540100800F0E0000EEEFFE80110E0000540100801A0E0000550100801B0E000056010080350E0000EEEFFE80390E0000560100803C0E0000570100807C0E0000580100807D0E000054010080880E0000EEEFFE80940E0000EEEFFE80950E00005A0100809C0E0000EEEFFE80A00E00005B010080A10E00005C010080B50E00005D010080DF0E00005E010080E00E000060010080150F0000EEEFFE80190F0000610100801A0F000062010080270F000063010080450F000064010080520F0000650100805F0F0000660100806C0F0000670100806D0F0000690100807A0F00006A010080870F00006C0100809A0F00006D0100809B0F000073010080A20F000076010080A30F000077010080B20F000078010080C10F000079010080D00F00007A010080DF0F00007B010080E80F00007C010080F40F00007D0100800B1000007E0100802210000080010080541000008101008063100000820100807310000083010080821000008501008099100000860100809C100000870100809E100000880100809F10000089010080B6100000EEEFFE80B710000091010080B810000092010080C210000093010080D0100000EEEFFE80D410000094010080F010000095010080F310000096010080F510000097010080F6100000980100800D1100009C0100800500060009005400090070000000000009000A000D004E000D0032000D0018000D002500000000000D000E0011001A0018003F00110012001500260000000000150016001900250019002500190068001500160019003C0015001600150021001100120000000000000000000D000E000D0022000D0034000D00490014003B000D000E00110022000000000011001200150021001500210015006C001100120015002D00000000002E00510015002900000000002A00490015003000000000003100570015002500000000002600400015002B00000000002C004E00150038000000000039006E0015004B00000000004C006B001100120011001D000D000E0000000000000000000D00190009000A0009004300000000004400630009004B00000000004C006100090022000000000023004300090023000000000024005A00090021000000000022005600090025000000000026003C0009002100000000002200360009002B00000000002C004B0009004300000000004400630009004900000000004A00600009004B00000000004C00630009005300000000005400720009001900000000001A00240009001F000000000020003300090045000000000009000A000D002C0009000A0009000A000D004900000000004A0058000D00510009000A0009002400000000002500490009002900000000002A00530009002F000000000030005F0009001B00000000001C002F0009001D00000000001E004C000900250000000000260053000900370009004D00000000004E00930009000D00000000000D00870009004800000000004900B90009005200000000005300EB0009005A00000000005B00FA0009004600000000004700E80009002B000900300009003600090010001E0027000000000012001A0009000A000D004500000000000D000E0011002D000D000E000D004F00000000000D000E00110032000D000E000D005B00000000000D000E00110038000D000E000D006600000000000D000E001100170009000A00000000001B001D0009003900000000003A00C10009004300000000004400D50009004F00000000005000ED0009002200000000002300770009002D000900250009001F000900250009003800090026000000000009000A000D0014002600470000000000160022000D000E00110012001500430011001200110024001100120015006C000D000E00000000002300250009000A000000000009000A000D003C0009000A0009001C0009000A000D004B000000000009000A000D004B00000000004C00820009000A0009001C0009000A000D0047000000000009000A000D003C0009000A0009001C0009000A000D0049000000000009000A000D005900000000005A008E0009000A0009001C0009000A000D004E000000000009000A000D006500000000006600A10009000A0009001C0009000A000D005400090021000000000009000A000D0042000D003C000D0058000D0038000D005E000D0058000D0039000D006E000D006D000D006A000D0022000000000023005E000D005B000D0057000D009C000D0056000D0062000D0062000D0022000000000015003F0015001B0015003F0015001B0015003F0015001B0015001B000D007C000D0032000D0014002A00300000000000160026000D000E001100360000000000370056001100DA000D000E002700290000000000000000000D0014002A00300000000000160026000D000E001100360000000000370056001100DF000D000E002700290000000000000000000D0014002A00310000000000160026000D000E001100360000000000370056001100E5000D000E002700290000000000000000000D002A00000000000D000E00110027001100D9000D000E000D003A00000000000D000E0011003D001100670011003F001100450011003B000D000E000D0037000D003A000D00380009000A000900320009000A000D0035000D002A000D004E000D0035000D0032000D0064000D0039000D003B000D00B7000D002C000D006C000D002B000D00550009000A0009001C0009000A000D0052000000000009000A000D0022000D002900000000001100710009000A0009001C0009000A000D00450005000600F2000000240000000E110000010001002C000000000000000100000018000000000000001F00008005006E00F40000000800000001000000000000001000000000000000240000003C00000054000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFF1A092FF120000000140200005500000001000000250000000100000001000000010000003D00000001000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C00000018000000240000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002200251100000000040000000100636C725F73656E645F6963735F696E7669746500000016002911000000000400000001003036303030303031000016002511000000006008000001002E6363746F7200000000160029110000000060080000010030363030303030330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000FFFFFFFF1A092FF10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFF77093101010000000B00108E0C0084690D0006005C0000003C0000002C00000060000000000000000000000016000000190000000000EEC00000000000000000FFFF000000000000FFFFFFFF00000000FFFF0000000000000000000000000A00C408000000000000681200000100000000000000000000000000000053746F72656450726F636564757265730043444135313336460000002DBA2EF101000000000000000E11000000000000000000000000000000000000010000000E1100002C00000000000000000000000000000000000000020002000D01000000000100FFFFFFFF000000003A1100000802000000000000FFFFFFFF00000000FFFFFFFF010001000000010000000000433A5C55736572735C656974616E2E626C756D696E5C536F757263655C5265706F735C73716C5F636C725F6963735C73716C5F636C725F6963735C636C725F73656E645F6963735F696E766974652E6373000000FEEFFEEF010000000100000000010000000000000000000000FFFFFFFFFFFFFFFFFFFF0900FFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000942E3101BD35EA5C010000004221EEC2CD07384D8DE1547ADD0CF7D87F0000002F4C696E6B496E666F002F6E616D6573002F7372632F686561646572626C6F636B002F7372632F66696C65732F633A5C75736572735C656974616E2E626C756D696E5C736F757263655C7265706F735C73716C5F636C725F6963735C73716C5F636C725F6963735C636C725F73656E645F6963735F696E766974652E6373000400000006000000010000001B00000000000000220000000800000011000000070000000A00000006000000000000000500000000000000DC51330100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E00000020000000DB00000038000000930100003800000000000000CA000000800000005C00000028000000401B0000440200002C0000006C000000030000001F000000060000001E000000070000000A0000000B00000008000000090000000C0000000D0000000E0000000F000000100000001100000012000000130000001400000015000000160000001700000018000000190000001A0000001B0000001D0000001C000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 AS N'sql_clr_ics.pdb'; +GO +SET ANSI_NULLS OFF GO -PRINT N'Creating Procedure [dbo].[clr_send_ics_invite]...'; +SET QUOTED_IDENTIFIER OFF +GO +PRINT N'Creating [dbo].[clr_send_ics_invite]...'; GO CREATE PROCEDURE [dbo].[clr_send_ics_invite] - @from [nvarchar](4000), - @to [nvarchar](4000), - @cc [nvarchar](4000) = null, - @reply_to [nvarchar](4000) = null, - @subject [nvarchar](4000), - @body [nvarchar](4000) = null, - @location [nvarchar](4000) = null, - @start_time_utc [datetime] = null, - @end_time_utc [datetime] = null, - @timestamp_utc [datetime] = null, - @smtp_server [nvarchar](4000) = null, - @port [int] = 25, - @use_ssl [bit] = 0, - @username [nvarchar](4000) = null, - @password [nvarchar](4000) = null, +@profile_name NVARCHAR (MAX) NULL, @recipients NVARCHAR (MAX) NULL, @copy_recipients NVARCHAR (MAX) NULL, @blind_copy_recipients NVARCHAR (MAX) NULL, @from_address NVARCHAR (MAX) NULL, @reply_to NVARCHAR (MAX) NULL, @subject NVARCHAR (MAX) NULL, @body NVARCHAR (MAX) NULL, @body_format NVARCHAR (MAX) NULL, @importance NVARCHAR (MAX) NULL, @sensitivity NVARCHAR (MAX) NULL, @file_attachments NVARCHAR (MAX) NULL, @location NVARCHAR (MAX) NULL, @start_time_utc DATETIME NULL, @end_time_utc DATETIME NULL, @timestamp_utc DATETIME NULL, @method NVARCHAR (MAX) NULL, @sequence INT NULL, @prod_id NVARCHAR (MAX) NULL, @use_reminder BIT NULL, @reminder_minutes INT NULL, @require_rsvp BIT NULL, @recipients_role NVARCHAR (MAX) NULL, @copy_recipients_role NVARCHAR (MAX) NULL, @blind_copy_recipients_role NVARCHAR (MAX) NULL, @smtp_servername NVARCHAR (MAX) NULL, @port INT NULL, @enable_ssl BIT NULL, @use_default_credentials BIT NULL, @username NVARCHAR (MAX) NULL, @password NVARCHAR (MAX) NULL, @suppress_info_messages BIT NULL, @event_identifier NVARCHAR (MAX) NULL OUTPUT, @ics_contents NVARCHAR (MAX) NULL OUTPUT +AS EXTERNAL NAME [sql_clr_ics].[StoredProcedures].[clr_send_ics_invite] +GO +PRINT N'Creating [dbo].[sp_send_calendar_event]...'; +GO +/* + sql_clr_ics copyright (c) Eitan Blumin +--------------------------------------------------- +Source: https://github.com/EitanBlumin/sql_clr_ics +License: MIT (https://github.com/EitanBlumin/sql_clr_ics/blob/master/LICENSE) +--------------------------------------------------- +This serves as a wrapper for the CLR stored procedure with default values for parameters +(which is not possible natively for all data types in the CLR procedure itself) +*/ +CREATE PROCEDURE [dbo].[sp_send_calendar_event] + @profile_name [sysname] = NULL, + @recipients [nvarchar](max) = NULL, + @copy_recipients [nvarchar](max) = NULL, + @blind_copy_recipients [nvarchar](max) = NULL, + @from_address [nvarchar](max) = NULL, + @reply_to [nvarchar](max) = NULL, + @subject [nvarchar](255) = N'SQL Server Meeting', + @body [nvarchar](max) = NULL, + @body_format [nvarchar](20) = N'TEXT', + @importance [nvarchar](6) = N'Normal', + @sensitivity [nvarchar](12) = N'Public', + @file_attachments [nvarchar](max) = NULL, + @location [nvarchar](255) = NULL, + @start_time_utc [datetime] = NULL, + @end_time_utc [datetime] = NULL, + @timestamp_utc [datetime] = NULL, + @method [nvarchar](14) = N'REQUEST', + @sequence [int] = 0, + @prod_id [nvarchar](255) = NULL, @use_reminder [bit] = 1, @reminder_minutes [int] = 15, @require_rsvp [bit] = 0, - @cancel_event_identifier [uniqueidentifier] = null, - @event_identifier [uniqueidentifier] = null OUTPUT, - @suppress_info_messages [bit] = 0 + @recipients_role [nvarchar](15) = N'REQ-PARTICIPANT', + @copy_recipients_role [nvarchar](15) = N'OPT-PARTICIPANT', + @blind_copy_recipients_role [nvarchar](15) = N'NON-PARTICIPANT', + @smtp_servername [nvarchar](255) = N'localhost', + @port [int] = 25, + @enable_ssl [bit] = 0, + @use_default_credentials [bit] = 0, + @username [nvarchar](255) = NULL, + @password [nvarchar](255) = NULL, + @suppress_info_messages [bit] = 0, + @event_identifier [nvarchar](255) = NULL OUTPUT, + @ics_contents [nvarchar](MAX) = NULL OUTPUT WITH EXECUTE AS CALLER AS -EXTERNAL NAME [sql_clr_ics].[StoredProcedures].[clr_send_ics_invite] +SET NOCOUNT ON; +EXEC dbo.[clr_send_ics_invite] @profile_name, @recipients, @copy_recipients, @blind_copy_recipients, @from_address, @reply_to, @subject, @body, @body_format, @importance, @sensitivity, @file_attachments, @location, @start_time_utc, @end_time_utc, @timestamp_utc, @method, @sequence, @prod_id, @use_reminder, @reminder_minutes, @require_rsvp, @recipients_role, @copy_recipients_role, @blind_copy_recipients_role, @smtp_servername, @port, @enable_ssl, @use_default_credentials, @username, @password, @suppress_info_messages, @event_identifier OUTPUT, @ics_contents OUTPUT GO \ No newline at end of file