<?xml version="1.0" encoding="UTF-8" standalone="no"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:gd="http://schemas.google.com/g/2005" xmlns:georss="http://www.georss.org/georss" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-1194836729866470946</atom:id><lastBuildDate>Sun, 05 Jul 2026 10:06:40 +0000</lastBuildDate><category>c#</category><category>LINQ</category><category>Linq to SQL</category><category>.net</category><category>Beginner</category><category>Sql Server</category><category>Asp.Net</category><category>JAVA SCRIPT / JQUERY</category><category>Visual Studio</category><category>WCF</category><category>HTML / CSS</category><category>Software Design Patterns</category><category>Typescript</category><category>Ajax</category><category>Angular</category><category>SOLID</category><category>Software design Principle</category><category>Debugging</category><category>Intermediate</category><category>SilverLight</category><category>Entity Framework</category><category>TPL</category><category>Validation</category><category>Angular 2</category><category>Certificate</category><category>DataAnnotation</category><category>Database</category><category>Dependency Injection</category><category>Event/Delegate</category><category>Exception</category><category>HTML5</category><category>Linq to XML</category><category>RxJs</category><category>Threading</category><category>collection</category><category>AngularJs2</category><category>Application Structure</category><category>Bulk Insert</category><category>Business Application</category><category>CORS</category><category>CSS3</category><category>Caller Information Attribute</category><category>Cross Domain</category><category>DLR</category><category>DateTime</category><category>Declaration Merging</category><category>Dictionary</category><category>Directive</category><category>Duplex</category><category>Dynamic type</category><category>EventAggregator</category><category>Expression Tree</category><category>Extension method</category><category>Factory Design pattern</category><category>Flyweight</category><category>Generics</category><category>Image</category><category>JAVASCRIPT</category><category>LESS</category><category>Lazy initialization</category><category>MultiTreading</category><category>OWIN</category><category>OpenXML</category><category>RAD Control</category><category>REST</category><category>Reference Type</category><category>SELF Hosting</category><category>StackTace</category><category>Stored Procedure</category><category>Structural Directive</category><category>Task</category><category>Testing</category><category>TypeDataSet</category><category>WebAPI</category><category>for loop</category><category>foreach</category><category>reflection</category><category>split</category><category>string</category><title>Pranay Rana</title><description></description><link>http://pranayamr.blogspot.com/</link><managingEditor>noreply@blogger.com (pranay rana)</managingEditor><generator>Blogger</generator><openSearch:totalResults>165</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><language>en-us</language><itunes:explicit>no</itunes:explicit><copyright>Pranay Rana @2010 Gmind Solution</copyright><itunes:image href="http://profile.ak.fbcdn.net/hprofile-ak-snc4/hs1326.snc4/161669_100000480841158_3237723_n.jpg"/><itunes:keywords>net,wcf,linq,sql,jquery,javascript,c</itunes:keywords><itunes:subtitle>Gmind Solution</itunes:subtitle><itunes:category text="Technology"><itunes:category text="Software How-To"/></itunes:category><itunes:author>Pranay Rana</itunes:author><itunes:owner><itunes:email>pranayamr@gmail.com</itunes:email><itunes:name>Pranay Rana</itunes:name></itunes:owner><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1194836729866470946.post-546961063882654667</guid><pubDate>Mon, 02 Nov 2020 19:28:00 +0000</pubDate><atom:updated>2020-11-03T02:17:51.099-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.net</category><category domain="http://www.blogger.com/atom/ns#">c#</category><title>Work Partitioning - Process large amount of records in C#</title><description>&lt;div&gt;
What is Work Partitioning ?
&lt;p&gt;
Work Partitioning means dividing big/large amount of work between workers. Which means if you have work which is going to take 100hrs to complete by one worker you divide it among multiple worker lets between 10 workers who work parallel , then work of 100hrs get complete in 10hrs. So work partitioning helps to complete works faster. 

&lt;/p&gt;&lt;p&gt;
Once can apply work partitioning to process data faster by dividing work among set of machines (like in big data where large amount high volume data processed by set of machines located at on premise or at in cloud) or process incoming request by set of machines with help of Load Balancers. But in this post I am going to put information about partitioning work in Process/Application using Task Parallel library of C# language. 
&lt;/p&gt;&lt;p&gt;Below is code that make use of C# task parallel library and does the processing of lots of records, here is 1m records.&lt;/p&gt;
&lt;pre class="brush: csharp"&gt;public List&amp;lt;TransFormedCustomer&amp;gt; GetProcessData()
{
    var processRecordCount = 10000;
    var retModels = new List&amp;lt;TransFormedCustomer&amp;gt;();
    var lotOfRecords = GetFakeData(); //example million records from datasource like database, web service, csv file

    int tasksCount = (lotOfRecords.Count / processRecordCount);
    if (lotOfRecords.Count % processRecordCount &amp;gt; 0)
        tasksCount++;

    var tasks = new Task&amp;lt;List&amp;lt;TransFormedCustomer&amp;gt;&amp;gt;[tasksCount];
    for (int i = 0; i &amp;lt; tasksCount; i++)
    {
        IEnumerable&amp;lt;Customer&amp;gt; datas;
        int skip = (processRecordCount * i);
        int take = processRecordCount;

        if (i == 0)
            datas = lotOfRecords.Take(take);
        else
            datas = lotOfRecords.Skip(skip).Take(take);

        tasks[i] = Task.Factory.StartNew((obj) =&amp;gt; GetProccessedData(datas), Tuple.Create(skip, take));
#if DEBUG
        if (i == tasksCount - 1 &amp;amp;&amp;amp; lotOfRecords.Count % 10000 != 0)
           take = lotOfRecords.Count % 10000;
        Console.WriteLine($"task no {i} started, reading from {skip} to {skip + take}");
#endif
    }
    try
    {
        Task.WaitAll(tasks);
    }
    catch
    {
        //left empty as logging errors in below foreach block
    }

    foreach (var task in tasks)
    {
        if (task.IsCanceled || task.IsFaulted)
        {
            var state = (Tuple&amp;lt;int, int&amp;gt;)task.AsyncState;
            Console.WriteLine($"taks failed to process data from {state.Item1} to {state.Item2}");
        }
        else
            retModels.AddRange(task.Result);
     }

    return retModels;
} 
&lt;/pre&gt;

Code works above works as follows&lt;/div&gt;&lt;div&gt;&lt;ol style="text-align: left;"&gt;&lt;li&gt;It sets number number of records one task can process , here in code its 10000 set in "processRecordCount" variable.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Code get 1m records from the datasoruce, here "GetFake()" method(code listed at the end) returns 1m customers records&amp;nbsp;&lt;/li&gt;&lt;li&gt;"taskCount" variable stores number of task need to process received records ("GetProccessedData(datas)"- method listed below) i.e. here its 100000/1000 = 10 number of task required to process records.&lt;/li&gt;&lt;li&gt;In for loop with help of "Take" or "Skip" , each task get 10000 to process.&amp;nbsp;&lt;/li&gt;&lt;li&gt;"Task.WaitAll()" wait for all task to finish work&lt;/li&gt;&lt;li&gt;After work get finished by each task, processed records get added to "retModels" collection.&lt;/li&gt;&lt;li&gt;If task to fail to process record then it logs information on console.&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;
&lt;p&gt;
&lt;b&gt;Output&lt;/b&gt;
&lt;/p&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgED63v5MAT2VKACgnWLNFPUjCTDrjzzMS3MgVamLGpp86UkR___p-pYlyJbmKEkatf7DJbUOmA-U7RGofG20PMZyqGq8ajySqhVtDxXU6YqQ6i-EmnpVtq6t18SoJzNduCUJ8RcDGWBXwY/s406/Capture.JPG" style="display: block; padding: 1em 0px; text-align: center;"&gt;&lt;img alt="" border="0" data-original-height="145" data-original-width="406" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgED63v5MAT2VKACgnWLNFPUjCTDrjzzMS3MgVamLGpp86UkR___p-pYlyJbmKEkatf7DJbUOmA-U7RGofG20PMZyqGq8ajySqhVtDxXU6YqQ6i-EmnpVtq6t18SoJzNduCUJ8RcDGWBXwY/s320/Capture.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;As shown in above image each thread does processing of 10000 records and each pick different set of records.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
Followings are advantages of work partitioning&lt;div&gt;&lt;ol style="text-align: left;"&gt;&lt;li&gt;Very huge amount of data get processed faster as it gets process parallelly with help of tasks i.e. workers\&lt;/li&gt;&lt;li&gt;It make use of multicore CPU i.e. computing efficiently as one task get processed by one core mostly&amp;nbsp; &amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;b&gt;Code used to support above function&amp;nbsp;&lt;/b&gt; &amp;nbsp;&lt;p&gt;
GetFakeData- method
&lt;/p&gt;&lt;p&gt;Fake data produced by using Faker.Net "install-package Faker.Net"&lt;/p&gt;&lt;pre class="brush: csharp"&gt;private List&amp;lt;Customer&amp;gt; GetFakeData()
{
    var customers = new List&amp;lt;Customer&amp;gt;();
    for (int i = 0; i &amp;lt; 100000; i++)
    {
        customers.Add(
            new Customer()
            {
                FirstName = Faker.Name.First(),
                LastName = Faker.Name.Last(),
                EmailAddress = Faker.Internet.Email(),
                SSN = Faker.Identification.SocialSecurityNumber()
            }
            );
    }
    return customers;
}
&lt;/pre&gt;


  
&lt;div&gt;
GetProccessedData-Method  
  &lt;pre&gt;private List&amp;lt;TransFormedCustomer&amp;gt; GetProccessedData(IEnumerable&amp;lt;Customer&amp;gt; customers)
{
    var transFormedCustomers = new List&amp;lt;TransFormedCustomer&amp;gt;();
    foreach (var customer in customers)
    {
        //do processing on recevied data 
        //enrich data and add it to process collection 
        string formattedSSN = customer.SSN.Insert(5, "-").Insert(3, "-");
        string formattedName = customer.FirstName + ' ' + customer.LastName;
        string email = customer.EmailAddress;
        Regex regex = new Regex(@"^([\w\.\-]+)@([\w\-]+)((\.(\w){2,3})+)$");
        Match match = regex.Match(email);
        if (!match.Success)
            email = "dummy@dummy.com";
        var transFormedCustomer = new TransFormedCustomer()
        {
            Name = formattedName,
            SSN = formattedSSN,
            EmailAddress = email
        };

        transFormedCustomers.Add(transFormedCustomer);
    }
    return transFormedCustomers;
}&lt;/pre&gt;

Customer &amp;amp; TransformCustomer Modal class
 &lt;pre class="brush: csharp"&gt;    public class Customer
    {
        public string EmailAddress { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string SSN { get; set; }
    }

    public class TransFormedCustomer
    {
        public string EmailAddress { get; set; }
        public string Name { get; set; }
        public string SSN { get; set; }
    }
 &lt;/pre&gt;
  
  
&lt;/div&gt;    &lt;/div&gt;</description><link>http://pranayamr.blogspot.com/2020/11/work-partitioning-process-large-amount.html</link><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgED63v5MAT2VKACgnWLNFPUjCTDrjzzMS3MgVamLGpp86UkR___p-pYlyJbmKEkatf7DJbUOmA-U7RGofG20PMZyqGq8ajySqhVtDxXU6YqQ6i-EmnpVtq6t18SoJzNduCUJ8RcDGWBXwY/s72-c/Capture.JPG" width="72"/><thr:total>0</thr:total><author>pranayamr@gmail.com (Pranay Rana)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1194836729866470946.post-2580332372034579317</guid><pubDate>Thu, 31 Jan 2019 12:15:00 +0000</pubDate><atom:updated>2019-01-31T07:15:17.691-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Angular</category><category domain="http://www.blogger.com/atom/ns#">c#</category><category domain="http://www.blogger.com/atom/ns#">CORS</category><category domain="http://www.blogger.com/atom/ns#">OWIN</category><category domain="http://www.blogger.com/atom/ns#">SELF Hosting</category><title>Self Host Angular and WebApi Using Owin</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;b&gt;Full Source code at GitHub : &lt;a href="https://github.com/pranayrana/OwinWebapiAngularHost"&gt;OwinWebapiAngularHost&lt;/a&gt;&lt;/b&gt;
&lt;br/&gt; &lt;br/&gt;
In development there are situations(organization restrictions, developing POC/Demo, there is need of control on server) where developer doesn't have Server application(IIS,Tomcat etc.), where developer got and deploy Web application. So to overcome these situation developer need environment which similar to Server application, basically issue can be resolved by having Self hosting application. Self hosting application allows to deploy web application and provide similar functionality as server application. &lt;br /&gt;
Question rises how to create self hosting application, answer is by making use of Owin like Framework. Below post is about how to create self hosting application with help of Owin framework which in turn allows to host Asp.Net WebApi and Angular application. 
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Creating Self Hosting application&lt;/b&gt;
&lt;br /&gt;
To create self hosting application, developer can create either Console, WPF or Windows Form Application or Windows Service by choosing Console, WPF or Windows Form or WindowsService project type provided in visual studio.&lt;br /&gt;
For this post I am choosing Windows Service project as given in below image  &lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWQTrjVkC67qlIqhCZFHROiSsxdtNbVuzXfPVcvwOCoeFT7lX8z0uPMyH2R5rPiWIDSHbylhW5Tiktj2BmqERPraPFb95baQA_ElbITNWoJE9K5Ik5noEROvo3zbWMBWglAv-lmjzAgw2P/s1600/windows+service+.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="661" data-original-width="954" height="222" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWQTrjVkC67qlIqhCZFHROiSsxdtNbVuzXfPVcvwOCoeFT7lX8z0uPMyH2R5rPiWIDSHbylhW5Tiktj2BmqERPraPFb95baQA_ElbITNWoJE9K5Ik5noEROvo3zbWMBWglAv-lmjzAgw2P/s320/windows+service+.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Once click "ok button" it will create windows service application in visual studio. But when run application by pressing "F5" in visual studio it display message &lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTT-LKZv8flhY2Hrlk37qRXPy5PWx4MPyIhys3mdf_k8pad5_O1xmCtZJYe86-2Ler7I2JcL1RyipqoQsQ6xl7AaO_0IUeJXjeJPC9Rp5nfcc53YflRwNZOTtgOU3cHXlg-3fZL2Z5HYcS/s1600/service+start+error.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="200" data-original-width="491" height="130" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTT-LKZv8flhY2Hrlk37qRXPy5PWx4MPyIhys3mdf_k8pad5_O1xmCtZJYe86-2Ler7I2JcL1RyipqoQsQ6xl7AaO_0IUeJXjeJPC9Rp5nfcc53YflRwNZOTtgOU3cHXlg-3fZL2Z5HYcS/s320/service+start+error.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
To avoid error in development environment , do check for service running in user interactive check flag "UserInteractive". Below code shows how to do it 
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;
static class Program
{
        /// &lt;summary&gt;
        /// The main entry point for the application.
        /// &lt;/summary&gt;
    static void Main(string[] args)
    {
        try
        {
            //flag check service running in user interactive mode i.e. debug mode 
            if (Environment.UserInteractive)
            {
                Service1 service1 = new Service1();
                service1.TestStartup(args); // start service in debug mode
                Console.WriteLine("Service Started at: http://localhost:8081/File/action");
                Console.ReadLine(); // stop service in debug mode
                service1.TestStop();
            }
            else
            {

                ServiceBase[] ServicesToRun;
                ServicesToRun = new ServiceBase[]
                {
                 new Service1()
                };
                ServiceBase.Run(ServicesToRun);
            }
        }
        catch(Exception ex)
        {
           Console.WriteLine(ex);
           //log error 
           Console.ReadLine();
        }
    }
}
&lt;/pre&gt;
&lt;pre class="brush: csharp"&gt;&lt;/pre&gt;
&lt;br /&gt;
Once done add below code in service.cs file which is related to windows service application 
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;public partial class Service1 : ServiceBase
{
    public Service1()
    {
        InitializeComponent();
    }

    protected override void OnStart(string[] args)
    {
       if (ConfigurationManager.AppSettings["baseAddress"] != null)
          baseAddress = ConfigurationManager.AppSettings["baseAddress"].ToString();
       server = WebApp.Start&lt;OwinStartUp&gt;(baseAddress);
    }

    protected override void OnStop()
    {
        server.Dispose();
    }

    internal void TestStartup(string[] args)
    {
        this.OnStart(args);
    }

    internal void TestStop()
    {
        this.OnStop();
    }
    
    private IDisposable server;
    string baseAddress = "http://*:8081/";
} 
&lt;/pre&gt;
Line of code written in OnStart method of service file is most important code, "&lt;i&gt;WebApp.Start()&lt;/i&gt;" this method start Owin web server at "8081" port by making use of settings provided in "&lt;i&gt;OwinStartUp&lt;/i&gt;"(setup of this class discussed in detail below) class. 
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Installing Owin &lt;/b&gt;&lt;br /&gt;
After creating and setting Windows service, now it's time to install Owin framework which provide support for hosting web based application. Owing installation can be done via "Package Manager console (this console can be opened up from Visual studio menu Tools&amp;gt;&amp;gt;Nuget Package Manager &amp;gt;&amp;gt; Package Manager Console)" or by "Manage Nuget Packages(this is menu option comes by right clicking project in visual studio)". 
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;//run below command in package manager console to install owin support
Install-package Microsoft.Owin.SelfHost
//or search package "Microsoft.Owin.SelfHost" in package management window  
&lt;/pre&gt;
This command installs following packages, one can view in package.json file of project or in references as dll.
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;  
  Microsoft.Owin
  Microsoft.Owin.Diagnostics
  Microsoft.Owin.Host.HttpListener
  Microsoft.Owin.Hosting
  Microsoft.Owin.SelfHost
  Owin
&lt;/pre&gt;
&lt;br /&gt;
Installation of basic packages enable Owin in windows service application. To make use of Owin, developer needs to add settings which decide what type of application/files can be served by self hosted owin server application. Below is basic "&lt;i&gt;OwinStartUp&lt;/i&gt;" class that used by "&lt;i&gt;WebApp.Start()&lt;/i&gt;" method to start server.
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;//OwinStartUp.Cs
public class OwinStartUp
{
    public void Configuration(IAppBuilder app)
    {
#if DEBUG
        app.UseErrorPage();
#endif
        app.UseWelcomePage("/");
    }
}
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Enable WebApi Hosting&lt;/b&gt;&lt;br /&gt;
To enable WebApi hosting in above created self hosted owin based application, Add below package&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;//run below command in package manager console to install WebApi support
Install-Package Microsoft.AspNet.WebApi.OwinSelfHost
//or search package "Microsoft.AspNet.WebApi.OwinSelfHost" in package management window  
&lt;/pre&gt;
&lt;br /&gt;
This command installs following packages, one can view in package.json file of project or in references as dll.
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;  
  Microsoft.AspNet.WebApi.Client
  Microsoft.AspNet.WebApi.Core
  Microsoft.AspNet.WebApi.Owin
  Microsoft.AspNet.WebApi.OwinSelfHost
  Newtonsoft.Json
&lt;/pre&gt;
&lt;br /&gt;
Once installation done, below line of code in start setting class enable support of WebApi hosting in application&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;public class OwinStartUp
{
    public void Configuration(IAppBuilder appBuilder)
    {
  // Configure Web API for self-host.
  //Install-Package Microsoft.AspNet.WebApi.OwinSelfHost

  //removing support of xmlformatter
  HttpConfiguration config = new HttpConfiguration();
  config.Formatters.Remove(config.Formatters.XmlFormatter);

  //webapi route configuration
  config.Routes.MapHttpRoute(
   name: "DefaultApi",
   routeTemplate: "api/{controller}/{action}/{id}",
   defaults: new { id = RouteParameter.Optional }
  );

  config.MapHttpAttributeRoutes();

  //adding config for WebApi support
  appBuilder.UseWebApi(config);
    }
}
&lt;/pre&gt;
&lt;br /&gt;
After adding support for WebApi, developer can add WebApi controller as given below.
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;public class TestController : ApiController
{
    [HttpGet]
    public string GetFileName()
    {
        return "Test";
    }
} 
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Enable support for CORS&lt;/b&gt;&lt;br /&gt;
Above add support for WebApi, but it won't allows to access form other domain apart form hosted domain i.e. from Cross domain. Developer can resolve issue of CORS as below.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;//run below command in package manager console to install Cors support
Install-Package Microsoft.Owin.Cors
//or search package "Microsoft.Owin.Cors" in package management window  
&lt;/pre&gt;
&lt;br /&gt;
This command installs following packages, one can view in package.json file of project or in references as dll.
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;  
  Microsoft.Owin.Cors
  Microsoft.AspNet.Cors
&lt;/pre&gt;
&lt;br /&gt;
Once installation done, below line of code enable CORS &lt;br /&gt;
&lt;pre class="brush: csharp"&gt;  
public class OwinStartUp
{
    public void Configuration(IAppBuilder appBuilder)
    {
        //webapi code done before remain as is
  
        //Install-Package Microsoft.Owin.Cors
        appBuilder.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
    }
}
&lt;/pre&gt;
&lt;br /&gt;
So now self host is ready with WebApi hosted in it.
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Enabling Angular/Static file hosting&lt;/b&gt;&lt;br /&gt;
Enabling self host for angular is similar to enable self host for allowing browsing of static html files i.e. web site. Because angular is framework for creating single page application which access by accessing "index.html" file only. &lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
&lt;b&gt;Note:&lt;/b&gt;&lt;br /&gt;
For hosting angular application please perform prod build (by using angular cli command &lt;b&gt;ng build --prod&lt;i&gt;&lt;/i&gt;&lt;/b&gt;) of you application as it has prod generated code i.e. html page with javascript only. Guide for Angular deployment : &lt;a href="https://angular.io/guide/deployment"&gt;https://angular.io/guide/deployment&lt;/a&gt;


&lt;br /&gt;
&lt;br /&gt;
To enable WebApi hosting in above created self hosted owin based application, Add below package&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;//run below command in package manager console to provide static website /angular app support
Install-Package Microsoft.Owin.StaticFiles
//or search package "Microsoft.Owin.StaticFiles" in package management window  
&lt;/pre&gt;
&lt;br /&gt;
This command installs following packages, one can view in package.json file of project or in references as dll.&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;  
  Microsoft.Owin.FileSystems
  Microsoft.Owin.StaticFiles
&lt;/pre&gt;
&lt;br /&gt;
Once installation done, below line of code in start setting class enable support of Static Web app/Angualr app hosting in application&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;public class OwinStartUp
{
    public void Configuration(IAppBuilder appBuilder)
    {
       //hosting static files i.e. angular
       //install-package Microsoft.Owin.SelfHost
       //install-package Microsoft.Owin.StaticFiles
       var options = new FileServerOptions();
       options.EnableDirectoryBrowsing = true;
       options.FileSystem = new PhysicalFileSystem("./app");
       options.StaticFileOptions.ServeUnknownFileTypes = true;
       appBuilder.UseFileServer(options);

      //code done for WebApi remain as is if you want webapi support 
   }
}
&lt;/pre&gt;
&lt;br /&gt;
Below is full source code done in this excercise 
&lt;br /&gt;
&lt;pre&gt;    
    public class OwinStartUp
    {
        public void Configuration(IAppBuilder appBuilder)
        {

            //hosting static files i.e. angular
            //install-package Microsoft.Owin.SelfHost
            //install-package Microsoft.Owin.StaticFiles
            var options = new FileServerOptions();
            options.EnableDirectoryBrowsing = true;
            options.FileSystem = new PhysicalFileSystem("./app");
            options.StaticFileOptions.ServeUnknownFileTypes = true;
            appBuilder.UseFileServer(options);


            // Configure Web API for self-host.
            //Install-Package Microsoft.AspNet.WebApi.OwinSelfHost
            HttpConfiguration config = new HttpConfiguration();
            config.Formatters.Remove(config.Formatters.XmlFormatter);

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{action}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

            config.MapHttpAttributeRoutes();
            appBuilder.UseWebApi(config);

            //Install-Package Microsoft.Owin.Cors
            appBuilder.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
        }
    }
&lt;/pre&gt;&lt;br/&gt;
&lt;b&gt;Full Source code at GitHub : &lt;a href="https://github.com/pranayrana/OwinWebapiAngularHost"&gt;OwinWebapiAngularHost&lt;/a&gt;&lt;/b&gt;
&lt;/div&gt;
</description><link>http://pranayamr.blogspot.com/2019/01/self-host-angular-and-webapi-using-owin.html</link><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWQTrjVkC67qlIqhCZFHROiSsxdtNbVuzXfPVcvwOCoeFT7lX8z0uPMyH2R5rPiWIDSHbylhW5Tiktj2BmqERPraPFb95baQA_ElbITNWoJE9K5Ik5noEROvo3zbWMBWglAv-lmjzAgw2P/s72-c/windows+service+.jpg" width="72"/><thr:total>0</thr:total><author>pranayamr@gmail.com (Pranay Rana)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1194836729866470946.post-5050463556347848722</guid><pubDate>Sat, 19 Jan 2019 19:23:00 +0000</pubDate><atom:updated>2019-01-19T14:29:17.453-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">c#</category><category domain="http://www.blogger.com/atom/ns#">Generics</category><title>Return Given Type from Generic method</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
In C#, Genetic method as below, which can return value of multiple types (i.e. below method can return value of any primitive types or reference types).&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;   public T GetValue&amp;lt;T&amp;gt;()
   {
  
   }
&lt;/pre&gt;
so one cannot return value directly from method. As T is template type &amp;amp; it can be any of type, so compiler doesn't allow direct conversation of return value to type T.&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;   public T GetValue&amp;lt;T&amp;gt;()
   {
     //Compilation error (line 13, col 10): Cannot implicitly convert type 'Customer' to 'T'
     return new Customer();
     //this error says that T is template type and it can be of any type (primitive or reference)
   }
&lt;/pre&gt;
Above will not work because Template type of Generic method get replaced at Runtime and Compiler of C# cannot able to figure out Generic type actual type at compile time. for example call to method is like as below&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;// call to method
GetValue&amp;lt;int&amp;gt;()

//then at runtime method will be like as below 
public int GetValue&amp;lt;int&amp;gt;()
{
 //assuming generic method return customer object only 
 return new Customer();
}
&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt; Solution&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
As explained in detail problem with generic method is to return value of requested return type (i.e. Runtime type which replaces generic Template type T). So to solve problem return value to &lt;i&gt;object &lt;/i&gt;type(as &lt;i&gt;object&lt;/i&gt; is base class of all types in C# .net) and then convert it to generic template type. Below is code for that solves problem&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;public T GetValue&amp;lt;T&amp;gt;()
{
  Type typeParameterType = typeof(T);
    Type typeParameterType = typeof(T);
  if(typeParameterType.ToString()=="System.Int32")
    return (T)(object)1;
   if(typeParameterType.ToString()=="Customer")
    return (T)(object)new Customer()
}
&lt;/pre&gt;
&lt;br /&gt;
But problem with above code is ,for every new return type value new condition required to be added in method i.e it requires to change method for every new return type and it violates Single responsibility principle.
&lt;br /&gt;
&lt;br /&gt;
This can easily be resolved by making use of C# in built method &lt;i&gt;Convert.ChangeType&lt;/i&gt;, below is code for the same&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;  (T)Convert.ChangeType(1, typeParameterType)//here T is generic type
&lt;/pre&gt;
&lt;br /&gt;
Below is code for getting value of column form DataRow object which is based on above discussion&lt;br /&gt;
&lt;pre&gt;  public static T GetColumnValue&amp;lt;T&amp;gt;(this DataRow dr, string columnName)
  {
     //get type of Template type T
     Type typeParameterType = typeof(T);
     //get type of Template type T, this works when requested type is nullable
     typeParameterType = Nullable.GetUnderlyingType(typeParameterType) ?? typeParameterType;

     //check value present or not , if not return default value of generic type
     return dr[columnName] != DBNull.Value
                ? (T)Convert.ChangeType(dr[columnName], typeParameterType)
                : default(T);
   } 
//use of this method in code 

datarow.GetColumnValue&amp;lt;int&amp;gt;("id");
datarow.GetColumnValue&amp;lt;int?&amp;gt;("orderid");
datarow.GetColumnValue&amp;lt;double&amp;gt;("amount");
&lt;/pre&gt;
&lt;br /&gt;
so above is Generic method to get value of datacolumn of given type. Method get value of return type from template type T and then does conversation of datacolumn value using  &lt;i&gt;Convert.ChangeType&lt;/i&gt;.

&lt;br /&gt;
&lt;br /&gt;
Below is example of &lt;a href="https://pranayamr.blogspot.com/b/post-preview?token=APq4FmB0de8BwqczstnTu_Y0y0rXB1RmvHZ7RdsYREB2VzVbFtnCfPxbWfW8gSA5eBs6a1xMooKf6Yzcm9DT5u9znjod_KD9_8tSzcihNhQ57fpanGg6ns1aJp317hM894Tg1eWit6j3&amp;amp;postId=5050463556347848722&amp;amp;type=POST"&gt;Factory Design&lt;/a&gt; pattern using same technique 
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;public class CommandFactory
{       
    //only create object of type which implement ICommand
    public static T GetCommand&amp;lt;T&amp;gt;() where T:  ICommand
    {
      //it create object using Template type T and by making use of reflection
      //once create factory this way there is no need to open it again for modification
        Type type = typeof(T);
        Object obj = Activator.CreateInstance(type);
        return (T)obj;
    }
}
&lt;/pre&gt;
&lt;br /&gt;
Read about this in detail here : &lt;a href="http://pranayamr.blogspot.com/2018/05/factory-design-pattern-with-generics.html"&gt;Factory Design Pattern With Generics&lt;/a&gt;
&lt;/div&gt;
</description><link>http://pranayamr.blogspot.com/2019/01/return-given-type-from-generic-method.html</link><thr:total>0</thr:total><author>pranayamr@gmail.com (Pranay Rana)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1194836729866470946.post-6638020825567143662</guid><pubDate>Sat, 18 Aug 2018 18:35:00 +0000</pubDate><atom:updated>2018-08-18T14:35:10.624-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">HTML / CSS</category><category domain="http://www.blogger.com/atom/ns#">LESS</category><title>CSS to Less</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
CSS to Less - It's about what are the motivating factor, which Less have that encourage developer to make use of this extended languages. Below post is not provide details information about Less, it provide introduction to features provided by Less. Post is helpful to those who are looking for brief introduction to features of Less, higher language developer who work sometimes with CSS and for the beginner.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;CSS&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
CSS (Cascading style sheet) - it used with HTML element to to beautify web pages of web application. It use to define set of style(s) (i.e set of style rules), for mostly each element in web page to beatify each element. Style defined with CSS , gives each element same look. For Example&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;h1 {
 Color: red;
}&lt;/pre&gt;
&lt;br /&gt;
this style rule give each h1 element black color. If style changes i.e. color changed from read to green then it will affect all h1 element in web pages of web application.&lt;br /&gt;
&lt;br /&gt;
Above brief explanation of what is CSS and why to use it in web application (find full details:&amp;nbsp;&lt;a href="https://www.w3.org/Style/CSS/Overview.en.html"&gt;https://www.w3.org/Style/CSS/Overview.en.html&lt;/a&gt;).&lt;br /&gt;
&lt;br /&gt;
Following problem arise once CSS implemented for application&lt;br /&gt;
&lt;ol style="text-align: left;"&gt;
&lt;li&gt;Every style rule go in one file, File size increases.&lt;/li&gt;
&lt;li&gt;Modification becomes difficult Ex. same color used in multiple styles then one need to go every where and need to modify it.&lt;/li&gt;
&lt;li&gt;If style sheet divided in multiple style sheet , browser create multiple request to download each individual CSS file.&lt;/li&gt;
&lt;li&gt;If style sheet divided in multiple files then , modification of common color, font used becomes too difficult.&lt;/li&gt;
&lt;li&gt;Nested element or Pseudo Style rules are difficult to understand and maintain as CSS file increases.&lt;/li&gt;
&lt;/ol&gt;
&lt;b&gt;Less&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Less (Leaner style sheet) which is CSS extension.&amp;nbsp; Less, have features like allow to define Variables &amp;amp; Mixins (like functions), Set of Inbuilt function, Support for arithmetic operators,&amp;nbsp; Tools supported Create single CSS file as output from multiple Less&amp;nbsp;files etc. So feature provided by Less is some what equal to programming language and that in turn very much helpful to developer who are working more on programming language &amp;amp; less on CSS styles.&lt;br /&gt;
&lt;br /&gt;
Browser only understand HTML + Javascript + CSS style rules when loading web page of application,&amp;nbsp; which means that it doesn't understand Less. So, Like Typescript transpile to Javascript with help of transpilers. Less&amp;nbsp;style rules get converted to CSS style rules as output by various available transpilers/compilers (check list here : &lt;a href="http://lesscss.org/tools/#online-less-compilers"&gt;http://lesscss.org/tools/#online-less-compilers&lt;/a&gt;).&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhu2copHtPpLUDxTqQlYIIixLjXFTb_UYNh_PJextlWfoRF7aQKzyGcOnNFG8a11fXP_o0k8TMh-BOUlhWukIfuJDm0d5ljVQ_dWz3aatBbjvIwUKUdnRC8TVlFn2TYqvQ0PLumCIIqqZQ/s1600/less+to+css.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="204" data-original-width="1064" height="121" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhu2copHtPpLUDxTqQlYIIixLjXFTb_UYNh_PJextlWfoRF7aQKzyGcOnNFG8a11fXP_o0k8TMh-BOUlhWukIfuJDm0d5ljVQ_dWz3aatBbjvIwUKUdnRC8TVlFn2TYqvQ0PLumCIIqqZQ/s640/less+to+css.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Following way Less helps to overcome problem associated with CSS.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;ol style="text-align: left;"&gt;
&lt;li&gt;&lt;b&gt;Difficulty in modification of style property which having same value and located in different rules. Ex. Colors, Font-Size, etc.
&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
For example below CSS, each element style rule have color property. Now if there is need of changing this color value "#003152" to "red". As part of color changing exercise CSS developer needs to locate each rule and have to replace color value to red.&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;h1 {
 color: #003152;
}
body {
    color: #003152;
}
a:active {
    color: #003152;
}
&lt;/pre&gt;
&lt;br /&gt;
Locating each rule and changing color to "red" can lead to a problem if CSS file size is big or if the CSS style rules are located in different files.&lt;br /&gt;
&lt;br /&gt;&lt;b&gt;
Solution - Less Variables&lt;/b&gt;&lt;br /&gt;This can be resolve in Less by making use of variable, as given in below code.&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;@color: #003152;

h1 {
 color:@color;
}
body {
    color: @color;
}
a:active {
    color: @color;
}
&lt;/pre&gt;
&lt;br /&gt;
So one value of color stored in variable , change needs be done is change value of variable.&lt;br /&gt;
Other use cases of variable is as below&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;@color: red;
@background-color: black;
@base-font-size : 10px;
@images: "./assets/images";
@font-family: "Times New Roman", Times, serif";

h1 {
 font-size: @base-font-size + 10px;
}
body {
    color: @color;
    font-family: @font-family;
    font-size: @base-font-size;
    background-color: @background-color;
}
.input {
  font-size: @base-font-size + 2px;
}
a:active {
    color: @color;
    font-size: @base-font-size + 2px;
}
.button {
  background-image: url("@{images}/backimage.ico");
}
&lt;/pre&gt;
&lt;br /&gt;&lt;b&gt;
Point to not in above Less code&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;As listed in above variable in LESS , allows to store&amp;nbsp; color values, string values, numeric values alone and with units (like %, px, etc.). &lt;/li&gt;
&lt;li&gt;Less allows to perform numeric operation like =, - on numeric values Ex. @base-font-size stores numeric value and + operation performed in .input,he style rules. &lt;/li&gt;
&lt;li&gt;Less allows string interpolation , Ex. in above code @image variable defines path , which can be used any where like used in .button style rule &lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;b&gt;
Advantage&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;
Less Variable allows to store common values which can be used in multiple style rules not in single file but one can use same variable in multiple files (how to use in multiple files discussed below).
&lt;/li&gt;
&lt;li&gt;
Developer can store common and keep changing values in variable, so if have to perform modification just changing variable works.
&lt;/li&gt;
&lt;li&gt;
Less variable can easily allows to achieve multiple colored base Theme&amp;nbsp; as just changing variable values different value is easy task.
&lt;/li&gt;
&lt;li&gt;
Variables in Less makes life too easy for developer who is working on CSS , specially those developer who are working on programming language like C#,java and some time work with CSS.
&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;
CSS style rules with common property need to be repeated in each rule. &lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
In CSS even though multiple style rules use same property and with same value , its required to be repeated that in each style rule as given in below example&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;input {
    font-size: 12px;
    background-color: white; 
    height: 20px;
}

select {
    font-size: 12px;
    background-color: white; 
    height: 25px;
}

select[multiple] {
    font-size: 12px;
    background-color: white; 
    height: 250px;
}
&lt;/pre&gt;
&lt;br /&gt;
so in above example each property get repeated for different input elements except height property which is having different value.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;
Solution - Less Mixins&lt;/b&gt;&lt;br /&gt;
Less solves this problem by providing Mixins. Below code show how Mixins solve problem of common properties.&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;.input-base {
    font-size: @base-font-size + 2px;
    background-color: @input-backcolor; 
}

input {
    .input-base();
    height: 20px;
}

select {
    .input-base();
    height: 25px;
}

select[multiple] {
    .input-base();
    height: 250px;
}
&lt;/pre&gt;
&lt;br /&gt;
so in style rules , .input-base is treated as Mixin which get called by all input style rules just to make use of common properties.&lt;br /&gt;
&lt;br /&gt;
Mixins like function in programming language , takes argument as input and also allows arguments with default value as in below code.&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;.input-base (@height, @font-size: @base-font-size) {
    font-size: @font-size + 2px;
    background-color: @input-backcolor; 
    height:  @height;
}

input {
    .input-base(20px);
}

select {
    .input-base(25px);
}

select[multiple] {
    .input-base(250px, @base-font-size + 2px);
}
&lt;/pre&gt;
&lt;br /&gt;
So in above code Mixin .input-base takes two argument like function as input. Based on input value Mixins copy property values to given style rule.&lt;br /&gt;
&lt;br /&gt;&lt;b&gt;Less Extend&lt;/b&gt;&lt;br /&gt;
Less also have one another way for above problem, which making use of &amp;amp;:extend(.stylerule), like as given in below code.
&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;.input-base {
    font-size: @base-font-size + 2px;
    background-color: @input-backcolor; 
}

input {
    &amp;amp;:extend(.input-base);
    height: 20px;
}

select {
    &amp;amp;:extend(.input-base);
    height: 25px;
}

select[multiple] {
    &amp;amp;:extend(.input-base);
    height: 250px;
}
&lt;/pre&gt;
&lt;br /&gt;
as name suggest extend , it extends CSS style rule. It's similar to inheritance in higher level programming language like C#,Java.&lt;br /&gt;
&lt;br /&gt;&lt;b&gt;
Difference between &amp;amp;:extends and Mixins are&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt; Mixins works like function i.e. takes argument as input, which is not possible with extend. &lt;/li&gt;
&lt;li&gt; The way CSS generated by Mixins and Extend. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;
Mixins generate CSS as below&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;pre&gt;input {
    font-size: 12px;
    background-color: white; 
    height: 20px;
}

select {
    font-size: 12px;
    background-color: white; 
    height: 25px;
}

select[multiple] {
    font-size: 12px;
    background-color: white; 
    height: 250px;
}
&lt;/pre&gt;
&lt;br /&gt;
So Mixins copies each properties in each style rule , so it increase size of style sheet.&lt;br /&gt;
&lt;br /&gt;&lt;b&gt;
Extend generate CSS as below
&lt;/b&gt;&lt;br /&gt;
&lt;pre&gt;.input-base,
input,
select,
select[multiple] {
  font-size: 12px;
  background-color: white;
}
input {
  height: 20px;
}
select {
  height: 25px;
}
select[multiple] {
  height: 250px;
}
&lt;/pre&gt;
&lt;br /&gt;
So extend generate less style sheet and instead of copying each property in each style rule it actually extends existing style rule.&lt;br /&gt;
  &lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;
Difficulty in maintaining Nested element style rules.&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
In html document consist of nested element (like parent-child element). CSS allows to set style rule for this nested element relationship Example.&amp;nbsp; &amp;lt;li&amp;gt; child element under parent &amp;lt;ui&amp;gt; or &amp;lt;a&amp;gt; child element under &amp;lt;li&amp;gt; ,&amp;nbsp;&amp;nbsp;&amp;lt;li&amp;gt; child element under parent &amp;lt;ui&amp;gt;. Example given below&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&amp;lt;ul&amp;gt;
  &amp;lt;li&amp;gt;
    &amp;lt;a href="http://google.com/" rel="noopener" target="_blank"&amp;gt;google&amp;lt;/a&amp;gt;
  &amp;lt;/li&amp;gt;
  &amp;lt;li&amp;gt;
    &amp;lt;a href="http://localhost:8080/abc.com" rel="noopener" target="_blank"&amp;gt;Test&amp;lt;/a&amp;gt;
  &amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;
&lt;/pre&gt;
&lt;br /&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhoxi-LhCiKd9uuVq6oWICndaKPDWbH85QmyXZkahWq3PRw38DLsk0U-nUAFGp4gthjNoniQkqrgsf-B3CzSRhGyAY9w635tl-wFoaeNdKREEcwI-1h4onqAbwsr6tXwa0gtvYsTqkZLCd4/s1600/nesting.jpg" imageanchor="1"&gt;&lt;img border="0" data-original-height="179" data-original-width="282" height="202" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhoxi-LhCiKd9uuVq6oWICndaKPDWbH85QmyXZkahWq3PRw38DLsk0U-nUAFGp4gthjNoniQkqrgsf-B3CzSRhGyAY9w635tl-wFoaeNdKREEcwI-1h4onqAbwsr6tXwa0gtvYsTqkZLCd4/s320/nesting.jpg" width="320" /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;
Below is style rules for nested elements&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;ul li {
  font-size: 13px;
  color: red; 
}&lt;/pre&gt;
&lt;pre&gt;&lt;pre&gt;ul li a {
  font-size: 13px;
  color: blue; 
}&lt;/pre&gt;
&lt;/pre&gt;
Problem with above is very difficult to understand and read if developer is not aware of CSS nested styling rules.&lt;br /&gt;
&lt;br /&gt;&lt;b&gt;
Less allows to write this nesting style&lt;/b&gt; rules as below which is easy to understand nesting (parent-child relation) and read.&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;ul {
    li {
       a {
          font-size: @base-font-size;
           color: @font-color;
        }
    }
}
&lt;/pre&gt;
&lt;br /&gt;
Above structure of CSS easily tell that a is child of li, and li is child of ui. and this will get apply to nesting structure which is like ui --&amp;gt; li --&amp;gt; a.&lt;br /&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;
Difficulty with managing element pseudo style rules.&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;CSS force to write separate rules for each pseudo class like anchor tag a element which allows to add style rule on focus or hover or input element allows to add style rule for focus.&lt;br /&gt;
&lt;br /&gt;
Example CSS style rules for anchor tag a &amp;amp; hover on anchor tag, and input tag &amp;amp; focus on input&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;a {
  color: #b3b3b3;
}
a:active {
  color: #003152;
}
input[type=text] {
  width: 100px;
  transition: width .35s ease-in-out;
}
input[type=text]:focus {
  width: 250px;
  border: 2px solid green;
}
&lt;/pre&gt;
&lt;br /&gt;&lt;b&gt;Solution - Less nesting rules&lt;/b&gt; can easily encapsulate pseudo element style rules as given below.&lt;br /&gt;&lt;br /&gt;
&lt;pre&gt;input[type=text] {
  width: 100px;
  transition: width .35s ease-in-out;
  &amp;amp;:focus {
     width: 250px;
     border: 2px solid green;
  }
}

a {
  color: #b3b3b3;
  &amp;amp;:active {
    color: #003152;
  }
}
&lt;/pre&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;
Allows to in smaller manageable CSS files&lt;/b&gt;
&lt;br /&gt;&lt;br /&gt;
CSS allows to create smaller style rules files separately for different part of page like&lt;br /&gt;
&lt;br /&gt;
global.CSS&lt;br /&gt;
navbar.CSS&lt;br /&gt;
form-element.CSS&lt;br /&gt;
etc.&lt;br /&gt;
&lt;br /&gt;
and with help of import statement CSS allows to import this files in each other or in one file. Example :&lt;br /&gt;
&lt;br /&gt;
In Application.CSS&lt;br /&gt;
@import "global.css";&lt;br /&gt;
@import "navbar.css";&lt;br /&gt;
@import "form-element.css";&lt;br /&gt;
&lt;br /&gt;
But disadvantage are 
&lt;ul&gt;
&lt;li&gt;Separate http request got created for each file when application loaded in browser and it will increase network traffic. Which means CSS doesn't combine all CSS file in one file.
&lt;br /&gt; &lt;br /&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixrW9-cWZek1uBYrwYWNFjqeInqm3T31PGmy9gq2I2ZmNh7GYJmam8bd1emhNFlfNpHuFmvYSBBXSkpQz5uXPAa23wFB4-0K9w32OjjbA-tNhEcPGHEY72qp8qN9BREkR3-5nKGGI4Ee-8/s1600/request.jpg" imageanchor="1"&gt;&lt;img border="0" data-original-height="306" data-original-width="575" height="170" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixrW9-cWZek1uBYrwYWNFjqeInqm3T31PGmy9gq2I2ZmNh7GYJmam8bd1emhNFlfNpHuFmvYSBBXSkpQz5uXPAa23wFB4-0K9w32OjjbA-tNhEcPGHEY72qp8qN9BREkR3-5nKGGI4Ee-8/s320/request.jpg" width="320" /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;
One more disadvantage is if there need of changing common property like color , one needs to open each file and have locate style property to make change.
&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;b&gt;
Less&lt;/b&gt; allows importing of files same as CSS , but in LESS tools merge all different files as generate single CSS file.&lt;br /&gt;
&lt;br /&gt;
global.less&lt;br /&gt;
variables.less ( this file contains all variables which is used by common properties like color, font-size, background color etc.)&lt;br /&gt;
navbar.less&lt;br /&gt;
form-element.less&lt;br /&gt;
&lt;br /&gt;
In Application.CSS&lt;br /&gt;
@import "variables"&lt;br /&gt;
@import "global"&lt;br /&gt;
@import "navbar"&lt;br /&gt;
@import "form-element"&lt;br /&gt;
&lt;br /&gt;
this will generate one file only, which get downloaded in on http reuqest. And as all common property value is replaced by variables which is stored in variable.less file , managing and changing common properties also becomes easy.&lt;br /&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;
Less having some set of inbuilt function.&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Less have lot of inbuilt function that also very helpful, which are also helpful.&lt;br /&gt;
&lt;br /&gt;
Example: below function helps to get different colors.&lt;br /&gt;
&lt;pre&gt;color: darken(@body-color, 20%);
border-color: lighten ( @body-color, 20%);
&lt;/pre&gt;
&lt;br /&gt;
there are lot of different function in Less helps in build styles for properties, find all functions here :&amp;nbsp;&lt;a href="http://lesscss.org/functions/"&gt;http://lesscss.org/functions/&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;b&gt;Conclusion&lt;/b&gt;&lt;br /&gt;
CSS allows to beautify html pages but extension like Less is very helpful. Less helps to overcome issues one face with CSS, also provide easy to understand, manage and simplify style rules with the help of feature like variables, mixins, extends, nesting structure, in build set of functions etc. However above is just start or overview of Less. Read in depth here :&amp;nbsp;&lt;a href="http://lesscss.org/features/"&gt;http://lesscss.org/features/&lt;/a&gt;&lt;/div&gt;
</description><link>http://pranayamr.blogspot.com/2018/08/css-to-less.html</link><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhu2copHtPpLUDxTqQlYIIixLjXFTb_UYNh_PJextlWfoRF7aQKzyGcOnNFG8a11fXP_o0k8TMh-BOUlhWukIfuJDm0d5ljVQ_dWz3aatBbjvIwUKUdnRC8TVlFn2TYqvQ0PLumCIIqqZQ/s72-c/less+to+css.png" width="72"/><thr:total>1</thr:total><author>pranayamr@gmail.com (Pranay Rana)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1194836729866470946.post-4296743109326052320</guid><pubDate>Sun, 15 Jul 2018 17:10:00 +0000</pubDate><atom:updated>2018-07-16T01:59:46.564-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Beginner</category><category domain="http://www.blogger.com/atom/ns#">c#</category><title>Parsing Number with NumberStyles</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
Parsing string value to number i.e. converting string representation of number into number type is one of the basic task and most of programming language provides support to perform it easily. But sometimes developer writes too much complex code to perform this (string to number parsing) task as not aware about the easy way provided by programming language.&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Below is small tip about parsing string representation of number to number type with respect to C# language. C# language has below numeric types&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;integer types (sbyte, short, int, long, byte, ushort, uint, ulong),&amp;nbsp;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;non-integer (number with precision or floating) types (float, decimal)&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div&gt;
and to convert string value in one of the above listed numeric type, C# language provide two methods&lt;br /&gt;
&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;&lt;a href="https://msdn.microsoft.com/en-us/library/system.int32.parse(v=vs.110).aspx"&gt;numberType.Parse&amp;nbsp;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://pranayamr.blogspot.com/2012/03/tryparse-methods.html"&gt;numberType.TryParse&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnBVPDbMQIFecRl9ItI8_kvWfuQKnu2ytJHuMIbcmlpyqEEMUbInwqaOLfmRlfdDHeXeOr0LlUMXLpA2Cd9rHRIbLMO8IQuRmuNHENTc-GJ4VQ_PSHHPZZviujFZ6dk8jkrH6nRNlfsdtn/s1600/parse+method.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="95" data-original-width="603" height="99" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnBVPDbMQIFecRl9ItI8_kvWfuQKnu2ytJHuMIbcmlpyqEEMUbInwqaOLfmRlfdDHeXeOr0LlUMXLpA2Cd9rHRIbLMO8IQuRmuNHENTc-GJ4VQ_PSHHPZZviujFZ6dk8jkrH6nRNlfsdtn/s640/parse+method.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
Above two method allows to convert string representation of number to string. For Example&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;int number = int.Parse("1234");
//or
//int number = -1;
//bool isPased = int.TryParse("1234", out number);
Console.WriteLine(number);
&lt;/pre&gt;
&lt;br /&gt;
But it fails (i.e. throws run-time exception) when you try input as below&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;int parsedNumber = int.Parse(" -1234 ");
int parsedNumber = int.Parse("(1234)");
int parsedNumber = int.Parse("$1234");
int parsedNumber = int.Parse("1,234");
int parsedNumber = int.Parse(" (1,234) ")
&lt;/pre&gt;
&lt;br /&gt;
So above all tried input throws run-time exception , but solution to is make use of overload of Parse and TryParse which comes with &lt;a href="https://msdn.microsoft.com/en-us/library/system.globalization.numberstyles(v=vs.110).aspx"&gt;NumberStyles &lt;/a&gt;as input. Below is screen shot of overload of Parse method&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKXETQefqzfvS5yzH6Zrya1WFSvtOYv3uylFKvRjS8Fvk1fEJBGeuzmQrWUXsqxZECKjNi8slrGRrniUAzWwy1OhRXOpb8euPVl6mwj0GeZGz0CxYoMEGek8cdN_X_bVNKEVbz9Q0aQl7c/s1600/int+with+number+style.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="83" data-original-width="947" height="56" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKXETQefqzfvS5yzH6Zrya1WFSvtOYv3uylFKvRjS8Fvk1fEJBGeuzmQrWUXsqxZECKjNi8slrGRrniUAzWwy1OhRXOpb8euPVl6mwj0GeZGz0CxYoMEGek8cdN_X_bVNKEVbz9Q0aQl7c/s640/int+with+number+style.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
below is code make use of overload and avoid run-time exception.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;//output: -1234
int parsedNumber = int.Parse("(1234)", NumberStyles.AllowParentheses);

// output: 1234
int parsedNumber = int.Parse("1,234", NumberStyles.AllowThousands);

// output: -1234
int parsedNumber = int.Parse(" -1234&amp;nbsp; ", NumberStyles.AllowTrailingWhite |
                                              NumberStyles.AllowLeadingWhite |
                                              NumberStyles.AllowLeadingSign);

// output: -1234
int parsedNumber = int.Parse(" (1,234) ", NumberStyles.AllowTrailingWhite |
                                          NumberStyles.AllowLeadingWhite |
                                     NumberStyles.AllowParentheses |
                                          NumberStyles.AllowThousands);

// allows currency symbol
// output: 1234
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
int parsedNumber4 = int.Parse("$1234", NumberStyles.Currency);
&lt;/pre&gt;
&lt;br /&gt;
Different number allows different input values. As given in above code one can put logic OR between&amp;nbsp; different value of NumberStyles and allows combination to permit various input format.&lt;br /&gt;
&lt;br /&gt;
Try out other values of NumberStyles listed at MSDN:&amp;nbsp;&lt;a href="https://msdn.microsoft.com/en-us/library/system.globalization.numberstyles(v=vs.110).aspx"&gt;https://msdn.microsoft.com/en-us/library/system.globalization.numberstyles(v=vs.110).aspx&lt;/a&gt; &amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
</description><link>http://pranayamr.blogspot.com/2018/07/parsing-number-with-numberstyles.html</link><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnBVPDbMQIFecRl9ItI8_kvWfuQKnu2ytJHuMIbcmlpyqEEMUbInwqaOLfmRlfdDHeXeOr0LlUMXLpA2Cd9rHRIbLMO8IQuRmuNHENTc-GJ4VQ_PSHHPZZviujFZ6dk8jkrH6nRNlfsdtn/s72-c/parse+method.png" width="72"/><thr:total>0</thr:total><author>pranayamr@gmail.com (Pranay Rana)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1194836729866470946.post-3628355208359061741</guid><pubDate>Sat, 30 Jun 2018 11:23:00 +0000</pubDate><atom:updated>2018-06-30T07:48:57.540-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Angular</category><category domain="http://www.blogger.com/atom/ns#">for loop</category><category domain="http://www.blogger.com/atom/ns#">JAVASCRIPT</category><category domain="http://www.blogger.com/atom/ns#">Typescript</category><title>Different Kind of for loop construct in JavaScript/TypeScript</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
For Loop is very basic type of loop exist in all programming language. For loops allows to go over each items in iterable objects and allows to access each item of iterable objects. Each programming language provide different type of for loop to achieve purpose of iterating over iterable object and access each element to perform operation.&lt;br /&gt;
&lt;br /&gt;
All programming language provide&lt;i&gt; for loop (for(int i=0; i&amp;lt; array.length; i++))&lt;/i&gt; i.e. indexed based and &lt;i&gt;ForEach ( foreach(var ele in array)) &lt;/i&gt;i.e. element base.&lt;br /&gt;
&lt;br /&gt;
But JavaScript/ TypeScript provides different type of for loops apart from basic once. Below are 4 different kind of JavaScript/ TypeScript&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;1. for 
&lt;/b&gt;&lt;br /&gt;
One of the most used and basic for loop to allows iterate block of code for predefined number.
&lt;br /&gt;
&lt;br /&gt;
&lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for"&gt;Syntax&lt;/a&gt;&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;for (statement 1; statement 2; statement 3) {
    code block to be executed
}
&lt;/pre&gt;
&lt;br /&gt;
Example code :&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;const array = [1,10,6,45,32];
for(let i=0;i&amp;lt; array.length;i++) {
 console.log(array[i]);
}
&lt;/pre&gt;
&lt;br /&gt;
Above code shows one example how to use it, code prints each array item by rotating from 0 up  to array length. Above example made using array of numbers but in real application one can create for loop just by setting numbers and execute block of code repeatedly for predefined numbers. So this loop is not restricted for iterables only.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;2. for..of&lt;/b&gt;&lt;br /&gt;
allows to go over each item in iterable (Ex. like array, string, Map, Set, etc.)&lt;br /&gt;
&lt;br /&gt;
&lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...of"&gt;Syntax&lt;/a&gt;&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;for (variable of iterable) {
  statement
}
&lt;/pre&gt;
&lt;br /&gt;
Example code :&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;const array = [1,10,6,45,32];
for (const element of array) {
 console.log(element);
}
&lt;/pre&gt;
&lt;br /&gt;
Above code does same thing as for loop code discussed above, go though each element of array and print.&lt;br /&gt;
But difference is for...of loop works only on the iterable objects and for each element of iterable, where as in basic for loop one externally need to set predefined number like from and to to execute block of code. So it helpful when want to execute on each element or by using each element of iterable.&lt;br /&gt;
&lt;br /&gt;
Angular framework also have structural directive calle &lt;a href="https://angular.io/api/common/NgForOf"&gt;*ngFor&lt;/a&gt;&amp;nbsp;for displaying data. Read more :&amp;nbsp;&lt;a href="http://pranayamr.blogspot.com/2017/12/dynamic-html-structure-with-ngif-ngfor.html"&gt;Dynamic Html Structure with - *ngIf, *ngFor &amp;amp; ngSwitch&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;3. For In&lt;/b&gt;&lt;br /&gt;
allows to iterate over each property of object. This loop is different then other loops as it allows to go though object properties.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in"&gt;Syntax&lt;/a&gt;&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;for (variable in object) {
}
&lt;/pre&gt;
&lt;br /&gt;
Example code:
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;const obj = { a : 1, b: 'Xyz', c:'123'};
for(let prop in obj) {
 console.log(prop +' : '+  obj[prop]);
}
&lt;/pre&gt;
&lt;br /&gt;
code above prints each object property and value of it. Below is use cases when &lt;i&gt;for..in&lt;/i&gt; very helpful.&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;Loop is useful when object structure is unknown (When object received as response from external api http call) and there is need of go through each property of object and display it.&lt;/li&gt;
&lt;li&gt;It also useful when there is indexed (interface, class) object in type script and there is need of go through each indexed item without knowing key.&lt;br /&gt;&lt;b&gt;
Example&lt;/b&gt;:
&lt;pre class="brush: csharp"&gt;interface Product {
    [key: number]: string;
}

let products : Product = { };
products[10]='xyz';
products[20]='abc';

for(let key in products) {
 console.log(key + ' : ' + products[key]);
} &lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;b&gt;4.&amp;nbsp; forEach(ele=&amp;gt; {} );&lt;/b&gt;&lt;br /&gt;
allows to iterate over each item in array and&amp;nbsp; execute function for each element in iterable.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach"&gt;Syntax&lt;/a&gt;&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;arr.forEach(function callback(currentValue[, index[, array]]) {
    //your iterator
}[, thisArg]);
&lt;/pre&gt;
&lt;br /&gt;
Example code:
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;const array = [1,10,6,45,32];
array.forEach((element,index)=&amp;gt; {
 console.log(index +' ' +element);
});
&lt;/pre&gt;
&lt;br /&gt;
Above code execute function for each element of array and prints element value &amp;amp; index of element in array.&lt;br /&gt;
Different from basic &lt;i&gt;for &lt;/i&gt;is,&amp;nbsp; execute function for each element without knowing size of iterable &amp;amp; improves redability and difference from and&amp;nbsp;&lt;i&gt;for..of&lt;/i&gt;&amp;nbsp; is also allows to get index of each element which is not possible in &lt;i&gt;for..of.&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;
&lt;b&gt;Wrapping up&lt;/b&gt;&lt;br /&gt;
Javascript/typescript provides 4 different which can be useful in different way based on simplicity &amp;amp; redablity of code , performance of loop and sometimes based on situation like &lt;i&gt;for..in &lt;/i&gt;used for go through each property of object or each index of indexed class/interface..&amp;nbsp;&lt;/div&gt;
</description><link>http://pranayamr.blogspot.com/2018/06/different-kind-of-for-loop-construct-in.html</link><thr:total>0</thr:total><author>pranayamr@gmail.com (Pranay Rana)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1194836729866470946.post-7963930096270180047</guid><pubDate>Tue, 12 Jun 2018 18:34:00 +0000</pubDate><atom:updated>2018-06-12T14:36:07.143-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Ajax</category><category domain="http://www.blogger.com/atom/ns#">Angular</category><category domain="http://www.blogger.com/atom/ns#">Angular 2</category><category domain="http://www.blogger.com/atom/ns#">RxJs</category><category domain="http://www.blogger.com/atom/ns#">Typescript</category><title>Way to handle Parallel Multiple Requests </title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
In web application Multiple requests means when there is need of making more then one Http requests to get result response and display to end user on web page. Multiple requests can be&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;Dependent Request&lt;br /&gt;
Http Request is dependent request when it waits for result which needs to be given by other Http request i.e. parent request. Read more about how to perform Dependent request in angular here : &lt;a href="http://pranayamr.blogspot.com/2018/04/angular-dependent-request.html"&gt;Angular Dependent Request &lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Parallel Request&lt;/li&gt;
When client code fire more then one Http request on server and that all fired request get executed on server simultaneously.  
&lt;/ul&gt;
Parallel Http requests are required when application need to make simultaneously to get data and display result to end user. For Example - In online shopping application, on order history page when use clicks on old Order to get detail , details page should display order details with all products detail which is associated with order.&lt;br /&gt;
Mostly in application database when order get saved its will save order details with associated product ids not full product. so to achieve this requirement once order data available with product ids, client code need to get fire multiple requests basically for each product id to get detail of product associated with order.&lt;br /&gt;
&lt;br /&gt;
Below picture shows how parallel request get executed by approach going to discuss below.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9T8AKal2uayfdAit7DsTdUBghIzmiAqywSJENuiDWpOY90RrOVLIzhkCEu7Xb5jEtKcbCeyZTGzVDB5AUG-_lj45iu0OdOpVoY8OjvkmiTaTWGvSpBYDfPsddfRLSRLniw3v3Qdj-xFKR/s1600/parellel+request.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="256" data-original-width="1188" height="85" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9T8AKal2uayfdAit7DsTdUBghIzmiAqywSJENuiDWpOY90RrOVLIzhkCEu7Xb5jEtKcbCeyZTGzVDB5AUG-_lj45iu0OdOpVoY8OjvkmiTaTWGvSpBYDfPsddfRLSRLniw3v3Qdj-xFKR/s400/parellel+request.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Below are the way client code make parallel Http request and handle response of the requests to display final result with help of RxJs functions.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;1. MergeMap&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
RxJs function &lt;i&gt;mergeMap &lt;/i&gt;allows to fire out multiple request and handle response of each request to produce result. Function flatten inner observable(s) and allow to control each observable. Read more : &lt;a href="http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-mergeMap"&gt;MergeMap&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;    import { mergeMap, catchError } from 'rxjs/operators'; 
    megeMapTest() {
    const prouctIds: number[] = [1, 2, 3];
    const requests = from(prouctIds)
      .pipe(
      mergeMap(id =&amp;gt; this.productService.getProduct(id))
      );

    requests.subscribe(
      data =&amp;gt; console.log(data), //process item or push it to array 
      err =&amp;gt; console.log(err));
 } 
&lt;/pre&gt;
&lt;br /&gt;
In above code, important thing to note out is &lt;i&gt;mergeMap&lt;/i&gt;, it merges all parallel requests fired to get product in one observable stream (array of observable) and then allows that request to handle individually.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Advantage&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;a. &lt;/b&gt;One of the advantage with &lt;i&gt;mergemap&lt;/i&gt; is, it create single stream of observable and allows to process response of each request individually.&lt;br /&gt;
So if there is any request fails i.e. throws server side error, then it doesn't affect other parallel requests. Failed request(s) call &lt;i&gt;error&lt;/i&gt;&amp;nbsp;function in above code and succeeded request calls success function. (Which is advantage over second approach i.e.&amp;nbsp;&lt;i&gt;forkJoin&amp;nbsp;&lt;/i&gt;function discussed below)&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;b.&lt;/b&gt; &lt;i&gt;mergmap &lt;/i&gt;function start processing request as it get response i.e. in case of multiple parallel request it process request which completes first ,doen't wait for other request to get completed. (Which is advantage over second approach i.e. &lt;i&gt;forkJoin &lt;/i&gt;function discussed below)&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Disadvantage&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;a. &lt;/b&gt;It doesn't preserve sequence (i.e. order in which it fire) of requests, means if there are 10 request fired parallelly then which request complete first will display result first.&lt;br /&gt;
&lt;br /&gt;
Solution to this is&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;    import { mergeMap, catchError } from 'rxjs/operators'; 
    list: Product[] = [];
    megeMapTest() {
    const prouctIds: number[] = [1, 2, 3];
    const requests = from(prouctIds)
      .pipe(
      mergeMap(id =&amp;gt; this.productService.getProduct(id))
      );

      requests.subscribe(
      data =&amp;gt; {
        this.list.push(data);

        this.list.sort((a: Product, b: Product) =&amp;gt; {
          const aIndex = prouctIds.findIndex(id =&amp;gt; id === a.Id);
          const bIndex = prouctIds.findIndex(id =&amp;gt; id === b.Id);
          return aIndex - bIndex;
        });
      }, //process item or push it to array 
      err =&amp;gt; console.log(err));
 } 
&lt;/pre&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
above solution code sort order of received response using index of array.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;b.&lt;/b&gt;&lt;i&gt;&lt;b&gt; &lt;/b&gt;megeMap&lt;/i&gt;&amp;nbsp;only merge request of same return type only. To understand this have look to above code again, all request is going to return observable of Product type which is going to be return by &lt;i&gt;getProduct &lt;/i&gt;method of productservice.&lt;br /&gt;
&lt;br /&gt;
Making use of &lt;i&gt;forkJoin&lt;/i&gt; function can resolve this issue. Which is second approach discussed below.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;2. ForkJoin&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
RxJs function &lt;i&gt;forkJoin&lt;/i&gt;&amp;nbsp;take one or more observable as input and provide steam of observable as result, which contains value last value emitted by each&amp;nbsp; inputted observable to function. Read more : &lt;a href="http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#static-method-forkJoin"&gt;forkJoin&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;import { catchError } from 'rxjs/operators';
import { of } from 'rxjs/observable/of';
import { forkJoin } from 'rxjs/observable/forkJoin';
  forkJoinTest() {
    const prouctIds: number[] = [1, 2, 3];
    const productRequests = prouctIds.map(id =&amp;gt; this.productService.getProduct(id).pipe(
      catchError(error =&amp;gt; of(`Bad Promise: ${error.message}`))
    ));

    const requests = forkJoin(productRequests);
    requests.subscribe(
      data =&amp;gt; console.log(data) //process item or push it to array 
    );
  } 
&lt;/pre&gt;
&lt;br /&gt;
In above code, as per definition forkJoin takes observable requests as input and returns result.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Advantage&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;a. &lt;/b&gt;&lt;i&gt;forkJoin&amp;nbsp; &lt;/i&gt;reserve sequence (i.e. order in which request sent), so order in which requests inputted to &lt;i&gt;forkJoin &lt;/i&gt;in same order it gives response result.&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
&lt;b&gt;b.&lt;/b&gt;&lt;i&gt; forkJoin &lt;/i&gt;can take multiple request which returns different type observable.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;async forkJoinTest() {
    const customerRequest =this.customerService.getCustomer(1).pipe(
      catchError(error =&amp;gt; of(`Bad request: ${error.message}`))
    );    
    const orderRequest =this.orderService.getOrder(1).pipe(
      catchError(error =&amp;gt; of(`Bad request: ${error.message}`))
    ); 
    const productRequest =this.productService.getProduct(1).pipe(
      catchError(error =&amp;gt; of(`Bad request: ${error.message}`))
    );

    const requests = await forkJoin(customerRequest,orderRequest,productRequests).toPromise();
    
    console.log('Customer ' + requests[0]);
    console.log('order ' + requests[1]);
    console.log('product ' + requests[2]);
  } 
&lt;/pre&gt;
&lt;br /&gt;
In above code , forkJoin takes three requests (customer, product, order) which returns different type of observable. Also code make use of async/await advance typescript/javascript concept, which allows to wait till request completes. (Which is advantage over first approach i.e. &lt;i&gt;mergeMap&amp;nbsp;&lt;/i&gt;function discussed below)&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Disadvantage&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;a. &lt;/b&gt;&lt;i&gt;forkJoin &lt;/i&gt;waits for all inputted Http requests to get completed before calling subscribe function. So even though some request get completed it has to wait till other or lets say last request to complete. (This can be avoided with &lt;i&gt;mergeMap &lt;/i&gt;function as it process requests as it get completed).&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;b. &lt;/b&gt;if one of the inputted request to&amp;nbsp;&lt;i&gt;forkJoin &lt;/i&gt;fails , then &lt;i&gt;forkJoin &lt;/i&gt;also fails and return error even other inputted request completed successfully. To check run code as below and return error from server&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;import { catchError } from 'rxjs/operators';
import { of } from 'rxjs/observable/of';
import { forkJoin } from 'rxjs/observable/forkJoin'; 
  forkJoinTest() {
    const prouctIds: number[] = [1, 2, 3];
    const productRequests = prouctIds.map(id =&amp;gt; this.productService.getProduct(id));

    //.pipe(
    //catchError(error =&amp;gt; of(`Bad Promise: ${error.message}`))
    //));

    const requests = forkJoin(productRequests);
    requests.subscribe(
      data =&amp;gt; console.log(data), //process item or push it to array
      err =&amp;gt; console.log(err) 
    );
  } 
&lt;/pre&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
In above code &lt;i&gt;catchError &lt;/i&gt;function is commented, that means if any of request fails then &lt;i&gt;forkJoin &lt;/i&gt;also fails and return that error. (this is not case with &lt;i&gt;mergeMap&lt;/i&gt;)&lt;br /&gt;
To avoid the make use of &lt;i&gt;catchError &lt;/i&gt;function as given in above code.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Which one is better&lt;/b&gt;&lt;br /&gt;
Both of them is not good or not bad. It all depends on requirement at the end. Because there might be case when have requirement to wait for all request to complete or want to parallely executed request which return different value or do not want to produce result if one of sent requests fails then go for &lt;i&gt;forkJoin &lt;/i&gt;and there might be case when have requirement for do not wait till all request get compete or do not want to reserve order of request or want to process requests even one of the request fails then go for &lt;i&gt;mergeMap&lt;/i&gt;.&amp;nbsp;&amp;nbsp;&lt;/div&gt;
</description><link>http://pranayamr.blogspot.com/2018/06/way-to-handle-parallel-multiple-requests.html</link><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9T8AKal2uayfdAit7DsTdUBghIzmiAqywSJENuiDWpOY90RrOVLIzhkCEu7Xb5jEtKcbCeyZTGzVDB5AUG-_lj45iu0OdOpVoY8OjvkmiTaTWGvSpBYDfPsddfRLSRLniw3v3Qdj-xFKR/s72-c/parellel+request.JPG" width="72"/><thr:total>1</thr:total><author>pranayamr@gmail.com (Pranay Rana)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1194836729866470946.post-2009371472569706985</guid><pubDate>Tue, 22 May 2018 18:25:00 +0000</pubDate><atom:updated>2018-05-22T14:32:55.988-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">c#</category><category domain="http://www.blogger.com/atom/ns#">Factory Design pattern</category><category domain="http://www.blogger.com/atom/ns#">Software Design Patterns</category><category domain="http://www.blogger.com/atom/ns#">Software design Principle</category><title>Factory Design Pattern With Generics</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
Factory Method design pattern is one of the highly used design pattern, which is used in project to centralize creation of similar family object in application. It's part of creation design patterns as it helps to create objects in application.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6c8yK_LJvBPoBUpYO2MhvqNB2Ey5w-ivz6RBmp56oJ2wMfftvBoRKrX4Y0JSXozV2iSiLOlSw1T77KO8N-MyO92RpPTOI-13rkC7ZMbw_EegRlArzXGDXNV3wFLbC8oUjRWUJtTKuI9K_/s1600/factory_icon-icons.com_70151.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="512" data-original-width="512" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6c8yK_LJvBPoBUpYO2MhvqNB2Ey5w-ivz6RBmp56oJ2wMfftvBoRKrX4Y0JSXozV2iSiLOlSw1T77KO8N-MyO92RpPTOI-13rkC7ZMbw_EegRlArzXGDXNV3wFLbC8oUjRWUJtTKuI9K_/s320/factory_icon-icons.com_70151.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Why to Centralize Object creation with Facotry?&lt;br /&gt;
&lt;br /&gt;
&lt;ol style="text-align: left;"&gt;
&lt;li&gt;To avoid object creation every where in application with &lt;i&gt;New.&amp;nbsp;&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;To create object at run-time which serves purpose, based on requirement (i.e. based on input parameters).&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
&lt;b&gt;Factory Pattern Implementation&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Below is class diagram and code implementation of Factory pattern.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiC7nQZzXgspS_Cjaeu3Nq2YxQOYW7OoVCi-D09Gm6U5f4STeYl7ekKoy6YzjI-FFQ-y1ZPkBaira9Veav25gMvaTZQoFcw8KCImhpayh_Ry6RENJTfyIbbrsKYa0r6UYiSw6BRa10_7VPR/s1600/factory+image.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="475" data-original-width="1200" height="253" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiC7nQZzXgspS_Cjaeu3Nq2YxQOYW7OoVCi-D09Gm6U5f4STeYl7ekKoy6YzjI-FFQ-y1ZPkBaira9Veav25gMvaTZQoFcw8KCImhpayh_Ry6RENJTfyIbbrsKYa0r6UYiSw6BRa10_7VPR/s640/factory+image.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
Below code, centralize creation of command objects with help of Factory design pattern. Code below works as below&lt;br /&gt;
&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;Code below creates different command to perform task such as addemployee, editemployee etc.&lt;/li&gt;
&lt;li&gt;It's scalable as if developer wants to add new command let's say deleteemployee then it require to create new DeleteEmployee command which inherits from ICommand as other commands do.&lt;/li&gt;
&lt;li&gt;CommandFactory , its factory pattern base class which has method GetCommand to return requested command based on input string argument. Modification required in GetCommand method when new command need to be added in application.&lt;/li&gt;
&lt;li&gt;Program is client class which make use of CommandFactory and execute returned command.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;    class Program
    {
        static void Main(string[] args)
        {
            ICommand cmd = CommandFactory.GetCommand("AddEmployee");
            Console.WriteLine(cmd.GetType());
            Console.ReadLine();
        }
    }

    public class CommandFactory
    {
        public static ICommand GetCommand(string cmdName)
        {
            if(cmdName=="AddEmployee") 
            {
                return new AddEmployee();
            } 
     else if(cmdName=="EditEmployee") 
            {
                return new EdutEmployee();
            }

            return new NullCommand();
        }
    }

    public class NullCommand : ICommand
    {
        public bool CanExecute()
        {
             Console.WriteLine("Null command");
    return true;
        }

        public void Execute()
        {
           Console.WriteLine("Null command");
        }
    }

    public class AddEmployee : ICommand
    {
        public bool CanExecute()
        {
            //validation
   return true;
        }

        public void Execute()
        {
          //code to execute
        }
    }
 
    public class EditEmployee : ICommand
    {
        public bool CanExecute()
        {
            //validation
             return true;
        }

        public void Execute()
        {
          //code to execute
        }
    }

    public interface ICommand
    {
        bool CanExecute();
        void Execute();
    } 
&lt;/pre&gt;
&lt;br /&gt;
Following are issues with above code&lt;br /&gt;
&lt;ol style="text-align: left;"&gt;
&lt;li&gt;One big issue with above code is , it's violate Open Close principle. Because whenever new command added in application, developer need to go to Command Factory and need to add &lt;i&gt;if &lt;/i&gt;condition for creating it.&lt;br /&gt;
For Example: when there is need of adding Delete command , developer need to open CommandFactory class and need to add if clause for that. 
&lt;/li&gt;
&lt;li&gt;CommandFactory, GetCommand takes string argument to create and return instance of command. If developer pass wrong string argument value it will end up with &lt;i&gt;NullCommand&lt;/i&gt; object (which is based on Null object pattern).&lt;br /&gt;
So its not type safe implementation.&lt;/li&gt;
&lt;li&gt;CommandFactory, GetCommand can only return &lt;i&gt;ICommand. &lt;/i&gt;If developer added new property/method let's say &lt;i&gt;xyz &lt;/i&gt;which is specific to command ex. AddEmployee, then developer cannot access it like &lt;i&gt;addCommandObj.xyz &lt;/i&gt;as return Command is of type ICommand and it doesnt has that property.&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
&lt;b&gt;Generics Based Factory Pattern Implementation&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Solution to problem listed above is make use of factory pattern using Generics. Below is diagram and code of implementation&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpB1VExxjOtj_tXfBWKWEw-tYe0C7zBFO1-gnFnEKnJ33f-ByNjNtzRk5lFz2r0-ohVqCnRwsNUI9wGuzLI4gR18bnTgHRymSdtQi6TEMwi9KMw0uT58Zebzfgfxcp-gnM8QuLLnFXwmqz/s1600/factory+image+1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="461" data-original-width="1014" height="289" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpB1VExxjOtj_tXfBWKWEw-tYe0C7zBFO1-gnFnEKnJ33f-ByNjNtzRk5lFz2r0-ohVqCnRwsNUI9wGuzLI4gR18bnTgHRymSdtQi6TEMwi9KMw0uT58Zebzfgfxcp-gnM8QuLLnFXwmqz/s640/factory+image+1.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;    class Program
    {
        static void Main(string[] args)
        {
            ICommand cmd = CommandFactory.GetCommand&amp;lt;AddEmployee&amp;gt;();
            Console.WriteLine(cmd.GetType());
            AddEmployee addEmployeeCmd = CommandFactory.GetCommand&amp;lt;AddEmployee&amp;gt;();
            Console.WriteLine(addEmployeeCmd.NewEmployeeId);
            Console.ReadLine();
        }
    }

    public class CommandFactory
    {       
        //only create object of type which implement ICommand
        public static T GetCommand&amp;lt;T&amp;gt;() where T:  ICommand
        {
          //it create object using Template type T and by making use of reflection
          //once create factory this way there is no need to open it again for modification
            Type type = typeof(T);
            Object obj = Activator.CreateInstance(type);
            return (T)obj;
        }
    }

    public class EditCommand : ICommand
    {
        public bool CanExecute()
        {
            //validation
            return true;
        }

        public void Execute()
        {
            //code to execute 
        }
    }

    public class AddEmployee : ICommand
    {
        private int newEmployeeId;
        public int NewEmployeeId
        {
            get { return newEmployeeId; }
        }

        public bool CanExecute()
        {
            return true;
        }

        public void Execute()
        {
            //execute code to create employee
            this.newEmployeeId = 1;//created employeeid 
        }
    }

    public interface ICommand
    {
        bool CanExecute();
        void Execute();
    } 
&lt;/pre&gt;
&lt;br /&gt;
Following are advantages (solutions for previous approach problem) of generics based implementation&lt;br /&gt;
&lt;br /&gt;
&lt;ol style="text-align: left;"&gt;
&lt;li&gt;It doesn't violate open close principle as object get created using reflection and using Generics Template type T in &lt;i&gt;CommandFacoty &lt;/i&gt;class - &lt;i&gt;GetCommand &lt;/i&gt;method. Check CommandFacotry Class in above code.&lt;/li&gt;
&lt;li&gt;By making use of Generics, it makes &lt;i&gt;CommandFactory &lt;/i&gt;strongly type and there is no need string as argument based on which GetCommand method creating object in previous implementation.&lt;br /&gt; 
 &lt;pre class="brush: csharp"&gt; public static T GetCommand&amp;lt;T&amp;gt;() where T:  ICommand &lt;/pre&gt;
if you see signature of &lt;i&gt;GetCommand &lt;/i&gt;now,&amp;nbsp; it force Template type T must implement &lt;i&gt;ICommand &lt;/i&gt;interface and so that it only going to create object of types which implement &lt;i&gt;ICommand&lt;/i&gt;.&lt;/li&gt;
&lt;li&gt;Now factory can return object of specific implemented type like &lt;i&gt;AddEmployee&lt;/i&gt;
&lt;pre class="brush: csharp"&gt;  AddEmployee addEmployeeCmd = CommandFactory.GetCommand&amp;lt;AddEmployee&amp;gt;();
&lt;/pre&gt;
Above line of code in &lt;i&gt;Program &lt;/i&gt;class &lt;i&gt;Main &lt;/i&gt;method proves point that now factory can return implemented type that can also be convert to to parent type &lt;i&gt;ICommand.&lt;/i&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;b&gt;Wrapping up&lt;/b&gt;&lt;br /&gt;
Factory pattern is one of the highly used deign pattern which used in most of the application to create and centralize object creation. So when it written not strongly type based way can lead to problem. So it's better to implement it strongly type based way (Generics implementation) to avoid issues and it helps to stick your code with &lt;a href="http://pranayamr.blogspot.in/2015/07/solid-principle-in-detail.html"&gt;SOLID &lt;/a&gt;principle.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
</description><link>http://pranayamr.blogspot.com/2018/05/factory-design-pattern-with-generics.html</link><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6c8yK_LJvBPoBUpYO2MhvqNB2Ey5w-ivz6RBmp56oJ2wMfftvBoRKrX4Y0JSXozV2iSiLOlSw1T77KO8N-MyO92RpPTOI-13rkC7ZMbw_EegRlArzXGDXNV3wFLbC8oUjRWUJtTKuI9K_/s72-c/factory_icon-icons.com_70151.png" width="72"/><thr:total>0</thr:total><author>pranayamr@gmail.com (Pranay Rana)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1194836729866470946.post-7629444636776764189</guid><pubDate>Sun, 13 May 2018 09:32:00 +0000</pubDate><atom:updated>2018-06-14T13:59:19.900-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Angular</category><category domain="http://www.blogger.com/atom/ns#">Application Structure</category><title>Angular Application Structure </title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
Setting up application structure of application is one of the most important part of application development. Because well structured application allows to scale/grow application with less efforts, saves lot of effort in maintenance of application, allows to locate files and resources easily.&lt;br /&gt;
&lt;br /&gt;
No framework forces to follow how to structure application (how to arrange files in different parts of application) , same goes for Angular 2 framework. It doesn't force developer to structure application, like how to arrange components, directives, pipes, services etc. created by developer. But angular team propose guideline one must follow for structuring application in style guide here : &lt;a href="https://angular.io/guide/styleguide"&gt;StyleGuide&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Application Structure&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Below diagram is visual presentation of structure of Angular application, which is as per the guide lines from angular team.&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtlXI3RLvdfvgnYG21Hv58N1Gjjr3djPyqYSpVgKgZJYsF2RWnya6wdU6ZWLnRADRLP5DXHz-vG10WzltjEWxxJRPqj0ZtgvLqcvmn7W0kCdzdA6QhRlyvum2qtZUTAjqguHruI3Gdt6lh/s1600/Angular+app+structure.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="1170" data-original-width="1370" height="546" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtlXI3RLvdfvgnYG21Hv58N1Gjjr3djPyqYSpVgKgZJYsF2RWnya6wdU6ZWLnRADRLP5DXHz-vG10WzltjEWxxJRPqj0ZtgvLqcvmn7W0kCdzdA6QhRlyvum2qtZUTAjqguHruI3Gdt6lh/s640/Angular+app+structure.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
&lt;b&gt;Application Module&lt;/b&gt; - It's Start point of angular application. This is first module get called when application get loaded. This module automatically get created when application created with the help of Angular-cli.&lt;br /&gt;
Point to note , all feature modules and core module is going to register themselves in this module.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Core Module &lt;/b&gt;- In angular application, It's module going to have application level&amp;nbsp;singleton services (Ex. HttpInterceptor used for intercepting http request, LoggerService,&amp;nbsp; LoggedInUserService) or application level component (Ex. Navigation Bar).&lt;br /&gt;
&lt;br /&gt;
Core Module have all singleton services,&amp;nbsp; so only the root&amp;nbsp;&lt;code&gt;AppModule&lt;/code&gt;&amp;nbsp; (Application Module) should import the&amp;nbsp;&lt;code&gt;CoreModule&lt;/code&gt;&amp;nbsp;to make same instance of service in all modules of application. If a lazy-loaded module imports it too, lazy module will create its own instance of core module services and use that newly created instance of services instead of application level singleton services.&amp;nbsp; To avoid that problem make use of forRoot method and guard clause, code for that given below. &lt;a href="https://angular.io/guide/singleton-services"&gt;https://angular.io/guide/singleton-services&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;@NgModule({
  imports: [CommonModule]
  declarations: [XyzComponent],//needed if there component
  exports: [XyzComponent]//needed if want to export component
})
export class CoreModule {

  constructor (@Optional() @SkipSelf() parentModule: CoreModule) {
    if (parentModule) {
      throw new Error(
        'CoreModule is already loaded. Import it in the AppModule only');
    }
  }
 
  static forRoot(): ModuleWithProviders {
    return {
      ngModule: CoreModule,
      providers: [
        LoggerService ,UserService
      ]
    };
  }
}
&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;Shared Module&lt;/b&gt; - In angular application, It's module going to have all dump angular Pipes, Directives , Components, Function&amp;nbsp; etc. i.e. all who are dumb and receive input from, component which uses it.&amp;nbsp; Ex. Extended Form Validation Component (&lt;a href="http://pranayamr.blogspot.com/2018/03/custom-validation-component.html"&gt;Check Here&lt;/a&gt;), Confirmation Model Popup, Formatting Pipes,&amp;nbsp; Validation &amp;amp;&amp;nbsp; Common functions used through out application, Directive used by controls etc its like utilities used in application .&lt;br /&gt;
Point to note, It should not going to have angular services.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Feature Modules&lt;/b&gt; - In angular application, Feature modules are going to have have features which is going to be provided by application.&amp;nbsp; &amp;nbsp;(Ex. CustomerModule, OrdersModule, ProductsModule, ShippingModule).&lt;br /&gt;
This features modules also going to have shared features modules in which is going to be shared between this features module only. For Example. ProductDataService module which is going to be shared between ProductModule and OrderModule.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Module Dependency ( Flow of Services )&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Below diagram shows dependency between modules (i.e. it shows the flow of services) discussed above.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivRcTUQ5NEjHCOMaav8iJQUdUP86apjhazrVY9ZhfKkVitGePWd3IHJ14gEMg0mNjyMR5qmSGcBC6CiSJVfDt-R7JFBBJVJxOzwuxQgCbWAryaA_Vw4WKqU4xkxS6vTnchbWuEZ0EtMpoO/s1600/depdancy.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="1600" data-original-width="1198" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivRcTUQ5NEjHCOMaav8iJQUdUP86apjhazrVY9ZhfKkVitGePWd3IHJ14gEMg0mNjyMR5qmSGcBC6CiSJVfDt-R7JFBBJVJxOzwuxQgCbWAryaA_Vw4WKqU4xkxS6vTnchbWuEZ0EtMpoO/s640/depdancy.jpg" width="478" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Hows modules dependent or Service flow&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Feature Modules &lt;/b&gt;- these modules are going to consume singleton services form Core Module (Via application module in which it registered) and shared dumb pipes, component, directives, functions from shared module.&lt;br /&gt;
Which means Feature modules depends on Core Module and Shared module i.e. service flow from core &amp;amp; shared modules to feature modules.&lt;br /&gt;
Important point to note here is, Service flows from top towards bottom, not from bottom to top. This means top level Core module, Application module and shared module must not consume service from feature modules.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Core Module &lt;/b&gt;- this module going to consume service from shared module if needed. Mostly it's doesn't need service from shared module but sometime need to access common function or formatting pipes for its component , that's why diagram has dotted line.&lt;br /&gt;
So service flows from shared module to core module if needed, otherwise this is independent module which provides application level singleton services and component.&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Application Module &lt;/b&gt;- this module is simple module just going to to have one component&amp;nbsp; to provide start point of application. It's going to consume services from Core Module and if needed consume services from shared module.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Shared Module&amp;nbsp;&lt;/b&gt;- It's utility module. This module have all the dumb angular components, pipes , directives&amp;nbsp; and utility functions. So this module provides its services to all the modules (Application Module, Core Module, Feature Modules) in applications.&lt;br /&gt;
But its not going to consume service from other modules.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Conclusion&lt;/b&gt;&lt;br /&gt;
Angular framework doesn't force developer to follow discussed structure for developing application. But it's must need when application going to grow &amp;amp; developer wants to scale it up, and also helps in identifying different part of application in turns helps in maintaining application.&lt;br /&gt;
&lt;br /&gt;
Putting component, service, pipe, directives in proper folder structure its not end of story. To make property structure developer must need to setup dependency properly between module i.e. flow of service as discussed.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Note&lt;/b&gt;&lt;br /&gt;
Above article is based on my reading on angular.io portal and structure applied in my application. Please comment if something wrong.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
</description><link>http://pranayamr.blogspot.com/2018/05/angular-application-structure.html</link><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtlXI3RLvdfvgnYG21Hv58N1Gjjr3djPyqYSpVgKgZJYsF2RWnya6wdU6ZWLnRADRLP5DXHz-vG10WzltjEWxxJRPqj0ZtgvLqcvmn7W0kCdzdA6QhRlyvum2qtZUTAjqguHruI3Gdt6lh/s72-c/Angular+app+structure.jpg" width="72"/><thr:total>2</thr:total><author>pranayamr@gmail.com (Pranay Rana)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1194836729866470946.post-1577868932839443654</guid><pubDate>Sun, 22 Apr 2018 13:30:00 +0000</pubDate><atom:updated>2018-04-22T10:30:54.131-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Angular</category><category domain="http://www.blogger.com/atom/ns#">RxJs</category><category domain="http://www.blogger.com/atom/ns#">Typescript</category><title>Angular Dependent Request</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
In software application, screen(s) where to display data application needs to make dependent request i.e. First have to make Request A (to server or database), based on result of A request data have to make Request B.&lt;br /&gt;
&lt;br /&gt;
Example : In shopping application, on product screen , when user select product it will display product details and based on product make region it also display in which region it available or which region it's available.&lt;br /&gt;
&lt;br /&gt;
So achieve in application there is need of dependent request , which works this way&lt;br /&gt;
&lt;br /&gt;
&lt;ol style="text-align: left;"&gt;
&lt;li&gt;&amp;nbsp;It request (server/database) to get full product detail&lt;/li&gt;
&lt;li&gt;Based on product region , it makes request (server/database) to get available regions&amp;nbsp;&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
In code most of the developer write below code&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;this.productService.getProduct(1)
 .subscribe(data =&amp;gt; {
          this.product = data;
          this.productService.getAvailableRegion(data.regionId)
                   .subscribe(region =&amp;gt; this.avilableRegion = region);
}); 
&lt;/pre&gt;
&lt;br /&gt;
code above does the task. But its complex (in terms of readability)&amp;nbsp; and not easy to understand when there is more depedent request are there&amp;nbsp; (if there are more dependent request like Request C , depends on Request B and which depends on Request A) as it goes deep and deep for each request.&lt;br /&gt;
&lt;br /&gt;
Below are some way to avoid complexity and easy to understand code.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;RxJs Way&lt;/b&gt;&lt;br /&gt;
Above example just make use of one RxJs function which &lt;i&gt;subscribe&lt;/i&gt;, and does thing in that function only. For second request (dependent request) it does same thing which makes code complex. But RxJS provides number of functions apart of &lt;i&gt;subscribe&lt;/i&gt;&amp;nbsp; which make things simple. Below is code how to reduce complexity of above code by making use of other function provided by Rxjs.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;this.productService.getProduct(id)
  .pipe(
       map(data =&amp;gt; this.product = data),
       switchMap (cust =&amp;gt; this.productService.getAvailableRegion(this.product.regionId) )
   ).subscribe(region =&amp;gt; this.avilableRegion = region); 
&lt;/pre&gt;
&lt;br /&gt;
this does the same task as above code, but better way. Following functions to not down which makes code easy&lt;br /&gt;
&lt;ol style="text-align: left;"&gt;
&lt;li&gt;pipe - its RxJs function which allows number of RxJS function as input and combine them to perform operations one by one on observable received from previous function.&amp;nbsp;
&lt;br /&gt;In above code it combines map and switchMap RxJs operator.&lt;/li&gt;
&lt;li&gt;map - it used to map returned observable value to other value. In this case it maps returned response to product.&lt;/li&gt;
&lt;li&gt;switchMap - it used for switching from one observable to other observable, in this example it switch from product to list of regions.&lt;/li&gt;
&lt;li&gt;Finally subscribe - this allows to subscribe to response observable stream of provided from pipe function after operation done in it.&lt;/li&gt;
&lt;/ol&gt;
&lt;b&gt;Advance Typescript (async/await on Promise) 
&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Another way to achieve same is make use of advance typescript concept , which making use of async/await. Below is code for the same&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;async getDetails(id) {
   this.product = await this.productService.getProduct(id).toPromise();
   this.avilableRegion = await this.productService.getAvailableRegion(this.product.Id).toPromise();
} 
&lt;/pre&gt;
&lt;br /&gt;
Points to note with this approach is:&lt;br /&gt;
&lt;br /&gt;
&lt;ol style="text-align: left;"&gt;
&lt;li&gt;async/await is used with Promise object only.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;In code, promise object got created from returned&amp;nbsp;observable by making use of &lt;i&gt;toPromise &lt;/i&gt;method.&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
when method getDetails called from anywhere in code, executing stops when &lt;i&gt;await &lt;/i&gt;keyword got encountered, and it waits till getProduct server request returns. Execution get resumed once server returned response which in this case return product. Then it stops execution again on encounter of await, which used to wait till availableResion request retuns.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;At the End&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
So there are two approach&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;RxJs and&amp;nbsp;&lt;/li&gt;
&lt;li&gt;TypeScript&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
none of them is better then another one , it all on developer preference. But both the way it makes code simple and easy to understand. It also help developer in maintaining code for long time as not much complexity involved.&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
</description><link>http://pranayamr.blogspot.com/2018/04/angular-dependent-request.html</link><thr:total>2</thr:total><author>pranayamr@gmail.com (Pranay Rana)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1194836729866470946.post-6359996538423455787</guid><pubDate>Sat, 31 Mar 2018 06:23:00 +0000</pubDate><atom:updated>2018-05-14T05:36:10.643-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Angular</category><category domain="http://www.blogger.com/atom/ns#">Typescript</category><category domain="http://www.blogger.com/atom/ns#">Validation</category><title>Angular Custom Validation Component</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
Full Source at GitHub : &lt;a href="https://github.com/pranayrana/AdvCustomValidationComponent"&gt;AdvCustomValidationComponent&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;
Validation is very important feature of application which allows  to data entry (allows to enter data in application) as invalid data can leave application in inconsistent state, invalid date entry crash application and if data is not validated it can allows injection attacks on application. In Web application validation can be done at server side (i.e. on server like IIS, apache in language C#, PHP etc.) and at client side (i.e in browser windows using javascript). &lt;br /&gt;
&lt;br /&gt;
Here, following post is about validation in Angular 2 application , which means its about validation on client side not about server side. Angular framework allows to do validation following two way
&lt;br /&gt;
&lt;ol style="text-align: left;"&gt;
&lt;li&gt;Template Driven Form&lt;/li&gt;
&lt;li&gt;Reactive Form&lt;/li&gt;
&lt;/ol&gt;
One of this approach or mix of both approach can be used in application for validation. Not going to discuss about it as it provided in detail over here : &lt;a href="https://angular.io/guide/form-validation"&gt;Forms &amp;amp; Validation&lt;/a&gt;. But following post is going to discuss about custom component, which works with both the validation approach provide by angular 2 framework and encapsulate validation code in it.
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Custom Validation Component&lt;/b&gt;
&lt;br /&gt;
Let's first create validation component and make use of it in application. For fresh start of application follow this post : &lt;a href="http://pranayamr.blogspot.com/2018/03/webapi-with-angular-2-httpclient.html"&gt;My first Angular 2 app - tutorial&lt;/a&gt;. After creating application create shared module in application by running below command in  integrated terminal of visual studio code.&lt;br /&gt;
&lt;pre&gt; ng g module shared.&lt;/pre&gt;
&lt;br /&gt;
Shared module is where custom validation component will resides , as custom validation component is dumb and its going to be used by multiple features in application. Run command on integrated terminal create &lt;br /&gt;
&lt;pre&gt; ng g component shared/custom-input &lt;/pre&gt;
custom validation component. 
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;custom-input.component.html&lt;/b&gt;&lt;br /&gt;
&lt;pre class="brush: csharp"&gt; &amp;lt;div class="form-group" &amp;gt;
  &amp;lt;label class="control-label"&amp;gt;{{label}}&amp;lt;/label&amp;gt;
  &amp;lt;br /&amp;gt;
  &amp;lt;div [ngClass]="{'has-error':isError}" &amp;gt;&lt;/pre&gt;
&lt;pre class="brush: csharp"&gt;    &amp;lt;ng-content&amp;gt;&amp;lt;/ng-content&amp;gt;
    &amp;lt;ng-container *ngIf='isError'&amp;gt;
      &amp;lt;span class="text-danger" *ngFor="let msg of errorMessages"&amp;gt; {{msg}}&amp;lt;/span&amp;gt;
    &amp;lt;/ng-container&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt; 
&lt;/pre&gt;
&lt;br /&gt;
Above is modification done in component html, some of the points to note in html are&lt;br /&gt;
&lt;ol style="text-align: left;"&gt;
&lt;li&gt;&lt;i&gt;ng-content&lt;/i&gt; - which is very important tag in this html and important for validation component. This Angular 2 Framework tag allows to push any content in html when component loaded. For example: &lt;br /&gt;
&lt;pre class="brush: csharp"&gt;&amp;lt;custom-input&amp;gt;
  &amp;lt;input inputRef class="form-control" type="text" /&amp;gt;
&amp;lt;/custom-input&amp;gt; &lt;/pre&gt;
when above code written in component it will become like this, 
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmtgq_e5r3BwHcx7SkaXeXFCMRlo_3m1i9RNbwJfrqL7UeB9SstPzDYAQyJ6wTWsjActLdGRtyq2IbsC5trscVJLQFDjfiY0g8iNZWyjn6j7XMUAvH5h4Xg914i7R9KSEAU23gKLyEYLNe/s1600/ng+content.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="155" data-original-width="466" height="106" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmtgq_e5r3BwHcx7SkaXeXFCMRlo_3m1i9RNbwJfrqL7UeB9SstPzDYAQyJ6wTWsjActLdGRtyq2IbsC5trscVJLQFDjfiY0g8iNZWyjn6j7XMUAvH5h4Xg914i7R9KSEAU23gKLyEYLNe/s320/ng+content.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;

so input element put inside in &lt;i&gt;ng-conent&lt;/i&gt; when component loaded in html page. 
&lt;/li&gt;
&lt;li&gt;&lt;i&gt;inputRef &lt;/i&gt;its directive associated with input element, that intrun allows to access input element in comoponent typescript (more discussed below).&amp;nbsp;&lt;/li&gt;
&lt;li&gt;When custom component render in browser it look as below:&lt;br /&gt;

&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxJM8Pma_5ihfRADgyMECLAFommXI6pcoNPRD2tfnkPm3Zaq7gRABc5lsWP_D8pHcDipeQBhDwUj-P_3dIUToG3PzCWi3UNyoNu4fduP8JRD93HPHmbJSDnI7ONnHd8HZKjwx01rpZ1WiZ/s1600/validation.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="96" data-original-width="350" height="110" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxJM8Pma_5ihfRADgyMECLAFommXI6pcoNPRD2tfnkPm3Zaq7gRABc5lsWP_D8pHcDipeQBhDwUj-P_3dIUToG3PzCWi3UNyoNu4fduP8JRD93HPHmbJSDnI7ONnHd8HZKjwx01rpZ1WiZ/s400/validation.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;So, html tags in component will create structure above as shown in below image&amp;nbsp; &lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIxJ6sS7eQ7F6ihGBfJjtSwCDHkMlR4FmlvajRr_5dIzNTF4ayMFvOVF9PISLztzOP5CZWHxVwHMHVO8IxBDK40zIOzOTWq2UWaAcZ_iVFpFyJmpUvmiEg5z0rELgAuk4uGkLPowuWy3SC/s1600/final+ouput.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="291" data-original-width="693" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIxJ6sS7eQ7F6ihGBfJjtSwCDHkMlR4FmlvajRr_5dIzNTF4ayMFvOVF9PISLztzOP5CZWHxVwHMHVO8IxBDK40zIOzOTWq2UWaAcZ_iVFpFyJmpUvmiEg5z0rELgAuk4uGkLPowuWy3SC/s1600/final+ouput.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;br /&gt;
image above explain all the tags which made up component template. Just to note few points 
&lt;ol&gt;
&lt;li&gt;
   Border around the text box controls comes when text box becomes invalid. Border to textbox get applied by '&lt;i&gt;has-error&lt;/i&gt;' class , which get applied &lt;i&gt;isError&lt;/i&gt; becomes true (in which case it becomes true described by code in typescript file below),
&lt;/li&gt;
&lt;li&gt;
 "First Name Required"- this message comes when there is error i.e. in this image it error related to &lt;i&gt;required &lt;/i&gt; validation. This passed as input to component described below&lt;/li&gt;
&lt;li&gt;label,(First Name) - will come from typescript associated with component template. This passed as input to component described below.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;b&gt;custom-input.component.ts&lt;/b&gt;&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;@Component({
  selector: 'custom-input',
  templateUrl: './custom-input.component.html',
  styleUrls: ['./custom-input.component.css']
})
export class CustomInputComponent implements OnInit {
  @Input() label: string;
  @Input() validations:  { [index: string]: string};
  @Input() info: string;

  @ContentChild(InputRefDirective) input: InputRefDirective;

  get isError() {
    return this.input.hasError;
  }

   get errorMessages() {
    const errors = this.input.errors;
    const messages = [];
    const keys = Object.keys(this.validations);

    keys.forEach(key =&amp;gt; {
        if (errors[key]) {
          messages.push(this.validations[key]);
        }
      });
    return messages;
  }

  ngOnInit() { }

  constructor() { }
} 
&lt;/pre&gt;
&lt;br /&gt;
Above is Component Typescript file , code in file handles all the backend logic to control Component invalid/valid state, putting red border around control when there is error and displaying error message when control is in invalid state.&lt;br /&gt;
&lt;br /&gt;
&lt;table border="1" style="width: 100%;"&gt;
  &lt;tbody&gt;
&lt;tr&gt;
    &lt;th width="75"&gt;Type&lt;/th&gt;
    &lt;th width="100"&gt;Name&lt;/th&gt; 
    &lt;th&gt;Description&lt;/th&gt;
  &lt;/tr&gt;
&lt;tr&gt;
    &lt;td&gt;Input&lt;/td&gt;
    &lt;td&gt;&lt;br /&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;/tr&gt;
&lt;tr&gt;
    &lt;td&gt;&lt;br /&gt;&lt;/td&gt;
    &lt;td&gt;label&lt;/td&gt; 
    &lt;td&gt;display label text for control E.x. First Name in above image&lt;/td&gt;
  &lt;/tr&gt;
&lt;tr&gt;
    &lt;td&gt;&lt;br /&gt;&lt;/td&gt;
    &lt;td&gt;validations&lt;/td&gt; 
    &lt;td&gt;its indexed object hold validations associated with input tag of component&lt;br /&gt;
E.x. {'required' : 'First Name required', 'minlength': 'Minimum lenght is 3 char'}&lt;br /&gt;
Note: indexed property name must need to match with type of validation E.x. 'required' key match with required validation&amp;nbsp;&lt;/td&gt;
  &lt;/tr&gt;
&lt;tr&gt;
    &lt;td&gt;&lt;br /&gt;&lt;/td&gt;
    &lt;td&gt;info&lt;/td&gt; 
    &lt;td&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;/tr&gt;
&lt;tr&gt;
    &lt;td&gt;variable&lt;/td&gt;
    &lt;td&gt;&lt;br /&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;/tr&gt;
&lt;tr&gt;
    &lt;td&gt;&lt;br /&gt;&lt;/td&gt;
    &lt;td&gt;input&lt;/td&gt; 
    &lt;td&gt;this component variable allows to get access to input control (which replaces &lt;i&gt;ng-content&lt;/i&gt; in template of component) associated with component, for example above image in this case 'input textbox'.&lt;/td&gt;
  &lt;/tr&gt;
&lt;tr&gt;
    &lt;td&gt;Properties&lt;/td&gt;
    &lt;td&gt;&lt;br /&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;/tr&gt;
&lt;tr&gt;
    &lt;td&gt;&lt;br /&gt;&lt;/td&gt;
    &lt;td&gt;isError&lt;/td&gt; 
    &lt;td&gt;component property which&amp;nbsp; find input element (with help of input directive) and get element has error or not, which in turn helps to put red border around input control&lt;/td&gt;
  &lt;/tr&gt;
&lt;tr&gt;
    &lt;td&gt;&lt;br /&gt;&lt;/td&gt;
    &lt;td&gt;errorMessages&lt;/td&gt; 
    &lt;td&gt;component property which access errors associated input element (with help of input directive) and with help of input property validations object find proper error messages and return to display all.&amp;nbsp;&lt;/td&gt;
  &lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br /&gt;
Important thing to not here is &lt;i&gt;InputRefDirective&amp;nbsp;&lt;/i&gt;, which access input control. Below is code for input-ref directive.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;input-ref.directive.ts ( created by &lt;/b&gt;&lt;i&gt;ng g directive directive/InputRef&lt;/i&gt;&lt;b&gt; )&lt;/b&gt;&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;import { Directive } from '@angular/core';
import { NgControl } from '@angular/forms';

@Directive({
  selector: '[inputRef]'
})
export class InputRefDirective {

  constructor(private formControl: NgControl) {
  }

  get hasError() {
    return this.formControl.dirty &amp;amp;&amp;amp; this.formControl.invalid;
  }

  get errors() {
    if (this.hasError &amp;amp;&amp;amp; this.formControl.errors) {
      return this.formControl.errors;
    }
    return '';
  }
}&lt;/pre&gt;
&lt;br /&gt;
Important part of input-ref directive is, with help of constructor injection (by using angular framework injection) NgControl get injected in the input-ref directive. By doing that directive class get access to input control.&lt;br /&gt;
&lt;br /&gt;
&lt;table border="1" style="width: 100%;"&gt;
  &lt;tbody&gt;
&lt;tr&gt;
    &lt;th&gt;Type&lt;/th&gt;
    &lt;th&gt;Name&lt;/th&gt; 
    &lt;th&gt;Description&lt;/th&gt;
  &lt;/tr&gt;
&lt;tr&gt;
    &lt;td&gt;Properties&lt;/td&gt;
    &lt;td&gt;&lt;br /&gt;&lt;/td&gt; 
    &lt;td&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;/tr&gt;
&lt;tr&gt;
    &lt;td&gt;&lt;br /&gt;&lt;/td&gt;
    &lt;td&gt;hasError&lt;/td&gt; 
    &lt;td&gt;property return true (when control is dirty and invalid state) or flase , to indicate there is error or not&lt;/td&gt;
  &lt;/tr&gt;
&lt;tr&gt;
    &lt;td&gt;&lt;br /&gt;&lt;/td&gt;
    &lt;td&gt;errors&lt;/td&gt; 
    &lt;td&gt;property returns list of errors associated with input control&lt;/td&gt;
  &lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br /&gt;
So its end of creation of validation component and its related directive. Now let's see how to use it in application.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;app.component.html&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;Reactive Form
&lt;/b&gt;&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;&amp;lt;form class="needs-validation" [formGroup]="detailForm" novalidate&amp;gt;
    &amp;lt;custom-input [label]="'First Name'" [validations]="{required:'First Name required'}"&amp;gt;
      &amp;lt;input inputRef class="form-control" formControlName="firstName" type="text" /&amp;gt;
    &amp;lt;/custom-input&amp;gt;
    &amp;lt;custom-input [label]="'Last Name'" [validations]="{required:'Last Name required'}"&amp;gt;
      &amp;lt;input inputRef class="form-control" formControlName="lastName" type="text" /&amp;gt;
    &amp;lt;/custom-input&amp;gt;
    &amp;lt;div&amp;gt;
      &amp;lt;button [disabled]="detailForm.invalid" type="button" class="btn btn-primary"&amp;gt;Primary&amp;lt;/button&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/form&amp;gt;
&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;Component.ts for Reactive form only&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
code below create form reactive way - point to note here no much code to access control and display error (discussed below in advantages).&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;export class AppComponent implements OnInit {
  title = 'app';
  detailForm: FormGroup;

  constructor(private fb: FormBuilder) {
    this.createForm();
  }

  ngOnInit() {
  }

  private createForm() {
    this.detailForm = this.fb.group({
      firstName: new FormControl('', [Validators.required]),
      lastName: new FormControl('', [Validators.required]),
    });
  }
}
&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;Template Driven Form
&lt;/b&gt;&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;&amp;lt;form class="needs-validation" #detailForm="ngForm" novalidate&amp;gt;
    &amp;lt;custom-input [label]="'First Name'" [validations]="{required:'First Name required'}"&amp;gt;
      &amp;lt;input inputRef class="form-control" [(ngModel)]="firstName" name="firstName" type="text" /&amp;gt;
    &amp;lt;/custom-input&amp;gt;
    &amp;lt;custom-input [label]="'Last Name'" [validations]="{required:'Last Name required'}"&amp;gt;
      &amp;lt;input inputRef class="form-control" [(ngModel)]="lastName" name="lastName" type="text" /&amp;gt;
    &amp;lt;/custom-input&amp;gt;
    &amp;lt;div&amp;gt;
      &amp;lt;button [disabled]="detailForm.invalid" type="button" class="btn btn-primary"&amp;gt;Primary&amp;lt;/button&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/form&amp;gt;
&lt;/pre&gt;
&lt;br /&gt;
It's not full template of application component code, but it part of template which uses Custom validation&amp;nbsp; component in both ways Reactive Form and Template Driven Form way. So not much change in both way, except change forced by reactive form approach and template driven form approach.&lt;br /&gt;
&lt;br /&gt;
Not much in app.component template to discuss as already discussed before in post. app.component template make use of custom validation component and pass all required input values (label, info and validation error).&lt;br /&gt;
&lt;br /&gt;
Below is image of final form after doing all changes&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxXTgHXaTaDn2Q1A23-7Xlc0HU3b20oOCd3uDKCooHDRHX_4kXPZNU_FhSeYv3vEKTiH0ySmMT6o3W2ugCLVpdCOrI-d27tnbfLImplbZ97PMgRBrlXRr8quLevJ0K8n_ezfOxITYMJC_2/s1600/form+validation.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="268" data-original-width="647" height="132" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxXTgHXaTaDn2Q1A23-7Xlc0HU3b20oOCd3uDKCooHDRHX_4kXPZNU_FhSeYv3vEKTiH0ySmMT6o3W2ugCLVpdCOrI-d27tnbfLImplbZ97PMgRBrlXRr8quLevJ0K8n_ezfOxITYMJC_2/s320/form+validation.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Advantage of using Custom validation component&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ol style="text-align: left;"&gt;
&lt;li&gt;Less code in component template, 
&lt;br /&gt;
Template driven from
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt; &amp;lt;label class="control-label"&amp;gt;First Name&amp;lt;/label&amp;gt;
  &amp;lt;input
  type="text"
  name="firstName"
  [(ngModel)]="firstName"
  minlength="2"
  required&amp;gt;

&amp;lt;div *ngIf="firstName.errors?.required &amp;amp;&amp;amp; firstName.touched &amp;amp;&amp;amp; firstName.touched" 
class="label label-danger"&amp;gt;
  Name is required
&amp;lt;/div&amp;gt;
&amp;lt;div *ngIf="firstName.errors?.minlength &amp;amp;&amp;amp; firstName.touched &amp;amp;&amp;amp; firstName.touched" 
class="label label-danger"&amp;gt;
  Minimum of 2 characters
&amp;lt;/div&amp;gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;Reactive from &lt;/b&gt;
&lt;pre class="brush: csharp"&gt; component.ts

 this.detailForm = this.form.group({
       firstName: [null, Validators.compose([Validators.required, Validators.minLength(2)])],     
    });

component.html
&amp;lt;label class="control-label"&amp;gt;First Name&amp;lt;/label&amp;gt;
&amp;lt;inpu.
  type="text"
  name="firstName"
  [(ngModel)]="firstName"
  minlength="2"
  required&amp;gt;

&amp;lt;div *ngIf="detailForm.get('firstName').errors?.required &amp;amp;&amp;amp; detailForm.get('firstName').touched &amp;amp;&amp;amp; detailForm.get('firstName').touched" 
class="label label-danger"&amp;gt;
  Name is required
&amp;lt;/div&amp;gt;
&amp;lt;div *ngIf="detailForm.get('firstName').errors?.minlength &amp;amp;&amp;amp; detailForm.get('firstName').touched &amp;amp;&amp;amp; detailForm.get('firstName').touched" 
class="label label-danger"&amp;gt;
  Minimum of 2 characters
&amp;lt;/div&amp;gt;  &lt;/pre&gt;
&lt;br /&gt;
If there is no custom validation component , in both the way (Template driven or Reactive way) one need to write down separate &lt;i&gt;div&lt;/i&gt; for displaying each error input control has, for example (div for required error and div for minlength). &lt;br /&gt;
But with custom validation control, there just need of passing validations in validations-property of control and it will take care of it.
&lt;pre class="brush: csharp"&gt;    &amp;lt;custom-input [label]="'First Name'" 
               [validations]="{required:'First Name required', 'minlength':'Minimum of 2 characters'}"&amp;gt;
      &amp;lt;input inputRef class="form-control" [(ngModel)]="firstName" name="firstName" type="text" /&amp;gt;
    &amp;lt;/custom-input&amp;gt;
&lt;/pre&gt;
&lt;br /&gt;
Event there is no need to write extra label tag for displaying label for input control. This also taken care by custom validation control label-property.
&lt;/li&gt;
&lt;li&gt;
Second major difference is, custom validation control encapsulate code of validation in one place only for full application. That means there is no need to write validation code in template in each and every data entry form. 
&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;b&gt;Wrapping up&lt;/b&gt;&lt;br /&gt;
Custom validation control is easy and simple to use. It makes use of some advance stuff like &lt;i&gt;ng-content, directive to get input control&lt;/i&gt; under the hood and encapsulate thing in it. Once control included in application it reduce amount of validation code &amp;amp; effort to write validation code in every data entry form. 
&lt;br /&gt;
Full Source at GitHub : &lt;a href="https://github.com/pranayrana/AdvCustomValidationComponent"&gt;AdvCustomValidationComponent&lt;/a&gt;
&lt;/div&gt;
</description><link>http://pranayamr.blogspot.com/2018/03/custom-validation-component.html</link><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmtgq_e5r3BwHcx7SkaXeXFCMRlo_3m1i9RNbwJfrqL7UeB9SstPzDYAQyJ6wTWsjActLdGRtyq2IbsC5trscVJLQFDjfiY0g8iNZWyjn6j7XMUAvH5h4Xg914i7R9KSEAU23gKLyEYLNe/s72-c/ng+content.png" width="72"/><thr:total>0</thr:total><author>pranayamr@gmail.com (Pranay Rana)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1194836729866470946.post-6886089516639304709</guid><pubDate>Sun, 25 Mar 2018 19:23:00 +0000</pubDate><atom:updated>2018-03-31T15:24:33.007-04:00</atom:updated><title>My first Angular 2 app - tutorial</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div&gt;
There are lof of developer now days started learning and devloping websites Angular 2, this is simple tutorial for those who are beginner and started learning &amp;amp; development with Angular 2. Tutorial is set of step one should follow to communicate with Restful Server service like Asp.net webApi to perfrom CRUD (Create, Read , Update  &amp;amp; Delete) operation.&lt;br /&gt;
&lt;br /&gt;
Tutorial is divided in two parts first part is creation of simple Asp.net WebApi i.e Restful server side service and second part is creation of Angular 2 application which consiste of just one page to consume webapi.
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;First part - Creation of Restful Service (webApi)&lt;/b&gt;
&lt;br /&gt;
What is Asp.net WebApi?

Asp.net Webapi is MVC based framework provided by Microsoft to create Resful web Api (i.e. restful web servie). one of advantage of web api is easy to create and cosnume. As its restul its compiable with HTTP protocol and HTTP verb. One should follow this link to learn more about it : &lt;a href="https://www.asp.net/web-api"&gt;Asp.net WebApi&lt;/a&gt;

Before start creating webApi one must need to have Visual Studio installed on machine. Once one have visual studio follow the below steps&lt;br /&gt;
&lt;br /&gt;
1. Create new solution and add new project in it. As shown in below image&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;&amp;nbsp;Selecte language of development (here C# is chosen)&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;Selecte Web unser language&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;Selecte 'Asp.net Web Application' template&lt;/li&gt;
&lt;li&gt;&amp;nbsp;Enter project name (here Employeemengementapi is project name)&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;Click Ok. &lt;/li&gt;
&lt;/ul&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzEqimGKSOZ8EADGQAzmJJKpz4AT7xltB9oRsi_nWHYPvqNtJeL2Nzriy7LiMEHe4aovPIvwdnh7PlqfbseuSzUJt26tBSueuELPjEhX1zXOuoAf1wuMTuvCxPsK4OrzffNSNErzQUv69Q/s1600/1+webapi+creation1.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="571" data-original-width="941" height="194" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzEqimGKSOZ8EADGQAzmJJKpz4AT7xltB9oRsi_nWHYPvqNtJeL2Nzriy7LiMEHe4aovPIvwdnh7PlqfbseuSzUJt26tBSueuELPjEhX1zXOuoAf1wuMTuvCxPsK4OrzffNSNErzQUv69Q/s320/1+webapi+creation1.JPG" width="320" /&gt;&amp;nbsp;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
2. On next window&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;Select 'Empty' Template&lt;/li&gt;
&lt;li&gt;and Select 'WebApi' checkbox&amp;nbsp;&lt;/li&gt;
&lt;li&gt;click Ok.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoW3Y3cRdXcGEzdCbnJvQZiOqwEHtE57jl07PniNqXwc9pW-gC1teJRfoPGKjufUEeKJurX9skwWk-zlCnjmciMdEwocMIls1yUxkUXKA84eI7dU8hujHAQYaniv8RwBfh-g0V3poQAqUu/s1600/2+webapi+creation.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="568" data-original-width="759" height="239" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoW3Y3cRdXcGEzdCbnJvQZiOqwEHtE57jl07PniNqXwc9pW-gC1teJRfoPGKjufUEeKJurX9skwWk-zlCnjmciMdEwocMIls1yUxkUXKA84eI7dU8hujHAQYaniv8RwBfh-g0V3poQAqUu/s320/2+webapi+creation.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
3. Once proper input is given during project creation, Visual studio create project structure as given in below image. Now one is ready to code Restful webApi.&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjU9cN4yOMIV0sHhTFTP-M1pnFQXgcllnjto75A1sKWiZEYIwSrzfb6azUSnFk1pHmvbyp5EnrsB57bvXkrK0xg3zWGv8_gJIzfwicQGx8x2BD9wJ9Jpj9Nhz2ePCYVGDrWnESxdOIKnZ9-/s1600/3+webapi+creation2.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="201" data-original-width="231" height="278" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjU9cN4yOMIV0sHhTFTP-M1pnFQXgcllnjto75A1sKWiZEYIwSrzfb6azUSnFk1pHmvbyp5EnrsB57bvXkrK0xg3zWGv8_gJIzfwicQGx8x2BD9wJ9Jpj9Nhz2ePCYVGDrWnESxdOIKnZ9-/s320/3+webapi+creation2.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
4. Once project structure is ready, first task is to add Model Class. Model class is object which can be sent from server to client as response from controller or object received by contoller from client as part of request. To add model class just right click on Model foler and click add class.&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjl3y0ep4s_wF2ezUD00-OuTWuXB8CH0oroKy51WXP1y76wQ_1omHxrxFQfTL-hmYz33wHV333RuASbmHP_UuG3MX04umPxO3V40dtpQ22EpoEzSxE0sAD1p0xxqrlRV0k1z6Oj8Okpc8N4/s1600/7+model+creation.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="509" data-original-width="720" height="226" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjl3y0ep4s_wF2ezUD00-OuTWuXB8CH0oroKy51WXP1y76wQ_1omHxrxFQfTL-hmYz33wHV333RuASbmHP_UuG3MX04umPxO3V40dtpQ22EpoEzSxE0sAD1p0xxqrlRV0k1z6Oj8Okpc8N4/s320/7+model+creation.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
5. Add enter name of model class as shown in below image and click add it will create plain class under model folder.&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1WjCP7D2NXfS_h4Sb2Qas2dtgCPOiMKxDNEGrMoH9nH4AZ3gLxWqX1WCB0sMfxBe-t6s2h2JJ9eLLDn4Zz8PLzVNjPc7NQo1_-Wx70U8iOJB4CcARU4fysoWQN4-383TFwjPsuf23Xh2y/s1600/8+model+creation1.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="565" data-original-width="936" height="193" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1WjCP7D2NXfS_h4Sb2Qas2dtgCPOiMKxDNEGrMoH9nH4AZ3gLxWqX1WCB0sMfxBe-t6s2h2JJ9eLLDn4Zz8PLzVNjPc7NQo1_-Wx70U8iOJB4CcARU4fysoWQN4-383TFwjPsuf23Xh2y/s320/8+model+creation1.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Below is simple Employee Class created as model, which is going to be used in the tutorial.

&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;namespace EmployeeManagmentApi.Models
{
    public class Employee
    {

        public int ID { get; set; }

        [Required]
        public string firstname { get; set; }

        public string lastname { get; set; }
    }
} 
&lt;/pre&gt;
&lt;br /&gt;
&lt;div&gt;
6. Once project structure is ready, first task is to create Contoller. Contoller in MVC framework does heavy lifting job of hadling income client request and providing proper response to client. As given in below image one need to right click on solution folder and select add contoller.&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaHyAJvZAP3IMb5JnGuA8KptB05vkDdKYTqRwbLuAsyPq6GvEfOH2hgiX4umxutjI-JEQ-UNQxClB8AofaSKcRxhT-AYs9OqbfBA25FXRAyxNTSwR1Bzf1aClN1_Sj8q66ya9r-8CWEUOq/s1600/4+webapi+controller+creation2.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="387" data-original-width="714" height="173" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaHyAJvZAP3IMb5JnGuA8KptB05vkDdKYTqRwbLuAsyPq6GvEfOH2hgiX4umxutjI-JEQ-UNQxClB8AofaSKcRxhT-AYs9OqbfBA25FXRAyxNTSwR1Bzf1aClN1_Sj8q66ya9r-8CWEUOq/s320/4+webapi+controller+creation2.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
7. Once add click , it display template for controller and as there is no fancy stuff involved (i.e. no entity framework related things) and as its WebApi for this tutorial 'Web API Contoller with read/wrtie actions' selected as given in below image.&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhioCZUPryDAZ3IljYz9fno-jzcVMpUMCpiR0mYFJYmMhuvoT2Pmg4X4UHLQdmJjXkAeRcV4dsM6luZUeXYJYY1fm_Caj6GkdOxfJp5HnlyaQnvRZ5I9SuD45YNAf8uPNugwJa8ZmVlirq4/s1600/5+webapi+controller+creation.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="646" data-original-width="937" height="221" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhioCZUPryDAZ3IljYz9fno-jzcVMpUMCpiR0mYFJYmMhuvoT2Pmg4X4UHLQdmJjXkAeRcV4dsM6luZUeXYJYY1fm_Caj6GkdOxfJp5HnlyaQnvRZ5I9SuD45YNAf8uPNugwJa8ZmVlirq4/s320/5+webapi+controller+creation.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
8. Once clicked on Add in above screen it will display from where one should enter name of controller. once clicked it will create conroller with read/write action.&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisYpWrkCktsIdpdTZodyX6nBMUqCa6aQB6UKtsLk178S67tUl1Kt-Cfmoj0fGV7x1L3cgxJ73AcPeeZT0byOwNOrvD5Jz5nfQz0Pd-Aed78kF-kIl3fw8V1N6AgfaiRVEmASZ1TaauiPmp/s1600/6+webapi+controller+creation1.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="114" data-original-width="586" height="62" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisYpWrkCktsIdpdTZodyX6nBMUqCa6aQB6UKtsLk178S67tUl1Kt-Cfmoj0fGV7x1L3cgxJ73AcPeeZT0byOwNOrvD5Jz5nfQz0Pd-Aed78kF-kIl3fw8V1N6AgfaiRVEmASZ1TaauiPmp/s320/6+webapi+controller+creation1.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Below is code of contoller which is written for this tutorial. As part of tutorial just going to demostrate HttpGet request so only created one new method which is going to return Employee object.&lt;br /&gt;
&lt;br /&gt;
one important thing to note here is  &lt;i&gt;[EnableCors(origins: "*", headers: "*", methods: "*")]&lt;/i&gt; line which is above controller , thats line is added to provide support for cross domain request (i.e. request which comes from other domain). More about cross domain request : &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS"&gt;CORS&lt;/a&gt;

&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;namespace EmployeeManagmentApi.Controllers
{
    [EnableCors(origins: "*", headers: "*", methods: "*")]
    public class EmployeeController : ApiController
    {
        // GET: api/GetEmployees
        public IEnumerable&amp;lt;Employee&amp;gt; GetEmployees()
        {
            List&amp;lt;Employee&amp;gt; emplist = new List&amp;lt;Employee&amp;gt;
            {
                new Employee{ ID=1, firstname="Pranay", lastname="Rana"},
                new Employee{ ID=2, firstname="abc", lastname="xyz" }
            };

            return emplist;
        }

        // GET: api/Employee/5
        public string Get(int id)
        {
            return "value";
        }

        // POST: api/Employee
        public void Post([FromBody]string value)
        {
        }

        // PUT: api/Employee/5
        public void Put(int id, [FromBody]string value)
        {
        }

        // DELETE: api/Employee/5
        public void Delete(int id)
        {
        }
    }
}
&lt;/pre&gt;
&lt;br /&gt;
9. once done with Controller and Model, one should modify the WebApiConfig.cs file which helps to configure webApi, such that it meets with the requirements like handling of Cross Domain request, Respose formate, Routes to serve request etc. Below is code for the same. 
&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;namespace EmployeeManagmentApi
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services
            config.Formatters.Remove(config.Formatters.XmlFormatter);
            
            // Cross domain reuest configuration 
            config.EnableCors();

            // Web API routes
            config.MapHttpAttributeRoutes();
             
            config.Routes.MapHttpRoute(
               name: "NamedactionApi",
               routeTemplate: "api/{controller}/{action}/{id}",
               defaults: new { id = RouteParameter.Optional }
           );


            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        }
    }
} 
&lt;/pre&gt;
&lt;br /&gt;
Note : make sure you must install &lt;i&gt;Microsoft.AspNet.WebApi.Cors&lt;/i&gt; package that is required for cross domain request handling code.&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;
10. once done one can easily test web api just by typing url in browser as given in below image. It working as its get request but if want to test for other type request like Delete (HttpDelete), Update(HttpPut), Create (HttpPost), one should make use of &lt;a href="https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop?hl=en"&gt;Postman &lt;/a&gt; or &lt;a href="https://www.telerik.com/download/fiddler"&gt;fiddler&lt;/a&gt;.&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjO5tlW7oP2tTF1E5Ums1T7sw_RRAjRjXLib0hDIxOl6fxs3hzDbHeWvzhcUIPfYI5rVwrZlzWP_1B2Tgrv3sZ1S1O0rUq717C3miO7GjM4rMCaBjNlGnt5WhrWrhnjZsGH5oYcg8gTu1eH/s1600/8.1+running.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="324" data-original-width="601" height="173" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjO5tlW7oP2tTF1E5Ums1T7sw_RRAjRjXLib0hDIxOl6fxs3hzDbHeWvzhcUIPfYI5rVwrZlzWP_1B2Tgrv3sZ1S1O0rUq717C3miO7GjM4rMCaBjNlGnt5WhrWrhnjZsGH5oYcg8gTu1eH/s320/8.1+running.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
This is end of first part of this tutorial, creation of webapi. In tutorial Asp.net WebApi is used but its not necessary to use it one can make use of other serside techonlogy.
&lt;br /&gt;
&lt;br /&gt;
&lt;hr /&gt;
&lt;div&gt;
&lt;b&gt;Second part : Creation of Angular 2 App&lt;/b&gt; &lt;br /&gt;
Before starting with second part i.e. Angualr 2 App, one must needs to be ready with development environment. one must need to have following installed in machine&lt;br /&gt;
&lt;ol style="text-align: left;"&gt;
&lt;li&gt;&lt;a href="https://code.visualstudio.com/"&gt;Visual Studio Code&lt;/a&gt;
&lt;br /&gt;
Visual Studio code is development tool provided by Microsoft. Some of the majaor advatnages of it is it's free and not heavy tool as Visual Studio, lot of plugin/ etension avaiable which helps in development. 
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nodejs.org/en/download/"&gt;Node.Js &amp;amp;npm&lt;/a&gt; :
&lt;br /&gt;
It's required to manage and install libaray / packages. It's runtime which convert typescript code in javascript code which broswer understand and run application in browser. 
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/angular/angular-cli"&gt;Angular Cli&lt;/a&gt;
&lt;br /&gt;
It's helpful commandline utility which helps from project start (setup new application) till end (deployment of project). Some of the advantages are easy project creation, allows to create module, component, service, model class, pipe etc. (i.e used for scofolding) just help of commands, setup lint which helpful in code formatting during development, webpack - which help in bundling typescript/javascript/css files and create chunk of code,testing, minifying, .   
&lt;/li&gt;
&lt;li&gt;Version Control Tool (ex. &lt;a href="https://github.com/"&gt;GitHub)&lt;/a&gt; &lt;br /&gt; It's helpful for keeping code which at location, from which you can retive code and keep version of code so allow to compare between diffrent version of code. 
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://getbootstrap.com/docs/4.0/getting-started/download/"&gt;BootStrap &lt;/a&gt;&lt;br /&gt;
This is not must needed pacakge, but it's helful if you don't want to spend much time in styling your application. It's css libarary comes up with ready made Styles (CSS) and some simple jQuery stuff. I makes development faster.
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
Once all the above installed (except BootStrap which requried to be install after project get created) , we are ready to go with first Angualr 2 app&lt;br /&gt;
&lt;br /&gt;
1. Create application by running angular cli command 'ng new [projectname]', as given below&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpre1Wel0NdBW7HHKP62sFC-1UftLXIO-RBZvPIQnfa5MAzWNzjDHxofz7QH7HoUhx_yFp7ZRFU2D65mithpvdtejJXktQ6RTD-ZPPegmiWEp1F7h11F5rwU8W6QYa3o8yTq8AEzEpiaBF/s1600/9+Startnew.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="96" data-original-width="508" height="60" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpre1Wel0NdBW7HHKP62sFC-1UftLXIO-RBZvPIQnfa5MAzWNzjDHxofz7QH7HoUhx_yFp7ZRFU2D65mithpvdtejJXktQ6RTD-ZPPegmiWEp1F7h11F5rwU8W6QYa3o8yTq8AEzEpiaBF/s320/9+Startnew.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
This command will create folder with all necessary things required for angular 2 app and it's also install necessary packages which is listed in package.json file. 
&lt;br /&gt;
Note: command ran with &lt;i&gt; --routing&lt;/i&gt; argument, it will create routing module with new application , its needed as sooner or later you need more number of pages in your application and want to navigate betwen that pages. &lt;/div&gt;
Once folder got created in local drive suggestion is close command prompt window. And if you see failure during installtion of package just leave it and close command prompt.&lt;br /&gt;
&lt;br /&gt;
2. Now open Visual Studio Code on your machine and click on open folder, then navigate to the path where folder got created and click 'Select Folder'.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHULsBrj7YDUdr3blsuiu_DYx9ufL7Z0OhhEukEqPd8f97Ta0CxM03p372rK0U2Xm3Zr8XamqXhXaaou9B41hVZMC7kO9adti0SAfT96MHgJQxxKqE96MWxEjk5jt7VDqPfoW1GVQ9uUe1/s1600/open+folder.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="658" data-original-width="1007" height="209" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHULsBrj7YDUdr3blsuiu_DYx9ufL7Z0OhhEukEqPd8f97Ta0CxM03p372rK0U2Xm3Zr8XamqXhXaaou9B41hVZMC7kO9adti0SAfT96MHgJQxxKqE96MWxEjk5jt7VDqPfoW1GVQ9uUe1/s320/open+folder.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
3. Visual Studio code shows folder structure as below in visual studio code.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxA_yivXqdfc8yKk3__-s7CxvgkOUQmRNbbaGZoHg7ulWCUUYPbVhxN0-XK3PFehxyTBMXVcG7uH-DcJSMT9RI0Op-o9tRr2HbugPixPPcXdZ9V5-2K5Q_2oYga8BRgN2v13H5qiqtxrNl/s1600/10+angular+created+project.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="751" data-original-width="978" height="246" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxA_yivXqdfc8yKk3__-s7CxvgkOUQmRNbbaGZoHg7ulWCUUYPbVhxN0-XK3PFehxyTBMXVcG7uH-DcJSMT9RI0Op-o9tRr2HbugPixPPcXdZ9V5-2K5Q_2oYga8BRgN2v13H5qiqtxrNl/s320/10+angular+created+project.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Important file in folder strucutre are&lt;br /&gt;
&lt;ol style="text-align: left;"&gt;
&lt;li&gt; Package.json - File which contains all packages that installed for the project i.e. file used for managing packages in project.
&lt;/li&gt;
&lt;li&gt;
tsconfig.json - File cotains setting related to typescript compiler , i.e. setting to compile typscript .
&lt;/li&gt;
&lt;li&gt;
src - folder going to contains all the code (module, component, pipe, service etc.) for creating application. 
&lt;br /&gt;
src&amp;gt; Application -When new application get created it got created with default Application Module and Application Component.  
&lt;/li&gt;
&lt;li&gt;
src &amp;gt; asset - folder conatins style, images used in project.
&lt;/li&gt;
&lt;li&gt;
node_module - folder conatins all installed packages. which lis listed in package.json.
&lt;/li&gt;
&lt;li&gt; 
src &amp;gt; environment - contains files which is having setting realted to current running environment. i.e. contains settings file for dev, prod and test evnvironment related settings file.
&lt;/li&gt;
&lt;li&gt;
e2e - stand for end to end testing.
&lt;/li&gt;
&lt;li&gt;
src &amp;gt; polyfill.js - file contains code to render application on all broswer.
&lt;/li&gt;
&lt;li&gt;
tslint.json - File contains all setting related to linting code i.e. formatting code properly duing development.&lt;/li&gt;
&lt;li&gt;
angular-cli.json - file contains setting related to angular cli utility, this setting used by angular cli utility.
&lt;/li&gt;
&lt;li&gt;
index.html - page get loaded in when user brows and its page which load angular application.
&lt;/li&gt;
&lt;li&gt;
main.ts - file contains application bootstaping realted code. It conatins reference to module which first needs to be get loaded when application start. In newly created application it contains reference to 'ApplicationModule'.
&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
4. After opening application, start integarter terminal in visual studio, by clickin on View &amp;gt; integrated terminal. This will open up command line in visual studio. 
&lt;br /&gt;
run command '&lt;i&gt;npm install&lt;/i&gt;' if pacakage installation not done during proect creation. after that first run '&lt;i&gt;ng serve&lt;/i&gt;' command it will run application and to check it worked correctly. Go to url : &lt;i&gt;http://localhost:4200&lt;/i&gt; it will open up defaultly created application.
&lt;br /&gt;
Now, remove all unecessary stuff i.e. html from index.html file.&lt;/div&gt;
5. Run command &lt;i&gt;npm install bootstrap&lt;/i&gt; and install bootstrap in project. After intallation done to make use of bootstrap in project, there is need of modifying angular.cli.json file as below. &lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;      "styles": [
        "styles.css",
        "../node_modules/bootstrap/dist/css/bootstrap.css"
      ],
      "scripts": [
        "../node_modules/bootstrap/dist/js/bootstrap.js"
      ],
&lt;/pre&gt;
&lt;br /&gt;
Go to Angualr cli.json locate styles and scripts array and add path of .css and .js file of bootstrap.&lt;br /&gt;
&lt;br /&gt;
6. Now run following command in integrated terminal i.e. command line same given in below image.&lt;br /&gt;
&lt;ol style="text-align: left;"&gt;
&lt;li&gt;ng g module feature/employees --routing &lt;br /&gt;
This command create new mdoule called employess with routing feature. &lt;/li&gt;
&lt;li&gt;ng g component feature/employees &lt;br /&gt;
command create feature called employees in employee module.
 &lt;/li&gt;
&lt;/ol&gt;
Both command as seen in image below run with &lt;i&gt;--dry&lt;/i&gt; argument to command. This agrument allows to see one what modification command will do in project before running it.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgehKxOyCCuBuIjuZrm4P9hf62H3feVhnS1arBwWOPvvjcZWk4PrfiM4QS2YqKokYMfNntw7y815Bkl9_012_Eqt55_NXeRJADMp3zAdYlzXvyPkU1cED-ozoo6nk_oVYxSKaAD1-aYy6x2/s1600/11+create+component.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="790" data-original-width="1150" height="220" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgehKxOyCCuBuIjuZrm4P9hf62H3feVhnS1arBwWOPvvjcZWk4PrfiM4QS2YqKokYMfNntw7y815Bkl9_012_Eqt55_NXeRJADMp3zAdYlzXvyPkU1cED-ozoo6nk_oVYxSKaAD1-aYy6x2/s320/11+create+component.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
Note: Please follow : &lt;a href="https://angular.io/guide/styleguide#application-structure-and-ngmodules"&gt;style guide&lt;/a&gt; for recomended angular application structure.
&lt;br /&gt;
As per guide application should have follwing folder under src folder&lt;br /&gt;
&lt;ol style="text-align: left;"&gt;
&lt;li&gt;Application - this folder is already there when you create new project, its folder which contains application module.&lt;/li&gt;
&lt;li&gt;Feature - this folder conatins all the feature going to be part of applicatio. for eample in Employeemangment application its will going to have feature like Employees (componet for employee add,delete,update &amp;amp; read), Department (componet for employee add,delete,update &amp;amp; read)etc.
&lt;/li&gt;
&lt;li&gt;
Core - this folder going to contains application core, it contains all the singleton services that is going to be used by features modules , it will contains service like application wide exception service, application wide user profile service, nav bar  etc.  
&lt;/li&gt;
&lt;li&gt;
Shared - this folder going to contains all the comman services , pipe, component, directives which is going to be used by features modules. &lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
Once command run it will create feature called Employees in project. One
 of the adavantage of creating module/component with angular it will do 
all necessary modification in project like adding routing, adding newly 
created component to module, so it saves effort of going to each file 
add adding this details. It also create module,compoent,servie,pipe, 
directive with proper etension like &lt;i&gt;xyz.mdoule.ts. xyz.component.ts&lt;/i&gt; etc. as per style guide to identify given file is for compoenet or module or service etc.&lt;br /&gt;
&lt;br /&gt;
7. Next step is to add model in feature its interface going to 
have structure similar response structure which comes after making http 
call from service. It's kind of plain property class. &lt;br /&gt;
command : &lt;i&gt;ng g interface feature/employees/model&lt;/i&gt; creates model interface model.&lt;/div&gt;
&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgM9gaQTA507AaT2-8haAC7NyMAL1QpkglW411sJkNB3rZ3jphcPU7O7eN1C27AvXCPrRLWiq4WRIRgt3Rj-KxwXQKi0U6AKEGUlwFx4JFu59xbNHfA3xFYdC2Q7zKFqhlJKD6hItfddd6D/s1600/13+model.JPG" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="756" data-original-width="1082" height="224" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgM9gaQTA507AaT2-8haAC7NyMAL1QpkglW411sJkNB3rZ3jphcPU7O7eN1C27AvXCPrRLWiq4WRIRgt3Rj-KxwXQKi0U6AKEGUlwFx4JFu59xbNHfA3xFYdC2Q7zKFqhlJKD6hItfddd6D/s320/13+model.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
Modify model.ts as below&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;export interface Employee {
    ID?: number;
    firstname?: string;
    lastname?: string;
}
&lt;/pre&gt;
&lt;br /&gt;
8. Once module, component get created. Make use of below command it will add service i.e. data service which is going to be used by Employee module. DataService mostly going to have code which communicate with serverside api.&lt;br /&gt;
command : &lt;i&gt;ng g service feature/employees/employees -m=feature/employees/employees.module&lt;/i&gt; create dataservice called employee and also add service as provider list in module defination file as given in below image.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqAFvSQgH30dFbd8wtylUuqfzeTyMC0Z2_JZ_CKwRdMnG1j18z4CaWfP-l8Xj_Hk3VNQg56T-lp7QFqeAPdnxxUaleqJQoAC-YXQ5pJLnLAoajhsJTjNqBMxqRoDWhyizDX2ZwvRMRjju6/s1600/12+service.JPG" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="756" data-original-width="1119" height="216" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqAFvSQgH30dFbd8wtylUuqfzeTyMC0Z2_JZ_CKwRdMnG1j18z4CaWfP-l8Xj_Hk3VNQg56T-lp7QFqeAPdnxxUaleqJQoAC-YXQ5pJLnLAoajhsJTjNqBMxqRoDWhyizDX2ZwvRMRjju6/s320/12+service.JPG" width="320" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;br /&gt;
Modify employees.service.ts as below&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { Observable } from 'rxjs/Observable';

import { Employee } from './model';

@Injectable()
export class EmployeesService {

  apiUrl = 'http://localhost:1800/api/demo/';
  constructor(
    private http: HttpClient
  ) { }

  getEmployees(): Observable&amp;lt;Employee[]&amp;gt; {
    const url = `${this.apiUrl}getemployees`;
    return this.http.get &amp;lt;Employee[]&amp;gt;(url);
  }
} &lt;/pre&gt;
&lt;br /&gt;
Some of change to note here is 
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;
HttpClient - injected in employee service. it's service provided as part of Angular 2 framework for communicating with serverside service. In this tutorial its going to comuunicate with EmployeeManagementApi webapi created in first part. 
&lt;/li&gt;
&lt;li&gt;
 getEmployees - method of service which make use of http service and calls getEmployees method of web api to get all employees. 
&lt;/li&gt;
&lt;/ol&gt;
Note: Tutorial is just making use of HttpGet call to bring data but one can easily read other methods provided by HttpClient put, post etc. which map with other HttpVerb to perform operation like Create, Update and Delete.
&lt;br /&gt;
&lt;br /&gt;
9. Once done with above changes do modify , componet files as below 
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;employees.component.ts&lt;/b&gt;&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;import { Component, OnInit } from '@angular/core';
import { EmployeesService } from './employees.service';
import { Observable } from 'rxjs/Observable';
import { Employee } from './model';

@Component({
  selector: 'app-employees',
  templateUrl: './employees.component.html',
  styleUrls: ['./employees.component.css']
})
export class EmployeesComponent implements OnInit {

  employees: Observable&amp;lt;Employee[]&amp;gt;;
  constructor(
    private employeesService: EmployeesService
  ) { }

  ngOnInit() {
    this.employees = this.employeesService.getEmployees();
  }
}&lt;/pre&gt;
&lt;br /&gt;
typescript code in this inject employeeservice. Make call to employeeservice &amp;gt; getemployees method form ngInit to get employees from server and it stores response coming out from servers in observalbe of employee array. 
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;employees.component.html&lt;/b&gt;&lt;br /&gt;
&lt;pre&gt; &amp;lt;div class="container"&amp;gt;
  &amp;lt;h2&amp;gt;Employees&amp;lt;/h2&amp;gt;
      
  &amp;lt;table class="table table-striped"&amp;gt;
    &amp;lt;thead&amp;gt;
      &amp;lt;tr&amp;gt;
        &amp;lt;th&amp;gt;Id&amp;lt;/th&amp;gt;
        &amp;lt;th&amp;gt;Firstname&amp;lt;/th&amp;gt;
        &amp;lt;th&amp;gt;Lastname&amp;lt;/th&amp;gt;
      &amp;lt;/tr&amp;gt;
    &amp;lt;/thead&amp;gt;
    &amp;lt;tbody *ngIf='employees'&amp;gt;
      &amp;lt;tr *ngFor="let employee of employees | async"&amp;gt;
          &amp;lt;td&amp;gt;{{employee.ID}}&amp;lt;/td&amp;gt;
          &amp;lt;td&amp;gt;{{employee.firstname}}&amp;lt;/td&amp;gt;
          &amp;lt;td&amp;gt;{{employee.lastname}}&amp;lt;/td&amp;gt;
      &amp;lt;/tr&amp;gt;
    &amp;lt;/tbody&amp;gt;
  &amp;lt;/table&amp;gt;
&amp;lt;/div&amp;gt;&lt;/pre&gt;
&lt;br /&gt;
html code make use of &lt;i&gt;async&lt;/i&gt; pipe of angular framework to subscribe obersable employees created in typescript file and get actual employee array. Code also make use of &lt;i&gt;*ngFor&lt;/i&gt; angular framewrok  directive to go through all the employess in received array and create table row.&lt;br /&gt;
&lt;br /&gt;
10. Afer all change done run command '&lt;i&gt;ng lint&lt;/i&gt;' to find out if there is any lint error i.e. code formatting error.&lt;br /&gt;
&lt;br /&gt;
11. Below screen shot shows final output of the tutorial.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGjoTFk_XkkcdxA0OYuW4COtGVpRjPbFoJ4_ov7DRzdw2leORxypjzC46QhnQFTCkCbz06OwrRWz-4bfEN1dwvOqsQfmKKfajB5an3hlQZrStMc0SttpAb3pE9FTH1iI6oSx4Ygzo68tp5/s1600/14+working+on+web.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="303" data-original-width="790" height="123" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGjoTFk_XkkcdxA0OYuW4COtGVpRjPbFoJ4_ov7DRzdw2leORxypjzC46QhnQFTCkCbz06OwrRWz-4bfEN1dwvOqsQfmKKfajB5an3hlQZrStMc0SttpAb3pE9FTH1iI6oSx4Ygzo68tp5/s320/14+working+on+web.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;Conclusion&lt;/b&gt;
&lt;br /&gt;
Tutorial covers most of the basic which one needs to start with angula 2 application (except testing of application). One should find full code of tutorial here :
WebApi - &lt;a href="https://github.com/pranayrana/EmployeeManagmentWebApi"&gt;EmployeeManagementApi&lt;/a&gt;
AngularApp - &lt;a href="https://github.com/pranayrana/EmployeemangmentAngular2"&gt;EmployeeManagment&lt;/a&gt;
&lt;/div&gt;</description><link>http://pranayamr.blogspot.com/2018/03/webapi-with-angular-2-httpclient.html</link><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzEqimGKSOZ8EADGQAzmJJKpz4AT7xltB9oRsi_nWHYPvqNtJeL2Nzriy7LiMEHe4aovPIvwdnh7PlqfbseuSzUJt26tBSueuELPjEhX1zXOuoAf1wuMTuvCxPsK4OrzffNSNErzQUv69Q/s72-c/1+webapi+creation1.JPG" width="72"/><thr:total>2</thr:total><author>pranayamr@gmail.com (Pranay Rana)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1194836729866470946.post-1053857914658233829</guid><pubDate>Sun, 11 Feb 2018 18:43:00 +0000</pubDate><atom:updated>2018-02-11T13:43:29.568-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Declaration Merging</category><category domain="http://www.blogger.com/atom/ns#">Extension method</category><category domain="http://www.blogger.com/atom/ns#">Typescript</category><title>Extension method / Type Extension in TypeScript</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
During programming, most of the developers encounter scenario where there is need of adding behavior (method / operation) to existing type provide by framework (mostly by language) or into the type provided by third party library, which one can use in project multiple places without rewriting code again and again. And can access the extension code easily.&lt;br /&gt;
&lt;br /&gt;
For example one want to extend Date Type and wants to add compareDate, so that it get attached to Date type as given in below image. just to note Date type is already provided Typescript language. 
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyWVg6XzSiqkogCw6Y6kK7RcS3QFJS4XEoGIPX9y8QL4-9ebKZqBt3jqAoVtxzH6tGWQ2UWw9SPARegN2DzP3hBqFS-NH3iLPKbopV2MLqEYSRuyYs26GXQnvZKA4nDqsQAr6eF3gqjA2M/s1600/date+method.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="326" data-original-width="492" height="212" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyWVg6XzSiqkogCw6Y6kK7RcS3QFJS4XEoGIPX9y8QL4-9ebKZqBt3jqAoVtxzH6tGWQ2UWw9SPARegN2DzP3hBqFS-NH3iLPKbopV2MLqEYSRuyYs26GXQnvZKA4nDqsQAr6eF3gqjA2M/s320/date+method.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
how to achieve behavior like that, answer is extension method. 
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Extension method&lt;/b&gt;
&lt;br /&gt;
Extension method (programming language C# has this feature already) is way to extend existing type without modifying actual code file, means with help of the extension method one can add behavior (operation or method) without touching or modifying actual implementation file.    
&lt;br /&gt;
Now question arise how to create extension method, answer is by making use of &lt;a href="https://www.typescriptlang.org/docs/handbook/declaration-merging.html"&gt;Declaration Merging&lt;/a&gt;.
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Declaration merging&lt;/b&gt;&lt;br /&gt;
Declaration merging in typescript allows to merge two declaration, for example if do like as below in typescript
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt; 
interface User {
    name: string;
    id: number;
}

interface User {
    email: string;
}
&lt;/pre&gt;
&lt;br /&gt;
and when create object of user as below 
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEir12Qe7adJbh1SQCcP5bfHucRLMOZ0MtKyjHLf5O4wkt3-_xoMlki9MgL1-TI_pj8Ukxncu9E8m98T_pFJjg9zNArgyEUyDGAczploh4ioxRGVWPUSj6aTqp9nyMnfoZrUn66PUC7f4p8c/s1600/date+method.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="455" data-original-width="486" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEir12Qe7adJbh1SQCcP5bfHucRLMOZ0MtKyjHLf5O4wkt3-_xoMlki9MgL1-TI_pj8Ukxncu9E8m98T_pFJjg9zNArgyEUyDGAczploh4ioxRGVWPUSj6aTqp9nyMnfoZrUn66PUC7f4p8c/s320/date+method.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
email is also part of User object as in above screen shot, it because of declaration merging. Compiler under the hood create User type as given below as it merge both the declaration of User interface defined above.
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt; 
interface User {
    name: string;
    id: number;
    email: string;
}
&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;Extension method on Date Type&lt;/b&gt;
&lt;br /&gt;
So based on declaration merging, extension method can be added as below.&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;interface Date {
    compareDate(date: Date): number;
}
&lt;/pre&gt;
&lt;br /&gt;
above code defined interface called Date with method name &lt;i&gt;comparedate&lt;/i&gt;. So this will merge merge method called compareDate on existing Date type.&lt;br /&gt;
But above code just add method declaration without its implementation. Below is code which provide implementation of compareDate method.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;Date.prototype.compareDate = function (date: Date) {
    if (this.toLocaleDateString() === date.toLocaleDateString()) {
        console.log('equal');
        return 0;
    }
    else if (this &amp;gt; date) {
        console.log('greater');
        return 1;
    } 
    else if (this &amp;lt; date)
    {
        console.log('less');
        return -1;
    }
}
&lt;/pre&gt;
&lt;br /&gt;
so once implementation added , compareDate method get added to Date type of typescript and ready use. Below screen
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_adX9iv3Bmt5cKYlIqFw7UuuG3pHqhNWN_HVmHL1vjy86igM5oNKxN7WCtD9lcJGGOkyouaUnrp660bA5SOx3PluVSMYUWMXZ-5dsfovx4uKv5tyn_zG1Fk7MjkvaVR_6oHnwxd3crPr9/s1600/date+method.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="463" data-original-width="620" height="239" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_adX9iv3Bmt5cKYlIqFw7UuuG3pHqhNWN_HVmHL1vjy86igM5oNKxN7WCtD9lcJGGOkyouaUnrp660bA5SOx3PluVSMYUWMXZ-5dsfovx4uKv5tyn_zG1Fk7MjkvaVR_6oHnwxd3crPr9/s320/date+method.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Below is output of compareDate method.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgekLvCYtQDybyYIw3ooHwjIRCcJLjwhTOAiJiu-GjKDunGDLeUpZ1W92QQGSp7Q3HvwQm7l5qd6TG6GenQPPyloXHVaEqFlb89iDR-gU8EAwChDE-rxmGO33rB_0KhJ_iholt3EkK2JYcS/s1600/date+method.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="269" data-original-width="496" height="174" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgekLvCYtQDybyYIw3ooHwjIRCcJLjwhTOAiJiu-GjKDunGDLeUpZ1W92QQGSp7Q3HvwQm7l5qd6TG6GenQPPyloXHVaEqFlb89iDR-gU8EAwChDE-rxmGO33rB_0KhJ_iholt3EkK2JYcS/s320/date+method.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Code to test&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;var date1 = new Date('4-3-2015');
var date2 = new Date('4-2-2015');

console.log(date1.compareDate(date2));
&lt;/pre&gt;
&lt;/div&gt;
</description><link>http://pranayamr.blogspot.com/2018/02/extension-method-type-extension-in.html</link><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyWVg6XzSiqkogCw6Y6kK7RcS3QFJS4XEoGIPX9y8QL4-9ebKZqBt3jqAoVtxzH6tGWQ2UWw9SPARegN2DzP3hBqFS-NH3iLPKbopV2MLqEYSRuyYs26GXQnvZKA4nDqsQAr6eF3gqjA2M/s72-c/date+method.png" width="72"/><thr:total>0</thr:total><author>pranayamr@gmail.com (Pranay Rana)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1194836729866470946.post-4116995788443758064</guid><pubDate>Sun, 17 Dec 2017 19:27:00 +0000</pubDate><atom:updated>2017-12-17T14:28:05.146-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">AngularJs2</category><category domain="http://www.blogger.com/atom/ns#">Directive</category><category domain="http://www.blogger.com/atom/ns#">Structural Directive</category><category domain="http://www.blogger.com/atom/ns#">Typescript</category><title>Dynamic Html Structure with - *ngIf, *ngFor &amp; ngSwitch </title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
Directives in Angular Js 2 is used for structuring html document(DOM) (web page) and for changing behavior of html elements (Html page element like &amp;lt;input&amp;gt;, &amp;lt;form&amp;gt; etc.). Following kind of directive provided by angular js 2&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;Component – is most commonly used and most of the developer aware about it from the first day of development. One cannot start learning Angular js without learning it. It is only directive which comes with template attached with it. @Compnent is metadata value by which developer can make mark created directive is component. More at:&lt;a href="https://angular.io/guide/displaying-data"&gt; https://angular.io/guide/displaying-data&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Attribute – is directive which can change behavior of the element (html tag, component), with which is get attached as attribute. Most common attribute directive is ngModel, this allows bind element with the backend typescript object property, and provide (oneway-twoway) binding between model and view. @Directive is metadata value by which developer can make mark created directive is attibute directive. More at : &lt;a href="https://angular.io/guide/attribute-directives"&gt;https://angular.io/guide/attribute-directives&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Structure – is type of directive which can change structure of html document. Directives are capable of adding-removing elements in html document. @Compnent is metadata value by which developer can make mark created directive is structure directive. More at : &lt;a href="https://angular.io/guide/structural-directives"&gt;https://angular.io/guide/structural-directives&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
Angular js not only provide some build in directives but also provide way to create custom directives , find more at : &lt;a href="https://angular.io/"&gt;https://angular.io/&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Not going in much details of directives , how to build them as post is focused on three most important structural directives *ngFor, *ngIf and ngSwitch &amp;amp; how to use them to build dynamic structure. Before jumping in lets understand this directives one by one&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;*ngIf – &lt;/b&gt;is in build directive which allows to show or hide element on page (i.e. to control display of element).&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;pre class="brush:csharp"&gt;&amp;lt;div *ngIf=”IsShow” class="alert alert-danger"&amp;gt; Display Error!!! &amp;lt;/div&amp;gt;
&lt;/pre&gt;
In example, IsShow is component model property which value get controlled by logic. For example : IsShow=true then is error and div get displayed or IsShow=false then is no error and div get hidden.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;*ngFor –&lt;/b&gt; is in build directive to display element repeatedly on html page. It basically for loop on html document to create similar element on page but with different value and it works with Arrays of object (object can be user-defined class object or in build type object). &lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;b&gt;AppComponent.ts&lt;/b&gt;&lt;br /&gt;
&lt;pre class="brush:csharp"&gt;export class AppComponent&amp;nbsp; {
&amp;nbsp; items:Array&amp;lt;number&amp;gt; = new Array&amp;lt;number&amp;gt;(1,2,3);
&amp;nbsp;}
&lt;/pre&gt;
&lt;b&gt;Component.html&lt;/b&gt;&lt;br /&gt;
&lt;pre class="brush:csharp"&gt;&amp;lt;ul&amp;gt;
&amp;nbsp; &amp;lt;li *ngFor="let item of items"&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {{item}}
&amp;nbsp; &amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;

&lt;img alt="" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEMAAABJCAIAAADpMwxCAAABlElEQVRoge2ZvY2EMBCFHVAAJRCQO6EMt+BOaMDdOCOgDCwRuBDCd4HvtN6IH+34nlbzxYzgw8DMwwbfgvnvC/gYasKHmvChJnyoCR9qwoea8CFtkoI1xoYkfBoIm0RvjDGsJsdxrOu6rutxHFeOT8EymuScx3EsN3oYhpzzaQmpiXPOVDjnTktITfq+r036vj8tITWZpqk2mabptITUZFmWruuKRtd1y7KclpCaANj3fZ7neZ63bbtyPK/JXaJn7Sd3+OuMTbqjzl18qAkfasKHmvChJpd49XgfJc8DQNIkBft7/SnYBjJiOT6GatBKwYqriOf4QvRkJg9yPICyJlxP14McDwApWPmIIp7jAUTfImq1yPENPsEQz/FtlgOAbGeMvn7NU/CiUlImpRu+Ibw6OnfxoSZ8qAkfasKHmlziS3L8a+pqkX0Fc3xK1ZQVPdv+ycMc3ySjyOf4JtEX0jm+mu3J3pNnOb74SC+MeI4H0GYrW3w/vvAehEVo0uMJ/3fdoOlePKBzFyNqwoea8KEmfPwAS9hrs45szO4AAAAASUVORK5CYIIA" /&gt;

&amp;lt;div *ngFor="let item of items"&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {{item}}
&amp;lt;/div&amp;gt;

&lt;img alt="" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEkAAAA9CAIAAABuotNcAAABCElEQVRoge3a4Q2EMAgFYDZiIgZiG4ZhH/zRu9i7RK2J5/kob4J+QYUSKfKG/n2AH6ZsmCkbZqa2uTIRq99xmIuzbzMhIsppi2iFK9vTUrayPS1ly2ozydnf3r0bs39PPU8Cp2yYKRtmyoaZeW3rXCJ204EuzI7NlV8iV0bkbdtMuwHSlfFwo++bSVqbK8PRBm2ujHfFGbOZAMoGdwpwT2PLkQ20ZBFxYDPpPyCugsXctLV+/RG0Cs47T2KnbJgpG2bKhpl5bWn3Jes0CblR2LO5d9OjCdw0eeLejVe2ERvmQiEObd1NB69wQ89kE8IV78QOL6vta72AkTn3k9j/lkTMPE9iJ7NtAS81Q/3lMFAOAAAAAElFTkSuQmCCAA==" /&gt;

&amp;lt;select&amp;gt;
&amp;nbsp; &amp;lt;option *ngFor="let item of items" value="item"&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {{item}}
&amp;nbsp; &amp;lt;/option&amp;gt;
&amp;lt;/select&amp;gt;
&lt;/pre&gt;
&lt;br /&gt;
&lt;img alt="" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAABtCAIAAAByTJV3AAACK0lEQVR4nO3Zy07CQBgF4HmjLnTJu3ThzsTEN2DtwnTlwoWJW6NIqCGN8ZKI+hBewiCIUWKClwqKLXWBQkWQKcz8nUnOyVkABfplMpnSgUUGhqUNmCZAU2U0mleqB0el7dyeeDPZgnhXNvK8UpWMrtYaD49Pib4oky10wq5gFzdO13In8tFJv6iHbrRCkXbCbiZb0AV93wpFqhf67i0UqV7oWz8QqV7om9dApJTo4gKbX738D11+CURKhC4uMMYYm4S+fg5EqtdIXzwFvbJR6R/VC318F/Y7JI4f0gt9WA/i7YuHXtcLvV/7HCpj7O+LeqGL1Y5I9UK7lQ+REi95Y9e9HjpffhepXlfEneu2SPVCb121RAp0DK30zmV582xttyQZ7fvt2kMzURPdI667577floxeSimzoufWI+ICDTTQQAMtCc2jyDUI7Ta/32AS2siRBhpooDVA95e8KIpe6oaglRZooIEGOjW04OclBmiqAE0VoKkC9CCePfhbzvamxY2LGjR3bIf/PLSY9fNEUtRPD+5YsgdbOdrEkfZsBZNaKdqzmfRRnnjSX0mKVjLGk046nMRLniLx+JOOSBJ0fJlWsFbjikgVoKkCNFWApgrQVAGaKkBTBehB4j+o5d9wkex7GLeFYOS+h2fLnx8K0dyxjNrLi8fE6aFigihBc8cajK2CLRBVS55l3v604gBNFaCpAjRVJKBTyUxozQM0VYCmCtBUAZoqRqK/AMCdFcJOOV8jAAAAAElFTkSuQmCCAA==" /&gt;&lt;br /&gt;
&lt;br /&gt;
In above example *ngFor works with Array of number and display all number repeating element. In 1. Case it displays list of 3 elements by repeating li element under ul, in 2. Case it displays 3 div element by repeatedly, In 3. Case it displays 3 option in select list.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Note: &lt;/b&gt;&lt;br /&gt;
*ngFor can decrease performance of your UI if not handled correctly.&amp;nbsp; Because *ngFor works with arrays and if any element removed from array or added in array, *ngFor remove all created element from DOM (html page) and recreate it with the new values. &lt;br /&gt;
So to avoid this behavior Angular team provided trackBy to this method to *ngFor directive to track changes.&amp;nbsp; It works as below&lt;br /&gt;
&lt;br /&gt;
Example :&lt;br /&gt;
If model is like this&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Employee.ts&lt;/b&gt; &lt;br /&gt;
&lt;pre class="brush:csharp"&gt;export class Employee
{
&amp;nbsp; Id:number;
&amp;nbsp; Name:string;
&amp;nbsp; Designation: string;
&amp;nbsp; Department:string;
}&lt;/pre&gt;
Then your html component html will be like as below with trackBy&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;AppComponent.html&lt;/b&gt;&lt;br /&gt;
&lt;pre class="brush:csharp"&gt;&amp;lt;div *ngFor="let emp of employees; trackBy: trackEmployeeById"&amp;gt;
&amp;nbsp; ({{emp.id}}) {{emp.name}}
&amp;lt;/div&amp;gt;
&lt;/pre&gt;
&lt;br /&gt;
And in your component.ts you have to add method for trackBy like as below.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;AppComponent.ts&lt;/b&gt;&lt;br /&gt;
&lt;pre class="brush:csharp"&gt;trackEmployeeById (index: number, emp: Employee): number { return emp.id; }
&lt;/pre&gt;
By adding trackBy Angular Js track element and do not recreate full structure when element get removed or added in array.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Index :&lt;/b&gt; like for loop *ngFor also allows access to index of element, one can access it as below&lt;br /&gt;
&lt;pre class="brush:csharp"&gt;&amp;lt;div *ngFor="let item of items; let i=index"&amp;gt;{{i + 1}} - {{item}}&amp;lt;/div&amp;gt;
&lt;/pre&gt;
&lt;b&gt;ngSwitch –&lt;/b&gt; is directive which is similar to switch statement in programming construct, it only emits element in Html page (DOM) when condition is matched.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;b&gt;AppComponent.ts&lt;/b&gt; &lt;br /&gt;
&lt;pre class="brush:csharp"&gt;export class AppComponent&amp;nbsp; {

&amp;nbsp; items:Array&amp;lt;number&amp;gt; = new Array&amp;lt;number&amp;gt;(1,2,3,4);

&amp;nbsp;}
&lt;/pre&gt;
&lt;b&gt;Component.Html&lt;/b&gt;&amp;nbsp;
&lt;br /&gt;
&lt;pre class="brush:csharp"&gt;&amp;nbsp;&amp;lt;div *ngFor="let item of items"&amp;gt;
&amp;nbsp; &amp;lt;div ngSwitch="{{item}}"&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div *ngSwitchCase="'1'"&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; display 1 
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div *ngSwitchCase="'2'"&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; display 2
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div *ngSwitchDefault&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {{item}}-- display other element
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;
&amp;nbsp; &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/pre&gt;
As you see in above html, ngSwitch is similar to switch statement in programming language, similar to switch …case it also has ngSwitchCase. So when above html get executed then for array value 1 , it display 1 , value 2 it display 2 , for value 3 &amp;amp; 4 it displays&amp;nbsp; “3—display other element” &amp;amp; “4—display other element”.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Important note: &lt;/b&gt;&lt;br /&gt;
Important point to not here is, one cannot apply two Structural directives on one html element like as done in following code.&lt;br /&gt;
&lt;pre class="brush:csharp"&gt;&amp;lt;div *ngIf="items.length&amp;gt;0" *ngFor="let item of items"&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {{item}}
&amp;lt;/div&amp;gt;
&lt;/pre&gt;
So when above get executed following error get displayed on console of browser. Which says multiple template binding on one element.&lt;br /&gt;
&lt;br /&gt;
It can be easily get resolved by doing as following&lt;br /&gt;
&lt;pre class="brush:csharp"&gt;&amp;lt;div *ngIf="items.length&amp;gt;0"&amp;gt;
&amp;nbsp; &amp;lt;div *ngFor="let item of items"&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {{item}}
&amp;nbsp; &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/pre&gt;
&lt;b&gt;&amp;lt;ng-container&amp;gt;&lt;/b&gt;&lt;br /&gt;
But problem with above is one more div element get added in Html page (DOM). So to avoid it angular js provided &amp;lt;ng-container&amp;gt; element , which you can use as below&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:csharp"&gt;&amp;lt;ng-container *ngIf="items.length&amp;gt;0"&amp;gt;
&amp;nbsp; &amp;lt;div *ngFor="let item of items"&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {{item}}
&amp;nbsp; &amp;lt;/div&amp;gt;
&amp;lt;/ng-container&amp;gt;
&lt;/pre&gt;
Now there is no extra div element get added on html page(DOM).&amp;nbsp; &amp;lt;ng-container&amp;gt; doesn’t affect structure of html page it used by angular js only just to note that it container which is having group of element under it.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Dynamic Structure with Structure Directives&lt;/b&gt;&lt;br /&gt;
Above is very simple and easy example with the structural directives, and it shows how you can easily achieve things in html without using line of javascript code, which developers are doing without angular js.&lt;br /&gt;
Now question may come how complex dynamic structure one can create with help of the structural directives ? to understand lets consider below example :&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;AppComponent.ts&lt;/b&gt;&lt;br /&gt;
&lt;pre class="brush:csharp"&gt;export class AppComponent&amp;nbsp; {
&amp;nbsp; newTmpArr = [
&amp;nbsp;&amp;nbsp;&amp;nbsp; ["567", "2017-04-17T14:22:48", "45000", "button"],
&amp;nbsp;&amp;nbsp;&amp;nbsp; ["568", "2017-04-17T14:22:48", "45000", "button"],
&amp;nbsp;&amp;nbsp;&amp;nbsp; ["569", "2017-04-17T14:22:48", "45000", "link"],
&amp;nbsp;&amp;nbsp;&amp;nbsp; ["570", "2017-04-17T14:22:48", "45000", "button"]
&amp;nbsp; ];&lt;/pre&gt;
&lt;pre class="brush:csharp"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="brush:csharp"&gt;&amp;nbsp; DoWork(ele:any)
&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; //here you can do work , this get 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //called when you press "click" button in table 
&amp;nbsp;&amp;nbsp;&amp;nbsp; alert(ele);
&amp;nbsp; }&lt;/pre&gt;
&lt;pre class="brush:csharp"&gt;}&lt;/pre&gt;
For example, consider above data received by application component from external source like json File or from web service call. &lt;br /&gt;
Now requirement is as following&lt;br /&gt;
&lt;ol style="text-align: left;"&gt;
&lt;li&gt;Create html Table structure using this data structure&lt;/li&gt;
&lt;li&gt;Where ever property value is “button” html button needs to be get created &amp;amp;&amp;nbsp; when value is “link” html hyper link needs to be get created , and display other values as is as text element in html.&lt;/li&gt;
&lt;li&gt;Created link or button element must call function ”DoWork() (defined in script file above)” in script to process further. &lt;/li&gt;
&lt;/ol&gt;
Now if think of javascript, to achieve table structure with given data how many line of code needed. But in angular it can be done very easily&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Component.Html&lt;/b&gt; &lt;br /&gt;
&lt;pre class="brush:csharp"&gt;&amp;lt;table&amp;gt;
&amp;nbsp; &amp;lt;thead&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;tr&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;th&amp;gt;ID&amp;lt;/th&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;th&amp;gt;Date&amp;lt;/th&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;th&amp;gt;Ammount&amp;lt;/th&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;th&amp;gt;Action&amp;lt;/th&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/tr&amp;gt;
&amp;nbsp; &amp;lt;/thead&amp;gt;
&amp;nbsp; &amp;lt;tbody&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;tr *ngFor="let ele of newTmpArr; trackBy: trackByIds"&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td *ngFor="let val of ele"&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ng-container ngSwitch="{{val}}"&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ng-container&amp;nbsp; *ngSwitchCase="'button'"&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;input type="button" (click)="DoWork(ele)" value="click" /&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ng-container&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ng-container *ngSwitchCase="'link'"&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;a href="#" (click)="DoWork(ele)"&amp;gt;click&amp;lt;/a&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ng-container&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ng-container *ngSwitchDefault&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {{val}}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ng-container&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ng-container&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/td&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/tr&amp;gt;
&amp;nbsp; &amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;
&lt;/pre&gt;
It display below output in html page &lt;br /&gt;
&lt;img alt="" src="data:image/png;base64,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" /&gt;&lt;br /&gt;
When button get click it display as below &lt;br /&gt;
&lt;img alt="" src="data:image/png;base64,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6qGueiqKsnPnrtdee/2rrw5Fb1PVBVdRlLKysr799jvjiUePHl28uOiBBx4sKiqO3qAqirJt2/a0tPT6+oazZ88pitLZ2VlTU5uePvPzz3cov+o2NVKD2tvb++abb37xxReKopw7d87j8ezbt0/Fv3HjxrNnz9oIH5fya1/fftT2d+d05vDfG+aSvd9/gUpX7BvYTy58s+WFTV/xf7u47a0nW4KrD/UpF08e/tvbG957771Xnn32rY93K0rfzn+8s+7Vt95e/9LL7/xfl6Ic27X55Rde+evbbzzz/Bvf/Zg2PJZiKZb+kxLbnkX6vyV98MEH06dP9/v9L730Un5+/pw5c2bPnr1y5crXX3+9pKRkwYIFjjN2vb29n3766bPPPosxnjdv3uuvv7579+78/PyWlpYnnnji/fffZx3jABvU1157bUh3d89nn32mZqjN5Hfffbds2bKEhITnn39+8+bNHzLp73//+/bt23t6epjQpN3ffPON0aB2d/ecOHHy0KGvDx36+uuvD3/99eFDh74+fPjI4cNHNm58b9269QcOHIyy5trb23fq1OmZM2c9//wLiqKow02/P5CcnBwfnzBs2L2LFxcpkRdE+/qUjz/+v6lTU2bOnNXZaRbHqVOnZ8xInT59xubNn/6KY5QiNainT59+6aWX1P93dXVt2bLFsIP3339///79NmP7oX1x01s7flCUvq1vPLN27RObvtRuePiTt9euXfvim9sunP/Xq8898cRTLx85r1w8tqm5UN73/ZerGute2fjGE08+f+CEOrA8/9ErT65d+8z2r88qiqJ0frXhL0+ufeqdo9//a10w7/7Uko1b9508/u3h784oivL1lr++9Ob6F1994+CFnt6uC+e7ehVFUY5//vyL7x4/s3/dS68dVxRFOfH6cy98cfzr99a//MWpPkVRNr/+3Ds7volU02IplmLpF5Q2b968cuXKDRs2KIry4Ycfrlix4t1331UU5d13362qqvrwww8df/X++++npKQAQF9f38aNG7Ozs8vLy48cOfLtt98WFRXNnz/fcYR67ty5FStWpKenE0Lefvtttfn86KOPHnvssblz5+bl5bGOcYAN6oYNG4Z0d/d8+umWc+fOK3qD+t57740aNWrSpElpaWmJfJowYUJZWdnFixeNi3fv/pIdd/b1Kbt3f/nSSy+/8sq6devW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z75g0dodza71D876t0s3vvvGHTfe9NOnl189/+otHx341eMrVqxYvfGdfU3THNy44vSTF21tmqZp3v/18tNOmbcuztB2XH/ehfWDa1mW52699oIrHmiaA79adtNtq3+5As69YdUWLez6R289/fQ5PwnT0UPbb730zNm4LMxND+7e8p2li9c89xTMvuiVQ81bv1x+ycknnfxPx19+82NhOHHowPs/vKm/8tmfL53zzWd3N688AGddOLFyxQqYf9mqJx44+0K36cPm3RfuHT/jyru/d/0l/Sebprl7zoW33HbnnPFr1mw62Oz46cVfOScs4x767auL5py1tmneeqiHd93sL7r0uoc3NzufPuvERS++/sScM6/79bbHv3Xm9Rt/++zsr12+q2meu/Hy3k333XHVRbNvXds0G77xlYue25Esi5c/4T1UXSnJOPYpuH0Ywu23+Y2i269Gc/v1NLn9oAhVSoonpaV2wi1EOS/eAdZ0X7G2E8lDroLaHoZfrbS2TvlQVSlpwpTMIG1tJRcOR1eqRkZyCOpkUj5eyvO2PlpyB1QFIw5VRPL2fXw0xQnmpDvBVkrqZZWSRM20UlKrXqHHJpJ6Q+TuO/AFUWs1zhgJnzbWguTgEf1EUimJ+hyV9+/lkms1QxIZCD6ulGTxYYqPKgql+FoqJZEdQglflDyplNRT27eJ5KPhQ8YXb8IMnx41Vt34IHaCb8GHpGZvID70kODDVnwjJSV9+GGciv3s+rMmVy6D+Uu3NU3z9spvfHnOW03z/lOTJ18yqUOOB99dC/POuvqOZ5qm+WDtAxedd3vTNMuvvPDS69c0TdM0Hyw+98LFK19tmubAtqe+efZ5P337UNMcfPKua8bH59+7ZtXE2Vf9amez56V7zznDP/zgoi988aSLzz7u8//3H8MDz/zAj4+PV0+t39E0zXsv3Hfav10THqhP3Tzr7P5j9PvpA3XN0qtmXfNo02w68x///N/Pv+TLf3LsX5xVbaIY6C8fXXzmOQt/Eaa6uzdcf8XZC65/gp9LW9f4P/njf7541qn/z3/+g4kH1iyec87V929qDrx21j+duuo3h5qm2fPSd//yT750wSVn/+l//t/PWPLjDz6MX31qyZlLHll+zTev/fVBmaFefvnKpmmWfjPOUB9bfzDMUDeGZ/O2V65z87c2zVsPXrHo29f3zr/05ie2Nx89d9bJVz336sMXnFa/tP7h80+bfOX1VRedjIea5pU7erj0jlsWLfL3vdo0L537lUue2SGz+I5Pvn3b4bp9/Ey5/THvpc4FoPdxzTbedeBVWgS18kwO6ZVHMwGiVd+4iEpPeEBziGoRiWeodEGp4kg1lz2P7jXF2BpG93XNipiJQhz7106P7mmmpSVHWu/SkvPMALOhSklyX5I8CgOqMohuLUru1URBJAdvx2tChADZyLmqlBR4uXQsCUhvl6ohWJzJidbe4pNXlsOvc8Te99rx5SNNkjzFBwYfMr66E5+n1dHE8HJ8bhC+ui7gQ3XXseG5FsPzRcOzncCtssCVGJ4q7IIj4iMiNEPlUALzEsMzGUyklzE8g2+EWr4fPfPgt+dcPXnfffctvgx+8da7z9x9xRW9W26ERYuWrjrQNI8uOv/Kmx9pmqZp9m96dcNvfrth/F9/7w/+4YIfrHhkxeqfvb997RWnfW3R4hvPO//i5S+Gn3u/+voZ1QMvN03z+sM3zrpw0Xb7e/cvOufMS+re+HlX3P3s7vc2P/uznyxbOvdvvvh3yzYZad/9xd3H//OlbzZN0+y+/hsn3/YznnR+gKeecc33X+AzH/Xzzpj3g6bZu+mV55564vGL//m/nIYrf/P2my+8+Pqrj139v/5P/2n2Dfc+vPzBFzdu6J36h7/3F6fd89CPVvz4J9t++9uXnv/1B+9vef7Zpx+7F//xz/7s+y+/sXzJ7FO+hfd/55qTvrbghfffe/nFDR/s+O1Lz//0iZW3Hfenn1+yZsMzy5bOWbTkvvvuW3J5/cI7b91/1Tlnz1uyaO65veWvfLT1p+ef9B+Lr++ffuGVL+346Jlb5v/HuYsmr5x1yQ2P7t+57eVXtn60c915x/2/85beufCb59399Itrrhs//UL/3Rvn/PVfzHpx60/O+KvT73nkzlP++vTV61+74dIzFl1/+/i5F33/Jy/fOe/Cy+94sWme//e/OfvpD4Z6oMoG49Pq9jv8xlBuv5662/fT5PYrQB+2bwtj5/AdjiEBxgUuoHXqEJtFTmChFXA+Byi9BbMsCW516ruoD5OTKe0CO1oTyYc7OdGLW5WaEn8GWltXJyMYmW26B+nF/6v706ke465ukxySTsDIGNo7ASw+p343TPs68PGhdBSYbnSQ9KpEMuiLA/C1SQ55J4CRPFfT5nZ5I/kQ+HQncHyX/zcRxuIr9Xk7PrRqsvHQObHViV7almx/jojPWcNzKv4EJTX1pYxedCOD6oT5Qxd2OLRn6w++ffXChQtX/OKNpmma/W/cfvXCq/0P322apmle+8man6+N87vvLXTLnnryoe9ir9dbdNXC6qbvv9s0H6x7fOHChT/4yWa63v5frX78V5vfa5pm+/rnn1j9Yhr4O7D1O4sWXnvzjySddfcbTz/5syStdt876x99+LldTdM0u597+NH1v+HT97+w5vFfbpDH9JYXn3n8Z5Llu/nZx175zYf7tr386GMvbn754d61vd61ixYuvOqxn6999HvX9XrVNVcv7N1w1683b/rx8qd3xS5475nH12xvmubgW/fceM3Chdc8/fqu5sMt/qKr10bp9z+/5tFtHzXN3jfvvfGqhQsXPvyrLU3TNPs237JwobtjTViN3vTTBxYuvGrVyzHL9/766oX9H+5omr3rfzaxYMnbzb5XHrvj2qurmx74yaGmad57+dvVVYtuvuPRlS/ubfY9ccetK3/yyx/fefuql7bteOvnEwsX3rLsl03TvPbUE8/9+t2meWf18iffVnlSHZ8wQ/X15LS5/UF+Yyi3n//u0G5/eL/R7fZD6xgHk/k89OaWVs9Xz62oOqIS9y11f7hf+Ar22awU1tFp66/B/BwX3QjeIYpauBTXGwoxZBZDSZ78XOFS6jnk1GF8AMhG63FjS51PK50Qc8BUJ9huBEowo07gqL53gBjq8pBsiNKB/NoS9XYRX2oTDjx3guvE5zQ+r3Nl2/DFTkDBhyk+YHwIRi/VJ87i048ldSmND0C0Rj8IHyT4MsMD0drIhp4iK7KdciJbOFMkN5aQ4cMCPu1uXEjSllpFGT5reAafSmjM8RUMD2MQqAVfzH7kG/ljqJR06LUX1769fde0XvOT+zl4cO8LP39x34Ghwpbdnz2733/xFy8Pl1E0DZ+wH2rdn5xet68M73ft9pOn72G6/TGbhYSoc0MAkbJaVCuvyxWTkmRJCigmREEatK3eQWxFFRjjQ7UuV+sF7hheou96XSV5YFKSHErAmdylympRipBepQwmtabhOdpkkpKiBdByWXS4oqaqvW5W6h2w1kZyNHo5Krae60XRQcJHFqYuVchqEclzfFpyGk6RIrE4vkiOBp9LV2MsvsTwXIZPGV5FzzwhkuHTRIr4nMaX6oXd+JzC5zDGTspJSZ34qiI+FHzh5ldJSSk+GB5f8f6y+FyCD8r4/IhJSTOfz9gn374N0EQiRnb79rDs9ot+o83t50lJv0O3P1ZRvgyqQlCVzmrRpXYAKVVEtOUYLzhqLezjk24WxvEkKcOGUlAjHGp/gb6uqjSrJcn+8Gl0Opa9MCfzPj4xdq30ckYvDqSXotNel6RJKHoqWFPpS9WxfgJiVESt42vJpRPCoWqtWc0gOfPi0FdFCDBWFDL4XAu+XHJnJa9c2icZPm/wYYaPDkv46m58DtQedrpOnh5dteCr+ElfwlclN6Hdvi0pP9Tj7duqgl7kPqSsEmZqwoj4qmnDl23fZvBFRZThJfiM4cFMpaSj+JMnJYFrMbyj0u2P6We4ow1uZAStx8gQklxoooCxFX2/ZYZqJwr83kVFrYAm6V/erPDOzvOcTeuvAB0AVZmRyTsl4JD70IMRJXlQMy+1E3xoHIxU5SkOtqiJXm3CR5KDfV0BMX0rw4F+hSMytnNQ1AlTZrwm9ieZIwZfsLB0kIX6MODTpXZa8UmCe5Tc4sN2fKnkxSJBMkOFIfDpSknYhc9pfNrw7HcZnwP18klQUyfuIzoAbZYy3O7Epw614XXhg0H4QOFrM0uv6yglehE+5IU18zZXO76ZWr5H8Ydr+R5Fbr8awe2PVVk4Kpzq8jAbF4FTQRfIcih0UAco8hQOXVwur6U1OVktSYNaWy9eikUNc/+QyBofJC2SO4h68aVyySlcVFMnYHapXPJaujGJJqaSo7OL+EoMk/gTv4JSRoCeDR2Sp/iqdnzO5gKMhK9K+yRLWUrw4RD46IIdhjcqPt3JnYYXT66Mml2dQGqK5K34dCcAF20oqqnCzErNFny58ZhwVLfkHfiCr5FOcDk+HD4paebzGfuE0oO+3/8Mu/34c07fUC1un+9QEnXMKMN3qcOoQBQld8FUvSl7+jryMvEuzboDs3tY952Tnk1dle5Zuf8h9chAw6Ki5E5VxqILFvRiV5J5rtCzBdmKkkPaCbSbafsDNVxKxfzFBbOCpT4v4WvpBD5swac6uRVfq+RkS5nkjiTXN4bFx7INwEeXCi+utOFLOlkZXis+B97lz8iS4bU9UFvxqT5p73NteK2doGxJS17G16JXp+FBp+HNPFCP4k98oIZK9x+L2y+0/o7dvn6gOvNAHeD2K4djvGeNs4tO8Tv0bnhwXjhgybfuda8ZOvS+3+NQNqStYVWaFMjm/lQluQIMe6l3zP1jNGvouX/Ppnv0UsnNki/V70CgSFhxyRftki8U1jRalnwpPuGyJV8sLvkqfLLeyEGFYZd86wFLvozPKGKXfGP8T6tpJI/F8V37ku8w+LIl3zZ8ask3NTw+jPjI8NqWfGOZQ6dbS0u+WMA3YMlX327OLvm244N0ybeMr0fvobLRWkB2yXcQvrDkOz6z5Hu0flavXj179my75PsZd/u9Udy+TkpSa8qUDMJZLRJKoWQQzvOk6LQHJ/vdsK/R6skhUHS6aotOp+ke0xqdNrkhLku2StJYomPKSmZgOTrtOftDPBEnJWGelOS1mlNMSorFPnRWy0B8yPh8fA8a2yRP8bkcX5KUlOHrSkoagM+lSUmJml34quxQFCknJak0sQRfleADsJKX8Gm92pOSWvBV04YPnDJLwidFnSBNSkrwzSQlzXziJ0tK8uBaDO+odPtUyze8rqDeXqgcP9J5SioP/Oh6+AE84LWZpBX0A78Kz3JQ2dVdr83EITOPvjHLn65YWx596ImC4/xplJNpMOJapgLJxK5lJocY8qe1IvLehRpzcRA+eW3G6ZMFWyXDKKWX3RBe6VXCl7x3oRUZEh9YfHpubYrBIhZem/GU85Li89lrMwV8qeGhAZThg0H4TJY/2LR+OwcdiA8yfGjw+TZ8lbSqZ7laC9Ej6CI+GB6ft/h8AZ9L8CUzVGckn3lt5qj9rF69+luz53bU8v1Y3H7mN7rcfnVk3H44LBd24MBqpfIgAM2rr7zoXEn+hbx4Hq6GsgYti93BbenX3h20v+ErPxcWFWMQjkV1WrbkDV/PsWsRAynWyHrx0oFIDlpyzycHc7GSyxu+SIvp+odAqm1R5Dyc3F7YoVKHWCzs4G32U2tdjgQfuqJeGh+3anyqMoAC5MHgy/XCBJ8jg3YUbsGkeEJS2MHHn8stQeODw8KXGZ79IdT4YnrOEIUd1I4uFp+5v2yPGUCCz2t83ujF1dEoqKNboVTYQd9fbHgSf2rFRxEmutTHUNhh5vPp+Ehhh5LfOGJuP/EbR87tU+lB8VzdpQel+h1Qdzj1vywWZLWgdEgZlOcCvmDbpQa14silBwutSk2BAcomuE+gXWb2yMA9dvilB5XkqETNO0HbBNm6tir7QxYfH4IyoDZ8bPp63FAoIWbxtUkOA0sPgkhFT18ljNJoMD4FKD6MM4iJMBZfqc/b8anTSp0AwgszMZIspCNQerBFcjdK6cGZz2fss2pVSEqaLN/sU3D7g/zGUG5/qNKDZbc/lN8Ywu2H1jGPsjckoA9LVcirTBzyBQT0XEk/JiXF6bZXYbM4v8YpVUn2tjg+C0O+QLI/HPAPxSrJ4WRe744nh1V+NK2ASEttJLla3cIpVUkmyWNfe2+qkKNe4sj1KkkeAmO6EwK2uMBIOehet1L9dJF8iOL4/rCL46PkvBA+KOCjZZ8Un8vwgcEXDM/sAVDEFy84peL4Kb6sOL4k71jDcy2G563hpfjUS+4JvqqEryK9hscHyJYAGp/L8HFxfJYNMsMz+EYojj/z+ax9pFLSJ8rt11N3+36a3H4F6L1X27eV9v+KaU5VeBhEXyO1Wihsq++6lqQks4FUdJo+Fp3h7dv4ZEDkXX44+8PmhvhqxH18fNy3MiwjgJHcAaViidPsik7X5lAH4UF3AqVG5wVrht2+TXUCUUz1GhJfQfKWqPtAfAXJQQBVahumPH2gV9p4TvAFvdT2bfRsSPBhii9KnuEbbvs2iy+K6mJahDK8UbdvS/GhwTf69m2J4XXjQ0nRH7x9Wxc+b/HNJCUdxR9OSpo2ty95uZ8Ftz8m7iOOUilOS0NmzuPH+ITnaQTVUTLRaXm9RD3S2YfGJ7zXW8uqEbRyH/HhHf6x7eEdJUd0iN07zcbf5R2qff5CgryuMOROs0xRQuWoB/uIeodqejaw1j56SU/IVVJSULNtg3GTF14zPtD4sg3G0Y7IAAUfF9MRyXN8KqvFq9EVDS21mnURH7bhA3SI2vAcKjWBvb/CVyghZIw2MzxgImqGqvDVNae/d+CzSWQxJiL4FCCkPAiLz2u9HHbho6SkguGNjM/n+MTwUOeUlfA5hS9IPpOUdNR+ihuMZwsno7h9fX8dCbc/6gbjZb/BtXzDKhmFXineRu+0VoBAK2mOA8IOQ9J/ODl0XPAIwGtKpJ4U+qEro0ro4JSKsAYtq3wcQlPuI15Kvc+E9L+oDpkx/zpdStbuwyFJLvkyGONPbZLzgqR3DoHy0CAuSrBeaq0M+WTOJJIrQ0lyvficSB5PI8kVAmSo6FvwQYJP8tyQ8LHkQOsnLr51avGpHG/CF+0PaHWlKDnSYstI+FyOzzG+2upVNDwyHouPb1HB5yTGk+Pjh9yU8cFAfNy9HMVpwwdd+DQvxgeo7r4EHxp82InPgZ9JSjpqP2GGWteT2u2T4XntNwa4fZ2UNNDt+1HcPo7m9unkaXH7MBaDxjG9wjvkDAgbmA11lOKdpiK66CuI6RXUHfFSQMmBhUvxxpDsZUBOBokAk0hAD2wMo5g4xOZWAC+yATqqFMWSg9LLxJ9ByYaqtUPypBOAxFOSS69Ccimf6AXUXYnk8TRKJ1OyWb00PpXbKQ/UrBNyfJwUOgo++d2Az7Xi86Qmys8JPq/xQUzkM/hcji8xS40PDb6qE59L8IGR3ApAhie6d+NDjS83PDcEPteBL+QMh7vPpF2w8bTgQ5/gUzY8GJ8D7xzOnz8zQz1KP6tXr5o9Z46v+zNuv+T2qVKSfgjHPAgSXW+ADhynJV/AZYtNq6lBU/NYxrRS4oO0hgm7kxk0B4RpvGD28YmSq9GEkpwupUbrLLmzkjsluUsVkVI7Wi9nFWHJ9WGiZo+GRVWul83WoU7QYXY97Uj0mhI+Z/HZqiVmEpkBqtT8SbViO75U8kpLjhpQEZ+axpXwQYIPh8AHrfi0mhhvY2NLuhVGxBcAdewQAC1qZmYpc0oxPCzfXy16acm9lVy0LuNzOD7zQD1aP6H0IPj6E+/2B/iNj8ntj/Uqp7IksBfWhUPmCGCvAtTbt1Erxt3BEOt6onKiD5V9cSrGG4SoOAwjlXe8PkRfT1QO637PIQCCbpXodJ+8f1K/Rseua0DPkiN6F16QD61B8gp93e9VLpbMoFbPL+/Xda9ySFpjXfcq5z2X2vGxZAYFn0In9KjelVWz5vodDjzr1XNxRVErAuh7oRMorp61hks5wNpxFI3i6gm+qhWf6GXwtVQGqZyKotVRTYsvRAcDPi0q14eSIiZQ1Mu14PO1gwwfAyriA6WmGJ7j4keMjwFN9BySXmD1Ynwh90oMj8s3ZoAMPteFr1L4SJF+AkjwwXD4ahuMJzWN4Sl8vVBHCWs2vByQxudmkpKO4s/qVatmz57bn5wc5PbdkXb79VTdfnb3ZX5D3H7PuP2Jyo2hKrXjVOWdSpcrozkNxqQGTsGqk2Kw/N0QZO1Rtk7U1oH3/V6FUndNyl547nrE2gEHhEU9PrkC2W1K5mp8aOtCVTp5R+vFow+rddSrYslFLyrqGC/VIzUrh1TUkepdkeQARk3HmWY8jEpaSXI7HyoMwapY+0NvV2Txsf1JEH4Avsriq9rw+QBI49O1fKW1KgHqwKd5deFTsyVWpB2fNjzPgFJ8ZcPL8ZnD6D5a8FnJR8DX0+6jBR8Nt3Ut3xZ8vjZa5/ggwweCLzO8me3bjt4Pvzbzsbl94zc+EW6/GsHtj/GMmHOuYpzWyzoeTXJZxBCYjXPqHq0LAXgIs3WJTsfEB7vKF1fP0aviLGl0Wk2xeZk+pqKE2Tqy5IAieeUQEbN1Bgk4g+eFhSQ6TZ1gJXdcb0hLjj50Ai/xq1buhFrpFZUNDwOnJEeV7gEoi37O6CVqaskpjYUlV53QjQ8TfBwqiJJDQXKzSAthpwSylhQfWnxGcru6YvG5Ej7XiQ8SfJgaXooPuYssIMGXpCxRJ4RnXodeiABlfCalYgh8MAV8KPhKhifLy9Xh4XMzlZKO4k+Iodb9SeP20bh9OHrdPoyFC6mEDo7Zehe2fLJZCSCH8u8SMZYIMN3kIXQMdLJK66BfYeUlU4aDz3zI51M8mYLPnIcidZ1IBZaQLovIh/KjfBGn9ZLvKuEl3O319SXBBPgnTIg+nOx4eyMTh1eKsJrlTiBAKD9HlqHVbMEHaPSSnBpMVABU55tutF8s4WND0pJzxzqVPqDw+QH4KCMAUcmZ2ozpEG2lTv9tm8xFVC8h97nOLYIEH/IdQZJTzxOvDnxOJVDkdwcDbcXH37Icy/j0NdHclWJ4w+ELus+fP/NAPUo/oZav95Pa7WvDMx6yw+3jKG6frjyU25cfHcrtm7vmcN0+jiH6CsIichzzOgDOrdeDXKBXCLLWdBgbC9agfQ2As6Wd5DR77x1QwE+Nxx2tWZt3IdCbKQv6CgBjJdt4KVQJWsngwiZ262B1uGZcSQcruZPReqZXMok0UfckG5sk5yGViOoTyfkFHsd9DuiTuZeePxE+0PjUvtCMD3LJC1lIkReqsplOkgu8c4CkpsbnpoQvvBMpkodWmamrTqDDBB8QPizhgwSfz/CVk63a8CnDi8+hTsPrxofa8OJt6RzhA20tU8En8wCFrxJ8voiPEfikE5QtzSQlHbWf8B4q+r5x+4l7VHZ4lLn9Wiolee8xbBJCr3s7QF5iTt7l92YrANDxJHlbn1rDP3JUht5bR1WSJoknha6gS/E+WVUsbAGqRkbw79E7q5IZvMdWpOhCbBkorglGchevTO+8K8llPwRTMoMOYz/yyaA7wSGAj/v5xOyPqFddhxee0HuRPHDqKclRS95Zbyi6bH7XOMOXSc4bjAzVfUCqAAAgAElEQVSFjyWnkF6CT1f5CPh8is8JPi15fMgpfA4En/cGn9cbLWl8YqWJ5Ck+MTwddynjC+eSXlUI31rDy/BV7fiA8dFTrXJazTRAW3XjU2q24PM5vmB4YAwvOgjGh4jMy2WG52aSko7ij1RKmi63j58ptz8WnI6n2Ek8VIXxetRT3FrXtpavbO1JrWEqQNVtKhqb6MM4cqeTVSuEYLWT+hqhiIQvuQ/0VNTRFHbhrok1aESvOG8gbFpyT+/ja8mJopFcq2klj+OautaS80Mujsh81lqQnAvWaMnTTvAZPiu5tl3SqzaKGO9v8GV6SSeomreVQ3rmybOcxqFD4XMaX83PvFoMD8Tw4liyhI/GKKnh5fjclPDJXSeVXLxrMzxfMrwWvRhfanjq/sIR8TGRHJ/P8YFWU7Y6ZskNPofzxud/8MEHR9q3z3yOwGfNmjXfspWSpsXtT8FvQOY3pub262ly+6F1zJGs6OMqH9UO5jSqOGcPa8SeMm7UJBroZCmUHFa3k3cNgQ6Bo9MmhyIKR8rHznUg6vEUG1FahZPai4dPVusMUU0QvUCpSSer+HP6NiHWgHEyLQt3LLlE3Rk5ZX+o5UowD29WM13Hs3qZQ5SiTlYvjAvIBXyynFJbvTxLzmp6X7u4e1euJmUiUGqP97UDKnLbiY87GTLJBV9EIHlAwVghx4clfLKAXJfxZYZXwhdlA/WQQ0qnQhrq8U04PD69gIyybF5Ip8rxwUj4zAKXV2oyEW14oO4vH82ybHh16IQFCxa88847H818jrLPgQMHHnvsMdq+7TPi9t10un0YA4r0AHLYlkPEMWgEkqNhkywooSnEe0x4WRIxJJvDUdQX6SeQY8uAdBEEDC9oklQxqszlLcJ1YgELdQ7yPzoVo9bnQAwNRuelTsP0Ujp+ToE6yemg3A0gxR11q2S72P8cYEgRUvlf8bKoY+Oc3mJ/jjqKLxU7IaScoL4mZZ04RMGXSh5h0aX4gj7RDugxoPBhQaqYdUWXQtufEunkdACNBlWHWHyZ7kEYbXhA+AqS88+14pM0IsKnLyUq0C0khsdio/pFpWAIaRsVnMYn/2LxcSJG1DFGQBUOwifgKFvK3Hf8L9EMLD7MpBJ8YPFp7cL/jo+Pb9iw4f33339n5nM0ffbs2bNs2bK5c+f5um/dfvZoGN7t42fK7Y+pkWkUQk9ooJRhQYce0OvEh3gYziGvp06WQx4+8K8DYBgpVOSMzNDDDB94PM4zGJkwpa06Ok0XjJcK/8hbtytRczXlEDyCZ1GNItl3UWldJXF1SffwySxEWlUHygjO5mqrkz1YRXJ80IKvIhOUn1P4NBHRi3+ORK2UmoAGn7Mnp/hKhoclwxN8kG4JXlm9WvEpQBWZlqgJmeFhKkyCDxQ+20qbu2nJlZr0DlWKT1kagtErwwc6ZcngA8p+bMeXGI+x0gyfOTk8UN/csmXv3r07Zz5H0+fQoUMrV66cPWcu+lq7/aLfGOD2AdH7opP5VLv9sariOK0P/tf7uKONC1ktXG9I1WrxKilpgl5jB8elJaJ6Xr9m6+TQ0RyZM0eCtlQUg/uR0j1o26yYFqE2GJFkEDoM7okLu0R3z9EmL4eil6zjq+h0y/5fgVAsmWHfJg56eW/qayCmJWmq4kY3DoLTlE5gvWKcLNRPEMlRvZ7veUcRU8qKOkFlteT4PKaSG3xJySfPyVYGn5UcYxUCtQ1Tnk41JD4HKKkHvH2brWnShq8q4cOsVovSC2UDqQQfJyVVZcktPsBOfPGJ2ImvIny+G19meImVVnoXrTou2+qUpfTu68TnwC9YsODNN9/cs2fPjpnP0fQ5ePDgypUr58yZ2+9PardPhkdWikO4/brN7SvD+xS6/TFWz1RKCjchevPMw1JpCWfrQol6oRBUlDi8il4omaHC0Xzofe3Qx00unXKaumQGALaWzAA+jFDNodJL4s+iNXDJDNkYa3DJDF+nJTNyvdBTtbmkUpLKy41DFqe9f91zsd5VRK7NUR069N7igwRfXlGIXDa06tVSKSnFhwZfVgGKJSd8WMTnVUqqkjzDh8PiC+uZyvC8AZThcwPwJYWu6CGn8fkCPk8Zxd34+LCX3lAFfFGvOq2UVMBnKyX5HB9k+KCML4wz5s6bt2XmgXr0fcIDdfacuYB1h9uvDsvtG8P7lLn9uh4L0sR7UlUgg/gMNwoo9eITHste0ou2FSBNFCDVlouzm66puKijnBzLNmIcUHtHO7P3QrI1iqgOY4Y06+VURStQkgcLsIp4UbMC8HWLml73iZacWw1UktwBukTrmMsTWqO7F8nVEIyfDbETqE4eSz4Kvja9MmMlfG4Avph5y4DoMcaPwASf1/hA4cv0qkfGR6NFpJGm3FfQYniVHKaGZ/DF24ytlA1vKHwgrHN83Yann9bd+PjhXdQLC/ho4YQRQCh/bfHxyejnz8xQj8oPPVDn1ZOTn3i3P7rfcMpvQJffcMrTmhuqgjEw1VIkI8ZRHJhWt32SmADUyv9rWpPUCXUpJ6Uo9M95OafcaqLT8nMcPYbSpdCejPoK2aXogkD/WIFJkHEUeW6T3GWS634L16lsJ4Ptz+xS5oKDJB+ET8sGMQjXgQ9a8HEiTBkfFvBBLrlh2nqpgfhya8kNrxWfCBY7wZUkt5eSK8Aw+Ao/V8anf7caePehgNNlVfQPQdmGCz/nOjpBYEXJK/DzxsdnHqhH4YdnqFj3P8Nu3x2G2x8LZ1BuiInExnvbcV5JId2jAgw7ZgMgQG1zQ1DCxRI0rlXig08i2/xzQT65lI1dO5sNm7u5+DgUyW1CB7Dk5pATf9R3KTWXwt2gckN0GgugLRelHqiJ5Ekr6E7IJBe9fMwrQyM5CUOldsAmJbnh8FXxUnXSKpaQ4wsZN4LPWIvOx2G9hsFHkied0I7PbKXUhk9LHh5FCh8SPmd46QdPBz7Xic8anoep48MSPhR86FN8yvBcpkhJcnOzO/RoAelOmDdv5oF6NH5iDHXuHPT9j83tJ37jU+b2x1RMKElKioEWrPuco+RAWsMl1BzZAyByqz2ZVwYqieJ6XhoN+mCaj1Pr+HNYJW8LRyPK7F7iZCE3hEvtxLm/WrgPsWs0Eb5EcsfFsWxcnVsdLXGQIl6fHNxlFXNDEDBLSvK+snpxJ6BVEygmjyK5hBx8jg868SVBeIWPc16wDZ9DQMlq4Qp/Ye8kwleQXMUnhsMXJY+WFtZzWM1oeISvInyVNTyNr1L4IiBU+OR17yI+ALPlC0IpS6LnWvGBwgfD4IMp4jOS6zV5ZXgKXwTE+NoML6ZTzSQlHa0flZS0uMPtt/qNody+Nbzg9utR3L4fze2z35gWtz/mOTMw26wuKs+HGH4+VosAU20OOW+FKrnUiEgns7aoSkvUol6auukdoClYA2m2GLvUmNOI6GuvN+7hk6uYuhklz9V0HPUkRbwqSQNYszcJviaMtpRepEg4BPmup2ydOt3zUm0fKIckW3Lo4/Wd9qFJhmotGaqMwGX4UONDwdejtKNKCvEIvh7voEv4Ym0dlWoLpd06R8DHRBJ8YngimwP02vAIn/CSkwETfF7w6cAz47OSe43P20BLnnnrrOFpfPVQ+EJRDuD7C8z9hcrw4sisl45RWvDpFOI2fNoOASsQfE7jq2vncGaGOuXPh3t3H/pwb/Ph3kMf7jlS/4Vf379n16jC8wNVVUpq9RsD3D7ffXCE3X49rW5/LHwnTFfjQzu6HsmDqKhgjfh33r6NsyTQO6DSd74G9PwA9t7LRIF6Ki510qMC+FJYUxq/LUkjgxGeGSBLjuipGCwKRS+HUXJAKiAHeiP4MAhyti5PvELcG5L1im+MBL0cSHIm0hCMv0sjFxKGx2usNcYFB048A9pNMKyicGvAD+gpM0XWbFVrAR8KPtT4XBkftRp84v0TvRQ+ejyHWWARHwg+6MTnQOHjSr8Gn0gOwLV8wyNQ4/Mt+HzEp1JtCZ+cHMvYeq86QRseaEBGr1Z8nFgUF7gK+LzC5xJ83uCzhpe0BgQFw/OZ4UFqeCk+L/iC4c3MUKf22bdnz9pNby9/dsNDz25Y/tzG5c9tXM5/dP/3bMvfXV/ZUP77uY0PPbth5XMb1297b9+Iz1Ra8p0rtXyt35iK28cj7Par6XT7MBZu7PA0hVicggPLMeAEthWRy/3IcjYdyhX438OygDOH8osuPTne3gBeyZanRCGqcwInOjQJFwDqUj7+VlHyoCZayR2t7OdqDis5b4pHlUHAtrLkTklOeqFITs8tPseZH8rxSWgTGKKWvJTLU8KHmhRrDVQjiQCZS8WeVPis5FmrwmcvhUPiC99N8NlcA09dhAPw+VZ8qeGh78Tn2/DxIfU2QiK5wpeYlpK8C5/qRtVXJcMDG6geaHjj4/NnHqijfvbv2/fw48/9l/Eb/rcLJ4+9wB9zTnXsBf5zlyw5dlb/mHPdMefB5y5a/LmLFh9znjvmXHfsrMnPXbT4mPPxmPPcsRfWn7t48bEX1Mec6469oP7cxYuPvbA+5jx3zPn4uYsWHztr8pjz3DHnufj18+GYc92xs/qfu2SJ/ZVwGnzuosW/f9Hi/+Uc94VvLvrFhrf37dk9vAo8Q0Xf/7jcPvrEMwzl9tVWrKO6fZwmtx9ax9RPskfmnxzqgYrD9WziLGzPohK3xa+ZcLTqWa97FssPVEx6FouSg/HIxgcN7NlU8pEfqJKKgolfUxYDplU9UMv4hnqgasmn+kBF7jrV55jgKz9QvWaN5Qdqiq/D8EZ9oA5heG0PVMrjS/CZx5KWPMMnfoHwZTf84AdqBz7VjR0PVMRY9nJYw5t5oE7hs3PHjoP79506+eAX+ve+9NvtW9/aunnrls3btr7+1rbXt23dvHXL5q1bXn9r2+tvbYt/b9v6+lvbNm+T09r+Tr++rfx1fdpbb2/72Vvv/B+zegu++3jz0b7htdAP1I/L7eOU3H7xgTqc27d+Y+puPz5QZcm3Zc0wXfI1W22gXTOkKXOdzP3TRScorBnSpWju7/Vyma39DyPO/ZElh5GXfB3IWmWc+6P3OrzUtuQrW6OMtuTbuWbozZrhEEu+3qwZopI8x6ckT/BNbck3wUfCiJq1rCgafMUl33oKS74ZPkBACUx0Lfmy5GrJF37nS74Wnzf42pZ866ks+WK+5AsGkMY3s+Q76ic8UP+l98NZ3767OXRgz+5de3fv3rt7F/2X/G0Pd+3as3svbfdycN+unXv3ftg0B/fv3rVn165DTdMc+nDPrl3tV0v/3rN7V3PwwxPq755z86qpPFDTJd/Dc/shFaDb7Y+05JvvbNPp9otLvlN1+wOSkhDVIcasFkmaQLMFpg95uXZ7KYrixiRGkKwWnXM1SlKSflREydFGp20KViXRaWiNTpvsD6+i00BJLkl0GjjnRRRxwA+DYlYLTj0pqbUcoM1qQZWUBA478aVJSZGIwpdntSh8g5KSCB/4YnKBxgdxO2udXIA+T0riZKssKYmz4dQIRvAVkpKgtrwUvtakJMHHSUloeSWZt4nhJfigjI9NC4Becmd8eDj40OLDFJ+z+EDwuUJS0ryZB+pIn507dhzYv/er8MB5N33v0P6974/wee/9Hbs/3PWbR+70Cxde9e37n9jx0YH33nxp5UNPbNmx66MD+55dcc+9jz6/e/euUa75/oG9u7987U3n3zqlB6okJQG5fRzZ7Tty+3CE3X49rW6/47WZ6D5QHUb/Hl+bEQfBo3s+GZLXZniK05Y/HdSrjJe0+dOFNxD8gPxpger0oXYfKHoxYy257gQRlV5IgEL+tDnZqZNpFDLEazMqrp6pCeHn4hqFi5JLMdgh8aXvXZj3SVivMj5bDNZxSiqriRk+OhzhtRmRnEfBCp833l+3GsMrp797C8g8AplIhk92qbND5uy1mRZ8oPDBx4kvNzyNr0rxRUCMDzvwzbw2M6VPfKDig+fe/P1De3dvH/rz7rvv7tqz45HJ8X8/e/Ydd9x8/r8fN3vJE1t/efeX/79ZrzXN2gf75537rfue3rBr5wfDX3P79u0f7t75L4tuvOCWH0/tgdrvT3a4/Va/8Yl0+0W/MWW3313YIS4qIoejsrBNBehiafU8Jhc3kAmXchwg7H7DV0dx1IJ4+G7Fa9xmbV1H+2JwUYkqJ8cLkl7Ah3H9UwWc1A4GjvWyb/jSd8Pa/XCFHbJWKFUGcFmfg5d/V5KTMD6ejBaf68KHjI+XKxO45lIJvrbCDmAChKoT/DD4tOFxJ7hufDgQn5Y8pgWoS1l83YUdCnCHwqdNugNf1ud6U50cH0Z8gwzPUTeiEiaTXPA5WgRuwzdTKWnUz84dOw7u3/ev7v6zl955cKQH6gd73l3/yOlfufDJLbuapnnvleWn/es37//RveeccsUPH1p66dwrn3tzz0d7d21/552RHqj7d+34cnXrBVOboc6di77/sbl9X7ThT4vbl9KD+g4H6Q5bOAr1yboVXdJqYrylSxWrTJlKLllrUlZKFaYC/kN1dAWFfs+EQZcIo9JYtDMq6pX8XHoppUhFhCpIOtn0p0jOYoCRHDr6fCC+TE25VKZXx6VcIvkQ+OzPpfj0ydWI+HJbir+oThYxMLVhsPhcJrnWy4Gv7D0M6lJlfNnPteGznVBSs2B4qs8LevGYKderHV/SCQRL45t5oI764QfqWUvu2L9zx9tDf377/u6tj9/wDxfBprc/2L59+we/2YAXH3fdXXd/+fN/9J9+77//24u/u3vfvu2/Gf568bP7/Xf/pXfrBbetnsIDNZQe/Ay7fXcYbr+rOD601CjX1YSRanlXJsklSoymSrLZ/MTR3B/lUE4GsFWSk+rqFK/FUpXkWGKiEr2cWhkAKznXUFaSSyGeUnH8oKaukmwk51Zf0Csrjk9ra7GVlnyt5HHVwtGKIgGKW6Ow5KPgqzvx1Tk+l+LDdnwBULk4fpBNSw5ZcXzTCUryYfGBWhAuFMfvMjwHXcXxAbwpjq8Mb0h8VTs+lxbH13pJlkS5PLdK1KLoe6KXh0HF8VnyACjFR5K7meL4o3920pLvqf3bfrvljXVDf9Zv2rLumbv+7Wtzn3r1ze3b3339+QdP+6+n3P79G770hX++9bEV5//T31y85JG333lrw/BXXLdu3bp1297Y/PdXLLng1tXNR/uH18IUx/+ku/16ym4frdv3w7v9obZvMwE/7hoAqtWCav8vbi1s32Z20Wrfx6cCn+2iJb7GkfswjwqT9un07o86yUU7CFFT6TWN+/j4TC95Nmi9WrZvU8k7US9KY/FactarJvuz+AAtvtL2bVj3e8pYM71K+Hz79m1UCS95eLPkURGHRXyehh3W8DJ8vO9SpfQq4XPyaB+0fVvFN2EHvnTHHgcZPhVZsXqNgE8Mrx1fHF2Nvn1bAV9aKck8vHPDmzt3Zvu20T7hgXqcX3bq5O1vvb7p1aE/r732642vv3b7Rad+9Yxv3fXQXZd8/b9+fd69v3jshn/84jk/fee9dY/d+Dd/+rf++09u3LThteEv+uqrWzZt+NJ8P9UH6lzA+mNz++mo8dPk9ut68Abj6GWfZ6fH/pQqMhEf+OQlVQ5Foh5/t8p8DQBFp32fkndUODrMsquYFhHn2ta56GC1g3ipmLwDKCerhFXWS55bXh1m9a7Us8HzBMgBIsrJAB4TlxqrpNa94TcY98WSqhGb1PK1awbAY66h8CHjK6TngOiFOT5Haip8NDzss/cvZLVQMdiR8LmwwbjBR8K0bN8mhmd3cyPD81ovwUflNiuZzip8w2wwDsPigyHwVYeLT0b36RhF5YZUTjYYHxLfgvkzM9TRPvGBig9+HW/eumnjKyN9Xlv/5rrnb6rmnH7G6XPcLS9sfOuVn61cUt/xzGvr3nhjw31LFl3dv+fVDetfHeWSb2xY97eXT15w61SWfGWD8Ta3j4fj9pXhsduvPzVufwzRV1yeP65AFpOSwgKXd/bl1sqkVCCfjDFsW3j1VR3Sz1EeP8efgRyfU9VzrGzquxgmMaVWCi4GmcObKkCB7hBwdvoQ4kMuUdNJoNsk/mCWsqG/i5StE4QB6lWWLYbo+dBKzoeq3xK99Hc9WEVSfLT0z6wVPk7PIckVPhXe8FprsKJWSs2otVc/l3aCRp8bnlWTDE/wSbZOqnWHpTl611sTN2pSroH3BXy5bIAGgePUnnTrDM7CkO9WiSVkpgUD8dEeOxRDRWO0Np2qhK/d8FJ8qZozhR1G/ezcsePg/n1fhftPmVj65sb1a0f8vPTyqxs3v7l169Y3N298Ze1La1/59ebNG19Z+9JLL61dv/n11zetW/vSSyNdcPO61/5u4fUX3rZmSjHUeej72u2LaQ3v9oHcvrHST73bHwOIkTyIaVHhPx9vQq7Vgp7/Uf4I2VAhQqvctDmHuskB3+rRHYAUzkCgrNTgdxxG7yOnSQKLOBTHoqLHeB0PqELKLJJcCuNP6MgzOTu5FImqTlCSRwWDDF4kJz9oOoHYuCBYOCStpROAEZDxKeGpo0zMPGoqkit8gZ2U2knROINPKoSpc1iXBB8WpAo9IJey+FTyTuxPwhfJihlYfPpXlDDa8IDwqd5GZXjd+CgHh/A5QNVRYhKOflEZXhRbi6cULHSUo1xBMoN4QYNPZWcEmxF8YPGp3ubxE92Y0c0B/S6fQAqikipe0LHh2buPpSJbmnmgjvwJD9R/hQe/3lv6xrpXfvXCkfz86oUXNr269u8umzx/Sg/UOXPn+rpv3L449tHdPn6m3P5YeFMnPHVR1WoJ2yvGITDPJKgV5V0cidOGReowU6bhQzzZ0WQ/flde+IutAKhn33FS4pDe8qEBslopDaKS5OYQ1MlIDtFTpW/IIsxKNhoWtUmetoZLKckBPVInAC8hxpkEX4pEDcMxUZMlL+oVx0fec3F8o5fG51N8DqQ1rtVIJ/D4jmRDraZPOiECkiLycQZj8PkUH18hlVyrqSolieFhNDwHqColFfB5HAqfV4ZXwheFCbeT4KPi+KZ49yj4QOGjQS6GtWXGhwqfM3ffKPjsd3PDg5Lh9Yg12rsPM3wz76GO+tm5Y8fB/XuP9w/+k7t18+aNm15Zu+HVlze8sjb+9+rLG155Wf5Om4b4Ww47v/7qyxteWbv5lZde3bjxjy+77sJbp/geat2fnDa3j3W33/i43b6bJrcfFqvHvLnNYv0krlCDVKtFtaItSaNivLpkhqeabQPrQpHTpFYIwWpHJ3u996qTEBFLHsYOVIzDpMBQGbakHGDoGhOdjp3gope0eqWSazWt5D5IXieSZ5VBktaC5CpKLZKnnZDubONTvaIiTg6TmiYxJp/rhZle0glpHUrPvCjJRbcOwOc0vkTNzPDibVbCF+qhEL6Ul6qUJIBGwsfPctELvGszPNariI/qNSb4UsNLarWMgk/dQSk+b/CBJ19Dalp8da7XzPZtU/kc2L8P7nnsf5i39O8nbjpp0ZKvXlkfv+i6E3o3Hn/t0uMWTh531eITJm44YeKG466aPG7h5PHXLj1h4objFy05buHk8ddcf0LvhuOvue64hf3jr7nuhN4Nx19z/XFXTR5/9ZITJm6gr0+Grx9/1eL4lerG4xdd99Ur6+MXLVG/MnnCxA3/1lv6F4uW/rd/f+Y9T7x8YP/e4VUobd82PW6fc5SG9xuQ+Y2puf16mtx+pbdvqwC894iobsIQmI1BXX3XVfGuEwXQaJupp1Kw2PVAnCgEdx/KOKpgdVAeqNW6D3MI5E1INqII+tDxyZzTmOVqVtppaoqO9PK0nbX1oSI5OU15jAGVpAmZtyBQXVjx9D6oKWH2ynhJKmML2odypSSNDwhfr4TPqil6ZcZawFeBwVepcoCEL85QSZEwMWrFpyWPDzmNLylzyM8GiIZXtRlejs9ZfNrwfO1Ir1Z8aPABiCKOZqgpPvuQE8NDDxjr//USNQlfYpacioVFfGVfo/GpV1/03cf4wNxQPZE8hJfCpYzhVRXAzAx1Sp/du3e9tW0b3LvqpP5DJ9QPneiXnVg/dNLkihP7y0/0y06sl53UX35Sf/mJ9bIT/bIT498PneiXndh/6KTJ5Sf27d/1shPrh07qL2/5+kMnTa44seVXTugvPxkfuOVHv9yxa8+unTuHV8FsMD5dbh8/U25/LLpsKvBGazu8Eu35fkauFqFbIS5PQVSAV43iVAC9dwCAVLXHx2oUNPqIrUEfoPQt7vpwKZCAc2wlUaMnCg6C5XcxNwTQRKfj1N5RhgUvrIF0Ai0s8FJnFBVYctNFpAh4W2qHJaf8jjDqcfJdIFF9InkYKCEF4ZA6CnR+U0FyDxZfiDS04kPBVylFUDqBEwQgBAwIX3wYTBs+pSZiQXJplbVN6QSgTkAfgyuJ4Q3ABwk+1rqITyRHCi52GV6KzxoelvCpNXaHPgw4qinhq8QSxLQInxheGZ+6oZThRSLjM4UdpvTZvXvXgf37Du7fe3D/Pvpvrzps+zv/yhS+njZ9tH/vrhEepjt2JNu3abevbhl1f8HR5/brMeBsCwrkOs7UCHk0VOECKAtDwrOUxBEeDCFUa5s4d4mSR1RoWmK/KOfE7CedZMF5K6a2DmdYUHxbJeCwCqAyfYDD3RwAVykkoqkSD+Q6knUi/261cxRKNOFr6i7qTOooUJ2J0gncLbYTVGycbIWk9XxNIEWoiyw+3fnxjwSfIcuHDllle4UiviyhCVTagrOnsWkOwEd8EYUF49Nag07GkSaLjzMdtKURPmCIGT6ABB/SHUEmJDeONxxb8DnI8HHaRextujFzfFEY6rckbyLBx6z5Llb3+Ej4gmwzD9TD+ez8ZPw3hQ+/h+p9X7t9bXh0Hw1y+2gN78i5feUPD9/t41iM4obHuB5N6PLcDmS8kCQlYUiQkcQinUOBNF6oXHgrJlyKT9avbfCkhIPVQYy6Yq0cIOWGAMC6BIYAACAASURBVMef1WgdJYWao9Ogph0Sf3Y0EZSBD3eClTx2Qjbw0cFqSHK1dfKOGtpTVkvtlOQ88KmoYqR8V/SK24GpCRNEU9P4gC8FA/Chwaf0qrVeVnK+FL93JdaS4kOLTw33elRJv4jPlfC5TnyQ4ENrePI+j5o12rSIDF+UnJ5YCb5cL4UPyvhoeP5x4kPBVzI8upQ/LHyhE+bPvId6VH44y7fuTxq3jzNuP/4uVUrytlJSjLskL+9TMghJTBVq+hRASktmVFVclQasAWLJjKq7ZEbsXM8/ROFAWf7WLwijXdEOHocPvTqscr1q0isrtaMkV3qNUikpSA5JzSBE+W5IO0rDZiYIqv2geS26WGonwYem6BcU3taP+FjNKsHnFD5U+CIgjQ8zfKjxGUDt+PyQ+FB1QqlSksWnDc8zoCK+zPByfFkYJsGX6VXlerXjY9nsDVXAF/XKKiUV8OWVkhJ8kOGDMj5f1xXg3HkzlZKOxo9USvJ1l9t3h+P2jeF96tz+WK9yKskFe0G9WFMKe1WsLOjZm9S6EA9iXfcqJ9rqnT6Dc6GSNGHxmnfqcYDp7nS+7lUO634vDPb1zqxU1NFQpAoaqjVWSYVY3abPyTuilw96oa/7vcohGr08l1St617lgKAGNT2pGUtm1Ap55dDXPVXUMeqFsRNCcTsHnvXq0TZnWhFAHzuBJU9bw6VcKAYbDCIQSfGFUjuML9vzssrx2VI7EV9QROHrUVaLwucVPi1qtE4UyW0rH7oWfL4u4CNAXCnJ4AOlJtfyrZyvU3yVVHJxSHolhsf4Kq7lK53gS/gSw+vCV1l88RbVRaRtHcoEny/ik90fa61mYnheDrmWr8MWQAm+maSko/NDMdR5/cnJQW7fHWm3X/IbQ7n9xD1C7jfa3P5E5cagvEwUy4gD8ls7Pl2po1ag+au00ruGduHOtlIUV1oBY+Vx0xrn8g5iPhigvAZUpZV3gALOnouYOxWOTvVCOVSdYCR3NKfRejmrCEvOh7maPVpnqIxeyVJqSU0FSPTiNxGnhs8ZfD0HRXwpIJf1ucWHZXy8dlrQC0QRr+ZDGp/vwmcNz0FqeGV80IrPKXxieL5geHYZtogvB0Rv6yLXNdRwZcE/w1e+vwQfZq2p4UlrZnjJ/eVdOz7EugI/89rM0fnRM9RPvNvv9Bsfm9sfi2FeigM7SaCIeTSUvBCDuqEX6Bx0iJVKmnDcGsPF4ZATKOKlHNde4ZwOHXYm9aIYkn7i5ZocoGYJJYGCz0kll5AyVxGS/B2VpaIllxIb8V+4E5zOkZHsDw+6EyC5VKIXBfMzycn4uLKSfBE4D4XDDNTqqFwIP7yHwcc4YAR8PsHndI0So6YCWsBH+U1seBk+l+MDwQcJPimY4gGxovIrTjMSfCj4JHvC9LPqBEJjDa8DH0i2hfQ5SDZHER8yPteBDy0+zPClhqe0xuR35e4r4hONqBNmKiUdnR9dKWnG7ZfcPo5xBV3kwTvGzWDj8IFSKnhUG+LMdHIYa9TxN9IIcDyZR+uc7gRcBYN71kSnZSbBJ8dLZbthoyrQynOUmFfilF48g0lHSRysNtOOkuQmcg6UmQU66o5en+zUyRRIl/6EkuQ8aMolj6epKBqN0VCN74bExzOkOLsCpSYorcFn+GT3AsYXB3RZMr2RPJ0mDoePR6aCT4bAHEqhvPyh8al5IXUC6cU/p/E5PVCdEj4YiI+7l7RuxQdd+FLJafAud1+CDw2+NsPjtY2ZpKSj88NLvnU9qd0+ewbQt1u32y8nJbW4fT+K28fR3P6ofqPT7cMYv7funHeA6p13BFRbUsT0yLqSsi/6ZXC5Jz1N2JGi05VakoqtlFGsKk3o6v5R2zr8XFBAWu3rw3V8pc/XInnoGt5vBCD+rpwcVuqjf4/rBqSm915E7dYLlV561YLUrAH1bideDh2HHLy8LxxiDCr+5xLJWS8dgYid4EHji9uByeaCKT77Ln9UkyUPLzJqfCpfIKnykalZF/FhBz5reA4tPsrLFXxo9cLUaDPDI3xUKSnFR8UWnCrfaHgRPqfwhfuq8Lp3hq+uC2bpIhHG5zU+XpO3ahbw9Qbi01v0CD4v+Ep7azA+p/CFX59Z8j06P8VKScaxT8Htq/vriLj9+nDcvi7SAuh92L6truPr3ojh5mcFwv0cvQk9KsI/srYTibayo40cVg4qpa2Too6qZAbtRVVxqR2nU1LTLImKHgZIJWlqVSODT0bTNdEPhkOR3MUqMDzI8goM+xqv60PZbbMmmJNu5X2yJPvDPBGDmiw5KMmjXqqLojk68HU9UYEgl9YufMYcyUsOj88Yq+OHHEkOHtFPVPx4NvhQ8erlklNrHRCgd6DwxUpJCT5M8UXZ4gKmkjzFByD3FVdysfj4qQZxTKk2kEK0pay68WkrjYAivngTstGmY8qQ+NCJD2In+BZ8SGr2WvAlkrfi8ym+BQsWbNmyZeaBerR9pFLS5OJpc/v4mXL7Y14tfwH6OOeluw68mo9jLK3CMzmkd+YqVdQx/B5SUUfJ4FBBXbSLSPSoQLogrSfHS4XDeH2ej3sSNYS1guSiraR7UCsYNY3knk9GeoxxJ5gCzcj1rsqSx3WGIAYXTUWZKKC8mKjVzCT3XoLwatnB0yMqruN53Rr9u0gu+Kg2rEy/yDqRCjPxECzi01qLmnKoZGO4Xfjod1N8LsMHvJiptOZebcPnaXV0ID7nBuGr489pfIhy17HhuRbD81avFJ/Wy+Izkit8OCI+dbsBKHzSKoZnVsM81fLVt0yCb9688bfffrtpmoMzn6Pp0zTNI488HGaonyy3X5u7byS376fJ7VeA3vsxiCGT+B2OIQEnv9A6dViDCm4FOJeBTnYSUo4XBA4aqVanvov6MDmZ0i6w3Ir6h6Lk+mQJhtOljFSFVqUmx5+Ll0Jol5keBvRzYPrTqR7jrraSm981nRCK6oHXfQ5gOgEsPqd+F2PWALbh40PpKDDaOUgRoOmx6JQ78EHSqoh04EN7crxFtTDqW0PiMz+UQUyEyfGlfd6OD62aWZ/HVid6aVuy/TkiPmcNj3tM6yUXtPcmQmp4CT7n3He+85177rnnrrvuDp/w/0Me3v07ObwrObxrSoefQEVGOmxTZCpq3nXvvffeeOONE71qOt3+IL8xlNuXuksju/3h/Ua32w+tYxxMpvsQkbYsjjOkJGVJCi1Sq1Splbo/3C/kzaN8lb2l+YKgWtlfg/k5pBEBcgoZeuOvkUq/Ohk+KNefSy7uRrVSF/NzyHYCAs0VMBRARm8k152QqSkn+4KawcNyK4IU1AVAVNVc+bWlynSCKCJ6Kcm1mk7hwwyf0/ho/y8LyNiDFob0wgRfvJTj9DlteHQpZ/EBj/OySxE+0Pj8IHyQ4MsMD0RroF9nyWMnOxHG4EPvyEpzS0jxpZZAgNRdWpmT0dFG5VEvm9Zn8MW8xA58yLcMdaPerjzBh5zvFi5V9yevuGLh+Pz58+cvGI//6b8XzJs/n/+er1rpnPnj8xfMU+dz6/z5C+abk+fb1vnj6szx8fn0cwvGx/lk85Xx2LRg3jj99Lj8yny5VPxiPG3cyKx+ev74uJY8XoSkkk6YR8KrK1ip5DSRKpW8pTNNJ9AVRKrxpBPmj4/L1WKnjadf7/xF7u35105Uvu7DJ83tJ37jyLn9Me99RQvcDhHpsOIaBZLuEWRV0UG1oh0dhIpOQ5LVQkWCeL07rrzREraEfMOKtqzLmSVsCi/F73rahM+nkku0CQB5Ocus4ys1pbUcV+fgE2mt1jR0sBohWVGU0Bfy68OktaTAMAI5uQZb7IMQ6FIgHtV3rV5g8CXJO1oRhc914AOLDzS+dCeH8NTRy5sxq8WV8LFpteFDwwsANQLI8Gki4OO6t8bnGF9ieJgY3mB8kOETNaeAT0V9gsso517ppIlh8HmLT99fbfhgAL667gP4fn8SfY2+rvt9B77fnwSs0de+33fg6/5kyF6p+33A2Op9Xdd9h9RKh6G1rvu+7gPW/f4koPfxMJ6sWx36uu57XwPWdX/Sgff9PvqavlvX/UlPh0EYVIf9fj9IToeTiEEROfS+rvuTQXJqFb30IWLt635ds5re17XXata1aq21XqRIXySv+74WUUkvX0dF+t7XSFqzXvoQSXJ9KK2Yaz0sPhzVb7S5fbLDodx+0W+0uX2TRvC7dvsxKSkpBFXprBZdageQSkvIXccxXnDUqvfxYW1VjDc80r1OzwFE5JI0EkVjbNH1ZFkthewP9KAKu5BenBtSR+cSY9eZXkn82Wa1kF5el6QxFBFFL32pOtZPQKwr1pqW9ZXk0gnhULXWrCaXAqmcllwOMZayMvhcSc0JZX8sqrOSVy7tkwyfN/gww0eHJXx1Nz4HstGYeH9d06QdXwWSRpjjq2xmoKPkgiiMTavuVbR9W1XQi25CKauEmZowIr5q2vBl2XAGX1REGV6CzxgeYF3Si/wGegDf5TeywbFTnZD7jSr1G+n9hYkbUTcUxAJeXVktybMhdkJleJXxQYLPujinC/GU8bX5DZf5jVRN9J6SXUt+A6ETH4L1h4fv9ouSH5Vuf0yHlMOaEg+onSTux1cPgROLafLec4C+X6UzA/0M9zTFSVt5FMzfpVFwnHHzRCGOTUJpmFjnAij+LJN3yuDQm1x6NRhBVGpyBUh6hxKpa7qGKlgYkYUrc0lViV2D55mcjzVoMNFLMkeYsZ4K0BQH9SFPgMj+cnyyvCz4jF4JvuICQ5RcWhPJDT5sx8eSU5+n6QN2tAhD4EOFD9vw+UpVPCkZnnyX8WWGFy8Va7UgOgBtlgQox+db8GnDa8XHa8Id+IDwieGV8PFLNcEj5Ph4Xj4FfCW/AW1+I8PXr6xeVk3feve1+Y0CPjT4AB11/gB86F3B8FJ8oDpBVuy8FJLLpjiJ4UHRbyAO4TcUvsxv+A6/MQjfdLn9+lPr9hPD8yO5/TFeUAYqOgNkTEE9ldsi0R3gPcJaWhkMvaWODkyajGvJeXEkjFMx5I5LVTEgJIv1jpbLi7K5WPxCh5QLesVOUGEAdbKJb+eS61ZIJUerF7Z1QuSiWwmb+jmjyCj4/KDWgfhaJY/4IJN8CHwk9iB8LlWkiK9d1FZ8bqDh6Z+DVPIufGDyL3J8TuMbChBaycv4WvTqNDzoMrykFWQfQO4i1JJDCV+73/BZn2PmNw4Dn1bEGh7k+LTkYNTMnVjmNwq3W7fkhdYOfFAQYxi/AakNf9LcfsGGB/qN6XX7pXvED+P2K4fxgarzO4LvizbhpNXZoC7EYobqZNAnx5+sMmvmVz46TpYkl6y1coZKWGAERC1qGBblknPv8KUgk5xi13VlH6iV6dlE8lp+zkoOWi+H9nYt359GNpS6PPqx1CJ5iq/YCYmzmCq+rpNTfJjiczk+28nTgg8svnbDE3xuCMNTvqngIlN8uhP4hmrt85gmNgQ+VB2YqNmFLzm5LLmwjj49bzV+Lb+gy4kU8dVZJ3hHb0qwqEP6jdHwWb+R3KpFwwPWq8vwhseXAmrF50bEp/1GEd8gv3GUu/3EhmnlYwi373AszH9p+Vvm/hUdysvgoGrQAEJh7l/37KSYDvWKYr9XIfAcuc7m/hV40jZbulGrFuGP7rm/za5iyV1p7h/2JZCltqqw5NuzaxphR0CSvLR0YyvUxCVEo5cPASTO/qjs0rzjpRsdn4hqqjXD2ugV1eSgQsuiE6o1Q4jx2valG42PFRF8KPha1gwtvsJaKCUIDIEvW/Jtw6eWfK3hRXxq6aaKa4YJIG144TZLlnyHwWfCMGJ4KT4whckG4IN0ybeMr6feQ402bPGZJd9h8DnBl/sNV/IbUMbXN/i0XoW7L/UbvcxvlPBl2+0V/EYLPmt4QS9fXPKt1WYhlcFXxcIaBp8yPIsPFL7Ebyj0KT7aYUkZnhe/UcQHrfhm3H7B7VcjuP3upCRJLhAwlAwCpDxFpz042e9GKCr15BAoOu3aotNpuse0Rqd9OTrtYnS6UqIK1CxpAovRaZUHwXesJCXhx5OU5PKsloH4kPH5+B40tkme4nM5viQpKcM3nUlJiZpd+KrsUBQpJyUpIgm+KsHXnZTEN+EQSUkt+Kppw0ebQSZJSRaQlvwwkpJoC0wleVXyGzopKd2lTiclpX4DRfLMSg2+jzspqYgv8RvKSnN81m+04uvl+LA7KckfXlLS6G6/KPlR6faplm/4jn4xRh7pPDYx4zUKwiMz5mc4QeWU6GIrD0YATf50mNi1vTaDqO+6aBAIiKYYbNBWRDUTBcqfRhnIoHwXyukDZmLXMpNDDPnTapAF8t5FPubSlWMtNptNIJKj0cupHcWVXjy+VvgcQnzvAlM1NT7AVnx6719aISF8yhwDLzT4eMjMejE+r1+bacOXGh4aQBk+GITPJBdow6Plrw58arCvXpvJJEcFqIivklZ1T6LgkxF0Cz4YHp+3+HwBn0vwgcaX6lWxWwzfxcTwsNNvFPGVb6gBfgNLfkNJnvsNjQ/a8RX8hjOK0LNcDE/8e7JwkuMr6gUpPmt4ZsKqAAF2+g3UT2v2G07wHXm3r2+3Nref+Y0ut18dGbcfZ6iOHAdgtDDUb6mrIB+gefUVktVzDMEPakUfbMjRV/ia4TYArq9h3/Cln4un6f+V+JN+w5cruSBLHt/wBYmUkBjIv56s+0ecuZpOLcRj7CJvWrOYP2o1yYbCOY4O6efQSK4TBOKlIhFARFXIg5eYbCd040OXSN6Oz1l8VY4PE3w+wQeqJhE/qAgfFvCFSzmLjwwd2vEBhR7F8EbAlxmesXBxAUBBI6DCDtIJaPvcBoQsPhP9KuPDofFZw0tatdmX8GEiOcfGSvhQ3+wOYm5Bq+EZS1D4EkvQd1+X3/AJvi6/YdATPlfCl/kNRHSg/AZZF5JIKT7QN7IxPNYLrOQW0FD4IMFX9BsYn0zqUqgkNxlMwfeO4jcKN9SM229z+2Na+vCYROnKpDuks6Akn/gIFIWVeckhgPEdrFIRZPJYylsxr13XdrKVqlKtubvJbwyttYPCpXKPrPvTqe9yV7dJDiXJ+bSq1AnpLa1+l+/SNnyQyDal0oPd+KC9Ne0EMJJnfi36I76lR8WnOyG9MTpLDzoo9Xk7PnWa6QT2yMZarNE68Fby0fA5KEjuOvpcXSrp86HwqcPMjaY9lnhkc+Xh8PHTLsfXRsRpb374fsPeDnTLdOIzhmddUOnuw0wY5YenDd+Rd/uD/MZQbj8vediNT/WJ+rkBhpfoC9bthz/GvJ7Oo+fpdkVLHBzP51ZaClCvzUnYTObvmFVJ1ofRj8jaWhDD87K+A+SfAzpZlil0K3gAH5YgfLKwEzbGYslrWXkzkqvlERymSrJeZTKS+w7JeYkDbWtRck8rpUZy0xqyJOp2fKa6Oh2qZQpkfJDrZbRuL44fdAeU1+Z0oMWo2YLPaXxWzcTwat65rIQvLKYl+LCEzw3CV9dFw4uzK+YVEiY78KWGZzsBQHg5uaEK+Cql15D4AhHktTXVCbxnA0nuJa5J4cDE8AbgQ2uHUPYbtVGzgK8q4UsMrxNfekNFfLWVXOFr9RtFfCiWcLh+A1PDQ71iPwBf7jcOB98nwu33NL4puP0kZ3MUt++nye1XgN77sapKN5DS+39RmhPwXVeXKoOYdfwK6kJSkknBIufiefM4UK2VC7ekr9T2UqgCzqStbNyTHIKOTkeosVXv46PSIiDE5MVptkWnUUL0duGes3VUJ8TsD9nSi0+ua7HdqrD/V79NLxVXN3oNxBdErbXkzqg5PL6C5MCAIj7dKt6f8CWSi5pBL7V9Gz2tE3yY4hMrtfjKpXbS7dssvihM2L6N8fVUpSTRqxufT/ChwTf09m1lfDAQn8/xtRleiq90f7XhC3oRPlOSJvoNavXFvVcZUJ3iqwqldozfcInfgEwvr/zG0PjKfgOV30BJcuFOcK34aofoMMWHykoTfNCJDzv9Ru4eYTC+Yd2+m3a3j58ptz8Wg7o1D3NsnFbl8SOifqRzDgWq6LRUSS3XG+LxBT/SsyFYBRiqe5uxZJlikBxCdDrfadZk68ShSlgmClDtYITy0EJrGp0u6OXEWGksiR6ypCQVSDdak5cMgyx7X4XxWtsG4y5KTmO9iA80vmyDccQkQUbji4BE8hxfMatFEgULtVoSfKrV4gPkG8lLlkRey5c6Ab1HmbppfE7N86zhARNRU5wSPkzxKSJJEllc5RN8FpAqZMj4vOAjNdvwUVJSyfBGxWeTksh9eJUAqQtdpfhchq9S+HK/4azfEHyJ5IKvNvdXAV/qN+ocX/AbauqGeZlDja/uwuczfEDZOtFv6FweWjjhTmC/Ucbnkk4o+A0kRyF+ox2fS/GpiXhd8IeuE9+U3H673xjo9mEIt1/0G21uvxrN7Y+6wXi32x8Lq2QVrbzH0AslVlSAgHElzfF2JQ5D1riDOJINXwRA8LRBJqlHdQkohEBJa6SPtIYRX1xs4UV8dRPyq8r8bjJmi/gBuYsnx1+nS6nIGY1kIRZ2ofl+DCF4lhxA+gSJU7AhoA2rQ5I6Iuslm1yGeLi8fQxe+pM6QUseOWG0XU4fkE4Ia/fKh3I3RlG94HMaHyT4JM9NAeK9BuW74FN84Dwn+9F343wrvKrP0QjkIojqtfcB+DDF53J8Ls4tAPlB5YmXwecK+PRhuCbhcyqomeHjhxz3Z2544bnF+JzFBxoflPA5wRcR+BZ8kOFDNIZHvEBlf8jdZ/CJ+wj40OITO6SkDyjgE79BUTHtNzJA9HPxDuLc1wH46JYRRWJ/6kPxG2D8hitLbvCx4UHuN+gw4gOLD32uJnhlLQafWAIJgx1+wzE+5TcqrYjcfZjiM34jxTctbp8kJ9eKQ7h95nWk3T6dPC1uH8bIhZkbnv9XDkMCarrjo3pOJGHb8F1ovRSo343igrqyFYO7ksyLrq/vBDlEpwPdycmYfldk05tWDpQcCidDkpiA+aV8oheA6QQnneCNXvmGmkA3rbT6pN+qbsk78XV1AqcslSUv4GPZBuPDFJ/LDC81S2PDRvIqx4eJbO2Gh8aGo+SYSd7aCYleg/G5trSI4v3F+LKUCigYXiJGiq/77tOm5ZI+L+Ebxm+U9eqQvOQ3EieTSZ7hG81vjISvS/JEtsQ9Jn6j61L6WdLqN7KTO/DNuP1pdftjaY1yXoggc5EQPc+fvKoMQiebVlODpuaxjGmVch7Uystl6J200vDcIaJZdKKd3H1JcroUraOiktxZyZ2S3KWKSKkdrZezirDk+jBRMxa5VklJoldcN7BrhnyYArKl86eGz1l8tmpJZYbnKaBKTX9VK7bjSyWvtORYlFzh0/OAHJ8zvNjXDMAHrfi0mloRY3jeGt5o+Lp2CIAWNTOzZDVBDA/L91eLXlpybyUfgG8Iw0PwrX7DtfsNV/QbCb52v9GhZhc+7MbnO/CB6oSimonhJYAMvgF+Y3h8fMtMGd9nw+13+o2Pze2P9SqnklwwlGKi2DX2KkDexwd17Q/vAHsOsa4nKif6UCZC0JajF5VTpenqfhWjg5wHEftionJY93vhLSLVCio6Td4/LYCiDmtAz5JjDGaQXj7ohb7u9yqHaPTyXHshtHJ8oq57lfOkZpA8lAOsHHrfD53Q47faWS9ESrjo9yoIq0BRVHrdWysC6HuhE1jytDVcygHWLgRpiEiKD7DS+PJdz3J8pSSXECxxCl+Q3OILhUICPi0q14cyyQUFvVwLPl8X8MVDFyueJPgApc6LGJ7zdT/BR3bYn+g5JCKJ4Xkx2rBOWyt8voQvMbwyPsTa6RQzTkrSBYZcVkLI4vNFfFTJxeADTAxPkq1CIR6s2fByQGgMz7RmfqOObqvkNxgfGV4/eskWfNPgN9rwDes3Enxo8SnDwy6/EfWyfiNK7lmRgt/A6DdSfJgC6sKX+I1OfNPl9t2RdvslvzGU28/uvrrd7feM25+o3BiqILxTlXcqXe+KpgLoOX0gbu3Zc6CLwfJ3pTRXfIbH28z7UBxLVepygFS4CymDzgEHhJX70Akdzgw87djEPBsqnbyj9aLRR6I1UG1uz6MP0SustsdL9ZSaVNSRcv9I8kRNx5lmNABMou4VSW4H1IUhWBWqzIjkGT62v0L2RxlfNSQ+HwBpfHLn6NaqBKgDn+bVhQ91J8RDzoPI8GnDk1wDxQuplm9ueDm+QpZEGz4r+VD4WDboxkd62Vq+Lfi4DJsyvAH4QPDlhsf4aOzlO/AlfkPhkyqVCl+ok9ftNwSfG8Vv8GOs7DcSfAXD68JHfmMwvl4BXw1g8SWG14kvMzzf7Tf07fbJc/vYhu9T4fZjpaQKbBSX5tQ8xQYT1FWTd/Q9XRqGNlzkBesgTSXTc1nyxpjiJQGGitYoAJQwvH7t4q/zYnqeL+AAMSymu4LkDvSygwgTD4GzCURy6oRMcpWto09WSwdWLx/DAIgcoo9DMO5zoGIfsRPyuDoqyTmHQiSX1pHw5ZJDQfKkE7zgczGiMKTkTkleODnD5zrxQYIPU8NL8SEvBCWGJ53AP+d0J3RLHvAN3QlFfBUgKLMcDR92G16i9bThw7QTaB1vkOS6FUxK4Ah+w3XigwK+Fr/BkruY1QLtJ1fcavAN4TdsJ4ziNyw+TPEN7ze68U3R7Su/MbLbt3l80+D2/ZF0+2PBdTpJ6NARbO8AXcjEC63oIcalwx86oB3C19SqQ82xVX03/K1EUTFeSvcC+kXqWVChZjoHAdV/oK4DCCw5X6GU2kNs0Fm9lCJeKSICh6RBHRsPfsp0Ef2iI4QiOSuI9Df/BNakqRfJ6RynYvJy23P/SGcqfGBb5YIGnwHEvZ3iiz+NRgzkn3OgpEXWQncgOtGXhWnHh+o0paY2MO695N8dxiJhqm9FGGt4+t8L+OItJ/gwwafMqSaraMXnwLsUn9f4oBsfBYFEcuzAhwBczPdE+AAAIABJREFUkyjHJxkWLkjejS/YQ4rPa3zabzhUXV3EJ7Jl+Ozdx36jiM8l+Ep+Q/RN/AbnUrHhgbpCfoeC9F7Ah9pvEH2HXn9lBHyp36BLkd9A5IywAj6nfAvDcsnPFfFNye1bbzmc20/xdbp9uvuGcvswmttP9DpMtz+G6CsISzf0AAdAjtNyrRbASFG9kASlNBZPmcdysouuLa4WOhkWeV9XAEBv69MyRbwn46V4cwas1ZsSiFgHUUP/+iC57NYpuQYA8Xe97PMgkseBCajXsJTkwR07JbnpBDSdwNNEkjz62bh44mlrQB8kj7dK6ASdFsErHoAY/vBUsjz+EKex+JrxAeETyVWpnWBVbZIn+AA90ovqfOcQPtBqVgBAxfGD5KDWQg0+L0QYn6ccdNT4kPBJJ0j+upPRelx568AHCT79HirdDBofIyjgQ3qFIBpevEVTfKnkZXxVUNPgC7LJQlzQa8r4Kj7ZC75wfwV/ofElhhdieBEfZq0GX+o3jOEpfOQ3LD5K+BS/4dvxJX4Dtd+QOWtieJ79Ric+GMlvyPwmMTxabwyAQCTPzdJOp7K7T/kNOZkkF7/h2/3GEPimx+07hW9Uty+yfRbcvlRK8j7ehLpkRlhE7tmSGWGxGCA6XNrHhyygpWRGpQ7DMoXUlKCAxIQqmRF6uVDJZbiSGbItXVSeK4PIerdI7lpLZlTFfXyo7AuZI0tOt2ipUlKvVPEkqQwCqmBNrhdSGstEVvGEKrm04guSMz43Ij6WnJ4uIrmLASQ/0VIpCZTkVVulJBA1HXjesymrlCSldgw+34KvpVJSpSrUFPCVKiVVVYj/WSIZvqodHyh8GJ/lKT6vI+jd+CB2gm/FF0vt5IYHxvCig5gQyVEkB2N4vTI+UykpGl5eKakVX5S8WCmpjI/8hkv8BnlnUymJDa8Tn/EbVclvoPIbulJStFJT1KlKKiUxvpLfcInfIDXb8BX9xsQQfiPHd+TdPn6m3P5YOOYHbzxU9cmCOerWurZFHVVCXWwNUwGqbkPREXMYZgNU00S3RtuNt1kYX2AcUPesN4mt4AG8KewSusZxDZqWoo5W8vBdus1QWjPJtZpW8jiuSYrBRsa8XVHWWpCcsBnJ007wGT4rubZd0qs2iiQ3ocKX6SWdkBeDxbhTeo/xwbD4nMaX1LxVWld5Ld/M8HiKk/MyhjclfHLXSSUX79oMz5cMr0UvGSO34KuUXkPiYyI5Pt9Wy1dt7ZkY3gB8mKrZ5jfcQL+R4Sv4jVZ8tdI6x6fc4kC/UcSHiITvcP0GpoY3Cr4BfmNEfJ8Itz8FvwGZ35ia26+nye2H1jFHsoaRpoPolGWKLXlGPngEOx/3PB8HiEWCPG1Wl7wLBXQoq3y0jgcyW/ekPK2BgKjH6wyI0iqcVJidT0a9GgZBkVRyB+pkvSqVvE2INaCsJOD/3965LkmK41C43j+i07ow77s/rMuRbJNkd82lZ2djo2MoSJD8yQdjCaM2iVQsr/MMHGswRQ0FKJGkm5lXyDaplofXkhUc1a8bfD6ZafiWpXbca7OcxDbDGMQXgIZdPcf+4p9S4gVfNHL3SwGfz58Mr0SYwcodn674qODLSKO6OQOPul+Iz2xjuMmJl6IIzPyIKJ/xSY1StoQW4Mtp88AXdRAdH+M07AN8caoMPInAw/6lxDH2tz8KTsO+w+e6Efja9Np73Uh8/m2y9R3Kgk8e4aOC79riO/W+c/9Ky32uO/HxBh/oxoLvpBtUJsZXfG90Qxbd4Pf4jrrxr5f9qhu/KPv85RE808UzpREJc1vrh6IWoCRvzQjy9Dtklf1sUHZBfiT72mZ+KmHJ80x7WOb/7FSSaXw/zMsE4BiJP5LXTVA9xg6LLH2sxMHxWzgmKgvczUyYZ2LfHM9sOUMTlRYTmoZFTYfX2khrq8yi5+VE4NLpYH64FPFFwjzxdcvTYMrSlWa5myQNn4AlaWq2uVvS8Pkdxe+4Hc0JX/fd21lKs8sp8O7xLecp3rl53gh58qyTAnxePxJtUloA8bGVSlFzLYuzQkZbwAO+6BROp/RNSZdJVnwZeGYJH/FB23qNjF9iE3jmV8pI+p41O6334SVW3fAKkVU3Gj5p+LTi89Y2y1d82dTzhIjPj/cronYVbZEQjcDXA88LXtw70FhsBNfYgm/VDb9zbHVjxRcB9nOyjwaD7O9046HsSwnL3132v+DBwoyI54ypIDFK4jYsgoeSEaMkxvFCjFvZcOYQ2IJALPsdxQU6oOI5T1XH44Sb6v1f172SwwdBy/O3I9ZRYnY3ywOTxSvVvSQK7xoNzqsLw6Apq1rmsEjJkvD+YOHLnMZzBowNczA4/0g+9MkHQX/1LQaSYml2Jdrhw0YQxMfRLVd8Uf3h+OrliKep7pewLxQcp6J8U2KHDwOv4dsHnggbrxE0mXG0XgPvFl/Wx7NwDbyKr1vu2nEIvDljr7XNIfDsObvjI8c3hyD5gsGCjzOGH+EbBR/03xp4O3w5JeDKgJuf6kY2IOCD+YkNvp1uuCPRoU66oTe6AZ3xvW50fIINKKYbjk8mPt7gi6IkZjjDAV/oBhXd4Le64THcFI9YmH4F30b2Z4dqlr+RfXbZz8D7DWXfbQvZ/8osLs4LY3Yal9ph8VqD/JJD5HiZfO8mO739DBMkJFgkF8WIWTsvcvHvPOAaGUsCKTeZ4Ts+mt+T8ux0+YoWxVI7VPyKRPpYs9NeqEL1beL0a1lfw4uSVOTyupWYkspaHl8KJFYhuMCvS+r3v4QVLLeZUi1rmhR8dMC3Wl7wXdeg3iYcuY0tPqn44q32WhbxEB+xDG74ws3rHt+4xTcaPihKCnwCn28j//4X+HXCx9LdvHjz+bY7fCPx6U/h23w30HmpRrWOfUVLIfAavivcjCVpCi/UDVFifaIbufwF5d5VN8atbiCg4bWNA/1av753CLwZltYIrexoj28JPFp0oy0hVBvhpBu00Y2KTzo+rvj4Dp8Wv75F9re68X8p+75S0lWXzJidUMoCKFw2TSVn03s4LktmDLN4phzmkhmvIbmgBqSj0T0SK0DfrlAzWIhZjktm5JomqteoK4MUvzL/nF7bZloOfg1JlaxLZuj1B2ym5c1NqnuJSy1Pxi4lRfNrybqHfKS4CN7kmES54VtWFIqew3HzRnwE+ATwKay7Zm6W6KRlBaiw3PHJFp9iRXFavuCTp/jmfCYE3ht89AZfW+jKVRLx6Qbf7KJv8cXmulbLis/8uvpKSa8VX10pSVd8vODjPT4YZ2R1VeqGvtcNKrqxDUt9jUPgwb18dXPFRxCWLiNn3cD1qBVE0/BxxycFnwee4+OiG+imw523ip1uLPK46kb3izs+eYjvHyf7JfD+CbL/RDciLL9exKK27EXMC72GsOjExnq97Jnd5l58jYy5Vwcxq4456ay5dAuxwqlk8JSAOYS0WSM/sxCrnwqXYBax2UvrZt6OSlYvo76ypcQm+QJXZrmbGhMLBO/kzc3wCw62MdHExrbY93TTLGd7jNA41fDXB4vlapZPxuR7R52Vjd/ORjBjcK9gA5rlc8LkIb7xFp/s8E1ApAY3gvWEjwo+u1UINkL6ZQt4Vnwnyys+TXxc8dngURJfXRQb8ZGvrMb6Bl8EXvjFnIEH+OSIbw08RiKx/l8BlI2wOdgaYaSb3XIGQBh4gW9wD7yZIur40HLAJyIZeIZPBm90Y2wC7yJfHwrwKeIb6dc73fgUnxR8zFfHVwOv45Ml8IpuBD5OfF03dKsbo+Bzv7TrRjkY8T3RDZCCP0f2fab695N91w3ofU9lf/CXKQ4kV8n/pUytR57Wqkv8GDtseKKe+l6FU2mciuNUsMpJXC5+xRLHoD1+ZonjozxBKE9VzsxgebtWnMobwXPsJaluSfveCPVyzXLKU6WptYlam6+NoAwNdWP5cqo3+NDmUQGFMXzAR+1yHZ+s+CrEFhhGcG3Pp/jc64qvt7kzXWO42dYt52Z5iZYVH0ZCsbya1PERGH9oc2wEmTeb2hT3lh8CT1qT7k912+YtElqbn/DV9tx3GW2nKrqxdJnV8kWCXKZSN+7xCeDbtPZZN8KYjW5UNeuWQ8zvL1d62a5HVN3YtNIe3wPdeCz7K5HfRfbXDrU0wkH2ieXLvkk730WLpDEM7YffwJnLXvbErH2GmoV5fuE99sqIYYvAKjOW8rWxTJxqpoLjcuVCUTnCczzefIO7VBaGoeVSLGerCOCyKW5MmHERe2muWy6Sp/Ih1by6r7zTmojjYHgogb2MjWADuig6B+pqdWVSLJfAFwcPwEfP8A08FezNSFjxsVZ8suBTqUSwEZbQLIAaPtrjk4gZ5i0+dXxr4O3wUeGFoXXCN01d8EXwtMB7g4/v8MkOn4wSeBVfBl4ueynebh3f0tlJVAqgsPzC3ie+6NINvm45N91wfB/ohj1Yx5lZ7FGPF91Y8d3oxrjVjR0+BXxVN6bxFJbbSRJB140Tvpwnq32zBR5ePZWcpelGdHbA96fI/vWzsl904++Q/dANR/CJ7H/B1Lxnp9Wz07OEaaboTbIlctfzFFBcoMwil1XczFBWW78mq1pGZnF9EZN85SjrcRjKWGyCWzPDxzCjXbLTvml73XIWJT+VKKRhhk1/T78in9RMjTbB/PMYmdcUzE5PUzNFb5uC5TmxvkYUJWFirBQlaS3tmUTAcs8x6Ka44Bafu+mWK7OE5dwtr22CZRG+OetxJPFtLO9FSc/wEStxwydZlOT4svQAA2/ZRDdnz0l8+br3E3zg15LX3OJjwMef4bs+wrdaHpu9qkVtQSgBfPIhvqIbnk96rhsUurHi2+iGFEASH2jLhJ/tDd048JIdvhl4VOLQSns2uoH42NeiAd0QqPThBV/VjWf4tOPLRCbgu9EN7l/E+g7ZL7ohcocv1646yH61HEvMHuqGfib7oRvfIvtfGgVam4/V2Wx4JOFnG11eKCj+vcBh1fb6olgca5akSl13LRyw5zCXReVSuqnEUhas4V4tNkJNXBb10lg1CrVmRFv4YjqLmxKMpyMqmm5CjZxrzVX9ckfmJudv1at1LvAr3FR3MyrozLa4VUQ4kmij2CpUr6hQTQQrPrDcYhdKYOxGteJ7+dg/8KV8uKm8+1pnwyc3+IJIw5eBl7YRi2LgOb7KKwBVfJr4bBAJ9ThzcAqWK+KbvNLypXSTwPKG71rx8YpPYT25yCcd8bGXVGSRywGfYAnxCV8rnObER4jvusW3rbyt+NhSiVjneRXdUMSX/ctvFQd8B90YJNc+8O7waSn5Tt1Iv7hs0tSNupojuik7fFBdVXSj4PO7GuoGcy+NbvhudINQS79J9reWv5H9wMd3+P4C2Q/d+BbZ/xpksSU+C6GXpWcJXhKSWK5Mr+mVTUqof9tdlNiXvtOLRW3M5fnnwbGZSwjNy8XAM0SNRUTrmiYSKeUYyEhYLjbcUBig+eWkWC6wZEatgrMcNYuPueYZ3E2z3N4AM8G1yTF/xJ9DMAvlHLl4btwH1GG5uemWM1o+/bI3wHxa3ucoXvkqmzdCeWlyi08QHxV8Pi8UlgM+jbfugCZLw2fqL/Z22g4fJz6+xYclFZLrKE3LHZ8Hng8t1W+BiE9phy8OLoHnmxHD5AjCGFoD7zN88haf3OHTgk808cUzjVk+8emKL1+pDMt9zipqlDo+TXyvHb6iG7PUlk/4roaPGINWV90Iv7puNHwSm1t8B93QEngn3Sj4Zpz7Skl6Nd3IANgFXgK6xSeBTxq+VTcKvlwdEPHxbe/7SPZpJ/th+Qeyn++G/ktkX/QaxF8iNkvOsfqGTZore/6p7Z2SxzhNz7GpcEKlOBXH6io2Ly9+TuoHG3I7SX4ZBy9n41yOy7GyxmabW8/DvMfuLbdoqJaTJ5xWN28sF7Tc59/JVwbhttctJ6g1cL/8P+zjGJ5g8GT4LT5NfAERLa8ppTM+QVLhNbf1gOqplr2Yk5N0MPYCvnoqeYhv/rbhy1II/2McdodPN/jYl+YpgSfa8Qni0z0+yU3EtzSyNEDcA+8OHzQjtNUu8DASIvCgKdbAq/hAGdg6+1437vHRDh99G76dbsgj3eAPdcMSk57Vyy5z1g0p+LLPmm7c4rvRjQf4/mGy3+TxoezrHb73uvEdsj/3fhlIjbaDKon5PoOPzpK6lpb1g2EvWgAZe9xrbmwOlvbb0GuBko3oVKLeduv6GjYw0cVyaZZDTOTQJvfy2S/dWM7N8jnYdEUmib0xoDPLCS2fXN0MyQEdfhFXF3zNLxsmxw21tGqeP4Z7WzdTkXFv4DM38/lmCorc4CPARwL4/KNaiQ8CT7NjXBt8Wm6odnXu+IzyOfDmI+yKT+KGqnE5dZobfD3wml8pc4lvCUsJQFP6W6c44oMHphWfFHwgwbl61F3gNXws4aZ3N97rhlZd2yJo+PhzfFs3i24APn6Oz3XDyljopMioG0K87VAqi+W198ktvlU3tFn+Cb5b2ec/X/bn60OBTyq+h7KPS/X+TbI/N78ivS8xK2jZppyzLs/+OcGtxKL5DrVtzpnliTymOOqkU1l2XK+LmGPqRvXyFU7scqEXPmeNz/651+tWrGlekHeRsJzF5ww5LWf/jg88++PkzIDNSSUagaIsgjLrjtkLdLNO3eTETrTqBBMHS05Jlamb2QjTzVH23uMTxEeAT3PG3m1r+Kjgo46vZlaqX4mPEx8jPl3wMeDDvYkvA49Z4iOU+hYfC0smJoha4MGUb1iuEHiMgccIKPC97vBJwcfWJgPxKeCjhk8LPlEFyws+9hvJrvf1wHPRDMs7Pn2Dj0UAXybUO75IjKFulISf7nRD9aQbHR/HsOAn8N3oBs3AExmhGzblu9eN1vue6AZ13TjgW3WDe+DxWTfGEd9T2advl335N8l+KUqaTYPp6JKdFpsc5112epZF5N5oi/hoIkP5FtY0vkbszU1iPWWnEblZLpvstGyy0/bxThLtbpY0u0INBbNVSbTsdHyEr63VolyKkpRrcQHLWpSkWVwARUm5iTWN4PXoRUlai5KYOj4t+HpRkiFY8b2I2apaAF+rapFWlBT4eIsPHaFZXIBFSZJ+jaxq8WIrUa28JKrhoMcmvpuiJBAX3DzhI6lFSVJ5tdo/qoHnoplVLbLBF6E1p7Ne+8D7dXwZeLIpSlLafTr3NazEsdaGVN0wv9aipH21Ds86T9QNbbpxBT71qpYNPgPUdWN4UZLoVfBdH+KjiW/vJqVu7D7FusEHywEuuiHwNTeQRw7d4KYbpdTR+9e11w2k+X2yvwm8N7Ife/lvlv0Iy2+R/S9Y6sm91csWBbZ1KOYpFMaSpqHhgNSKdoHHiHkwPOIs9dMxZI7lbGz1HPWSaJ92oFLgHs8lOZCZlovCb23TKtop72qi0SdxyNwtJ85G0HRTsdhaYNTDUg6eI6mRfqnIRdUvOxjfu4C8+lomLrB62ea9C3cTLRdd8PERn8LePb79azMFn4Dl6OaCj9/ii0HxBp/ap5T0EHiUZREdn480oREongxu8OlP42Mvmviz8fm9Qbf4xjt8csb32uHjDb6Tbugv68aKL5fBKvgqoHBk0Y2CLzbRrwFDFtCN9tqMgMhcKz6+x3erGzf4xg4f7/Bl4DHg+xNk/6gb/0jZP+rGE9lf8H1ZPYJPOjNkgInt5Vb2DDPuhZy5XQ9LG3haTHEqO+F0kj3BkAf3go5amcJo1WqMLqcyFb63PNwsloOR1gix15HDwWH5tTrSNknQKvNrPoig5dEIxJCTV/z71pGsUPgY3+qXB9wZ39rmDR/utVzFE3y04KOD5blZjlnxoeWCfr3FRywHq6ARGr5cW0BbI/A7fL33rWFZ3JTsfbXn7gKvF0zd4GsnRHwtlkS3luuTwOOf143ER+fu1hthwXenG7zik3f4PtGNWU5BGHhP8TmaFnhnfNLw9YUdWvB8oBs/ie8j3Sj4/vmy/3V7SXsk33b4eTMY+4ML0eGullNtglviDPu9cAZaW+ds+arXaCo1Y7wOwiwXtLz7hecf+VvsGO1gGXeW68eW3+IjObc54Jtu1g5/i29v+T0+rfh6H26Xe9MISGRtczdya3nBV1nzXnML6xIJH+LjW3xrI1BzU+5sW/tmnup9l1lD+iO/muXlVOvtlrnvXfrXAd8Sw8XyD/F92vu4duTWnr3NuV+uBJ50y3cSdEPkLT49+/VeN27w/Sf797I/F8ePieBYnnvODPSPMwyYHyY8GKewfS/BQ/EgGbZssT2wE8NcDfWDmW1daTt4znfb3pi455jEqHMaF/vB9oYTTt1Uy2d5G0wharo5mLXthRe6oU3Q8tirG7+YPDFmBwtO7PicIVjOy0yp8RrM/m2NsPwTfNctvmvFR2/wKboZpk7LEd8LltrByc8jvlkg8BE+hrwL5V5d8K2BRy3wml+sczkFnAG+wUcLvnHGdx946dc28ACfevZ965ds8NlXBcPyho8927TFN2fPYCrbFuJZA2+DD+bkt/g+1Y1P8BXdGEfdaPgw8LQH3nt8P60bC76cKZ2OdHw3utHx/Ttl//pp2ZeKb9WNI75Hn28bBMnqKBVxisQC3/+ae6c/vP0M03X/HZ8/XoMUP8M0CtQfcVfzdlRU/+ltfj6QevGOol+w3tXq1/odn+vy7/hcg8oSVmY5xabvXdfJi2/y+a1i//m2QYpaM1i8SFjR8tBQr9ZBR8iIAD454INgRXxhecenp8+3/eGWa4vOafmPcASClerNYCz4WBZ8sVzZOPi1fr7tqp9vW/GN6IQZeDt8hRfxgk8TXw28D/Bl4JUaiuKmqWT7fFv3y4SvhWXHxws+vKsBPjOV0nLiphuRlt7rBnngHfBd8l43nuIjrwH8kTpYbhVFN7K7URuURFje4ENHGr4Xfr4NisjML+tuR3zOq+jG2OhGwScLvoglAsu/R/arbjyS/dK/UPb7XU3926u/g+z/8WX3cOasucKyCLbRgSfAMK+uOb6YU8mQhGf3dlBCnTdz2RUXMIy5yNdds0EWs09wR2RvhmCYjiYum8wyC6ZHVDxyDGRyVBWWD7Cclk2C7PSskRPJyGa2YtpNcQH7B8Z91GODrLBNhP3JgHyewfayuUluOYsK16y7d6TAF2PYHb4yPHQiZpvtlT2+YW5C9Qeb5YKWU7fcqlq2+PiIjzb4vCOJVS2e8I26Vsvo+MxNaASVc1ESMRS5cLecRZgP+GiDj9/hu+19d/h2gVfapOLjz/DVvTZGCdtsrqxYjqqy6gbio1t8qBuAr+pG4rMPpw/QDTnrBkPgWY0SywmfqUrBh1VIVTd8ZvXX8aVuKITWDb5D4CW+P0P2D7rxL5T9ohvXmCslDS8zYS/okJhlFh2Z0PaXams6ahYmECv70lzEIpa2zWQ4529rygdqDfLMy6b3jfJuslkublvbm+uDoOWQk9/mQuJ14JpCiE3JqpOs75Ddb8VLe6TO3RfL58H2YmJaHo1Q280m8d0ROBWWimzxlVM5a8M3MwqSlsPmyPSGv7/PcDnHN9ByKfjID4ZGSJq7wKv4ZMFXCn+K1371HmlhjLSDMUq5BF7Dtw88wBex5PjS/RXfiOsmPixoioRr81rTa058sw1L0HIJvBalHIG9DbyOb5P9vcd31o3W+6xQK3VjLxSL5hR8200tfp10g4+6wb3LSHYZ1A2PfxFUBjMVuqrIFt8maAsCb3NddWMVz1U3GNp81Y0Dvo9lvyrDM9lfeN3J/qn3bWWfPpP9rXT/tOx/MVvpuUukxY11wvRf44+t/xPqpi84Vw+Or+FoBF8aNK/oRTSzpIq8seBUUdTnF2IlsfJXFhU7j8a1yH+Cxoi1u8w3k/wwS2eG5oabJLaK2MYvu5xSNBSvx2RYz1NZ+Y97zS7c3qQYbRosTNwFTsX2l8QnEWdpOeCTblXikzCseRd925vdm0I0La+X838BH0SzEzFSAqs4bfDBjS1jiWVCpNQmW56NmwthdrSn2tpJhsDvUtRs88bHm4odFoHnrR3m1ZNEb0J8fkOy1p5AA5/ruPcOsgtlwCe+EglzrTjw3WWO/SqBD7uDvcTi8ZDRIhWfYG2n/Qv4im5EkB/wQUcWdxCCU7pu5L3f9rJ/Ws4Xriq6UfDVOG/4tKCJFgvdaHEufnLTDY8QbKjAF9eivR52fDH2SpmqnT1lZNWNdqpNZ2+ls15E842yz7pz85nsy79K9r/mA/W868q6VguLP7BbO8benLUg9odiXCVZWAQf9ilPdTHFs7/gjAfMWtjQI2bPbEgF7+S2NZSnbZTv//nlPODsYJx0SsvRzT5NUSx3U31vPxWzqFgj2GCwr5ede0XmQM8sn0heft3iF2yKXrFgTfFrh883bVCmi19rI6heU61OjWCAYBVy9te9bUZx+lXxxRnM8ht8DPi0uAmL428t1wXQBh9+P2CHLy/HAvh8yrdYvuAbZ3wM+FxcZsIl8TXLtYblU3w5Q7UPPMbA4zXwpLu5Bl7ZK4DvqBvzJzf4fHT1tvfd4ZMtPliU4ITvvW5IyTWEjHiU3uCLwLvTDSm6kf3rjW5s8HU3+Rm+v0f2pcr+ohtB5E72GfBdB3x/suzPie4vLd3M1k+CYpDy7bp5cF2SpuTkBy72EUvuQbDCwhNK7JuKe1nUvzUYS2Z402A6OiyfAwRfjCP3uuXKvC7rdRXLYy9ZN6t+dcvRzWq5BevVLF8+V9T2bix3bMXy3gj9yzba/TJHKDfbmiaWk1/9ksWvbIS+IJkGLy9ywb1v8BHia276uoYReK6SG3xXwdd5lcD7KXy56mGu5KJ0CjzdBd7Br6r+G3wD/HqID3pQx6cFH2uIprlZ8V2rXws+CLy4GWx14+DmVfy60Q29x3fQjataDviOurHFJ6ahXTfg9vxUN6QH3if43ujGh/huZZ/+ItmP0tTnusGLbvyc7F/fJPsDPt9m93DZLOrIMEau3oIDbUQC4rYEAAAWR0lEQVSmsS5UYKPIqy9DsM1avub8vBwOVVZvy1DlQDE5sQ03xmp5tNQScF56IPPRDRuBYLwWflUNxbV8oRGuOtJ0v9Ly6le4aWXA4Wbs3a/JmfiamoRfm2C9cPkhUa2WwzMo4LMnVL02i8EyWN7c9MCr+LhoKOLTEz54Qi34qOKDJ1TVi9yvI76i7+ZmCbxP8PG7tXxhRuEBvpPWwDdKt/ioApplR1JWIZZT4B3wQeDZWr651uMnuvEIHwbeik/0ik5R8ckH+KpuzKsEIHxChShdphCIi27IR7rhbuo73YAn1HPgPcb318u+/Jtkn21hB7EMs3UkjqlhyOcL5OQ59rJw+VJHHNyrPwg2w9vYG4n0QXF10fwaRtubRs5QDoFgyDqE5WmVNVym9+mYnbZNqqaiX5FlMdtiwr24WRLpBM1r54dPFvhMQtQZ+dR33i/Nr9nm1L6fANeNvUd8kvjGgo99IigaAcNDfLoyLP8QH7S5Fjf3+KThE4ECGaw1YOn4eIcP3bR0S34nR57jY5sYL/hKI8SdqeEDQEd8LFSqdX4Rn1DBVwKPZcEngA/3+q39RjeO+Lx5q25IB6TlhG2vqeStbkgNvD0+7fhmm/RTBT7fS7sYPukGFlvtdUM3uoH4/BZ4h2/KPWsNPE03wy95gO9vkX36+2Rfs807Pvoc35dkDYXW4M6uiHtLnpY9UT+jDcoaoy14aTuG7Hfdm103/I8LsddZRY4aupyslnMWF4TNtjckmK0MQbi5mRUNNZ8vcGY7VbW82OyGYVHSajknOd60mLs/LyfF8tqA6FeJmNyL5TlWCIb4WuWIK8iKz2sTjvgk8EFDRXv2RtgEHi9hWfAxNkLHR4hv+x/Znm45S9gGEAu+DDwGfE0jvGSDJbtDWl7x0YoP3Sk0F3zzjuv4Stze44t/fw6f+fsG351uZN8UoOm6seJbCkw+1Q3+XDewjv2MrwQexMwGX0aXNYL3UP+349voBlxuqTNa8R10Q8Pab5R9Dnzsf/w/kX3XjaAf76GKlBeS7M4/LCHMOdxbs9PxQlLu9YPjhSSCt82kz2nYJr5K5aOzOYHjgyY/lY+hfPqxWi5KWdWyWp6b+EKSHiyvjVAsl0hWl/dQs4nAkbQ8Sg/gPVS7+oyPKC4Iv2YjxLOCbF5klJyc0SvfJ/tJfOkXWN4aQRPf5j3Uis+CkmWWRXyIj+7w5RwUzrzhm3CjWS5r4LXXAWvNS8d3tHz2yT0+eopPfgIfTJedA89O5V7/Aj75pt43DF/RDVl0owdewUerbvSal+f4iuUT0Amf+VXwVd0gaTHMK74eeG/xgW4oWL7gQ92IW0Li42yE/2T/l2R/eY34sFKSXiOWlvBMAJdNZlzxBJeWcCN4LpmhvmSGvfN+v1KSz0rPggtcxIREcaWkaJql2G/gUiCbTfAL8uqxUAjHkhn5Grv9tiyZEYJultclM7T6FaaKVL8OKyVBYsz8WrLuY7fUjlY3ueGTPb5wc+NX4BPAp6eVkrKgo3jtlr/Ft+Nlt4qCTz7Ch4GnBdCCj97j26RhCr7dSi6WDnyHLw5+9Q61wcdlqZ1bfFrCUld83PGFqQ3fzEgRWE7cdMNXSjroBhXdWP3ylZK2gYcrJRV81xZf8IKVko66QWURRFgpKSxv+KTg88BzfHzE98JFCdpKSTt8stHDgm/RDaWlf6XlDd+fIPtFNz6W/RJ4v53sf72I1JZTUhaZmW1fU0oG2RJTGZ357ToZJHJdr0HpLX7pc1Ic5u2YizqW5a/01VbDGiTXH6852F+/XTcqRVjlS+LbkLFO3nDLTXrcr/wo6R+vQSJ7v/S6XoNyTU5fDtChzvMncmuE1S+x0dy0nFjDr+mm+wXqb40QljMQiXW8aC4GG3vn6L7g44qvf/Nyh09NEQjHoZeNNBHffM4DfAr4wpEKaEzL0ZF6z9vi0+uA7zJ8vOBjcDPW8p0LklV8I5cDJH8jawk8wGcqmfh0h4+f4xsVn4cl18CrotlpLviuupavu9kDLzdjLd9bfGl58WvRDV8qdqcbgS8Cz25jB3wf6caH+KpuUA28Iz7UDS2BB6qy6oYPtopuyAPdENONBV8HtODb9C8LvFt83yX79HfL/kk33sp+k0cchbyR/R+DvtiyuPbcap1B5ik0NikmyknmXs9O8/zALKSyrS1gkzmex8Xf2LNkOOz1q+NeXwUjDhYWG4KxX4gyd83zezrENqAQO7hYHlMHLIqbMZnpB+vwxWDnEmvhF6GbaQxME23cNFNH3YRGSFOjTaYj8Zkn9yt+qz+Jjwo+H1B3fB0Q4KuW3+EDvxAfbiY++QAfG8TWCAWQ45un6n5t8BHgOwUe/HaL71rxYWhh4AlYPo1f3VzCMgG9rPfFE89t/6JT4Hn+qQTeCZ/i5hp4C82uG3TWDer9KyznO7/scvIQ36IbW3w98MDNwCe1EUA3Cr5FNzxvNy/0TDc+xYe60fDJDb6flH0uYTlcPH9P2QfdYN6F5Y3s6xd5Jhb+L17cIeQlDxQ53nkuyC1T7M2/zyOFIH9LnismhkUo8jChehiLgD1uhuTlCH5OdvxcWsX+Ui33RgnvPDVt18VrYeY5Kl/yKtVZvFxtnNBcszyLBWJv/Hc0Qp4qYiL+byESSXWPgzwbOhh1Kys+bviihgJsy7qnLT494it7oxHQ8vwLuCnRtg0fbfD1UyU+KfjGXH4lTmVXMXy9zaeDsOgS7QIvkHEC2uODIA9AcoOP3EHq+KTjk0Cc7VPw9cAL72oE5npDUiyvUXeDD2M4o6XqBqWDUGuz6sa8+kY3Al/25d5/N/ge6sYO36IbvOhGaQRBa9NBDnyy4Fu6zK1uCCPcotUbfIT4drrxzbJfFPsXZb+49tvJ/lcMqcQVRCSKmEtOnjDHK5cfnAM6ZuElA4wD8Hl7xyrzOHOOkvTCoBSv75AYKpbnDPtXYNP2UlreTmXjII1R0jTVjLm1vGTO2VP0MCyapubB5AdLJtJj/OWNUC2P366WixTLoxHccg1HHuDLQa4PRdNNePYS1gUfvNLn+LTgu7P8Y3zECz6KRojZ6Y/xBSCWawwfinKa2vDVgerP4OO3+Kjgoxt8fIevW44PJb72b8EnBd9t4BV8W93gu8CDZ5Rh+FI3nuCT8MuHOze6gXMAnwReLJz0c/jySR0agRd8GXjm11E3Et9d4D3Gx3f4fkL2QxlQN97Ivn4i+/pPlf3EN2WfvzQXxVBi0Vhbh60UMCaRWex6M0nD+C5/PuzDwi6eY8ApKd2s/cHi32rAGW1iubywjdlXIfAJbuJMsxPPl6YtLdzSgYOF2aq5Ir2kbR4fLGdRxZfBb/0S8MvyLqzEEm9Js2BOSEmwfMAGehornkzbIP9HaDn6hRkIx8eIz4pcMCEB+DxYW6JlhOWi4jmGnNPwTVtbJ/H5S9NXAdTwyQ2+sHziE3DTAk8LPgw8wGd+6Rp4uc7A7KKJjwu+sM0EYovPKh2sEyY+ANTwXSs+d3MkPkV8U1xKCYxH2sf4tLjp+LTgoyM+QnxXrb26ooLJG9n80hO+yav6dZX+tcEXHcrcvBLfRjcUAs9MjXRgWu4H7/BF8fOCT1tSLXlJ4gvdeO10gyjuK1FdZaOQ0A2pgYciY4EH+GiH76QbxLCiy7fJvqxuPpV97vj+Ytm/vkn2pyNfw6oY5kEdjJc5Tec1/QFvfzRvvaqFYXMQjyVYIRxtpaQffrB3wigeg+qPwRiOsZdgk+FgiabRuBnYIiZp+fytuVkthw/PKi4UUot33PLyW4u/Uv1R7ojTzbCcwXLzC5rIw5H1un6McqvwvXf4Sjhq9quH+IrWpEq65ayi6t/L3OMz+VgtR5pj3tUAnzrcgk86PrNtwUcVn8y96oB4h099fGMIwhiaTzwV0B0+jFIDZPj8Xl72BgJXyVt8bI2gB3zibr4qvlPgHfHpG3zhVwzYsVZOGPH5zbvgk4JPjvjCr7h6xce5VxNQ6sYtvve64SX60/LEZ/e8DDwx3WA96oai5VkB/hbfWTcAnzZ8/B7fU9n/VDf+32T/S+y52Ga3Z38Qm3eK53Hbq7Yicz68TykfXoVMZHtFZ7BO8Pg8bjNmc3QpuRqLzwPgdArsJf+UmMDTuluu7OuGhPTYwbYGTUx64OQAWp6N4N3sznJrhBgyL5ZbQ3k6RFTtu5JWmm/TJoyN0CzPST+w3BohnqWK5ehITs1NfFbxCJYXfBGdgK96DW5GTqUCInNTPsRHCz576OQIdFVoVbZp84qPwK+3+ODg5/gk54Uy8OgUeJ6PKYEX+GAT8WUzUulf6dcOH+3wsShXv2KeTVZ8kSwwN3vgvcEnzU1hxCcrvqX3heUP8DEc/EA3pl8f6sYWX86sQv9C3ZB3gQf40PKy9z2+q+Frln+E7x8i++Pvk339Vtn/ip7MUIsxPWHL9+bfBQ6wn7CwQHa3V6P4v5ndtfS1tPPAFblfJc9Wi57cqvn9znKkZ4/3/xf/d0nO59emxC23s/Hu0iyR87emKIaVw4Q99b0zJo7RYnmrOSplR1qNX/FBe9o5pZyK3WZ0dsVXAG0bQeLvdINPWjVTIbjD1wNP2jF3+Jqbd5av+NbLkVd/3Ji9wdcac9aM1CVjekwWsgJtu4mExLfUdEBTS8GH14pNjl/tIoG35zxSNjR3+BbdaFCqbiA+2YflrW5IFpI0fNKO8Wq1bZSy2NcSN4EnJfCI6+V2+JpurHp4xtcRRMc86kbFVzvprez7aGkB9M2yf6cbv5Psyxf5SGSeMcYp8yY/YtOaGzYjsz1T2TGa8Bv4bL6o4CDLP1sGmHFAl9npyDB75jlHK+JjGWuX+K3gADlHWDng6qdqlsfAJyxntDwPFqeCTeQvZrjl0AhU3Rx+N4W9Ui1XthfUwi8YlFn8YSMYoIYv2rzi63DRL8MXexGfxksCCKg/e2Wbm1/S8MXV6R0+AnxSLzSDB/HFU+N4go8bviXwuEdLNsL7wLOXEQv6B/hKE8kGn12Xe+AJWN72mlod8VlrOK97fMXyeSoCNzHw0K+Ojzb4aMXXdSPdDHxH3Vjw8Qf43umGFN0oD4JSAq/71XRDNrpBXTdSkQo+7fgCAYT0ohtYrljxbZVhVCLoCP0n+7ey/wX5JMi647vGVPIuIzZLdhqm5rPIyqahfa/g5Pi0RjWnsIenyu353X4rUqewMwmPiTER7Zb3aX0s/EG/PFxwTROtlq97N47M7LTEsl7GKU2dfrVNSCCVVIroxcuKcehXd9PzE7iwS8e3ONKrWsJywGd7ueKbRUlhavHrAny5KSd8Lh9Hv2rgzUBPvxZ8jPhUeQMX0ksYeJKbgY9u8EHaDEKrFCV9hg9sm1pzg4+f49OKD/LQR3z8FF8IU9eNmq8dyKvhg01p+Daqknu3uhGNoLuqFrDcHi+2+KBDvdMNP1hqaE0JvsdnSVbvUCd87hfmNZdqnQWfIL6qh6vm/LLsbyx/I/sHfL+77FtR0vSHo5DJi+J8fQ0ofLjSn+lt5HiZJJaWIGiLcECLt75OXnyszlbB+MPj7xqEafbLqglqXn1T/TH3DrNc9CoH2zp5kbt2Ry4otqrdrMkHs+SKJytF8YO9FDA2Y00TL4uIUQ9ano0wN2HvFW665cbLBSI3Z3Te4VuqWhhMpWp5x2dFcX6wp1Lu8Pnma4PvusdHrP45sMAHNRS3+AbUeTZ8USjYbt7qlbelbtADT6CqBf3yTtjwFTf5Q3zj2/CtVS0KFY/c8EnHVwKPpXYoqbqRd/q0fPBGN8rNYPHrpigJdSPxlVL2ohsd30E3GAJvjMLrhK9bXk0FuHt8J92gRTf2+I66IXyLT3o13K/K/t7y/0vZ/6ovP5m+xyZ7dnoWrDIuPO3+SH0ykDqWlEg4c98bw6j626kmsVdi4Dkvx7bsBePrTTHcEC/dtHdDfZJKyornOocq4mOuuDr4BZZDJYLkJFJzM6GG5eyvl8zLsfjHjNKvfKVy1gWM3dASLBfRXGuUWQ74lHJ62fGlX6VwHxE0v6g1QrO84JMzvgsBOb5mOeDjB/gE8MkdPmiENfBa0LLIGnh2qrk0HYkQM+yFR4HAJ1ci2DUCBN4RH0zDHvGBXywP8EEzFnwi9sTzBJ/oFp9WfHe64TOEiW8Xlmvve6AbG3wCp7LCznt8/k650ibwOj4u7ymGXzoyCWIxjG6OE76wXFI3xkk3GL1uurHF52vevsH3n+z/kux/zXORJf8lNqcFU5f9j5oH+7x82+ubEmDij5R5eMW9bZPcGBIpe1mJ2qnAmPVgPBVYTlL94r1f1fLmpmUd6GA5GsO9EaT6VS/nfuXlpBjT27NY/hG+wos2e9/iuzt4aXMLx4f4biz/ZXxyj4/WwLtpc14sv8FXw3LFh60aRM742sFviCx+LQe3Vr0PvIaPG77S5nyDb6MbulguNfC0d/afxlcDjxu+FsNsbsLeImJL4G3x3QXeJ3513Si97yPd+MfJ/hKWv4/sD5avEWuizgQSS2zO4Tln6lWJS07eD2ZUZP9tDEWL3CwD1dKyZgzD8KHstfO3zdmysGnDouIIY71A7GWulkvWGlzul/jeGAKvll8nyxkOnoMmis2I4+5XEiE/1aAsaELLkddH+MDrj/H5IPcRPizFCjdJtOM7WP4L+MrNAwfgN/hoCbyKDxyJG+oxLJUkLacSlt3yMHUOwOk9vvSrbm4s7z2o4hu8BB7fBt6KrweeoOVRDLLDdzV81r8qvue6seL7QDdWfDXwOP3atPmiG+nmAZ/WU30QeBg2H+sG9/7158h++vW7yb7bFo2gz2UfP982vfUXeKcOCsyG85zRJszTzmmEP3yCOz+dI/D5ttlz5vXefMdnXm5+yYEjdw3paGITdOKc/JwCkXOh/TX2CHTbFM0JEPcL1/4Q/46PP/vbb+H7X2YM5+eK8Ds+aTkeLJYOLJsEjUDxAan6+vAgbp9vyylfsDz8CnwsFZ9EIzDie1U3x+JIx6f7z7eB5R0fWj7Yi1wWfLrDx7Lgk4pv/Zqb44sp3/r5tqgmgM8wDRbJD0gd8OUqM+nXA3y6NsI9PptMu8PHNu/dP9/W8L2IefMduoqPs+xIfc7wiI8S36ob9E43Ap/qH2O4m0VVHuuGFN1Y8dH6ub0b3Wj4mm6wkOf/tvg88BDQNUuWXiPwhW5AWJojV1q+/3zbIiPHwMtb+x4fH/H9J/ufyf7VZf/rNfiCoqQXybWvarER2XX1XvfjRak1VpSkqTUzpDA7ndU6Oq9u0Sn6Y5Blp2eezG3jORs+N4cladJyL1i9fI0M4rnXLGeWEXttGba5YA2JD6ijNoRqDQWxvCgtJ7BcITv9wz/SZFn3wddy8Cu/kzUtn1DTchZh0R+Dr+uPmJq3ve5mWM5zROZtMteTi88VPcAnga/IfbE8yiIqPppuOr5h5e+JTyo+t/yaazx9iI9YBjd8Yvh69UfHN1heh8CLYiuJRmh+NXy+UlLzq+DjAz6v1vlr8e2X6Hp1fNzwyT0+6fiKbkx81fKRltujwF43FnwvgpqyI75puYWlpKpwFJJcO3zS8WXgWXUVywnf3Fvx9SqkV/VrxSef4wvdUNSNgq/rBhfdsLzmN8u+VtnXxPcvl/1Xk336H5QCuBVECqaEAAAAAElFTkSuQmCCAA==" /&gt;&lt;/div&gt;
</description><link>http://pranayamr.blogspot.com/2017/12/dynamic-html-structure-with-ngif-ngfor.html</link><thr:total>1</thr:total><author>pranayamr@gmail.com (Pranay Rana)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1194836729866470946.post-108281674215761916</guid><pubDate>Sun, 10 Dec 2017 18:21:00 +0000</pubDate><atom:updated>2018-03-25T15:20:18.398-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Angular 2</category><category domain="http://www.blogger.com/atom/ns#">Typescript</category><category domain="http://www.blogger.com/atom/ns#">WebAPI</category><title>Download File in Angular 2 Application</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
Downloading file from web application is one of the feature provided by most of the web application, when user visit web site and application want to share required document (Ex. Dynamically generated report) to visitor of website. Downloading file using serverside front end technology like Asp.Net MVC is very easy, but downloading file using client side language JavaScript is difficult so in turn with angular like client side framework also.&lt;br /&gt;
&lt;br /&gt;Below post is about how easily file downloading can be achievable in angular framework based web application.&lt;br /&gt;
&lt;br /&gt;&lt;b&gt;Angular JS2 – TypeScript code&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;Below is code in angular which allows downloading file from server&lt;br /&gt;
&lt;br /&gt;
&lt;pre  class="brush: csharp"&gt;
&amp;nbsp; constructor(private http:Http)&lt;br /&gt;&amp;nbsp; {}&lt;br /&gt;&lt;br /&gt;&amp;nbsp; DownloadFile():void&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.getFile("http://localhost:1800/api/demo/GetTestFile")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .subscribe(fileData =&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; let b:any = new Blob([fileData], { type: 'application/zip' });&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var url= window.URL.createObjectURL(b);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; window.open(url);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; );&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; public getFile(path: string):Observable&amp;lt;any&amp;gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; let options = new RequestOptions({responseType: ResponseContentType.Blob});&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return this.http.get(path, options)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .map((response: Response) =&amp;gt; &amp;lt;Blob&amp;gt;response.blob())&amp;nbsp; ;&lt;br /&gt;&amp;nbsp; }
&lt;/pre&gt;
&lt;br /&gt;&lt;br /&gt;Following explain part of code&lt;br /&gt;
&lt;ol style="text-align: left;"&gt;
&lt;li&gt;&amp;nbsp;Angular component makes use of HTTP service which allows to call server WebAPI which provide file&lt;/li&gt;
&lt;li&gt;DownloadFile is function get called from component html , on button click&lt;/li&gt;
&lt;li&gt;getFile method in code takes URL of Restful service to which need to be called for getting file as response&lt;/li&gt;
&lt;li&gt;When making call to serverside method using HTTP from getFile function , http-get function make use of Request option which specify responsetype as Blob.&lt;/li&gt;
&lt;li&gt;One receiving response from server .map() method, map response to &amp;lt;Blob&amp;gt; type.&lt;/li&gt;
&lt;li&gt;After getting return value observable&amp;nbsp; from getFile function, DownloadFile function create Blob of received value and also make use of property type which is “application/zip” it can be other type also like “application/xls”&lt;/li&gt;
&lt;li&gt;Finally URL is get created from received blob and it get passed to window.oepn() method where download file dialog get prompt to user for downloading.&lt;/li&gt;
&lt;/ol&gt;
&lt;b&gt;WebAPI&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;Writing code in Angular Js2(typescript) code for downloading file is not enough, there is also need of writing server side code which provide response as file. Below is server side code , this code is done with the help of WebAPI – its framework provided by Microsoft for building web service.&lt;br /&gt;Below is function defined in WebAPI which provide repose as file&lt;br /&gt;
&lt;br /&gt;
&lt;pre  class="brush: csharp"&gt;
[HttpGet]//http get as it return file &lt;br /&gt;public HttpResponseMessage GetTestFile()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //below code locate physical file on server &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var localFilePath = HttpContext.Current.Server.MapPath("~/timetable.zip");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; HttpResponseMessage response = null;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!File.Exists(localFilePath))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //if file not found than return response as resource not present &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; response = Request.CreateResponse(HttpStatusCode.Gone);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //if file present than read file &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; var fStream = new FileStream(localFilePath, FileMode.Open, FileAccess.Read);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //compose response and include file as content in it&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; response = new HttpResponseMessage&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; StatusCode = HttpStatusCode.OK,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Content = new StreamContent(fStream)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //set content header of reponse as file attached in reponse&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; response.Content.Headers.ContentDisposition =&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; new ContentDispositionHeaderValue("attachment")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; FileName = Path.GetFileName(fStream.Name)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //set the content header content type as application/octet-stream as it&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //returning file as reponse &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; response.Content.Headers.ContentType = new &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MediaTypeHeaderValue("application/octet-stream");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return response;&lt;br /&gt;}&amp;nbsp; 
&lt;/pre&gt;
&lt;br /&gt;&lt;br /&gt;Above code is as follows&lt;br /&gt;
&lt;ol style="text-align: left;"&gt;
&lt;li&gt;WebAPI method GetTestFile() , receives request when DownloadFile() function get called in front end&lt;/li&gt;
&lt;li&gt;On receiving request it first checks requested file is exists or not, Note: here file is hardcoded but in real time file may be generated dynamically or may be client pass file name as request parameter&lt;/li&gt;
&lt;li&gt;If server code not able to locate file then it send response as file i.e. resource not exist on server&amp;nbsp;&lt;/li&gt;
&lt;li&gt;If server code able to find file then , it read file content and compose repose with file need to be deliver (important thing in code is media type format which is "application/octet-stream” )&lt;/li&gt;
&lt;/ol&gt;
&lt;b&gt;Full Source code &lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;&lt;b&gt;AppComponent.Html&lt;/b&gt;&lt;br /&gt;
&lt;pre  class="brush: csharp"&gt;
&amp;lt;input type="button" (click)="DownloadFile()" value="DownloadFile"/&amp;gt;
&lt;/pre&gt;
&lt;br /&gt;&lt;br /&gt;&lt;b&gt;AppComponent.ts&lt;/b&gt;&lt;br /&gt;
&lt;pre  class="brush: csharp"&gt;
import { Component } from '@angular/core';&lt;br /&gt;import { Http, Response, Headers, RequestOptions, ResponseContentType } from '@angular/http';&lt;br /&gt;import { Observable } from 'rxjs/Observable';&lt;br /&gt;import 'rxjs/add/operator/map';&lt;br /&gt;&lt;br /&gt;@Component({&lt;br /&gt;&amp;nbsp; selector: 'app-root',&lt;br /&gt;&amp;nbsp; templateUrl: './app.component.html',&lt;br /&gt;&amp;nbsp; styleUrls: ['./app.component.css']&lt;br /&gt;})&lt;br /&gt;export class AppComponent {&lt;br /&gt;&amp;nbsp; constructor(private http:Http)&lt;br /&gt;&amp;nbsp; {}&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; DownloadFile():void&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.getFile("http://localhost:1800/api/demo/GetTestFile")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .subscribe(fileData =&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; let b:any = new Blob([fileData], { type: 'application/zip' });&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var url= window.URL.createObjectURL(b);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; window.open(url);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; );&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; public getFile(path: string):Observable&amp;lt;any&amp;gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; let options = new RequestOptions({responseType: ResponseContentType.Blob});&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return this.http.get(path, options)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .map((response: Response) =&amp;gt; &amp;lt;Blob&amp;gt;response.blob())&amp;nbsp; ;&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;}
&lt;/pre&gt;
&lt;br /&gt;&lt;br /&gt;&lt;b&gt;WebAPI code &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;
&lt;pre  class="brush: csharp"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public class DemoController : ApiController&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [HttpGet]//http get as it return file &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public HttpResponseMessage GetTestFile()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //below code locate physcial file on server &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var localFilePath = HttpContext.Current.Server.MapPath("~/timetable.zip");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HttpResponseMessage response = null;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!File.Exists(localFilePath))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //if file not found than return response as resource not present &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; response = Request.CreateResponse(HttpStatusCode.Gone);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //if file present than read file &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var fStream = new FileStream(localFilePath, FileMode.Open, FileAccess.Read);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //compose response and include file as content in it&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; response = new HttpResponseMessage&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; StatusCode = HttpStatusCode.OK,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Content = new StreamContent(fStream)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //set content header of reponse as file attached in reponse&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; response.Content.Headers.ContentDisposition =&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new ContentDispositionHeaderValue("attachment")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FileName = Path.GetFileName(fStream.Name)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //set the content header content type as application/octet-stream as it returning file as reponse &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return response;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&lt;/pre&gt;
&lt;/div&gt;
</description><link>http://pranayamr.blogspot.com/2017/12/download-file-in-angular-js2-application.html</link><thr:total>1</thr:total><author>pranayamr@gmail.com (Pranay Rana)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1194836729866470946.post-331771981473439542</guid><pubDate>Sun, 03 Dec 2017 17:43:00 +0000</pubDate><atom:updated>2017-12-03T13:10:30.656-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.net</category><category domain="http://www.blogger.com/atom/ns#">c#</category><category domain="http://www.blogger.com/atom/ns#">Threading</category><category domain="http://www.blogger.com/atom/ns#">TPL</category><title>Abort/Cancel Task</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
Below post is based on one of the question(&lt;a href="https://stackoverflow.com/questions/47551256/stop-hanging-synchronous-method/47555398#47555398"&gt;Stop hanging synchronous method&lt;/a&gt;) I answered on StackOverflow, in which questioner wants to cancel task when its taking too long time to respond i.e. taking too much time in execution and returning result.&amp;nbsp; But when I tried to provide answer of that question I found there is no direct way to cancel task when its making call outside world i.e. making call to WebService or making call to Database to get data via third party library &lt;a href="https://github.com/xenserver/xenadmin/blob/master/XenModel/XenAPI/HTTP_actions.cs"&gt;XenAPI &lt;/a&gt;in my case, which is hanging application and not allowing to proceed. To understand this have look to below code. &lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;Var task = Task.Factory.StartNew(()=&amp;gt; CallWebServiceandGetData());
&lt;/pre&gt;
&lt;br /&gt;
Above line of code creating task which is making call to webservice to get data. Now developer want to write code, such a way that if task take more than 10 second, task get cancel. But in TPL library there is no way to cancel task i.e. there is no direct method or there is no other way to make this task cancel.&lt;br /&gt;
So task.Cancel() or task.Abort() like method not exist in TPL. Below post is about how developer can really abort task.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Aborting thread vs Cancelling task&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
What is really difference between aborting thread and cancelling task.&lt;br /&gt;
&lt;b&gt;Aborting thread&lt;/b&gt; – In System.Treading , which is library provided for threading prior to TPL library. (Just to note : old System.Threading is still part of.net framework but as TPL provide more control on Task( which is wrapper around thread) provide more control ). In this library to abort thread there is as method called Abort() is available. With help of this method developer can ask execution environment i.e. CLR to abort thread. Below is example code for the same&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;Thread newThread = new Thread(() =&amp;gt; Console.WriteLine("Test"));
newThread.Start();
Thread.Sleep(1000);//sleeping main thread
newThread.Abort();
&lt;/pre&gt;
&lt;br /&gt;
main thread aborting newly created thread.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Cancelling Task&lt;/b&gt; – In newer library TPL (System.Threading.Tasks) , there is no direct method on Task which cancel or abort underlying thread. But there is way to cancel task by using CancellationTokenSource class which allows you to pass CancellationToken as one of the input parameter when you create task. (more on this discussed below). Below is code for cancelling task&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;var source = new CancellationTokenSource();

CancellationToken token = source.Token;Task.Factory.StartNew(() =&amp;gt; { 
 for(int i=0;i&amp;lt; 10000;i++)
 {
   Console.WriteLine(i);
   if (token.IsCancellationRequested)
    token.ThrowIfCancellationRequested();
 }
}, token);
source.CancelAfter(1000);
&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
So above code make use of CancellationTokenSource and CancellationToken provided by it. In above code CancellationTokenSource calls method CancelAfter which set taskCancellation flag. This flag is watched inside delegate via IsCancellationRequested property on CancellationToken. And once it sees in for loop that IsCancellationRequested flag is true it calls ThrowIfCancellationRequested() method and cancels thread.&lt;br /&gt;
&lt;br /&gt;
So in simple term abort thread allows developer to abort executing thread and CancellationToken in new TPL library does same thing, which is called cancelation of task. So basically newer(TPL) and older(Threading) have different way to cancel/abort thread.&lt;br /&gt;
&lt;br /&gt;
But one of the major difference between Abort() thread and Cancel task is Abort() can leave application in inconsistent state ( on Abort()system immediately abort thread not allow to perform any operation to put application in consistent state ),&amp;nbsp; especially when doing file operation or doing create/update operation , so it better to take care when aborting thread or write code such way that application remain in consistent state. That is one of reason TPL come up with Cancellation mechanism, so those who write code can watch cancellation flag and if it gets true than they can write code to put application in consistence state.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Returning to problem of Cancelling task&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
By reading above section of “Cancellation Task” one can say there is provision to cancel task which in turn cancel thread also and put system in consistent state, so it’s better approach.&amp;nbsp; But if we now go to back to scenario where task is got created to fetch data from webService or DataBase which is taking too much long time. So code will be like as below with cancellation mechanism&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;var source = new CancellationTokenSource();
CancellationToken token = source.Token;
Task.Factory.StartNew(() =&amp;gt; { 
&amp;nbsp;&amp;nbsp;&amp;nbsp; try
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //below is third party library(XenAPI) method 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HTTP_actions.put_import(…//parameter of method);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //instead of this there can be database call to get data
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //which takes too much time 
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; catch (HTTP.CancelledException exception)
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; //execution never comes here till above method get complete&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (token.IsCancellationRequested)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; token.ThrowIfCancellationRequested();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
}, token);
source.CancelAfter(1000);

&lt;/pre&gt;
So in above scenario once call made to API method it never comes back, so control of execution will not return to application and so the code which checks cancellation never get executed till call returns. Which means Task not get cancelled even though after 1000 ms it cancellation flag set to true for cancellation of task.&lt;br /&gt;
&lt;br /&gt;
Above scenario is based on Third party API so it might difficult to understand context. So for easy understanding have look to below code (just one change here , TaskCompletionSource is used to wrap underlying task)&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;static Task&amp;lt;string&amp;gt; DoWork(CancellationToken token)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var tcs = new TaskCompletionSource&amp;lt;string&amp;gt;();

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //comment this whole this is just used for testing 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Task.Factory.StartNew(() =&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Simulate work (usually from 3rd party code)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (int i = 0; i &amp;lt; 100000; i++)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("value" + i);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //execution never comes here till above for loop or&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //may be long execution /computation get completed&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (token.IsCancellationRequested)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; token.ThrowIfCancellationRequested();

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("Task finished!");
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; },token);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tcs.SetResult("Completed");
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return tcs.Task;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;      public static void Main()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var source = new CancellationTokenSource();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CancellationToken token = source.Token;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DoWork(token);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; source.CancelAfter(1000);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.ReadLine();
        }
&lt;/pre&gt;
&lt;br /&gt;
So in above code instead of third party code I replaced it with for loop (or consider long calculation task), now when execution going on application cannot get chance to read cancellation flag which is setup by main thread i.e. from main method. So application cannot able to cancel task till computation get over and control reach to point where cancellation flag check is done.
In both of the scenario major problem is when log computation or long call is going on application cannot cancel task, Cancellation mechanism provided in TPL not work and there we need solution to cancel this task other way.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Solution code is&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&amp;nbsp;&lt;/b&gt;

&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; class Program
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //capture request running that , which need to be cancel in case
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // it take more time 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; static Thread threadToCancel = null;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; static async Task&amp;lt;string&amp;gt; DoWork()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var tcs = new TaskCompletionSource&amp;lt;string&amp;gt;();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //comment this whole this is just used for testing 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; await Task.Factory.StartNew(() =&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Capture the thread
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; threadToCancel = Thread.CurrentThread;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Simulate work (usually from 3rd party code)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (int i = 0; i &amp;lt; 100000; i++)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("value" + i);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("Task finished!");
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tcs.SetResult("Completed");
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return tcs.Task.Result;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static void Main()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var source = new CancellationTokenSource();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CancellationToken token = source.Token;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DoWork();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //another task check for cancellation flag
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //cancels long running task by calling thread abort method 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Task.Factory.StartNew(() =&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//while true below is just for example , in real time&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//you should replace this with either timer or by thread sleep
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//to save CPU time (or may be better solution other than that) 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//it better to play around that 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (true)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (token.IsCancellationRequested &amp;amp;&amp;amp; threadToCancel != null)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; threadToCancel.Abort();//abort long running thread
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("Thread aborted");
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //here 1000 can be replace by miliseconds after which you want to 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // abort thread which calling your long running method 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; source.CancelAfter(1000);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.ReadLine();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&lt;/pre&gt;
&lt;br /&gt;
Comment in code explains most of the things but let go in detail how it’s going to work. Following are changes in code&lt;br /&gt;
&lt;ol style="text-align: left;"&gt;
&lt;li&gt;&amp;nbsp;Async/await used to make DoWork method asynchronous&lt;/li&gt;
&lt;li&gt;&amp;nbsp;threadToCancel variable in code stores reference of the Tread of underlying Task by calling Thread.CurrentThread, this variable allows to cancel thread of Task&lt;/li&gt;
&lt;li&gt;One more Task got created in main which keep checking Cancellation flag which setup by source.CancelAfter(1000); after 1000 miliseconds&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Task created in Main is running While loop with true, which keep check Cancellation flag true to not, once it gets true this task executes method threadToCancel.Abort(); to abort underlying thread of long running task &lt;/li&gt;
&lt;/ol&gt;
So&lt;b&gt; Real magic&lt;/b&gt; part in code is reference of underlying thread is stored via Thread.CurrentThread. And separate task runs in main method abort long running task thread when cancellation flag set to true by CancellationSoruce.
&lt;/div&gt;
</description><link>http://pranayamr.blogspot.com/2017/12/abortcancel-task.html</link><thr:total>0</thr:total><author>pranayamr@gmail.com (Pranay Rana)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1194836729866470946.post-9136274694701563109</guid><pubDate>Mon, 27 Nov 2017 18:02:00 +0000</pubDate><atom:updated>2017-11-27T13:10:57.111-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.net</category><category domain="http://www.blogger.com/atom/ns#">c#</category><category domain="http://www.blogger.com/atom/ns#">Threading</category><category domain="http://www.blogger.com/atom/ns#">TPL</category><title>TPL : Find Failed Task</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
TPL - Task paralle library is new libaray added by microsoft in .net framework 4.0. This libaray allows one to create task i.e  Thread, which means multi threading application. Task created by this libarary allows greater control on task(thread) which is very diffcult with previous Threading library, one of them is exception handling specially when one use ThreadPool for doing work. Below post is about handling exception in TPL and about how to find which of task failed when multiple task excuted.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Exception Handling : Single Task (synchronous)&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Exception handling is very easy when Task(thread) creaed by TPL. But to find out task failed or executed without exception one must need to use "Wait()" method or need use "Result" property. Below is example of same.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt; try
 {
     //below throws divide by zero exception
     var task = Task.Factory.StartNew(() =&amp;gt; { return 10 / 0;});
     task.Wait();//or use task.Result
     //or there may be multiple taks&amp;nbsp;
     // example
     // Task[] task = new Task[3]();&amp;nbsp;
     // task[1] = Task.Factory.StartNew(() =&amp;gt; { return 10 / 0;});
     // task[2] = Task.Factory.StartNew(() =&amp;gt; { return 10 / 0;});
     // task[3] = Task.Factory.StartNew(() =&amp;gt; { return 10 / 0;});&amp;nbsp;
     //Task.WaitAll(task); //for this multiple senario we need Aggregate exception.
 }
 catch (AggregateException ex)
 {
     Console.WriteLine(ex.InnerException.ToString());
 } 
&lt;/pre&gt;
&lt;br /&gt;
above code throw &lt;a href="https://msdn.microsoft.com/en-us/library/system.dividebyzeroexception(v=vs.110).aspx"&gt;DivideByZeroException&lt;/a&gt;. and same get printed as output of the above code. One thing to note here is it throws AggregateException exception, so one need to go to InnerException for getting exact exception message.AggregateException is need because in real time senario there might be running and if all throws exception than there need to be structure like AggregateException who stores excpetion of all task. &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Exception Handling : Single Task (&lt;/b&gt;&lt;b&gt;asynchronous)&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Below is same code with asynchronous.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;public static async void CallDivide()
{
  try
  {
     var task = Task.Factory.StartNew(() =&amp;gt; Divide(0));
     await task;
  }
  catch (Exception ex)
  {
     Console.WriteLine(ex.ToString());
  }
}  
&lt;/pre&gt;
&lt;br /&gt;
it will give output same as previous one. One thing to note here there is no need to use AggregateException as asynchronous as when task fails it exception get unwarped and get throw to captured context or on thread which is going to execute continuation. If there are multiple task than only first failed task exception get reported as asynchronous unwrap AggregateException and throw first one.&lt;br /&gt;
&lt;br /&gt;
So there is not problem when you are execution one task and it fails , in that case you know which one failed. But actual problem occurs when you are executing multiple task and one of task fails, then there is no way which one failed.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Exception Handling : Multiple Task (synchronous)&lt;/b&gt; &lt;br /&gt;
&lt;br /&gt;
To undestand this let go throgh below code&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt; public static void Main(string[] args)
 {
    List&amp;lt;int&amp;gt; lstInt = new List&amp;lt;int&amp;gt;(){1,11,4,3,0,7,0};
    List&amp;lt;Task&amp;lt;string&amp;gt;&amp;gt; tasks = new List&amp;lt;Task&amp;lt;string&amp;gt;&amp;gt;();
    foreach(int i in lstInt)
    {
        var task =Task.Factory.StartNew((obj)=&amp;gt; Divide(i),"Task " + i);
        tasks.Add(task);
    }
    try
    {
        Task.WaitAll(tasks.ToArray());
    }
    catch(AggregateException e)
    {
        for (int j = 0; j &amp;lt; e.InnerExceptions.Count; j++)
        {
            Console.WriteLine("\n--------------------\n{0}", e.InnerExceptions[j].Message);
        }
    }
    var failedTask = tasks.Where(t=&amp;gt; t.IsFaulted);
  }
        
  public static string Divide(int i)
  {
      var val = 10/i;
      Console.WriteLine(val);
      return "Value : " + i +" : " + val;
  }&lt;/pre&gt;
&lt;br /&gt;
Above code &lt;b&gt;output &lt;/b&gt;is :&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;10
0
3
2
1

--------------------
Attempted to divide by zero
Attempted to divide by zero.
&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;Exception Handling : Multiple Task (&lt;/b&gt;&lt;b&gt;asynchronous)&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Same output will be there when you try below asynchronous task based approch. But asynchronous only prints first failed task exception as asynchronous unwrap received AggregateException and report first one only.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;public static async void CallDivide()
{
    List&amp;lt;Task&amp;lt;string&amp;gt;&amp;gt; tasks = new List&amp;lt;Task&amp;lt;string&amp;gt;&amp;gt;();
            try
            {
                List&amp;lt;int&amp;gt; lstInt = new List&amp;lt;int&amp;gt;() { 1, 11, 4, 3, 0, 7, 0 };
                
                foreach (int i in lstInt)
                {
                    var task = Task.Factory.StartNew((obj) =&amp;gt; Divide(i), "Task " + i);
                    tasks.Add(task);
                }

                await Task.WhenAll(tasks.ToArray());
            }
            catch (Exception ex)
            {
                var exceptions = tasks.Where(t =&amp;gt; t.Exception != null).Select(t =&amp;gt; t.Exception);
                Console.WriteLine(ex.ToString());
            }
}
public static string Divide(int i)
{
    var val = 10 / i;
    Console.WriteLine(val);
    return "Value : " + i + " : " + val;
}&lt;/pre&gt;
&lt;br /&gt;
Above code &lt;b&gt;output &lt;/b&gt;is :&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;10
0
3
2
1

--------------------
Attempted to divide by zero
 ///Attempted to divide by zero.- will not come in case of asynchronous
&lt;/pre&gt;
&lt;br /&gt;
By the output you get to know one task failed, but you dont know which task failed or in simple term you dont know for which input my method failed when data coming from database or some external soruce(means right now we have static list of interger for example in real application this list of int is may be coming from via argument or via database).&lt;br /&gt;
Or imagine senario where you are querying multiple database via multiple task and one of the database query have problem and thro exception i.e. one of the task fails. In that senario you like to know which database failed.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Solution &lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Solution for this i.e. to find which task failed easy way is to attach "State" with task. When you attache State with Task you will get state value when you access property called "AsyncState". Below is line of code which shows how you can attach sate with task. To attach state one(developer) just need to pass one more argument after called function, which is &lt;b&gt;"Task " + i&lt;i&gt;&lt;/i&gt; in &lt;/b&gt; in this case.&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;var task = Task.Factory.StartNew((obj) =&amp;gt; Divide(i), "Task " + i);&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
Below is full code how this solution works&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Find Faild Task : Multiple Task (synchronous)&lt;/b&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt; static  void Main(string[] args)
        {
            Console.ReadLine();
            List&amp;lt;int&amp;gt; lstInt = new List&amp;lt;int&amp;gt;() { 1, 11, 4, 3, 0, 7, 8 };
            List&amp;lt;Task&amp;lt;string&amp;gt;&amp;gt; tasks = new List&amp;lt;Task&amp;lt;string&amp;gt;&amp;gt;();
            foreach (int i in lstInt)
            {
                var task = Task.Factory.StartNew((obj) =&amp;gt; Divide(i), "Task with input " + i);
                tasks.Add(task);
            }
            try
            {
                Task.WaitAll(tasks.ToArray());
            }
            catch 
            {
                   var failedTask = tasks.Where(t =&amp;gt; t.IsFaulted);
                   foreach (var t in failedTask)
                   {
                      Console.WriteLine(t.AsyncState.ToString());
                       Console.WriteLine(t.Exception.InnerException.ToString());
                   }
            }
            
            Console.ReadLine();
        } &lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;Find Faild Task : Multiple Task (asynchronous)&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;  public static async void CallDivide()
        {
            List&amp;lt;Task&amp;lt;string&amp;gt;&amp;gt; tasks = new List&amp;lt;Task&amp;lt;string&amp;gt;&amp;gt;();
            try
            {
                List&amp;lt;int&amp;gt; lstInt = new List&amp;lt;int&amp;gt;() { 1, 11, 4, 3, 0, 7, 8 };

                foreach (int i in lstInt)
                {
                    var task = Task.Factory.StartNew((obj) =&amp;gt; Divide(i), "Task with input" + i);
                    tasks.Add(task);
                }

                await Task.WhenAll(tasks.ToArray());
            }
            catch 
            {
                var failedTask = tasks.Where(t =&amp;gt; t.Exception != null);
                foreach (var t in failedTask)
                {
                    Console.WriteLine("Failed Task is : " + t.AsyncState.ToString());
                    Console.WriteLine("Failed Task Excetption is : " + t.Exception.InnerException.Message);
                };
            }
        } &lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;output of above code 
&lt;/b&gt;&lt;br /&gt;
&lt;pre&gt;10
0
2
1
1
3
Failed Task is : Task with input 0
Failed Task Excetption is : Attempted to divide by zero.
&lt;/pre&gt;
&lt;br /&gt;
both of the way will give you same output. But if you see output caefully , you see Task with input 0 failed. Here i just attached input but in real time senario like when querying datase you can attach name of database or you can also give some meaning ful vaue in state or even you can pass object as state. 
But point here is you can get to know which task failed when you attach state with Task.

&lt;/div&gt;
</description><link>http://pranayamr.blogspot.com/2017/11/tpl-find-failed-task.html</link><thr:total>0</thr:total><georss:featurename>Pune, Maharashtra, India</georss:featurename><georss:point>18.5204303 73.856743699999925</georss:point><georss:box>18.2795358 73.534020199999929 18.7613248 74.17946719999992</georss:box><author>pranayamr@gmail.com (Pranay Rana)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1194836729866470946.post-7615883571817083895</guid><pubDate>Tue, 12 Apr 2016 17:38:00 +0000</pubDate><atom:updated>2017-11-27T13:08:34.184-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.net</category><category domain="http://www.blogger.com/atom/ns#">c#</category><category domain="http://www.blogger.com/atom/ns#">LINQ</category><title>Diffence between list of user defined types</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
Below is discussion about finding out difference between two lists of elements.&lt;br /&gt;
&lt;br /&gt;
Easiest way to find out difference between two list is make use of method Except, which is introduced with Linq feature in .Net framework 3.5.&lt;br /&gt;
&lt;br /&gt;
Except method works as below&lt;br /&gt;
&lt;br /&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimugxaiTtInFsBLPyPfNGz0Dd7QAucbPnYoaDos-KePogbWXZUnS08lifLorwkex-Ja4xLYpRn9qXHbaficd91j1SiREw5rhfUHJVM1jXhTVnuLiudxSzt8gKlzP2swb5susNWLPdiOH1_/s1600/upload.png" imageanchor="1"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimugxaiTtInFsBLPyPfNGz0Dd7QAucbPnYoaDos-KePogbWXZUnS08lifLorwkex-Ja4xLYpRn9qXHbaficd91j1SiREw5rhfUHJVM1jXhTVnuLiudxSzt8gKlzP2swb5susNWLPdiOH1_/s320/upload.png" /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;
So when except method is applied on two List A and List B, it get list of all element which are present in list A only.&lt;br /&gt;
&lt;br /&gt;
Let’s understand same by writing Code&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;List&amp;lt;int&amp;gt; a = new List&amp;lt;int&amp;gt;() { 2, 4, 7, 9, 4 };
List&amp;lt;int&amp;gt; b = new List&amp;lt;int&amp;gt;() { 8, 6, 7, 3, 4 };

var lst = a.Except(b);
foreach (var ele in lst)
{
    Console.WriteLine(ele);
}&lt;/pre&gt;
Above code defines two list of integer, and apply Except method to find difference between them.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Output&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&amp;nbsp;&lt;/b&gt;
&lt;br /&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimACYE_VVHSbR1WYiym-iQH9emHNlMkgFbeIAWxeY8Tdqj1zVrymO1q61_S3nNzDH8XtL4H7zyt-91KXmQYmHAelQX_aE14QnNaPmcvB9hjXDoZyPdTb59Pct2Qns5iRx1jQqy1v4_jxX_/s1600/upload.png" imageanchor="1"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimACYE_VVHSbR1WYiym-iQH9emHNlMkgFbeIAWxeY8Tdqj1zVrymO1q61_S3nNzDH8XtL4H7zyt-91KXmQYmHAelQX_aE14QnNaPmcvB9hjXDoZyPdTb59Pct2Qns5iRx1jQqy1v4_jxX_/s320/upload.png" /&gt;&lt;/a&gt; 
&lt;br /&gt;
&lt;br /&gt;
Output prints 2 &amp;amp; 9, which are the element in “List a” and not in “List b”.  If one want to find out element which are present in “List b” and not in “List a”, than code will be like&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;var lst = b.Except(a);//pint output 8,6 &amp;amp; 3
&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;Note:&lt;/b&gt;
&lt;br /&gt;
Except method returns element of the collection which is on left side, it doesn’t get list of those element of the right side collection element which is not part of left side collection.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Except on User Defined typed List&lt;/b&gt;
&lt;br /&gt;
Below is explain about how Except works when applied on user-defined data type, to understand this let’s defined employee class&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;public class Employee
{
    public int ID { get; set; }
    public string Name { get; set; }
}
&lt;/pre&gt;
&lt;br /&gt;
After defining Employee class below code creates two list of Employee and applies Except method on it&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;List&amp;lt;Employee&amp;gt; lstA = new List&amp;lt;Employee&amp;gt;() { new Employee { ID = 1, Name = "Abc" }, 
                         new Employee { ID = 2, Name = "Pranay" },
                         new Employee { ID = 3, Name = "Hemang" }};
 List&amp;lt;Employee&amp;gt; lstB = new List&amp;lt;Employee&amp;gt;() { new Employee { ID = 4, Name = "Xyz" }, 
                         new Employee { ID = 2, Name = "Pranay" },
                         new Employee { ID = 5, Name = "Virendra" }};

var lst = lstB.Except(lstA);
foreach (var ele in lst)
{
     Console.WriteLine(ele.ID + " " + ele.Name);
}
&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;Output&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&amp;nbsp;&lt;/b&gt;
&lt;br /&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjvH9Qo4f0k1AaYetNSqLOQu26wuoOOHELXMW5iyYbpuGonoD4ADWVnJkTZQVd-yGCD2vmN2-7PLiDc62jI_TgwTKJy33VlNbKeoHNfUkclaqY7cnABd8RvjnypVIADcu-z5m9vlbkbaGs/s1600/upload.png" imageanchor="1"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjvH9Qo4f0k1AaYetNSqLOQu26wuoOOHELXMW5iyYbpuGonoD4ADWVnJkTZQVd-yGCD2vmN2-7PLiDc62jI_TgwTKJy33VlNbKeoHNfUkclaqY7cnABd8RvjnypVIADcu-z5m9vlbkbaGs/s320/upload.png" /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;
So output print out all the element of list B, rather than printing elements which are not present in list A. &lt;br /&gt;
&lt;b&gt;Problem &lt;/b&gt;here is when Except method applied on user-defined datatype it tries to compare references of object to find difference between lists.
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Resolution&lt;/b&gt;
&lt;br /&gt;
To resolve problem, there is need to use Except overload method which takes list as first input and Custom Equality Comparer as its second parameter for type.  Custom Equality comparer helps to do comparison between object of list and returns difference between list.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;public class EmployeeComparer : IEqualityComparer&amp;lt;Employee&amp;gt;
{
     bool IEqualityComparer&amp;lt;Employee&amp;gt;.Equals(Employee x, Employee y)
     {
        if (x == null || y == null)
            return false;

        return x.ID == y.ID;
     }

    int IEqualityComparer&amp;lt;Employee&amp;gt;.GetHashCode(Employee obj)
    {
       if (obj == null)
           return 0;

       return obj.ID.GetHashCode();
    }
}
&lt;/pre&gt;
Above code defines Custom Employee comparer which implements IEqualityComparer and does comparison of employee objects based on ID property defined in employee class.&lt;br /&gt;
&lt;br /&gt;
Now when Except method applied on list as in below code,&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;List&amp;lt;Employee&amp;gt; lstA = new List&amp;lt;Employee&amp;gt;() { new Employee { ID = 1, Name = "Abc" }, 
                         new Employee { ID = 2, Name = "Pranay" },
                         new Employee { ID = 3, Name = "Hemang" }};

List&amp;lt;Employee&amp;gt; lstB = new List&amp;lt;Employee&amp;gt;() { new Employee { ID = 4, Name = "Xyz" }, 
                         new Employee { ID = 2, Name = "Pranay" },
                         new Employee { ID = 5, Name = "Virendra" }};

var lst = lstB.Except(lstA, new EmployeeComparer());
foreach (var ele in lst)
{
     Console.WriteLine(ele.ID + " " + ele.Name);
}
&lt;/pre&gt;
&lt;b&gt;Output&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&amp;nbsp;&lt;/b&gt;
&lt;br /&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgePH5zu2qvbvOyAMZW3AD9IH-jgJu3Z0KanpIg3n2nKCymI6b4kzd2POMLGC1gKg34ahOxYjyRMjNCD4Lh1ZHpqiP7DsYBzgdi7aeGfXc034nyIpBEicxPh-MrsUmK56J4_PoXiM5Uo8Dk/s1600/upload.png" imageanchor="1"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgePH5zu2qvbvOyAMZW3AD9IH-jgJu3Z0KanpIg3n2nKCymI6b4kzd2POMLGC1gKg34ahOxYjyRMjNCD4Lh1ZHpqiP7DsYBzgdi7aeGfXc034nyIpBEicxPh-MrsUmK56J4_PoXiM5Uo8Dk/s320/upload.png" /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;
Output prints element of list B which are not present in List A of employee. So comparer makes it easy to find difference between two lists. 
&lt;/div&gt;
</description><link>http://pranayamr.blogspot.com/2016/04/diffence-between-list-of-user-defined.html</link><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimugxaiTtInFsBLPyPfNGz0Dd7QAucbPnYoaDos-KePogbWXZUnS08lifLorwkex-Ja4xLYpRn9qXHbaficd91j1SiREw5rhfUHJVM1jXhTVnuLiudxSzt8gKlzP2swb5susNWLPdiOH1_/s72-c/upload.png" width="72"/><thr:total>0</thr:total><author>pranayamr@gmail.com (Pranay Rana)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1194836729866470946.post-5595471436438526149</guid><pubDate>Sun, 20 Mar 2016 11:41:00 +0000</pubDate><atom:updated>2016-03-20T07:41:20.014-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.net</category><category domain="http://www.blogger.com/atom/ns#">c#</category><category domain="http://www.blogger.com/atom/ns#">Event/Delegate</category><title>Event Vs Deleagte</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
Post is explains basics of Events &amp;amp; Delegate and most importantly explains what is difference between both. 
&lt;br /&gt;
Both Event &amp;amp; Delegate is based on overserved pattern of GOF, which is based on giving notification of change in one thing (object) to all others who is interested in change. Below image is graphical interpretation of same.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7WkFqrileg8D1vHP3yTUoDtuB5jJRxorzUAUVt8wrRf9vgjfc3iBMTH2JHG1Fto_nnokaUANSMz6TyaUlDqP2N9ueVXQGQ_GE60O1hqc5pTO077FJPSfpc3xM5r2WMwx6gRSioWwoU8Id/s1600/upload.png" imageanchor="1"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7WkFqrileg8D1vHP3yTUoDtuB5jJRxorzUAUVt8wrRf9vgjfc3iBMTH2JHG1Fto_nnokaUANSMz6TyaUlDqP2N9ueVXQGQ_GE60O1hqc5pTO077FJPSfpc3xM5r2WMwx6gRSioWwoU8Id/s320/upload.png" /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Delegates&lt;/b&gt;
&lt;br /&gt;
Delegate in C# is reference type, which hold reference to the function and invokes function when called with Invoke method. If one is coming from C++/C background, delegate is like pointer to function which points to function.  
&lt;br /&gt;
To understand delegate better way have look to below sample code.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;    public class DelegateTest
    {
        public delegate void Print(string val);

        public DelegateTest()
        {
            Print p = new Print(PrintValue);
            p += new Print(PrintData);
            p.Invoke("Test");
        }

        private void PrintData(string s)
        {
            Console.WriteLine("PrintData" + s);
        }

        public void PrintValue(string s)
        {
            Console.WriteLine("PrintValue" + s);
        }
    }
&lt;/pre&gt;
&lt;br /&gt;
When above class get invoked following output will get printed 
&lt;br /&gt;
PrintData Test
&lt;br /&gt;
PrintValue Test
&lt;br /&gt;
&lt;br /&gt;
Key points in above code 
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt; It defines delegate which can points to method with void return type and take string as input&lt;/li&gt;
&lt;li&gt;In constructor of type, it  create reference object of delegate which points to method “PrintData” and “PrintValue”. &lt;/li&gt;
&lt;li&gt;Invoke method of delegate calls both methods one by one &lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
Read more about Delegate : &lt;a href="https://msdn.microsoft.com/en-in/library/900fyy8e(v=vs.71).aspx"&gt;https://msdn.microsoft.com/en-in/library/900fyy8e(v=vs.71).aspx&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Events&lt;/b&gt;
&lt;br /&gt;
Event in C# is of type Delegate, which means that if one wants to use event than one must need to define delegate first.  Event can have multiple event-handler functions which are of signature like delegate which get called when event raised by some event in application Simple Example is Button click on UI. Event is very useful to create notification.
&lt;br /&gt;
To understand delegate better way have look to below sample code.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;    public class EventTest
    {
        public delegate void Print(string val);
        public event Print PrintEvent;

        public EventTest()
        {
            this.PrintEvent +=  PrintData;
            this.PrintEvent += PrintValue;
        }

        public virtual void OnPrintEvent()
        {
            if (PrintEvent != null)
                PrintEvent("Test");
        }

        private void PrintData(string s)
        {
            Console.WriteLine("PrintData" + s);
        }

        public void PrintValue(string s)
        {
            Console.WriteLine("PrintValue" + s);
        }
    }
&lt;/pre&gt;
&lt;br /&gt;
When above class object is created and then “OnPrintEvent” method invoked following output will get printed 
&lt;br /&gt;
PrintData Test
&lt;br /&gt;
PrintValue Test
&lt;br /&gt;
&lt;br /&gt;
Key points in above code 
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Its creates delegate which can point to method with return type void and take string as argument&lt;/li&gt;
&lt;li&gt;It defines Event which is of type defined delegate&lt;/li&gt;
&lt;li&gt;In Constructor, event holds two delegate i.e. Event handlers. It can also be written like&lt;/li&gt;
&lt;pre class="brush: csharp"&gt;          this.PrintEvent += new Print (PrintData);
          this.PrintEvent += new Print (PrintValue);
&lt;/pre&gt;
&lt;li&gt;OnPrintEvent method checks event is holding event handler function or not, if there is any event handler(s) it calls all event handlers.&lt;/li&gt;
&lt;/ol&gt;
Read more about Event : &lt;a href="https://msdn.microsoft.com/en-in/library/8627sbea%28v=vs.71%29.aspx"&gt;https://msdn.microsoft.com/en-in/library/8627sbea%28v=vs.71%29.aspx&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Event VS Delegate&lt;/b&gt;
&lt;br /&gt;
Both event and delegate does the same task, which is hold event handlers and call them when delegate/event invoked. So one always has question, what is need of Event in language C# when one can achieve same thing with Delegate. 
&lt;br /&gt;
&lt;br /&gt;
Answer is Event is wrapper on Delegate type. 
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Problem With Delegate
&lt;/b&gt;
&lt;br /&gt;
Let’s understand this, using same class defined above which is “DelegateTest”.&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;    class Program
    {

        static void Main(string[] args)
        {
            Program p = new Program();
            DelegateTest delegateTest = new DelegateTest();
            delegateTest.p = new DelegateTest.Print(p.TestString);
            delegateTest.p = null;
        }

        public void TestString(string s)
        {
        }
    }
&lt;/pre&gt;
Above doe does following things 
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;It creates object of type DelegateTest&lt;/li&gt;
&lt;li&gt;Its assigns new delegate reference to delegate Print and override value assigned in constructor&lt;/li&gt;
&lt;li&gt;Its assigns “null” to Print delegate and removes all added function.&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
Problem with Delegate is that one can easily override delegate property and that lead to error or serious issue.  That means one cannot use delegate as public property.
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Solution with Event&lt;/b&gt;
&lt;br /&gt;
To avoid above problem C# has Events, Which defines wrapper around delegate. (Below code make use of EventTest class defined above and as form above code PrintEvent is wrapper around Print delegate).
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;static void Main(string[] args)
        {
            Program p = new Program();
            EventTest eventTest = new EventTest();
            //eventTest.PrintEvent = null;//Not allowed in C#
            eventTest.PrintEvent += p.TestString;
        }

        public void TestString(string s)
        {
        }
&lt;/pre&gt;
Above does following things 
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;It defines object of type EventTest&lt;/li&gt;
&lt;li&gt;its assigns eventhandler to PrintEvent event of EventTest&lt;/li&gt;
&lt;/ol&gt;
One cannot do below things with Event
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;	eventTest.PrintEvent = null;//Not allowed in C#
	eventTest.PrintEvent = new PrintEvent()//Not allowed in C#
&lt;/pre&gt;
&lt;br /&gt;
So Event type resolve problem of exposing delegate outside class by defining wrapper around delegate. Below image is presentation of Event &amp;amp; Delegate.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPXRewiqZ6WjJQF_DJ5kIz_mXxgntk-ulY7eqp4lbLeCUWsy1BP__9ZoQwlgQ3wr11DnD8jI0wzv2G3mNwHUPD5nsb2Kjqg3wCnUGaEfeodkr2eu31sKtKfGcEmY1HzFIIQ-xmPBs3R7xD/s1600/upload.png" imageanchor="1"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPXRewiqZ6WjJQF_DJ5kIz_mXxgntk-ulY7eqp4lbLeCUWsy1BP__9ZoQwlgQ3wr11DnD8jI0wzv2G3mNwHUPD5nsb2Kjqg3wCnUGaEfeodkr2eu31sKtKfGcEmY1HzFIIQ-xmPBs3R7xD/s320/upload.png" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Another Difference between Event &amp;amp; Delegate is
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Event is very helpful to create Notification system. Same is not possible with delegate because delegate cannot be exposed  as public.&lt;/li&gt;
&lt;li&gt;Delegate is very helpful to create call back function i.e can pass delegate as function argument, which is not possible with Event.&lt;/li&gt;
&lt;/ol&gt;
&lt;b&gt;Conclusion&lt;/b&gt;
&lt;br /&gt;
Event and Delegate are both follows Observer pattern. Difference between both is Event wraps Delegate type and which makes delegate not modifiable in terms of changing reference i.e. assign new object is not possible. 

&lt;/div&gt;
</description><link>http://pranayamr.blogspot.com/2016/03/event-vs-deleagte.html</link><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7WkFqrileg8D1vHP3yTUoDtuB5jJRxorzUAUVt8wrRf9vgjfc3iBMTH2JHG1Fto_nnokaUANSMz6TyaUlDqP2N9ueVXQGQ_GE60O1hqc5pTO077FJPSfpc3xM5r2WMwx6gRSioWwoU8Id/s72-c/upload.png" width="72"/><thr:total>1</thr:total><author>pranayamr@gmail.com (Pranay Rana)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1194836729866470946.post-1463059629919534056</guid><pubDate>Tue, 09 Feb 2016 16:45:00 +0000</pubDate><atom:updated>2016-02-10T10:27:19.608-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">c#</category><category domain="http://www.blogger.com/atom/ns#">Reference Type</category><title>Reference type modification vs change of reference</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
Post is regarding misconception related to modifying reference type variable and assigning new reference object to reference type variable.&lt;br /&gt;
&lt;br /&gt;
Let’s understand misconception by using code, below is customer class created to understand it.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;Public class Customer 
{
 Public int ID{get; set;}
 Public string Name {get; set;}
}
&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;Modification of Reference type&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&amp;nbsp;&lt;/b&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;Customer cust = new Customer { ID = 1, Name = "abc" }; //defines new class 
Console.WriteLine("cust name : " + cust.Name);
cust.Name = "xyz"; //modifies value of name field and modifies cust variable
Console.WriteLine("modified cust name : " + cust.Name);
&lt;/pre&gt;
&lt;br /&gt;
Above code creates new object of customer class and modifies it.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;Customer cust1 = cust; //cust1 now has reference to cust
cust1.Name = "abc xyz"; // modification to Name field of cust1 modifies both cust1 and cust
Console.WriteLine("after cust1 modification name " );
Console.WriteLine("cust name : " + cust.Name);
Console.WriteLine("cust1 name : " + cust1.Name);
&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;Output&lt;/b&gt; 
&lt;br /&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRGphkGwrFszWHnpACP-HF9K2ABuT5zA9AmE5AzWOYnucyJ27zXAncZb2-ZVrWtPrn1AsLO_EBEPyL2rmZXXOAzKbe2444FTPOihp2kmBi-nyThoaW4i7gvhyphenhyphenfAT5qqBERJpAiH7E2ntqF/s1600/upload.png" imageanchor="1"&gt;&lt;img border="0" height="91" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRGphkGwrFszWHnpACP-HF9K2ABuT5zA9AmE5AzWOYnucyJ27zXAncZb2-ZVrWtPrn1AsLO_EBEPyL2rmZXXOAzKbe2444FTPOihp2kmBi-nyThoaW4i7gvhyphenhyphenfAT5qqBERJpAiH7E2ntqF/s320/upload.png" width="320" /&gt;&lt;/a&gt; 
&lt;br /&gt;
&lt;br /&gt;
Above code assigns reference of already created object cust to cust1. Because cust1 holding reference to same object as cust1 modification to cust1 also change cust. This means both cust and cust1 points only to one object.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKsrE4k8gSXC5CWFnXhjPb3IBfpXGhs72kXFz-f7LNvhiyBNgat71jtQt6lMdtZaur97PEX0LzZc8dqjpacfvlgczdZQcy3cPu7clrZmtpfPRUELDZJkofnKBAGZdcWjEAT_GnpwSptRuG/s1600/upload.png" imageanchor="1"&gt;&lt;img border="0" height="161" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKsrE4k8gSXC5CWFnXhjPb3IBfpXGhs72kXFz-f7LNvhiyBNgat71jtQt6lMdtZaur97PEX0LzZc8dqjpacfvlgczdZQcy3cPu7clrZmtpfPRUELDZJkofnKBAGZdcWjEAT_GnpwSptRuG/s400/upload.png" width="400" /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Change of Reference i.e. Assigning new reference type object&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
But what happens when assigns null to cust variable&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;cust = null;
Console.WriteLine("after cust=null");
if (cust==null)
   Console.WriteLine("cust is null ");
Console.WriteLine("cust1 name : " + cust1.Name);
&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;Ouput&lt;/b&gt; 
&lt;br /&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWa8mjZLbaT5bt1drIB6prMy2wybykJC-d8MwO_qYqS3MX15FWA91fXzo5hxmyuDZ_SiZ7gP_BCmDwEdmz3hIWDhTK1Wxv42vld12DZFRYeT84_LgaTjNC8B6Anj2zlZLBRfTKPUvyF2-o/s1600/upload.png" imageanchor="1"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWa8mjZLbaT5bt1drIB6prMy2wybykJC-d8MwO_qYqS3MX15FWA91fXzo5hxmyuDZ_SiZ7gP_BCmDwEdmz3hIWDhTK1Wxv42vld12DZFRYeT84_LgaTjNC8B6Anj2zlZLBRfTKPUvyF2-o/s320/upload.png" /&gt;&lt;/a&gt; 
&lt;br /&gt;
&lt;br /&gt;
Now most of developer thinks as cust is null than cust1 is also null. But this is not true because when you give new reference to cust , both cust and cust1 point to different location.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYHVpX7vlrIdtd6lFKrILkCai2mhG_A9-u6e5Q7fAazRLK4Xd0PvcKTUdiCdSGzlSlnjtWb7BgBfv0IjWA78gyPEVQ5HQ1Mr6lnc6tpsD-dJF31J6x0SqAyPHI7rRoeSQgeiinjdrdeM9A/s1600/upload.png" imageanchor="1"&gt;&lt;img border="0" height="178" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYHVpX7vlrIdtd6lFKrILkCai2mhG_A9-u6e5Q7fAazRLK4Xd0PvcKTUdiCdSGzlSlnjtWb7BgBfv0IjWA78gyPEVQ5HQ1Mr6lnc6tpsD-dJF31J6x0SqAyPHI7rRoeSQgeiinjdrdeM9A/s400/upload.png" width="400" /&gt;&lt;/a&gt; 
&lt;br /&gt;
&lt;br /&gt;
Assigning null cust variable is can also be as below&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;Customer cust = new Customer { ID =2 , Name =”customer abc”}
&lt;/pre&gt;
&lt;br /&gt;
So when you assign new value to any reference its point to new memory location i.e. new object. Which also means that assigning new value to reference variable is doesn’t affect old reference variable. 
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;What happens in case of method?&lt;/b&gt;
&lt;br /&gt;
&lt;br /&gt;
Now Consider scenario where developer pass reference variable to method&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Modification of Reference type&lt;/b&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;Customer cust = new Customer { ID = 1, Name = "abc" }; //defines new class 
Console.WriteLine("cust name : " + cust.Name);
Program p = new Program();
p.ChangeCustomer(cust);
Console.WriteLine("modified cust name after call to changecustomer : " + cust.Name);

public void ChangeCustomer(Customer cust)
{
     cust.Name = "xyz"; //modifies value of name field and modifies cust variable
     Console.WriteLine("modified cust name in changecustomer : " + cust.Name);
}
&lt;/pre&gt;
&lt;br /&gt;
Above code defines new customer object and pass customer object to method which does modification to object.&lt;br /&gt;
&lt;br /&gt;
Method modifies customer name, so does it modifies customer object also. Output below prints modified customer name in method and same name after call returns to caller.&lt;br /&gt;
&lt;br /&gt;
So this is similar to case discussed above. &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Output&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizqW1AekKVlClf2nN71DHqxEXV6xB5eiR70dcUjVCD2KVH9Rbop7kawFKuXsCPmgH6Gl_xSA20AckpRN_JSQjLy9L8l2KZP-KYJUV8qNUFTTrRD61Mtqed0vE4GZX8RY-rl8WBSmo8vei_/s1600/upload.png" imageanchor="1"&gt;&lt;img border="0" height="50" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizqW1AekKVlClf2nN71DHqxEXV6xB5eiR70dcUjVCD2KVH9Rbop7kawFKuXsCPmgH6Gl_xSA20AckpRN_JSQjLy9L8l2KZP-KYJUV8qNUFTTrRD61Mtqed0vE4GZX8RY-rl8WBSmo8vei_/s400/upload.png" width="400" /&gt;&lt;/a&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Change of Reference i.e. Assigning new reference type object&lt;/b&gt; &lt;br /&gt;
&lt;br /&gt;
Now consider below scenario&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;Customer cust = new Customer { ID = 1, Name = "abc" }; //defines new class 
Console.WriteLine("cust name : " + cust.Name);
Program p = new Program();
p.ChangeCustomer1(cust);
Console.WriteLine("modified cust name after call to changecustomer1 : " + cust.Name);

public void ChangeCustomer1(Customer cust)
{
    cust = new Customer { ID = 1, Name = "abc xyz" };
    Console.WriteLine("modified cust name in changecustomer1 : " + cust.Name);
}  
&lt;/pre&gt;
&lt;br /&gt;
Above code defines new customer object and pass customer object to method which does modification to object.&lt;br /&gt;
&lt;br /&gt;
Method in this code assigns new customer object to pass cust variable. So it print output as below&lt;br /&gt;
&lt;br /&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCF3GSbVkTtqPfX4oCYD_A56lRzPLSmFuJgmuK7rErlsEnnhuA5E9vjkqBOGgImSz0259s9ZrZ4OIEKYVE3A2XOeZBxMGwWFiTNeC5rd7G5_s8RN9hSaEtJf7aV1nOAMaXJW6KbRcWNypi/s1600/upload.png" imageanchor="1"&gt;&lt;img border="0" height="48" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCF3GSbVkTtqPfX4oCYD_A56lRzPLSmFuJgmuK7rErlsEnnhuA5E9vjkqBOGgImSz0259s9ZrZ4OIEKYVE3A2XOeZBxMGwWFiTNeC5rd7G5_s8RN9hSaEtJf7aV1nOAMaXJW6KbRcWNypi/s400/upload.png" width="400" /&gt;&lt;/a&gt; 
&lt;br /&gt;
&lt;br /&gt;
Output prints different name. Reason behind this is method doesn’t modify varible but it’s changing reference value it points by assigning new customer object.&lt;br /&gt;
&lt;br /&gt;
So this is similar to case discussed above. &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Solution&lt;/b&gt; to above is either return newly created object as below&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;public Customer ChangeCustomer1(Customer cust)
{
    cust = new Customer { ID = 1, Name = "abc xyz" };
    Console.WriteLine("modified cust name in changecustomer1 : " + cust.Name);
    return cust;
}
&lt;/pre&gt;
&lt;br /&gt;
Or make use of ref with variable name&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;public void ChangeCustomer1(ref Customer cust)
{
    cust = new Customer { ID = 1, Name = "abc xyz" };
    Console.WriteLine("modified cust name in changecustomer1 : " + cust.Name);
}
&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;Conclusion&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Above discussion it’s clear that modification to reference variable happens when you do change in original reference variable and assigning new object to variable does modify the reference i.e. memory location object points to.

&lt;/div&gt;
</description><link>http://pranayamr.blogspot.com/2016/02/reference-type-modification-vs-change.html</link><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRGphkGwrFszWHnpACP-HF9K2ABuT5zA9AmE5AzWOYnucyJ27zXAncZb2-ZVrWtPrn1AsLO_EBEPyL2rmZXXOAzKbe2444FTPOihp2kmBi-nyThoaW4i7gvhyphenhyphenfAT5qqBERJpAiH7E2ntqF/s72-c/upload.png" width="72"/><thr:total>2</thr:total><author>pranayamr@gmail.com (Pranay Rana)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1194836729866470946.post-792527679362846712</guid><pubDate>Mon, 07 Sep 2015 16:45:00 +0000</pubDate><atom:updated>2016-02-09T11:37:26.878-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.net</category><category domain="http://www.blogger.com/atom/ns#">c#</category><category domain="http://www.blogger.com/atom/ns#">collection</category><title>Collection Interface In .NET</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;b&gt;Introduction&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
.NET framework provides interfaces that implements by collections in  language to provide functionality of iterating over objects in collection,  adding and removing object from collection to randomly access object from  collection. &lt;br /&gt;
&lt;br /&gt;
As different interfaces provide different set of functionality most of the  developers has problem when to use which interface to achieve functionality. The following post provides information about interfaces implemented by collection.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Interfaces&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
The following diagram is for relation between the interfaces.
&lt;br /&gt;
&lt;br /&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJvveMAnP6g20oRjTlUhTLIMD8Vap7K3OywzvwCObK5h74kIThkypDXx6w91xzvJe-ur4-c_2l7vvB3gTenoBJRWkX5xivsBM57vgqBdA_ru3g5tuA0fGvaEqmRHyiX7aKfdjm3yEuZoFy/s1600/Collection+interface.png" imageanchor="1"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJvveMAnP6g20oRjTlUhTLIMD8Vap7K3OywzvwCObK5h74kIThkypDXx6w91xzvJe-ur4-c_2l7vvB3gTenoBJRWkX5xivsBM57vgqBdA_ru3g5tuA0fGvaEqmRHyiX7aKfdjm3yEuZoFy/s640/Collection+interface.png" /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;b&gt;Note:&lt;/b&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Class diagram are not having all the methods but contains important method that belongs to each collection interface.&lt;br /&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Collection interface is available in both generic and non-generic form,   so in diagram obj type is object in nongeneric form and obj type is  T(template type) in generic form.&lt;/li&gt;
&lt;/ol&gt;
&lt;table border="1" cellspacing="1" style="border-collapse: collapse; color: #333333; font-family: &amp;quot;segoe UI&amp;quot;; font-size: 13px; outline: 0px; width: 100%px;"&gt; 

&lt;tbody style="outline: 0px;"&gt;
&lt;tr style="outline: 0px;"&gt; 
&lt;td align="center"&gt;&lt;/td&gt; 
&lt;td align="center"&gt;&lt;b&gt;Functionality Provided&lt;/b&gt;&lt;/td&gt; 
&lt;td align="center"&gt;&lt;b&gt;Read&lt;/b&gt;&lt;/td&gt; 
&lt;td align="center"&gt;&lt;b&gt;Count&lt;/b&gt;&lt;/td&gt; 
&lt;td align="center"&gt;&lt;b&gt;Add &amp;amp; Remove&lt;/b&gt;&lt;/td&gt;
&lt;td align="center"&gt;&lt;b&gt;Index Based Read&lt;/b&gt;&lt;/td&gt; 
&lt;td align="center"&gt;&lt;b&gt;Index Based Add &amp;amp; Remove&lt;/b&gt;&lt;/td&gt; 
&lt;/tr&gt;
&lt;tr&gt; 
&lt;td&gt;IEnumerable &lt;/td&gt; 
&lt;td&gt;&lt;ol&gt;
&lt;li&gt;Provide Read only Collection.&lt;/li&gt;
&lt;li&gt;Allow to read each object of collection in forward only mode.&lt;/li&gt;
&lt;/ol&gt;
&lt;/td&gt; 
&lt;td align="center"&gt;Y&lt;/td&gt; 
&lt;td align="center"&gt;N&lt;/td&gt; 
&lt;td align="center"&gt;N&lt;/td&gt; 
&lt;td align="center"&gt;N&lt;/td&gt; 
&lt;td align="center"&gt;N&lt;/td&gt; 
&lt;/tr&gt;
&lt;tr&gt; 
&lt;td&gt;ICollection &lt;/td&gt; 
&lt;td&gt;&lt;ol&gt;
&lt;li&gt;Allow to modify collection.&lt;/li&gt;
&lt;li&gt;Allow to get size of collection.&lt;/li&gt;
&lt;li&gt;Allow to Add and Remove object in/from collection.&lt;/li&gt;
&lt;/ol&gt;
&lt;/td&gt; 
&lt;td align="center"&gt;Y&lt;br /&gt;
Inherited) &lt;/td&gt; 
&lt;td align="center"&gt;Y&lt;/td&gt; 
&lt;td align="center"&gt;Y&lt;/td&gt; 
&lt;td align="center"&gt;N&lt;/td&gt; 
&lt;td align="center"&gt;N&lt;/td&gt; 
&lt;/tr&gt;
&lt;tr&gt; 
&lt;td&gt;IReadOnlyCollection &lt;/td&gt; 
&lt;td&gt;&lt;ol&gt;
&lt;li&gt;Allow to read collection.&lt;/li&gt;
&lt;li&gt;Allow to get size of collection.&lt;/li&gt;
&lt;/ol&gt;
&lt;/td&gt; 
&lt;td align="center"&gt;Y&lt;br /&gt;
(Inherited) &lt;/td&gt; 
&lt;td align="center"&gt;Y&lt;/td&gt; 
&lt;td align="center"&gt;N&lt;/td&gt; 
&lt;td align="center"&gt;N&lt;/td&gt; 
&lt;td align="center"&gt;N&lt;/td&gt; 
&lt;/tr&gt;
&lt;tr&gt; 
&lt;td&gt;IList &lt;/td&gt; 
&lt;td&gt;&lt;ol&gt;
&lt;li&gt;Allows to access collection by Index.&lt;/li&gt;
&lt;li&gt;Allow to Add and Remove object in/from collection by index.&lt;/li&gt;
&lt;/ol&gt;
&lt;/td&gt; &lt;td align="center"&gt;Y&lt;br /&gt;
(Inherited) &lt;/td&gt; 
&lt;td align="center"&gt;Y&lt;br /&gt;
(Inherited)&lt;/td&gt; 
&lt;td align="center"&gt;Y&lt;br /&gt;
(Inherited)&lt;/td&gt; 
&lt;td align="center"&gt;Y&lt;/td&gt; 
&lt;td align="center"&gt;Y&lt;/td&gt; 
&lt;/tr&gt;
&lt;tr&gt; 
&lt;td&gt;IReadOnlyList &lt;/td&gt; 
&lt;td&gt;Allow to read collection by Index.&lt;/td&gt; 
&lt;td align="center"&gt;Y&lt;br /&gt;
(Inherited) &lt;/td&gt; 
&lt;td align="center"&gt;Y&lt;br /&gt;
(Inherited) &lt;/td&gt; 
&lt;td align="center"&gt;N&lt;/td&gt; 
&lt;td align="center"&gt;Y&lt;/td&gt; 
&lt;td align="center"&gt;N&lt;/td&gt; 
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br /&gt;
&lt;b&gt;Note:&lt;/b&gt;&lt;br /&gt;
In above diagram (Inherited), the columns indicate that the features are inherited  from parent and to find out from which parent one must look in the interface  collection diagram.&lt;br /&gt;
&lt;br /&gt;
So from above table three main interfaces functionality concluded in following way:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;IEnumerable&lt;/b&gt; – interface provide minimum functionality which is Enumration.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;ICollection&lt;/b&gt; – interface provide medium functionality which is getting size, adding, removing and clearing collection i.e. modification of collection. As it inherited from IEnumerable so includes functionality of IEnumerable.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;IList&lt;/b&gt; – interface provide full functionality which is index base accessing of collection element, index base adding, index base removing from collection. As it inherited from ICollection it includes functionality of Enumerable and ICollection. &lt;br /&gt;
&lt;br /&gt;
The following are some important things to know:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;IEnumerable interface under the hood make use of IEnumerator for providing  reaonly and forward mode read.&lt;br /&gt;&lt;br /&gt; &lt;/li&gt;
&lt;li&gt;IReadOnly*** and IEnumerable are used for providing readonly collection. But  difference is that IEnumerable allows collection to read in forward only mode where  IReadOnly*** provide feature of Collection /List but only in readonly mode i.e.  without modification feature like add &amp;amp; remove.&lt;br /&gt;&lt;br /&gt; &lt;/li&gt;
&lt;li&gt;IReadOnly is part of collection interface from framework 4.5.&lt;/li&gt;
&lt;/ol&gt;
Above table list down the features provided by each interface when collection  gets converted to interface type or class implement interface to provide feature of  collection.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Conclusion&lt;/b&gt;
&lt;br /&gt;
&lt;br /&gt;
It’s very important for developers to understand these interfaces because the rule  says its always good to depend on interface rather than on the concrete type.
&lt;/div&gt;
</description><link>http://pranayamr.blogspot.com/2015/09/collection-interface-in-net.html</link><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJvveMAnP6g20oRjTlUhTLIMD8Vap7K3OywzvwCObK5h74kIThkypDXx6w91xzvJe-ur4-c_2l7vvB3gTenoBJRWkX5xivsBM57vgqBdA_ru3g5tuA0fGvaEqmRHyiX7aKfdjm3yEuZoFy/s72-c/Collection+interface.png" width="72"/><thr:total>0</thr:total><author>pranayamr@gmail.com (Pranay Rana)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1194836729866470946.post-7381765108548727899</guid><pubDate>Mon, 07 Sep 2015 15:10:00 +0000</pubDate><atom:updated>2015-09-07T11:10:39.210-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.net</category><category domain="http://www.blogger.com/atom/ns#">c#</category><category domain="http://www.blogger.com/atom/ns#">TPL</category><title>ContinueWith Vs await</title><description>&lt;div&gt;TPL is new library introduced in C # 4.0 version to provide good control over thread, to make use of multicore CPU by mean of parallel execution on thread. Below discussion is not about TPL but its about ContinueWith function available on Task Class of TPL and await keyword introduced in C# 5.0 to support asynchronous calls.&lt;br/&gt;
&lt;br/&gt;
&lt;b&gt;ContinueWith&lt;/b&gt; - its method available on the task which allows executing code after task finished execution. In simple word it allows continuation.&lt;br/&gt;
&lt;br/&gt;
Things to note here is ContinueWith also return one Task. That means you can attach ContinueWith on task return by this method.&lt;br/&gt;
&lt;br/&gt;
Example :&lt;br/&gt;
&lt;pre class="brush: csharp"&gt;public void ContinueWithOperation()
{
   Task&amp;lt;string&amp;gt; t = Task.Run(() =&amp;gt; LongRunningOperation("Continuewith", 500));
   t.ContinueWith((t1) =&amp;gt;
   {
       Console.WriteLine(t1.Result);
   });
}&lt;/pre&gt;
&lt;br/&gt;
In above code new created task runs LongRunningOperation and once task execution completed ContinueWith execute operation on retuned task and print result of task.&lt;br/&gt;
&lt;br/&gt;
ContinueWith operation thask get executed by default thread scheduler, one can also provide other scheduler for running task on it, this discussed in later in this article.&lt;br/&gt;
&lt;br/&gt;
Note: below code is LongRunningOperation called by task. LongRunningOpertion here is just example in real program one cannot call long running operation on task, and if one want to call longrunning task than one need to pass TaskCreationOperation.LongRunning.&lt;br/&gt;
&lt;br/&gt;
&lt;pre class="brush: csharp"&gt;private string LongRunningOperation(string s, int sec)
{
  Thread.Sleep(sec);
  return s + " Completed";
}&lt;/pre&gt;
&lt;br/&gt;
&lt;b&gt;await&lt;/b&gt; – its keyword that cause runtime to run operation on new task and cause executing thread to return and continue with execution (In most of the cases executing that is main thread of application). Once await operation get finished it returns to statement where is left of (i.e. returns to caller i.e. it returns according state saved) and start executing statements.&lt;br/&gt;
&lt;br/&gt;
So await wait for newly created task to finish and ensures continuation once execution of waiting task is finished.&lt;br/&gt;
&lt;br/&gt;
await keyword used with async to achieve asynchronous programming in C#. It’s called asynchronous programming because runtime capture state of program when it encounter await keyword (which is similar to yield in iterator) and restore state back once waited task finish so the continuation runs on correct context.&lt;br/&gt;
&lt;br/&gt;
Example :&lt;br/&gt;
&lt;br/&gt;
&lt;pre class="brush: csharp"&gt;public async void AsyncOperation()
{
    string t = await Task.Run(() =&amp;gt; LongRunningOperation("AsyncOperation", 1000));
    Console.WriteLine(t);
}&lt;/pre&gt;
&lt;br/&gt;
In above example new created task calls LongRunningOperation and execution left of once main thread encounter await keyword i.e. main thread return to caller of AsyncOpetion and execute further. Once LongRunningOpertaion completed than result of task get printed on console.&lt;br/&gt;
&lt;br/&gt;
So here because state saved when await encountered flow returns on same context one operation on task executed.&lt;br/&gt;
&lt;br/&gt;
Note: State is having detail about executioncontext/synchronizationcontext.&lt;br/&gt;
&lt;br/&gt;
So form above its clear that both Task.ContinueWith and await Task wait for task to finish and allows continuation after task completion. But both works differently.&lt;br/&gt;
&lt;br/&gt;
&lt;b&gt;Difference between ContinueWith and await&lt;/b&gt;&lt;br/&gt;
&lt;ol&gt;
&lt;a href="https://www.blogger.com/blogger.g?blogID=1194836729866470946" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;/a&gt;
&lt;li&gt;Saving Sate for And return on Execution context &lt;br/&gt;
ContinueWith doesn’t save any kind of state, continuation operation attached using ContinueWith run on default thread scheduler in case not scheduler provided.&lt;br/&gt;&lt;br/&gt;
await – on encounter of this keyword state get saved and once task on which await done get completed execution flow pick up saved state data and start execution statement after await. (Note: State is having detail about executioncontext/synchronizationcontext.)&lt;br/&gt;&lt;br/&gt;
&lt;/li&gt;
&lt;li&gt;Posting Completed Task result on UI Control&lt;br/&gt;
Below is example with ContinueWith and await to display completion task result on UI control.&lt;br/&gt;&lt;br/&gt;
ContinueWith :&lt;br/&gt;&lt;br/&gt;
Consider below code which display result of completed task on UI label.&lt;br/&gt;&lt;br/&gt;
&lt;pre class="brush: csharp"&gt;public void ContinueWithOperation()
       {
         CancellationTokenSource source = new CancellationTokenSource();
         source.CancelAfter(TimeSpan.FromSeconds(1));
         Task&amp;lt;string&amp;gt; t = Task.Run(() =&amp;gt; LongRunningOperation("Continuewith", 500
));

            t.ContinueWith((t1) =&amp;gt;
            {
                if (t1.IsCompleted &amp;amp;&amp;amp; !t1.IsFaulted &amp;amp;&amp;amp; !t1.IsCanceled)
                    UpdateUI(t1.Result);
            });
}

private void UpdateUI(string s)
       {
         label1.Text = s;
}&lt;/pre&gt;
Note : LogRunningOperation is already given above.&lt;br/&gt;&lt;br/&gt;
When above code is get executed below runtime exception occurs.&lt;br/&gt;&lt;br/&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEga4hDLRqQOE2ToSVmnS5WwP6MytynxPRQoI9g2CqdtmAT8PS9XSlHFMQpgRqnmEf9a-FR6OxrE43L1CPX7tyqW6V6mTsQjlN_4B90iSInrMT6yTVdQvSeEG3_ULtwm75bOYxlzRZszGIG0/s1600/out.png" imageanchor="1"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEga4hDLRqQOE2ToSVmnS5WwP6MytynxPRQoI9g2CqdtmAT8PS9XSlHFMQpgRqnmEf9a-FR6OxrE43L1CPX7tyqW6V6mTsQjlN_4B90iSInrMT6yTVdQvSeEG3_ULtwm75bOYxlzRZszGIG0/s640/out.png" /&gt;&lt;/a&gt;
&lt;br/&gt;&lt;br/&gt;
This exception occurs because Continuation operation UpdateUI operation runs on different thread, in this case thread will be provided by default threadschedular which is ThreadPool and it doesn’t have any information about Synchronization context on which to run.&lt;br/&gt;&lt;br/&gt;
To avoid exception, one must need to pass thread scheduler which pass data on UI SynchronizationContenxt. In below code TaskScheduler.FromCurrentSynchronizationContext() method pass UI related thread scheduler.&lt;br/&gt;&lt;br/&gt;
&lt;pre class="brush: csharp"&gt;t.ContinueWith((t1) =&amp;gt;
            {
                if (t1.IsCompleted &amp;amp;&amp;amp; !t1.IsFaulted &amp;amp;&amp;amp; !t1.IsCanceled)
                    UpdateUI(t1.Result);
            }, TaskScheduler.FromCurrentSynchronizationContext());&lt;/pre&gt;
&lt;br/&gt;&lt;br/&gt;await :&lt;br/&gt;&lt;br/&gt;Consider below code which display result of completion on UI.&lt;br/&gt;&lt;br/&gt;
&lt;pre class="brush: csharp"&gt;public async void AsyncOperation()
{
    try
    {
       string t = await Task.Run(() =&amp;gt; LongRunningOperation("AsyncOperation",
                        10000));
       UpdateUI(t);
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}&lt;/pre&gt;
&lt;br/&gt;&lt;br/&gt;
Code written with await doesn’t throw any exception when posting data to UI control, No special code required for await. This happens because as discussed in 1 point of difference , on encounter of await state data get saved which has information about SynchronizationContext.&lt;br/&gt;
&lt;br/&gt;So if one need to post data on UI than await is good option because there is no need of extra care/code to post data on UI.&lt;br/&gt;
&lt;br/&gt;&lt;br/&gt;
&lt;/li&gt;
&lt;li&gt;Handling Exception and Cancellation&lt;br/&gt;
Consider below example code for ContinueWith and await method for handing exception and cancelled task.&lt;br/&gt;&lt;br/&gt;
&lt;b&gt;ContinueWith&lt;/b&gt;&lt;br/&gt;&lt;br/&gt;Below is example code how the exception/cancellation handled using ContinueWith.&lt;br/&gt;&lt;br/&gt;
&lt;pre class="brush: csharp"&gt;public void ContinueWithOperationCancellation()
       {
            CancellationTokenSource source = new CancellationTokenSource();
            source.Cancel();

            Task&amp;lt;string&amp;gt; t = Task.Run(() =&amp;gt;
                LongRunningOperationCancellation("Continuewith", 1500,
                    source.Token), source.Token);

            t.ContinueWith((t1) =&amp;gt;
            {
                if (t1.Status == TaskStatus.RanToCompletion)
                    Console.WriteLine(t1.Result);
                else if (t1.IsCanceled)
                    Console.WriteLine("Task cancelled");
                else if (t.IsFaulted)
                {
                    Console.WriteLine("Error: " + t.Exception.Message);
                }
            });
}&lt;/pre&gt;
&lt;br/&gt;
In above code cancellation/exception in continuation handled with by using TaskStatus. Other way to do same thing by making use of TaskContinuationOptions.OnlyOnRanToCompletion&lt;br/&gt;&lt;br/&gt;
&lt;pre class="brush: csharp"&gt;t.ContinueWith(
    (antecedent) =&amp;gt; {  },
     TaskContinuationOptions.OnlyOnRanToCompletion);&lt;/pre&gt;
&lt;br/&gt;
&lt;b&gt;await&lt;/b&gt;&lt;br/&gt;&lt;br/&gt;
Below is example code how the exception/cancellation handled using await.&lt;br/&gt;&lt;br/&gt;
&lt;pre class="brush: csharp"&gt;public async void AsyncOperationCancellation()
       {
         try
         {
           CancellationTokenSource source = new CancellationTokenSource();
           source.Cancel();
           string t = await Task.Run(() =&amp;gt;
               LongRunningOperationCancellation("AsyncOperation", 2000, source.Token),
                   source.Token);
                Console.WriteLine(t);
         }
         catch (TaskCanceledException ex)
         {
                Console.WriteLine(ex.Message);
         }
         catch (Exception ex)
         {
                Console.WriteLine(ex.Message);
         }
}&lt;/pre&gt;
&lt;br/&gt;&lt;br/&gt;
Above code doesn’t make use of task status as continuewith, it makes use of try ..catch block to handle exception. To handle cancellation there is need of catch block with TaskCanceledException.&lt;br/&gt;&lt;br/&gt;
So from above example my view is cancellation/exception handling is done very clean way when one use continuation.&lt;br/&gt;&lt;br/&gt;
Below is code for LongRunningOperationCancellation method.&lt;br/&gt;&lt;br/&gt;
&lt;pre class="brush: csharp"&gt;private string LongRunningOperationCancellation(string s, int sec,CancellationToken ct)
       {
         ct.ThrowIfCancellationRequested();
         Thread.Sleep(sec);
         return s + " Completed";
}&lt;/pre&gt;
&lt;br/&gt;&lt;br/&gt;
Above three cases shows difference of coding between ContinueWith and await. But below one shows why await is better than ContinueWith.&lt;br/&gt;&lt;br/&gt;
&lt;/li&gt;
&lt;li&gt;Complex flow&lt;br/&gt;
Consider below function which used for calculation factorial of number&lt;br/&gt;&lt;br/&gt;
&lt;pre class="brush: csharp"&gt;   public KeyValuePair&amp;lt;int, string&amp;gt; Factorial(int i)
        {
            KeyValuePair&amp;lt;int, string&amp;gt; kv;
            int fact = 1;
            for (int j = 1; j &amp;lt;= i; j++)
                fact *= j;
            string s = "factorial no " + i.ToString() + ":" + fact.ToString();
            kv = new KeyValuePair&amp;lt;int, string&amp;gt;(i, s);
            return kv;
        }&lt;/pre&gt;
Above function calculate factorial of number and return KeyValuePair to caller to display calculation.&lt;br/&gt;&lt;br/&gt;
Now problem statement is above function to calculate factorial of number 1 to 5.&lt;br/&gt;&lt;br/&gt;
&lt;b&gt;ContinueWith&lt;/b&gt;&lt;br/&gt;&lt;br/&gt;
Below is code to calculate factorial of numbers between 1 to 5. Expectation from the code below is calculating factorial of number, display it in order and once it completed “Done” message will get printed on the console.&lt;br/&gt;&lt;br/&gt;
&lt;pre class="brush: csharp"&gt;public void ContinueWithFactorial()
       {
            for (int i = 1; i &amp;lt; 6; i++)
            {
                int temp = i;
                Task&amp;lt;KeyValuePair&amp;lt;int, string&amp;gt;&amp;gt; t = Task.Run(() =&amp;gt; Factorial(temp));
                t.ContinueWith((t1) =&amp;gt;
                {
                    KeyValuePair&amp;lt;int, string&amp;gt; kv = t1.Result;
                    Console.WriteLine(kv.Value);
                });
            }
            Console.WriteLine("Done");
}&lt;/pre&gt;
&lt;br/&gt;&lt;br/&gt;
Once code get executed one will find that “Done” message get printed immediately i.e. first than factorial of number get displayed on screen. One more problem is number factorial is not get displayed in order. Below is output of the code execution.&lt;br/&gt;&lt;br/&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjP80NqWtSCizBWT3VDw3bxJ0GzBtm0VFfcKVFjjkJhFrWK0YY1e9lZOfqumj5mNKVnyIDzhvpWA7u0hVxriq5F7OBNO9XYfZ0aZ-FlB7Gy1WPYwTTsiZBBl6GlDvZdTouBqO1uPNVxPk5B/s1600/out.png" imageanchor="1"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjP80NqWtSCizBWT3VDw3bxJ0GzBtm0VFfcKVFjjkJhFrWK0YY1e9lZOfqumj5mNKVnyIDzhvpWA7u0hVxriq5F7OBNO9XYfZ0aZ-FlB7Gy1WPYwTTsiZBBl6GlDvZdTouBqO1uPNVxPk5B/s640/out.png" /&gt;&lt;/a&gt;
&lt;br/&gt;&lt;br/&gt;
So to resolve problem with above code , code need to be refactored like this&lt;br/&gt;&lt;br/&gt;
&lt;pre class="brush: csharp"&gt;public void FactContinueWithSeq(int i)
{
            Task&amp;lt;KeyValuePair&amp;lt;int, string&amp;gt;&amp;gt; t = Task.Run(() =&amp;gt; Factorial(i));
            var ct = t.ContinueWith(((t1) =&amp;gt;
            {
                KeyValuePair&amp;lt;int, string&amp;gt; kv = t1.Result;
                int seed = kv.Key;
                if (seed &amp;lt; 6)
                {
                    Console.WriteLine(kv.Value);
                    seed++;
                    FactContinueWithSeq(seed);
                }
                else
                {
                    Console.WriteLine("Done");
                    return;
                }
            }));
}&lt;/pre&gt;
&lt;br/&gt;&lt;br/&gt;
Above function will be called like this p.FactContinueWithSeq(1).&lt;br/&gt;&lt;br/&gt;
In above code to maintain sequence, task need to be fired one by one. And for that once one task completes its execution Contuation on it with the help of ContinueWith method call function again. It’s like doing recursive calling to function.&lt;br/&gt;&lt;br/&gt;
And to display “Done” message at the end need to check for the seed to function. Which checks seed value increases 6 or not.&lt;br/&gt;&lt;br/&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzrBYAH-4LcFjBsJRKGpmVIBE_5BIDCucWxcNF2mVniHsglp8G-e2TAgixunmkgtpYjtwX1DiWz0ESecRuqmh5CwvmZmkWutGK0819_ZCLONA8EzZlAnkeRJcssgzRN5dT3ZVMlADFgXYA/s1600/out.png" imageanchor="1"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzrBYAH-4LcFjBsJRKGpmVIBE_5BIDCucWxcNF2mVniHsglp8G-e2TAgixunmkgtpYjtwX1DiWz0ESecRuqmh5CwvmZmkWutGK0819_ZCLONA8EzZlAnkeRJcssgzRN5dT3ZVMlADFgXYA/s640/out.png" /&gt;&lt;/a&gt;
&lt;br/&gt;&lt;br/&gt;
But now there is need for attaching continuation on completion of FactContinueWithSeq, to achieve this code need to be done as below.&lt;br/&gt;&lt;br/&gt;
&lt;pre class="brush: csharp"&gt;TaskCompletionSource&amp;lt;string&amp;gt; tcs = new TaskCompletionSource&amp;lt;string&amp;gt;();
        public Task&amp;lt;string&amp;gt; FactAsyncTask { get { return tcs.Task; } }
        public void FactContinueWithSeqAsync(int i)
        {
            Task&amp;lt;KeyValuePair&amp;lt;int, string&amp;gt;&amp;gt; t = Task.Run(() =&amp;gt; Factorial(i));
            var ct = t.ContinueWith(((t1) =&amp;gt;
            {
                KeyValuePair&amp;lt;int, string&amp;gt; kv = t1.Result;
                int seed = kv.Key;
                if (seed &amp;lt; 5)
                {
                    Console.WriteLine(kv.Value);
                    seed++;
                    FactContinueWithSeqAsync(seed);
                }
                else
                {
                    tcs.SetResult("Execution done");
                }
            }));
        }&lt;/pre&gt;
&lt;/li&gt;
&lt;br/&gt;
Call to above function&lt;br/&gt;
&lt;br/&gt;
&lt;pre class="brush: csharp"&gt;p.FactContinueWithSeqAsync(1);
            Task&amp;lt;string&amp;gt; t = p.FactAsyncTask;
            t.ContinueWith((t1)=&amp;gt; Console.WriteLine(t.Result));&lt;/pre&gt;
&lt;br/&gt;&lt;br/&gt;
In above code TaskCompletionSource is used to achieve the code of providing continutation on completion of factorial calculation.&lt;br/&gt;&lt;br/&gt;
So one need to do lot of code for providing expected result, which is calculating factorial in sequence, waiting on calculation and once calculation get completed “Done” message get printed on console.&lt;br/&gt;&lt;br/&gt;
&lt;b&gt;await&lt;/b&gt;&lt;br/&gt;&lt;br/&gt;
Now same code with help of await can be done like this&lt;br/&gt;&lt;br/&gt;
&lt;pre class="brush: csharp"&gt;public async void AwaitWithFactorial()
{
   for (int i = 1; i &amp;lt; 6; i++)
   {
       int temp = i;
       Task&amp;lt;KeyValuePair&amp;lt;int, string&amp;gt;&amp;gt; t = Task.Run(() =&amp;gt; Factorial(temp));
       await t;
       Console.WriteLine(t.Result.Value);
      }
      Console.WriteLine("Done");
 
}&lt;/pre&gt;
&lt;br/&gt;&lt;br/&gt;
Above code is simple and clean there is no need of doing whole big refactoration which required when doing same thing with ContinueWith.&lt;br/&gt;
&lt;br/&gt;
&lt;/ol&gt;
&lt;b&gt;Summary&lt;/b&gt;&lt;br/&gt;
&lt;br/&gt;
From above difference/comparison of ContinueWith vs await it clear that in many scenario using and await is very helpful.&lt;br/&gt;
But there is also scenario where more complex things not required with proper error/cancellation handling in that case continuewith is helpful. But this scenario is very rare.&lt;br/&gt;
&lt;br/&gt;
It’s always good to go with simple, easy and clear solution, for this my suggestion is always go with await rather than ContinueWith.
&lt;/div&gt;</description><link>http://pranayamr.blogspot.com/2015/09/continuewith-vs-await.html</link><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEga4hDLRqQOE2ToSVmnS5WwP6MytynxPRQoI9g2CqdtmAT8PS9XSlHFMQpgRqnmEf9a-FR6OxrE43L1CPX7tyqW6V6mTsQjlN_4B90iSInrMT6yTVdQvSeEG3_ULtwm75bOYxlzRZszGIG0/s72-c/out.png" width="72"/><thr:total>0</thr:total><author>pranayamr@gmail.com (Pranay Rana)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1194836729866470946.post-1818523197195505150</guid><pubDate>Mon, 07 Sep 2015 14:25:00 +0000</pubDate><atom:updated>2015-09-07T10:25:40.081-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.net</category><category domain="http://www.blogger.com/atom/ns#">c#</category><category domain="http://www.blogger.com/atom/ns#">Flyweight</category><category domain="http://www.blogger.com/atom/ns#">Software Design Patterns</category><title> Flyweight Design Pattern</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
The Flyweight Design Pattern is one of the structural patterns introduced by the GOF. The Flyweight Pattern is about creating a pool of objects that allows sharing already existing objects and causing the application to consume less memory.
&lt;br /&gt;
&lt;br /&gt;
So this pattern does the following two things because the pattern creates objects once and then saves them to a pool:
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Increases application performance in terms of object creation since there is no requirement of creating an object for every request.&lt;/li&gt;
&lt;li&gt;Causes the application to consume less memory, since the object already exists in memory and no new object must be created because of the pool.&lt;/li&gt;
&lt;/ol&gt;
Ultimately flyweight patterns make the application efficient in terms of memory and processing.
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Basic UML class Diagram of Design Pattern&lt;/b&gt;
&lt;br /&gt;
&lt;br /&gt;
The following image shows the class diagram of the basic Flyweight Design Pattern.
&lt;br /&gt;
&lt;br /&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXr2-7J_5M3hueL7ocfB21vIx89xo6vFOD0HB1wuORjEKK2x2kyhT4wY4drLKRhWuFc57N32OuoSSQWfD5wMCFQiMR4MfoFkWfsQ1RVmQ0e-iaHsutik65XLjVsgvB6JKI-CczWzqzbeFY/s1600/basic.png" imageanchor="1"&gt;&lt;img border="0" height="369" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXr2-7J_5M3hueL7ocfB21vIx89xo6vFOD0HB1wuORjEKK2x2kyhT4wY4drLKRhWuFc57N32OuoSSQWfD5wMCFQiMR4MfoFkWfsQ1RVmQ0e-iaHsutik65XLjVsgvB6JKI-CczWzqzbeFY/s640/basic.png" width="640" /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;UML class Diagram&lt;/b&gt;&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;&lt;b&gt;IFlyweight:&lt;/b&gt; Basic contract to be implemented by derived types, in other words by concrete flyweight.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;FlyweightFactory:&lt;/b&gt; It's a factory class used by a client class to get the data from the concreate flyweight. This class is also responsible for creating the pool of an existing object. So when the request for data come that is already requested it returns data from the pool.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ConcerateSharedFlyweight1&lt;/b&gt;: It's a concreate implementation of the flyweight interface. As the name suggests, an object returned by this class will be shared among the clients of it.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ConcerateUnSharedFlyweight1:&lt;/b&gt; It's a concreate implementation of the flyweight interface. As the name suggests an object returned by this class will be unshared. That means that every time the client requires a new object.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Client:&lt;/b&gt; uses the concreate implementation, it creates an instance of Decorate and uses the functionality of it.&lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;Note:&lt;/b&gt;UnSharedFlyweight is not always required, it depends on requirements, but SharedFlyweight is always required when you use the flyweight pattern.
&lt;br /&gt;
&lt;br /&gt;
The following code is the implementation of the Flyweight Design Pattern and the Class Diagram was shown above.
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;namespace BasicFlyweightPattern
{
    #region basic implementation
    public class FlyweightFactory 
    {
        public static List&amp;lt;Item&amp;gt; GetStaticItemList(string key)
        {
            IFlyWeight flyWeight = null;
            ICacheManager _objCacheManager = CacheFactory.GetCacheManager();

            if (key == "A")
            {
                if (_objCacheManager.Contains("A"))
                {
                    return _objCacheManager["A"] as List&amp;lt;Item&amp;gt;;
                }
                else
                {
                    flyWeight = new ConcerateSharedFlyweight1();
                }
            }
            else if (key == "B")
            {
                if (_objCacheManager.Contains("B"))
                {
                    return _objCacheManager["B"] as List&amp;lt;Item&amp;gt;;
                }
                else
                {
                    flyWeight = new ConcerateSharedFlyweight2();
                }
            }

            var list = flyWeight.GetList();
            _objCacheManager.Add(key, list);
            return list;
        }
    }

    interface IFlyWeight
    {
        List&amp;lt;Item&amp;gt; GetList();
    }

    public class Item
    {
        public int id { get; set; }
        public string desc { get; set; }
    }

    public class ConcerateSharedFlyweight1 : IFlyWeight
    {
        private List&amp;lt;Item&amp;gt; ItemList;

        public ConcerateSharedFlyweight1()
        {
            ItemList = new List&amp;lt;Item&amp;gt;();
        }

        public List&amp;lt;Item&amp;gt; GetList()
        {
            ItemList.Add(new Item { id = 1, desc = "A1" });
            ItemList.Add(new Item { id = 2, desc = "A2" });
            ItemList.Add(new Item { id = 3, desc = "A3" });
            return ItemList;
        }
    }

    public class ConcerateSharedFlyweight2 : IFlyWeight
    {
        private List&amp;lt;Item&amp;gt; ItemList;

        public ConcerateSharedFlyweight2()
        {
            ItemList = new List&amp;lt;Item&amp;gt;();
        }

        public List&amp;lt;Item&amp;gt; GetList()
        {
            ItemList.Add(new Item { id = 1, desc = "B1" });
            ItemList.Add(new Item { id = 2, desc = "B2" });
            ItemList.Add(new Item { id = 3, desc = "B3" });
            return ItemList;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            List&amp;lt;Item&amp;gt; list =FlyweightFactory.GetStaticItemList("A");
     //List&amp;lt;Item&amp;gt; list = FlyweightFactory.GetStaticItemList("B");            
     foreach (var item in list)
            {
                Console.WriteLine(item.id.ToString() + "  " + item.desc );
           }

            Console.ReadLine();
        }
    }

}
      &lt;item&gt;&lt;item&gt;&lt;item&gt;&lt;item&gt;&lt;item&gt;&lt;item&gt;&lt;item&gt;&lt;item&gt;&lt;item&gt;&lt;item&gt;&lt;item&gt;&lt;item&gt;&lt;/item&gt;&lt;/item&gt;&lt;/item&gt;&lt;/item&gt;&lt;/item&gt;&lt;/item&gt;&lt;/item&gt;&lt;/item&gt;&lt;/item&gt;&lt;/item&gt;&lt;/item&gt;&lt;/item&gt;&lt;/pre&gt;
The following are points to remember about the preceding code implementation:
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;The client asks for data from FlyweightFactory by calling GetStaticItemList and passing the key as argument for getting the data.&lt;/li&gt;
&lt;li&gt;FlyweightFactory has a static method GetStaticItemList that creates an instance of concrete and gets data if the request is for the first time, for a later request it returns an existing object.&lt;/li&gt;
&lt;li&gt;FlyweightFacotry maintains a pool of existing objects using an Enterprise library caching block for sharing data among the clients, in other words different objects.&lt;/li&gt;
&lt;li&gt;In the concrete implementation of flyweight, a hardcoded list is returned but in an actual scenario this will be replaced by data from a data source.&lt;/li&gt;
&lt;li&gt;Item is a poco class, the list of which is returned from flyweight concrete classes. This class is represented by different items. The following actual scenario provides more detail.&lt;/li&gt;
&lt;/ol&gt;
Output
&lt;br /&gt;
&lt;br /&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOAQgIPpFhBrbk-OzOpDwnwQ9HbtW4aLH561Snd2ZjRnTKWD5k5iSLVvQsvKvsb8N1FF-FiCARSBnvkHyj7oRM04PdXzccdvJSYXzaEF0_pMAnDjDnEyL9OhDQZ_9Cijg1TXslxy_xT-C3/s1600/out.png" imageanchor="1"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOAQgIPpFhBrbk-OzOpDwnwQ9HbtW4aLH561Snd2ZjRnTKWD5k5iSLVvQsvKvsb8N1FF-FiCARSBnvkHyj7oRM04PdXzccdvJSYXzaEF0_pMAnDjDnEyL9OhDQZ_9Cijg1TXslxy_xT-C3/s320/out.png" /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;
Here the output shows the result of A's same will use the result of B's. If the call comes a second time then the data is retuned from the cache.
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Flyweight Design Pattern Example In an Actual Application
&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Problem Statement
&lt;/b&gt;
&lt;br /&gt;
&lt;br /&gt;
A web application having a dropdown for displaying a list of Country, displaying a list of State, displaying a list of Product and so on in the dropdown and the dropdowns are part of multiple screens that are accessed by multiple users.
&lt;br /&gt;
&lt;br /&gt;
In this scenario, to display another kind of list for multiple user requests, the server must connect with the database server multiple times. This reduces the performance of the application and also consumes memory for creating and storing these lists.
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Solution&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
The solution to the preceding problem is to use the Flyweight Design Pattern.
&lt;br /&gt;
&lt;br /&gt;
The following is a class diagram of the Flyweight pattern used in the application.
&lt;br /&gt;
&lt;br /&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimm-_wO_JnD0_06CnIkeTqChVyvXDGlzCfaiRnCq_w7OxyONZLl09V5vbuuLQ4W9eiY_epej-W4s7vW1YXkyEdlVmCcdV07qlPtEqC4XCIF43diVpv7ff6Z5DHPF1TO2zIr1Vn49zniB7i/s1600/actual.png" imageanchor="1"&gt;&lt;img border="0" height="302" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimm-_wO_JnD0_06CnIkeTqChVyvXDGlzCfaiRnCq_w7OxyONZLl09V5vbuuLQ4W9eiY_epej-W4s7vW1YXkyEdlVmCcdV07qlPtEqC4XCIF43diVpv7ff6Z5DHPF1TO2zIr1Vn49zniB7i/s640/actual.png" width="640" /&gt;&lt;/a&gt;&lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
Mapping with Basic Implementation.
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;IFlyweightManager is equals to IFlyweight.&lt;/li&gt;
&lt;li&gt;StaticDataListFlyweightFactory is equal to FlyweightFactory.&lt;/li&gt;
&lt;li&gt;CountryStaticListManager and ProductStaticListManager is equal to ConcerateSharedFlyweight1 and ConcerateSharedFlyweight2.&lt;/li&gt;
&lt;li&gt;StaticItem is equal to Item. &lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="brush: csharp"&gt;namespace FlyWeightPattern
{
    class Program
    {
        static void Main(string[] args)
        {

            List&amp;lt;StaticItem&amp;gt; countrylist = StaticDataListFlyWeidhtFactory.GetStaticItemList("Country");
            foreach (var item in countrylist)
            {
                Console.WriteLine(item.id.ToString() + "  " + item.Code + "  " + item.Description);
            }

            Console.ReadLine();
        }
    }
 public class StaticDataListFlyWeidhtFactory
    {
        public static List&amp;lt;StaticItem&amp;gt; GetStaticItemList(string key)
        {
            IFlyWeightManager manager = null;
            ICacheManager _objCacheManager = CacheFactory.GetCacheManager();

            if (key == "Country")
            {
                if (_objCacheManager.Contains("Country"))
                {
                    return _objCacheManager["Country"] as List&amp;lt;StaticItem&amp;gt;;
                }
                else
                {
                    manager = new CountryStaticListManager();
                }
            }
            else if (key == "ProductType")
            {
                if (_objCacheManager.Contains("ProductType"))
                {
                    return _objCacheManager["ProductType"] as List&amp;lt;StaticItem&amp;gt;;
                }
                else
                {
                    manager = new ProductTypeStaticListManager();
                }
            }

            var list = manager.GetList();
            _objCacheManager.Add(key, list);
            return list;
        }
    }

    interface IFlyWeightManager
    {
        List&amp;lt;StaticItem&amp;gt; GetList();
    }

    public class CountryStaticListManager : IFlyWeightManager
    {
        private List&amp;lt;StaticItem&amp;gt; StaticItemList;

        public CountryStaticListManager()
        {
            StaticItemList = new List&amp;lt;StaticItem&amp;gt;();
        }

        public List&amp;lt;StaticItem&amp;gt; GetList()
        {
            StaticItemList.Add(new StaticItem { id = 1, Code = "IND", Description = "India" });
            StaticItemList.Add(new StaticItem { id = 2, Code = "SRL", Description = "Sri Lanka" });
            StaticItemList.Add(new StaticItem { id = 3, Code = "SA", Description = "South Africa" });
            return StaticItemList;
        }
    }

    public class ProductTypeStaticListManager : IFlyWeightManager
    {
        private List&amp;lt;StaticItem&amp;gt; StaticItemList;

        public ProductTypeStaticListManager()
        {
            StaticItemList = new List&amp;lt;StaticItem&amp;gt;();
        }

        public List&amp;lt;StaticItem&amp;gt; GetList()
        {
            StaticItemList.Add(new StaticItem { id = 1, Code = "0123", Description = "Watch" });
            StaticItemList.Add(new StaticItem { id = 2, Code = "0234", Description = "Shoes" });
            StaticItemList.Add(new StaticItem { id = 3, Code = "0345", Description = "" });
            return StaticItemList;
        }
    }

    public class StaticItem
    {
        public int id { get; set; }
        public string Code { get; set; }
        public string Description { get; set; }
    }
}&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;Output&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&amp;nbsp;&lt;/b&gt;
&lt;br /&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJK3Fxg4XsJrrQfTNZWphjGTnbjOgHHGb9KuSMCPlAx1VTFfsElb8v4u7qkgFa-lpefDyA-uVKiqo9eico7j1qUOubG1mxWs7YSquyNi0S5GJCubmFVI6xuYK0ArCrgZXhK2ytedEMUzlE/s1600/out.png" imageanchor="1"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJK3Fxg4XsJrrQfTNZWphjGTnbjOgHHGb9KuSMCPlAx1VTFfsElb8v4u7qkgFa-lpefDyA-uVKiqo9eico7j1qUOubG1mxWs7YSquyNi0S5GJCubmFVI6xuYK0ArCrgZXhK2ytedEMUzlE/s320/out.png" /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;
So the preceding code works the same as already described in the basic implementation of pattern. In the code another type of the list is fetched by passing a different key. For this implementation the keys are Country and Product. In a real application one can have more than this.
&lt;br /&gt;
&lt;br /&gt;
The preceding implementation follows the SOLID principle, just one exception is the Factory class that must be modifed when one wants to add a new key so it breaks the rule of single responsibility.
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Note: &lt;/b&gt;Here the country and product list are hardcoded but in an actual program it is fetched from the database.
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Conclusion&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
This pattern is very helpful in the scenario where one wants to create a pool of objects and share them among the clients (the clients are software programs or classes or web applications as in this example).
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Note:&lt;/b&gt; This is my point of view regarding patterns. Please provide your feedback regarding it and also provide feedback if something you find is wrong in this.
&lt;/div&gt;
</description><link>http://pranayamr.blogspot.com/2015/09/flyweight-design-pattern.html</link><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXr2-7J_5M3hueL7ocfB21vIx89xo6vFOD0HB1wuORjEKK2x2kyhT4wY4drLKRhWuFc57N32OuoSSQWfD5wMCFQiMR4MfoFkWfsQ1RVmQ0e-iaHsutik65XLjVsgvB6JKI-CczWzqzbeFY/s72-c/basic.png" width="72"/><thr:total>0</thr:total><author>pranayamr@gmail.com (Pranay Rana)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1194836729866470946.post-1797921362038230044</guid><pubDate>Sun, 26 Jul 2015 07:41:00 +0000</pubDate><atom:updated>2015-07-26T03:42:32.219-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">c#</category><category domain="http://www.blogger.com/atom/ns#">Visual Studio</category><title>Visual Studio  Generate Class From JSON or XML</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;b&gt;Introduction&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Below Article is on, one of the cool feature available in visual studio which helps/save effort of developer to generate class structure from json/xml string.
&lt;br /&gt;
&lt;br /&gt;
There is cases application written using .Net Framework written by developer received json/xml string from the web service or from the other 3rd party application it calling. After receiving xml/json string data there is need of further processing received data, which requires to deserialize received xml/json in .Net object. And for that .Net class structure need to be created which match with json/xml string data so that json/xml string deserialize correctly.
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Problem Statement
&lt;/b&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;For example:
&lt;/b&gt;
&lt;br /&gt;
&lt;br /&gt;
Program receives following json string by calling webservice or 3rd party program. 
&lt;br /&gt;
&lt;br /&gt;
JSON&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;{"employees":[
    {"firstName":"John", "lastName":"Doe"},
    {"firstName":"Anna", "lastName":"Smith"},
    {"firstName":"Peter", "lastName":"Jones"}
]}
&lt;/pre&gt;
&lt;br /&gt;
XML&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;  &amp;lt;employees&amp;gt;
    &amp;lt;employee&amp;gt;
        &amp;lt;firstName&amp;gt;John&amp;lt;/firstName&amp;gt; &amp;lt;lastName&amp;gt;Doe&amp;lt;/lastName&amp;gt;
    &amp;lt;/employee&amp;gt;
    &amp;lt;employee&amp;gt;
        &amp;lt;firstName&amp;gt;Anna&amp;lt;/firstName&amp;gt; &amp;lt;lastName&amp;gt;Smith&amp;lt;/lastName&amp;gt;
    &amp;lt;/employee&amp;gt;
    &amp;lt;employee&amp;gt;
        &amp;lt;firstName&amp;gt;Peter&amp;lt;/firstName&amp;gt; &amp;lt;lastName&amp;gt;Jones&amp;lt;/lastName&amp;gt;
    &amp;lt;/employee&amp;gt;
&amp;lt;/employees&amp;gt;
&lt;/pre&gt;
&lt;br /&gt;
And now there is need for deserializing received json/xml string to .Net object, so further process will be done based on received data or on received data.
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Approach 1: Do it manually
&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
In this approach developer need to have knowledge of json/xml so that he/she can understand received json/xml string and it structure. Once getting detail of xml/json and received xml/json string, developer has to convert json/xml string into meaningful class structure so desterilization done without any issue/error.&lt;br /&gt;
&lt;br /&gt;
So problem with this approach is lot of work need to be done by developer like
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Require knowledge of json/xml&lt;/li&gt;
&lt;li&gt;Understand jso/xmln string sent by exteranl program&lt;/li&gt;
&lt;li&gt;create class strucutre for json/xml structure, which is trial and error approch because most of the time created structure doesn't work in first go
&lt;/li&gt;
&lt;li&gt;If json/xml string having complex structure than its difficult as well as require time to create class structure to deserialize json/xml string
&lt;/li&gt;
&lt;/ol&gt;
&lt;b&gt;Approach 2 : Automated using Visual Studio
&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
In this approach make use of Visual studio to generate class just by copy pasting xml/json string.
&lt;br /&gt;
&lt;br /&gt;
Following steps need to be done for generating class
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt; Copy json/xml string &lt;br /&gt;&lt;br /&gt;JSON &lt;br /&gt;&lt;br /&gt;&lt;div&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBAfGCUhvIAnu8izEcpRwlwk5-A1G10piI-QSMjjbX6RoeFQ8AobV7Zg6ksGBwjnB9wVBR-tk4ju1aezO62eQHYqX-Qsb8NmL404iIJ2V9xmzbpehiIMtlnc8F9QS8aUt7MEljLNWgxh57/s1600/tes.png" imageanchor="1"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBAfGCUhvIAnu8izEcpRwlwk5-A1G10piI-QSMjjbX6RoeFQ8AobV7Zg6ksGBwjnB9wVBR-tk4ju1aezO62eQHYqX-Qsb8NmL404iIJ2V9xmzbpehiIMtlnc8F9QS8aUt7MEljLNWgxh57/s320/tes.png" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;br /&gt; 
XML
&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAC_R_q-bQ4u26GeBxgnARq0VccyIL0X1D5uaz9zstpBCfAs8wX04ZkA3x4Y0A2VZUOcUUy7S8pzwNyYiq-XwchS6WOZssjGz2ZA3PCwdKHoGEb0h41vbfwD7AysHoaHZxKB3AXzIvGX2y/s1600/tes.png" imageanchor="1"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAC_R_q-bQ4u26GeBxgnARq0VccyIL0X1D5uaz9zstpBCfAs8wX04ZkA3x4Y0A2VZUOcUUy7S8pzwNyYiq-XwchS6WOZssjGz2ZA3PCwdKHoGEb0h41vbfwD7AysHoaHZxKB3AXzIvGX2y/s320/tes.png" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;

Go to Edit&amp;gt;Past Sepcial &amp;gt; Paste JSON As Classes or Paste XML As Classes
&lt;br /&gt;
&lt;br /&gt;&lt;div&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDzUu0wvCBygltKFPwNcllM2s6shA_e6FPhtJLArmD3v9P1dSbcFQ52MG6zIVpN37LwxBxFGmNIsVmUsyLRDqaHrbtXHAr8nvDRuguVuPU1QvNr07V5AOKP1tL_JVpI4M7BL4ZAeV4BPIe/s1600/tes.png" imageanchor="1"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDzUu0wvCBygltKFPwNcllM2s6shA_e6FPhtJLArmD3v9P1dSbcFQ52MG6zIVpN37LwxBxFGmNIsVmUsyLRDqaHrbtXHAr8nvDRuguVuPU1QvNr07V5AOKP1tL_JVpI4M7BL4ZAeV4BPIe/s320/tes.png" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;
Visual studio generate Class structure for developer as below
&lt;br /&gt;&lt;br /&gt;
Below is example of class structure created by copy and pasting JSON string
&lt;br /&gt;&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;    public class EmployeeList
    {
        public Employee[] employees { get; set; }
    }

    public class Employee
    {
        public string firstName { get; set; }
        public string lastName { get; set; }
    }

&lt;/pre&gt;
&lt;br /&gt;
Below is example of class structure created by copy and pasting XML string
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;/// &lt;remarks&gt;
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
    [System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
    public partial class employees
    {

        private employeesEmployee[] employeeField;

        /// &lt;remarks&gt;
        [System.Xml.Serialization.XmlElementAttribute("employee")]
        public employeesEmployee[] employee
        {
            get
            {
                return this.employeeField;
            }
            set
            {
                this.employeeField = value;
            }
        }
    }

    /// &lt;remarks&gt;
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
    public partial class employeesEmployee
    {

        private string firstNameField;

        private string lastNameField;

        /// &lt;remarks&gt;
        public string firstName
        {
            get
            {
                return this.firstNameField;
            }
            set
            {
                this.firstNameField = value;
            }
        }

        /// &lt;remarks&gt;
        public string lastName
        {
            get
            {
                return this.lastNameField;
            }
            set
            {
                this.lastNameField = value;
            }
        }
    }
&lt;/remarks&gt;&lt;/remarks&gt;&lt;/remarks&gt;&lt;/remarks&gt;&lt;/remarks&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;/ol&gt;
As you see in above code it will generate correct attribute for xml on class so deserialization done without any issue/error.
&lt;br /&gt;
&lt;br /&gt;
Advantage of this solution
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;
No need to understand xml/json&lt;/li&gt;
&lt;li&gt;No effort require for creating class&lt;/li&gt;
&lt;/ol&gt;
&lt;b&gt;Summary&lt;/b&gt;
&lt;br /&gt;
&lt;br /&gt;
Visual studio feature of creating class based on string really helpful to developer because understanding json/xml string and creating class structure requires efforts and sometime very frustrating. 






&lt;/div&gt;
</description><link>http://pranayamr.blogspot.com/2015/07/introduction-below-article-is-on-one-of.html</link><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBAfGCUhvIAnu8izEcpRwlwk5-A1G10piI-QSMjjbX6RoeFQ8AobV7Zg6ksGBwjnB9wVBR-tk4ju1aezO62eQHYqX-Qsb8NmL404iIJ2V9xmzbpehiIMtlnc8F9QS8aUt7MEljLNWgxh57/s72-c/tes.png" width="72"/><thr:total>0</thr:total><author>pranayamr@gmail.com (Pranay Rana)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1194836729866470946.post-4052250591547064121</guid><pubDate>Mon, 13 Jul 2015 17:42:00 +0000</pubDate><atom:updated>2015-07-13T13:42:12.391-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">c#</category><category domain="http://www.blogger.com/atom/ns#">Software design Principle</category><category domain="http://www.blogger.com/atom/ns#">SOLID</category><title>SOLID Principle In Detail</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
SOLID principles are the set of principle fist given by Robert.C.Martin.  SOLID principle as name given its set of principle that allows building SOLID software system (i.e. Application, Application Module), if one implement software according to this set of principle. 
&lt;br /&gt;
&lt;br /&gt;
SOLID software system means its allows to build system that is&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;Easy to maintain&lt;/li&gt;
&lt;li&gt;Easy to extend&lt;/li&gt;
&lt;li&gt;Easy to understand&lt;/li&gt;
&lt;li&gt;Easy to implement&lt;/li&gt;
&lt;li&gt;Easy to explain 
&lt;/li&gt;
&lt;/ul&gt;
SOLID principles are related with the design and maintenance of software system. Most of the developer mix SOLID principles with OOD principles and Design patterns. Below image that removes confusion of OOD principles and Design patterns
 &lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBzAlrCUdikPaLAqXjH_TKec58jCBPnL7nINPkfq05itbb5HkGyJkTwiqmnoEkoDKMroIIyfKOrXIfbJpaddijmHuDIzp1hd7B3U21t950sUJA3V-o-RQgDXBbM6q5SQCfEoKE1w7w95Vk/s1600/Solid+understanding.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="306" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBzAlrCUdikPaLAqXjH_TKec58jCBPnL7nINPkfq05itbb5HkGyJkTwiqmnoEkoDKMroIIyfKOrXIfbJpaddijmHuDIzp1hd7B3U21t950sUJA3V-o-RQgDXBbM6q5SQCfEoKE1w7w95Vk/s320/Solid+understanding.jpeg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
Note: This is my interpretation of the arranging thigs.
&lt;br /&gt;
&lt;br /&gt;
So as per image 
&lt;br /&gt;
&lt;br /&gt;
&lt;ol style="text-align: left;"&gt;
&lt;li&gt;OOD Principle (Abstraction, Encapsulation, Inheritance, Polymorphism)&lt;/li&gt;
&lt;li&gt;SOLID principle&lt;/li&gt;
&lt;li&gt;Software Design Patterns (GOF patterns, Dependency injection &amp;amp; patterns)&lt;/li&gt;
&lt;li&gt;Martin Flower’s Enterprise Application Architectures Pattern (additional but required)&lt;/li&gt;
&lt;li&gt;Domain Driven Design Architecture (additional but required)
&lt;/li&gt;
&lt;/ol&gt;
S.O.L.I.D is acronym for 
&lt;br /&gt;
&lt;br /&gt;
&lt;ol style="text-align: left;"&gt;
&lt;li&gt;&lt;b&gt;Single Responsibility Principle&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;
Principle is related to Designing software module, class or function that should perform only one task. So this principle is about Creation. 
&lt;br /&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEfhqjabYqMfeaSaV7KtShfzBMB4ReOGqW-IuYFkwwerUZgYqjcKcRjXHK-NHh-JbYYWtQbMBuzS94bqsd0cew5DdQZXprVsm0T-vw8-OmMcdXqZrDRm0ptqvmjDUW3-ZbKAzxnsvHBTX0/s1600/1f59b3c.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEfhqjabYqMfeaSaV7KtShfzBMB4ReOGqW-IuYFkwwerUZgYqjcKcRjXHK-NHh-JbYYWtQbMBuzS94bqsd0cew5DdQZXprVsm0T-vw8-OmMcdXqZrDRm0ptqvmjDUW3-ZbKAzxnsvHBTX0/s400/1f59b3c.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;In Detail Read : &lt;a href="http://pranayamr.blogspot.in/2015/04/single-responsibility-principle-in.html"&gt;Single Responsibility Principle In Detail&lt;/a&gt;
&lt;br /&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Open/Close Principle&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;Principle is applied after 1 (Single Responsibility Principle), again this principle is related to Designing module, class or function. But it about closing already designed thing for modification but opening designed thing for extension i.e. extending functionality. So this principle is about extension.&lt;br /&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlLtcnSYRCPqHtNrKmou60quZwtwwNQIE6jQIDuhr6Qk3-g7vf10Pz4ZmML4rER2M0pf8LZG0WOglbFxCPVu_HnhIZKrarGyO9BX_NyTw5ZlJJJhLMwby9d2Ud09AgGZtvwnJ3KLtGccaS/s1600/openclose.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlLtcnSYRCPqHtNrKmou60quZwtwwNQIE6jQIDuhr6Qk3-g7vf10Pz4ZmML4rER2M0pf8LZG0WOglbFxCPVu_HnhIZKrarGyO9BX_NyTw5ZlJJJhLMwby9d2Ud09AgGZtvwnJ3KLtGccaS/s400/openclose.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;In Detail Read : &lt;a href="http://pranayamr.blogspot.in/2015/07/open-closed-principle.html"&gt;Open Closed Principle&lt;/a&gt; 
&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Liskov Substitution Principle
&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Principle is related to substitution of child in place of its parent. So principle is about relationship i.e. inheritance.
&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrLNXWgR6c5h5onKXM2Mb4aVgVSjXGdyetRYRAUcg6C7TRlGMAk0Ffa30_6xExnliVxMTi_xGibzrzIWYZFLevyYb5ewrntqMbH-MS5AouT96_DCEIe9v0v1QU0EUH6mg6y-PXK0kvBvjj/s1600/openclose.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrLNXWgR6c5h5onKXM2Mb4aVgVSjXGdyetRYRAUcg6C7TRlGMAk0Ffa30_6xExnliVxMTi_xGibzrzIWYZFLevyYb5ewrntqMbH-MS5AouT96_DCEIe9v0v1QU0EUH6mg6y-PXK0kvBvjj/s400/openclose.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;In Detail Read : &lt;a href="http://pranayamr.blogspot.in/2015/07/liskov-substitution-principle.html"&gt;Liskov Substitution Principle&lt;/a&gt;
&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Interface Segregation Principle
&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Principle is related to designing of interfaces as one of the basic rules of designing says depends on abstraction. Principle is about design interface such a way, so that client of interface not force to implement not required things. So principle is about efficient interface design.
&lt;br /&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgccpARFk5tJKnEzRQUHfT6TKOZpca9m9-WT8RD4hyb3v54KDLBoritcjHNYjWX9SHSbpcYDEbPa7YDFfBcbCuH_PkSov094rlshiZVPBIcD3drZAAH45DfQ0_p2SpLGZGLQ1BcgQ3qb3S2/s1600/Quatro_dustbin_for_waste_segregation.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgccpARFk5tJKnEzRQUHfT6TKOZpca9m9-WT8RD4hyb3v54KDLBoritcjHNYjWX9SHSbpcYDEbPa7YDFfBcbCuH_PkSov094rlshiZVPBIcD3drZAAH45DfQ0_p2SpLGZGLQ1BcgQ3qb3S2/s400/Quatro_dustbin_for_waste_segregation.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;In Detail Read : &lt;a href="http://pranayamr.blogspot.in/2015/07/interface-segregation-principle.html"&gt;Interface Segregation Principle&lt;/a&gt;
&lt;/li&gt;
&lt;br /&gt;
&lt;li&gt;&lt;b&gt;Dependency Inversion Principle 
&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Principle is related to designing decoupling modules, classes of software system. This principle mostly applied after 4 (Interface Segregation principle) because interface are one form of abstraction and this principle is related to Details (module/class) should depend on abstraction, and abstraction should not depend on detail. So this principle is about creating loosely coupled system.
&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYpuhCWOU-4fgAzBe_CnU3u9GQAJa3EU-fFCbpeOkAdrDCGMAnB8nEGB74bzM-SE6QoznlrMF-Gqqf9GjfkhFLbgNlC3QVM0zz28Rt59QppnTdgc4cVqAWh3Hwr-ko8w1BAIDUS9ST0JQL/s1600/USB.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYpuhCWOU-4fgAzBe_CnU3u9GQAJa3EU-fFCbpeOkAdrDCGMAnB8nEGB74bzM-SE6QoznlrMF-Gqqf9GjfkhFLbgNlC3QVM0zz28Rt59QppnTdgc4cVqAWh3Hwr-ko8w1BAIDUS9ST0JQL/s400/USB.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;In Detail Read : &lt;a href="http://pranayamr.blogspot.in/2015/07/dependency-inversion-principle.html"&gt;Dependency Inversion Principle&lt;/a&gt; 

&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description><link>http://pranayamr.blogspot.com/2015/07/solid-principle-in-detail.html</link><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBzAlrCUdikPaLAqXjH_TKec58jCBPnL7nINPkfq05itbb5HkGyJkTwiqmnoEkoDKMroIIyfKOrXIfbJpaddijmHuDIzp1hd7B3U21t950sUJA3V-o-RQgDXBbM6q5SQCfEoKE1w7w95Vk/s72-c/Solid+understanding.jpeg" width="72"/><thr:total>0</thr:total><author>pranayamr@gmail.com (Pranay Rana)</author></item></channel></rss>