Debugging SharePoint Workflows

May 5, 2009

This blog post is about tips and tricks for monitoring the health of SharePoint workflows. I will like to suggest  this excellent MSDN article for additional information.

Logging information about the progress of workflows

The WF tracking service logs the events as the workflow progresses along.  For example, consider a simple workflow (see below) that creates a task and then loops until the task is 100% complete.

 

 

clip_image002

 

 

By turning the tracking service on (see [1]) we can capture entries like the following, the trace output below corresponds to the workflow in Figure 1 above:

 

System.Workflow.Runtime.Hosting Information: 0 : Creating instance 1888f8e6-145c-4220-be52-99cfd09098a7

 

System.Workflow.Runtime Information: 1 : Workflow Runtime: Scheduler: InstanceId: 1888f8e6-145c-4220-be52-99cfd09098a7 : Running scheduled entry: SubscriptionEvent((1)Workflow1, ActivityStatusChange(‘(1)createTask1‘, Closed, Succeeded))

 

System.Workflow.Runtime Information: 0 : Activity Status Change – Activity: whileActivity1 Old:Initialized; New:Executing

 

// At this point the workflow is waiting for the user to update the task. So the workflow runtime can hydrate the running instance to the database

 

System.Workflow.Runtime Information: 0 : Workflow Runtime: WorkflowExecutor: Got an unload request for instance 1888f8e6-145c-4220-be52-99cfd09098a7

System.Workflow.Runtime Information: 0 : 1888f8e6-145c-4220-be52-99cfd09098a7: Calling PerformUnloading(false) on instance 1888f8e6-145c-4220-be52-99cfd09098a7 hc 13970169

System.Workflow.Runtime Information: 0 : Workflow Runtime: WorkflowExecutor: Unloading instance 1888f8e6-145c-4220-be52-99cfd09098a7

System.Workflow.Runtime.Hosting Information: 0 : TimerEventSubscriptionQueue: 1888f8e6-145c-4220-be52-99cfd09098a7 Suspend

System.Workflow.Runtime Information: 0 : 1888f8e6-145c-4220-be52-99cfd09098a7: Calling Persist

 

// At this point the user marks the task as complete . So the workflow runtime can deserialize the workflow and pass it the TaskChanged event. This results in re-evaluation of the while loop

 

System.Workflow.Runtime Stop: 0 : Workflow Trace

System.Workflow.Runtime.Hosting Information: 0 : Deserialized a Workflow1 [SampleWorkflow.Workflow1] to length 8660. Took 00:00:00.0400576.

System.Workflow.Runtime Information: 0 : Workflow Runtime: WorkflowExecutor: Loading instance 1888f8e6-145c-4220-be52-99cfd09098a7

 

System.Workflow.Runtime Information: 0 : Activity Status Change – Activity: onTaskChanged1 Old:Executing; New:Closed

System.Workflow.Runtime Information: 1 : Workflow Runtime: Scheduler: InstanceId:

 

1888f8e6-145c-4220-be52-99cfd09098a7 : Scheduling entry: SubscriptionEvent((1)whileActivity1, ActivityStatusChange(‘(2)onTaskChanged1’, Closed, Succeeded))

 

 

As you can see from the snippets above, we have information about step by step execution of the workflow.

 

Workflow Failure Conditions

Some of the common reasons why a workflow can fail include:

 

a.      The WF program instance errors out because of an exception. For example, if a null object reference is encountered inside the CreateTask handler, in the workflow in Figure 1, above. This exception will cause the WF instance to move to the error state (reflected in the status column of the document library)

 

clip_image004

 

 

The tracking service will record this exception and typically log detailed information as shown below:

 

System.Workflow.Runtime Critical: 0 : Uncaught exception escaped to the root of the workflow.

    In instance 9e644d58-9990-443a-a595-1685fec2c311 in activity

Inner exception: System.NullReferenceException: Object reference not set to an instance of an object.

   at SampleWorkflow.Workflow1.TaskCreation(Object sender, EventArgs e)

   at System.Workflow.ComponentModel.Activity.RaiseEvent(DependencyProperty dependencyEvent, Object sender, EventArgs e)

   at System.Workflow.Activities.CallExternalMethodActivity.Execute(ActivityExecutionContext executionContext)

   at System.Workflow.ComponentModel.ActivityExecutor`1.Execute(T activity, ActivityExecutionContext executionContext)

   at System.Workflow.ComponentModel.ActivityExecutor`1.Execute(Activity activity, ActivityExecutionContext executionContext)

   at System.Workflow.ComponentModel.ActivityExecutorOperation.Run(IWorkflowCoreRuntime workflowCoreRuntime)

   at System.Workflow.Runtime.Scheduler.Run()

 

