var selectDiv = null;
var tempDiv = null;
var objDiv;

function initDndMgr() {
    dndMgr.clearDropZones();
    dndMgr.clearDraggables();
    var containerDiv = objDiv;
    for (var i = 0; i < containerDiv.childNodes.length; i++) {
        if (containerDiv.childNodes[i].tagName == 'DIV') {
            var temp = containerDiv.childNodes[i];
            dndMgr.registerDropZone(new Rico.Dropzone(temp.id));
            initDraggable(temp);
        }
    }
};
function initDraggable(obj) {
    for (var i = 0; i < obj.childNodes.length; i++) {
        if (obj.childNodes[i].tagName == 'DIV') {
            var temp1 = obj.childNodes[i];
            dndMgr.registerDraggable(new Rico.Draggable('test-rico-dnd', temp1.id));
        }
    }
};

var Rico = {};
Rico.DragAndDrop = Class.create();
Rico.DragAndDrop.prototype = {initialize:function() {
    this.dropZones = new Array();
    this.draggables = new Array();
    this.currentDragObjects = new Array();
    this.dragElement = null;
    this.lastSelectedDraggable = null;
    this.currentDragObjectVisible = false;
    this.interestedInMotionEvents = false;
}, registerDropZone:function(aDropZone) {
    this.dropZones[ this.dropZones.length ] = aDropZone;
}, deregisterDropZone:function(aDropZone) {
    var newDropZones = new Array();
    var j = 0;
    for (var i = 0; i < this.dropZones.length; i++) {
        if (this.dropZones[i] != aDropZone)newDropZones[j++] = this.dropZones[i];
    }
    this.dropZones = newDropZones;
}, clearDropZones:function() {
    this.dropZones = new Array();
}, clearDraggables:function() {
    this.draggables = new Array();
}, registerDraggable:function(aDraggable) {
    this.draggables[ this.draggables.length ] = aDraggable;
    this._addMouseDownHandler(aDraggable);
},deregisterregisterDraggable:function(aDraggable) {
    var ds = new Array();
    var j = 0;
    for (var i = 0; i < this.draggables.length; i++) {
        if (this.draggables[i] != aDraggable)ds[j++] = this.draggables[i];
    }
    this.draggables = ds;
}, clearSelection:function() {
    for (var i = 0; i < this.currentDragObjects.length; i++)this.currentDragObjects[i].deselect();
    this.currentDragObjects = new Array();
    this.lastSelectedDraggable = null;
}, hasSelection:function() {
    return this.currentDragObjects.length > 0;
}, setStartDragFromElement:function(e, mouseDownElement) {
    this.interestedInMotionEvents = this.hasSelection();
    this._terminateEvent(e);
}, updateSelection:function(draggable, extendSelection) {
    if (! extendSelection)this.clearSelection();
    if (draggable.isSelected()) {
        this.currentDragObjects.removeItem(draggable);
        draggable.deselect();
        if (draggable == this.lastSelectedDraggable)this.lastSelectedDraggable = null;
    } else {
        this.currentDragObjects[ this.currentDragObjects.length ] = draggable;
        draggable.select();
        this.lastSelectedDraggable = draggable;
    }
}, _mouseDownHandler:function(e) {
    if (arguments.length == 0)e = event;
    var nsEvent = e.which != undefined;
    if ((nsEvent && e.which != 1) || (!nsEvent && e.button != 1))return;
    var eventTarget = e.target ? e.target :e.srcElement;
    if (eventTarget.tagName != 'H3' && eventTarget.tagName != 'h3') {
        if(eventTarget.parentNode.tagName == 'H3' || eventTarget.parentNode.tagName == 'h3'){
            eventTarget = eventTarget.parentNode;
        }else{
            return;
        }
    }
    var draggableObject = eventTarget.parentNode.draggable;
    this.updateSelection(draggableObject, e.ctrlKey);
    if (this.hasSelection())for (var i = 0; i < this.dropZones.length; i++)this.dropZones[i].clearPositionCache();
    this.setStartDragFromElement(e, draggableObject.getMouseDownHTMLElement());
}, _mouseMoveHandler:function(e) {
    var nsEvent = e.which != undefined;
    if (!this.interestedInMotionEvents) {
        this._terminateEvent(e);
        return;
    }
    if (! this.hasSelection())return;
    if (! this.currentDragObjectVisible)this._startDrag(e);
    if (!this.activatedDropZones)this._activateRegisteredDropZones();
    this._updateDraggableLocation(e);
    if (tempDiv.style.display == 'none') {
        tempDiv.style.display = 'none';
    }
    if (this._updateDraggableHover(e) == false) {
        if (this._updateDropZonesHover(e) == false) {
            this._terminateEvent(e);
        }
        this._terminateEvent(e);
    }
}, _makeDraggableObjectVisible:function(e) {
    if (!this.hasSelection())return;
    var dragElement;
    if (this.currentDragObjects.length > 1)dragElement = this.currentDragObjects[0].getMultiObjectDragGUI(this.currentDragObjects); else dragElement = this.currentDragObjects[0].getSingleObjectDragGUI();
    if (RicoUtil.getElementsComputedStyle(dragElement, "position") != "absolute")dragElement.style.position = "absolute";
    if (dragElement.parentNode == null || dragElement.parentNode.nodeType == 11)document.body.appendChild(dragElement);
    this.dragElement = dragElement;
    this._updateDraggableLocation(e);
    this.currentDragObjectVisible = true;
}, _updateDraggableLocation:function(e) {
    if (selectDiv != null) {
        selectDiv.style.left = event.clientX + RicoUtil.docScrollLeft()-80+ "px";
        selectDiv.style.top = event.clientY + RicoUtil.docScrollTop()-20 + "px";
    }
},_updateDraggableHover:function(e) {
    var n = this.draggables.length;
    var n1 = this.dropZones.length;
    var flag = false;
    for (var i = 0; i < n; i++) {
        this.draggables[i].hideHover();
    }
    for (var i = 0; i < n1; i++) {
        this.dropZones[i].hideHover();
    }
    for (var i = 0; i < n; i++) {
        var temp = this._mousePointInDraggable(e, this.draggables[i]);
        if (temp > 0) {
            this.draggables[i].showHover(temp);
            flag = true;
            break;
        }
    }
    return flag;
}, _startDrag:function(e) {
    for (var i = 0; i < this.currentDragObjects.length; i++)this.currentDragObjects[i].startDrag();
    this._makeDraggableObjectVisible(e);
},_mouseUpHandler:function(e) {
    if (! this.hasSelection())return;
    var nsEvent = e.which != undefined;
    if ((nsEvent && e.which != 1) || (!nsEvent && e.button != 1))return;
    this.interestedInMotionEvents = false;
    if (this.dragElement == null) {
        this._terminateEvent(e);
        return;
    }
    if (this._placeDraggableInDropZone(e)) {
        this._completeDropOperation(e);
        if (tempDiv && tempDiv.parentNode) {
            tempDiv.parentNode.removeChild(tempDiv);
        }
    } else {
        if (tempDiv && tempDiv.parentNode) {
            selectDiv.style.position = "";
            selectDiv.style.left = "";
            selectDiv.style.top = "";
            selectDiv.style.width = "";
            tempDiv.parentNode.insertBefore(selectDiv, tempDiv);
        }
        this._completeDropOperation(e);
    }
    tempDiv = null;
    initDndMgr();
}, _completeDropOperation:function(e) {
    if (this.dragElement != this.currentDragObjects[0].getMouseDownHTMLElement()) {
        if (this.dragElement.parentNode != null)this.dragElement.parentNode.removeChild(this.dragElement);
    }
    this._deactivateRegisteredDropZones();
    this._endDrag();
    this.clearSelection();
    this.dragElement = null;
    this.currentDragObjectVisible = false;
    this._terminateEvent(e);
    RicoUtil.delCloneElement();
}, _doCancelDragProcessing:function() {
    this._cancelDrag();
    if (this.dragElement != this.currentDragObjects[0].getMouseDownHTMLElement()) {
        if (this.dragElement.parentNode != null) {
            this.dragElement.parentNode.removeChild(this.dragElement);
        }
    }
    this._deactivateRegisteredDropZones();
    this.dragElement = null;
    this.currentDragObjectVisible = false;
},_placeDraggableInDropZone:function(e) {
    var foundDropZone = false;
    var n = this.dropZones.length;
    var l = this.draggables.length;
    for (var i = 0; i < l; i++) {
        var temp = this._mousePointInDraggable(e, this.draggables[i]);
        if (temp > 0) {
            this.dropZones[0].accept(this.draggables[i].getHTMLElement(), temp);
            this.draggables[i].hideHover();
            foundDropZone = true;
            break;
        } else {
            for (var j = 0; j < n; j++) {
                if (this._mousePointInDropZone(e, this.dropZones[j])) {
                    this.dropZones[j].acceptByZone();
                    this.dropZones[j].hideHover();
                    foundDropZone = true;
                    break;
                }
            }
        }
    }
    return foundDropZone;
}, _cancelDrag:function() {
    for (var i = 0; i < this.currentDragObjects.length; i++)this.currentDragObjects[i].cancelDrag();
}, _endDrag:function() {
    for (var i = 0; i < this.currentDragObjects.length; i++)this.currentDragObjects[i].endDrag();
},_updateDropZonesHover:function(e) {
    var n = this.dropZones.length;
    for (var i = 0; i < n; i++) {
        if (! this._mousePointInDropZone(e, this.dropZones[i]))this.dropZones[i].hideHover();
    }
    for (var i = 0; i < n; i++) {
        if (this._mousePointInDropZone(e, this.dropZones[i])) {
            this.dropZones[i].showHover();
        }
    }
},_mousePointInDropZone:function(e, dropZone) {
    var absoluteRect = dropZone.getAbsoluteRect();
    var left = e.clientX + RicoUtil.docScrollLeft();
    var top = e.clientY + RicoUtil.docScrollTop();
    return left > absoluteRect.left && left < absoluteRect.right && top > absoluteRect.bottom;
}, _mousePointInDraggable:function(e, draggable) {
    var absoluteRect = draggable.getAbsoluteRect();
    var left = e.clientX + RicoUtil.docScrollLeft();
    var right = e.clientX + RicoUtil.docScrollLeft();
    var top = e.clientY + RicoUtil.docScrollTop();
    var bottom = e.clientY + RicoUtil.docScrollTop();
    if (left > absoluteRect.left && right < absoluteRect.right && top > absoluteRect.top && bottom < absoluteRect.bottom) {
        if (left > absoluteRect.left && right < absoluteRect.right && top > absoluteRect.top && bottom < ((absoluteRect.bottom - absoluteRect.top) / 2 + absoluteRect.top)) {
            return 1;
        } else {
            return 2;
        }
    } else {
        return 0;
    }
}, _addMouseDownHandler:function(aDraggable) {
    var htmlElement = aDraggable.getMouseDownHTMLElement();
    if (htmlElement != null) {
        htmlElement.draggable = aDraggable;
        this._addMouseDownEvent(htmlElement);
    }
}, _activateRegisteredDropZones:function() {
    var n = this.dropZones.length;
    for (var i = 0; i < n; i++) {
        var dropZone = this.dropZones[i];
        dropZone.activate();
    }
    this.activatedDropZones = true;
}, _deactivateRegisteredDropZones:function() {
    var n = this.dropZones.length;
    for (var i = 0; i < n; i++)this.dropZones[i].deactivate();
    this.activatedDropZones = false;
}, _addMouseDownEvent:function(htmlElement) {
    if (typeof document.implementation != "undefined" && document.implementation.hasFeature("HTML", "1.0") && document.implementation.hasFeature("Events", "2.0") && document.implementation.hasFeature("CSS", "2.0")) {
        htmlElement.addEventListener("mousedown", this._mouseDownHandler.bindAsEventListener(this), false);
    } else {
        htmlElement.attachEvent("onmousedown", this._mouseDownHandler.bindAsEventListener(this));
    }
}, _terminateEvent:function(e) {
    if (e.stopPropagation != undefined)e.stopPropagation(); else if (e.cancelBubble != undefined)e.cancelBubble = true;
    if (e.preventDefault != undefined)e.preventDefault(); else e.returnValue = false;
}, initializeEventHandlers:function() {
    if (typeof document.implementation != "undefined" && document.implementation.hasFeature("HTML", "1.0") && document.implementation.hasFeature("Events", "2.0") && document.implementation.hasFeature("CSS", "2.0")) {
        document.addEventListener("mouseup", this._mouseUpHandler.bindAsEventListener(this), false);
        document.addEventListener("mousemove", this._mouseMoveHandler.bindAsEventListener(this), false);
    } else {
        document.attachEvent("onmouseup", this._mouseUpHandler.bindAsEventListener(this));
        document.attachEvent("onmousemove", this._mouseMoveHandler.bindAsEventListener(this));
    }
}};
var dndMgr = new Rico.DragAndDrop();
dndMgr.initializeEventHandlers();
Rico.Draggable = Class.create();
Rico.Draggable.prototype = {initialize:function(type, htmlElement) {
    this.type = type;
    this.htmlElement = $(htmlElement);
    this.selected = false;
    this.absoluteRect = null;
},getMouseDownHTMLElement:function() {
    return this.htmlElement;
},select:function() {
    this.selected = true;
    if (this.showingSelected)return;
    var htmlElement = this.getMouseDownHTMLElement();
    tempDiv = this.getMouseDownHTMLElement().cloneNode(false);
    htmlElement.style.width = (parseInt(htmlElement.parentNode.offsetWidth)) + "px";
    htmlElement.style.height = (parseInt(htmlElement.clientHeight)) + "px";
    this.showingSelected = true;
    selectDiv = htmlElement;
    RicoUtil.cloneElement = htmlElement.cloneNode(false);
    tempDiv.style.width = (parseInt(htmlElement.style.width)+50) + "px";
    tempDiv.style.height = (parseInt(htmlElement.style.height)+50) + "px";
    tempDiv.style.borderWidth = "1px";
    tempDiv.style.borderStyle = "solid";
    tempDiv.style.borderColor = "#ccc";
    var title = htmlElement.firstChild.cloneNode(true);
    tempDiv.appendChild(title);
    tempDiv.style.filter = "alpha(opacity=50)";
    tempDiv.style.opacity = "0.5";
    tempDiv.style.display = 'none';
    tempDiv.id = "tempDivID";
    htmlElement.parentNode.insertBefore(tempDiv, htmlElement);
    dndMgr.registerDraggable(new Rico.Draggable('test-rico-dnd', tempDiv.id));
    htmlElement.style.height = "10px";
}, deselect:function() {
    this.selected = false;
    if (!this.showingSelected)return;
    var htmlElement = this.getMouseDownHTMLElement();
    htmlElement.style.width = "";
    htmlElement.style.height = "";
    this.showingSelected = false;
    selectDiv = null;
    tempDiv.parentNode.removeChild(tempDiv);
    dndMgr.deregisterregisterDraggable(new Rico.Draggable('test-rico-dnd', tempDiv.id));
    tempDiv = null;
}, isSelected:function() {
    return this.selected;
}, startDrag:function() {
}, cancelDrag:function() {
}, endDrag:function() {
},getSingleObjectDragGUI:function() {
    return this.htmlElement;
}, getMultiObjectDragGUI:function(draggables) {
    return this.htmlElement;
}, getDroppedGUI:function() {
    return this.htmlElement;
},getAbsoluteRect:function() {
    if (this.absoluteRect == null) {
        var htmlElement = this.getHTMLElement();
        if (selectDiv.id == htmlElement.id) {
            return{top:0,left:0,bottom:0,right:0};
        }
        var pos = RicoUtil.toViewportPosition(htmlElement);
        /*this.absoluteRect = {top:pos.y,left:pos.x,bottom:pos.y + htmlElement.offsetHeight,right:pos.x + htmlElement.offsetWidth};*/
        this.absoluteRect = {top:pos.y,left:pos.x,bottom:pos.y + htmlElement.offsetHeight,right:pos.x + htmlElement.offsetWidth};
    }
    return this.absoluteRect;
},getHTMLElement:function() {
    return this.htmlElement;
},showHover:function(flag) {
    var htmlElement = this.getHTMLElement();
    if (htmlElement == null || this.showingHover)return;
/*    this.saveBorderWidth = htmlElement.style.borderWidth;
    this.saveBorderStyle = htmlElement.style.borderStyle;
    this.saveBorderColor = htmlElement.style.borderColor;*/
    this.showingHover = true;
    RicoUtil.setCloneElementNewStyle(RicoUtil.cloneElement);
    if (flag == 1) {
/*        htmlElement.style.borderTopWidth = "5px";
        htmlElement.style.borderTopStyle = "solid";
        htmlElement.style.borderTopColor = "#00F";*/
        htmlElement.insertAdjacentElement("BeforeBegin",RicoUtil.cloneElement);
    } else if (flag == 2) {
/*        htmlElement.style.borderBottomWidth = "5px";
        htmlElement.style.borderBottomStyle = "solid";
        htmlElement.style.borderBottomColor = "#00F";*/
        htmlElement.insertAdjacentElement("AfterEnd",RicoUtil.cloneElement);
    }
}, hideHover:function() {
    var htmlElement = this.getHTMLElement();
    if (htmlElement == null || !this.showingHover)return;
/*    htmlElement.style.borderWidth = this.saveBorderWidth;
    htmlElement.style.borderStyle = this.saveBorderStyle;
    htmlElement.style.borderColor = this.saveBorderColor;*/
    RicoUtil.cloneElement.removeNode(-1);
    this.showingHover = false;
},canAccept:function(draggableObjects) {
    return true;
},toString:function() {
    return this.type + ":" + this.htmlElement + ":";
}
};
Rico.Dropzone = Class.create();
Rico.Dropzone.prototype = {initialize:function(htmlElement) {
    this.htmlElement = $(htmlElement);
    this.absoluteRect = null;
}, getHTMLElement:function() {
    return this.htmlElement;
}, clearPositionCache:function() {
    this.absoluteRect = null;
}, activate:function() {
    var htmlElement = this.getHTMLElement();
    if (htmlElement == null || this.showingActive)return;
    this.showingActive = true;
}, deactivate:function() {
    var htmlElement = this.getHTMLElement();
    if (htmlElement == null || !this.showingActive)return;
    this.showingActive = false;
},showHover:function() {
    var htmlElement = this.getHTMLElement();
    if (htmlElement == null || this.showingHover)return;
    this.saveBorderWidth = htmlElement.style.borderWidth;
    this.saveBorderStyle = htmlElement.style.borderStyle;
    this.saveBorderColor = htmlElement.style.borderColor;
    this.showingHover = true;
    htmlElement.style.borderBottomWidth = "5px";
    htmlElement.style.borderBottomStyle = "solid";
    htmlElement.style.borderBottomColor = "#00F";
}, hideHover:function() {
    var htmlElement = this.getHTMLElement();
    if (htmlElement == null || !this.showingHover)return;
    htmlElement.style.borderWidth = this.saveBorderWidth;
    htmlElement.style.borderStyle = this.saveBorderStyle;
    htmlElement.style.borderColor = this.saveBorderColor;
    this.showingHover = false;
}, getAbsoluteRect:function() {
    if (this.absoluteRect == null) {
        var htmlElement = this.getHTMLElement();
        var pos = RicoUtil.toViewportPosition(htmlElement);
        /*this.absoluteRect = {top:pos.y,left:pos.x,bottom:pos.y + htmlElement.offsetHeight,right:pos.x + htmlElement.offsetWidth};*/
        this.absoluteRect = {top:pos.y,left:pos.x,bottom:pos.y,right:pos.x};
    }
    return this.absoluteRect;
}, accept:function(focusDiv, flag) {
    var htmlElement = focusDiv.parentNode;
    if (htmlElement == null)return;
    var obj = $(focusDiv);
    selectDiv.style.position = "";
    selectDiv.style.top = "";
    selectDiv.style.left = "";
    if (obj != null) {
        if (flag == 1 || focusDiv.id == 'leftDivFooter' || focusDiv.id == 'centerDivFooter' || focusDiv.id == 'rightDivFooter') {
            htmlElement.insertBefore(selectDiv, obj);
        } else {
            RicoUtil.insertAfter(selectDiv, obj);
        }
    } else {
        htmlElement.appendChild(selectDiv);
    }
    /*Element.show('alert');*/
    saveAllNow();
    Module.setModuleStatByDiv(htmlElement);
},acceptByZone:function() {
    var htmlElement = this.getHTMLElement();
    if (htmlElement == null)return;
    selectDiv.style.position = "";
    selectDiv.style.top = "";
    selectDiv.style.left = "";
    htmlElement.insertBefore(selectDiv, $(htmlElement.id + 'Footer'));
    /*Element.show('alert');*/
    saveAllNow();
    Module.setModuleStatByDiv(htmlElement);
}};
var RicoUtil = {getElementsComputedStyle:function(htmlElement, cssProperty, mozillaEquivalentCSS) {
    if (arguments.length == 2)mozillaEquivalentCSS = cssProperty;
    var el = $(htmlElement);
    if (el.currentStyle)return el.currentStyle[cssProperty]; else return document.defaultView.getComputedStyle(el, null).getPropertyValue(mozillaEquivalentCSS);
},cloneElement:new Object()
 ,setCloneElementNewStyle:function(element){
    var tmpElment = element;
    tmpElment.id = "tmpPosDiv";
    tmpElment.style.width = "98%";
    tmpElment.style.borderWidth = "1px";
    tmpElment.style.borderStyle = "dashed";
    tmpElment.style.borderColor = "#ff7300";
    /*tmpElment.style.backgroundColor = "#CCC";*/
},
delCloneElement:function(){
    try{
        RicoUtil.cloneElement.removeNode(-1);
    }catch(e){}
}
 ,createXmlDocument :function() {
    if (document.implementation && document.implementation.createDocument) {
        var doc = document.implementation.createDocument("", "", null);
        if (doc.readyState == null) {
            doc.readyState = 1;
            doc.addEventListener("load", function() {
                doc.readyState = 4;
                if (typeof doc.onreadystatechange == "function")doc.onreadystatechange();
            }, false);
        }
        return doc;
    }
    if (window.ActiveXObject)return Try.these(function() {
        return new ActiveXObject('MSXML2.DomDocument')
    }, function() {
        return new ActiveXObject('Microsoft.DomDocument')
    }, function() {
        return new ActiveXObject('MSXML.DomDocument')
    }, function() {
        return new ActiveXObject('MSXML3.DomDocument')
    }) || false;
    return null;
}, toViewportPosition:function(element) {
    return this._toAbsolute(element, true);
}, toDocumentPosition:function(element) {
    return this._toAbsolute(element, false);
}, _toAbsolute:function(element, accountForDocScroll) {
    if (navigator.userAgent.toLowerCase().indexOf("msie") == -1)return this._toAbsoluteMozilla(element, accountForDocScroll);
    var x = 0;
    var y = 0;
    var parent = element;
    while (parent) {
        var borderXOffset = 0;
        var borderYOffset = 0;
        if (parent != element) {
            var borderXOffset = parseInt(this.getElementsComputedStyle(parent, "borderLeftWidth"));
            var borderYOffset = parseInt(this.getElementsComputedStyle(parent, "borderTopWidth"));
            borderXOffset = isNaN(borderXOffset)? 0 :borderXOffset;
            borderYOffset = isNaN(borderYOffset)? 0 :borderYOffset;
        }
        x += parent.offsetLeft + borderXOffset;
        y += parent.offsetTop + borderYOffset;
        parent = parent.offsetParent;
    }
    if (accountForDocScroll) {
    }
    return {x:x, y:y};
}, _toAbsoluteMozilla:function(element, accountForDocScroll) {
    var x = 0;
    var y = 0;
    var parent = element;
    while (parent) {
        x += parent.offsetLeft;
        y += parent.offsetTop;
        parent = parent.offsetParent;
    }
    parent = element;
    if (accountForDocScroll) {
    }
    return {x:x, y:y};
}, docScrollLeft:function() {
    if (window.pageXOffset){
        return window.pageXOffset;
    }else if (document.documentElement && document.documentElement.scrollLeft){
        return document.documentElement.scrollLeft;
    }else if (document.body){
        return document.body.scrollLeft;
    }else{
        return 0;
    }
}, docScrollTop:function() {
    if (window.pageYOffset){
        return window.pageYOffset;
    }else if (document.documentElement && document.documentElement.scrollTop){
        return document.documentElement.scrollTop;
    }else if (document.body){
        return document.body.scrollTop;
    }else{
        return 0;
    }
}, insertAfter:function(oNewNode, oChildNode) {
    var parent = oChildNode.parentNode;
    parent.insertBefore(oNewNode, this.nextElement(parent, oChildNode));
}, nextElement:function(parentNode, oChildNode) {
    var flag = -1;
    for (var i = 0; i < parentNode.childNodes.length; i++) {
        if (flag > -1) {
            return parentNode.childNodes[i];
        }
        if (parentNode.childNodes[i].id == oChildNode.id) {
            flag = i;
        }
    }
    return null;
}};
