diff --git a/src/Cassette.Handlebars.UnitTests/Cassette.Handlebars.UnitTests.csproj b/src/Cassette.Handlebars.UnitTests/Cassette.Handlebars.UnitTests.csproj new file mode 100644 index 00000000..f6d5a964 --- /dev/null +++ b/src/Cassette.Handlebars.UnitTests/Cassette.Handlebars.UnitTests.csproj @@ -0,0 +1,95 @@ + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {4691BC2D-A3BF-4B7A-94B3-2388B57BA19D} + Library + Properties + Cassette.Handlebars.UnitTests + Cassette.Handlebars.UnitTests + v4.0 + 512 + ..\ + true + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\Jurassic.2.1.1\lib\Jurassic.dll + + + ..\packages\Moq.4.0.10827\lib\NET40\Moq.dll + + + ..\packages\Should.1.1.12.0\lib\Should.dll + + + + + + + + + + ..\packages\xunit.1.9.1\lib\net20\xunit.dll + + + + + + + + + + + + {235663D0-24CC-442E-AEDF-0C0DD7227166} + Cassette.Handlebars + + + {F200A67A-D7B5-441B-AB36-69AA5C87577E} + Cassette.UnitTests + + + {A5CCF9D3-5D49-4BFC-B9A6-9EC9E0E29C50} + Cassette + + + + + + + + handlebars.js + PreserveNewest + + + + + + \ No newline at end of file diff --git a/src/Cassette.Handlebars.UnitTests/Handlebars/HandlebarsCompiler.cs b/src/Cassette.Handlebars.UnitTests/Handlebars/HandlebarsCompiler.cs new file mode 100644 index 00000000..10ede6ad --- /dev/null +++ b/src/Cassette.Handlebars.UnitTests/Handlebars/HandlebarsCompiler.cs @@ -0,0 +1,28 @@ +using Jurassic; +using Should; +using Xunit; + +namespace Cassette.HtmlTemplates +{ + public class HandlebarsCompiler_Tests + { + [Fact] + public void CanCompileHandlebarsTemplate() + { + var compiler = new HandlebarsCompiler(); + var result = compiler.Compile("Hello {{world}}", new CompileContext()); + + var engine = new ScriptEngine(); + engine.ExecuteFile("handlebars.js"); + var source = @" +(function(){ +var template = new Handlebars.Template(); +template.r = " + result.Output + @"; +return template.render({world:'Andrew'}); +}());"; + var templateRender = engine.Evaluate(source); + + templateRender.ShouldEqual("Hello Andrew"); + } + } +} \ No newline at end of file diff --git a/src/Cassette.Handlebars.UnitTests/Handlebars/HandlebarsFileSearchModifier.cs b/src/Cassette.Handlebars.UnitTests/Handlebars/HandlebarsFileSearchModifier.cs new file mode 100644 index 00000000..5472febe --- /dev/null +++ b/src/Cassette.Handlebars.UnitTests/Handlebars/HandlebarsFileSearchModifier.cs @@ -0,0 +1,34 @@ +using Should; +using Xunit; + +namespace Cassette.HtmlTemplates +{ + public class HandlebarsFileSearchModifier_Tests + { + [Fact] + public void ModifyAddsMustacheToPattern() + { + AssertPatternContains("*.handlebars"); + } + + [Fact] + public void ModifyAddsJstToPattern() + { + AssertPatternContains("*.hbr"); + } + + [Fact] + public void ModifyAddsTmplToPattern() + { + AssertPatternContains("*.hbt"); + } + + void AssertPatternContains(string filePattern) + { + var modifier = new HandlebarsFileSearchModifier(); + var fileSearch = new FileSearch(); + modifier.Modify(fileSearch); + filePattern.ShouldContain(filePattern); + } + } +} \ No newline at end of file diff --git a/src/Cassette.Handlebars.UnitTests/Handlebars/HandlebarsPipeline.cs b/src/Cassette.Handlebars.UnitTests/Handlebars/HandlebarsPipeline.cs new file mode 100644 index 00000000..3a57ad0e --- /dev/null +++ b/src/Cassette.Handlebars.UnitTests/Handlebars/HandlebarsPipeline.cs @@ -0,0 +1,49 @@ +using Cassette.TinyIoC; +using Cassette.Utilities; +using Jurassic; +using Should; +using Xunit; + +namespace Cassette.HtmlTemplates +{ + public class HandlebarsPipeline_Tests + { + readonly HandlebarsPipeline pipeline; + + public HandlebarsPipeline_Tests() + { + var container = new TinyIoCContainer(); + container.Register(new VirtualDirectoryPrepender("/")); + container.Register((c, n) => new UrlGenerator(c.Resolve(), new FakeFileSystem(), "")); + container.Register(new HtmlTemplateIdBuilder()); + pipeline = container.Resolve(); + } + + [Fact] + public void WhenProcessHtmlTemplateBundleWithHandlebarsAssets_ThenGeneratedScriptTemplatesWillRenderOutput() + { + var bundle = new HtmlTemplateBundle("~"); + bundle.Assets.Add(new StubAsset("~/a.htm", "first {{first}}")); + bundle.Assets.Add(new StubAsset("~/b.htm", "second {{second}}")); + + pipeline.Process(bundle); + + var scriptEngine = LoadHtmlTemplateScriptsIntoEngine(bundle); + + var renderOutputA = scriptEngine.Evaluate("JST.a({ first: 'test' });"); + renderOutputA.ShouldEqual("first test"); + + var renderOutputB = scriptEngine.Evaluate("JST.b({ second: 'test' });"); + renderOutputB.ShouldEqual("second test"); + } + + static ScriptEngine LoadHtmlTemplateScriptsIntoEngine(HtmlTemplateBundle bundle) + { + var output = bundle.OpenStream().ReadToEnd(); + var scriptEngine = new ScriptEngine(); + scriptEngine.ExecuteFile("handlebars.js"); + scriptEngine.Execute(output); + return scriptEngine; + } + } +} \ No newline at end of file diff --git a/src/Cassette.Handlebars.UnitTests/Handlebars/HandlebarsServices.cs b/src/Cassette.Handlebars.UnitTests/Handlebars/HandlebarsServices.cs new file mode 100644 index 00000000..052aee22 --- /dev/null +++ b/src/Cassette.Handlebars.UnitTests/Handlebars/HandlebarsServices.cs @@ -0,0 +1,47 @@ +using Cassette.BundleProcessing; +using Cassette.TinyIoC; +using Moq; +using Should; +using Xunit; + +namespace Cassette.HtmlTemplates +{ + public class HandlebarsServices_Tests + { + readonly TinyIoCContainer container; + readonly HandlebarsServices services; + + public HandlebarsServices_Tests() + { + container = new TinyIoCContainer(); + container.Register(Mock.Of()); + container.Register(new HtmlTemplateIdBuilder()); + + services = new HandlebarsServices(); + } + + [Fact] + public void RegistersHandlebarsPipeline() + { + services.Configure(container); + + var pipeline = container.Resolve>(); + pipeline.ShouldBeType(); + } + + [Fact] + public void AppliesHandlebarsSettingsConfigurations() + { + var configuration1 = new Mock>(); + var configuration2 = new Mock>(); + container.Register(configuration1.Object, "a"); + container.Register(configuration2.Object, "b"); + + services.Configure(container); + + var settings = container.Resolve(); + configuration1.Verify(c => c.Configure(settings)); + configuration2.Verify(c => c.Configure(settings)); + } + } +} \ No newline at end of file diff --git a/src/Cassette.Handlebars.UnitTests/Properties/AssemblyInfo.cs b/src/Cassette.Handlebars.UnitTests/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..9a513d1c --- /dev/null +++ b/src/Cassette.Handlebars.UnitTests/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Cassette.Handlebars.UnitTests")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Cassette.Handlebars.UnitTests")] +[assembly: AssemblyCopyright("Copyright © 2013")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("c850ee2c-80e5-485f-b615-832b23ea4bf7")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/src/Cassette.Handlebars.UnitTests/packages.config b/src/Cassette.Handlebars.UnitTests/packages.config new file mode 100644 index 00000000..c84ff39b --- /dev/null +++ b/src/Cassette.Handlebars.UnitTests/packages.config @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/src/Cassette.Handlebars/Cassette.Handlebars.csproj b/src/Cassette.Handlebars/Cassette.Handlebars.csproj new file mode 100644 index 00000000..69eeced1 --- /dev/null +++ b/src/Cassette.Handlebars/Cassette.Handlebars.csproj @@ -0,0 +1,97 @@ + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {235663D0-24CC-442E-AEDF-0C0DD7227166} + Library + Properties + Cassette.HtmlTemplates + Cassette.Handlebars + v4.0 + 512 + + ..\ + true + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\Jurassic.2.1.1\lib\Jurassic.dll + + + + + + + + + + + + + + + + + + + + True + True + Resources.resx + + + + + + + Designer + + + + + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + + + + + + {A5CCF9D3-5D49-4BFC-B9A6-9EC9E0E29C50} + Cassette + + + + + + \ No newline at end of file diff --git a/src/Cassette.Handlebars/Cassette.Handlebars.nutrans b/src/Cassette.Handlebars/Cassette.Handlebars.nutrans new file mode 100644 index 00000000..82b26ef6 --- /dev/null +++ b/src/Cassette.Handlebars/Cassette.Handlebars.nutrans @@ -0,0 +1,15 @@ + + + + Cassette.Handlebars + Handlebars HTML template compilation support for Cassette. + + + + + + + + + + \ No newline at end of file diff --git a/src/Cassette.Handlebars/Cassette.Handlebars.symbols.nutrans b/src/Cassette.Handlebars/Cassette.Handlebars.symbols.nutrans new file mode 100644 index 00000000..0cac1e17 --- /dev/null +++ b/src/Cassette.Handlebars/Cassette.Handlebars.symbols.nutrans @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/src/Cassette.Handlebars/CompileHandlebars.cs b/src/Cassette.Handlebars/CompileHandlebars.cs new file mode 100644 index 00000000..2917927c --- /dev/null +++ b/src/Cassette.Handlebars/CompileHandlebars.cs @@ -0,0 +1,15 @@ +using Cassette.BundleProcessing; + +namespace Cassette.HtmlTemplates { + public class CompileHandlebars : AddTransformerToAssets { + readonly CassetteSettings settings; + + public CompileHandlebars(CassetteSettings settings) { + this.settings = settings; + } + + protected override IAssetTransformer CreateAssetTransformer(HtmlTemplateBundle bundle) { + return new CompileAsset(new HandlebarsCompiler(), settings.SourceDirectory); + } + } +} \ No newline at end of file diff --git a/src/Cassette.Handlebars/DefineJavaScriptVariable.cs b/src/Cassette.Handlebars/DefineJavaScriptVariable.cs new file mode 100644 index 00000000..320cc21b --- /dev/null +++ b/src/Cassette.Handlebars/DefineJavaScriptVariable.cs @@ -0,0 +1,30 @@ +using System; +using System.IO; +using Cassette.Utilities; + +namespace Cassette.HtmlTemplates +{ + class DefineJavaScriptVariable : IAssetTransformer + { + readonly string javaScriptVariableName; + + public DefineJavaScriptVariable(string javaScriptVariableName) + { + this.javaScriptVariableName = javaScriptVariableName; + } + + public Func Transform(Func openSourceStream, IAsset asset) + { + return delegate + { + var source = openSourceStream().ReadToEnd(); + var define = string.Format( + "if (typeof {0}==='undefined'){{var {0}={{}};}}{1}", + javaScriptVariableName, + source + ); + return define.AsStream(); + }; + } + } +} \ No newline at end of file diff --git a/src/Cassette.Handlebars/HandlebarsCompiler.cs b/src/Cassette.Handlebars/HandlebarsCompiler.cs new file mode 100644 index 00000000..2e2329f9 --- /dev/null +++ b/src/Cassette.Handlebars/HandlebarsCompiler.cs @@ -0,0 +1,23 @@ +using System.Linq; +using Jurassic; + +namespace Cassette.HtmlTemplates +{ + public class HandlebarsCompiler : ICompiler + { + public HandlebarsCompiler() + { + _scriptEngine = new ScriptEngine(); + _scriptEngine.Execute(Properties.Resources.handlebars); + _scriptEngine.Execute("handlebarsPrecompile = Handlebars.precompile;"); + } + + readonly ScriptEngine _scriptEngine; + + public CompileResult Compile(string source, CompileContext context) + { + var javascript = _scriptEngine.CallGlobalFunction("handlebarsPrecompile", source); + return new CompileResult(javascript, Enumerable.Empty()); + } + } +} \ No newline at end of file diff --git a/src/Cassette.Handlebars/HandlebarsFileSearchModifier.cs b/src/Cassette.Handlebars/HandlebarsFileSearchModifier.cs new file mode 100644 index 00000000..8417bba2 --- /dev/null +++ b/src/Cassette.Handlebars/HandlebarsFileSearchModifier.cs @@ -0,0 +1,11 @@ + +namespace Cassette.HtmlTemplates +{ + public class HandlebarsFileSearchModifier : IFileSearchModifier + { + public void Modify(FileSearch fileSearch) + { + fileSearch.Pattern += ";*.handlebars;*.hbr;*.hbt;"; + } + } +} \ No newline at end of file diff --git a/src/Cassette.Handlebars/HandlebarsPipeline.cs b/src/Cassette.Handlebars/HandlebarsPipeline.cs new file mode 100644 index 00000000..032bb3dc --- /dev/null +++ b/src/Cassette.Handlebars/HandlebarsPipeline.cs @@ -0,0 +1,23 @@ +using System.Collections.Generic; +using Cassette.BundleProcessing; +using Cassette.TinyIoC; + +namespace Cassette.HtmlTemplates +{ + public class HandlebarsPipeline : BundlePipeline + { + public HandlebarsPipeline(TinyIoCContainer container, HandlebarsSettings handlebarsSettings) + : base(container) + { + var renderer = container.Resolve(); + + Add(new AssignHtmlTemplateRenderer(renderer)); + Add(new AssignContentType("text/javascript")); + Add(); + Add(); + Add(create => create(handlebarsSettings.JavaScriptVariableName)); + Add(); + Add(); + } + } +} \ No newline at end of file diff --git a/src/Cassette.Handlebars/HandlebarsServices.cs b/src/Cassette.Handlebars/HandlebarsServices.cs new file mode 100644 index 00000000..63637d7e --- /dev/null +++ b/src/Cassette.Handlebars/HandlebarsServices.cs @@ -0,0 +1,18 @@ +using Cassette.BundleProcessing; +using Cassette.TinyIoC; + +namespace Cassette.HtmlTemplates +{ + [ConfigurationOrder(20)] + public class HandlebarsServices : IConfiguration + { + public void Configure(TinyIoCContainer container) + { + container.Register().AsSingleton(); + + container + .Register(typeof(IBundlePipeline), typeof(HandlebarsPipeline)) + .AsMultiInstance(); + } + } +} \ No newline at end of file diff --git a/src/Cassette.Handlebars/HandlebarsSettings.cs b/src/Cassette.Handlebars/HandlebarsSettings.cs new file mode 100644 index 00000000..388890dd --- /dev/null +++ b/src/Cassette.Handlebars/HandlebarsSettings.cs @@ -0,0 +1,24 @@ +using System.Collections.Generic; + +namespace Cassette.HtmlTemplates +{ + public class HandlebarsSettings + { + /// + /// The name of the JavaScript variable to store compiled templates in. + /// For example, the default is "JST", so a template will be registered as JST['my-template'] = ...;. + /// + public string JavaScriptVariableName { get; set; } + + public HandlebarsSettings(IEnumerable> configurations) + { + JavaScriptVariableName = "JST"; + ApplyConfigurations(configurations); + } + + void ApplyConfigurations(IEnumerable> configurations) + { + configurations.OrderByConfigurationOrderAttribute().Configure(this); + } + } +} \ No newline at end of file diff --git a/src/Cassette.Handlebars/Properties/AssemblyInfo.cs b/src/Cassette.Handlebars/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..c253987f --- /dev/null +++ b/src/Cassette.Handlebars/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Cassette.Handlebars")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Cassette.Handlebars")] +[assembly: AssemblyCopyright("Copyright © 2013")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("73e46122-371a-47ce-888d-3d9e2ecbd5b4")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/src/Cassette.Handlebars/Properties/Resources.Designer.cs b/src/Cassette.Handlebars/Properties/Resources.Designer.cs new file mode 100644 index 00000000..4e97d2cd --- /dev/null +++ b/src/Cassette.Handlebars/Properties/Resources.Designer.cs @@ -0,0 +1,96 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.17929 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Cassette.HtmlTemplates.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Cassette.HtmlTemplates.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to // lib/handlebars/base.js + /// + ////*jshint eqnull:true*/ + ///this.Handlebars = {}; + /// + ///(function(Handlebars) { + /// + ///Handlebars.VERSION = "1.0.rc.2"; + /// + ///Handlebars.helpers = {}; + ///Handlebars.partials = {}; + /// + ///Handlebars.registerHelper = function(name, fn, inverse) { + /// if(inverse) { fn.not = inverse; } + /// this.helpers[name] = fn; + ///}; + /// + ///Handlebars.registerPartial = function(name, str) { + /// this.partials[name] = str; + ///}; + /// + ///Handlebars.registerHelper('helperMissing', function(arg) { + /// if(arguments.length === 2) { + /// return undefined; + /// } el [rest of string was truncated]";. + /// + internal static string handlebars { + get { + return ResourceManager.GetString("handlebars", resourceCulture); + } + } + } +} diff --git a/src/Cassette.Handlebars/Properties/Resources.resx b/src/Cassette.Handlebars/Properties/Resources.resx new file mode 100644 index 00000000..fbee9701 --- /dev/null +++ b/src/Cassette.Handlebars/Properties/Resources.resx @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\handlebars.js;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 + + \ No newline at end of file diff --git a/src/Cassette.Handlebars/RegisterTemplateWithHandlebars.cs b/src/Cassette.Handlebars/RegisterTemplateWithHandlebars.cs new file mode 100644 index 00000000..fd28db0d --- /dev/null +++ b/src/Cassette.Handlebars/RegisterTemplateWithHandlebars.cs @@ -0,0 +1,34 @@ +using System; +using System.IO; +using Cassette.Utilities; + +namespace Cassette.HtmlTemplates +{ + class RegisterTemplateWithHandlebars : IAssetTransformer + { + readonly HtmlTemplateBundle bundle; + readonly string javaScriptVariableName; + readonly IHtmlTemplateIdStrategy idStrategy; + + public RegisterTemplateWithHandlebars(HtmlTemplateBundle bundle, string javaScriptVariableName, IHtmlTemplateIdStrategy idStrategy) + { + this.bundle = bundle; + this.javaScriptVariableName = javaScriptVariableName; + this.idStrategy = idStrategy; + } + + public Func Transform(Func openSourceStream, IAsset asset) + { + return delegate + { + var compiledTemplate = openSourceStream().ReadToEnd(); + + var id = idStrategy.HtmlTemplateId(bundle, asset); + var template = javaScriptVariableName + "['" + id + "']"; + + var output = template + "= Handlebars.template(" + compiledTemplate + ");"; + return output.AsStream(); + }; + } + } +} \ No newline at end of file diff --git a/src/Cassette.Handlebars/RegisterTemplatesWithHandlebars.cs b/src/Cassette.Handlebars/RegisterTemplatesWithHandlebars.cs new file mode 100644 index 00000000..03ec8f35 --- /dev/null +++ b/src/Cassette.Handlebars/RegisterTemplatesWithHandlebars.cs @@ -0,0 +1,38 @@ +using Cassette.BundleProcessing; + +namespace Cassette.HtmlTemplates +{ + public class RegisterTemplatesWithHandlebars : AddTransformerToAssets + { + readonly IHtmlTemplateIdStrategy idStrategy; + + public delegate RegisterTemplatesWithHandlebars Factory(string javaScriptVariableName); + + readonly string javaScriptVariableName; + + public RegisterTemplatesWithHandlebars(string javaScriptVariableName, IHtmlTemplateIdStrategy idStrategy) + { + this.idStrategy = idStrategy; + this.javaScriptVariableName = javaScriptVariableName ?? "JST"; + } + + public override void Process(HtmlTemplateBundle bundle) + { + base.Process(bundle); + DefineJavaScriptVariableInFirstAsset(bundle); + } + + void DefineJavaScriptVariableInFirstAsset(HtmlTemplateBundle bundle) + { + if (bundle.Assets.Count > 0) + { + bundle.Assets[0].AddAssetTransformer(new DefineJavaScriptVariable(javaScriptVariableName)); + } + } + + protected override IAssetTransformer CreateAssetTransformer(HtmlTemplateBundle bundle) + { + return new RegisterTemplateWithHandlebars(bundle, javaScriptVariableName, idStrategy); + } + } +} \ No newline at end of file diff --git a/src/Cassette.Handlebars/Resources/handlebars.js b/src/Cassette.Handlebars/Resources/handlebars.js new file mode 100644 index 00000000..247a3fdf --- /dev/null +++ b/src/Cassette.Handlebars/Resources/handlebars.js @@ -0,0 +1,1992 @@ +// lib/handlebars/base.js + +/*jshint eqnull:true*/ +this.Handlebars = {}; + +(function(Handlebars) { + +Handlebars.VERSION = "1.0.rc.2"; + +Handlebars.helpers = {}; +Handlebars.partials = {}; + +Handlebars.registerHelper = function(name, fn, inverse) { + if(inverse) { fn.not = inverse; } + this.helpers[name] = fn; +}; + +Handlebars.registerPartial = function(name, str) { + this.partials[name] = str; +}; + +Handlebars.registerHelper('helperMissing', function(arg) { + if(arguments.length === 2) { + return undefined; + } else { + throw new Error("Could not find property '" + arg + "'"); + } +}); + +var toString = Object.prototype.toString, functionType = "[object Function]"; + +Handlebars.registerHelper('blockHelperMissing', function(context, options) { + var inverse = options.inverse || function() {}, fn = options.fn; + + + var ret = ""; + var type = toString.call(context); + + if(type === functionType) { context = context.call(this); } + + if(context === true) { + return fn(this); + } else if(context === false || context == null) { + return inverse(this); + } else if(type === "[object Array]") { + if(context.length > 0) { + return Handlebars.helpers.each(context, options); + } else { + return inverse(this); + } + } else { + return fn(context); + } +}); + +Handlebars.K = function() {}; + +Handlebars.createFrame = Object.create || function(object) { + Handlebars.K.prototype = object; + var obj = new Handlebars.K(); + Handlebars.K.prototype = null; + return obj; +}; + +Handlebars.logger = { + DEBUG: 0, INFO: 1, WARN: 2, ERROR: 3, level: 3, + + methodMap: {0: 'debug', 1: 'info', 2: 'warn', 3: 'error'}, + + // can be overridden in the host environment + log: function(level, obj) { + if (Handlebars.logger.level <= level) { + var method = Handlebars.logger.methodMap[level]; + if (typeof console !== 'undefined' && console[method]) { + console[method].call(console, obj); + } + } + } +}; + +Handlebars.log = function(level, obj) { Handlebars.logger.log(level, obj); }; + +Handlebars.registerHelper('each', function(context, options) { + var fn = options.fn, inverse = options.inverse; + var i = 0, ret = "", data; + + if (options.data) { + data = Handlebars.createFrame(options.data); + } + + if(context && typeof context === 'object') { + if(context instanceof Array){ + for(var j = context.length; i 2) { + expected.push("'" + this.terminals_[p] + "'"); + } + if (this.lexer.showPosition) { + errStr = "Parse error on line " + (yylineno + 1) + ":\n" + this.lexer.showPosition() + "\nExpecting " + expected.join(", ") + ", got '" + (this.terminals_[symbol] || symbol) + "'"; + } else { + errStr = "Parse error on line " + (yylineno + 1) + ": Unexpected " + (symbol == 1?"end of input":"'" + (this.terminals_[symbol] || symbol) + "'"); + } + this.parseError(errStr, {text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected}); + } + } + if (action[0] instanceof Array && action.length > 1) { + throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol); + } + switch (action[0]) { + case 1: + stack.push(symbol); + vstack.push(this.lexer.yytext); + lstack.push(this.lexer.yylloc); + stack.push(action[1]); + symbol = null; + if (!preErrorSymbol) { + yyleng = this.lexer.yyleng; + yytext = this.lexer.yytext; + yylineno = this.lexer.yylineno; + yyloc = this.lexer.yylloc; + if (recovering > 0) + recovering--; + } else { + symbol = preErrorSymbol; + preErrorSymbol = null; + } + break; + case 2: + len = this.productions_[action[1]][1]; + yyval.$ = vstack[vstack.length - len]; + yyval._$ = {first_line: lstack[lstack.length - (len || 1)].first_line, last_line: lstack[lstack.length - 1].last_line, first_column: lstack[lstack.length - (len || 1)].first_column, last_column: lstack[lstack.length - 1].last_column}; + if (ranges) { + yyval._$.range = [lstack[lstack.length - (len || 1)].range[0], lstack[lstack.length - 1].range[1]]; + } + r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack); + if (typeof r !== "undefined") { + return r; + } + if (len) { + stack = stack.slice(0, -1 * len * 2); + vstack = vstack.slice(0, -1 * len); + lstack = lstack.slice(0, -1 * len); + } + stack.push(this.productions_[action[1]][0]); + vstack.push(yyval.$); + lstack.push(yyval._$); + newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; + stack.push(newState); + break; + case 3: + return true; + } + } + return true; +} +}; +/* Jison generated lexer */ +var lexer = (function(){ +var lexer = ({EOF:1, +parseError:function parseError(str, hash) { + if (this.yy.parser) { + this.yy.parser.parseError(str, hash); + } else { + throw new Error(str); + } + }, +setInput:function (input) { + this._input = input; + this._more = this._less = this.done = false; + this.yylineno = this.yyleng = 0; + this.yytext = this.matched = this.match = ''; + this.conditionStack = ['INITIAL']; + this.yylloc = {first_line:1,first_column:0,last_line:1,last_column:0}; + if (this.options.ranges) this.yylloc.range = [0,0]; + this.offset = 0; + return this; + }, +input:function () { + var ch = this._input[0]; + this.yytext += ch; + this.yyleng++; + this.offset++; + this.match += ch; + this.matched += ch; + var lines = ch.match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno++; + this.yylloc.last_line++; + } else { + this.yylloc.last_column++; + } + if (this.options.ranges) this.yylloc.range[1]++; + + this._input = this._input.slice(1); + return ch; + }, +unput:function (ch) { + var len = ch.length; + var lines = ch.split(/(?:\r\n?|\n)/g); + + this._input = ch + this._input; + this.yytext = this.yytext.substr(0, this.yytext.length-len-1); + //this.yyleng -= len; + this.offset -= len; + var oldLines = this.match.split(/(?:\r\n?|\n)/g); + this.match = this.match.substr(0, this.match.length-1); + this.matched = this.matched.substr(0, this.matched.length-1); + + if (lines.length-1) this.yylineno -= lines.length-1; + var r = this.yylloc.range; + + this.yylloc = {first_line: this.yylloc.first_line, + last_line: this.yylineno+1, + first_column: this.yylloc.first_column, + last_column: lines ? + (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length: + this.yylloc.first_column - len + }; + + if (this.options.ranges) { + this.yylloc.range = [r[0], r[0] + this.yyleng - len]; + } + return this; + }, +more:function () { + this._more = true; + return this; + }, +less:function (n) { + this.unput(this.match.slice(n)); + }, +pastInput:function () { + var past = this.matched.substr(0, this.matched.length - this.match.length); + return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, ""); + }, +upcomingInput:function () { + var next = this.match; + if (next.length < 20) { + next += this._input.substr(0, 20-next.length); + } + return (next.substr(0,20)+(next.length > 20 ? '...':'')).replace(/\n/g, ""); + }, +showPosition:function () { + var pre = this.pastInput(); + var c = new Array(pre.length + 1).join("-"); + return pre + this.upcomingInput() + "\n" + c+"^"; + }, +next:function () { + if (this.done) { + return this.EOF; + } + if (!this._input) this.done = true; + + var token, + match, + tempMatch, + index, + col, + lines; + if (!this._more) { + this.yytext = ''; + this.match = ''; + } + var rules = this._currentRules(); + for (var i=0;i < rules.length; i++) { + tempMatch = this._input.match(this.rules[rules[i]]); + if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { + match = tempMatch; + index = i; + if (!this.options.flex) break; + } + } + if (match) { + lines = match[0].match(/(?:\r\n?|\n).*/g); + if (lines) this.yylineno += lines.length; + this.yylloc = {first_line: this.yylloc.last_line, + last_line: this.yylineno+1, + first_column: this.yylloc.last_column, + last_column: lines ? lines[lines.length-1].length-lines[lines.length-1].match(/\r?\n?/)[0].length : this.yylloc.last_column + match[0].length}; + this.yytext += match[0]; + this.match += match[0]; + this.matches = match; + this.yyleng = this.yytext.length; + if (this.options.ranges) { + this.yylloc.range = [this.offset, this.offset += this.yyleng]; + } + this._more = false; + this._input = this._input.slice(match[0].length); + this.matched += match[0]; + token = this.performAction.call(this, this.yy, this, rules[index],this.conditionStack[this.conditionStack.length-1]); + if (this.done && this._input) this.done = false; + if (token) return token; + else return; + } + if (this._input === "") { + return this.EOF; + } else { + return this.parseError('Lexical error on line '+(this.yylineno+1)+'. Unrecognized text.\n'+this.showPosition(), + {text: "", token: null, line: this.yylineno}); + } + }, +lex:function lex() { + var r = this.next(); + if (typeof r !== 'undefined') { + return r; + } else { + return this.lex(); + } + }, +begin:function begin(condition) { + this.conditionStack.push(condition); + }, +popState:function popState() { + return this.conditionStack.pop(); + }, +_currentRules:function _currentRules() { + return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules; + }, +topState:function () { + return this.conditionStack[this.conditionStack.length-2]; + }, +pushState:function begin(condition) { + this.begin(condition); + }}); +lexer.options = {}; +lexer.performAction = function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) { + +var YYSTATE=YY_START +switch($avoiding_name_collisions) { +case 0: + if(yy_.yytext.slice(-1) !== "\\") this.begin("mu"); + if(yy_.yytext.slice(-1) === "\\") yy_.yytext = yy_.yytext.substr(0,yy_.yyleng-1), this.begin("emu"); + if(yy_.yytext) return 14; + +break; +case 1: return 14; +break; +case 2: + if(yy_.yytext.slice(-1) !== "\\") this.popState(); + if(yy_.yytext.slice(-1) === "\\") yy_.yytext = yy_.yytext.substr(0,yy_.yyleng-1); + return 14; + +break; +case 3: yy_.yytext = yy_.yytext.substr(0, yy_.yyleng-4); this.popState(); return 15; +break; +case 4: this.begin("par"); return 24; +break; +case 5: return 16; +break; +case 6: return 20; +break; +case 7: return 19; +break; +case 8: return 19; +break; +case 9: return 23; +break; +case 10: return 23; +break; +case 11: this.popState(); this.begin('com'); +break; +case 12: yy_.yytext = yy_.yytext.substr(3,yy_.yyleng-5); this.popState(); return 15; +break; +case 13: return 22; +break; +case 14: return 36; +break; +case 15: return 35; +break; +case 16: return 35; +break; +case 17: return 39; +break; +case 18: /*ignore whitespace*/ +break; +case 19: this.popState(); return 18; +break; +case 20: this.popState(); return 18; +break; +case 21: yy_.yytext = yy_.yytext.substr(1,yy_.yyleng-2).replace(/\\"/g,'"'); return 30; +break; +case 22: yy_.yytext = yy_.yytext.substr(1,yy_.yyleng-2).replace(/\\'/g,"'"); return 30; +break; +case 23: yy_.yytext = yy_.yytext.substr(1); return 28; +break; +case 24: return 32; +break; +case 25: return 32; +break; +case 26: return 31; +break; +case 27: return 35; +break; +case 28: yy_.yytext = yy_.yytext.substr(1, yy_.yyleng-2); return 35; +break; +case 29: return 'INVALID'; +break; +case 30: /*ignore whitespace*/ +break; +case 31: this.popState(); return 37; +break; +case 32: return 5; +break; +} +}; +lexer.rules = [/^(?:[^\x00]*?(?=(\{\{)))/,/^(?:[^\x00]+)/,/^(?:[^\x00]{2,}?(?=(\{\{|$)))/,/^(?:[\s\S]*?--\}\})/,/^(?:\{\{>)/,/^(?:\{\{#)/,/^(?:\{\{\/)/,/^(?:\{\{\^)/,/^(?:\{\{\s*else\b)/,/^(?:\{\{\{)/,/^(?:\{\{&)/,/^(?:\{\{!--)/,/^(?:\{\{![\s\S]*?\}\})/,/^(?:\{\{)/,/^(?:=)/,/^(?:\.(?=[} ]))/,/^(?:\.\.)/,/^(?:[\/.])/,/^(?:\s+)/,/^(?:\}\}\})/,/^(?:\}\})/,/^(?:"(\\["]|[^"])*")/,/^(?:'(\\[']|[^'])*')/,/^(?:@[a-zA-Z]+)/,/^(?:true(?=[}\s]))/,/^(?:false(?=[}\s]))/,/^(?:[0-9]+(?=[}\s]))/,/^(?:[a-zA-Z0-9_$-]+(?=[=}\s\/.]))/,/^(?:\[[^\]]*\])/,/^(?:.)/,/^(?:\s+)/,/^(?:[a-zA-Z0-9_$-/]+)/,/^(?:$)/]; +lexer.conditions = {"mu":{"rules":[4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,32],"inclusive":false},"emu":{"rules":[2],"inclusive":false},"com":{"rules":[3],"inclusive":false},"par":{"rules":[30,31],"inclusive":false},"INITIAL":{"rules":[0,1,32],"inclusive":true}}; +return lexer;})() +parser.lexer = lexer; +function Parser () { this.yy = {}; }Parser.prototype = parser;parser.Parser = Parser; +return new Parser; +})();; +// lib/handlebars/compiler/base.js +Handlebars.Parser = handlebars; + +Handlebars.parse = function(string) { + Handlebars.Parser.yy = Handlebars.AST; + return Handlebars.Parser.parse(string); +}; + +Handlebars.print = function(ast) { + return new Handlebars.PrintVisitor().accept(ast); +};; +// lib/handlebars/compiler/ast.js +(function() { + + Handlebars.AST = {}; + + Handlebars.AST.ProgramNode = function(statements, inverse) { + this.type = "program"; + this.statements = statements; + if(inverse) { this.inverse = new Handlebars.AST.ProgramNode(inverse); } + }; + + Handlebars.AST.MustacheNode = function(rawParams, hash, unescaped) { + this.type = "mustache"; + this.escaped = !unescaped; + this.hash = hash; + + var id = this.id = rawParams[0]; + var params = this.params = rawParams.slice(1); + + // a mustache is an eligible helper if: + // * its id is simple (a single part, not `this` or `..`) + var eligibleHelper = this.eligibleHelper = id.isSimple; + + // a mustache is definitely a helper if: + // * it is an eligible helper, and + // * it has at least one parameter or hash segment + this.isHelper = eligibleHelper && (params.length || hash); + + // if a mustache is an eligible helper but not a definite + // helper, it is ambiguous, and will be resolved in a later + // pass or at runtime. + }; + + Handlebars.AST.PartialNode = function(partialName, context) { + this.type = "partial"; + this.partialName = partialName; + this.context = context; + }; + + var verifyMatch = function(open, close) { + if(open.original !== close.original) { + throw new Handlebars.Exception(open.original + " doesn't match " + close.original); + } + }; + + Handlebars.AST.BlockNode = function(mustache, program, inverse, close) { + verifyMatch(mustache.id, close); + this.type = "block"; + this.mustache = mustache; + this.program = program; + this.inverse = inverse; + + if (this.inverse && !this.program) { + this.isInverse = true; + } + }; + + Handlebars.AST.ContentNode = function(string) { + this.type = "content"; + this.string = string; + }; + + Handlebars.AST.HashNode = function(pairs) { + this.type = "hash"; + this.pairs = pairs; + }; + + Handlebars.AST.IdNode = function(parts) { + this.type = "ID"; + this.original = parts.join("."); + + var dig = [], depth = 0; + + for(var i=0,l=parts.length; i": ">", + '"': """, + "'": "'", + "`": "`" + }; + + var badChars = /[&<>"'`]/g; + var possible = /[&<>"'`]/; + + var escapeChar = function(chr) { + return escape[chr] || "&"; + }; + + Handlebars.Utils = { + escapeExpression: function(string) { + // don't escape SafeStrings, since they're already safe + if (string instanceof Handlebars.SafeString) { + return string.toString(); + } else if (string == null || string === false) { + return ""; + } + + if(!possible.test(string)) { return string; } + return string.replace(badChars, escapeChar); + }, + + isEmpty: function(value) { + if (!value && value !== 0) { + return true; + } else if(Object.prototype.toString.call(value) === "[object Array]" && value.length === 0) { + return true; + } else { + return false; + } + } + }; +})();; +// lib/handlebars/compiler/compiler.js + +/*jshint eqnull:true*/ +Handlebars.Compiler = function() {}; +Handlebars.JavaScriptCompiler = function() {}; + +(function(Compiler, JavaScriptCompiler) { + // the foundHelper register will disambiguate helper lookup from finding a + // function in a context. This is necessary for mustache compatibility, which + // requires that context functions in blocks are evaluated by blockHelperMissing, + // and then proceed as if the resulting value was provided to blockHelperMissing. + + Compiler.prototype = { + compiler: Compiler, + + disassemble: function() { + var opcodes = this.opcodes, opcode, out = [], params, param; + + for (var i=0, l=opcodes.length; i 0) { + this.source[1] = this.source[1] + ", " + locals.join(", "); + } + + // Generate minimizer alias mappings + if (!this.isChild) { + var aliases = []; + for (var alias in this.context.aliases) { + this.source[1] = this.source[1] + ', ' + alias + '=' + this.context.aliases[alias]; + } + } + + if (this.source[1]) { + this.source[1] = "var " + this.source[1].substring(2) + ";"; + } + + // Merge children + if (!this.isChild) { + this.source[1] += '\n' + this.context.programs.join('\n') + '\n'; + } + + if (!this.environment.isSimple) { + this.source.push("return buffer;"); + } + + var params = this.isChild ? ["depth0", "data"] : ["Handlebars", "depth0", "helpers", "partials", "data"]; + + for(var i=0, l=this.environment.depths.list.length; i this.stackVars.length) { this.stackVars.push("stack" + this.stackSlot); } + return "stack" + this.stackSlot; + }, + + popStack: function() { + var item = this.compileStack.pop(); + + if (item instanceof Literal) { + return item.value; + } else { + this.stackSlot--; + return item; + } + }, + + topStack: function() { + var item = this.compileStack[this.compileStack.length - 1]; + + if (item instanceof Literal) { + return item.value; + } else { + return item; + } + }, + + quotedString: function(str) { + return '"' + str + .replace(/\\/g, '\\\\') + .replace(/"/g, '\\"') + .replace(/\n/g, '\\n') + .replace(/\r/g, '\\r') + '"'; + }, + + setupHelper: function(paramSize, name) { + var params = []; + this.setupParams(paramSize, params); + var foundHelper = this.nameLookup('helpers', name, 'helper'); + + return { + params: params, + name: foundHelper, + callParams: ["depth0"].concat(params).join(", "), + helperMissingParams: ["depth0", this.quotedString(name)].concat(params).join(", ") + }; + }, + + // the params and contexts arguments are passed in arrays + // to fill in + setupParams: function(paramSize, params) { + var options = [], contexts = [], types = [], param, inverse, program; + + options.push("hash:" + this.popStack()); + + inverse = this.popStack(); + program = this.popStack(); + + // Avoid setting fn and inverse if neither are set. This allows + // helpers to do a check for `if (options.fn)` + if (program || inverse) { + if (!program) { + this.context.aliases.self = "this"; + program = "self.noop"; + } + + if (!inverse) { + this.context.aliases.self = "this"; + inverse = "self.noop"; + } + + options.push("inverse:" + inverse); + options.push("fn:" + program); + } + + for(var i=0; i + + + \ No newline at end of file diff --git a/src/Cassette.sln b/src/Cassette.sln index 67436c9a..0cd4fd61 100644 --- a/src/Cassette.sln +++ b/src/Cassette.sln @@ -1,6 +1,6 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2012 +# Visual Studio 2010 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{639E342E-ED44-4D76-99D3-DA44A32CB2D8}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Plugins", "Plugins", "{4F0C8144-C649-441A-86C4-9671844E5FC0}" @@ -72,237 +72,259 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RequireJsSample", "RequireJ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Cassette.RequireJS.UnitTests", "Cassette.RequireJS.UnitTests\Cassette.RequireJS.UnitTests.csproj", "{E45DA7CE-3A8F-4414-AA60-BDF636D15D1B}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Cassette.Handlebars.UnitTests", "Cassette.Handlebars.UnitTests\Cassette.Handlebars.UnitTests.csproj", "{4691BC2D-A3BF-4B7A-94B3-2388B57BA19D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Cassette.Handlebars", "Cassette.Handlebars\Cassette.Handlebars.csproj", "{235663D0-24CC-442E-AEDF-0C0DD7227166}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution - DebugNET35|Any CPU = DebugNET35|Any CPU Debug|Any CPU = Debug|Any CPU - ReleaseNET35|Any CPU = ReleaseNET35|Any CPU + DebugNET35|Any CPU = DebugNET35|Any CPU Release|Any CPU = Release|Any CPU + ReleaseNET35|Any CPU = ReleaseNET35|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {2CA5DE76-6CEB-4402-948D-9FBD62E22F51}.DebugNET35|Any CPU.ActiveCfg = DebugNET35|Any CPU - {2CA5DE76-6CEB-4402-948D-9FBD62E22F51}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2CA5DE76-6CEB-4402-948D-9FBD62E22F51}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2CA5DE76-6CEB-4402-948D-9FBD62E22F51}.ReleaseNET35|Any CPU.ActiveCfg = ReleaseNET35|Any CPU - {2CA5DE76-6CEB-4402-948D-9FBD62E22F51}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2CA5DE76-6CEB-4402-948D-9FBD62E22F51}.Release|Any CPU.Build.0 = Release|Any CPU - {3A021487-A395-4FE6-9B41-336D0F1E6AD0}.DebugNET35|Any CPU.ActiveCfg = DebugNET35|Any CPU - {3A021487-A395-4FE6-9B41-336D0F1E6AD0}.DebugNET35|Any CPU.Build.0 = DebugNET35|Any CPU - {3A021487-A395-4FE6-9B41-336D0F1E6AD0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3A021487-A395-4FE6-9B41-336D0F1E6AD0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3A021487-A395-4FE6-9B41-336D0F1E6AD0}.ReleaseNET35|Any CPU.ActiveCfg = ReleaseNET35|Any CPU - {3A021487-A395-4FE6-9B41-336D0F1E6AD0}.ReleaseNET35|Any CPU.Build.0 = ReleaseNET35|Any CPU - {3A021487-A395-4FE6-9B41-336D0F1E6AD0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3A021487-A395-4FE6-9B41-336D0F1E6AD0}.Release|Any CPU.Build.0 = Release|Any CPU - {4AD6C38D-F3FA-4AE5-8485-B397A9224955}.DebugNET35|Any CPU.ActiveCfg = Debug|Any CPU - {4AD6C38D-F3FA-4AE5-8485-B397A9224955}.DebugNET35|Any CPU.Build.0 = Debug|Any CPU - {4AD6C38D-F3FA-4AE5-8485-B397A9224955}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4AD6C38D-F3FA-4AE5-8485-B397A9224955}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4AD6C38D-F3FA-4AE5-8485-B397A9224955}.ReleaseNET35|Any CPU.ActiveCfg = ReleaseNET35|Any CPU - {4AD6C38D-F3FA-4AE5-8485-B397A9224955}.ReleaseNET35|Any CPU.Build.0 = ReleaseNET35|Any CPU - {4AD6C38D-F3FA-4AE5-8485-B397A9224955}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4AD6C38D-F3FA-4AE5-8485-B397A9224955}.Release|Any CPU.Build.0 = Release|Any CPU - {4D64EC45-C42A-4601-9E80-2D166AC849F3}.DebugNET35|Any CPU.ActiveCfg = DebugNET35|Any CPU - {4D64EC45-C42A-4601-9E80-2D166AC849F3}.DebugNET35|Any CPU.Build.0 = DebugNET35|Any CPU + {A5CCF9D3-5D49-4BFC-B9A6-9EC9E0E29C50}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A5CCF9D3-5D49-4BFC-B9A6-9EC9E0E29C50}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A5CCF9D3-5D49-4BFC-B9A6-9EC9E0E29C50}.DebugNET35|Any CPU.ActiveCfg = DebugNET35|Any CPU + {A5CCF9D3-5D49-4BFC-B9A6-9EC9E0E29C50}.DebugNET35|Any CPU.Build.0 = DebugNET35|Any CPU + {A5CCF9D3-5D49-4BFC-B9A6-9EC9E0E29C50}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A5CCF9D3-5D49-4BFC-B9A6-9EC9E0E29C50}.Release|Any CPU.Build.0 = Release|Any CPU + {A5CCF9D3-5D49-4BFC-B9A6-9EC9E0E29C50}.ReleaseNET35|Any CPU.ActiveCfg = ReleaseNET35|Any CPU + {A5CCF9D3-5D49-4BFC-B9A6-9EC9E0E29C50}.ReleaseNET35|Any CPU.Build.0 = ReleaseNET35|Any CPU + {733F8032-D649-4E4C-A23E-4A048C33FCAE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {733F8032-D649-4E4C-A23E-4A048C33FCAE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {733F8032-D649-4E4C-A23E-4A048C33FCAE}.DebugNET35|Any CPU.ActiveCfg = DebugNET35|Any CPU + {733F8032-D649-4E4C-A23E-4A048C33FCAE}.DebugNET35|Any CPU.Build.0 = DebugNET35|Any CPU + {733F8032-D649-4E4C-A23E-4A048C33FCAE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {733F8032-D649-4E4C-A23E-4A048C33FCAE}.Release|Any CPU.Build.0 = Release|Any CPU + {733F8032-D649-4E4C-A23E-4A048C33FCAE}.ReleaseNET35|Any CPU.ActiveCfg = ReleaseNET35|Any CPU + {733F8032-D649-4E4C-A23E-4A048C33FCAE}.ReleaseNET35|Any CPU.Build.0 = ReleaseNET35|Any CPU + {EF2E2EF3-5A8F-402D-99FD-C8C60C178F63}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EF2E2EF3-5A8F-402D-99FD-C8C60C178F63}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EF2E2EF3-5A8F-402D-99FD-C8C60C178F63}.DebugNET35|Any CPU.ActiveCfg = DebugNET35|Any CPU + {EF2E2EF3-5A8F-402D-99FD-C8C60C178F63}.DebugNET35|Any CPU.Build.0 = DebugNET35|Any CPU + {EF2E2EF3-5A8F-402D-99FD-C8C60C178F63}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EF2E2EF3-5A8F-402D-99FD-C8C60C178F63}.Release|Any CPU.Build.0 = Release|Any CPU + {EF2E2EF3-5A8F-402D-99FD-C8C60C178F63}.ReleaseNET35|Any CPU.ActiveCfg = ReleaseNET35|Any CPU + {EF2E2EF3-5A8F-402D-99FD-C8C60C178F63}.ReleaseNET35|Any CPU.Build.0 = ReleaseNET35|Any CPU + {C9A552DA-83EB-4479-BAB6-C40B6091E3D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C9A552DA-83EB-4479-BAB6-C40B6091E3D4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C9A552DA-83EB-4479-BAB6-C40B6091E3D4}.DebugNET35|Any CPU.ActiveCfg = DebugNET35|Any CPU + {C9A552DA-83EB-4479-BAB6-C40B6091E3D4}.DebugNET35|Any CPU.Build.0 = DebugNET35|Any CPU + {C9A552DA-83EB-4479-BAB6-C40B6091E3D4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C9A552DA-83EB-4479-BAB6-C40B6091E3D4}.Release|Any CPU.Build.0 = Release|Any CPU + {C9A552DA-83EB-4479-BAB6-C40B6091E3D4}.ReleaseNET35|Any CPU.ActiveCfg = ReleaseNET35|Any CPU + {C9A552DA-83EB-4479-BAB6-C40B6091E3D4}.ReleaseNET35|Any CPU.Build.0 = ReleaseNET35|Any CPU {4D64EC45-C42A-4601-9E80-2D166AC849F3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4D64EC45-C42A-4601-9E80-2D166AC849F3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4D64EC45-C42A-4601-9E80-2D166AC849F3}.ReleaseNET35|Any CPU.ActiveCfg = ReleaseNET35|Any CPU - {4D64EC45-C42A-4601-9E80-2D166AC849F3}.ReleaseNET35|Any CPU.Build.0 = ReleaseNET35|Any CPU + {4D64EC45-C42A-4601-9E80-2D166AC849F3}.DebugNET35|Any CPU.ActiveCfg = DebugNET35|Any CPU + {4D64EC45-C42A-4601-9E80-2D166AC849F3}.DebugNET35|Any CPU.Build.0 = DebugNET35|Any CPU {4D64EC45-C42A-4601-9E80-2D166AC849F3}.Release|Any CPU.ActiveCfg = Release|Any CPU {4D64EC45-C42A-4601-9E80-2D166AC849F3}.Release|Any CPU.Build.0 = Release|Any CPU - {52B1448C-8165-46B7-B024-A6BF9F60D766}.DebugNET35|Any CPU.ActiveCfg = Debug|Any CPU + {4D64EC45-C42A-4601-9E80-2D166AC849F3}.ReleaseNET35|Any CPU.ActiveCfg = ReleaseNET35|Any CPU + {4D64EC45-C42A-4601-9E80-2D166AC849F3}.ReleaseNET35|Any CPU.Build.0 = ReleaseNET35|Any CPU + {5B4D49A1-D849-43E3-8701-9CD56DC533BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5B4D49A1-D849-43E3-8701-9CD56DC533BC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5B4D49A1-D849-43E3-8701-9CD56DC533BC}.DebugNET35|Any CPU.ActiveCfg = DebugNET35|Any CPU + {5B4D49A1-D849-43E3-8701-9CD56DC533BC}.DebugNET35|Any CPU.Build.0 = DebugNET35|Any CPU + {5B4D49A1-D849-43E3-8701-9CD56DC533BC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5B4D49A1-D849-43E3-8701-9CD56DC533BC}.Release|Any CPU.Build.0 = Release|Any CPU + {5B4D49A1-D849-43E3-8701-9CD56DC533BC}.ReleaseNET35|Any CPU.ActiveCfg = ReleaseNET35|Any CPU + {5B4D49A1-D849-43E3-8701-9CD56DC533BC}.ReleaseNET35|Any CPU.Build.0 = ReleaseNET35|Any CPU + {EC1BE4F4-A2A7-4154-9F4D-F75D1B1FD976}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EC1BE4F4-A2A7-4154-9F4D-F75D1B1FD976}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EC1BE4F4-A2A7-4154-9F4D-F75D1B1FD976}.DebugNET35|Any CPU.ActiveCfg = DebugNET35|Any CPU + {EC1BE4F4-A2A7-4154-9F4D-F75D1B1FD976}.DebugNET35|Any CPU.Build.0 = DebugNET35|Any CPU + {EC1BE4F4-A2A7-4154-9F4D-F75D1B1FD976}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EC1BE4F4-A2A7-4154-9F4D-F75D1B1FD976}.Release|Any CPU.Build.0 = Release|Any CPU + {EC1BE4F4-A2A7-4154-9F4D-F75D1B1FD976}.ReleaseNET35|Any CPU.ActiveCfg = ReleaseNET35|Any CPU + {EC1BE4F4-A2A7-4154-9F4D-F75D1B1FD976}.ReleaseNET35|Any CPU.Build.0 = ReleaseNET35|Any CPU + {F8ED179C-E38B-4EF4-A5E8-52AC1611425E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F8ED179C-E38B-4EF4-A5E8-52AC1611425E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F8ED179C-E38B-4EF4-A5E8-52AC1611425E}.DebugNET35|Any CPU.ActiveCfg = DebugNET35|Any CPU + {F8ED179C-E38B-4EF4-A5E8-52AC1611425E}.DebugNET35|Any CPU.Build.0 = DebugNET35|Any CPU + {F8ED179C-E38B-4EF4-A5E8-52AC1611425E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F8ED179C-E38B-4EF4-A5E8-52AC1611425E}.Release|Any CPU.Build.0 = Release|Any CPU + {F8ED179C-E38B-4EF4-A5E8-52AC1611425E}.ReleaseNET35|Any CPU.ActiveCfg = ReleaseNET35|Any CPU + {F8ED179C-E38B-4EF4-A5E8-52AC1611425E}.ReleaseNET35|Any CPU.Build.0 = ReleaseNET35|Any CPU {52B1448C-8165-46B7-B024-A6BF9F60D766}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {52B1448C-8165-46B7-B024-A6BF9F60D766}.Debug|Any CPU.Build.0 = Debug|Any CPU - {52B1448C-8165-46B7-B024-A6BF9F60D766}.ReleaseNET35|Any CPU.ActiveCfg = Release|Any CPU + {52B1448C-8165-46B7-B024-A6BF9F60D766}.DebugNET35|Any CPU.ActiveCfg = Debug|Any CPU {52B1448C-8165-46B7-B024-A6BF9F60D766}.Release|Any CPU.ActiveCfg = Release|Any CPU {52B1448C-8165-46B7-B024-A6BF9F60D766}.Release|Any CPU.Build.0 = Release|Any CPU - {5672A520-0A60-424F-B9DB-29A80A96F24F}.DebugNET35|Any CPU.ActiveCfg = Debug|Any CPU - {5672A520-0A60-424F-B9DB-29A80A96F24F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5672A520-0A60-424F-B9DB-29A80A96F24F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5672A520-0A60-424F-B9DB-29A80A96F24F}.ReleaseNET35|Any CPU.ActiveCfg = Release|Any CPU - {5672A520-0A60-424F-B9DB-29A80A96F24F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5672A520-0A60-424F-B9DB-29A80A96F24F}.Release|Any CPU.Build.0 = Release|Any CPU - {594B9007-1375-459C-9F08-B6512369842B}.DebugNET35|Any CPU.ActiveCfg = DebugNET35|Any CPU - {594B9007-1375-459C-9F08-B6512369842B}.DebugNET35|Any CPU.Build.0 = DebugNET35|Any CPU + {52B1448C-8165-46B7-B024-A6BF9F60D766}.ReleaseNET35|Any CPU.ActiveCfg = Release|Any CPU + {3A021487-A395-4FE6-9B41-336D0F1E6AD0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3A021487-A395-4FE6-9B41-336D0F1E6AD0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3A021487-A395-4FE6-9B41-336D0F1E6AD0}.DebugNET35|Any CPU.ActiveCfg = DebugNET35|Any CPU + {3A021487-A395-4FE6-9B41-336D0F1E6AD0}.DebugNET35|Any CPU.Build.0 = DebugNET35|Any CPU + {3A021487-A395-4FE6-9B41-336D0F1E6AD0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3A021487-A395-4FE6-9B41-336D0F1E6AD0}.Release|Any CPU.Build.0 = Release|Any CPU + {3A021487-A395-4FE6-9B41-336D0F1E6AD0}.ReleaseNET35|Any CPU.ActiveCfg = ReleaseNET35|Any CPU + {3A021487-A395-4FE6-9B41-336D0F1E6AD0}.ReleaseNET35|Any CPU.Build.0 = ReleaseNET35|Any CPU + {FAB26B89-C01A-4DAA-B415-B1A5115C50C2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FAB26B89-C01A-4DAA-B415-B1A5115C50C2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FAB26B89-C01A-4DAA-B415-B1A5115C50C2}.DebugNET35|Any CPU.ActiveCfg = Debug|Any CPU + {FAB26B89-C01A-4DAA-B415-B1A5115C50C2}.DebugNET35|Any CPU.Build.0 = Debug|Any CPU + {FAB26B89-C01A-4DAA-B415-B1A5115C50C2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FAB26B89-C01A-4DAA-B415-B1A5115C50C2}.Release|Any CPU.Build.0 = Release|Any CPU + {FAB26B89-C01A-4DAA-B415-B1A5115C50C2}.ReleaseNET35|Any CPU.ActiveCfg = Release|Any CPU + {FAB26B89-C01A-4DAA-B415-B1A5115C50C2}.ReleaseNET35|Any CPU.Build.0 = Release|Any CPU {594B9007-1375-459C-9F08-B6512369842B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {594B9007-1375-459C-9F08-B6512369842B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {594B9007-1375-459C-9F08-B6512369842B}.ReleaseNET35|Any CPU.ActiveCfg = ReleaseNET35|Any CPU - {594B9007-1375-459C-9F08-B6512369842B}.ReleaseNET35|Any CPU.Build.0 = ReleaseNET35|Any CPU + {594B9007-1375-459C-9F08-B6512369842B}.DebugNET35|Any CPU.ActiveCfg = DebugNET35|Any CPU + {594B9007-1375-459C-9F08-B6512369842B}.DebugNET35|Any CPU.Build.0 = DebugNET35|Any CPU {594B9007-1375-459C-9F08-B6512369842B}.Release|Any CPU.ActiveCfg = Release|Any CPU {594B9007-1375-459C-9F08-B6512369842B}.Release|Any CPU.Build.0 = Release|Any CPU - {5952594E-CED1-4E34-9DA2-5F28453F559E}.DebugNET35|Any CPU.ActiveCfg = DebugNET35|Any CPU - {5952594E-CED1-4E34-9DA2-5F28453F559E}.DebugNET35|Any CPU.Build.0 = DebugNET35|Any CPU - {5952594E-CED1-4E34-9DA2-5F28453F559E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5952594E-CED1-4E34-9DA2-5F28453F559E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5952594E-CED1-4E34-9DA2-5F28453F559E}.ReleaseNET35|Any CPU.ActiveCfg = ReleaseNET35|Any CPU - {5952594E-CED1-4E34-9DA2-5F28453F559E}.ReleaseNET35|Any CPU.Build.0 = ReleaseNET35|Any CPU - {5952594E-CED1-4E34-9DA2-5F28453F559E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5952594E-CED1-4E34-9DA2-5F28453F559E}.Release|Any CPU.Build.0 = Release|Any CPU - {5B4D49A1-D849-43E3-8701-9CD56DC533BC}.DebugNET35|Any CPU.ActiveCfg = DebugNET35|Any CPU - {5B4D49A1-D849-43E3-8701-9CD56DC533BC}.DebugNET35|Any CPU.Build.0 = DebugNET35|Any CPU - {5B4D49A1-D849-43E3-8701-9CD56DC533BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5B4D49A1-D849-43E3-8701-9CD56DC533BC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5B4D49A1-D849-43E3-8701-9CD56DC533BC}.ReleaseNET35|Any CPU.ActiveCfg = ReleaseNET35|Any CPU - {5B4D49A1-D849-43E3-8701-9CD56DC533BC}.ReleaseNET35|Any CPU.Build.0 = ReleaseNET35|Any CPU - {5B4D49A1-D849-43E3-8701-9CD56DC533BC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5B4D49A1-D849-43E3-8701-9CD56DC533BC}.Release|Any CPU.Build.0 = Release|Any CPU - {5D451928-B7C4-4BEA-848D-F23A8E3DFAA5}.DebugNET35|Any CPU.ActiveCfg = DebugNET35|Any CPU - {5D451928-B7C4-4BEA-848D-F23A8E3DFAA5}.DebugNET35|Any CPU.Build.0 = DebugNET35|Any CPU + {594B9007-1375-459C-9F08-B6512369842B}.ReleaseNET35|Any CPU.ActiveCfg = ReleaseNET35|Any CPU + {594B9007-1375-459C-9F08-B6512369842B}.ReleaseNET35|Any CPU.Build.0 = ReleaseNET35|Any CPU + {D465B3ED-0139-4130-91E7-6D479A1CAF64}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D465B3ED-0139-4130-91E7-6D479A1CAF64}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D465B3ED-0139-4130-91E7-6D479A1CAF64}.DebugNET35|Any CPU.ActiveCfg = DebugNET35|Any CPU + {D465B3ED-0139-4130-91E7-6D479A1CAF64}.DebugNET35|Any CPU.Build.0 = DebugNET35|Any CPU + {D465B3ED-0139-4130-91E7-6D479A1CAF64}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D465B3ED-0139-4130-91E7-6D479A1CAF64}.Release|Any CPU.Build.0 = Release|Any CPU + {D465B3ED-0139-4130-91E7-6D479A1CAF64}.ReleaseNET35|Any CPU.ActiveCfg = ReleaseNET35|Any CPU + {D465B3ED-0139-4130-91E7-6D479A1CAF64}.ReleaseNET35|Any CPU.Build.0 = ReleaseNET35|Any CPU + {FC7BD8AA-A175-4E25-A8B2-10CCB8F46503}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FC7BD8AA-A175-4E25-A8B2-10CCB8F46503}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FC7BD8AA-A175-4E25-A8B2-10CCB8F46503}.DebugNET35|Any CPU.ActiveCfg = DebugNET35|Any CPU + {FC7BD8AA-A175-4E25-A8B2-10CCB8F46503}.DebugNET35|Any CPU.Build.0 = DebugNET35|Any CPU + {FC7BD8AA-A175-4E25-A8B2-10CCB8F46503}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FC7BD8AA-A175-4E25-A8B2-10CCB8F46503}.Release|Any CPU.Build.0 = Release|Any CPU + {FC7BD8AA-A175-4E25-A8B2-10CCB8F46503}.ReleaseNET35|Any CPU.ActiveCfg = ReleaseNET35|Any CPU + {FC7BD8AA-A175-4E25-A8B2-10CCB8F46503}.ReleaseNET35|Any CPU.Build.0 = ReleaseNET35|Any CPU {5D451928-B7C4-4BEA-848D-F23A8E3DFAA5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5D451928-B7C4-4BEA-848D-F23A8E3DFAA5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5D451928-B7C4-4BEA-848D-F23A8E3DFAA5}.ReleaseNET35|Any CPU.ActiveCfg = ReleaseNET35|Any CPU - {5D451928-B7C4-4BEA-848D-F23A8E3DFAA5}.ReleaseNET35|Any CPU.Build.0 = ReleaseNET35|Any CPU + {5D451928-B7C4-4BEA-848D-F23A8E3DFAA5}.DebugNET35|Any CPU.ActiveCfg = DebugNET35|Any CPU + {5D451928-B7C4-4BEA-848D-F23A8E3DFAA5}.DebugNET35|Any CPU.Build.0 = DebugNET35|Any CPU {5D451928-B7C4-4BEA-848D-F23A8E3DFAA5}.Release|Any CPU.ActiveCfg = Release|Any CPU {5D451928-B7C4-4BEA-848D-F23A8E3DFAA5}.Release|Any CPU.Build.0 = Release|Any CPU - {733F8032-D649-4E4C-A23E-4A048C33FCAE}.DebugNET35|Any CPU.ActiveCfg = DebugNET35|Any CPU - {733F8032-D649-4E4C-A23E-4A048C33FCAE}.DebugNET35|Any CPU.Build.0 = DebugNET35|Any CPU - {733F8032-D649-4E4C-A23E-4A048C33FCAE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {733F8032-D649-4E4C-A23E-4A048C33FCAE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {733F8032-D649-4E4C-A23E-4A048C33FCAE}.ReleaseNET35|Any CPU.ActiveCfg = ReleaseNET35|Any CPU - {733F8032-D649-4E4C-A23E-4A048C33FCAE}.ReleaseNET35|Any CPU.Build.0 = ReleaseNET35|Any CPU - {733F8032-D649-4E4C-A23E-4A048C33FCAE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {733F8032-D649-4E4C-A23E-4A048C33FCAE}.Release|Any CPU.Build.0 = Release|Any CPU - {8DEA25D9-66FF-42AD-A1A2-1FE423A2B04B}.DebugNET35|Any CPU.ActiveCfg = DebugNET35|Any CPU - {8DEA25D9-66FF-42AD-A1A2-1FE423A2B04B}.DebugNET35|Any CPU.Build.0 = DebugNET35|Any CPU + {5D451928-B7C4-4BEA-848D-F23A8E3DFAA5}.ReleaseNET35|Any CPU.ActiveCfg = ReleaseNET35|Any CPU + {5D451928-B7C4-4BEA-848D-F23A8E3DFAA5}.ReleaseNET35|Any CPU.Build.0 = ReleaseNET35|Any CPU + {5952594E-CED1-4E34-9DA2-5F28453F559E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5952594E-CED1-4E34-9DA2-5F28453F559E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5952594E-CED1-4E34-9DA2-5F28453F559E}.DebugNET35|Any CPU.ActiveCfg = DebugNET35|Any CPU + {5952594E-CED1-4E34-9DA2-5F28453F559E}.DebugNET35|Any CPU.Build.0 = DebugNET35|Any CPU + {5952594E-CED1-4E34-9DA2-5F28453F559E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5952594E-CED1-4E34-9DA2-5F28453F559E}.Release|Any CPU.Build.0 = Release|Any CPU + {5952594E-CED1-4E34-9DA2-5F28453F559E}.ReleaseNET35|Any CPU.ActiveCfg = ReleaseNET35|Any CPU + {5952594E-CED1-4E34-9DA2-5F28453F559E}.ReleaseNET35|Any CPU.Build.0 = ReleaseNET35|Any CPU {8DEA25D9-66FF-42AD-A1A2-1FE423A2B04B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8DEA25D9-66FF-42AD-A1A2-1FE423A2B04B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8DEA25D9-66FF-42AD-A1A2-1FE423A2B04B}.ReleaseNET35|Any CPU.ActiveCfg = ReleaseNET35|Any CPU - {8DEA25D9-66FF-42AD-A1A2-1FE423A2B04B}.ReleaseNET35|Any CPU.Build.0 = ReleaseNET35|Any CPU + {8DEA25D9-66FF-42AD-A1A2-1FE423A2B04B}.DebugNET35|Any CPU.ActiveCfg = DebugNET35|Any CPU + {8DEA25D9-66FF-42AD-A1A2-1FE423A2B04B}.DebugNET35|Any CPU.Build.0 = DebugNET35|Any CPU {8DEA25D9-66FF-42AD-A1A2-1FE423A2B04B}.Release|Any CPU.ActiveCfg = Release|Any CPU {8DEA25D9-66FF-42AD-A1A2-1FE423A2B04B}.Release|Any CPU.Build.0 = Release|Any CPU - {8FBD2D87-142D-4B86-92F8-ED62844E255E}.DebugNET35|Any CPU.ActiveCfg = Debug|Any CPU - {8FBD2D87-142D-4B86-92F8-ED62844E255E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8FBD2D87-142D-4B86-92F8-ED62844E255E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8FBD2D87-142D-4B86-92F8-ED62844E255E}.ReleaseNET35|Any CPU.ActiveCfg = Release|Any CPU - {8FBD2D87-142D-4B86-92F8-ED62844E255E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8FBD2D87-142D-4B86-92F8-ED62844E255E}.Release|Any CPU.Build.0 = Release|Any CPU - {A5CCF9D3-5D49-4BFC-B9A6-9EC9E0E29C50}.DebugNET35|Any CPU.ActiveCfg = DebugNET35|Any CPU - {A5CCF9D3-5D49-4BFC-B9A6-9EC9E0E29C50}.DebugNET35|Any CPU.Build.0 = DebugNET35|Any CPU - {A5CCF9D3-5D49-4BFC-B9A6-9EC9E0E29C50}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A5CCF9D3-5D49-4BFC-B9A6-9EC9E0E29C50}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A5CCF9D3-5D49-4BFC-B9A6-9EC9E0E29C50}.ReleaseNET35|Any CPU.ActiveCfg = ReleaseNET35|Any CPU - {A5CCF9D3-5D49-4BFC-B9A6-9EC9E0E29C50}.ReleaseNET35|Any CPU.Build.0 = ReleaseNET35|Any CPU - {A5CCF9D3-5D49-4BFC-B9A6-9EC9E0E29C50}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A5CCF9D3-5D49-4BFC-B9A6-9EC9E0E29C50}.Release|Any CPU.Build.0 = Release|Any CPU - {B775612C-BAF8-4947-B83B-DD43F802E999}.DebugNET35|Any CPU.ActiveCfg = Debug|Any CPU - {B775612C-BAF8-4947-B83B-DD43F802E999}.DebugNET35|Any CPU.Build.0 = Debug|Any CPU - {B775612C-BAF8-4947-B83B-DD43F802E999}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B775612C-BAF8-4947-B83B-DD43F802E999}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B775612C-BAF8-4947-B83B-DD43F802E999}.ReleaseNET35|Any CPU.ActiveCfg = ReleaseNET35|Any CPU - {B775612C-BAF8-4947-B83B-DD43F802E999}.ReleaseNET35|Any CPU.Build.0 = ReleaseNET35|Any CPU - {B775612C-BAF8-4947-B83B-DD43F802E999}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B775612C-BAF8-4947-B83B-DD43F802E999}.Release|Any CPU.Build.0 = Release|Any CPU - {BD0F9965-DCC6-416B-AD6A-377F5CAF8216}.DebugNET35|Any CPU.ActiveCfg = DebugNET35|Any CPU - {BD0F9965-DCC6-416B-AD6A-377F5CAF8216}.DebugNET35|Any CPU.Build.0 = DebugNET35|Any CPU - {BD0F9965-DCC6-416B-AD6A-377F5CAF8216}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BD0F9965-DCC6-416B-AD6A-377F5CAF8216}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BD0F9965-DCC6-416B-AD6A-377F5CAF8216}.ReleaseNET35|Any CPU.ActiveCfg = ReleaseNET35|Any CPU - {BD0F9965-DCC6-416B-AD6A-377F5CAF8216}.ReleaseNET35|Any CPU.Build.0 = ReleaseNET35|Any CPU - {BD0F9965-DCC6-416B-AD6A-377F5CAF8216}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BD0F9965-DCC6-416B-AD6A-377F5CAF8216}.Release|Any CPU.Build.0 = Release|Any CPU - {C93B9E33-D51D-4101-A3E2-911B8F616BE7}.DebugNET35|Any CPU.ActiveCfg = DebugNET35|Any CPU - {C93B9E33-D51D-4101-A3E2-911B8F616BE7}.DebugNET35|Any CPU.Build.0 = DebugNET35|Any CPU + {8DEA25D9-66FF-42AD-A1A2-1FE423A2B04B}.ReleaseNET35|Any CPU.ActiveCfg = ReleaseNET35|Any CPU + {8DEA25D9-66FF-42AD-A1A2-1FE423A2B04B}.ReleaseNET35|Any CPU.Build.0 = ReleaseNET35|Any CPU {C93B9E33-D51D-4101-A3E2-911B8F616BE7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C93B9E33-D51D-4101-A3E2-911B8F616BE7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C93B9E33-D51D-4101-A3E2-911B8F616BE7}.ReleaseNET35|Any CPU.ActiveCfg = ReleaseNET35|Any CPU - {C93B9E33-D51D-4101-A3E2-911B8F616BE7}.ReleaseNET35|Any CPU.Build.0 = ReleaseNET35|Any CPU + {C93B9E33-D51D-4101-A3E2-911B8F616BE7}.DebugNET35|Any CPU.ActiveCfg = DebugNET35|Any CPU + {C93B9E33-D51D-4101-A3E2-911B8F616BE7}.DebugNET35|Any CPU.Build.0 = DebugNET35|Any CPU {C93B9E33-D51D-4101-A3E2-911B8F616BE7}.Release|Any CPU.ActiveCfg = Release|Any CPU {C93B9E33-D51D-4101-A3E2-911B8F616BE7}.Release|Any CPU.Build.0 = Release|Any CPU - {C9A552DA-83EB-4479-BAB6-C40B6091E3D4}.DebugNET35|Any CPU.ActiveCfg = DebugNET35|Any CPU - {C9A552DA-83EB-4479-BAB6-C40B6091E3D4}.DebugNET35|Any CPU.Build.0 = DebugNET35|Any CPU - {C9A552DA-83EB-4479-BAB6-C40B6091E3D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C9A552DA-83EB-4479-BAB6-C40B6091E3D4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C9A552DA-83EB-4479-BAB6-C40B6091E3D4}.ReleaseNET35|Any CPU.ActiveCfg = ReleaseNET35|Any CPU - {C9A552DA-83EB-4479-BAB6-C40B6091E3D4}.ReleaseNET35|Any CPU.Build.0 = ReleaseNET35|Any CPU - {C9A552DA-83EB-4479-BAB6-C40B6091E3D4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C9A552DA-83EB-4479-BAB6-C40B6091E3D4}.Release|Any CPU.Build.0 = Release|Any CPU - {D465B3ED-0139-4130-91E7-6D479A1CAF64}.DebugNET35|Any CPU.ActiveCfg = DebugNET35|Any CPU - {D465B3ED-0139-4130-91E7-6D479A1CAF64}.DebugNET35|Any CPU.Build.0 = DebugNET35|Any CPU - {D465B3ED-0139-4130-91E7-6D479A1CAF64}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D465B3ED-0139-4130-91E7-6D479A1CAF64}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D465B3ED-0139-4130-91E7-6D479A1CAF64}.ReleaseNET35|Any CPU.ActiveCfg = ReleaseNET35|Any CPU - {D465B3ED-0139-4130-91E7-6D479A1CAF64}.ReleaseNET35|Any CPU.Build.0 = ReleaseNET35|Any CPU - {D465B3ED-0139-4130-91E7-6D479A1CAF64}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D465B3ED-0139-4130-91E7-6D479A1CAF64}.Release|Any CPU.Build.0 = Release|Any CPU - {E45DA7CE-3A8F-4414-AA60-BDF636D15D1B}.DebugNET35|Any CPU.ActiveCfg = Debug|Any CPU - {E45DA7CE-3A8F-4414-AA60-BDF636D15D1B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E45DA7CE-3A8F-4414-AA60-BDF636D15D1B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E45DA7CE-3A8F-4414-AA60-BDF636D15D1B}.ReleaseNET35|Any CPU.ActiveCfg = Release|Any CPU - {E45DA7CE-3A8F-4414-AA60-BDF636D15D1B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E45DA7CE-3A8F-4414-AA60-BDF636D15D1B}.Release|Any CPU.Build.0 = Release|Any CPU - {EC1BE4F4-A2A7-4154-9F4D-F75D1B1FD976}.DebugNET35|Any CPU.ActiveCfg = DebugNET35|Any CPU - {EC1BE4F4-A2A7-4154-9F4D-F75D1B1FD976}.DebugNET35|Any CPU.Build.0 = DebugNET35|Any CPU - {EC1BE4F4-A2A7-4154-9F4D-F75D1B1FD976}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EC1BE4F4-A2A7-4154-9F4D-F75D1B1FD976}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EC1BE4F4-A2A7-4154-9F4D-F75D1B1FD976}.ReleaseNET35|Any CPU.ActiveCfg = ReleaseNET35|Any CPU - {EC1BE4F4-A2A7-4154-9F4D-F75D1B1FD976}.ReleaseNET35|Any CPU.Build.0 = ReleaseNET35|Any CPU - {EC1BE4F4-A2A7-4154-9F4D-F75D1B1FD976}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EC1BE4F4-A2A7-4154-9F4D-F75D1B1FD976}.Release|Any CPU.Build.0 = Release|Any CPU - {EF2E2EF3-5A8F-402D-99FD-C8C60C178F63}.DebugNET35|Any CPU.ActiveCfg = DebugNET35|Any CPU - {EF2E2EF3-5A8F-402D-99FD-C8C60C178F63}.DebugNET35|Any CPU.Build.0 = DebugNET35|Any CPU - {EF2E2EF3-5A8F-402D-99FD-C8C60C178F63}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EF2E2EF3-5A8F-402D-99FD-C8C60C178F63}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EF2E2EF3-5A8F-402D-99FD-C8C60C178F63}.ReleaseNET35|Any CPU.ActiveCfg = ReleaseNET35|Any CPU - {EF2E2EF3-5A8F-402D-99FD-C8C60C178F63}.ReleaseNET35|Any CPU.Build.0 = ReleaseNET35|Any CPU - {EF2E2EF3-5A8F-402D-99FD-C8C60C178F63}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EF2E2EF3-5A8F-402D-99FD-C8C60C178F63}.Release|Any CPU.Build.0 = Release|Any CPU - {F200A67A-D7B5-441B-AB36-69AA5C87577E}.DebugNET35|Any CPU.ActiveCfg = DebugNET35|Any CPU - {F200A67A-D7B5-441B-AB36-69AA5C87577E}.DebugNET35|Any CPU.Build.0 = DebugNET35|Any CPU + {C93B9E33-D51D-4101-A3E2-911B8F616BE7}.ReleaseNET35|Any CPU.ActiveCfg = ReleaseNET35|Any CPU + {C93B9E33-D51D-4101-A3E2-911B8F616BE7}.ReleaseNET35|Any CPU.Build.0 = ReleaseNET35|Any CPU + {2CA5DE76-6CEB-4402-948D-9FBD62E22F51}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2CA5DE76-6CEB-4402-948D-9FBD62E22F51}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2CA5DE76-6CEB-4402-948D-9FBD62E22F51}.DebugNET35|Any CPU.ActiveCfg = DebugNET35|Any CPU + {2CA5DE76-6CEB-4402-948D-9FBD62E22F51}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2CA5DE76-6CEB-4402-948D-9FBD62E22F51}.Release|Any CPU.Build.0 = Release|Any CPU + {2CA5DE76-6CEB-4402-948D-9FBD62E22F51}.ReleaseNET35|Any CPU.ActiveCfg = ReleaseNET35|Any CPU {F200A67A-D7B5-441B-AB36-69AA5C87577E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F200A67A-D7B5-441B-AB36-69AA5C87577E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F200A67A-D7B5-441B-AB36-69AA5C87577E}.ReleaseNET35|Any CPU.ActiveCfg = ReleaseNET35|Any CPU - {F200A67A-D7B5-441B-AB36-69AA5C87577E}.ReleaseNET35|Any CPU.Build.0 = ReleaseNET35|Any CPU + {F200A67A-D7B5-441B-AB36-69AA5C87577E}.DebugNET35|Any CPU.ActiveCfg = DebugNET35|Any CPU + {F200A67A-D7B5-441B-AB36-69AA5C87577E}.DebugNET35|Any CPU.Build.0 = DebugNET35|Any CPU {F200A67A-D7B5-441B-AB36-69AA5C87577E}.Release|Any CPU.ActiveCfg = Release|Any CPU {F200A67A-D7B5-441B-AB36-69AA5C87577E}.Release|Any CPU.Build.0 = Release|Any CPU - {F8ED179C-E38B-4EF4-A5E8-52AC1611425E}.DebugNET35|Any CPU.ActiveCfg = DebugNET35|Any CPU - {F8ED179C-E38B-4EF4-A5E8-52AC1611425E}.DebugNET35|Any CPU.Build.0 = DebugNET35|Any CPU - {F8ED179C-E38B-4EF4-A5E8-52AC1611425E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F8ED179C-E38B-4EF4-A5E8-52AC1611425E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F8ED179C-E38B-4EF4-A5E8-52AC1611425E}.ReleaseNET35|Any CPU.ActiveCfg = ReleaseNET35|Any CPU - {F8ED179C-E38B-4EF4-A5E8-52AC1611425E}.ReleaseNET35|Any CPU.Build.0 = ReleaseNET35|Any CPU - {F8ED179C-E38B-4EF4-A5E8-52AC1611425E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F8ED179C-E38B-4EF4-A5E8-52AC1611425E}.Release|Any CPU.Build.0 = Release|Any CPU - {FAB26B89-C01A-4DAA-B415-B1A5115C50C2}.DebugNET35|Any CPU.ActiveCfg = Debug|Any CPU - {FAB26B89-C01A-4DAA-B415-B1A5115C50C2}.DebugNET35|Any CPU.Build.0 = Debug|Any CPU - {FAB26B89-C01A-4DAA-B415-B1A5115C50C2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FAB26B89-C01A-4DAA-B415-B1A5115C50C2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FAB26B89-C01A-4DAA-B415-B1A5115C50C2}.ReleaseNET35|Any CPU.ActiveCfg = Release|Any CPU - {FAB26B89-C01A-4DAA-B415-B1A5115C50C2}.ReleaseNET35|Any CPU.Build.0 = Release|Any CPU - {FAB26B89-C01A-4DAA-B415-B1A5115C50C2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FAB26B89-C01A-4DAA-B415-B1A5115C50C2}.Release|Any CPU.Build.0 = Release|Any CPU - {FC7BD8AA-A175-4E25-A8B2-10CCB8F46503}.DebugNET35|Any CPU.ActiveCfg = DebugNET35|Any CPU - {FC7BD8AA-A175-4E25-A8B2-10CCB8F46503}.DebugNET35|Any CPU.Build.0 = DebugNET35|Any CPU - {FC7BD8AA-A175-4E25-A8B2-10CCB8F46503}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FC7BD8AA-A175-4E25-A8B2-10CCB8F46503}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FC7BD8AA-A175-4E25-A8B2-10CCB8F46503}.ReleaseNET35|Any CPU.ActiveCfg = ReleaseNET35|Any CPU - {FC7BD8AA-A175-4E25-A8B2-10CCB8F46503}.ReleaseNET35|Any CPU.Build.0 = ReleaseNET35|Any CPU - {FC7BD8AA-A175-4E25-A8B2-10CCB8F46503}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FC7BD8AA-A175-4E25-A8B2-10CCB8F46503}.Release|Any CPU.Build.0 = Release|Any CPU + {F200A67A-D7B5-441B-AB36-69AA5C87577E}.ReleaseNET35|Any CPU.ActiveCfg = ReleaseNET35|Any CPU + {F200A67A-D7B5-441B-AB36-69AA5C87577E}.ReleaseNET35|Any CPU.Build.0 = ReleaseNET35|Any CPU + {BD0F9965-DCC6-416B-AD6A-377F5CAF8216}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BD0F9965-DCC6-416B-AD6A-377F5CAF8216}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BD0F9965-DCC6-416B-AD6A-377F5CAF8216}.DebugNET35|Any CPU.ActiveCfg = DebugNET35|Any CPU + {BD0F9965-DCC6-416B-AD6A-377F5CAF8216}.DebugNET35|Any CPU.Build.0 = DebugNET35|Any CPU + {BD0F9965-DCC6-416B-AD6A-377F5CAF8216}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BD0F9965-DCC6-416B-AD6A-377F5CAF8216}.Release|Any CPU.Build.0 = Release|Any CPU + {BD0F9965-DCC6-416B-AD6A-377F5CAF8216}.ReleaseNET35|Any CPU.ActiveCfg = ReleaseNET35|Any CPU + {BD0F9965-DCC6-416B-AD6A-377F5CAF8216}.ReleaseNET35|Any CPU.Build.0 = ReleaseNET35|Any CPU + {B775612C-BAF8-4947-B83B-DD43F802E999}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B775612C-BAF8-4947-B83B-DD43F802E999}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B775612C-BAF8-4947-B83B-DD43F802E999}.DebugNET35|Any CPU.ActiveCfg = Debug|Any CPU + {B775612C-BAF8-4947-B83B-DD43F802E999}.DebugNET35|Any CPU.Build.0 = Debug|Any CPU + {B775612C-BAF8-4947-B83B-DD43F802E999}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B775612C-BAF8-4947-B83B-DD43F802E999}.Release|Any CPU.Build.0 = Release|Any CPU + {B775612C-BAF8-4947-B83B-DD43F802E999}.ReleaseNET35|Any CPU.ActiveCfg = ReleaseNET35|Any CPU + {B775612C-BAF8-4947-B83B-DD43F802E999}.ReleaseNET35|Any CPU.Build.0 = ReleaseNET35|Any CPU + {4AD6C38D-F3FA-4AE5-8485-B397A9224955}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4AD6C38D-F3FA-4AE5-8485-B397A9224955}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4AD6C38D-F3FA-4AE5-8485-B397A9224955}.DebugNET35|Any CPU.ActiveCfg = Debug|Any CPU + {4AD6C38D-F3FA-4AE5-8485-B397A9224955}.DebugNET35|Any CPU.Build.0 = Debug|Any CPU + {4AD6C38D-F3FA-4AE5-8485-B397A9224955}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4AD6C38D-F3FA-4AE5-8485-B397A9224955}.Release|Any CPU.Build.0 = Release|Any CPU + {4AD6C38D-F3FA-4AE5-8485-B397A9224955}.ReleaseNET35|Any CPU.ActiveCfg = ReleaseNET35|Any CPU + {4AD6C38D-F3FA-4AE5-8485-B397A9224955}.ReleaseNET35|Any CPU.Build.0 = ReleaseNET35|Any CPU + {5672A520-0A60-424F-B9DB-29A80A96F24F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5672A520-0A60-424F-B9DB-29A80A96F24F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5672A520-0A60-424F-B9DB-29A80A96F24F}.DebugNET35|Any CPU.ActiveCfg = Debug|Any CPU + {5672A520-0A60-424F-B9DB-29A80A96F24F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5672A520-0A60-424F-B9DB-29A80A96F24F}.Release|Any CPU.Build.0 = Release|Any CPU + {5672A520-0A60-424F-B9DB-29A80A96F24F}.ReleaseNET35|Any CPU.ActiveCfg = Release|Any CPU + {8FBD2D87-142D-4B86-92F8-ED62844E255E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8FBD2D87-142D-4B86-92F8-ED62844E255E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8FBD2D87-142D-4B86-92F8-ED62844E255E}.DebugNET35|Any CPU.ActiveCfg = Debug|Any CPU + {8FBD2D87-142D-4B86-92F8-ED62844E255E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8FBD2D87-142D-4B86-92F8-ED62844E255E}.Release|Any CPU.Build.0 = Release|Any CPU + {8FBD2D87-142D-4B86-92F8-ED62844E255E}.ReleaseNET35|Any CPU.ActiveCfg = Release|Any CPU + {E45DA7CE-3A8F-4414-AA60-BDF636D15D1B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E45DA7CE-3A8F-4414-AA60-BDF636D15D1B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E45DA7CE-3A8F-4414-AA60-BDF636D15D1B}.DebugNET35|Any CPU.ActiveCfg = Debug|Any CPU + {E45DA7CE-3A8F-4414-AA60-BDF636D15D1B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E45DA7CE-3A8F-4414-AA60-BDF636D15D1B}.Release|Any CPU.Build.0 = Release|Any CPU + {E45DA7CE-3A8F-4414-AA60-BDF636D15D1B}.ReleaseNET35|Any CPU.ActiveCfg = Release|Any CPU + {4691BC2D-A3BF-4B7A-94B3-2388B57BA19D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4691BC2D-A3BF-4B7A-94B3-2388B57BA19D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4691BC2D-A3BF-4B7A-94B3-2388B57BA19D}.DebugNET35|Any CPU.ActiveCfg = Debug|Any CPU + {4691BC2D-A3BF-4B7A-94B3-2388B57BA19D}.DebugNET35|Any CPU.Build.0 = Debug|Any CPU + {4691BC2D-A3BF-4B7A-94B3-2388B57BA19D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4691BC2D-A3BF-4B7A-94B3-2388B57BA19D}.Release|Any CPU.Build.0 = Release|Any CPU + {4691BC2D-A3BF-4B7A-94B3-2388B57BA19D}.ReleaseNET35|Any CPU.ActiveCfg = Release|Any CPU + {4691BC2D-A3BF-4B7A-94B3-2388B57BA19D}.ReleaseNET35|Any CPU.Build.0 = Release|Any CPU + {235663D0-24CC-442E-AEDF-0C0DD7227166}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {235663D0-24CC-442E-AEDF-0C0DD7227166}.Debug|Any CPU.Build.0 = Debug|Any CPU + {235663D0-24CC-442E-AEDF-0C0DD7227166}.DebugNET35|Any CPU.ActiveCfg = Debug|Any CPU + {235663D0-24CC-442E-AEDF-0C0DD7227166}.DebugNET35|Any CPU.Build.0 = Debug|Any CPU + {235663D0-24CC-442E-AEDF-0C0DD7227166}.Release|Any CPU.ActiveCfg = Release|Any CPU + {235663D0-24CC-442E-AEDF-0C0DD7227166}.Release|Any CPU.Build.0 = Release|Any CPU + {235663D0-24CC-442E-AEDF-0C0DD7227166}.ReleaseNET35|Any CPU.ActiveCfg = Release|Any CPU + {235663D0-24CC-442E-AEDF-0C0DD7227166}.ReleaseNET35|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution - {2CA5DE76-6CEB-4402-948D-9FBD62E22F51} = {639E342E-ED44-4D76-99D3-DA44A32CB2D8} - {4AD6C38D-F3FA-4AE5-8485-B397A9224955} = {639E342E-ED44-4D76-99D3-DA44A32CB2D8} - {4D64EC45-C42A-4601-9E80-2D166AC849F3} = {4F0C8144-C649-441A-86C4-9671844E5FC0} - {52B1448C-8165-46B7-B024-A6BF9F60D766} = {4F0C8144-C649-441A-86C4-9671844E5FC0} - {5672A520-0A60-424F-B9DB-29A80A96F24F} = {4F0C8144-C649-441A-86C4-9671844E5FC0} {594B9007-1375-459C-9F08-B6512369842B} = {639E342E-ED44-4D76-99D3-DA44A32CB2D8} - {5952594E-CED1-4E34-9DA2-5F28453F559E} = {639E342E-ED44-4D76-99D3-DA44A32CB2D8} - {5B4D49A1-D849-43E3-8701-9CD56DC533BC} = {4F0C8144-C649-441A-86C4-9671844E5FC0} + {D465B3ED-0139-4130-91E7-6D479A1CAF64} = {639E342E-ED44-4D76-99D3-DA44A32CB2D8} + {FC7BD8AA-A175-4E25-A8B2-10CCB8F46503} = {639E342E-ED44-4D76-99D3-DA44A32CB2D8} {5D451928-B7C4-4BEA-848D-F23A8E3DFAA5} = {639E342E-ED44-4D76-99D3-DA44A32CB2D8} + {5952594E-CED1-4E34-9DA2-5F28453F559E} = {639E342E-ED44-4D76-99D3-DA44A32CB2D8} {8DEA25D9-66FF-42AD-A1A2-1FE423A2B04B} = {639E342E-ED44-4D76-99D3-DA44A32CB2D8} - {8FBD2D87-142D-4B86-92F8-ED62844E255E} = {4749F1D1-273C-4EC9-8D77-13642C7907DA} - {B775612C-BAF8-4947-B83B-DD43F802E999} = {4F0C8144-C649-441A-86C4-9671844E5FC0} - {BD0F9965-DCC6-416B-AD6A-377F5CAF8216} = {639E342E-ED44-4D76-99D3-DA44A32CB2D8} {C93B9E33-D51D-4101-A3E2-911B8F616BE7} = {639E342E-ED44-4D76-99D3-DA44A32CB2D8} - {C9A552DA-83EB-4479-BAB6-C40B6091E3D4} = {4F0C8144-C649-441A-86C4-9671844E5FC0} - {D465B3ED-0139-4130-91E7-6D479A1CAF64} = {639E342E-ED44-4D76-99D3-DA44A32CB2D8} + {2CA5DE76-6CEB-4402-948D-9FBD62E22F51} = {639E342E-ED44-4D76-99D3-DA44A32CB2D8} + {F200A67A-D7B5-441B-AB36-69AA5C87577E} = {639E342E-ED44-4D76-99D3-DA44A32CB2D8} + {BD0F9965-DCC6-416B-AD6A-377F5CAF8216} = {639E342E-ED44-4D76-99D3-DA44A32CB2D8} + {4AD6C38D-F3FA-4AE5-8485-B397A9224955} = {639E342E-ED44-4D76-99D3-DA44A32CB2D8} {E45DA7CE-3A8F-4414-AA60-BDF636D15D1B} = {639E342E-ED44-4D76-99D3-DA44A32CB2D8} - {EC1BE4F4-A2A7-4154-9F4D-F75D1B1FD976} = {4F0C8144-C649-441A-86C4-9671844E5FC0} + {4691BC2D-A3BF-4B7A-94B3-2388B57BA19D} = {639E342E-ED44-4D76-99D3-DA44A32CB2D8} {EF2E2EF3-5A8F-402D-99FD-C8C60C178F63} = {4F0C8144-C649-441A-86C4-9671844E5FC0} - {F200A67A-D7B5-441B-AB36-69AA5C87577E} = {639E342E-ED44-4D76-99D3-DA44A32CB2D8} - {FC7BD8AA-A175-4E25-A8B2-10CCB8F46503} = {639E342E-ED44-4D76-99D3-DA44A32CB2D8} + {C9A552DA-83EB-4479-BAB6-C40B6091E3D4} = {4F0C8144-C649-441A-86C4-9671844E5FC0} + {4D64EC45-C42A-4601-9E80-2D166AC849F3} = {4F0C8144-C649-441A-86C4-9671844E5FC0} + {5B4D49A1-D849-43E3-8701-9CD56DC533BC} = {4F0C8144-C649-441A-86C4-9671844E5FC0} + {EC1BE4F4-A2A7-4154-9F4D-F75D1B1FD976} = {4F0C8144-C649-441A-86C4-9671844E5FC0} + {52B1448C-8165-46B7-B024-A6BF9F60D766} = {4F0C8144-C649-441A-86C4-9671844E5FC0} + {B775612C-BAF8-4947-B83B-DD43F802E999} = {4F0C8144-C649-441A-86C4-9671844E5FC0} + {5672A520-0A60-424F-B9DB-29A80A96F24F} = {4F0C8144-C649-441A-86C4-9671844E5FC0} + {235663D0-24CC-442E-AEDF-0C0DD7227166} = {4F0C8144-C649-441A-86C4-9671844E5FC0} + {8FBD2D87-142D-4B86-92F8-ED62844E255E} = {4749F1D1-273C-4EC9-8D77-13642C7907DA} EndGlobalSection EndGlobal diff --git a/src/Cassette/Properties/AssemblyInfo.cs b/src/Cassette/Properties/AssemblyInfo.cs index 5db03d1d..b0b2e729 100644 --- a/src/Cassette/Properties/AssemblyInfo.cs +++ b/src/Cassette/Properties/AssemblyInfo.cs @@ -32,6 +32,7 @@ [assembly: InternalsVisibleTo("Cassette.CoffeeScript.UnitTests")] [assembly: InternalsVisibleTo("Cassette.Less.UnitTests")] [assembly: InternalsVisibleTo("Cassette.Sass.UnitTests")] +[assembly: InternalsVisibleTo("Cassette.Handlebars.UnitTests")] [assembly: InternalsVisibleTo("Cassette.Hogan.UnitTests")] [assembly: InternalsVisibleTo("Cassette.Spriting.UnitTests")] [assembly: InternalsVisibleTo("Cassette.IntegrationTests")] diff --git a/src/packages/repositories.config b/src/packages/repositories.config index 4d1f326b..633b2ec9 100644 --- a/src/packages/repositories.config +++ b/src/packages/repositories.config @@ -4,6 +4,8 @@ + +