http://git-wip-us.apache.org/repos/asf/tomee-site-generator/blob/972cc356/src/main/jbake/assets/js/typeahead.bundle.min.js
----------------------------------------------------------------------
diff --git a/src/main/jbake/assets/js/typeahead.bundle.min.js 
b/src/main/jbake/assets/js/typeahead.bundle.min.js
new file mode 100755
index 0000000..ffd98f3
--- /dev/null
+++ b/src/main/jbake/assets/js/typeahead.bundle.min.js
@@ -0,0 +1,8 @@
+/*!
+ * typeahead.js 0.11.1
+ * https://github.com/twitter/typeahead.js
+ * Copyright 2013-2015 Twitter, Inc. and other contributors; Licensed MIT
+ */
+
+!function(a,b){"function"==typeof 
define&&define.amd?define("bloodhound",["jquery"],function(c){return 
a.Bloodhound=b(c)}):"object"==typeof 
exports?module.exports=b(require("jquery")):a.Bloodhound=b(jQuery)}(this,function(a){var
 b=function(){"use 
strict";return{isMsie:function(){return/(msie|trident)/i.test(navigator.userAgent)?navigator.userAgent.match(/(msie
 
|rv:)(\d+(.\d+)?)/i)[2]:!1},isBlankString:function(a){return!a||/^\s*$/.test(a)},escapeRegExChars:function(a){return
 
a.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")},isString:function(a){return"string"==typeof
 a},isNumber:function(a){return"number"==typeof 
a},isArray:a.isArray,isFunction:a.isFunction,isObject:a.isPlainObject,isUndefined:function(a){return"undefined"==typeof
 
a},isElement:function(a){return!(!a||1!==a.nodeType)},isJQuery:function(b){return
 b instanceof a},toStr:function(a){return 
b.isUndefined(a)||null===a?"":a+""},bind:a.proxy,each:function(b,c){function 
d(a,b){return c(b,a)}a.each(b,d)},map:a.map,filte
 r:a.grep,every:function(b,c){var d=!0;return 
b?(a.each(b,function(a,e){return(d=c.call(null,e,a,b))?void 
0:!1}),!!d):d},some:function(b,c){var d=!1;return 
b?(a.each(b,function(a,e){return(d=c.call(null,e,a,b))?!1:void 
0}),!!d):d},mixin:a.extend,identity:function(a){return 
a},clone:function(b){return a.extend(!0,{},b)},getIdGenerator:function(){var 
a=0;return function(){return a++}},templatify:function(b){function c(){return 
String(b)}return 
a.isFunction(b)?b:c},defer:function(a){setTimeout(a,0)},debounce:function(a,b,c){var
 d,e;return function(){var f,g,h=this,i=arguments;return 
f=function(){d=null,c||(e=a.apply(h,i))},g=c&&!d,clearTimeout(d),d=setTimeout(f,b),g&&(e=a.apply(h,i)),e}},throttle:function(a,b){var
 c,d,e,f,g,h;return g=0,h=function(){g=new 
Date,e=null,f=a.apply(c,d)},function(){var i=new Date,j=b-(i-g);return 
c=this,d=arguments,0>=j?(clearTimeout(e),e=null,g=i,f=a.apply(c,d)):e||(e=setTimeout(h,j)),f}},stringify:function(a){return
 b.isString(a)?a:JSON.stringify(a)},noop:
 function(){}}}(),c="0.11.1",d=function(){"use strict";function a(a){return 
a=b.toStr(a),a?a.split(/\s+/):[]}function c(a){return 
a=b.toStr(a),a?a.split(/\W+/):[]}function d(a){return function(c){return 
c=b.isArray(c)?c:[].slice.call(arguments,0),function(d){var e=[];return 
b.each(c,function(c){e=e.concat(a(b.toStr(d[c])))}),e}}}return{nonword:c,whitespace:a,obj:{nonword:d(c),whitespace:d(a)}}}(),e=function(){"use
 strict";function 
c(c){this.maxSize=b.isNumber(c)?c:100,this.reset(),this.maxSize<=0&&(this.set=this.get=a.noop)}function
 d(){this.head=this.tail=null}function 
e(a,b){this.key=a,this.val=b,this.prev=this.next=null}return 
b.mixin(c.prototype,{set:function(a,b){var 
c,d=this.list.tail;this.size>=this.maxSize&&(this.list.remove(d),delete 
this.hash[d.key],this.size--),(c=this.hash[a])?(c.val=b,this.list.moveToFront(c)):(c=new
 e(a,b),this.list.add(c),this.hash[a]=c,this.size++)},get:function(a){var 
b=this.hash[a];return b?(this.list.moveToFront(b),b.val):void 
0},reset:function(){t
 his.size=0,this.hash={},this.list=new 
d}}),b.mixin(d.prototype,{add:function(a){this.head&&(a.next=this.head,this.head.prev=a),this.head=a,this.tail=this.tail||a},remove:function(a){a.prev?a.prev.next=a.next:this.head=a.next,a.next?a.next.prev=a.prev:this.tail=a.prev},moveToFront:function(a){this.remove(a),this.add(a)}}),c}(),f=function(){"use
 strict";function 
c(a,c){this.prefix=["__",a,"__"].join(""),this.ttlKey="__ttl__",this.keyMatcher=new
 
RegExp("^"+b.escapeRegExChars(this.prefix)),this.ls=c||h,!this.ls&&this._noop()}function
 d(){return(new Date).getTime()}function e(a){return 
JSON.stringify(b.isUndefined(a)?null:a)}function f(b){return 
a.parseJSON(b)}function g(a){var 
b,c,d=[],e=h.length;for(b=0;e>b;b++)(c=h.key(b)).match(a)&&d.push(c.replace(a,""));return
 d}var 
h;try{h=window.localStorage,h.setItem("~~~","!"),h.removeItem("~~~")}catch(i){h=null}return
 b.mixin(c.prototype,{_prefix:function(a){return 
this.prefix+a},_ttlKey:function(a){return this._prefix(a)+this.ttlKey},_noop:fu
 
nction(){this.get=this.set=this.remove=this.clear=this.isExpired=b.noop},_safeSet:function(a,b){try{this.ls.setItem(a,b)}catch(c){"QuotaExceededError"===c.name&&(this.clear(),this._noop())}},get:function(a){return
 
this.isExpired(a)&&this.remove(a),f(this.ls.getItem(this._prefix(a)))},set:function(a,c,f){return
 
b.isNumber(f)?this._safeSet(this._ttlKey(a),e(d()+f)):this.ls.removeItem(this._ttlKey(a)),this._safeSet(this._prefix(a),e(c))},remove:function(a){return
 
this.ls.removeItem(this._ttlKey(a)),this.ls.removeItem(this._prefix(a)),this},clear:function(){var
 a,b=g(this.keyMatcher);for(a=b.length;a--;)this.remove(b[a]);return 
this},isExpired:function(a){var c=f(this.ls.getItem(this._ttlKey(a)));return 
b.isNumber(c)&&d()>c?!0:!1}}),c}(),g=function(){"use strict";function 
c(a){a=a||{},this.cancelled=!1,this.lastReq=null,this._send=a.transport,this._get=a.limiter?a.limiter(this._get):this._get,this._cache=a.cache===!1?new
 e(0):h}var d=0,f={},g=6,h=new e(10);return c.setMaxPendingRequests
 
=function(a){g=a},c.resetCache=function(){h.reset()},b.mixin(c.prototype,{_fingerprint:function(b){return
 b=b||{},b.url+b.type+a.param(b.data||{})},_get:function(a,b){function 
c(a){b(null,a),k._cache.set(i,a)}function e(){b(!0)}function h(){d--,delete 
f[i],k.onDeckRequestArgs&&(k._get.apply(k,k.onDeckRequestArgs),k.onDeckRequestArgs=null)}var
 
i,j,k=this;i=this._fingerprint(a),this.cancelled||i!==this.lastReq||((j=f[i])?j.done(c).fail(e):g>d?(d++,f[i]=this._send(a).done(c).fail(e).always(h)):this.onDeckRequestArgs=[].slice.call(arguments,0))},get:function(c,d){var
 
e,f;d=d||a.noop,c=b.isString(c)?{url:c}:c||{},f=this._fingerprint(c),this.cancelled=!1,this.lastReq=f,(e=this._cache.get(f))?d(null,e):this._get(c,d)},cancel:function(){this.cancelled=!0}}),c}(),h=window.SearchIndex=function(){"use
 strict";function 
c(c){c=c||{},c.datumTokenizer&&c.queryTokenizer||a.error("datumTokenizer and 
queryTokenizer are both 
required"),this.identify=c.identify||b.stringify,this.datumTokenizer=c.datumT
 okenizer,this.queryTokenizer=c.queryTokenizer,this.reset()}function 
d(a){return a=b.filter(a,function(a){return!!a}),a=b.map(a,function(a){return 
a.toLowerCase()})}function e(){var a={};return a[i]=[],a[h]={},a}function 
f(a){for(var 
b={},c=[],d=0,e=a.length;e>d;d++)b[a[d]]||(b[a[d]]=!0,c.push(a[d]));return 
c}function g(a,b){var c=0,d=0,e=[];a=a.sort(),b=b.sort();for(var 
f=a.length,g=b.length;f>c&&g>d;)a[c]<b[d]?c++:a[c]>b[d]?d++:(e.push(a[c]),c++,d++);return
 e}var h="c",i="i";return 
b.mixin(c.prototype,{bootstrap:function(a){this.datums=a.datums,this.trie=a.trie},add:function(a){var
 c=this;a=b.isArray(a)?a:[a],b.each(a,function(a){var 
f,g;c.datums[f=c.identify(a)]=a,g=d(c.datumTokenizer(a)),b.each(g,function(a){var
 
b,d,g;for(b=c.trie,d=a.split("");g=d.shift();)b=b[h][g]||(b[h][g]=e()),b[i].push(f)})})},get:function(a){var
 c=this;return b.map(a,function(a){return c.datums[a]})},search:function(a){var 
c,e,j=this;return c=d(this.queryTokenizer(a)),b.each(c,function(a){var 
b,c,d,f;if(e&
 
&0===e.length)return!1;for(b=j.trie,c=a.split("");b&&(d=c.shift());)b=b[h][d];return
 
b&&0===c.length?(f=b[i].slice(0),void(e=e?g(e,f):f)):(e=[],!1)}),e?b.map(f(e),function(a){return
 j.datums[a]}):[]},all:function(){var a=[];for(var b in 
this.datums)a.push(this.datums[b]);return 
a},reset:function(){this.datums={},this.trie=e()},serialize:function(){return{datums:this.datums,trie:this.trie}}}),c}(),i=function(){"use
 strict";function 
a(a){this.url=a.url,this.ttl=a.ttl,this.cache=a.cache,this.prepare=a.prepare,this.transform=a.transform,this.transport=a.transport,this.thumbprint=a.thumbprint,this.storage=new
 f(a.cacheKey)}var c;return 
c={data:"data",protocol:"protocol",thumbprint:"thumbprint"},b.mixin(a.prototype,{_settings:function(){return{url:this.url,type:"GET",dataType:"json"}},store:function(a){this.cache&&(this.storage.set(c.data,a,this.ttl),this.storage.set(c.protocol,location.protocol,this.ttl),this.storage.set(c.thumbprint,this.thumbprint,this.ttl))},fromCache:function(){var
 a
 ,b={};return 
this.cache?(b.data=this.storage.get(c.data),b.protocol=this.storage.get(c.protocol),b.thumbprint=this.storage.get(c.thumbprint),a=b.thumbprint!==this.thumbprint||b.protocol!==location.protocol,b.data&&!a?b.data:null):null},fromNetwork:function(a){function
 b(){a(!0)}function c(b){a(null,e.transform(b))}var 
d,e=this;a&&(d=this.prepare(this._settings()),this.transport(d).fail(b).done(c))},clear:function(){return
 this.storage.clear(),this}}),a}(),j=function(){"use strict";function 
a(a){this.url=a.url,this.prepare=a.prepare,this.transform=a.transform,this.transport=new
 g({cache:a.cache,limiter:a.limiter,transport:a.transport})}return 
b.mixin(a.prototype,{_settings:function(){return{url:this.url,type:"GET",dataType:"json"}},get:function(a,b){function
 c(a,c){b(a?[]:e.transform(c))}var d,e=this;if(b)return 
a=a||"",d=this.prepare(a,this._settings()),this.transport.get(d,c)},cancelLastRequest:function(){this.transport.cancel()}}),a}(),k=function(){"use
 strict";function d(d){var e
 ;return 
d?(e={url:null,ttl:864e5,cache:!0,cacheKey:null,thumbprint:"",prepare:b.identity,transform:b.identity,transport:null},d=b.isString(d)?{url:d}:d,d=b.mixin(e,d),!d.url&&a.error("prefetch
 requires url to be 
set"),d.transform=d.filter||d.transform,d.cacheKey=d.cacheKey||d.url,d.thumbprint=c+d.thumbprint,d.transport=d.transport?h(d.transport):a.ajax,d):null}function
 e(c){var d;if(c)return 
d={url:null,cache:!0,prepare:null,replace:null,wildcard:null,limiter:null,rateLimitBy:"debounce",rateLimitWait:300,transform:b.identity,transport:null},c=b.isString(c)?{url:c}:c,c=b.mixin(d,c),!c.url&&a.error("remote
 requires url to be 
set"),c.transform=c.filter||c.transform,c.prepare=f(c),c.limiter=g(c),c.transport=c.transport?h(c.transport):a.ajax,delete
 c.replace,delete c.wildcard,delete c.rateLimitBy,delete 
c.rateLimitWait,c}function f(a){function b(a,b){return 
b.url=f(b.url,a),b}function c(a,b){return 
b.url=b.url.replace(g,encodeURIComponent(a)),b}function d(a,b){return b}var 
e,f,g;return e
 =a.prepare,f=a.replace,g=a.wildcard,e?e:e=f?b:a.wildcard?c:d}function 
g(a){function c(a){return function(c){return b.debounce(c,a)}}function 
d(a){return function(c){return b.throttle(c,a)}}var e,f,g;return 
e=a.limiter,f=a.rateLimitBy,g=a.rateLimitWait,e||(e=/^throttle$/i.test(f)?d(g):c(g)),e}function
 h(c){return function(d){function 
e(a){b.defer(function(){g.resolve(a)})}function 
f(a){b.defer(function(){g.reject(a)})}var g=a.Deferred();return 
c(d,e,f),g}}return function(c){var f,g;return 
f={initialize:!0,identify:b.stringify,datumTokenizer:null,queryTokenizer:null,sufficient:5,sorter:null,local:[],prefetch:null,remote:null},c=b.mixin(f,c||{}),!c.datumTokenizer&&a.error("datumTokenizer
 is required"),!c.queryTokenizer&&a.error("queryTokenizer is 
required"),g=c.sorter,c.sorter=g?function(a){return 
a.sort(g)}:b.identity,c.local=b.isFunction(c.local)?c.local():c.local,c.prefetch=d(c.prefetch),c.remote=e(c.remote),c}}(),l=function(){"use
 strict";function c(a){a=k(a),this.sorter=a.sorter,t
 
his.identify=a.identify,this.sufficient=a.sufficient,this.local=a.local,this.remote=a.remote?new
 j(a.remote):null,this.prefetch=a.prefetch?new 
i(a.prefetch):null,this.index=new 
h({identify:this.identify,datumTokenizer:a.datumTokenizer,queryTokenizer:a.queryTokenizer}),a.initialize!==!1&&this.initialize()}var
 e;return e=window&&window.Bloodhound,c.noConflict=function(){return 
window&&(window.Bloodhound=e),c},c.tokenizers=d,b.mixin(c.prototype,{__ttAdapter:function(){function
 a(a,b,d){return c.search(a,b,d)}function b(a,b){return c.search(a,b)}var 
c=this;return this.remote?a:b},_loadPrefetch:function(){function b(a,b){return 
a?c.reject():(e.add(b),e.prefetch.store(e.index.serialize()),void 
c.resolve())}var c,d,e=this;return 
c=a.Deferred(),this.prefetch?(d=this.prefetch.fromCache())?(this.index.bootstrap(d),c.resolve()):this.prefetch.fromNetwork(b):c.resolve(),c.promise()},_initialize:function(){function
 a(){b.add(b.local)}var b=this;return 
this.clear(),(this.initPromise=this._loadPref
 
etch()).done(a),this.initPromise},initialize:function(a){return!this.initPromise||a?this._initialize():this.initPromise},add:function(a){return
 this.index.add(a),this},get:function(a){return 
a=b.isArray(a)?a:[].slice.call(arguments),this.index.get(a)},search:function(a,c,d){function
 e(a){var c=[];b.each(a,function(a){!b.some(f,function(b){return 
g.identify(a)===g.identify(b)})&&c.push(a)}),d&&d(c)}var f,g=this;return 
f=this.sorter(this.index.search(a)),c(this.remote?f.slice():f),this.remote&&f.length<this.sufficient?this.remote.get(a,e):this.remote&&this.remote.cancelLastRequest(),this},all:function(){return
 this.index.all()},clear:function(){return 
this.index.reset(),this},clearPrefetchCache:function(){return 
this.prefetch&&this.prefetch.clear(),this},clearRemoteCache:function(){return 
g.resetCache(),this},ttAdapter:function(){return 
this.__ttAdapter()}}),c}();return l}),function(a,b){"function"==typeof 
define&&define.amd?define("typeahead.js",["jquery"],function(a){return b(a)}):"
 object"==typeof 
exports?module.exports=b(require("jquery")):b(jQuery)}(this,function(a){var 
b=function(){"use 
strict";return{isMsie:function(){return/(msie|trident)/i.test(navigator.userAgent)?navigator.userAgent.match(/(msie
 
|rv:)(\d+(.\d+)?)/i)[2]:!1},isBlankString:function(a){return!a||/^\s*$/.test(a)},escapeRegExChars:function(a){return
 
a.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")},isString:function(a){return"string"==typeof
 a},isNumber:function(a){return"number"==typeof 
a},isArray:a.isArray,isFunction:a.isFunction,isObject:a.isPlainObject,isUndefined:function(a){return"undefined"==typeof
 
a},isElement:function(a){return!(!a||1!==a.nodeType)},isJQuery:function(b){return
 b instanceof a},toStr:function(a){return 
b.isUndefined(a)||null===a?"":a+""},bind:a.proxy,each:function(b,c){function 
d(a,b){return 
c(b,a)}a.each(b,d)},map:a.map,filter:a.grep,every:function(b,c){var d=!0;return 
b?(a.each(b,function(a,e){return(d=c.call(null,e,a,b))?void 
0:!1}),!!d):d},some:function(b,c
 ){var d=!1;return 
b?(a.each(b,function(a,e){return(d=c.call(null,e,a,b))?!1:void 
0}),!!d):d},mixin:a.extend,identity:function(a){return 
a},clone:function(b){return a.extend(!0,{},b)},getIdGenerator:function(){var 
a=0;return function(){return a++}},templatify:function(b){function c(){return 
String(b)}return 
a.isFunction(b)?b:c},defer:function(a){setTimeout(a,0)},debounce:function(a,b,c){var
 d,e;return function(){var f,g,h=this,i=arguments;return 
f=function(){d=null,c||(e=a.apply(h,i))},g=c&&!d,clearTimeout(d),d=setTimeout(f,b),g&&(e=a.apply(h,i)),e}},throttle:function(a,b){var
 c,d,e,f,g,h;return g=0,h=function(){g=new 
Date,e=null,f=a.apply(c,d)},function(){var i=new Date,j=b-(i-g);return 
c=this,d=arguments,0>=j?(clearTimeout(e),e=null,g=i,f=a.apply(c,d)):e||(e=setTimeout(h,j)),f}},stringify:function(a){return
 b.isString(a)?a:JSON.stringify(a)},noop:function(){}}}(),c=function(){"use 
strict";function a(a){var g,h;return 
h=b.mixin({},f,a),g={css:e(),classes:h,html:c(h),selectors:d(h)},
 
{css:g.css,html:g.html,classes:g.classes,selectors:g.selectors,mixin:function(a){b.mixin(a,g)}}}function
 c(a){return{wrapper:'<span class="'+a.wrapper+'"></span>',menu:'<div 
class="'+a.menu+'"></div>'}}function d(a){var c={};return 
b.each(a,function(a,b){c[b]="."+a}),c}function e(){var 
a={wrapper:{position:"relative",display:"inline-block"},hint:{position:"absolute",top:"0",left:"0",borderColor:"transparent",boxShadow:"none",opacity:"1"},input:{position:"relative",verticalAlign:"top",backgroundColor:"transparent"},inputWithNoHint:{position:"relative",verticalAlign:"top"},menu:{position:"absolute",top:"100%",left:"0",zIndex:"100",display:"none"},ltr:{left:"0",right:"auto"},rtl:{left:"auto",right:"
 0"}};return 
b.isMsie()&&b.mixin(a.input,{backgroundImage:"url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)"}),a}var
 
f={wrapper:"twitter-typeahead",input:"tt-input",hint:"tt-hint",menu:"tt-menu",dataset:"tt-dataset",suggestion:"tt-suggestion",selectable:"tt
 
-selectable",empty:"tt-empty",open:"tt-open",cursor:"tt-cursor",highlight:"tt-highlight"};return
 a}(),d=function(){"use strict";function c(b){b&&b.el||a.error("EventBus 
initialized without el"),this.$el=a(b.el)}var d,e;return 
d="typeahead:",e={render:"rendered",cursorchange:"cursorchanged",select:"selected",autocomplete:"autocompleted"},b.mixin(c.prototype,{_trigger:function(b,c){var
 e;return 
e=a.Event(d+b),(c=c||[]).unshift(e),this.$el.trigger.apply(this.$el,c),e},before:function(a){var
 b,c;return 
b=[].slice.call(arguments,1),c=this._trigger("before"+a,b),c.isDefaultPrevented()},trigger:function(a){var
 
b;this._trigger(a,[].slice.call(arguments,1)),(b=e[a])&&this._trigger(b,[].slice.call(arguments,1))}}),c}(),e=function(){"use
 strict";function a(a,b,c,d){var e;if(!c)return 
this;for(b=b.split(i),c=d?h(c,d):c,this._callbacks=this._callbacks||{};e=b.shift();)this._callbacks[e]=this._callbacks[e]||{sync:[],async:[]},this._callbacks[e][a].push(c);return
 this}function b(b,c,d){return a.ca
 ll(this,"async",b,c,d)}function c(b,c,d){return 
a.call(this,"sync",b,c,d)}function d(a){var b;if(!this._callbacks)return 
this;for(a=a.split(i);b=a.shift();)delete this._callbacks[b];return 
this}function e(a){var b,c,d,e,g;if(!this._callbacks)return 
this;for(a=a.split(i),d=[].slice.call(arguments,1);(b=a.shift())&&(c=this._callbacks[b]);)e=f(c.sync,this,[b].concat(d)),g=f(c.async,this,[b].concat(d)),e()&&j(g);return
 this}function f(a,b,c){function d(){for(var 
d,e=0,f=a.length;!d&&f>e;e+=1)d=a[e].apply(b,c)===!1;return!d}return d}function 
g(){var a;return 
a=window.setImmediate?function(a){setImmediate(function(){a()})}:function(a){setTimeout(function(){a()},0)}}function
 h(a,b){return 
a.bind?a.bind(b):function(){a.apply(b,[].slice.call(arguments,0))}}var 
i=/\s+/,j=g();return{onSync:c,onAsync:b,off:d,trigger:e}}(),f=function(a){"use 
strict";function c(a,c,d){for(var 
e,f=[],g=0,h=a.length;h>g;g++)f.push(b.escapeRegExChars(a[g]));return 
e=d?"\\b("+f.join("|")+")\\b":"("+f.join("|")+")",c?
 new RegExp(e):new RegExp(e,"i")}var 
d={node:null,pattern:null,tagName:"strong",className:null,wordsOnly:!1,caseSensitive:!1};return
 function(e){function f(b){var 
c,d,f;return(c=h.exec(b.data))&&(f=a.createElement(e.tagName),e.className&&(f.className=e.className),d=b.splitText(c.index),d.splitText(c[0].length),f.appendChild(d.cloneNode(!0)),b.parentNode.replaceChild(f,d)),!!c}function
 g(a,b){for(var 
c,d=3,e=0;e<a.childNodes.length;e++)c=a.childNodes[e],c.nodeType===d?e+=b(c)?1:0:g(c,b)}var
 
h;e=b.mixin({},d,e),e.node&&e.pattern&&(e.pattern=b.isArray(e.pattern)?e.pattern:[e.pattern],h=c(e.pattern,e.caseSensitive,e.wordsOnly),g(e.node,f))}}(window.document),g=function(){"use
 strict";function c(c,e){c=c||{},c.input||a.error("input is 
missing"),e.mixin(this),this.$hint=a(c.hint),this.$input=a(c.input),this.query=this.$input.val(),this.queryWhenFocused=this.hasFocus()?this.query:null,this.$overflowHelper=d(this.$input),this._checkLanguageDirection(),0===this.$hint.length&&(this.setHint=thi
 s.getHint=this.clearHint=this.clearHintIfInvalid=b.noop)}function d(b){return 
a('<pre 
aria-hidden="true"></pre>').css({position:"absolute",visibility:"hidden",whiteSpace:"pre",fontFamily:b.css("font-family"),fontSize:b.css("font-size"),fontStyle:b.css("font-style"),fontVariant:b.css("font-variant"),fontWeight:b.css("font-weight"),wordSpacing:b.css("word-spacing"),letterSpacing:b.css("letter-spacing"),textIndent:b.css("text-indent"),textRendering:b.css("text-rendering"),textTransform:b.css("text-transform")}).insertAfter(b)}function
 f(a,b){return c.normalizeQuery(a)===c.normalizeQuery(b)}function g(a){return 
a.altKey||a.ctrlKey||a.metaKey||a.shiftKey}var h;return 
h={9:"tab",27:"esc",37:"left",39:"right",13:"enter",38:"up",40:"down"},c.normalizeQuery=function(a){return
 b.toStr(a).replace(/^\s*/g,"").replace(/\s{2,}/g," 
")},b.mixin(c.prototype,e,{_onBlur:function(){this.resetInputValue(),this.trigger("blurred")},_onFocus:function(){this.queryWhenFocused=this.query,this.trigger("focused
 ")},_onKeydown:function(a){var 
b=h[a.which||a.keyCode];this._managePreventDefault(b,a),b&&this._shouldTrigger(b,a)&&this.trigger(b+"Keyed",a)},_onInput:function(){this._setQuery(this.getInputValue()),this.clearHintIfInvalid(),this._checkLanguageDirection()},_managePreventDefault:function(a,b){var
 
c;switch(a){case"up":case"down":c=!g(b);break;default:c=!1}c&&b.preventDefault()},_shouldTrigger:function(a,b){var
 c;switch(a){case"tab":c=!g(b);break;default:c=!0}return 
c},_checkLanguageDirection:function(){var 
a=(this.$input.css("direction")||"ltr").toLowerCase();this.dir!==a&&(this.dir=a,this.$hint.attr("dir",a),this.trigger("langDirChanged",a))},_setQuery:function(a,b){var
 
c,d;c=f(a,this.query),d=c?this.query.length!==a.length:!1,this.query=a,b||c?!b&&d&&this.trigger("whitespaceChanged",this.query):this.trigger("queryChanged",this.query)},bind:function(){var
 a,c,d,e,f=this;return 
a=b.bind(this._onBlur,this),c=b.bind(this._onFocus,this),d=b.bind(this._onKeydown,this),e=b.bind(this._onIn
 
put,this),this.$input.on("blur.tt",a).on("focus.tt",c).on("keydown.tt",d),!b.isMsie()||b.isMsie()>9?this.$input.on("input.tt",e):this.$input.on("keydown.tt
 keypress.tt cut.tt 
paste.tt",function(a){h[a.which||a.keyCode]||b.defer(b.bind(f._onInput,f,a))}),this},focus:function(){this.$input.focus()},blur:function(){this.$input.blur()},getLangDir:function(){return
 this.dir},getQuery:function(){return 
this.query||""},setQuery:function(a,b){this.setInputValue(a),this._setQuery(a,b)},hasQueryChangedSinceLastFocus:function(){return
 this.query!==this.queryWhenFocused},getInputValue:function(){return 
this.$input.val()},setInputValue:function(a){this.$input.val(a),this.clearHintIfInvalid(),this._checkLanguageDirection()},resetInputValue:function(){this.setInputValue(this.query)},getHint:function(){return
 
this.$hint.val()},setHint:function(a){this.$hint.val(a)},clearHint:function(){this.setHint("")},clearHintIfInvalid:function(){var
 a,b,c,d;a=this.getInputValue(),b=this.getHint(),c=a!==b&&0===b
 
.indexOf(a),d=""!==a&&c&&!this.hasOverflow(),!d&&this.clearHint()},hasFocus:function(){return
 this.$input.is(":focus")},hasOverflow:function(){var 
a=this.$input.width()-2;return 
this.$overflowHelper.text(this.getInputValue()),this.$overflowHelper.width()>=a},isCursorAtEnd:function(){var
 a,c,d;return 
a=this.$input.val().length,c=this.$input[0].selectionStart,b.isNumber(c)?c===a:document.selection?(d=document.selection.createRange(),d.moveStart("character",-a),a===d.text.length):!0},destroy:function(){this.$hint.off(".tt"),this.$input.off(".tt"),this.$overflowHelper.remove(),this.$hint=this.$input=this.$overflowHelper=a("<div>")}}),c}(),h=function(){"use
 strict";function 
c(c,e){c=c||{},c.templates=c.templates||{},c.templates.notFound=c.templates.notFound||c.templates.empty,c.source||a.error("missing
 source"),c.node||a.error("missing node"),c.name&&!h(c.name)&&a.error("invalid 
dataset name: 
"+c.name),e.mixin(this),this.highlight=!!c.highlight,this.name=c.name||j(),this.limit=c.limit||5
 
,this.displayFn=d(c.display||c.displayKey),this.templates=g(c.templates,this.displayFn),this.source=c.source.__ttAdapter?c.source.__ttAdapter():c.source,this.async=b.isUndefined(c.async)?this.source.length>2:!!c.async,this._resetLastSuggestion(),this.$el=a(c.node).addClass(this.classes.dataset).addClass(this.classes.dataset+"-"+this.name)}function
 d(a){function c(b){return b[a]}return 
a=a||b.stringify,b.isFunction(a)?a:c}function g(c,d){function e(b){return 
a("<div>").text(d(b))}return{notFound:c.notFound&&b.templatify(c.notFound),pending:c.pending&&b.templatify(c.pending),header:c.header&&b.templatify(c.header),footer:c.footer&&b.templatify(c.footer),suggestion:c.suggestion||e}}function
 h(a){return/^[_a-zA-Z0-9-]+$/.test(a)}var i,j;return 
i={val:"tt-selectable-display",obj:"tt-selectable-object"},j=b.getIdGenerator(),c.extractData=function(b){var
 c=a(b);return 
c.data(i.obj)?{val:c.data(i.val)||"",obj:c.data(i.obj)||null}:null},b.mixin(c.prototype,e,{_overwrite:function(a,b){b=b||[]
 
,b.length?this._renderSuggestions(a,b):this.async&&this.templates.pending?this._renderPending(a):!this.async&&this.templates.notFound?this._renderNotFound(a):this._empty(),this.trigger("rendered",this.name,b,!1)},_append:function(a,b){b=b||[],b.length&&this.$lastSuggestion.length?this._appendSuggestions(a,b):b.length?this._renderSuggestions(a,b):!this.$lastSuggestion.length&&this.templates.notFound&&this._renderNotFound(a),this.trigger("rendered",this.name,b,!0)},_renderSuggestions:function(a,b){var
 
c;c=this._getSuggestionsFragment(a,b),this.$lastSuggestion=c.children().last(),this.$el.html(c).prepend(this._getHeader(a,b)).append(this._getFooter(a,b))},_appendSuggestions:function(a,b){var
 
c,d;c=this._getSuggestionsFragment(a,b),d=c.children().last(),this.$lastSuggestion.after(c),this.$lastSuggestion=d},_renderPending:function(a){var
 
b=this.templates.pending;this._resetLastSuggestion(),b&&this.$el.html(b({query:a,dataset:this.name}))},_renderNotFound:function(a){var
 b=this.templates.
 
notFound;this._resetLastSuggestion(),b&&this.$el.html(b({query:a,dataset:this.name}))},_empty:function(){this.$el.empty(),this._resetLastSuggestion()},_getSuggestionsFragment:function(c,d){var
 e,g=this;return e=document.createDocumentFragment(),b.each(d,function(b){var 
d,f;f=g._injectQuery(c,b),d=a(g.templates.suggestion(f)).data(i.obj,b).data(i.val,g.displayFn(b)).addClass(g.classes.suggestion+"
 
"+g.classes.selectable),e.appendChild(d[0])}),this.highlight&&f({className:this.classes.highlight,node:e,pattern:c}),a(e)},_getFooter:function(a,b){return
 
this.templates.footer?this.templates.footer({query:a,suggestions:b,dataset:this.name}):null},_getHeader:function(a,b){return
 
this.templates.header?this.templates.header({query:a,suggestions:b,dataset:this.name}):null},_resetLastSuggestion:function(){this.$lastSuggestion=a()},_injectQuery:function(a,c){return
 b.isObject(c)?b.mixin({_query:a},c):c},update:function(b){function 
c(a){g||(g=!0,a=(a||[]).slice(0,e.limit),h=a.length,e._overwrite(
 b,a),h<e.limit&&e.async&&e.trigger("asyncRequested",b))}function 
d(c){c=c||[],!f&&h<e.limit&&(e.cancel=a.noop,h+=c.length,e._append(b,c.slice(0,e.limit-h)),e.async&&e.trigger("asyncReceived",b))}var
 
e=this,f=!1,g=!1,h=0;this.cancel(),this.cancel=function(){f=!0,e.cancel=a.noop,e.async&&e.trigger("asyncCanceled",b)},this.source(b,c,d),!g&&c([])},cancel:a.noop,clear:function(){this._empty(),this.cancel(),this.trigger("cleared")},isEmpty:function(){return
 
this.$el.is(":empty")},destroy:function(){this.$el=a("<div>")}}),c}(),i=function(){"use
 strict";function c(c,d){function e(b){var 
c=f.$node.find(b.node).first();return 
b.node=c.length?c:a("<div>").appendTo(f.$node),new h(b,d)}var 
f=this;c=c||{},c.node||a.error("node is 
required"),d.mixin(this),this.$node=a(c.node),this.query=null,this.datasets=b.map(c.datasets,e)}return
 
b.mixin(c.prototype,e,{_onSelectableClick:function(b){this.trigger("selectableClicked",a(b.currentTarget))},_onRendered:function(a,b,c,d){this.$node.toggleClass(this.c
 
lasses.empty,this._allDatasetsEmpty()),this.trigger("datasetRendered",b,c,d)},_onCleared:function(){this.$node.toggleClass(this.classes.empty,this._allDatasetsEmpty()),this.trigger("datasetCleared")},_propagate:function(){this.trigger.apply(this,arguments)},_allDatasetsEmpty:function(){function
 a(a){return a.isEmpty()}return 
b.every(this.datasets,a)},_getSelectables:function(){return 
this.$node.find(this.selectors.selectable)},_removeCursor:function(){var 
a=this.getActiveSelectable();a&&a.removeClass(this.classes.cursor)},_ensureVisible:function(a){var
 
b,c,d,e;b=a.position().top,c=b+a.outerHeight(!0),d=this.$node.scrollTop(),e=this.$node.height()+parseInt(this.$node.css("paddingTop"),10)+parseInt(this.$node.css("paddingBottom"),10),0>b?this.$node.scrollTop(d+b):c>e&&this.$node.scrollTop(d+(c-e))},bind:function(){var
 a,c=this;return 
a=b.bind(this._onSelectableClick,this),this.$node.on("click.tt",this.selectors.selectable,a),b.each(this.datasets,function(a){a.onSync("asyncRequested",c
 
._propagate,c).onSync("asyncCanceled",c._propagate,c).onSync("asyncReceived",c._propagate,c).onSync("rendered",c._onRendered,c).onSync("cleared",c._onCleared,c)}),this},isOpen:function(){return
 
this.$node.hasClass(this.classes.open)},open:function(){this.$node.addClass(this.classes.open)},close:function(){this.$node.removeClass(this.classes.open),this._removeCursor()},setLanguageDirection:function(a){this.$node.attr("dir",a)},selectableRelativeToCursor:function(a){var
 b,c,d,e;return 
c=this.getActiveSelectable(),b=this._getSelectables(),d=c?b.index(c):-1,e=d+a,e=(e+1)%(b.length+1)-1,e=-1>e?b.length-1:e,-1===e?null:b.eq(e)},setCursor:function(a){this._removeCursor(),(a=a&&a.first())&&(a.addClass(this.classes.cursor),this._ensureVisible(a))},getSelectableData:function(a){return
 a&&a.length?h.extractData(a):null},getActiveSelectable:function(){var 
a=this._getSelectables().filter(this.selectors.cursor).first();return 
a.length?a:null},getTopSelectable:function(){var a=this._getSelectables
 ().first();return a.length?a:null},update:function(a){function 
c(b){b.update(a)}var d=a!==this.query;return 
d&&(this.query=a,b.each(this.datasets,c)),d},empty:function(){function 
a(a){a.clear()}b.each(this.datasets,a),this.query=null,this.$node.addClass(this.classes.empty)},destroy:function(){function
 
c(a){a.destroy()}this.$node.off(".tt"),this.$node=a("<div>"),b.each(this.datasets,c)}}),c}(),j=function(){"use
 strict";function a(){i.apply(this,[].slice.call(arguments,0))}var 
c=i.prototype;return 
b.mixin(a.prototype,i.prototype,{open:function(){return!this._allDatasetsEmpty()&&this._show(),c.open.apply(this,[].slice.call(arguments,0))},close:function(){return
 
this._hide(),c.close.apply(this,[].slice.call(arguments,0))},_onRendered:function(){return
 
this._allDatasetsEmpty()?this._hide():this.isOpen()&&this._show(),c._onRendered.apply(this,[].slice.call(arguments,0))},_onCleared:function(){return
 
this._allDatasetsEmpty()?this._hide():this.isOpen()&&this._show(),c._onCleared.apply(this,
 [].slice.call(arguments,0))},setLanguageDirection:function(a){return 
this.$node.css("ltr"===a?this.css.ltr:this.css.rtl),c.setLanguageDirection.apply(this,[].slice.call(arguments,0))},_hide:function(){this.$node.hide()},_show:function(){this.$node.css("display","block")}}),a}(),k=function(){"use
 strict";function c(c,e){var 
f,g,h,i,j,k,l,m,n,o,p;c=c||{},c.input||a.error("missing 
input"),c.menu||a.error("missing menu"),c.eventBus||a.error("missing event 
bus"),e.mixin(this),this.eventBus=c.eventBus,this.minLength=b.isNumber(c.minLength)?c.minLength:1,this.input=c.input,this.menu=c.menu,this.enabled=!0,this.active=!1,this.input.hasFocus()&&this.activate(),this.dir=this.input.getLangDir(),this._hacks(),this.menu.bind().onSync("selectableClicked",this._onSelectableClicked,this).onSync("asyncRequested",this._onAsyncRequested,this).onSync("asyncCanceled",this._onAsyncCanceled,this).onSync("asyncReceived",this._onAsyncReceived,this).onSync("datasetRendered",this._onDatasetRendered,this).onSy
 
nc("datasetCleared",this._onDatasetCleared,this),f=d(this,"activate","open","_onFocused"),g=d(this,"deactivate","_onBlurred"),h=d(this,"isActive","isOpen","_onEnterKeyed"),i=d(this,"isActive","isOpen","_onTabKeyed"),j=d(this,"isActive","_onEscKeyed"),k=d(this,"isActive","open","_onUpKeyed"),l=d(this,"isActive","open","_onDownKeyed"),m=d(this,"isActive","isOpen","_onLeftKeyed"),n=d(this,"isActive","isOpen","_onRightKeyed"),o=d(this,"_openIfActive","_onQueryChanged"),p=d(this,"_openIfActive","_onWhitespaceChanged"),this.input.bind().onSync("focused",f,this).onSync("blurred",g,this).onSync("enterKeyed",h,this).onSync("tabKeyed",i,this).onSync("escKeyed",j,this).onSync("upKeyed",k,this).onSync("downKeyed",l,this).onSync("leftKeyed",m,this).onSync("rightKeyed",n,this).onSync("queryChanged",o,this).onSync("whitespaceChanged",p,this).onSync("langDirChanged",this._onLangDirChanged,this)}function
 d(a){var c=[].slice.call(arguments,1);return function(){var 
d=[].slice.call(arguments);b.each(c,
 function(b){return a[b].apply(a,d)})}}return 
b.mixin(c.prototype,{_hacks:function(){var 
c,d;c=this.input.$input||a("<div>"),d=this.menu.$node||a("<div>"),c.on("blur.tt",function(a){var
 e,f,g;
+e=document.activeElement,f=d.is(e),g=d.has(e).length>0,b.isMsie()&&(f||g)&&(a.preventDefault(),a.stopImmediatePropagation(),b.defer(function(){c.focus()}))}),d.on("mousedown.tt",function(a){a.preventDefault()})},_onSelectableClicked:function(a,b){this.select(b)},_onDatasetCleared:function(){this._updateHint()},_onDatasetRendered:function(a,b,c,d){this._updateHint(),this.eventBus.trigger("render",c,d,b)},_onAsyncRequested:function(a,b,c){this.eventBus.trigger("asyncrequest",c,b)},_onAsyncCanceled:function(a,b,c){this.eventBus.trigger("asynccancel",c,b)},_onAsyncReceived:function(a,b,c){this.eventBus.trigger("asyncreceive",c,b)},_onFocused:function(){this._minLengthMet()&&this.menu.update(this.input.getQuery())},_onBlurred:function(){this.input.hasQueryChangedSinceLastFocus()&&this.eventBus.trigger("change",this.input.getQuery())},_onEnterKeyed:function(a,b){var
 
c;(c=this.menu.getActiveSelectable())&&this.select(c)&&b.preventDefault()},_onTabKeyed:function(a,b){var
 c;(c=this.menu.getA
 
ctiveSelectable())?this.select(c)&&b.preventDefault():(c=this.menu.getTopSelectable())&&this.autocomplete(c)&&b.preventDefault()},_onEscKeyed:function(){this.close()},_onUpKeyed:function(){this.moveCursor(-1)},_onDownKeyed:function(){this.moveCursor(1)},_onLeftKeyed:function(){"rtl"===this.dir&&this.input.isCursorAtEnd()&&this.autocomplete(this.menu.getTopSelectable())},_onRightKeyed:function(){"ltr"===this.dir&&this.input.isCursorAtEnd()&&this.autocomplete(this.menu.getTopSelectable())},_onQueryChanged:function(a,b){this._minLengthMet(b)?this.menu.update(b):this.menu.empty()},_onWhitespaceChanged:function(){this._updateHint()},_onLangDirChanged:function(a,b){this.dir!==b&&(this.dir=b,this.menu.setLanguageDirection(b))},_openIfActive:function(){this.isActive()&&this.open()},_minLengthMet:function(a){return
 
a=b.isString(a)?a:this.input.getQuery()||"",a.length>=this.minLength},_updateHint:function(){var
 
a,c,d,e,f,h,i;a=this.menu.getTopSelectable(),c=this.menu.getSelectableData(a),d=th
 
is.input.getInputValue(),!c||b.isBlankString(d)||this.input.hasOverflow()?this.input.clearHint():(e=g.normalizeQuery(d),f=b.escapeRegExChars(e),h=new
 
RegExp("^(?:"+f+")(.+$)","i"),i=h.exec(c.val),i&&this.input.setHint(d+i[1]))},isEnabled:function(){return
 
this.enabled},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},isActive:function(){return
 this.active},activate:function(){return 
this.isActive()?!0:!this.isEnabled()||this.eventBus.before("active")?!1:(this.active=!0,this.eventBus.trigger("active"),!0)},deactivate:function(){return
 
this.isActive()?this.eventBus.before("idle")?!1:(this.active=!1,this.close(),this.eventBus.trigger("idle"),!0):!0},isOpen:function(){return
 this.menu.isOpen()},open:function(){return 
this.isOpen()||this.eventBus.before("open")||(this.menu.open(),this._updateHint(),this.eventBus.trigger("open")),this.isOpen()},close:function(){return
 
this.isOpen()&&!this.eventBus.before("close")&&(this.menu.close(),this.input.clearHint(),this.input.
 
resetInputValue(),this.eventBus.trigger("close")),!this.isOpen()},setVal:function(a){this.input.setQuery(b.toStr(a))},getVal:function(){return
 this.input.getQuery()},select:function(a){var 
b=this.menu.getSelectableData(a);return 
b&&!this.eventBus.before("select",b.obj)?(this.input.setQuery(b.val,!0),this.eventBus.trigger("select",b.obj),this.close(),!0):!1},autocomplete:function(a){var
 b,c,d;return 
b=this.input.getQuery(),c=this.menu.getSelectableData(a),d=c&&b!==c.val,d&&!this.eventBus.before("autocomplete",c.obj)?(this.input.setQuery(c.val),this.eventBus.trigger("autocomplete",c.obj),!0):!1},moveCursor:function(a){var
 b,c,d,e,f;return 
b=this.input.getQuery(),c=this.menu.selectableRelativeToCursor(a),d=this.menu.getSelectableData(c),e=d?d.obj:null,f=this._minLengthMet()&&this.menu.update(b),f||this.eventBus.before("cursorchange",e)?!1:(this.menu.setCursor(c),d?this.input.setInputValue(d.val):(this.input.resetInputValue(),this._updateHint()),this.eventBus.trigger("cursorchange",e),!
 
0)},destroy:function(){this.input.destroy(),this.menu.destroy()}}),c}();!function(){"use
 strict";function e(b,c){b.each(function(){var 
b,d=a(this);(b=d.data(p.typeahead))&&c(b,d)})}function f(a,b){return 
a.clone().addClass(b.classes.hint).removeData().css(b.css.hint).css(l(a)).prop("readonly",!0).removeAttr("id
 name placeholder 
required").attr({autocomplete:"off",spellcheck:"false",tabindex:-1})}function 
h(a,b){a.data(p.attrs,{dir:a.attr("dir"),autocomplete:a.attr("autocomplete"),spellcheck:a.attr("spellcheck"),style:a.attr("style")}),a.addClass(b.classes.input).attr({autocomplete:"off",spellcheck:!1});try{!a.attr("dir")&&a.attr("dir","auto")}catch(c){}return
 a}function 
l(a){return{backgroundAttachment:a.css("background-attachment"),backgroundClip:a.css("background-clip"),backgroundColor:a.css("background-color"),backgroundImage:a.css("background-image"),backgroundOrigin:a.css("background-origin"),backgroundPosition:a.css("background-position"),backgroundRepeat:a.css("background-rep
 eat"),backgroundSize:a.css("background-size")}}function m(a){var 
c,d;c=a.data(p.www),d=a.parent().filter(c.selectors.wrapper),b.each(a.data(p.attrs),function(c,d){b.isUndefined(c)?a.removeAttr(d):a.attr(d,c)}),a.removeData(p.typeahead).removeData(p.www).removeData(p.attr).removeClass(c.classes.input),d.length&&(a.detach().insertAfter(d),d.remove())}function
 n(c){var d,e;return 
d=b.isJQuery(c)||b.isElement(c),e=d?a(c).first():[],e.length?e:null}var 
o,p,q;o=a.fn.typeahead,p={www:"tt-www",attrs:"tt-attrs",typeahead:"tt-typeahead"},q={initialize:function(e,l){function
 m(){var 
c,m,q,r,s,t,u,v,w,x,y;b.each(l,function(a){a.highlight=!!e.highlight}),c=a(this),m=a(o.html.wrapper),q=n(e.hint),r=n(e.menu),s=e.hint!==!1&&!q,t=e.menu!==!1&&!r,s&&(q=f(c,o)),t&&(r=a(o.html.menu).css(o.css.menu)),q&&q.val(""),c=h(c,o),(s||t)&&(m.css(o.css.wrapper),c.css(s?o.css.input:o.css.inputWithNoHint),c.wrap(m).parent().prepend(s?q:null).append(t?r:null)),y=t?j:i,u=new
 d({el:c}),v=new g({hint:q,input:c},o),w=n
 ew y({node:r,datasets:l},o),x=new 
k({input:v,menu:w,eventBus:u,minLength:e.minLength},o),c.data(p.www,o),c.data(p.typeahead,x)}var
 o;return 
l=b.isArray(l)?l:[].slice.call(arguments,1),e=e||{},o=c(e.classNames),this.each(m)},isEnabled:function(){var
 a;return 
e(this.first(),function(b){a=b.isEnabled()}),a},enable:function(){return 
e(this,function(a){a.enable()}),this},disable:function(){return 
e(this,function(a){a.disable()}),this},isActive:function(){var a;return 
e(this.first(),function(b){a=b.isActive()}),a},activate:function(){return 
e(this,function(a){a.activate()}),this},deactivate:function(){return 
e(this,function(a){a.deactivate()}),this},isOpen:function(){var a;return 
e(this.first(),function(b){a=b.isOpen()}),a},open:function(){return 
e(this,function(a){a.open()}),this},close:function(){return 
e(this,function(a){a.close()}),this},select:function(b){var c=!1,d=a(b);return 
e(this.first(),function(a){c=a.select(d)}),c},autocomplete:function(b){var 
c=!1,d=a(b);return e(this.first(
 ),function(a){c=a.autocomplete(d)}),c},moveCursor:function(a){var b=!1;return 
e(this.first(),function(c){b=c.moveCursor(a)}),b},val:function(a){var b;return 
arguments.length?(e(this,function(b){b.setVal(a)}),this):(e(this.first(),function(a){b=a.getVal()}),b)},destroy:function(){return
 
e(this,function(a,b){m(b),a.destroy()}),this}},a.fn.typeahead=function(a){return
 
q[a]?q[a].apply(this,[].slice.call(arguments,1)):q.initialize.apply(this,arguments)},a.fn.typeahead.noConflict=function(){return
 a.fn.typeahead=o,this}}()});
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tomee-site-generator/blob/972cc356/src/main/jbake/assets/js/typed.js
----------------------------------------------------------------------
diff --git a/src/main/jbake/assets/js/typed.js 
b/src/main/jbake/assets/js/typed.js
new file mode 100755
index 0000000..3a51c6e
--- /dev/null
+++ b/src/main/jbake/assets/js/typed.js
@@ -0,0 +1,421 @@
+// The MIT License (MIT)
+
+// Typed.js | Copyright (c) 2014 Matt Boldt | www.mattboldt.com
+
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to 
deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+
+
+
+! function($) {
+
+    "use strict";
+
+    var Typed = function(el, options) {
+
+        // chosen element to manipulate text
+        this.el = $(el);
+
+        // options
+        this.options = $.extend({}, $.fn.typed.defaults, options);
+
+        // attribute to type into
+        this.isInput = this.el.is('input');
+        this.attr = this.options.attr;
+
+        // show cursor
+        this.showCursor = this.isInput ? false : this.options.showCursor;
+
+        // text content of element
+        this.elContent = this.attr ? this.el.attr(this.attr) : this.el.text()
+
+        // html or plain text
+        this.contentType = this.options.contentType;
+
+        // typing speed
+        this.typeSpeed = this.options.typeSpeed;
+
+        // add a delay before typing starts
+        this.startDelay = this.options.startDelay;
+
+        // backspacing speed
+        this.backSpeed = this.options.backSpeed;
+
+        // amount of time to wait before backspacing
+        this.backDelay = this.options.backDelay;
+
+        // input strings of text
+        this.strings = this.options.strings;
+
+        // character number position of current string
+        this.strPos = 0;
+
+        // current array position
+        this.arrayPos = 0;
+
+        // number to stop backspacing on.
+        // default 0, can change depending on how many chars
+        // you want to remove at the time
+        this.stopNum = 0;
+
+        // Looping logic
+        this.loop = this.options.loop;
+        this.loopCount = this.options.loopCount;
+        this.curLoop = 0;
+
+        // for stopping
+        this.stop = false;
+
+        // custom cursor
+        this.cursorChar = this.options.cursorChar;
+
+        // shuffle the strings
+        this.shuffle = this.options.shuffle;
+        // the order of strings
+        this.sequence = [];
+
+        // All systems go!
+        this.build();
+    };
+
+    Typed.prototype = {
+
+        constructor: Typed
+
+        ,
+        init: function() {
+            // begin the loop w/ first current string (global self.string)
+            // current string will be passed as an argument each time after 
this
+            var self = this;
+            self.timeout = setTimeout(function() {
+                for (var i=0;i<self.strings.length;++i) self.sequence[i]=i;
+
+                // shuffle the array if true
+                if(self.shuffle) self.sequence = 
self.shuffleArray(self.sequence);
+
+                // Start typing
+                self.typewrite(self.strings[self.sequence[self.arrayPos]], 
self.strPos);
+            }, self.startDelay);
+        }
+
+        ,
+        build: function() {
+            // Insert cursor
+            if (this.showCursor === true) {
+                this.cursor = $("<span class=\"typed-cursor\">" + 
this.cursorChar + "</span>");
+                this.el.after(this.cursor);
+            }
+            this.init();
+        }
+
+        // pass current string state to each function, types 1 char per call
+        ,
+        typewrite: function(curString, curStrPos) {
+            // exit when stopped
+            if (this.stop === true) {
+                return;
+            }
+
+            // varying values for setTimeout during typing
+            // can't be global since number changes each time loop is executed
+            var humanize = Math.round(Math.random() * (100 - 30)) + 
this.typeSpeed;
+            var self = this;
+
+            // ------------- optional ------------- //
+            // backpaces a certain string faster
+            // ------------------------------------ //
+            // if (self.arrayPos == 1){
+            //  self.backDelay = 50;
+            // }
+            // else{ self.backDelay = 500; }
+
+            // contain typing function in a timeout humanize'd delay
+            self.timeout = setTimeout(function() {
+                // check for an escape character before a pause value
+                // format: \^\d+ .. eg: ^1000 .. should be able to print the ^ 
too using ^^
+                // single ^ are removed from string
+                var charPause = 0;
+                var substr = curString.substr(curStrPos);
+                if (substr.charAt(0) === '^') {
+                    var skip = 1; // skip atleast 1
+                    if (/^\^\d+/.test(substr)) {
+                        substr = /\d+/.exec(substr)[0];
+                        skip += substr.length;
+                        charPause = parseInt(substr);
+                    }
+
+                    // strip out the escape character and pause value so 
they're not printed
+                    curString = curString.substring(0, curStrPos) + 
curString.substring(curStrPos + skip);
+                }
+
+                if (self.contentType === 'html') {
+                    // skip over html tags while typing
+                    var curChar = curString.substr(curStrPos).charAt(0)
+                    if (curChar === '<' || curChar === '&') {
+                        var tag = '';
+                        var endTag = '';
+                        if (curChar === '<') {
+                            endTag = '>'
+                        } else {
+                            endTag = ';'
+                        }
+                        while (curString.substr(curStrPos).charAt(0) !== 
endTag) {
+                            tag += curString.substr(curStrPos).charAt(0);
+                            curStrPos++;
+                        }
+                        curStrPos++;
+                        tag += endTag;
+                    }
+                }
+
+                // timeout for any pause after a character
+                self.timeout = setTimeout(function() {
+                    if (curStrPos === curString.length) {
+                        // fires callback function
+                        self.options.onStringTyped(self.arrayPos);
+
+                        // is this the final string
+                        if (self.arrayPos === self.strings.length - 1) {
+                            // animation that occurs on the last typed string
+                            self.options.callback();
+
+                            self.curLoop++;
+
+                            // quit if we wont loop back
+                            if (self.loop === false || self.curLoop === 
self.loopCount)
+                                return;
+                        }
+
+                        self.timeout = setTimeout(function() {
+                            self.backspace(curString, curStrPos);
+                        }, self.backDelay);
+                    } else {
+
+                        /* call before functions if applicable */
+                        if (curStrPos === 0)
+                            self.options.preStringTyped(self.arrayPos);
+
+                        // start typing each new char into existing string
+                        // curString: arg, self.el.html: original text inside 
element
+                        var nextString = curString.substr(0, curStrPos + 1);
+                        if (self.attr) {
+                            self.el.attr(self.attr, nextString);
+                        } else {
+                            if (self.isInput) {
+                                self.el.val(nextString);
+                            } else if (self.contentType === 'html') {
+                                self.el.html(nextString);
+                            } else {
+                                self.el.text(nextString);
+                            }
+                        }
+
+                        // add characters one by one
+                        curStrPos++;
+                        // loop the function
+                        self.typewrite(curString, curStrPos);
+                    }
+                    // end of character pause
+                }, charPause);
+
+                // humanized value for typing
+            }, humanize);
+
+        }
+
+        ,
+        backspace: function(curString, curStrPos) {
+            // exit when stopped
+            if (this.stop === true) {
+                return;
+            }
+
+            // varying values for setTimeout during typing
+            // can't be global since number changes each time loop is executed
+            var humanize = Math.round(Math.random() * (100 - 30)) + 
this.backSpeed;
+            var self = this;
+
+            self.timeout = setTimeout(function() {
+
+                // ----- this part is optional ----- //
+                // check string array position
+                // on the first string, only delete one word
+                // the stopNum actually represents the amount of chars to
+                // keep in the current string. In my case it's 14.
+                // if (self.arrayPos == 1){
+                //  self.stopNum = 14;
+                // }
+                //every other time, delete the whole typed string
+                // else{
+                //  self.stopNum = 0;
+                // }
+
+                if (self.contentType === 'html') {
+                    // skip over html tags while backspacing
+                    if (curString.substr(curStrPos).charAt(0) === '>') {
+                        var tag = '';
+                        while (curString.substr(curStrPos).charAt(0) !== '<') {
+                            tag -= curString.substr(curStrPos).charAt(0);
+                            curStrPos--;
+                        }
+                        curStrPos--;
+                        tag += '<';
+                    }
+                }
+
+                // ----- continue important stuff ----- //
+                // replace text with base text + typed characters
+                var nextString = curString.substr(0, curStrPos);
+                if (self.attr) {
+                    self.el.attr(self.attr, nextString);
+                } else {
+                    if (self.isInput) {
+                        self.el.val(nextString);
+                    } else if (self.contentType === 'html') {
+                        self.el.html(nextString);
+                    } else {
+                        self.el.text(nextString);
+                    }
+                }
+
+                // if the number (id of character in current string) is
+                // less than the stop number, keep going
+                if (curStrPos > self.stopNum) {
+                    // subtract characters one by one
+                    curStrPos--;
+                    // loop the function
+                    self.backspace(curString, curStrPos);
+                }
+                // if the stop number has been reached, increase
+                // array position to next string
+                else if (curStrPos <= self.stopNum) {
+                    self.arrayPos++;
+
+                    if (self.arrayPos === self.strings.length) {
+                        self.arrayPos = 0;
+
+                        // Shuffle sequence again
+                        if(self.shuffle) self.sequence = 
self.shuffleArray(self.sequence);
+
+                        self.init();
+                    } else
+                        
self.typewrite(self.strings[self.sequence[self.arrayPos]], curStrPos);
+                }
+
+                // humanized value for typing
+            }, humanize);
+
+        }
+        /**
+         * Shuffles the numbers in the given array.
+         * @param {Array} array
+         * @returns {Array}
+         */
+        ,shuffleArray: function(array) {
+            var tmp, current, top = array.length;
+            if(top) while(--top) {
+                current = Math.floor(Math.random() * (top + 1));
+                tmp = array[current];
+                array[current] = array[top];
+                array[top] = tmp;
+            }
+            return array;
+        }
+
+        // Start & Stop currently not working
+
+        // , stop: function() {
+        //     var self = this;
+
+        //     self.stop = true;
+        //     clearInterval(self.timeout);
+        // }
+
+        // , start: function() {
+        //     var self = this;
+        //     if(self.stop === false)
+        //        return;
+
+        //     this.stop = false;
+        //     this.init();
+        // }
+
+        // Reset and rebuild the element
+        ,
+        reset: function() {
+            var self = this;
+            clearInterval(self.timeout);
+            var id = this.el.attr('id');
+            this.el.after('<span id="' + id + '"/>')
+            this.el.remove();
+            if (typeof this.cursor !== 'undefined') {
+                this.cursor.remove();
+            }
+            // Send the callback
+            self.options.resetCallback();
+        }
+
+    };
+
+    $.fn.typed = function(option) {
+        return this.each(function() {
+            var $this = $(this),
+                data = $this.data('typed'),
+                options = typeof option == 'object' && option;
+            if (!data) $this.data('typed', (data = new Typed(this, options)));
+            if (typeof option == 'string') data[option]();
+        });
+    };
+
+    $.fn.typed.defaults = {
+        strings: ["These are the default values...", "You know what you should 
do?", "Use your own!", "Have a great day!"],
+        // typing speed
+        typeSpeed: 0,
+        // time before typing starts
+        startDelay: 0,
+        // backspacing speed
+        backSpeed: 0,
+        // shuffle the strings
+        shuffle: false,
+        // time before backspacing
+        backDelay: 500,
+        // loop
+        loop: false,
+        // false = infinite
+        loopCount: false,
+        // show cursor
+        showCursor: true,
+        // character for cursor
+        cursorChar: "|",
+        // attribute to type (null == text)
+        attr: null,
+        // either html or text
+        contentType: 'html',
+        // call when done callback function
+        callback: function() {},
+        // starting callback function before each string
+        preStringTyped: function() {},
+        //callback for every typed string
+        onStringTyped: function() {},
+        // callback for reset
+        resetCallback: function() {}
+    };
+
+
+}(window.jQuery);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tomee-site-generator/blob/972cc356/src/main/jbake/assets/js/typewriter.js
----------------------------------------------------------------------
diff --git a/src/main/jbake/assets/js/typewriter.js 
b/src/main/jbake/assets/js/typewriter.js
new file mode 100755
index 0000000..a28b187
--- /dev/null
+++ b/src/main/jbake/assets/js/typewriter.js
@@ -0,0 +1,54 @@
+// typewriter
+
+// 3215287
+// bertae...@gmail.com
+(function($, w, d, undefined) {
+
+  function typewriter() {
+
+    // Globals 
+    var self = this, speed;
+
+    function init(element, options) {
+            // Set Globals
+      var str;
+      var indice = 0;
+
+      self.options = $.extend( {}, $.fn.typewriter.options, options );
+      $currentElement = $(element);
+      elementStr = $currentElement.text().replace(/\s+/g, ' ');
+      dataSpeed  = $currentElement.data("speed") || self.options.speed;
+      $currentElement.empty();
+      var showText = setInterval(
+                               function(){
+                                       if (indice++ < elementStr.length) {
+                             $currentElement.append(elementStr[indice - 1]);
+                           }else{
+                               clearInterval(showText);
+                           }
+                               }, dataSpeed);
+      // self.animation = setInterval(function(){animate_calification()}, 20);
+    }
+
+    
+    
+    // Metodos publicos
+    return {
+      init: init
+    }
+  }
+
+  // Plugin jQuery
+  $.fn.typewriter = function(options) {
+    return this.each(function () {
+       var writer =  new typewriter();
+      writer.init(this, options);
+      $.data( this, 'typewriter', writer);
+    });
+  };
+
+  $.fn.typewriter.options = {
+    'speed' : 300
+  };
+
+})(jQuery, window, document);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tomee-site-generator/blob/972cc356/src/main/jbake/assets/js/wow.min.js
----------------------------------------------------------------------
diff --git a/src/main/jbake/assets/js/wow.min.js 
b/src/main/jbake/assets/js/wow.min.js
new file mode 100755
index 0000000..a692251
--- /dev/null
+++ b/src/main/jbake/assets/js/wow.min.js
@@ -0,0 +1,2 @@
+/*! WOW - v1.1.2 - 2015-04-07
+* Copyright (c) 2015 Matthieu Aussaguel; Licensed MIT */(function(){var 
a,b,c,d,e,f=function(a,b){return function(){return 
a.apply(b,arguments)}},g=[].indexOf||function(a){for(var 
b=0,c=this.length;c>b;b++)if(b in this&&this[b]===a)return 
b;return-1};b=function(){function a(){}return 
a.prototype.extend=function(a,b){var c,d;for(c in 
b)d=b[c],null==a[c]&&(a[c]=d);return 
a},a.prototype.isMobile=function(a){return/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera
 Mini/i.test(a)},a.prototype.createEvent=function(a,b,c,d){var e;return 
null==b&&(b=!1),null==c&&(c=!1),null==d&&(d=null),null!=document.createEvent?(e=document.createEvent("CustomEvent"),e.initCustomEvent(a,b,c,d)):null!=document.createEventObject?(e=document.createEventObject(),e.eventType=a):e.eventName=a,e},a.prototype.emitEvent=function(a,b){return
 null!=a.dispatchEvent?a.dispatchEvent(b):b in(null!=a)?a[b]():"on"+b 
in(null!=a)?a["on"+b]():void 0},a.prototype.addEvent=function(a,b,c){return 
null!=a.addEventListener?
 
a.addEventListener(b,c,!1):null!=a.attachEvent?a.attachEvent("on"+b,c):a[b]=c},a.prototype.removeEvent=function(a,b,c){return
 
null!=a.removeEventListener?a.removeEventListener(b,c,!1):null!=a.detachEvent?a.detachEvent("on"+b,c):delete
 a[b]},a.prototype.innerHeight=function(){return"innerHeight"in 
window?window.innerHeight:document.documentElement.clientHeight},a}(),c=this.WeakMap||this.MozWeakMap||(c=function(){function
 a(){this.keys=[],this.values=[]}return a.prototype.get=function(a){var 
b,c,d,e,f;for(f=this.keys,b=d=0,e=f.length;e>d;b=++d)if(c=f[b],c===a)return 
this.values[b]},a.prototype.set=function(a,b){var 
c,d,e,f,g;for(g=this.keys,c=e=0,f=g.length;f>e;c=++e)if(d=g[c],d===a)return 
void(this.values[c]=b);return 
this.keys.push(a),this.values.push(b)},a}()),a=this.MutationObserver||this.WebkitMutationObserver||this.MozMutationObserver||(a=function(){function
 a(){"undefined"!=typeof 
console&&null!==console&&console.warn("MutationObserver is not supported by 
your browser."),"undef
 ined"!=typeof console&&null!==console&&console.warn("WOW.js cannot detect dom 
mutations, please call .sync() after loading new content.")}return 
a.notSupported=!0,a.prototype.observe=function(){},a}()),d=this.getComputedStyle||function(a){return
 this.getPropertyValue=function(b){var 
c;return"float"===b&&(b="styleFloat"),e.test(b)&&b.replace(e,function(a,b){return
 b.toUpperCase()}),(null!=(c=a.currentStyle)?c[b]:void 
0)||null},this},e=/(\-([a-z]){1})/g,this.WOW=function(){function 
e(a){null==a&&(a={}),this.scrollCallback=f(this.scrollCallback,this),this.scrollHandler=f(this.scrollHandler,this),this.resetAnimation=f(this.resetAnimation,this),this.start=f(this.start,this),this.scrolled=!0,this.config=this.util().extend(a,this.defaults),this.animationNameCache=new
 c,this.wowEvent=this.util().createEvent(this.config.boxClass)}return 
e.prototype.defaults={boxClass:"wow",animateClass:"animated",offset:0,mobile:!0,live:!0,callback:null},e.prototype.init=function(){var
 a;return this.element=
 
window.document.documentElement,"interactive"===(a=document.readyState)||"complete"===a?this.start():this.util().addEvent(document,"DOMContentLoaded",this.start),this.finished=[]},e.prototype.start=function(){var
 b,c,d,e;if(this.stopped=!1,this.boxes=function(){var 
a,c,d,e;for(d=this.element.querySelectorAll("."+this.config.boxClass),e=[],a=0,c=d.length;c>a;a++)b=d[a],e.push(b);return
 e}.call(this),this.all=function(){var 
a,c,d,e;for(d=this.boxes,e=[],a=0,c=d.length;c>a;a++)b=d[a],e.push(b);return 
e}.call(this),this.boxes.length)if(this.disabled())this.resetStyle();else 
for(e=this.boxes,c=0,d=e.length;d>c;c++)b=e[c],this.applyStyle(b,!0);return 
this.disabled()||(this.util().addEvent(window,"scroll",this.scrollHandler),this.util().addEvent(window,"resize",this.scrollHandler),this.interval=setInterval(this.scrollCallback,50)),this.config.live?new
 a(function(a){return function(b){var 
c,d,e,f,g;for(g=[],c=0,d=b.length;d>c;c++)f=b[c],g.push(function(){var 
a,b,c,d;for(c=f.addedNodes||[],d
 =[],a=0,b=c.length;b>a;a++)e=c[a],d.push(this.doSync(e));return 
d}.call(a));return 
g}}(this)).observe(document.body,{childList:!0,subtree:!0}):void 
0},e.prototype.stop=function(){return 
this.stopped=!0,this.util().removeEvent(window,"scroll",this.scrollHandler),this.util().removeEvent(window,"resize",this.scrollHandler),null!=this.interval?clearInterval(this.interval):void
 0},e.prototype.sync=function(){return 
a.notSupported?this.doSync(this.element):void 
0},e.prototype.doSync=function(a){var 
b,c,d,e,f;if(null==a&&(a=this.element),1===a.nodeType){for(a=a.parentNode||a,e=a.querySelectorAll("."+this.config.boxClass),f=[],c=0,d=e.length;d>c;c++)b=e[c],g.call(this.all,b)<0?(this.boxes.push(b),this.all.push(b),this.stopped||this.disabled()?this.resetStyle():this.applyStyle(b,!0),f.push(this.scrolled=!0)):f.push(void
 0);return f}},e.prototype.show=function(a){return 
this.applyStyle(a),a.className=a.className+" 
"+this.config.animateClass,null!=this.config.callback&&this.config.callback(a),
 
this.util().emitEvent(a,this.wowEvent),this.util().addEvent(a,"animationend",this.resetAnimation),this.util().addEvent(a,"oanimationend",this.resetAnimation),this.util().addEvent(a,"webkitAnimationEnd",this.resetAnimation),this.util().addEvent(a,"MSAnimationEnd",this.resetAnimation),a},e.prototype.applyStyle=function(a,b){var
 c,d,e;return 
d=a.getAttribute("data-wow-duration"),c=a.getAttribute("data-wow-delay"),e=a.getAttribute("data-wow-iteration"),this.animate(function(f){return
 function(){return 
f.customStyle(a,b,d,c,e)}}(this))},e.prototype.animate=function(){return"requestAnimationFrame"in
 window?function(a){return window.requestAnimationFrame(a)}:function(a){return 
a()}}(),e.prototype.resetStyle=function(){var 
a,b,c,d,e;for(d=this.boxes,e=[],b=0,c=d.length;c>b;b++)a=d[b],e.push(a.style.visibility="visible");return
 e},e.prototype.resetAnimation=function(a){var b;return 
a.type.toLowerCase().indexOf("animationend")>=0?(b=a.target||a.srcElement,b.className=b.className.replace(this.
 config.animateClass,"").trim()):void 
0},e.prototype.customStyle=function(a,b,c,d,e){return 
b&&this.cacheAnimationName(a),a.style.visibility=b?"hidden":"visible",c&&this.vendorSet(a.style,{animationDuration:c}),d&&this.vendorSet(a.style,{animationDelay:d}),e&&this.vendorSet(a.style,{animationIterationCount:e}),this.vendorSet(a.style,{animationName:b?"none":this.cachedAnimationName(a)}),a},e.prototype.vendors=["moz","webkit"],e.prototype.vendorSet=function(a,b){var
 c,d,e,f;d=[];for(c in b)e=b[c],a[""+c]=e,d.push(function(){var 
b,d,g,h;for(g=this.vendors,h=[],b=0,d=g.length;d>b;b++)f=g[b],h.push(a[""+f+c.charAt(0).toUpperCase()+c.substr(1)]=e);return
 h}.call(this));return d},e.prototype.vendorCSS=function(a,b){var 
c,e,f,g,h,i;for(h=d(a),g=h.getPropertyCSSValue(b),f=this.vendors,c=0,e=f.length;e>c;c++)i=f[c],g=g||h.getPropertyCSSValue("-"+i+"-"+b);return
 g},e.prototype.animationName=function(a){var 
b;try{b=this.vendorCSS(a,"animation-name").cssText}catch(c){b=d(a).getPropertyValue("anim
 
ation-name")}return"none"===b?"":b},e.prototype.cacheAnimationName=function(a){return
 
this.animationNameCache.set(a,this.animationName(a))},e.prototype.cachedAnimationName=function(a){return
 this.animationNameCache.get(a)},e.prototype.scrollHandler=function(){return 
this.scrolled=!0},e.prototype.scrollCallback=function(){var 
a;return!this.scrolled||(this.scrolled=!1,this.boxes=function(){var 
b,c,d,e;for(d=this.boxes,e=[],b=0,c=d.length;c>b;b++)a=d[b],a&&(this.isVisible(a)?this.show(a):e.push(a));return
 e}.call(this),this.boxes.length||this.config.live)?void 
0:this.stop()},e.prototype.offsetTop=function(a){for(var b;void 
0===a.offsetTop;)a=a.parentNode;for(b=a.offsetTop;a=a.offsetParent;)b+=a.offsetTop;return
 b},e.prototype.isVisible=function(a){var b,c,d,e,f;return 
c=a.getAttribute("data-wow-offset")||this.config.offset,f=window.pageYOffset,e=f+Math.min(this.element.clientHeight,this.util().innerHeight())-c,d=this.offsetTop(a),b=d+a.clientHeight,e>=d&&b>=f},e.prototype.util=function
 (){return null!=this._util?this._util:this._util=new 
b},e.prototype.disabled=function(){return!this.config.mobile&&this.util().isMobile(navigator.userAgent)},e}()}).call(this);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tomee-site-generator/blob/972cc356/src/main/jbake/content/admin/cluster/index.adoc
----------------------------------------------------------------------
diff --git a/src/main/jbake/content/admin/cluster/index.adoc 
b/src/main/jbake/content/admin/cluster/index.adoc
new file mode 100755
index 0000000..19ab053
--- /dev/null
+++ b/src/main/jbake/content/admin/cluster/index.adoc
@@ -0,0 +1,226 @@
+= Clustering
+:jbake-date: 2016-03-16
+:jbake-type: page
+:jbake-status: published
+:jbake-tomeepdf:
+
+
+=== Session clustering
+
+TomEE fully relies on Tomcat clustering: 
https://tomcat.apache.org/tomcat-7.0-doc/cluster-howto.html[Tomcat Clustering].
+
+The configuration is mainly in `conf/server.xml` and since TomEE 7 CDI 
`@SessionScoped` is transparently clustered
+through the session.
+
+=== Hazelcast as session provider
+
+Hazelcast did a post on this topic on 
https://hazelcast.com/use-cases/web-session-clustering/session-clustering-tomee/[Session
 Clustering With TomEE].
+
+Tomitribe also demonstrated you can distributed `@Stateful` beans easily 
relying on hazelcast: 
https://github.com/tomitribe/hazelcast-tomee-poc[Hazelcast TomEE PoC].
+
+=== Load balancing
+
+TomEE being a HTTP server all HTTP load balancer such as HTTPd (a.k.a. 
Apache2), ngnix, F5 etc... will work.
+
+More documentation on HTTPd link can be found on 
https://tomcat.apache.org/connectors-doc/webserver_howto/apache.html[Tomcat] 
website.
+
+=== EJBd
+
+If you use the EJBd protocol (`@Remote` EJB proprietary protocol of TomEE) you 
can get cluster features on the client
+part.
+
+==== Multicast
+
+Multicast is the preferred way to broadcast the heartbeat on the network. The 
simple technique of broadcasting a non-changing service URI on the network has 
specific advantages to multicast. The URI itself is essentially stateless and 
there is no "i'm alive" URI or an "i'm dead" URI.
+
+In this way the issues with UDP being unordered and unreliable melt away as 
state is no longer a concern and packet sizes are always small. Complicated 
libraries that ride atop UDP and attempt to offer reliability (retransmission) 
and ordering on UDP can be avoided. As well the advantages UDP has over TCP are 
retained as there are no java layers attempting to force UDP communication to 
be more TCP-like. The simple design means UDP/Multicast is only used for 
discovery and from there on out critical information is transmitted over TCP/IP 
which is obviously going to do a better job at ensuring reliability and 
ordering.
+
+===== Server Configuration
+
+When you boot the server there should be a conf/multicast.properties file 
containing:
+
+[source,bash]
+----
+server      = org.apache.openejb.server.discovery.MulticastDiscoveryAgent
+bind        = 239.255.2.3
+port        = 6142
+disabled    = true
+group       = default
+----
+
+Just need to enable that by setting disabled=false. All of the above settings 
except server can be changed. The port and bind must be valid for general 
multicast/udp network communication.
+
+The group setting can be changed to further group servers that may use the 
same multicast channel. As shown below the client also has a group setting 
which can be used to select an appropriate server from the multicast channel.
+
+IMPORTANT: for multicast to work you need to have ejbd activated as a normal 
service. This can be done setting in `conf/system.properties` the entry: 
`openejb.service.manager.class = 
org.apache.openejb.server.SimpleServiceManager`.
+
+===== Multicast Client
+
+The multicast functionality is not just for servers to find each other in a 
cluster, it can also be used for EJB clients to discover a server. A special 
multicast:// URL can be used in the InitialContext properties to signify that 
multicast should be used to seed the connection process. Such as:
+
+[source,java]
+----
+Properties p = new Properties();
+p.put(Context.INITIAL_CONTEXT_FACTORY,
+"org.apache.openejb.client.RemoteInitialContextFactory");
+p.put(Context.PROVIDER_URL, "multicast://239.255.2.3:6142?group=default");
+InitialContext remoteContext = new InitialContext(p);
+----
+
+The URL has optional query parameters such as schemes and group and timeout 
which allow you to zero in on a particular type of service of a particular 
cluster group as well as set how long you are willing to wait in the discovery 
process till finally giving up. The first matching service that it sees 
"flowing" around on the UDP stream is the one it picks and sticks to for that 
and subsequent requests, ensuring UDP is only used when there are no other 
servers to talk to.
+
+Note that EJB clients do not need to use multicast to find a server. If the 
client knows the URL of a server in the cluster, it may use it and connect 
directly to that server, at which point that server will share the full list of 
its peers.
+
+===== Multicast Servers with TCP Clients
+
+Note that clients do not need to use multicast to communicate with servers. 
Servers can use multicast to discover each other, but clients are still free to 
connect to servers in the network using the server's TCP address.
+
+[source,java]
+----
+Properties p = new Properties();
+p.put(Context.INITIAL_CONTEXT_FACTORY,  
"org.apache.openejb.client.RemoteInitialContextFactory");
+p.put(Context.PROVIDER_URL, "ejbd://192.168.1.30:4201");
+InitialContext remoteContext = new InitialContext(p);
+When the client connects, the server will send the URLs of all the servers in 
the group and failover will take place normally.
+----
+
+==== Multipulse
+
+MultiPulse is an alternative multicast lookup that does not use a regular 
heartbeat. Instead, servers listen for a multicast request packet (a pulse) to 
which a response is then sent. Multicast network traffic is effectively reduced 
to an absolute minimum.
+
+MultiPulse is only useful in network scenarios where both client and server 
can be configured to send multicast UDP packets.
+
+===== Server Configuration
+
+After you boot the server for the first time the default configuration will 
create the file conf/conf.d/multipulse.properties containing:
+
+[source,bash]
+----
+server      = org.apache.openejb.server.discovery.MulticastPulseAgent
+bind        = 239.255.2.3
+port        = 6142
+disabled    = true
+group       = default
+----
+
+You just need to enable the agent by setting disabled = false. It is advisable 
to disable multicast in the multicast.properties file, or at least to use a 
different bind address or port should you wish to use both.
+
+All of the above settings except server can be modified as required. The port 
and bind must be valid for general multicast/udp network communication.
+
+The group setting can be changed to further group/cluster servers that may use 
the same multicast channel. As shown below the client also has an optional 
group setting which can be used to select an appropriate server cluster from 
the multicast channel (See MultiPulse Client).
+
+The next step is to ensure that the advertised services are configured for 
discovery. Edit the ejbd.properties file (and any other enabled services such 
as http, etc.) and ensure that the discovery option is set to a value that 
remote clients will be able to resolve.
+
+[source,bash]
+----
+server      = org.apache.openejb.server.ejbd.EjbServer
+bind        = 0.0.0.0
+port        = 4201
+disabled    = false
+threads     = 20
+discovery   = ejb:ejbd://{bind}:{port}
+----
+
+NOTE: If either 0.0.0.0 (IPv4) or [::] (IPv6) wildcard bind addresses are used 
then the server will actually broadcast all of it's known public hosts to 
clients. Clients will then cycle though and attempt to connect to the provided 
hosts until successful.
+
+If localhost is used then only clients on the same physical machine will 
actually 'see' the server response.
+
+===== MultiPulse Client
+
+The multipulse functionality is not just for servers to find each other in a 
cluster, it can also be used for EJB clients to discover a server. A special 
multipulse:// URL can be used in the InitialContext properties to signify that 
multipulse should be used to seed the connection process. Such as:
+
+[source,java]
+----
+Properties p = new Properties();
+p.put(Context.INITIAL_CONTEXT_FACTORY, 
"org.apache.openejb.client.RemoteInitialContextFactory");
+p.put(Context.PROVIDER_URL, 
"multipulse://239.255.2.3:6142?group=default&timeout=250");
+InitialContext remoteContext = new InitialContext(p);
+----
+
+The URL has optional query parameters such as schemes and group and timeout 
which allow you to zero in on a particular type of service of a particular 
cluster group as well as set how long you are willing to wait in the discovery 
process till finally giving up. The first matching service that it sees 
"flowing" around on the UDP stream is the one it picks and sticks to for that 
and subsequent requests, ensuring UDP is only used when there are no other 
servers to talk to.
+
+Note that EJB clients do not need to use multipulse to find a server. If the 
client knows the URL of a server in the cluster, it may use it and connect 
directly to that server, at which point that server will share the full list of 
its peers.
+
+Multicast Servers with TCP Clients
+
+Note that clients do not need to use multipulse to communicate with servers. 
Servers can use multicast to discover each other, but clients are still free to 
connect to servers in the network using the server's TCP address.
+[source,java]
+----
+Properties p = new Properties();
+p.put(Context.INITIAL_CONTEXT_FACTORY,  
"org.apache.openejb.client.RemoteInitialContextFactory");
+p.put(Context.PROVIDER_URL, "ejbd://192.168.1.30:4201");
+InitialContext remoteContext = new InitialContext(p);
+----
+
+When the client connects, the server will send the URLs of all the servers in 
the group and failover will take place normally.
+
+==== Multipoint
+
+As TCP has no real broadcast functionality to speak of, communication of who 
is in the network is achieved by each server having a physical connection to 
each other server in the network.
+
+To join the network, the server must be configured to know the address of at 
least one server in the network and connect to it. When it does both servers 
will exchange the full list of all the other servers each knows about. Each 
server will then connect to any new servers they've just learned about and 
repeat the processes with those new servers. The end result is that everyone 
has a direct connection to everyone 100% of the time, hence the made-up term 
"multipoint" to describe this situation of each server having multiple 
point-to-point connections which create a fully connected graph.
+
+On the client side things are similar. It needs to know the address of at 
least one server in the network and be able to connect to it. When it does it 
will get the full (and dynamically maintained) list of every server in the 
network. The client doesn't connect to each of those servers immediately, but 
rather consults the list in the event of a failover, using it to decide who to 
connect to next.
+
+The entire process is essentially the art of using a statically maintained 
list to bootstrap getting the more valuable dynamically maintained list.
+
+===== Server Configuration
+
+In the server this list can be specified via the conf/multipoint.properties 
file like so:
+
+[source,bash]
+----
+server      = org.apache.openejb.server.discovery.MultipointDiscoveryAgent
+bind        = 127.0.0.1
+port        = 4212
+disabled    = false
+initialServers = 192.168.1.20:4212, 192.168.1.30:4212, 192.168.1.40:4212
+----
+
+The above configuration shows the server has an port 4212 open for connections 
by other servers for multipoint communication. The initialServers list should 
be a comma separated list of other similar servers on the network. Only one of 
the servers listed is required to be running when this server starts up -- it 
is not required to list all servers in the network.
+
+===== Client Configuration
+
+Configuration in the client is similar, but note that EJB clients do not 
participate directly in multipoint communication and do not connect to the 
multipoint port. The server list is simply a list of the regular ejbd:// urls 
that a client normally uses to connect to a server.
+
+[source,java]
+----
+Properties p = new Properties();
+p.put(Context.INITIAL_CONTEXT_FACTORY, 
"org.apache.openejb.client.RemoteInitialContextFactory");
+p.put(Context.PROVIDER_URL, 
"failover:ejbd://192.168.1.20:4201,ejbd://192.168.1.30:4201");
+InitialContext remoteContext = new InitialContext(p);
+----
+
+Failover can work entirely driven by the server, the client does not need to 
be configured to participate. A client can connect as usual to the server.
+
+[source,java]
+----
+Properties p = new Properties();
+p.put(Context.INITIAL_CONTEXT_FACTORY, 
"org.apache.openejb.client.RemoteInitialContextFactory");
+p.put(Context.PROVIDER_URL, "ejbd://192.168.1.20:4201");
+InitialContext remoteContext = new InitialContext(p);
+----
+
+If the server at 192.168.1.20:4201 supports failover, so will the client.
+
+In this scenario the list of servers used for failover is supplied entirely by 
the server at 192.168.1.20:4201. The server could have aquired the list via 
multicast or multipoint (or both), but this detail is not visible to the client.
+
+===== Considerations
+
+====== Network size
+
+The general disadvantage of this topology is the number of connections 
required. The number of connections for the network of servers is equal to (n * 
n - n) / 2, where n is the number of servers. For example, with 5 servers you 
need 10 connections, with 10 servers you need 45 connections, and with 50 
servers you need 1225 connections. This is of course the number of connections 
across the entire network, each individual server only needs n - 1 connections.
+
+The handling of these sockets is all asynchronous Java NIO code which allows 
the server to handle many connections (all of them) with one thread. From a 
pure threading perspective, the option is extremely efficient with just one 
thread to listen and broadcast to many peers.
+
+====== Double connect
+
+It is possible in this process that two servers learn of each other at the 
same time and each attempts to connect to the other simultaneously, resulting 
in two connections between the same two servers. When this happens both servers 
will detect the extra connection and one of the connections will be dropped and 
one will be kept. In practice this race condition rarely happens and can be 
avoided almost entirely by fanning out server startup by as little as 100 
milliseconds.
+
+===== Recommandation
+
+As mentioned the initialServers is only used for bootstrapping the multipoint 
network. Once running, all servers will dynamically establish direct 
connections with each other and there is no single point of failure.
+
+However to ensure that the bootstrapping process can occur successfully, the 
initialServers property of the conf/multipoint.properties file must be set 
carefully and with a specific server start order in mind. Each server consults 
its initialServers list exactly once in the bootstrapping phase at startup, 
after that time connections are made dynamically.
+
+This means that at least one of the servers listed in initialServers must 
already be running when the server starts or the server might never become 
introduced and connected to all the other servers in the network.

http://git-wip-us.apache.org/repos/asf/tomee-site-generator/blob/972cc356/src/main/jbake/content/admin/configuration/application.adoc
----------------------------------------------------------------------
diff --git a/src/main/jbake/content/admin/configuration/application.adoc 
b/src/main/jbake/content/admin/configuration/application.adoc
new file mode 100755
index 0000000..be43cd2
--- /dev/null
+++ b/src/main/jbake/content/admin/configuration/application.adoc
@@ -0,0 +1,100 @@
+= Application Configuration
+:jbake-date: 2016-03-16
+:jbake-type: page
+:jbake-status: published
+:jbake-tomeepdf:
+
+=== `application.properties`
+
+This file is located in `WEB-INF` for a war and `META-INF` for an ear.
+
+==== `@Asynchronous` configuration
+
+Default pool size for `@Asynchronous` is 5. It can be very small for some 
applications highly relying on
+asynchronism or reactive patterns. Therefore it is possible to customize it 
adding these entries in `application.properties`:
+
+[.table.table-bordered,options="header"]
+|===
+| Name | Default| Description
+| AsynchronousPool.Size | 5 | Core size of the pool
+| AsynchronousPool.CorePoolSize | 5 | Core size of the pool (inherit its 
default from .Size alias)
+| AsynchronousPool.MaximumPoolSize | 5 | Maximum size of the pool
+| AsynchronousPool.QueueSize | 5 | Maximum size of the pool
+| AsynchronousPool.KeepAliveTime | 1 minute | Thread keep alive duration
+| AsynchronousPool.AllowCoreThreadTimeOut | true | Should thread timeout
+| AsynchronousPool.QueueType | LINKED (or SYNCHRONOUS if size == 0) | The type 
of queue of the pool in ARRAY, LINKED, PRIORITY or SYNCHRONOUS (same behavior 
as java implementations of the same name)
+| AsynchronousPool.ShutdownWaitDuration | 1 minute | How many time to wait for 
the pool to shutdown when undeploying the application
+| AsynchronousPool.RejectedExecutionHandlerClass | - | A fully qualified name 
of a `java.util.concurrent.RejectedExecutionHandler`
+|===
+
+==== TimerService and `@Scheduled`
+
+`timerStore.class` allows to switch from the in memory 
(`org.apache.openejb.core.timer.MemoryTimerStore`) timer storage
+for quartz tasks to a custom implementation (using a database or anything for 
instance). Constructor can take a `TransactionManager`
+or nothing.
+
+All quartz properties prefixed with `org.apache.openejb.quartz.` (instead of 
`org.quartz.`) are passthrough to quartz.
+
+==== CDI
+
+The boolean `openejb.cdi.skip-resource-validation` allows to not validate 
resources ie `@EJB` and `@Resource` usages in CDI beans.
+
+All properties understood by OpenWebBeans will also be passthrough to 
OpenWebBeans from this location, see 
http://openwebbeans.apache.org/owbconfig.html[OWB config] for more details.
+
+==== `@WebServiceRef`
+
+[.table.table-bordered,options="header"]
+|===
+| Name | Description
+| cxf.jaxws.client.wsFeatures | Allows to set WSFeature on the client 
injection. Values is a list (comma separated) of resource id in resources.xml 
or fully qualified names.
+|===
+
+==== `@Stateless`
+
+[.table.table-bordered,options="header"]
+|===
+| Name | Description
+| AccessTimeout or Timeout | container timeout
+| CloseTimeout | container timeout
+| BackgroundStartup | Don't create instances in parallel if minimum count is > 
0, default to false
+|===
+
+=== `resources.xml`
+
+`resources.xml` is a tomee.xml using application classloader.
+
+As `tomee.xml` it supports filtering so you can use environment variables and 
system properties, for instance
+to use a MySQL database on OpenShift you can do:
+
+[source,xml]
+----
+<?xml version="1.0" encoding="UTF-8"?>
+<resources>
+  <Resource id="MySQL" aliases="myAppDataSourceName" type="DataSource">
+    JdbcDriver = com.mysql.jdbc.Driver
+    JdbcUrl = 
jdbc:mysql://${OPENSHIFT_MYSQL_DB_HOST}:${OPENSHIFT_MYSQL_DB_PORT}/rmannibucau?tcpKeepAlive=true
+    UserName = ${OPENSHIFT_MYSQL_DB_USERNAME}
+    Password = ${OPENSHIFT_MYSQL_DB_PASSWORD}
+    ValidationQuery = SELECT 1
+    ValidationInterval = 30000
+    NumTestsPerEvictionRun = 5
+    TimeBetweenEvictionRuns = 30 seconds
+    TestWhileIdle = true
+    MaxActive = 200
+  </Resource>
+</resources>
+----
+
+`resources.xml` supports `Resource`, `Service` and `Container`.
+
+==== `resources.xml` mecanism
+
+`resources.xml` resources are still available globally like any `tomee.xml` 
resource.
+
+The actual resource is bound in an application subtree called with the 
application name and a resource facade is bound
+in the global naming tree to be able to route the requests depending the 
application.
+
+Typically if your application is named `myapp` and your resource id is 
`myresource` then instead of being registered
+as `myresource`, it will get registered as `myapp/myresource`.
+
+If you get any ambiguity in resource name matching try to fully qualified your 
resource prefixing it with the application name.

Reply via email to