!function(a,b){"function"==typeof define&&define.amd?define("uri-templates",[],b):"undefined"!=typeof module&&module.exports?module.exports=b():a.UriTemplate=b()}(this,function(){function a(a){return encodeURI(a).replace(/%25[0-9][0-9]/g,function(a){return"%"+a.substring(3)})}function b(a){return a=a.replace(/%../g,""),encodeURIComponent(a)===a}function c(c){var d="";e[c.charAt(0)]&&(d=c.charAt(0),c=c.substring(1));var g="",h="",i=!0,j=!1,k=!1;"+"==d?i=!1:"."==d?(h=".",g="."):"/"==d?(h="/",g="/"):"#"==d?(h="#",i=!1):";"==d?(h=";",g=";",j=!0,k=!0):"?"==d?(h="?",g="&",j=!0):"&"==d&&(h="&",g="&",j=!0);for(var l=[],m=c.split(","),n=[],o={},p=0;p0&&(c+=f.suffices["*"]?g||",":",",f.suffices["*"]&&j&&(c+=f.name+"=")),c+=i?encodeURIComponent(l[m]).replace(/!/g,"%21"):a(l[m])}else if("object"==typeof l){j&&!f.suffices["*"]&&(c+=f.name+"=");var o=!0;for(var p in l)o||(c+=f.suffices["*"]?g||",":","),o=!1,c+=i?encodeURIComponent(p).replace(/!/g,"%21"):a(p),c+=f.suffices["*"]?"=":",",c+=i?encodeURIComponent(l[p]).replace(/!/g,"%21"):a(l[p])}else j&&(c+=f.name,k&&""==l||(c+="=")),null!=f.truncate&&(l=l.substring(0,f.truncate)),c+=i?encodeURIComponent(l).replace(/!/g,"%21"):a(l)}return c},w=function(a,c,d){if(h&&(a=a.substring(h.length)),1==n.length&&n[0].suffices["*"]){for(var e=n[0],f=e.name,k=e.suffices["*"]?a.split(g||","):[a],l=i&&-1!=a.indexOf("="),m=1;mw&&!n[w].suffices["*"];w++);if(w!=m){for(var x=n.length-1;x>0&&n.length-x0;){var j=b.shift(),k=j.split("}")[0],l=j.substring(k.length+1),m=c(k);g.push(m.substitution),h.push(m.unSubstitution),f.push(m.prefix),e.push(l),i=i.concat(m.varNames)}this.fill=function(a){if(a&&"function"!=typeof a){var b=a;a=function(a){return b[a]}}for(var c=e[0],d=0;d=e.length-1){if(""==a)break;return}var i=f[d];if(!i||a.substring(0,i.length)===i){for(var j=e[d+1],k=d;;){if(k==e.length-2){var l=a.substring(a.length-j.length);if(l!==j)return;var m=a.substring(0,a.length-j.length);a=l}else if(j){var n=a.indexOf(j),m=a.substring(0,n);a=a.substring(n)}else if(f[k+1]){var n=a.indexOf(f[k+1]);-1===n&&(n=a.length);var m=a.substring(0,n);a=a.substring(n)}else{if(e.length>k+2){k++,j=e[k+1];continue}var m=a;a=""}break}if(!h[d](m,c,b.strict))return}}return c},this.varNames=i,this.template=a}var e={"+":!0,"#":!0,".":!0,"/":!0,";":!0,"?":!0,"&":!0},f={"*":!0};return d.prototype={toString:function(){return this.template},fillFromObject:function(a){return this.fill(a)},test:function(a,b){return!!this.fromUri(a,b)}},d});