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 @@
+
+