i)&&(this._instance.pointNow.y>p+o.top)&&(this._instance.pointNow.y0){var f=k+o.left+l-this._instance.pointNow.x;g.scrollLeft(c.Math.max(h-this._amount(l,f),0));n=true}}else{if(this._instance.pointNow.x>k+o.right-l){if(h+i= v1.7.1 http://jquery.com
+ * + aciPlugin >= v1.4.0 https://github.com/dragosu/jquery-aciPlugin
+ */
+
+(function(d,c,e){var b={container:"ul",item:"li",distance:4,handle:"*",disable:"a,input,textarea,select,option,button",child:null,childHolder:'',childHolderSelector:".aciSortableChild",exclude:null,vertical:true,placeholder:'',placeholderSelector:".aciSortablePlaceholder",helper:'',helperSelector:".aciSortableHelper",relative:false,draggable:true,gluedPlaceholder:false,connectDrop:null,dropPosition:null,simpleDrop:null,scroll:80,scrollParent:"window",before:function(g){if(this._instance.options.exclude){var f=this.containerFrom(g);return !f.is(this._instance.options.exclude)&&!g.is(this._instance.options.exclude)}return true},start:function(g,h,f){var i=g.clone();i.children(this._instance.options.container).remove();f.html(i.text())},valid:function(j,h,k,g,l,i){if(this._instance.options.exclude){if(g){return !h.is(this._instance.options.exclude)}else{var f=this.containerFrom(h);return !f.is(this._instance.options.exclude)}}return true},drag:function(g,i,h,f){},create:function(g,f){f.append(this._instance.options.childHolder);return true},remove:function(g,f){f.children(this._instance.options.childHolderSelector).remove()},end:function(h,f,i,g){if(i.parent().length){i.after(h).detach()}g.detach()}};var a={__extend:function(){d.extend(this._instance,{sorting:false,item:null,hoverItem:null,isContainer:false,pointStart:null,pointNow:null,placeholder:null,helper:null,relative:null,children:null,scroll:false,lastCheck:{}})},init:function(){if(this.wasInit()){return}this._instance.jQuery.on("mousedown"+this._instance.nameSpace,this._instance.options.item,this.proxy(function(f){var g=d(f.target);if(!g.is(this._instance.options.handle)||g.is(this._instance.options.disable)){return}if(!g.is(this._instance.options.disable)){f.preventDefault()}if(g.is(this._instance.options.container)){d(c.document.body).css("cursor","no-drop")}else{this._delayStart(f)}})).on("mousemove"+this._instance.nameSpace,this._instance.options.item,this.proxy(function(h){if(this._instance.sorting){h.stopPropagation();this._instance.isContainer=false;var g=this.itemFrom(h.target);if(this._instance.item.has(g).length){this._instance.hoverItem=null}else{if(this._instance.options.dropPosition===null){this._instance.hoverItem=g}else{var f=this.containerFrom(h.target);this._dropPosition(f)}}}this._drag(h)})).on("mousemove"+this._instance.nameSpace,this._instance.options.container,this.proxy(function(g){if(this._instance.sorting){g.stopPropagation();var f=this.containerFrom(g.target);if(!this._instance.item.has(f).length){if(this.isEmpty(f)){this._instance.hoverItem=f;this._instance.isContainer=true}else{this._instance.isContainer=false;if(this._instance.options.dropPosition===null){this._instance.hoverItem=this._closestFrom(g)}else{this._dropPosition(f)}}}}this._drag(g)}));this._initConnect();this._initSimple();d(c.document).bind("mousemove"+this._instance.nameSpace+this._instance.index,this.proxy(function(f){if(this._instance.sorting){this._instance.hoverItem=null;this._drag(f)}})).on("mousemove"+this._instance.nameSpace+this._instance.index,this._instance.options.helperSelector,this.proxy(function(g){if(this._instance.sorting){var f=this._fromCursor(g);if(f){this._instance.jQuery.trigger(d.Event("mousemove",{target:f,pageX:g.pageX,pageY:g.pageY}));g.stopPropagation()}}})).bind("selectstart"+this._instance.nameSpace+this._instance.index,this.proxy(function(f){if(this._instance.sorting){f.preventDefault()}})).bind("mouseup"+this._instance.nameSpace+this._instance.index,this.proxy(function(){if(this._instance.sorting){this._end()}else{this._instance.item=null;d(c.document.body).css("cursor","default")}}));this._super()},_dropPosition:function(f){if(this._instance.options.dropPosition==-1){this._instance.hoverItem=this._firstItem(f)}else{this._instance.hoverItem=this._lastItem(f)}if(!this._instance.hoverItem.length){this._instance.hoverItem=f;this._instance.isContainer=true}},_firstItem:function(f){return f.children(this._instance.options.item).not(this._instance.options.placeholderSelector).first()},_lastItem:function(f){return f.children(this._instance.options.item).not(this._instance.options.placeholderSelector).last()},_closestFrom:function(j){var i=null;var h=d(j.target);if(this._instance.options.vertical){var f=d(c).scrollTop();var g=h.height();h.find(this._instance.options.item).not(this._instance.options.placeholderSelector).each(function(){var k=this.getBoundingClientRect();var l=c.Math.abs(f+k.top+(k.bottom-k.top)/2-j.pageY);if(l');d(c.document.body).append(g);this._instance.item=g;this._instance.placeholder.detach();this._instance.helper.detach();this._end();g.remove();h._start()}},hasItem:function(f){return this._instance.jQuery.has(f).length>0},sortableFrom:function(f){if(this._instance.jQuery.has(f).length){return this._instance.jQuery}if(this._instance.options.connectDrop){return d(f).closest(this._instance.options.connectDrop)}return d()},itemFrom:function(f){return d(f).closest(this._instance.options.item)},containerFrom:function(f){return d(f).closest(this._instance.options.container)},hasChildrens:function(f){return f.children(this._instance.options.container).children(this._instance.options.item).not(this._instance.options.placeholderSelector).length>0},hasContainer:function(f){return f.children(this._instance.options.container).length>0},isEmpty:function(f){return !f.children(this._instance.options.item).not(this._instance.options.placeholderSelector).length},_delayStart:function(h){var g=this.itemFrom(h.target);if(this._call("before",{item:g})){this._instance.item=g;this._instance.pointStart={x:h.pageX,y:h.pageY};if(this._instance.options.relative){var j=d(c).scrollTop();var i=d(c).scrollLeft();var f=this._instance.item.get(0).getBoundingClientRect();this._instance.relative={x:f.left+i-h.pageX,y:f.top+j-h.pageY}}else{this._instance.relative={x:0,y:0}}this._drag(h)}else{d(c.document.body).css("cursor","no-drop")}},_start:function(){this._instance.sorting=true;if(!this._instance.placeholder){this._instance.placeholder=d(this._instance.options.placeholder)}if(!this._instance.helper){this._instance.helper=d(this._instance.options.helper)}this._call("start",{item:this._instance.item,placeholder:this._instance.placeholder,helper:this._instance.helper});if(this._instance.options.gluedPlaceholder){this._instance.item.after(this._instance.placeholder)}d(c.document.body).append(this._instance.helper);d(c.document.body).css("cursor","move")},_minDistance:function(){return(c.Math.abs(this._instance.pointStart.x-this._instance.pointNow.x)>this._instance.options.distance)||(c.Math.abs(this._instance.pointStart.y-this._instance.pointNow.y)>this._instance.options.distance)},_drag:function(f){this._instance.pointNow={x:f.pageX,y:f.pageY};if(this._instance.sorting){this._helper();this._placeholder()}else{if(this._instance.item){if(this._minDistance()){this._start()}}}},_onDrag:function(f){this._call("drag",{item:this._instance.item,placeholder:this._instance.placeholder,isValid:f,helper:this._instance.helper})},_isValid:function(g,f){if(!this._instance.options.draggable&&this.hasItem(this._instance.item)&&(this._instance.isContainer||(this.containerFrom(this._instance.item).get(0)!=this.containerFrom(this._instance.hoverItem).get(0)))){return false}if(this._call("valid",{item:this._instance.item,hover:this._instance.hoverItem,before:f?null:((g===null)?false:g),isContainer:f?true:this._instance.isContainer,placeholder:this._instance.placeholder,helper:this._instance.helper})){d(c.document.body).css("cursor","move");return true}return false},_onCreate:function(){this._onRemove();if(this._instance.hoverItem.is(this._instance.options.exclude)){return false}if(this._isSimple()){return false}if(this._call("create",{item:this._instance.item,hover:this._instance.hoverItem})){this._instance.childItem=this._instance.hoverItem;this._instance.hoverItem=this._instance.hoverItem.children(this._instance.options.childHolderSelector);this._instance.isContainer=true;this._placeholder();return true}return false},_onRemove:function(f){if(this._instance.childItem&&(!f||(f.get(0)!=this._instance.childItem.get(0)))){if(this._instance.placeholder){this._instance.placeholder.detach()}if(!this.hasChildrens(this._instance.childItem)){this._call("remove",{item:this._instance.item,hover:this._instance.childItem})}this._instance.childItem=null}},_wasValid:function(j,h,g){if(this._instance.lastCheck){var i=g?this._instance.lastCheck.check:this._instance.lastCheck.normal;var f=i&&(i.hoverItem.get(0)==this._instance.hoverItem.get(0))&&(i.before===j)&&(i.create===h)&&(i.isContainer==this._instance.isContainer)}this._instance.lastCheck[g?"check":"normal"]={hoverItem:this._instance.hoverItem,before:j,create:h,isContainer:this._instance.isContainer};return f},_isSimple:function(){return this._instance.options.simpleDrop&&this._instance.hoverItem&&this._instance.hoverItem.is(this._instance.options.simpleDrop)},_placeholder:function(){this._instance.pointStart=this._instance.pointNow;if(this._instance.hoverItem){if(this._instance.hoverItem.is(this._instance.options.placeholderSelector)){return}if(this._instance.isContainer){if(this._wasValid(null,false)){return}if(this._isValid(null)){this._instance.hoverItem.append(this._instance.placeholder);this._onDrag(true);return}}else{if(this._instance.hoverItem.get(0)!=this._instance.item.get(0)){var m=false,j=false;var k=this._instance.hoverItem.get(0).getBoundingClientRect();var i=this._instance.hoverItem.children(this._instance.options.container);if(this._instance.options.vertical){var n=d(c).scrollTop();var g=k.bottom-((i.length&&i.is(":visible"))?i.outerHeight(true):0);if(this._instance.options.child&&(this._instance.options.draggable||!this.hasItem(this._instance.item))&&!this.hasChildrens(this._instance.hoverItem)){var h=(g-k.top)*(0.5-this._instance.options.child/200);if((this._instance.pointNow.y>n+k.top+h)&&(this._instance.pointNow.yn+k.left+h)||(this._instance.pointNow.xq)&&(this._instance.pointNow.x>k+o.left)&&(this._instance.pointNow.x0){var f=p+o.top+l-this._instance.pointNow.y;g.scrollTop(c.Math.max(h-this._amount(l,f),0));n=true}}else{if(this._instance.pointNow.y>p+o.bottom-l){if(h+qi)&&(this._instance.pointNow.y>p+o.top)&&(this._instance.pointNow.y0){var f=k+o.left+l-this._instance.pointNow.x;g.scrollLeft(c.Math.max(h-this._amount(l,f),0));n=true}}else{if(this._instance.pointNow.x>k+o.right-l){if(h+i= v1.9.0 http://jquery.com
- * + aciPlugin >= v1.5.1 https://github.com/dragosu/jquery-aciPlugin
- */
-
-/*
- * The aciTree core.
- *
- * A few words about how item data looks like:
- *
- * for a leaf node (a node that does not have any children):
- *
- * {
- * id: 'some_file_ID', // should be unique item ID
- * label: 'This is a File Item', // the item label (text value)
- * inode: false, // FALSE means is a leaf node (can be omitted)
- * icon: 'fileIcon', // CSS class name for the icon (if any), can also be an Array ['CSS class name', background-position-x, background-position-y]
- * disabled: false, // TRUE means the item is disabled (can be omitted)
- * random_prop: 'random 1' // sample user defined property (you can have any number defined)
- * }
- *
- * for a inner node (a node that have at least a children under it):
- *
- * {
- * id: 'some_folder_ID', // should be unique item ID
- * label: 'This is a Folder Item', // the item label (text value)
- * inode: true, // can also be NULL to find at runtime if its an inode (on load will be transformed in a leaf node if there aren't any children)
- * open: false, // if TRUE then the node will be opened when the tree is loaded (can be omitted)
- * icon: 'folderIcon', // CSS class name for the icon (if any), can also be an Array ['CSS class name', background-position-x, background-position-y]
- * disabled: false, // TRUE means the item is disabled (can be omitted)
- * source: 'myDataSource', // the data source name (if any) to read the children from, by default `aciTree.options.ajax` is used
- * branch: [ // a list of children
- * { ... item data ... },
- * { ... item data ... },
- * ...
- * ],
- * random_prop: 'random 2' // sample user defined property (you can have any number defined)
- * }
- *
- * The `branch` array can be empty, in this case the children will be loaded when the node will be opened for the first time.
- *
- * Please note that the item data should be valid (in the expected format). No checking is done and errors can appear on invalid data.
- *
- * One note about a item: a item is always the LI element with the class 'aciTreeLi'.
- * The children of a node are all added under a UL element with the class 'aciTreeUl'.
- *
- * Almost all API functions expect only one item. If you need to process more at once then you'll need to loop between all of them yourself.
- *
- * The `options` parameter for all API methods (when there is one) is a object with the properties (not all are required or used):
- *
- * {
- * uid: string -> operation UID (defaults to `ui`)
- * success: function (item, options) -> callback to be called on success (you can access plugin API with `this` keyword inside the callback)
- * fail: function (item, options) -> callback to be called on fail (you can access plugin API with `this` keyword inside the callback)
- * notify: function (item, options) -> notify callback (internal use for when already in the requested state, will call `success` by default)
- * expand: true/false -> propagate on open/toggle
- * collapse: true/false -> propagate on close/toggle
- * unique: true/false -> should other branches be closed (on open/toggle) ?
- * unanimated: true/false -> if it's TRUE then no animations are to be run (used on open/close/toggle)
- * itemData: object[item data]/array[item data] -> used when adding/updating items
- * }
- *
- * Note: when using the API methods that support the `options` parameter, you will need to use the success/fail callbacks if you need to do
- * any processing after the API call. This because there can be async operations that will complete at a later time and the API methods will
- * exit before the job is actually completed. This will happen when items are loaded with AJAX, on animations and other delayed operations (see _queue).
- *
- */
-
-(function($, window, undefined) {
-
- // default options
-
- var options = {
- // the AJAX options (see jQuery.ajax) where the `success` and `error` are overridden by aciTree
- ajax: {
- url: null, // URL from where to take the data, something like `path/script?nodeId=` (the node ID value will be added for each request)
- dataType: 'json'
- },
- dataSource: null, // a list of data sources to be used (each entry in `aciTree.options.ajax` format)
- rootData: null, // initial ROOT data for the Tree (if NULL then one initial AJAX request is made on init)
- queue: {
- async: 4, // the number of simultaneous async (AJAX) tasks
- interval: 50, // interval [ms] after which to insert a `delay`
- delay: 20 // how many [ms] delay between tasks (after `interval` expiration)
- },
- loaderDelay: 500, // how many msec to wait before showing the main loader ? (on lengthy operations)
- expand: false, // if TRUE then all children of a node are expanded when the node is opened
- collapse: false, // if TRUE then all children of a node are collapsed when the node is closed
- unique: false, // if TRUE then a single tree branch will stay open, the oters are closed when a node is opened
- empty: false, // if TRUE then all children of a node are removed when the node is closed
- show: {// show node/ROOT animation (default is slideDown)
- props: {
- 'height': 'show'
- },
- duration: 'medium',
- easing: 'linear'
- },
- animateRoot: true, // if the ROOT should be animated on init
- hide: {// hide node animation (default is slideUp)
- props: {
- 'height': 'hide'
- },
- duration: 'medium',
- easing: 'linear'
- },
- view: {// scroll item into view animation
- duration: 'medium',
- easing: 'linear'
- },
- // called for each AJAX request when a node needs to be loaded
- // `item` is the item who will be loaded
- // `settings` is the `aciTree.options.ajax` object or an entry from `aciTree.options.dataSource`
- ajaxHook: function(item, settings) {
- // the default implementation changes the URL by adding the item ID at the end
- settings.url += (item ? this.getId(item) : '');
- },
- // called after each item is created but before is inserted into the DOM
- // `parent` is the parent item (can be empty)
- // `item` is the new created item
- // `itemData` is the object used to create the item
- // `level` is the #0 based item level
- itemHook: function(parent, item, itemData, level) {
- // there is no default implementation
- },
- // called for each item to serialize its value
- // `item` is the tree item to be serialized
- // `what` is the option telling what is being serialized
- // `value` is the current serialized value (from the `item`, value type depending of `what`)
- serialize: function(item, what, value) {
- if (typeof what == 'object') {
- return value;
- } else {
- // the default implementation uses a `|` (pipe) character to separate values
- return '|' + value;
- }
- }
- };
-
- // aciTree plugin core
-
- var aciTree_core = {
- // add extra data
- __extend: function() {
- $.extend(this._instance, {
- queue: new this._queue(this, this._instance.options.queue) // the global tree queue
- });
- $.extend(this._private, {
- locked: false, // to tell the tree state
- itemClone: {// keep a clone of the LI for faster tree item creation
- },
- // timeouts for the loader
- loaderHide: null,
- loaderInterval: null,
- // busy delay counter
- delayBusy: 0
- });
- },
- // init the treeview
- init: function(options) {
- options = this._options(options);
- // check if was init already
- if (this.wasInit()) {
- this._trigger(null, 'wasinit', options);
- this._fail(null, options);
- return;
- }
- // check if is locked
- if (this.isLocked()) {
- this._trigger(null, 'locked', options);
- this._fail(null, options);
- return;
- }
- // a way to cancel the operation
- if (!this._trigger(null, 'beforeinit', options)) {
- this._trigger(null, 'initfail', options);
- this._fail(null, options);
- return;
- }
- this._private.locked = true;
- this._instance.jQuery.addClass('aciTree' + this._instance.index).attr('role', 'tree').on('click' + this._instance.nameSpace, '.aciTreeButton', this.proxy(function(e) {
- // process click on button
- var item = this.itemFrom(e.target);
- // skip when busy
- if (!this.isBusy(item)) {
- // tree button pressed
- this.toggle(item, {
- collapse: this._instance.options.collapse,
- expand: this._instance.options.expand,
- unique: this._instance.options.unique
- });
- }
- })).on('mouseenter' + this._instance.nameSpace + ' mouseleave' + this._instance.nameSpace, '.aciTreePush', function(e) {
- // handle the aciTreeHover class
- var element = e.target;
- if (!domApi.hasClass(element, 'aciTreePush')) {
- element = domApi.parentByClass(element, 'aciTreePush');
- }
- domApi.toggleClass(element, 'aciTreeHover', e.type == 'mouseenter');
- }).on('mouseenter' + this._instance.nameSpace + ' mouseleave' + this._instance.nameSpace, '.aciTreeLine', function(e) {
- // handle the aciTreeHover class
- var element = e.target;
- if (!domApi.hasClass(element, 'aciTreeLine')) {
- element = domApi.parentByClass(element, 'aciTreeLine');
- }
- domApi.toggleClass(element, 'aciTreeHover', e.type == 'mouseenter');
- });
- this._initHook();
- // call on success
- var success = this.proxy(function() {
- // call the parent
- this._super();
- this._private.locked = false;
- this._trigger(null, 'init', options);
- this._success(null, options);
- });
- // call on fail
- var fail = this.proxy(function() {
- // call the parent
- this._super();
- this._private.locked = false;
- this._trigger(null, 'initfail', options);
- this._fail(null, options);
- });
- if (this._instance.options.rootData) {
- // the rootData was set, use it to init the tree
- this.loadFrom(null, this._inner(options, {
- success: success,
- fail: fail,
- itemData: this._instance.options.rootData
- }));
- } else if (this._instance.options.ajax.url) {
- // the AJAX url was set, init with AJAX
- this.ajaxLoad(null, this._inner(options, {
- success: success,
- fail: fail
- }));
- } else {
- success.apply(this);
- }
- },
- _initHook: function() {
- // override this to do extra init
- },
- // check locked state
- isLocked: function() {
- return this._private.locked;
- },
- // get a formatted message
- // `raw` is the raw message text (can contain %NUMBER sequences, replaced with values from `params`)
- // `params` is a list of values to be replaced into the message (by #0 based index)
- _format: function(raw, params) {
- if (!(params instanceof Array)) {
- return raw;
- }
- var parts = raw.split(/(%[0-9]+)/gm);
- var compile = '', part, index, last = false, len;
- var test = new window.RegExp('^%[0-9]+$');
- for (var i = 0; i < parts.length; i++) {
- part = parts[i];
- len = part.length;
- if (len) {
- if (!last && test.test(part)) {
- index = window.parseInt(part.substr(1)) - 1;
- if ((index >= 0) && (index < params.length)) {
- compile += params[index];
- continue;
- }
- } else {
- last = false;
- if (part.substr(len - 1) == '%') {
- if (part.substr(len - 2) != '%%') {
- last = true;
- }
- part = part.substr(0, len - 1);
- }
- }
- compile += part;
- }
- }
- return compile;
- },
- // low level DOM functions
- _coreDOM: {
- // set as leaf node
- leaf: function(items) {
- domApi.addRemoveListClass(items.toArray(), 'aciTreeLeaf', ['aciTreeInode', 'aciTreeInodeMaybe', 'aciTreeOpen'], function(node) {
- node.firstChild.removeAttribute('aria-expanded');
- });
- },
- // set as inner node
- inode: function(items, branch) {
- domApi.addRemoveListClass(items.toArray(), branch ? 'aciTreeInode' : 'aciTreeInodeMaybe', 'aciTreeLeaf', function(node) {
- node.firstChild.setAttribute('aria-expanded', false);
- });
- },
- // set as open/closed
- toggle: function(items, state) {
- domApi.toggleListClass(items.toArray(), 'aciTreeOpen', state, function(node) {
- node.firstChild.setAttribute('aria-expanded', state);
- });
- },
- // set odd/even classes
- oddEven: function(items, odd) {
- var list = items.toArray();
- for (var i = 0; i < list.length; i++) {
- domApi.addRemoveClass(list[i], odd ? 'aciTreeOdd' : 'aciTreeEven', odd ? 'aciTreeEven' : 'aciTreeOdd');
- odd = !odd;
- }
- }
- },
- // a small queue implementation
- // `context` the context to be used with `callback.call`
- // `options` are the queue options
- _queue: function(context, options) {
- var locked = false;
- var fifo = [], fifoAsync = [];
- var load = 0, loadAsync = 0, schedule = 0, stack = 0;
- // run the queue
- var run = function() {
- if (locked) {
- stack--;
- return;
- }
- var now = new window.Date().getTime();
- if (schedule > now) {
- stack--;
- return;
- }
- var callback, async = false;
- if (load < options.async * 2) {
- // get the next synchronous callback
- callback = fifo.shift();
- }
- if (!callback && (loadAsync < options.async)) {
- // get the next async callback
- callback = fifoAsync.shift();
- async = true;
- }
- if (callback) {
- // run the callback
- if (async) {
- loadAsync++;
- callback.call(context, function() {
- loadAsync--;
- });
- if (stack < 40) {
- stack++;
- run();
- }
- } else {
- load++;
- callback.call(context, function() {
- if (now - schedule > options.interval) {
- schedule = now + options.delay;
- }
- load--;
- if (stack < 40) {
- stack++;
- run();
- }
- });
- }
- }
- stack--;
- };
- var interval = [];
- // start the queue
- var start = function() {
- for (var i = 0; i < 4; i++) {
- interval[i] = window.setInterval(function() {
- if (stack < 20) {
- stack++;
- run();
- }
- }, 10);
- }
- };
- // stop the queue
- var stop = function() {
- for (var i = 0; i < interval.length; i++) {
- window.clearInterval(interval[i]);
- }
- };
- start();
- // init the queue
- this.init = function() {
- this.destroy();
- start();
- return this;
- };
- // push `callback` function (complete) for later call
- // `async` tells if is async callback
- this.push = function(callback, async) {
- if (!locked) {
- if (async) {
- fifoAsync.push(callback);
- } else {
- fifo.push(callback);
- }
- }
- return this;
- };
- // test if busy
- this.busy = function() {
- return (load != 0) || (loadAsync != 0) || (fifo.length != 0) || (fifoAsync.length != 0);
- };
- // destroy queue
- this.destroy = function() {
- locked = true;
- stop();
- fifo = [];
- fifoAsync = [];
- load = 0;
- loadAsync = 0;
- schedule = 0;
- stack = 0;
- locked = false;
- return this;
- };
- },
- // used with a `queue` to execute something at the end
- // `endCallback` function (complete) is the callback called at the end
- _task: function(queue, endCallback) {
- var counter = 0, finish = false;
- // push a `callback` function (complete) for later call
- this.push = function(callback, async) {
- counter++;
- queue.push(function(complete) {
- var context = this;
- callback.call(this, function() {
- counter--;
- if ((counter < 1) && !finish) {
- finish = true;
- endCallback.call(context, complete);
- } else {
- complete();
- }
- });
- }, async);
- };
- },
- // helper function to extend the `options` object
- // `object` the initial options object
- // _success, _fail, _notify are callbacks or string (the event name to be triggered)
- // `item` is the item to trigger events for
- _options: function(object, _success, _fail, _notify, item) {
- // options object (need to be in this form for all API functions
- // that have the `options` parameter, not all properties are required)
- var options = $.extend({
- uid: 'ui',
- success: null, // success callback
- fail: null, // fail callback
- notify: null, // notify callback (internal use for when already in the requested state)
- expand: this._instance.options.expand, // propagate (on open)
- collapse: this._instance.options.collapse, // propagate (on close)
- unique: this._instance.options.unique, // keep a single branch open (on open)
- unanimated: false, // unanimated (open/close/toggle)
- itemData: {
- } // items data (object) or a list (array) of them (used when creating branches)
- },
- object);
- var success = _success ? ((typeof _success == 'string') ? function() {
- this._trigger(item, _success, options);
- } : _success) : null;
- var fail = _fail ? ((typeof _fail == 'string') ? function() {
- this._trigger(item, _fail, options);
- } : _fail) : null;
- var notify = _notify ? ((typeof _notify == 'string') ? function() {
- this._trigger(item, _notify, options);
- } : _notify) : null;
- if (success) {
- // success callback
- if (object && object.success) {
- options.success = function() {
- success.apply(this, arguments);
- object.success.apply(this, arguments);
- };
- } else {
- options.success = success;
- }
- }
- if (fail) {
- // fail callback
- if (object && object.fail) {
- options.fail = function() {
- fail.apply(this, arguments);
- object.fail.apply(this, arguments);
- };
- } else {
- options.fail = fail;
- }
- }
- if (notify) {
- // notify callback
- if (object && object.notify) {
- options.notify = function() {
- notify.apply(this, arguments);
- object.notify.apply(this, arguments);
- };
- } else if (!options.notify && object && object.success) {
- options.notify = function() {
- notify.apply(this, arguments);
- object.success.apply(this, arguments);
- };
- } else {
- options.notify = notify;
- }
- } else if (!options.notify && object && object.success) {
- // by default, run success callback
- options.notify = object.success;
- }
- return options;
- },
- // helper for passing `options` object to inner methods
- // the callbacks are removed and `override` can be used to update properties
- _inner: function(options, override) {
- // removing success/fail/notify from options
- return $.extend({
- }, options, {
- success: null,
- fail: null,
- notify: null
- },
- override);
- },
- // trigger the aciTree events on the tree container
- _trigger: function(item, eventName, options) {
- var event = $.Event('acitree');
- if (!options) {
- options = this._options();
- }
- this._instance.jQuery.trigger(event, [this, item, eventName, options]);
- return !event.isDefaultPrevented();
- },
- // call on success
- _success: function(item, options) {
- if (options && options.success) {
- options.success.call(this, item, options);
- }
- },
- // call on fail
- _fail: function(item, options) {
- if (options && options.fail) {
- options.fail.call(this, item, options);
- }
- },
- // call on notify (should be same as `success` but called when already in the requested state)
- _notify: function(item, options) {
- if (options && options.notify) {
- options.notify.call(this, item, options);
- }
- },
- // delay callback on busy item
- _delayBusy: function(item, callback) {
- if ((this._private.delayBusy < 10) && this.isBusy(item)) {
- this._private.delayBusy++;
- window.setTimeout(this.proxy(function() {
- this._delayBusy.call(this, item, callback);
- this._private.delayBusy--;
- }), 10);
- return;
- }
- callback.apply(this);
- },
- // return the data source for item
- // defaults to `aciTree.options.ajax` if not set on the item/his parents
- _dataSource: function(item) {
- var dataSource = this._instance.options.dataSource;
- if (dataSource) {
- var data = this.itemData(item);
- if (data && data.source && dataSource[data.source]) {
- return dataSource[data.source];
- }
- var parent;
- do {
- parent = this.parent(item);
- data = this.itemData(parent);
- if (data && data.source && dataSource[data.source]) {
- return dataSource[data.source];
- }
- } while (parent.length);
- }
- return this._instance.options.ajax;
- },
- // process item loading with AJAX
- // `item` can be NULL to load the ROOT
- // loaded data need to be array of item objects
- // each item can have children (defined as `itemData.branch` - array of item data objects)
- ajaxLoad: function(item, options) {
- if (item && this.isBusy(item)) {
- // delay the load if busy
- this._delayBusy(item, function() {
- this.ajaxLoad(item, options);
- });
- return;
- }
- options = this._options(options, function() {
- this._loading(item);
- this._trigger(item, 'loaded', options);
- }, function() {
- this._loading(item);
- this._trigger(item, 'loadfail', options);
- }, function() {
- this._loading(item);
- this._trigger(item, 'wasloaded', options);
- });
- if (!item || this.isInode(item)) {
- // add the task to the queue
- this._instance.queue.push(function(complete) {
- // a way to cancel the operation
- if (!this._trigger(item, 'beforeload', options)) {
- this._fail(item, options);
- complete();
- return;
- }
- this._loading(item, true);
- if (this.wasLoad(item)) {
- // was load already
- this._notify(item, options);
- complete();
- return;
- }
- // ensure we work on a copy of the dataSource object
- var settings = $.extend({
- }, this._dataSource(item));
- // call the `aciTree.options.ajaxHook`
- this._instance.options.ajaxHook.call(this, item, settings);
- // loaded data need to be array of item objects
- settings.success = this.proxy(function(itemList) {
- if (itemList && (itemList instanceof Array) && itemList.length) {
- // the AJAX returned some items
- var process = function() {
- if (this.wasLoad(item)) {
- this._notify(item, options);
- complete();
- } else {
- // create a branch from `itemList`
- this._createBranch(item, this._inner(options, {
- success: function() {
- this._success(item, options);
- complete();
- },
- fail: function() {
- this._fail(item, options);
- complete();
- },
- itemData: itemList
- }));
- }
- };
- if (!item || this.isInode(item)) {
- process.apply(this);
- } else {
- // change the item to inode, then load
- this.setInode(item, this._inner(options, {
- success: process,
- fail: options.fail
- }));
- }
- } else {
- // the AJAX response was not just right (or not a inode)
- var process = function() {
- this._fail(item, options);
- complete();
- };
- if (!item || this.isLeaf(item)) {
- process.apply(this);
- } else {
- // change the item to leaf
- this.setLeaf(item, this._inner(options, {
- success: process,
- fail: process
- }));
- }
- }
- });
- settings.error = this.proxy(function() {
- // AJAX failed
- this._fail(item, options);
- complete();
- });
- $.ajax(settings);
- }, true);
- } else {
- this._fail(item, options);
- }
- },
- // process item loading
- // `item` can be NULL to load the ROOT
- // `options.itemData` need to be array of item objects
- // each item can have children (defined as `itemData.branch` - array of item data objects)
- loadFrom: function(item, options) {
- if (item && this.isBusy(item)) {
- // delay the load if busy
- this._delayBusy(item, function() {
- this.loadFrom(item, options);
- });
- return;
- }
- options = this._options(options, function() {
- this._loading(item);
- this._trigger(item, 'loaded', options);
- }, function() {
- this._loading(item);
- this._trigger(item, 'loadfail', options);
- }, function() {
- this._loading(item);
- this._trigger(item, 'wasloaded', options);
- });
- if (!item || this.isInode(item)) {
- // a way to cancel the operation
- if (!this._trigger(item, 'beforeload', options)) {
- this._fail(item, options);
- return;
- }
- this._loading(item, true);
- if (this.wasLoad(item)) {
- // was load already
- this._notify(item, options);
- return;
- }
- // data need to be array of item objects
- if (options.itemData && (options.itemData instanceof Array) && options.itemData.length) {
- // create the branch from `options.itemData`
- var process = function() {
- if (this.wasLoad(item)) {
- this._notify(item, options);
- } else {
- this._createBranch(item, options);
- }
- };
- if (!item || this.isInode(item)) {
- process.apply(this);
- } else {
- // change the item to inode, then create children
- this.setInode(item, this._inner(options, {
- success: process,
- fail: options.fail
- }));
- }
- } else {
- // this is not a inode
- if (!item || this.isLeaf(item)) {
- this._fail(item, options);
- } else {
- // change the item to leaf
- this.setLeaf(item, this._inner(options, {
- success: options.fail,
- fail: options.fail
- }));
- }
- }
- } else {
- this._fail(item, options);
- }
- },
- // unload item
- // `item` can be NULL to unload the entire tree
- unload: function(item, options) {
- options = this._options(options, function() {
- this._loading(item);
- this._trigger(item, 'unloaded', options);
- }, function() {
- this._loading(item);
- this._trigger(item, 'unloadfail', options);
- }, function() {
- this._loading(item);
- this._trigger(item, 'notloaded', options);
- });
- if (!item || this.isInode(item)) {
- // a way to cancel the operation
- if (!this._trigger(item, 'beforeunload', options)) {
- this._fail(item, options);
- return;
- }
- this._loading(item, true);
- if (!this.wasLoad(item)) {
- // if was not loaded
- this._notify(item, options);
- return;
- }
- // first check each children
- var cancel = false;
- var children = this.children(item, true, true);
- children.each(this.proxy(function(element) {
- var item = $(element);
- if (this.isInode(item)) {
- if (this.isOpen(item)) {
- // a way to cancel the operation
- if (!this._trigger(item, 'beforeclose', options)) {
- cancel = true;
- return false;
- }
- }
- if (this.wasLoad(item)) {
- // a way to cancel the operation
- if (!this._trigger(item, 'beforeunload', options)) {
- cancel = true;
- return false;
- }
- }
- }
- // a way to cancel the operation
- if (!this._trigger(item, 'beforeremove', options)) {
- cancel = true;
- return false;
- }
- }, true));
- if (cancel) {
- // it was canceled
- this._fail(item, options);
- return;
- }
- var process = function() {
- children.each(this.proxy(function(element) {
- // trigger the events before DOM changes
- var item = $(element);
- if (this.isInode(item)) {
- if (this.isOpen(item)) {
- this._trigger(item, 'closed', options);
- }
- if (this.wasLoad(item)) {
- this._trigger(item, 'unloaded', options);
- }
- }
- this._trigger(item, 'removed', options);
- }, true));
- };
- // process the child remove
- if (item) {
- if (this.isOpen(item)) {
- // first close the item, then remove children
- this.close(item, this._inner(options, {
- success: function() {
- process.call(this);
- this._removeContainer(item);
- this._success(item, options);
- },
- fail: options.fail
- }));
- } else {
- process.call(this);
- this._removeContainer(item);
- this._success(item, options);
- }
- } else {
- // unload the ROOT
- this._animate(item, false, !this._instance.options.animateRoot || options.unanimated, function() {
- process.call(this);
- this._removeContainer();
- this._success(item, options);
- });
- }
- } else {
- this._fail(item, options);
- }
- },
- // remove item
- remove: function(item, options) {
- if (this.isItem(item)) {
- if (this.hasSiblings(item, true)) {
- options = this._options(options, function() {
- if (this.isOpenPath(item)) {
- // if the parents are opened (visible) update the item states
- domApi.removeClass(item[0], 'aciTreeVisible');
- this._setOddEven(item);
- }
- this._trigger(item, 'removed', options);
- }, 'removefail', null, item);
- // a way to cancel the operation
- if (!this._trigger(item, 'beforeremove', options)) {
- this._fail(item, options);
- return;
- }
- if (this.wasLoad(item)) {
- // unload the inode then remove
- this.unload(item, this._inner(options, {
- success: function() {
- this._success(item, options);
- this._removeItem(item);
- },
- fail: options.fail
- }));
- } else {
- // just remove the item
- this._success(item, options);
- this._removeItem(item);
- }
- } else {
- var parent = this.parent(item);
- if (parent.length) {
- this.setLeaf(parent, options);
- } else {
- this.unload(null, options);
- }
- }
- } else {
- this._trigger(item, 'removefail', options)
- this._fail(item, options);
- }
- },
- // open item children
- _openChildren: function(item, options) {
- if (options.expand) {
- var queue = this._instance.queue;
- // process the children inodes
- this.inodes(this.children(item)).each(function() {
- var item = $(this);
- // queue node opening
- queue.push(function(complete) {
- this.open(item, this._inner(options));
- complete();
- });
- });
- queue.push(function(complete) {
- this._success(item, options);
- complete();
- });
- } else {
- this._success(item, options);
- }
- },
- // process item open
- _openItem: function(item, options) {
- if (!options.unanimated && !this.isVisible(item)) {
- options.unanimated = true;
- }
- if (options.unique) {
- // close other opened nodes
- this.closeOthers(item);
- options.unique = false;
- }
- // open the node
- this._coreDOM.toggle(item, true);
- // (temporarily) update children states
- this._setOddEvenChildren(item);
- this._animate(item, true, options.unanimated, function() {
- this._openChildren(item, options);
- });
- },
- // open item and his children if requested
- open: function(item, options) {
- options = this._options(options, function() {
- if (this.isOpenPath(item)) {
- // if all parents are open, update the items after
- this._updateVisible(item);
- this._setOddEven(item);
- }
- this._trigger(item, 'opened', options);
- }, 'openfail', 'wasopened', item);
- if (this.isInode(item)) {
- // a way to cancel the operation
- if (!this._trigger(item, 'beforeopen', options)) {
- this._fail(item, options);
- return;
- }
- if (this.isOpen(item)) {
- options.success = options.notify;
- // propagate/open children (if required)
- this._openChildren(item, options);
- } else {
- if (this.wasLoad(item)) {
- this._openItem(item, options);
- } else {
- // try to load the node, then open
- this.ajaxLoad(item, this._inner(options, {
- success: function() {
- this._openItem(item, options);
- },
- fail: options.fail
- }));
- }
- }
- } else {
- this._fail(item, options);
- }
- },
- // close item children
- _closeChildren: function(item, options) {
- if (this._instance.options.empty) {
- // unload on close
- options.unanimated = true;
- this.unload(item, options);
- } else if (options.collapse) {
- var queue = this._instance.queue;
- // process the children inodes
- this.inodes(this.children(item)).each(function() {
- var item = $(this);
- // queue node close
- queue.push(function(complete) {
- this.close(item, this._inner(options, {
- unanimated: true
- }));
- complete();
- });
- });
- queue.push(function(complete) {
- this._success(item, options);
- complete();
- });
- } else {
- this._success(item, options);
- }
- },
- // process item close
- _closeItem: function(item, options) {
- if (!options.unanimated && !this.isVisible(item)) {
- options.unanimated = true;
- }
- // close the item
- this._coreDOM.toggle(item, false);
- this._animate(item, false, options.unanimated, function() {
- this._closeChildren(item, options);
- });
- },
- // close item and his children if requested
- close: function(item, options) {
- options = this._options(options, function() {
- if (this.isOpenPath(item)) {
- // if all parents are open, update the items after
- this._updateVisible(item);
- this._setOddEven(item);
- }
- this._trigger(item, 'closed', options);
- }, 'closefail', 'wasclosed', item);
- if (this.isInode(item)) {
- // a way to cancel the operation
- if (!this._trigger(item, 'beforeclose', options)) {
- this._fail(item, options);
- return;
- }
- if (this.isOpen(item)) {
- this._closeItem(item, options);
- } else if (this.wasLoad(item)) {
- options.success = options.notify;
- // propagate/close/empty children (if required)
- this._closeChildren(item, options);
- } else {
- this._notify(item, options);
- }
- } else {
- this._fail(item, options);
- }
- },
- // update visible state
- _updateVisible: function(item) {
- if (this.isOpenPath(item)) {
- if (!this.isHidden(item)) {
- // if open parents and not hidden
- domApi.addClass(item[0], 'aciTreeVisible');
- if (this.isOpen(item)) {
- // process children
- domApi.children(item[0], false, this.proxy(function(node) {
- if (!domApi.hasClass(node, 'aciTreeVisible')) {
- this._updateVisible($(node));
- }
- }));
- } else {
- // children are not visible
- domApi.children(item[0], true, function(node) {
- return domApi.removeClass(node, 'aciTreeVisible') ? true : null;
- });
- }
- }
- } else if (domApi.removeClass(item[0], 'aciTreeVisible')) {
- domApi.children(item[0], true, function(node) {
- return domApi.removeClass(node, 'aciTreeVisible') ? true : null;
- });
- }
- },
- // keep just one branch open
- closeOthers: function(item, options) {
- options = this._options(options);
- if (this.isItem(item)) {
- var queue = this._instance.queue;
- // exclude the item and his parents
- var exclude = item.add(this.path(item)).add(this.children(item, true));
- // close all other open nodes
- this.inodes(this.children(null, true, true), true).not(exclude).each(function() {
- var item = $(this);
- // add node to close queue
- queue.push(function(complete) {
- this.close(item, this._inner(options));
- complete();
- });
- });
- queue.push(function(complete) {
- this._success(item, options);
- complete();
- });
- } else {
- this._fail(item, options);
- }
- },
- // toggle item
- toggle: function(item, options) {
- options = this._options(options, 'toggled', 'togglefail', null, item);
- if (this.isInode(item)) {
- // a way to cancel the operation
- if (!this._trigger(item, 'beforetoggle', options)) {
- this._fail(item, options);
- return;
- }
- if (this.isOpen(item)) {
- this.close(item, options);
- } else {
- this.open(item, options);
- }
- } else {
- this._fail(item, options);
- }
- },
- // get item path starting from the top parent (ROOT)
- // when `reverse` is TRUE returns the path in reverse order
- path: function(item, reverse) {
- if (item) {
- var parent = item[0], list = [];
- while (parent = domApi.parent(parent)) {
- list.push(parent);
- }
- return reverse ? $(list) : $(list.reverse());
- }
- return $([]);
- },
- // test if item is in view
- // when `center` is TRUE will test if is centered in view
- isVisible: function(item, center) {
- if (item && domApi.hasClass(item[0], 'aciTreeVisible')) {
- // the item path need to be open
- var rect = this._instance.jQuery[0].getBoundingClientRect();
- var size = item[0].firstChild;
- var test = size.getBoundingClientRect();
- var height = size.offsetHeight;
- var offset = center ? (rect.bottom - rect.top) / 2 : 0;
- if ((test.bottom - height < rect.top + offset) || (test.top + height > rect.bottom - offset)) {
- // is out of view
- return false;
- }
- return true;
- }
- return false;
- },
- // open path to item
- openPath: function(item, options) {
- options = this._options(options);
- if (this.isItem(item)) {
- var queue = this._instance.queue;
- // process closed inodes
- this.inodes(this.path(item), false).each(function() {
- var item = $(this);
- // add node to open queue
- queue.push(function(complete) {
- this.open(item, this._inner(options));
- complete();
- });
- });
- queue.push(function(complete) {
- this._success(item, options);
- complete();
- });
- } else {
- this._fail(item, options);
- }
- },
- // test if path to item is open
- isOpenPath: function(item) {
- var parent = this.parent(item);
- return parent[0] ? this.isOpen(parent) && domApi.hasClass(parent[0], 'aciTreeVisible') : true;
- },
- // get animation speed vs. offset size
- // `speed` is the raw speed
- // `totalSize` is the available size
- // `required` is the offset used for calculations
- _speedFraction: function(speed, totalSize, required) {
- if ((required < totalSize) && totalSize) {
- var numeric = parseInt(speed);
- if (isNaN(numeric)) {
- // predefined string values
- switch (speed) {
- case 'slow':
- numeric = 600;
- break;
- case 'medium':
- numeric = 400;
- break;
- case 'fast':
- numeric = 200;
- break;
- default:
- return speed;
- }
- }
- return numeric * required / totalSize;
- }
- return speed;
- },
- // bring item in view
- // `options.center` says if should be centered in view
- setVisible: function(item, options) {
- options = this._options(options, 'visible', 'visiblefail', 'wasvisible', item);
- if (this.isItem(item)) {
- // a way to cancel the operation
- if (!this._trigger(item, 'beforevisible', options)) {
- this._fail(item, options);
- return;
- }
- if (this.isVisible(item)) {
- // is visible already
- this._notify(item, options);
- return;
- }
- var process = function() {
- // compute position with getBoundingClientRect
- var rect = this._instance.jQuery[0].getBoundingClientRect();
- var size = item[0].firstChild;
- var test = size.getBoundingClientRect();
- var height = size.offsetHeight;
- var offset = options.center ? (rect.bottom - rect.top) / 2 : 0;
- if (test.bottom - height < rect.top + offset) {
- // item somewhere before the first visible
- var diff = rect.top + offset - test.bottom + height;
- if (!options.unanimated && this._instance.options.view) {
- this._instance.jQuery.stop(true).animate({
- scrollTop: this._instance.jQuery.scrollTop() - diff
- },
- {
- duration: this._speedFraction(this._instance.options.view.duration, rect.bottom - rect.top, diff),
- easing: this._instance.options.view.easing,
- complete: this.proxy(function() {
- this._success(item, options);
- })
- });
- } else {
- this._instance.jQuery.stop(true)[0].scrollTop = this._instance.jQuery.scrollTop() - diff;
- this._success(item, options);
- }
- } else if (test.top + height > rect.bottom - offset) {
- // item somewhere after the last visible
- var diff = test.top - rect.bottom + offset + height;
- if (!options.unanimated && this._instance.options.view) {
- this._instance.jQuery.stop(true).animate({
- scrollTop: this._instance.jQuery.scrollTop() + diff
- },
- {
- duration: this._speedFraction(this._instance.options.view.duration, rect.bottom - rect.top, diff),
- easing: this._instance.options.view.easing,
- complete: this.proxy(function() {
- this._success(item, options);
- })
- });
- } else {
- this._instance.jQuery.stop(true)[0].scrollTop = this._instance.jQuery.scrollTop() + diff;
- this._success(item, options);
- }
- } else {
- this._success(item, options);
- }
- };
- if (this.hasParent(item)) {
- // first we need to open the path to item
- this.openPath(item, this._inner(options, {
- success: process,
- fail: options.fail
- }));
- } else {
- process.apply(this);
- }
- } else {
- this._fail(item, options);
- }
- },
- // test if item has parent
- hasParent: function(item) {
- return this.parent(item).length > 0;
- },
- // get item parent
- parent: function(item) {
- return item ? $(domApi.parent(item[0])) : $([]);
- },
- // get item top (ROOT) parent
- topParent: function(item) {
- return this.path(item).eq(0);
- },
- // create tree branch
- // `options.itemData` need to be in the same format as for .append
- _createBranch: function(item, options) {
- var total = 0;
- var count = function(itemList) {
- var itemData;
- for (var i = 0; i < itemList.length; i++) {
- itemData = itemList[i];
- if (itemData.branch && (itemData.branch instanceof Array) && itemData.branch.length) {
- count(itemData.branch);
- }
- }
- total++;
- };
- count(options.itemData);
- var index = 0;
- var complete = this.proxy(function() {
- index++;
- if (index >= total) {
- this._success(item, options);
- }
- });
- var process = this.proxy(function(node, itemList) {
- if (node) {
- // set it as a inode
- domApi.addRemoveClass(node[0], 'aciTreeInode', 'aciTreeInodeMaybe');
- }
- // use .append to add new items
- this.append(node, this._inner(options, {
- success: function(item, options) {
- var itemData;
- for (var i = 0; i < options.itemData.length; i++) {
- itemData = options.itemData[i];
- // children need to be array of item objects
- if (itemData.branch && (itemData.branch instanceof Array) && itemData.branch.length) {
- process(options.items.eq(i), itemData.branch);
- }
- if (itemData.open) {
- // open the item is requuested
- this.open(options.items.eq(i), this._inner(options, {
- itemData: null,
- items: null
- }));
- }
- }
- complete();
- },
- fail: options.fail,
- itemData: itemList
- }));
- });
- process(item, options.itemData);
- },
- // get first/last items
- _getFirstLast: function(parent) {
- if (!parent) {
- parent = this._instance.jQuery;
- }
- return $(domApi.withAnyClass(domApi.children(parent[0]), ['aciTreeFirst', 'aciTreeLast']));
- },
- // update first/last items
- _setFirstLast: function(parent, clear) {
- if (clear) {
- domApi.removeListClass(clear.toArray(), ['aciTreeFirst', 'aciTreeLast']);
- }
- var first = this.first(parent);
- if (first[0]) {
- domApi.addClass(first[0], 'aciTreeFirst');
- domApi.addClass(this.last(parent)[0], 'aciTreeLast');
- }
- },
- // update odd/even state
- _setOddEven: function(items) {
- // consider only visible items
- var visible;
- if (this._instance.jQuery[0].getElementsByClassName) {
- visible = this._instance.jQuery[0].getElementsByClassName('aciTreeVisible');
- visible = visible ? window.Array.prototype.slice.call(visible) : [];
- } else {
- visible = $(domApi.children(this._instance.jQuery[0], true, function(node) {
- return this.hasClass(node, 'aciTreeVisible') ? true : null;
- }));
- }
- var odd = true;
- if (visible.length) {
- var index = 0;
- if (items) {
- // search the item to start with (by index)
- items.each(function() {
- if (visible.indexOf) {
- var found = visible.indexOf(this);
- if (found != -1) {
- index = window.Math.min(found, index);
- }
- } else {
- for (var i = 0; i < visible.length; i++) {
- if (visible[i] === this) {
- index = window.Math.min(i, index);
- break;
- }
- }
- }
- });
- index = window.Math.max(index - 1, 0);
- }
- if (index > 0) {
- // determine with what to start with (odd/even)
- var first = visible[index];
- if (domApi.hasClass(first, 'aciTreOdd')) {
- odd = false;
- }
- // process only after index
- visible = visible.slice(index + 1);
- }
- }
- this._coreDOM.oddEven($(visible), odd);
- },
- // update odd/even state for direct children
- _setOddEvenChildren: function(item) {
- var odd = domApi.hasClass(item[0], 'aciTreeOdd');
- var children = this.children(item);
- this._coreDOM.oddEven(children, !odd);
- },
- // process item before inserting into the DOM
- _itemHook: function(parent, item, itemData, level) {
- if (this._instance.options.itemHook) {
- this._instance.options.itemHook.apply(this, arguments);
- }
- },
- // create item by `itemData`
- // `level` is the #0 based item level
- _createItem: function(itemData, level) {
- if (this._private.itemClone[level]) {
- var li = this._private.itemClone[level].cloneNode(true);
- var line = li.firstChild;
- var icon = line;
- for (var i = 0; i < level; i++) {
- icon = icon.firstChild;
- }
- icon = icon.firstChild.lastChild.firstChild;
- var text = icon.nextSibling;
- } else {
- var li = window.document.createElement('LI');
- li.setAttribute('role', 'presentation');
- var line = window.document.createElement('DIV');
- li.appendChild(line);
- line.setAttribute('tabindex', -1);
- line.setAttribute('role', 'treeitem');
- line.setAttribute('aria-selected', false);
- line.className = 'aciTreeLine';
- var last = line, branch;
- for (var i = 0; i < level; i++) {
- branch = window.document.createElement('DIV');
- last.appendChild(branch);
- branch.className = 'aciTreeBranch aciTreeLevel' + i;
- last = branch;
- }
- var entry = window.document.createElement('DIV');
- last.appendChild(entry);
- entry.className = 'aciTreeEntry';
- var button = window.document.createElement('SPAN');
- entry.appendChild(button);
- button.className = 'aciTreeButton';
- var push = window.document.createElement('SPAN');
- button.appendChild(push);
- push.className = 'aciTreePush';
- push.appendChild(window.document.createElement('SPAN'));
- var item = window.document.createElement('SPAN');
- entry.appendChild(item);
- item.className = 'aciTreeItem';
- var icon = window.document.createElement('SPAN');
- item.appendChild(icon);
- var text = window.document.createElement('SPAN');
- item.appendChild(text);
- text.className = 'aciTreeText';
- this._private.itemClone[level] = li.cloneNode(true);
- }
- li.className = 'aciTreeLi' + (itemData.inode || (itemData.inode === null) ? (itemData.inode || (itemData.branch && itemData.branch.length) ? ' aciTreeInode' : ' aciTreeInodeMaybe') : ' aciTreeLeaf') + ' aciTreeLevel' + level + (itemData.disabled ? ' aciTreeDisabled' : '');
- line.setAttribute('aria-level', level + 1);
- if (itemData.inode || (itemData.inode === null)) {
- line.setAttribute('aria-expanded', false);
- }
- if (itemData.icon) {
- if (itemData.icon instanceof Array) {
- icon.className = 'aciTreeIcon ' + itemData.icon[0];
- icon.style.backgroundPosition = itemData.icon[1] + 'px ' + itemData.icon[2] + 'px';
- } else {
- icon.className = 'aciTreeIcon ' + itemData.icon;
- }
- } else {
- icon.parentNode.removeChild(icon);
- }
- text.innerHTML = itemData.label;
- var $li = $(li);
- $li.data('itemData' + this._instance.nameSpace, $.extend({
- }, itemData, {
- branch: itemData.branch && itemData.branch.length
- }));
- return $li;
- },
- // remove item
- _removeItem: function(item) {
- var parent = this.parent(item);
- item.remove();
- // update sibling state
- this._setFirstLast(parent.length ? parent : null);
- },
- // create & add one or more items
- // `ul`, `before` and `after` are set depending on the caller
- // `itemData` need to be array of objects or just an object (one item)
- // `level` is the #0 based level
- // `callback` function (items) is called at the end of the operation
- _createItems: function(ul, before, after, itemData, level, callback) {
- var items = [], fragment = window.document.createDocumentFragment();
- var task = new this._task(this._instance.queue, function(complete) {
- items = $(items);
- if (items.length) {
- // add the new items
- if (ul) {
- ul[0].appendChild(fragment);
- } else if (before) {
- before[0].parentNode.insertBefore(fragment, before[0]);
- } else if (after) {
- after[0].parentNode.insertBefore(fragment, after[0].nextSibling);
- }
- }
- callback.call(this, items);
- complete();
- });
- if (itemData) {
- this._loader(true);
- var parent;
- if (ul) {
- parent = this.itemFrom(ul);
- } else if (before) {
- parent = this.parent(before);
- } else if (after) {
- parent = this.parent(after);
- }
- if (itemData instanceof Array) {
- // this is a list of items
- for (var i = 0; i < itemData.length; i++) {
- (function(itemData) {
- task.push(function(complete) {
- var item = this._createItem(itemData, level);
- this._itemHook(parent, item, itemData, level);
- fragment.appendChild(item[0]);
- items.push(item[0]);
- complete();
- });
- })(itemData[i]);
- }
- } else {
- task.push(function(complete) {
- // only one item
- var item = this._createItem(itemData, level);
- this._itemHook(parent, item, itemData, level);
- fragment.appendChild(item[0]);
- items.push(item[0]);
- complete();
- });
- }
- }
- // run at least once
- task.push(function(complete) {
- complete();
- });
- },
- // create children container
- _createContainer: function(item) {
- if (!item) {
- item = this._instance.jQuery;
- }
- // ensure we have a UL in place
- var ul = domApi.container(item[0]);
- if (!ul) {
- var ul = window.document.createElement('UL');
- ul.setAttribute('role', 'group');
- ul.className = 'aciTreeUl';
- ul.style.display = 'none';
- item[0].appendChild(ul);
- }
- return $(ul);
- },
- // remove children container
- _removeContainer: function(item) {
- if (!item) {
- item = this._instance.jQuery;
- }
- var ul = domApi.container(item[0]);
- ul.parentNode.removeChild(ul);
- },
- // append one or more items to item
- // `options.itemData` can be a item object or array of item objects
- // `options.items` will keep a list of added items
- append: function(item, options) {
- options = this._options(options, 'appended', 'appendfail', null, item);
- if (item) {
- if (this.isInode(item)) {
- // a way to cancel the operation
- if (!this._trigger(item, 'beforeappend', options)) {
- this._fail(item, options);
- return;
- }
- var container = this._createContainer(item);
- var last = this.last(item);
- this._createItems(container, null, null, options.itemData, this.level(item) + 1, function(list) {
- if (list.length) {
- // some items created, update states
- domApi.addRemoveClass(item[0], 'aciTreeInode', 'aciTreeInodeMaybe');
- this._setFirstLast(item, last);
- if (this.isHidden(item)) {
- domApi.addListClass(list.toArray(), 'aciTreeHidden');
- } else if (this.isOpenPath(item) && this.isOpen(item)) {
- domApi.addListClass(list.toArray(), 'aciTreeVisible');
- this._setOddEven(list.first());
- }
- // trigger `added` for each item
- list.each(this.proxy(function(element) {
- this._trigger($(element), 'added', options);
- }, true));
- } else if (!this.hasChildren(item, true)) {
- container.remove();
- }
- options.items = list;
- this._success(item, options);
- });
- } else {
- this._fail(item, options);
- }
- } else {
- // a way to cancel the operation
- if (!this._trigger(item, 'beforeappend', options)) {
- this._fail(item, options);
- return;
- }
- var container = this._createContainer();
- var last = this.last();
- this._createItems(container, null, null, options.itemData, 0, function(list) {
- if (list.length) {
- // some items created, update states
- this._setFirstLast(null, last);
- domApi.addListClass(list.toArray(), 'aciTreeVisible');
- this._setOddEven();
- // trigger `added` for each item
- list.each(this.proxy(function(element) {
- this._trigger($(element), 'added', options);
- }, true));
- this._animate(null, true, !this._instance.options.animateRoot || options.unanimated);
- } else if (!this.hasChildren(null, true)) {
- // remove the children container
- container.remove();
- }
- options.items = list;
- this._success(item, options);
- });
- }
- },
- // insert one or more items before item
- // `options.itemData` can be a item object or array of item objects
- // `options.items` will keep a list of added items
- before: function(item, options) {
- options = this._options(options, 'before', 'beforefail', null, item);
- if (this.isItem(item)) {
- // a way to cancel the operation
- if (!this._trigger(item, 'beforebefore', options)) {
- this._fail(item, options);
- return;
- }
- var prev = this.prev(item);
- this._createItems(null, item, null, options.itemData, this.level(item), function(list) {
- if (list.length) {
- // some items created, update states
- if (!prev.length) {
- domApi.removeClass(item[0], 'aciTreeFirst');
- domApi.addClass(list.first()[0], 'aciTreeFirst');
- }
- var parent = this.parent(item);
- if (parent.length && this.isHidden(parent)) {
- domApi.addListClass(list.toArray(), 'aciTreeHidden');
- } else if (this.isOpenPath(item)) {
- domApi.addListClass(list.toArray(), 'aciTreeVisible');
- this._setOddEven(list.first());
- }
- // trigger `added` for each item
- list.each(this.proxy(function(element) {
- this._trigger($(element), 'added', options);
- }, true));
- }
- options.items = list;
- this._success(item, options);
- });
- } else {
- this._fail(item, options);
- }
- },
- // insert one or more items after item
- // `options.itemData` can be a item object or array of item objects
- // `options.items` will keep a list of added items
- after: function(item, options) {
- options = this._options(options, 'after', 'afterfail', null, item);
- if (this.isItem(item)) {
- // a way to cancel the operation
- if (!this._trigger(item, 'beforeafter', options)) {
- this._fail(item, options);
- return;
- }
- var next = this.next(item);
- this._createItems(null, null, item, options.itemData, this.level(item), function(list) {
- if (list.length) {
- // some items created, update states
- if (!next.length) {
- domApi.removeClass(item[0], 'aciTreeLast');
- domApi.addClass(list.last()[0], 'aciTreeLast');
- }
- var parent = this.parent(item);
- if (parent.length && this.isHidden(parent)) {
- domApi.addListClass(list.toArray(), 'aciTreeHidden');
- } else if (this.isOpenPath(item)) {
- domApi.addListClass(list.toArray(), 'aciTreeVisible');
- this._setOddEven(list.first());
- }
- // trigger `added` for each item
- list.each(this.proxy(function(element) {
- this._trigger($(element), 'added', options);
- }, true));
- }
- options.items = list;
- this._success(item, options);
- });
- } else {
- this._fail(item, options);
- }
- },
- // get item having the element
- itemFrom: function(element) {
- if (element) {
- var item = $(element);
- if (item[0] === this._instance.jQuery[0]) {
- return $([]);
- } else {
- return $(domApi.parentFrom(item[0]));
- }
- }
- return $([]);
- },
- // get item children
- // if `branch` is TRUE then all children are returned
- // if `hidden` is TRUE then the hidden items will be considered too
- children: function(item, branch, hidden) {
- return $(domApi.children(item && item[0] ? item[0] : this._instance.jQuery[0], branch, hidden ? null : function(node) {
- return this.hasClass(node, 'aciTreeHidden') ? null : true;
- }));
- },
- // filter only the visible items (items with all parents opened)
- // if `view` is TRUE then only the items in view are returned
- visible: function(items, view) {
- var list = domApi.withClass(items.toArray(), 'aciTreeVisible');
- if (view) {
- var filter = [];
- for (var i = 0; i < list.length; i++) {
- if (this.isVisible($(list[i]))) {
- filter.push(list[i]);
- }
- }
- return $(filter);
- }
- return $(list);
- },
- // filter only inner nodes from items
- // if `state` is set then filter only open/closed ones
- inodes: function(items, state) {
- if (state !== undefined) {
- if (state) {
- return $(domApi.withClass(items.toArray(), 'aciTreeOpen'));
- } else {
- return $(domApi.withAnyClass(items.toArray(), ['aciTreeInode', 'aciTreeInodeMaybe'], 'aciTreeOpen'));
- }
- }
- return $(domApi.withAnyClass(items.toArray(), ['aciTreeInode', 'aciTreeInodeMaybe']));
- },
- // filter only leaf nodes from items
- leaves: function(items) {
- return $(domApi.withClass(items.toArray(), 'aciTreeLeaf'));
- },
- // test if is a inner node
- isInode: function(item) {
- return item && domApi.hasAnyClass(item[0], ['aciTreeInode', 'aciTreeInodeMaybe']);
- },
- // test if is a leaf node
- isLeaf: function(item) {
- return item && domApi.hasClass(item[0], 'aciTreeLeaf');
- },
- // test if item was loaded
- wasLoad: function(item) {
- if (item) {
- return domApi.container(item[0]) !== null;
- }
- return domApi.container(this._instance.jQuery[0]) !== null;
- },
- // set item as inner node
- setInode: function(item, options) {
- options = this._options(options, 'inodeset', 'inodefail', 'wasinode', item);
- if (this.isItem(item)) {
- // a way to cancel the operation
- if (!this._trigger(item, 'beforeinode', options)) {
- this._fail(item, options);
- return;
- }
- if (this.isLeaf(item)) {
- this._coreDOM.inode(item, true);
- this._success(item, options);
- } else {
- this._notify(item, options);
- }
- } else {
- this._fail(item, options);
- }
- },
- // set item as leaf node
- setLeaf: function(item, options) {
- options = this._options(options, 'leafset', 'leaffail', 'wasleaf', item);
- if (this.isItem(item)) {
- // a way to cancel the operation
- if (!this._trigger(item, 'beforeleaf', options)) {
- this._fail(item, options);
- return;
- }
- if (this.isInode(item)) {
- var process = function() {
- this._coreDOM.leaf(item);
- this._success(item, options);
- };
- if (this.wasLoad(item)) {
- // first unload the node
- this.unload(item, this._inner(options, {
- success: process,
- fail: options.fail
- }));
- } else {
- process.apply(this);
- }
- } else {
- this._notify(item, options);
- }
- } else {
- this._fail(item, options);
- }
- },
- // add/update item icon
- // `options.icon` can be the CSS class name or array['CSS class name', background-position-x, background-position-y]
- // `options.oldIcon` will keep the old icon
- addIcon: function(item, options) {
- options = this._options(options, 'iconadded', 'addiconfail', 'wasicon', item);
- if (this.isItem(item)) {
- // a way to cancel the operation
- if (!this._trigger(item, 'beforeaddicon', options)) {
- this._fail(item, options);
- return;
- }
- var data = this.itemData(item);
- // keep the old one
- options.oldIcon = data.icon;
- var parent = domApi.childrenByClass(item[0].firstChild, 'aciTreeItem');
- var found = domApi.childrenByClass(parent, 'aciTreeIcon');
- if (found && data.icon && (options.icon.toString() == data.icon.toString())) {
- this._notify(item, options);
- } else {
- if (!found) {
- found = window.document.createElement('DIV');
- parent.insertBefore(found, parent.firstChild);
- }
- if (options.icon instanceof Array) {
- // icon with background-position
- found.className = 'aciTreeIcon ' + options.icon[0];
- found.style.backgroundPosition = options.icon[1] + 'px ' + options.icon[2] + 'px';
- } else {
- // only the CSS class name
- found.className = 'aciTreeIcon ' + options.icon;
- }
- // remember this one
- data.icon = options.icon;
- this._success(item, options);
- }
- } else {
- this._fail(item, options);
- }
- },
- // remove item icon
- // options.oldIcon will keep the old icon
- removeIcon: function(item, options) {
- options = this._options(options, 'iconremoved', 'removeiconfail', 'noticon', item);
- if (this.isItem(item)) {
- // a way to cancel the operation
- if (!this._trigger(item, 'beforeremoveicon', options)) {
- this._fail(item, options);
- return;
- }
- var data = this.itemData(item);
- // keep the old one
- options.oldIcon = data.icon;
- var parent = domApi.childrenByClass(item[0].firstChild, 'aciTreeItem');
- var found = domApi.childrenByClass(parent, 'aciTreeIcon');
- if (found) {
- parent.removeChild(found);
- // remember was removed
- data.icon = null;
- this._success(item, options);
- } else {
- this._notify(item, options);
- }
- } else {
- this._fail(item, options);
- }
- },
- // test if item has icon
- hasIcon: function(item) {
- return !!this.getIcon(item);
- },
- // get item icon
- getIcon: function(item) {
- var data = this.itemData(item);
- return data ? data.icon : null;
- },
- // set item label
- // `options.label` is the new label
- // `options.oldLabel` will keep the old label
- setLabel: function(item, options) {
- options = this._options(options, 'labelset', 'labelfail', 'waslabel', item);
- if (this.isItem(item)) {
- // a way to cancel the operation
- if (!this._trigger(item, 'beforelabel', options)) {
- this._fail(item, options);
- return;
- }
- var data = this.itemData(item);
- // keep the old one
- options.oldLabel = data.label;
- if (options.label == options.oldLabel) {
- this._notify(item, options);
- } else {
- // set the label
- domApi.childrenByClass(item[0].firstChild, 'aciTreeText').innerHTML = options.label;
- // remember this one
- data.label = options.label;
- this._success(item, options);
- }
- } else {
- this._fail(item, options);
- }
- },
- // disable item
- disable: function(item, options) {
- options = this._options(options, 'disabled', 'disablefail', 'wasdisabled', item);
- if (this.isItem(item)) {
- // a way to cancel the operation
- if (!this._trigger(item, 'beforedisable', options)) {
- this._fail(item, options);
- return;
- }
- if (this.isDisabled(item)) {
- this._notify(item, options);
- } else {
- domApi.addClass(item[0], 'aciTreeDisabled');
- this._success(item, options);
- }
- } else {
- this._fail(item, options);
- }
- },
- // test if item is disabled
- isDisabled: function(item) {
- return item && domApi.hasClass(item[0], 'aciTreeDisabled');
- },
- // test if any of parents are disabled
- isDisabledPath: function(item) {
- return domApi.withClass(this.path(item).toArray(), 'aciTreeDisabled').length > 0;
- },
- // filter only the disabled items
- disabled: function(items) {
- return $(domApi.withClass(items.toArray(), 'aciTreeDisabled'));
- },
- // enable item
- enable: function(item, options) {
- options = this._options(options, 'enabled', 'enablefail', 'wasenabled', item);
- if (this.isItem(item)) {
- // a way to cancel the operation
- if (!this._trigger(item, 'beforeenable', options)) {
- this._fail(item, options);
- return;
- }
- if (this.isDisabled(item)) {
- domApi.removeClass(item[0], 'aciTreeDisabled');
- this._success(item, options);
- } else {
- this._notify(item, options);
- }
- } else {
- this._fail(item, options);
- }
- },
- // test if item is enabled
- isEnabled: function(item) {
- return item && !domApi.hasClass(item[0], 'aciTreeDisabled');
- },
- // test if all parents are enabled
- isEnabledPath: function(item) {
- return domApi.withClass(this.path(item).toArray(), 'aciTreeDisabled').length == 0;
- },
- // filter only the enabled items
- enabled: function(items) {
- return $(domApi.withClass(items.toArray(), null, 'aciTreeDisabled'));
- },
- // set item as hidden
- hide: function(item, options) {
- options = this._options(options, 'hidden', 'hidefail', 'washidden', item);
- if (this.isItem(item)) {
- // a way to cancel the operation
- if (!this._trigger(item, 'beforehide', options)) {
- this._fail(item, options);
- return;
- }
- if (this.isHidden(item)) {
- this._notify(item, options);
- } else {
- domApi.addRemoveClass(item[0], 'aciTreeHidden', 'aciTreeVisible');
- // process children
- domApi.addRemoveClass(this.children(item, true).toArray(), 'aciTreeHidden', 'aciTreeVisible');
- // update item states
- var parent = this.parent(item);
- this._setFirstLast(parent.length ? parent : null, item);
- this._setOddEven(item);
- this._success(item, options);
- }
- } else {
- this._fail(item, options);
- }
- },
- // test if item is hidden
- isHidden: function(item) {
- return item && domApi.hasClass(item[0], 'aciTreeHidden');
- },
- // test if any of parents are hidden
- isHiddenPath: function(item) {
- var parent = this.parent(item);
- return parent[0] && domApi.hasClass(parent[0], 'aciTreeHidden');
- },
- // update hidden state
- _updateHidden: function(item) {
- if (this.isHiddenPath(item)) {
- if (!this.isHidden(item)) {
- domApi.addClass(item[0], 'aciTreeHidden');
- this._updateVisible(item);
- }
- } else {
- this._updateVisible(item);
- }
- },
- // filter only the hidden items
- hidden: function(items) {
- return $(domApi.withClass(items.toArray(), 'aciTreeHidden'));
- },
- // show hidden item
- _showHidden: function(item) {
- var parent = null;
- this.path(item).add(item).each(this.proxy(function(element) {
- var item = $(element);
- if (this.isHidden(item)) {
- domApi.removeClass(item[0], 'aciTreeHidden');
- if (this.isOpenPath(item) && (!parent || this.isOpen(parent))) {
- domApi.addClass(item[0], 'aciTreeVisible');
- }
- // update item states
- this._setFirstLast(parent, this._getFirstLast(parent));
- }
- parent = item;
- }, true));
- },
- // show hidden item
- show: function(item, options) {
- options = this._options(options, 'shown', 'showfail', 'wasshown', item);
- if (this.isItem(item)) {
- // a way to cancel the operation
- if (!this._trigger(item, 'beforeshow', options)) {
- this._fail(item, options);
- return;
- }
- if (this.isHidden(item)) {
- this._showHidden(item);
- var parent = this.topParent(item);
- // update item states
- this._setOddEven(parent.length ? parent : item);
- this._success(item, options);
- } else {
- this._notify(item, options);
- }
- } else {
- this._fail(item, options);
- }
- },
- // test if item is open
- isOpen: function(item) {
- return item && domApi.hasClass(item[0], 'aciTreeOpen');
- },
- // test if item is closed
- isClosed: function(item) {
- return item && !domApi.hasClass(item[0], 'aciTreeOpen');
- },
- // test if item has children
- // if `hidden` is TRUE then the hidden items will be considered too
- hasChildren: function(item, hidden) {
- return this.children(item, false, hidden).length > 0;
- },
- // test if item has siblings
- // if `hidden` is TRUE then the hidden items will be considered too
- hasSiblings: function(item, hidden) {
- return this.siblings(item, hidden).length > 0;
- },
- // test if item has another before
- // if `hidden` is TRUE then the hidden items will be considered too
- hasPrev: function(item, hidden) {
- return this.prev(item, hidden).length > 0;
- },
- // test if item has another after
- // if `hidden` is TRUE then the hidden items will be considered too
- hasNext: function(item, hidden) {
- return this.next(item, hidden).length > 0;
- },
- // get item siblings
- // if `hidden` is TRUE then the hidden items will be considered too
- siblings: function(item, hidden) {
- return item ? $(domApi.children(item[0].parentNode.parentNode, false, function(node) {
- return (node != item[0]) && (hidden || !this.hasClass(node, 'aciTreeHidden'));
- })) : $([]);
- },
- // get previous item
- // if `hidden` is TRUE then the hidden items will be considered too
- prev: function(item, hidden) {
- return item ? $(domApi.prev(item[0], hidden ? null : function(node) {
- return !this.hasClass(node, 'aciTreeHidden');
- })) : $([]);
- },
- // get next item
- // if `hidden` is TRUE then the hidden items will be considered too
- next: function(item, hidden) {
- return item ? $(domApi.next(item[0], hidden ? null : function(node) {
- return !this.hasClass(node, 'aciTreeHidden');
- })) : $([]);
- },
- // get item level - starting from 0
- // return -1 for invalid items
- level: function(item) {
- var level = -1;
- if (item) {
- var node = item[0];
- while (domApi.hasClass(node, 'aciTreeLi')) {
- node = node.parentNode.parentNode;
- level++;
- }
- }
- return level;
- },
- // get item ID
- getId: function(item) {
- var data = this.itemData(item);
- return data ? data.id : null;
- },
- // get item data
- itemData: function(item) {
- return item ? item.data('itemData' + this._instance.nameSpace) : null;
- },
- // set item ID
- // `options.id` is the new item ID
- // `options.oldId` will keep the old ID
- setId: function(item, options) {
- options = this._options(options, 'idset', 'idfail', 'wasid', item);
- if (this.isItem(item)) {
- // a way to cancel the operation
- if (!this._trigger(item, 'beforeid', options)) {
- this._fail(item, options);
- return;
- }
- var data = this.itemData(item);
- // keep the old one
- options.oldId = data.id;
- if (options.id == options.oldId) {
- this._notify(item, options);
- } else {
- // remember this one
- data.id = options.id;
- this._success(item, options);
- }
- } else {
- this._fail(item, options);
- }
- },
- // get item index - starting from #0
- getIndex: function(item) {
- if (item && item[0]) {
- if (window.Array.prototype.indexOf) {
- return window.Array.prototype.indexOf.call(item[0].parentNode.childNodes, item[0]);
- } else {
- var children = item[0].parentNode.childNodes;
- for (var i = 0; i < children.length; i++) {
- if (children[i] == item[0]) {
- return i;
- }
- }
- }
- }
- return null;
- },
- // set item index - #0 based
- // `options.index` is the new index
- // `options.oldIndex` will keep the old index
- setIndex: function(item, options) {
- options = this._options(options, 'indexset', 'indexfail', 'wasindex', item);
- if (this.isItem(item)) {
- var oldIndex = this.getIndex(item);
- var siblings = this.siblings(item);
- if ((options.index != oldIndex) && !siblings.length) {
- this._fail(item, options);
- return;
- }
- // a way to cancel the operation
- if (!this._trigger(item, 'beforeindex', options)) {
- this._fail(item, options);
- return;
- }
- // keep the old one
- options.oldIndex = oldIndex;
- if (options.index == oldIndex) {
- this._notify(item, options);
- } else {
- // set the new index
- if (options.index < 1) {
- siblings.first().before(item);
- } else if (options.index >= siblings.length) {
- siblings.last().after(item);
- } else {
- siblings.eq(options.index).before(item);
- }
- var parent = this.parent(item);
- // update item states
- this._setFirstLast(parent.length ? parent : null, item.add([siblings[0], siblings.get(-1)]));
- this._setOddEven(parent);
- this._success(item, options);
- }
- } else {
- this._fail(item, options);
- }
- },
- // get item label
- getLabel: function(item) {
- var data = this.itemData(item);
- return data ? data.label : null;
- },
- // test if is valid item
- isItem: function(item) {
- return item && domApi.hasClass(item[0], 'aciTreeLi');
- },
- // item animation
- // `state` if TRUE then show, FALSE then hide
- // `unanimated` if TRUE then don't use animations
- // `callback` function () to call at the end
- _animate: function(item, state, unanimated, callback) {
- if (!item) {
- item = this._instance.jQuery;
- }
- if (!unanimated) {
- // use the defined animation props
- var setting = state ? this._instance.options.show : this._instance.options.hide;
- if (setting) {
- var ul = domApi.container(item[0]);
- if (ul) {
- // animate children container
- $(ul).stop(true, true).animate(setting.props, {
- duration: setting.duration,
- easing: setting.easing,
- complete: callback ? this.proxy(callback) : null
- });
- } else if (callback) {
- callback.apply(this);
- }
- return;
- }
- }
- // use no animation
- $(domApi.container(item[0])).stop(true, true).toggle(state);
- if (callback) {
- callback.apply(this);
- }
- },
- // get first children of item
- // if `hidden` is TRUE then the hidden items will be considered too
- first: function(item, hidden) {
- if (!item) {
- item = this._instance.jQuery;
- }
- return $(domApi.firstChild(item[0], hidden ? null : function(node) {
- return !this.hasClass(node, 'aciTreeHidden');
- }));
- },
- // test if item is the first one for his parent
- // if `hidden` is TRUE then the hidden items will be considered too
- isFirst: function(item, hidden) {
- if (item) {
- var parent = domApi.parent(item[0]);
- return this.first(parent ? $(parent) : null, hidden)[0] == item[0];
- }
- return false;
- },
- // get last children of item
- // if `hidden` is TRUE then the hidden items will be considered too
- last: function(item, hidden) {
- if (!item) {
- item = this._instance.jQuery;
- }
- return $(domApi.lastChild(item[0], hidden ? null : function(node) {
- return !this.hasClass(node, 'aciTreeHidden');
- }));
- },
- // test if item is the last one for his parent
- // if `hidden` is TRUE then the hidden items will be considered too
- isLast: function(item, hidden) {
- if (item) {
- var parent = domApi.parent(item[0]);
- return this.last(parent ? $(parent) : null, hidden)[0] == item[0];
- }
- return false;
- },
- // test if item is busy/loading
- isBusy: function(item) {
- if (item) {
- return domApi.hasClass(item[0], 'aciTreeLoad');
- } else {
- return this._instance.queue.busy();
- }
- },
- // set loading state
- _loading: function(item, state) {
- if (item) {
- domApi.toggleClass(item[0], 'aciTreeLoad', state);
- if (state) {
- item[0].firstChild.setAttribute('aria-busy', true);
- } else {
- item[0].firstChild.removeAttribute('aria-busy');
- }
- } else if (state) {
- this._loader(state);
- }
- },
- // show loader image
- _loader: function(show) {
- if (show || this.isBusy()) {
- if (!this._private.loaderInterval) {
- this._private.loaderInterval = window.setInterval(this.proxy(function() {
- this._loader();
- }), this._instance.options.loaderDelay);
- }
- domApi.addClass(this._instance.jQuery[0], 'aciTreeLoad');
- window.clearTimeout(this._private.loaderHide);
- this._private.loaderHide = window.setTimeout(this.proxy(function() {
- domApi.removeClass(this._instance.jQuery[0], 'aciTreeLoad');
- }), this._instance.options.loaderDelay * 2);
- }
- },
- // test if parent has children
- isChildren: function(parent, children) {
- if (!parent) {
- parent = this._instance.jQuery;
- }
- return children && (parent.has(children).length > 0);
- },
- // test if parent has immediate children
- isImmediateChildren: function(parent, children) {
- if (!parent) {
- parent = this._instance.jQuery;
- }
- return children && parent.children('.aciTreeUl').children('.aciTreeLi').is(children);
- },
- // test if items share the same parent
- sameParent: function(item1, item2) {
- if (item1 && item2) {
- var parent1 = this.parent(item1);
- var parent2 = this.parent(item2);
- return (!parent1.length && !parent2.length) || (parent1[0] == parent2[0]);
- }
- return false;
- },
- // test if items share the same top parent
- sameTopParent: function(item1, item2) {
- if (item1 && item2) {
- var parent1 = this.topParent(item1);
- var parent2 = this.topParent(item2);
- return (!parent1.length && !parent2.length) || (parent1[0] == parent2[0]);
- }
- return false;
- },
- // return the updated item data
- // `callback` function (item) called for each item
- _serialize: function(item, callback) {
- var data = this.itemData(item);
- if (this.isInode(item)) {
- data.inode = true;
- if (this.wasLoad(item)) {
- if (data.hasOwnProperty('open')) {
- data.open = this.isOpen(item);
- } else if (this.isOpen(item)) {
- data.open = true;
- }
- data.branch = [];
- this.children(item, false, true).each(this.proxy(function(element) {
- var entry = this._serialize($(element), callback);
- if (callback) {
- entry = callback.call(this, $(element), {
- }, entry);
- } else {
- entry = this._instance.options.serialize.call(this, $(element), {
- }, entry);
- }
- if (entry) {
- data.branch.push(entry);
- }
- }, true));
- if (!data.branch.length) {
- data.branch = null;
- }
- } else {
- if (data.hasOwnProperty('open')) {
- data.open = false;
- }
- if (data.hasOwnProperty('branch')) {
- data.branch = null;
- }
- }
- } else {
- if (data.hasOwnProperty('inode')) {
- data.inode = false;
- }
- if (data.hasOwnProperty('open')) {
- data.open = null;
- }
- if (data.hasOwnProperty('branch')) {
- data.branch = null;
- }
- }
- if (data.hasOwnProperty('disabled')) {
- data.disabled = this.isDisabled(item);
- } else if (this.isDisabled(item)) {
- data.disabled = true;
- }
- return data;
- },
- // return serialized data
- // `callback` function (item, what, value) - see `aciTree.options.serialize`
- serialize: function(item, what, callback) {
- // override this to provide serialized data
- if (typeof what == 'object') {
- if (item) {
- var data = this._serialize(item, callback);
- if (callback) {
- data = callback.call(this, item, {
- }, data);
- } else {
- data = this._instance.options.serialize.call(this, item, {
- }, data);
- }
- return data;
- } else {
- var list = [];
- this.children(null, false, true).each(this.proxy(function(element) {
- var data = this._serialize($(element), callback);
- if (callback) {
- data = callback.call(this, $(element), {
- }, data);
- } else {
- data = this._instance.options.serialize.call(this, $(element), {
- }, data);
- }
- if (data) {
- list.push(data);
- }
- }, true));
- return list;
- }
- }
- return '';
- },
- // destroy the control
- destroy: function(options) {
- options = this._options(options);
- // check if was init
- if (!this.wasInit()) {
- this._trigger(null, 'notinit', options);
- this._fail(null, options);
- return;
- }
- // check if is locked
- if (this.isLocked()) {
- this._trigger(null, 'locked', options);
- this._fail(null, options);
- return;
- }
- // a way to cancel the operation
- if (!this._trigger(null, 'beforedestroy', options)) {
- this._trigger(null, 'destroyfail', options);
- this._fail(null, options);
- return;
- }
- this._private.locked = true;
- this._instance.jQuery.addClass('aciTreeLoad').attr('aria-busy', true);
- this._instance.queue.destroy();
- this._destroyHook(false);
- // unload the entire treeview
- this.unload(null, this._inner(options, {
- success: this.proxy(function() {
- window.clearTimeout(this._private.loaderHide);
- window.clearInterval(this._private.loaderInterval);
- this._private.itemClone = {
- };
- this._destroyHook(true);
- this._instance.jQuery.unbind(this._instance.nameSpace).off(this._instance.nameSpace, '.aciTreeButton').off(this._instance.nameSpace, '.aciTreeLine');
- this._instance.jQuery.removeClass('aciTree' + this._instance.index + ' aciTreeLoad').removeAttr('role aria-busy');
- this._private.locked = false;
- // call the parent
- this._super();
- this._trigger(null, 'destroyed', options);
- this._success(null, options);
- }),
- fail: function() {
- this._instance.jQuery.removeClass('aciTreeLoad');
- this._private.locked = false;
- this._trigger(null, 'destroyfail', options);
- this._fail(null, options);
- }
- }));
- },
- _destroyHook: function(unloaded) {
- // override this to do extra destroy before/after unload
- }
-
- };
-
- // extend the base aciPluginUi class and store into aciPluginClass.plugins
- aciPluginClass.plugins.aciTree = aciPluginClass.aciPluginUi.extend(aciTree_core, 'aciTreeCore');
-
- // publish the plugin & the default options
- aciPluginClass.publish('aciTree', options);
-
- // for internal access
- var domApi = aciPluginClass.plugins.aciTree_dom;
-
-})(jQuery, this);
+
+/*
+ * aciTree jQuery Plugin v4.5.0-rc.7
+ * http://acoderinsights.ro
+ *
+ * Copyright (c) 2014 Dragos Ursu
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ *
+ * Require jQuery Library >= v1.9.0 http://jquery.com
+ * + aciPlugin >= v1.5.1 https://github.com/dragosu/jquery-aciPlugin
+ */
+
+/*
+ * The aciTree core.
+ *
+ * A few words about how item data looks like:
+ *
+ * for a leaf node (a node that does not have any children):
+ *
+ * {
+ * id: 'some_file_ID', // should be unique item ID
+ * label: 'This is a File Item', // the item label (text value)
+ * inode: false, // FALSE means is a leaf node (can be omitted)
+ * icon: 'fileIcon', // CSS class name for the icon (if any), can also be an Array ['CSS class name', background-position-x, background-position-y]
+ * disabled: false, // TRUE means the item is disabled (can be omitted)
+ * random_prop: 'random 1' // sample user defined property (you can have any number defined)
+ * }
+ *
+ * for a inner node (a node that have at least a children under it):
+ *
+ * {
+ * id: 'some_folder_ID', // should be unique item ID
+ * label: 'This is a Folder Item', // the item label (text value)
+ * inode: true, // can also be NULL to find at runtime if its an inode (on load will be transformed in a leaf node if there aren't any children)
+ * open: false, // if TRUE then the node will be opened when the tree is loaded (can be omitted)
+ * icon: 'folderIcon', // CSS class name for the icon (if any), can also be an Array ['CSS class name', background-position-x, background-position-y]
+ * disabled: false, // TRUE means the item is disabled (can be omitted)
+ * source: 'myDataSource', // the data source name (if any) to read the children from, by default `aciTree.options.ajax` is used
+ * branch: [ // a list of children
+ * { ... item data ... },
+ * { ... item data ... },
+ * ...
+ * ],
+ * random_prop: 'random 2' // sample user defined property (you can have any number defined)
+ * }
+ *
+ * The `branch` array can be empty, in this case the children will be loaded when the node will be opened for the first time.
+ *
+ * Please note that the item data should be valid (in the expected format). No checking is done and errors can appear on invalid data.
+ *
+ * One note about a item: a item is always the LI element with the class 'aciTreeLi'.
+ * The children of a node are all added under a UL element with the class 'aciTreeUl'.
+ *
+ * Almost all API functions expect only one item. If you need to process more at once then you'll need to loop between all of them yourself.
+ *
+ * The `options` parameter for all API methods (when there is one) is a object with the properties (not all are required or used):
+ *
+ * {
+ * uid: string -> operation UID (defaults to `ui`)
+ * success: function (item, options) -> callback to be called on success (you can access plugin API with `this` keyword inside the callback)
+ * fail: function (item, options) -> callback to be called on fail (you can access plugin API with `this` keyword inside the callback)
+ * notify: function (item, options) -> notify callback (internal use for when already in the requested state, will call `success` by default)
+ * expand: true/false -> propagate on open/toggle
+ * collapse: true/false -> propagate on close/toggle
+ * unique: true/false -> should other branches be closed (on open/toggle) ?
+ * unanimated: true/false -> if it's TRUE then no animations are to be run (used on open/close/toggle)
+ * itemData: object[item data]/array[item data] -> used when adding/updating items
+ * }
+ *
+ * Note: when using the API methods that support the `options` parameter, you will need to use the success/fail callbacks if you need to do
+ * any processing after the API call. This because there can be async operations that will complete at a later time and the API methods will
+ * exit before the job is actually completed. This will happen when items are loaded with AJAX, on animations and other delayed operations (see _queue).
+ *
+ */
+
+(function($, window, undefined) {
+
+ // default options
+
+ var options = {
+ // the AJAX options (see jQuery.ajax) where the `success` and `error` are overridden by aciTree
+ ajax: {
+ url: null, // URL from where to take the data, something like `path/script?nodeId=` (the node ID value will be added for each request)
+ dataType: 'json'
+ },
+ dataSource: null, // a list of data sources to be used (each entry in `aciTree.options.ajax` format)
+ rootData: null, // initial ROOT data for the Tree (if NULL then one initial AJAX request is made on init)
+ queue: {
+ async: 4, // the number of simultaneous async (AJAX) tasks
+ interval: 50, // interval [ms] after which to insert a `delay`
+ delay: 20 // how many [ms] delay between tasks (after `interval` expiration)
+ },
+ loaderDelay: 500, // how many msec to wait before showing the main loader ? (on lengthy operations)
+ expand: false, // if TRUE then all children of a node are expanded when the node is opened
+ collapse: false, // if TRUE then all children of a node are collapsed when the node is closed
+ unique: false, // if TRUE then a single tree branch will stay open, the oters are closed when a node is opened
+ empty: false, // if TRUE then all children of a node are removed when the node is closed
+ show: {// show node/ROOT animation (default is slideDown)
+ props: {
+ 'height': 'show'
+ },
+ duration: 'medium',
+ easing: 'linear'
+ },
+ animateRoot: true, // if the ROOT should be animated on init
+ hide: {// hide node animation (default is slideUp)
+ props: {
+ 'height': 'hide'
+ },
+ duration: 'medium',
+ easing: 'linear'
+ },
+ view: {// scroll item into view animation
+ duration: 'medium',
+ easing: 'linear'
+ },
+ // called for each AJAX request when a node needs to be loaded
+ // `item` is the item who will be loaded
+ // `settings` is the `aciTree.options.ajax` object or an entry from `aciTree.options.dataSource`
+ ajaxHook: function(item, settings) {
+ // the default implementation changes the URL by adding the item ID at the end
+ settings.url += (item ? this.getId(item) : '');
+ },
+ // called after each item is created but before is inserted into the DOM
+ // `parent` is the parent item (can be empty)
+ // `item` is the new created item
+ // `itemData` is the object used to create the item
+ // `level` is the #0 based item level
+ itemHook: function(parent, item, itemData, level) {
+ // there is no default implementation
+ },
+ // called for each item to serialize its value
+ // `item` is the tree item to be serialized
+ // `what` is the option telling what is being serialized
+ // `value` is the current serialized value (from the `item`, value type depending of `what`)
+ serialize: function(item, what, value) {
+ if (typeof what == 'object') {
+ return value;
+ } else {
+ // the default implementation uses a `|` (pipe) character to separate values
+ return '|' + value;
+ }
+ }
+ };
+
+ // aciTree plugin core
+
+ var aciTree_core = {
+ // add extra data
+ __extend: function() {
+ $.extend(this._instance, {
+ queue: new this._queue(this, this._instance.options.queue) // the global tree queue
+ });
+ $.extend(this._private, {
+ locked: false, // to tell the tree state
+ itemClone: {// keep a clone of the LI for faster tree item creation
+ },
+ // timeouts for the loader
+ loaderHide: null,
+ loaderInterval: null,
+ // busy delay counter
+ delayBusy: 0
+ });
+ },
+ // init the treeview
+ init: function(options) {
+ options = this._options(options);
+ // check if was init already
+ if (this.wasInit()) {
+ this._trigger(null, 'wasinit', options);
+ this._fail(null, options);
+ return;
+ }
+ // check if is locked
+ if (this.isLocked()) {
+ this._trigger(null, 'locked', options);
+ this._fail(null, options);
+ return;
+ }
+ // a way to cancel the operation
+ if (!this._trigger(null, 'beforeinit', options)) {
+ this._trigger(null, 'initfail', options);
+ this._fail(null, options);
+ return;
+ }
+ this._private.locked = true;
+ this._instance.jQuery.addClass('aciTree' + this._instance.index).attr('role', 'tree').on('click' + this._instance.nameSpace, '.aciTreeButton', this.proxy(function(e) {
+ // process click on button
+ var item = this.itemFrom(e.target);
+ // skip when busy
+ if (!this.isBusy(item)) {
+ // tree button pressed
+ this.toggle(item, {
+ collapse: this._instance.options.collapse,
+ expand: this._instance.options.expand,
+ unique: this._instance.options.unique
+ });
+ }
+ })).on('mouseenter' + this._instance.nameSpace + ' mouseleave' + this._instance.nameSpace, '.aciTreePush', function(e) {
+ // handle the aciTreeHover class
+ var element = e.target;
+ if (!domApi.hasClass(element, 'aciTreePush')) {
+ element = domApi.parentByClass(element, 'aciTreePush');
+ }
+ domApi.toggleClass(element, 'aciTreeHover', e.type == 'mouseenter');
+ }).on('mouseenter' + this._instance.nameSpace + ' mouseleave' + this._instance.nameSpace, '.aciTreeLine', function(e) {
+ // handle the aciTreeHover class
+ var element = e.target;
+ if (!domApi.hasClass(element, 'aciTreeLine')) {
+ element = domApi.parentByClass(element, 'aciTreeLine');
+ }
+ domApi.toggleClass(element, 'aciTreeHover', e.type == 'mouseenter');
+ });
+ this._initHook();
+ // call on success
+ var success = this.proxy(function() {
+ // call the parent
+ this._super();
+ this._private.locked = false;
+ this._trigger(null, 'init', options);
+ this._success(null, options);
+ });
+ // call on fail
+ var fail = this.proxy(function() {
+ // call the parent
+ this._super();
+ this._private.locked = false;
+ this._trigger(null, 'initfail', options);
+ this._fail(null, options);
+ });
+ if (this._instance.options.rootData) {
+ // the rootData was set, use it to init the tree
+ this.loadFrom(null, this._inner(options, {
+ success: success,
+ fail: fail,
+ itemData: this._instance.options.rootData
+ }));
+ } else if (this._instance.options.ajax.url) {
+ // the AJAX url was set, init with AJAX
+ this.ajaxLoad(null, this._inner(options, {
+ success: success,
+ fail: fail
+ }));
+ } else {
+ success.apply(this);
+ }
+ },
+ _initHook: function() {
+ // override this to do extra init
+ },
+ // check locked state
+ isLocked: function() {
+ return this._private.locked;
+ },
+ // get a formatted message
+ // `raw` is the raw message text (can contain %NUMBER sequences, replaced with values from `params`)
+ // `params` is a list of values to be replaced into the message (by #0 based index)
+ _format: function(raw, params) {
+ if (!(params instanceof Array)) {
+ return raw;
+ }
+ var parts = raw.split(/(%[0-9]+)/gm);
+ var compile = '', part, index, last = false, len;
+ var test = new window.RegExp('^%[0-9]+$');
+ for (var i = 0; i < parts.length; i++) {
+ part = parts[i];
+ len = part.length;
+ if (len) {
+ if (!last && test.test(part)) {
+ index = window.parseInt(part.substr(1)) - 1;
+ if ((index >= 0) && (index < params.length)) {
+ compile += params[index];
+ continue;
+ }
+ } else {
+ last = false;
+ if (part.substr(len - 1) == '%') {
+ if (part.substr(len - 2) != '%%') {
+ last = true;
+ }
+ part = part.substr(0, len - 1);
+ }
+ }
+ compile += part;
+ }
+ }
+ return compile;
+ },
+ // low level DOM functions
+ _coreDOM: {
+ // set as leaf node
+ leaf: function(items) {
+ domApi.addRemoveListClass(items.toArray(), 'aciTreeLeaf', ['aciTreeInode', 'aciTreeInodeMaybe', 'aciTreeOpen'], function(node) {
+ node.firstChild.removeAttribute('aria-expanded');
+ });
+ },
+ // set as inner node
+ inode: function(items, branch) {
+ domApi.addRemoveListClass(items.toArray(), branch ? 'aciTreeInode' : 'aciTreeInodeMaybe', 'aciTreeLeaf', function(node) {
+ node.firstChild.setAttribute('aria-expanded', false);
+ });
+ },
+ // set as open/closed
+ toggle: function(items, state) {
+ domApi.toggleListClass(items.toArray(), 'aciTreeOpen', state, function(node) {
+ node.firstChild.setAttribute('aria-expanded', state);
+ });
+ },
+ // set odd/even classes
+ oddEven: function(items, odd) {
+ var list = items.toArray();
+ for (var i = 0; i < list.length; i++) {
+ domApi.addRemoveClass(list[i], odd ? 'aciTreeOdd' : 'aciTreeEven', odd ? 'aciTreeEven' : 'aciTreeOdd');
+ odd = !odd;
+ }
+ }
+ },
+ // a small queue implementation
+ // `context` the context to be used with `callback.call`
+ // `options` are the queue options
+ _queue: function(context, options) {
+ var locked = false;
+ var fifo = [], fifoAsync = [];
+ var load = 0, loadAsync = 0, schedule = 0, stack = 0;
+ // run the queue
+ var run = function() {
+ if (locked) {
+ stack--;
+ return;
+ }
+ var now = new window.Date().getTime();
+ if (schedule > now) {
+ stack--;
+ return;
+ }
+ var callback, async = false;
+ if (load < options.async * 2) {
+ // get the next synchronous callback
+ callback = fifo.shift();
+ }
+ if (!callback && (loadAsync < options.async)) {
+ // get the next async callback
+ callback = fifoAsync.shift();
+ async = true;
+ }
+ if (callback) {
+ // run the callback
+ if (async) {
+ loadAsync++;
+ callback.call(context, function() {
+ loadAsync--;
+ });
+ if (stack < 40) {
+ stack++;
+ run();
+ }
+ } else {
+ load++;
+ callback.call(context, function() {
+ if (now - schedule > options.interval) {
+ schedule = now + options.delay;
+ }
+ load--;
+ if (stack < 40) {
+ stack++;
+ run();
+ }
+ });
+ }
+ }
+ stack--;
+ };
+ var interval = [];
+ // start the queue
+ var start = function() {
+ for (var i = 0; i < 4; i++) {
+ interval[i] = window.setInterval(function() {
+ if (stack < 20) {
+ stack++;
+ run();
+ }
+ }, 10);
+ }
+ };
+ // stop the queue
+ var stop = function() {
+ for (var i = 0; i < interval.length; i++) {
+ window.clearInterval(interval[i]);
+ }
+ };
+ start();
+ // init the queue
+ this.init = function() {
+ this.destroy();
+ start();
+ return this;
+ };
+ // push `callback` function (complete) for later call
+ // `async` tells if is async callback
+ this.push = function(callback, async) {
+ if (!locked) {
+ if (async) {
+ fifoAsync.push(callback);
+ } else {
+ fifo.push(callback);
+ }
+ }
+ return this;
+ };
+ // test if busy
+ this.busy = function() {
+ return (load != 0) || (loadAsync != 0) || (fifo.length != 0) || (fifoAsync.length != 0);
+ };
+ // destroy queue
+ this.destroy = function() {
+ locked = true;
+ stop();
+ fifo = [];
+ fifoAsync = [];
+ load = 0;
+ loadAsync = 0;
+ schedule = 0;
+ stack = 0;
+ locked = false;
+ return this;
+ };
+ },
+ // used with a `queue` to execute something at the end
+ // `endCallback` function (complete) is the callback called at the end
+ _task: function(queue, endCallback) {
+ var counter = 0, finish = false;
+ // push a `callback` function (complete) for later call
+ this.push = function(callback, async) {
+ counter++;
+ queue.push(function(complete) {
+ var context = this;
+ callback.call(this, function() {
+ counter--;
+ if ((counter < 1) && !finish) {
+ finish = true;
+ endCallback.call(context, complete);
+ } else {
+ complete();
+ }
+ });
+ }, async);
+ };
+ },
+ // helper function to extend the `options` object
+ // `object` the initial options object
+ // _success, _fail, _notify are callbacks or string (the event name to be triggered)
+ // `item` is the item to trigger events for
+ _options: function(object, _success, _fail, _notify, item) {
+ // options object (need to be in this form for all API functions
+ // that have the `options` parameter, not all properties are required)
+ var options = $.extend({
+ uid: 'ui',
+ success: null, // success callback
+ fail: null, // fail callback
+ notify: null, // notify callback (internal use for when already in the requested state)
+ expand: this._instance.options.expand, // propagate (on open)
+ collapse: this._instance.options.collapse, // propagate (on close)
+ unique: this._instance.options.unique, // keep a single branch open (on open)
+ unanimated: false, // unanimated (open/close/toggle)
+ itemData: {
+ } // items data (object) or a list (array) of them (used when creating branches)
+ },
+ object);
+ var success = _success ? ((typeof _success == 'string') ? function() {
+ this._trigger(item, _success, options);
+ } : _success) : null;
+ var fail = _fail ? ((typeof _fail == 'string') ? function() {
+ this._trigger(item, _fail, options);
+ } : _fail) : null;
+ var notify = _notify ? ((typeof _notify == 'string') ? function() {
+ this._trigger(item, _notify, options);
+ } : _notify) : null;
+ if (success) {
+ // success callback
+ if (object && object.success) {
+ options.success = function() {
+ success.apply(this, arguments);
+ object.success.apply(this, arguments);
+ };
+ } else {
+ options.success = success;
+ }
+ }
+ if (fail) {
+ // fail callback
+ if (object && object.fail) {
+ options.fail = function() {
+ fail.apply(this, arguments);
+ object.fail.apply(this, arguments);
+ };
+ } else {
+ options.fail = fail;
+ }
+ }
+ if (notify) {
+ // notify callback
+ if (object && object.notify) {
+ options.notify = function() {
+ notify.apply(this, arguments);
+ object.notify.apply(this, arguments);
+ };
+ } else if (!options.notify && object && object.success) {
+ options.notify = function() {
+ notify.apply(this, arguments);
+ object.success.apply(this, arguments);
+ };
+ } else {
+ options.notify = notify;
+ }
+ } else if (!options.notify && object && object.success) {
+ // by default, run success callback
+ options.notify = object.success;
+ }
+ return options;
+ },
+ // helper for passing `options` object to inner methods
+ // the callbacks are removed and `override` can be used to update properties
+ _inner: function(options, override) {
+ // removing success/fail/notify from options
+ return $.extend({
+ }, options, {
+ success: null,
+ fail: null,
+ notify: null
+ },
+ override);
+ },
+ // trigger the aciTree events on the tree container
+ _trigger: function(item, eventName, options) {
+ var event = $.Event('acitree');
+ if (!options) {
+ options = this._options();
+ }
+ this._instance.jQuery.trigger(event, [this, item, eventName, options]);
+ return !event.isDefaultPrevented();
+ },
+ // call on success
+ _success: function(item, options) {
+ if (options && options.success) {
+ options.success.call(this, item, options);
+ }
+ },
+ // call on fail
+ _fail: function(item, options) {
+ if (options && options.fail) {
+ options.fail.call(this, item, options);
+ }
+ },
+ // call on notify (should be same as `success` but called when already in the requested state)
+ _notify: function(item, options) {
+ if (options && options.notify) {
+ options.notify.call(this, item, options);
+ }
+ },
+ // delay callback on busy item
+ _delayBusy: function(item, callback) {
+ if ((this._private.delayBusy < 10) && this.isBusy(item)) {
+ this._private.delayBusy++;
+ window.setTimeout(this.proxy(function() {
+ this._delayBusy.call(this, item, callback);
+ this._private.delayBusy--;
+ }), 10);
+ return;
+ }
+ callback.apply(this);
+ },
+ // return the data source for item
+ // defaults to `aciTree.options.ajax` if not set on the item/his parents
+ _dataSource: function(item) {
+ var dataSource = this._instance.options.dataSource;
+ if (dataSource) {
+ var data = this.itemData(item);
+ if (data && data.source && dataSource[data.source]) {
+ return dataSource[data.source];
+ }
+ var parent;
+ do {
+ parent = this.parent(item);
+ data = this.itemData(parent);
+ if (data && data.source && dataSource[data.source]) {
+ return dataSource[data.source];
+ }
+ } while (parent.length);
+ }
+ return this._instance.options.ajax;
+ },
+ // process item loading with AJAX
+ // `item` can be NULL to load the ROOT
+ // loaded data need to be array of item objects
+ // each item can have children (defined as `itemData.branch` - array of item data objects)
+ ajaxLoad: function(item, options) {
+ if (item && this.isBusy(item)) {
+ // delay the load if busy
+ this._delayBusy(item, function() {
+ this.ajaxLoad(item, options);
+ });
+ return;
+ }
+ options = this._options(options, function() {
+ this._loading(item);
+ this._trigger(item, 'loaded', options);
+ }, function() {
+ this._loading(item);
+ this._trigger(item, 'loadfail', options);
+ }, function() {
+ this._loading(item);
+ this._trigger(item, 'wasloaded', options);
+ });
+ if (!item || this.isInode(item)) {
+ // add the task to the queue
+ this._instance.queue.push(function(complete) {
+ // a way to cancel the operation
+ if (!this._trigger(item, 'beforeload', options)) {
+ this._fail(item, options);
+ complete();
+ return;
+ }
+ this._loading(item, true);
+ if (this.wasLoad(item)) {
+ // was load already
+ this._notify(item, options);
+ complete();
+ return;
+ }
+ // ensure we work on a copy of the dataSource object
+ var settings = $.extend({
+ }, this._dataSource(item));
+ // call the `aciTree.options.ajaxHook`
+ this._instance.options.ajaxHook.call(this, item, settings);
+ // loaded data need to be array of item objects
+ settings.success = this.proxy(function(itemList) {
+ if (itemList && (itemList instanceof Array) && itemList.length) {
+ // the AJAX returned some items
+ var process = function() {
+ if (this.wasLoad(item)) {
+ this._notify(item, options);
+ complete();
+ } else {
+ // create a branch from `itemList`
+ this._createBranch(item, this._inner(options, {
+ success: function() {
+ this._success(item, options);
+ complete();
+ },
+ fail: function() {
+ this._fail(item, options);
+ complete();
+ },
+ itemData: itemList
+ }));
+ }
+ };
+ if (!item || this.isInode(item)) {
+ process.apply(this);
+ } else {
+ // change the item to inode, then load
+ this.setInode(item, this._inner(options, {
+ success: process,
+ fail: options.fail
+ }));
+ }
+ } else {
+ // the AJAX response was not just right (or not a inode)
+ var process = function() {
+ this._fail(item, options);
+ complete();
+ };
+ if (!item || this.isLeaf(item)) {
+ process.apply(this);
+ } else {
+ // change the item to leaf
+ this.setLeaf(item, this._inner(options, {
+ success: process,
+ fail: process
+ }));
+ }
+ }
+ });
+ settings.error = this.proxy(function() {
+ // AJAX failed
+ this._fail(item, options);
+ complete();
+ });
+ $.ajax(settings);
+ }, true);
+ } else {
+ this._fail(item, options);
+ }
+ },
+ // process item loading
+ // `item` can be NULL to load the ROOT
+ // `options.itemData` need to be array of item objects
+ // each item can have children (defined as `itemData.branch` - array of item data objects)
+ loadFrom: function(item, options) {
+ if (item && this.isBusy(item)) {
+ // delay the load if busy
+ this._delayBusy(item, function() {
+ this.loadFrom(item, options);
+ });
+ return;
+ }
+ options = this._options(options, function() {
+ this._loading(item);
+ this._trigger(item, 'loaded', options);
+ }, function() {
+ this._loading(item);
+ this._trigger(item, 'loadfail', options);
+ }, function() {
+ this._loading(item);
+ this._trigger(item, 'wasloaded', options);
+ });
+ if (!item || this.isInode(item)) {
+ // a way to cancel the operation
+ if (!this._trigger(item, 'beforeload', options)) {
+ this._fail(item, options);
+ return;
+ }
+ this._loading(item, true);
+ if (this.wasLoad(item)) {
+ // was load already
+ this._notify(item, options);
+ return;
+ }
+ // data need to be array of item objects
+ if (options.itemData && (options.itemData instanceof Array) && options.itemData.length) {
+ // create the branch from `options.itemData`
+ var process = function() {
+ if (this.wasLoad(item)) {
+ this._notify(item, options);
+ } else {
+ this._createBranch(item, options);
+ }
+ };
+ if (!item || this.isInode(item)) {
+ process.apply(this);
+ } else {
+ // change the item to inode, then create children
+ this.setInode(item, this._inner(options, {
+ success: process,
+ fail: options.fail
+ }));
+ }
+ } else {
+ // this is not a inode
+ if (!item || this.isLeaf(item)) {
+ this._fail(item, options);
+ } else {
+ // change the item to leaf
+ this.setLeaf(item, this._inner(options, {
+ success: options.fail,
+ fail: options.fail
+ }));
+ }
+ }
+ } else {
+ this._fail(item, options);
+ }
+ },
+ // unload item
+ // `item` can be NULL to unload the entire tree
+ unload: function(item, options) {
+ options = this._options(options, function() {
+ this._loading(item);
+ this._trigger(item, 'unloaded', options);
+ }, function() {
+ this._loading(item);
+ this._trigger(item, 'unloadfail', options);
+ }, function() {
+ this._loading(item);
+ this._trigger(item, 'notloaded', options);
+ });
+ if (!item || this.isInode(item)) {
+ // a way to cancel the operation
+ if (!this._trigger(item, 'beforeunload', options)) {
+ this._fail(item, options);
+ return;
+ }
+ this._loading(item, true);
+ if (!this.wasLoad(item)) {
+ // if was not loaded
+ this._notify(item, options);
+ return;
+ }
+ // first check each children
+ var cancel = false;
+ var children = this.children(item, true, true);
+ children.each(this.proxy(function(element) {
+ var item = $(element);
+ if (this.isInode(item)) {
+ if (this.isOpen(item)) {
+ // a way to cancel the operation
+ if (!this._trigger(item, 'beforeclose', options)) {
+ cancel = true;
+ return false;
+ }
+ }
+ if (this.wasLoad(item)) {
+ // a way to cancel the operation
+ if (!this._trigger(item, 'beforeunload', options)) {
+ cancel = true;
+ return false;
+ }
+ }
+ }
+ // a way to cancel the operation
+ if (!this._trigger(item, 'beforeremove', options)) {
+ cancel = true;
+ return false;
+ }
+ }, true));
+ if (cancel) {
+ // it was canceled
+ this._fail(item, options);
+ return;
+ }
+ var process = function() {
+ children.each(this.proxy(function(element) {
+ // trigger the events before DOM changes
+ var item = $(element);
+ if (this.isInode(item)) {
+ if (this.isOpen(item)) {
+ this._trigger(item, 'closed', options);
+ }
+ if (this.wasLoad(item)) {
+ this._trigger(item, 'unloaded', options);
+ }
+ }
+ this._trigger(item, 'removed', options);
+ }, true));
+ };
+ // process the child remove
+ if (item) {
+ if (this.isOpen(item)) {
+ // first close the item, then remove children
+ this.close(item, this._inner(options, {
+ success: function() {
+ process.call(this);
+ this._removeContainer(item);
+ this._success(item, options);
+ },
+ fail: options.fail
+ }));
+ } else {
+ process.call(this);
+ this._removeContainer(item);
+ this._success(item, options);
+ }
+ } else {
+ // unload the ROOT
+ this._animate(item, false, !this._instance.options.animateRoot || options.unanimated, function() {
+ process.call(this);
+ this._removeContainer();
+ this._success(item, options);
+ });
+ }
+ } else {
+ this._fail(item, options);
+ }
+ },
+ // remove item
+ remove: function(item, options) {
+ if (this.isItem(item)) {
+ if (this.hasSiblings(item, true)) {
+ options = this._options(options, function() {
+ if (this.isOpenPath(item)) {
+ // if the parents are opened (visible) update the item states
+ domApi.removeClass(item[0], 'aciTreeVisible');
+ this._setOddEven(item);
+ }
+ this._trigger(item, 'removed', options);
+ }, 'removefail', null, item);
+ // a way to cancel the operation
+ if (!this._trigger(item, 'beforeremove', options)) {
+ this._fail(item, options);
+ return;
+ }
+ if (this.wasLoad(item)) {
+ // unload the inode then remove
+ this.unload(item, this._inner(options, {
+ success: function() {
+ this._success(item, options);
+ this._removeItem(item);
+ },
+ fail: options.fail
+ }));
+ } else {
+ // just remove the item
+ this._success(item, options);
+ this._removeItem(item);
+ }
+ } else {
+ var parent = this.parent(item);
+ if (parent.length) {
+ this.setLeaf(parent, options);
+ } else {
+ this.unload(null, options);
+ }
+ }
+ } else {
+ this._trigger(item, 'removefail', options)
+ this._fail(item, options);
+ }
+ },
+ // open item children
+ _openChildren: function(item, options) {
+ if (options.expand) {
+ var queue = this._instance.queue;
+ // process the children inodes
+ this.inodes(this.children(item)).each(function() {
+ var item = $(this);
+ // queue node opening
+ queue.push(function(complete) {
+ this.open(item, this._inner(options));
+ complete();
+ });
+ });
+ queue.push(function(complete) {
+ this._success(item, options);
+ complete();
+ });
+ } else {
+ this._success(item, options);
+ }
+ },
+ // process item open
+ _openItem: function(item, options) {
+ if (!options.unanimated && !this.isVisible(item)) {
+ options.unanimated = true;
+ }
+ if (options.unique) {
+ // close other opened nodes
+ this.closeOthers(item);
+ options.unique = false;
+ }
+ // open the node
+ this._coreDOM.toggle(item, true);
+ // (temporarily) update children states
+ this._setOddEvenChildren(item);
+ this._animate(item, true, options.unanimated, function() {
+ this._openChildren(item, options);
+ });
+ },
+ // open item and his children if requested
+ open: function(item, options) {
+ options = this._options(options, function() {
+ if (this.isOpenPath(item)) {
+ // if all parents are open, update the items after
+ this._updateVisible(item);
+ this._setOddEven(item);
+ }
+ this._trigger(item, 'opened', options);
+ }, 'openfail', 'wasopened', item);
+ if (this.isInode(item)) {
+ // a way to cancel the operation
+ if (!this._trigger(item, 'beforeopen', options)) {
+ this._fail(item, options);
+ return;
+ }
+ if (this.isOpen(item)) {
+ options.success = options.notify;
+ // propagate/open children (if required)
+ this._openChildren(item, options);
+ } else {
+ if (this.wasLoad(item)) {
+ this._openItem(item, options);
+ } else {
+ // try to load the node, then open
+ this.ajaxLoad(item, this._inner(options, {
+ success: function() {
+ this._openItem(item, options);
+ },
+ fail: options.fail
+ }));
+ }
+ }
+ } else {
+ this._fail(item, options);
+ }
+ },
+ // close item children
+ _closeChildren: function(item, options) {
+ if (this._instance.options.empty) {
+ // unload on close
+ options.unanimated = true;
+ this.unload(item, options);
+ } else if (options.collapse) {
+ var queue = this._instance.queue;
+ // process the children inodes
+ this.inodes(this.children(item)).each(function() {
+ var item = $(this);
+ // queue node close
+ queue.push(function(complete) {
+ this.close(item, this._inner(options, {
+ unanimated: true
+ }));
+ complete();
+ });
+ });
+ queue.push(function(complete) {
+ this._success(item, options);
+ complete();
+ });
+ } else {
+ this._success(item, options);
+ }
+ },
+ // process item close
+ _closeItem: function(item, options) {
+ if (!options.unanimated && !this.isVisible(item)) {
+ options.unanimated = true;
+ }
+ // close the item
+ this._coreDOM.toggle(item, false);
+ this._animate(item, false, options.unanimated, function() {
+ this._closeChildren(item, options);
+ });
+ },
+ // close item and his children if requested
+ close: function(item, options) {
+ options = this._options(options, function() {
+ if (this.isOpenPath(item)) {
+ // if all parents are open, update the items after
+ this._updateVisible(item);
+ this._setOddEven(item);
+ }
+ this._trigger(item, 'closed', options);
+ }, 'closefail', 'wasclosed', item);
+ if (this.isInode(item)) {
+ // a way to cancel the operation
+ if (!this._trigger(item, 'beforeclose', options)) {
+ this._fail(item, options);
+ return;
+ }
+ if (this.isOpen(item)) {
+ this._closeItem(item, options);
+ } else if (this.wasLoad(item)) {
+ options.success = options.notify;
+ // propagate/close/empty children (if required)
+ this._closeChildren(item, options);
+ } else {
+ this._notify(item, options);
+ }
+ } else {
+ this._fail(item, options);
+ }
+ },
+ // update visible state
+ _updateVisible: function(item) {
+ if (this.isOpenPath(item)) {
+ if (!this.isHidden(item)) {
+ // if open parents and not hidden
+ domApi.addClass(item[0], 'aciTreeVisible');
+ if (this.isOpen(item)) {
+ // process children
+ domApi.children(item[0], false, this.proxy(function(node) {
+ if (!domApi.hasClass(node, 'aciTreeVisible')) {
+ this._updateVisible($(node));
+ }
+ }));
+ } else {
+ // children are not visible
+ domApi.children(item[0], true, function(node) {
+ return domApi.removeClass(node, 'aciTreeVisible') ? true : null;
+ });
+ }
+ }
+ } else if (domApi.removeClass(item[0], 'aciTreeVisible')) {
+ domApi.children(item[0], true, function(node) {
+ return domApi.removeClass(node, 'aciTreeVisible') ? true : null;
+ });
+ }
+ },
+ // keep just one branch open
+ closeOthers: function(item, options) {
+ options = this._options(options);
+ if (this.isItem(item)) {
+ var queue = this._instance.queue;
+ // exclude the item and his parents
+ var exclude = item.add(this.path(item)).add(this.children(item, true));
+ // close all other open nodes
+ this.inodes(this.children(null, true, true), true).not(exclude).each(function() {
+ var item = $(this);
+ // add node to close queue
+ queue.push(function(complete) {
+ this.close(item, this._inner(options));
+ complete();
+ });
+ });
+ queue.push(function(complete) {
+ this._success(item, options);
+ complete();
+ });
+ } else {
+ this._fail(item, options);
+ }
+ },
+ // toggle item
+ toggle: function(item, options) {
+ options = this._options(options, 'toggled', 'togglefail', null, item);
+ if (this.isInode(item)) {
+ // a way to cancel the operation
+ if (!this._trigger(item, 'beforetoggle', options)) {
+ this._fail(item, options);
+ return;
+ }
+ if (this.isOpen(item)) {
+ this.close(item, options);
+ } else {
+ this.open(item, options);
+ }
+ } else {
+ this._fail(item, options);
+ }
+ },
+ // get item path starting from the top parent (ROOT)
+ // when `reverse` is TRUE returns the path in reverse order
+ path: function(item, reverse) {
+ if (item) {
+ var parent = item[0], list = [];
+ while (parent = domApi.parent(parent)) {
+ list.push(parent);
+ }
+ return reverse ? $(list) : $(list.reverse());
+ }
+ return $([]);
+ },
+ // test if item is in view
+ // when `center` is TRUE will test if is centered in view
+ isVisible: function(item, center) {
+ if (item && domApi.hasClass(item[0], 'aciTreeVisible')) {
+ // the item path need to be open
+ var rect = this._instance.jQuery[0].getBoundingClientRect();
+ var size = item[0].firstChild;
+ var test = size.getBoundingClientRect();
+ var height = size.offsetHeight;
+ var offset = center ? (rect.bottom - rect.top) / 2 : 0;
+ if ((test.bottom - height < rect.top + offset) || (test.top + height > rect.bottom - offset)) {
+ // is out of view
+ return false;
+ }
+ return true;
+ }
+ return false;
+ },
+ // open path to item
+ openPath: function(item, options) {
+ options = this._options(options);
+ if (this.isItem(item)) {
+ var queue = this._instance.queue;
+ // process closed inodes
+ this.inodes(this.path(item), false).each(function() {
+ var item = $(this);
+ // add node to open queue
+ queue.push(function(complete) {
+ this.open(item, this._inner(options));
+ complete();
+ });
+ });
+ queue.push(function(complete) {
+ this._success(item, options);
+ complete();
+ });
+ } else {
+ this._fail(item, options);
+ }
+ },
+ // test if path to item is open
+ isOpenPath: function(item) {
+ var parent = this.parent(item);
+ return parent[0] ? this.isOpen(parent) && domApi.hasClass(parent[0], 'aciTreeVisible') : true;
+ },
+ // get animation speed vs. offset size
+ // `speed` is the raw speed
+ // `totalSize` is the available size
+ // `required` is the offset used for calculations
+ _speedFraction: function(speed, totalSize, required) {
+ if ((required < totalSize) && totalSize) {
+ var numeric = parseInt(speed);
+ if (isNaN(numeric)) {
+ // predefined string values
+ switch (speed) {
+ case 'slow':
+ numeric = 600;
+ break;
+ case 'medium':
+ numeric = 400;
+ break;
+ case 'fast':
+ numeric = 200;
+ break;
+ default:
+ return speed;
+ }
+ }
+ return numeric * required / totalSize;
+ }
+ return speed;
+ },
+ // bring item in view
+ // `options.center` says if should be centered in view
+ setVisible: function(item, options) {
+ options = this._options(options, 'visible', 'visiblefail', 'wasvisible', item);
+ if (this.isItem(item)) {
+ // a way to cancel the operation
+ if (!this._trigger(item, 'beforevisible', options)) {
+ this._fail(item, options);
+ return;
+ }
+ if (this.isVisible(item)) {
+ // is visible already
+ this._notify(item, options);
+ return;
+ }
+ var process = function() {
+ // compute position with getBoundingClientRect
+ var rect = this._instance.jQuery[0].getBoundingClientRect();
+ var size = item[0].firstChild;
+ var test = size.getBoundingClientRect();
+ var height = size.offsetHeight;
+ var offset = options.center ? (rect.bottom - rect.top) / 2 : 0;
+ if (test.bottom - height < rect.top + offset) {
+ // item somewhere before the first visible
+ var diff = rect.top + offset - test.bottom + height;
+ if (!options.unanimated && this._instance.options.view) {
+ this._instance.jQuery.stop(true).animate({
+ scrollTop: this._instance.jQuery.scrollTop() - diff
+ },
+ {
+ duration: this._speedFraction(this._instance.options.view.duration, rect.bottom - rect.top, diff),
+ easing: this._instance.options.view.easing,
+ complete: this.proxy(function() {
+ this._success(item, options);
+ })
+ });
+ } else {
+ this._instance.jQuery.stop(true)[0].scrollTop = this._instance.jQuery.scrollTop() - diff;
+ this._success(item, options);
+ }
+ } else if (test.top + height > rect.bottom - offset) {
+ // item somewhere after the last visible
+ var diff = test.top - rect.bottom + offset + height;
+ if (!options.unanimated && this._instance.options.view) {
+ this._instance.jQuery.stop(true).animate({
+ scrollTop: this._instance.jQuery.scrollTop() + diff
+ },
+ {
+ duration: this._speedFraction(this._instance.options.view.duration, rect.bottom - rect.top, diff),
+ easing: this._instance.options.view.easing,
+ complete: this.proxy(function() {
+ this._success(item, options);
+ })
+ });
+ } else {
+ this._instance.jQuery.stop(true)[0].scrollTop = this._instance.jQuery.scrollTop() + diff;
+ this._success(item, options);
+ }
+ } else {
+ this._success(item, options);
+ }
+ };
+ if (this.hasParent(item)) {
+ // first we need to open the path to item
+ this.openPath(item, this._inner(options, {
+ success: process,
+ fail: options.fail
+ }));
+ } else {
+ process.apply(this);
+ }
+ } else {
+ this._fail(item, options);
+ }
+ },
+ // test if item has parent
+ hasParent: function(item) {
+ return this.parent(item).length > 0;
+ },
+ // get item parent
+ parent: function(item) {
+ return item ? $(domApi.parent(item[0])) : $([]);
+ },
+ // get item top (ROOT) parent
+ topParent: function(item) {
+ return this.path(item).eq(0);
+ },
+ // create tree branch
+ // `options.itemData` need to be in the same format as for .append
+ _createBranch: function(item, options) {
+ var total = 0;
+ var count = function(itemList) {
+ var itemData;
+ for (var i = 0; i < itemList.length; i++) {
+ itemData = itemList[i];
+ if (itemData.branch && (itemData.branch instanceof Array) && itemData.branch.length) {
+ count(itemData.branch);
+ }
+ }
+ total++;
+ };
+ count(options.itemData);
+ var index = 0;
+ var complete = this.proxy(function() {
+ index++;
+ if (index >= total) {
+ this._success(item, options);
+ }
+ });
+ var process = this.proxy(function(node, itemList) {
+ if (node) {
+ // set it as a inode
+ domApi.addRemoveClass(node[0], 'aciTreeInode', 'aciTreeInodeMaybe');
+ }
+ // use .append to add new items
+ this.append(node, this._inner(options, {
+ success: function(item, options) {
+ var itemData;
+ for (var i = 0; i < options.itemData.length; i++) {
+ itemData = options.itemData[i];
+ // children need to be array of item objects
+ if (itemData.branch && (itemData.branch instanceof Array) && itemData.branch.length) {
+ process(options.items.eq(i), itemData.branch);
+ }
+ if (itemData.open) {
+ // open the item is requuested
+ this.open(options.items.eq(i), this._inner(options, {
+ itemData: null,
+ items: null
+ }));
+ }
+ }
+ complete();
+ },
+ fail: options.fail,
+ itemData: itemList
+ }));
+ });
+ process(item, options.itemData);
+ },
+ // get first/last items
+ _getFirstLast: function(parent) {
+ if (!parent) {
+ parent = this._instance.jQuery;
+ }
+ return $(domApi.withAnyClass(domApi.children(parent[0]), ['aciTreeFirst', 'aciTreeLast']));
+ },
+ // update first/last items
+ _setFirstLast: function(parent, clear) {
+ if (clear) {
+ domApi.removeListClass(clear.toArray(), ['aciTreeFirst', 'aciTreeLast']);
+ }
+ var first = this.first(parent);
+ if (first[0]) {
+ domApi.addClass(first[0], 'aciTreeFirst');
+ domApi.addClass(this.last(parent)[0], 'aciTreeLast');
+ }
+ },
+ // update odd/even state
+ _setOddEven: function(items) {
+ // consider only visible items
+ var visible;
+ if (this._instance.jQuery[0].getElementsByClassName) {
+ visible = this._instance.jQuery[0].getElementsByClassName('aciTreeVisible');
+ visible = visible ? window.Array.prototype.slice.call(visible) : [];
+ } else {
+ visible = $(domApi.children(this._instance.jQuery[0], true, function(node) {
+ return this.hasClass(node, 'aciTreeVisible') ? true : null;
+ }));
+ }
+ var odd = true;
+ if (visible.length) {
+ var index = 0;
+ if (items) {
+ // search the item to start with (by index)
+ items.each(function() {
+ if (visible.indexOf) {
+ var found = visible.indexOf(this);
+ if (found != -1) {
+ index = window.Math.min(found, index);
+ }
+ } else {
+ for (var i = 0; i < visible.length; i++) {
+ if (visible[i] === this) {
+ index = window.Math.min(i, index);
+ break;
+ }
+ }
+ }
+ });
+ index = window.Math.max(index - 1, 0);
+ }
+ if (index > 0) {
+ // determine with what to start with (odd/even)
+ var first = visible[index];
+ if (domApi.hasClass(first, 'aciTreOdd')) {
+ odd = false;
+ }
+ // process only after index
+ visible = visible.slice(index + 1);
+ }
+ }
+ this._coreDOM.oddEven($(visible), odd);
+ },
+ // update odd/even state for direct children
+ _setOddEvenChildren: function(item) {
+ var odd = domApi.hasClass(item[0], 'aciTreeOdd');
+ var children = this.children(item);
+ this._coreDOM.oddEven(children, !odd);
+ },
+ // process item before inserting into the DOM
+ _itemHook: function(parent, item, itemData, level) {
+ if (this._instance.options.itemHook) {
+ this._instance.options.itemHook.apply(this, arguments);
+ }
+ },
+ // create item by `itemData`
+ // `level` is the #0 based item level
+ _createItem: function(itemData, level) {
+ if (this._private.itemClone[level]) {
+ var li = this._private.itemClone[level].cloneNode(true);
+ var line = li.firstChild;
+ var icon = line;
+ for (var i = 0; i < level; i++) {
+ icon = icon.firstChild;
+ }
+ icon = icon.firstChild.lastChild.firstChild;
+ var text = icon.nextSibling;
+ } else {
+ var li = window.document.createElement('LI');
+ li.setAttribute('role', 'presentation');
+ var line = window.document.createElement('DIV');
+ li.appendChild(line);
+ line.setAttribute('tabindex', -1);
+ line.setAttribute('role', 'treeitem');
+ line.setAttribute('aria-selected', false);
+ line.className = 'aciTreeLine';
+ var last = line, branch;
+ for (var i = 0; i < level; i++) {
+ branch = window.document.createElement('DIV');
+ last.appendChild(branch);
+ branch.className = 'aciTreeBranch aciTreeLevel' + i;
+ last = branch;
+ }
+ var entry = window.document.createElement('DIV');
+ last.appendChild(entry);
+ entry.className = 'aciTreeEntry';
+ var button = window.document.createElement('SPAN');
+ entry.appendChild(button);
+ button.className = 'aciTreeButton';
+ var push = window.document.createElement('SPAN');
+ button.appendChild(push);
+ push.className = 'aciTreePush';
+ push.appendChild(window.document.createElement('SPAN'));
+ var item = window.document.createElement('SPAN');
+ entry.appendChild(item);
+ item.className = 'aciTreeItem';
+ var icon = window.document.createElement('SPAN');
+ item.appendChild(icon);
+ var text = window.document.createElement('SPAN');
+ item.appendChild(text);
+ text.className = 'aciTreeText';
+ this._private.itemClone[level] = li.cloneNode(true);
+ }
+ li.className = 'aciTreeLi' + (itemData.inode || (itemData.inode === null) ? (itemData.inode || (itemData.branch && itemData.branch.length) ? ' aciTreeInode' : ' aciTreeInodeMaybe') : ' aciTreeLeaf') + ' aciTreeLevel' + level + (itemData.disabled ? ' aciTreeDisabled' : '');
+ line.setAttribute('aria-level', level + 1);
+ if (itemData.inode || (itemData.inode === null)) {
+ line.setAttribute('aria-expanded', false);
+ }
+ if (itemData.icon) {
+ if (itemData.icon instanceof Array) {
+ icon.className = 'aciTreeIcon ' + itemData.icon[0];
+ icon.style.backgroundPosition = itemData.icon[1] + 'px ' + itemData.icon[2] + 'px';
+ } else {
+ icon.className = 'aciTreeIcon ' + itemData.icon;
+ }
+ } else {
+ icon.parentNode.removeChild(icon);
+ }
+ text.innerHTML = itemData.label;
+ var $li = $(li);
+ $li.data('itemData' + this._instance.nameSpace, $.extend({
+ }, itemData, {
+ branch: itemData.branch && itemData.branch.length
+ }));
+ return $li;
+ },
+ // remove item
+ _removeItem: function(item) {
+ var parent = this.parent(item);
+ item.remove();
+ // update sibling state
+ this._setFirstLast(parent.length ? parent : null);
+ },
+ // create & add one or more items
+ // `ul`, `before` and `after` are set depending on the caller
+ // `itemData` need to be array of objects or just an object (one item)
+ // `level` is the #0 based level
+ // `callback` function (items) is called at the end of the operation
+ _createItems: function(ul, before, after, itemData, level, callback) {
+ var items = [], fragment = window.document.createDocumentFragment();
+ var task = new this._task(this._instance.queue, function(complete) {
+ items = $(items);
+ if (items.length) {
+ // add the new items
+ if (ul) {
+ ul[0].appendChild(fragment);
+ } else if (before) {
+ before[0].parentNode.insertBefore(fragment, before[0]);
+ } else if (after) {
+ after[0].parentNode.insertBefore(fragment, after[0].nextSibling);
+ }
+ }
+ callback.call(this, items);
+ complete();
+ });
+ if (itemData) {
+ this._loader(true);
+ var parent;
+ if (ul) {
+ parent = this.itemFrom(ul);
+ } else if (before) {
+ parent = this.parent(before);
+ } else if (after) {
+ parent = this.parent(after);
+ }
+ if (itemData instanceof Array) {
+ // this is a list of items
+ for (var i = 0; i < itemData.length; i++) {
+ (function(itemData) {
+ task.push(function(complete) {
+ var item = this._createItem(itemData, level);
+ this._itemHook(parent, item, itemData, level);
+ fragment.appendChild(item[0]);
+ items.push(item[0]);
+ complete();
+ });
+ })(itemData[i]);
+ }
+ } else {
+ task.push(function(complete) {
+ // only one item
+ var item = this._createItem(itemData, level);
+ this._itemHook(parent, item, itemData, level);
+ fragment.appendChild(item[0]);
+ items.push(item[0]);
+ complete();
+ });
+ }
+ }
+ // run at least once
+ task.push(function(complete) {
+ complete();
+ });
+ },
+ // create children container
+ _createContainer: function(item) {
+ if (!item) {
+ item = this._instance.jQuery;
+ }
+ // ensure we have a UL in place
+ var ul = domApi.container(item[0]);
+ if (!ul) {
+ var ul = window.document.createElement('UL');
+ ul.setAttribute('role', 'group');
+ ul.className = 'aciTreeUl';
+ ul.style.display = 'none';
+ item[0].appendChild(ul);
+ }
+ return $(ul);
+ },
+ // remove children container
+ _removeContainer: function(item) {
+ if (!item) {
+ item = this._instance.jQuery;
+ }
+ var ul = domApi.container(item[0]);
+ ul.parentNode.removeChild(ul);
+ },
+ // append one or more items to item
+ // `options.itemData` can be a item object or array of item objects
+ // `options.items` will keep a list of added items
+ append: function(item, options) {
+ options = this._options(options, 'appended', 'appendfail', null, item);
+ if (item) {
+ if (this.isInode(item)) {
+ // a way to cancel the operation
+ if (!this._trigger(item, 'beforeappend', options)) {
+ this._fail(item, options);
+ return;
+ }
+ var container = this._createContainer(item);
+ var last = this.last(item);
+ this._createItems(container, null, null, options.itemData, this.level(item) + 1, function(list) {
+ if (list.length) {
+ // some items created, update states
+ domApi.addRemoveClass(item[0], 'aciTreeInode', 'aciTreeInodeMaybe');
+ this._setFirstLast(item, last);
+ if (this.isHidden(item)) {
+ domApi.addListClass(list.toArray(), 'aciTreeHidden');
+ } else if (this.isOpenPath(item) && this.isOpen(item)) {
+ domApi.addListClass(list.toArray(), 'aciTreeVisible');
+ this._setOddEven(list.first());
+ }
+ // trigger `added` for each item
+ list.each(this.proxy(function(element) {
+ this._trigger($(element), 'added', options);
+ }, true));
+ } else if (!this.hasChildren(item, true)) {
+ container.remove();
+ }
+ options.items = list;
+ this._success(item, options);
+ });
+ } else {
+ this._fail(item, options);
+ }
+ } else {
+ // a way to cancel the operation
+ if (!this._trigger(item, 'beforeappend', options)) {
+ this._fail(item, options);
+ return;
+ }
+ var container = this._createContainer();
+ var last = this.last();
+ this._createItems(container, null, null, options.itemData, 0, function(list) {
+ if (list.length) {
+ // some items created, update states
+ this._setFirstLast(null, last);
+ domApi.addListClass(list.toArray(), 'aciTreeVisible');
+ this._setOddEven();
+ // trigger `added` for each item
+ list.each(this.proxy(function(element) {
+ this._trigger($(element), 'added', options);
+ }, true));
+ this._animate(null, true, !this._instance.options.animateRoot || options.unanimated);
+ } else if (!this.hasChildren(null, true)) {
+ // remove the children container
+ container.remove();
+ }
+ options.items = list;
+ this._success(item, options);
+ });
+ }
+ },
+ // insert one or more items before item
+ // `options.itemData` can be a item object or array of item objects
+ // `options.items` will keep a list of added items
+ before: function(item, options) {
+ options = this._options(options, 'before', 'beforefail', null, item);
+ if (this.isItem(item)) {
+ // a way to cancel the operation
+ if (!this._trigger(item, 'beforebefore', options)) {
+ this._fail(item, options);
+ return;
+ }
+ var prev = this.prev(item);
+ this._createItems(null, item, null, options.itemData, this.level(item), function(list) {
+ if (list.length) {
+ // some items created, update states
+ if (!prev.length) {
+ domApi.removeClass(item[0], 'aciTreeFirst');
+ domApi.addClass(list.first()[0], 'aciTreeFirst');
+ }
+ var parent = this.parent(item);
+ if (parent.length && this.isHidden(parent)) {
+ domApi.addListClass(list.toArray(), 'aciTreeHidden');
+ } else if (this.isOpenPath(item)) {
+ domApi.addListClass(list.toArray(), 'aciTreeVisible');
+ this._setOddEven(list.first());
+ }
+ // trigger `added` for each item
+ list.each(this.proxy(function(element) {
+ this._trigger($(element), 'added', options);
+ }, true));
+ }
+ options.items = list;
+ this._success(item, options);
+ });
+ } else {
+ this._fail(item, options);
+ }
+ },
+ // insert one or more items after item
+ // `options.itemData` can be a item object or array of item objects
+ // `options.items` will keep a list of added items
+ after: function(item, options) {
+ options = this._options(options, 'after', 'afterfail', null, item);
+ if (this.isItem(item)) {
+ // a way to cancel the operation
+ if (!this._trigger(item, 'beforeafter', options)) {
+ this._fail(item, options);
+ return;
+ }
+ var next = this.next(item);
+ this._createItems(null, null, item, options.itemData, this.level(item), function(list) {
+ if (list.length) {
+ // some items created, update states
+ if (!next.length) {
+ domApi.removeClass(item[0], 'aciTreeLast');
+ domApi.addClass(list.last()[0], 'aciTreeLast');
+ }
+ var parent = this.parent(item);
+ if (parent.length && this.isHidden(parent)) {
+ domApi.addListClass(list.toArray(), 'aciTreeHidden');
+ } else if (this.isOpenPath(item)) {
+ domApi.addListClass(list.toArray(), 'aciTreeVisible');
+ this._setOddEven(list.first());
+ }
+ // trigger `added` for each item
+ list.each(this.proxy(function(element) {
+ this._trigger($(element), 'added', options);
+ }, true));
+ }
+ options.items = list;
+ this._success(item, options);
+ });
+ } else {
+ this._fail(item, options);
+ }
+ },
+ // get item having the element
+ itemFrom: function(element) {
+ if (element) {
+ var item = $(element);
+ if (item[0] === this._instance.jQuery[0]) {
+ return $([]);
+ } else {
+ return $(domApi.parentFrom(item[0]));
+ }
+ }
+ return $([]);
+ },
+ // get item children
+ // if `branch` is TRUE then all children are returned
+ // if `hidden` is TRUE then the hidden items will be considered too
+ children: function(item, branch, hidden) {
+ return $(domApi.children(item && item[0] ? item[0] : this._instance.jQuery[0], branch, hidden ? null : function(node) {
+ return this.hasClass(node, 'aciTreeHidden') ? null : true;
+ }));
+ },
+ // filter only the visible items (items with all parents opened)
+ // if `view` is TRUE then only the items in view are returned
+ visible: function(items, view) {
+ var list = domApi.withClass(items.toArray(), 'aciTreeVisible');
+ if (view) {
+ var filter = [];
+ for (var i = 0; i < list.length; i++) {
+ if (this.isVisible($(list[i]))) {
+ filter.push(list[i]);
+ }
+ }
+ return $(filter);
+ }
+ return $(list);
+ },
+ // filter only inner nodes from items
+ // if `state` is set then filter only open/closed ones
+ inodes: function(items, state) {
+ if (state !== undefined) {
+ if (state) {
+ return $(domApi.withClass(items.toArray(), 'aciTreeOpen'));
+ } else {
+ return $(domApi.withAnyClass(items.toArray(), ['aciTreeInode', 'aciTreeInodeMaybe'], 'aciTreeOpen'));
+ }
+ }
+ return $(domApi.withAnyClass(items.toArray(), ['aciTreeInode', 'aciTreeInodeMaybe']));
+ },
+ // filter only leaf nodes from items
+ leaves: function(items) {
+ return $(domApi.withClass(items.toArray(), 'aciTreeLeaf'));
+ },
+ // test if is a inner node
+ isInode: function(item) {
+ return item && domApi.hasAnyClass(item[0], ['aciTreeInode', 'aciTreeInodeMaybe']);
+ },
+ // test if is a leaf node
+ isLeaf: function(item) {
+ return item && domApi.hasClass(item[0], 'aciTreeLeaf');
+ },
+ // test if item was loaded
+ wasLoad: function(item) {
+ if (item) {
+ return domApi.container(item[0]) !== null;
+ }
+ return domApi.container(this._instance.jQuery[0]) !== null;
+ },
+ // set item as inner node
+ setInode: function(item, options) {
+ options = this._options(options, 'inodeset', 'inodefail', 'wasinode', item);
+ if (this.isItem(item)) {
+ // a way to cancel the operation
+ if (!this._trigger(item, 'beforeinode', options)) {
+ this._fail(item, options);
+ return;
+ }
+ if (this.isLeaf(item)) {
+ this._coreDOM.inode(item, true);
+ this._success(item, options);
+ } else {
+ this._notify(item, options);
+ }
+ } else {
+ this._fail(item, options);
+ }
+ },
+ // set item as leaf node
+ setLeaf: function(item, options) {
+ options = this._options(options, 'leafset', 'leaffail', 'wasleaf', item);
+ if (this.isItem(item)) {
+ // a way to cancel the operation
+ if (!this._trigger(item, 'beforeleaf', options)) {
+ this._fail(item, options);
+ return;
+ }
+ if (this.isInode(item)) {
+ var process = function() {
+ this._coreDOM.leaf(item);
+ this._success(item, options);
+ };
+ if (this.wasLoad(item)) {
+ // first unload the node
+ this.unload(item, this._inner(options, {
+ success: process,
+ fail: options.fail
+ }));
+ } else {
+ process.apply(this);
+ }
+ } else {
+ this._notify(item, options);
+ }
+ } else {
+ this._fail(item, options);
+ }
+ },
+ // add/update item icon
+ // `options.icon` can be the CSS class name or array['CSS class name', background-position-x, background-position-y]
+ // `options.oldIcon` will keep the old icon
+ addIcon: function(item, options) {
+ options = this._options(options, 'iconadded', 'addiconfail', 'wasicon', item);
+ if (this.isItem(item)) {
+ // a way to cancel the operation
+ if (!this._trigger(item, 'beforeaddicon', options)) {
+ this._fail(item, options);
+ return;
+ }
+ var data = this.itemData(item);
+ // keep the old one
+ options.oldIcon = data.icon;
+ var parent = domApi.childrenByClass(item[0].firstChild, 'aciTreeItem');
+ var found = domApi.childrenByClass(parent, 'aciTreeIcon');
+ if (found && data.icon && (options.icon.toString() == data.icon.toString())) {
+ this._notify(item, options);
+ } else {
+ if (!found) {
+ found = window.document.createElement('DIV');
+ parent.insertBefore(found, parent.firstChild);
+ }
+ if (options.icon instanceof Array) {
+ // icon with background-position
+ found.className = 'aciTreeIcon ' + options.icon[0];
+ found.style.backgroundPosition = options.icon[1] + 'px ' + options.icon[2] + 'px';
+ } else {
+ // only the CSS class name
+ found.className = 'aciTreeIcon ' + options.icon;
+ }
+ // remember this one
+ data.icon = options.icon;
+ this._success(item, options);
+ }
+ } else {
+ this._fail(item, options);
+ }
+ },
+ // remove item icon
+ // options.oldIcon will keep the old icon
+ removeIcon: function(item, options) {
+ options = this._options(options, 'iconremoved', 'removeiconfail', 'noticon', item);
+ if (this.isItem(item)) {
+ // a way to cancel the operation
+ if (!this._trigger(item, 'beforeremoveicon', options)) {
+ this._fail(item, options);
+ return;
+ }
+ var data = this.itemData(item);
+ // keep the old one
+ options.oldIcon = data.icon;
+ var parent = domApi.childrenByClass(item[0].firstChild, 'aciTreeItem');
+ var found = domApi.childrenByClass(parent, 'aciTreeIcon');
+ if (found) {
+ parent.removeChild(found);
+ // remember was removed
+ data.icon = null;
+ this._success(item, options);
+ } else {
+ this._notify(item, options);
+ }
+ } else {
+ this._fail(item, options);
+ }
+ },
+ // test if item has icon
+ hasIcon: function(item) {
+ return !!this.getIcon(item);
+ },
+ // get item icon
+ getIcon: function(item) {
+ var data = this.itemData(item);
+ return data ? data.icon : null;
+ },
+ // set item label
+ // `options.label` is the new label
+ // `options.oldLabel` will keep the old label
+ setLabel: function(item, options) {
+ options = this._options(options, 'labelset', 'labelfail', 'waslabel', item);
+ if (this.isItem(item)) {
+ // a way to cancel the operation
+ if (!this._trigger(item, 'beforelabel', options)) {
+ this._fail(item, options);
+ return;
+ }
+ var data = this.itemData(item);
+ // keep the old one
+ options.oldLabel = data.label;
+ if (options.label == options.oldLabel) {
+ this._notify(item, options);
+ } else {
+ // set the label
+ domApi.childrenByClass(item[0].firstChild, 'aciTreeText').innerHTML = options.label;
+ // remember this one
+ data.label = options.label;
+ this._success(item, options);
+ }
+ } else {
+ this._fail(item, options);
+ }
+ },
+ // disable item
+ disable: function(item, options) {
+ options = this._options(options, 'disabled', 'disablefail', 'wasdisabled', item);
+ if (this.isItem(item)) {
+ // a way to cancel the operation
+ if (!this._trigger(item, 'beforedisable', options)) {
+ this._fail(item, options);
+ return;
+ }
+ if (this.isDisabled(item)) {
+ this._notify(item, options);
+ } else {
+ domApi.addClass(item[0], 'aciTreeDisabled');
+ this._success(item, options);
+ }
+ } else {
+ this._fail(item, options);
+ }
+ },
+ // test if item is disabled
+ isDisabled: function(item) {
+ return item && domApi.hasClass(item[0], 'aciTreeDisabled');
+ },
+ // test if any of parents are disabled
+ isDisabledPath: function(item) {
+ return domApi.withClass(this.path(item).toArray(), 'aciTreeDisabled').length > 0;
+ },
+ // filter only the disabled items
+ disabled: function(items) {
+ return $(domApi.withClass(items.toArray(), 'aciTreeDisabled'));
+ },
+ // enable item
+ enable: function(item, options) {
+ options = this._options(options, 'enabled', 'enablefail', 'wasenabled', item);
+ if (this.isItem(item)) {
+ // a way to cancel the operation
+ if (!this._trigger(item, 'beforeenable', options)) {
+ this._fail(item, options);
+ return;
+ }
+ if (this.isDisabled(item)) {
+ domApi.removeClass(item[0], 'aciTreeDisabled');
+ this._success(item, options);
+ } else {
+ this._notify(item, options);
+ }
+ } else {
+ this._fail(item, options);
+ }
+ },
+ // test if item is enabled
+ isEnabled: function(item) {
+ return item && !domApi.hasClass(item[0], 'aciTreeDisabled');
+ },
+ // test if all parents are enabled
+ isEnabledPath: function(item) {
+ return domApi.withClass(this.path(item).toArray(), 'aciTreeDisabled').length == 0;
+ },
+ // filter only the enabled items
+ enabled: function(items) {
+ return $(domApi.withClass(items.toArray(), null, 'aciTreeDisabled'));
+ },
+ // set item as hidden
+ hide: function(item, options) {
+ options = this._options(options, 'hidden', 'hidefail', 'washidden', item);
+ if (this.isItem(item)) {
+ // a way to cancel the operation
+ if (!this._trigger(item, 'beforehide', options)) {
+ this._fail(item, options);
+ return;
+ }
+ if (this.isHidden(item)) {
+ this._notify(item, options);
+ } else {
+ domApi.addRemoveClass(item[0], 'aciTreeHidden', 'aciTreeVisible');
+ // process children
+ domApi.addRemoveClass(this.children(item, true).toArray(), 'aciTreeHidden', 'aciTreeVisible');
+ // update item states
+ var parent = this.parent(item);
+ this._setFirstLast(parent.length ? parent : null, item);
+ this._setOddEven(item);
+ this._success(item, options);
+ }
+ } else {
+ this._fail(item, options);
+ }
+ },
+ // test if item is hidden
+ isHidden: function(item) {
+ return item && domApi.hasClass(item[0], 'aciTreeHidden');
+ },
+ // test if any of parents are hidden
+ isHiddenPath: function(item) {
+ var parent = this.parent(item);
+ return parent[0] && domApi.hasClass(parent[0], 'aciTreeHidden');
+ },
+ // update hidden state
+ _updateHidden: function(item) {
+ if (this.isHiddenPath(item)) {
+ if (!this.isHidden(item)) {
+ domApi.addClass(item[0], 'aciTreeHidden');
+ this._updateVisible(item);
+ }
+ } else {
+ this._updateVisible(item);
+ }
+ },
+ // filter only the hidden items
+ hidden: function(items) {
+ return $(domApi.withClass(items.toArray(), 'aciTreeHidden'));
+ },
+ // show hidden item
+ _showHidden: function(item) {
+ var parent = null;
+ this.path(item).add(item).each(this.proxy(function(element) {
+ var item = $(element);
+ if (this.isHidden(item)) {
+ domApi.removeClass(item[0], 'aciTreeHidden');
+ if (this.isOpenPath(item) && (!parent || this.isOpen(parent))) {
+ domApi.addClass(item[0], 'aciTreeVisible');
+ }
+ // update item states
+ this._setFirstLast(parent, this._getFirstLast(parent));
+ }
+ parent = item;
+ }, true));
+ },
+ // show hidden item
+ show: function(item, options) {
+ options = this._options(options, 'shown', 'showfail', 'wasshown', item);
+ if (this.isItem(item)) {
+ // a way to cancel the operation
+ if (!this._trigger(item, 'beforeshow', options)) {
+ this._fail(item, options);
+ return;
+ }
+ if (this.isHidden(item)) {
+ this._showHidden(item);
+ var parent = this.topParent(item);
+ // update item states
+ this._setOddEven(parent.length ? parent : item);
+ this._success(item, options);
+ } else {
+ this._notify(item, options);
+ }
+ } else {
+ this._fail(item, options);
+ }
+ },
+ // test if item is open
+ isOpen: function(item) {
+ return item && domApi.hasClass(item[0], 'aciTreeOpen');
+ },
+ // test if item is closed
+ isClosed: function(item) {
+ return item && !domApi.hasClass(item[0], 'aciTreeOpen');
+ },
+ // test if item has children
+ // if `hidden` is TRUE then the hidden items will be considered too
+ hasChildren: function(item, hidden) {
+ return this.children(item, false, hidden).length > 0;
+ },
+ // test if item has siblings
+ // if `hidden` is TRUE then the hidden items will be considered too
+ hasSiblings: function(item, hidden) {
+ return this.siblings(item, hidden).length > 0;
+ },
+ // test if item has another before
+ // if `hidden` is TRUE then the hidden items will be considered too
+ hasPrev: function(item, hidden) {
+ return this.prev(item, hidden).length > 0;
+ },
+ // test if item has another after
+ // if `hidden` is TRUE then the hidden items will be considered too
+ hasNext: function(item, hidden) {
+ return this.next(item, hidden).length > 0;
+ },
+ // get item siblings
+ // if `hidden` is TRUE then the hidden items will be considered too
+ siblings: function(item, hidden) {
+ return item ? $(domApi.children(item[0].parentNode.parentNode, false, function(node) {
+ return (node != item[0]) && (hidden || !this.hasClass(node, 'aciTreeHidden'));
+ })) : $([]);
+ },
+ // get previous item
+ // if `hidden` is TRUE then the hidden items will be considered too
+ prev: function(item, hidden) {
+ return item ? $(domApi.prev(item[0], hidden ? null : function(node) {
+ return !this.hasClass(node, 'aciTreeHidden');
+ })) : $([]);
+ },
+ // get next item
+ // if `hidden` is TRUE then the hidden items will be considered too
+ next: function(item, hidden) {
+ return item ? $(domApi.next(item[0], hidden ? null : function(node) {
+ return !this.hasClass(node, 'aciTreeHidden');
+ })) : $([]);
+ },
+ // get item level - starting from 0
+ // return -1 for invalid items
+ level: function(item) {
+ var level = -1;
+ if (item) {
+ var node = item[0];
+ while (domApi.hasClass(node, 'aciTreeLi')) {
+ node = node.parentNode.parentNode;
+ level++;
+ }
+ }
+ return level;
+ },
+ // get item ID
+ getId: function(item) {
+ var data = this.itemData(item);
+ return data ? data.id : null;
+ },
+ // get item data
+ itemData: function(item) {
+ return item ? item.data('itemData' + this._instance.nameSpace) : null;
+ },
+ // set item ID
+ // `options.id` is the new item ID
+ // `options.oldId` will keep the old ID
+ setId: function(item, options) {
+ options = this._options(options, 'idset', 'idfail', 'wasid', item);
+ if (this.isItem(item)) {
+ // a way to cancel the operation
+ if (!this._trigger(item, 'beforeid', options)) {
+ this._fail(item, options);
+ return;
+ }
+ var data = this.itemData(item);
+ // keep the old one
+ options.oldId = data.id;
+ if (options.id == options.oldId) {
+ this._notify(item, options);
+ } else {
+ // remember this one
+ data.id = options.id;
+ this._success(item, options);
+ }
+ } else {
+ this._fail(item, options);
+ }
+ },
+ // get item index - starting from #0
+ getIndex: function(item) {
+ if (item && item[0]) {
+ if (window.Array.prototype.indexOf) {
+ return window.Array.prototype.indexOf.call(item[0].parentNode.childNodes, item[0]);
+ } else {
+ var children = item[0].parentNode.childNodes;
+ for (var i = 0; i < children.length; i++) {
+ if (children[i] == item[0]) {
+ return i;
+ }
+ }
+ }
+ }
+ return null;
+ },
+ // set item index - #0 based
+ // `options.index` is the new index
+ // `options.oldIndex` will keep the old index
+ setIndex: function(item, options) {
+ options = this._options(options, 'indexset', 'indexfail', 'wasindex', item);
+ if (this.isItem(item)) {
+ var oldIndex = this.getIndex(item);
+ var siblings = this.siblings(item);
+ if ((options.index != oldIndex) && !siblings.length) {
+ this._fail(item, options);
+ return;
+ }
+ // a way to cancel the operation
+ if (!this._trigger(item, 'beforeindex', options)) {
+ this._fail(item, options);
+ return;
+ }
+ // keep the old one
+ options.oldIndex = oldIndex;
+ if (options.index == oldIndex) {
+ this._notify(item, options);
+ } else {
+ // set the new index
+ if (options.index < 1) {
+ siblings.first().before(item);
+ } else if (options.index >= siblings.length) {
+ siblings.last().after(item);
+ } else {
+ siblings.eq(options.index).before(item);
+ }
+ var parent = this.parent(item);
+ // update item states
+ this._setFirstLast(parent.length ? parent : null, item.add([siblings[0], siblings.get(-1)]));
+ this._setOddEven(parent);
+ this._success(item, options);
+ }
+ } else {
+ this._fail(item, options);
+ }
+ },
+ // get item label
+ getLabel: function(item) {
+ var data = this.itemData(item);
+ return data ? data.label : null;
+ },
+ // test if is valid item
+ isItem: function(item) {
+ return item && domApi.hasClass(item[0], 'aciTreeLi');
+ },
+ // item animation
+ // `state` if TRUE then show, FALSE then hide
+ // `unanimated` if TRUE then don't use animations
+ // `callback` function () to call at the end
+ _animate: function(item, state, unanimated, callback) {
+ if (!item) {
+ item = this._instance.jQuery;
+ }
+ if (!unanimated) {
+ // use the defined animation props
+ var setting = state ? this._instance.options.show : this._instance.options.hide;
+ if (setting) {
+ var ul = domApi.container(item[0]);
+ if (ul) {
+ // animate children container
+ $(ul).stop(true, true).animate(setting.props, {
+ duration: setting.duration,
+ easing: setting.easing,
+ complete: callback ? this.proxy(callback) : null
+ });
+ } else if (callback) {
+ callback.apply(this);
+ }
+ return;
+ }
+ }
+ // use no animation
+ $(domApi.container(item[0])).stop(true, true).toggle(state);
+ if (callback) {
+ callback.apply(this);
+ }
+ },
+ // get first children of item
+ // if `hidden` is TRUE then the hidden items will be considered too
+ first: function(item, hidden) {
+ if (!item) {
+ item = this._instance.jQuery;
+ }
+ return $(domApi.firstChild(item[0], hidden ? null : function(node) {
+ return !this.hasClass(node, 'aciTreeHidden');
+ }));
+ },
+ // test if item is the first one for his parent
+ // if `hidden` is TRUE then the hidden items will be considered too
+ isFirst: function(item, hidden) {
+ if (item) {
+ var parent = domApi.parent(item[0]);
+ return this.first(parent ? $(parent) : null, hidden)[0] == item[0];
+ }
+ return false;
+ },
+ // get last children of item
+ // if `hidden` is TRUE then the hidden items will be considered too
+ last: function(item, hidden) {
+ if (!item) {
+ item = this._instance.jQuery;
+ }
+ return $(domApi.lastChild(item[0], hidden ? null : function(node) {
+ return !this.hasClass(node, 'aciTreeHidden');
+ }));
+ },
+ // test if item is the last one for his parent
+ // if `hidden` is TRUE then the hidden items will be considered too
+ isLast: function(item, hidden) {
+ if (item) {
+ var parent = domApi.parent(item[0]);
+ return this.last(parent ? $(parent) : null, hidden)[0] == item[0];
+ }
+ return false;
+ },
+ // test if item is busy/loading
+ isBusy: function(item) {
+ if (item) {
+ return domApi.hasClass(item[0], 'aciTreeLoad');
+ } else {
+ return this._instance.queue.busy();
+ }
+ },
+ // set loading state
+ _loading: function(item, state) {
+ if (item) {
+ domApi.toggleClass(item[0], 'aciTreeLoad', state);
+ if (state) {
+ item[0].firstChild.setAttribute('aria-busy', true);
+ } else {
+ item[0].firstChild.removeAttribute('aria-busy');
+ }
+ } else if (state) {
+ this._loader(state);
+ }
+ },
+ // show loader image
+ _loader: function(show) {
+ if (show || this.isBusy()) {
+ if (!this._private.loaderInterval) {
+ this._private.loaderInterval = window.setInterval(this.proxy(function() {
+ this._loader();
+ }), this._instance.options.loaderDelay);
+ }
+ domApi.addClass(this._instance.jQuery[0], 'aciTreeLoad');
+ window.clearTimeout(this._private.loaderHide);
+ this._private.loaderHide = window.setTimeout(this.proxy(function() {
+ domApi.removeClass(this._instance.jQuery[0], 'aciTreeLoad');
+ }), this._instance.options.loaderDelay * 2);
+ }
+ },
+ // test if parent has children
+ isChildren: function(parent, children) {
+ if (!parent) {
+ parent = this._instance.jQuery;
+ }
+ return children && (parent.has(children).length > 0);
+ },
+ // test if parent has immediate children
+ isImmediateChildren: function(parent, children) {
+ if (!parent) {
+ parent = this._instance.jQuery;
+ }
+ return children && parent.children('.aciTreeUl').children('.aciTreeLi').is(children);
+ },
+ // test if items share the same parent
+ sameParent: function(item1, item2) {
+ if (item1 && item2) {
+ var parent1 = this.parent(item1);
+ var parent2 = this.parent(item2);
+ return (!parent1.length && !parent2.length) || (parent1[0] == parent2[0]);
+ }
+ return false;
+ },
+ // test if items share the same top parent
+ sameTopParent: function(item1, item2) {
+ if (item1 && item2) {
+ var parent1 = this.topParent(item1);
+ var parent2 = this.topParent(item2);
+ return (!parent1.length && !parent2.length) || (parent1[0] == parent2[0]);
+ }
+ return false;
+ },
+ // return the updated item data
+ // `callback` function (item) called for each item
+ _serialize: function(item, callback) {
+ var data = this.itemData(item);
+ if (this.isInode(item)) {
+ data.inode = true;
+ if (this.wasLoad(item)) {
+ if (data.hasOwnProperty('open')) {
+ data.open = this.isOpen(item);
+ } else if (this.isOpen(item)) {
+ data.open = true;
+ }
+ data.branch = [];
+ this.children(item, false, true).each(this.proxy(function(element) {
+ var entry = this._serialize($(element), callback);
+ if (callback) {
+ entry = callback.call(this, $(element), {
+ }, entry);
+ } else {
+ entry = this._instance.options.serialize.call(this, $(element), {
+ }, entry);
+ }
+ if (entry) {
+ data.branch.push(entry);
+ }
+ }, true));
+ if (!data.branch.length) {
+ data.branch = null;
+ }
+ } else {
+ if (data.hasOwnProperty('open')) {
+ data.open = false;
+ }
+ if (data.hasOwnProperty('branch')) {
+ data.branch = null;
+ }
+ }
+ } else {
+ if (data.hasOwnProperty('inode')) {
+ data.inode = false;
+ }
+ if (data.hasOwnProperty('open')) {
+ data.open = null;
+ }
+ if (data.hasOwnProperty('branch')) {
+ data.branch = null;
+ }
+ }
+ if (data.hasOwnProperty('disabled')) {
+ data.disabled = this.isDisabled(item);
+ } else if (this.isDisabled(item)) {
+ data.disabled = true;
+ }
+ return data;
+ },
+ // return serialized data
+ // `callback` function (item, what, value) - see `aciTree.options.serialize`
+ serialize: function(item, what, callback) {
+ // override this to provide serialized data
+ if (typeof what == 'object') {
+ if (item) {
+ var data = this._serialize(item, callback);
+ if (callback) {
+ data = callback.call(this, item, {
+ }, data);
+ } else {
+ data = this._instance.options.serialize.call(this, item, {
+ }, data);
+ }
+ return data;
+ } else {
+ var list = [];
+ this.children(null, false, true).each(this.proxy(function(element) {
+ var data = this._serialize($(element), callback);
+ if (callback) {
+ data = callback.call(this, $(element), {
+ }, data);
+ } else {
+ data = this._instance.options.serialize.call(this, $(element), {
+ }, data);
+ }
+ if (data) {
+ list.push(data);
+ }
+ }, true));
+ return list;
+ }
+ }
+ return '';
+ },
+ // destroy the control
+ destroy: function(options) {
+ options = this._options(options);
+ // check if was init
+ if (!this.wasInit()) {
+ this._trigger(null, 'notinit', options);
+ this._fail(null, options);
+ return;
+ }
+ // check if is locked
+ if (this.isLocked()) {
+ this._trigger(null, 'locked', options);
+ this._fail(null, options);
+ return;
+ }
+ // a way to cancel the operation
+ if (!this._trigger(null, 'beforedestroy', options)) {
+ this._trigger(null, 'destroyfail', options);
+ this._fail(null, options);
+ return;
+ }
+ this._private.locked = true;
+ this._instance.jQuery.addClass('aciTreeLoad').attr('aria-busy', true);
+ this._instance.queue.destroy();
+ this._destroyHook(false);
+ // unload the entire treeview
+ this.unload(null, this._inner(options, {
+ success: this.proxy(function() {
+ window.clearTimeout(this._private.loaderHide);
+ window.clearInterval(this._private.loaderInterval);
+ this._private.itemClone = {
+ };
+ this._destroyHook(true);
+ this._instance.jQuery.unbind(this._instance.nameSpace).off(this._instance.nameSpace, '.aciTreeButton').off(this._instance.nameSpace, '.aciTreeLine');
+ this._instance.jQuery.removeClass('aciTree' + this._instance.index + ' aciTreeLoad').removeAttr('role aria-busy');
+ this._private.locked = false;
+ // call the parent
+ this._super();
+ this._trigger(null, 'destroyed', options);
+ this._success(null, options);
+ }),
+ fail: function() {
+ this._instance.jQuery.removeClass('aciTreeLoad');
+ this._private.locked = false;
+ this._trigger(null, 'destroyfail', options);
+ this._fail(null, options);
+ }
+ }));
+ },
+ _destroyHook: function(unloaded) {
+ // override this to do extra destroy before/after unload
+ }
+
+ };
+
+ // extend the base aciPluginUi class and store into aciPluginClass.plugins
+ aciPluginClass.plugins.aciTree = aciPluginClass.aciPluginUi.extend(aciTree_core, 'aciTreeCore');
+
+ // publish the plugin & the default options
+ aciPluginClass.publish('aciTree', options);
+
+ // for internal access
+ var domApi = aciPluginClass.plugins.aciTree_dom;
+
+})(jQuery, this);
diff --git a/web/pgadmin/browser/static/js/aciTree/jquery.aciTree.debug.js b/web/pgadmin/browser/static/vendor/aciTree/jquery.aciTree.debug.js
similarity index 100%
rename from web/pgadmin/browser/static/js/aciTree/jquery.aciTree.debug.js
rename to web/pgadmin/browser/static/vendor/aciTree/jquery.aciTree.debug.js
diff --git a/web/pgadmin/browser/static/js/aciTree/jquery.aciTree.dom.js b/web/pgadmin/browser/static/vendor/aciTree/jquery.aciTree.dom.js
similarity index 97%
rename from web/pgadmin/browser/static/js/aciTree/jquery.aciTree.dom.js
rename to web/pgadmin/browser/static/vendor/aciTree/jquery.aciTree.dom.js
index ffafc7206..8eafa3627 100755
--- a/web/pgadmin/browser/static/js/aciTree/jquery.aciTree.dom.js
+++ b/web/pgadmin/browser/static/vendor/aciTree/jquery.aciTree.dom.js
@@ -1,660 +1,660 @@
-
-/*
- * aciTree jQuery Plugin v4.5.0-rc.7
- * http://acoderinsights.ro
- *
- * Copyright (c) 2014 Dragos Ursu
- * Dual licensed under the MIT or GPL Version 2 licenses.
- *
- * Require jQuery Library >= v1.9.0 http://jquery.com
- * + aciPlugin >= v1.5.1 https://github.com/dragosu/jquery-aciPlugin
- */
-
-/*
- * The aciTree low-level DOM functions.
- *
- * A collection of functions optimised for aciTree DOM structure.
- *
- * Need to be included before the aciTree core and after aciPlugin.
- */
-
-aciPluginClass.plugins.aciTree_dom = {
- // get the UL container from a LI
- // `node` must be valid LI DOM node
- // can return NULL
- container: function(node) {
- var container = node.lastChild;
- if (container && (container.nodeName == 'UL')) {
- return container;
- }
- return null;
- },
- // get the first children from a LI (with filtering)
- // `node` must be valid LI DOM node
- // `callback` can return FALSE to skip a node
- // can return NULL
- firstChild: function(node, callback) {
- var container = this.container(node);
- if (container) {
- var firstChild = container.firstChild;
- if (callback) {
- while (firstChild && !callback.call(this, firstChild)) {
- firstChild = firstChild.nextSibling;
- }
- }
- return firstChild;
- }
- return null;
- },
- // get the last children from a LI (with filtering)
- // `node` must be valid LI DOM node
- // `callback` can return FALSE to skip a node
- // can return NULL
- lastChild: function(node, callback) {
- var container = this.container(node);
- if (container) {
- var lastChild = container.lastChild;
- if (callback) {
- while (lastChild && !callback.call(this, lastChild)) {
- lastChild = lastChild.previousSibling;
- }
- }
- return lastChild;
- }
- return null;
- },
- // get the previous LI sibling (with filtering)
- // `node` must be valid LI DOM node
- // `callback` can return FALSE to skip a node
- // can return NULL
- prev: function(node, callback) {
- var previous = node.previousSibling;
- if (callback) {
- while (previous && !callback.call(this, previous)) {
- previous = previous.previousSibling;
- }
- }
- return previous;
- },
- // get the next LI sibling (with filtering)
- // `node` must be valid LI DOM node
- // `callback` can return FALSE to skip a node
- // can return NULL
- next: function(node, callback) {
- var next = node.nextSibling;
- if (callback) {
- while (next && !callback.call(this, next)) {
- next = next.nextSibling;
- }
- }
- return next;
- },
- // get the previous LI in tree order (with filtering)
- // `node` must be valid LI DOM node
- // `callback` can return FALSE to skip a node or NULL to prevent drill down/skip the node
- // can return NULL
- prevAll: function(node, callback) {
- var previous, lastChild, drillDown, match, prev, parent;
- while (true) {
- previous = this.prev(node);
- if (previous) {
- if (callback) {
- match = callback.call(this, previous);
- if (match === null) {
- node = previous;
- continue;
- }
- }
- lastChild = this.lastChild(previous);
- if (lastChild) {
- if (callback && (callback.call(this, lastChild) === null)) {
- node = lastChild;
- continue;
- }
- prev = false;
- while (drillDown = this.lastChild(lastChild)) {
- lastChild = drillDown;
- if (callback) {
- match = callback.call(this, lastChild);
- if (match === null) {
- node = lastChild;
- prev = true;
- break;
- }
- }
- }
- if (prev) {
- continue;
- }
- if (callback) {
- match = callback.call(this, lastChild);
- if (match) {
- return lastChild;
- } else if (match !== null) {
- node = lastChild;
- continue;
- }
- } else {
- return lastChild;
- }
- } else {
- if (!callback || match) {
- return previous;
- } else {
- node = previous;
- continue;
- }
- }
- }
- parent = this.parent(node);
- if (parent) {
- if (callback) {
- match = callback.call(this, parent);
- if (match) {
- return parent;
- } else {
- node = parent;
- }
- } else {
- return parent;
- }
- } else {
- return null;
- }
- }
- return null;
- },
- // get the next LI in tree order (with filtering)
- // `node` must be valid LI DOM node
- // `callback` can return FALSE to skip a node or NULL to prevent drill down/skip the node
- // can return NULL
- nextAll: function(node, callback) {
- var firstChild, match, next, parent, child;
- while (true) {
- firstChild = this.firstChild(node);
- if (firstChild) {
- if (callback) {
- match = callback.call(this, firstChild);
- if (match) {
- return firstChild;
- } else {
- node = firstChild;
- if (match !== null) {
- continue;
- }
- }
- } else {
- return firstChild;
- }
- }
- while (true) {
- next = this.next(node);
- if (next) {
- if (callback) {
- match = callback.call(this, next);
- if (match) {
- return next;
- } else {
- node = next;
- if (match !== null) {
- break;
- } else {
- continue;
- }
- }
- } else {
- return next;
- }
- } else {
- parent = node;
- child = null;
- while (parent = this.parent(parent)) {
- next = this.next(parent);
- if (next) {
- if (callback) {
- match = callback.call(this, next);
- if (match) {
- return next;
- } else {
- node = next;
- if (match !== null) {
- child = true;
- } else {
- child = false;
- }
- break;
- }
- } else {
- return next;
- }
- }
- }
- if (child !== null) {
- if (child) {
- break;
- } else {
- continue;
- }
- }
- return null;
- }
- }
- }
- return null;
- },
- // get the first LI in tree order (with filtering)
- // `node` must be valid LI DOM node
- // `callback` can return FALSE to skip a node or NULL to prevent drill down/skip the node
- // can return NULL
- first: function(node, callback) {
- var container = this.container(node);
- if (container) {
- var firstChild = container.firstChild;
- if (firstChild) {
- if (callback && !callback.call(this, firstChild)) {
- return this.nextAll(firstChild, callback);
- }
- return firstChild;
- }
- }
- return null;
- },
- // get the last LI in tree order (with filtering)
- // `node` must be valid LI DOM node
- // `callback` can return FALSE to skip a node or NULL to prevent drill down/skip the node
- // can return NULL
- last: function(node, callback) {
- var container = this.container(node);
- if (container) {
- var lastChild = container.lastChild;
- if (lastChild) {
- if (callback && (callback.call(this, lastChild) === null)) {
- return this.prevAll(lastChild, callback);
- } else {
- var drillDown;
- while (drillDown = this.lastChild(lastChild)) {
- lastChild = drillDown;
- }
- if (callback && !callback.call(this, lastChild)) {
- return this.prevAll(lastChild, callback);
- }
- return lastChild;
- }
- }
- }
- return null;
- },
- // get the children LI from the node
- // `node` must be valid LI DOM node
- // `drillDown` if TRUE all children are returned
- // `callback` can return FALSE to skip a node or NULL to prevent drill down/skip the node
- children: function(node, drillDown, callback) {
- var children = [], levels = [], match, next, skip;
- var firstChild = this.firstChild(node);
- if (firstChild) {
- while (true) {
- skip = false;
- do {
- if (callback) {
- match = callback.call(this, firstChild);
- if (match) {
- children.push(firstChild);
- }
- if (drillDown && (match !== null)) {
- next = this.firstChild(firstChild);
- if (next) {
- levels.push(firstChild);
- firstChild = next;
- skip = true;
- break;
- }
- }
- } else {
- children.push(firstChild);
- if (drillDown) {
- next = this.firstChild(firstChild);
- if (next) {
- levels.push(firstChild);
- firstChild = next;
- skip = true;
- break;
- }
- }
- }
- } while (firstChild = firstChild.nextSibling);
- if (!skip) {
- while (firstChild = levels.pop()) {
- firstChild = firstChild.nextSibling;
- if (firstChild) {
- break;
- }
- }
- if (!firstChild) {
- break;
- }
- }
- }
- }
- return children;
- },
- // get a children from the node
- // `node` must be valid DOM node
- // `callback` can return FALSE to skip a node or NULL to stop the search
- // can return NULL
- childrenTill: function(node, callback) {
- var levels = [], match, next, skip;
- var firstChild = node.firstChild;
- if (firstChild) {
- while (true) {
- skip = false;
- do {
- match = callback.call(this, firstChild);
- if (match) {
- return firstChild;
- } else if (match === null) {
- return null;
- }
- next = firstChild.firstChild;
- if (next) {
- levels.push(firstChild);
- firstChild = next;
- skip = true;
- break;
- }
- } while (firstChild = firstChild.nextSibling);
- if (!skip) {
- while (firstChild = levels.pop()) {
- firstChild = firstChild.nextSibling;
- if (firstChild) {
- break;
- }
- }
- if (!firstChild) {
- break;
- }
- }
- }
- }
- return null;
- },
- // get a children from the node having a class
- // `node` must be valid DOM node
- // `className` String or Array to check for
- // can return NULL
- childrenByClass: function(node, className) {
- if (node.getElementsByClassName) {
- var list = node.getElementsByClassName(className instanceof Array ? className.join(' ') : className);
- return list ? list[0] : null;
- } else {
- return this.childrenTill(node, function(node) {
- return this.hasClass(node, className);
- });
- }
- },
- // get the parent LI from the children LI
- // `node` must be valid LI DOM node
- // can return NULL
- parent: function(node) {
- var parent = node.parentNode.parentNode;
- if (parent && (parent.nodeName == 'LI')) {
- return parent;
- }
- return null;
- },
- // get the parent LI from any children
- // `node` must be valid children of a LI DOM node
- // can return NULL
- parentFrom: function(node) {
- while (node.nodeName != 'LI') {
- node = node.parentNode;
- if (!node) {
- return null;
- }
- }
- return node;
- },
- // get a parent from the node
- // `node` must be valid DOM node
- // `callback` can return FALSE to skip a node or NULL to stop the search
- // can return NULL
- parentTill: function(node, callback) {
- var match;
- while (node = node.parentNode) {
- match = callback.call(this, node);
- if (match) {
- return node;
- } else if (match === null) {
- return null;
- }
- }
- return null;
- },
- // get a parent from the node having a class
- // `node` must be valid DOM node
- // `className` String or Array to check for
- // can return NULL
- parentByClass: function(node, className) {
- return this.parentTill(node, function(node) {
- return this.hasClass(node, className);
- });
- },
- // test if node has class(es)
- // `className` String or Array to check for
- // `withOut` String or Array to exclude with
- hasClass: function(node, className, withOut) {
- var oldClass = ' ' + node.className + ' ';
- if (withOut instanceof Array) {
- for (var i = 0; i < withOut.length; i++) {
- if (oldClass.indexOf(' ' + withOut[i] + ' ') != -1) {
- return false;
- }
- }
- } else {
- if (withOut && oldClass.indexOf(' ' + withOut + ' ') != -1) {
- return false;
- }
- }
- if (className instanceof Array) {
- for (var i = 0; i < className.length; i++) {
- if (oldClass.indexOf(' ' + className[i] + ' ') == -1) {
- return false;
- }
- }
- } else {
- if (className && oldClass.indexOf(' ' + className + ' ') == -1) {
- return false;
- }
- }
- return true;
- },
- // filter nodes with class(es)
- // `nodes` Array of DOM nodes
- // @see `hasClass`
- withClass: function(nodes, className, withOut) {
- var filter = [];
- for (var i = 0; i < nodes.length; i++) {
- if (this.hasClass(nodes[i], className, withOut)) {
- filter.push(nodes[i]);
- }
- }
- return filter;
- },
- // test if node has any class(es)
- // `className` String or Array to check for (any class)
- // `withOut` String or Array to exclude with
- hasAnyClass: function(node, className, withOut) {
- var oldClass = ' ' + node.className + ' ';
- if (withOut instanceof Array) {
- for (var i = 0; i < withOut.length; i++) {
- if (oldClass.indexOf(' ' + withOut[i] + ' ') != -1) {
- return false;
- }
- }
- } else {
- if (withOut && oldClass.indexOf(' ' + withOut + ' ') != -1) {
- return false;
- }
- }
- if (className instanceof Array) {
- for (var i = 0; i < className.length; i++) {
- if (oldClass.indexOf(' ' + className[i] + ' ') != -1) {
- return true;
- }
- }
- } else {
- if (className && oldClass.indexOf(' ' + className + ' ') != -1) {
- return true;
- }
- }
- return false;
- },
- // filter nodes with any class(es)
- // `nodes` Array of DOM nodes
- // @see `hasAnyClass`
- withAnyClass: function(nodes, className, withOut) {
- var filter = [];
- for (var i = 0; i < nodes.length; i++) {
- if (this.hasAnyClass(nodes[i], className, withOut)) {
- filter.push(nodes[i]);
- }
- }
- return filter;
- },
- // add class(es) to node
- // `node` must be valid DOM node
- // `className` String or Array to add
- // return TRUE if className changed
- addClass: function(node, className) {
- var oldClass = ' ' + node.className + ' ', append = '';
- if (className instanceof Array) {
- for (var i = 0; i < className.length; i++) {
- if (oldClass.indexOf(' ' + className[i] + ' ') == -1) {
- append += ' ' + className[i];
- }
- }
- } else {
- if (oldClass.indexOf(' ' + className + ' ') == -1) {
- append += ' ' + className;
- }
- }
- if (append) {
- node.className = node.className + append;
- return true;
- }
- return false;
- },
- // add class(es) to nodes
- // `nodes` Array of DOM nodes
- // @see `addClass`
- addListClass: function(nodes, className, callback) {
- for (var i = 0; i < nodes.length; i++) {
- this.addClass(nodes[i], className);
- if (callback) {
- callback.call(this, nodes[i]);
- }
- }
- },
- // remove class(es) from node
- // `node` must be valid DOM node
- // `className` String or Array to remove
- // return TRUE if className changed
- removeClass: function(node, className) {
- var oldClass = ' ' + node.className + ' ';
- if (className instanceof Array) {
- for (var i = 0; i < className.length; i++) {
- oldClass = oldClass.replace(' ' + className[i] + ' ', ' ');
- }
- } else {
- oldClass = oldClass.replace(' ' + className + ' ', ' ');
- }
- oldClass = oldClass.substr(1, oldClass.length - 2);
- if (node.className != oldClass) {
- node.className = oldClass;
- return true;
- }
- return false;
- },
- // remove class(es) from nodes
- // `nodes` Array of DOM nodes
- // @see `removeClass`
- removeListClass: function(nodes, className, callback) {
- for (var i = 0; i < nodes.length; i++) {
- this.removeClass(nodes[i], className);
- if (callback) {
- callback.call(this, nodes[i]);
- }
- }
- },
- // toggle node class(es)
- // `node` must be valid DOM node
- // `className` String or Array to toggle
- // `add` TRUE to add them
- // return TRUE if className changed
- toggleClass: function(node, className, add) {
- if (add) {
- return this.addClass(node, className);
- } else {
- return this.removeClass(node, className);
- }
- },
- // toggle nodes class(es)
- // `nodes` Array of DOM nodes
- // @see `toggleClass`
- toggleListClass: function(nodes, className, add, callback) {
- for (var i = 0; i < nodes.length; i++) {
- this.toggleClass(nodes[i], className, add);
- if (callback) {
- callback.call(this, nodes[i]);
- }
- }
- },
- // add/remove and keep old class(es)
- // `node` must be valid DOM node
- // `addClass` String or Array to add
- // `removeClass` String or Array to remove
- // return TRUE if className changed
- addRemoveClass: function(node, addClass, removeClass) {
- var oldClass = ' ' + node.className + ' ';
- if (removeClass) {
- if (removeClass instanceof Array) {
- for (var i = 0; i < removeClass.length; i++) {
- oldClass = oldClass.replace(' ' + removeClass[i] + ' ', ' ');
- }
- } else {
- oldClass = oldClass.replace(' ' + removeClass + ' ', ' ');
- }
- }
- if (addClass) {
- var append = '';
- if (addClass instanceof Array) {
- for (var i = 0; i < addClass.length; i++) {
- if (oldClass.indexOf(' ' + addClass[i] + ' ') == -1) {
- append += addClass[i] + ' ';
- }
- }
- } else {
- if (oldClass.indexOf(' ' + addClass + ' ') == -1) {
- append += addClass + ' ';
- }
- }
- oldClass += append;
- }
- oldClass = oldClass.substr(1, oldClass.length - 2);
- if (node.className != oldClass) {
- node.className = oldClass;
- return true;
- }
- return false;
- },
- // add/remove and keep old class(es)
- // `nodes` Array of DOM nodes
- // @see `addRemoveClass`
- addRemoveListClass: function(nodes, addClass, removeClass, callback) {
- for (var i = 0; i < nodes.length; i++) {
- this.addRemoveClass(nodes[i], addClass, removeClass);
- if (callback) {
- callback.call(this, nodes[i]);
- }
- }
- }
-};
+
+/*
+ * aciTree jQuery Plugin v4.5.0-rc.7
+ * http://acoderinsights.ro
+ *
+ * Copyright (c) 2014 Dragos Ursu
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ *
+ * Require jQuery Library >= v1.9.0 http://jquery.com
+ * + aciPlugin >= v1.5.1 https://github.com/dragosu/jquery-aciPlugin
+ */
+
+/*
+ * The aciTree low-level DOM functions.
+ *
+ * A collection of functions optimised for aciTree DOM structure.
+ *
+ * Need to be included before the aciTree core and after aciPlugin.
+ */
+
+aciPluginClass.plugins.aciTree_dom = {
+ // get the UL container from a LI
+ // `node` must be valid LI DOM node
+ // can return NULL
+ container: function(node) {
+ var container = node.lastChild;
+ if (container && (container.nodeName == 'UL')) {
+ return container;
+ }
+ return null;
+ },
+ // get the first children from a LI (with filtering)
+ // `node` must be valid LI DOM node
+ // `callback` can return FALSE to skip a node
+ // can return NULL
+ firstChild: function(node, callback) {
+ var container = this.container(node);
+ if (container) {
+ var firstChild = container.firstChild;
+ if (callback) {
+ while (firstChild && !callback.call(this, firstChild)) {
+ firstChild = firstChild.nextSibling;
+ }
+ }
+ return firstChild;
+ }
+ return null;
+ },
+ // get the last children from a LI (with filtering)
+ // `node` must be valid LI DOM node
+ // `callback` can return FALSE to skip a node
+ // can return NULL
+ lastChild: function(node, callback) {
+ var container = this.container(node);
+ if (container) {
+ var lastChild = container.lastChild;
+ if (callback) {
+ while (lastChild && !callback.call(this, lastChild)) {
+ lastChild = lastChild.previousSibling;
+ }
+ }
+ return lastChild;
+ }
+ return null;
+ },
+ // get the previous LI sibling (with filtering)
+ // `node` must be valid LI DOM node
+ // `callback` can return FALSE to skip a node
+ // can return NULL
+ prev: function(node, callback) {
+ var previous = node.previousSibling;
+ if (callback) {
+ while (previous && !callback.call(this, previous)) {
+ previous = previous.previousSibling;
+ }
+ }
+ return previous;
+ },
+ // get the next LI sibling (with filtering)
+ // `node` must be valid LI DOM node
+ // `callback` can return FALSE to skip a node
+ // can return NULL
+ next: function(node, callback) {
+ var next = node.nextSibling;
+ if (callback) {
+ while (next && !callback.call(this, next)) {
+ next = next.nextSibling;
+ }
+ }
+ return next;
+ },
+ // get the previous LI in tree order (with filtering)
+ // `node` must be valid LI DOM node
+ // `callback` can return FALSE to skip a node or NULL to prevent drill down/skip the node
+ // can return NULL
+ prevAll: function(node, callback) {
+ var previous, lastChild, drillDown, match, prev, parent;
+ while (true) {
+ previous = this.prev(node);
+ if (previous) {
+ if (callback) {
+ match = callback.call(this, previous);
+ if (match === null) {
+ node = previous;
+ continue;
+ }
+ }
+ lastChild = this.lastChild(previous);
+ if (lastChild) {
+ if (callback && (callback.call(this, lastChild) === null)) {
+ node = lastChild;
+ continue;
+ }
+ prev = false;
+ while (drillDown = this.lastChild(lastChild)) {
+ lastChild = drillDown;
+ if (callback) {
+ match = callback.call(this, lastChild);
+ if (match === null) {
+ node = lastChild;
+ prev = true;
+ break;
+ }
+ }
+ }
+ if (prev) {
+ continue;
+ }
+ if (callback) {
+ match = callback.call(this, lastChild);
+ if (match) {
+ return lastChild;
+ } else if (match !== null) {
+ node = lastChild;
+ continue;
+ }
+ } else {
+ return lastChild;
+ }
+ } else {
+ if (!callback || match) {
+ return previous;
+ } else {
+ node = previous;
+ continue;
+ }
+ }
+ }
+ parent = this.parent(node);
+ if (parent) {
+ if (callback) {
+ match = callback.call(this, parent);
+ if (match) {
+ return parent;
+ } else {
+ node = parent;
+ }
+ } else {
+ return parent;
+ }
+ } else {
+ return null;
+ }
+ }
+ return null;
+ },
+ // get the next LI in tree order (with filtering)
+ // `node` must be valid LI DOM node
+ // `callback` can return FALSE to skip a node or NULL to prevent drill down/skip the node
+ // can return NULL
+ nextAll: function(node, callback) {
+ var firstChild, match, next, parent, child;
+ while (true) {
+ firstChild = this.firstChild(node);
+ if (firstChild) {
+ if (callback) {
+ match = callback.call(this, firstChild);
+ if (match) {
+ return firstChild;
+ } else {
+ node = firstChild;
+ if (match !== null) {
+ continue;
+ }
+ }
+ } else {
+ return firstChild;
+ }
+ }
+ while (true) {
+ next = this.next(node);
+ if (next) {
+ if (callback) {
+ match = callback.call(this, next);
+ if (match) {
+ return next;
+ } else {
+ node = next;
+ if (match !== null) {
+ break;
+ } else {
+ continue;
+ }
+ }
+ } else {
+ return next;
+ }
+ } else {
+ parent = node;
+ child = null;
+ while (parent = this.parent(parent)) {
+ next = this.next(parent);
+ if (next) {
+ if (callback) {
+ match = callback.call(this, next);
+ if (match) {
+ return next;
+ } else {
+ node = next;
+ if (match !== null) {
+ child = true;
+ } else {
+ child = false;
+ }
+ break;
+ }
+ } else {
+ return next;
+ }
+ }
+ }
+ if (child !== null) {
+ if (child) {
+ break;
+ } else {
+ continue;
+ }
+ }
+ return null;
+ }
+ }
+ }
+ return null;
+ },
+ // get the first LI in tree order (with filtering)
+ // `node` must be valid LI DOM node
+ // `callback` can return FALSE to skip a node or NULL to prevent drill down/skip the node
+ // can return NULL
+ first: function(node, callback) {
+ var container = this.container(node);
+ if (container) {
+ var firstChild = container.firstChild;
+ if (firstChild) {
+ if (callback && !callback.call(this, firstChild)) {
+ return this.nextAll(firstChild, callback);
+ }
+ return firstChild;
+ }
+ }
+ return null;
+ },
+ // get the last LI in tree order (with filtering)
+ // `node` must be valid LI DOM node
+ // `callback` can return FALSE to skip a node or NULL to prevent drill down/skip the node
+ // can return NULL
+ last: function(node, callback) {
+ var container = this.container(node);
+ if (container) {
+ var lastChild = container.lastChild;
+ if (lastChild) {
+ if (callback && (callback.call(this, lastChild) === null)) {
+ return this.prevAll(lastChild, callback);
+ } else {
+ var drillDown;
+ while (drillDown = this.lastChild(lastChild)) {
+ lastChild = drillDown;
+ }
+ if (callback && !callback.call(this, lastChild)) {
+ return this.prevAll(lastChild, callback);
+ }
+ return lastChild;
+ }
+ }
+ }
+ return null;
+ },
+ // get the children LI from the node
+ // `node` must be valid LI DOM node
+ // `drillDown` if TRUE all children are returned
+ // `callback` can return FALSE to skip a node or NULL to prevent drill down/skip the node
+ children: function(node, drillDown, callback) {
+ var children = [], levels = [], match, next, skip;
+ var firstChild = this.firstChild(node);
+ if (firstChild) {
+ while (true) {
+ skip = false;
+ do {
+ if (callback) {
+ match = callback.call(this, firstChild);
+ if (match) {
+ children.push(firstChild);
+ }
+ if (drillDown && (match !== null)) {
+ next = this.firstChild(firstChild);
+ if (next) {
+ levels.push(firstChild);
+ firstChild = next;
+ skip = true;
+ break;
+ }
+ }
+ } else {
+ children.push(firstChild);
+ if (drillDown) {
+ next = this.firstChild(firstChild);
+ if (next) {
+ levels.push(firstChild);
+ firstChild = next;
+ skip = true;
+ break;
+ }
+ }
+ }
+ } while (firstChild = firstChild.nextSibling);
+ if (!skip) {
+ while (firstChild = levels.pop()) {
+ firstChild = firstChild.nextSibling;
+ if (firstChild) {
+ break;
+ }
+ }
+ if (!firstChild) {
+ break;
+ }
+ }
+ }
+ }
+ return children;
+ },
+ // get a children from the node
+ // `node` must be valid DOM node
+ // `callback` can return FALSE to skip a node or NULL to stop the search
+ // can return NULL
+ childrenTill: function(node, callback) {
+ var levels = [], match, next, skip;
+ var firstChild = node.firstChild;
+ if (firstChild) {
+ while (true) {
+ skip = false;
+ do {
+ match = callback.call(this, firstChild);
+ if (match) {
+ return firstChild;
+ } else if (match === null) {
+ return null;
+ }
+ next = firstChild.firstChild;
+ if (next) {
+ levels.push(firstChild);
+ firstChild = next;
+ skip = true;
+ break;
+ }
+ } while (firstChild = firstChild.nextSibling);
+ if (!skip) {
+ while (firstChild = levels.pop()) {
+ firstChild = firstChild.nextSibling;
+ if (firstChild) {
+ break;
+ }
+ }
+ if (!firstChild) {
+ break;
+ }
+ }
+ }
+ }
+ return null;
+ },
+ // get a children from the node having a class
+ // `node` must be valid DOM node
+ // `className` String or Array to check for
+ // can return NULL
+ childrenByClass: function(node, className) {
+ if (node.getElementsByClassName) {
+ var list = node.getElementsByClassName(className instanceof Array ? className.join(' ') : className);
+ return list ? list[0] : null;
+ } else {
+ return this.childrenTill(node, function(node) {
+ return this.hasClass(node, className);
+ });
+ }
+ },
+ // get the parent LI from the children LI
+ // `node` must be valid LI DOM node
+ // can return NULL
+ parent: function(node) {
+ var parent = node.parentNode.parentNode;
+ if (parent && (parent.nodeName == 'LI')) {
+ return parent;
+ }
+ return null;
+ },
+ // get the parent LI from any children
+ // `node` must be valid children of a LI DOM node
+ // can return NULL
+ parentFrom: function(node) {
+ while (node.nodeName != 'LI') {
+ node = node.parentNode;
+ if (!node) {
+ return null;
+ }
+ }
+ return node;
+ },
+ // get a parent from the node
+ // `node` must be valid DOM node
+ // `callback` can return FALSE to skip a node or NULL to stop the search
+ // can return NULL
+ parentTill: function(node, callback) {
+ var match;
+ while (node = node.parentNode) {
+ match = callback.call(this, node);
+ if (match) {
+ return node;
+ } else if (match === null) {
+ return null;
+ }
+ }
+ return null;
+ },
+ // get a parent from the node having a class
+ // `node` must be valid DOM node
+ // `className` String or Array to check for
+ // can return NULL
+ parentByClass: function(node, className) {
+ return this.parentTill(node, function(node) {
+ return this.hasClass(node, className);
+ });
+ },
+ // test if node has class(es)
+ // `className` String or Array to check for
+ // `withOut` String or Array to exclude with
+ hasClass: function(node, className, withOut) {
+ var oldClass = ' ' + node.className + ' ';
+ if (withOut instanceof Array) {
+ for (var i = 0; i < withOut.length; i++) {
+ if (oldClass.indexOf(' ' + withOut[i] + ' ') != -1) {
+ return false;
+ }
+ }
+ } else {
+ if (withOut && oldClass.indexOf(' ' + withOut + ' ') != -1) {
+ return false;
+ }
+ }
+ if (className instanceof Array) {
+ for (var i = 0; i < className.length; i++) {
+ if (oldClass.indexOf(' ' + className[i] + ' ') == -1) {
+ return false;
+ }
+ }
+ } else {
+ if (className && oldClass.indexOf(' ' + className + ' ') == -1) {
+ return false;
+ }
+ }
+ return true;
+ },
+ // filter nodes with class(es)
+ // `nodes` Array of DOM nodes
+ // @see `hasClass`
+ withClass: function(nodes, className, withOut) {
+ var filter = [];
+ for (var i = 0; i < nodes.length; i++) {
+ if (this.hasClass(nodes[i], className, withOut)) {
+ filter.push(nodes[i]);
+ }
+ }
+ return filter;
+ },
+ // test if node has any class(es)
+ // `className` String or Array to check for (any class)
+ // `withOut` String or Array to exclude with
+ hasAnyClass: function(node, className, withOut) {
+ var oldClass = ' ' + node.className + ' ';
+ if (withOut instanceof Array) {
+ for (var i = 0; i < withOut.length; i++) {
+ if (oldClass.indexOf(' ' + withOut[i] + ' ') != -1) {
+ return false;
+ }
+ }
+ } else {
+ if (withOut && oldClass.indexOf(' ' + withOut + ' ') != -1) {
+ return false;
+ }
+ }
+ if (className instanceof Array) {
+ for (var i = 0; i < className.length; i++) {
+ if (oldClass.indexOf(' ' + className[i] + ' ') != -1) {
+ return true;
+ }
+ }
+ } else {
+ if (className && oldClass.indexOf(' ' + className + ' ') != -1) {
+ return true;
+ }
+ }
+ return false;
+ },
+ // filter nodes with any class(es)
+ // `nodes` Array of DOM nodes
+ // @see `hasAnyClass`
+ withAnyClass: function(nodes, className, withOut) {
+ var filter = [];
+ for (var i = 0; i < nodes.length; i++) {
+ if (this.hasAnyClass(nodes[i], className, withOut)) {
+ filter.push(nodes[i]);
+ }
+ }
+ return filter;
+ },
+ // add class(es) to node
+ // `node` must be valid DOM node
+ // `className` String or Array to add
+ // return TRUE if className changed
+ addClass: function(node, className) {
+ var oldClass = ' ' + node.className + ' ', append = '';
+ if (className instanceof Array) {
+ for (var i = 0; i < className.length; i++) {
+ if (oldClass.indexOf(' ' + className[i] + ' ') == -1) {
+ append += ' ' + className[i];
+ }
+ }
+ } else {
+ if (oldClass.indexOf(' ' + className + ' ') == -1) {
+ append += ' ' + className;
+ }
+ }
+ if (append) {
+ node.className = node.className + append;
+ return true;
+ }
+ return false;
+ },
+ // add class(es) to nodes
+ // `nodes` Array of DOM nodes
+ // @see `addClass`
+ addListClass: function(nodes, className, callback) {
+ for (var i = 0; i < nodes.length; i++) {
+ this.addClass(nodes[i], className);
+ if (callback) {
+ callback.call(this, nodes[i]);
+ }
+ }
+ },
+ // remove class(es) from node
+ // `node` must be valid DOM node
+ // `className` String or Array to remove
+ // return TRUE if className changed
+ removeClass: function(node, className) {
+ var oldClass = ' ' + node.className + ' ';
+ if (className instanceof Array) {
+ for (var i = 0; i < className.length; i++) {
+ oldClass = oldClass.replace(' ' + className[i] + ' ', ' ');
+ }
+ } else {
+ oldClass = oldClass.replace(' ' + className + ' ', ' ');
+ }
+ oldClass = oldClass.substr(1, oldClass.length - 2);
+ if (node.className != oldClass) {
+ node.className = oldClass;
+ return true;
+ }
+ return false;
+ },
+ // remove class(es) from nodes
+ // `nodes` Array of DOM nodes
+ // @see `removeClass`
+ removeListClass: function(nodes, className, callback) {
+ for (var i = 0; i < nodes.length; i++) {
+ this.removeClass(nodes[i], className);
+ if (callback) {
+ callback.call(this, nodes[i]);
+ }
+ }
+ },
+ // toggle node class(es)
+ // `node` must be valid DOM node
+ // `className` String or Array to toggle
+ // `add` TRUE to add them
+ // return TRUE if className changed
+ toggleClass: function(node, className, add) {
+ if (add) {
+ return this.addClass(node, className);
+ } else {
+ return this.removeClass(node, className);
+ }
+ },
+ // toggle nodes class(es)
+ // `nodes` Array of DOM nodes
+ // @see `toggleClass`
+ toggleListClass: function(nodes, className, add, callback) {
+ for (var i = 0; i < nodes.length; i++) {
+ this.toggleClass(nodes[i], className, add);
+ if (callback) {
+ callback.call(this, nodes[i]);
+ }
+ }
+ },
+ // add/remove and keep old class(es)
+ // `node` must be valid DOM node
+ // `addClass` String or Array to add
+ // `removeClass` String or Array to remove
+ // return TRUE if className changed
+ addRemoveClass: function(node, addClass, removeClass) {
+ var oldClass = ' ' + node.className + ' ';
+ if (removeClass) {
+ if (removeClass instanceof Array) {
+ for (var i = 0; i < removeClass.length; i++) {
+ oldClass = oldClass.replace(' ' + removeClass[i] + ' ', ' ');
+ }
+ } else {
+ oldClass = oldClass.replace(' ' + removeClass + ' ', ' ');
+ }
+ }
+ if (addClass) {
+ var append = '';
+ if (addClass instanceof Array) {
+ for (var i = 0; i < addClass.length; i++) {
+ if (oldClass.indexOf(' ' + addClass[i] + ' ') == -1) {
+ append += addClass[i] + ' ';
+ }
+ }
+ } else {
+ if (oldClass.indexOf(' ' + addClass + ' ') == -1) {
+ append += addClass + ' ';
+ }
+ }
+ oldClass += append;
+ }
+ oldClass = oldClass.substr(1, oldClass.length - 2);
+ if (node.className != oldClass) {
+ node.className = oldClass;
+ return true;
+ }
+ return false;
+ },
+ // add/remove and keep old class(es)
+ // `nodes` Array of DOM nodes
+ // @see `addRemoveClass`
+ addRemoveListClass: function(nodes, addClass, removeClass, callback) {
+ for (var i = 0; i < nodes.length; i++) {
+ this.addRemoveClass(nodes[i], addClass, removeClass);
+ if (callback) {
+ callback.call(this, nodes[i]);
+ }
+ }
+ }
+};
diff --git a/web/pgadmin/browser/static/js/aciTree/jquery.aciTree.editable.js b/web/pgadmin/browser/static/vendor/aciTree/jquery.aciTree.editable.js
similarity index 100%
rename from web/pgadmin/browser/static/js/aciTree/jquery.aciTree.editable.js
rename to web/pgadmin/browser/static/vendor/aciTree/jquery.aciTree.editable.js
diff --git a/web/pgadmin/browser/static/js/aciTree/jquery.aciTree.hash.js b/web/pgadmin/browser/static/vendor/aciTree/jquery.aciTree.hash.js
similarity index 100%
rename from web/pgadmin/browser/static/js/aciTree/jquery.aciTree.hash.js
rename to web/pgadmin/browser/static/vendor/aciTree/jquery.aciTree.hash.js
diff --git a/web/pgadmin/browser/static/js/aciTree/jquery.aciTree.js b/web/pgadmin/browser/static/vendor/aciTree/jquery.aciTree.js
similarity index 100%
rename from web/pgadmin/browser/static/js/aciTree/jquery.aciTree.js
rename to web/pgadmin/browser/static/vendor/aciTree/jquery.aciTree.js
diff --git a/web/pgadmin/browser/static/js/aciTree/jquery.aciTree.min.js b/web/pgadmin/browser/static/vendor/aciTree/jquery.aciTree.min.js
similarity index 99%
rename from web/pgadmin/browser/static/js/aciTree/jquery.aciTree.min.js
rename to web/pgadmin/browser/static/vendor/aciTree/jquery.aciTree.min.js
index b00b953b4..d849fa596 100755
--- a/web/pgadmin/browser/static/js/aciTree/jquery.aciTree.min.js
+++ b/web/pgadmin/browser/static/vendor/aciTree/jquery.aciTree.min.js
@@ -1,44 +1,44 @@
-
-/*
- * aciTree jQuery Plugin v4.5.0-rc.7
- * http://acoderinsights.ro
- *
- * Copyright (c) 2014 Dragos Ursu
- * Dual licensed under the MIT or GPL Version 2 licenses.
- *
- * Require jQuery Library >= v1.9.0 http://jquery.com
- * + aciPlugin >= v1.5.1 https://github.com/dragosu/jquery-aciPlugin
- */
-
-// DOM
-aciPluginClass.plugins.aciTree_dom={container:function(b){var a=b.lastChild;if(a&&(a.nodeName=="UL")){return a}return null},firstChild:function(b,d){var a=this.container(b);if(a){var c=a.firstChild;if(d){while(c&&!d.call(this,c)){c=c.nextSibling}}return c}return null},lastChild:function(c,d){var a=this.container(c);if(a){var b=a.lastChild;if(d){while(b&&!d.call(this,b)){b=b.previousSibling}}return b}return null},prev:function(b,c){var a=b.previousSibling;if(c){while(a&&!c.call(this,a)){a=a.previousSibling}}return a},next:function(b,c){var a=b.nextSibling;if(c){while(a&&!c.call(this,a)){a=a.nextSibling}}return a},prevAll:function(f,h){var e,d,g,a,c,b;while(true){e=this.prev(f);if(e){if(h){a=h.call(this,e);if(a===null){f=e;continue}}d=this.lastChild(e);if(d){if(h&&(h.call(this,d)===null)){f=d;continue}c=false;while(g=this.lastChild(d)){d=g;if(h){a=h.call(this,d);if(a===null){f=d;c=true;break}}}if(c){continue}if(h){a=h.call(this,d);if(a){return d}else{if(a!==null){f=d;continue}}}else{return d}}else{if(!h||a){return e}else{f=e;continue}}}b=this.parent(f);if(b){if(h){a=h.call(this,b);if(a){return b}else{f=b}}else{return b}}else{return null}}return null},nextAll:function(d,g){var e,a,c,b,f;while(true){e=this.firstChild(d);if(e){if(g){a=g.call(this,e);if(a){return e}else{d=e;if(a!==null){continue}}}else{return e}}while(true){c=this.next(d);if(c){if(g){a=g.call(this,c);if(a){return c}else{d=c;if(a!==null){break}else{continue}}}else{return c}}else{b=d;f=null;while(b=this.parent(b)){c=this.next(b);if(c){if(g){a=g.call(this,c);if(a){return c}else{d=c;if(a!==null){f=true}else{f=false}break}}else{return c}}}if(f!==null){if(f){break}else{continue}}return null}}}return null},first:function(b,d){var a=this.container(b);if(a){var c=a.firstChild;if(c){if(d&&!d.call(this,c)){return this.nextAll(c,d)}return c}}return null},last:function(c,e){var a=this.container(c);if(a){var b=a.lastChild;if(b){if(e&&(e.call(this,b)===null)){return this.prevAll(b,e)}else{var d;while(d=this.lastChild(b)){b=d}if(e&&!e.call(this,b)){return this.prevAll(b,e)}return b}}}return null},children:function(b,f,h){var a=[],i=[],d,c,g;var e=this.firstChild(b);if(e){while(true){g=false;do{if(h){d=h.call(this,e);if(d){a.push(e)}if(f&&(d!==null)){c=this.firstChild(e);if(c){i.push(e);e=c;g=true;break}}}else{a.push(e);if(f){c=this.firstChild(e);if(c){i.push(e);e=c;g=true;break}}}}while(e=e.nextSibling);if(!g){while(e=i.pop()){e=e.nextSibling;if(e){break}}if(!e){break}}}}return a},childrenTill:function(d,g){var e=[],a,b,c;var f=d.firstChild;if(f){while(true){c=false;do{a=g.call(this,f);if(a){return f}else{if(a===null){return null}}b=f.firstChild;if(b){e.push(f);f=b;c=true;break}}while(f=f.nextSibling);if(!c){while(f=e.pop()){f=f.nextSibling;if(f){break}}if(!f){break}}}}return null},childrenByClass:function(b,a){if(b.getElementsByClassName){var c=b.getElementsByClassName(a instanceof Array?a.join(" "):a);return c?c[0]:null}else{return this.childrenTill(b,function(d){return this.hasClass(d,a)})}},parent:function(b){var a=b.parentNode.parentNode;if(a&&(a.nodeName=="LI")){return a}return null},parentFrom:function(a){while(a.nodeName!="LI"){a=a.parentNode;if(!a){return null}}return a},parentTill:function(b,c){var a;while(b=b.parentNode){a=c.call(this,b);if(a){return b}else{if(a===null){return null}}}return null},parentByClass:function(b,a){return this.parentTill(b,function(c){return this.hasClass(c,a)})},hasClass:function(e,d,a){var b=" "+e.className+" ";if(a instanceof Array){for(var c=0;c=0)&&(lt){o--;return}var v,u=false;if(ps.interval){m=t+s.delay}p--;if(o<40){o++;k()}})}}o--};var j=[];var g=function(){for(var t=0;t<4;t++){j[t]=c.setInterval(function(){if(o<20){o++;k()}},10)}};var n=function(){for(var t=0;tj.bottom-l)){return false}return true}return false},openPath:function(i,h){h=this._options(h);if(this.isItem(i)){var g=this._instance.queue;this.inodes(this.path(i),false).each(function(){var j=d(this);g.push(function(k){this.open(j,this._inner(h));k()})});g.push(function(j){this._success(i,h);j()})}else{this._fail(i,h)}},isOpenPath:function(h){var g=this.parent(h);return g[0]?this.isOpen(g)&&a.hasClass(g[0],"aciTreeVisible"):true},_speedFraction:function(i,g,j){if((jl.bottom-n){var m=o.top-l.bottom+n+j;if(!g.unanimated&&this._instance.options.view){this._instance.jQuery.stop(true).animate({scrollTop:this._instance.jQuery.scrollTop()+m},{duration:this._speedFraction(this._instance.options.view.duration,l.bottom-l.top,m),easing:this._instance.options.view.easing,complete:this.proxy(function(){this._success(h,g)})})}else{this._instance.jQuery.stop(true)[0].scrollTop=this._instance.jQuery.scrollTop()+m;this._success(h,g)}}else{this._success(h,g)}}};if(this.hasParent(h)){this.openPath(h,this._inner(g,{success:i,fail:g.fail}))}else{i.apply(this)}}else{this._fail(h,g)}},hasParent:function(g){return this.parent(g).length>0},parent:function(g){return g?d(a.parent(g[0])):d([])},topParent:function(g){return this.path(g).eq(0)},_createBranch:function(l,i){var k=0;var j=function(o){var n;for(var p=0;p=k){this._success(l,i)}});var m=this.proxy(function(o,n){if(o){a.addRemoveClass(o[0],"aciTreeInode","aciTreeInodeMaybe")}this.append(o,this._inner(i,{success:function(s,q){var p;for(var r=0;r0){var j=k[h];if(a.hasClass(j,"aciTreOdd")){i=false}k=k.slice(h+1)}}this._coreDOM.oddEven(d(k),i)},_setOddEvenChildren:function(h){var i=a.hasClass(h[0],"aciTreeOdd");var g=this.children(h);this._coreDOM.oddEven(g,!i)},_itemHook:function(h,i,g,j){if(this._instance.options.itemHook){this._instance.options.itemHook.apply(this,arguments)}},_createItem:function(h,g){if(this._private.itemClone[g]){var r=this._private.itemClone[g].cloneNode(true);var u=r.firstChild;var n=u;for(var j=0;j0},disabled:function(g){return d(a.withClass(g.toArray(),"aciTreeDisabled"))},enable:function(h,g){g=this._options(g,"enabled","enablefail","wasenabled",h);if(this.isItem(h)){if(!this._trigger(h,"beforeenable",g)){this._fail(h,g);return}if(this.isDisabled(h)){a.removeClass(h[0],"aciTreeDisabled");this._success(h,g)}else{this._notify(h,g)}}else{this._fail(h,g)}},isEnabled:function(g){return g&&!a.hasClass(g[0],"aciTreeDisabled")},isEnabledPath:function(g){return a.withClass(this.path(g).toArray(),"aciTreeDisabled").length==0},enabled:function(g){return d(a.withClass(g.toArray(),null,"aciTreeDisabled"))},hide:function(i,g){g=this._options(g,"hidden","hidefail","washidden",i);if(this.isItem(i)){if(!this._trigger(i,"beforehide",g)){this._fail(i,g);return}if(this.isHidden(i)){this._notify(i,g)}else{a.addRemoveClass(i[0],"aciTreeHidden","aciTreeVisible");a.addRemoveClass(this.children(i,true).toArray(),"aciTreeHidden","aciTreeVisible");var h=this.parent(i);this._setFirstLast(h.length?h:null,i);this._setOddEven(i);this._success(i,g)}}else{this._fail(i,g)}},isHidden:function(g){return g&&a.hasClass(g[0],"aciTreeHidden")},isHiddenPath:function(h){var g=this.parent(h);return g[0]&&a.hasClass(g[0],"aciTreeHidden")},_updateHidden:function(g){if(this.isHiddenPath(g)){if(!this.isHidden(g)){a.addClass(g[0],"aciTreeHidden");this._updateVisible(g)}}else{this._updateVisible(g)}},hidden:function(g){return d(a.withClass(g.toArray(),"aciTreeHidden"))},_showHidden:function(h){var g=null;this.path(h).add(h).each(this.proxy(function(i){var j=d(i);if(this.isHidden(j)){a.removeClass(j[0],"aciTreeHidden");if(this.isOpenPath(j)&&(!g||this.isOpen(g))){a.addClass(j[0],"aciTreeVisible")}this._setFirstLast(g,this._getFirstLast(g))}g=j},true))},show:function(i,g){g=this._options(g,"shown","showfail","wasshown",i);if(this.isItem(i)){if(!this._trigger(i,"beforeshow",g)){this._fail(i,g);return}if(this.isHidden(i)){this._showHidden(i);var h=this.topParent(i);this._setOddEven(h.length?h:i);this._success(i,g)}else{this._notify(i,g)}}else{this._fail(i,g)}},isOpen:function(g){return g&&a.hasClass(g[0],"aciTreeOpen")},isClosed:function(g){return g&&!a.hasClass(g[0],"aciTreeOpen")},hasChildren:function(g,h){return this.children(g,false,h).length>0},hasSiblings:function(g,h){return this.siblings(g,h).length>0},hasPrev:function(g,h){return this.prev(g,h).length>0},hasNext:function(g,h){return this.next(g,h).length>0},siblings:function(g,h){return g?d(a.children(g[0].parentNode.parentNode,false,function(i){return(i!=g[0])&&(h||!this.hasClass(i,"aciTreeHidden"))})):d([])},prev:function(g,h){return g?d(a.prev(g[0],h?null:function(i){return !this.hasClass(i,"aciTreeHidden")})):d([])},next:function(g,h){return g?d(a.next(g[0],h?null:function(i){return !this.hasClass(i,"aciTreeHidden")})):d([])},level:function(h){var i=-1;if(h){var g=h[0];while(a.hasClass(g,"aciTreeLi")){g=g.parentNode.parentNode;i++}}return i},getId:function(g){var h=this.itemData(g);return h?h.id:null},itemData:function(g){return g?g.data("itemData"+this._instance.nameSpace):null},setId:function(h,g){g=this._options(g,"idset","idfail","wasid",h);if(this.isItem(h)){if(!this._trigger(h,"beforeid",g)){this._fail(h,g);return}var i=this.itemData(h);g.oldId=i.id;if(g.id==g.oldId){this._notify(h,g)}else{i.id=g.id;this._success(h,g)}}else{this._fail(h,g)}},getIndex:function(j){if(j&&j[0]){if(c.Array.prototype.indexOf){return c.Array.prototype.indexOf.call(j[0].parentNode.childNodes,j[0])}else{var h=j[0].parentNode.childNodes;for(var g=0;g=j.length){j.last().after(i)}else{j.eq(g.index).before(i)}}var h=this.parent(i);this._setFirstLast(h.length?h:null,i.add([j[0],j.get(-1)]));this._setOddEven(h);this._success(i,g)}}else{this._fail(i,g)}},getLabel:function(g){var h=this.itemData(g);return h?h.label:null},isItem:function(g){return g&&a.hasClass(g[0],"aciTreeLi")},_animate:function(j,k,i,l){if(!j){j=this._instance.jQuery}if(!i){var h=k?this._instance.options.show:this._instance.options.hide;if(h){var g=a.container(j[0]);if(g){d(g).stop(true,true).animate(h.props,{duration:h.duration,easing:h.easing,complete:l?this.proxy(l):null})}else{if(l){l.apply(this)}}return}}d(a.container(j[0])).stop(true,true).toggle(k);if(l){l.apply(this)}},first:function(g,h){if(!g){g=this._instance.jQuery}return d(a.firstChild(g[0],h?null:function(i){return !this.hasClass(i,"aciTreeHidden")}))},isFirst:function(h,i){if(h){var g=a.parent(h[0]);return this.first(g?d(g):null,i)[0]==h[0]}return false},last:function(g,h){if(!g){g=this._instance.jQuery}return d(a.lastChild(g[0],h?null:function(i){return !this.hasClass(i,"aciTreeHidden")}))},isLast:function(h,i){if(h){var g=a.parent(h[0]);return this.last(g?d(g):null,i)[0]==h[0]}return false},isBusy:function(g){if(g){return a.hasClass(g[0],"aciTreeLoad")}else{return this._instance.queue.busy()}},_loading:function(g,h){if(g){a.toggleClass(g[0],"aciTreeLoad",h);if(h){g[0].firstChild.setAttribute("aria-busy",true)}else{g[0].firstChild.removeAttribute("aria-busy")}}else{if(h){this._loader(h)}}},_loader:function(g){if(g||this.isBusy()){if(!this._private.loaderInterval){this._private.loaderInterval=c.setInterval(this.proxy(function(){this._loader()}),this._instance.options.loaderDelay)}a.addClass(this._instance.jQuery[0],"aciTreeLoad");c.clearTimeout(this._private.loaderHide);this._private.loaderHide=c.setTimeout(this.proxy(function(){a.removeClass(this._instance.jQuery[0],"aciTreeLoad")}),this._instance.options.loaderDelay*2)}},isChildren:function(h,g){if(!h){h=this._instance.jQuery}return g&&(h.has(g).length>0)},isImmediateChildren:function(h,g){if(!h){h=this._instance.jQuery}return g&&h.children(".aciTreeUl").children(".aciTreeLi").is(g)},sameParent:function(i,g){if(i&&g){var j=this.parent(i);var h=this.parent(g);return(!j.length&&!h.length)||(j[0]==h[0])}return false},sameTopParent:function(i,g){if(i&&g){var j=this.topParent(i);var h=this.topParent(g);return(!j.length&&!h.length)||(j[0]==h[0])}return false},_serialize:function(g,i){var h=this.itemData(g);if(this.isInode(g)){h.inode=true;if(this.wasLoad(g)){if(h.hasOwnProperty("open")){h.open=this.isOpen(g)}else{if(this.isOpen(g)){h.open=true}}h.branch=[];this.children(g,false,true).each(this.proxy(function(j){var k=this._serialize(d(j),i);if(i){k=i.call(this,d(j),{},k)}else{k=this._instance.options.serialize.call(this,d(j),{},k)}if(k){h.branch.push(k)}},true));if(!h.branch.length){h.branch=null}}else{if(h.hasOwnProperty("open")){h.open=false}if(h.hasOwnProperty("branch")){h.branch=null}}}else{if(h.hasOwnProperty("inode")){h.inode=false}if(h.hasOwnProperty("open")){h.open=null}if(h.hasOwnProperty("branch")){h.branch=null}}if(h.hasOwnProperty("disabled")){h.disabled=this.isDisabled(g)}else{if(this.isDisabled(g)){h.disabled=true}}return h},serialize:function(g,j,k){if(typeof j=="object"){if(g){var i=this._serialize(g,k);if(k){i=k.call(this,g,{},i)}else{i=this._instance.options.serialize.call(this,g,{},i)}return i}else{var h=[];this.children(null,false,true).each(this.proxy(function(l){var m=this._serialize(d(l),k);if(k){m=k.call(this,d(l),{},m)}else{m=this._instance.options.serialize.call(this,d(l),{},m)}if(m){h.push(m)}},true));return h}}return""},destroy:function(g){g=this._options(g);if(!this.wasInit()){this._trigger(null,"notinit",g);this._fail(null,g);return}if(this.isLocked()){this._trigger(null,"locked",g);this._fail(null,g);return}if(!this._trigger(null,"beforedestroy",g)){this._trigger(null,"destroyfail",g);this._fail(null,g);return}this._private.locked=true;this._instance.jQuery.addClass("aciTreeLoad").attr("aria-busy",true);this._instance.queue.destroy();this._destroyHook(false);this.unload(null,this._inner(g,{success:this.proxy(function(){c.clearTimeout(this._private.loaderHide);c.clearInterval(this._private.loaderInterval);this._private.itemClone={};this._destroyHook(true);this._instance.jQuery.unbind(this._instance.nameSpace).off(this._instance.nameSpace,".aciTreeButton").off(this._instance.nameSpace,".aciTreeLine");this._instance.jQuery.removeClass("aciTree"+this._instance.index+" aciTreeLoad").removeAttr("role aria-busy");this._private.locked=false;this._super();this._trigger(null,"destroyed",g);this._success(null,g)}),fail:function(){this._instance.jQuery.removeClass("aciTreeLoad");this._private.locked=false;this._trigger(null,"destroyfail",g);this._fail(null,g)}}))},_destroyHook:function(g){}};aciPluginClass.plugins.aciTree=aciPluginClass.aciPluginUi.extend(e,"aciTreeCore");aciPluginClass.publish("aciTree",b);var a=aciPluginClass.plugins.aciTree_dom})(jQuery,this);
-
-// utils
-(function(e,d,f){var b={filterHook:function(h,g,i){return g.length?i.test(d.String(this.getLabel(h))):true}};var c={__extend:function(){e.extend(this._instance,{filter:new this._queue(this,this._instance.options.queue)});this._instance.filter.destroy();this._super()},branch:function(h,k,i){var g=this._instance.queue;var j=this.proxy(function(m,o,l){var n=l?this.next(m):this.first(m);if(n.length){if(this.isInode(n)){if(this.wasLoad(n)){g.push(function(p){o.call(this,n);j(n,o);j(n,o,true);p()})}else{if(i){this.ajaxLoad(n,{success:function(){o.call(this,n);j(n,o);j(n,o,true)},fail:function(){j(n,o,true)}})}else{g.push(function(p){o.call(this,n);j(n,o,true);p()})}}}else{g.push(function(p){o.call(this,n);j(n,o,true);p()})}}});j(h,k)},swap:function(i){i=this._options(i,null,"swapfail",null,null);var h=i.item1;var g=i.item2;if(this.isItem(h)&&this.isItem(g)&&!this.isChildren(h,g)&&!this.isChildren(g,h)&&(h[0]!=g[0])){if(!this._trigger(null,"beforeswap",i)){this._fail(null,i);return}var l=this.prev(h);if(l.length){if(g[0]==l[0]){g.before(h)}else{h.insertAfter(g);g.insertAfter(l)}}else{var k=this.next(h);if(k.length){if(g[0]==k[0]){g.after(h)}else{h.insertAfter(g);g.insertBefore(k)}}else{var j=h.parent();h.insertAfter(g);j.append(g)}}this._updateLevel(h);var j=this.parent(h);this._setFirstLast(j.length?j:null,h);this._updateHidden(h);this._updateLevel(g);j=this.parent(g);this._setFirstLast(j.length?j:null,g);this._updateHidden(g);this._setOddEven(h.add(g));this._trigger(null,"swapped",i);this._success(null,i)}else{this._fail(null,i)}},_updateItemLevel:function(n,h,k){a.addRemoveClass(n[0],"aciTreeLevel"+k,"aciTreeLevel"+h);var g=n[0].firstChild;g.setAttribute("aria-level",k+1);var m=a.childrenByClass(g,"aciTreeEntry");if(h0)&&(m!=n));o.total+=n;o.checked+=m}});var i={total:0,checked:0};g(j,i,k);var h=this.proxy(function(p,o,q){var m=this.parent(p);if(m.length){if(!o){var l=this._checkboxChildren(m);var n=this.checkboxes(l,true).length;var o=(n>0)&&(n!=l.length)}if(this.hasCheckbox(m)){if((q!==f)&&(this._instance.options.checkboxChain!==1)){this._checkboxDOM.check(m,o?true:q)}this._checkboxDOM.tristate(m,o);h(m,o,q)}else{if(this._instance.options.checkboxBreak){h(m)}else{h(m,o,q)}}}});h(j,f,k)},hasCheckbox:function(g){return g&&a.hasClass(g[0],"aciTreeCheckbox")},addCheckbox:function(h,g){g=this._options(g,"checkboxadded","addcheckboxfail","wascheckbox",h);if(this.isItem(h)){if(!this._trigger(h,"beforeaddcheckbox",g)){this._fail(h,g);return}if(this.hasCheckbox(h)){this._notify(h,g)}else{var i=function(){this._checkboxDOM.add(h,{});this._success(h,g)};if(this.extRadio&&this.hasRadio(h)){this.removeRadio(h,this._inner(g,{success:i,fail:g.fail}))}else{i.apply(this)}}}else{this._fail(h,g)}},removeCheckbox:function(h,g){g=this._options(g,"checkboxremoved","removecheckboxfail","notcheckbox",h);if(this.isItem(h)){if(!this._trigger(h,"beforeremovecheckbox",g)){this._fail(h,g);return}if(this.hasCheckbox(h)){this._checkboxDOM.remove(h);this._success(h,g)}else{this._notify(h,g)}}else{this._fail(h,g)}},isChecked:function(g){if(this.hasCheckbox(g)){return a.hasClass(g[0],"aciTreeChecked")}if(this._super){return this._super(g)}return false},check:function(h,g){if(this.extCheckbox&&this.hasCheckbox(h)){g=this._options(g,"checked","checkfail","waschecked",h);if(!this._trigger(h,"beforecheck",g)){this._fail(h,g);return}if(this.isChecked(h)){this._notify(h,g)}else{this._checkboxDOM.check(h,true);if(this._instance.options.checkboxChain!==false){this._checkboxUpdate(h,true)}this._success(h,g)}}else{if(this._super){this._super(h,g)}else{this._trigger(h,"checkfail",g);this._fail(h,g)}}},uncheck:function(h,g){if(this.extCheckbox&&this.hasCheckbox(h)){g=this._options(g,"unchecked","uncheckfail","notchecked",h);if(!this._trigger(h,"beforeuncheck",g)){this._fail(h,g);return}if(this.isChecked(h)){this._checkboxDOM.check(h,false);if(this._instance.options.checkboxChain!==false){this._checkboxUpdate(h,false)}this._success(h,g)}else{this._notify(h,g)}}else{if(this._super){this._super(h,g)}else{this._trigger(h,"uncheckfail",g);this._fail(h,g)}}},checkboxes:function(g,h){if(h!==f){return e(a.withClass(g.toArray(),h?["aciTreeCheckbox","aciTreeChecked"]:"aciTreeCheckbox",h?null:"aciTreeChecked"))}return e(a.withClass(g.toArray(),"aciTreeCheckbox"))},_serialize:function(g,i){var h=this._super(g,i);if(h&&this.extCheckbox()){if(h.hasOwnProperty("checkbox")){h.checkbox=this.hasCheckbox(g);h.checked=this.isChecked(g)}else{if(this.hasCheckbox(g)){if(this.extRadio&&this.extRadio()){h.checkbox=true}h.checked=this.isChecked(g)}}}return h},serialize:function(h,j,k){if(j=="checkbox"){var i="";var g=this.children(h,true,true);this.checkboxes(g,true).each(this.proxy(function(l){var m=e(l);if(k){i+=k.call(this,m,j,this.getId(m))}else{i+=this._instance.options.serialize.call(this,m,j,this.getId(m))}},true));return i}return this._super(h,j,k)},isTristate:function(g){return g&&a.hasClass(g[0],"aciTreeTristate")},tristate:function(g){return e(a.withClass(g.toArray(),"aciTreeTristate"))},extCheckbox:function(){return this._instance.options.checkbox},option:function(g,h){if(this.wasInit()&&!this.isLocked()){if((g=="checkbox")&&(h!=this.extCheckbox())){if(h){this._checkboxInit()}else{this._checkboxDone()}}}this._super(g,h)},_checkboxDone:function(g){this._instance.jQuery.unbind(this._private.nameSpace);this._instance.jQuery.off(this._private.nameSpace,".aciTreeItem");if(!g){this.checkboxes(this.children(null,true,true)).each(this.proxy(function(h){this.removeCheckbox(e(h))},true))}},_destroyHook:function(g){if(g){this._checkboxDone(true)}this._super(g)}};aciPluginClass.plugins.aciTree=aciPluginClass.plugins.aciTree.extend(b,"aciTreeCheckbox");aciPluginClass.defaults("aciTree",c);var a=aciPluginClass.plugins.aciTree_dom})(jQuery,this);
-
-// radio (works best with selectable)
-(function(e,c,f){var b={radio:false,radioChain:true,radioBreak:true,radioClick:false};var d={_radioInit:function(){this._instance.jQuery.bind("acitree"+this._private.nameSpace,function(k,i,j,g,h){switch(g){case"loaded":if(j){i._radioLoad(j)}break}}).bind("keydown"+this._private.nameSpace,this.proxy(function(h){switch(h.which){case 32:if(this.extSelectable&&this.extSelectable()&&!h.ctrlKey){var g=this.focused();if(this.hasRadio(g)&&this.isEnabled(g)){if(!this.isChecked(g)){this.check(g)}h.stopImmediatePropagation();h.preventDefault()}}break}})).on("click"+this._private.nameSpace,".aciTreeItem",this.proxy(function(h){if(!this._instance.options.radioClick||e(h.target).is(".aciTreeCheck")){var g=this.itemFrom(h.target);if(this.hasRadio(g)&&this.isEnabled(g)&&(!this.extSelectable||!this.extSelectable()||(!h.ctrlKey&&!h.shiftKey))){if(!this.isChecked(g)){this.check(g)}h.preventDefault()}}}))},_initHook:function(){if(this.extRadio()){this._radioInit()}this._super()},_itemHook:function(h,i,g,k){if(this.extRadio()){var j=this.extCheckbox&&this.hasCheckbox(i);if(!j&&(g.radio||((g.radio===f)&&(!this.extCheckbox||!this.extCheckbox())))){this._radioDOM.add(i,g)}}this._super(h,i,g,k)},_radioDOM:{add:function(k,g){a.addClass(k[0],g.checked?["aciTreeRadio","aciTreeChecked"]:"aciTreeRadio");var l=a.childrenByClass(k[0].firstChild,"aciTreeText");var j=l.parentNode;var i=c.document.createElement("LABEL");var h=c.document.createElement("SPAN");h.className="aciTreeCheck";i.appendChild(h);i.appendChild(l);j.appendChild(i);k[0].firstChild.setAttribute("aria-checked",!!g.checked)},remove:function(i){a.removeClass(i[0],["aciTreeRadio","aciTreeChecked"]);var j=a.childrenByClass(i[0].firstChild,"aciTreeText");var g=j.parentNode;var h=g.parentNode;h.replaceChild(j,g);i[0].firstChild.removeAttribute("aria-checked")},check:function(g,h){a.toggleListClass(g.toArray(),"aciTreeChecked",h,function(i){i.firstChild.setAttribute("aria-checked",h)})}},_radioLoad:function(g){if(!this._instance.options.radioChain){return}if(this.hasRadio(g)){if(this.isChecked(g)){if(!this.radios(this.children(g,false,true),true).length){this._radioUpdate(g,true)}}else{this._radioUpdate(g)}}},_radioChildren:function(h){if(this._instance.options.radioBreak){var i=[];var j=this.proxy(function(l){var k=this.children(l,false,true);k.each(this.proxy(function(m){var n=e(m);if(this.hasRadio(n)){i.push(m);j(n)}},true))});j(h);return e(i)}else{var g=this.children(h,true,true);return this.radios(g)}},_radioLevel:function(g){var h=[];g.each(this.proxy(function(j){var k=e(j);var i=this.children(k,false,true);i.each(this.proxy(function(l){var m=e(l);if(!this._instance.options.radioBreak||this.hasRadio(m)){h.push(l)}},true))},true));return e(h)},_radioUpdate:function(i,j){var k=this.proxy(function(l){var m=this.siblings(l,true);this._radioDOM.check(this.radios(m),false);m.each(this.proxy(function(n){var o=e(n);if(!this._instance.options.radioBreak||this.hasRadio(o)){this._radioDOM.check(this._radioChildren(o),false)}},true))});if(j){k(i)}var g=this.proxy(function(n){var l=this._radioLevel(n);var o=this.radios(l);if(o.length){var m=this.radios(l,true);if(m.length){m=m.first();this._radioDOM.check(m,true);k(m);g(m)}else{m=o.first();this._radioDOM.check(m,true);k(m);g(m)}}else{if(l.length){g(l)}}});if(j){g(i)}else{this._radioDOM.check(this._radioChildren(i),false)}var h=this.proxy(function(m){var l=this.parent(m);if(l.length){if(this.hasRadio(l)){if(j){k(l)}this._radioDOM.check(l,j);h(l)}else{if(!this._instance.options.radioBreak){if(j){k(l)}h(l)}}}});if(j!==f){h(i)}},hasRadio:function(g){return g&&a.hasClass(g[0],"aciTreeRadio")},addRadio:function(h,g){g=this._options(g,"radioadded","addradiofail","wasradio",h);if(this.isItem(h)){if(!this._trigger(h,"beforeaddradio",g)){this._fail(h,g);return}if(this.hasRadio(h)){this._notify(h,g)}else{var i=function(){this._radioDOM.add(h,{});this._success(h,g)};if(this.extCheckbox&&this.hasCheckbox(h)){this.removeCheckbox(h,this._inner(g,{success:i,fail:g.fail}))}else{i.apply(this)}}}else{this._fail(h,g)}},removeRadio:function(h,g){g=this._options(g,"radioremoved","removeradiofail","notradio",h);if(this.isItem(h)){if(!this._trigger(h,"beforeremoveradio",g)){this._fail(h,g);return}if(this.hasRadio(h)){this._radioDOM.remove(h);this._success(h,g)}else{this._notify(h,g)}}else{this._fail(h,g)}},isChecked:function(g){if(this.hasRadio(g)){return a.hasClass(g[0],"aciTreeChecked")}if(this._super){return this._super(g)}return false},check:function(h,g){if(this.extRadio&&this.hasRadio(h)){g=this._options(g,"checked","checkfail","waschecked",h);if(!this._trigger(h,"beforecheck",g)){this._fail(h,g);return}if(this.isChecked(h)){this._notify(h,g)}else{this._radioDOM.check(h,true);if(this._instance.options.radioChain){this._radioUpdate(h,true)}this._success(h,g)}}else{if(this._super){this._super(h,g)}else{this._trigger(h,"checkfail",g);this._fail(h,g)}}},uncheck:function(h,g){if(this.extRadio&&this.hasRadio(h)){g=this._options(g,"unchecked","uncheckfail","notchecked",h);if(!this._trigger(h,"beforeuncheck",g)){this._fail(h,g);return}if(this.isChecked(h)){this._radioDOM.check(h,false);if(this._instance.options.radioChain){this._radioUpdate(h,false)}this._success(h,g)}else{this._notify(h,g)}}else{if(this._super){this._super(h,g)}else{this._trigger(h,"uncheckfail",g);this._fail(h,g)}}},radios:function(g,h){if(h!==f){return e(a.withClass(g.toArray(),h?["aciTreeRadio","aciTreeChecked"]:"aciTreeRadio",h?null:"aciTreeChecked"))}return e(a.withClass(g.toArray(),"aciTreeRadio"))},_serialize:function(g,i){var h=this._super(g,i);if(h&&this.extRadio()){if(h.hasOwnProperty("radio")){h.radio=this.hasRadio(g);h.checked=this.isChecked(g)}else{if(this.hasRadio(g)){if(this.extCheckbox&&this.extCheckbox()){h.radio=true}h.checked=this.isChecked(g)}}}return h},serialize:function(h,j,k){if(j=="radio"){var i="";var g=this.children(h,true,true);this.radios(g,true).each(this.proxy(function(l){var m=e(l);if(k){i+=k.call(this,m,j,this.getId(m))}else{i+=this._instance.options.serialize.call(this,m,j,this.getId(m))}},true));return i}return this._super(h,j,k)},extRadio:function(){return this._instance.options.radio},option:function(g,h){if(this.wasInit()&&!this.isLocked()){if((g=="radio")&&(h!=this.extRadio())){if(h){this._radioInit()}else{this._radioDone()}}}this._super(g,h)},_radioDone:function(g){this._instance.jQuery.unbind(this._private.nameSpace);this._instance.jQuery.off(this._private.nameSpace,".aciTreeItem");if(!g){this.radios(this.children(null,true,true)).each(this.proxy(function(h){this.removeRadio(e(h))},true))}},_destroyHook:function(g){if(g){this._radioDone(true)}this._super(g)}};aciPluginClass.plugins.aciTree=aciPluginClass.plugins.aciTree.extend(d,"aciTreeRadio");aciPluginClass.defaults("aciTree",b);var a=aciPluginClass.plugins.aciTree_dom})(jQuery,this);
-
-// column
-(function(e,c,f){var b={columnData:[]};var d={__extend:function(){e.extend(this._private,{propsIndex:{}});this._super()},_initHook:function(){if(this._instance.options.columnData.length){var j=false,h;for(var g in this._instance.options.columnData){h=this._instance.options.columnData[g];if(h.width!==f){this._updateCss(".aciTree.aciTree"+this._instance.index+" .aciTreeColumn"+g,"width:"+h.width+"px;");j=true}this._private.propsIndex[h.props]=g}if(j){this._updateWidth()}}this._super()},_getCss:function(m,p,o){var h="_getCss_"+c.String(m).replace(/[^a-z0-9_-]/ig,"_");var l=e("body").find("#"+h);if(!l.length){if(m instanceof Array){var g="",j="";for(var k in m){g+='';j+="
"}g+=j}else{var g=''}e("body").append(''+g+"
");l=e("body").find("#"+h)}var n=l.find("*:last").css(p);if(o){n=parseInt(n);if(isNaN(n)){n=null}}return n},_updateCss:function(i,g){var k="_updateCss_"+c.String(i).replace(">","_gt_").replace(/[^a-z0-9_-]/ig,"_");var h='";var j=e("body").find("#"+k);if(j.length){j.replaceWith(h)}else{e("body").prepend(h)}},getWidth:function(g){if((g>=0)&&(g=0)&&(g=0)&&(g=0)&&(h=0)&&(g.index=0)&&(gthis._instance.options.editDelay)&&(i');g.find("label").attr("for","aciTree-editable-tree-item");this._editableDOM.get(h).val(this.getLabel(h))},remove:function(i,h){var g=i.removeClass("aciTreeEdited").children(".aciTreeLine");g.find(".aciTreeText").html(this.getLabel(i));g.find("label").removeAttr("for")},get:function(g){return g?g.children(".aciTreeLine").find("input[type=text]"):d([])}},edited:function(){return this._instance.jQuery.find(".aciTreeEdited")},isEdited:function(g){return g&&a.hasClass(g[0],"aciTreeEdited")},_focusEdit:function(h){var i=this._editableDOM.get(h).focus().trigger("click")[0];if(i){if(typeof i.selectionStart=="number"){i.selectionStart=i.selectionEnd=i.value.length}else{if(i.createTextRange!==f){var g=i.createTextRange();g.collapse(false);g.select()}}}},setLabel:function(h,g){if(!this.extEditable()||!this.isEdited(h)){this._super(h,g)}},edit:function(h,g){g=this._options(g,"edit","editfail","wasedit",h);if(this.extEditable()&&this.isItem(h)){if(!this._trigger(h,"beforeedit",g)){this._fail(h,g);return}var i=this.edited();if(i.length){if(i[0]==h[0]){this._notify(h,g);return}else{this._editableDOM.remove.call(this,i);this._trigger(i,"endedit",g)}}this._editableDOM.add.call(this,h);this._focusEdit(h);this._success(h,g)}else{this._fail(h,g)}},endEdit:function(g){var h=this.edited();g=this._options(g,"edited","endeditfail","endedit",h);if(this.extEditable()&&this.isItem(h)){if(!this._trigger(h,"beforeendedit",g)){this._fail(h,g);return}var i=this._editableDOM.get(h).val();this._editableDOM.remove.call(this,h);if((g.save===f)||g.save){this.setLabel(h,{label:i});this._success(h,g)}else{this._notify(h,g)}}else{this._fail(h,g)}},extEditable:function(){return this._instance.options.editable},option:function(g,h){if(this.wasInit()&&!this.isLocked()){if((g=="editable")&&(h!=this.extEditable())){if(h){this._editableInit()}else{this._editableDone()}}}this._super(g,h)},_editableDone:function(){this._instance.jQuery.unbind(this._private.nameSpace);this._instance.jQuery.off(this._private.nameSpace,".aciTreeItem");this._instance.jQuery.off(this._private.nameSpace,"input[type=text]");var g=this.edited();if(g.length){this.endEdit()}},_destroyHook:function(g){if(g){this._editableDone()}this._super(g)}};aciPluginClass.plugins.aciTree=aciPluginClass.plugins.aciTree.extend(e,"aciTreeEditable");aciPluginClass.defaults("aciTree",b);var a=aciPluginClass.plugins.aciTree_dom})(jQuery,this);
-
-// persist (require utils extension & jStorage plugin)
-(function(c,b,e){var a={persist:null};var d={__extend:function(){c.extend(this._private,{selectTimeout:null,focusTimeout:null,openTimeout:null});this._super()},_initPersist:function(){this._instance.jQuery.bind("acitree"+this._private.nameSpace,function(j,h,i,f,g){if(g.uid=="ui.persist"){return}switch(f){case"init":h._persistRestore();break;case"selected":case"deselected":h._persistLater("selected");break;case"focus":case"blur":h._persistLater("focused");break;case"opened":case"closed":h._persistLater("opened");break}})},_initHook:function(){if(this.extPersist()){this._initPersist()}this._super()},_persistLater:function(f){switch(f){case"selected":b.clearTimeout(this._private.selectTimeout);this._private.selectTimeout=b.setTimeout(this.proxy(function(){this._persistSelected()}),250);break;case"focused":b.clearTimeout(this._private.focusTimeout);this._private.focusTimeout=b.setTimeout(this.proxy(function(){this._persistFocused()}),250);break;case"opened":b.clearTimeout(this._private.openTimeout);this._private.openTimeout=b.setTimeout(this.proxy(function(){this._persistOpened()}),250);break}},_persistRestore:function(){var f=new this._queue(this,this._instance.options.queue);var g=new this._task(f,function(k){if(this.extSelectable&&this.extSelectable()){var m=c.jStorage.get("aciTree_"+this._instance.options.persist+"_selected");if(m instanceof Array){for(var l in m){(function(i){f.push(function(o){this.searchPath(null,{success:function(p){this.select(p,{uid:"ui.persist",success:function(){o()},fail:o,focus:false})},fail:o,path:i.split(";")})})})(m[l]);if(!this._instance.options.multiSelectable){break}}}var n=c.jStorage.get("aciTree_"+this._instance.options.persist+"_focused");if(n instanceof Array){for(var l in n){(function(i){f.push(function(o){this.searchPath(null,{success:function(p){this.focus(p,{uid:"ui.persist",success:function(q){this.setVisible(q,{center:true});o()},fail:o})},fail:o,path:i.split(";")})})})(n[l])}}}k()});var j=c.jStorage.get("aciTree_"+this._instance.options.persist+"_opened");if(j instanceof Array){for(var h in j){(function(i){g.push(function(k){this.searchPath(null,{success:function(l){this.open(l,{uid:"ui.persist",success:k,fail:k})},fail:k,path:i.split(";"),load:true})})})(j[h])}}},_persistSelected:function(){if(this.extSelectable&&this.extSelectable()){var f=[];this.selected().each(this.proxy(function(g){var h=c(g);var i=this.pathId(h);i.push(this.getId(h));f.push(i.join(";"))},true));c.jStorage.set("aciTree_"+this._instance.options.persist+"_selected",f)}},_persistFocused:function(){if(this.extSelectable&&this.extSelectable()){var f=[];this.focused().each(this.proxy(function(g){var h=c(g);var i=this.pathId(h);i.push(this.getId(h));f.push(i.join(";"))},true));c.jStorage.set("aciTree_"+this._instance.options.persist+"_focused",f)}},_persistOpened:function(){var f=[];this.inodes(this.children(null,true),true).each(this.proxy(function(g){var h=c(g);if(this.isOpenPath(h)){var i=this.pathId(h);i.push(this.getId(h));f.push(i.join(";"))}},true));c.jStorage.set("aciTree_"+this._instance.options.persist+"_opened",f)},isPersist:function(){if(this.extPersist()){var f=c.jStorage.get("aciTree_"+this._instance.options.persist+"_selected");if(f instanceof Array){return true}var g=c.jStorage.get("aciTree_"+this._instance.options.persist+"_focused");if(g instanceof Array){return true}var h=c.jStorage.get("aciTree_"+this._instance.options.persist+"_opened");if(h instanceof Array){return true}}return false},unpersist:function(){if(this.extPersist()){c.jStorage.deleteKey("aciTree_"+this._instance.options.persist+"_selected");c.jStorage.deleteKey("aciTree_"+this._instance.options.persist+"_focused");c.jStorage.deleteKey("aciTree_"+this._instance.options.persist+"_opened")}},extPersist:function(){return this._instance.options.persist},option:function(f,h){var g=this.extPersist();this._super(f,h);if(this.extPersist()!=g){if(g){this._donePersist()}else{this._initPersist()}}},_donePersist:function(){this._instance.jQuery.unbind(this._private.nameSpace)},_destroyHook:function(f){if(f){this._donePersist()}this._super(f)}};aciPluginClass.plugins.aciTree=aciPluginClass.plugins.aciTree.extend(d,"aciTreePersist");aciPluginClass.defaults("aciTree",a)})(jQuery,this);
-
-// hash (require utils extension & aciFragment plugin)
-(function(d,c,e){var a={selectHash:null,openHash:null};var b={__extend:function(){d.extend(this._private,{lastSelect:null,lastOpen:null,hashApi:null});this._super()},_hashInit:function(){this._instance.jQuery.aciFragment();this._private.hashApi=this._instance.jQuery.aciFragment("api");this._instance.jQuery.bind("acitree"+this._private.nameSpace,function(j,h,i,f,g){switch(f){case"init":h._hashRestore();break}}).bind("acifragment"+this._private.nameSpace,this.proxy(function(h,g,f){h.stopPropagation();this._hashRestore()}))},_initHook:function(){if(this.extHast()){this._hashInit()}this._super()},_hashRestore:function(){var f=this._instance.queue;var i=function(l){for(var k in l){(function(m){f.push(function(n){this.search(null,{success:function(o){this.open(o,{uid:"ui.hash",success:n,fail:n})},fail:n,search:m})})})(l[k])}};if(this._instance.options.openHash){var h=this._private.hashApi.get(this._instance.options.openHash,"");if(h.length&&(h!=this._private.lastOpen)){this._private.lastOpen=h;var j=h.split(";");i(j)}}if(this._instance.options.selectHash&&this.extSelectable&&this.extSelectable()){var h=this._private.hashApi.get(this._instance.options.selectHash,"");if(h.length&&(h!=this._private.lastSelect)){this._private.lastSelect=h;var j=h.split(";");var g=j.pop();i(j);if(g){f.push(function(k){this.search(null,{success:function(l){this.select(l,{uid:"ui.hash",success:function(m){this.setVisible(m,{center:true});k()},fail:k})},fail:k,search:g})})}}}},extHast:function(){return this._instance.options.selectHash||this._instance.options.openHash},option:function(f,g){var h=this.extHast();this._super(f,g);if(this.extHast()!=h){if(h){this._hashDone()}else{this._hashInit()}}},_hashDone:function(){this._instance.jQuery.unbind(this._private.nameSpace);this._private.hashApi=null;this._instance.jQuery.aciFragment("destroy")},_destroyHook:function(f){if(f){this._hashDone()}this._super(f)}};aciPluginClass.plugins.aciTree=aciPluginClass.plugins.aciTree.extend(b,"aciTreeHash");aciPluginClass.defaults("aciTree",a)})(jQuery,this);
-
-// sortable (require utils extension & aciSortable plugin)
-(function(d,c,e){var a={sortable:false,sortDelay:750,sortDrag:function(h,j,i,g){if(!i){var f=this.getLabel(h);if(this._private.dragDrop&&(this._private.dragDrop.length>1)){f+=" and #"+(this._private.dragDrop.length-1)+" more"}g.html(f)}},sortValid:function(j,h,k,g,l,i){var f=this.getLabel(j);if(this._private.dragDrop.length>1){f+=" and #"+(this._private.dragDrop.length-1)+" more"}if(g){i.html("move "+f+" to "+this.getLabel(this.itemFrom(h)));l.removeClass("aciTreeAfter aciTreeBefore")}else{if(k!==null){if(k){i.html("move "+f+" before "+this.getLabel(h));l.removeClass("aciTreeAfter").addClass("aciTreeBefore")}else{i.html("move "+f+" after "+this.getLabel(h));l.removeClass("aciTreeBefore").addClass("aciTreeAfter")}}}}};var b={__extend:function(){d.extend(this._private,{openTimeout:null,dragDrop:null});this._super()},_sortableInit:function(){this._instance.jQuery.aciSortable({container:".aciTreeUl",item:".aciTreeLi",child:50,childHolder:'',childHolderSelector:".aciTreeChild",placeholder:'',placeholderSelector:".aciTreePlaceholder",helper:'',helperSelector:".aciTreeHelper",before:this.proxy(function(f){if(!this._initDrag(f)){return false}if(!this._trigger(f,"beforedrag")){this._trigger(f,"dragfail");return false}return true}),start:this.proxy(function(g,h,f){this._instance.jQuery.addClass("aciTreeDragDrop");f.css({opacity:1}).html(this.getLabel(g))}),drag:this.proxy(function(g,i,h,f){if(!h){c.clearTimeout(this._private.openTimeout)}if(this._instance.options.sortDrag){this._instance.options.sortDrag.apply(this,arguments)}}),valid:this.proxy(function(j,h,k,g,l,i){c.clearTimeout(this._private.openTimeout);if(!this._checkDrop(j,h,k,g,l,i)){return false}var f=this._options({hover:h,before:k,isContainer:g,placeholder:l,helper:i});if(!this._trigger(j,"checkdrop",f)){return false}if(this.isInode(h)&&!this.isOpen(h)){this._private.openTimeout=c.setTimeout(this.proxy(function(){this.open(h)}),this._instance.options.sortDelay)}if(this._instance.options.sortValid){this._instance.options.sortValid.apply(this,arguments)}return true}),create:this.proxy(function(g,h,f){if(this.isLeaf(f)){f.append(g._instance.options.childHolder);return true}return false},true),end:this.proxy(function(q,k,p,g){c.clearTimeout(this._private.openTimeout);var r={placeholder:p,helper:g};r=this._options(r,"sorted","dropfail",null,q);if(p.parent().length){var i=this.prev(p,true);if(i.length){p.detach();var l=d(this._private.dragDrop.get().reverse());this._private.dragDrop=null;l.each(this.proxy(function(s){this.moveAfter(d(s),this._inner(r,{success:r.success,fail:r.fail,after:i}))},true))}else{var j=this.next(p,true);if(j.length){p.detach();var l=d(this._private.dragDrop.get().reverse());this._private.dragDrop=null;l.each(this.proxy(function(s){this.moveBefore(d(s),this._inner(r,{success:r.success,fail:r.fail,before:j}))},true))}else{var o=this.parent(p);var f=p.parent();p.detach();f.remove();if(this.isLeaf(o)){var l=this._private.dragDrop;this.asChild(l.eq(0),this._inner(r,{success:function(){this._success(q,r);this.open(o);l.filter(":gt(0)").each(this.proxy(function(s){this.moveAfter(d(s),this._inner(r,{success:r.success,fail:r.fail,after:this.last(o)}))},true))},fail:r.fail,parent:o}))}else{this._fail(q,r)}}}}else{this._fail(q,r)}this._private.dragDrop=null;if(g.parent().length){var n=d(c).scrollTop();var h=d(c).scrollLeft();var m=q[0].getBoundingClientRect();g.animate({top:m.top+n,left:m.left+h,opacity:0},{complete:function(){g.detach()}})}this._instance.jQuery.removeClass("aciTreeDragDrop")})})},_initHook:function(){if(this.extSortable()){this._sortableInit()}this._super()},_parents:function(l){var h=l.length,k,g,f=[];for(var n=0;n= v1.9.0 http://jquery.com
+ * + aciPlugin >= v1.5.1 https://github.com/dragosu/jquery-aciPlugin
+ */
+
+// DOM
+aciPluginClass.plugins.aciTree_dom={container:function(b){var a=b.lastChild;if(a&&(a.nodeName=="UL")){return a}return null},firstChild:function(b,d){var a=this.container(b);if(a){var c=a.firstChild;if(d){while(c&&!d.call(this,c)){c=c.nextSibling}}return c}return null},lastChild:function(c,d){var a=this.container(c);if(a){var b=a.lastChild;if(d){while(b&&!d.call(this,b)){b=b.previousSibling}}return b}return null},prev:function(b,c){var a=b.previousSibling;if(c){while(a&&!c.call(this,a)){a=a.previousSibling}}return a},next:function(b,c){var a=b.nextSibling;if(c){while(a&&!c.call(this,a)){a=a.nextSibling}}return a},prevAll:function(f,h){var e,d,g,a,c,b;while(true){e=this.prev(f);if(e){if(h){a=h.call(this,e);if(a===null){f=e;continue}}d=this.lastChild(e);if(d){if(h&&(h.call(this,d)===null)){f=d;continue}c=false;while(g=this.lastChild(d)){d=g;if(h){a=h.call(this,d);if(a===null){f=d;c=true;break}}}if(c){continue}if(h){a=h.call(this,d);if(a){return d}else{if(a!==null){f=d;continue}}}else{return d}}else{if(!h||a){return e}else{f=e;continue}}}b=this.parent(f);if(b){if(h){a=h.call(this,b);if(a){return b}else{f=b}}else{return b}}else{return null}}return null},nextAll:function(d,g){var e,a,c,b,f;while(true){e=this.firstChild(d);if(e){if(g){a=g.call(this,e);if(a){return e}else{d=e;if(a!==null){continue}}}else{return e}}while(true){c=this.next(d);if(c){if(g){a=g.call(this,c);if(a){return c}else{d=c;if(a!==null){break}else{continue}}}else{return c}}else{b=d;f=null;while(b=this.parent(b)){c=this.next(b);if(c){if(g){a=g.call(this,c);if(a){return c}else{d=c;if(a!==null){f=true}else{f=false}break}}else{return c}}}if(f!==null){if(f){break}else{continue}}return null}}}return null},first:function(b,d){var a=this.container(b);if(a){var c=a.firstChild;if(c){if(d&&!d.call(this,c)){return this.nextAll(c,d)}return c}}return null},last:function(c,e){var a=this.container(c);if(a){var b=a.lastChild;if(b){if(e&&(e.call(this,b)===null)){return this.prevAll(b,e)}else{var d;while(d=this.lastChild(b)){b=d}if(e&&!e.call(this,b)){return this.prevAll(b,e)}return b}}}return null},children:function(b,f,h){var a=[],i=[],d,c,g;var e=this.firstChild(b);if(e){while(true){g=false;do{if(h){d=h.call(this,e);if(d){a.push(e)}if(f&&(d!==null)){c=this.firstChild(e);if(c){i.push(e);e=c;g=true;break}}}else{a.push(e);if(f){c=this.firstChild(e);if(c){i.push(e);e=c;g=true;break}}}}while(e=e.nextSibling);if(!g){while(e=i.pop()){e=e.nextSibling;if(e){break}}if(!e){break}}}}return a},childrenTill:function(d,g){var e=[],a,b,c;var f=d.firstChild;if(f){while(true){c=false;do{a=g.call(this,f);if(a){return f}else{if(a===null){return null}}b=f.firstChild;if(b){e.push(f);f=b;c=true;break}}while(f=f.nextSibling);if(!c){while(f=e.pop()){f=f.nextSibling;if(f){break}}if(!f){break}}}}return null},childrenByClass:function(b,a){if(b.getElementsByClassName){var c=b.getElementsByClassName(a instanceof Array?a.join(" "):a);return c?c[0]:null}else{return this.childrenTill(b,function(d){return this.hasClass(d,a)})}},parent:function(b){var a=b.parentNode.parentNode;if(a&&(a.nodeName=="LI")){return a}return null},parentFrom:function(a){while(a.nodeName!="LI"){a=a.parentNode;if(!a){return null}}return a},parentTill:function(b,c){var a;while(b=b.parentNode){a=c.call(this,b);if(a){return b}else{if(a===null){return null}}}return null},parentByClass:function(b,a){return this.parentTill(b,function(c){return this.hasClass(c,a)})},hasClass:function(e,d,a){var b=" "+e.className+" ";if(a instanceof Array){for(var c=0;c=0)&&(lt){o--;return}var v,u=false;if(ps.interval){m=t+s.delay}p--;if(o<40){o++;k()}})}}o--};var j=[];var g=function(){for(var t=0;t<4;t++){j[t]=c.setInterval(function(){if(o<20){o++;k()}},10)}};var n=function(){for(var t=0;tj.bottom-l)){return false}return true}return false},openPath:function(i,h){h=this._options(h);if(this.isItem(i)){var g=this._instance.queue;this.inodes(this.path(i),false).each(function(){var j=d(this);g.push(function(k){this.open(j,this._inner(h));k()})});g.push(function(j){this._success(i,h);j()})}else{this._fail(i,h)}},isOpenPath:function(h){var g=this.parent(h);return g[0]?this.isOpen(g)&&a.hasClass(g[0],"aciTreeVisible"):true},_speedFraction:function(i,g,j){if((jl.bottom-n){var m=o.top-l.bottom+n+j;if(!g.unanimated&&this._instance.options.view){this._instance.jQuery.stop(true).animate({scrollTop:this._instance.jQuery.scrollTop()+m},{duration:this._speedFraction(this._instance.options.view.duration,l.bottom-l.top,m),easing:this._instance.options.view.easing,complete:this.proxy(function(){this._success(h,g)})})}else{this._instance.jQuery.stop(true)[0].scrollTop=this._instance.jQuery.scrollTop()+m;this._success(h,g)}}else{this._success(h,g)}}};if(this.hasParent(h)){this.openPath(h,this._inner(g,{success:i,fail:g.fail}))}else{i.apply(this)}}else{this._fail(h,g)}},hasParent:function(g){return this.parent(g).length>0},parent:function(g){return g?d(a.parent(g[0])):d([])},topParent:function(g){return this.path(g).eq(0)},_createBranch:function(l,i){var k=0;var j=function(o){var n;for(var p=0;p=k){this._success(l,i)}});var m=this.proxy(function(o,n){if(o){a.addRemoveClass(o[0],"aciTreeInode","aciTreeInodeMaybe")}this.append(o,this._inner(i,{success:function(s,q){var p;for(var r=0;r0){var j=k[h];if(a.hasClass(j,"aciTreOdd")){i=false}k=k.slice(h+1)}}this._coreDOM.oddEven(d(k),i)},_setOddEvenChildren:function(h){var i=a.hasClass(h[0],"aciTreeOdd");var g=this.children(h);this._coreDOM.oddEven(g,!i)},_itemHook:function(h,i,g,j){if(this._instance.options.itemHook){this._instance.options.itemHook.apply(this,arguments)}},_createItem:function(h,g){if(this._private.itemClone[g]){var r=this._private.itemClone[g].cloneNode(true);var u=r.firstChild;var n=u;for(var j=0;j0},disabled:function(g){return d(a.withClass(g.toArray(),"aciTreeDisabled"))},enable:function(h,g){g=this._options(g,"enabled","enablefail","wasenabled",h);if(this.isItem(h)){if(!this._trigger(h,"beforeenable",g)){this._fail(h,g);return}if(this.isDisabled(h)){a.removeClass(h[0],"aciTreeDisabled");this._success(h,g)}else{this._notify(h,g)}}else{this._fail(h,g)}},isEnabled:function(g){return g&&!a.hasClass(g[0],"aciTreeDisabled")},isEnabledPath:function(g){return a.withClass(this.path(g).toArray(),"aciTreeDisabled").length==0},enabled:function(g){return d(a.withClass(g.toArray(),null,"aciTreeDisabled"))},hide:function(i,g){g=this._options(g,"hidden","hidefail","washidden",i);if(this.isItem(i)){if(!this._trigger(i,"beforehide",g)){this._fail(i,g);return}if(this.isHidden(i)){this._notify(i,g)}else{a.addRemoveClass(i[0],"aciTreeHidden","aciTreeVisible");a.addRemoveClass(this.children(i,true).toArray(),"aciTreeHidden","aciTreeVisible");var h=this.parent(i);this._setFirstLast(h.length?h:null,i);this._setOddEven(i);this._success(i,g)}}else{this._fail(i,g)}},isHidden:function(g){return g&&a.hasClass(g[0],"aciTreeHidden")},isHiddenPath:function(h){var g=this.parent(h);return g[0]&&a.hasClass(g[0],"aciTreeHidden")},_updateHidden:function(g){if(this.isHiddenPath(g)){if(!this.isHidden(g)){a.addClass(g[0],"aciTreeHidden");this._updateVisible(g)}}else{this._updateVisible(g)}},hidden:function(g){return d(a.withClass(g.toArray(),"aciTreeHidden"))},_showHidden:function(h){var g=null;this.path(h).add(h).each(this.proxy(function(i){var j=d(i);if(this.isHidden(j)){a.removeClass(j[0],"aciTreeHidden");if(this.isOpenPath(j)&&(!g||this.isOpen(g))){a.addClass(j[0],"aciTreeVisible")}this._setFirstLast(g,this._getFirstLast(g))}g=j},true))},show:function(i,g){g=this._options(g,"shown","showfail","wasshown",i);if(this.isItem(i)){if(!this._trigger(i,"beforeshow",g)){this._fail(i,g);return}if(this.isHidden(i)){this._showHidden(i);var h=this.topParent(i);this._setOddEven(h.length?h:i);this._success(i,g)}else{this._notify(i,g)}}else{this._fail(i,g)}},isOpen:function(g){return g&&a.hasClass(g[0],"aciTreeOpen")},isClosed:function(g){return g&&!a.hasClass(g[0],"aciTreeOpen")},hasChildren:function(g,h){return this.children(g,false,h).length>0},hasSiblings:function(g,h){return this.siblings(g,h).length>0},hasPrev:function(g,h){return this.prev(g,h).length>0},hasNext:function(g,h){return this.next(g,h).length>0},siblings:function(g,h){return g?d(a.children(g[0].parentNode.parentNode,false,function(i){return(i!=g[0])&&(h||!this.hasClass(i,"aciTreeHidden"))})):d([])},prev:function(g,h){return g?d(a.prev(g[0],h?null:function(i){return !this.hasClass(i,"aciTreeHidden")})):d([])},next:function(g,h){return g?d(a.next(g[0],h?null:function(i){return !this.hasClass(i,"aciTreeHidden")})):d([])},level:function(h){var i=-1;if(h){var g=h[0];while(a.hasClass(g,"aciTreeLi")){g=g.parentNode.parentNode;i++}}return i},getId:function(g){var h=this.itemData(g);return h?h.id:null},itemData:function(g){return g?g.data("itemData"+this._instance.nameSpace):null},setId:function(h,g){g=this._options(g,"idset","idfail","wasid",h);if(this.isItem(h)){if(!this._trigger(h,"beforeid",g)){this._fail(h,g);return}var i=this.itemData(h);g.oldId=i.id;if(g.id==g.oldId){this._notify(h,g)}else{i.id=g.id;this._success(h,g)}}else{this._fail(h,g)}},getIndex:function(j){if(j&&j[0]){if(c.Array.prototype.indexOf){return c.Array.prototype.indexOf.call(j[0].parentNode.childNodes,j[0])}else{var h=j[0].parentNode.childNodes;for(var g=0;g=j.length){j.last().after(i)}else{j.eq(g.index).before(i)}}var h=this.parent(i);this._setFirstLast(h.length?h:null,i.add([j[0],j.get(-1)]));this._setOddEven(h);this._success(i,g)}}else{this._fail(i,g)}},getLabel:function(g){var h=this.itemData(g);return h?h.label:null},isItem:function(g){return g&&a.hasClass(g[0],"aciTreeLi")},_animate:function(j,k,i,l){if(!j){j=this._instance.jQuery}if(!i){var h=k?this._instance.options.show:this._instance.options.hide;if(h){var g=a.container(j[0]);if(g){d(g).stop(true,true).animate(h.props,{duration:h.duration,easing:h.easing,complete:l?this.proxy(l):null})}else{if(l){l.apply(this)}}return}}d(a.container(j[0])).stop(true,true).toggle(k);if(l){l.apply(this)}},first:function(g,h){if(!g){g=this._instance.jQuery}return d(a.firstChild(g[0],h?null:function(i){return !this.hasClass(i,"aciTreeHidden")}))},isFirst:function(h,i){if(h){var g=a.parent(h[0]);return this.first(g?d(g):null,i)[0]==h[0]}return false},last:function(g,h){if(!g){g=this._instance.jQuery}return d(a.lastChild(g[0],h?null:function(i){return !this.hasClass(i,"aciTreeHidden")}))},isLast:function(h,i){if(h){var g=a.parent(h[0]);return this.last(g?d(g):null,i)[0]==h[0]}return false},isBusy:function(g){if(g){return a.hasClass(g[0],"aciTreeLoad")}else{return this._instance.queue.busy()}},_loading:function(g,h){if(g){a.toggleClass(g[0],"aciTreeLoad",h);if(h){g[0].firstChild.setAttribute("aria-busy",true)}else{g[0].firstChild.removeAttribute("aria-busy")}}else{if(h){this._loader(h)}}},_loader:function(g){if(g||this.isBusy()){if(!this._private.loaderInterval){this._private.loaderInterval=c.setInterval(this.proxy(function(){this._loader()}),this._instance.options.loaderDelay)}a.addClass(this._instance.jQuery[0],"aciTreeLoad");c.clearTimeout(this._private.loaderHide);this._private.loaderHide=c.setTimeout(this.proxy(function(){a.removeClass(this._instance.jQuery[0],"aciTreeLoad")}),this._instance.options.loaderDelay*2)}},isChildren:function(h,g){if(!h){h=this._instance.jQuery}return g&&(h.has(g).length>0)},isImmediateChildren:function(h,g){if(!h){h=this._instance.jQuery}return g&&h.children(".aciTreeUl").children(".aciTreeLi").is(g)},sameParent:function(i,g){if(i&&g){var j=this.parent(i);var h=this.parent(g);return(!j.length&&!h.length)||(j[0]==h[0])}return false},sameTopParent:function(i,g){if(i&&g){var j=this.topParent(i);var h=this.topParent(g);return(!j.length&&!h.length)||(j[0]==h[0])}return false},_serialize:function(g,i){var h=this.itemData(g);if(this.isInode(g)){h.inode=true;if(this.wasLoad(g)){if(h.hasOwnProperty("open")){h.open=this.isOpen(g)}else{if(this.isOpen(g)){h.open=true}}h.branch=[];this.children(g,false,true).each(this.proxy(function(j){var k=this._serialize(d(j),i);if(i){k=i.call(this,d(j),{},k)}else{k=this._instance.options.serialize.call(this,d(j),{},k)}if(k){h.branch.push(k)}},true));if(!h.branch.length){h.branch=null}}else{if(h.hasOwnProperty("open")){h.open=false}if(h.hasOwnProperty("branch")){h.branch=null}}}else{if(h.hasOwnProperty("inode")){h.inode=false}if(h.hasOwnProperty("open")){h.open=null}if(h.hasOwnProperty("branch")){h.branch=null}}if(h.hasOwnProperty("disabled")){h.disabled=this.isDisabled(g)}else{if(this.isDisabled(g)){h.disabled=true}}return h},serialize:function(g,j,k){if(typeof j=="object"){if(g){var i=this._serialize(g,k);if(k){i=k.call(this,g,{},i)}else{i=this._instance.options.serialize.call(this,g,{},i)}return i}else{var h=[];this.children(null,false,true).each(this.proxy(function(l){var m=this._serialize(d(l),k);if(k){m=k.call(this,d(l),{},m)}else{m=this._instance.options.serialize.call(this,d(l),{},m)}if(m){h.push(m)}},true));return h}}return""},destroy:function(g){g=this._options(g);if(!this.wasInit()){this._trigger(null,"notinit",g);this._fail(null,g);return}if(this.isLocked()){this._trigger(null,"locked",g);this._fail(null,g);return}if(!this._trigger(null,"beforedestroy",g)){this._trigger(null,"destroyfail",g);this._fail(null,g);return}this._private.locked=true;this._instance.jQuery.addClass("aciTreeLoad").attr("aria-busy",true);this._instance.queue.destroy();this._destroyHook(false);this.unload(null,this._inner(g,{success:this.proxy(function(){c.clearTimeout(this._private.loaderHide);c.clearInterval(this._private.loaderInterval);this._private.itemClone={};this._destroyHook(true);this._instance.jQuery.unbind(this._instance.nameSpace).off(this._instance.nameSpace,".aciTreeButton").off(this._instance.nameSpace,".aciTreeLine");this._instance.jQuery.removeClass("aciTree"+this._instance.index+" aciTreeLoad").removeAttr("role aria-busy");this._private.locked=false;this._super();this._trigger(null,"destroyed",g);this._success(null,g)}),fail:function(){this._instance.jQuery.removeClass("aciTreeLoad");this._private.locked=false;this._trigger(null,"destroyfail",g);this._fail(null,g)}}))},_destroyHook:function(g){}};aciPluginClass.plugins.aciTree=aciPluginClass.aciPluginUi.extend(e,"aciTreeCore");aciPluginClass.publish("aciTree",b);var a=aciPluginClass.plugins.aciTree_dom})(jQuery,this);
+
+// utils
+(function(e,d,f){var b={filterHook:function(h,g,i){return g.length?i.test(d.String(this.getLabel(h))):true}};var c={__extend:function(){e.extend(this._instance,{filter:new this._queue(this,this._instance.options.queue)});this._instance.filter.destroy();this._super()},branch:function(h,k,i){var g=this._instance.queue;var j=this.proxy(function(m,o,l){var n=l?this.next(m):this.first(m);if(n.length){if(this.isInode(n)){if(this.wasLoad(n)){g.push(function(p){o.call(this,n);j(n,o);j(n,o,true);p()})}else{if(i){this.ajaxLoad(n,{success:function(){o.call(this,n);j(n,o);j(n,o,true)},fail:function(){j(n,o,true)}})}else{g.push(function(p){o.call(this,n);j(n,o,true);p()})}}}else{g.push(function(p){o.call(this,n);j(n,o,true);p()})}}});j(h,k)},swap:function(i){i=this._options(i,null,"swapfail",null,null);var h=i.item1;var g=i.item2;if(this.isItem(h)&&this.isItem(g)&&!this.isChildren(h,g)&&!this.isChildren(g,h)&&(h[0]!=g[0])){if(!this._trigger(null,"beforeswap",i)){this._fail(null,i);return}var l=this.prev(h);if(l.length){if(g[0]==l[0]){g.before(h)}else{h.insertAfter(g);g.insertAfter(l)}}else{var k=this.next(h);if(k.length){if(g[0]==k[0]){g.after(h)}else{h.insertAfter(g);g.insertBefore(k)}}else{var j=h.parent();h.insertAfter(g);j.append(g)}}this._updateLevel(h);var j=this.parent(h);this._setFirstLast(j.length?j:null,h);this._updateHidden(h);this._updateLevel(g);j=this.parent(g);this._setFirstLast(j.length?j:null,g);this._updateHidden(g);this._setOddEven(h.add(g));this._trigger(null,"swapped",i);this._success(null,i)}else{this._fail(null,i)}},_updateItemLevel:function(n,h,k){a.addRemoveClass(n[0],"aciTreeLevel"+k,"aciTreeLevel"+h);var g=n[0].firstChild;g.setAttribute("aria-level",k+1);var m=a.childrenByClass(g,"aciTreeEntry");if(h0)&&(m!=n));o.total+=n;o.checked+=m}});var i={total:0,checked:0};g(j,i,k);var h=this.proxy(function(p,o,q){var m=this.parent(p);if(m.length){if(!o){var l=this._checkboxChildren(m);var n=this.checkboxes(l,true).length;var o=(n>0)&&(n!=l.length)}if(this.hasCheckbox(m)){if((q!==f)&&(this._instance.options.checkboxChain!==1)){this._checkboxDOM.check(m,o?true:q)}this._checkboxDOM.tristate(m,o);h(m,o,q)}else{if(this._instance.options.checkboxBreak){h(m)}else{h(m,o,q)}}}});h(j,f,k)},hasCheckbox:function(g){return g&&a.hasClass(g[0],"aciTreeCheckbox")},addCheckbox:function(h,g){g=this._options(g,"checkboxadded","addcheckboxfail","wascheckbox",h);if(this.isItem(h)){if(!this._trigger(h,"beforeaddcheckbox",g)){this._fail(h,g);return}if(this.hasCheckbox(h)){this._notify(h,g)}else{var i=function(){this._checkboxDOM.add(h,{});this._success(h,g)};if(this.extRadio&&this.hasRadio(h)){this.removeRadio(h,this._inner(g,{success:i,fail:g.fail}))}else{i.apply(this)}}}else{this._fail(h,g)}},removeCheckbox:function(h,g){g=this._options(g,"checkboxremoved","removecheckboxfail","notcheckbox",h);if(this.isItem(h)){if(!this._trigger(h,"beforeremovecheckbox",g)){this._fail(h,g);return}if(this.hasCheckbox(h)){this._checkboxDOM.remove(h);this._success(h,g)}else{this._notify(h,g)}}else{this._fail(h,g)}},isChecked:function(g){if(this.hasCheckbox(g)){return a.hasClass(g[0],"aciTreeChecked")}if(this._super){return this._super(g)}return false},check:function(h,g){if(this.extCheckbox&&this.hasCheckbox(h)){g=this._options(g,"checked","checkfail","waschecked",h);if(!this._trigger(h,"beforecheck",g)){this._fail(h,g);return}if(this.isChecked(h)){this._notify(h,g)}else{this._checkboxDOM.check(h,true);if(this._instance.options.checkboxChain!==false){this._checkboxUpdate(h,true)}this._success(h,g)}}else{if(this._super){this._super(h,g)}else{this._trigger(h,"checkfail",g);this._fail(h,g)}}},uncheck:function(h,g){if(this.extCheckbox&&this.hasCheckbox(h)){g=this._options(g,"unchecked","uncheckfail","notchecked",h);if(!this._trigger(h,"beforeuncheck",g)){this._fail(h,g);return}if(this.isChecked(h)){this._checkboxDOM.check(h,false);if(this._instance.options.checkboxChain!==false){this._checkboxUpdate(h,false)}this._success(h,g)}else{this._notify(h,g)}}else{if(this._super){this._super(h,g)}else{this._trigger(h,"uncheckfail",g);this._fail(h,g)}}},checkboxes:function(g,h){if(h!==f){return e(a.withClass(g.toArray(),h?["aciTreeCheckbox","aciTreeChecked"]:"aciTreeCheckbox",h?null:"aciTreeChecked"))}return e(a.withClass(g.toArray(),"aciTreeCheckbox"))},_serialize:function(g,i){var h=this._super(g,i);if(h&&this.extCheckbox()){if(h.hasOwnProperty("checkbox")){h.checkbox=this.hasCheckbox(g);h.checked=this.isChecked(g)}else{if(this.hasCheckbox(g)){if(this.extRadio&&this.extRadio()){h.checkbox=true}h.checked=this.isChecked(g)}}}return h},serialize:function(h,j,k){if(j=="checkbox"){var i="";var g=this.children(h,true,true);this.checkboxes(g,true).each(this.proxy(function(l){var m=e(l);if(k){i+=k.call(this,m,j,this.getId(m))}else{i+=this._instance.options.serialize.call(this,m,j,this.getId(m))}},true));return i}return this._super(h,j,k)},isTristate:function(g){return g&&a.hasClass(g[0],"aciTreeTristate")},tristate:function(g){return e(a.withClass(g.toArray(),"aciTreeTristate"))},extCheckbox:function(){return this._instance.options.checkbox},option:function(g,h){if(this.wasInit()&&!this.isLocked()){if((g=="checkbox")&&(h!=this.extCheckbox())){if(h){this._checkboxInit()}else{this._checkboxDone()}}}this._super(g,h)},_checkboxDone:function(g){this._instance.jQuery.unbind(this._private.nameSpace);this._instance.jQuery.off(this._private.nameSpace,".aciTreeItem");if(!g){this.checkboxes(this.children(null,true,true)).each(this.proxy(function(h){this.removeCheckbox(e(h))},true))}},_destroyHook:function(g){if(g){this._checkboxDone(true)}this._super(g)}};aciPluginClass.plugins.aciTree=aciPluginClass.plugins.aciTree.extend(b,"aciTreeCheckbox");aciPluginClass.defaults("aciTree",c);var a=aciPluginClass.plugins.aciTree_dom})(jQuery,this);
+
+// radio (works best with selectable)
+(function(e,c,f){var b={radio:false,radioChain:true,radioBreak:true,radioClick:false};var d={_radioInit:function(){this._instance.jQuery.bind("acitree"+this._private.nameSpace,function(k,i,j,g,h){switch(g){case"loaded":if(j){i._radioLoad(j)}break}}).bind("keydown"+this._private.nameSpace,this.proxy(function(h){switch(h.which){case 32:if(this.extSelectable&&this.extSelectable()&&!h.ctrlKey){var g=this.focused();if(this.hasRadio(g)&&this.isEnabled(g)){if(!this.isChecked(g)){this.check(g)}h.stopImmediatePropagation();h.preventDefault()}}break}})).on("click"+this._private.nameSpace,".aciTreeItem",this.proxy(function(h){if(!this._instance.options.radioClick||e(h.target).is(".aciTreeCheck")){var g=this.itemFrom(h.target);if(this.hasRadio(g)&&this.isEnabled(g)&&(!this.extSelectable||!this.extSelectable()||(!h.ctrlKey&&!h.shiftKey))){if(!this.isChecked(g)){this.check(g)}h.preventDefault()}}}))},_initHook:function(){if(this.extRadio()){this._radioInit()}this._super()},_itemHook:function(h,i,g,k){if(this.extRadio()){var j=this.extCheckbox&&this.hasCheckbox(i);if(!j&&(g.radio||((g.radio===f)&&(!this.extCheckbox||!this.extCheckbox())))){this._radioDOM.add(i,g)}}this._super(h,i,g,k)},_radioDOM:{add:function(k,g){a.addClass(k[0],g.checked?["aciTreeRadio","aciTreeChecked"]:"aciTreeRadio");var l=a.childrenByClass(k[0].firstChild,"aciTreeText");var j=l.parentNode;var i=c.document.createElement("LABEL");var h=c.document.createElement("SPAN");h.className="aciTreeCheck";i.appendChild(h);i.appendChild(l);j.appendChild(i);k[0].firstChild.setAttribute("aria-checked",!!g.checked)},remove:function(i){a.removeClass(i[0],["aciTreeRadio","aciTreeChecked"]);var j=a.childrenByClass(i[0].firstChild,"aciTreeText");var g=j.parentNode;var h=g.parentNode;h.replaceChild(j,g);i[0].firstChild.removeAttribute("aria-checked")},check:function(g,h){a.toggleListClass(g.toArray(),"aciTreeChecked",h,function(i){i.firstChild.setAttribute("aria-checked",h)})}},_radioLoad:function(g){if(!this._instance.options.radioChain){return}if(this.hasRadio(g)){if(this.isChecked(g)){if(!this.radios(this.children(g,false,true),true).length){this._radioUpdate(g,true)}}else{this._radioUpdate(g)}}},_radioChildren:function(h){if(this._instance.options.radioBreak){var i=[];var j=this.proxy(function(l){var k=this.children(l,false,true);k.each(this.proxy(function(m){var n=e(m);if(this.hasRadio(n)){i.push(m);j(n)}},true))});j(h);return e(i)}else{var g=this.children(h,true,true);return this.radios(g)}},_radioLevel:function(g){var h=[];g.each(this.proxy(function(j){var k=e(j);var i=this.children(k,false,true);i.each(this.proxy(function(l){var m=e(l);if(!this._instance.options.radioBreak||this.hasRadio(m)){h.push(l)}},true))},true));return e(h)},_radioUpdate:function(i,j){var k=this.proxy(function(l){var m=this.siblings(l,true);this._radioDOM.check(this.radios(m),false);m.each(this.proxy(function(n){var o=e(n);if(!this._instance.options.radioBreak||this.hasRadio(o)){this._radioDOM.check(this._radioChildren(o),false)}},true))});if(j){k(i)}var g=this.proxy(function(n){var l=this._radioLevel(n);var o=this.radios(l);if(o.length){var m=this.radios(l,true);if(m.length){m=m.first();this._radioDOM.check(m,true);k(m);g(m)}else{m=o.first();this._radioDOM.check(m,true);k(m);g(m)}}else{if(l.length){g(l)}}});if(j){g(i)}else{this._radioDOM.check(this._radioChildren(i),false)}var h=this.proxy(function(m){var l=this.parent(m);if(l.length){if(this.hasRadio(l)){if(j){k(l)}this._radioDOM.check(l,j);h(l)}else{if(!this._instance.options.radioBreak){if(j){k(l)}h(l)}}}});if(j!==f){h(i)}},hasRadio:function(g){return g&&a.hasClass(g[0],"aciTreeRadio")},addRadio:function(h,g){g=this._options(g,"radioadded","addradiofail","wasradio",h);if(this.isItem(h)){if(!this._trigger(h,"beforeaddradio",g)){this._fail(h,g);return}if(this.hasRadio(h)){this._notify(h,g)}else{var i=function(){this._radioDOM.add(h,{});this._success(h,g)};if(this.extCheckbox&&this.hasCheckbox(h)){this.removeCheckbox(h,this._inner(g,{success:i,fail:g.fail}))}else{i.apply(this)}}}else{this._fail(h,g)}},removeRadio:function(h,g){g=this._options(g,"radioremoved","removeradiofail","notradio",h);if(this.isItem(h)){if(!this._trigger(h,"beforeremoveradio",g)){this._fail(h,g);return}if(this.hasRadio(h)){this._radioDOM.remove(h);this._success(h,g)}else{this._notify(h,g)}}else{this._fail(h,g)}},isChecked:function(g){if(this.hasRadio(g)){return a.hasClass(g[0],"aciTreeChecked")}if(this._super){return this._super(g)}return false},check:function(h,g){if(this.extRadio&&this.hasRadio(h)){g=this._options(g,"checked","checkfail","waschecked",h);if(!this._trigger(h,"beforecheck",g)){this._fail(h,g);return}if(this.isChecked(h)){this._notify(h,g)}else{this._radioDOM.check(h,true);if(this._instance.options.radioChain){this._radioUpdate(h,true)}this._success(h,g)}}else{if(this._super){this._super(h,g)}else{this._trigger(h,"checkfail",g);this._fail(h,g)}}},uncheck:function(h,g){if(this.extRadio&&this.hasRadio(h)){g=this._options(g,"unchecked","uncheckfail","notchecked",h);if(!this._trigger(h,"beforeuncheck",g)){this._fail(h,g);return}if(this.isChecked(h)){this._radioDOM.check(h,false);if(this._instance.options.radioChain){this._radioUpdate(h,false)}this._success(h,g)}else{this._notify(h,g)}}else{if(this._super){this._super(h,g)}else{this._trigger(h,"uncheckfail",g);this._fail(h,g)}}},radios:function(g,h){if(h!==f){return e(a.withClass(g.toArray(),h?["aciTreeRadio","aciTreeChecked"]:"aciTreeRadio",h?null:"aciTreeChecked"))}return e(a.withClass(g.toArray(),"aciTreeRadio"))},_serialize:function(g,i){var h=this._super(g,i);if(h&&this.extRadio()){if(h.hasOwnProperty("radio")){h.radio=this.hasRadio(g);h.checked=this.isChecked(g)}else{if(this.hasRadio(g)){if(this.extCheckbox&&this.extCheckbox()){h.radio=true}h.checked=this.isChecked(g)}}}return h},serialize:function(h,j,k){if(j=="radio"){var i="";var g=this.children(h,true,true);this.radios(g,true).each(this.proxy(function(l){var m=e(l);if(k){i+=k.call(this,m,j,this.getId(m))}else{i+=this._instance.options.serialize.call(this,m,j,this.getId(m))}},true));return i}return this._super(h,j,k)},extRadio:function(){return this._instance.options.radio},option:function(g,h){if(this.wasInit()&&!this.isLocked()){if((g=="radio")&&(h!=this.extRadio())){if(h){this._radioInit()}else{this._radioDone()}}}this._super(g,h)},_radioDone:function(g){this._instance.jQuery.unbind(this._private.nameSpace);this._instance.jQuery.off(this._private.nameSpace,".aciTreeItem");if(!g){this.radios(this.children(null,true,true)).each(this.proxy(function(h){this.removeRadio(e(h))},true))}},_destroyHook:function(g){if(g){this._radioDone(true)}this._super(g)}};aciPluginClass.plugins.aciTree=aciPluginClass.plugins.aciTree.extend(d,"aciTreeRadio");aciPluginClass.defaults("aciTree",b);var a=aciPluginClass.plugins.aciTree_dom})(jQuery,this);
+
+// column
+(function(e,c,f){var b={columnData:[]};var d={__extend:function(){e.extend(this._private,{propsIndex:{}});this._super()},_initHook:function(){if(this._instance.options.columnData.length){var j=false,h;for(var g in this._instance.options.columnData){h=this._instance.options.columnData[g];if(h.width!==f){this._updateCss(".aciTree.aciTree"+this._instance.index+" .aciTreeColumn"+g,"width:"+h.width+"px;");j=true}this._private.propsIndex[h.props]=g}if(j){this._updateWidth()}}this._super()},_getCss:function(m,p,o){var h="_getCss_"+c.String(m).replace(/[^a-z0-9_-]/ig,"_");var l=e("body").find("#"+h);if(!l.length){if(m instanceof Array){var g="",j="";for(var k in m){g+='';j+="
"}g+=j}else{var g=''}e("body").append(''+g+"
");l=e("body").find("#"+h)}var n=l.find("*:last").css(p);if(o){n=parseInt(n);if(isNaN(n)){n=null}}return n},_updateCss:function(i,g){var k="_updateCss_"+c.String(i).replace(">","_gt_").replace(/[^a-z0-9_-]/ig,"_");var h='";var j=e("body").find("#"+k);if(j.length){j.replaceWith(h)}else{e("body").prepend(h)}},getWidth:function(g){if((g>=0)&&(g=0)&&(g=0)&&(g=0)&&(h=0)&&(g.index=0)&&(gthis._instance.options.editDelay)&&(i');g.find("label").attr("for","aciTree-editable-tree-item");this._editableDOM.get(h).val(this.getLabel(h))},remove:function(i,h){var g=i.removeClass("aciTreeEdited").children(".aciTreeLine");g.find(".aciTreeText").html(this.getLabel(i));g.find("label").removeAttr("for")},get:function(g){return g?g.children(".aciTreeLine").find("input[type=text]"):d([])}},edited:function(){return this._instance.jQuery.find(".aciTreeEdited")},isEdited:function(g){return g&&a.hasClass(g[0],"aciTreeEdited")},_focusEdit:function(h){var i=this._editableDOM.get(h).focus().trigger("click")[0];if(i){if(typeof i.selectionStart=="number"){i.selectionStart=i.selectionEnd=i.value.length}else{if(i.createTextRange!==f){var g=i.createTextRange();g.collapse(false);g.select()}}}},setLabel:function(h,g){if(!this.extEditable()||!this.isEdited(h)){this._super(h,g)}},edit:function(h,g){g=this._options(g,"edit","editfail","wasedit",h);if(this.extEditable()&&this.isItem(h)){if(!this._trigger(h,"beforeedit",g)){this._fail(h,g);return}var i=this.edited();if(i.length){if(i[0]==h[0]){this._notify(h,g);return}else{this._editableDOM.remove.call(this,i);this._trigger(i,"endedit",g)}}this._editableDOM.add.call(this,h);this._focusEdit(h);this._success(h,g)}else{this._fail(h,g)}},endEdit:function(g){var h=this.edited();g=this._options(g,"edited","endeditfail","endedit",h);if(this.extEditable()&&this.isItem(h)){if(!this._trigger(h,"beforeendedit",g)){this._fail(h,g);return}var i=this._editableDOM.get(h).val();this._editableDOM.remove.call(this,h);if((g.save===f)||g.save){this.setLabel(h,{label:i});this._success(h,g)}else{this._notify(h,g)}}else{this._fail(h,g)}},extEditable:function(){return this._instance.options.editable},option:function(g,h){if(this.wasInit()&&!this.isLocked()){if((g=="editable")&&(h!=this.extEditable())){if(h){this._editableInit()}else{this._editableDone()}}}this._super(g,h)},_editableDone:function(){this._instance.jQuery.unbind(this._private.nameSpace);this._instance.jQuery.off(this._private.nameSpace,".aciTreeItem");this._instance.jQuery.off(this._private.nameSpace,"input[type=text]");var g=this.edited();if(g.length){this.endEdit()}},_destroyHook:function(g){if(g){this._editableDone()}this._super(g)}};aciPluginClass.plugins.aciTree=aciPluginClass.plugins.aciTree.extend(e,"aciTreeEditable");aciPluginClass.defaults("aciTree",b);var a=aciPluginClass.plugins.aciTree_dom})(jQuery,this);
+
+// persist (require utils extension & jStorage plugin)
+(function(c,b,e){var a={persist:null};var d={__extend:function(){c.extend(this._private,{selectTimeout:null,focusTimeout:null,openTimeout:null});this._super()},_initPersist:function(){this._instance.jQuery.bind("acitree"+this._private.nameSpace,function(j,h,i,f,g){if(g.uid=="ui.persist"){return}switch(f){case"init":h._persistRestore();break;case"selected":case"deselected":h._persistLater("selected");break;case"focus":case"blur":h._persistLater("focused");break;case"opened":case"closed":h._persistLater("opened");break}})},_initHook:function(){if(this.extPersist()){this._initPersist()}this._super()},_persistLater:function(f){switch(f){case"selected":b.clearTimeout(this._private.selectTimeout);this._private.selectTimeout=b.setTimeout(this.proxy(function(){this._persistSelected()}),250);break;case"focused":b.clearTimeout(this._private.focusTimeout);this._private.focusTimeout=b.setTimeout(this.proxy(function(){this._persistFocused()}),250);break;case"opened":b.clearTimeout(this._private.openTimeout);this._private.openTimeout=b.setTimeout(this.proxy(function(){this._persistOpened()}),250);break}},_persistRestore:function(){var f=new this._queue(this,this._instance.options.queue);var g=new this._task(f,function(k){if(this.extSelectable&&this.extSelectable()){var m=c.jStorage.get("aciTree_"+this._instance.options.persist+"_selected");if(m instanceof Array){for(var l in m){(function(i){f.push(function(o){this.searchPath(null,{success:function(p){this.select(p,{uid:"ui.persist",success:function(){o()},fail:o,focus:false})},fail:o,path:i.split(";")})})})(m[l]);if(!this._instance.options.multiSelectable){break}}}var n=c.jStorage.get("aciTree_"+this._instance.options.persist+"_focused");if(n instanceof Array){for(var l in n){(function(i){f.push(function(o){this.searchPath(null,{success:function(p){this.focus(p,{uid:"ui.persist",success:function(q){this.setVisible(q,{center:true});o()},fail:o})},fail:o,path:i.split(";")})})})(n[l])}}}k()});var j=c.jStorage.get("aciTree_"+this._instance.options.persist+"_opened");if(j instanceof Array){for(var h in j){(function(i){g.push(function(k){this.searchPath(null,{success:function(l){this.open(l,{uid:"ui.persist",success:k,fail:k})},fail:k,path:i.split(";"),load:true})})})(j[h])}}},_persistSelected:function(){if(this.extSelectable&&this.extSelectable()){var f=[];this.selected().each(this.proxy(function(g){var h=c(g);var i=this.pathId(h);i.push(this.getId(h));f.push(i.join(";"))},true));c.jStorage.set("aciTree_"+this._instance.options.persist+"_selected",f)}},_persistFocused:function(){if(this.extSelectable&&this.extSelectable()){var f=[];this.focused().each(this.proxy(function(g){var h=c(g);var i=this.pathId(h);i.push(this.getId(h));f.push(i.join(";"))},true));c.jStorage.set("aciTree_"+this._instance.options.persist+"_focused",f)}},_persistOpened:function(){var f=[];this.inodes(this.children(null,true),true).each(this.proxy(function(g){var h=c(g);if(this.isOpenPath(h)){var i=this.pathId(h);i.push(this.getId(h));f.push(i.join(";"))}},true));c.jStorage.set("aciTree_"+this._instance.options.persist+"_opened",f)},isPersist:function(){if(this.extPersist()){var f=c.jStorage.get("aciTree_"+this._instance.options.persist+"_selected");if(f instanceof Array){return true}var g=c.jStorage.get("aciTree_"+this._instance.options.persist+"_focused");if(g instanceof Array){return true}var h=c.jStorage.get("aciTree_"+this._instance.options.persist+"_opened");if(h instanceof Array){return true}}return false},unpersist:function(){if(this.extPersist()){c.jStorage.deleteKey("aciTree_"+this._instance.options.persist+"_selected");c.jStorage.deleteKey("aciTree_"+this._instance.options.persist+"_focused");c.jStorage.deleteKey("aciTree_"+this._instance.options.persist+"_opened")}},extPersist:function(){return this._instance.options.persist},option:function(f,h){var g=this.extPersist();this._super(f,h);if(this.extPersist()!=g){if(g){this._donePersist()}else{this._initPersist()}}},_donePersist:function(){this._instance.jQuery.unbind(this._private.nameSpace)},_destroyHook:function(f){if(f){this._donePersist()}this._super(f)}};aciPluginClass.plugins.aciTree=aciPluginClass.plugins.aciTree.extend(d,"aciTreePersist");aciPluginClass.defaults("aciTree",a)})(jQuery,this);
+
+// hash (require utils extension & aciFragment plugin)
+(function(d,c,e){var a={selectHash:null,openHash:null};var b={__extend:function(){d.extend(this._private,{lastSelect:null,lastOpen:null,hashApi:null});this._super()},_hashInit:function(){this._instance.jQuery.aciFragment();this._private.hashApi=this._instance.jQuery.aciFragment("api");this._instance.jQuery.bind("acitree"+this._private.nameSpace,function(j,h,i,f,g){switch(f){case"init":h._hashRestore();break}}).bind("acifragment"+this._private.nameSpace,this.proxy(function(h,g,f){h.stopPropagation();this._hashRestore()}))},_initHook:function(){if(this.extHast()){this._hashInit()}this._super()},_hashRestore:function(){var f=this._instance.queue;var i=function(l){for(var k in l){(function(m){f.push(function(n){this.search(null,{success:function(o){this.open(o,{uid:"ui.hash",success:n,fail:n})},fail:n,search:m})})})(l[k])}};if(this._instance.options.openHash){var h=this._private.hashApi.get(this._instance.options.openHash,"");if(h.length&&(h!=this._private.lastOpen)){this._private.lastOpen=h;var j=h.split(";");i(j)}}if(this._instance.options.selectHash&&this.extSelectable&&this.extSelectable()){var h=this._private.hashApi.get(this._instance.options.selectHash,"");if(h.length&&(h!=this._private.lastSelect)){this._private.lastSelect=h;var j=h.split(";");var g=j.pop();i(j);if(g){f.push(function(k){this.search(null,{success:function(l){this.select(l,{uid:"ui.hash",success:function(m){this.setVisible(m,{center:true});k()},fail:k})},fail:k,search:g})})}}}},extHast:function(){return this._instance.options.selectHash||this._instance.options.openHash},option:function(f,g){var h=this.extHast();this._super(f,g);if(this.extHast()!=h){if(h){this._hashDone()}else{this._hashInit()}}},_hashDone:function(){this._instance.jQuery.unbind(this._private.nameSpace);this._private.hashApi=null;this._instance.jQuery.aciFragment("destroy")},_destroyHook:function(f){if(f){this._hashDone()}this._super(f)}};aciPluginClass.plugins.aciTree=aciPluginClass.plugins.aciTree.extend(b,"aciTreeHash");aciPluginClass.defaults("aciTree",a)})(jQuery,this);
+
+// sortable (require utils extension & aciSortable plugin)
+(function(d,c,e){var a={sortable:false,sortDelay:750,sortDrag:function(h,j,i,g){if(!i){var f=this.getLabel(h);if(this._private.dragDrop&&(this._private.dragDrop.length>1)){f+=" and #"+(this._private.dragDrop.length-1)+" more"}g.html(f)}},sortValid:function(j,h,k,g,l,i){var f=this.getLabel(j);if(this._private.dragDrop.length>1){f+=" and #"+(this._private.dragDrop.length-1)+" more"}if(g){i.html("move "+f+" to "+this.getLabel(this.itemFrom(h)));l.removeClass("aciTreeAfter aciTreeBefore")}else{if(k!==null){if(k){i.html("move "+f+" before "+this.getLabel(h));l.removeClass("aciTreeAfter").addClass("aciTreeBefore")}else{i.html("move "+f+" after "+this.getLabel(h));l.removeClass("aciTreeBefore").addClass("aciTreeAfter")}}}}};var b={__extend:function(){d.extend(this._private,{openTimeout:null,dragDrop:null});this._super()},_sortableInit:function(){this._instance.jQuery.aciSortable({container:".aciTreeUl",item:".aciTreeLi",child:50,childHolder:'',childHolderSelector:".aciTreeChild",placeholder:'',placeholderSelector:".aciTreePlaceholder",helper:'',helperSelector:".aciTreeHelper",before:this.proxy(function(f){if(!this._initDrag(f)){return false}if(!this._trigger(f,"beforedrag")){this._trigger(f,"dragfail");return false}return true}),start:this.proxy(function(g,h,f){this._instance.jQuery.addClass("aciTreeDragDrop");f.css({opacity:1}).html(this.getLabel(g))}),drag:this.proxy(function(g,i,h,f){if(!h){c.clearTimeout(this._private.openTimeout)}if(this._instance.options.sortDrag){this._instance.options.sortDrag.apply(this,arguments)}}),valid:this.proxy(function(j,h,k,g,l,i){c.clearTimeout(this._private.openTimeout);if(!this._checkDrop(j,h,k,g,l,i)){return false}var f=this._options({hover:h,before:k,isContainer:g,placeholder:l,helper:i});if(!this._trigger(j,"checkdrop",f)){return false}if(this.isInode(h)&&!this.isOpen(h)){this._private.openTimeout=c.setTimeout(this.proxy(function(){this.open(h)}),this._instance.options.sortDelay)}if(this._instance.options.sortValid){this._instance.options.sortValid.apply(this,arguments)}return true}),create:this.proxy(function(g,h,f){if(this.isLeaf(f)){f.append(g._instance.options.childHolder);return true}return false},true),end:this.proxy(function(q,k,p,g){c.clearTimeout(this._private.openTimeout);var r={placeholder:p,helper:g};r=this._options(r,"sorted","dropfail",null,q);if(p.parent().length){var i=this.prev(p,true);if(i.length){p.detach();var l=d(this._private.dragDrop.get().reverse());this._private.dragDrop=null;l.each(this.proxy(function(s){this.moveAfter(d(s),this._inner(r,{success:r.success,fail:r.fail,after:i}))},true))}else{var j=this.next(p,true);if(j.length){p.detach();var l=d(this._private.dragDrop.get().reverse());this._private.dragDrop=null;l.each(this.proxy(function(s){this.moveBefore(d(s),this._inner(r,{success:r.success,fail:r.fail,before:j}))},true))}else{var o=this.parent(p);var f=p.parent();p.detach();f.remove();if(this.isLeaf(o)){var l=this._private.dragDrop;this.asChild(l.eq(0),this._inner(r,{success:function(){this._success(q,r);this.open(o);l.filter(":gt(0)").each(this.proxy(function(s){this.moveAfter(d(s),this._inner(r,{success:r.success,fail:r.fail,after:this.last(o)}))},true))},fail:r.fail,parent:o}))}else{this._fail(q,r)}}}}else{this._fail(q,r)}this._private.dragDrop=null;if(g.parent().length){var n=d(c).scrollTop();var h=d(c).scrollLeft();var m=q[0].getBoundingClientRect();g.animate({top:m.top+n,left:m.left+h,opacity:0},{complete:function(){g.detach()}})}this._instance.jQuery.removeClass("aciTreeDragDrop")})})},_initHook:function(){if(this.extSortable()){this._sortableInit()}this._super()},_parents:function(l){var h=l.length,k,g,f=[];for(var n=0;n
-
+
@@ -33,7 +33,7 @@
-
+
diff --git a/web/pgadmin/static/css/overrides.css b/web/pgadmin/static/css/bootstrap.overrides.css
similarity index 100%
rename from web/pgadmin/static/css/overrides.css
rename to web/pgadmin/static/css/bootstrap.overrides.css
diff --git a/web/pgadmin/static/css/wcDocker/Themes/pgadmin.css b/web/pgadmin/static/css/webcabin.overrides.css
similarity index 100%
rename from web/pgadmin/static/css/wcDocker/Themes/pgadmin.css
rename to web/pgadmin/static/css/webcabin.overrides.css
diff --git a/web/pgadmin/static/js/alertifyjs/pgadmin.defaults.js b/web/pgadmin/static/js/alertify.pgadmin.defaults.js
similarity index 100%
rename from web/pgadmin/static/js/alertifyjs/pgadmin.defaults.js
rename to web/pgadmin/static/js/alertify.pgadmin.defaults.js
diff --git a/web/pgadmin/static/js/backgrid/backgrid.pgadmin.js b/web/pgadmin/static/js/backgrid.pgadmin.js
similarity index 100%
rename from web/pgadmin/static/js/backgrid/backgrid.pgadmin.js
rename to web/pgadmin/static/js/backgrid.pgadmin.js
diff --git a/web/pgadmin/static/js/npm.js b/web/pgadmin/static/js/npm.js
deleted file mode 100644
index bf6aa8060..000000000
--- a/web/pgadmin/static/js/npm.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment.
-require('../../js/transition.js')
-require('../../js/alert.js')
-require('../../js/button.js')
-require('../../js/carousel.js')
-require('../../js/collapse.js')
-require('../../js/dropdown.js')
-require('../../js/modal.js')
-require('../../js/tooltip.js')
-require('../../js/popover.js')
-require('../../js/scrollspy.js')
-require('../../js/tab.js')
-require('../../js/affix.js')
\ No newline at end of file
diff --git a/web/pgadmin/static/css/alertifyjs/alertify.css b/web/pgadmin/static/vendor/alertifyjs/alertify.css
similarity index 100%
rename from web/pgadmin/static/css/alertifyjs/alertify.css
rename to web/pgadmin/static/vendor/alertifyjs/alertify.css
diff --git a/web/pgadmin/static/js/alertifyjs/alertify.js b/web/pgadmin/static/vendor/alertifyjs/alertify.js
similarity index 100%
rename from web/pgadmin/static/js/alertifyjs/alertify.js
rename to web/pgadmin/static/vendor/alertifyjs/alertify.js
diff --git a/web/pgadmin/static/css/alertifyjs/alertify.min.css b/web/pgadmin/static/vendor/alertifyjs/alertify.min.css
similarity index 100%
rename from web/pgadmin/static/css/alertifyjs/alertify.min.css
rename to web/pgadmin/static/vendor/alertifyjs/alertify.min.css
diff --git a/web/pgadmin/static/js/alertifyjs/alertify.min.js b/web/pgadmin/static/vendor/alertifyjs/alertify.min.js
similarity index 100%
rename from web/pgadmin/static/js/alertifyjs/alertify.min.js
rename to web/pgadmin/static/vendor/alertifyjs/alertify.min.js
diff --git a/web/pgadmin/static/css/alertifyjs/alertify.rtl.css b/web/pgadmin/static/vendor/alertifyjs/alertify.rtl.css
similarity index 100%
rename from web/pgadmin/static/css/alertifyjs/alertify.rtl.css
rename to web/pgadmin/static/vendor/alertifyjs/alertify.rtl.css
diff --git a/web/pgadmin/static/css/alertifyjs/alertify.rtl.min.css b/web/pgadmin/static/vendor/alertifyjs/alertify.rtl.min.css
similarity index 100%
rename from web/pgadmin/static/css/alertifyjs/alertify.rtl.min.css
rename to web/pgadmin/static/vendor/alertifyjs/alertify.rtl.min.css
diff --git a/web/pgadmin/static/css/alertifyjs/themes/bootstrap.css b/web/pgadmin/static/vendor/alertifyjs/themes/bootstrap.css
similarity index 100%
rename from web/pgadmin/static/css/alertifyjs/themes/bootstrap.css
rename to web/pgadmin/static/vendor/alertifyjs/themes/bootstrap.css
diff --git a/web/pgadmin/static/css/alertifyjs/themes/bootstrap.min.css b/web/pgadmin/static/vendor/alertifyjs/themes/bootstrap.min.css
similarity index 100%
rename from web/pgadmin/static/css/alertifyjs/themes/bootstrap.min.css
rename to web/pgadmin/static/vendor/alertifyjs/themes/bootstrap.min.css
diff --git a/web/pgadmin/static/css/alertifyjs/themes/bootstrap.rtl.css b/web/pgadmin/static/vendor/alertifyjs/themes/bootstrap.rtl.css
similarity index 100%
rename from web/pgadmin/static/css/alertifyjs/themes/bootstrap.rtl.css
rename to web/pgadmin/static/vendor/alertifyjs/themes/bootstrap.rtl.css
diff --git a/web/pgadmin/static/css/alertifyjs/themes/bootstrap.rtl.min.css b/web/pgadmin/static/vendor/alertifyjs/themes/bootstrap.rtl.min.css
similarity index 100%
rename from web/pgadmin/static/css/alertifyjs/themes/bootstrap.rtl.min.css
rename to web/pgadmin/static/vendor/alertifyjs/themes/bootstrap.rtl.min.css
diff --git a/web/pgadmin/static/css/alertifyjs/themes/default.css b/web/pgadmin/static/vendor/alertifyjs/themes/default.css
similarity index 100%
rename from web/pgadmin/static/css/alertifyjs/themes/default.css
rename to web/pgadmin/static/vendor/alertifyjs/themes/default.css
diff --git a/web/pgadmin/static/css/alertifyjs/themes/default.min.css b/web/pgadmin/static/vendor/alertifyjs/themes/default.min.css
similarity index 100%
rename from web/pgadmin/static/css/alertifyjs/themes/default.min.css
rename to web/pgadmin/static/vendor/alertifyjs/themes/default.min.css
diff --git a/web/pgadmin/static/css/alertifyjs/themes/default.rtl.css b/web/pgadmin/static/vendor/alertifyjs/themes/default.rtl.css
similarity index 100%
rename from web/pgadmin/static/css/alertifyjs/themes/default.rtl.css
rename to web/pgadmin/static/vendor/alertifyjs/themes/default.rtl.css
diff --git a/web/pgadmin/static/css/alertifyjs/themes/default.rtl.min.css b/web/pgadmin/static/vendor/alertifyjs/themes/default.rtl.min.css
similarity index 100%
rename from web/pgadmin/static/css/alertifyjs/themes/default.rtl.min.css
rename to web/pgadmin/static/vendor/alertifyjs/themes/default.rtl.min.css
diff --git a/web/pgadmin/static/css/alertifyjs/themes/semantic.css b/web/pgadmin/static/vendor/alertifyjs/themes/semantic.css
similarity index 100%
rename from web/pgadmin/static/css/alertifyjs/themes/semantic.css
rename to web/pgadmin/static/vendor/alertifyjs/themes/semantic.css
diff --git a/web/pgadmin/static/css/alertifyjs/themes/semantic.min.css b/web/pgadmin/static/vendor/alertifyjs/themes/semantic.min.css
similarity index 100%
rename from web/pgadmin/static/css/alertifyjs/themes/semantic.min.css
rename to web/pgadmin/static/vendor/alertifyjs/themes/semantic.min.css
diff --git a/web/pgadmin/static/css/alertifyjs/themes/semantic.rtl.css b/web/pgadmin/static/vendor/alertifyjs/themes/semantic.rtl.css
similarity index 100%
rename from web/pgadmin/static/css/alertifyjs/themes/semantic.rtl.css
rename to web/pgadmin/static/vendor/alertifyjs/themes/semantic.rtl.css
diff --git a/web/pgadmin/static/css/alertifyjs/themes/semantic.rtl.min.css b/web/pgadmin/static/vendor/alertifyjs/themes/semantic.rtl.min.css
similarity index 100%
rename from web/pgadmin/static/css/alertifyjs/themes/semantic.rtl.min.css
rename to web/pgadmin/static/vendor/alertifyjs/themes/semantic.rtl.min.css
diff --git a/web/pgadmin/static/js/backbone-min.js b/web/pgadmin/static/vendor/backbone/backbone-min.js
similarity index 100%
rename from web/pgadmin/static/js/backbone-min.js
rename to web/pgadmin/static/vendor/backbone/backbone-min.js
diff --git a/web/pgadmin/static/js/backbone.js b/web/pgadmin/static/vendor/backbone/backbone.js
similarity index 100%
rename from web/pgadmin/static/js/backbone.js
rename to web/pgadmin/static/vendor/backbone/backbone.js
diff --git a/web/pgadmin/static/js/backbone.paginator.js b/web/pgadmin/static/vendor/backbone/backbone.paginator.js
similarity index 100%
rename from web/pgadmin/static/js/backbone.paginator.js
rename to web/pgadmin/static/vendor/backbone/backbone.paginator.js
diff --git a/web/pgadmin/static/js/backbone.paginator.min.js b/web/pgadmin/static/vendor/backbone/backbone.paginator.min.js
similarity index 100%
rename from web/pgadmin/static/js/backbone.paginator.min.js
rename to web/pgadmin/static/vendor/backbone/backbone.paginator.min.js
diff --git a/web/pgadmin/static/js/backbone.undo.js b/web/pgadmin/static/vendor/backbone/backbone.undo.js
similarity index 100%
rename from web/pgadmin/static/js/backbone.undo.js
rename to web/pgadmin/static/vendor/backbone/backbone.undo.js
diff --git a/web/pgadmin/static/js/backbone.undo.min.js b/web/pgadmin/static/vendor/backbone/backbone.undo.min.js
similarity index 100%
rename from web/pgadmin/static/js/backbone.undo.min.js
rename to web/pgadmin/static/vendor/backbone/backbone.undo.min.js
diff --git a/web/pgadmin/static/js/backform.js b/web/pgadmin/static/vendor/backform/backform.js
similarity index 100%
rename from web/pgadmin/static/js/backform.js
rename to web/pgadmin/static/vendor/backform/backform.js
diff --git a/web/pgadmin/static/css/backgrid/backgrid-filter.css b/web/pgadmin/static/vendor/backgrid/backgrid-filter.css
similarity index 100%
rename from web/pgadmin/static/css/backgrid/backgrid-filter.css
rename to web/pgadmin/static/vendor/backgrid/backgrid-filter.css
diff --git a/web/pgadmin/static/js/backgrid/backgrid-filter.js b/web/pgadmin/static/vendor/backgrid/backgrid-filter.js
similarity index 100%
rename from web/pgadmin/static/js/backgrid/backgrid-filter.js
rename to web/pgadmin/static/vendor/backgrid/backgrid-filter.js
diff --git a/web/pgadmin/static/css/backgrid/backgrid-filter.min.css b/web/pgadmin/static/vendor/backgrid/backgrid-filter.min.css
similarity index 100%
rename from web/pgadmin/static/css/backgrid/backgrid-filter.min.css
rename to web/pgadmin/static/vendor/backgrid/backgrid-filter.min.css
diff --git a/web/pgadmin/static/js/backgrid/backgrid-filter.min.js b/web/pgadmin/static/vendor/backgrid/backgrid-filter.min.js
similarity index 100%
rename from web/pgadmin/static/js/backgrid/backgrid-filter.min.js
rename to web/pgadmin/static/vendor/backgrid/backgrid-filter.min.js
diff --git a/web/pgadmin/static/css/backgrid/backgrid-paginator.css b/web/pgadmin/static/vendor/backgrid/backgrid-paginator.css
similarity index 100%
rename from web/pgadmin/static/css/backgrid/backgrid-paginator.css
rename to web/pgadmin/static/vendor/backgrid/backgrid-paginator.css
diff --git a/web/pgadmin/static/js/backgrid/backgrid-paginator.js b/web/pgadmin/static/vendor/backgrid/backgrid-paginator.js
similarity index 100%
rename from web/pgadmin/static/js/backgrid/backgrid-paginator.js
rename to web/pgadmin/static/vendor/backgrid/backgrid-paginator.js
diff --git a/web/pgadmin/static/css/backgrid/backgrid-paginator.min.css b/web/pgadmin/static/vendor/backgrid/backgrid-paginator.min.css
similarity index 100%
rename from web/pgadmin/static/css/backgrid/backgrid-paginator.min.css
rename to web/pgadmin/static/vendor/backgrid/backgrid-paginator.min.css
diff --git a/web/pgadmin/static/js/backgrid/backgrid-paginator.min.js b/web/pgadmin/static/vendor/backgrid/backgrid-paginator.min.js
similarity index 100%
rename from web/pgadmin/static/js/backgrid/backgrid-paginator.min.js
rename to web/pgadmin/static/vendor/backgrid/backgrid-paginator.min.js
diff --git a/web/pgadmin/static/css/backgrid/backgrid-select-all.css b/web/pgadmin/static/vendor/backgrid/backgrid-select-all.css
similarity index 100%
rename from web/pgadmin/static/css/backgrid/backgrid-select-all.css
rename to web/pgadmin/static/vendor/backgrid/backgrid-select-all.css
diff --git a/web/pgadmin/static/js/backgrid/backgrid-select-all.js b/web/pgadmin/static/vendor/backgrid/backgrid-select-all.js
similarity index 100%
rename from web/pgadmin/static/js/backgrid/backgrid-select-all.js
rename to web/pgadmin/static/vendor/backgrid/backgrid-select-all.js
diff --git a/web/pgadmin/static/css/backgrid/backgrid-select-all.min.css b/web/pgadmin/static/vendor/backgrid/backgrid-select-all.min.css
similarity index 100%
rename from web/pgadmin/static/css/backgrid/backgrid-select-all.min.css
rename to web/pgadmin/static/vendor/backgrid/backgrid-select-all.min.css
diff --git a/web/pgadmin/static/js/backgrid/backgrid-select-all.min.js b/web/pgadmin/static/vendor/backgrid/backgrid-select-all.min.js
similarity index 100%
rename from web/pgadmin/static/js/backgrid/backgrid-select-all.min.js
rename to web/pgadmin/static/vendor/backgrid/backgrid-select-all.min.js
diff --git a/web/pgadmin/static/css/backgrid/backgrid-sizeable-columns.css b/web/pgadmin/static/vendor/backgrid/backgrid-sizeable-columns.css
similarity index 100%
rename from web/pgadmin/static/css/backgrid/backgrid-sizeable-columns.css
rename to web/pgadmin/static/vendor/backgrid/backgrid-sizeable-columns.css
diff --git a/web/pgadmin/static/js/backgrid/backgrid-sizeable-columns.js b/web/pgadmin/static/vendor/backgrid/backgrid-sizeable-columns.js
similarity index 100%
rename from web/pgadmin/static/js/backgrid/backgrid-sizeable-columns.js
rename to web/pgadmin/static/vendor/backgrid/backgrid-sizeable-columns.js
diff --git a/web/pgadmin/static/css/backgrid/backgrid.css b/web/pgadmin/static/vendor/backgrid/backgrid.css
similarity index 100%
rename from web/pgadmin/static/css/backgrid/backgrid.css
rename to web/pgadmin/static/vendor/backgrid/backgrid.css
diff --git a/web/pgadmin/static/js/backgrid/backgrid.js b/web/pgadmin/static/vendor/backgrid/backgrid.js
similarity index 100%
rename from web/pgadmin/static/js/backgrid/backgrid.js
rename to web/pgadmin/static/vendor/backgrid/backgrid.js
diff --git a/web/pgadmin/static/css/backgrid/backgrid.min.css b/web/pgadmin/static/vendor/backgrid/backgrid.min.css
similarity index 100%
rename from web/pgadmin/static/css/backgrid/backgrid.min.css
rename to web/pgadmin/static/vendor/backgrid/backgrid.min.css
diff --git a/web/pgadmin/static/js/backgrid/backgrid.min.js b/web/pgadmin/static/vendor/backgrid/backgrid.min.js
similarity index 100%
rename from web/pgadmin/static/js/backgrid/backgrid.min.js
rename to web/pgadmin/static/vendor/backgrid/backgrid.min.js
diff --git a/web/pgadmin/static/js/bignumber/bignumber.js b/web/pgadmin/static/vendor/bignumber/bignumber.js
similarity index 100%
rename from web/pgadmin/static/js/bignumber/bignumber.js
rename to web/pgadmin/static/vendor/bignumber/bignumber.js
diff --git a/web/pgadmin/static/js/bignumber/bignumber.min.js b/web/pgadmin/static/vendor/bignumber/bignumber.min.js
similarity index 100%
rename from web/pgadmin/static/js/bignumber/bignumber.min.js
rename to web/pgadmin/static/vendor/bignumber/bignumber.min.js
diff --git a/web/pgadmin/static/js/bootstrap-datepicker.js b/web/pgadmin/static/vendor/bootstrap/bootstrap-datepicker.js
similarity index 100%
rename from web/pgadmin/static/js/bootstrap-datepicker.js
rename to web/pgadmin/static/vendor/bootstrap/bootstrap-datepicker.js
diff --git a/web/pgadmin/static/js/bootstrap-datepicker.min.js b/web/pgadmin/static/vendor/bootstrap/bootstrap-datepicker.min.js
similarity index 100%
rename from web/pgadmin/static/js/bootstrap-datepicker.min.js
rename to web/pgadmin/static/vendor/bootstrap/bootstrap-datepicker.min.js
diff --git a/web/pgadmin/static/css/bootstrap-datepicker3.css b/web/pgadmin/static/vendor/bootstrap/bootstrap-datepicker3.css
similarity index 100%
rename from web/pgadmin/static/css/bootstrap-datepicker3.css
rename to web/pgadmin/static/vendor/bootstrap/bootstrap-datepicker3.css
diff --git a/web/pgadmin/static/css/bootstrap-datepicker3.min.css b/web/pgadmin/static/vendor/bootstrap/bootstrap-datepicker3.min.css
similarity index 100%
rename from web/pgadmin/static/css/bootstrap-datepicker3.min.css
rename to web/pgadmin/static/vendor/bootstrap/bootstrap-datepicker3.min.css
diff --git a/web/pgadmin/static/js/bootstrap-datetimepicker.js b/web/pgadmin/static/vendor/bootstrap/bootstrap-datetimepicker.js
similarity index 100%
rename from web/pgadmin/static/js/bootstrap-datetimepicker.js
rename to web/pgadmin/static/vendor/bootstrap/bootstrap-datetimepicker.js
diff --git a/web/pgadmin/static/css/bootstrap-datetimepicker.min.css b/web/pgadmin/static/vendor/bootstrap/bootstrap-datetimepicker.min.css
similarity index 100%
rename from web/pgadmin/static/css/bootstrap-datetimepicker.min.css
rename to web/pgadmin/static/vendor/bootstrap/bootstrap-datetimepicker.min.css
diff --git a/web/pgadmin/static/js/bootstrap-datetimepicker.min.js b/web/pgadmin/static/vendor/bootstrap/bootstrap-datetimepicker.min.js
similarity index 100%
rename from web/pgadmin/static/js/bootstrap-datetimepicker.min.js
rename to web/pgadmin/static/vendor/bootstrap/bootstrap-datetimepicker.min.js
diff --git a/web/pgadmin/static/css/bootstrap-switch.css b/web/pgadmin/static/vendor/bootstrap/bootstrap-switch.css
similarity index 100%
rename from web/pgadmin/static/css/bootstrap-switch.css
rename to web/pgadmin/static/vendor/bootstrap/bootstrap-switch.css
diff --git a/web/pgadmin/static/js/bootstrap-switch.js b/web/pgadmin/static/vendor/bootstrap/bootstrap-switch.js
similarity index 100%
rename from web/pgadmin/static/js/bootstrap-switch.js
rename to web/pgadmin/static/vendor/bootstrap/bootstrap-switch.js
diff --git a/web/pgadmin/static/css/bootstrap-switch.min.css b/web/pgadmin/static/vendor/bootstrap/bootstrap-switch.min.css
similarity index 100%
rename from web/pgadmin/static/css/bootstrap-switch.min.css
rename to web/pgadmin/static/vendor/bootstrap/bootstrap-switch.min.css
diff --git a/web/pgadmin/static/js/bootstrap-switch.min.js b/web/pgadmin/static/vendor/bootstrap/bootstrap-switch.min.js
similarity index 100%
rename from web/pgadmin/static/js/bootstrap-switch.min.js
rename to web/pgadmin/static/vendor/bootstrap/bootstrap-switch.min.js
diff --git a/web/pgadmin/static/css/bootstrap-theme.css b/web/pgadmin/static/vendor/bootstrap/bootstrap-theme.css
similarity index 100%
rename from web/pgadmin/static/css/bootstrap-theme.css
rename to web/pgadmin/static/vendor/bootstrap/bootstrap-theme.css
diff --git a/web/pgadmin/static/css/bootstrap-theme.css.map b/web/pgadmin/static/vendor/bootstrap/bootstrap-theme.css.map
similarity index 100%
rename from web/pgadmin/static/css/bootstrap-theme.css.map
rename to web/pgadmin/static/vendor/bootstrap/bootstrap-theme.css.map
diff --git a/web/pgadmin/static/css/bootstrap-theme.min.css b/web/pgadmin/static/vendor/bootstrap/bootstrap-theme.min.css
similarity index 100%
rename from web/pgadmin/static/css/bootstrap-theme.min.css
rename to web/pgadmin/static/vendor/bootstrap/bootstrap-theme.min.css
diff --git a/web/pgadmin/static/css/bootstrap.css b/web/pgadmin/static/vendor/bootstrap/bootstrap.css
similarity index 100%
rename from web/pgadmin/static/css/bootstrap.css
rename to web/pgadmin/static/vendor/bootstrap/bootstrap.css
diff --git a/web/pgadmin/static/css/bootstrap.css.map b/web/pgadmin/static/vendor/bootstrap/bootstrap.css.map
similarity index 100%
rename from web/pgadmin/static/css/bootstrap.css.map
rename to web/pgadmin/static/vendor/bootstrap/bootstrap.css.map
diff --git a/web/pgadmin/static/js/bootstrap.js b/web/pgadmin/static/vendor/bootstrap/bootstrap.js
similarity index 100%
rename from web/pgadmin/static/js/bootstrap.js
rename to web/pgadmin/static/vendor/bootstrap/bootstrap.js
diff --git a/web/pgadmin/static/css/bootstrap.min.css b/web/pgadmin/static/vendor/bootstrap/bootstrap.min.css
similarity index 100%
rename from web/pgadmin/static/css/bootstrap.min.css
rename to web/pgadmin/static/vendor/bootstrap/bootstrap.min.css
diff --git a/web/pgadmin/static/js/bootstrap.min.js b/web/pgadmin/static/vendor/bootstrap/bootstrap.min.js
similarity index 100%
rename from web/pgadmin/static/js/bootstrap.min.js
rename to web/pgadmin/static/vendor/bootstrap/bootstrap.min.js
diff --git a/web/pgadmin/static/fonts/glyphicons-halflings-regular.eot b/web/pgadmin/static/vendor/bootstrap/glyphicons-halflings-regular.eot
similarity index 100%
rename from web/pgadmin/static/fonts/glyphicons-halflings-regular.eot
rename to web/pgadmin/static/vendor/bootstrap/glyphicons-halflings-regular.eot
diff --git a/web/pgadmin/static/fonts/glyphicons-halflings-regular.svg b/web/pgadmin/static/vendor/bootstrap/glyphicons-halflings-regular.svg
similarity index 100%
rename from web/pgadmin/static/fonts/glyphicons-halflings-regular.svg
rename to web/pgadmin/static/vendor/bootstrap/glyphicons-halflings-regular.svg
diff --git a/web/pgadmin/static/fonts/glyphicons-halflings-regular.ttf b/web/pgadmin/static/vendor/bootstrap/glyphicons-halflings-regular.ttf
similarity index 100%
rename from web/pgadmin/static/fonts/glyphicons-halflings-regular.ttf
rename to web/pgadmin/static/vendor/bootstrap/glyphicons-halflings-regular.ttf
diff --git a/web/pgadmin/static/fonts/glyphicons-halflings-regular.woff b/web/pgadmin/static/vendor/bootstrap/glyphicons-halflings-regular.woff
similarity index 100%
rename from web/pgadmin/static/fonts/glyphicons-halflings-regular.woff
rename to web/pgadmin/static/vendor/bootstrap/glyphicons-halflings-regular.woff
diff --git a/web/pgadmin/static/fonts/glyphicons-halflings-regular.woff2 b/web/pgadmin/static/vendor/bootstrap/glyphicons-halflings-regular.woff2
similarity index 100%
rename from web/pgadmin/static/fonts/glyphicons-halflings-regular.woff2
rename to web/pgadmin/static/vendor/bootstrap/glyphicons-halflings-regular.woff2
diff --git a/web/pgadmin/static/js/codemirror/addon/comment/comment.js b/web/pgadmin/static/vendor/codemirror/addon/comment/comment.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/comment/comment.js
rename to web/pgadmin/static/vendor/codemirror/addon/comment/comment.js
diff --git a/web/pgadmin/static/js/codemirror/addon/comment/continuecomment.js b/web/pgadmin/static/vendor/codemirror/addon/comment/continuecomment.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/comment/continuecomment.js
rename to web/pgadmin/static/vendor/codemirror/addon/comment/continuecomment.js
diff --git a/web/pgadmin/static/js/codemirror/addon/dialog/dialog.css b/web/pgadmin/static/vendor/codemirror/addon/dialog/dialog.css
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/dialog/dialog.css
rename to web/pgadmin/static/vendor/codemirror/addon/dialog/dialog.css
diff --git a/web/pgadmin/static/js/codemirror/addon/dialog/dialog.js b/web/pgadmin/static/vendor/codemirror/addon/dialog/dialog.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/dialog/dialog.js
rename to web/pgadmin/static/vendor/codemirror/addon/dialog/dialog.js
diff --git a/web/pgadmin/static/js/codemirror/addon/display/autorefresh.js b/web/pgadmin/static/vendor/codemirror/addon/display/autorefresh.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/display/autorefresh.js
rename to web/pgadmin/static/vendor/codemirror/addon/display/autorefresh.js
diff --git a/web/pgadmin/static/js/codemirror/addon/display/fullscreen.css b/web/pgadmin/static/vendor/codemirror/addon/display/fullscreen.css
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/display/fullscreen.css
rename to web/pgadmin/static/vendor/codemirror/addon/display/fullscreen.css
diff --git a/web/pgadmin/static/js/codemirror/addon/display/fullscreen.js b/web/pgadmin/static/vendor/codemirror/addon/display/fullscreen.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/display/fullscreen.js
rename to web/pgadmin/static/vendor/codemirror/addon/display/fullscreen.js
diff --git a/web/pgadmin/static/js/codemirror/addon/display/panel.js b/web/pgadmin/static/vendor/codemirror/addon/display/panel.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/display/panel.js
rename to web/pgadmin/static/vendor/codemirror/addon/display/panel.js
diff --git a/web/pgadmin/static/js/codemirror/addon/display/placeholder.js b/web/pgadmin/static/vendor/codemirror/addon/display/placeholder.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/display/placeholder.js
rename to web/pgadmin/static/vendor/codemirror/addon/display/placeholder.js
diff --git a/web/pgadmin/static/js/codemirror/addon/display/rulers.js b/web/pgadmin/static/vendor/codemirror/addon/display/rulers.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/display/rulers.js
rename to web/pgadmin/static/vendor/codemirror/addon/display/rulers.js
diff --git a/web/pgadmin/static/js/codemirror/addon/edit/closebrackets.js b/web/pgadmin/static/vendor/codemirror/addon/edit/closebrackets.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/edit/closebrackets.js
rename to web/pgadmin/static/vendor/codemirror/addon/edit/closebrackets.js
diff --git a/web/pgadmin/static/js/codemirror/addon/edit/closetag.js b/web/pgadmin/static/vendor/codemirror/addon/edit/closetag.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/edit/closetag.js
rename to web/pgadmin/static/vendor/codemirror/addon/edit/closetag.js
diff --git a/web/pgadmin/static/js/codemirror/addon/edit/continuelist.js b/web/pgadmin/static/vendor/codemirror/addon/edit/continuelist.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/edit/continuelist.js
rename to web/pgadmin/static/vendor/codemirror/addon/edit/continuelist.js
diff --git a/web/pgadmin/static/js/codemirror/addon/edit/matchbrackets.js b/web/pgadmin/static/vendor/codemirror/addon/edit/matchbrackets.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/edit/matchbrackets.js
rename to web/pgadmin/static/vendor/codemirror/addon/edit/matchbrackets.js
diff --git a/web/pgadmin/static/js/codemirror/addon/edit/matchtags.js b/web/pgadmin/static/vendor/codemirror/addon/edit/matchtags.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/edit/matchtags.js
rename to web/pgadmin/static/vendor/codemirror/addon/edit/matchtags.js
diff --git a/web/pgadmin/static/js/codemirror/addon/edit/trailingspace.js b/web/pgadmin/static/vendor/codemirror/addon/edit/trailingspace.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/edit/trailingspace.js
rename to web/pgadmin/static/vendor/codemirror/addon/edit/trailingspace.js
diff --git a/web/pgadmin/static/js/codemirror/addon/fold/brace-fold.js b/web/pgadmin/static/vendor/codemirror/addon/fold/brace-fold.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/fold/brace-fold.js
rename to web/pgadmin/static/vendor/codemirror/addon/fold/brace-fold.js
diff --git a/web/pgadmin/static/js/codemirror/addon/fold/comment-fold.js b/web/pgadmin/static/vendor/codemirror/addon/fold/comment-fold.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/fold/comment-fold.js
rename to web/pgadmin/static/vendor/codemirror/addon/fold/comment-fold.js
diff --git a/web/pgadmin/static/js/codemirror/addon/fold/foldcode.js b/web/pgadmin/static/vendor/codemirror/addon/fold/foldcode.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/fold/foldcode.js
rename to web/pgadmin/static/vendor/codemirror/addon/fold/foldcode.js
diff --git a/web/pgadmin/static/js/codemirror/addon/fold/foldgutter.css b/web/pgadmin/static/vendor/codemirror/addon/fold/foldgutter.css
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/fold/foldgutter.css
rename to web/pgadmin/static/vendor/codemirror/addon/fold/foldgutter.css
diff --git a/web/pgadmin/static/js/codemirror/addon/fold/foldgutter.js b/web/pgadmin/static/vendor/codemirror/addon/fold/foldgutter.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/fold/foldgutter.js
rename to web/pgadmin/static/vendor/codemirror/addon/fold/foldgutter.js
diff --git a/web/pgadmin/static/js/codemirror/addon/fold/indent-fold.js b/web/pgadmin/static/vendor/codemirror/addon/fold/indent-fold.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/fold/indent-fold.js
rename to web/pgadmin/static/vendor/codemirror/addon/fold/indent-fold.js
diff --git a/web/pgadmin/static/js/codemirror/addon/fold/markdown-fold.js b/web/pgadmin/static/vendor/codemirror/addon/fold/markdown-fold.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/fold/markdown-fold.js
rename to web/pgadmin/static/vendor/codemirror/addon/fold/markdown-fold.js
diff --git a/web/pgadmin/static/js/codemirror/addon/fold/pgadmin-sqlfoldcode.js b/web/pgadmin/static/vendor/codemirror/addon/fold/pgadmin-sqlfoldcode.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/fold/pgadmin-sqlfoldcode.js
rename to web/pgadmin/static/vendor/codemirror/addon/fold/pgadmin-sqlfoldcode.js
diff --git a/web/pgadmin/static/js/codemirror/addon/fold/xml-fold.js b/web/pgadmin/static/vendor/codemirror/addon/fold/xml-fold.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/fold/xml-fold.js
rename to web/pgadmin/static/vendor/codemirror/addon/fold/xml-fold.js
diff --git a/web/pgadmin/static/js/codemirror/addon/hint/anyword-hint.js b/web/pgadmin/static/vendor/codemirror/addon/hint/anyword-hint.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/hint/anyword-hint.js
rename to web/pgadmin/static/vendor/codemirror/addon/hint/anyword-hint.js
diff --git a/web/pgadmin/static/js/codemirror/addon/hint/css-hint.js b/web/pgadmin/static/vendor/codemirror/addon/hint/css-hint.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/hint/css-hint.js
rename to web/pgadmin/static/vendor/codemirror/addon/hint/css-hint.js
diff --git a/web/pgadmin/static/js/codemirror/addon/hint/html-hint.js b/web/pgadmin/static/vendor/codemirror/addon/hint/html-hint.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/hint/html-hint.js
rename to web/pgadmin/static/vendor/codemirror/addon/hint/html-hint.js
diff --git a/web/pgadmin/static/js/codemirror/addon/hint/javascript-hint.js b/web/pgadmin/static/vendor/codemirror/addon/hint/javascript-hint.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/hint/javascript-hint.js
rename to web/pgadmin/static/vendor/codemirror/addon/hint/javascript-hint.js
diff --git a/web/pgadmin/static/js/codemirror/addon/hint/show-hint.css b/web/pgadmin/static/vendor/codemirror/addon/hint/show-hint.css
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/hint/show-hint.css
rename to web/pgadmin/static/vendor/codemirror/addon/hint/show-hint.css
diff --git a/web/pgadmin/static/js/codemirror/addon/hint/show-hint.js b/web/pgadmin/static/vendor/codemirror/addon/hint/show-hint.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/hint/show-hint.js
rename to web/pgadmin/static/vendor/codemirror/addon/hint/show-hint.js
diff --git a/web/pgadmin/static/js/codemirror/addon/hint/sql-hint.js b/web/pgadmin/static/vendor/codemirror/addon/hint/sql-hint.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/hint/sql-hint.js
rename to web/pgadmin/static/vendor/codemirror/addon/hint/sql-hint.js
diff --git a/web/pgadmin/static/js/codemirror/addon/hint/xml-hint.js b/web/pgadmin/static/vendor/codemirror/addon/hint/xml-hint.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/hint/xml-hint.js
rename to web/pgadmin/static/vendor/codemirror/addon/hint/xml-hint.js
diff --git a/web/pgadmin/static/js/codemirror/addon/lint/coffeescript-lint.js b/web/pgadmin/static/vendor/codemirror/addon/lint/coffeescript-lint.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/lint/coffeescript-lint.js
rename to web/pgadmin/static/vendor/codemirror/addon/lint/coffeescript-lint.js
diff --git a/web/pgadmin/static/js/codemirror/addon/lint/css-lint.js b/web/pgadmin/static/vendor/codemirror/addon/lint/css-lint.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/lint/css-lint.js
rename to web/pgadmin/static/vendor/codemirror/addon/lint/css-lint.js
diff --git a/web/pgadmin/static/js/codemirror/addon/lint/html-lint.js b/web/pgadmin/static/vendor/codemirror/addon/lint/html-lint.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/lint/html-lint.js
rename to web/pgadmin/static/vendor/codemirror/addon/lint/html-lint.js
diff --git a/web/pgadmin/static/js/codemirror/addon/lint/javascript-lint.js b/web/pgadmin/static/vendor/codemirror/addon/lint/javascript-lint.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/lint/javascript-lint.js
rename to web/pgadmin/static/vendor/codemirror/addon/lint/javascript-lint.js
diff --git a/web/pgadmin/static/js/codemirror/addon/lint/json-lint.js b/web/pgadmin/static/vendor/codemirror/addon/lint/json-lint.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/lint/json-lint.js
rename to web/pgadmin/static/vendor/codemirror/addon/lint/json-lint.js
diff --git a/web/pgadmin/static/js/codemirror/addon/lint/lint.css b/web/pgadmin/static/vendor/codemirror/addon/lint/lint.css
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/lint/lint.css
rename to web/pgadmin/static/vendor/codemirror/addon/lint/lint.css
diff --git a/web/pgadmin/static/js/codemirror/addon/lint/lint.js b/web/pgadmin/static/vendor/codemirror/addon/lint/lint.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/lint/lint.js
rename to web/pgadmin/static/vendor/codemirror/addon/lint/lint.js
diff --git a/web/pgadmin/static/js/codemirror/addon/lint/yaml-lint.js b/web/pgadmin/static/vendor/codemirror/addon/lint/yaml-lint.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/lint/yaml-lint.js
rename to web/pgadmin/static/vendor/codemirror/addon/lint/yaml-lint.js
diff --git a/web/pgadmin/static/js/codemirror/addon/merge/merge.css b/web/pgadmin/static/vendor/codemirror/addon/merge/merge.css
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/merge/merge.css
rename to web/pgadmin/static/vendor/codemirror/addon/merge/merge.css
diff --git a/web/pgadmin/static/js/codemirror/addon/merge/merge.js b/web/pgadmin/static/vendor/codemirror/addon/merge/merge.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/merge/merge.js
rename to web/pgadmin/static/vendor/codemirror/addon/merge/merge.js
diff --git a/web/pgadmin/static/js/codemirror/addon/mode/loadmode.js b/web/pgadmin/static/vendor/codemirror/addon/mode/loadmode.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/mode/loadmode.js
rename to web/pgadmin/static/vendor/codemirror/addon/mode/loadmode.js
diff --git a/web/pgadmin/static/js/codemirror/addon/mode/multiplex.js b/web/pgadmin/static/vendor/codemirror/addon/mode/multiplex.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/mode/multiplex.js
rename to web/pgadmin/static/vendor/codemirror/addon/mode/multiplex.js
diff --git a/web/pgadmin/static/js/codemirror/addon/mode/multiplex_test.js b/web/pgadmin/static/vendor/codemirror/addon/mode/multiplex_test.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/mode/multiplex_test.js
rename to web/pgadmin/static/vendor/codemirror/addon/mode/multiplex_test.js
diff --git a/web/pgadmin/static/js/codemirror/addon/mode/overlay.js b/web/pgadmin/static/vendor/codemirror/addon/mode/overlay.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/mode/overlay.js
rename to web/pgadmin/static/vendor/codemirror/addon/mode/overlay.js
diff --git a/web/pgadmin/static/js/codemirror/addon/mode/simple.js b/web/pgadmin/static/vendor/codemirror/addon/mode/simple.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/mode/simple.js
rename to web/pgadmin/static/vendor/codemirror/addon/mode/simple.js
diff --git a/web/pgadmin/static/js/codemirror/addon/runmode/colorize.js b/web/pgadmin/static/vendor/codemirror/addon/runmode/colorize.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/runmode/colorize.js
rename to web/pgadmin/static/vendor/codemirror/addon/runmode/colorize.js
diff --git a/web/pgadmin/static/js/codemirror/addon/runmode/runmode-standalone.js b/web/pgadmin/static/vendor/codemirror/addon/runmode/runmode-standalone.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/runmode/runmode-standalone.js
rename to web/pgadmin/static/vendor/codemirror/addon/runmode/runmode-standalone.js
diff --git a/web/pgadmin/static/js/codemirror/addon/runmode/runmode.js b/web/pgadmin/static/vendor/codemirror/addon/runmode/runmode.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/runmode/runmode.js
rename to web/pgadmin/static/vendor/codemirror/addon/runmode/runmode.js
diff --git a/web/pgadmin/static/js/codemirror/addon/runmode/runmode.node.js b/web/pgadmin/static/vendor/codemirror/addon/runmode/runmode.node.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/runmode/runmode.node.js
rename to web/pgadmin/static/vendor/codemirror/addon/runmode/runmode.node.js
diff --git a/web/pgadmin/static/js/codemirror/addon/scroll/annotatescrollbar.js b/web/pgadmin/static/vendor/codemirror/addon/scroll/annotatescrollbar.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/scroll/annotatescrollbar.js
rename to web/pgadmin/static/vendor/codemirror/addon/scroll/annotatescrollbar.js
diff --git a/web/pgadmin/static/js/codemirror/addon/scroll/scrollpastend.js b/web/pgadmin/static/vendor/codemirror/addon/scroll/scrollpastend.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/scroll/scrollpastend.js
rename to web/pgadmin/static/vendor/codemirror/addon/scroll/scrollpastend.js
diff --git a/web/pgadmin/static/js/codemirror/addon/scroll/simplescrollbars.css b/web/pgadmin/static/vendor/codemirror/addon/scroll/simplescrollbars.css
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/scroll/simplescrollbars.css
rename to web/pgadmin/static/vendor/codemirror/addon/scroll/simplescrollbars.css
diff --git a/web/pgadmin/static/js/codemirror/addon/scroll/simplescrollbars.js b/web/pgadmin/static/vendor/codemirror/addon/scroll/simplescrollbars.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/scroll/simplescrollbars.js
rename to web/pgadmin/static/vendor/codemirror/addon/scroll/simplescrollbars.js
diff --git a/web/pgadmin/static/js/codemirror/addon/search/jump-to-line.js b/web/pgadmin/static/vendor/codemirror/addon/search/jump-to-line.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/search/jump-to-line.js
rename to web/pgadmin/static/vendor/codemirror/addon/search/jump-to-line.js
diff --git a/web/pgadmin/static/js/codemirror/addon/search/match-highlighter.js b/web/pgadmin/static/vendor/codemirror/addon/search/match-highlighter.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/search/match-highlighter.js
rename to web/pgadmin/static/vendor/codemirror/addon/search/match-highlighter.js
diff --git a/web/pgadmin/static/js/codemirror/addon/search/matchesonscrollbar.css b/web/pgadmin/static/vendor/codemirror/addon/search/matchesonscrollbar.css
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/search/matchesonscrollbar.css
rename to web/pgadmin/static/vendor/codemirror/addon/search/matchesonscrollbar.css
diff --git a/web/pgadmin/static/js/codemirror/addon/search/matchesonscrollbar.js b/web/pgadmin/static/vendor/codemirror/addon/search/matchesonscrollbar.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/search/matchesonscrollbar.js
rename to web/pgadmin/static/vendor/codemirror/addon/search/matchesonscrollbar.js
diff --git a/web/pgadmin/static/js/codemirror/addon/search/search.js b/web/pgadmin/static/vendor/codemirror/addon/search/search.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/search/search.js
rename to web/pgadmin/static/vendor/codemirror/addon/search/search.js
diff --git a/web/pgadmin/static/js/codemirror/addon/search/searchcursor.js b/web/pgadmin/static/vendor/codemirror/addon/search/searchcursor.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/search/searchcursor.js
rename to web/pgadmin/static/vendor/codemirror/addon/search/searchcursor.js
diff --git a/web/pgadmin/static/js/codemirror/addon/selection/active-line.js b/web/pgadmin/static/vendor/codemirror/addon/selection/active-line.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/selection/active-line.js
rename to web/pgadmin/static/vendor/codemirror/addon/selection/active-line.js
diff --git a/web/pgadmin/static/js/codemirror/addon/selection/mark-selection.js b/web/pgadmin/static/vendor/codemirror/addon/selection/mark-selection.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/selection/mark-selection.js
rename to web/pgadmin/static/vendor/codemirror/addon/selection/mark-selection.js
diff --git a/web/pgadmin/static/js/codemirror/addon/selection/selection-pointer.js b/web/pgadmin/static/vendor/codemirror/addon/selection/selection-pointer.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/selection/selection-pointer.js
rename to web/pgadmin/static/vendor/codemirror/addon/selection/selection-pointer.js
diff --git a/web/pgadmin/static/js/codemirror/addon/tern/tern.css b/web/pgadmin/static/vendor/codemirror/addon/tern/tern.css
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/tern/tern.css
rename to web/pgadmin/static/vendor/codemirror/addon/tern/tern.css
diff --git a/web/pgadmin/static/js/codemirror/addon/tern/tern.js b/web/pgadmin/static/vendor/codemirror/addon/tern/tern.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/tern/tern.js
rename to web/pgadmin/static/vendor/codemirror/addon/tern/tern.js
diff --git a/web/pgadmin/static/js/codemirror/addon/tern/worker.js b/web/pgadmin/static/vendor/codemirror/addon/tern/worker.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/tern/worker.js
rename to web/pgadmin/static/vendor/codemirror/addon/tern/worker.js
diff --git a/web/pgadmin/static/js/codemirror/addon/wrap/hardwrap.js b/web/pgadmin/static/vendor/codemirror/addon/wrap/hardwrap.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/addon/wrap/hardwrap.js
rename to web/pgadmin/static/vendor/codemirror/addon/wrap/hardwrap.js
diff --git a/web/pgadmin/static/css/codemirror/codemirror.css b/web/pgadmin/static/vendor/codemirror/codemirror.css
similarity index 100%
rename from web/pgadmin/static/css/codemirror/codemirror.css
rename to web/pgadmin/static/vendor/codemirror/codemirror.css
diff --git a/web/pgadmin/static/js/codemirror/lib/codemirror.js b/web/pgadmin/static/vendor/codemirror/lib/codemirror.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/lib/codemirror.js
rename to web/pgadmin/static/vendor/codemirror/lib/codemirror.js
diff --git a/web/pgadmin/static/js/codemirror/mode/sql/sql.js b/web/pgadmin/static/vendor/codemirror/mode/sql/sql.js
similarity index 100%
rename from web/pgadmin/static/js/codemirror/mode/sql/sql.js
rename to web/pgadmin/static/vendor/codemirror/mode/sql/sql.js
diff --git a/web/pgadmin/static/js/flotr2/bean-min.js b/web/pgadmin/static/vendor/flotr2/bean-min.js
similarity index 100%
rename from web/pgadmin/static/js/flotr2/bean-min.js
rename to web/pgadmin/static/vendor/flotr2/bean-min.js
diff --git a/web/pgadmin/static/js/flotr2/bean.js b/web/pgadmin/static/vendor/flotr2/bean.js
similarity index 100%
rename from web/pgadmin/static/js/flotr2/bean.js
rename to web/pgadmin/static/vendor/flotr2/bean.js
diff --git a/web/pgadmin/static/js/flotr2/flotr2.amd.js b/web/pgadmin/static/vendor/flotr2/flotr2.amd.js
similarity index 100%
rename from web/pgadmin/static/js/flotr2/flotr2.amd.js
rename to web/pgadmin/static/vendor/flotr2/flotr2.amd.js
diff --git a/web/pgadmin/static/vendor/font-awesome/.npmignore b/web/pgadmin/static/vendor/font-awesome/.npmignore
new file mode 100644
index 000000000..54a691f81
--- /dev/null
+++ b/web/pgadmin/static/vendor/font-awesome/.npmignore
@@ -0,0 +1,42 @@
+*.pyc
+*.egg-info
+*.db
+*.db.old
+*.swp
+*.db-journal
+
+.coverage
+.DS_Store
+.installed.cfg
+_gh_pages/*
+
+.idea/*
+.svn/*
+src/website/static/*
+src/website/media/*
+
+bin
+cfcache
+develop-eggs
+dist
+downloads
+eggs
+parts
+tmp
+.sass-cache
+node_modules
+
+src/website/settingslocal.py
+stunnel.log
+
+.ruby-version
+
+# don't need these in the npm package.
+src/
+_config.yml
+bower.json
+component.json
+composer.json
+CONTRIBUTING.md
+Gemfile
+Gemfile.lock
diff --git a/web/pgadmin/static/vendor/font-awesome/HELP-US-OUT.txt b/web/pgadmin/static/vendor/font-awesome/HELP-US-OUT.txt
new file mode 100644
index 000000000..cfd9d9f3c
--- /dev/null
+++ b/web/pgadmin/static/vendor/font-awesome/HELP-US-OUT.txt
@@ -0,0 +1,7 @@
+I hope you love Font Awesome. If you've found it useful, please do me a favor and check out my latest project,
+Fonticons (https://fonticons.com). It makes it easy to put the perfect icons on your website. Choose from our awesome,
+comprehensive icon sets or copy and paste your own.
+
+Please. Check it out.
+
+-Dave Gandy
diff --git a/web/pgadmin/static/vendor/font-awesome/README.md b/web/pgadmin/static/vendor/font-awesome/README.md
new file mode 100644
index 000000000..abe2489f3
--- /dev/null
+++ b/web/pgadmin/static/vendor/font-awesome/README.md
@@ -0,0 +1,100 @@
+#[Font Awesome v4.5.0](http://fontawesome.io)
+###The iconic font and CSS framework
+
+Font Awesome is a full suite of 605 pictographic icons for easy scalable vector graphics on websites,
+created and maintained by [Dave Gandy](http://twitter.com/davegandy).
+Stay up to date with the latest release and announcements on Twitter:
+[@fontawesome](http://twitter.com/fontawesome).
+
+Get started at http://fontawesome.io!
+
+##License
+- The Font Awesome font is licensed under the SIL OFL 1.1:
+ - http://scripts.sil.org/OFL
+- Font Awesome CSS, LESS, and Sass files are licensed under the MIT License:
+ - http://opensource.org/licenses/mit-license.html
+- The Font Awesome documentation is licensed under the CC BY 3.0 License:
+ - http://creativecommons.org/licenses/by/3.0/
+- Attribution is no longer required as of Font Awesome 3.0, but much appreciated:
+ - `Font Awesome by Dave Gandy - http://fontawesome.io`
+- Full details: http://fontawesome.io/license
+
+##Changelog
+- [v4.5.0 GitHub milestones](https://github.com/FortAwesome/Font-Awesome/issues?q=milestone%3A4.5.0+is%3Aclosed)
+- [v4.4.0 GitHub milestones](https://github.com/FortAwesome/Font-Awesome/issues?q=milestone%3A4.4.0+is%3Aclosed)
+- [v4.3.0 GitHub milestones](https://github.com/FortAwesome/Font-Awesome/issues?q=milestone%3A4.3.0+is%3Aclosed)
+- [v4.2.0 GitHub milestones](https://github.com/FortAwesome/Font-Awesome/issues?milestone=12&page=1&state=closed)
+- [v4.1.0 GitHub milestones](https://github.com/FortAwesome/Font-Awesome/issues?milestone=6&page=1&state=closed)
+- [v4.0.3 GitHub milestones](https://github.com/FortAwesome/Font-Awesome/issues?milestone=9&page=1&state=closed)
+- [v4.0.2 GitHub milestones](https://github.com/FortAwesome/Font-Awesome/issues?milestone=8&page=1&state=closed)
+- [v4.0.1 GitHub milestones](https://github.com/FortAwesome/Font-Awesome/issues?milestone=7&page=1&state=closed)
+- [v4.0.0 GitHub milestones](https://github.com/FortAwesome/Font-Awesome/issues?milestone=2&page=1&state=closed)
+- [v3.2.1 GitHub milestones](https://github.com/FortAwesome/Font-Awesome/issues?milestone=5&page=1&state=closed)
+- [v3.2.0 GitHub milestones](https://github.com/FortAwesome/Font-Awesome/issues?milestone=3&page=1&state=closed)
+- [v3.1.1 GitHub milestones](https://github.com/FortAwesome/Font-Awesome/issues?milestone=4&page=1&state=closed)
+- v3.1.0 - Added 54 icons, icon stacking styles, flipping and rotating icons, removed Sass support
+- v3.0.2 - much improved rendering and alignment in IE7
+- v3.0.1 - much improved rendering in webkit, various bug fixes
+- v3.0.0 - all icons redesigned from scratch, optimized for Bootstrap's 14px default
+
+## Contributing
+
+Please read through our [contributing guidelines](https://github.com/FortAwesome/Font-Awesome/blob/master/CONTRIBUTING.md).
+Included are directions for opening issues, coding standards, and notes on development.
+
+##Versioning
+
+Font Awesome will be maintained under the Semantic Versioning guidelines as much as possible. Releases will be numbered
+with the following format:
+
+`
..`
+
+And constructed with the following guidelines:
+
+* Breaking backward compatibility bumps the major (and resets the minor and patch)
+* New additions, including new icons, without breaking backward compatibility bumps the minor (and resets the patch)
+* Bug fixes and misc changes bumps the patch
+
+For more information on SemVer, please visit http://semver.org.
+
+##Author
+- Email: dave@fontawesome.io
+- Twitter: http://twitter.com/davegandy
+- GitHub: https://github.com/davegandy
+
+##Component
+To include as a [component](http://github.com/component/component), just run
+
+ $ component install FortAwesome/Font-Awesome
+
+Or add
+
+ "FortAwesome/Font-Awesome": "*"
+
+to the `dependencies` in your `component.json`.
+
+## Hacking on Font Awesome
+
+**Before you can build the project**, you must first have the following installed:
+
+- [Ruby](https://www.ruby-lang.org/en/)
+- Ruby Development Headers
+ - **Ubuntu:** `sudo apt-get install ruby-dev` *(Only if you're __NOT__ using `rbenv` or `rvm`)*
+ - **Windows:** [DevKit](http://rubyinstaller.org/)
+- [Bundler](http://bundler.io/) (Run `gem install bundler` to install).
+- [Node Package Manager (AKA NPM)](https://docs.npmjs.com/getting-started/installing-node)
+- [Less](http://lesscss.org/) (Run `npm install -g less` to install).
+- [Less Plugin: Clean CSS](https://github.com/less/less-plugin-clean-css) (Run `npm install -g less-plugin-clean-css` to install).
+
+From the root of the repository, install the tools used to develop.
+
+ $ bundle install
+ $ npm install
+
+Build the project and documentation:
+
+ $ bundle exec jekyll build
+
+Or serve it on a local server on http://localhost:7998/Font-Awesome/:
+
+ $ bundle exec jekyll -w serve
diff --git a/web/pgadmin/static/css/font-awesome.css b/web/pgadmin/static/vendor/font-awesome/css/font-awesome.css
similarity index 100%
rename from web/pgadmin/static/css/font-awesome.css
rename to web/pgadmin/static/vendor/font-awesome/css/font-awesome.css
diff --git a/web/pgadmin/static/vendor/font-awesome/css/font-awesome.css.map b/web/pgadmin/static/vendor/font-awesome/css/font-awesome.css.map
new file mode 100644
index 000000000..60763a864
--- /dev/null
+++ b/web/pgadmin/static/vendor/font-awesome/css/font-awesome.css.map
@@ -0,0 +1,7 @@
+{
+"version": 3,
+"mappings": ";;;;;;;AAGA,UAUC;EATC,WAAW,EAAE,aAAa;EAC1B,GAAG,EAAE,+CAAgE;EACrE,GAAG,EAAE,ySAAmG;EAKxG,WAAW,EAAE,MAAM;EACnB,UAAU,EAAE,MAAM;ACTpB,GAAmB;EACjB,OAAO,EAAE,YAAY;EACrB,IAAI,EAAE,uCAAwD;EAC9D,SAAS,EAAE,OAAO;EAClB,cAAc,EAAE,IAAI;EACpB,sBAAsB,EAAE,WAAW;EACnC,uBAAuB,EAAE,SAAS;EAClC,SAAS,EAAE,eAAe;;;ACN5B,MAAsB;EACpB,SAAS,EAAE,SAAS;EACpB,WAAW,EAAE,MAAS;EACtB,cAAc,EAAE,IAAI;;AAEtB,MAAsB;EAAE,SAAS,EAAE,GAAG;;AACtC,MAAsB;EAAE,SAAS,EAAE,GAAG;;AACtC,MAAsB;EAAE,SAAS,EAAE,GAAG;;AACtC,MAAsB;EAAE,SAAS,EAAE,GAAG;;ACVtC,MAAsB;EACpB,KAAK,EAAE,SAAW;EAClB,UAAU,EAAE,MAAM;;ACDpB,MAAsB;EACpB,YAAY,EAAE,CAAC;EACf,WAAW,ECKU,SAAS;EDJ9B,eAAe,EAAE,IAAI;EACrB,WAAK;IAAE,QAAQ,EAAE,QAAQ;;AAE3B,MAAsB;EACpB,QAAQ,EAAE,QAAQ;EAClB,IAAI,EAAE,UAAa;EACnB,KAAK,ECFgB,SAAS;EDG9B,GAAG,EAAE,SAAU;EACf,UAAU,EAAE,MAAM;EAClB,YAAuB;IACrB,IAAI,EAAE,UAA0B;;AEbpC,UAA0B;EACxB,OAAO,EAAE,gBAAgB;EACzB,MAAM,EAAE,iBAA4B;EACpC,aAAa,EAAE,IAAI;;AAGrB,WAAY;EAAE,KAAK,EAAE,KAAK;;AAC1B,UAAW;EAAE,KAAK,EAAE,IAAI;;AAGtB,aAAY;EAAE,YAAY,EAAE,IAAI;AAChC,cAAa;EAAE,WAAW,EAAE,IAAI;;ACXlC,QAAwB;EACtB,iBAAiB,EAAE,0BAA0B;EACrC,SAAS,EAAE,0BAA0B;;AAG/C,SAAyB;EACvB,iBAAiB,EAAE,4BAA4B;EACvC,SAAS,EAAE,4BAA4B;;AAGjD,0BASC;EARC,EAAG;IACD,iBAAiB,EAAE,YAAY;IACvB,SAAS,EAAE,YAAY;EAEjC,IAAK;IACH,iBAAiB,EAAE,cAAc;IACzB,SAAS,EAAE,cAAc;AAIrC,kBASC;EARC,EAAG;IACD,iBAAiB,EAAE,YAAY;IACvB,SAAS,EAAE,YAAY;EAEjC,IAAK;IACH,iBAAiB,EAAE,cAAc;IACzB,SAAS,EAAE,cAAc;AC5BrC,aAA8B;ECY5B,MAAM,EAAE,wDAAmE;EAC3E,iBAAiB,EAAE,aAAgB;EAC/B,aAAa,EAAE,aAAgB;EAC3B,SAAS,EAAE,aAAgB;;ADdrC,cAA8B;ECW5B,MAAM,EAAE,wDAAmE;EAC3E,iBAAiB,EAAE,cAAgB;EAC/B,aAAa,EAAE,cAAgB;EAC3B,SAAS,EAAE,cAAgB;;ADbrC,cAA8B;ECU5B,MAAM,EAAE,wDAAmE;EAC3E,iBAAiB,EAAE,cAAgB;EAC/B,aAAa,EAAE,cAAgB;EAC3B,SAAS,EAAE,cAAgB;;ADXrC,mBAAmC;ECejC,MAAM,EAAE,wDAAmE;EAC3E,iBAAiB,EAAE,YAAoB;EACnC,aAAa,EAAE,YAAoB;EAC/B,SAAS,EAAE,YAAoB;;ADjBzC,iBAAmC;ECcjC,MAAM,EAAE,wDAAmE;EAC3E,iBAAiB,EAAE,YAAoB;EACnC,aAAa,EAAE,YAAoB;EAC/B,SAAS,EAAE,YAAoB;;ADZzC;;;;uBAIuC;EACrC,MAAM,EAAE,IAAI;;AEfd,SAAyB;EACvB,QAAQ,EAAE,QAAQ;EAClB,OAAO,EAAE,YAAY;EACrB,KAAK,EAAE,GAAG;EACV,MAAM,EAAE,GAAG;EACX,WAAW,EAAE,GAAG;EAChB,cAAc,EAAE,MAAM;;AAExB,0BAAyD;EACvD,QAAQ,EAAE,QAAQ;EAClB,IAAI,EAAE,CAAC;EACP,KAAK,EAAE,IAAI;EACX,UAAU,EAAE,MAAM;;AAEpB,YAA4B;EAAE,WAAW,EAAE,OAAO;;AAClD,YAA4B;EAAE,SAAS,EAAE,GAAG;;AAC5C,WAA2B;EAAE,KAAK,ELVZ,IAAI;;;;AMN1B,gBAAgC;EAAE,OAAO,ENoQ1B,GAAO;;AMnQtB,gBAAgC;EAAE,OAAO,EN0W1B,GAAO;;AMzWtB,iBAAiC;EAAE,OAAO,ENmb1B,GAAO;;AMlbvB,qBAAqC;EAAE,OAAO,ENmL1B,GAAO;;AMlL3B,gBAAgC;EAAE,OAAO,ENkR1B,GAAO;;AMjRtB,eAA+B;EAAE,OAAO,ENke1B,GAAO;;AMjerB,iBAAiC;EAAE,OAAO,ENse1B,GAAO;;AMrevB,eAA+B;EAAE,OAAO,EN+iB1B,GAAO;;AM9iBrB,eAA+B;EAAE,OAAO,ENyN1B,GAAO;;AMxNrB,mBAAmC;EAAE,OAAO,ENggB1B,GAAO;;AM/fzB,aAA6B;EAAE,OAAO,EN8f1B,GAAO;;AM7fnB,kBAAkC;EAAE,OAAO,EN+f1B,GAAO;;AM9fxB,gBAAgC;EAAE,OAAO,ENoG1B,GAAO;;AMnGtB;;gBAEgC;EAAE,OAAO,ENkgB1B,GAAO;;AMjgBtB,sBAAsC;EAAE,OAAO,ENua1B,GAAO;;AMta5B,uBAAuC;EAAE,OAAO,ENqa1B,GAAO;;AMpa7B,oBAAoC;EAAE,OAAO,EN+X1B,GAAO;;AM9X1B,iBAAiC;EAAE,OAAO,ENsb1B,GAAO;;AMrbvB;cAC8B;EAAE,OAAO,ENwH1B,GAAO;;AMvHpB,kBAAkC;EAAE,OAAO,ENygB1B,GAAO;;AMxgBxB,eAA+B;EAAE,OAAO,ENmQ1B,GAAO;;AMlQrB,iBAAiC;EAAE,OAAO,EN6L1B,GAAO;;AM5LvB,kBAAkC;EAAE,OAAO,EN0G1B,GAAO;;AMzGxB,eAA+B;EAAE,OAAO,EN+Y1B,GAAO;;AM9YrB,mBAAmC;EAAE,OAAO,ENiJ1B,GAAO;;AMhJzB,8BAA8C;EAAE,OAAO,ENI1B,GAAO;;AMHpC,4BAA4C;EAAE,OAAO,ENM1B,GAAO;;AMLlC,gBAAgC;EAAE,OAAO,ENkQ1B,GAAO;;AMjQtB,wBAAwC;EAAE,OAAO,EN4W1B,GAAO;;AM3W9B;iBACiC;EAAE,OAAO,ENmY1B,GAAO;;AMlYvB,kBAAkC;EAAE,OAAO,EN8X1B,GAAO;;AM7XxB,mBAAmC;EAAE,OAAO,ENiS1B,GAAO;;AMhSzB,eAA+B;EAAE,OAAO,ENoS1B,GAAO;;AMnSrB,eAA+B;EAAE,OAAO,ENgM1B,GAAO;;AM/LrB,qBAAqC;EAAE,OAAO,EN+O1B,GAAO;;AM9O3B,qBAAqC;EAAE,OAAO,EN8hB1B,GAAO;;AM7hB3B,sBAAsC;EAAE,OAAO,EN4hB1B,GAAO;;AM3hB5B,oBAAoC;EAAE,OAAO,EN6hB1B,GAAO;;AM5hB1B,iBAAiC;EAAE,OAAO,EN2W1B,GAAO;;AM1WvB,kBAAkC;EAAE,OAAO,ENW1B,GAAO;;AMVxB,cAA8B;EAAE,OAAO,ENod1B,GAAO;;AMndpB,eAA+B;EAAE,OAAO,ENod1B,GAAO;;AMndrB,eAA+B;EAAE,OAAO,EN2B1B,GAAO;;AM1BrB,mBAAmC;EAAE,OAAO,EN2B1B,GAAO;;AM1BzB,gBAAgC;EAAE,OAAO,ENkW1B,GAAO;;AMjWtB,iBAAiC;EAAE,OAAO,ENwC1B,GAAO;;AMvCvB,eAA+B;EAAE,OAAO,EN8L1B,GAAO;;AM7LrB,eAA+B;EAAE,OAAO,ENmB1B,GAAO;;AMlBrB,iBAAiC;EAAE,OAAO,ENoP1B,GAAO;;AMnPvB,sBAAsC;EAAE,OAAO,ENid1B,GAAO;;AMhd5B,qBAAqC;EAAE,OAAO,ENid1B,GAAO;;AMhd3B,qBAAqC;EAAE,OAAO,EN1C1B,GAAO;;AM2C3B,uBAAuC;EAAE,OAAO,EN7C1B,GAAO;;AM8C7B,sBAAsC;EAAE,OAAO,EN3C1B,GAAO;;AM4C5B,wBAAwC;EAAE,OAAO,EN9C1B,GAAO;;AM+C9B,eAA+B;EAAE,OAAO,ENwQ1B,GAAO;;AMvQrB;kBACkC;EAAE,OAAO,ENmT1B,GAAO;;AMlTxB,iBAAiC;EAAE,OAAO,ENmO1B,GAAO;;AMlOvB,uBAAuC;EAAE,OAAO,ENigB1B,GAAO;;AMhgB7B;;oBAEoC;EAAE,OAAO,EN+T1B,GAAO;;AM9T1B,iBAAiC;EAAE,OAAO,ENwT1B,GAAO;;AMvTvB,qBAAqC;EAAE,OAAO,EN+Q1B,GAAO;;AM9Q3B,iBAAiC;EAAE,OAAO,EN5D1B,GAAO;;AM6DvB,eAA+B;EAAE,OAAO,EN8c1B,GAAO;;AM7crB;0BAC0C;EAAE,OAAO,ENqT1B,GAAO;;AMpThC,yBAAyC;EAAE,OAAO,ENuX1B,GAAO;;AMtX/B,yBAAyC;EAAE,OAAO,EN0C1B,GAAO;;AMzC/B,iBAAiC;EAAE,OAAO,ENjC1B,GAAO;;AMkCvB,wBAAwC;EAAE,OAAO,ENma1B,GAAO;;AMla9B,wBAAwC;EAAE,OAAO,EN4H1B,GAAO;;AM3H9B,mBAAmC;EAAE,OAAO,EN7B1B,GAAO;;AM8BzB,eAA+B;EAAE,OAAO,EN0T1B,GAAO;;AMzTrB,gBAAgC;EAAE,OAAO,ENwS1B,GAAO;;AMvStB,eAA+B;EAAE,OAAO,ENia1B,GAAO;;AMharB,kBAAkC;EAAE,OAAO,ENgK1B,GAAO;;AM/JxB,uBAAuC;EAAE,OAAO,ENuH1B,GAAO;;AMtH7B,uBAAuC;EAAE,OAAO,EN4Z1B,GAAO;;AM3Z7B,gBAAgC;EAAE,OAAO,EN4F1B,GAAO;;AM3FtB,uBAAuC;EAAE,OAAO,ENoC1B,GAAO;;AMnC7B,wBAAwC;EAAE,OAAO,ENoC1B,GAAO;;AMnC9B,sBAAsC;EAAE,OAAO,ENsT1B,GAAO;;AMrT5B,uBAAuC;EAAE,OAAO,ENyQ1B,GAAO;;AMxQ7B,uBAAuC;EAAE,OAAO,ENwb1B,GAAO;;AMvb7B,uBAAuC;EAAE,OAAO,ENsB1B,GAAO;;AMrB7B,0BAA0C;EAAE,OAAO,EN2T1B,GAAO;;AM1ThC,sBAAsC;EAAE,OAAO,ENsM1B,GAAO;;AMrM5B,qBAAqC;EAAE,OAAO,EN6D1B,GAAO;;AM5D3B,yBAAyC;EAAE,OAAO,ENob1B,GAAO;;AMnb/B,yBAAyC;EAAE,OAAO,ENkB1B,GAAO;;AMjB/B,cAA8B;EAAE,OAAO,EN/C1B,GAAO;;AMgDpB,qBAAqC;EAAE,OAAO,EN3D1B,GAAO;;AM4D3B,sBAAsC;EAAE,OAAO,EN3D1B,GAAO;;AM4D5B,mBAAmC;EAAE,OAAO,EN3D1B,GAAO;;AM4DzB,qBAAqC;EAAE,OAAO,EN/D1B,GAAO;;AMgE3B;gBACgC;EAAE,OAAO,ENqV1B,GAAO;;AMpVtB,iBAAiC;EAAE,OAAO,ENuF1B,GAAO;;AMtFvB,mBAAmC;EAAE,OAAO,EN4C1B,GAAO;;AM3CzB,eAA+B;EAAE,OAAO,ENmS1B,GAAO;;AMlSrB,gBAAgC;EAAE,OAAO,ENsP1B,GAAO;;AMrPtB,mBAAmC;EAAE,OAAO,EN9D1B,GAAO;;AM+DzB,6BAA6C;EAAE,OAAO,ENgF1B,GAAO;;AM/EnC,eAA+B;EAAE,OAAO,EN+I1B,GAAO;;AM9IrB,eAA+B;EAAE,OAAO,ENoM1B,GAAO;;AMnMrB,eAA+B;EAAE,OAAO,ENmH1B,GAAO;;AMlHrB,cAA8B;EAAE,OAAO,ENiF1B,GAAO;;AMhFpB,oBAAoC;EAAE,OAAO,ENiF1B,GAAO;;AMhF1B;+BAC+C;EAAE,OAAO,EN0E1B,GAAO;;AMzErC,gBAAgC;EAAE,OAAO,ENmR1B,GAAO;;AMlRtB,mBAAmC;EAAE,OAAO,EN/B1B,GAAO;;AMgCzB,iBAAiC;EAAE,OAAO,ENoS1B,GAAO;;AMnSvB,kBAAkC;EAAE,OAAO,ENwB1B,GAAO;;AMvBxB,iBAAiC;EAAE,OAAO,ENqN1B,GAAO;;AMpNvB,qBAAqC;EAAE,OAAO,ENE1B,GAAO;;AMD3B,uBAAuC;EAAE,OAAO,ENF1B,GAAO;;AMG7B,kBAAkC;EAAE,OAAO,EN2S1B,GAAO;;AM1SxB,wBAAwC;EAAE,OAAO,ENyU1B,GAAO;;AMxU9B,iBAAiC;EAAE,OAAO,EN8G1B,GAAO;;AM7GvB,sBAAsC;EAAE,OAAO,EN+G1B,GAAO;;AM9G5B,mBAAmC;EAAE,OAAO,ENnF1B,GAAO;;AMoFzB,mBAAmC;EAAE,OAAO,ENrF1B,GAAO;;AMsFzB;oBACoC;EAAE,OAAO,EN/E1B,GAAO;;AMgF1B,yBAAyC;EAAE,OAAO,ENua1B,GAAO;;AMta/B,0BAA0C;EAAE,OAAO,ENmE1B,GAAO;;AMlEhC,uBAAuC;EAAE,OAAO,EN5C1B,GAAO;;AM6C7B,cAA8B;EAAE,OAAO,ENqK1B,GAAO;;AMpKpB;eAC+B;EAAE,OAAO,ENK1B,GAAO;;AMJrB,mBAAmC;EAAE,OAAO,ENQ1B,GAAO;;AMPzB,sBAAsC;EAAE,OAAO,ENmY1B,GAAO;;AMlY5B,wBAAwC;EAAE,OAAO,ENiY1B,GAAO;;AMhY9B,oBAAoC;EAAE,OAAO,EN2V1B,GAAO;;AM1V1B,kBAAkC;EAAE,OAAO,ENyI1B,GAAO;;AMxIxB,mBAAmC;EAAE,OAAO,ENyT1B,GAAO;;AMxTzB,0BAA0C;EAAE,OAAO,ENiL1B,GAAO;;AMhLhC,qBAAqC;EAAE,OAAO,EN0X1B,GAAO;;AMzX3B,wBAAwC;EAAE,OAAO,EN8C1B,GAAO;;AM7C9B,kBAAkC;EAAE,OAAO,ENoT1B,GAAO;;AMnTxB,iBAAiC;EAAE,OAAO,EN8Y1B,GAAO;;AM7YvB,wBAAwC;EAAE,OAAO,EN6G1B,GAAO;;AM5G9B,iBAAiC;EAAE,OAAO,EN8Z1B,GAAO;;AM7ZvB,kBAAkC;EAAE,OAAO,EN+J1B,GAAO;;AM9JxB,gBAAgC;EAAE,OAAO,ENsO1B,GAAO;;AMrOtB,mBAAmC;EAAE,OAAO,EN2U1B,GAAO;;AM1UzB,qBAAqC;EAAE,OAAO,EN/E1B,GAAO;;AMgF3B,uBAAuC;EAAE,OAAO,ENoO1B,GAAO;;AMnO7B,kBAAkC;EAAE,OAAO,EN8Y1B,GAAO;;AM7YxB;mBACmC;EAAE,OAAO,ENuC1B,GAAO;;AMtCzB,iBAAiC;EAAE,OAAO,ENiG1B,GAAO;;AMhGvB,iBAAiC;EAAE,OAAO,ENiZ1B,GAAO;;AMhZvB,sBAAsC;EAAE,OAAO,ENR1B,GAAO;;AMS5B,cAA8B;EAAE,OAAO,EN4Q1B,GAAO;;AM3QpB,gBAAgC;EAAE,OAAO,ENgH1B,GAAO;;AM/GtB,mBAAmC;EAAE,OAAO,ENnF1B,GAAO;;AMoFzB,eAA+B;EAAE,OAAO,ENzG1B,GAAO;;AM0GrB,sBAAsC;EAAE,OAAO,ENzD1B,GAAO;;AM0D5B,uBAAuC;EAAE,OAAO,EN0G1B,GAAO;;AMzG7B,sBAAsC;EAAE,OAAO,ENwG1B,GAAO;;AMvG5B,oBAAoC;EAAE,OAAO,ENyG1B,GAAO;;AMxG1B,sBAAsC;EAAE,OAAO,ENqG1B,GAAO;;AMpG5B,4BAA4C;EAAE,OAAO,EN5I1B,GAAO;;AM6IlC,6BAA6C;EAAE,OAAO,ENxI1B,GAAO;;AMyInC,0BAA0C;EAAE,OAAO,ENxI1B,GAAO;;AMyIhC,4BAA4C;EAAE,OAAO,ENhJ1B,GAAO;;AMiJlC,gBAAgC;EAAE,OAAO,ENsF1B,GAAO;;AMrFtB,iBAAiC;EAAE,OAAO,ENia1B,GAAO;;AMhavB,gBAAgC;EAAE,OAAO,ENiV1B,GAAO;;AMhVtB,iBAAiC;EAAE,OAAO,ENgD1B,GAAO;;AM/CvB,oBAAoC;EAAE,OAAO,ENvG1B,GAAO;;AMwG1B,qBAAqC;EAAE,OAAO,ENzI1B,GAAO;;AM0I3B;gBACgC;EAAE,OAAO,ENqY1B,GAAO;;AMpYtB;eAC+B;EAAE,OAAO,ENuI1B,GAAO;;AMtIrB,gBAAgC;EAAE,OAAO,ENpD1B,GAAO;;AMqDtB,gBAAgC;EAAE,OAAO,EN+C1B,GAAO;;AM9CtB;mBACmC;EAAE,OAAO,ENwP1B,GAAO;;AMvPzB;kBACkC;EAAE,OAAO,ENkC1B,GAAO;;AMjCxB,oBAAoC;EAAE,OAAO,ENsL1B,GAAO;;AMrL1B;mBACmC;EAAE,OAAO,EN0C1B,GAAO;;AMzCzB,iBAAiC;EAAE,OAAO,ENiS1B,GAAO;;AMhSvB;;eAE+B;EAAE,OAAO,EN9I1B,GAAO;;AM+IrB,kBAAkC;EAAE,OAAO,ENgI1B,GAAO;;AM/HxB,kBAAkC;EAAE,OAAO,EN8H1B,GAAO;;AM7HxB,wBAAwC;EAAE,OAAO,EN4S1B,GAAO;;AM3S9B,oBAAoC;EAAE,OAAO,ENoW1B,GAAO;;AMnW1B,gBAAgC;EAAE,OAAO,ENmT1B,GAAO;;AMlTtB,gBAAgC;EAAE,OAAO,ENkI1B,GAAO;;AMjItB,gBAAgC;EAAE,OAAO,ENuV1B,GAAO;;AMtVtB,oBAAoC;EAAE,OAAO,ENwL1B,GAAO;;AMvL1B,2BAA2C;EAAE,OAAO,ENyL1B,GAAO;;AMxLjC,6BAA6C;EAAE,OAAO,ENyD1B,GAAO;;AMxDnC,sBAAsC;EAAE,OAAO,ENuD1B,GAAO;;AMtD5B,gBAAgC;EAAE,OAAO,ENsJ1B,GAAO;;AMrJtB,qBAAqC;EAAE,OAAO,ENtH1B,GAAO;;AMuH3B,mBAAmC;EAAE,OAAO,ENhH1B,GAAO;;AMiHzB,qBAAqC;EAAE,OAAO,ENvH1B,GAAO;;AMwH3B,sBAAsC;EAAE,OAAO,ENvH1B,GAAO;;AMwH5B,kBAAkC;EAAE,OAAO,ENvE1B,GAAO;;AMwExB;eAC+B;EAAE,OAAO,EN2P1B,GAAO;;AM1PrB;oBACoC;EAAE,OAAO,EN+P1B,GAAO;;AM9P1B;mBACmC;EAAE,OAAO,EN4P1B,GAAO;;AM3PzB,mBAAmC;EAAE,OAAO,ENxC1B,GAAO;;AMyCzB,mBAAmC;EAAE,OAAO,ENkG1B,GAAO;;AMjGzB;eAC+B;EAAE,OAAO,EN8U1B,GAAO;;AM7UrB;gBACgC;EAAE,OAAO,ENqB1B,GAAO;;AMpBtB;qBACqC;EAAE,OAAO,EN2R1B,GAAO;;AM1R3B,oBAAoC;EAAE,OAAO,ENpF1B,GAAO;;AMqF1B,qBAAqC;EAAE,OAAO,ENnF1B,GAAO;;AMoF3B;eAC+B;EAAE,OAAO,ENjK1B,GAAO;;AMkKrB,kBAAkC;EAAE,OAAO,ENkO1B,GAAO;;AMjOxB,mBAAmC;EAAE,OAAO,ENkU1B,GAAO;;AMjUzB;oBACoC;EAAE,OAAO,EN1G1B,GAAO;;AM2G1B,sBAAsC;EAAE,OAAO,ENgF1B,GAAO;;AM/E5B,mBAAmC;EAAE,OAAO,ENnD1B,GAAO;;AMoDzB,yBAAyC;EAAE,OAAO,ENzG1B,GAAO;;AM0G/B,uBAAuC;EAAE,OAAO,ENzG1B,GAAO;;AM0G7B,kBAAkC;EAAE,OAAO,ENsU1B,GAAO;;AMrUxB,sBAAsC;EAAE,OAAO,EN+P1B,GAAO;;AM9P5B,mBAAmC;EAAE,OAAO,ENsQ1B,GAAO;;AMrQzB,iBAAiC;EAAE,OAAO,ENvL1B,GAAO;;AMwLvB,iBAAiC;EAAE,OAAO,ENzG1B,GAAO;;AM0GvB,kBAAkC;EAAE,OAAO,ENtF1B,GAAO;;AMuFxB,sBAAsC;EAAE,OAAO,EN3B1B,GAAO;;AM4B5B,qBAAqC;EAAE,OAAO,ENxK1B,GAAO;;AMyK3B,qBAAqC;EAAE,OAAO,ENkC1B,GAAO;;AMjC3B,oBAAoC;EAAE,OAAO,EN3O1B,GAAO;;AM4O1B,iBAAiC;EAAE,OAAO,ENiG1B,GAAO;;AMhGvB,sBAAsC;EAAE,OAAO,EN/C1B,GAAO;;AMgD5B,eAA+B;EAAE,OAAO,ENpM1B,GAAO;;AMqMrB,mBAAmC;EAAE,OAAO,ENe1B,GAAO;;AMdzB,sBAAsC;EAAE,OAAO,ENgJ1B,GAAO;;AM/I5B,4BAA4C;EAAE,OAAO,EN5O1B,GAAO;;AM6OlC,6BAA6C;EAAE,OAAO,EN5O1B,GAAO;;AM6OnC,0BAA0C;EAAE,OAAO,EN5O1B,GAAO;;AM6OhC,4BAA4C;EAAE,OAAO,ENhP1B,GAAO;;AMiPlC,qBAAqC;EAAE,OAAO,EN5O1B,GAAO;;AM6O3B,sBAAsC;EAAE,OAAO,EN5O1B,GAAO;;AM6O5B,mBAAmC;EAAE,OAAO,EN5O1B,GAAO;;AM6OzB,qBAAqC;EAAE,OAAO,ENhP1B,GAAO;;AMiP3B,kBAAkC;EAAE,OAAO,ENlG1B,GAAO;;AMmGxB,iBAAiC;EAAE,OAAO,ENuC1B,GAAO;;AMtCvB,iBAAiC;EAAE,OAAO,ENoP1B,GAAO;;AMnPvB;iBACiC;EAAE,OAAO,ENyF1B,GAAO;;AMxFvB,mBAAmC;EAAE,OAAO,EN9I1B,GAAO;;AM+IzB,qBAAqC;EAAE,OAAO,EN0I1B,GAAO;;AMzI3B,sBAAsC;EAAE,OAAO,EN0I1B,GAAO;;AMzI5B,kBAAkC;EAAE,OAAO,ENgN1B,GAAO;;AM/MxB,iBAAiC;EAAE,OAAO,ENnJ1B,GAAO;;AMoJvB;gBACgC;EAAE,OAAO,ENkJ1B,GAAO;;AMjJtB,qBAAqC;EAAE,OAAO,ENnB1B,GAAO;;AMoB3B,mBAAmC;EAAE,OAAO,ENxC1B,GAAO;;AMyCzB,wBAAwC;EAAE,OAAO,ENvC1B,GAAO;;AMwC9B,kBAAkC;EAAE,OAAO,EN0L1B,GAAO;;AMzLxB,kBAAkC;EAAE,OAAO,ENpC1B,GAAO;;AMqCxB,gBAAgC;EAAE,OAAO,ENoE1B,GAAO;;AMnEtB,kBAAkC;EAAE,OAAO,ENpC1B,GAAO;;AMqCxB,qBAAqC;EAAE,OAAO,ENkB1B,GAAO;;AMjB3B,iBAAiC;EAAE,OAAO,ENrD1B,GAAO;;AMsDvB,yBAAyC;EAAE,OAAO,ENvD1B,GAAO;;AMwD/B,mBAAmC;EAAE,OAAO,ENuO1B,GAAO;;AMtOzB,eAA+B;EAAE,OAAO,ENtJ1B,GAAO;;AMuJrB;oBACoC;EAAE,OAAO,ENqI1B,GAAO;;AMpI1B;;sBAEsC;EAAE,OAAO,ENuM1B,GAAO;;AMtM5B,yBAAyC;EAAE,OAAO,ENkC1B,GAAO;;AMjC/B,eAA+B;EAAE,OAAO,EN5I1B,GAAO;;AM6IrB,oBAAoC;EAAE,OAAO,EN7J1B,GAAO;;AM8J1B;uBACuC;EAAE,OAAO,EN1L1B,GAAO;;AM2L7B,mBAAmC;EAAE,OAAO,EN4G1B,GAAO;;AM3GzB,eAA+B;EAAE,OAAO,ENT1B,GAAO;;AMUrB,sBAAsC;EAAE,OAAO,ENhH1B,GAAO;;AMiH5B,sBAAsC;EAAE,OAAO,EN8M1B,GAAO;;AM7M5B,oBAAoC;EAAE,OAAO,ENyM1B,GAAO;;AMxM1B,iBAAiC;EAAE,OAAO,ENvH1B,GAAO;;AMwHvB,uBAAuC;EAAE,OAAO,ENmG1B,GAAO;;AMlG7B,qBAAqC;EAAE,OAAO,EN8C1B,GAAO;;AM7C3B,2BAA2C;EAAE,OAAO,EN8C1B,GAAO;;AM7CjC,iBAAiC;EAAE,OAAO,ENgJ1B,GAAO;;AM/IvB,qBAAqC;EAAE,OAAO,EN5N1B,GAAO;;AM6N3B,4BAA4C;EAAE,OAAO,ENjF1B,GAAO;;AMkFlC,iBAAiC;EAAE,OAAO,ENoH1B,GAAO;;AMnHvB,iBAAiC;EAAE,OAAO,ENkC1B,GAAO;;AMjCvB,8BAA8C;EAAE,OAAO,ENlM1B,GAAO;;AMmMpC,+BAA+C;EAAE,OAAO,ENlM1B,GAAO;;AMmMrC,4BAA4C;EAAE,OAAO,ENlM1B,GAAO;;AMmMlC,8BAA8C;EAAE,OAAO,ENtM1B,GAAO;;AMuMpC,gBAAgC;EAAE,OAAO,EN/B1B,GAAO;;AMgCtB,eAA+B;EAAE,OAAO,ENjK1B,GAAO;;AMkKrB,iBAAiC;EAAE,OAAO,EN9S1B,GAAO;;AM+SvB,qBAAqC;EAAE,OAAO,ENmP1B,GAAO;;AMlP3B,mBAAmC;EAAE,OAAO,EN9O1B,GAAO;;AM+OzB,qBAAqC;EAAE,OAAO,EN/I1B,GAAO;;AMgJ3B,qBAAqC;EAAE,OAAO,EN/I1B,GAAO;;AMgJ3B,qBAAqC;EAAE,OAAO,EN4G1B,GAAO;;AM3G3B,sBAAsC;EAAE,OAAO,ENsE1B,GAAO;;AMrE5B,iBAAiC;EAAE,OAAO,EN2M1B,GAAO;;AM1MvB,uBAAuC;EAAE,OAAO,EN6B1B,GAAO;;AM5B7B,yBAAyC;EAAE,OAAO,EN6B1B,GAAO;;AM5B/B,mBAAmC;EAAE,OAAO,ENhB1B,GAAO;;AMiBzB,qBAAqC;EAAE,OAAO,ENlB1B,GAAO;;AMmB3B,uBAAuC;EAAE,OAAO,ENvN1B,GAAO;;AMwN7B,wBAAwC;EAAE,OAAO,ENiD1B,GAAO;;AMhD9B,+BAA+C;EAAE,OAAO,EN3I1B,GAAO;;AM4IrC,uBAAuC;EAAE,OAAO,ENkH1B,GAAO;;AMjH7B,kBAAkC;EAAE,OAAO,EN1L1B,GAAO;;AM2LxB;8BAC8C;EAAE,OAAO,ENjP1B,GAAO;;AMkPpC;4BAC4C;EAAE,OAAO,ENhP1B,GAAO;;AMiPlC;+BAC+C;EAAE,OAAO,ENnP1B,GAAO;;AMoPrC;cAC8B;EAAE,OAAO,EN7J1B,GAAO;;AM8JpB,cAA8B;EAAE,OAAO,EN/F1B,GAAO;;AMgGpB;cAC8B;EAAE,OAAO,EN4N1B,GAAO;;AM3NpB;cAC8B;EAAE,OAAO,ENvD1B,GAAO;;AMwDpB;;;cAG8B;EAAE,OAAO,ENrD1B,GAAO;;AMsDpB;;cAE8B;EAAE,OAAO,EN8E1B,GAAO;;AM7EpB;cAC8B;EAAE,OAAO,ENtD1B,GAAO;;AMuDpB;cAC8B;EAAE,OAAO,ENzR1B,GAAO;;AM0RpB,eAA+B;EAAE,OAAO,ENzJ1B,GAAO;;AM0JrB,oBAAoC;EAAE,OAAO,EN7I1B,GAAO;;AM8I1B,yBAAyC;EAAE,OAAO,EN2G1B,GAAO;;AM1G/B,0BAA0C;EAAE,OAAO,EN2G1B,GAAO;;AM1GhC,0BAA0C;EAAE,OAAO,EN2G1B,GAAO;;AM1GhC,2BAA2C;EAAE,OAAO,EN2G1B,GAAO;;AM1GjC,2BAA2C;EAAE,OAAO,EN8G1B,GAAO;;AM7GjC,4BAA4C;EAAE,OAAO,EN8G1B,GAAO;;AM7GlC,oBAAoC;EAAE,OAAO,ENgK1B,GAAO;;AM/J1B,sBAAsC;EAAE,OAAO,EN4J1B,GAAO;;AM3J5B,yBAAyC;EAAE,OAAO,ENwO1B,GAAO;;AMvO/B,kBAAkC;EAAE,OAAO,ENqO1B,GAAO;;AMpOxB,eAA+B;EAAE,OAAO,EN+N1B,GAAO;;AM9NrB,sBAAsC;EAAE,OAAO,EN+N1B,GAAO;;AM9N5B,uBAAuC;EAAE,OAAO,ENmO1B,GAAO;;AMlO7B,kBAAkC;EAAE,OAAO,ENxM1B,GAAO;;AMyMxB,yBAAyC;EAAE,OAAO,EN+G1B,GAAO;;AM9G/B,oBAAoC;EAAE,OAAO,ENnF1B,GAAO;;AMoF1B,iBAAiC;EAAE,OAAO,EN/I1B,GAAO;;AMgJvB,cAA8B;EAAE,OAAO,ENhX1B,GAAO;;AMiXpB,oBAAoC;EAAE,OAAO,ENxT1B,GAAO;;AMyT1B,2BAA2C;EAAE,OAAO,ENxT1B,GAAO;;AMyTjC,iBAAiC;EAAE,OAAO,ENyK1B,GAAO;;AMxKvB,wBAAwC;EAAE,OAAO,ENyK1B,GAAO;;AMxK9B,0BAA0C;EAAE,OAAO,ENtD1B,GAAO;;AMuDhC,wBAAwC;EAAE,OAAO,ENpD1B,GAAO;;AMqD9B,0BAA0C;EAAE,OAAO,ENvD1B,GAAO;;AMwDhC,2BAA2C;EAAE,OAAO,ENvD1B,GAAO;;AMwDjC,gBAAgC;EAAE,OAAO,ENxW1B,GAAO;;AMyWtB,kBAAkC;EAAE,OAAO,EN0M1B,GAAO;;AMzMxB,kBAAkC;EAAE,OAAO,ENpX1B,GAAO;;AMqXxB,gBAAgC;EAAE,OAAO,ENpE1B,GAAO;;AMqEtB,mBAAmC;EAAE,OAAO,EN1N1B,GAAO;;AM2NzB,gBAAgC;EAAE,OAAO,ENqE1B,GAAO;;AMpEtB,qBAAqC;EAAE,OAAO,ENtJ1B,GAAO;;AMuJ3B,iBAAiC;EAAE,OAAO,ENuJ1B,GAAO;;AMtJvB,iBAAiC;EAAE,OAAO,EN/L1B,GAAO;;AMgMvB,eAA+B;EAAE,OAAO,EN1D1B,GAAO;;AM2DrB;mBACmC;EAAE,OAAO,ENnI1B,GAAO;;AMoIzB,gBAAgC;EAAE,OAAO,EN2G1B,GAAO;;AM1GtB,iBAAiC;EAAE,OAAO,ENxC1B,GAAO;;AMyCvB,kBAAkC;EAAE,OAAO,ENrX1B,GAAO;;AMsXxB,cAA8B;EAAE,OAAO,ENpU1B,GAAO;;AMqUpB,aAA6B;EAAE,OAAO,ENgL1B,GAAO;;AM/KnB,gBAAgC;EAAE,OAAO,ENqL1B,GAAO;;AMpLtB,iBAAiC;EAAE,OAAO,ENa1B,GAAO;;AMZvB,oBAAoC;EAAE,OAAO,ENrC1B,GAAO;;AMsC1B,yBAAyC;EAAE,OAAO,EN8E1B,GAAO;;AM7E/B,+BAA+C;EAAE,OAAO,ENtX1B,GAAO;;AMuXrC,8BAA8C;EAAE,OAAO,ENxX1B,GAAO;;AMyXpC;8BAC8C;EAAE,OAAO,EN3T1B,GAAO;;AM4TpC,uBAAuC;EAAE,OAAO,ENjP1B,GAAO;;AMkP7B,qBAAqC;EAAE,OAAO,EN+K1B,GAAO;;AM9K3B,uBAAuC;EAAE,OAAO,ENmK1B,GAAO;;AMlK7B;cAC8B;EAAE,OAAO,ENoI1B,GAAO;;AMnIpB,wBAAwC;EAAE,OAAO,ENjB1B,GAAO;;AMkB9B,wBAAwC;EAAE,OAAO,EN6D1B,GAAO;;AM5D9B,gBAAgC;EAAE,OAAO,EN2C1B,GAAO;;AM1CtB,0BAA0C;EAAE,OAAO,EN7O1B,GAAO;;AM8OhC,oBAAoC;EAAE,OAAO,EN2K1B,GAAO;;AM1K1B,iBAAiC;EAAE,OAAO,ENvD1B,GAAO;;AMwDvB;;qBAEqC;EAAE,OAAO,ENsI1B,GAAO;;AMrI3B;yBACyC;EAAE,OAAO,ENjK1B,GAAO;;AMkK/B,gBAAgC;EAAE,OAAO,ENwK1B,GAAO;;AMvKtB,iBAAiC;EAAE,OAAO,ENvK1B,GAAO;;AMwKvB,iBAAiC;EAAE,OAAO,ENhB1B,GAAO;;AMiBvB,wBAAwC;EAAE,OAAO,ENhB1B,GAAO;;AMiB9B,6BAA6C;EAAE,OAAO,ENsE1B,GAAO;;AMrEnC,sBAAsC;EAAE,OAAO,ENoE1B,GAAO;;AMnE5B,oBAAoC;EAAE,OAAO,EN7Q1B,GAAO;;AM8Q1B,eAA+B;EAAE,OAAO,EN1Q1B,GAAO;;AM2QrB,qBAAqC;EAAE,OAAO,ENjD1B,GAAO;;AMkD3B,yBAAyC;EAAE,OAAO,ENjD1B,GAAO;;AMkD/B,iBAAiC;EAAE,OAAO,ENvQ1B,GAAO;;AMwQvB,iBAAiC;EAAE,OAAO,EN9I1B,GAAO;;AM+IvB,mBAAmC;EAAE,OAAO,ENzI1B,GAAO;;AM0IzB,cAA8B;EAAE,OAAO,EN9O1B,GAAO;;AM+OpB,mBAAmC;EAAE,OAAO,EN3W1B,GAAO;;AM4WzB,gBAAgC;EAAE,OAAO,EN9T1B,GAAO;;AM+TtB,cAA8B;EAAE,OAAO,ENnE1B,GAAO;;AMoEpB,gBAAgC;EAAE,OAAO,ENoC1B,GAAO;;AMnCtB,eAA+B;EAAE,OAAO,ENjS1B,GAAO;;AMkSrB,gBAAgC;EAAE,OAAO,ENjS1B,GAAO;;AMkStB,kBAAkC;EAAE,OAAO,ENtY1B,GAAO;;AMuYxB,yBAAyC;EAAE,OAAO,ENtY1B,GAAO;;AMuY/B,gBAAgC;EAAE,OAAO,EN2C1B,GAAO;;AM1CtB,uBAAuC;EAAE,OAAO,EN2C1B,GAAO;;AM1C7B,kBAAkC;EAAE,OAAO,ENvC1B,GAAO;;AMwCxB;cAC8B;EAAE,OAAO,EN3W1B,GAAO;;AM4WpB;eAC+B;EAAE,OAAO,EN2D1B,GAAO;;AM1DrB,eAA+B;EAAE,OAAO,ENuF1B,GAAO;;AMtFrB,kBAAkC;EAAE,OAAO,ENwB1B,GAAO;;AMvBxB,qBAAqC;EAAE,OAAO,ENpS1B,GAAO;;AMqS3B,qBAAqC;EAAE,OAAO,ENkB1B,GAAO;;AMjB3B,mBAAmC;EAAE,OAAO,EN1S1B,GAAO;;AM2SzB,qBAAqC;EAAE,OAAO,ENxP1B,GAAO;;AMyP3B,sBAAsC;EAAE,OAAO,ENjP1B,GAAO;;AMkP5B,uBAAuC;EAAE,OAAO,EN9P1B,GAAO;;AM+P7B,4BAA4C;EAAE,OAAO,ENxP1B,GAAO;;AMyPlC;;uBAEuC;EAAE,OAAO,ENjQ1B,GAAO;;AMkQ7B;yBACyC;EAAE,OAAO,ENvQ1B,GAAO;;AMwQ/B;uBACuC;EAAE,OAAO,ENxQ1B,GAAO;;AMyQ7B;uBACuC;EAAE,OAAO,EN7P1B,GAAO;;AM8P7B,sBAAsC;EAAE,OAAO,EN1Q1B,GAAO;;AM2Q5B,eAA+B;EAAE,OAAO,ENsG1B,GAAO;;AMrGrB,kBAAkC;EAAE,OAAO,ENlV1B,GAAO;;AMmVxB,mBAAmC;EAAE,OAAO,ENnL1B,GAAO;;AMoLzB;;;;oBAIoC;EAAE,OAAO,ENxK1B,GAAO;;AMyK1B,yBAAyC;EAAE,OAAO,ENpW1B,GAAO;;AMqW/B;gBACgC;EAAE,OAAO,EN1E1B,GAAO;;AM2EtB;iBACiC;EAAE,OAAO,ENpT1B,GAAO;;AMqTvB,qBAAqC;EAAE,OAAO,EN1O1B,GAAO;;AM2O3B,cAA8B;EAAE,OAAO,EN5O1B,GAAO;;AM6OpB,sBAAsC;EAAE,OAAO,EN7N1B,GAAO;;AM8N5B,wBAAwC;EAAE,OAAO,ENwB1B,GAAO;;AMvB9B,aAA6B;EAAE,OAAO,ENzF1B,GAAO;;AM0FnB;iBACiC;EAAE,OAAO,EN2F1B,GAAO;;AM1FvB;sBACsC;EAAE,OAAO,EN9H1B,GAAO;;AM+H5B;wBACwC;EAAE,OAAO,EN/H1B,GAAO;;AMgI9B,kBAAkC;EAAE,OAAO,EN3N1B,GAAO;;AM4NxB;sBACsC;EAAE,OAAO,ENrX1B,GAAO;;AMsX5B,iBAAiC;EAAE,OAAO,ENnO1B,GAAO;;AMoOvB,oBAAoC;EAAE,OAAO,ENlI1B,GAAO;;AMmI1B,kBAAkC;EAAE,OAAO,EN1C1B,GAAO;;AM2CxB,oBAAoC;EAAE,OAAO,EN7D1B,GAAO;;AM8D1B,2BAA2C;EAAE,OAAO,EN7D1B,GAAO;;AM8DjC,eAA+B;EAAE,OAAO,ENpb1B,GAAO;;AMqbrB;mBACmC;EAAE,OAAO,ENzQ1B,GAAO;;AM0QzB,cAA8B;EAAE,OAAO,ENsC1B,GAAO;;AMrCpB,qBAAqC;EAAE,OAAO,EN/b1B,GAAO;;AMgc3B,eAA+B;EAAE,OAAO,ENrH1B,GAAO;;AMsHrB,qBAAqC;EAAE,OAAO,ENlD1B,GAAO;;AMmD3B,iBAAiC;EAAE,OAAO,ENsC1B,GAAO;;AMrCvB,eAA+B;EAAE,OAAO,ENiF1B,GAAO;;AMhFrB,sBAAsC;EAAE,OAAO,ENvJ1B,GAAO;;AMwJ5B,eAA+B;EAAE,OAAO,ENuE1B,GAAO;;AMtErB,qBAAqC;EAAE,OAAO,ENjb1B,GAAO;;AMkb3B,iBAAiC;EAAE,OAAO,EN9I1B,GAAO;;AM+IvB,wBAAwC;EAAE,OAAO,ENhQ1B,GAAO;;AMiQ9B,kBAAkC;EAAE,OAAO,EN9Z1B,GAAO;;AM+ZxB,wBAAwC;EAAE,OAAO,ENla1B,GAAO;;AMma9B,sBAAsC;EAAE,OAAO,ENpa1B,GAAO;;AMqa5B,kBAAkC;EAAE,OAAO,ENta1B,GAAO;;AMuaxB,oBAAoC;EAAE,OAAO,ENpa1B,GAAO;;AMqa1B,oBAAoC;EAAE,OAAO,ENpa1B,GAAO;;AMqa1B,qBAAqC;EAAE,OAAO,ENld1B,GAAO;;AMmd3B,uBAAuC;EAAE,OAAO,ENld1B,GAAO;;AMmd7B,gBAAgC;EAAE,OAAO,ENY1B,GAAO;;AMXtB,oBAAoC;EAAE,OAAO,EN3X1B,GAAO;;AM4X1B,aAA6B;EAAE,OAAO,ENre1B,GAAO;;AMsenB,qBAAqC;EAAE,OAAO,ENjV1B,GAAO;;AMkV3B,sBAAsC;EAAE,OAAO,ENpK1B,GAAO;;AMqK5B,wBAAwC;EAAE,OAAO,ENrd1B,GAAO;;AMsd9B,qBAAqC;EAAE,OAAO,EN3f1B,GAAO;;AM4f3B,oBAAoC;EAAE,OAAO,ENvJ1B,GAAO;;AMwJ1B,qBAAqC;EAAE,OAAO,EN5N1B,GAAO;;AM6N3B,iBAAiC;EAAE,OAAO,EN1O1B,GAAO;;AM2OvB,wBAAwC;EAAE,OAAO,EN1O1B,GAAO;;AM2O9B,qBAAqC;EAAE,OAAO,ENN1B,GAAO;;AMO3B,oBAAoC;EAAE,OAAO,ENN1B,GAAO;;AMO1B,kBAAkC;EAAE,OAAO,EN/d1B,GAAO;;AMgexB,cAA8B;EAAE,OAAO,EN7c1B,GAAO;;AM8cpB,kBAAkC;EAAE,OAAO,EN1P1B,GAAO;;AM2PxB,oBAAoC;EAAE,OAAO,ENhhB1B,GAAO;;AMihB1B,aAA6B;EAAE,OAAO,EN7b1B,GAAO;;AM8bnB;;cAE8B;EAAE,OAAO,ENxQ1B,GAAO;;AMyQpB,mBAAmC;EAAE,OAAO,EN7M1B,GAAO;;AM8MzB,qBAAqC;EAAE,OAAO,ENpd1B,GAAO;;AMqd3B,yBAAyC;EAAE,OAAO,ENnZ1B,GAAO;;AMoZ/B,mBAAmC;EAAE,OAAO,ENxY1B,GAAO;;AMyYzB,mBAAmC;EAAE,OAAO,EN1T1B,GAAO;;AM2TzB,kBAAkC;EAAE,OAAO,ENxP1B,GAAO;;AMyPxB,iBAAiC;EAAE,OAAO,ENrH1B,GAAO;;AMsHvB,uBAAuC;EAAE,OAAO,ENzG1B,GAAO;;AM0G7B,sBAAsC;EAAE,OAAO,ENrG1B,GAAO;;AMsG5B,mBAAmC;EAAE,OAAO,ENpG1B,GAAO;;AMqGzB,oBAAoC;EAAE,OAAO,EN5c1B,GAAO;;AM6c1B,0BAA0C;EAAE,OAAO,EN9c1B,GAAO;;AM+chC,kBAAkC;EAAE,OAAO,EN3Y1B,GAAO;;AM4YxB,eAA+B;EAAE,OAAO,ENhH1B,GAAO;;AMiHrB,sBAAsC;EAAE,OAAO,ENI1B,GAAO;;AMH5B,qBAAqC;EAAE,OAAO,EN5M1B,GAAO;;AM6M3B,sBAAsC;EAAE,OAAO,ENpE1B,GAAO;;AMqE5B,oBAAoC;EAAE,OAAO,ENhS1B,GAAO;;AMiS1B,gBAAgC;EAAE,OAAO,ENG1B,GAAO;;AMFtB,eAA+B;EAAE,OAAO,ENtO1B,GAAO;;AMuOrB,kBAAkC;EAAE,OAAO,EN7N1B,GAAO;;AM8NxB,sBAAsC;EAAE,OAAO,ENhC1B,GAAO;;AMiC5B,0BAA0C;EAAE,OAAO,ENhC1B,GAAO;;AMiChC,uBAAuC;EAAE,OAAO,END1B,GAAO;;AME7B,sBAAsC;EAAE,OAAO,EN1O1B,GAAO;;AM2O5B,qBAAqC;EAAE,OAAO,ENF1B,GAAO;;AMG3B,sBAAsC;EAAE,OAAO,EN3O1B,GAAO;;AM4O5B,wBAAwC;EAAE,OAAO,EN1O1B,GAAO;;AM2O9B,wBAAwC;EAAE,OAAO,EN5O1B,GAAO;;AM6O9B,iBAAiC;EAAE,OAAO,ENvN1B,GAAO;;AMwNvB,4BAA4C;EAAE,OAAO,EN9X1B,GAAO;;AM+XlC,sBAAsC;EAAE,OAAO,ENhM1B,GAAO;;AMiM5B,mBAAmC;EAAE,OAAO,ENI1B,GAAO;;AMHzB,iBAAiC;EAAE,OAAO,EN7I1B,GAAO;;AM8IvB,oBAAoC;EAAE,OAAO,ENjB1B,GAAO;;AMkB1B,qBAAqC;EAAE,OAAO,ENhB1B,GAAO;;AMiB3B;cAC8B;EAAE,OAAO,ENphB1B,GAAO;;AMqhBpB,kBAAkC;EAAE,OAAO,ENd1B,GAAO;;AMexB,gBAAgC;EAAE,OAAO,ENnD1B,GAAO;;AMoDtB,iBAAiC;EAAE,OAAO,ENvF1B,GAAO;;AMwFvB,iBAAiC;EAAE,OAAO,ENrP1B,GAAO",
+"sources": ["../scss/_path.scss","../scss/_core.scss","../scss/_larger.scss","../scss/_fixed-width.scss","../scss/_list.scss","../scss/_variables.scss","../scss/_bordered-pulled.scss","../scss/_animated.scss","../scss/_rotated-flipped.scss","../scss/_mixins.scss","../scss/_stacked.scss","../scss/_icons.scss"],
+"names": [],
+"file": "font-awesome.css"
+}
diff --git a/web/pgadmin/static/css/font-awesome.min.css b/web/pgadmin/static/vendor/font-awesome/css/font-awesome.min.css
similarity index 100%
rename from web/pgadmin/static/css/font-awesome.min.css
rename to web/pgadmin/static/vendor/font-awesome/css/font-awesome.min.css
diff --git a/web/pgadmin/static/fonts/FontAwesome.otf b/web/pgadmin/static/vendor/font-awesome/fonts/FontAwesome.otf
similarity index 100%
rename from web/pgadmin/static/fonts/FontAwesome.otf
rename to web/pgadmin/static/vendor/font-awesome/fonts/FontAwesome.otf
diff --git a/web/pgadmin/static/fonts/fontawesome-webfont.eot b/web/pgadmin/static/vendor/font-awesome/fonts/fontawesome-webfont.eot
similarity index 100%
rename from web/pgadmin/static/fonts/fontawesome-webfont.eot
rename to web/pgadmin/static/vendor/font-awesome/fonts/fontawesome-webfont.eot
diff --git a/web/pgadmin/static/fonts/fontawesome-webfont.svg b/web/pgadmin/static/vendor/font-awesome/fonts/fontawesome-webfont.svg
similarity index 100%
rename from web/pgadmin/static/fonts/fontawesome-webfont.svg
rename to web/pgadmin/static/vendor/font-awesome/fonts/fontawesome-webfont.svg
diff --git a/web/pgadmin/static/fonts/fontawesome-webfont.ttf b/web/pgadmin/static/vendor/font-awesome/fonts/fontawesome-webfont.ttf
similarity index 100%
rename from web/pgadmin/static/fonts/fontawesome-webfont.ttf
rename to web/pgadmin/static/vendor/font-awesome/fonts/fontawesome-webfont.ttf
diff --git a/web/pgadmin/static/fonts/fontawesome-webfont.woff b/web/pgadmin/static/vendor/font-awesome/fonts/fontawesome-webfont.woff
similarity index 100%
rename from web/pgadmin/static/fonts/fontawesome-webfont.woff
rename to web/pgadmin/static/vendor/font-awesome/fonts/fontawesome-webfont.woff
diff --git a/web/pgadmin/static/fonts/fontawesome-webfont.woff2 b/web/pgadmin/static/vendor/font-awesome/fonts/fontawesome-webfont.woff2
similarity index 100%
rename from web/pgadmin/static/fonts/fontawesome-webfont.woff2
rename to web/pgadmin/static/vendor/font-awesome/fonts/fontawesome-webfont.woff2
diff --git a/web/pgadmin/static/vendor/font-awesome/less/animated.less b/web/pgadmin/static/vendor/font-awesome/less/animated.less
new file mode 100644
index 000000000..66ad52a5b
--- /dev/null
+++ b/web/pgadmin/static/vendor/font-awesome/less/animated.less
@@ -0,0 +1,34 @@
+// Animated Icons
+// --------------------------
+
+.@{fa-css-prefix}-spin {
+ -webkit-animation: fa-spin 2s infinite linear;
+ animation: fa-spin 2s infinite linear;
+}
+
+.@{fa-css-prefix}-pulse {
+ -webkit-animation: fa-spin 1s infinite steps(8);
+ animation: fa-spin 1s infinite steps(8);
+}
+
+@-webkit-keyframes fa-spin {
+ 0% {
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg);
+ }
+ 100% {
+ -webkit-transform: rotate(359deg);
+ transform: rotate(359deg);
+ }
+}
+
+@keyframes fa-spin {
+ 0% {
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg);
+ }
+ 100% {
+ -webkit-transform: rotate(359deg);
+ transform: rotate(359deg);
+ }
+}
diff --git a/web/pgadmin/static/vendor/font-awesome/less/bordered-pulled.less b/web/pgadmin/static/vendor/font-awesome/less/bordered-pulled.less
new file mode 100644
index 000000000..f1c8ad75f
--- /dev/null
+++ b/web/pgadmin/static/vendor/font-awesome/less/bordered-pulled.less
@@ -0,0 +1,25 @@
+// Bordered & Pulled
+// -------------------------
+
+.@{fa-css-prefix}-border {
+ padding: .2em .25em .15em;
+ border: solid .08em @fa-border-color;
+ border-radius: .1em;
+}
+
+.@{fa-css-prefix}-pull-left { float: left; }
+.@{fa-css-prefix}-pull-right { float: right; }
+
+.@{fa-css-prefix} {
+ &.@{fa-css-prefix}-pull-left { margin-right: .3em; }
+ &.@{fa-css-prefix}-pull-right { margin-left: .3em; }
+}
+
+/* Deprecated as of 4.4.0 */
+.pull-right { float: right; }
+.pull-left { float: left; }
+
+.@{fa-css-prefix} {
+ &.pull-left { margin-right: .3em; }
+ &.pull-right { margin-left: .3em; }
+}
diff --git a/web/pgadmin/static/vendor/font-awesome/less/core.less b/web/pgadmin/static/vendor/font-awesome/less/core.less
new file mode 100644
index 000000000..c577ac84a
--- /dev/null
+++ b/web/pgadmin/static/vendor/font-awesome/less/core.less
@@ -0,0 +1,12 @@
+// Base Class Definition
+// -------------------------
+
+.@{fa-css-prefix} {
+ display: inline-block;
+ font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration
+ font-size: inherit; // can't have font-size inherit on line above, so need to override
+ text-rendering: auto; // optimizelegibility throws things off #1094
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+
+}
diff --git a/web/pgadmin/static/vendor/font-awesome/less/fixed-width.less b/web/pgadmin/static/vendor/font-awesome/less/fixed-width.less
new file mode 100644
index 000000000..110289f2f
--- /dev/null
+++ b/web/pgadmin/static/vendor/font-awesome/less/fixed-width.less
@@ -0,0 +1,6 @@
+// Fixed Width Icons
+// -------------------------
+.@{fa-css-prefix}-fw {
+ width: (18em / 14);
+ text-align: center;
+}
diff --git a/web/pgadmin/static/vendor/font-awesome/less/font-awesome.less b/web/pgadmin/static/vendor/font-awesome/less/font-awesome.less
new file mode 100644
index 000000000..c35d3eeb9
--- /dev/null
+++ b/web/pgadmin/static/vendor/font-awesome/less/font-awesome.less
@@ -0,0 +1,17 @@
+/*!
+ * Font Awesome 4.5.0 by @davegandy - http://fontawesome.io - @fontawesome
+ * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
+ */
+
+@import "variables.less";
+@import "mixins.less";
+@import "path.less";
+@import "core.less";
+@import "larger.less";
+@import "fixed-width.less";
+@import "list.less";
+@import "bordered-pulled.less";
+@import "animated.less";
+@import "rotated-flipped.less";
+@import "stacked.less";
+@import "icons.less";
diff --git a/web/pgadmin/static/vendor/font-awesome/less/icons.less b/web/pgadmin/static/vendor/font-awesome/less/icons.less
new file mode 100644
index 000000000..ca60abd7e
--- /dev/null
+++ b/web/pgadmin/static/vendor/font-awesome/less/icons.less
@@ -0,0 +1,697 @@
+/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
+ readers do not read off random characters that represent icons */
+
+.@{fa-css-prefix}-glass:before { content: @fa-var-glass; }
+.@{fa-css-prefix}-music:before { content: @fa-var-music; }
+.@{fa-css-prefix}-search:before { content: @fa-var-search; }
+.@{fa-css-prefix}-envelope-o:before { content: @fa-var-envelope-o; }
+.@{fa-css-prefix}-heart:before { content: @fa-var-heart; }
+.@{fa-css-prefix}-star:before { content: @fa-var-star; }
+.@{fa-css-prefix}-star-o:before { content: @fa-var-star-o; }
+.@{fa-css-prefix}-user:before { content: @fa-var-user; }
+.@{fa-css-prefix}-film:before { content: @fa-var-film; }
+.@{fa-css-prefix}-th-large:before { content: @fa-var-th-large; }
+.@{fa-css-prefix}-th:before { content: @fa-var-th; }
+.@{fa-css-prefix}-th-list:before { content: @fa-var-th-list; }
+.@{fa-css-prefix}-check:before { content: @fa-var-check; }
+.@{fa-css-prefix}-remove:before,
+.@{fa-css-prefix}-close:before,
+.@{fa-css-prefix}-times:before { content: @fa-var-times; }
+.@{fa-css-prefix}-search-plus:before { content: @fa-var-search-plus; }
+.@{fa-css-prefix}-search-minus:before { content: @fa-var-search-minus; }
+.@{fa-css-prefix}-power-off:before { content: @fa-var-power-off; }
+.@{fa-css-prefix}-signal:before { content: @fa-var-signal; }
+.@{fa-css-prefix}-gear:before,
+.@{fa-css-prefix}-cog:before { content: @fa-var-cog; }
+.@{fa-css-prefix}-trash-o:before { content: @fa-var-trash-o; }
+.@{fa-css-prefix}-home:before { content: @fa-var-home; }
+.@{fa-css-prefix}-file-o:before { content: @fa-var-file-o; }
+.@{fa-css-prefix}-clock-o:before { content: @fa-var-clock-o; }
+.@{fa-css-prefix}-road:before { content: @fa-var-road; }
+.@{fa-css-prefix}-download:before { content: @fa-var-download; }
+.@{fa-css-prefix}-arrow-circle-o-down:before { content: @fa-var-arrow-circle-o-down; }
+.@{fa-css-prefix}-arrow-circle-o-up:before { content: @fa-var-arrow-circle-o-up; }
+.@{fa-css-prefix}-inbox:before { content: @fa-var-inbox; }
+.@{fa-css-prefix}-play-circle-o:before { content: @fa-var-play-circle-o; }
+.@{fa-css-prefix}-rotate-right:before,
+.@{fa-css-prefix}-repeat:before { content: @fa-var-repeat; }
+.@{fa-css-prefix}-refresh:before { content: @fa-var-refresh; }
+.@{fa-css-prefix}-list-alt:before { content: @fa-var-list-alt; }
+.@{fa-css-prefix}-lock:before { content: @fa-var-lock; }
+.@{fa-css-prefix}-flag:before { content: @fa-var-flag; }
+.@{fa-css-prefix}-headphones:before { content: @fa-var-headphones; }
+.@{fa-css-prefix}-volume-off:before { content: @fa-var-volume-off; }
+.@{fa-css-prefix}-volume-down:before { content: @fa-var-volume-down; }
+.@{fa-css-prefix}-volume-up:before { content: @fa-var-volume-up; }
+.@{fa-css-prefix}-qrcode:before { content: @fa-var-qrcode; }
+.@{fa-css-prefix}-barcode:before { content: @fa-var-barcode; }
+.@{fa-css-prefix}-tag:before { content: @fa-var-tag; }
+.@{fa-css-prefix}-tags:before { content: @fa-var-tags; }
+.@{fa-css-prefix}-book:before { content: @fa-var-book; }
+.@{fa-css-prefix}-bookmark:before { content: @fa-var-bookmark; }
+.@{fa-css-prefix}-print:before { content: @fa-var-print; }
+.@{fa-css-prefix}-camera:before { content: @fa-var-camera; }
+.@{fa-css-prefix}-font:before { content: @fa-var-font; }
+.@{fa-css-prefix}-bold:before { content: @fa-var-bold; }
+.@{fa-css-prefix}-italic:before { content: @fa-var-italic; }
+.@{fa-css-prefix}-text-height:before { content: @fa-var-text-height; }
+.@{fa-css-prefix}-text-width:before { content: @fa-var-text-width; }
+.@{fa-css-prefix}-align-left:before { content: @fa-var-align-left; }
+.@{fa-css-prefix}-align-center:before { content: @fa-var-align-center; }
+.@{fa-css-prefix}-align-right:before { content: @fa-var-align-right; }
+.@{fa-css-prefix}-align-justify:before { content: @fa-var-align-justify; }
+.@{fa-css-prefix}-list:before { content: @fa-var-list; }
+.@{fa-css-prefix}-dedent:before,
+.@{fa-css-prefix}-outdent:before { content: @fa-var-outdent; }
+.@{fa-css-prefix}-indent:before { content: @fa-var-indent; }
+.@{fa-css-prefix}-video-camera:before { content: @fa-var-video-camera; }
+.@{fa-css-prefix}-photo:before,
+.@{fa-css-prefix}-image:before,
+.@{fa-css-prefix}-picture-o:before { content: @fa-var-picture-o; }
+.@{fa-css-prefix}-pencil:before { content: @fa-var-pencil; }
+.@{fa-css-prefix}-map-marker:before { content: @fa-var-map-marker; }
+.@{fa-css-prefix}-adjust:before { content: @fa-var-adjust; }
+.@{fa-css-prefix}-tint:before { content: @fa-var-tint; }
+.@{fa-css-prefix}-edit:before,
+.@{fa-css-prefix}-pencil-square-o:before { content: @fa-var-pencil-square-o; }
+.@{fa-css-prefix}-share-square-o:before { content: @fa-var-share-square-o; }
+.@{fa-css-prefix}-check-square-o:before { content: @fa-var-check-square-o; }
+.@{fa-css-prefix}-arrows:before { content: @fa-var-arrows; }
+.@{fa-css-prefix}-step-backward:before { content: @fa-var-step-backward; }
+.@{fa-css-prefix}-fast-backward:before { content: @fa-var-fast-backward; }
+.@{fa-css-prefix}-backward:before { content: @fa-var-backward; }
+.@{fa-css-prefix}-play:before { content: @fa-var-play; }
+.@{fa-css-prefix}-pause:before { content: @fa-var-pause; }
+.@{fa-css-prefix}-stop:before { content: @fa-var-stop; }
+.@{fa-css-prefix}-forward:before { content: @fa-var-forward; }
+.@{fa-css-prefix}-fast-forward:before { content: @fa-var-fast-forward; }
+.@{fa-css-prefix}-step-forward:before { content: @fa-var-step-forward; }
+.@{fa-css-prefix}-eject:before { content: @fa-var-eject; }
+.@{fa-css-prefix}-chevron-left:before { content: @fa-var-chevron-left; }
+.@{fa-css-prefix}-chevron-right:before { content: @fa-var-chevron-right; }
+.@{fa-css-prefix}-plus-circle:before { content: @fa-var-plus-circle; }
+.@{fa-css-prefix}-minus-circle:before { content: @fa-var-minus-circle; }
+.@{fa-css-prefix}-times-circle:before { content: @fa-var-times-circle; }
+.@{fa-css-prefix}-check-circle:before { content: @fa-var-check-circle; }
+.@{fa-css-prefix}-question-circle:before { content: @fa-var-question-circle; }
+.@{fa-css-prefix}-info-circle:before { content: @fa-var-info-circle; }
+.@{fa-css-prefix}-crosshairs:before { content: @fa-var-crosshairs; }
+.@{fa-css-prefix}-times-circle-o:before { content: @fa-var-times-circle-o; }
+.@{fa-css-prefix}-check-circle-o:before { content: @fa-var-check-circle-o; }
+.@{fa-css-prefix}-ban:before { content: @fa-var-ban; }
+.@{fa-css-prefix}-arrow-left:before { content: @fa-var-arrow-left; }
+.@{fa-css-prefix}-arrow-right:before { content: @fa-var-arrow-right; }
+.@{fa-css-prefix}-arrow-up:before { content: @fa-var-arrow-up; }
+.@{fa-css-prefix}-arrow-down:before { content: @fa-var-arrow-down; }
+.@{fa-css-prefix}-mail-forward:before,
+.@{fa-css-prefix}-share:before { content: @fa-var-share; }
+.@{fa-css-prefix}-expand:before { content: @fa-var-expand; }
+.@{fa-css-prefix}-compress:before { content: @fa-var-compress; }
+.@{fa-css-prefix}-plus:before { content: @fa-var-plus; }
+.@{fa-css-prefix}-minus:before { content: @fa-var-minus; }
+.@{fa-css-prefix}-asterisk:before { content: @fa-var-asterisk; }
+.@{fa-css-prefix}-exclamation-circle:before { content: @fa-var-exclamation-circle; }
+.@{fa-css-prefix}-gift:before { content: @fa-var-gift; }
+.@{fa-css-prefix}-leaf:before { content: @fa-var-leaf; }
+.@{fa-css-prefix}-fire:before { content: @fa-var-fire; }
+.@{fa-css-prefix}-eye:before { content: @fa-var-eye; }
+.@{fa-css-prefix}-eye-slash:before { content: @fa-var-eye-slash; }
+.@{fa-css-prefix}-warning:before,
+.@{fa-css-prefix}-exclamation-triangle:before { content: @fa-var-exclamation-triangle; }
+.@{fa-css-prefix}-plane:before { content: @fa-var-plane; }
+.@{fa-css-prefix}-calendar:before { content: @fa-var-calendar; }
+.@{fa-css-prefix}-random:before { content: @fa-var-random; }
+.@{fa-css-prefix}-comment:before { content: @fa-var-comment; }
+.@{fa-css-prefix}-magnet:before { content: @fa-var-magnet; }
+.@{fa-css-prefix}-chevron-up:before { content: @fa-var-chevron-up; }
+.@{fa-css-prefix}-chevron-down:before { content: @fa-var-chevron-down; }
+.@{fa-css-prefix}-retweet:before { content: @fa-var-retweet; }
+.@{fa-css-prefix}-shopping-cart:before { content: @fa-var-shopping-cart; }
+.@{fa-css-prefix}-folder:before { content: @fa-var-folder; }
+.@{fa-css-prefix}-folder-open:before { content: @fa-var-folder-open; }
+.@{fa-css-prefix}-arrows-v:before { content: @fa-var-arrows-v; }
+.@{fa-css-prefix}-arrows-h:before { content: @fa-var-arrows-h; }
+.@{fa-css-prefix}-bar-chart-o:before,
+.@{fa-css-prefix}-bar-chart:before { content: @fa-var-bar-chart; }
+.@{fa-css-prefix}-twitter-square:before { content: @fa-var-twitter-square; }
+.@{fa-css-prefix}-facebook-square:before { content: @fa-var-facebook-square; }
+.@{fa-css-prefix}-camera-retro:before { content: @fa-var-camera-retro; }
+.@{fa-css-prefix}-key:before { content: @fa-var-key; }
+.@{fa-css-prefix}-gears:before,
+.@{fa-css-prefix}-cogs:before { content: @fa-var-cogs; }
+.@{fa-css-prefix}-comments:before { content: @fa-var-comments; }
+.@{fa-css-prefix}-thumbs-o-up:before { content: @fa-var-thumbs-o-up; }
+.@{fa-css-prefix}-thumbs-o-down:before { content: @fa-var-thumbs-o-down; }
+.@{fa-css-prefix}-star-half:before { content: @fa-var-star-half; }
+.@{fa-css-prefix}-heart-o:before { content: @fa-var-heart-o; }
+.@{fa-css-prefix}-sign-out:before { content: @fa-var-sign-out; }
+.@{fa-css-prefix}-linkedin-square:before { content: @fa-var-linkedin-square; }
+.@{fa-css-prefix}-thumb-tack:before { content: @fa-var-thumb-tack; }
+.@{fa-css-prefix}-external-link:before { content: @fa-var-external-link; }
+.@{fa-css-prefix}-sign-in:before { content: @fa-var-sign-in; }
+.@{fa-css-prefix}-trophy:before { content: @fa-var-trophy; }
+.@{fa-css-prefix}-github-square:before { content: @fa-var-github-square; }
+.@{fa-css-prefix}-upload:before { content: @fa-var-upload; }
+.@{fa-css-prefix}-lemon-o:before { content: @fa-var-lemon-o; }
+.@{fa-css-prefix}-phone:before { content: @fa-var-phone; }
+.@{fa-css-prefix}-square-o:before { content: @fa-var-square-o; }
+.@{fa-css-prefix}-bookmark-o:before { content: @fa-var-bookmark-o; }
+.@{fa-css-prefix}-phone-square:before { content: @fa-var-phone-square; }
+.@{fa-css-prefix}-twitter:before { content: @fa-var-twitter; }
+.@{fa-css-prefix}-facebook-f:before,
+.@{fa-css-prefix}-facebook:before { content: @fa-var-facebook; }
+.@{fa-css-prefix}-github:before { content: @fa-var-github; }
+.@{fa-css-prefix}-unlock:before { content: @fa-var-unlock; }
+.@{fa-css-prefix}-credit-card:before { content: @fa-var-credit-card; }
+.@{fa-css-prefix}-feed:before,
+.@{fa-css-prefix}-rss:before { content: @fa-var-rss; }
+.@{fa-css-prefix}-hdd-o:before { content: @fa-var-hdd-o; }
+.@{fa-css-prefix}-bullhorn:before { content: @fa-var-bullhorn; }
+.@{fa-css-prefix}-bell:before { content: @fa-var-bell; }
+.@{fa-css-prefix}-certificate:before { content: @fa-var-certificate; }
+.@{fa-css-prefix}-hand-o-right:before { content: @fa-var-hand-o-right; }
+.@{fa-css-prefix}-hand-o-left:before { content: @fa-var-hand-o-left; }
+.@{fa-css-prefix}-hand-o-up:before { content: @fa-var-hand-o-up; }
+.@{fa-css-prefix}-hand-o-down:before { content: @fa-var-hand-o-down; }
+.@{fa-css-prefix}-arrow-circle-left:before { content: @fa-var-arrow-circle-left; }
+.@{fa-css-prefix}-arrow-circle-right:before { content: @fa-var-arrow-circle-right; }
+.@{fa-css-prefix}-arrow-circle-up:before { content: @fa-var-arrow-circle-up; }
+.@{fa-css-prefix}-arrow-circle-down:before { content: @fa-var-arrow-circle-down; }
+.@{fa-css-prefix}-globe:before { content: @fa-var-globe; }
+.@{fa-css-prefix}-wrench:before { content: @fa-var-wrench; }
+.@{fa-css-prefix}-tasks:before { content: @fa-var-tasks; }
+.@{fa-css-prefix}-filter:before { content: @fa-var-filter; }
+.@{fa-css-prefix}-briefcase:before { content: @fa-var-briefcase; }
+.@{fa-css-prefix}-arrows-alt:before { content: @fa-var-arrows-alt; }
+.@{fa-css-prefix}-group:before,
+.@{fa-css-prefix}-users:before { content: @fa-var-users; }
+.@{fa-css-prefix}-chain:before,
+.@{fa-css-prefix}-link:before { content: @fa-var-link; }
+.@{fa-css-prefix}-cloud:before { content: @fa-var-cloud; }
+.@{fa-css-prefix}-flask:before { content: @fa-var-flask; }
+.@{fa-css-prefix}-cut:before,
+.@{fa-css-prefix}-scissors:before { content: @fa-var-scissors; }
+.@{fa-css-prefix}-copy:before,
+.@{fa-css-prefix}-files-o:before { content: @fa-var-files-o; }
+.@{fa-css-prefix}-paperclip:before { content: @fa-var-paperclip; }
+.@{fa-css-prefix}-save:before,
+.@{fa-css-prefix}-floppy-o:before { content: @fa-var-floppy-o; }
+.@{fa-css-prefix}-square:before { content: @fa-var-square; }
+.@{fa-css-prefix}-navicon:before,
+.@{fa-css-prefix}-reorder:before,
+.@{fa-css-prefix}-bars:before { content: @fa-var-bars; }
+.@{fa-css-prefix}-list-ul:before { content: @fa-var-list-ul; }
+.@{fa-css-prefix}-list-ol:before { content: @fa-var-list-ol; }
+.@{fa-css-prefix}-strikethrough:before { content: @fa-var-strikethrough; }
+.@{fa-css-prefix}-underline:before { content: @fa-var-underline; }
+.@{fa-css-prefix}-table:before { content: @fa-var-table; }
+.@{fa-css-prefix}-magic:before { content: @fa-var-magic; }
+.@{fa-css-prefix}-truck:before { content: @fa-var-truck; }
+.@{fa-css-prefix}-pinterest:before { content: @fa-var-pinterest; }
+.@{fa-css-prefix}-pinterest-square:before { content: @fa-var-pinterest-square; }
+.@{fa-css-prefix}-google-plus-square:before { content: @fa-var-google-plus-square; }
+.@{fa-css-prefix}-google-plus:before { content: @fa-var-google-plus; }
+.@{fa-css-prefix}-money:before { content: @fa-var-money; }
+.@{fa-css-prefix}-caret-down:before { content: @fa-var-caret-down; }
+.@{fa-css-prefix}-caret-up:before { content: @fa-var-caret-up; }
+.@{fa-css-prefix}-caret-left:before { content: @fa-var-caret-left; }
+.@{fa-css-prefix}-caret-right:before { content: @fa-var-caret-right; }
+.@{fa-css-prefix}-columns:before { content: @fa-var-columns; }
+.@{fa-css-prefix}-unsorted:before,
+.@{fa-css-prefix}-sort:before { content: @fa-var-sort; }
+.@{fa-css-prefix}-sort-down:before,
+.@{fa-css-prefix}-sort-desc:before { content: @fa-var-sort-desc; }
+.@{fa-css-prefix}-sort-up:before,
+.@{fa-css-prefix}-sort-asc:before { content: @fa-var-sort-asc; }
+.@{fa-css-prefix}-envelope:before { content: @fa-var-envelope; }
+.@{fa-css-prefix}-linkedin:before { content: @fa-var-linkedin; }
+.@{fa-css-prefix}-rotate-left:before,
+.@{fa-css-prefix}-undo:before { content: @fa-var-undo; }
+.@{fa-css-prefix}-legal:before,
+.@{fa-css-prefix}-gavel:before { content: @fa-var-gavel; }
+.@{fa-css-prefix}-dashboard:before,
+.@{fa-css-prefix}-tachometer:before { content: @fa-var-tachometer; }
+.@{fa-css-prefix}-comment-o:before { content: @fa-var-comment-o; }
+.@{fa-css-prefix}-comments-o:before { content: @fa-var-comments-o; }
+.@{fa-css-prefix}-flash:before,
+.@{fa-css-prefix}-bolt:before { content: @fa-var-bolt; }
+.@{fa-css-prefix}-sitemap:before { content: @fa-var-sitemap; }
+.@{fa-css-prefix}-umbrella:before { content: @fa-var-umbrella; }
+.@{fa-css-prefix}-paste:before,
+.@{fa-css-prefix}-clipboard:before { content: @fa-var-clipboard; }
+.@{fa-css-prefix}-lightbulb-o:before { content: @fa-var-lightbulb-o; }
+.@{fa-css-prefix}-exchange:before { content: @fa-var-exchange; }
+.@{fa-css-prefix}-cloud-download:before { content: @fa-var-cloud-download; }
+.@{fa-css-prefix}-cloud-upload:before { content: @fa-var-cloud-upload; }
+.@{fa-css-prefix}-user-md:before { content: @fa-var-user-md; }
+.@{fa-css-prefix}-stethoscope:before { content: @fa-var-stethoscope; }
+.@{fa-css-prefix}-suitcase:before { content: @fa-var-suitcase; }
+.@{fa-css-prefix}-bell-o:before { content: @fa-var-bell-o; }
+.@{fa-css-prefix}-coffee:before { content: @fa-var-coffee; }
+.@{fa-css-prefix}-cutlery:before { content: @fa-var-cutlery; }
+.@{fa-css-prefix}-file-text-o:before { content: @fa-var-file-text-o; }
+.@{fa-css-prefix}-building-o:before { content: @fa-var-building-o; }
+.@{fa-css-prefix}-hospital-o:before { content: @fa-var-hospital-o; }
+.@{fa-css-prefix}-ambulance:before { content: @fa-var-ambulance; }
+.@{fa-css-prefix}-medkit:before { content: @fa-var-medkit; }
+.@{fa-css-prefix}-fighter-jet:before { content: @fa-var-fighter-jet; }
+.@{fa-css-prefix}-beer:before { content: @fa-var-beer; }
+.@{fa-css-prefix}-h-square:before { content: @fa-var-h-square; }
+.@{fa-css-prefix}-plus-square:before { content: @fa-var-plus-square; }
+.@{fa-css-prefix}-angle-double-left:before { content: @fa-var-angle-double-left; }
+.@{fa-css-prefix}-angle-double-right:before { content: @fa-var-angle-double-right; }
+.@{fa-css-prefix}-angle-double-up:before { content: @fa-var-angle-double-up; }
+.@{fa-css-prefix}-angle-double-down:before { content: @fa-var-angle-double-down; }
+.@{fa-css-prefix}-angle-left:before { content: @fa-var-angle-left; }
+.@{fa-css-prefix}-angle-right:before { content: @fa-var-angle-right; }
+.@{fa-css-prefix}-angle-up:before { content: @fa-var-angle-up; }
+.@{fa-css-prefix}-angle-down:before { content: @fa-var-angle-down; }
+.@{fa-css-prefix}-desktop:before { content: @fa-var-desktop; }
+.@{fa-css-prefix}-laptop:before { content: @fa-var-laptop; }
+.@{fa-css-prefix}-tablet:before { content: @fa-var-tablet; }
+.@{fa-css-prefix}-mobile-phone:before,
+.@{fa-css-prefix}-mobile:before { content: @fa-var-mobile; }
+.@{fa-css-prefix}-circle-o:before { content: @fa-var-circle-o; }
+.@{fa-css-prefix}-quote-left:before { content: @fa-var-quote-left; }
+.@{fa-css-prefix}-quote-right:before { content: @fa-var-quote-right; }
+.@{fa-css-prefix}-spinner:before { content: @fa-var-spinner; }
+.@{fa-css-prefix}-circle:before { content: @fa-var-circle; }
+.@{fa-css-prefix}-mail-reply:before,
+.@{fa-css-prefix}-reply:before { content: @fa-var-reply; }
+.@{fa-css-prefix}-github-alt:before { content: @fa-var-github-alt; }
+.@{fa-css-prefix}-folder-o:before { content: @fa-var-folder-o; }
+.@{fa-css-prefix}-folder-open-o:before { content: @fa-var-folder-open-o; }
+.@{fa-css-prefix}-smile-o:before { content: @fa-var-smile-o; }
+.@{fa-css-prefix}-frown-o:before { content: @fa-var-frown-o; }
+.@{fa-css-prefix}-meh-o:before { content: @fa-var-meh-o; }
+.@{fa-css-prefix}-gamepad:before { content: @fa-var-gamepad; }
+.@{fa-css-prefix}-keyboard-o:before { content: @fa-var-keyboard-o; }
+.@{fa-css-prefix}-flag-o:before { content: @fa-var-flag-o; }
+.@{fa-css-prefix}-flag-checkered:before { content: @fa-var-flag-checkered; }
+.@{fa-css-prefix}-terminal:before { content: @fa-var-terminal; }
+.@{fa-css-prefix}-code:before { content: @fa-var-code; }
+.@{fa-css-prefix}-mail-reply-all:before,
+.@{fa-css-prefix}-reply-all:before { content: @fa-var-reply-all; }
+.@{fa-css-prefix}-star-half-empty:before,
+.@{fa-css-prefix}-star-half-full:before,
+.@{fa-css-prefix}-star-half-o:before { content: @fa-var-star-half-o; }
+.@{fa-css-prefix}-location-arrow:before { content: @fa-var-location-arrow; }
+.@{fa-css-prefix}-crop:before { content: @fa-var-crop; }
+.@{fa-css-prefix}-code-fork:before { content: @fa-var-code-fork; }
+.@{fa-css-prefix}-unlink:before,
+.@{fa-css-prefix}-chain-broken:before { content: @fa-var-chain-broken; }
+.@{fa-css-prefix}-question:before { content: @fa-var-question; }
+.@{fa-css-prefix}-info:before { content: @fa-var-info; }
+.@{fa-css-prefix}-exclamation:before { content: @fa-var-exclamation; }
+.@{fa-css-prefix}-superscript:before { content: @fa-var-superscript; }
+.@{fa-css-prefix}-subscript:before { content: @fa-var-subscript; }
+.@{fa-css-prefix}-eraser:before { content: @fa-var-eraser; }
+.@{fa-css-prefix}-puzzle-piece:before { content: @fa-var-puzzle-piece; }
+.@{fa-css-prefix}-microphone:before { content: @fa-var-microphone; }
+.@{fa-css-prefix}-microphone-slash:before { content: @fa-var-microphone-slash; }
+.@{fa-css-prefix}-shield:before { content: @fa-var-shield; }
+.@{fa-css-prefix}-calendar-o:before { content: @fa-var-calendar-o; }
+.@{fa-css-prefix}-fire-extinguisher:before { content: @fa-var-fire-extinguisher; }
+.@{fa-css-prefix}-rocket:before { content: @fa-var-rocket; }
+.@{fa-css-prefix}-maxcdn:before { content: @fa-var-maxcdn; }
+.@{fa-css-prefix}-chevron-circle-left:before { content: @fa-var-chevron-circle-left; }
+.@{fa-css-prefix}-chevron-circle-right:before { content: @fa-var-chevron-circle-right; }
+.@{fa-css-prefix}-chevron-circle-up:before { content: @fa-var-chevron-circle-up; }
+.@{fa-css-prefix}-chevron-circle-down:before { content: @fa-var-chevron-circle-down; }
+.@{fa-css-prefix}-html5:before { content: @fa-var-html5; }
+.@{fa-css-prefix}-css3:before { content: @fa-var-css3; }
+.@{fa-css-prefix}-anchor:before { content: @fa-var-anchor; }
+.@{fa-css-prefix}-unlock-alt:before { content: @fa-var-unlock-alt; }
+.@{fa-css-prefix}-bullseye:before { content: @fa-var-bullseye; }
+.@{fa-css-prefix}-ellipsis-h:before { content: @fa-var-ellipsis-h; }
+.@{fa-css-prefix}-ellipsis-v:before { content: @fa-var-ellipsis-v; }
+.@{fa-css-prefix}-rss-square:before { content: @fa-var-rss-square; }
+.@{fa-css-prefix}-play-circle:before { content: @fa-var-play-circle; }
+.@{fa-css-prefix}-ticket:before { content: @fa-var-ticket; }
+.@{fa-css-prefix}-minus-square:before { content: @fa-var-minus-square; }
+.@{fa-css-prefix}-minus-square-o:before { content: @fa-var-minus-square-o; }
+.@{fa-css-prefix}-level-up:before { content: @fa-var-level-up; }
+.@{fa-css-prefix}-level-down:before { content: @fa-var-level-down; }
+.@{fa-css-prefix}-check-square:before { content: @fa-var-check-square; }
+.@{fa-css-prefix}-pencil-square:before { content: @fa-var-pencil-square; }
+.@{fa-css-prefix}-external-link-square:before { content: @fa-var-external-link-square; }
+.@{fa-css-prefix}-share-square:before { content: @fa-var-share-square; }
+.@{fa-css-prefix}-compass:before { content: @fa-var-compass; }
+.@{fa-css-prefix}-toggle-down:before,
+.@{fa-css-prefix}-caret-square-o-down:before { content: @fa-var-caret-square-o-down; }
+.@{fa-css-prefix}-toggle-up:before,
+.@{fa-css-prefix}-caret-square-o-up:before { content: @fa-var-caret-square-o-up; }
+.@{fa-css-prefix}-toggle-right:before,
+.@{fa-css-prefix}-caret-square-o-right:before { content: @fa-var-caret-square-o-right; }
+.@{fa-css-prefix}-euro:before,
+.@{fa-css-prefix}-eur:before { content: @fa-var-eur; }
+.@{fa-css-prefix}-gbp:before { content: @fa-var-gbp; }
+.@{fa-css-prefix}-dollar:before,
+.@{fa-css-prefix}-usd:before { content: @fa-var-usd; }
+.@{fa-css-prefix}-rupee:before,
+.@{fa-css-prefix}-inr:before { content: @fa-var-inr; }
+.@{fa-css-prefix}-cny:before,
+.@{fa-css-prefix}-rmb:before,
+.@{fa-css-prefix}-yen:before,
+.@{fa-css-prefix}-jpy:before { content: @fa-var-jpy; }
+.@{fa-css-prefix}-ruble:before,
+.@{fa-css-prefix}-rouble:before,
+.@{fa-css-prefix}-rub:before { content: @fa-var-rub; }
+.@{fa-css-prefix}-won:before,
+.@{fa-css-prefix}-krw:before { content: @fa-var-krw; }
+.@{fa-css-prefix}-bitcoin:before,
+.@{fa-css-prefix}-btc:before { content: @fa-var-btc; }
+.@{fa-css-prefix}-file:before { content: @fa-var-file; }
+.@{fa-css-prefix}-file-text:before { content: @fa-var-file-text; }
+.@{fa-css-prefix}-sort-alpha-asc:before { content: @fa-var-sort-alpha-asc; }
+.@{fa-css-prefix}-sort-alpha-desc:before { content: @fa-var-sort-alpha-desc; }
+.@{fa-css-prefix}-sort-amount-asc:before { content: @fa-var-sort-amount-asc; }
+.@{fa-css-prefix}-sort-amount-desc:before { content: @fa-var-sort-amount-desc; }
+.@{fa-css-prefix}-sort-numeric-asc:before { content: @fa-var-sort-numeric-asc; }
+.@{fa-css-prefix}-sort-numeric-desc:before { content: @fa-var-sort-numeric-desc; }
+.@{fa-css-prefix}-thumbs-up:before { content: @fa-var-thumbs-up; }
+.@{fa-css-prefix}-thumbs-down:before { content: @fa-var-thumbs-down; }
+.@{fa-css-prefix}-youtube-square:before { content: @fa-var-youtube-square; }
+.@{fa-css-prefix}-youtube:before { content: @fa-var-youtube; }
+.@{fa-css-prefix}-xing:before { content: @fa-var-xing; }
+.@{fa-css-prefix}-xing-square:before { content: @fa-var-xing-square; }
+.@{fa-css-prefix}-youtube-play:before { content: @fa-var-youtube-play; }
+.@{fa-css-prefix}-dropbox:before { content: @fa-var-dropbox; }
+.@{fa-css-prefix}-stack-overflow:before { content: @fa-var-stack-overflow; }
+.@{fa-css-prefix}-instagram:before { content: @fa-var-instagram; }
+.@{fa-css-prefix}-flickr:before { content: @fa-var-flickr; }
+.@{fa-css-prefix}-adn:before { content: @fa-var-adn; }
+.@{fa-css-prefix}-bitbucket:before { content: @fa-var-bitbucket; }
+.@{fa-css-prefix}-bitbucket-square:before { content: @fa-var-bitbucket-square; }
+.@{fa-css-prefix}-tumblr:before { content: @fa-var-tumblr; }
+.@{fa-css-prefix}-tumblr-square:before { content: @fa-var-tumblr-square; }
+.@{fa-css-prefix}-long-arrow-down:before { content: @fa-var-long-arrow-down; }
+.@{fa-css-prefix}-long-arrow-up:before { content: @fa-var-long-arrow-up; }
+.@{fa-css-prefix}-long-arrow-left:before { content: @fa-var-long-arrow-left; }
+.@{fa-css-prefix}-long-arrow-right:before { content: @fa-var-long-arrow-right; }
+.@{fa-css-prefix}-apple:before { content: @fa-var-apple; }
+.@{fa-css-prefix}-windows:before { content: @fa-var-windows; }
+.@{fa-css-prefix}-android:before { content: @fa-var-android; }
+.@{fa-css-prefix}-linux:before { content: @fa-var-linux; }
+.@{fa-css-prefix}-dribbble:before { content: @fa-var-dribbble; }
+.@{fa-css-prefix}-skype:before { content: @fa-var-skype; }
+.@{fa-css-prefix}-foursquare:before { content: @fa-var-foursquare; }
+.@{fa-css-prefix}-trello:before { content: @fa-var-trello; }
+.@{fa-css-prefix}-female:before { content: @fa-var-female; }
+.@{fa-css-prefix}-male:before { content: @fa-var-male; }
+.@{fa-css-prefix}-gittip:before,
+.@{fa-css-prefix}-gratipay:before { content: @fa-var-gratipay; }
+.@{fa-css-prefix}-sun-o:before { content: @fa-var-sun-o; }
+.@{fa-css-prefix}-moon-o:before { content: @fa-var-moon-o; }
+.@{fa-css-prefix}-archive:before { content: @fa-var-archive; }
+.@{fa-css-prefix}-bug:before { content: @fa-var-bug; }
+.@{fa-css-prefix}-vk:before { content: @fa-var-vk; }
+.@{fa-css-prefix}-weibo:before { content: @fa-var-weibo; }
+.@{fa-css-prefix}-renren:before { content: @fa-var-renren; }
+.@{fa-css-prefix}-pagelines:before { content: @fa-var-pagelines; }
+.@{fa-css-prefix}-stack-exchange:before { content: @fa-var-stack-exchange; }
+.@{fa-css-prefix}-arrow-circle-o-right:before { content: @fa-var-arrow-circle-o-right; }
+.@{fa-css-prefix}-arrow-circle-o-left:before { content: @fa-var-arrow-circle-o-left; }
+.@{fa-css-prefix}-toggle-left:before,
+.@{fa-css-prefix}-caret-square-o-left:before { content: @fa-var-caret-square-o-left; }
+.@{fa-css-prefix}-dot-circle-o:before { content: @fa-var-dot-circle-o; }
+.@{fa-css-prefix}-wheelchair:before { content: @fa-var-wheelchair; }
+.@{fa-css-prefix}-vimeo-square:before { content: @fa-var-vimeo-square; }
+.@{fa-css-prefix}-turkish-lira:before,
+.@{fa-css-prefix}-try:before { content: @fa-var-try; }
+.@{fa-css-prefix}-plus-square-o:before { content: @fa-var-plus-square-o; }
+.@{fa-css-prefix}-space-shuttle:before { content: @fa-var-space-shuttle; }
+.@{fa-css-prefix}-slack:before { content: @fa-var-slack; }
+.@{fa-css-prefix}-envelope-square:before { content: @fa-var-envelope-square; }
+.@{fa-css-prefix}-wordpress:before { content: @fa-var-wordpress; }
+.@{fa-css-prefix}-openid:before { content: @fa-var-openid; }
+.@{fa-css-prefix}-institution:before,
+.@{fa-css-prefix}-bank:before,
+.@{fa-css-prefix}-university:before { content: @fa-var-university; }
+.@{fa-css-prefix}-mortar-board:before,
+.@{fa-css-prefix}-graduation-cap:before { content: @fa-var-graduation-cap; }
+.@{fa-css-prefix}-yahoo:before { content: @fa-var-yahoo; }
+.@{fa-css-prefix}-google:before { content: @fa-var-google; }
+.@{fa-css-prefix}-reddit:before { content: @fa-var-reddit; }
+.@{fa-css-prefix}-reddit-square:before { content: @fa-var-reddit-square; }
+.@{fa-css-prefix}-stumbleupon-circle:before { content: @fa-var-stumbleupon-circle; }
+.@{fa-css-prefix}-stumbleupon:before { content: @fa-var-stumbleupon; }
+.@{fa-css-prefix}-delicious:before { content: @fa-var-delicious; }
+.@{fa-css-prefix}-digg:before { content: @fa-var-digg; }
+.@{fa-css-prefix}-pied-piper:before { content: @fa-var-pied-piper; }
+.@{fa-css-prefix}-pied-piper-alt:before { content: @fa-var-pied-piper-alt; }
+.@{fa-css-prefix}-drupal:before { content: @fa-var-drupal; }
+.@{fa-css-prefix}-joomla:before { content: @fa-var-joomla; }
+.@{fa-css-prefix}-language:before { content: @fa-var-language; }
+.@{fa-css-prefix}-fax:before { content: @fa-var-fax; }
+.@{fa-css-prefix}-building:before { content: @fa-var-building; }
+.@{fa-css-prefix}-child:before { content: @fa-var-child; }
+.@{fa-css-prefix}-paw:before { content: @fa-var-paw; }
+.@{fa-css-prefix}-spoon:before { content: @fa-var-spoon; }
+.@{fa-css-prefix}-cube:before { content: @fa-var-cube; }
+.@{fa-css-prefix}-cubes:before { content: @fa-var-cubes; }
+.@{fa-css-prefix}-behance:before { content: @fa-var-behance; }
+.@{fa-css-prefix}-behance-square:before { content: @fa-var-behance-square; }
+.@{fa-css-prefix}-steam:before { content: @fa-var-steam; }
+.@{fa-css-prefix}-steam-square:before { content: @fa-var-steam-square; }
+.@{fa-css-prefix}-recycle:before { content: @fa-var-recycle; }
+.@{fa-css-prefix}-automobile:before,
+.@{fa-css-prefix}-car:before { content: @fa-var-car; }
+.@{fa-css-prefix}-cab:before,
+.@{fa-css-prefix}-taxi:before { content: @fa-var-taxi; }
+.@{fa-css-prefix}-tree:before { content: @fa-var-tree; }
+.@{fa-css-prefix}-spotify:before { content: @fa-var-spotify; }
+.@{fa-css-prefix}-deviantart:before { content: @fa-var-deviantart; }
+.@{fa-css-prefix}-soundcloud:before { content: @fa-var-soundcloud; }
+.@{fa-css-prefix}-database:before { content: @fa-var-database; }
+.@{fa-css-prefix}-file-pdf-o:before { content: @fa-var-file-pdf-o; }
+.@{fa-css-prefix}-file-word-o:before { content: @fa-var-file-word-o; }
+.@{fa-css-prefix}-file-excel-o:before { content: @fa-var-file-excel-o; }
+.@{fa-css-prefix}-file-powerpoint-o:before { content: @fa-var-file-powerpoint-o; }
+.@{fa-css-prefix}-file-photo-o:before,
+.@{fa-css-prefix}-file-picture-o:before,
+.@{fa-css-prefix}-file-image-o:before { content: @fa-var-file-image-o; }
+.@{fa-css-prefix}-file-zip-o:before,
+.@{fa-css-prefix}-file-archive-o:before { content: @fa-var-file-archive-o; }
+.@{fa-css-prefix}-file-sound-o:before,
+.@{fa-css-prefix}-file-audio-o:before { content: @fa-var-file-audio-o; }
+.@{fa-css-prefix}-file-movie-o:before,
+.@{fa-css-prefix}-file-video-o:before { content: @fa-var-file-video-o; }
+.@{fa-css-prefix}-file-code-o:before { content: @fa-var-file-code-o; }
+.@{fa-css-prefix}-vine:before { content: @fa-var-vine; }
+.@{fa-css-prefix}-codepen:before { content: @fa-var-codepen; }
+.@{fa-css-prefix}-jsfiddle:before { content: @fa-var-jsfiddle; }
+.@{fa-css-prefix}-life-bouy:before,
+.@{fa-css-prefix}-life-buoy:before,
+.@{fa-css-prefix}-life-saver:before,
+.@{fa-css-prefix}-support:before,
+.@{fa-css-prefix}-life-ring:before { content: @fa-var-life-ring; }
+.@{fa-css-prefix}-circle-o-notch:before { content: @fa-var-circle-o-notch; }
+.@{fa-css-prefix}-ra:before,
+.@{fa-css-prefix}-rebel:before { content: @fa-var-rebel; }
+.@{fa-css-prefix}-ge:before,
+.@{fa-css-prefix}-empire:before { content: @fa-var-empire; }
+.@{fa-css-prefix}-git-square:before { content: @fa-var-git-square; }
+.@{fa-css-prefix}-git:before { content: @fa-var-git; }
+.@{fa-css-prefix}-y-combinator-square:before,
+.@{fa-css-prefix}-yc-square:before,
+.@{fa-css-prefix}-hacker-news:before { content: @fa-var-hacker-news; }
+.@{fa-css-prefix}-tencent-weibo:before { content: @fa-var-tencent-weibo; }
+.@{fa-css-prefix}-qq:before { content: @fa-var-qq; }
+.@{fa-css-prefix}-wechat:before,
+.@{fa-css-prefix}-weixin:before { content: @fa-var-weixin; }
+.@{fa-css-prefix}-send:before,
+.@{fa-css-prefix}-paper-plane:before { content: @fa-var-paper-plane; }
+.@{fa-css-prefix}-send-o:before,
+.@{fa-css-prefix}-paper-plane-o:before { content: @fa-var-paper-plane-o; }
+.@{fa-css-prefix}-history:before { content: @fa-var-history; }
+.@{fa-css-prefix}-circle-thin:before { content: @fa-var-circle-thin; }
+.@{fa-css-prefix}-header:before { content: @fa-var-header; }
+.@{fa-css-prefix}-paragraph:before { content: @fa-var-paragraph; }
+.@{fa-css-prefix}-sliders:before { content: @fa-var-sliders; }
+.@{fa-css-prefix}-share-alt:before { content: @fa-var-share-alt; }
+.@{fa-css-prefix}-share-alt-square:before { content: @fa-var-share-alt-square; }
+.@{fa-css-prefix}-bomb:before { content: @fa-var-bomb; }
+.@{fa-css-prefix}-soccer-ball-o:before,
+.@{fa-css-prefix}-futbol-o:before { content: @fa-var-futbol-o; }
+.@{fa-css-prefix}-tty:before { content: @fa-var-tty; }
+.@{fa-css-prefix}-binoculars:before { content: @fa-var-binoculars; }
+.@{fa-css-prefix}-plug:before { content: @fa-var-plug; }
+.@{fa-css-prefix}-slideshare:before { content: @fa-var-slideshare; }
+.@{fa-css-prefix}-twitch:before { content: @fa-var-twitch; }
+.@{fa-css-prefix}-yelp:before { content: @fa-var-yelp; }
+.@{fa-css-prefix}-newspaper-o:before { content: @fa-var-newspaper-o; }
+.@{fa-css-prefix}-wifi:before { content: @fa-var-wifi; }
+.@{fa-css-prefix}-calculator:before { content: @fa-var-calculator; }
+.@{fa-css-prefix}-paypal:before { content: @fa-var-paypal; }
+.@{fa-css-prefix}-google-wallet:before { content: @fa-var-google-wallet; }
+.@{fa-css-prefix}-cc-visa:before { content: @fa-var-cc-visa; }
+.@{fa-css-prefix}-cc-mastercard:before { content: @fa-var-cc-mastercard; }
+.@{fa-css-prefix}-cc-discover:before { content: @fa-var-cc-discover; }
+.@{fa-css-prefix}-cc-amex:before { content: @fa-var-cc-amex; }
+.@{fa-css-prefix}-cc-paypal:before { content: @fa-var-cc-paypal; }
+.@{fa-css-prefix}-cc-stripe:before { content: @fa-var-cc-stripe; }
+.@{fa-css-prefix}-bell-slash:before { content: @fa-var-bell-slash; }
+.@{fa-css-prefix}-bell-slash-o:before { content: @fa-var-bell-slash-o; }
+.@{fa-css-prefix}-trash:before { content: @fa-var-trash; }
+.@{fa-css-prefix}-copyright:before { content: @fa-var-copyright; }
+.@{fa-css-prefix}-at:before { content: @fa-var-at; }
+.@{fa-css-prefix}-eyedropper:before { content: @fa-var-eyedropper; }
+.@{fa-css-prefix}-paint-brush:before { content: @fa-var-paint-brush; }
+.@{fa-css-prefix}-birthday-cake:before { content: @fa-var-birthday-cake; }
+.@{fa-css-prefix}-area-chart:before { content: @fa-var-area-chart; }
+.@{fa-css-prefix}-pie-chart:before { content: @fa-var-pie-chart; }
+.@{fa-css-prefix}-line-chart:before { content: @fa-var-line-chart; }
+.@{fa-css-prefix}-lastfm:before { content: @fa-var-lastfm; }
+.@{fa-css-prefix}-lastfm-square:before { content: @fa-var-lastfm-square; }
+.@{fa-css-prefix}-toggle-off:before { content: @fa-var-toggle-off; }
+.@{fa-css-prefix}-toggle-on:before { content: @fa-var-toggle-on; }
+.@{fa-css-prefix}-bicycle:before { content: @fa-var-bicycle; }
+.@{fa-css-prefix}-bus:before { content: @fa-var-bus; }
+.@{fa-css-prefix}-ioxhost:before { content: @fa-var-ioxhost; }
+.@{fa-css-prefix}-angellist:before { content: @fa-var-angellist; }
+.@{fa-css-prefix}-cc:before { content: @fa-var-cc; }
+.@{fa-css-prefix}-shekel:before,
+.@{fa-css-prefix}-sheqel:before,
+.@{fa-css-prefix}-ils:before { content: @fa-var-ils; }
+.@{fa-css-prefix}-meanpath:before { content: @fa-var-meanpath; }
+.@{fa-css-prefix}-buysellads:before { content: @fa-var-buysellads; }
+.@{fa-css-prefix}-connectdevelop:before { content: @fa-var-connectdevelop; }
+.@{fa-css-prefix}-dashcube:before { content: @fa-var-dashcube; }
+.@{fa-css-prefix}-forumbee:before { content: @fa-var-forumbee; }
+.@{fa-css-prefix}-leanpub:before { content: @fa-var-leanpub; }
+.@{fa-css-prefix}-sellsy:before { content: @fa-var-sellsy; }
+.@{fa-css-prefix}-shirtsinbulk:before { content: @fa-var-shirtsinbulk; }
+.@{fa-css-prefix}-simplybuilt:before { content: @fa-var-simplybuilt; }
+.@{fa-css-prefix}-skyatlas:before { content: @fa-var-skyatlas; }
+.@{fa-css-prefix}-cart-plus:before { content: @fa-var-cart-plus; }
+.@{fa-css-prefix}-cart-arrow-down:before { content: @fa-var-cart-arrow-down; }
+.@{fa-css-prefix}-diamond:before { content: @fa-var-diamond; }
+.@{fa-css-prefix}-ship:before { content: @fa-var-ship; }
+.@{fa-css-prefix}-user-secret:before { content: @fa-var-user-secret; }
+.@{fa-css-prefix}-motorcycle:before { content: @fa-var-motorcycle; }
+.@{fa-css-prefix}-street-view:before { content: @fa-var-street-view; }
+.@{fa-css-prefix}-heartbeat:before { content: @fa-var-heartbeat; }
+.@{fa-css-prefix}-venus:before { content: @fa-var-venus; }
+.@{fa-css-prefix}-mars:before { content: @fa-var-mars; }
+.@{fa-css-prefix}-mercury:before { content: @fa-var-mercury; }
+.@{fa-css-prefix}-intersex:before,
+.@{fa-css-prefix}-transgender:before { content: @fa-var-transgender; }
+.@{fa-css-prefix}-transgender-alt:before { content: @fa-var-transgender-alt; }
+.@{fa-css-prefix}-venus-double:before { content: @fa-var-venus-double; }
+.@{fa-css-prefix}-mars-double:before { content: @fa-var-mars-double; }
+.@{fa-css-prefix}-venus-mars:before { content: @fa-var-venus-mars; }
+.@{fa-css-prefix}-mars-stroke:before { content: @fa-var-mars-stroke; }
+.@{fa-css-prefix}-mars-stroke-v:before { content: @fa-var-mars-stroke-v; }
+.@{fa-css-prefix}-mars-stroke-h:before { content: @fa-var-mars-stroke-h; }
+.@{fa-css-prefix}-neuter:before { content: @fa-var-neuter; }
+.@{fa-css-prefix}-genderless:before { content: @fa-var-genderless; }
+.@{fa-css-prefix}-facebook-official:before { content: @fa-var-facebook-official; }
+.@{fa-css-prefix}-pinterest-p:before { content: @fa-var-pinterest-p; }
+.@{fa-css-prefix}-whatsapp:before { content: @fa-var-whatsapp; }
+.@{fa-css-prefix}-server:before { content: @fa-var-server; }
+.@{fa-css-prefix}-user-plus:before { content: @fa-var-user-plus; }
+.@{fa-css-prefix}-user-times:before { content: @fa-var-user-times; }
+.@{fa-css-prefix}-hotel:before,
+.@{fa-css-prefix}-bed:before { content: @fa-var-bed; }
+.@{fa-css-prefix}-viacoin:before { content: @fa-var-viacoin; }
+.@{fa-css-prefix}-train:before { content: @fa-var-train; }
+.@{fa-css-prefix}-subway:before { content: @fa-var-subway; }
+.@{fa-css-prefix}-medium:before { content: @fa-var-medium; }
+.@{fa-css-prefix}-yc:before,
+.@{fa-css-prefix}-y-combinator:before { content: @fa-var-y-combinator; }
+.@{fa-css-prefix}-optin-monster:before { content: @fa-var-optin-monster; }
+.@{fa-css-prefix}-opencart:before { content: @fa-var-opencart; }
+.@{fa-css-prefix}-expeditedssl:before { content: @fa-var-expeditedssl; }
+.@{fa-css-prefix}-battery-4:before,
+.@{fa-css-prefix}-battery-full:before { content: @fa-var-battery-full; }
+.@{fa-css-prefix}-battery-3:before,
+.@{fa-css-prefix}-battery-three-quarters:before { content: @fa-var-battery-three-quarters; }
+.@{fa-css-prefix}-battery-2:before,
+.@{fa-css-prefix}-battery-half:before { content: @fa-var-battery-half; }
+.@{fa-css-prefix}-battery-1:before,
+.@{fa-css-prefix}-battery-quarter:before { content: @fa-var-battery-quarter; }
+.@{fa-css-prefix}-battery-0:before,
+.@{fa-css-prefix}-battery-empty:before { content: @fa-var-battery-empty; }
+.@{fa-css-prefix}-mouse-pointer:before { content: @fa-var-mouse-pointer; }
+.@{fa-css-prefix}-i-cursor:before { content: @fa-var-i-cursor; }
+.@{fa-css-prefix}-object-group:before { content: @fa-var-object-group; }
+.@{fa-css-prefix}-object-ungroup:before { content: @fa-var-object-ungroup; }
+.@{fa-css-prefix}-sticky-note:before { content: @fa-var-sticky-note; }
+.@{fa-css-prefix}-sticky-note-o:before { content: @fa-var-sticky-note-o; }
+.@{fa-css-prefix}-cc-jcb:before { content: @fa-var-cc-jcb; }
+.@{fa-css-prefix}-cc-diners-club:before { content: @fa-var-cc-diners-club; }
+.@{fa-css-prefix}-clone:before { content: @fa-var-clone; }
+.@{fa-css-prefix}-balance-scale:before { content: @fa-var-balance-scale; }
+.@{fa-css-prefix}-hourglass-o:before { content: @fa-var-hourglass-o; }
+.@{fa-css-prefix}-hourglass-1:before,
+.@{fa-css-prefix}-hourglass-start:before { content: @fa-var-hourglass-start; }
+.@{fa-css-prefix}-hourglass-2:before,
+.@{fa-css-prefix}-hourglass-half:before { content: @fa-var-hourglass-half; }
+.@{fa-css-prefix}-hourglass-3:before,
+.@{fa-css-prefix}-hourglass-end:before { content: @fa-var-hourglass-end; }
+.@{fa-css-prefix}-hourglass:before { content: @fa-var-hourglass; }
+.@{fa-css-prefix}-hand-grab-o:before,
+.@{fa-css-prefix}-hand-rock-o:before { content: @fa-var-hand-rock-o; }
+.@{fa-css-prefix}-hand-stop-o:before,
+.@{fa-css-prefix}-hand-paper-o:before { content: @fa-var-hand-paper-o; }
+.@{fa-css-prefix}-hand-scissors-o:before { content: @fa-var-hand-scissors-o; }
+.@{fa-css-prefix}-hand-lizard-o:before { content: @fa-var-hand-lizard-o; }
+.@{fa-css-prefix}-hand-spock-o:before { content: @fa-var-hand-spock-o; }
+.@{fa-css-prefix}-hand-pointer-o:before { content: @fa-var-hand-pointer-o; }
+.@{fa-css-prefix}-hand-peace-o:before { content: @fa-var-hand-peace-o; }
+.@{fa-css-prefix}-trademark:before { content: @fa-var-trademark; }
+.@{fa-css-prefix}-registered:before { content: @fa-var-registered; }
+.@{fa-css-prefix}-creative-commons:before { content: @fa-var-creative-commons; }
+.@{fa-css-prefix}-gg:before { content: @fa-var-gg; }
+.@{fa-css-prefix}-gg-circle:before { content: @fa-var-gg-circle; }
+.@{fa-css-prefix}-tripadvisor:before { content: @fa-var-tripadvisor; }
+.@{fa-css-prefix}-odnoklassniki:before { content: @fa-var-odnoklassniki; }
+.@{fa-css-prefix}-odnoklassniki-square:before { content: @fa-var-odnoklassniki-square; }
+.@{fa-css-prefix}-get-pocket:before { content: @fa-var-get-pocket; }
+.@{fa-css-prefix}-wikipedia-w:before { content: @fa-var-wikipedia-w; }
+.@{fa-css-prefix}-safari:before { content: @fa-var-safari; }
+.@{fa-css-prefix}-chrome:before { content: @fa-var-chrome; }
+.@{fa-css-prefix}-firefox:before { content: @fa-var-firefox; }
+.@{fa-css-prefix}-opera:before { content: @fa-var-opera; }
+.@{fa-css-prefix}-internet-explorer:before { content: @fa-var-internet-explorer; }
+.@{fa-css-prefix}-tv:before,
+.@{fa-css-prefix}-television:before { content: @fa-var-television; }
+.@{fa-css-prefix}-contao:before { content: @fa-var-contao; }
+.@{fa-css-prefix}-500px:before { content: @fa-var-500px; }
+.@{fa-css-prefix}-amazon:before { content: @fa-var-amazon; }
+.@{fa-css-prefix}-calendar-plus-o:before { content: @fa-var-calendar-plus-o; }
+.@{fa-css-prefix}-calendar-minus-o:before { content: @fa-var-calendar-minus-o; }
+.@{fa-css-prefix}-calendar-times-o:before { content: @fa-var-calendar-times-o; }
+.@{fa-css-prefix}-calendar-check-o:before { content: @fa-var-calendar-check-o; }
+.@{fa-css-prefix}-industry:before { content: @fa-var-industry; }
+.@{fa-css-prefix}-map-pin:before { content: @fa-var-map-pin; }
+.@{fa-css-prefix}-map-signs:before { content: @fa-var-map-signs; }
+.@{fa-css-prefix}-map-o:before { content: @fa-var-map-o; }
+.@{fa-css-prefix}-map:before { content: @fa-var-map; }
+.@{fa-css-prefix}-commenting:before { content: @fa-var-commenting; }
+.@{fa-css-prefix}-commenting-o:before { content: @fa-var-commenting-o; }
+.@{fa-css-prefix}-houzz:before { content: @fa-var-houzz; }
+.@{fa-css-prefix}-vimeo:before { content: @fa-var-vimeo; }
+.@{fa-css-prefix}-black-tie:before { content: @fa-var-black-tie; }
+.@{fa-css-prefix}-fonticons:before { content: @fa-var-fonticons; }
+.@{fa-css-prefix}-reddit-alien:before { content: @fa-var-reddit-alien; }
+.@{fa-css-prefix}-edge:before { content: @fa-var-edge; }
+.@{fa-css-prefix}-credit-card-alt:before { content: @fa-var-credit-card-alt; }
+.@{fa-css-prefix}-codiepie:before { content: @fa-var-codiepie; }
+.@{fa-css-prefix}-modx:before { content: @fa-var-modx; }
+.@{fa-css-prefix}-fort-awesome:before { content: @fa-var-fort-awesome; }
+.@{fa-css-prefix}-usb:before { content: @fa-var-usb; }
+.@{fa-css-prefix}-product-hunt:before { content: @fa-var-product-hunt; }
+.@{fa-css-prefix}-mixcloud:before { content: @fa-var-mixcloud; }
+.@{fa-css-prefix}-scribd:before { content: @fa-var-scribd; }
+.@{fa-css-prefix}-pause-circle:before { content: @fa-var-pause-circle; }
+.@{fa-css-prefix}-pause-circle-o:before { content: @fa-var-pause-circle-o; }
+.@{fa-css-prefix}-stop-circle:before { content: @fa-var-stop-circle; }
+.@{fa-css-prefix}-stop-circle-o:before { content: @fa-var-stop-circle-o; }
+.@{fa-css-prefix}-shopping-bag:before { content: @fa-var-shopping-bag; }
+.@{fa-css-prefix}-shopping-basket:before { content: @fa-var-shopping-basket; }
+.@{fa-css-prefix}-hashtag:before { content: @fa-var-hashtag; }
+.@{fa-css-prefix}-bluetooth:before { content: @fa-var-bluetooth; }
+.@{fa-css-prefix}-bluetooth-b:before { content: @fa-var-bluetooth-b; }
+.@{fa-css-prefix}-percent:before { content: @fa-var-percent; }
diff --git a/web/pgadmin/static/vendor/font-awesome/less/larger.less b/web/pgadmin/static/vendor/font-awesome/less/larger.less
new file mode 100644
index 000000000..c9d646770
--- /dev/null
+++ b/web/pgadmin/static/vendor/font-awesome/less/larger.less
@@ -0,0 +1,13 @@
+// Icon Sizes
+// -------------------------
+
+/* makes the font 33% larger relative to the icon container */
+.@{fa-css-prefix}-lg {
+ font-size: (4em / 3);
+ line-height: (3em / 4);
+ vertical-align: -15%;
+}
+.@{fa-css-prefix}-2x { font-size: 2em; }
+.@{fa-css-prefix}-3x { font-size: 3em; }
+.@{fa-css-prefix}-4x { font-size: 4em; }
+.@{fa-css-prefix}-5x { font-size: 5em; }
diff --git a/web/pgadmin/static/vendor/font-awesome/less/list.less b/web/pgadmin/static/vendor/font-awesome/less/list.less
new file mode 100644
index 000000000..0b440382f
--- /dev/null
+++ b/web/pgadmin/static/vendor/font-awesome/less/list.less
@@ -0,0 +1,19 @@
+// List Icons
+// -------------------------
+
+.@{fa-css-prefix}-ul {
+ padding-left: 0;
+ margin-left: @fa-li-width;
+ list-style-type: none;
+ > li { position: relative; }
+}
+.@{fa-css-prefix}-li {
+ position: absolute;
+ left: -@fa-li-width;
+ width: @fa-li-width;
+ top: (2em / 14);
+ text-align: center;
+ &.@{fa-css-prefix}-lg {
+ left: (-@fa-li-width + (4em / 14));
+ }
+}
diff --git a/web/pgadmin/static/vendor/font-awesome/less/mixins.less b/web/pgadmin/static/vendor/font-awesome/less/mixins.less
new file mode 100644
index 000000000..d5a43a145
--- /dev/null
+++ b/web/pgadmin/static/vendor/font-awesome/less/mixins.less
@@ -0,0 +1,26 @@
+// Mixins
+// --------------------------
+
+.fa-icon() {
+ display: inline-block;
+ font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration
+ font-size: inherit; // can't have font-size inherit on line above, so need to override
+ text-rendering: auto; // optimizelegibility throws things off #1094
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+
+}
+
+.fa-icon-rotate(@degrees, @rotation) {
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=@rotation);
+ -webkit-transform: rotate(@degrees);
+ -ms-transform: rotate(@degrees);
+ transform: rotate(@degrees);
+}
+
+.fa-icon-flip(@horiz, @vert, @rotation) {
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=@rotation, mirror=1);
+ -webkit-transform: scale(@horiz, @vert);
+ -ms-transform: scale(@horiz, @vert);
+ transform: scale(@horiz, @vert);
+}
diff --git a/web/pgadmin/static/vendor/font-awesome/less/path.less b/web/pgadmin/static/vendor/font-awesome/less/path.less
new file mode 100644
index 000000000..9211e6659
--- /dev/null
+++ b/web/pgadmin/static/vendor/font-awesome/less/path.less
@@ -0,0 +1,15 @@
+/* FONT PATH
+ * -------------------------- */
+
+@font-face {
+ font-family: 'FontAwesome';
+ src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}');
+ src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'),
+ url('@{fa-font-path}/fontawesome-webfont.woff2?v=@{fa-version}') format('woff2'),
+ url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'),
+ url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'),
+ url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg');
+// src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts
+ font-weight: normal;
+ font-style: normal;
+}
diff --git a/web/pgadmin/static/vendor/font-awesome/less/rotated-flipped.less b/web/pgadmin/static/vendor/font-awesome/less/rotated-flipped.less
new file mode 100644
index 000000000..f6ba81475
--- /dev/null
+++ b/web/pgadmin/static/vendor/font-awesome/less/rotated-flipped.less
@@ -0,0 +1,20 @@
+// Rotated & Flipped Icons
+// -------------------------
+
+.@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); }
+.@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); }
+.@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); }
+
+.@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); }
+.@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); }
+
+// Hook for IE8-9
+// -------------------------
+
+:root .@{fa-css-prefix}-rotate-90,
+:root .@{fa-css-prefix}-rotate-180,
+:root .@{fa-css-prefix}-rotate-270,
+:root .@{fa-css-prefix}-flip-horizontal,
+:root .@{fa-css-prefix}-flip-vertical {
+ filter: none;
+}
diff --git a/web/pgadmin/static/vendor/font-awesome/less/stacked.less b/web/pgadmin/static/vendor/font-awesome/less/stacked.less
new file mode 100644
index 000000000..fc53fb0e7
--- /dev/null
+++ b/web/pgadmin/static/vendor/font-awesome/less/stacked.less
@@ -0,0 +1,20 @@
+// Stacked Icons
+// -------------------------
+
+.@{fa-css-prefix}-stack {
+ position: relative;
+ display: inline-block;
+ width: 2em;
+ height: 2em;
+ line-height: 2em;
+ vertical-align: middle;
+}
+.@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x {
+ position: absolute;
+ left: 0;
+ width: 100%;
+ text-align: center;
+}
+.@{fa-css-prefix}-stack-1x { line-height: inherit; }
+.@{fa-css-prefix}-stack-2x { font-size: 2em; }
+.@{fa-css-prefix}-inverse { color: @fa-inverse; }
diff --git a/web/pgadmin/static/vendor/font-awesome/less/variables.less b/web/pgadmin/static/vendor/font-awesome/less/variables.less
new file mode 100644
index 000000000..37c4b80ab
--- /dev/null
+++ b/web/pgadmin/static/vendor/font-awesome/less/variables.less
@@ -0,0 +1,708 @@
+// Variables
+// --------------------------
+
+@fa-font-path: "../fonts";
+@fa-font-size-base: 14px;
+@fa-line-height-base: 1;
+//@fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.5.0/fonts"; // for referencing Bootstrap CDN font files directly
+@fa-css-prefix: fa;
+@fa-version: "4.5.0";
+@fa-border-color: #eee;
+@fa-inverse: #fff;
+@fa-li-width: (30em / 14);
+
+@fa-var-500px: "\f26e";
+@fa-var-adjust: "\f042";
+@fa-var-adn: "\f170";
+@fa-var-align-center: "\f037";
+@fa-var-align-justify: "\f039";
+@fa-var-align-left: "\f036";
+@fa-var-align-right: "\f038";
+@fa-var-amazon: "\f270";
+@fa-var-ambulance: "\f0f9";
+@fa-var-anchor: "\f13d";
+@fa-var-android: "\f17b";
+@fa-var-angellist: "\f209";
+@fa-var-angle-double-down: "\f103";
+@fa-var-angle-double-left: "\f100";
+@fa-var-angle-double-right: "\f101";
+@fa-var-angle-double-up: "\f102";
+@fa-var-angle-down: "\f107";
+@fa-var-angle-left: "\f104";
+@fa-var-angle-right: "\f105";
+@fa-var-angle-up: "\f106";
+@fa-var-apple: "\f179";
+@fa-var-archive: "\f187";
+@fa-var-area-chart: "\f1fe";
+@fa-var-arrow-circle-down: "\f0ab";
+@fa-var-arrow-circle-left: "\f0a8";
+@fa-var-arrow-circle-o-down: "\f01a";
+@fa-var-arrow-circle-o-left: "\f190";
+@fa-var-arrow-circle-o-right: "\f18e";
+@fa-var-arrow-circle-o-up: "\f01b";
+@fa-var-arrow-circle-right: "\f0a9";
+@fa-var-arrow-circle-up: "\f0aa";
+@fa-var-arrow-down: "\f063";
+@fa-var-arrow-left: "\f060";
+@fa-var-arrow-right: "\f061";
+@fa-var-arrow-up: "\f062";
+@fa-var-arrows: "\f047";
+@fa-var-arrows-alt: "\f0b2";
+@fa-var-arrows-h: "\f07e";
+@fa-var-arrows-v: "\f07d";
+@fa-var-asterisk: "\f069";
+@fa-var-at: "\f1fa";
+@fa-var-automobile: "\f1b9";
+@fa-var-backward: "\f04a";
+@fa-var-balance-scale: "\f24e";
+@fa-var-ban: "\f05e";
+@fa-var-bank: "\f19c";
+@fa-var-bar-chart: "\f080";
+@fa-var-bar-chart-o: "\f080";
+@fa-var-barcode: "\f02a";
+@fa-var-bars: "\f0c9";
+@fa-var-battery-0: "\f244";
+@fa-var-battery-1: "\f243";
+@fa-var-battery-2: "\f242";
+@fa-var-battery-3: "\f241";
+@fa-var-battery-4: "\f240";
+@fa-var-battery-empty: "\f244";
+@fa-var-battery-full: "\f240";
+@fa-var-battery-half: "\f242";
+@fa-var-battery-quarter: "\f243";
+@fa-var-battery-three-quarters: "\f241";
+@fa-var-bed: "\f236";
+@fa-var-beer: "\f0fc";
+@fa-var-behance: "\f1b4";
+@fa-var-behance-square: "\f1b5";
+@fa-var-bell: "\f0f3";
+@fa-var-bell-o: "\f0a2";
+@fa-var-bell-slash: "\f1f6";
+@fa-var-bell-slash-o: "\f1f7";
+@fa-var-bicycle: "\f206";
+@fa-var-binoculars: "\f1e5";
+@fa-var-birthday-cake: "\f1fd";
+@fa-var-bitbucket: "\f171";
+@fa-var-bitbucket-square: "\f172";
+@fa-var-bitcoin: "\f15a";
+@fa-var-black-tie: "\f27e";
+@fa-var-bluetooth: "\f293";
+@fa-var-bluetooth-b: "\f294";
+@fa-var-bold: "\f032";
+@fa-var-bolt: "\f0e7";
+@fa-var-bomb: "\f1e2";
+@fa-var-book: "\f02d";
+@fa-var-bookmark: "\f02e";
+@fa-var-bookmark-o: "\f097";
+@fa-var-briefcase: "\f0b1";
+@fa-var-btc: "\f15a";
+@fa-var-bug: "\f188";
+@fa-var-building: "\f1ad";
+@fa-var-building-o: "\f0f7";
+@fa-var-bullhorn: "\f0a1";
+@fa-var-bullseye: "\f140";
+@fa-var-bus: "\f207";
+@fa-var-buysellads: "\f20d";
+@fa-var-cab: "\f1ba";
+@fa-var-calculator: "\f1ec";
+@fa-var-calendar: "\f073";
+@fa-var-calendar-check-o: "\f274";
+@fa-var-calendar-minus-o: "\f272";
+@fa-var-calendar-o: "\f133";
+@fa-var-calendar-plus-o: "\f271";
+@fa-var-calendar-times-o: "\f273";
+@fa-var-camera: "\f030";
+@fa-var-camera-retro: "\f083";
+@fa-var-car: "\f1b9";
+@fa-var-caret-down: "\f0d7";
+@fa-var-caret-left: "\f0d9";
+@fa-var-caret-right: "\f0da";
+@fa-var-caret-square-o-down: "\f150";
+@fa-var-caret-square-o-left: "\f191";
+@fa-var-caret-square-o-right: "\f152";
+@fa-var-caret-square-o-up: "\f151";
+@fa-var-caret-up: "\f0d8";
+@fa-var-cart-arrow-down: "\f218";
+@fa-var-cart-plus: "\f217";
+@fa-var-cc: "\f20a";
+@fa-var-cc-amex: "\f1f3";
+@fa-var-cc-diners-club: "\f24c";
+@fa-var-cc-discover: "\f1f2";
+@fa-var-cc-jcb: "\f24b";
+@fa-var-cc-mastercard: "\f1f1";
+@fa-var-cc-paypal: "\f1f4";
+@fa-var-cc-stripe: "\f1f5";
+@fa-var-cc-visa: "\f1f0";
+@fa-var-certificate: "\f0a3";
+@fa-var-chain: "\f0c1";
+@fa-var-chain-broken: "\f127";
+@fa-var-check: "\f00c";
+@fa-var-check-circle: "\f058";
+@fa-var-check-circle-o: "\f05d";
+@fa-var-check-square: "\f14a";
+@fa-var-check-square-o: "\f046";
+@fa-var-chevron-circle-down: "\f13a";
+@fa-var-chevron-circle-left: "\f137";
+@fa-var-chevron-circle-right: "\f138";
+@fa-var-chevron-circle-up: "\f139";
+@fa-var-chevron-down: "\f078";
+@fa-var-chevron-left: "\f053";
+@fa-var-chevron-right: "\f054";
+@fa-var-chevron-up: "\f077";
+@fa-var-child: "\f1ae";
+@fa-var-chrome: "\f268";
+@fa-var-circle: "\f111";
+@fa-var-circle-o: "\f10c";
+@fa-var-circle-o-notch: "\f1ce";
+@fa-var-circle-thin: "\f1db";
+@fa-var-clipboard: "\f0ea";
+@fa-var-clock-o: "\f017";
+@fa-var-clone: "\f24d";
+@fa-var-close: "\f00d";
+@fa-var-cloud: "\f0c2";
+@fa-var-cloud-download: "\f0ed";
+@fa-var-cloud-upload: "\f0ee";
+@fa-var-cny: "\f157";
+@fa-var-code: "\f121";
+@fa-var-code-fork: "\f126";
+@fa-var-codepen: "\f1cb";
+@fa-var-codiepie: "\f284";
+@fa-var-coffee: "\f0f4";
+@fa-var-cog: "\f013";
+@fa-var-cogs: "\f085";
+@fa-var-columns: "\f0db";
+@fa-var-comment: "\f075";
+@fa-var-comment-o: "\f0e5";
+@fa-var-commenting: "\f27a";
+@fa-var-commenting-o: "\f27b";
+@fa-var-comments: "\f086";
+@fa-var-comments-o: "\f0e6";
+@fa-var-compass: "\f14e";
+@fa-var-compress: "\f066";
+@fa-var-connectdevelop: "\f20e";
+@fa-var-contao: "\f26d";
+@fa-var-copy: "\f0c5";
+@fa-var-copyright: "\f1f9";
+@fa-var-creative-commons: "\f25e";
+@fa-var-credit-card: "\f09d";
+@fa-var-credit-card-alt: "\f283";
+@fa-var-crop: "\f125";
+@fa-var-crosshairs: "\f05b";
+@fa-var-css3: "\f13c";
+@fa-var-cube: "\f1b2";
+@fa-var-cubes: "\f1b3";
+@fa-var-cut: "\f0c4";
+@fa-var-cutlery: "\f0f5";
+@fa-var-dashboard: "\f0e4";
+@fa-var-dashcube: "\f210";
+@fa-var-database: "\f1c0";
+@fa-var-dedent: "\f03b";
+@fa-var-delicious: "\f1a5";
+@fa-var-desktop: "\f108";
+@fa-var-deviantart: "\f1bd";
+@fa-var-diamond: "\f219";
+@fa-var-digg: "\f1a6";
+@fa-var-dollar: "\f155";
+@fa-var-dot-circle-o: "\f192";
+@fa-var-download: "\f019";
+@fa-var-dribbble: "\f17d";
+@fa-var-dropbox: "\f16b";
+@fa-var-drupal: "\f1a9";
+@fa-var-edge: "\f282";
+@fa-var-edit: "\f044";
+@fa-var-eject: "\f052";
+@fa-var-ellipsis-h: "\f141";
+@fa-var-ellipsis-v: "\f142";
+@fa-var-empire: "\f1d1";
+@fa-var-envelope: "\f0e0";
+@fa-var-envelope-o: "\f003";
+@fa-var-envelope-square: "\f199";
+@fa-var-eraser: "\f12d";
+@fa-var-eur: "\f153";
+@fa-var-euro: "\f153";
+@fa-var-exchange: "\f0ec";
+@fa-var-exclamation: "\f12a";
+@fa-var-exclamation-circle: "\f06a";
+@fa-var-exclamation-triangle: "\f071";
+@fa-var-expand: "\f065";
+@fa-var-expeditedssl: "\f23e";
+@fa-var-external-link: "\f08e";
+@fa-var-external-link-square: "\f14c";
+@fa-var-eye: "\f06e";
+@fa-var-eye-slash: "\f070";
+@fa-var-eyedropper: "\f1fb";
+@fa-var-facebook: "\f09a";
+@fa-var-facebook-f: "\f09a";
+@fa-var-facebook-official: "\f230";
+@fa-var-facebook-square: "\f082";
+@fa-var-fast-backward: "\f049";
+@fa-var-fast-forward: "\f050";
+@fa-var-fax: "\f1ac";
+@fa-var-feed: "\f09e";
+@fa-var-female: "\f182";
+@fa-var-fighter-jet: "\f0fb";
+@fa-var-file: "\f15b";
+@fa-var-file-archive-o: "\f1c6";
+@fa-var-file-audio-o: "\f1c7";
+@fa-var-file-code-o: "\f1c9";
+@fa-var-file-excel-o: "\f1c3";
+@fa-var-file-image-o: "\f1c5";
+@fa-var-file-movie-o: "\f1c8";
+@fa-var-file-o: "\f016";
+@fa-var-file-pdf-o: "\f1c1";
+@fa-var-file-photo-o: "\f1c5";
+@fa-var-file-picture-o: "\f1c5";
+@fa-var-file-powerpoint-o: "\f1c4";
+@fa-var-file-sound-o: "\f1c7";
+@fa-var-file-text: "\f15c";
+@fa-var-file-text-o: "\f0f6";
+@fa-var-file-video-o: "\f1c8";
+@fa-var-file-word-o: "\f1c2";
+@fa-var-file-zip-o: "\f1c6";
+@fa-var-files-o: "\f0c5";
+@fa-var-film: "\f008";
+@fa-var-filter: "\f0b0";
+@fa-var-fire: "\f06d";
+@fa-var-fire-extinguisher: "\f134";
+@fa-var-firefox: "\f269";
+@fa-var-flag: "\f024";
+@fa-var-flag-checkered: "\f11e";
+@fa-var-flag-o: "\f11d";
+@fa-var-flash: "\f0e7";
+@fa-var-flask: "\f0c3";
+@fa-var-flickr: "\f16e";
+@fa-var-floppy-o: "\f0c7";
+@fa-var-folder: "\f07b";
+@fa-var-folder-o: "\f114";
+@fa-var-folder-open: "\f07c";
+@fa-var-folder-open-o: "\f115";
+@fa-var-font: "\f031";
+@fa-var-fonticons: "\f280";
+@fa-var-fort-awesome: "\f286";
+@fa-var-forumbee: "\f211";
+@fa-var-forward: "\f04e";
+@fa-var-foursquare: "\f180";
+@fa-var-frown-o: "\f119";
+@fa-var-futbol-o: "\f1e3";
+@fa-var-gamepad: "\f11b";
+@fa-var-gavel: "\f0e3";
+@fa-var-gbp: "\f154";
+@fa-var-ge: "\f1d1";
+@fa-var-gear: "\f013";
+@fa-var-gears: "\f085";
+@fa-var-genderless: "\f22d";
+@fa-var-get-pocket: "\f265";
+@fa-var-gg: "\f260";
+@fa-var-gg-circle: "\f261";
+@fa-var-gift: "\f06b";
+@fa-var-git: "\f1d3";
+@fa-var-git-square: "\f1d2";
+@fa-var-github: "\f09b";
+@fa-var-github-alt: "\f113";
+@fa-var-github-square: "\f092";
+@fa-var-gittip: "\f184";
+@fa-var-glass: "\f000";
+@fa-var-globe: "\f0ac";
+@fa-var-google: "\f1a0";
+@fa-var-google-plus: "\f0d5";
+@fa-var-google-plus-square: "\f0d4";
+@fa-var-google-wallet: "\f1ee";
+@fa-var-graduation-cap: "\f19d";
+@fa-var-gratipay: "\f184";
+@fa-var-group: "\f0c0";
+@fa-var-h-square: "\f0fd";
+@fa-var-hacker-news: "\f1d4";
+@fa-var-hand-grab-o: "\f255";
+@fa-var-hand-lizard-o: "\f258";
+@fa-var-hand-o-down: "\f0a7";
+@fa-var-hand-o-left: "\f0a5";
+@fa-var-hand-o-right: "\f0a4";
+@fa-var-hand-o-up: "\f0a6";
+@fa-var-hand-paper-o: "\f256";
+@fa-var-hand-peace-o: "\f25b";
+@fa-var-hand-pointer-o: "\f25a";
+@fa-var-hand-rock-o: "\f255";
+@fa-var-hand-scissors-o: "\f257";
+@fa-var-hand-spock-o: "\f259";
+@fa-var-hand-stop-o: "\f256";
+@fa-var-hashtag: "\f292";
+@fa-var-hdd-o: "\f0a0";
+@fa-var-header: "\f1dc";
+@fa-var-headphones: "\f025";
+@fa-var-heart: "\f004";
+@fa-var-heart-o: "\f08a";
+@fa-var-heartbeat: "\f21e";
+@fa-var-history: "\f1da";
+@fa-var-home: "\f015";
+@fa-var-hospital-o: "\f0f8";
+@fa-var-hotel: "\f236";
+@fa-var-hourglass: "\f254";
+@fa-var-hourglass-1: "\f251";
+@fa-var-hourglass-2: "\f252";
+@fa-var-hourglass-3: "\f253";
+@fa-var-hourglass-end: "\f253";
+@fa-var-hourglass-half: "\f252";
+@fa-var-hourglass-o: "\f250";
+@fa-var-hourglass-start: "\f251";
+@fa-var-houzz: "\f27c";
+@fa-var-html5: "\f13b";
+@fa-var-i-cursor: "\f246";
+@fa-var-ils: "\f20b";
+@fa-var-image: "\f03e";
+@fa-var-inbox: "\f01c";
+@fa-var-indent: "\f03c";
+@fa-var-industry: "\f275";
+@fa-var-info: "\f129";
+@fa-var-info-circle: "\f05a";
+@fa-var-inr: "\f156";
+@fa-var-instagram: "\f16d";
+@fa-var-institution: "\f19c";
+@fa-var-internet-explorer: "\f26b";
+@fa-var-intersex: "\f224";
+@fa-var-ioxhost: "\f208";
+@fa-var-italic: "\f033";
+@fa-var-joomla: "\f1aa";
+@fa-var-jpy: "\f157";
+@fa-var-jsfiddle: "\f1cc";
+@fa-var-key: "\f084";
+@fa-var-keyboard-o: "\f11c";
+@fa-var-krw: "\f159";
+@fa-var-language: "\f1ab";
+@fa-var-laptop: "\f109";
+@fa-var-lastfm: "\f202";
+@fa-var-lastfm-square: "\f203";
+@fa-var-leaf: "\f06c";
+@fa-var-leanpub: "\f212";
+@fa-var-legal: "\f0e3";
+@fa-var-lemon-o: "\f094";
+@fa-var-level-down: "\f149";
+@fa-var-level-up: "\f148";
+@fa-var-life-bouy: "\f1cd";
+@fa-var-life-buoy: "\f1cd";
+@fa-var-life-ring: "\f1cd";
+@fa-var-life-saver: "\f1cd";
+@fa-var-lightbulb-o: "\f0eb";
+@fa-var-line-chart: "\f201";
+@fa-var-link: "\f0c1";
+@fa-var-linkedin: "\f0e1";
+@fa-var-linkedin-square: "\f08c";
+@fa-var-linux: "\f17c";
+@fa-var-list: "\f03a";
+@fa-var-list-alt: "\f022";
+@fa-var-list-ol: "\f0cb";
+@fa-var-list-ul: "\f0ca";
+@fa-var-location-arrow: "\f124";
+@fa-var-lock: "\f023";
+@fa-var-long-arrow-down: "\f175";
+@fa-var-long-arrow-left: "\f177";
+@fa-var-long-arrow-right: "\f178";
+@fa-var-long-arrow-up: "\f176";
+@fa-var-magic: "\f0d0";
+@fa-var-magnet: "\f076";
+@fa-var-mail-forward: "\f064";
+@fa-var-mail-reply: "\f112";
+@fa-var-mail-reply-all: "\f122";
+@fa-var-male: "\f183";
+@fa-var-map: "\f279";
+@fa-var-map-marker: "\f041";
+@fa-var-map-o: "\f278";
+@fa-var-map-pin: "\f276";
+@fa-var-map-signs: "\f277";
+@fa-var-mars: "\f222";
+@fa-var-mars-double: "\f227";
+@fa-var-mars-stroke: "\f229";
+@fa-var-mars-stroke-h: "\f22b";
+@fa-var-mars-stroke-v: "\f22a";
+@fa-var-maxcdn: "\f136";
+@fa-var-meanpath: "\f20c";
+@fa-var-medium: "\f23a";
+@fa-var-medkit: "\f0fa";
+@fa-var-meh-o: "\f11a";
+@fa-var-mercury: "\f223";
+@fa-var-microphone: "\f130";
+@fa-var-microphone-slash: "\f131";
+@fa-var-minus: "\f068";
+@fa-var-minus-circle: "\f056";
+@fa-var-minus-square: "\f146";
+@fa-var-minus-square-o: "\f147";
+@fa-var-mixcloud: "\f289";
+@fa-var-mobile: "\f10b";
+@fa-var-mobile-phone: "\f10b";
+@fa-var-modx: "\f285";
+@fa-var-money: "\f0d6";
+@fa-var-moon-o: "\f186";
+@fa-var-mortar-board: "\f19d";
+@fa-var-motorcycle: "\f21c";
+@fa-var-mouse-pointer: "\f245";
+@fa-var-music: "\f001";
+@fa-var-navicon: "\f0c9";
+@fa-var-neuter: "\f22c";
+@fa-var-newspaper-o: "\f1ea";
+@fa-var-object-group: "\f247";
+@fa-var-object-ungroup: "\f248";
+@fa-var-odnoklassniki: "\f263";
+@fa-var-odnoklassniki-square: "\f264";
+@fa-var-opencart: "\f23d";
+@fa-var-openid: "\f19b";
+@fa-var-opera: "\f26a";
+@fa-var-optin-monster: "\f23c";
+@fa-var-outdent: "\f03b";
+@fa-var-pagelines: "\f18c";
+@fa-var-paint-brush: "\f1fc";
+@fa-var-paper-plane: "\f1d8";
+@fa-var-paper-plane-o: "\f1d9";
+@fa-var-paperclip: "\f0c6";
+@fa-var-paragraph: "\f1dd";
+@fa-var-paste: "\f0ea";
+@fa-var-pause: "\f04c";
+@fa-var-pause-circle: "\f28b";
+@fa-var-pause-circle-o: "\f28c";
+@fa-var-paw: "\f1b0";
+@fa-var-paypal: "\f1ed";
+@fa-var-pencil: "\f040";
+@fa-var-pencil-square: "\f14b";
+@fa-var-pencil-square-o: "\f044";
+@fa-var-percent: "\f295";
+@fa-var-phone: "\f095";
+@fa-var-phone-square: "\f098";
+@fa-var-photo: "\f03e";
+@fa-var-picture-o: "\f03e";
+@fa-var-pie-chart: "\f200";
+@fa-var-pied-piper: "\f1a7";
+@fa-var-pied-piper-alt: "\f1a8";
+@fa-var-pinterest: "\f0d2";
+@fa-var-pinterest-p: "\f231";
+@fa-var-pinterest-square: "\f0d3";
+@fa-var-plane: "\f072";
+@fa-var-play: "\f04b";
+@fa-var-play-circle: "\f144";
+@fa-var-play-circle-o: "\f01d";
+@fa-var-plug: "\f1e6";
+@fa-var-plus: "\f067";
+@fa-var-plus-circle: "\f055";
+@fa-var-plus-square: "\f0fe";
+@fa-var-plus-square-o: "\f196";
+@fa-var-power-off: "\f011";
+@fa-var-print: "\f02f";
+@fa-var-product-hunt: "\f288";
+@fa-var-puzzle-piece: "\f12e";
+@fa-var-qq: "\f1d6";
+@fa-var-qrcode: "\f029";
+@fa-var-question: "\f128";
+@fa-var-question-circle: "\f059";
+@fa-var-quote-left: "\f10d";
+@fa-var-quote-right: "\f10e";
+@fa-var-ra: "\f1d0";
+@fa-var-random: "\f074";
+@fa-var-rebel: "\f1d0";
+@fa-var-recycle: "\f1b8";
+@fa-var-reddit: "\f1a1";
+@fa-var-reddit-alien: "\f281";
+@fa-var-reddit-square: "\f1a2";
+@fa-var-refresh: "\f021";
+@fa-var-registered: "\f25d";
+@fa-var-remove: "\f00d";
+@fa-var-renren: "\f18b";
+@fa-var-reorder: "\f0c9";
+@fa-var-repeat: "\f01e";
+@fa-var-reply: "\f112";
+@fa-var-reply-all: "\f122";
+@fa-var-retweet: "\f079";
+@fa-var-rmb: "\f157";
+@fa-var-road: "\f018";
+@fa-var-rocket: "\f135";
+@fa-var-rotate-left: "\f0e2";
+@fa-var-rotate-right: "\f01e";
+@fa-var-rouble: "\f158";
+@fa-var-rss: "\f09e";
+@fa-var-rss-square: "\f143";
+@fa-var-rub: "\f158";
+@fa-var-ruble: "\f158";
+@fa-var-rupee: "\f156";
+@fa-var-safari: "\f267";
+@fa-var-save: "\f0c7";
+@fa-var-scissors: "\f0c4";
+@fa-var-scribd: "\f28a";
+@fa-var-search: "\f002";
+@fa-var-search-minus: "\f010";
+@fa-var-search-plus: "\f00e";
+@fa-var-sellsy: "\f213";
+@fa-var-send: "\f1d8";
+@fa-var-send-o: "\f1d9";
+@fa-var-server: "\f233";
+@fa-var-share: "\f064";
+@fa-var-share-alt: "\f1e0";
+@fa-var-share-alt-square: "\f1e1";
+@fa-var-share-square: "\f14d";
+@fa-var-share-square-o: "\f045";
+@fa-var-shekel: "\f20b";
+@fa-var-sheqel: "\f20b";
+@fa-var-shield: "\f132";
+@fa-var-ship: "\f21a";
+@fa-var-shirtsinbulk: "\f214";
+@fa-var-shopping-bag: "\f290";
+@fa-var-shopping-basket: "\f291";
+@fa-var-shopping-cart: "\f07a";
+@fa-var-sign-in: "\f090";
+@fa-var-sign-out: "\f08b";
+@fa-var-signal: "\f012";
+@fa-var-simplybuilt: "\f215";
+@fa-var-sitemap: "\f0e8";
+@fa-var-skyatlas: "\f216";
+@fa-var-skype: "\f17e";
+@fa-var-slack: "\f198";
+@fa-var-sliders: "\f1de";
+@fa-var-slideshare: "\f1e7";
+@fa-var-smile-o: "\f118";
+@fa-var-soccer-ball-o: "\f1e3";
+@fa-var-sort: "\f0dc";
+@fa-var-sort-alpha-asc: "\f15d";
+@fa-var-sort-alpha-desc: "\f15e";
+@fa-var-sort-amount-asc: "\f160";
+@fa-var-sort-amount-desc: "\f161";
+@fa-var-sort-asc: "\f0de";
+@fa-var-sort-desc: "\f0dd";
+@fa-var-sort-down: "\f0dd";
+@fa-var-sort-numeric-asc: "\f162";
+@fa-var-sort-numeric-desc: "\f163";
+@fa-var-sort-up: "\f0de";
+@fa-var-soundcloud: "\f1be";
+@fa-var-space-shuttle: "\f197";
+@fa-var-spinner: "\f110";
+@fa-var-spoon: "\f1b1";
+@fa-var-spotify: "\f1bc";
+@fa-var-square: "\f0c8";
+@fa-var-square-o: "\f096";
+@fa-var-stack-exchange: "\f18d";
+@fa-var-stack-overflow: "\f16c";
+@fa-var-star: "\f005";
+@fa-var-star-half: "\f089";
+@fa-var-star-half-empty: "\f123";
+@fa-var-star-half-full: "\f123";
+@fa-var-star-half-o: "\f123";
+@fa-var-star-o: "\f006";
+@fa-var-steam: "\f1b6";
+@fa-var-steam-square: "\f1b7";
+@fa-var-step-backward: "\f048";
+@fa-var-step-forward: "\f051";
+@fa-var-stethoscope: "\f0f1";
+@fa-var-sticky-note: "\f249";
+@fa-var-sticky-note-o: "\f24a";
+@fa-var-stop: "\f04d";
+@fa-var-stop-circle: "\f28d";
+@fa-var-stop-circle-o: "\f28e";
+@fa-var-street-view: "\f21d";
+@fa-var-strikethrough: "\f0cc";
+@fa-var-stumbleupon: "\f1a4";
+@fa-var-stumbleupon-circle: "\f1a3";
+@fa-var-subscript: "\f12c";
+@fa-var-subway: "\f239";
+@fa-var-suitcase: "\f0f2";
+@fa-var-sun-o: "\f185";
+@fa-var-superscript: "\f12b";
+@fa-var-support: "\f1cd";
+@fa-var-table: "\f0ce";
+@fa-var-tablet: "\f10a";
+@fa-var-tachometer: "\f0e4";
+@fa-var-tag: "\f02b";
+@fa-var-tags: "\f02c";
+@fa-var-tasks: "\f0ae";
+@fa-var-taxi: "\f1ba";
+@fa-var-television: "\f26c";
+@fa-var-tencent-weibo: "\f1d5";
+@fa-var-terminal: "\f120";
+@fa-var-text-height: "\f034";
+@fa-var-text-width: "\f035";
+@fa-var-th: "\f00a";
+@fa-var-th-large: "\f009";
+@fa-var-th-list: "\f00b";
+@fa-var-thumb-tack: "\f08d";
+@fa-var-thumbs-down: "\f165";
+@fa-var-thumbs-o-down: "\f088";
+@fa-var-thumbs-o-up: "\f087";
+@fa-var-thumbs-up: "\f164";
+@fa-var-ticket: "\f145";
+@fa-var-times: "\f00d";
+@fa-var-times-circle: "\f057";
+@fa-var-times-circle-o: "\f05c";
+@fa-var-tint: "\f043";
+@fa-var-toggle-down: "\f150";
+@fa-var-toggle-left: "\f191";
+@fa-var-toggle-off: "\f204";
+@fa-var-toggle-on: "\f205";
+@fa-var-toggle-right: "\f152";
+@fa-var-toggle-up: "\f151";
+@fa-var-trademark: "\f25c";
+@fa-var-train: "\f238";
+@fa-var-transgender: "\f224";
+@fa-var-transgender-alt: "\f225";
+@fa-var-trash: "\f1f8";
+@fa-var-trash-o: "\f014";
+@fa-var-tree: "\f1bb";
+@fa-var-trello: "\f181";
+@fa-var-tripadvisor: "\f262";
+@fa-var-trophy: "\f091";
+@fa-var-truck: "\f0d1";
+@fa-var-try: "\f195";
+@fa-var-tty: "\f1e4";
+@fa-var-tumblr: "\f173";
+@fa-var-tumblr-square: "\f174";
+@fa-var-turkish-lira: "\f195";
+@fa-var-tv: "\f26c";
+@fa-var-twitch: "\f1e8";
+@fa-var-twitter: "\f099";
+@fa-var-twitter-square: "\f081";
+@fa-var-umbrella: "\f0e9";
+@fa-var-underline: "\f0cd";
+@fa-var-undo: "\f0e2";
+@fa-var-university: "\f19c";
+@fa-var-unlink: "\f127";
+@fa-var-unlock: "\f09c";
+@fa-var-unlock-alt: "\f13e";
+@fa-var-unsorted: "\f0dc";
+@fa-var-upload: "\f093";
+@fa-var-usb: "\f287";
+@fa-var-usd: "\f155";
+@fa-var-user: "\f007";
+@fa-var-user-md: "\f0f0";
+@fa-var-user-plus: "\f234";
+@fa-var-user-secret: "\f21b";
+@fa-var-user-times: "\f235";
+@fa-var-users: "\f0c0";
+@fa-var-venus: "\f221";
+@fa-var-venus-double: "\f226";
+@fa-var-venus-mars: "\f228";
+@fa-var-viacoin: "\f237";
+@fa-var-video-camera: "\f03d";
+@fa-var-vimeo: "\f27d";
+@fa-var-vimeo-square: "\f194";
+@fa-var-vine: "\f1ca";
+@fa-var-vk: "\f189";
+@fa-var-volume-down: "\f027";
+@fa-var-volume-off: "\f026";
+@fa-var-volume-up: "\f028";
+@fa-var-warning: "\f071";
+@fa-var-wechat: "\f1d7";
+@fa-var-weibo: "\f18a";
+@fa-var-weixin: "\f1d7";
+@fa-var-whatsapp: "\f232";
+@fa-var-wheelchair: "\f193";
+@fa-var-wifi: "\f1eb";
+@fa-var-wikipedia-w: "\f266";
+@fa-var-windows: "\f17a";
+@fa-var-won: "\f159";
+@fa-var-wordpress: "\f19a";
+@fa-var-wrench: "\f0ad";
+@fa-var-xing: "\f168";
+@fa-var-xing-square: "\f169";
+@fa-var-y-combinator: "\f23b";
+@fa-var-y-combinator-square: "\f1d4";
+@fa-var-yahoo: "\f19e";
+@fa-var-yc: "\f23b";
+@fa-var-yc-square: "\f1d4";
+@fa-var-yelp: "\f1e9";
+@fa-var-yen: "\f157";
+@fa-var-youtube: "\f167";
+@fa-var-youtube-play: "\f16a";
+@fa-var-youtube-square: "\f166";
+
diff --git a/web/pgadmin/static/vendor/font-awesome/package.json b/web/pgadmin/static/vendor/font-awesome/package.json
new file mode 100644
index 000000000..6defd2811
--- /dev/null
+++ b/web/pgadmin/static/vendor/font-awesome/package.json
@@ -0,0 +1,104 @@
+{
+ "_args": [
+ [
+ {
+ "raw": "font-awesome@4.5.0",
+ "scope": null,
+ "escapedName": "font-awesome",
+ "name": "font-awesome",
+ "rawSpec": "4.5.0",
+ "spec": "4.5.0",
+ "type": "version"
+ },
+ "/Users/pivotal/workspace/pgadmin4"
+ ]
+ ],
+ "_from": "font-awesome@4.5.0",
+ "_id": "font-awesome@4.5.0",
+ "_inCache": true,
+ "_location": "/font-awesome",
+ "_nodeVersion": "3.3.1",
+ "_npmUser": {
+ "name": "juliankrispel",
+ "email": "julian@goodafternoon.co"
+ },
+ "_npmVersion": "2.14.3",
+ "_phantomChildren": {},
+ "_requested": {
+ "raw": "font-awesome@4.5.0",
+ "scope": null,
+ "escapedName": "font-awesome",
+ "name": "font-awesome",
+ "rawSpec": "4.5.0",
+ "spec": "4.5.0",
+ "type": "version"
+ },
+ "_requiredBy": [
+ "#USER"
+ ],
+ "_resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.5.0.tgz",
+ "_shasum": "1e9d7ccf7d63bdbe57000e18d5188cb2557e70f8",
+ "_shrinkwrap": null,
+ "_spec": "font-awesome@4.5.0",
+ "_where": "/Users/pivotal/workspace/pgadmin4",
+ "author": {
+ "name": "Dave Gandy",
+ "email": "dave@fontawesome.io",
+ "url": "http://twitter.com/davegandy"
+ },
+ "bugs": {
+ "url": "http://github.com/FortAwesome/Font-Awesome/issues"
+ },
+ "contributors": [
+ {
+ "name": "Rob Madole",
+ "url": "http://twitter.com/robmadole"
+ },
+ {
+ "name": "Geremia Taglialatela",
+ "url": "http://twitter.com/gtagliala"
+ },
+ {
+ "name": "Travis Chase",
+ "url": "http://twitter.com/supercodepoet"
+ }
+ ],
+ "dependencies": {},
+ "description": "The iconic font and CSS framework",
+ "devDependencies": {},
+ "directories": {},
+ "dist": {
+ "shasum": "1e9d7ccf7d63bdbe57000e18d5188cb2557e70f8",
+ "tarball": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.5.0.tgz"
+ },
+ "engines": {
+ "node": ">=0.10.3"
+ },
+ "gitHead": "fddd2c240452e6c8990c4ef75e0265b455aa7968",
+ "homepage": "http://fontawesome.io/",
+ "keywords": [
+ "font",
+ "awesome",
+ "fontawesome",
+ "icon",
+ "font",
+ "bootstrap"
+ ],
+ "license": "(OFL-1.1 AND MIT)",
+ "maintainers": [
+ {
+ "name": "juliankrispel",
+ "email": "julian@goodafternoon.co"
+ }
+ ],
+ "name": "font-awesome",
+ "optionalDependencies": {},
+ "readme": "ERROR: No README data found!",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/FortAwesome/Font-Awesome.git"
+ },
+ "scripts": {},
+ "style": "css/font-awesome.css",
+ "version": "4.5.0"
+}
diff --git a/web/pgadmin/static/vendor/font-awesome/scss/_animated.scss b/web/pgadmin/static/vendor/font-awesome/scss/_animated.scss
new file mode 100644
index 000000000..8a020dbff
--- /dev/null
+++ b/web/pgadmin/static/vendor/font-awesome/scss/_animated.scss
@@ -0,0 +1,34 @@
+// Spinning Icons
+// --------------------------
+
+.#{$fa-css-prefix}-spin {
+ -webkit-animation: fa-spin 2s infinite linear;
+ animation: fa-spin 2s infinite linear;
+}
+
+.#{$fa-css-prefix}-pulse {
+ -webkit-animation: fa-spin 1s infinite steps(8);
+ animation: fa-spin 1s infinite steps(8);
+}
+
+@-webkit-keyframes fa-spin {
+ 0% {
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg);
+ }
+ 100% {
+ -webkit-transform: rotate(359deg);
+ transform: rotate(359deg);
+ }
+}
+
+@keyframes fa-spin {
+ 0% {
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg);
+ }
+ 100% {
+ -webkit-transform: rotate(359deg);
+ transform: rotate(359deg);
+ }
+}
diff --git a/web/pgadmin/static/vendor/font-awesome/scss/_bordered-pulled.scss b/web/pgadmin/static/vendor/font-awesome/scss/_bordered-pulled.scss
new file mode 100644
index 000000000..d4b85a02f
--- /dev/null
+++ b/web/pgadmin/static/vendor/font-awesome/scss/_bordered-pulled.scss
@@ -0,0 +1,25 @@
+// Bordered & Pulled
+// -------------------------
+
+.#{$fa-css-prefix}-border {
+ padding: .2em .25em .15em;
+ border: solid .08em $fa-border-color;
+ border-radius: .1em;
+}
+
+.#{$fa-css-prefix}-pull-left { float: left; }
+.#{$fa-css-prefix}-pull-right { float: right; }
+
+.#{$fa-css-prefix} {
+ &.#{$fa-css-prefix}-pull-left { margin-right: .3em; }
+ &.#{$fa-css-prefix}-pull-right { margin-left: .3em; }
+}
+
+/* Deprecated as of 4.4.0 */
+.pull-right { float: right; }
+.pull-left { float: left; }
+
+.#{$fa-css-prefix} {
+ &.pull-left { margin-right: .3em; }
+ &.pull-right { margin-left: .3em; }
+}
diff --git a/web/pgadmin/static/vendor/font-awesome/scss/_core.scss b/web/pgadmin/static/vendor/font-awesome/scss/_core.scss
new file mode 100644
index 000000000..7425ef85f
--- /dev/null
+++ b/web/pgadmin/static/vendor/font-awesome/scss/_core.scss
@@ -0,0 +1,12 @@
+// Base Class Definition
+// -------------------------
+
+.#{$fa-css-prefix} {
+ display: inline-block;
+ font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration
+ font-size: inherit; // can't have font-size inherit on line above, so need to override
+ text-rendering: auto; // optimizelegibility throws things off #1094
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+
+}
diff --git a/web/pgadmin/static/vendor/font-awesome/scss/_fixed-width.scss b/web/pgadmin/static/vendor/font-awesome/scss/_fixed-width.scss
new file mode 100644
index 000000000..b221c9813
--- /dev/null
+++ b/web/pgadmin/static/vendor/font-awesome/scss/_fixed-width.scss
@@ -0,0 +1,6 @@
+// Fixed Width Icons
+// -------------------------
+.#{$fa-css-prefix}-fw {
+ width: (18em / 14);
+ text-align: center;
+}
diff --git a/web/pgadmin/static/vendor/font-awesome/scss/_icons.scss b/web/pgadmin/static/vendor/font-awesome/scss/_icons.scss
new file mode 100644
index 000000000..6f9375989
--- /dev/null
+++ b/web/pgadmin/static/vendor/font-awesome/scss/_icons.scss
@@ -0,0 +1,697 @@
+/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
+ readers do not read off random characters that represent icons */
+
+.#{$fa-css-prefix}-glass:before { content: $fa-var-glass; }
+.#{$fa-css-prefix}-music:before { content: $fa-var-music; }
+.#{$fa-css-prefix}-search:before { content: $fa-var-search; }
+.#{$fa-css-prefix}-envelope-o:before { content: $fa-var-envelope-o; }
+.#{$fa-css-prefix}-heart:before { content: $fa-var-heart; }
+.#{$fa-css-prefix}-star:before { content: $fa-var-star; }
+.#{$fa-css-prefix}-star-o:before { content: $fa-var-star-o; }
+.#{$fa-css-prefix}-user:before { content: $fa-var-user; }
+.#{$fa-css-prefix}-film:before { content: $fa-var-film; }
+.#{$fa-css-prefix}-th-large:before { content: $fa-var-th-large; }
+.#{$fa-css-prefix}-th:before { content: $fa-var-th; }
+.#{$fa-css-prefix}-th-list:before { content: $fa-var-th-list; }
+.#{$fa-css-prefix}-check:before { content: $fa-var-check; }
+.#{$fa-css-prefix}-remove:before,
+.#{$fa-css-prefix}-close:before,
+.#{$fa-css-prefix}-times:before { content: $fa-var-times; }
+.#{$fa-css-prefix}-search-plus:before { content: $fa-var-search-plus; }
+.#{$fa-css-prefix}-search-minus:before { content: $fa-var-search-minus; }
+.#{$fa-css-prefix}-power-off:before { content: $fa-var-power-off; }
+.#{$fa-css-prefix}-signal:before { content: $fa-var-signal; }
+.#{$fa-css-prefix}-gear:before,
+.#{$fa-css-prefix}-cog:before { content: $fa-var-cog; }
+.#{$fa-css-prefix}-trash-o:before { content: $fa-var-trash-o; }
+.#{$fa-css-prefix}-home:before { content: $fa-var-home; }
+.#{$fa-css-prefix}-file-o:before { content: $fa-var-file-o; }
+.#{$fa-css-prefix}-clock-o:before { content: $fa-var-clock-o; }
+.#{$fa-css-prefix}-road:before { content: $fa-var-road; }
+.#{$fa-css-prefix}-download:before { content: $fa-var-download; }
+.#{$fa-css-prefix}-arrow-circle-o-down:before { content: $fa-var-arrow-circle-o-down; }
+.#{$fa-css-prefix}-arrow-circle-o-up:before { content: $fa-var-arrow-circle-o-up; }
+.#{$fa-css-prefix}-inbox:before { content: $fa-var-inbox; }
+.#{$fa-css-prefix}-play-circle-o:before { content: $fa-var-play-circle-o; }
+.#{$fa-css-prefix}-rotate-right:before,
+.#{$fa-css-prefix}-repeat:before { content: $fa-var-repeat; }
+.#{$fa-css-prefix}-refresh:before { content: $fa-var-refresh; }
+.#{$fa-css-prefix}-list-alt:before { content: $fa-var-list-alt; }
+.#{$fa-css-prefix}-lock:before { content: $fa-var-lock; }
+.#{$fa-css-prefix}-flag:before { content: $fa-var-flag; }
+.#{$fa-css-prefix}-headphones:before { content: $fa-var-headphones; }
+.#{$fa-css-prefix}-volume-off:before { content: $fa-var-volume-off; }
+.#{$fa-css-prefix}-volume-down:before { content: $fa-var-volume-down; }
+.#{$fa-css-prefix}-volume-up:before { content: $fa-var-volume-up; }
+.#{$fa-css-prefix}-qrcode:before { content: $fa-var-qrcode; }
+.#{$fa-css-prefix}-barcode:before { content: $fa-var-barcode; }
+.#{$fa-css-prefix}-tag:before { content: $fa-var-tag; }
+.#{$fa-css-prefix}-tags:before { content: $fa-var-tags; }
+.#{$fa-css-prefix}-book:before { content: $fa-var-book; }
+.#{$fa-css-prefix}-bookmark:before { content: $fa-var-bookmark; }
+.#{$fa-css-prefix}-print:before { content: $fa-var-print; }
+.#{$fa-css-prefix}-camera:before { content: $fa-var-camera; }
+.#{$fa-css-prefix}-font:before { content: $fa-var-font; }
+.#{$fa-css-prefix}-bold:before { content: $fa-var-bold; }
+.#{$fa-css-prefix}-italic:before { content: $fa-var-italic; }
+.#{$fa-css-prefix}-text-height:before { content: $fa-var-text-height; }
+.#{$fa-css-prefix}-text-width:before { content: $fa-var-text-width; }
+.#{$fa-css-prefix}-align-left:before { content: $fa-var-align-left; }
+.#{$fa-css-prefix}-align-center:before { content: $fa-var-align-center; }
+.#{$fa-css-prefix}-align-right:before { content: $fa-var-align-right; }
+.#{$fa-css-prefix}-align-justify:before { content: $fa-var-align-justify; }
+.#{$fa-css-prefix}-list:before { content: $fa-var-list; }
+.#{$fa-css-prefix}-dedent:before,
+.#{$fa-css-prefix}-outdent:before { content: $fa-var-outdent; }
+.#{$fa-css-prefix}-indent:before { content: $fa-var-indent; }
+.#{$fa-css-prefix}-video-camera:before { content: $fa-var-video-camera; }
+.#{$fa-css-prefix}-photo:before,
+.#{$fa-css-prefix}-image:before,
+.#{$fa-css-prefix}-picture-o:before { content: $fa-var-picture-o; }
+.#{$fa-css-prefix}-pencil:before { content: $fa-var-pencil; }
+.#{$fa-css-prefix}-map-marker:before { content: $fa-var-map-marker; }
+.#{$fa-css-prefix}-adjust:before { content: $fa-var-adjust; }
+.#{$fa-css-prefix}-tint:before { content: $fa-var-tint; }
+.#{$fa-css-prefix}-edit:before,
+.#{$fa-css-prefix}-pencil-square-o:before { content: $fa-var-pencil-square-o; }
+.#{$fa-css-prefix}-share-square-o:before { content: $fa-var-share-square-o; }
+.#{$fa-css-prefix}-check-square-o:before { content: $fa-var-check-square-o; }
+.#{$fa-css-prefix}-arrows:before { content: $fa-var-arrows; }
+.#{$fa-css-prefix}-step-backward:before { content: $fa-var-step-backward; }
+.#{$fa-css-prefix}-fast-backward:before { content: $fa-var-fast-backward; }
+.#{$fa-css-prefix}-backward:before { content: $fa-var-backward; }
+.#{$fa-css-prefix}-play:before { content: $fa-var-play; }
+.#{$fa-css-prefix}-pause:before { content: $fa-var-pause; }
+.#{$fa-css-prefix}-stop:before { content: $fa-var-stop; }
+.#{$fa-css-prefix}-forward:before { content: $fa-var-forward; }
+.#{$fa-css-prefix}-fast-forward:before { content: $fa-var-fast-forward; }
+.#{$fa-css-prefix}-step-forward:before { content: $fa-var-step-forward; }
+.#{$fa-css-prefix}-eject:before { content: $fa-var-eject; }
+.#{$fa-css-prefix}-chevron-left:before { content: $fa-var-chevron-left; }
+.#{$fa-css-prefix}-chevron-right:before { content: $fa-var-chevron-right; }
+.#{$fa-css-prefix}-plus-circle:before { content: $fa-var-plus-circle; }
+.#{$fa-css-prefix}-minus-circle:before { content: $fa-var-minus-circle; }
+.#{$fa-css-prefix}-times-circle:before { content: $fa-var-times-circle; }
+.#{$fa-css-prefix}-check-circle:before { content: $fa-var-check-circle; }
+.#{$fa-css-prefix}-question-circle:before { content: $fa-var-question-circle; }
+.#{$fa-css-prefix}-info-circle:before { content: $fa-var-info-circle; }
+.#{$fa-css-prefix}-crosshairs:before { content: $fa-var-crosshairs; }
+.#{$fa-css-prefix}-times-circle-o:before { content: $fa-var-times-circle-o; }
+.#{$fa-css-prefix}-check-circle-o:before { content: $fa-var-check-circle-o; }
+.#{$fa-css-prefix}-ban:before { content: $fa-var-ban; }
+.#{$fa-css-prefix}-arrow-left:before { content: $fa-var-arrow-left; }
+.#{$fa-css-prefix}-arrow-right:before { content: $fa-var-arrow-right; }
+.#{$fa-css-prefix}-arrow-up:before { content: $fa-var-arrow-up; }
+.#{$fa-css-prefix}-arrow-down:before { content: $fa-var-arrow-down; }
+.#{$fa-css-prefix}-mail-forward:before,
+.#{$fa-css-prefix}-share:before { content: $fa-var-share; }
+.#{$fa-css-prefix}-expand:before { content: $fa-var-expand; }
+.#{$fa-css-prefix}-compress:before { content: $fa-var-compress; }
+.#{$fa-css-prefix}-plus:before { content: $fa-var-plus; }
+.#{$fa-css-prefix}-minus:before { content: $fa-var-minus; }
+.#{$fa-css-prefix}-asterisk:before { content: $fa-var-asterisk; }
+.#{$fa-css-prefix}-exclamation-circle:before { content: $fa-var-exclamation-circle; }
+.#{$fa-css-prefix}-gift:before { content: $fa-var-gift; }
+.#{$fa-css-prefix}-leaf:before { content: $fa-var-leaf; }
+.#{$fa-css-prefix}-fire:before { content: $fa-var-fire; }
+.#{$fa-css-prefix}-eye:before { content: $fa-var-eye; }
+.#{$fa-css-prefix}-eye-slash:before { content: $fa-var-eye-slash; }
+.#{$fa-css-prefix}-warning:before,
+.#{$fa-css-prefix}-exclamation-triangle:before { content: $fa-var-exclamation-triangle; }
+.#{$fa-css-prefix}-plane:before { content: $fa-var-plane; }
+.#{$fa-css-prefix}-calendar:before { content: $fa-var-calendar; }
+.#{$fa-css-prefix}-random:before { content: $fa-var-random; }
+.#{$fa-css-prefix}-comment:before { content: $fa-var-comment; }
+.#{$fa-css-prefix}-magnet:before { content: $fa-var-magnet; }
+.#{$fa-css-prefix}-chevron-up:before { content: $fa-var-chevron-up; }
+.#{$fa-css-prefix}-chevron-down:before { content: $fa-var-chevron-down; }
+.#{$fa-css-prefix}-retweet:before { content: $fa-var-retweet; }
+.#{$fa-css-prefix}-shopping-cart:before { content: $fa-var-shopping-cart; }
+.#{$fa-css-prefix}-folder:before { content: $fa-var-folder; }
+.#{$fa-css-prefix}-folder-open:before { content: $fa-var-folder-open; }
+.#{$fa-css-prefix}-arrows-v:before { content: $fa-var-arrows-v; }
+.#{$fa-css-prefix}-arrows-h:before { content: $fa-var-arrows-h; }
+.#{$fa-css-prefix}-bar-chart-o:before,
+.#{$fa-css-prefix}-bar-chart:before { content: $fa-var-bar-chart; }
+.#{$fa-css-prefix}-twitter-square:before { content: $fa-var-twitter-square; }
+.#{$fa-css-prefix}-facebook-square:before { content: $fa-var-facebook-square; }
+.#{$fa-css-prefix}-camera-retro:before { content: $fa-var-camera-retro; }
+.#{$fa-css-prefix}-key:before { content: $fa-var-key; }
+.#{$fa-css-prefix}-gears:before,
+.#{$fa-css-prefix}-cogs:before { content: $fa-var-cogs; }
+.#{$fa-css-prefix}-comments:before { content: $fa-var-comments; }
+.#{$fa-css-prefix}-thumbs-o-up:before { content: $fa-var-thumbs-o-up; }
+.#{$fa-css-prefix}-thumbs-o-down:before { content: $fa-var-thumbs-o-down; }
+.#{$fa-css-prefix}-star-half:before { content: $fa-var-star-half; }
+.#{$fa-css-prefix}-heart-o:before { content: $fa-var-heart-o; }
+.#{$fa-css-prefix}-sign-out:before { content: $fa-var-sign-out; }
+.#{$fa-css-prefix}-linkedin-square:before { content: $fa-var-linkedin-square; }
+.#{$fa-css-prefix}-thumb-tack:before { content: $fa-var-thumb-tack; }
+.#{$fa-css-prefix}-external-link:before { content: $fa-var-external-link; }
+.#{$fa-css-prefix}-sign-in:before { content: $fa-var-sign-in; }
+.#{$fa-css-prefix}-trophy:before { content: $fa-var-trophy; }
+.#{$fa-css-prefix}-github-square:before { content: $fa-var-github-square; }
+.#{$fa-css-prefix}-upload:before { content: $fa-var-upload; }
+.#{$fa-css-prefix}-lemon-o:before { content: $fa-var-lemon-o; }
+.#{$fa-css-prefix}-phone:before { content: $fa-var-phone; }
+.#{$fa-css-prefix}-square-o:before { content: $fa-var-square-o; }
+.#{$fa-css-prefix}-bookmark-o:before { content: $fa-var-bookmark-o; }
+.#{$fa-css-prefix}-phone-square:before { content: $fa-var-phone-square; }
+.#{$fa-css-prefix}-twitter:before { content: $fa-var-twitter; }
+.#{$fa-css-prefix}-facebook-f:before,
+.#{$fa-css-prefix}-facebook:before { content: $fa-var-facebook; }
+.#{$fa-css-prefix}-github:before { content: $fa-var-github; }
+.#{$fa-css-prefix}-unlock:before { content: $fa-var-unlock; }
+.#{$fa-css-prefix}-credit-card:before { content: $fa-var-credit-card; }
+.#{$fa-css-prefix}-feed:before,
+.#{$fa-css-prefix}-rss:before { content: $fa-var-rss; }
+.#{$fa-css-prefix}-hdd-o:before { content: $fa-var-hdd-o; }
+.#{$fa-css-prefix}-bullhorn:before { content: $fa-var-bullhorn; }
+.#{$fa-css-prefix}-bell:before { content: $fa-var-bell; }
+.#{$fa-css-prefix}-certificate:before { content: $fa-var-certificate; }
+.#{$fa-css-prefix}-hand-o-right:before { content: $fa-var-hand-o-right; }
+.#{$fa-css-prefix}-hand-o-left:before { content: $fa-var-hand-o-left; }
+.#{$fa-css-prefix}-hand-o-up:before { content: $fa-var-hand-o-up; }
+.#{$fa-css-prefix}-hand-o-down:before { content: $fa-var-hand-o-down; }
+.#{$fa-css-prefix}-arrow-circle-left:before { content: $fa-var-arrow-circle-left; }
+.#{$fa-css-prefix}-arrow-circle-right:before { content: $fa-var-arrow-circle-right; }
+.#{$fa-css-prefix}-arrow-circle-up:before { content: $fa-var-arrow-circle-up; }
+.#{$fa-css-prefix}-arrow-circle-down:before { content: $fa-var-arrow-circle-down; }
+.#{$fa-css-prefix}-globe:before { content: $fa-var-globe; }
+.#{$fa-css-prefix}-wrench:before { content: $fa-var-wrench; }
+.#{$fa-css-prefix}-tasks:before { content: $fa-var-tasks; }
+.#{$fa-css-prefix}-filter:before { content: $fa-var-filter; }
+.#{$fa-css-prefix}-briefcase:before { content: $fa-var-briefcase; }
+.#{$fa-css-prefix}-arrows-alt:before { content: $fa-var-arrows-alt; }
+.#{$fa-css-prefix}-group:before,
+.#{$fa-css-prefix}-users:before { content: $fa-var-users; }
+.#{$fa-css-prefix}-chain:before,
+.#{$fa-css-prefix}-link:before { content: $fa-var-link; }
+.#{$fa-css-prefix}-cloud:before { content: $fa-var-cloud; }
+.#{$fa-css-prefix}-flask:before { content: $fa-var-flask; }
+.#{$fa-css-prefix}-cut:before,
+.#{$fa-css-prefix}-scissors:before { content: $fa-var-scissors; }
+.#{$fa-css-prefix}-copy:before,
+.#{$fa-css-prefix}-files-o:before { content: $fa-var-files-o; }
+.#{$fa-css-prefix}-paperclip:before { content: $fa-var-paperclip; }
+.#{$fa-css-prefix}-save:before,
+.#{$fa-css-prefix}-floppy-o:before { content: $fa-var-floppy-o; }
+.#{$fa-css-prefix}-square:before { content: $fa-var-square; }
+.#{$fa-css-prefix}-navicon:before,
+.#{$fa-css-prefix}-reorder:before,
+.#{$fa-css-prefix}-bars:before { content: $fa-var-bars; }
+.#{$fa-css-prefix}-list-ul:before { content: $fa-var-list-ul; }
+.#{$fa-css-prefix}-list-ol:before { content: $fa-var-list-ol; }
+.#{$fa-css-prefix}-strikethrough:before { content: $fa-var-strikethrough; }
+.#{$fa-css-prefix}-underline:before { content: $fa-var-underline; }
+.#{$fa-css-prefix}-table:before { content: $fa-var-table; }
+.#{$fa-css-prefix}-magic:before { content: $fa-var-magic; }
+.#{$fa-css-prefix}-truck:before { content: $fa-var-truck; }
+.#{$fa-css-prefix}-pinterest:before { content: $fa-var-pinterest; }
+.#{$fa-css-prefix}-pinterest-square:before { content: $fa-var-pinterest-square; }
+.#{$fa-css-prefix}-google-plus-square:before { content: $fa-var-google-plus-square; }
+.#{$fa-css-prefix}-google-plus:before { content: $fa-var-google-plus; }
+.#{$fa-css-prefix}-money:before { content: $fa-var-money; }
+.#{$fa-css-prefix}-caret-down:before { content: $fa-var-caret-down; }
+.#{$fa-css-prefix}-caret-up:before { content: $fa-var-caret-up; }
+.#{$fa-css-prefix}-caret-left:before { content: $fa-var-caret-left; }
+.#{$fa-css-prefix}-caret-right:before { content: $fa-var-caret-right; }
+.#{$fa-css-prefix}-columns:before { content: $fa-var-columns; }
+.#{$fa-css-prefix}-unsorted:before,
+.#{$fa-css-prefix}-sort:before { content: $fa-var-sort; }
+.#{$fa-css-prefix}-sort-down:before,
+.#{$fa-css-prefix}-sort-desc:before { content: $fa-var-sort-desc; }
+.#{$fa-css-prefix}-sort-up:before,
+.#{$fa-css-prefix}-sort-asc:before { content: $fa-var-sort-asc; }
+.#{$fa-css-prefix}-envelope:before { content: $fa-var-envelope; }
+.#{$fa-css-prefix}-linkedin:before { content: $fa-var-linkedin; }
+.#{$fa-css-prefix}-rotate-left:before,
+.#{$fa-css-prefix}-undo:before { content: $fa-var-undo; }
+.#{$fa-css-prefix}-legal:before,
+.#{$fa-css-prefix}-gavel:before { content: $fa-var-gavel; }
+.#{$fa-css-prefix}-dashboard:before,
+.#{$fa-css-prefix}-tachometer:before { content: $fa-var-tachometer; }
+.#{$fa-css-prefix}-comment-o:before { content: $fa-var-comment-o; }
+.#{$fa-css-prefix}-comments-o:before { content: $fa-var-comments-o; }
+.#{$fa-css-prefix}-flash:before,
+.#{$fa-css-prefix}-bolt:before { content: $fa-var-bolt; }
+.#{$fa-css-prefix}-sitemap:before { content: $fa-var-sitemap; }
+.#{$fa-css-prefix}-umbrella:before { content: $fa-var-umbrella; }
+.#{$fa-css-prefix}-paste:before,
+.#{$fa-css-prefix}-clipboard:before { content: $fa-var-clipboard; }
+.#{$fa-css-prefix}-lightbulb-o:before { content: $fa-var-lightbulb-o; }
+.#{$fa-css-prefix}-exchange:before { content: $fa-var-exchange; }
+.#{$fa-css-prefix}-cloud-download:before { content: $fa-var-cloud-download; }
+.#{$fa-css-prefix}-cloud-upload:before { content: $fa-var-cloud-upload; }
+.#{$fa-css-prefix}-user-md:before { content: $fa-var-user-md; }
+.#{$fa-css-prefix}-stethoscope:before { content: $fa-var-stethoscope; }
+.#{$fa-css-prefix}-suitcase:before { content: $fa-var-suitcase; }
+.#{$fa-css-prefix}-bell-o:before { content: $fa-var-bell-o; }
+.#{$fa-css-prefix}-coffee:before { content: $fa-var-coffee; }
+.#{$fa-css-prefix}-cutlery:before { content: $fa-var-cutlery; }
+.#{$fa-css-prefix}-file-text-o:before { content: $fa-var-file-text-o; }
+.#{$fa-css-prefix}-building-o:before { content: $fa-var-building-o; }
+.#{$fa-css-prefix}-hospital-o:before { content: $fa-var-hospital-o; }
+.#{$fa-css-prefix}-ambulance:before { content: $fa-var-ambulance; }
+.#{$fa-css-prefix}-medkit:before { content: $fa-var-medkit; }
+.#{$fa-css-prefix}-fighter-jet:before { content: $fa-var-fighter-jet; }
+.#{$fa-css-prefix}-beer:before { content: $fa-var-beer; }
+.#{$fa-css-prefix}-h-square:before { content: $fa-var-h-square; }
+.#{$fa-css-prefix}-plus-square:before { content: $fa-var-plus-square; }
+.#{$fa-css-prefix}-angle-double-left:before { content: $fa-var-angle-double-left; }
+.#{$fa-css-prefix}-angle-double-right:before { content: $fa-var-angle-double-right; }
+.#{$fa-css-prefix}-angle-double-up:before { content: $fa-var-angle-double-up; }
+.#{$fa-css-prefix}-angle-double-down:before { content: $fa-var-angle-double-down; }
+.#{$fa-css-prefix}-angle-left:before { content: $fa-var-angle-left; }
+.#{$fa-css-prefix}-angle-right:before { content: $fa-var-angle-right; }
+.#{$fa-css-prefix}-angle-up:before { content: $fa-var-angle-up; }
+.#{$fa-css-prefix}-angle-down:before { content: $fa-var-angle-down; }
+.#{$fa-css-prefix}-desktop:before { content: $fa-var-desktop; }
+.#{$fa-css-prefix}-laptop:before { content: $fa-var-laptop; }
+.#{$fa-css-prefix}-tablet:before { content: $fa-var-tablet; }
+.#{$fa-css-prefix}-mobile-phone:before,
+.#{$fa-css-prefix}-mobile:before { content: $fa-var-mobile; }
+.#{$fa-css-prefix}-circle-o:before { content: $fa-var-circle-o; }
+.#{$fa-css-prefix}-quote-left:before { content: $fa-var-quote-left; }
+.#{$fa-css-prefix}-quote-right:before { content: $fa-var-quote-right; }
+.#{$fa-css-prefix}-spinner:before { content: $fa-var-spinner; }
+.#{$fa-css-prefix}-circle:before { content: $fa-var-circle; }
+.#{$fa-css-prefix}-mail-reply:before,
+.#{$fa-css-prefix}-reply:before { content: $fa-var-reply; }
+.#{$fa-css-prefix}-github-alt:before { content: $fa-var-github-alt; }
+.#{$fa-css-prefix}-folder-o:before { content: $fa-var-folder-o; }
+.#{$fa-css-prefix}-folder-open-o:before { content: $fa-var-folder-open-o; }
+.#{$fa-css-prefix}-smile-o:before { content: $fa-var-smile-o; }
+.#{$fa-css-prefix}-frown-o:before { content: $fa-var-frown-o; }
+.#{$fa-css-prefix}-meh-o:before { content: $fa-var-meh-o; }
+.#{$fa-css-prefix}-gamepad:before { content: $fa-var-gamepad; }
+.#{$fa-css-prefix}-keyboard-o:before { content: $fa-var-keyboard-o; }
+.#{$fa-css-prefix}-flag-o:before { content: $fa-var-flag-o; }
+.#{$fa-css-prefix}-flag-checkered:before { content: $fa-var-flag-checkered; }
+.#{$fa-css-prefix}-terminal:before { content: $fa-var-terminal; }
+.#{$fa-css-prefix}-code:before { content: $fa-var-code; }
+.#{$fa-css-prefix}-mail-reply-all:before,
+.#{$fa-css-prefix}-reply-all:before { content: $fa-var-reply-all; }
+.#{$fa-css-prefix}-star-half-empty:before,
+.#{$fa-css-prefix}-star-half-full:before,
+.#{$fa-css-prefix}-star-half-o:before { content: $fa-var-star-half-o; }
+.#{$fa-css-prefix}-location-arrow:before { content: $fa-var-location-arrow; }
+.#{$fa-css-prefix}-crop:before { content: $fa-var-crop; }
+.#{$fa-css-prefix}-code-fork:before { content: $fa-var-code-fork; }
+.#{$fa-css-prefix}-unlink:before,
+.#{$fa-css-prefix}-chain-broken:before { content: $fa-var-chain-broken; }
+.#{$fa-css-prefix}-question:before { content: $fa-var-question; }
+.#{$fa-css-prefix}-info:before { content: $fa-var-info; }
+.#{$fa-css-prefix}-exclamation:before { content: $fa-var-exclamation; }
+.#{$fa-css-prefix}-superscript:before { content: $fa-var-superscript; }
+.#{$fa-css-prefix}-subscript:before { content: $fa-var-subscript; }
+.#{$fa-css-prefix}-eraser:before { content: $fa-var-eraser; }
+.#{$fa-css-prefix}-puzzle-piece:before { content: $fa-var-puzzle-piece; }
+.#{$fa-css-prefix}-microphone:before { content: $fa-var-microphone; }
+.#{$fa-css-prefix}-microphone-slash:before { content: $fa-var-microphone-slash; }
+.#{$fa-css-prefix}-shield:before { content: $fa-var-shield; }
+.#{$fa-css-prefix}-calendar-o:before { content: $fa-var-calendar-o; }
+.#{$fa-css-prefix}-fire-extinguisher:before { content: $fa-var-fire-extinguisher; }
+.#{$fa-css-prefix}-rocket:before { content: $fa-var-rocket; }
+.#{$fa-css-prefix}-maxcdn:before { content: $fa-var-maxcdn; }
+.#{$fa-css-prefix}-chevron-circle-left:before { content: $fa-var-chevron-circle-left; }
+.#{$fa-css-prefix}-chevron-circle-right:before { content: $fa-var-chevron-circle-right; }
+.#{$fa-css-prefix}-chevron-circle-up:before { content: $fa-var-chevron-circle-up; }
+.#{$fa-css-prefix}-chevron-circle-down:before { content: $fa-var-chevron-circle-down; }
+.#{$fa-css-prefix}-html5:before { content: $fa-var-html5; }
+.#{$fa-css-prefix}-css3:before { content: $fa-var-css3; }
+.#{$fa-css-prefix}-anchor:before { content: $fa-var-anchor; }
+.#{$fa-css-prefix}-unlock-alt:before { content: $fa-var-unlock-alt; }
+.#{$fa-css-prefix}-bullseye:before { content: $fa-var-bullseye; }
+.#{$fa-css-prefix}-ellipsis-h:before { content: $fa-var-ellipsis-h; }
+.#{$fa-css-prefix}-ellipsis-v:before { content: $fa-var-ellipsis-v; }
+.#{$fa-css-prefix}-rss-square:before { content: $fa-var-rss-square; }
+.#{$fa-css-prefix}-play-circle:before { content: $fa-var-play-circle; }
+.#{$fa-css-prefix}-ticket:before { content: $fa-var-ticket; }
+.#{$fa-css-prefix}-minus-square:before { content: $fa-var-minus-square; }
+.#{$fa-css-prefix}-minus-square-o:before { content: $fa-var-minus-square-o; }
+.#{$fa-css-prefix}-level-up:before { content: $fa-var-level-up; }
+.#{$fa-css-prefix}-level-down:before { content: $fa-var-level-down; }
+.#{$fa-css-prefix}-check-square:before { content: $fa-var-check-square; }
+.#{$fa-css-prefix}-pencil-square:before { content: $fa-var-pencil-square; }
+.#{$fa-css-prefix}-external-link-square:before { content: $fa-var-external-link-square; }
+.#{$fa-css-prefix}-share-square:before { content: $fa-var-share-square; }
+.#{$fa-css-prefix}-compass:before { content: $fa-var-compass; }
+.#{$fa-css-prefix}-toggle-down:before,
+.#{$fa-css-prefix}-caret-square-o-down:before { content: $fa-var-caret-square-o-down; }
+.#{$fa-css-prefix}-toggle-up:before,
+.#{$fa-css-prefix}-caret-square-o-up:before { content: $fa-var-caret-square-o-up; }
+.#{$fa-css-prefix}-toggle-right:before,
+.#{$fa-css-prefix}-caret-square-o-right:before { content: $fa-var-caret-square-o-right; }
+.#{$fa-css-prefix}-euro:before,
+.#{$fa-css-prefix}-eur:before { content: $fa-var-eur; }
+.#{$fa-css-prefix}-gbp:before { content: $fa-var-gbp; }
+.#{$fa-css-prefix}-dollar:before,
+.#{$fa-css-prefix}-usd:before { content: $fa-var-usd; }
+.#{$fa-css-prefix}-rupee:before,
+.#{$fa-css-prefix}-inr:before { content: $fa-var-inr; }
+.#{$fa-css-prefix}-cny:before,
+.#{$fa-css-prefix}-rmb:before,
+.#{$fa-css-prefix}-yen:before,
+.#{$fa-css-prefix}-jpy:before { content: $fa-var-jpy; }
+.#{$fa-css-prefix}-ruble:before,
+.#{$fa-css-prefix}-rouble:before,
+.#{$fa-css-prefix}-rub:before { content: $fa-var-rub; }
+.#{$fa-css-prefix}-won:before,
+.#{$fa-css-prefix}-krw:before { content: $fa-var-krw; }
+.#{$fa-css-prefix}-bitcoin:before,
+.#{$fa-css-prefix}-btc:before { content: $fa-var-btc; }
+.#{$fa-css-prefix}-file:before { content: $fa-var-file; }
+.#{$fa-css-prefix}-file-text:before { content: $fa-var-file-text; }
+.#{$fa-css-prefix}-sort-alpha-asc:before { content: $fa-var-sort-alpha-asc; }
+.#{$fa-css-prefix}-sort-alpha-desc:before { content: $fa-var-sort-alpha-desc; }
+.#{$fa-css-prefix}-sort-amount-asc:before { content: $fa-var-sort-amount-asc; }
+.#{$fa-css-prefix}-sort-amount-desc:before { content: $fa-var-sort-amount-desc; }
+.#{$fa-css-prefix}-sort-numeric-asc:before { content: $fa-var-sort-numeric-asc; }
+.#{$fa-css-prefix}-sort-numeric-desc:before { content: $fa-var-sort-numeric-desc; }
+.#{$fa-css-prefix}-thumbs-up:before { content: $fa-var-thumbs-up; }
+.#{$fa-css-prefix}-thumbs-down:before { content: $fa-var-thumbs-down; }
+.#{$fa-css-prefix}-youtube-square:before { content: $fa-var-youtube-square; }
+.#{$fa-css-prefix}-youtube:before { content: $fa-var-youtube; }
+.#{$fa-css-prefix}-xing:before { content: $fa-var-xing; }
+.#{$fa-css-prefix}-xing-square:before { content: $fa-var-xing-square; }
+.#{$fa-css-prefix}-youtube-play:before { content: $fa-var-youtube-play; }
+.#{$fa-css-prefix}-dropbox:before { content: $fa-var-dropbox; }
+.#{$fa-css-prefix}-stack-overflow:before { content: $fa-var-stack-overflow; }
+.#{$fa-css-prefix}-instagram:before { content: $fa-var-instagram; }
+.#{$fa-css-prefix}-flickr:before { content: $fa-var-flickr; }
+.#{$fa-css-prefix}-adn:before { content: $fa-var-adn; }
+.#{$fa-css-prefix}-bitbucket:before { content: $fa-var-bitbucket; }
+.#{$fa-css-prefix}-bitbucket-square:before { content: $fa-var-bitbucket-square; }
+.#{$fa-css-prefix}-tumblr:before { content: $fa-var-tumblr; }
+.#{$fa-css-prefix}-tumblr-square:before { content: $fa-var-tumblr-square; }
+.#{$fa-css-prefix}-long-arrow-down:before { content: $fa-var-long-arrow-down; }
+.#{$fa-css-prefix}-long-arrow-up:before { content: $fa-var-long-arrow-up; }
+.#{$fa-css-prefix}-long-arrow-left:before { content: $fa-var-long-arrow-left; }
+.#{$fa-css-prefix}-long-arrow-right:before { content: $fa-var-long-arrow-right; }
+.#{$fa-css-prefix}-apple:before { content: $fa-var-apple; }
+.#{$fa-css-prefix}-windows:before { content: $fa-var-windows; }
+.#{$fa-css-prefix}-android:before { content: $fa-var-android; }
+.#{$fa-css-prefix}-linux:before { content: $fa-var-linux; }
+.#{$fa-css-prefix}-dribbble:before { content: $fa-var-dribbble; }
+.#{$fa-css-prefix}-skype:before { content: $fa-var-skype; }
+.#{$fa-css-prefix}-foursquare:before { content: $fa-var-foursquare; }
+.#{$fa-css-prefix}-trello:before { content: $fa-var-trello; }
+.#{$fa-css-prefix}-female:before { content: $fa-var-female; }
+.#{$fa-css-prefix}-male:before { content: $fa-var-male; }
+.#{$fa-css-prefix}-gittip:before,
+.#{$fa-css-prefix}-gratipay:before { content: $fa-var-gratipay; }
+.#{$fa-css-prefix}-sun-o:before { content: $fa-var-sun-o; }
+.#{$fa-css-prefix}-moon-o:before { content: $fa-var-moon-o; }
+.#{$fa-css-prefix}-archive:before { content: $fa-var-archive; }
+.#{$fa-css-prefix}-bug:before { content: $fa-var-bug; }
+.#{$fa-css-prefix}-vk:before { content: $fa-var-vk; }
+.#{$fa-css-prefix}-weibo:before { content: $fa-var-weibo; }
+.#{$fa-css-prefix}-renren:before { content: $fa-var-renren; }
+.#{$fa-css-prefix}-pagelines:before { content: $fa-var-pagelines; }
+.#{$fa-css-prefix}-stack-exchange:before { content: $fa-var-stack-exchange; }
+.#{$fa-css-prefix}-arrow-circle-o-right:before { content: $fa-var-arrow-circle-o-right; }
+.#{$fa-css-prefix}-arrow-circle-o-left:before { content: $fa-var-arrow-circle-o-left; }
+.#{$fa-css-prefix}-toggle-left:before,
+.#{$fa-css-prefix}-caret-square-o-left:before { content: $fa-var-caret-square-o-left; }
+.#{$fa-css-prefix}-dot-circle-o:before { content: $fa-var-dot-circle-o; }
+.#{$fa-css-prefix}-wheelchair:before { content: $fa-var-wheelchair; }
+.#{$fa-css-prefix}-vimeo-square:before { content: $fa-var-vimeo-square; }
+.#{$fa-css-prefix}-turkish-lira:before,
+.#{$fa-css-prefix}-try:before { content: $fa-var-try; }
+.#{$fa-css-prefix}-plus-square-o:before { content: $fa-var-plus-square-o; }
+.#{$fa-css-prefix}-space-shuttle:before { content: $fa-var-space-shuttle; }
+.#{$fa-css-prefix}-slack:before { content: $fa-var-slack; }
+.#{$fa-css-prefix}-envelope-square:before { content: $fa-var-envelope-square; }
+.#{$fa-css-prefix}-wordpress:before { content: $fa-var-wordpress; }
+.#{$fa-css-prefix}-openid:before { content: $fa-var-openid; }
+.#{$fa-css-prefix}-institution:before,
+.#{$fa-css-prefix}-bank:before,
+.#{$fa-css-prefix}-university:before { content: $fa-var-university; }
+.#{$fa-css-prefix}-mortar-board:before,
+.#{$fa-css-prefix}-graduation-cap:before { content: $fa-var-graduation-cap; }
+.#{$fa-css-prefix}-yahoo:before { content: $fa-var-yahoo; }
+.#{$fa-css-prefix}-google:before { content: $fa-var-google; }
+.#{$fa-css-prefix}-reddit:before { content: $fa-var-reddit; }
+.#{$fa-css-prefix}-reddit-square:before { content: $fa-var-reddit-square; }
+.#{$fa-css-prefix}-stumbleupon-circle:before { content: $fa-var-stumbleupon-circle; }
+.#{$fa-css-prefix}-stumbleupon:before { content: $fa-var-stumbleupon; }
+.#{$fa-css-prefix}-delicious:before { content: $fa-var-delicious; }
+.#{$fa-css-prefix}-digg:before { content: $fa-var-digg; }
+.#{$fa-css-prefix}-pied-piper:before { content: $fa-var-pied-piper; }
+.#{$fa-css-prefix}-pied-piper-alt:before { content: $fa-var-pied-piper-alt; }
+.#{$fa-css-prefix}-drupal:before { content: $fa-var-drupal; }
+.#{$fa-css-prefix}-joomla:before { content: $fa-var-joomla; }
+.#{$fa-css-prefix}-language:before { content: $fa-var-language; }
+.#{$fa-css-prefix}-fax:before { content: $fa-var-fax; }
+.#{$fa-css-prefix}-building:before { content: $fa-var-building; }
+.#{$fa-css-prefix}-child:before { content: $fa-var-child; }
+.#{$fa-css-prefix}-paw:before { content: $fa-var-paw; }
+.#{$fa-css-prefix}-spoon:before { content: $fa-var-spoon; }
+.#{$fa-css-prefix}-cube:before { content: $fa-var-cube; }
+.#{$fa-css-prefix}-cubes:before { content: $fa-var-cubes; }
+.#{$fa-css-prefix}-behance:before { content: $fa-var-behance; }
+.#{$fa-css-prefix}-behance-square:before { content: $fa-var-behance-square; }
+.#{$fa-css-prefix}-steam:before { content: $fa-var-steam; }
+.#{$fa-css-prefix}-steam-square:before { content: $fa-var-steam-square; }
+.#{$fa-css-prefix}-recycle:before { content: $fa-var-recycle; }
+.#{$fa-css-prefix}-automobile:before,
+.#{$fa-css-prefix}-car:before { content: $fa-var-car; }
+.#{$fa-css-prefix}-cab:before,
+.#{$fa-css-prefix}-taxi:before { content: $fa-var-taxi; }
+.#{$fa-css-prefix}-tree:before { content: $fa-var-tree; }
+.#{$fa-css-prefix}-spotify:before { content: $fa-var-spotify; }
+.#{$fa-css-prefix}-deviantart:before { content: $fa-var-deviantart; }
+.#{$fa-css-prefix}-soundcloud:before { content: $fa-var-soundcloud; }
+.#{$fa-css-prefix}-database:before { content: $fa-var-database; }
+.#{$fa-css-prefix}-file-pdf-o:before { content: $fa-var-file-pdf-o; }
+.#{$fa-css-prefix}-file-word-o:before { content: $fa-var-file-word-o; }
+.#{$fa-css-prefix}-file-excel-o:before { content: $fa-var-file-excel-o; }
+.#{$fa-css-prefix}-file-powerpoint-o:before { content: $fa-var-file-powerpoint-o; }
+.#{$fa-css-prefix}-file-photo-o:before,
+.#{$fa-css-prefix}-file-picture-o:before,
+.#{$fa-css-prefix}-file-image-o:before { content: $fa-var-file-image-o; }
+.#{$fa-css-prefix}-file-zip-o:before,
+.#{$fa-css-prefix}-file-archive-o:before { content: $fa-var-file-archive-o; }
+.#{$fa-css-prefix}-file-sound-o:before,
+.#{$fa-css-prefix}-file-audio-o:before { content: $fa-var-file-audio-o; }
+.#{$fa-css-prefix}-file-movie-o:before,
+.#{$fa-css-prefix}-file-video-o:before { content: $fa-var-file-video-o; }
+.#{$fa-css-prefix}-file-code-o:before { content: $fa-var-file-code-o; }
+.#{$fa-css-prefix}-vine:before { content: $fa-var-vine; }
+.#{$fa-css-prefix}-codepen:before { content: $fa-var-codepen; }
+.#{$fa-css-prefix}-jsfiddle:before { content: $fa-var-jsfiddle; }
+.#{$fa-css-prefix}-life-bouy:before,
+.#{$fa-css-prefix}-life-buoy:before,
+.#{$fa-css-prefix}-life-saver:before,
+.#{$fa-css-prefix}-support:before,
+.#{$fa-css-prefix}-life-ring:before { content: $fa-var-life-ring; }
+.#{$fa-css-prefix}-circle-o-notch:before { content: $fa-var-circle-o-notch; }
+.#{$fa-css-prefix}-ra:before,
+.#{$fa-css-prefix}-rebel:before { content: $fa-var-rebel; }
+.#{$fa-css-prefix}-ge:before,
+.#{$fa-css-prefix}-empire:before { content: $fa-var-empire; }
+.#{$fa-css-prefix}-git-square:before { content: $fa-var-git-square; }
+.#{$fa-css-prefix}-git:before { content: $fa-var-git; }
+.#{$fa-css-prefix}-y-combinator-square:before,
+.#{$fa-css-prefix}-yc-square:before,
+.#{$fa-css-prefix}-hacker-news:before { content: $fa-var-hacker-news; }
+.#{$fa-css-prefix}-tencent-weibo:before { content: $fa-var-tencent-weibo; }
+.#{$fa-css-prefix}-qq:before { content: $fa-var-qq; }
+.#{$fa-css-prefix}-wechat:before,
+.#{$fa-css-prefix}-weixin:before { content: $fa-var-weixin; }
+.#{$fa-css-prefix}-send:before,
+.#{$fa-css-prefix}-paper-plane:before { content: $fa-var-paper-plane; }
+.#{$fa-css-prefix}-send-o:before,
+.#{$fa-css-prefix}-paper-plane-o:before { content: $fa-var-paper-plane-o; }
+.#{$fa-css-prefix}-history:before { content: $fa-var-history; }
+.#{$fa-css-prefix}-circle-thin:before { content: $fa-var-circle-thin; }
+.#{$fa-css-prefix}-header:before { content: $fa-var-header; }
+.#{$fa-css-prefix}-paragraph:before { content: $fa-var-paragraph; }
+.#{$fa-css-prefix}-sliders:before { content: $fa-var-sliders; }
+.#{$fa-css-prefix}-share-alt:before { content: $fa-var-share-alt; }
+.#{$fa-css-prefix}-share-alt-square:before { content: $fa-var-share-alt-square; }
+.#{$fa-css-prefix}-bomb:before { content: $fa-var-bomb; }
+.#{$fa-css-prefix}-soccer-ball-o:before,
+.#{$fa-css-prefix}-futbol-o:before { content: $fa-var-futbol-o; }
+.#{$fa-css-prefix}-tty:before { content: $fa-var-tty; }
+.#{$fa-css-prefix}-binoculars:before { content: $fa-var-binoculars; }
+.#{$fa-css-prefix}-plug:before { content: $fa-var-plug; }
+.#{$fa-css-prefix}-slideshare:before { content: $fa-var-slideshare; }
+.#{$fa-css-prefix}-twitch:before { content: $fa-var-twitch; }
+.#{$fa-css-prefix}-yelp:before { content: $fa-var-yelp; }
+.#{$fa-css-prefix}-newspaper-o:before { content: $fa-var-newspaper-o; }
+.#{$fa-css-prefix}-wifi:before { content: $fa-var-wifi; }
+.#{$fa-css-prefix}-calculator:before { content: $fa-var-calculator; }
+.#{$fa-css-prefix}-paypal:before { content: $fa-var-paypal; }
+.#{$fa-css-prefix}-google-wallet:before { content: $fa-var-google-wallet; }
+.#{$fa-css-prefix}-cc-visa:before { content: $fa-var-cc-visa; }
+.#{$fa-css-prefix}-cc-mastercard:before { content: $fa-var-cc-mastercard; }
+.#{$fa-css-prefix}-cc-discover:before { content: $fa-var-cc-discover; }
+.#{$fa-css-prefix}-cc-amex:before { content: $fa-var-cc-amex; }
+.#{$fa-css-prefix}-cc-paypal:before { content: $fa-var-cc-paypal; }
+.#{$fa-css-prefix}-cc-stripe:before { content: $fa-var-cc-stripe; }
+.#{$fa-css-prefix}-bell-slash:before { content: $fa-var-bell-slash; }
+.#{$fa-css-prefix}-bell-slash-o:before { content: $fa-var-bell-slash-o; }
+.#{$fa-css-prefix}-trash:before { content: $fa-var-trash; }
+.#{$fa-css-prefix}-copyright:before { content: $fa-var-copyright; }
+.#{$fa-css-prefix}-at:before { content: $fa-var-at; }
+.#{$fa-css-prefix}-eyedropper:before { content: $fa-var-eyedropper; }
+.#{$fa-css-prefix}-paint-brush:before { content: $fa-var-paint-brush; }
+.#{$fa-css-prefix}-birthday-cake:before { content: $fa-var-birthday-cake; }
+.#{$fa-css-prefix}-area-chart:before { content: $fa-var-area-chart; }
+.#{$fa-css-prefix}-pie-chart:before { content: $fa-var-pie-chart; }
+.#{$fa-css-prefix}-line-chart:before { content: $fa-var-line-chart; }
+.#{$fa-css-prefix}-lastfm:before { content: $fa-var-lastfm; }
+.#{$fa-css-prefix}-lastfm-square:before { content: $fa-var-lastfm-square; }
+.#{$fa-css-prefix}-toggle-off:before { content: $fa-var-toggle-off; }
+.#{$fa-css-prefix}-toggle-on:before { content: $fa-var-toggle-on; }
+.#{$fa-css-prefix}-bicycle:before { content: $fa-var-bicycle; }
+.#{$fa-css-prefix}-bus:before { content: $fa-var-bus; }
+.#{$fa-css-prefix}-ioxhost:before { content: $fa-var-ioxhost; }
+.#{$fa-css-prefix}-angellist:before { content: $fa-var-angellist; }
+.#{$fa-css-prefix}-cc:before { content: $fa-var-cc; }
+.#{$fa-css-prefix}-shekel:before,
+.#{$fa-css-prefix}-sheqel:before,
+.#{$fa-css-prefix}-ils:before { content: $fa-var-ils; }
+.#{$fa-css-prefix}-meanpath:before { content: $fa-var-meanpath; }
+.#{$fa-css-prefix}-buysellads:before { content: $fa-var-buysellads; }
+.#{$fa-css-prefix}-connectdevelop:before { content: $fa-var-connectdevelop; }
+.#{$fa-css-prefix}-dashcube:before { content: $fa-var-dashcube; }
+.#{$fa-css-prefix}-forumbee:before { content: $fa-var-forumbee; }
+.#{$fa-css-prefix}-leanpub:before { content: $fa-var-leanpub; }
+.#{$fa-css-prefix}-sellsy:before { content: $fa-var-sellsy; }
+.#{$fa-css-prefix}-shirtsinbulk:before { content: $fa-var-shirtsinbulk; }
+.#{$fa-css-prefix}-simplybuilt:before { content: $fa-var-simplybuilt; }
+.#{$fa-css-prefix}-skyatlas:before { content: $fa-var-skyatlas; }
+.#{$fa-css-prefix}-cart-plus:before { content: $fa-var-cart-plus; }
+.#{$fa-css-prefix}-cart-arrow-down:before { content: $fa-var-cart-arrow-down; }
+.#{$fa-css-prefix}-diamond:before { content: $fa-var-diamond; }
+.#{$fa-css-prefix}-ship:before { content: $fa-var-ship; }
+.#{$fa-css-prefix}-user-secret:before { content: $fa-var-user-secret; }
+.#{$fa-css-prefix}-motorcycle:before { content: $fa-var-motorcycle; }
+.#{$fa-css-prefix}-street-view:before { content: $fa-var-street-view; }
+.#{$fa-css-prefix}-heartbeat:before { content: $fa-var-heartbeat; }
+.#{$fa-css-prefix}-venus:before { content: $fa-var-venus; }
+.#{$fa-css-prefix}-mars:before { content: $fa-var-mars; }
+.#{$fa-css-prefix}-mercury:before { content: $fa-var-mercury; }
+.#{$fa-css-prefix}-intersex:before,
+.#{$fa-css-prefix}-transgender:before { content: $fa-var-transgender; }
+.#{$fa-css-prefix}-transgender-alt:before { content: $fa-var-transgender-alt; }
+.#{$fa-css-prefix}-venus-double:before { content: $fa-var-venus-double; }
+.#{$fa-css-prefix}-mars-double:before { content: $fa-var-mars-double; }
+.#{$fa-css-prefix}-venus-mars:before { content: $fa-var-venus-mars; }
+.#{$fa-css-prefix}-mars-stroke:before { content: $fa-var-mars-stroke; }
+.#{$fa-css-prefix}-mars-stroke-v:before { content: $fa-var-mars-stroke-v; }
+.#{$fa-css-prefix}-mars-stroke-h:before { content: $fa-var-mars-stroke-h; }
+.#{$fa-css-prefix}-neuter:before { content: $fa-var-neuter; }
+.#{$fa-css-prefix}-genderless:before { content: $fa-var-genderless; }
+.#{$fa-css-prefix}-facebook-official:before { content: $fa-var-facebook-official; }
+.#{$fa-css-prefix}-pinterest-p:before { content: $fa-var-pinterest-p; }
+.#{$fa-css-prefix}-whatsapp:before { content: $fa-var-whatsapp; }
+.#{$fa-css-prefix}-server:before { content: $fa-var-server; }
+.#{$fa-css-prefix}-user-plus:before { content: $fa-var-user-plus; }
+.#{$fa-css-prefix}-user-times:before { content: $fa-var-user-times; }
+.#{$fa-css-prefix}-hotel:before,
+.#{$fa-css-prefix}-bed:before { content: $fa-var-bed; }
+.#{$fa-css-prefix}-viacoin:before { content: $fa-var-viacoin; }
+.#{$fa-css-prefix}-train:before { content: $fa-var-train; }
+.#{$fa-css-prefix}-subway:before { content: $fa-var-subway; }
+.#{$fa-css-prefix}-medium:before { content: $fa-var-medium; }
+.#{$fa-css-prefix}-yc:before,
+.#{$fa-css-prefix}-y-combinator:before { content: $fa-var-y-combinator; }
+.#{$fa-css-prefix}-optin-monster:before { content: $fa-var-optin-monster; }
+.#{$fa-css-prefix}-opencart:before { content: $fa-var-opencart; }
+.#{$fa-css-prefix}-expeditedssl:before { content: $fa-var-expeditedssl; }
+.#{$fa-css-prefix}-battery-4:before,
+.#{$fa-css-prefix}-battery-full:before { content: $fa-var-battery-full; }
+.#{$fa-css-prefix}-battery-3:before,
+.#{$fa-css-prefix}-battery-three-quarters:before { content: $fa-var-battery-three-quarters; }
+.#{$fa-css-prefix}-battery-2:before,
+.#{$fa-css-prefix}-battery-half:before { content: $fa-var-battery-half; }
+.#{$fa-css-prefix}-battery-1:before,
+.#{$fa-css-prefix}-battery-quarter:before { content: $fa-var-battery-quarter; }
+.#{$fa-css-prefix}-battery-0:before,
+.#{$fa-css-prefix}-battery-empty:before { content: $fa-var-battery-empty; }
+.#{$fa-css-prefix}-mouse-pointer:before { content: $fa-var-mouse-pointer; }
+.#{$fa-css-prefix}-i-cursor:before { content: $fa-var-i-cursor; }
+.#{$fa-css-prefix}-object-group:before { content: $fa-var-object-group; }
+.#{$fa-css-prefix}-object-ungroup:before { content: $fa-var-object-ungroup; }
+.#{$fa-css-prefix}-sticky-note:before { content: $fa-var-sticky-note; }
+.#{$fa-css-prefix}-sticky-note-o:before { content: $fa-var-sticky-note-o; }
+.#{$fa-css-prefix}-cc-jcb:before { content: $fa-var-cc-jcb; }
+.#{$fa-css-prefix}-cc-diners-club:before { content: $fa-var-cc-diners-club; }
+.#{$fa-css-prefix}-clone:before { content: $fa-var-clone; }
+.#{$fa-css-prefix}-balance-scale:before { content: $fa-var-balance-scale; }
+.#{$fa-css-prefix}-hourglass-o:before { content: $fa-var-hourglass-o; }
+.#{$fa-css-prefix}-hourglass-1:before,
+.#{$fa-css-prefix}-hourglass-start:before { content: $fa-var-hourglass-start; }
+.#{$fa-css-prefix}-hourglass-2:before,
+.#{$fa-css-prefix}-hourglass-half:before { content: $fa-var-hourglass-half; }
+.#{$fa-css-prefix}-hourglass-3:before,
+.#{$fa-css-prefix}-hourglass-end:before { content: $fa-var-hourglass-end; }
+.#{$fa-css-prefix}-hourglass:before { content: $fa-var-hourglass; }
+.#{$fa-css-prefix}-hand-grab-o:before,
+.#{$fa-css-prefix}-hand-rock-o:before { content: $fa-var-hand-rock-o; }
+.#{$fa-css-prefix}-hand-stop-o:before,
+.#{$fa-css-prefix}-hand-paper-o:before { content: $fa-var-hand-paper-o; }
+.#{$fa-css-prefix}-hand-scissors-o:before { content: $fa-var-hand-scissors-o; }
+.#{$fa-css-prefix}-hand-lizard-o:before { content: $fa-var-hand-lizard-o; }
+.#{$fa-css-prefix}-hand-spock-o:before { content: $fa-var-hand-spock-o; }
+.#{$fa-css-prefix}-hand-pointer-o:before { content: $fa-var-hand-pointer-o; }
+.#{$fa-css-prefix}-hand-peace-o:before { content: $fa-var-hand-peace-o; }
+.#{$fa-css-prefix}-trademark:before { content: $fa-var-trademark; }
+.#{$fa-css-prefix}-registered:before { content: $fa-var-registered; }
+.#{$fa-css-prefix}-creative-commons:before { content: $fa-var-creative-commons; }
+.#{$fa-css-prefix}-gg:before { content: $fa-var-gg; }
+.#{$fa-css-prefix}-gg-circle:before { content: $fa-var-gg-circle; }
+.#{$fa-css-prefix}-tripadvisor:before { content: $fa-var-tripadvisor; }
+.#{$fa-css-prefix}-odnoklassniki:before { content: $fa-var-odnoklassniki; }
+.#{$fa-css-prefix}-odnoklassniki-square:before { content: $fa-var-odnoklassniki-square; }
+.#{$fa-css-prefix}-get-pocket:before { content: $fa-var-get-pocket; }
+.#{$fa-css-prefix}-wikipedia-w:before { content: $fa-var-wikipedia-w; }
+.#{$fa-css-prefix}-safari:before { content: $fa-var-safari; }
+.#{$fa-css-prefix}-chrome:before { content: $fa-var-chrome; }
+.#{$fa-css-prefix}-firefox:before { content: $fa-var-firefox; }
+.#{$fa-css-prefix}-opera:before { content: $fa-var-opera; }
+.#{$fa-css-prefix}-internet-explorer:before { content: $fa-var-internet-explorer; }
+.#{$fa-css-prefix}-tv:before,
+.#{$fa-css-prefix}-television:before { content: $fa-var-television; }
+.#{$fa-css-prefix}-contao:before { content: $fa-var-contao; }
+.#{$fa-css-prefix}-500px:before { content: $fa-var-500px; }
+.#{$fa-css-prefix}-amazon:before { content: $fa-var-amazon; }
+.#{$fa-css-prefix}-calendar-plus-o:before { content: $fa-var-calendar-plus-o; }
+.#{$fa-css-prefix}-calendar-minus-o:before { content: $fa-var-calendar-minus-o; }
+.#{$fa-css-prefix}-calendar-times-o:before { content: $fa-var-calendar-times-o; }
+.#{$fa-css-prefix}-calendar-check-o:before { content: $fa-var-calendar-check-o; }
+.#{$fa-css-prefix}-industry:before { content: $fa-var-industry; }
+.#{$fa-css-prefix}-map-pin:before { content: $fa-var-map-pin; }
+.#{$fa-css-prefix}-map-signs:before { content: $fa-var-map-signs; }
+.#{$fa-css-prefix}-map-o:before { content: $fa-var-map-o; }
+.#{$fa-css-prefix}-map:before { content: $fa-var-map; }
+.#{$fa-css-prefix}-commenting:before { content: $fa-var-commenting; }
+.#{$fa-css-prefix}-commenting-o:before { content: $fa-var-commenting-o; }
+.#{$fa-css-prefix}-houzz:before { content: $fa-var-houzz; }
+.#{$fa-css-prefix}-vimeo:before { content: $fa-var-vimeo; }
+.#{$fa-css-prefix}-black-tie:before { content: $fa-var-black-tie; }
+.#{$fa-css-prefix}-fonticons:before { content: $fa-var-fonticons; }
+.#{$fa-css-prefix}-reddit-alien:before { content: $fa-var-reddit-alien; }
+.#{$fa-css-prefix}-edge:before { content: $fa-var-edge; }
+.#{$fa-css-prefix}-credit-card-alt:before { content: $fa-var-credit-card-alt; }
+.#{$fa-css-prefix}-codiepie:before { content: $fa-var-codiepie; }
+.#{$fa-css-prefix}-modx:before { content: $fa-var-modx; }
+.#{$fa-css-prefix}-fort-awesome:before { content: $fa-var-fort-awesome; }
+.#{$fa-css-prefix}-usb:before { content: $fa-var-usb; }
+.#{$fa-css-prefix}-product-hunt:before { content: $fa-var-product-hunt; }
+.#{$fa-css-prefix}-mixcloud:before { content: $fa-var-mixcloud; }
+.#{$fa-css-prefix}-scribd:before { content: $fa-var-scribd; }
+.#{$fa-css-prefix}-pause-circle:before { content: $fa-var-pause-circle; }
+.#{$fa-css-prefix}-pause-circle-o:before { content: $fa-var-pause-circle-o; }
+.#{$fa-css-prefix}-stop-circle:before { content: $fa-var-stop-circle; }
+.#{$fa-css-prefix}-stop-circle-o:before { content: $fa-var-stop-circle-o; }
+.#{$fa-css-prefix}-shopping-bag:before { content: $fa-var-shopping-bag; }
+.#{$fa-css-prefix}-shopping-basket:before { content: $fa-var-shopping-basket; }
+.#{$fa-css-prefix}-hashtag:before { content: $fa-var-hashtag; }
+.#{$fa-css-prefix}-bluetooth:before { content: $fa-var-bluetooth; }
+.#{$fa-css-prefix}-bluetooth-b:before { content: $fa-var-bluetooth-b; }
+.#{$fa-css-prefix}-percent:before { content: $fa-var-percent; }
diff --git a/web/pgadmin/static/vendor/font-awesome/scss/_larger.scss b/web/pgadmin/static/vendor/font-awesome/scss/_larger.scss
new file mode 100644
index 000000000..41e9a8184
--- /dev/null
+++ b/web/pgadmin/static/vendor/font-awesome/scss/_larger.scss
@@ -0,0 +1,13 @@
+// Icon Sizes
+// -------------------------
+
+/* makes the font 33% larger relative to the icon container */
+.#{$fa-css-prefix}-lg {
+ font-size: (4em / 3);
+ line-height: (3em / 4);
+ vertical-align: -15%;
+}
+.#{$fa-css-prefix}-2x { font-size: 2em; }
+.#{$fa-css-prefix}-3x { font-size: 3em; }
+.#{$fa-css-prefix}-4x { font-size: 4em; }
+.#{$fa-css-prefix}-5x { font-size: 5em; }
diff --git a/web/pgadmin/static/vendor/font-awesome/scss/_list.scss b/web/pgadmin/static/vendor/font-awesome/scss/_list.scss
new file mode 100644
index 000000000..7d1e4d54d
--- /dev/null
+++ b/web/pgadmin/static/vendor/font-awesome/scss/_list.scss
@@ -0,0 +1,19 @@
+// List Icons
+// -------------------------
+
+.#{$fa-css-prefix}-ul {
+ padding-left: 0;
+ margin-left: $fa-li-width;
+ list-style-type: none;
+ > li { position: relative; }
+}
+.#{$fa-css-prefix}-li {
+ position: absolute;
+ left: -$fa-li-width;
+ width: $fa-li-width;
+ top: (2em / 14);
+ text-align: center;
+ &.#{$fa-css-prefix}-lg {
+ left: -$fa-li-width + (4em / 14);
+ }
+}
diff --git a/web/pgadmin/static/vendor/font-awesome/scss/_mixins.scss b/web/pgadmin/static/vendor/font-awesome/scss/_mixins.scss
new file mode 100644
index 000000000..f96719b6a
--- /dev/null
+++ b/web/pgadmin/static/vendor/font-awesome/scss/_mixins.scss
@@ -0,0 +1,26 @@
+// Mixins
+// --------------------------
+
+@mixin fa-icon() {
+ display: inline-block;
+ font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration
+ font-size: inherit; // can't have font-size inherit on line above, so need to override
+ text-rendering: auto; // optimizelegibility throws things off #1094
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+
+}
+
+@mixin fa-icon-rotate($degrees, $rotation) {
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation});
+ -webkit-transform: rotate($degrees);
+ -ms-transform: rotate($degrees);
+ transform: rotate($degrees);
+}
+
+@mixin fa-icon-flip($horiz, $vert, $rotation) {
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation});
+ -webkit-transform: scale($horiz, $vert);
+ -ms-transform: scale($horiz, $vert);
+ transform: scale($horiz, $vert);
+}
diff --git a/web/pgadmin/static/vendor/font-awesome/scss/_path.scss b/web/pgadmin/static/vendor/font-awesome/scss/_path.scss
new file mode 100644
index 000000000..bb457c23a
--- /dev/null
+++ b/web/pgadmin/static/vendor/font-awesome/scss/_path.scss
@@ -0,0 +1,15 @@
+/* FONT PATH
+ * -------------------------- */
+
+@font-face {
+ font-family: 'FontAwesome';
+ src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}');
+ src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'),
+ url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'),
+ url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'),
+ url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'),
+ url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg');
+// src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts
+ font-weight: normal;
+ font-style: normal;
+}
diff --git a/web/pgadmin/static/vendor/font-awesome/scss/_rotated-flipped.scss b/web/pgadmin/static/vendor/font-awesome/scss/_rotated-flipped.scss
new file mode 100644
index 000000000..a3558fd09
--- /dev/null
+++ b/web/pgadmin/static/vendor/font-awesome/scss/_rotated-flipped.scss
@@ -0,0 +1,20 @@
+// Rotated & Flipped Icons
+// -------------------------
+
+.#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); }
+.#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); }
+.#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); }
+
+.#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); }
+.#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); }
+
+// Hook for IE8-9
+// -------------------------
+
+:root .#{$fa-css-prefix}-rotate-90,
+:root .#{$fa-css-prefix}-rotate-180,
+:root .#{$fa-css-prefix}-rotate-270,
+:root .#{$fa-css-prefix}-flip-horizontal,
+:root .#{$fa-css-prefix}-flip-vertical {
+ filter: none;
+}
diff --git a/web/pgadmin/static/vendor/font-awesome/scss/_stacked.scss b/web/pgadmin/static/vendor/font-awesome/scss/_stacked.scss
new file mode 100644
index 000000000..aef740366
--- /dev/null
+++ b/web/pgadmin/static/vendor/font-awesome/scss/_stacked.scss
@@ -0,0 +1,20 @@
+// Stacked Icons
+// -------------------------
+
+.#{$fa-css-prefix}-stack {
+ position: relative;
+ display: inline-block;
+ width: 2em;
+ height: 2em;
+ line-height: 2em;
+ vertical-align: middle;
+}
+.#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x {
+ position: absolute;
+ left: 0;
+ width: 100%;
+ text-align: center;
+}
+.#{$fa-css-prefix}-stack-1x { line-height: inherit; }
+.#{$fa-css-prefix}-stack-2x { font-size: 2em; }
+.#{$fa-css-prefix}-inverse { color: $fa-inverse; }
diff --git a/web/pgadmin/static/vendor/font-awesome/scss/_variables.scss b/web/pgadmin/static/vendor/font-awesome/scss/_variables.scss
new file mode 100644
index 000000000..0a471102c
--- /dev/null
+++ b/web/pgadmin/static/vendor/font-awesome/scss/_variables.scss
@@ -0,0 +1,708 @@
+// Variables
+// --------------------------
+
+$fa-font-path: "../fonts" !default;
+$fa-font-size-base: 14px !default;
+$fa-line-height-base: 1 !default;
+//$fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.5.0/fonts" !default; // for referencing Bootstrap CDN font files directly
+$fa-css-prefix: fa !default;
+$fa-version: "4.5.0" !default;
+$fa-border-color: #eee !default;
+$fa-inverse: #fff !default;
+$fa-li-width: (30em / 14) !default;
+
+$fa-var-500px: "\f26e";
+$fa-var-adjust: "\f042";
+$fa-var-adn: "\f170";
+$fa-var-align-center: "\f037";
+$fa-var-align-justify: "\f039";
+$fa-var-align-left: "\f036";
+$fa-var-align-right: "\f038";
+$fa-var-amazon: "\f270";
+$fa-var-ambulance: "\f0f9";
+$fa-var-anchor: "\f13d";
+$fa-var-android: "\f17b";
+$fa-var-angellist: "\f209";
+$fa-var-angle-double-down: "\f103";
+$fa-var-angle-double-left: "\f100";
+$fa-var-angle-double-right: "\f101";
+$fa-var-angle-double-up: "\f102";
+$fa-var-angle-down: "\f107";
+$fa-var-angle-left: "\f104";
+$fa-var-angle-right: "\f105";
+$fa-var-angle-up: "\f106";
+$fa-var-apple: "\f179";
+$fa-var-archive: "\f187";
+$fa-var-area-chart: "\f1fe";
+$fa-var-arrow-circle-down: "\f0ab";
+$fa-var-arrow-circle-left: "\f0a8";
+$fa-var-arrow-circle-o-down: "\f01a";
+$fa-var-arrow-circle-o-left: "\f190";
+$fa-var-arrow-circle-o-right: "\f18e";
+$fa-var-arrow-circle-o-up: "\f01b";
+$fa-var-arrow-circle-right: "\f0a9";
+$fa-var-arrow-circle-up: "\f0aa";
+$fa-var-arrow-down: "\f063";
+$fa-var-arrow-left: "\f060";
+$fa-var-arrow-right: "\f061";
+$fa-var-arrow-up: "\f062";
+$fa-var-arrows: "\f047";
+$fa-var-arrows-alt: "\f0b2";
+$fa-var-arrows-h: "\f07e";
+$fa-var-arrows-v: "\f07d";
+$fa-var-asterisk: "\f069";
+$fa-var-at: "\f1fa";
+$fa-var-automobile: "\f1b9";
+$fa-var-backward: "\f04a";
+$fa-var-balance-scale: "\f24e";
+$fa-var-ban: "\f05e";
+$fa-var-bank: "\f19c";
+$fa-var-bar-chart: "\f080";
+$fa-var-bar-chart-o: "\f080";
+$fa-var-barcode: "\f02a";
+$fa-var-bars: "\f0c9";
+$fa-var-battery-0: "\f244";
+$fa-var-battery-1: "\f243";
+$fa-var-battery-2: "\f242";
+$fa-var-battery-3: "\f241";
+$fa-var-battery-4: "\f240";
+$fa-var-battery-empty: "\f244";
+$fa-var-battery-full: "\f240";
+$fa-var-battery-half: "\f242";
+$fa-var-battery-quarter: "\f243";
+$fa-var-battery-three-quarters: "\f241";
+$fa-var-bed: "\f236";
+$fa-var-beer: "\f0fc";
+$fa-var-behance: "\f1b4";
+$fa-var-behance-square: "\f1b5";
+$fa-var-bell: "\f0f3";
+$fa-var-bell-o: "\f0a2";
+$fa-var-bell-slash: "\f1f6";
+$fa-var-bell-slash-o: "\f1f7";
+$fa-var-bicycle: "\f206";
+$fa-var-binoculars: "\f1e5";
+$fa-var-birthday-cake: "\f1fd";
+$fa-var-bitbucket: "\f171";
+$fa-var-bitbucket-square: "\f172";
+$fa-var-bitcoin: "\f15a";
+$fa-var-black-tie: "\f27e";
+$fa-var-bluetooth: "\f293";
+$fa-var-bluetooth-b: "\f294";
+$fa-var-bold: "\f032";
+$fa-var-bolt: "\f0e7";
+$fa-var-bomb: "\f1e2";
+$fa-var-book: "\f02d";
+$fa-var-bookmark: "\f02e";
+$fa-var-bookmark-o: "\f097";
+$fa-var-briefcase: "\f0b1";
+$fa-var-btc: "\f15a";
+$fa-var-bug: "\f188";
+$fa-var-building: "\f1ad";
+$fa-var-building-o: "\f0f7";
+$fa-var-bullhorn: "\f0a1";
+$fa-var-bullseye: "\f140";
+$fa-var-bus: "\f207";
+$fa-var-buysellads: "\f20d";
+$fa-var-cab: "\f1ba";
+$fa-var-calculator: "\f1ec";
+$fa-var-calendar: "\f073";
+$fa-var-calendar-check-o: "\f274";
+$fa-var-calendar-minus-o: "\f272";
+$fa-var-calendar-o: "\f133";
+$fa-var-calendar-plus-o: "\f271";
+$fa-var-calendar-times-o: "\f273";
+$fa-var-camera: "\f030";
+$fa-var-camera-retro: "\f083";
+$fa-var-car: "\f1b9";
+$fa-var-caret-down: "\f0d7";
+$fa-var-caret-left: "\f0d9";
+$fa-var-caret-right: "\f0da";
+$fa-var-caret-square-o-down: "\f150";
+$fa-var-caret-square-o-left: "\f191";
+$fa-var-caret-square-o-right: "\f152";
+$fa-var-caret-square-o-up: "\f151";
+$fa-var-caret-up: "\f0d8";
+$fa-var-cart-arrow-down: "\f218";
+$fa-var-cart-plus: "\f217";
+$fa-var-cc: "\f20a";
+$fa-var-cc-amex: "\f1f3";
+$fa-var-cc-diners-club: "\f24c";
+$fa-var-cc-discover: "\f1f2";
+$fa-var-cc-jcb: "\f24b";
+$fa-var-cc-mastercard: "\f1f1";
+$fa-var-cc-paypal: "\f1f4";
+$fa-var-cc-stripe: "\f1f5";
+$fa-var-cc-visa: "\f1f0";
+$fa-var-certificate: "\f0a3";
+$fa-var-chain: "\f0c1";
+$fa-var-chain-broken: "\f127";
+$fa-var-check: "\f00c";
+$fa-var-check-circle: "\f058";
+$fa-var-check-circle-o: "\f05d";
+$fa-var-check-square: "\f14a";
+$fa-var-check-square-o: "\f046";
+$fa-var-chevron-circle-down: "\f13a";
+$fa-var-chevron-circle-left: "\f137";
+$fa-var-chevron-circle-right: "\f138";
+$fa-var-chevron-circle-up: "\f139";
+$fa-var-chevron-down: "\f078";
+$fa-var-chevron-left: "\f053";
+$fa-var-chevron-right: "\f054";
+$fa-var-chevron-up: "\f077";
+$fa-var-child: "\f1ae";
+$fa-var-chrome: "\f268";
+$fa-var-circle: "\f111";
+$fa-var-circle-o: "\f10c";
+$fa-var-circle-o-notch: "\f1ce";
+$fa-var-circle-thin: "\f1db";
+$fa-var-clipboard: "\f0ea";
+$fa-var-clock-o: "\f017";
+$fa-var-clone: "\f24d";
+$fa-var-close: "\f00d";
+$fa-var-cloud: "\f0c2";
+$fa-var-cloud-download: "\f0ed";
+$fa-var-cloud-upload: "\f0ee";
+$fa-var-cny: "\f157";
+$fa-var-code: "\f121";
+$fa-var-code-fork: "\f126";
+$fa-var-codepen: "\f1cb";
+$fa-var-codiepie: "\f284";
+$fa-var-coffee: "\f0f4";
+$fa-var-cog: "\f013";
+$fa-var-cogs: "\f085";
+$fa-var-columns: "\f0db";
+$fa-var-comment: "\f075";
+$fa-var-comment-o: "\f0e5";
+$fa-var-commenting: "\f27a";
+$fa-var-commenting-o: "\f27b";
+$fa-var-comments: "\f086";
+$fa-var-comments-o: "\f0e6";
+$fa-var-compass: "\f14e";
+$fa-var-compress: "\f066";
+$fa-var-connectdevelop: "\f20e";
+$fa-var-contao: "\f26d";
+$fa-var-copy: "\f0c5";
+$fa-var-copyright: "\f1f9";
+$fa-var-creative-commons: "\f25e";
+$fa-var-credit-card: "\f09d";
+$fa-var-credit-card-alt: "\f283";
+$fa-var-crop: "\f125";
+$fa-var-crosshairs: "\f05b";
+$fa-var-css3: "\f13c";
+$fa-var-cube: "\f1b2";
+$fa-var-cubes: "\f1b3";
+$fa-var-cut: "\f0c4";
+$fa-var-cutlery: "\f0f5";
+$fa-var-dashboard: "\f0e4";
+$fa-var-dashcube: "\f210";
+$fa-var-database: "\f1c0";
+$fa-var-dedent: "\f03b";
+$fa-var-delicious: "\f1a5";
+$fa-var-desktop: "\f108";
+$fa-var-deviantart: "\f1bd";
+$fa-var-diamond: "\f219";
+$fa-var-digg: "\f1a6";
+$fa-var-dollar: "\f155";
+$fa-var-dot-circle-o: "\f192";
+$fa-var-download: "\f019";
+$fa-var-dribbble: "\f17d";
+$fa-var-dropbox: "\f16b";
+$fa-var-drupal: "\f1a9";
+$fa-var-edge: "\f282";
+$fa-var-edit: "\f044";
+$fa-var-eject: "\f052";
+$fa-var-ellipsis-h: "\f141";
+$fa-var-ellipsis-v: "\f142";
+$fa-var-empire: "\f1d1";
+$fa-var-envelope: "\f0e0";
+$fa-var-envelope-o: "\f003";
+$fa-var-envelope-square: "\f199";
+$fa-var-eraser: "\f12d";
+$fa-var-eur: "\f153";
+$fa-var-euro: "\f153";
+$fa-var-exchange: "\f0ec";
+$fa-var-exclamation: "\f12a";
+$fa-var-exclamation-circle: "\f06a";
+$fa-var-exclamation-triangle: "\f071";
+$fa-var-expand: "\f065";
+$fa-var-expeditedssl: "\f23e";
+$fa-var-external-link: "\f08e";
+$fa-var-external-link-square: "\f14c";
+$fa-var-eye: "\f06e";
+$fa-var-eye-slash: "\f070";
+$fa-var-eyedropper: "\f1fb";
+$fa-var-facebook: "\f09a";
+$fa-var-facebook-f: "\f09a";
+$fa-var-facebook-official: "\f230";
+$fa-var-facebook-square: "\f082";
+$fa-var-fast-backward: "\f049";
+$fa-var-fast-forward: "\f050";
+$fa-var-fax: "\f1ac";
+$fa-var-feed: "\f09e";
+$fa-var-female: "\f182";
+$fa-var-fighter-jet: "\f0fb";
+$fa-var-file: "\f15b";
+$fa-var-file-archive-o: "\f1c6";
+$fa-var-file-audio-o: "\f1c7";
+$fa-var-file-code-o: "\f1c9";
+$fa-var-file-excel-o: "\f1c3";
+$fa-var-file-image-o: "\f1c5";
+$fa-var-file-movie-o: "\f1c8";
+$fa-var-file-o: "\f016";
+$fa-var-file-pdf-o: "\f1c1";
+$fa-var-file-photo-o: "\f1c5";
+$fa-var-file-picture-o: "\f1c5";
+$fa-var-file-powerpoint-o: "\f1c4";
+$fa-var-file-sound-o: "\f1c7";
+$fa-var-file-text: "\f15c";
+$fa-var-file-text-o: "\f0f6";
+$fa-var-file-video-o: "\f1c8";
+$fa-var-file-word-o: "\f1c2";
+$fa-var-file-zip-o: "\f1c6";
+$fa-var-files-o: "\f0c5";
+$fa-var-film: "\f008";
+$fa-var-filter: "\f0b0";
+$fa-var-fire: "\f06d";
+$fa-var-fire-extinguisher: "\f134";
+$fa-var-firefox: "\f269";
+$fa-var-flag: "\f024";
+$fa-var-flag-checkered: "\f11e";
+$fa-var-flag-o: "\f11d";
+$fa-var-flash: "\f0e7";
+$fa-var-flask: "\f0c3";
+$fa-var-flickr: "\f16e";
+$fa-var-floppy-o: "\f0c7";
+$fa-var-folder: "\f07b";
+$fa-var-folder-o: "\f114";
+$fa-var-folder-open: "\f07c";
+$fa-var-folder-open-o: "\f115";
+$fa-var-font: "\f031";
+$fa-var-fonticons: "\f280";
+$fa-var-fort-awesome: "\f286";
+$fa-var-forumbee: "\f211";
+$fa-var-forward: "\f04e";
+$fa-var-foursquare: "\f180";
+$fa-var-frown-o: "\f119";
+$fa-var-futbol-o: "\f1e3";
+$fa-var-gamepad: "\f11b";
+$fa-var-gavel: "\f0e3";
+$fa-var-gbp: "\f154";
+$fa-var-ge: "\f1d1";
+$fa-var-gear: "\f013";
+$fa-var-gears: "\f085";
+$fa-var-genderless: "\f22d";
+$fa-var-get-pocket: "\f265";
+$fa-var-gg: "\f260";
+$fa-var-gg-circle: "\f261";
+$fa-var-gift: "\f06b";
+$fa-var-git: "\f1d3";
+$fa-var-git-square: "\f1d2";
+$fa-var-github: "\f09b";
+$fa-var-github-alt: "\f113";
+$fa-var-github-square: "\f092";
+$fa-var-gittip: "\f184";
+$fa-var-glass: "\f000";
+$fa-var-globe: "\f0ac";
+$fa-var-google: "\f1a0";
+$fa-var-google-plus: "\f0d5";
+$fa-var-google-plus-square: "\f0d4";
+$fa-var-google-wallet: "\f1ee";
+$fa-var-graduation-cap: "\f19d";
+$fa-var-gratipay: "\f184";
+$fa-var-group: "\f0c0";
+$fa-var-h-square: "\f0fd";
+$fa-var-hacker-news: "\f1d4";
+$fa-var-hand-grab-o: "\f255";
+$fa-var-hand-lizard-o: "\f258";
+$fa-var-hand-o-down: "\f0a7";
+$fa-var-hand-o-left: "\f0a5";
+$fa-var-hand-o-right: "\f0a4";
+$fa-var-hand-o-up: "\f0a6";
+$fa-var-hand-paper-o: "\f256";
+$fa-var-hand-peace-o: "\f25b";
+$fa-var-hand-pointer-o: "\f25a";
+$fa-var-hand-rock-o: "\f255";
+$fa-var-hand-scissors-o: "\f257";
+$fa-var-hand-spock-o: "\f259";
+$fa-var-hand-stop-o: "\f256";
+$fa-var-hashtag: "\f292";
+$fa-var-hdd-o: "\f0a0";
+$fa-var-header: "\f1dc";
+$fa-var-headphones: "\f025";
+$fa-var-heart: "\f004";
+$fa-var-heart-o: "\f08a";
+$fa-var-heartbeat: "\f21e";
+$fa-var-history: "\f1da";
+$fa-var-home: "\f015";
+$fa-var-hospital-o: "\f0f8";
+$fa-var-hotel: "\f236";
+$fa-var-hourglass: "\f254";
+$fa-var-hourglass-1: "\f251";
+$fa-var-hourglass-2: "\f252";
+$fa-var-hourglass-3: "\f253";
+$fa-var-hourglass-end: "\f253";
+$fa-var-hourglass-half: "\f252";
+$fa-var-hourglass-o: "\f250";
+$fa-var-hourglass-start: "\f251";
+$fa-var-houzz: "\f27c";
+$fa-var-html5: "\f13b";
+$fa-var-i-cursor: "\f246";
+$fa-var-ils: "\f20b";
+$fa-var-image: "\f03e";
+$fa-var-inbox: "\f01c";
+$fa-var-indent: "\f03c";
+$fa-var-industry: "\f275";
+$fa-var-info: "\f129";
+$fa-var-info-circle: "\f05a";
+$fa-var-inr: "\f156";
+$fa-var-instagram: "\f16d";
+$fa-var-institution: "\f19c";
+$fa-var-internet-explorer: "\f26b";
+$fa-var-intersex: "\f224";
+$fa-var-ioxhost: "\f208";
+$fa-var-italic: "\f033";
+$fa-var-joomla: "\f1aa";
+$fa-var-jpy: "\f157";
+$fa-var-jsfiddle: "\f1cc";
+$fa-var-key: "\f084";
+$fa-var-keyboard-o: "\f11c";
+$fa-var-krw: "\f159";
+$fa-var-language: "\f1ab";
+$fa-var-laptop: "\f109";
+$fa-var-lastfm: "\f202";
+$fa-var-lastfm-square: "\f203";
+$fa-var-leaf: "\f06c";
+$fa-var-leanpub: "\f212";
+$fa-var-legal: "\f0e3";
+$fa-var-lemon-o: "\f094";
+$fa-var-level-down: "\f149";
+$fa-var-level-up: "\f148";
+$fa-var-life-bouy: "\f1cd";
+$fa-var-life-buoy: "\f1cd";
+$fa-var-life-ring: "\f1cd";
+$fa-var-life-saver: "\f1cd";
+$fa-var-lightbulb-o: "\f0eb";
+$fa-var-line-chart: "\f201";
+$fa-var-link: "\f0c1";
+$fa-var-linkedin: "\f0e1";
+$fa-var-linkedin-square: "\f08c";
+$fa-var-linux: "\f17c";
+$fa-var-list: "\f03a";
+$fa-var-list-alt: "\f022";
+$fa-var-list-ol: "\f0cb";
+$fa-var-list-ul: "\f0ca";
+$fa-var-location-arrow: "\f124";
+$fa-var-lock: "\f023";
+$fa-var-long-arrow-down: "\f175";
+$fa-var-long-arrow-left: "\f177";
+$fa-var-long-arrow-right: "\f178";
+$fa-var-long-arrow-up: "\f176";
+$fa-var-magic: "\f0d0";
+$fa-var-magnet: "\f076";
+$fa-var-mail-forward: "\f064";
+$fa-var-mail-reply: "\f112";
+$fa-var-mail-reply-all: "\f122";
+$fa-var-male: "\f183";
+$fa-var-map: "\f279";
+$fa-var-map-marker: "\f041";
+$fa-var-map-o: "\f278";
+$fa-var-map-pin: "\f276";
+$fa-var-map-signs: "\f277";
+$fa-var-mars: "\f222";
+$fa-var-mars-double: "\f227";
+$fa-var-mars-stroke: "\f229";
+$fa-var-mars-stroke-h: "\f22b";
+$fa-var-mars-stroke-v: "\f22a";
+$fa-var-maxcdn: "\f136";
+$fa-var-meanpath: "\f20c";
+$fa-var-medium: "\f23a";
+$fa-var-medkit: "\f0fa";
+$fa-var-meh-o: "\f11a";
+$fa-var-mercury: "\f223";
+$fa-var-microphone: "\f130";
+$fa-var-microphone-slash: "\f131";
+$fa-var-minus: "\f068";
+$fa-var-minus-circle: "\f056";
+$fa-var-minus-square: "\f146";
+$fa-var-minus-square-o: "\f147";
+$fa-var-mixcloud: "\f289";
+$fa-var-mobile: "\f10b";
+$fa-var-mobile-phone: "\f10b";
+$fa-var-modx: "\f285";
+$fa-var-money: "\f0d6";
+$fa-var-moon-o: "\f186";
+$fa-var-mortar-board: "\f19d";
+$fa-var-motorcycle: "\f21c";
+$fa-var-mouse-pointer: "\f245";
+$fa-var-music: "\f001";
+$fa-var-navicon: "\f0c9";
+$fa-var-neuter: "\f22c";
+$fa-var-newspaper-o: "\f1ea";
+$fa-var-object-group: "\f247";
+$fa-var-object-ungroup: "\f248";
+$fa-var-odnoklassniki: "\f263";
+$fa-var-odnoklassniki-square: "\f264";
+$fa-var-opencart: "\f23d";
+$fa-var-openid: "\f19b";
+$fa-var-opera: "\f26a";
+$fa-var-optin-monster: "\f23c";
+$fa-var-outdent: "\f03b";
+$fa-var-pagelines: "\f18c";
+$fa-var-paint-brush: "\f1fc";
+$fa-var-paper-plane: "\f1d8";
+$fa-var-paper-plane-o: "\f1d9";
+$fa-var-paperclip: "\f0c6";
+$fa-var-paragraph: "\f1dd";
+$fa-var-paste: "\f0ea";
+$fa-var-pause: "\f04c";
+$fa-var-pause-circle: "\f28b";
+$fa-var-pause-circle-o: "\f28c";
+$fa-var-paw: "\f1b0";
+$fa-var-paypal: "\f1ed";
+$fa-var-pencil: "\f040";
+$fa-var-pencil-square: "\f14b";
+$fa-var-pencil-square-o: "\f044";
+$fa-var-percent: "\f295";
+$fa-var-phone: "\f095";
+$fa-var-phone-square: "\f098";
+$fa-var-photo: "\f03e";
+$fa-var-picture-o: "\f03e";
+$fa-var-pie-chart: "\f200";
+$fa-var-pied-piper: "\f1a7";
+$fa-var-pied-piper-alt: "\f1a8";
+$fa-var-pinterest: "\f0d2";
+$fa-var-pinterest-p: "\f231";
+$fa-var-pinterest-square: "\f0d3";
+$fa-var-plane: "\f072";
+$fa-var-play: "\f04b";
+$fa-var-play-circle: "\f144";
+$fa-var-play-circle-o: "\f01d";
+$fa-var-plug: "\f1e6";
+$fa-var-plus: "\f067";
+$fa-var-plus-circle: "\f055";
+$fa-var-plus-square: "\f0fe";
+$fa-var-plus-square-o: "\f196";
+$fa-var-power-off: "\f011";
+$fa-var-print: "\f02f";
+$fa-var-product-hunt: "\f288";
+$fa-var-puzzle-piece: "\f12e";
+$fa-var-qq: "\f1d6";
+$fa-var-qrcode: "\f029";
+$fa-var-question: "\f128";
+$fa-var-question-circle: "\f059";
+$fa-var-quote-left: "\f10d";
+$fa-var-quote-right: "\f10e";
+$fa-var-ra: "\f1d0";
+$fa-var-random: "\f074";
+$fa-var-rebel: "\f1d0";
+$fa-var-recycle: "\f1b8";
+$fa-var-reddit: "\f1a1";
+$fa-var-reddit-alien: "\f281";
+$fa-var-reddit-square: "\f1a2";
+$fa-var-refresh: "\f021";
+$fa-var-registered: "\f25d";
+$fa-var-remove: "\f00d";
+$fa-var-renren: "\f18b";
+$fa-var-reorder: "\f0c9";
+$fa-var-repeat: "\f01e";
+$fa-var-reply: "\f112";
+$fa-var-reply-all: "\f122";
+$fa-var-retweet: "\f079";
+$fa-var-rmb: "\f157";
+$fa-var-road: "\f018";
+$fa-var-rocket: "\f135";
+$fa-var-rotate-left: "\f0e2";
+$fa-var-rotate-right: "\f01e";
+$fa-var-rouble: "\f158";
+$fa-var-rss: "\f09e";
+$fa-var-rss-square: "\f143";
+$fa-var-rub: "\f158";
+$fa-var-ruble: "\f158";
+$fa-var-rupee: "\f156";
+$fa-var-safari: "\f267";
+$fa-var-save: "\f0c7";
+$fa-var-scissors: "\f0c4";
+$fa-var-scribd: "\f28a";
+$fa-var-search: "\f002";
+$fa-var-search-minus: "\f010";
+$fa-var-search-plus: "\f00e";
+$fa-var-sellsy: "\f213";
+$fa-var-send: "\f1d8";
+$fa-var-send-o: "\f1d9";
+$fa-var-server: "\f233";
+$fa-var-share: "\f064";
+$fa-var-share-alt: "\f1e0";
+$fa-var-share-alt-square: "\f1e1";
+$fa-var-share-square: "\f14d";
+$fa-var-share-square-o: "\f045";
+$fa-var-shekel: "\f20b";
+$fa-var-sheqel: "\f20b";
+$fa-var-shield: "\f132";
+$fa-var-ship: "\f21a";
+$fa-var-shirtsinbulk: "\f214";
+$fa-var-shopping-bag: "\f290";
+$fa-var-shopping-basket: "\f291";
+$fa-var-shopping-cart: "\f07a";
+$fa-var-sign-in: "\f090";
+$fa-var-sign-out: "\f08b";
+$fa-var-signal: "\f012";
+$fa-var-simplybuilt: "\f215";
+$fa-var-sitemap: "\f0e8";
+$fa-var-skyatlas: "\f216";
+$fa-var-skype: "\f17e";
+$fa-var-slack: "\f198";
+$fa-var-sliders: "\f1de";
+$fa-var-slideshare: "\f1e7";
+$fa-var-smile-o: "\f118";
+$fa-var-soccer-ball-o: "\f1e3";
+$fa-var-sort: "\f0dc";
+$fa-var-sort-alpha-asc: "\f15d";
+$fa-var-sort-alpha-desc: "\f15e";
+$fa-var-sort-amount-asc: "\f160";
+$fa-var-sort-amount-desc: "\f161";
+$fa-var-sort-asc: "\f0de";
+$fa-var-sort-desc: "\f0dd";
+$fa-var-sort-down: "\f0dd";
+$fa-var-sort-numeric-asc: "\f162";
+$fa-var-sort-numeric-desc: "\f163";
+$fa-var-sort-up: "\f0de";
+$fa-var-soundcloud: "\f1be";
+$fa-var-space-shuttle: "\f197";
+$fa-var-spinner: "\f110";
+$fa-var-spoon: "\f1b1";
+$fa-var-spotify: "\f1bc";
+$fa-var-square: "\f0c8";
+$fa-var-square-o: "\f096";
+$fa-var-stack-exchange: "\f18d";
+$fa-var-stack-overflow: "\f16c";
+$fa-var-star: "\f005";
+$fa-var-star-half: "\f089";
+$fa-var-star-half-empty: "\f123";
+$fa-var-star-half-full: "\f123";
+$fa-var-star-half-o: "\f123";
+$fa-var-star-o: "\f006";
+$fa-var-steam: "\f1b6";
+$fa-var-steam-square: "\f1b7";
+$fa-var-step-backward: "\f048";
+$fa-var-step-forward: "\f051";
+$fa-var-stethoscope: "\f0f1";
+$fa-var-sticky-note: "\f249";
+$fa-var-sticky-note-o: "\f24a";
+$fa-var-stop: "\f04d";
+$fa-var-stop-circle: "\f28d";
+$fa-var-stop-circle-o: "\f28e";
+$fa-var-street-view: "\f21d";
+$fa-var-strikethrough: "\f0cc";
+$fa-var-stumbleupon: "\f1a4";
+$fa-var-stumbleupon-circle: "\f1a3";
+$fa-var-subscript: "\f12c";
+$fa-var-subway: "\f239";
+$fa-var-suitcase: "\f0f2";
+$fa-var-sun-o: "\f185";
+$fa-var-superscript: "\f12b";
+$fa-var-support: "\f1cd";
+$fa-var-table: "\f0ce";
+$fa-var-tablet: "\f10a";
+$fa-var-tachometer: "\f0e4";
+$fa-var-tag: "\f02b";
+$fa-var-tags: "\f02c";
+$fa-var-tasks: "\f0ae";
+$fa-var-taxi: "\f1ba";
+$fa-var-television: "\f26c";
+$fa-var-tencent-weibo: "\f1d5";
+$fa-var-terminal: "\f120";
+$fa-var-text-height: "\f034";
+$fa-var-text-width: "\f035";
+$fa-var-th: "\f00a";
+$fa-var-th-large: "\f009";
+$fa-var-th-list: "\f00b";
+$fa-var-thumb-tack: "\f08d";
+$fa-var-thumbs-down: "\f165";
+$fa-var-thumbs-o-down: "\f088";
+$fa-var-thumbs-o-up: "\f087";
+$fa-var-thumbs-up: "\f164";
+$fa-var-ticket: "\f145";
+$fa-var-times: "\f00d";
+$fa-var-times-circle: "\f057";
+$fa-var-times-circle-o: "\f05c";
+$fa-var-tint: "\f043";
+$fa-var-toggle-down: "\f150";
+$fa-var-toggle-left: "\f191";
+$fa-var-toggle-off: "\f204";
+$fa-var-toggle-on: "\f205";
+$fa-var-toggle-right: "\f152";
+$fa-var-toggle-up: "\f151";
+$fa-var-trademark: "\f25c";
+$fa-var-train: "\f238";
+$fa-var-transgender: "\f224";
+$fa-var-transgender-alt: "\f225";
+$fa-var-trash: "\f1f8";
+$fa-var-trash-o: "\f014";
+$fa-var-tree: "\f1bb";
+$fa-var-trello: "\f181";
+$fa-var-tripadvisor: "\f262";
+$fa-var-trophy: "\f091";
+$fa-var-truck: "\f0d1";
+$fa-var-try: "\f195";
+$fa-var-tty: "\f1e4";
+$fa-var-tumblr: "\f173";
+$fa-var-tumblr-square: "\f174";
+$fa-var-turkish-lira: "\f195";
+$fa-var-tv: "\f26c";
+$fa-var-twitch: "\f1e8";
+$fa-var-twitter: "\f099";
+$fa-var-twitter-square: "\f081";
+$fa-var-umbrella: "\f0e9";
+$fa-var-underline: "\f0cd";
+$fa-var-undo: "\f0e2";
+$fa-var-university: "\f19c";
+$fa-var-unlink: "\f127";
+$fa-var-unlock: "\f09c";
+$fa-var-unlock-alt: "\f13e";
+$fa-var-unsorted: "\f0dc";
+$fa-var-upload: "\f093";
+$fa-var-usb: "\f287";
+$fa-var-usd: "\f155";
+$fa-var-user: "\f007";
+$fa-var-user-md: "\f0f0";
+$fa-var-user-plus: "\f234";
+$fa-var-user-secret: "\f21b";
+$fa-var-user-times: "\f235";
+$fa-var-users: "\f0c0";
+$fa-var-venus: "\f221";
+$fa-var-venus-double: "\f226";
+$fa-var-venus-mars: "\f228";
+$fa-var-viacoin: "\f237";
+$fa-var-video-camera: "\f03d";
+$fa-var-vimeo: "\f27d";
+$fa-var-vimeo-square: "\f194";
+$fa-var-vine: "\f1ca";
+$fa-var-vk: "\f189";
+$fa-var-volume-down: "\f027";
+$fa-var-volume-off: "\f026";
+$fa-var-volume-up: "\f028";
+$fa-var-warning: "\f071";
+$fa-var-wechat: "\f1d7";
+$fa-var-weibo: "\f18a";
+$fa-var-weixin: "\f1d7";
+$fa-var-whatsapp: "\f232";
+$fa-var-wheelchair: "\f193";
+$fa-var-wifi: "\f1eb";
+$fa-var-wikipedia-w: "\f266";
+$fa-var-windows: "\f17a";
+$fa-var-won: "\f159";
+$fa-var-wordpress: "\f19a";
+$fa-var-wrench: "\f0ad";
+$fa-var-xing: "\f168";
+$fa-var-xing-square: "\f169";
+$fa-var-y-combinator: "\f23b";
+$fa-var-y-combinator-square: "\f1d4";
+$fa-var-yahoo: "\f19e";
+$fa-var-yc: "\f23b";
+$fa-var-yc-square: "\f1d4";
+$fa-var-yelp: "\f1e9";
+$fa-var-yen: "\f157";
+$fa-var-youtube: "\f167";
+$fa-var-youtube-play: "\f16a";
+$fa-var-youtube-square: "\f166";
+
diff --git a/web/pgadmin/static/vendor/font-awesome/scss/font-awesome.scss b/web/pgadmin/static/vendor/font-awesome/scss/font-awesome.scss
new file mode 100644
index 000000000..f4668a53c
--- /dev/null
+++ b/web/pgadmin/static/vendor/font-awesome/scss/font-awesome.scss
@@ -0,0 +1,17 @@
+/*!
+ * Font Awesome 4.5.0 by @davegandy - http://fontawesome.io - @fontawesome
+ * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
+ */
+
+@import "variables";
+@import "mixins";
+@import "path";
+@import "core";
+@import "larger";
+@import "fixed-width";
+@import "list";
+@import "bordered-pulled";
+@import "animated";
+@import "rotated-flipped";
+@import "stacked";
+@import "icons";
diff --git a/web/pgadmin/static/css/font-mfizz.css b/web/pgadmin/static/vendor/font-mfizz/font-mfizz.css
old mode 100644
new mode 100755
similarity index 95%
rename from web/pgadmin/static/css/font-mfizz.css
rename to web/pgadmin/static/vendor/font-mfizz/font-mfizz.css
index da006d85b..846ff50ab
--- a/web/pgadmin/static/css/font-mfizz.css
+++ b/web/pgadmin/static/vendor/font-mfizz/font-mfizz.css
@@ -15,11 +15,11 @@
@font-face {
font-family: "FontMfizz";
- src: url("../fonts/font-mfizz.eot");
- src: url("../fonts/font-mfizz.eot?#iefix") format("embedded-opentype"),
- url("../fonts/font-mfizz.woff") format("woff"),
- url("../fonts/font-mfizz.ttf") format("truetype"),
- url("../fonts/font-mfizz.svg#font-mfizz") format("svg");
+ src: url("./font-mfizz.eot");
+ src: url("./font-mfizz.eot?#iefix") format("embedded-opentype"),
+ url("./font-mfizz.woff") format("woff"),
+ url("./font-mfizz.ttf") format("truetype"),
+ url("./font-mfizz.svg#font-mfizz") format("svg");
font-weight: normal;
font-style: normal;
}
@@ -27,7 +27,7 @@
@media screen and (-webkit-min-device-pixel-ratio:0) {
@font-face {
font-family: "FontMfizz";
- src: url("../fonts/font-mfizz.svg#font-mfizz") format("svg");
+ src: url("./font-mfizz.svg#font-mfizz") format("svg");
}
}
diff --git a/web/pgadmin/static/fonts/font-mfizz.eot b/web/pgadmin/static/vendor/font-mfizz/font-mfizz.eot
old mode 100644
new mode 100755
similarity index 100%
rename from web/pgadmin/static/fonts/font-mfizz.eot
rename to web/pgadmin/static/vendor/font-mfizz/font-mfizz.eot
diff --git a/web/pgadmin/static/fonts/font-mfizz.svg b/web/pgadmin/static/vendor/font-mfizz/font-mfizz.svg
old mode 100644
new mode 100755
similarity index 100%
rename from web/pgadmin/static/fonts/font-mfizz.svg
rename to web/pgadmin/static/vendor/font-mfizz/font-mfizz.svg
diff --git a/web/pgadmin/static/fonts/font-mfizz.ttf b/web/pgadmin/static/vendor/font-mfizz/font-mfizz.ttf
old mode 100644
new mode 100755
similarity index 100%
rename from web/pgadmin/static/fonts/font-mfizz.ttf
rename to web/pgadmin/static/vendor/font-mfizz/font-mfizz.ttf
diff --git a/web/pgadmin/static/fonts/font-mfizz.woff b/web/pgadmin/static/vendor/font-mfizz/font-mfizz.woff
old mode 100644
new mode 100755
similarity index 100%
rename from web/pgadmin/static/fonts/font-mfizz.woff
rename to web/pgadmin/static/vendor/font-mfizz/font-mfizz.woff
diff --git a/web/pgadmin/static/css/jQuery-contextMenu/font/context-menu-icons.eot b/web/pgadmin/static/vendor/jQuery-contextMenu/font/context-menu-icons.eot
similarity index 100%
rename from web/pgadmin/static/css/jQuery-contextMenu/font/context-menu-icons.eot
rename to web/pgadmin/static/vendor/jQuery-contextMenu/font/context-menu-icons.eot
diff --git a/web/pgadmin/static/css/jQuery-contextMenu/font/context-menu-icons.ttf b/web/pgadmin/static/vendor/jQuery-contextMenu/font/context-menu-icons.ttf
similarity index 100%
rename from web/pgadmin/static/css/jQuery-contextMenu/font/context-menu-icons.ttf
rename to web/pgadmin/static/vendor/jQuery-contextMenu/font/context-menu-icons.ttf
diff --git a/web/pgadmin/static/css/jQuery-contextMenu/font/context-menu-icons.woff b/web/pgadmin/static/vendor/jQuery-contextMenu/font/context-menu-icons.woff
similarity index 100%
rename from web/pgadmin/static/css/jQuery-contextMenu/font/context-menu-icons.woff
rename to web/pgadmin/static/vendor/jQuery-contextMenu/font/context-menu-icons.woff
diff --git a/web/pgadmin/static/css/jQuery-contextMenu/font/context-menu-icons.woff2 b/web/pgadmin/static/vendor/jQuery-contextMenu/font/context-menu-icons.woff2
similarity index 100%
rename from web/pgadmin/static/css/jQuery-contextMenu/font/context-menu-icons.woff2
rename to web/pgadmin/static/vendor/jQuery-contextMenu/font/context-menu-icons.woff2
diff --git a/web/pgadmin/static/css/jQuery-contextMenu/jquery.contextMenu.css b/web/pgadmin/static/vendor/jQuery-contextMenu/jquery.contextMenu.css
similarity index 100%
rename from web/pgadmin/static/css/jQuery-contextMenu/jquery.contextMenu.css
rename to web/pgadmin/static/vendor/jQuery-contextMenu/jquery.contextMenu.css
diff --git a/web/pgadmin/static/js/jQuery-contextMenu/jquery.contextMenu.js b/web/pgadmin/static/vendor/jQuery-contextMenu/jquery.contextMenu.js
similarity index 100%
rename from web/pgadmin/static/js/jQuery-contextMenu/jquery.contextMenu.js
rename to web/pgadmin/static/vendor/jQuery-contextMenu/jquery.contextMenu.js
diff --git a/web/pgadmin/static/css/jQuery-contextMenu/jquery.contextMenu.min.css b/web/pgadmin/static/vendor/jQuery-contextMenu/jquery.contextMenu.min.css
similarity index 100%
rename from web/pgadmin/static/css/jQuery-contextMenu/jquery.contextMenu.min.css
rename to web/pgadmin/static/vendor/jQuery-contextMenu/jquery.contextMenu.min.css
diff --git a/web/pgadmin/static/css/jQuery-contextMenu/jquery.contextMenu.min.css.map b/web/pgadmin/static/vendor/jQuery-contextMenu/jquery.contextMenu.min.css.map
similarity index 100%
rename from web/pgadmin/static/css/jQuery-contextMenu/jquery.contextMenu.min.css.map
rename to web/pgadmin/static/vendor/jQuery-contextMenu/jquery.contextMenu.min.css.map
diff --git a/web/pgadmin/static/js/jQuery-contextMenu/jquery.contextMenu.min.js b/web/pgadmin/static/vendor/jQuery-contextMenu/jquery.contextMenu.min.js
similarity index 100%
rename from web/pgadmin/static/js/jQuery-contextMenu/jquery.contextMenu.min.js
rename to web/pgadmin/static/vendor/jQuery-contextMenu/jquery.contextMenu.min.js
diff --git a/web/pgadmin/static/js/jQuery-contextMenu/jquery.ui.position.js b/web/pgadmin/static/vendor/jQuery-contextMenu/jquery.ui.position.js
similarity index 100%
rename from web/pgadmin/static/js/jQuery-contextMenu/jquery.ui.position.js
rename to web/pgadmin/static/vendor/jQuery-contextMenu/jquery.ui.position.js
diff --git a/web/pgadmin/static/js/jQuery-contextMenu/jquery.ui.position.min.js b/web/pgadmin/static/vendor/jQuery-contextMenu/jquery.ui.position.min.js
similarity index 100%
rename from web/pgadmin/static/js/jQuery-contextMenu/jquery.ui.position.min.js
rename to web/pgadmin/static/vendor/jQuery-contextMenu/jquery.ui.position.min.js
diff --git a/web/pgadmin/static/js/jquery-ui/jquery-ui-1.11.3.js b/web/pgadmin/static/vendor/jquery-ui/jquery-ui-1.11.3.js
similarity index 100%
rename from web/pgadmin/static/js/jquery-ui/jquery-ui-1.11.3.js
rename to web/pgadmin/static/vendor/jquery-ui/jquery-ui-1.11.3.js
diff --git a/web/pgadmin/static/js/jquery-ui/jquery-ui-1.11.3.min.js b/web/pgadmin/static/vendor/jquery-ui/jquery-ui-1.11.3.min.js
similarity index 100%
rename from web/pgadmin/static/js/jquery-ui/jquery-ui-1.11.3.min.js
rename to web/pgadmin/static/vendor/jquery-ui/jquery-ui-1.11.3.min.js
diff --git a/web/pgadmin/static/js/jquery-ui/jquery.event.drag-2.2.js b/web/pgadmin/static/vendor/jquery-ui/jquery.event.drag-2.2.js
similarity index 100%
rename from web/pgadmin/static/js/jquery-ui/jquery.event.drag-2.2.js
rename to web/pgadmin/static/vendor/jquery-ui/jquery.event.drag-2.2.js
diff --git a/web/pgadmin/static/js/jquery-ui/jquery.event.drop-2.2.js b/web/pgadmin/static/vendor/jquery-ui/jquery.event.drop-2.2.js
similarity index 100%
rename from web/pgadmin/static/js/jquery-ui/jquery.event.drop-2.2.js
rename to web/pgadmin/static/vendor/jquery-ui/jquery.event.drop-2.2.js
diff --git a/web/pgadmin/static/css/jquery.dropzone/dropzone.css b/web/pgadmin/static/vendor/jquery.dropzone/dropzone.css
similarity index 100%
rename from web/pgadmin/static/css/jquery.dropzone/dropzone.css
rename to web/pgadmin/static/vendor/jquery.dropzone/dropzone.css
diff --git a/web/pgadmin/static/js/jquery.dropzone/dropzone.js b/web/pgadmin/static/vendor/jquery.dropzone/dropzone.js
similarity index 100%
rename from web/pgadmin/static/js/jquery.dropzone/dropzone.js
rename to web/pgadmin/static/vendor/jquery.dropzone/dropzone.js
diff --git a/web/pgadmin/static/js/jquery-1.11.2.js b/web/pgadmin/static/vendor/jquery/jquery-1.11.2.js
similarity index 100%
rename from web/pgadmin/static/js/jquery-1.11.2.js
rename to web/pgadmin/static/vendor/jquery/jquery-1.11.2.js
diff --git a/web/pgadmin/static/js/jquery-1.11.2.min.js b/web/pgadmin/static/vendor/jquery/jquery-1.11.2.min.js
similarity index 100%
rename from web/pgadmin/static/js/jquery-1.11.2.min.js
rename to web/pgadmin/static/vendor/jquery/jquery-1.11.2.min.js
diff --git a/web/pgadmin/static/js/modernizr-2.6.2-respond-1.1.0.min.js b/web/pgadmin/static/vendor/modernizr/modernizr-2.6.2-respond-1.1.0.min.js
similarity index 100%
rename from web/pgadmin/static/js/modernizr-2.6.2-respond-1.1.0.min.js
rename to web/pgadmin/static/vendor/modernizr/modernizr-2.6.2-respond-1.1.0.min.js
diff --git a/web/pgadmin/static/js/moment-with-locales.js b/web/pgadmin/static/vendor/moment/moment-with-locales.js
similarity index 100%
rename from web/pgadmin/static/js/moment-with-locales.js
rename to web/pgadmin/static/vendor/moment/moment-with-locales.js
diff --git a/web/pgadmin/static/js/moment-with-locales.min.js b/web/pgadmin/static/vendor/moment/moment-with-locales.min.js
similarity index 100%
rename from web/pgadmin/static/js/moment-with-locales.min.js
rename to web/pgadmin/static/vendor/moment/moment-with-locales.min.js
diff --git a/web/pgadmin/static/js/require.js b/web/pgadmin/static/vendor/require/require.js
similarity index 100%
rename from web/pgadmin/static/js/require.js
rename to web/pgadmin/static/vendor/require/require.js
diff --git a/web/pgadmin/static/js/require.min.js b/web/pgadmin/static/vendor/require/require.min.js
similarity index 100%
rename from web/pgadmin/static/js/require.min.js
rename to web/pgadmin/static/vendor/require/require.min.js
diff --git a/web/pgadmin/static/js/select2/i18n/ar.js b/web/pgadmin/static/vendor/select2/i18n/ar.js
similarity index 100%
rename from web/pgadmin/static/js/select2/i18n/ar.js
rename to web/pgadmin/static/vendor/select2/i18n/ar.js
diff --git a/web/pgadmin/static/js/select2/i18n/az.js b/web/pgadmin/static/vendor/select2/i18n/az.js
similarity index 100%
rename from web/pgadmin/static/js/select2/i18n/az.js
rename to web/pgadmin/static/vendor/select2/i18n/az.js
diff --git a/web/pgadmin/static/js/select2/i18n/bg.js b/web/pgadmin/static/vendor/select2/i18n/bg.js
similarity index 100%
rename from web/pgadmin/static/js/select2/i18n/bg.js
rename to web/pgadmin/static/vendor/select2/i18n/bg.js
diff --git a/web/pgadmin/static/js/select2/i18n/ca.js b/web/pgadmin/static/vendor/select2/i18n/ca.js
similarity index 100%
rename from web/pgadmin/static/js/select2/i18n/ca.js
rename to web/pgadmin/static/vendor/select2/i18n/ca.js
diff --git a/web/pgadmin/static/js/select2/i18n/cs.js b/web/pgadmin/static/vendor/select2/i18n/cs.js
similarity index 100%
rename from web/pgadmin/static/js/select2/i18n/cs.js
rename to web/pgadmin/static/vendor/select2/i18n/cs.js
diff --git a/web/pgadmin/static/js/select2/i18n/da.js b/web/pgadmin/static/vendor/select2/i18n/da.js
similarity index 100%
rename from web/pgadmin/static/js/select2/i18n/da.js
rename to web/pgadmin/static/vendor/select2/i18n/da.js
diff --git a/web/pgadmin/static/js/select2/i18n/de.js b/web/pgadmin/static/vendor/select2/i18n/de.js
similarity index 100%
rename from web/pgadmin/static/js/select2/i18n/de.js
rename to web/pgadmin/static/vendor/select2/i18n/de.js
diff --git a/web/pgadmin/static/js/select2/i18n/en.js b/web/pgadmin/static/vendor/select2/i18n/en.js
similarity index 100%
rename from web/pgadmin/static/js/select2/i18n/en.js
rename to web/pgadmin/static/vendor/select2/i18n/en.js
diff --git a/web/pgadmin/static/js/select2/i18n/es.js b/web/pgadmin/static/vendor/select2/i18n/es.js
similarity index 100%
rename from web/pgadmin/static/js/select2/i18n/es.js
rename to web/pgadmin/static/vendor/select2/i18n/es.js
diff --git a/web/pgadmin/static/js/select2/i18n/et.js b/web/pgadmin/static/vendor/select2/i18n/et.js
similarity index 100%
rename from web/pgadmin/static/js/select2/i18n/et.js
rename to web/pgadmin/static/vendor/select2/i18n/et.js
diff --git a/web/pgadmin/static/js/select2/i18n/eu.js b/web/pgadmin/static/vendor/select2/i18n/eu.js
similarity index 100%
rename from web/pgadmin/static/js/select2/i18n/eu.js
rename to web/pgadmin/static/vendor/select2/i18n/eu.js
diff --git a/web/pgadmin/static/js/select2/i18n/fa.js b/web/pgadmin/static/vendor/select2/i18n/fa.js
similarity index 100%
rename from web/pgadmin/static/js/select2/i18n/fa.js
rename to web/pgadmin/static/vendor/select2/i18n/fa.js
diff --git a/web/pgadmin/static/js/select2/i18n/fi.js b/web/pgadmin/static/vendor/select2/i18n/fi.js
similarity index 100%
rename from web/pgadmin/static/js/select2/i18n/fi.js
rename to web/pgadmin/static/vendor/select2/i18n/fi.js
diff --git a/web/pgadmin/static/js/select2/i18n/fr.js b/web/pgadmin/static/vendor/select2/i18n/fr.js
similarity index 100%
rename from web/pgadmin/static/js/select2/i18n/fr.js
rename to web/pgadmin/static/vendor/select2/i18n/fr.js
diff --git a/web/pgadmin/static/js/select2/i18n/gl.js b/web/pgadmin/static/vendor/select2/i18n/gl.js
similarity index 100%
rename from web/pgadmin/static/js/select2/i18n/gl.js
rename to web/pgadmin/static/vendor/select2/i18n/gl.js
diff --git a/web/pgadmin/static/js/select2/i18n/he.js b/web/pgadmin/static/vendor/select2/i18n/he.js
similarity index 100%
rename from web/pgadmin/static/js/select2/i18n/he.js
rename to web/pgadmin/static/vendor/select2/i18n/he.js
diff --git a/web/pgadmin/static/js/select2/i18n/hi.js b/web/pgadmin/static/vendor/select2/i18n/hi.js
similarity index 100%
rename from web/pgadmin/static/js/select2/i18n/hi.js
rename to web/pgadmin/static/vendor/select2/i18n/hi.js
diff --git a/web/pgadmin/static/js/select2/i18n/hr.js b/web/pgadmin/static/vendor/select2/i18n/hr.js
similarity index 100%
rename from web/pgadmin/static/js/select2/i18n/hr.js
rename to web/pgadmin/static/vendor/select2/i18n/hr.js
diff --git a/web/pgadmin/static/js/select2/i18n/hu.js b/web/pgadmin/static/vendor/select2/i18n/hu.js
similarity index 100%
rename from web/pgadmin/static/js/select2/i18n/hu.js
rename to web/pgadmin/static/vendor/select2/i18n/hu.js
diff --git a/web/pgadmin/static/js/select2/i18n/id.js b/web/pgadmin/static/vendor/select2/i18n/id.js
similarity index 100%
rename from web/pgadmin/static/js/select2/i18n/id.js
rename to web/pgadmin/static/vendor/select2/i18n/id.js
diff --git a/web/pgadmin/static/js/select2/i18n/is.js b/web/pgadmin/static/vendor/select2/i18n/is.js
similarity index 100%
rename from web/pgadmin/static/js/select2/i18n/is.js
rename to web/pgadmin/static/vendor/select2/i18n/is.js
diff --git a/web/pgadmin/static/js/select2/i18n/it.js b/web/pgadmin/static/vendor/select2/i18n/it.js
similarity index 100%
rename from web/pgadmin/static/js/select2/i18n/it.js
rename to web/pgadmin/static/vendor/select2/i18n/it.js
diff --git a/web/pgadmin/static/js/select2/i18n/ja.js b/web/pgadmin/static/vendor/select2/i18n/ja.js
similarity index 100%
rename from web/pgadmin/static/js/select2/i18n/ja.js
rename to web/pgadmin/static/vendor/select2/i18n/ja.js
diff --git a/web/pgadmin/static/js/select2/i18n/ko.js b/web/pgadmin/static/vendor/select2/i18n/ko.js
similarity index 100%
rename from web/pgadmin/static/js/select2/i18n/ko.js
rename to web/pgadmin/static/vendor/select2/i18n/ko.js
diff --git a/web/pgadmin/static/js/select2/i18n/lt.js b/web/pgadmin/static/vendor/select2/i18n/lt.js
similarity index 100%
rename from web/pgadmin/static/js/select2/i18n/lt.js
rename to web/pgadmin/static/vendor/select2/i18n/lt.js
diff --git a/web/pgadmin/static/js/select2/i18n/lv.js b/web/pgadmin/static/vendor/select2/i18n/lv.js
similarity index 100%
rename from web/pgadmin/static/js/select2/i18n/lv.js
rename to web/pgadmin/static/vendor/select2/i18n/lv.js
diff --git a/web/pgadmin/static/js/select2/i18n/mk.js b/web/pgadmin/static/vendor/select2/i18n/mk.js
similarity index 100%
rename from web/pgadmin/static/js/select2/i18n/mk.js
rename to web/pgadmin/static/vendor/select2/i18n/mk.js
diff --git a/web/pgadmin/static/js/select2/i18n/ms.js b/web/pgadmin/static/vendor/select2/i18n/ms.js
similarity index 100%
rename from web/pgadmin/static/js/select2/i18n/ms.js
rename to web/pgadmin/static/vendor/select2/i18n/ms.js
diff --git a/web/pgadmin/static/js/select2/i18n/nb.js b/web/pgadmin/static/vendor/select2/i18n/nb.js
similarity index 100%
rename from web/pgadmin/static/js/select2/i18n/nb.js
rename to web/pgadmin/static/vendor/select2/i18n/nb.js
diff --git a/web/pgadmin/static/js/select2/i18n/nl.js b/web/pgadmin/static/vendor/select2/i18n/nl.js
similarity index 100%
rename from web/pgadmin/static/js/select2/i18n/nl.js
rename to web/pgadmin/static/vendor/select2/i18n/nl.js
diff --git a/web/pgadmin/static/js/select2/i18n/pl.js b/web/pgadmin/static/vendor/select2/i18n/pl.js
similarity index 100%
rename from web/pgadmin/static/js/select2/i18n/pl.js
rename to web/pgadmin/static/vendor/select2/i18n/pl.js
diff --git a/web/pgadmin/static/js/select2/i18n/pt-BR.js b/web/pgadmin/static/vendor/select2/i18n/pt-BR.js
similarity index 100%
rename from web/pgadmin/static/js/select2/i18n/pt-BR.js
rename to web/pgadmin/static/vendor/select2/i18n/pt-BR.js
diff --git a/web/pgadmin/static/js/select2/i18n/pt.js b/web/pgadmin/static/vendor/select2/i18n/pt.js
similarity index 100%
rename from web/pgadmin/static/js/select2/i18n/pt.js
rename to web/pgadmin/static/vendor/select2/i18n/pt.js
diff --git a/web/pgadmin/static/js/select2/i18n/ro.js b/web/pgadmin/static/vendor/select2/i18n/ro.js
similarity index 100%
rename from web/pgadmin/static/js/select2/i18n/ro.js
rename to web/pgadmin/static/vendor/select2/i18n/ro.js
diff --git a/web/pgadmin/static/js/select2/i18n/ru.js b/web/pgadmin/static/vendor/select2/i18n/ru.js
similarity index 100%
rename from web/pgadmin/static/js/select2/i18n/ru.js
rename to web/pgadmin/static/vendor/select2/i18n/ru.js
diff --git a/web/pgadmin/static/js/select2/i18n/sk.js b/web/pgadmin/static/vendor/select2/i18n/sk.js
similarity index 100%
rename from web/pgadmin/static/js/select2/i18n/sk.js
rename to web/pgadmin/static/vendor/select2/i18n/sk.js
diff --git a/web/pgadmin/static/js/select2/i18n/sr-Cyrl.js b/web/pgadmin/static/vendor/select2/i18n/sr-Cyrl.js
similarity index 100%
rename from web/pgadmin/static/js/select2/i18n/sr-Cyrl.js
rename to web/pgadmin/static/vendor/select2/i18n/sr-Cyrl.js
diff --git a/web/pgadmin/static/js/select2/i18n/sr.js b/web/pgadmin/static/vendor/select2/i18n/sr.js
similarity index 100%
rename from web/pgadmin/static/js/select2/i18n/sr.js
rename to web/pgadmin/static/vendor/select2/i18n/sr.js
diff --git a/web/pgadmin/static/js/select2/i18n/sv.js b/web/pgadmin/static/vendor/select2/i18n/sv.js
similarity index 100%
rename from web/pgadmin/static/js/select2/i18n/sv.js
rename to web/pgadmin/static/vendor/select2/i18n/sv.js
diff --git a/web/pgadmin/static/js/select2/i18n/th.js b/web/pgadmin/static/vendor/select2/i18n/th.js
similarity index 100%
rename from web/pgadmin/static/js/select2/i18n/th.js
rename to web/pgadmin/static/vendor/select2/i18n/th.js
diff --git a/web/pgadmin/static/js/select2/i18n/tr.js b/web/pgadmin/static/vendor/select2/i18n/tr.js
similarity index 100%
rename from web/pgadmin/static/js/select2/i18n/tr.js
rename to web/pgadmin/static/vendor/select2/i18n/tr.js
diff --git a/web/pgadmin/static/js/select2/i18n/uk.js b/web/pgadmin/static/vendor/select2/i18n/uk.js
similarity index 100%
rename from web/pgadmin/static/js/select2/i18n/uk.js
rename to web/pgadmin/static/vendor/select2/i18n/uk.js
diff --git a/web/pgadmin/static/js/select2/i18n/vi.js b/web/pgadmin/static/vendor/select2/i18n/vi.js
similarity index 100%
rename from web/pgadmin/static/js/select2/i18n/vi.js
rename to web/pgadmin/static/vendor/select2/i18n/vi.js
diff --git a/web/pgadmin/static/js/select2/i18n/zh-CN.js b/web/pgadmin/static/vendor/select2/i18n/zh-CN.js
similarity index 100%
rename from web/pgadmin/static/js/select2/i18n/zh-CN.js
rename to web/pgadmin/static/vendor/select2/i18n/zh-CN.js
diff --git a/web/pgadmin/static/js/select2/i18n/zh-TW.js b/web/pgadmin/static/vendor/select2/i18n/zh-TW.js
similarity index 100%
rename from web/pgadmin/static/js/select2/i18n/zh-TW.js
rename to web/pgadmin/static/vendor/select2/i18n/zh-TW.js
diff --git a/web/pgadmin/static/css/select2/select2.css b/web/pgadmin/static/vendor/select2/select2.css
similarity index 100%
rename from web/pgadmin/static/css/select2/select2.css
rename to web/pgadmin/static/vendor/select2/select2.css
diff --git a/web/pgadmin/static/js/select2/select2.full.js b/web/pgadmin/static/vendor/select2/select2.full.js
similarity index 100%
rename from web/pgadmin/static/js/select2/select2.full.js
rename to web/pgadmin/static/vendor/select2/select2.full.js
diff --git a/web/pgadmin/static/js/select2/select2.full.min.js b/web/pgadmin/static/vendor/select2/select2.full.min.js
similarity index 100%
rename from web/pgadmin/static/js/select2/select2.full.min.js
rename to web/pgadmin/static/vendor/select2/select2.full.min.js
diff --git a/web/pgadmin/static/css/select2/select2.min.css b/web/pgadmin/static/vendor/select2/select2.min.css
similarity index 100%
rename from web/pgadmin/static/css/select2/select2.min.css
rename to web/pgadmin/static/vendor/select2/select2.min.css
diff --git a/web/pgadmin/static/js/slickgrid/README b/web/pgadmin/static/vendor/slickgrid/README
similarity index 100%
rename from web/pgadmin/static/js/slickgrid/README
rename to web/pgadmin/static/vendor/slickgrid/README
diff --git a/web/pgadmin/static/js/slickgrid/controls/slick.columnpicker.css b/web/pgadmin/static/vendor/slickgrid/controls/slick.columnpicker.css
similarity index 100%
rename from web/pgadmin/static/js/slickgrid/controls/slick.columnpicker.css
rename to web/pgadmin/static/vendor/slickgrid/controls/slick.columnpicker.css
diff --git a/web/pgadmin/static/js/slickgrid/controls/slick.columnpicker.js b/web/pgadmin/static/vendor/slickgrid/controls/slick.columnpicker.js
similarity index 100%
rename from web/pgadmin/static/js/slickgrid/controls/slick.columnpicker.js
rename to web/pgadmin/static/vendor/slickgrid/controls/slick.columnpicker.js
diff --git a/web/pgadmin/static/js/slickgrid/controls/slick.pager.css b/web/pgadmin/static/vendor/slickgrid/controls/slick.pager.css
similarity index 100%
rename from web/pgadmin/static/js/slickgrid/controls/slick.pager.css
rename to web/pgadmin/static/vendor/slickgrid/controls/slick.pager.css
diff --git a/web/pgadmin/static/js/slickgrid/controls/slick.pager.js b/web/pgadmin/static/vendor/slickgrid/controls/slick.pager.js
similarity index 100%
rename from web/pgadmin/static/js/slickgrid/controls/slick.pager.js
rename to web/pgadmin/static/vendor/slickgrid/controls/slick.pager.js
diff --git a/web/pgadmin/static/css/slickgrid/images/actions.gif b/web/pgadmin/static/vendor/slickgrid/images/actions.gif
similarity index 100%
rename from web/pgadmin/static/css/slickgrid/images/actions.gif
rename to web/pgadmin/static/vendor/slickgrid/images/actions.gif
diff --git a/web/pgadmin/static/css/slickgrid/images/ajax-loader-small.gif b/web/pgadmin/static/vendor/slickgrid/images/ajax-loader-small.gif
similarity index 100%
rename from web/pgadmin/static/css/slickgrid/images/ajax-loader-small.gif
rename to web/pgadmin/static/vendor/slickgrid/images/ajax-loader-small.gif
diff --git a/web/pgadmin/static/css/slickgrid/images/arrow_redo.png b/web/pgadmin/static/vendor/slickgrid/images/arrow_redo.png
similarity index 100%
rename from web/pgadmin/static/css/slickgrid/images/arrow_redo.png
rename to web/pgadmin/static/vendor/slickgrid/images/arrow_redo.png
diff --git a/web/pgadmin/static/css/slickgrid/images/arrow_right_peppermint.png b/web/pgadmin/static/vendor/slickgrid/images/arrow_right_peppermint.png
similarity index 100%
rename from web/pgadmin/static/css/slickgrid/images/arrow_right_peppermint.png
rename to web/pgadmin/static/vendor/slickgrid/images/arrow_right_peppermint.png
diff --git a/web/pgadmin/static/css/slickgrid/images/arrow_right_spearmint.png b/web/pgadmin/static/vendor/slickgrid/images/arrow_right_spearmint.png
similarity index 100%
rename from web/pgadmin/static/css/slickgrid/images/arrow_right_spearmint.png
rename to web/pgadmin/static/vendor/slickgrid/images/arrow_right_spearmint.png
diff --git a/web/pgadmin/static/css/slickgrid/images/arrow_undo.png b/web/pgadmin/static/vendor/slickgrid/images/arrow_undo.png
similarity index 100%
rename from web/pgadmin/static/css/slickgrid/images/arrow_undo.png
rename to web/pgadmin/static/vendor/slickgrid/images/arrow_undo.png
diff --git a/web/pgadmin/static/css/slickgrid/images/bullet_blue.png b/web/pgadmin/static/vendor/slickgrid/images/bullet_blue.png
similarity index 100%
rename from web/pgadmin/static/css/slickgrid/images/bullet_blue.png
rename to web/pgadmin/static/vendor/slickgrid/images/bullet_blue.png
diff --git a/web/pgadmin/static/css/slickgrid/images/bullet_star.png b/web/pgadmin/static/vendor/slickgrid/images/bullet_star.png
similarity index 100%
rename from web/pgadmin/static/css/slickgrid/images/bullet_star.png
rename to web/pgadmin/static/vendor/slickgrid/images/bullet_star.png
diff --git a/web/pgadmin/static/css/slickgrid/images/bullet_toggle_minus.png b/web/pgadmin/static/vendor/slickgrid/images/bullet_toggle_minus.png
similarity index 100%
rename from web/pgadmin/static/css/slickgrid/images/bullet_toggle_minus.png
rename to web/pgadmin/static/vendor/slickgrid/images/bullet_toggle_minus.png
diff --git a/web/pgadmin/static/css/slickgrid/images/bullet_toggle_plus.png b/web/pgadmin/static/vendor/slickgrid/images/bullet_toggle_plus.png
similarity index 100%
rename from web/pgadmin/static/css/slickgrid/images/bullet_toggle_plus.png
rename to web/pgadmin/static/vendor/slickgrid/images/bullet_toggle_plus.png
diff --git a/web/pgadmin/static/css/slickgrid/images/calendar.gif b/web/pgadmin/static/vendor/slickgrid/images/calendar.gif
similarity index 100%
rename from web/pgadmin/static/css/slickgrid/images/calendar.gif
rename to web/pgadmin/static/vendor/slickgrid/images/calendar.gif
diff --git a/web/pgadmin/static/css/slickgrid/images/collapse.gif b/web/pgadmin/static/vendor/slickgrid/images/collapse.gif
similarity index 100%
rename from web/pgadmin/static/css/slickgrid/images/collapse.gif
rename to web/pgadmin/static/vendor/slickgrid/images/collapse.gif
diff --git a/web/pgadmin/static/css/slickgrid/images/comment_yellow.gif b/web/pgadmin/static/vendor/slickgrid/images/comment_yellow.gif
similarity index 100%
rename from web/pgadmin/static/css/slickgrid/images/comment_yellow.gif
rename to web/pgadmin/static/vendor/slickgrid/images/comment_yellow.gif
diff --git a/web/pgadmin/static/css/slickgrid/images/down.gif b/web/pgadmin/static/vendor/slickgrid/images/down.gif
similarity index 100%
rename from web/pgadmin/static/css/slickgrid/images/down.gif
rename to web/pgadmin/static/vendor/slickgrid/images/down.gif
diff --git a/web/pgadmin/static/css/slickgrid/images/drag-handle.png b/web/pgadmin/static/vendor/slickgrid/images/drag-handle.png
similarity index 100%
rename from web/pgadmin/static/css/slickgrid/images/drag-handle.png
rename to web/pgadmin/static/vendor/slickgrid/images/drag-handle.png
diff --git a/web/pgadmin/static/css/slickgrid/images/editor-helper-bg.gif b/web/pgadmin/static/vendor/slickgrid/images/editor-helper-bg.gif
similarity index 100%
rename from web/pgadmin/static/css/slickgrid/images/editor-helper-bg.gif
rename to web/pgadmin/static/vendor/slickgrid/images/editor-helper-bg.gif
diff --git a/web/pgadmin/static/css/slickgrid/images/expand.gif b/web/pgadmin/static/vendor/slickgrid/images/expand.gif
similarity index 100%
rename from web/pgadmin/static/css/slickgrid/images/expand.gif
rename to web/pgadmin/static/vendor/slickgrid/images/expand.gif
diff --git a/web/pgadmin/static/css/slickgrid/images/header-bg.gif b/web/pgadmin/static/vendor/slickgrid/images/header-bg.gif
similarity index 100%
rename from web/pgadmin/static/css/slickgrid/images/header-bg.gif
rename to web/pgadmin/static/vendor/slickgrid/images/header-bg.gif
diff --git a/web/pgadmin/static/css/slickgrid/images/header-columns-bg.gif b/web/pgadmin/static/vendor/slickgrid/images/header-columns-bg.gif
similarity index 100%
rename from web/pgadmin/static/css/slickgrid/images/header-columns-bg.gif
rename to web/pgadmin/static/vendor/slickgrid/images/header-columns-bg.gif
diff --git a/web/pgadmin/static/css/slickgrid/images/header-columns-over-bg.gif b/web/pgadmin/static/vendor/slickgrid/images/header-columns-over-bg.gif
similarity index 100%
rename from web/pgadmin/static/css/slickgrid/images/header-columns-over-bg.gif
rename to web/pgadmin/static/vendor/slickgrid/images/header-columns-over-bg.gif
diff --git a/web/pgadmin/static/css/slickgrid/images/help.png b/web/pgadmin/static/vendor/slickgrid/images/help.png
similarity index 100%
rename from web/pgadmin/static/css/slickgrid/images/help.png
rename to web/pgadmin/static/vendor/slickgrid/images/help.png
diff --git a/web/pgadmin/static/css/slickgrid/images/info.gif b/web/pgadmin/static/vendor/slickgrid/images/info.gif
similarity index 100%
rename from web/pgadmin/static/css/slickgrid/images/info.gif
rename to web/pgadmin/static/vendor/slickgrid/images/info.gif
diff --git a/web/pgadmin/static/css/slickgrid/images/listview.gif b/web/pgadmin/static/vendor/slickgrid/images/listview.gif
similarity index 100%
rename from web/pgadmin/static/css/slickgrid/images/listview.gif
rename to web/pgadmin/static/vendor/slickgrid/images/listview.gif
diff --git a/web/pgadmin/static/css/slickgrid/images/pencil.gif b/web/pgadmin/static/vendor/slickgrid/images/pencil.gif
similarity index 100%
rename from web/pgadmin/static/css/slickgrid/images/pencil.gif
rename to web/pgadmin/static/vendor/slickgrid/images/pencil.gif
diff --git a/web/pgadmin/static/css/slickgrid/images/row-over-bg.gif b/web/pgadmin/static/vendor/slickgrid/images/row-over-bg.gif
similarity index 100%
rename from web/pgadmin/static/css/slickgrid/images/row-over-bg.gif
rename to web/pgadmin/static/vendor/slickgrid/images/row-over-bg.gif
diff --git a/web/pgadmin/static/css/slickgrid/images/sort-asc.gif b/web/pgadmin/static/vendor/slickgrid/images/sort-asc.gif
similarity index 100%
rename from web/pgadmin/static/css/slickgrid/images/sort-asc.gif
rename to web/pgadmin/static/vendor/slickgrid/images/sort-asc.gif
diff --git a/web/pgadmin/static/css/slickgrid/images/sort-asc.png b/web/pgadmin/static/vendor/slickgrid/images/sort-asc.png
similarity index 100%
rename from web/pgadmin/static/css/slickgrid/images/sort-asc.png
rename to web/pgadmin/static/vendor/slickgrid/images/sort-asc.png
diff --git a/web/pgadmin/static/css/slickgrid/images/sort-desc.gif b/web/pgadmin/static/vendor/slickgrid/images/sort-desc.gif
similarity index 100%
rename from web/pgadmin/static/css/slickgrid/images/sort-desc.gif
rename to web/pgadmin/static/vendor/slickgrid/images/sort-desc.gif
diff --git a/web/pgadmin/static/css/slickgrid/images/sort-desc.png b/web/pgadmin/static/vendor/slickgrid/images/sort-desc.png
similarity index 100%
rename from web/pgadmin/static/css/slickgrid/images/sort-desc.png
rename to web/pgadmin/static/vendor/slickgrid/images/sort-desc.png
diff --git a/web/pgadmin/static/css/slickgrid/images/stripes.png b/web/pgadmin/static/vendor/slickgrid/images/stripes.png
similarity index 100%
rename from web/pgadmin/static/css/slickgrid/images/stripes.png
rename to web/pgadmin/static/vendor/slickgrid/images/stripes.png
diff --git a/web/pgadmin/static/css/slickgrid/images/tag_red.png b/web/pgadmin/static/vendor/slickgrid/images/tag_red.png
similarity index 100%
rename from web/pgadmin/static/css/slickgrid/images/tag_red.png
rename to web/pgadmin/static/vendor/slickgrid/images/tag_red.png
diff --git a/web/pgadmin/static/css/slickgrid/images/tick.png b/web/pgadmin/static/vendor/slickgrid/images/tick.png
similarity index 100%
rename from web/pgadmin/static/css/slickgrid/images/tick.png
rename to web/pgadmin/static/vendor/slickgrid/images/tick.png
diff --git a/web/pgadmin/static/css/slickgrid/images/user_identity.gif b/web/pgadmin/static/vendor/slickgrid/images/user_identity.gif
similarity index 100%
rename from web/pgadmin/static/css/slickgrid/images/user_identity.gif
rename to web/pgadmin/static/vendor/slickgrid/images/user_identity.gif
diff --git a/web/pgadmin/static/css/slickgrid/images/user_identity_plus.gif b/web/pgadmin/static/vendor/slickgrid/images/user_identity_plus.gif
similarity index 100%
rename from web/pgadmin/static/css/slickgrid/images/user_identity_plus.gif
rename to web/pgadmin/static/vendor/slickgrid/images/user_identity_plus.gif
diff --git a/web/pgadmin/static/js/slickgrid/plugins/slick.autotooltips.js b/web/pgadmin/static/vendor/slickgrid/plugins/slick.autotooltips.js
similarity index 100%
rename from web/pgadmin/static/js/slickgrid/plugins/slick.autotooltips.js
rename to web/pgadmin/static/vendor/slickgrid/plugins/slick.autotooltips.js
diff --git a/web/pgadmin/static/js/slickgrid/plugins/slick.cellcopymanager.js b/web/pgadmin/static/vendor/slickgrid/plugins/slick.cellcopymanager.js
similarity index 100%
rename from web/pgadmin/static/js/slickgrid/plugins/slick.cellcopymanager.js
rename to web/pgadmin/static/vendor/slickgrid/plugins/slick.cellcopymanager.js
diff --git a/web/pgadmin/static/js/slickgrid/plugins/slick.cellrangedecorator.js b/web/pgadmin/static/vendor/slickgrid/plugins/slick.cellrangedecorator.js
similarity index 100%
rename from web/pgadmin/static/js/slickgrid/plugins/slick.cellrangedecorator.js
rename to web/pgadmin/static/vendor/slickgrid/plugins/slick.cellrangedecorator.js
diff --git a/web/pgadmin/static/js/slickgrid/plugins/slick.cellrangeselector.js b/web/pgadmin/static/vendor/slickgrid/plugins/slick.cellrangeselector.js
similarity index 100%
rename from web/pgadmin/static/js/slickgrid/plugins/slick.cellrangeselector.js
rename to web/pgadmin/static/vendor/slickgrid/plugins/slick.cellrangeselector.js
diff --git a/web/pgadmin/static/js/slickgrid/plugins/slick.cellselectionmodel.js b/web/pgadmin/static/vendor/slickgrid/plugins/slick.cellselectionmodel.js
similarity index 100%
rename from web/pgadmin/static/js/slickgrid/plugins/slick.cellselectionmodel.js
rename to web/pgadmin/static/vendor/slickgrid/plugins/slick.cellselectionmodel.js
diff --git a/web/pgadmin/static/js/slickgrid/plugins/slick.checkboxselectcolumn.js b/web/pgadmin/static/vendor/slickgrid/plugins/slick.checkboxselectcolumn.js
similarity index 100%
rename from web/pgadmin/static/js/slickgrid/plugins/slick.checkboxselectcolumn.js
rename to web/pgadmin/static/vendor/slickgrid/plugins/slick.checkboxselectcolumn.js
diff --git a/web/pgadmin/static/js/slickgrid/plugins/slick.headerbuttons.css b/web/pgadmin/static/vendor/slickgrid/plugins/slick.headerbuttons.css
similarity index 100%
rename from web/pgadmin/static/js/slickgrid/plugins/slick.headerbuttons.css
rename to web/pgadmin/static/vendor/slickgrid/plugins/slick.headerbuttons.css
diff --git a/web/pgadmin/static/js/slickgrid/plugins/slick.headerbuttons.js b/web/pgadmin/static/vendor/slickgrid/plugins/slick.headerbuttons.js
similarity index 100%
rename from web/pgadmin/static/js/slickgrid/plugins/slick.headerbuttons.js
rename to web/pgadmin/static/vendor/slickgrid/plugins/slick.headerbuttons.js
diff --git a/web/pgadmin/static/js/slickgrid/plugins/slick.headermenu.css b/web/pgadmin/static/vendor/slickgrid/plugins/slick.headermenu.css
similarity index 100%
rename from web/pgadmin/static/js/slickgrid/plugins/slick.headermenu.css
rename to web/pgadmin/static/vendor/slickgrid/plugins/slick.headermenu.css
diff --git a/web/pgadmin/static/js/slickgrid/plugins/slick.headermenu.js b/web/pgadmin/static/vendor/slickgrid/plugins/slick.headermenu.js
similarity index 100%
rename from web/pgadmin/static/js/slickgrid/plugins/slick.headermenu.js
rename to web/pgadmin/static/vendor/slickgrid/plugins/slick.headermenu.js
diff --git a/web/pgadmin/static/js/slickgrid/plugins/slick.rowmovemanager.js b/web/pgadmin/static/vendor/slickgrid/plugins/slick.rowmovemanager.js
similarity index 100%
rename from web/pgadmin/static/js/slickgrid/plugins/slick.rowmovemanager.js
rename to web/pgadmin/static/vendor/slickgrid/plugins/slick.rowmovemanager.js
diff --git a/web/pgadmin/static/js/slickgrid/plugins/slick.rowselectionmodel.js b/web/pgadmin/static/vendor/slickgrid/plugins/slick.rowselectionmodel.js
similarity index 100%
rename from web/pgadmin/static/js/slickgrid/plugins/slick.rowselectionmodel.js
rename to web/pgadmin/static/vendor/slickgrid/plugins/slick.rowselectionmodel.js
diff --git a/web/pgadmin/static/css/slickgrid/slick-default-theme.css b/web/pgadmin/static/vendor/slickgrid/slick-default-theme.css
similarity index 100%
rename from web/pgadmin/static/css/slickgrid/slick-default-theme.css
rename to web/pgadmin/static/vendor/slickgrid/slick-default-theme.css
diff --git a/web/pgadmin/static/js/slickgrid/slick.core.js b/web/pgadmin/static/vendor/slickgrid/slick.core.js
similarity index 100%
rename from web/pgadmin/static/js/slickgrid/slick.core.js
rename to web/pgadmin/static/vendor/slickgrid/slick.core.js
diff --git a/web/pgadmin/static/js/slickgrid/slick.dataview.js b/web/pgadmin/static/vendor/slickgrid/slick.dataview.js
similarity index 100%
rename from web/pgadmin/static/js/slickgrid/slick.dataview.js
rename to web/pgadmin/static/vendor/slickgrid/slick.dataview.js
diff --git a/web/pgadmin/static/js/slickgrid/slick.editors.js b/web/pgadmin/static/vendor/slickgrid/slick.editors.js
similarity index 100%
rename from web/pgadmin/static/js/slickgrid/slick.editors.js
rename to web/pgadmin/static/vendor/slickgrid/slick.editors.js
diff --git a/web/pgadmin/static/js/slickgrid/slick.formatters.js b/web/pgadmin/static/vendor/slickgrid/slick.formatters.js
similarity index 100%
rename from web/pgadmin/static/js/slickgrid/slick.formatters.js
rename to web/pgadmin/static/vendor/slickgrid/slick.formatters.js
diff --git a/web/pgadmin/static/css/slickgrid/slick.grid.css b/web/pgadmin/static/vendor/slickgrid/slick.grid.css
similarity index 100%
rename from web/pgadmin/static/css/slickgrid/slick.grid.css
rename to web/pgadmin/static/vendor/slickgrid/slick.grid.css
diff --git a/web/pgadmin/static/js/slickgrid/slick.grid.js b/web/pgadmin/static/vendor/slickgrid/slick.grid.js
similarity index 100%
rename from web/pgadmin/static/js/slickgrid/slick.grid.js
rename to web/pgadmin/static/vendor/slickgrid/slick.grid.js
diff --git a/web/pgadmin/static/js/slickgrid/slick.pgadmin.editors.js b/web/pgadmin/static/vendor/slickgrid/slick.pgadmin.editors.js
similarity index 100%
rename from web/pgadmin/static/js/slickgrid/slick.pgadmin.editors.js
rename to web/pgadmin/static/vendor/slickgrid/slick.pgadmin.editors.js
diff --git a/web/pgadmin/static/js/slickgrid/slick.pgadmin.formatters.js b/web/pgadmin/static/vendor/slickgrid/slick.pgadmin.formatters.js
similarity index 100%
rename from web/pgadmin/static/js/slickgrid/slick.pgadmin.formatters.js
rename to web/pgadmin/static/vendor/slickgrid/slick.pgadmin.formatters.js
diff --git a/web/pgadmin/static/css/slickgrid/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png b/web/pgadmin/static/vendor/slickgrid/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png
similarity index 100%
rename from web/pgadmin/static/css/slickgrid/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png
rename to web/pgadmin/static/vendor/slickgrid/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png
diff --git a/web/pgadmin/static/css/slickgrid/smoothness/images/ui-bg_flat_75_ffffff_40x100.png b/web/pgadmin/static/vendor/slickgrid/smoothness/images/ui-bg_flat_75_ffffff_40x100.png
similarity index 100%
rename from web/pgadmin/static/css/slickgrid/smoothness/images/ui-bg_flat_75_ffffff_40x100.png
rename to web/pgadmin/static/vendor/slickgrid/smoothness/images/ui-bg_flat_75_ffffff_40x100.png
diff --git a/web/pgadmin/static/css/slickgrid/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png b/web/pgadmin/static/vendor/slickgrid/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png
similarity index 100%
rename from web/pgadmin/static/css/slickgrid/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png
rename to web/pgadmin/static/vendor/slickgrid/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png
diff --git a/web/pgadmin/static/css/slickgrid/smoothness/images/ui-bg_glass_65_ffffff_1x400.png b/web/pgadmin/static/vendor/slickgrid/smoothness/images/ui-bg_glass_65_ffffff_1x400.png
similarity index 100%
rename from web/pgadmin/static/css/slickgrid/smoothness/images/ui-bg_glass_65_ffffff_1x400.png
rename to web/pgadmin/static/vendor/slickgrid/smoothness/images/ui-bg_glass_65_ffffff_1x400.png
diff --git a/web/pgadmin/static/css/slickgrid/smoothness/images/ui-bg_glass_75_dadada_1x400.png b/web/pgadmin/static/vendor/slickgrid/smoothness/images/ui-bg_glass_75_dadada_1x400.png
similarity index 100%
rename from web/pgadmin/static/css/slickgrid/smoothness/images/ui-bg_glass_75_dadada_1x400.png
rename to web/pgadmin/static/vendor/slickgrid/smoothness/images/ui-bg_glass_75_dadada_1x400.png
diff --git a/web/pgadmin/static/css/slickgrid/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png b/web/pgadmin/static/vendor/slickgrid/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png
similarity index 100%
rename from web/pgadmin/static/css/slickgrid/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png
rename to web/pgadmin/static/vendor/slickgrid/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png
diff --git a/web/pgadmin/static/css/slickgrid/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png b/web/pgadmin/static/vendor/slickgrid/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png
similarity index 100%
rename from web/pgadmin/static/css/slickgrid/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png
rename to web/pgadmin/static/vendor/slickgrid/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png
diff --git a/web/pgadmin/static/css/slickgrid/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png b/web/pgadmin/static/vendor/slickgrid/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png
similarity index 100%
rename from web/pgadmin/static/css/slickgrid/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png
rename to web/pgadmin/static/vendor/slickgrid/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png
diff --git a/web/pgadmin/static/css/slickgrid/smoothness/images/ui-icons_222222_256x240.png b/web/pgadmin/static/vendor/slickgrid/smoothness/images/ui-icons_222222_256x240.png
similarity index 100%
rename from web/pgadmin/static/css/slickgrid/smoothness/images/ui-icons_222222_256x240.png
rename to web/pgadmin/static/vendor/slickgrid/smoothness/images/ui-icons_222222_256x240.png
diff --git a/web/pgadmin/static/css/slickgrid/smoothness/images/ui-icons_2e83ff_256x240.png b/web/pgadmin/static/vendor/slickgrid/smoothness/images/ui-icons_2e83ff_256x240.png
similarity index 100%
rename from web/pgadmin/static/css/slickgrid/smoothness/images/ui-icons_2e83ff_256x240.png
rename to web/pgadmin/static/vendor/slickgrid/smoothness/images/ui-icons_2e83ff_256x240.png
diff --git a/web/pgadmin/static/css/slickgrid/smoothness/images/ui-icons_454545_256x240.png b/web/pgadmin/static/vendor/slickgrid/smoothness/images/ui-icons_454545_256x240.png
similarity index 100%
rename from web/pgadmin/static/css/slickgrid/smoothness/images/ui-icons_454545_256x240.png
rename to web/pgadmin/static/vendor/slickgrid/smoothness/images/ui-icons_454545_256x240.png
diff --git a/web/pgadmin/static/css/slickgrid/smoothness/images/ui-icons_888888_256x240.png b/web/pgadmin/static/vendor/slickgrid/smoothness/images/ui-icons_888888_256x240.png
similarity index 100%
rename from web/pgadmin/static/css/slickgrid/smoothness/images/ui-icons_888888_256x240.png
rename to web/pgadmin/static/vendor/slickgrid/smoothness/images/ui-icons_888888_256x240.png
diff --git a/web/pgadmin/static/css/slickgrid/smoothness/images/ui-icons_cd0a0a_256x240.png b/web/pgadmin/static/vendor/slickgrid/smoothness/images/ui-icons_cd0a0a_256x240.png
similarity index 100%
rename from web/pgadmin/static/css/slickgrid/smoothness/images/ui-icons_cd0a0a_256x240.png
rename to web/pgadmin/static/vendor/slickgrid/smoothness/images/ui-icons_cd0a0a_256x240.png
diff --git a/web/pgadmin/static/css/slickgrid/smoothness/jquery-ui-1.11.3.custom.css b/web/pgadmin/static/vendor/slickgrid/smoothness/jquery-ui-1.11.3.custom.css
similarity index 100%
rename from web/pgadmin/static/css/slickgrid/smoothness/jquery-ui-1.11.3.custom.css
rename to web/pgadmin/static/vendor/slickgrid/smoothness/jquery-ui-1.11.3.custom.css
diff --git a/web/pgadmin/static/css/slickgrid/smoothness/jquery-ui-1.11.3.custom.min.css b/web/pgadmin/static/vendor/slickgrid/smoothness/jquery-ui-1.11.3.custom.min.css
similarity index 100%
rename from web/pgadmin/static/css/slickgrid/smoothness/jquery-ui-1.11.3.custom.min.css
rename to web/pgadmin/static/vendor/slickgrid/smoothness/jquery-ui-1.11.3.custom.min.css
diff --git a/web/pgadmin/static/js/underscore-min.js b/web/pgadmin/static/vendor/underscore/underscore-min.js
similarity index 100%
rename from web/pgadmin/static/js/underscore-min.js
rename to web/pgadmin/static/vendor/underscore/underscore-min.js
diff --git a/web/pgadmin/static/js/underscore.js b/web/pgadmin/static/vendor/underscore/underscore.js
similarity index 100%
rename from web/pgadmin/static/js/underscore.js
rename to web/pgadmin/static/vendor/underscore/underscore.js
diff --git a/web/pgadmin/static/js/underscore.string.js b/web/pgadmin/static/vendor/underscore/underscore.string.js
similarity index 100%
rename from web/pgadmin/static/js/underscore.string.js
rename to web/pgadmin/static/vendor/underscore/underscore.string.js
diff --git a/web/pgadmin/static/js/underscore.string.min.js b/web/pgadmin/static/vendor/underscore/underscore.string.min.js
similarity index 100%
rename from web/pgadmin/static/js/underscore.string.min.js
rename to web/pgadmin/static/vendor/underscore/underscore.string.min.js
diff --git a/web/pgadmin/static/js/wcDocker/README b/web/pgadmin/static/vendor/wcDocker/README
similarity index 100%
rename from web/pgadmin/static/js/wcDocker/README
rename to web/pgadmin/static/vendor/wcDocker/README
diff --git a/web/pgadmin/static/css/wcDocker/Themes/default.css b/web/pgadmin/static/vendor/wcDocker/Themes/default.css
similarity index 100%
rename from web/pgadmin/static/css/wcDocker/Themes/default.css
rename to web/pgadmin/static/vendor/wcDocker/Themes/default.css
diff --git a/web/pgadmin/static/css/wcDocker/Themes/default.min.css b/web/pgadmin/static/vendor/wcDocker/Themes/default.min.css
similarity index 100%
rename from web/pgadmin/static/css/wcDocker/Themes/default.min.css
rename to web/pgadmin/static/vendor/wcDocker/Themes/default.min.css
diff --git a/web/pgadmin/static/css/wcDocker/wcDocker.css b/web/pgadmin/static/vendor/wcDocker/wcDocker.css
similarity index 100%
rename from web/pgadmin/static/css/wcDocker/wcDocker.css
rename to web/pgadmin/static/vendor/wcDocker/wcDocker.css
diff --git a/web/pgadmin/static/js/wcDocker/wcDocker.js b/web/pgadmin/static/vendor/wcDocker/wcDocker.js
similarity index 100%
rename from web/pgadmin/static/js/wcDocker/wcDocker.js
rename to web/pgadmin/static/vendor/wcDocker/wcDocker.js
diff --git a/web/pgadmin/static/css/wcDocker/wcDocker.min.css b/web/pgadmin/static/vendor/wcDocker/wcDocker.min.css
similarity index 100%
rename from web/pgadmin/static/css/wcDocker/wcDocker.min.css
rename to web/pgadmin/static/vendor/wcDocker/wcDocker.min.css
diff --git a/web/pgadmin/static/js/wcDocker/wcDocker.min.js b/web/pgadmin/static/vendor/wcDocker/wcDocker.min.js
similarity index 100%
rename from web/pgadmin/static/js/wcDocker/wcDocker.min.js
rename to web/pgadmin/static/vendor/wcDocker/wcDocker.min.js
diff --git a/web/pgadmin/templates/base.html b/web/pgadmin/templates/base.html
index da907d3ec..32ccc5e03 100755
--- a/web/pgadmin/templates/base.html
+++ b/web/pgadmin/templates/base.html
@@ -20,63 +20,63 @@
+ href="{{ url_for('static', filename='vendor/bootstrap/bootstrap.css' if config.DEBUG else 'vendor/bootstrap/bootstrap.min.css')}}"/>
+ href="{{ url_for('static', filename='vendor/alertifyjs/alertify.css' if config.DEBUG else 'vendor/alertifyjs/alertify.min.css') }}"/>
+ href="{{ url_for('static', filename='vendor/alertifyjs/themes/bootstrap.css' if config.DEBUG else 'vendor/alertifyjs/themes/bootstrap.min.css') }}"/>
+ href="{{ url_for('static', filename='vendor/bootstrap/bootstrap-theme.css' if config.DEBUG else 'vendor/bootstrap/bootstrap-theme.min.css') }}"/>
-
-
-
-
-
+ href="{{ url_for('static', filename='vendor/font-awesome/css/font-awesome.css' if config.DEBUG else 'vendor/font-awesome/css/font-awesome.min.css') }}"/>
+
+
+
+
+
+ href="{{ url_for('static', filename='vendor/backgrid/backgrid-select-all.css' if config.DEBUG else 'vendor/backgrid/backgrid-select-all.min.css')}}"/>
+ href="{{ url_for('static', filename='vendor/backgrid/backgrid-paginator.css' if config.DEBUG else 'vendor/backgrid/backgrid-paginator.min.css')}}"/>
+ href="{{ url_for('static', filename='vendor/backgrid/backgrid-filter.css' if config.DEBUG else 'vendor/backgrid/backgrid-filter.min.css')}}"/>
+ href="{{ url_for('static', filename='vendor/backgrid/backgrid-sizeable-columns.css')}}"/>
+ href="{{ url_for('static', filename='vendor/select2/select2.css' if config.DEBUG else 'vendor/select2/select2.min.css')}}"/>
+ href="{{ url_for('static', filename='vendor/slickgrid/slick.grid.css')}}"/>
+ href="{{ url_for('static', filename='vendor/slickgrid/slick-default-theme.css')}}"/>
+ href="{{ url_for('static', filename='vendor/slickgrid/smoothness/jquery-ui-1.11.3.custom.css' if config.DEBUG else 'vendor/slickgrid/smoothness/jquery-ui-1.11.3.custom.min.css')}}"/>
+ href="{{ url_for('static', filename='vendor/codemirror/addon/scroll/simplescrollbars.css')}}"/>
{% for stylesheet in current_app.stylesheets %}
{% endfor %}
-
+
{% block css_link %}{% endblock %}
+ src="{{ url_for('static', filename='vendor/require/require.js' if config.DEBUG else 'vendor/require/require.min.js') }}">