System.Workflow.Runtime Information: 0 : Workflow Runtime: WorkflowExecutor: Terminating instance 9e644d58-9990-443a-a595-1685fec2c311

 

One more point about exception conditions – there are times when we need to thrown an exception ourselves. For instance, if the user does not have appropriate permission, or there is missing data. In those cases, we could set a custom error message (See [2])

 

clip_image005

 

 

 

 

b.      The Application pool is recycled.  The state from a previous persist point (if there was one – typically a delay activity or OnTaskChanged activity) is persisted in the database, but since there is no retry mechanism, there is no way to re-start the persisted workflow instance. For example, if the sample WF program instance was executing inside the While activity (whileActivity1 in Figure 1) when the app pool crashed, there is no automatic way to have the workflow restarted.

One potential solution would be to model the workflow as a state machine and include retry logic. But this would add complexity to the workflow.

c.       If the correlation token is being set dynamically, there is a chance that the value gets incorrectly set in some cases. As a result, the waiting WF program instance will never receive the event. A correlation token is an identifier WF uses to tie activities to a common task – for example if CreateTask, OnTaskChanged and CompleteTask relate to a single task; they should have the same correlation token.

d.      SharePoint workflow activities (like Create Task) delay database commits until a persist point is reached. This means that a CreateTask activity will not result in a “real” task being added to the list until a persist point is reached. So any direct SharePoint OM calls that attempt to reference the created task will fail until the point a persist point is reached. Please refer to [3] to dump out the

 [1] Workflow Diagnostics

 

Add the following section to the web.config:

 

<system.diagnostics>

       <switches>

              <add name=System.Workflow LogToTraceListeners value=1 />

              <add name=System.Workflow.Runtime.Hosting value=All />

              <add name=System.Workflow.Runtime value=All />

              <add name=System.Workflow.Runtime.Tracking value=All />

              <add name=System.Workflow.Activities value=All />

       </switches>

       <trace autoflush=true indentsize=4>

              <listeners>

                     <add name=customListener

               type=System.Diagnostics.TextWriterTraceListener

               initializeData=WFTrace.log />

              </listeners>

       </trace>

</system.diagnostics>

 

 

Additionally, we can use stsadm to capture the trace messages from Workflow Infrstructure as shown below:

 

@echo off

set SPAdminTool=%CommonProgramFiles%\Microsoft Shared\web server extensions\12\BIN\stsadm.exe

 

rem echo Logging levels before…

rem “%SPAdminTool%” -o listlogginglevels

 

echo Setting levels…

stsadm -o setlogginglevel -category “Workflow Features;Workflow Infrastructure” -tracelevel Verbose -windowslogginglevel Error

 

echo Restarting SPTrace service…

net stop sptrace

net start sptrace

 

rem echo Logging levels after…

rem “%SPAdminTool%” -o listlogginglevels

 

pause

 

 

 

[2] Adding custom status message

 

1.       Add a custom status in workflow.xml

<ExtendedStatusColumnValues>

       <StatusColumnValue>

              Failed to start due to insufficient permissions

       </StatusColumnValue>

</ExtendedStatusColumnValues> 

 

2.       Add the following code for the invoking method

 private void setState1_MethodInvoking(object sender, EventArgs e)

{

      ((Microsoft.SharePoint.WorkflowActions.SetState)sender).State = ((Int32)SPWorkflowStatus.Max);

}

 

 [3] Code to extract the persisted workflow state

 

Since the workflow runtime is finicky about changes such as adding private variables, it is useful to dump the persisted state.

 

System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(

       “select InstanceData from dbo.workflow  where  InstanceDataSize > 0″);

System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(

       “Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=WSS_Content_Portal;Data Source=CTSDEV1”);

conn.Open();

cmd.Connection = conn;

byte[] image = (byte[])cmd.ExecuteScalar();

System.IO.FileStream fs = new System.IO.FileStream(@”c:\data.gz”, System.IO.FileMode.CreateNew);

