if (top.HlpSys === undefined) {
    top.HlpSys = new Object();
}

top.HlpSys.search = function(){
    var self = null;
    var workingDocument = null;

    var searchState = new CookieWorker(top.document, "autodesk_search_state", 24000);

    function saveState(config) {
        searchState.store(config);
    }

    function restoreState(config) {
        var hideRanking = config.hideRanking;
        //load config from cookies or localStorage
        searchState.load(config);
        config.hideRanking = hideRanking;
        //convert string values into boolean
        config.highlightEnable = (!(config.highlightEnable === "false" || config.highlightEnable === false));
        config.wholeWords = (config.wholeWords === "true" || config.wholeWords === true);
        config.caseSensitive = (config.caseSensitive === "true" || config.caseSensitive === true);
    }

    function prepareQuery(query) {
        //replace stop symbols
        query = query.replace(/\\/g, "\\\\");
        query = query.replace(/[\[\^\$\.\|\+\(\)`~!#%&\-=\]{};'"<>,]/g, " ");
        query = query.replace(/\*/g, "[^\\s]*");
        query = query.replace(/\?/g, ".");

        //remove white space
        var regexp = /(\x20\x20)/g;
        while (query.match(regexp)) query = query.replace(regexp, "\x20");
        regexp = /(^\x20)|(\x20$)/g;
        while (query.match(regexp)) query = query.replace(regexp, "");

        return query;
    };

    function filterQuery(queryArr, buffer, data) {
        var isStopWord = false;
        var isSameWord = false;
        var resultArr = new Array();
        var filteredStopWords = "";
        var StopWords = data.stopWordsList;

        for (var i = 0; i < queryArr.length; i++) {
            isStopWord = false;
            isSameWord = false;
            if (StopWords[queryArr[i].toLowerCase()]) {
                isStopWord = true;
            }
            for (var j = 0; j < i; j++) {
                if (queryArr[j] == queryArr[i]) {
                    isSameWord = true;
                    break;
                }
            }
            if (!isStopWord && !isSameWord) {
                resultArr[resultArr.length] = queryArr[i];
            } else {
                filteredStopWords += "\"" + queryArr[i] + "\" ";
            }
        }

        buffer.filteredStopWords = filteredStopWords;
        buffer.querryWordList = resultArr;
        return resultArr;
    };

    function generateRegExpArray(queryArr, stemmedArr, config) {
        var resultArray = new Array(queryArr.length);
        var caseSensitive = config.caseSensitive;
        var wholeWords = config.wholeWords;
        var parameters = "";
        for (var i = 0; i<queryArr.length; i++) {
            if (caseSensitive) {
                parameters = "";
            } else {
                parameters = "i";
            }
            if (wholeWords)
                resultArray[i] = new RegExp('\\b' + '('+queryArr[i]+')|('+stemmedArr[i]+')' + '\\b', parameters);
            else
                resultArray[i] = new RegExp('('+queryArr[i]+')|('+stemmedArr[i]+')', parameters);
        }

        return resultArray;
    };

    function RenderBookList(searchProviders) {
        if (workingDocument !== null) {
            var bookList = workingDocument.getElementById("collapsible_search_books");

            if (bookList) {
                for (var i in searchProviders) {
                    var searchProvider = searchProviders[i];
                    var bookElement = workingDocument.createElement("div");
                    var bookSwitch = workingDocument.createElement("input");
                    bookSwitch.setAttribute("id", "book" + searchProvider.getName());
                    bookSwitch.setAttribute("type", "checkbox");
                    if (searchProvider.isEnabled()) {
                        bookSwitch.setAttribute("checked", "true");
                    }
                    bookSwitch.setAttribute("onClick", "top.HlpSys.search.data.searchProviders['"+i+"'].switchState()");
                    bookElement.appendChild(bookSwitch);

                    var text = workingDocument.createTextNode(searchProvider.getFullName());
                    bookElement.appendChild(text);
                    bookList.appendChild(bookElement);
                }
            }
        }
    }

    return {
        init : function(doc) {
            self = this;
            workingDocument = doc;
            restoreState(this.config);
            RenderBookList(this.data.searchProviders);
        },

        restoreState: function(doc) {
            var searchForm = doc.searchForm;

            var searchMethodState = this.config.searchMethod;
            for (var i = 0; i < searchForm.searchMethod.length; i++) {
                var radioElement = searchForm.searchMethod[i];
                if (radioElement.value == searchMethodState) {
                    radioElement.checked = true;
                }
            }

            var highlightCheckBox = searchForm.highlightSwitch;
            if (highlightCheckBox) {
                var highlightState = this.config.highlightEnable;
                highlightCheckBox.checked = highlightState;
            }

            var caseSensitiveSwitch = searchForm.caseSensitiveSwitch;
            if (caseSensitiveSwitch) {
                var caseSensitiveState = this.config.caseSensitive;
                caseSensitiveSwitch.checked = caseSensitiveState;
            }

            var wholeWordsSwitch = searchForm.wholeWordsSwitch;
            if (wholeWordsSwitch) {
                var wholeWordsState = this.config.wholeWords;
                wholeWordsSwitch.checked = wholeWordsState;
            }

            var searchTermField = searchForm.searchData;
            if (searchTermField) {
                var searchTermState = this.config.searchTerm;
                searchTermField.value = searchTermState;
            }
        },

        config:{
            workingDocument : null,
			caseSensitive: false,
			wholeWords: false,
			searchMethod: 'and',
			highlightEnable: true,
            searchTerm: "",
            hideRanking: false,

            setSearchMethod : function(option) {
                this.searchMethod = option;
                saveState(this);
            },

            setWholeWords : function(option) {
                if (typeof option == "boolean") {
                    this.wholeWords = option;
                } else {
                    this.wholeWords = !this.wholeWords;
                }
                saveState(this);
            },

            setHighlighting : function(option) {
                if (typeof option == "boolean") {
                    this.highlightEnable = option;
                } else {
                    this.highlightEnable = !this.highlightEnable;
                }
                saveState(this);
            },

            setCaseSensitive : function(option) {
                if (typeof option == "boolean") {
                    this.caseSensitive = option;
                } else {
                    this.caseSensitive = !this.caseSensitive;
                }
                saveState(this);
            }
		},

		data:{
			stopWordsList: new Array(),
            searchProviders: new Array(),

            registerSearchProvider : function(provider) {
                this.searchProviders[provider.getName()] = provider;
            },

            registerSearchDataProvider : function(name, dataProvider) {
                name = name != "" ? name : "default";
                var searchProvider = this.getSearchProvider(name);
                if (searchProvider) {
                    searchProvider.registerDataProvider(dataProvider);
                }
            },

            getSearchProvider : function(name) {
                name = name != "" ? name : "default";
                return this.searchProviders[name];
            }
		},

		buffer:{
			filteredStopWords:"",
			querryWordList: new Array()
		},

        SearchString: function(query) {
            //    document.getElementById("searchList").length = 0;
            var preQuery = prepareQuery(query);
            var preQueryArr = preQuery.split(" ");
            var queryArr = filterQuery(preQueryArr, this.buffer, this.data);
            var stemmedQueryArr = this.SearchStemmer.stem(queryArr);
            var regexpArr = generateRegExpArray(queryArr, stemmedQueryArr, this.config);
            //alert(regexpArr);

            var results = new this.ResultList();
            for (var i in this.data.searchProviders) {
                var searchProvider = this.data.searchProviders[i];
                if (searchProvider.isEnabled()) {
                    var resultsFromBook = searchProvider.SearchString(regexpArr, queryArr, this.config.searchMethod);
                    results.mergeResults(resultsFromBook);
                }
            }

            results.sortResults();
            return results;
        },

        doSearch : function(query, searchFrame) {
            this.ui.clearWarnings();
            this.config.searchTerm = query;
            saveState(this.config);
            var results = this.SearchString(query);
            if (this.buffer.filteredStopWords != "") {
                this.ui.showWarning("filtered.stopwords", this.buffer.filteredStopWords);
            }
            this.ui.displaySearchResult(results, searchFrame, this.config);
        },

        SearchResult: function(href, title, rank, bookName, description, ancestry) {
            return {
                href : href,
                title : title,
                rank: rank,
                bookName: bookName,
                description: description,
                ancestry: ancestry
            };
        },

        ResultList : function () {
            var list = new Array();
            var searchQuery = "";

            function quicksort(m, n, desc) {
                if (n <= m + 1) return;
                if ((n - m) == 2) {
                    if (compare(getElement(n - 1), getElement(m), desc)) exchange(n - 1, m);
                    return;
                }
                var i = m + 1;
                var j = n - 1;
                if (compare(getElement(m), getElement(i), desc)) exchange(i, m);
                if (compare(getElement(j), getElement(m), desc)) exchange(m, j);
                if (compare(getElement(m), getElement(i), desc)) exchange(i, m);
                var pivot = getElement(m);
                while (true) {
                    j--;
                    while (compare(pivot, getElement(j), desc)) j--;
                    i++;
                    while (compare(getElement(i), pivot, desc)) i++;
                    if (j <= i) break;
                    exchange(i, j);
                }
                exchange(m, j);
                if ((j - m) < (n - j)) {
                    quicksort(m, j, desc);
                    quicksort(j + 1, n, desc);
                } else {
                    quicksort(j + 1, n, desc);
                    quicksort(m, j, desc);
                }
            }

            ;

            function getElement(i) {
                return list[i].rank;
            }

            ;

            function compare(val1, val2, desc) {
                return (desc) ? val1 > val2 : val1 < val2;
            }

            ;

            function exchange(i, j) {
                // exchange adjacent
                // var tResult = new Array(4);
                var exchangeBuffer = list[i];
                list[i] = list[j];
                list[j] = exchangeBuffer;
            }

            ;

            return {
                addResult : function(searchResult) {
                    list[list.length] = searchResult;
                },

                sortResults : function(order) {
                    if (order === undefined) {
                        order = true;
                    }
                    quicksort(0, list.length, order);
                },

                getResults : function() {
                    return list;
                },

                addSearchQuery : function(query) {
                    searchQuery = query;
                },

                getSearchQuery : function() {
                    return searchQuery;
                },

                mergeResults : function(resultObject) {
                    var results = resultObject.getResults();
                    for (var i = 0; i< results.length; i++) {
                        list[list.length] = results[i];
                    }
                    searchQuery = resultObject.getSearchQuery();
                }
            };
        },

        SearchStemmer : function() {
            var step2list = new Array();
            step2list["ational"]="ate";
            step2list["tional"]="tion";
            step2list["enci"]="ence";
            step2list["anci"]="ance";
            step2list["izer"]="ize";
            step2list["bli"]="ble";
            step2list["alli"]="al";
            step2list["entli"]="ent";
            step2list["eli"]="e";
            step2list["ousli"]="ous";
            step2list["ization"]="ize";
            step2list["ation"]="ate";
            step2list["ator"]="ate";
            step2list["alism"]="al";
            step2list["iveness"]="ive";
            step2list["fulness"]="ful";
            step2list["ousness"]="ous";
            step2list["aliti"]="al";
            step2list["iviti"]="ive";
            step2list["biliti"]="ble";
            step2list["logi"]="log";

            var step3list = new Array();
            step3list["icate"]="ic";
            step3list["ative"]="";
            step3list["alize"]="al";
            step3list["iciti"]="ic";
            step3list["ical"]="ic";
            step3list["ful"]="";
            step3list["ness"]="";

            var c = "[^aeiou]";          // consonant
            var v = "[aeiouy]";          // vowel
            var C = c + "[^aeiouy]*";    // consonant sequence
            var V = v + "[aeiou]*";      // vowel sequence

            var mgr0 = "^(" + C + ")?" + V + C;               // [C]VC... is m>0
            var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$";  // [C]VC[V] is m=1
            var mgr1 = "^(" + C + ")?" + V + C + V + C;       // [C]VCVC... is m>1
            var s_v   = "^(" + C + ")?" + v;                   // vowel in stem

            function stemWord(w) {
                var stem;
                var suffix;
                var firstch;

                if (w.length < 3) { return w; }

                   var re;
                   var re2;
                   var re3;
                   var re4;

                firstch = w.substr(0,1);
                if (firstch == "y") {
                    w = firstch.toUpperCase() + w.substr(1);
                }

                // Step 1a
                   re = /^(.+?)(ss|i)es$/;
                   re2 = /^(.+?)([^s])s$/;

                   if (re.test(w)) { w = w.replace(re,"$1$2"); }
                   else if (re2.test(w)) {	w = w.replace(re2,"$1$2"); }

                // Step 1b
                re = /^(.+?)eed$/;
                re2 = /^(.+?)(ed|ing)$/;
                if (re.test(w)) {
                    var fp1 = re.exec(w);
                    re = new RegExp(mgr0);
                    if (re.test(fp1[1])) {
                        re = /.$/;
                        w = w.replace(re,"");
                    }
                } else if (re2.test(w)) {
                    var fp2 = re2.exec(w);
                    stem = fp2[1];
                    re2 = new RegExp(s_v);
                    if (re2.test(stem)) {
                        w = stem;
                        re2 = /(at|bl|iz)$/;
                        re3 = new RegExp("([^aeiouylsz])\\1$");
                        re4 = new RegExp("^" + C + v + "[^aeiouwxy]$");
                        if (re2.test(w)) {	w = w + "e"; }
                        else if (re3.test(w)) { re = /.$/; w = w.replace(re,""); }
                        else if (re4.test(w)) { w = w + "e"; }
                    }
                }

                // Step 1c
                re = /^(.+?)y$/;
                if (re.test(w)) {
                    var fp3 = re.exec(w);
                    stem = fp3[1];
                    re = new RegExp(s_v);
                    if (re.test(stem)) { w = stem + "i"; }
                }

                // Step 2
                re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/;
                if (re.test(w)) {
                    var fp4 = re.exec(w);
                    stem = fp4[1];
                    suffix = fp4[2];
                    re = new RegExp(mgr0);
                    if (re.test(stem)) {
                        w = stem + step2list[suffix];
                    }
                }

                // Step 3
                re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/;
                if (re.test(w)) {
                    var fp5 = re.exec(w);
                    stem = fp5[1];
                    suffix = fp5[2];
                    re = new RegExp(mgr0);
                    if (re.test(stem)) {
                        w = stem + step3list[suffix];
                    }
                }

                // Step 4
                re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/;
                re2 = /^(.+?)(s|t)(ion)$/;
                if (re.test(w)) {
                    var fp6 = re.exec(w);
                    stem = fp6[1];
                    re = new RegExp(mgr1);
                    if (re.test(stem)) {
                        w = stem;
                    }
                } else if (re2.test(w)) {
                    var fp7 = re2.exec(w);
                    stem = fp7[1] + fp7[2];
                    re2 = new RegExp(mgr1);
                    if (re2.test(stem)) {
                        w = stem;
                    }
                }

                // Step 5
                re = /^(.+?)e$/;
                if (re.test(w)) {
                    var fp8 = re.exec(w);
                    stem = fp8[1];
                    re = new RegExp(mgr1);
                    re2 = new RegExp(meq1);
                    re3 = new RegExp("^" + C + v + "[^aeiouwxy]$");
                    if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) {
                        w = stem;
                    }
                }

                re = /ll$/;
                re2 = new RegExp(mgr1);
                if (re.test(w) && re2.test(w)) {
                    re = /.$/;
                    w = w.replace(re,"");
                }

                // and turn initial Y back to y

                if (firstch == "y") {
                    w = firstch.toLowerCase() + w.substr(1);
                }

                return w;

            }

            return {
                stem : function(words) {
                    if (top.HlpSys.config && top.HlpSys.config.locale == 'en_US') {
                        var resultWords = new Array();
                        for (var i = 0; i < words.length; i++) {
                            resultWords[resultWords.length] = stemWord(words[i]);
                        }
                        return resultWords;
                    } else {
                        return words;
                    }
                }
            };
        }(),

        ui : {
            messages : new Array(),
            showedMessages : new Array(),

            //Shows warning from on of predefined messages.
            //@param message - messege type to show in warning block.
            //@param parameters - that should be added to the message
            showWarning : function(message, param) {
                var result_message = "";
                if (!top.HlpSys.search.ui.messages[message]) {
                    return;
                }

                if (top.HlpSys.search.ui.showedMessages[message]) {
                    return;
                }

                switch (message) {
                    case "filtered.stopwords" : {
                        result_message = top.HlpSys.search.ui.messages[message] + param;
                        break;
                    }
                    default: {
                        result_message = top.HlpSys.search.ui.messages[message];
                        break;
                    }
                }

                if (result_message != "") {
                    top.HlpSys.search.ui.showedMessages[message] = true;
                    var warningBlock = workingDocument.getElementById("warningBlock");
                    var warning = workingDocument.createElement("div");
                    warning.setAttribute("class", "warning");

                    var text = workingDocument.createTextNode(result_message);
                    warning.appendChild(text);
                    warningBlock.appendChild(warning);
                }
            },

            //Clear warnings displayed during search
            clearWarnings : function() {
                var warningBlock = workingDocument.getElementById("warningBlock");
                while (warningBlock.hasChildNodes()) {
                    var node = warningBlock.firstChild;
                    warningBlock.removeChild(node);
                }
                top.HlpSys.search.ui.showedMessages = new Array();
            },

            //Update progress bar of search process.
            //Not Implemented
            updateProgress: function() {

            },

            //Displays result of the search.
            //@param results  - ResultList objects that contains all results and search query for highlithing.
            //@param resultsDocument - document which was passed to the function doSearch. Usually we sending document where results should be displayed.
            displaySearchResult : function(resultList, resultsDocument, config) {

                var results = resultList.getResults();
                var searchQuery = resultList.getSearchQuery();
                var searchList = resultsDocument.getElementById("searchList");
                searchList.length = 0;

                for (var i = 0; i < results.length; i++)
                {
                    var element = resultsDocument.createElement("OPTION");
                    if (config.hideRanking) {
						element.text = results[i].title;
					} else {
						element.text = results[i].rank + ": " + results[i].title;
					}
                    element.value = results[i].href + "?"+searchQuery;
                    try
                    {
                        searchList.add(element, null);
                        // standards compliant
                    }
                    catch(ex)
                    {
                        searchList.add(element);
                        // IE only
                    }
                }

                if (searchList.length == 0) {
                    this.showWarning("no.results");
                }
            },

            viewResult : function(resultsDocument) {
                var searchList = resultsDocument.getElementById("searchList");
                if (searchList.selectedIndex > -1 ) {
                    window.open(searchList.options[searchList.selectedIndex].value, "content");
                }
            }

        }
    };
}();

// Used to include a JS file dynamically
function include_js(src) {
    var type = "text/JavaScript";
    document.write("<script src = \"" + src + "\" type = \"" + type + "\"></script>");
};


// SIG // Begin signature block
// SIG // MIIZzQYJKoZIhvcNAQcCoIIZvjCCGboCAQExCzAJBgUr
// SIG // DgMCGgUAMGcGCisGAQQBgjcCAQSgWTBXMDIGCisGAQQB
// SIG // gjcCAR4wJAIBAQQQEODJBs441BGiowAQS9NQkAIBAAIB
// SIG // AAIBAAIBAAIBADAhMAkGBSsOAwIaBQAEFBj3VSXdYUIX
// SIG // fK0jE3bnsfjRpu3YoIIUxzCCBIUwggNtoAMCAQICAwI6
// SIG // ZDANBgkqhkiG9w0BAQUFADBCMQswCQYDVQQGEwJVUzEW
// SIG // MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMS
// SIG // R2VvVHJ1c3QgR2xvYmFsIENBMB4XDTEyMTAxODE0Mzgz
// SIG // NVoXDTIyMDUyMDE0MzgzNVowXjELMAkGA1UEBhMCVVMx
// SIG // HTAbBgNVBAoTFFN5bWFudGVjIENvcnBvcmF0aW9uMTAw
// SIG // LgYDVQQDEydTeW1hbnRlYyBUaW1lIFN0YW1waW5nIFNl
// SIG // cnZpY2VzIENBIC0gRzIwggEiMA0GCSqGSIb3DQEBAQUA
// SIG // A4IBDwAwggEKAoIBAQCxrLNJVEuXHBIK2CV5kSJXKm/c
// SIG // uCbEQ3Nrwr8uUFr7FMJ2jkMBJUO0oeJF9Oi3e8N0zCLX
// SIG // tJQAAvdN7b+0t0Qka81fRTvRRM5DEnMXgotptCvLmR6s
// SIG // chsmTXEfsTHd+1FhAlOmqvVJLAV4RaUvic7nmef+jOJX
// SIG // Pz3GktxK+Hsz5HkK+/B1iEGc/8UDUZmq12yfk2mHZSmD
// SIG // hcJgFMTIyTsU2sCB8B8NdN6SIqvK9/t0fCfm90obf6fD
// SIG // ni2uiuqm5qonFn1h95hxEbziUKFL5V365Q6nLJ+qZSDT
// SIG // 2JboyHylTkhE/xniRAeSC9dohIBdanhkRc1gRn5UwRN8
// SIG // xXnxycFxAgMBAAGjggFmMIIBYjAfBgNVHSMEGDAWgBTA
// SIG // ephojYn7qwVkDBF9qn1luMrMTjAdBgNVHQ4EFgQUX5r1
// SIG // blzMzHSa1N197z/b7EyALt0wEgYDVR0TAQH/BAgwBgEB
// SIG // /wIBADAOBgNVHQ8BAf8EBAMCAQYwOgYDVR0fBDMwMTAv
// SIG // oC2gK4YpaHR0cDovL2NybC5nZW90cnVzdC5jb20vY3Js
// SIG // cy9ndGdsb2JhbC5jcmwwNAYIKwYBBQUHAQEEKDAmMCQG
// SIG // CCsGAQUFBzABhhhodHRwOi8vb2NzcC5nZW90cnVzdC5j
// SIG // b20wSwYDVR0gBEQwQjBABgkrBgEEAfAiAQcwMzAxBggr
// SIG // BgEFBQcCARYlaHR0cDovL3d3dy5nZW90cnVzdC5jb20v
// SIG // cmVzb3VyY2VzL2NwczAoBgNVHREEITAfpB0wGzEZMBcG
// SIG // A1UEAxMQVGltZVN0YW1wLTIwNDgtMTATBgNVHSUEDDAK
// SIG // BggrBgEFBQcDCDANBgkqhkiG9w0BAQUFAAOCAQEAqj4/
// SIG // A0EvNRN/jD8SXBDP7mdVeVZgDwFSDyOHekEoR+XTZnK7
// SIG // As/JDCQpQcLaLpngI5HvsTNHPMIIOgaVc6IbDrw/t+JZ
// SIG // 8Wm+8NPhGI9zLeijnCFAQPPNOrcBjdxNlLR6EAVQfxth
// SIG // xYIViuQsTe00EetbaolZx973LITAs706mOFFKIohlYA/
// SIG // yQeX8P9CwR5ChOeyx+CiapnU8dTG/lfAuTrn9idwDang
// SIG // e0oTlcLJuatpB9lNzGZHQkp0p6dts6c16H5Lqs69vJOf
// SIG // fcZApfyqH6jV0fB+f9LjTFb9QGTwR0xRBDDq6pQvJMrp
// SIG // CMV4W6FiyR1Ih5cZ+k2leO3sBHkONjCCBKMwggOLoAMC
// SIG // AQICEH4f33KZ6NJFoV0LqOWxWbowDQYJKoZIhvcNAQEF
// SIG // BQAwXjELMAkGA1UEBhMCVVMxHTAbBgNVBAoTFFN5bWFu
// SIG // dGVjIENvcnBvcmF0aW9uMTAwLgYDVQQDEydTeW1hbnRl
// SIG // YyBUaW1lIFN0YW1waW5nIFNlcnZpY2VzIENBIC0gRzIw
// SIG // HhcNMTIxMDE4MDAwMDAwWhcNMjIwNTE5MjM1OTU5WjBi
// SIG // MQswCQYDVQQGEwJVUzEdMBsGA1UEChMUU3ltYW50ZWMg
// SIG // Q29ycG9yYXRpb24xNDAyBgNVBAMTK1N5bWFudGVjIFRp
// SIG // bWUgU3RhbXBpbmcgU2VydmljZXMgU2lnbmVyIC0gRzQw
// SIG // ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCi
// SIG // Yws5RLi7I6dESbsO/6HwYQpTk7CY260sD0rFbv+GPFNV
// SIG // DxXOBD8r/amWltm+YXkLW8lMhnbl4ENLIpXuwitDwZ/Y
// SIG // aLSOQE/uhTi5EcUj8mRY8BUyb05Xoa6IpALXKh7NS+Hd
// SIG // Y9UXiTJbsF6ZWqidKFAOF+6W22E7RVEdzxJWC5JH/Kuu
// SIG // 9mY9R6xwcueS51/NELnEg2SUGb0lgOHo0iKl0LoCeqF3
// SIG // k1tlw+4XdLxBhircCEyMkoyRLZ53RB9o1qh0d9sOWzKL
// SIG // VoszvdljyEmdOsXF6jML0vGjG/SLvtmzV4s73gSneiKy
// SIG // JK4ux3DFvk6DJgj7C72pT5kI4RAocqrNAgMBAAGjggFX
// SIG // MIIBUzAMBgNVHRMBAf8EAjAAMBYGA1UdJQEB/wQMMAoG
// SIG // CCsGAQUFBwMIMA4GA1UdDwEB/wQEAwIHgDBzBggrBgEF
// SIG // BQcBAQRnMGUwKgYIKwYBBQUHMAGGHmh0dHA6Ly90cy1v
// SIG // Y3NwLndzLnN5bWFudGVjLmNvbTA3BggrBgEFBQcwAoYr
// SIG // aHR0cDovL3RzLWFpYS53cy5zeW1hbnRlYy5jb20vdHNz
// SIG // LWNhLWcyLmNlcjA8BgNVHR8ENTAzMDGgL6AthitodHRw
// SIG // Oi8vdHMtY3JsLndzLnN5bWFudGVjLmNvbS90c3MtY2Et
// SIG // ZzIuY3JsMCgGA1UdEQQhMB+kHTAbMRkwFwYDVQQDExBU
// SIG // aW1lU3RhbXAtMjA0OC0yMB0GA1UdDgQWBBRGxmmjDkoU
// SIG // HtVM2lJjFz9eNrwN5jAfBgNVHSMEGDAWgBRfmvVuXMzM
// SIG // dJrU3X3vP9vsTIAu3TANBgkqhkiG9w0BAQUFAAOCAQEA
// SIG // YwAyjRcfKNwEecknGYS4NmindRkYsk9JrF1hK4Yy0A1N
// SIG // urV8XrbSN+jtW4gs0ilhvh9QKUoi+ReGvYchW9E8Tb9k
// SIG // wLoum6YQofHEhFOwjVjyjq8SGXcfrfe+voEtjoJ+cPg5
// SIG // ljNlWahPf4siyRh+XmTiuTBtBrS3EYxmuiwmRLmK3LGH
// SIG // kbXcvxSh3IOjYK8pXmaKKw3tndA5Bbm4bx65unHMaN6y
// SIG // eToD1ojhHSmzNOch2KMPK3IaQrWeRfrfpyud1/LNHchW
// SIG // Ei+NnU3OMskmYWTQmnjlLxJqSkQCJNhXhTJ/zVmMa3Mz
// SIG // AKVeq8PwIsDLCMPg97i4BBTsSu85+c/KJTCCBYUwggRt
// SIG // oAMCAQICECnBWz+qzVJqTme9PE5+P/IwDQYJKoZIhvcN
// SIG // AQEFBQAwgbQxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5W
// SIG // ZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24g
// SIG // VHJ1c3QgTmV0d29yazE7MDkGA1UECxMyVGVybXMgb2Yg
// SIG // dXNlIGF0IGh0dHBzOi8vd3d3LnZlcmlzaWduLmNvbS9y
// SIG // cGEgKGMpMTAxLjAsBgNVBAMTJVZlcmlTaWduIENsYXNz
// SIG // IDMgQ29kZSBTaWduaW5nIDIwMTAgQ0EwHhcNMTIwNzI1
// SIG // MDAwMDAwWhcNMTUwOTIwMjM1OTU5WjCByDELMAkGA1UE
// SIG // BhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExEzARBgNV
// SIG // BAcTClNhbiBSYWZhZWwxFjAUBgNVBAoUDUF1dG9kZXNr
// SIG // LCBJbmMxPjA8BgNVBAsTNURpZ2l0YWwgSUQgQ2xhc3Mg
// SIG // MyAtIE1pY3Jvc29mdCBTb2Z0d2FyZSBWYWxpZGF0aW9u
// SIG // IHYyMR8wHQYDVQQLFBZEZXNpZ24gU29sdXRpb25zIEdy
// SIG // b3VwMRYwFAYDVQQDFA1BdXRvZGVzaywgSW5jMIIBIjAN
// SIG // BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqGJg65nd
// SIG // BqvHs0rA5X4GiRRBaZTTzYVszNrhUGmAAf4IKUNdfjeA
// SIG // emqPk6qzSFgyKrdySoWlPPPZ8Zf+7XlhsLjrq7LSNmdG
// SIG // xA4V4l2pv24nCth1S8p7ZYkPurU/p5YHzfLYAdjczNAa
// SIG // RNWAp1Nm+g8EMOFewVfvxf//N8hhTqXj5bps18TcPRCl
// SIG // pGqvNbJZpk8X+1MWYD/Txmy8PICwD5OD0ySPe/uQQaoZ
// SIG // C29WKkn1p9zzTH7DSocP1cADdHUSnjOh/EpDnc/qLK/j
// SIG // ch/OpbCkLonLOH8CubhUh0B7CLemdLalr5op0anHlIvb
// SIG // oEZRq8ofV9Wagqny/4IHc2Gt2QIDAQABo4IBezCCAXcw
// SIG // CQYDVR0TBAIwADAOBgNVHQ8BAf8EBAMCB4AwQAYDVR0f
// SIG // BDkwNzA1oDOgMYYvaHR0cDovL2NzYzMtMjAxMC1jcmwu
// SIG // dmVyaXNpZ24uY29tL0NTQzMtMjAxMC5jcmwwRAYDVR0g
// SIG // BD0wOzA5BgtghkgBhvhFAQcXAzAqMCgGCCsGAQUFBwIB
// SIG // FhxodHRwczovL3d3dy52ZXJpc2lnbi5jb20vcnBhMBMG
// SIG // A1UdJQQMMAoGCCsGAQUFBwMDMHEGCCsGAQUFBwEBBGUw
// SIG // YzAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AudmVyaXNp
// SIG // Z24uY29tMDsGCCsGAQUFBzAChi9odHRwOi8vY3NjMy0y
// SIG // MDEwLWFpYS52ZXJpc2lnbi5jb20vQ1NDMy0yMDEwLmNl
// SIG // cjAfBgNVHSMEGDAWgBTPmanqeyb0S8mOj9fwBSbv49Kn
// SIG // nTARBglghkgBhvhCAQEEBAMCBBAwFgYKKwYBBAGCNwIB
// SIG // GwQIMAYBAQABAf8wDQYJKoZIhvcNAQEFBQADggEBANjp
// SIG // Br7omO08iOslU0AGJkzvjKThRgvDH5R0m6HyYri8a0tS
// SIG // l25M7ADxTz7FNaLn7RYbFxbQ0PKzE6v48LoE6WyVERFd
// SIG // G7hJC5fACkYWEEygSoNSP6bgb25CaHAxNKUcLQc98UpV
// SIG // 1xMMmD3Gwjp6zNzmeWysdUIoor4sZXBloTt8LPdOLLLr
// SIG // TxX+JleTw4t1NmKdR4GwSv1JvxS6+mAGHmWgPCmNQn0B
// SIG // IrBd1Ck8Ju9ne0vnyX/vkjhnmitJLpnoVXG2r0CUzlXm
// SIG // 7mfVfqlNJ5NZTK6r3vQZ0CuvQUKjWbu+7wjtMJvNXH8p
// SIG // wMZDmCmRt4nWOO6jyToFypMJiNvvdqMwggYKMIIE8qAD
// SIG // AgECAhBSAOWqJVb8GobtlsnUSzPHMA0GCSqGSIb3DQEB
// SIG // BQUAMIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVy
// SIG // aVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
// SIG // dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA2IFZl
// SIG // cmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
// SIG // IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMg
// SIG // UHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRo
// SIG // b3JpdHkgLSBHNTAeFw0xMDAyMDgwMDAwMDBaFw0yMDAy
// SIG // MDcyMzU5NTlaMIG0MQswCQYDVQQGEwJVUzEXMBUGA1UE
// SIG // ChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT
// SIG // aWduIFRydXN0IE5ldHdvcmsxOzA5BgNVBAsTMlRlcm1z
// SIG // IG9mIHVzZSBhdCBodHRwczovL3d3dy52ZXJpc2lnbi5j
// SIG // b20vcnBhIChjKTEwMS4wLAYDVQQDEyVWZXJpU2lnbiBD
// SIG // bGFzcyAzIENvZGUgU2lnbmluZyAyMDEwIENBMIIBIjAN
// SIG // BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA9SNLXqXX
// SIG // irsy6dRX9+/kxyZ+rRmY/qidfZT2NmsQ13WBMH8EaH/L
// SIG // K3UezR0IjN9plKc3o5x7gOCZ4e43TV/OOxTuhtTQ9Sc1
// SIG // vCULOKeMY50Xowilq7D7zWpigkzVIdob2fHjhDuKKk+F
// SIG // W5ABT8mndhB/JwN8vq5+fcHd+QW8G0icaefApDw8QQA+
// SIG // 35blxeSUcdZVAccAJkpAPLWhJqkMp22AjpAle8+/Pxzr
// SIG // L5b65Yd3xrVWsno7VDBTG99iNP8e0fRakyiF5UwXTn5b
// SIG // /aSTmX/fze+kde/vFfZH5/gZctguNBqmtKdMfr27Tww9
// SIG // V/Ew1qY2jtaAdtcZLqXNfjQtiQIDAQABo4IB/jCCAfow
// SIG // EgYDVR0TAQH/BAgwBgEB/wIBADBwBgNVHSAEaTBnMGUG
// SIG // C2CGSAGG+EUBBxcDMFYwKAYIKwYBBQUHAgEWHGh0dHBz
// SIG // Oi8vd3d3LnZlcmlzaWduLmNvbS9jcHMwKgYIKwYBBQUH
// SIG // AgIwHhocaHR0cHM6Ly93d3cudmVyaXNpZ24uY29tL3Jw
// SIG // YTAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBf
// SIG // oV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAHBgUrDgMC
// SIG // GgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDov
// SIG // L2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwNAYD
// SIG // VR0fBC0wKzApoCegJYYjaHR0cDovL2NybC52ZXJpc2ln
// SIG // bi5jb20vcGNhMy1nNS5jcmwwNAYIKwYBBQUHAQEEKDAm
// SIG // MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC52ZXJpc2ln
// SIG // bi5jb20wHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUF
// SIG // BwMDMCgGA1UdEQQhMB+kHTAbMRkwFwYDVQQDExBWZXJp
// SIG // U2lnbk1QS0ktMi04MB0GA1UdDgQWBBTPmanqeyb0S8mO
// SIG // j9fwBSbv49KnnTAfBgNVHSMEGDAWgBR/02Wnwt3su/Aw
// SIG // CfNDOfoCrzMxMzANBgkqhkiG9w0BAQUFAAOCAQEAViLm
// SIG // NKTEYctIuQGtVqhkD9mMkcS7zAzlrXqgIn/fRzhKLWzR
// SIG // f3EafOxwqbHwT+QPDFP6FV7+dJhJJIWBJhyRFEewTGOM
// SIG // u6E01MZF6A2FJnMD0KmMZG3ccZLmRQVgFVlROfxYFGv+
// SIG // 1KTteWsIDEFy5zciBgm+I+k/RJoe6WGdzLGQXPw90o2s
// SIG // Qj1lNtS0PUAoj5sQzyMmzEsgy5AfXYxMNMo82OU31m+l
// SIG // IL006ybZrg3nxZr3obQhkTNvhuhYuyV8dA5Y/nUbYz/O
// SIG // MXybjxuWnsVTdoRbnK2R+qztk7pdyCFTwoJTY68SDVCH
// SIG // ERs9VFKWiiycPZIaCJoFLseTpUiR0zGCBHIwggRuAgEB
// SIG // MIHJMIG0MQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVy
// SIG // aVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
// SIG // dXN0IE5ldHdvcmsxOzA5BgNVBAsTMlRlcm1zIG9mIHVz
// SIG // ZSBhdCBodHRwczovL3d3dy52ZXJpc2lnbi5jb20vcnBh
// SIG // IChjKTEwMS4wLAYDVQQDEyVWZXJpU2lnbiBDbGFzcyAz
// SIG // IENvZGUgU2lnbmluZyAyMDEwIENBAhApwVs/qs1Sak5n
// SIG // vTxOfj/yMAkGBSsOAwIaBQCgcDAQBgorBgEEAYI3AgEM
// SIG // MQIwADAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAc
// SIG // BgorBgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAjBgkq
// SIG // hkiG9w0BCQQxFgQU1XBIlVQJ0tKmA8LqU82mDTnGVkkw
// SIG // DQYJKoZIhvcNAQEBBQAEggEAolgVYuxWh9Zqs7eEcuPN
// SIG // WBR4OogcAETj0ujQPKMbn5Fsv09Bfv/G9+07eflXsd7Z
// SIG // WygqNK8+1wS9qQfgQn1phlGsWrR+T4xV22lCB5TZoDjl
// SIG // aBvW8m9L9seS4x0lWm6cd1DMuP5RD/dxlSKru72pNTiu
// SIG // yCOTDODhsUCm9Qp6mBe1lnDBuPUC9SC1991148M8vKNG
// SIG // o/R/SyBFQuORyyU1gd0uxx+EP/ZMDCjSW0l3NSGkRG49
// SIG // ZbZdDSa4XSeklrGp/3mLzBk1w9g1t9ij6Ctptr44bFyw
// SIG // VdKCaOjQp4yM4dmvJ/Dzu1FupzB+AOQ3nb9N0zUnSzhO
// SIG // MA+L6122/NJ+y6GCAgswggIHBgkqhkiG9w0BCQYxggH4
// SIG // MIIB9AIBATByMF4xCzAJBgNVBAYTAlVTMR0wGwYDVQQK
// SIG // ExRTeW1hbnRlYyBDb3Jwb3JhdGlvbjEwMC4GA1UEAxMn
// SIG // U3ltYW50ZWMgVGltZSBTdGFtcGluZyBTZXJ2aWNlcyBD
// SIG // QSAtIEcyAhB+H99ymejSRaFdC6jlsVm6MAkGBSsOAwIa
// SIG // BQCgXTAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcBMBwG
// SIG // CSqGSIb3DQEJBTEPFw0xMjEyMTMxODMyMjRaMCMGCSqG
// SIG // SIb3DQEJBDEWBBSS8sZCSMaCaNt/6HZyxFMk7BxfwzAN
// SIG // BgkqhkiG9w0BAQEFAASCAQBSGPt7mlPg5Hee8CQEpMGe
// SIG // SArWv38jypZyPuNwmz1qKP2OePONzRcCk77G8lY0Dkds
// SIG // /842hs/e0ed3BQltUp43gaYvC7Gr5T0Xy2LAxfWKxwGp
// SIG // Wkc85T4S8/skE8FEOXsD+G6+Zf8Gy91t1OfJhCpyV73x
// SIG // t3hB3yRyGX0un46a2T2v2WKfTas0JxO67f77iqzRH5jL
// SIG // +QSo2RgYUBDwQEAs0nhB10NVr7RnNfQJ6BQsF12GBEdf
// SIG // GnyqptmazReGevEF5tGZlHY8aeNecQiZuJd2JyPjDzBt
// SIG // 33/z3XfA5xbYbEuGeNaWMJts4zjgQDr3xu1VmGXXbCzw
// SIG // B7CQp8uesHSf
// SIG // End signature block
