text: (function () {
  
      var laroute = (function () {
  
          var routes = {
  
              absolute: $ABSOLUTE$,
              rootUrl: '$ROOTURL$',
              routes: $ROUTES$,
              prefix: '$PREFIX$',
  
              route: function (name, parameters, route) {
                  route = route || this.getByName(name);
  
                  if (! route) {
                      return undefined;
                  }
  
                  return this.toRoute(route, parameters);
              },
  
              url: function (url, parameters) {
                  parameters = parameters || [];
  
                  var uri = url + '/' + parameters.join('/');
  
                  return this.getCorrectUrl(uri);
              },
  
              toRoute: function (route, parameters) {
                  var uri = this.replaceNamedParameters(route.uri, parameters);
                  var qs = this.getRouteQueryString(parameters);
  
                  // Bind route domain parameters. Ex: {frontarea}, {adminarea} ..etc
                  if (this.absolute && this.isOtherHost(route)) {
                      return '//' + this.replaceNamedParameters(route.host, {
                          'frontarea': window.location.hostname,
                          'adminarea': window.location.hostname,
                          'tenantarea': window.location.hostname,
                          'managerarea': window.location.hostname
                      }) + '/' + uri + (qs ? '/' + qs : '');
                  }
  
                  return this.getCorrectUrl(uri + (qs ? '/' + qs : ''));
              },
  
              isOtherHost: function (route) {
                  return route.host && route.host != window.location.hostname;
              },
  
              replaceNamedParameters: function (uri, parameters) {
                  uri = uri.replace(/\{(.*?)\??\}/g, function (match, key) {
                      if (parameters.hasOwnProperty(key)) {
                          var value = parameters[key];
                          delete parameters[key];
                          return value;
                      } else {
                          return match;
                      }
                  });
  
                  // Strip out any optional parameters that were not given
                  uri = uri.replace(/\/\{.*?\?\}/g, '');
  
                  return uri;
              },
  
              getRouteQueryString: function (parameters) {
                  var qs = [];
                  for (var key in parameters) {
                      if (parameters.hasOwnProperty(key)) {
                          qs.push(key + '=' + parameters[key]);
                      }
                  }
  
                  if (qs.length < 1) {
                      return '';
                  }
  
                  return '?' + qs.join('&');
              },
  
              getByName: function (name) {
                  for (var key in this.routes) {
                      if (this.routes.hasOwnProperty(key) && this.routes[key].name === name) {
                          return this.routes[key];
                      }
                  }
              },
  
              getByAction: function (action) {
                  for (var key in this.routes) {
                      if (this.routes.hasOwnProperty(key) && this.routes[key].action === action) {
                          return this.routes[key];
                      }
                  }
              },
  
              getCorrectUrl: function (uri) {
                  var url = this.prefix + '/' + uri.replace(/^\/?/, '');
  
                  if (! this.absolute) {
                      return url;
                  }
  
                  return this.rootUrl.replace('/\/?$/', '') + url;
              }
          };
  
          var getLinkAttributes = function (attributes) {
              if (! attributes) {
                  return '';
              }
  
              var attrs = [];
              for (var key in attributes) {
                  if (attributes.hasOwnProperty(key)) {
                      attrs.push(key + '="' + attributes[key] + '"');
                  }
              }
  
              return attrs.join(' ');
          };
  
          var getHtmlLink = function (url, title, attributes) {
              title = title || url;
              attributes = getLinkAttributes(attributes);
  
              return '<a href="' + url + '" ' + attributes + '>' + title + '</a>';
          };
  
          return {
              // Generate a url for a given controller action.
              // $NAMESPACE$.action('HomeController@getIndex', [params = {}])
              action: function (name, parameters) {
                  parameters = parameters || {};
  
                  return routes.route(name, parameters, routes.getByAction(name));
              },
  
              // Generate a url for a given named route.
              // $NAMESPACE$.route('routeName', [params = {}])
              route: function (route, parameters) {
                  parameters = parameters || {};
  
                  return routes.route(route, parameters);
              },
  
              // Generate a fully qualified URL to the given path.
              // $NAMESPACE$.route('url', [params = {}])
              url: function (route, parameters) {
                  parameters = parameters || {};
  
                  return routes.url(route, parameters);
              },
  
              // Generate a html link to the given url.
              // $NAMESPACE$.link_to('foo/bar', [title = url], [attributes = {}])
              link_to: function (url, title, attributes) {
                  url = this.url(url);
  
                  return getHtmlLink(url, title, attributes);
              },
  
              // Generate a html link to the given route.
              // $NAMESPACE$.link_to_route('route.name', [title=url], [parameters = {}], [attributes = {}])
              link_to_route: function (route, title, parameters, attributes) {
                  var url = this.route(route, parameters);
  
                  return getHtmlLink(url, title, attributes);
              },
  
              // Generate a html link to the given controller action.
              // $NAMESPACE$.link_to_action('HomeController@getIndex', [title=url], [parameters = {}], [attributes = {}])
              link_to_action: function (action, title, parameters, attributes) {
                  var url = this.action(action, parameters);
  
                  return getHtmlLink(url, title, attributes);
              }
  
          };
  
      }).call(this);
  
      /**
       * Expose the class either via AMD, CommonJS or the global object
       */
      if (typeof define === 'function' && define.amd) {
          define(function () {
              return laroute;
          });
      } else if (typeof module === 'object' && module.exports) {
          module.exports = laroute;
      } else {
          window.$NAMESPACE$ = laroute;
      }
  
  }).call(this);
  