fs.Write(image, 0, image.Length);

fs.Flush();

fs.Close(); 

 

 

 

 

 

22 Responses to “Debugging SharePoint Workflows”


  1. […] Debugging SharePoint Workflows (Vishwas Lele) […]

  2. Marinkina Says:

    Пора переименовать блог, присвоив название связанное с доменами 🙂 может хватит про них?

  3. Cederash Says:

    Захватывающе. Зачет! и ниипет!


  4. […] on WF tracing (see my previous post for more information). Trace logs provide a great source of information on how a given workflow […]

  5. Сидор Шарматов Says:

    Секс фото брюнеток на нашем ресурсе. Секс фото, интервью: секс – это чудо.

  6. Daniella Says:

    Excellent goods from you, man. I’ve understand your stuff previous to and you are just extremely excellent. I really like what you have acquired here, certainly like what you’re stating and the way
    in which you say it. You make it enjoyable and you still
    take care of to keep it smart. I cant wait to read
    far more from you. This is actually a great site.


  7. Great site. Lots of useful info here. I am sending it to several friends ans additionally
    sharing in delicious. And obviously, thanks for your effort!


  8. I’d like to thank you for the efforts you’ve put in writing
    this website. I’m hoping to see the same high-grade blog posts from you in the future as well. In truth, your creative writing abilities has motivated me to get my own website now 😉


  9. capable click the next website


  10. Quality content is the main to invite the users to pay a quick visit the web site, that’s what this site is providing.


  11. Thanks for your marvelous posting! I truly enjoyed reading
    it, you will be a great author.I will make certain to bookmark your blog
    and will often come back in the foreseeable future. I want to encourage that you continue
    your great posts, have a nice day!
    I absolutely love your blog and find a lot
    of your post’s to be just what I’m looking for.
    Would you offer guest writers to write content
    to suit your needs? I wouldn’t mind producing a post or elaborating on many of the subjects you write about here. Again, awesome web log!
    My spouse and I stumbled over here coming from a different website and thought I might check things out. I like what I see so now i am following you. Look forward to exploring your web page again.
    I really like what you guys are usually up too. Such clever work and coverage! Keep up the fantastic works guys I’ve
    added you guys to my personal blogroll.
    Howdy I am so grateful I found your blog, I really found you by error, while I was searching
    on Google for something else, Nonetheless I am here now and would just like to say thanks
    a lot for a fantastic post and a all round thrilling blog (I also love the theme/design), I don’t
    have time to read through it all at the moment but I have bookmarked it and also added your RSS feeds, so
    when I have time I will be back to read more, Please do keep up the excellent work.

    Appreciating the hard work you put into your site and
    detailed information you provide. It’s nice to come across a blog every once in a while that isn’t the same out of date rehashed
    material. Excellent read! I’ve saved your site and I’m adding your RSS
    feeds to my Google account.
    Hello! I’ve been following your weblog for a long time now and finally got the courage to go ahead and give you a shout out from Kingwood Texas! Just wanted to say keep up the fantastic job!
    I’m really enjoying the theme/design of your web site. Do you ever run into any browser compatibility
    issues? A number of my blog visitors have complained about my site not operating correctly in Explorer but looks
    great in Firefox. Do you have any tips to help fix this issue?

    I’m curious to find out what blog platform you are using? I’m having
    some minor security issues with my latest blog and I would
    like to find something more safeguarded. Do you have any suggestions?

    Hmm it seems like your website ate my first comment (it was super long) so I guess I’ll just sum it up what I wrote and say, I’m thoroughly enjoying your blog.
    I too am an aspiring blog blogger but I’m still new to the whole thing. Do you have any helpful hints for beginner blog writers? I’d genuinely appreciate it.

    Woah! I’m really digging the template/theme of this site. It’s simple, yet effective.

    A lot of times it’s difficult to get that “perfect balance” between superb usability and appearance. I must say you’ve done a superb job with this.
    Additionally, the blog loads extremely quick for me on Internet explorer.
    Outstanding Blog!
    Do you mind if I quote a few of your articles as long as I provide credit and
    sources back to your blog? My blog site is in the exact same area
    of interest as yours and my visitors would definitely benefit from a lot of
    the information you provide here. Please let me know if this ok with you.
    Appreciate it!
    Hi would you mind letting me know which hosting company you’re working with? I’ve loaded your blog in 3 completely different
    browsers and I must say this blog loads a lot quicker then most.
    Can you suggest a good hosting provider at a reasonable price?

    Thank you, I appreciate it!
    Awesome blog you have here but I was wanting to know if
    you knew of any user discussion forums that cover the same
    topics discussed in this article? I’d really like to be a part of online community where I can get advice from other experienced people that share the same interest. If you have any recommendations, please let me know. Thank you!
    Good day! This is my first comment here so I just wanted to give a quick shout out and say I really enjoy reading through your blog posts. Can you recommend any other blogs/websites/forums that go over the same topics? Thanks a lot!
    Do you have a spam problem on this site; I also am a blogger, and I was wanting to know your situation; we have developed some nice methods and we are looking to exchange strategies with others, please shoot me an e-mail if interested.
    Please let me know if you’re looking for a author for your blog.
    You have some really great articles and I believe
    I would be a good asset. If you ever want to take some of the load off, I’d really like to write some content for your blog in exchange for a link back to mine. Please shoot me an e-mail if interested. Kudos!
    Have you ever thought about including a little bit more than just your articles? I mean, what you say is fundamental and all. However think about if you added some great photos or video clips to give your posts more, “pop”! Your content is excellent but with images and clips, this website could undeniably be one of the greatest in its niche. Awesome blog!
    Great blog! Is your theme custom made or did you download it from somewhere? A theme like yours with a few simple adjustements would really make my blog shine. Please let me know where you got your theme. Kudos
    Hey there would you mind stating which blog platform you’re using?
    I’m going to start my own blog soon but I’m having a tough time selecting between
    BlogEngine/Wordpress/B2evolution and Drupal. The reason I ask is because your layout seems different then most blogs and I’m looking for something unique. P.S Sorry for being off-topic but I had to ask!
    Hello just wanted to give you a quick heads up. The text in your content seem to be running off the screen in Ie. I’m not sure if this is a format issue or something to do with web browser compatibility but I thought I’d post to let you know. The layout look great though! Hope you get the issue solved soon. Cheers
    With havin so much content do you ever run into any issues of plagorism or copyright violation? My website has a lot of unique content I’ve either created myself or outsourced but it appears a lot of
    it is popping it up all over the web without my authorization.
    Do you know any solutions to help prevent content from being
    ripped off? I’d definitely appreciate it.
    Have you ever considered writing an e-book or guest authoring on other websites? I have a blog centered on the same topics you discuss and would love to have you share some stories/information. I know my readers would enjoy your work. If you are even remotely interested, feel free to send me an email.
    Hi there! Someone in my Myspace group shared this website with us so I came to check it out. I’m definitely loving the information.
    I’m book-marking and will be tweeting this to my followers! Great blog and superb style and design.
    Excellent blog! Do you have any tips for aspiring writers? I’m hoping to start my own website soon but I’m a little lost on everything. Would you suggest starting with a free platform like WordPress or go for a paid option? There are so many choices out there that I’m totally
    confused .. Any ideas? Cheers!
    My programmer is trying to persuade me to move to .net from PHP.
    I have always disliked the idea because of the expenses.
    But he’s tryiong none the less. I’ve been using Movable-type on numerous
    websites for about a year and am worried about switching to another platform.

    I have heard fantastic things about blogengine.
    net. Is there a way I can transfer all my wordpress content
    into it? Any kind of help would be really appreciated!

    Does your site have a contact page? I’m having trouble locating it but, I’d like to send you an email.
    I’ve got some ideas for your blog you might be interested in hearing. Either way, great website and I look forward to seeing it develop over time.
    It’s a shame you don’t have a donate button! I’d without a doubt
    donate to this outstanding blog! I suppose
    for now i’ll settle for bookmarking and adding your RSS feed to my Google account. I look forward to new updates and will share this blog with my Facebook group. Talk soon!
    Greetings from Colorado! I’m bored to tears at work so I
    decided to check out your blog on my iphone during lunch
    break. I really like the knowledge you present
    here and can’t wait to take a look when I get home. I’m amazed at how fast your blog loaded
    on my cell phone .. I’m not even using WIFI, just 3G .. Anyways, superb blog!
    Greetings! I know this is kinda off topic however I’d figured I’d ask. Would you be interested in trading links or maybe guest authoring a blog article or vice-versa? My website covers a lot of the same topics as yours and I believe we could greatly benefit from each other. If you’re interested feel free to shoot
    me an email. I look forward to hearing from you!
    Great blog by the way!
    Right now it looks like WordPress is the best blogging platform available right now.
    (from what I’ve read) Is that what you’re using on your blog?

    Fantastic post but I was wondering if you could write a
    litte more on this topic? I’d be very thankful if you could elaborate a little bit further. Thanks!
    Good day! I know this is kind of off topic but I was wondering if you knew where I could get a captcha plugin for my comment form? I’m
    using the same blog platform as yours and I’m having problems finding one? Thanks a lot!
    When I originally commented I clicked the “Notify me when new comments are added” checkbox and now each time a comment is added I get four e-mails with the same comment. Is there any way you can remove people from that service? Thanks!
    Hey! This is my first visit to your blog! We are a collection of volunteers and starting a new project in a community in the same niche. Your blog provided us beneficial information to work on. You have done a wonderful job!
    Hey there! I know this is somewhat off topic but I was wondering which blog platform are you using for this website? I’m getting sick and tired of WordPress
    because I’ve had issues with hackers and I’m looking at alternatives
    for another platform. I would be awesome if you could point me in the direction
    of a good platform.
    Hey there! This post couldn’t be written any better! Reading through this post reminds me of my good old room mate! He always kept talking about this. I will forward this article to him. Fairly certain he will have a good read. Many thanks for sharing!
    Write more, thats all I have to say. Literally, it seems as though you relied on the video to make your point. You obviously know what youre talking about, why throw away your intelligence on just posting videos to your blog when you could be giving us something enlightening to read?
    Today, I went to the beach with my children. I found a sea shell and gave it to my 4 year old daughter and said “You can hear the ocean if you put this to your ear.” She put the shell to her ear and screamed. There was a hermit crab inside and it pinched her ear. She never wants to go back! LoL I know this is totally off topic but I had to tell someone!
    Yesterday, while I was at work, my cousin stole my apple ipad and tested to see if it can survive a thirty foot drop, just so she can be a youtube sensation. My apple ipad is now destroyed and she has 83 views. I know this is totally off topic but I had to share it with someone!
    I was curious if you ever considered changing the page layout of your blog? Its very well written; I love what youve got to say. But maybe you could a little more in the way of content so people could connect with it better. Youve got an awful lot of text for only having one or 2 pictures. Maybe you could space it out better?
    Hello, i read your blog occasionally and i own a similar one and i was just curious if you get a lot of spam feedback? If so how do you reduce it, any plugin or anything you can recommend? I get so much lately it’s driving me insane so any assistance is very much appreciated.

    This design is steller! You certainly know how to
    keep a reader amused. Between your wit and your
    videos, I was almost moved to start my own blog (well, almost.
    ..HaHa!) Fantastic job. I really loved what you had to
    say, and more than that, how you presented it. Too cool!

    I’m truly enjoying the design and layout of your site. It’s
    a very easy on the eyes which makes it much more enjoyable for
    me to come here and visit more often. Did you hire out a developer to create your theme?
    Outstanding work!
    Howdy! I could have sworn I’ve been to this site before but after checking through some of the post I realized it’s new to
    me. Anyways, I’m definitely delighted I found it and I’ll be book-marking and checking back often!

    Good day! Would you mind if I share your blog with my twitter group?
    There’s a lot of folks that I think would really enjoy your content. Please let me know. Cheers
    Hey there, I think your site might be having browser compatibility issues. When I look at your blog in Ie, it looks fine but when opening in Internet Explorer, it has some overlapping. I just wanted to give you a quick heads up! Other then that, superb blog!
    Wonderful blog! I found it while searching on Yahoo News. Do you have any tips on how to get listed in Yahoo News? I’ve been trying for
    a while but I never seem to get there! Many thanks
    Hello there! This is kind of off topic but I need some help from
    an established blog. Is it difficult to set up your own blog?
    I’m not very techincal but I can figure things out pretty quick. I’m thinking about making my own but I’m not sure where to begin. Do you have any points or suggestions? Thanks
    Hi there! Quick question that’s totally off topic.
    Do you know how to make your site mobile friendly?
    My website looks weird when viewing from my apple
    iphone. I’m trying to find a theme or plugin that might be able to correct this problem. If you have any recommendations, please share. With thanks!
    I’m not that much of a online reader to be honest but your sites really nice, keep it up! I’ll go ahead and
    bookmark your site to come back later on. All the best
    I love your blog.. very nice colors & theme. Did you create this website yourself or did you hire someone to do it for you?

    Plz respond as I’m looking to design my own blog and would like to know where u got this from. appreciate it
    Whoa! This blog looks just like my old one! It’s on a completely different topic but it has pretty much the same
    page layout and design. Superb choice of
    colors!
    Hello just wanted to give you a quick heads up and let you know a few of the images aren’t loading correctly. I’m not sure why but I think its a linking issue.
    I’ve tried it in two different internet browsers and both show the same outcome.
    Heya are using WordPress for your site platform? I’m new
    to the blog world but I’m trying to get started and set up my own. Do you need any coding expertise to make your own blog? Any help would be really appreciated!
    Heya this is kinda of off topic but I was wanting to know if blogs use WYSIWYG editors or if you have to manually code with HTML. I’m starting a blog soon
    but have no coding expertise so I wanted to get guidance from someone with experience.

    Any help would be greatly appreciated!
    Hello! I just wanted to ask if you ever have any issues with hackers?
    My last blog (wordpress) was hacked and I ended up losing months of hard work due to no data backup.
    Do you have any solutions to protect against
    hackers?
    Hey! Do you use Twitter? I’d like to follow you if that would be okay. I’m
    definitely enjoying your blog and look forward to new updates.

    Hi there! Do you know if they make any plugins to protect against hackers?

    I’m kinda paranoid about losing everything I’ve worked hard
    on. Any tips?
    Hi! Do you know if they make any plugins to help with SEO?

    I’m trying to get my blog to rank for some targeted keywords but I’m not seeing very good success.
    If you know of any please share. Thanks!
    I know this if off topic but I’m looking into starting my own blog and was wondering what all is needed to get set up? I’m assuming
    having a blog like yours would cost a pretty penny? I’m not very web savvy so I’m not 100%
    sure. Any suggestions or advice would be greatly appreciated.
    Thank you
    Hmm is anyone else experiencing problems with
    the images on this blog loading? I’m trying to figure out if its a problem on my end or if it’s the blog.

    Any responses would be greatly appreciated.
    I’m not sure exactly why but this website is loading incredibly slow for me. Is anyone else having this problem or is it a issue on my end? I’ll check back later and see if the problem still exists.

    Hey there! I’m at work surfing around your blog from my new iphone 4! Just wanted to say I love reading your blog and look forward to all your posts! Keep up the outstanding work!
    Wow that was strange. I just wrote an extremely long comment but after I clicked submit my comment didn’t appear.
    Grrrr… well I’m not writing all that over again. Regardless, just wanted to say superb blog!

  12. Niamh Says:

    “Debugging SharePoint Workflows | Fleeting Thoughts”
    genuinely causes myself imagine a little bit extra.
    I personally treasured each and every particular section of it.

    Thanks for your effort -Leia


  13. This website really has all the information and facts I wanted about this subject and didn’t know who to ask.


  14. You really make it seem so easy woth your presentation but I find this
    topic to bee actuazlly something which I think I would never understand.
    It seems too complicated annd extremely broad for me. I am looking forsard for youur
    next post, I’ll try to get thhe hang of it!


  15. Thanks for some other great post. The place else could anybody get that type of information in such a perfect approach of writing?
    I have a presentation subsequent week, and I’m on the search for such info.


  16. constantly i used to read smaller posts that as well clear their motive, and that is also happening
    with this piece of writing which I am reading here.


  17. It’s a pity you don’t have a donate button! I’d definitely donate to this fantastic blog!
    I suppose for now i’ll settle for bookmarking and
    adding your RSS feed to my Google account. I look forward to new updates and will talk
    about this site with my Facebook group. Talk soon!

  18. site blog Says:

    I delight in, cause I discovered just what I was taking a look for.
    You’ve ended my four day long hunt! God Bless you
    man. Have a great day. Bye


  19. Thankfulness to my father who informed me regarding this blog, this web
    site is genuinely amazing.


  20. Thanks for sharing such a good idea, post is pleasant, thats why i have read it completely


Leave a reply to emmetttgwm.wordpress.com Cancel reply