var __extends = (this && this.__extends) || (function () {
    var extendStatics = Object.setPrototypeOf ||
        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
var Joove;
(function (Joove) {
    var Widgets;
    (function (Widgets) {
        var ValidationUiProvider = /** @class */ (function (_super) {
            __extends(ValidationUiProvider, _super);
            function ValidationUiProvider() {
                return _super !== null && _super.apply(this, arguments) || this;
            }
            return ValidationUiProvider;
        }(Joove.BaseAngularProvider));
        var ValidationPanelAngular = /** @class */ (function () {
            function ValidationPanelAngular() {
            }
            ValidationPanelAngular.prototype.init = function (rootElementSelector) {
                var _this = this;
                var $rootElement = $(rootElementSelector);
                if ($rootElement.length === 0) {
                    setTimeout(function () {
                        _this.init(rootElementSelector);
                    }, 500);
                    return;
                }
                var $html = $("<div class=\"dv-panel-root\" jb-validation-ui></div>");
                $rootElement.append($html);
                angular.element($rootElement)
                    .injector()
                    .invoke([
                    "$compile", "$rootScope", function ($compile) {
                        $compile($html)(window.$form);
                    }
                ]);
            };
            return ValidationPanelAngular;
        }());
        Widgets.ValidationPanelAngular = ValidationPanelAngular;
        function jbValidationUi($timeout, $interval, $compile, joovegrid) {
            var defaultOptions = joovegrid.getOptions();
            return {
                priority: 1001,
                templateUrl: window._context.siteRoot + 'Scripts/Controls/ValidationPanel/clms.validation.ui.html',
                restrict: "AE",
                scope: true,
                link: function ($scope, $attrs) {
                    Joove.Validation.UiHelper.panelScope = $scope;
                    $scope.headingPlural = window._resourcesManager.getGlobalResource("RES_WEBFORM_VALIDATIONS_RequireYourAttention");
                    $scope.headingSingular = window._resourcesManager.getGlobalResource("RES_WEBFORM_VALIDATIONS_RequireYourAttentionSingular");
                    $scope.show = function () {
                        $scope._showDvPanel = true;
                        Joove.Core.applyScope($scope);
                    };
                    $scope.hide = function () {
                        $scope._dvSummaryVisible = false;
                        $scope._showDvPanel = false;
                    };
                    $scope.navigateToControl = function (entry, e) {
                        e.stopPropagation();
                        Joove.Validation.UiHelper.navigateToRelatedControl(entry);
                    };
                }
            };
        }
        angular
            .module("jbValidationUi", [])
            .provider("jbValidationUi", new ValidationUiProvider())
            .directive("jbValidationUi", [
            "$timeout",
            "$interval",
            "$compile",
            "jbValidationUi",
            jbValidationUi
        ]);
    })(Widgets = Joove.Widgets || (Joove.Widgets = {}));
})(Joove || (Joove = {}));
;
var __extends = (this && this.__extends) || (function () {
    var extendStatics = Object.setPrototypeOf ||
        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
var Joove;
(function (Joove) {
    var Widgets;
    (function (Widgets) {
        var DatasourceWidget = /** @class */ (function () {
            function DatasourceWidget(options) {
                this._columns = options.columns;
                this._controlName = options.controlName || "";
                this._forceDraw = options.forceDraw !== false;
                this._container = options.container;
                if (!this._container) {
                    this._forceDraw = false;
                }
                if ((this._columns == undefined || this._columns == null || this._columns.length === 0) &&
                    (this._controlName == undefined || this._controlName == null || this._controlName == "")) {
                    console.log("Datasource Widget (WARNING): no columns or controlname are defined");
                }
            }
            DatasourceWidget.prototype.findColumnInfoByName = function (name) {
                for (var i = 0; i < this._columns.length; i++) {
                    if (this._columns[i].name === name) {
                        this._columns[i].mambaDataType = this._columns[i].dataType;
                        return this._columns[i];
                    }
                }
                return null;
            };
            DatasourceWidget.prototype.flashElement = function ($element) {
                var initalBGcolor = $element.css("background-color");
                $element.animate({
                    opacity: 0.5,
                    "background-color": "#99ccff"
                }, 750, function () {
                    $element.animate({
                        opacity: 1,
                        "background-color": initalBGcolor
                    }, 750, function () {
                        if (initalBGcolor !== "rgba(0, 0, 0, 0)")
                            return;
                        $element.css("background-color", "");
                    });
                });
            };
            DatasourceWidget.prototype.retrieveColumnInfo = function (cb) {
                var _this = this;
                if (this._columns == null || this._columns.length === 0) {
                    Joove.Core.executeControllerAction(Joove.Core.getControllerForElement(this._container), this._controlName + "_ColumnInfo", "GET", null, null, null, function (data) {
                        for (var i = 0; i < data.length; i++) {
                            var current = data[i];
                            _this._columns.push(new Joove.ColumnInfo(current.Name, current.MambaDataType, current.Formatting));
                        }
                        cb && cb();
                    });
                }
                else {
                    cb && cb();
                }
            };
            DatasourceWidget.prototype.clear = function () {
                this.redraw([]);
            };
            return DatasourceWidget;
        }());
        Widgets.DatasourceWidget = DatasourceWidget;
        var FilterDatasourceWidget = /** @class */ (function (_super) {
            __extends(FilterDatasourceWidget, _super);
            function FilterDatasourceWidget(options) {
                var _this = _super.call(this, options) || this;
                _this._resources = options.resources || window._resourcesManager.resources;
                _this._filters = options.filters || [];
                _this._rowOperators = [
                    { value: Joove.RowOperators.NONE, text: "" },
                    { value: Joove.RowOperators.OR, text: _this._resources.Or },
                    { value: Joove.RowOperators.AND, text: _this._resources.And }
                ];
                _this._operators = [
                    { value: Joove.FilterOperators.NONE, text: "" },
                    { value: Joove.FilterOperators.RANGE, text: _this._resources.Range },
                    { value: Joove.FilterOperators.LIKE, text: _this._resources.Like },
                    { value: Joove.FilterOperators.EQUAL_TO, text: _this._resources.EqualTo },
                    { value: Joove.FilterOperators.NOT_EQUAL_TO, text: _this._resources.NotEqualTo },
                    { value: Joove.FilterOperators.GREATER_THAN, text: _this._resources.GreaterThan },
                    { value: Joove.FilterOperators.GREATER_THAN_OR_EQUAL_TO, text: _this._resources.GreaterThanOrEqualTo },
                    { value: Joove.FilterOperators.LESS_THAN, text: _this._resources.LessThan },
                    { value: Joove.FilterOperators.LESS_THAN_OR_EQUAL_TO, text: _this._resources.LessThanOrEqualTo },
                    { value: Joove.FilterOperators.HAS_VALUE, text: _this._resources.HasValue },
                    { value: Joove.FilterOperators.HAS_NO_VALUE, text: _this._resources.HasNoValue }
                ];
                if (_this._forceDraw)
                    _this.draw(options.container);
                return _this;
            }
            FilterDatasourceWidget.prototype.getColumns = function () {
                return this._columns;
            };
            FilterDatasourceWidget.prototype.draw = function ($target) {
                var _this = this;
                if (this._container == null)
                    this._container = $target;
                this.retrieveColumnInfo(function () {
                    var $content = $(_this.drawPreferences());
                    _this.populate($content);
                    $target.append($content);
                });
            };
            FilterDatasourceWidget.prototype.redraw = function (terms, options) {
                this._container.empty();
                this._filters = terms;
                if (options) {
                    this._columns = options.columns || this._columns;
                }
                this.draw(this._container);
            };
            FilterDatasourceWidget.prototype.getDataSourceTerms = function (options) {
                var $filterRows = this._container.find(".filter-row");
                var filters = [];
                var foundError = false;
                for (var i = 0; i < $filterRows.length; i++) {
                    var $row = $filterRows.eq(i);
                    var column = $row.find(".available-columns").val();
                    var operator = $row.find(".available-operators").val();
                    var rowOperator = $row.find(".available-row-operators").val();
                    var columnInfo = this.findColumnInfoByName(column);
                    var dataType = columnInfo.dataType;
                    var $filterInput = $row.find(".filter-value");
                    var value = $filterInput.val();
                    var additionalValue = $row.find(".additional-filter-value").val();
                    var format = columnInfo.formatting;
                    // force number format
                    if (Joove.DatasourceManager.isMambaDataTypeNumber(dataType))
                        value = Joove.Common.forceNumberFormat(value);
                    // Quick Validation
                    if (operator === String(Joove.FilterOperators.NONE) || // Operator not set
                        ((value == null || typeof (value) == "undefined" || value.trim().length === "") &&
                            // Null or Undefined Value
                            operator !== Joove.FilterOperators.HAS_VALUE &&
                            operator !== Joove.FilterOperators.HAS_NO_VALUE) || // Empty Value
                        (rowOperator === Joove.RowOperators.NONE && i < $filterRows.length - 1)) {
                        // Row Operator not set (allowed only for last filter)
                        foundError = true;
                        $row.addClass("danger");
                        continue;
                    }
                    else if (operator === Joove.FilterOperators.RANGE) {
                        if (value.trim().length === "" || // Empty Value
                            additionalValue.trim().length === "" || // Empty Additional Value
                            (rowOperator === Joove.RowOperators.NONE && i < $filterRows.length - 1)) {
                            // Row Operator not set (allowed only for last filter)) {
                            foundError = true;
                            $row.addClass("danger");
                            continue;
                        }
                    }
                    $row.removeClass("danger");
                    if (dataType === "DateTime") {
                        value = Joove.Common.getUtcDateFromRawString(value, Widgets.DatePicker.getFormatOfDate(format, true));
                        if (operator === Joove.FilterOperators.RANGE) {
                            additionalValue = Joove.Common
                                .getUtcDateFromRawString(additionalValue, Widgets.DatePicker.getFormatOfDate(format, true));
                        }
                    }
                    //Operator Equals / NotEquals handle
                    if (operator === Joove.FilterOperators.HAS_VALUE || operator === Joove.FilterOperators.HAS_NO_VALUE)
                        value = "";
                    filters.push(new Joove.FilterInfo(this.findColumnInfoByName(column), value, rowOperator, operator, additionalValue));
                }
                if (foundError) {
                    alert("Please fill in all required filter fields.");
                    return null;
                }
                this._filters = filters;
                return this._filters;
            };
            FilterDatasourceWidget.prototype.drawFilters = function ($contents) {
                for (var i = 0; i < this._filters.length; i++) {
                    var currentFilter = this._filters[i];
                    var currentColumn = currentFilter.column;
                    var $line = this.createFilterRow($contents);
                    $line.find(".available-columns").val(currentFilter.column.name);
                    $line.find(".available-operators").val(String(currentFilter.operator));
                    $line.find(".filter-value-container")
                        .children()
                        .toggle(currentFilter.operator !== Joove.FilterOperators.HAS_VALUE &&
                        currentFilter.operator !== Joove.FilterOperators.HAS_NO_VALUE);
                    this.handleFilterRow($line, currentColumn.mambaDataType, currentFilter.operator, currentFilter.value);
                    // Last Filter's Row Operator must be NONE
                    if (i < this._filters.length - 1) {
                        $line.find(".available-row-operators").val(String(currentFilter.rowOperator));
                    }
                    $contents.find(".filters-table-body").append($line);
                }
            };
            FilterDatasourceWidget.prototype.populate = function ($contents) {
                var self = this;
                if (this._filters.length === 0) {
                    $contents.find(".filters-table").hide();
                    $contents.closest(".empty-filter-list").show();
                }
                else {
                    $contents.find(".filters-table").show();
                    $contents.closest(".empty-filter-list").hide();
                }
                this.drawFilters($contents);
                $contents.find(".add-filter-btn")
                    .on("click", function (e) {
                    $(e.target).parent().hide();
                    $contents.find(".filters-table").show();
                    var $filterRow = self.createFilterRow($contents);
                    $contents.find(".filters-table-body").append($filterRow);
                    self.handleFilterRow($filterRow);
                });
            };
            FilterDatasourceWidget.prototype.createFilterRow = function ($container) {
                var self = this;
                var $lineTemplate = $("<tr class='filter-row'> \
                                        <td><select class='available-columns form-control'></select></td> \
                                        <td><select class='available-operators form-control'></select></td> \
                                        <td class='filter-value-container'></td> \
                                        <td><select class='available-row-operators form-control'></select></td> \
                                        <td><span class='remove-filter glyphicon glyphicon-remove'></span></td> \
                                    </tr>");
                for (var i = 0; i < this._rowOperators.length; i++) {
                    var option = $("<option value='" + this._rowOperators[i]
                        .value + "'>" + this._rowOperators[i].text + "</option>");
                    $lineTemplate.find(".available-row-operators").append(option);
                }
                for (var i = 0; i < this._operators.length; i++) {
                    var option = $("<option value='" + this._operators[i].value + "'>" + this._operators[i].text + "</option>");
                    $lineTemplate.find(".available-operators").append(option);
                }
                for (var i = 0; i < this._columns.length; i++) {
                    if (this._columns[i].searchable === false)
                        continue;
                    var option = $("<option value='" + this._columns[i]
                        .name + "'>" + this._columns[i].caption + "</option>");
                    $lineTemplate.find(".available-columns").append(option);
                }
                $lineTemplate.find(".remove-filter")
                    .on("click", function (e) {
                    $(e.target).closest("tr").remove();
                    if ($container.find(".filter-row").length > 0)
                        return;
                    $container.find(".filters-table").hide();
                    $container.closest(".empty-filter-list").show();
                });
                $lineTemplate.find(".available-row-operators")
                    .on("change", function (e) {
                    var $parentRow = $(e.target).closest("tr");
                    if (!$parentRow.is(":last-child"))
                        return;
                    if ($(e.target).val() === Joove.RowOperators.NONE)
                        return;
                    var $filterRow = self.createFilterRow($container);
                    $parentRow.after($filterRow);
                    self.handleFilterRow($filterRow);
                });
                $lineTemplate.find(".available-columns, .available-operators")
                    .on("change", function (e) {
                    var $parentRow = $(e.target).closest("tr");
                    self.handleFilterRow($parentRow);
                });
                return $lineTemplate;
            };
            FilterDatasourceWidget.prototype.drawPreferences = function () {
                return "<div class='list-filters-container'>             <table class='filters-table table table-hover'>                 <thead>                    <th>" + this._resources.Column + "</th>                    <th>" + this._resources.Operator + "</th>                    <th>" + this._resources.Criteria + "</th>                    <th>" + this._resources.RowOperator + "</th>                    <th></th>                </thead>                <tbody class='filters-table-body'>                 </tbody>             </table>         </div>         <div class='empty-filter-list'>            <!-- <span>" + this._resources.NoFiltersDefined + "</span>            <br/><br/> -->            <button type='button' class='btn btn-default add-filter-btn'>" + this._resources.AddFilter + "</button>         </div>";
            };
            FilterDatasourceWidget.prototype.handleFilterRow = function ($container, dataType, operator, value) {
                if ($container == null)
                    return;
                var $filterValue = $container.find(".filter-value-container");
                var currentTemplate = $filterValue.attr("template");
                var $availableOperators = $container.find(".available-operators");
                var columnInfo = this.findColumnInfoByName($container.find(".available-columns").val());
                if (columnInfo == null) {
                    console.error("Could not find column info for:", $container.get(0));
                    return;
                }
                dataType = dataType || columnInfo.mambaDataType;
                operator = operator || $container.find(".available-operators").val();
                value = value || $filterValue.find(".filter-value").val();
                //Allow allow filters depending on their datatype
                $availableOperators.find("option[value='" + Joove.FilterOperators.RANGE + "']")
                    .toggle(dataType === "DateTime");
                $availableOperators.find("option[value='" + Joove.FilterOperators
                    .GREATER_THAN + "'], [value='" + Joove.FilterOperators
                    .GREATER_THAN_OR_EQUAL_TO + "'], [value='" + Joove.FilterOperators.LESS_THAN + "'], [value='" + Joove.FilterOperators.LESS_THAN_OR_EQUAL_TO + "']")
                    .toggle(Joove.DatasourceManager.isMambaDataTypeNumber(dataType) || dataType === "DateTime");
                //Remove invalid selected operators
                var nonNumericInvalidOperators = [
                    Joove.FilterOperators.GREATER_THAN, Joove.FilterOperators.GREATER_THAN_OR_EQUAL_TO,
                    Joove.FilterOperators.LESS_THAN, Joove.FilterOperators.LESS_THAN_OR_EQUAL_TO
                ];
                if ((dataType !== "DateTime" && $availableOperators.val() === Joove.FilterOperators.RANGE) || //Datetime
                    (!Joove.DatasourceManager.isMambaDataTypeNumber(dataType) &&
                        dataType !== "DateTime" &&
                        $.inArray($availableOperators.val(), nonNumericInvalidOperators) > 0)) { //Non-numeric
                    $availableOperators.val("");
                }
                //Hide input controls on has/not value
                if (operator !== Joove.FilterOperators.HAS_VALUE && operator !== Joove.FilterOperators.HAS_NO_VALUE) {
                    $filterValue.children().show();
                }
                else {
                    $filterValue.children().hide();
                    return;
                }
                var $dateRangeTemplate = "<div class='input-group'> \
                                    <span class='input-group-addon'>From:</span> \
                                    <input class='filter-value form-control' type='text'> \
                                </div>  \
                                <div class='input-group'> \
                                    <span class='input-group-addon'>To:</span> \
                                    <input class='additional-filter-value form-control' type='text'> \
                                </div>";
                var $defaultTemplate = "<input class='filter-value form-control' type='text'>";
                var $boolTemplate = "<input type='radio' name='bool-val-" + columnInfo.name + "-" + ($container.siblings().length + 1) + "' value='true'>                                 <span>True</span>                                 <br />                                 <input type='radio' name='bool-val-" + columnInfo.name + "-" + ($container.siblings().length + 1) + "' value='false'>                                 <span>False</span>                                 <input type='hidden' class='filter-value' />";
                switch (dataType) {
                    case "bool":
                        if (currentTemplate === "bool")
                            return;
                        $filterValue.children().remove();
                        $filterValue.append($boolTemplate);
                        $filterValue.attr("template", "bool");
                        $filterValue.find("input[type='radio']")
                            .on("click", function (event) {
                            $(event.target).siblings(".filter-value").val($(event.target).val());
                        });
                        if (value) {
                            $filterValue.find("input[type='radio'][value='" + value + "']").attr("checked", "checked");
                            $filterValue.find(".filter-value").val(value);
                        }
                        break;
                    case "DateTime":
                        if (operator === Joove.FilterOperators.RANGE) {
                            if (currentTemplate === "dateRange")
                                return;
                            $filterValue.children().remove();
                            $filterValue.append($dateRangeTemplate);
                            $filterValue.attr("template", "dateRange");
                            Widgets.DatePicker.convertElementToDatePicker($filterValue.find(".filter-value, .additional-filter-value"), columnInfo.formatting);
                            $filterValue.find(".filter-value")
                                .on("change", function (event) {
                                if ($filterValue.find(".additional-filter-value").val().length === 0) {
                                    $filterValue.find(".additional-filter-value").val($(event.target).val());
                                }
                            });
                            if (value) {
                                try {
                                    var multipleValues = value.split("|");
                                    $filterValue.find(".filter-value").val(multipleValues[0]);
                                    $filterValue.find(".additional-filter-value").val(multipleValues[1]);
                                }
                                catch (e) {
                                    console.log("Error setting date ranges");
                                }
                            }
                        }
                        else {
                            if (currentTemplate === "simpleDate")
                                return;
                            $filterValue.children().remove();
                            $filterValue.append($defaultTemplate);
                            $filterValue.attr("template", "simpleDate");
                            Widgets.DatePicker.convertElementToDatePicker($filterValue.find(".filter-value"), columnInfo.formatting);
                            if (value)
                                $filterValue.find(".filter-value").val(value);
                        }
                        break;
                    default:
                        if (currentTemplate === "default")
                            return;
                        $filterValue.children().remove();
                        $filterValue.append($defaultTemplate);
                        $filterValue.attr("template", "default");
                        if (value)
                            $filterValue.find(".filter-value").val(value);
                        break;
                }
            };
            return FilterDatasourceWidget;
        }(DatasourceWidget));
        Widgets.FilterDatasourceWidget = FilterDatasourceWidget;
        var QuickFilterDatasourceWidget = /** @class */ (function (_super) {
            __extends(QuickFilterDatasourceWidget, _super);
            function QuickFilterDatasourceWidget() {
                return _super !== null && _super.apply(this, arguments) || this;
            }
            QuickFilterDatasourceWidget.prototype.draw = function ($target) {
                var _this = this;
                if (this._container == null)
                    this._container = $target;
                this.retrieveColumnInfo(function () {
                    var $content = $(_this.drawQuickFilterLayout());
                    _this.populateQuickFilters($content);
                    $target.append($content);
                });
            };
            QuickFilterDatasourceWidget.prototype.getDataSourceTerms = function (options) {
                var $target = $(".filter-row", this._container);
                var filters = [];
                for (var i = 0; i < $target.length; i++) {
                    var $row = $($target[i]);
                    var columnFilter = $row.find(".filter-value").val();
                    if (columnFilter.length === 0)
                        continue;
                    var column = this.findColumnInfoByName($row.find(".column-name").data("column-name"));
                    var filter = new Joove.FilterInfo(column, columnFilter, Joove.RowOperators.AND, Joove.FilterOperators.LIKE, "");
                    filters.push(filter);
                }
                if (filters.length === 1) {
                    filters[0].rowOperator = Joove.RowOperators.NONE;
                }
                return filters;
            };
            QuickFilterDatasourceWidget.prototype.getColumns = function () {
                return this._columns;
            };
            QuickFilterDatasourceWidget.prototype.redraw = function (terms) {
                this._container.empty();
                this._filters = terms;
                this.draw(this._container);
            };
            QuickFilterDatasourceWidget.prototype.drawQuickFilterLayout = function () {
                return "<div class='list-filters-container'>                         <br />                         <table class='filters-table table table-hover'>                             <tbody class=\"filters-table-body\">                             </tbody>                         </table>                     </div>";
            };
            QuickFilterDatasourceWidget.prototype.populateQuickFilters = function ($content) {
                var $target = $(".filters-table-body", $content);
                for (var i = 0; i < this._columns.length; i++) {
                    var col = this._columns[i];
                    var row = "<tr class=\"filter-row\">\n                                <th style=\"vertical-align: middle;\" class=\"col-xs-2 column-name\" data-column-name=\"" + col.name + "\">" + col.name + "</th>\n                                <td class=\"col-xs-10\"><input class=\"filter-value\" style=\"width: 100%;\"/></td>\n                            </tr>";
                    $target.append(row);
                }
            };
            return QuickFilterDatasourceWidget;
        }(FilterDatasourceWidget));
        Widgets.QuickFilterDatasourceWidget = QuickFilterDatasourceWidget;
        var GroupDatasourceWidget = /** @class */ (function (_super) {
            __extends(GroupDatasourceWidget, _super);
            function GroupDatasourceWidget(options) {
                var _this = _super.call(this, options) || this;
                _this._resources = options.resources || window._resourcesManager.resources;
                _this._groupBy = options.groupBy;
                _this._getGroupsClosed = options.groupsClosed;
                if (_this._forceDraw)
                    _this.draw(options.container);
                return _this;
            }
            GroupDatasourceWidget.prototype.getColumns = function () {
                return this._columns;
            };
            GroupDatasourceWidget.prototype.draw = function ($target) {
                var _this = this;
                if (this._container == null)
                    this._container = $target;
                this.retrieveColumnInfo(function () {
                    var $content = $(_this.getGroupingPreferencesMarkUp());
                    _this.populateGroupPreferencesContainer($content);
                    $target.append($content);
                });
            };
            GroupDatasourceWidget.prototype.redraw = function (terms, options) {
                this._container.empty();
                if (options) {
                    this._columns = options.columns || this._columns;
                }
                this._groupBy = terms;
                this.draw(this._container);
            };
            GroupDatasourceWidget.prototype.getDataSourceTerms = function (options) {
                if (options === void 0) { options = {}; }
                var $grouped = this._container.find(".grouping-columns");
                var $groups = $grouped.children();
                var groupsArray = [];
                options.getGroupsClosed = options.getGroupsClosed ||
                    this._container.find(".get-groups-closed").is(":checked");
                for (var i = 0; i < $groups.length; i++) {
                    groupsArray.push(this.findColumnInfoByName($groups.eq(i).val()));
                }
                var groupBy = [];
                for (var i = 0; i < groupsArray.length; i++) {
                    var state = options.getGroupsClosed === true && i === groupsArray.length - 1
                        ? "COLLAPSED"
                        : "EXPANDED";
                    //groupBy.push(new Widgets.ListGroupByInfo(groupsArray[i], state, options.getGroupsClosed));
                }
                return groupBy;
            };
            GroupDatasourceWidget.prototype.getGroupingPreferencesMarkUp = function () {
                return "<div class='list-groups-container collapsible-grid-main-container'>             <table class='groups-table table'>                 <thead>                    <th>" + this._resources.Column + "</th>                    <th></th>                    <th>" + this._resources.GroupingOrder + "</th>                    <th></th>                </thead>                <tbody class='filters-table-body'>                     <tr>                         <td>                             <select class='available-columns' multiple='multiple'>                             </select>                         </td>                         <td>                             <button type='button' class='btn btn-default add-group'><span class='glyphicon glyphicon-arrow-right'></span></button>                            <br/>                             <button type='button' class='btn btn-default remove-group'><span class='glyphicon glyphicon-arrow-left'></span></button>                        </td>                         <td>                             <select class='grouping-columns' multiple='multiple'>                             </select>                         </td>                         <td>                             <button class='btn btn-default move-up'><span class='glyphicon glyphicon-arrow-up'></span></button>                            <br/>                             <button class='btn btn-default move-down'><span class='glyphicon glyphicon-arrow-down'></span></button>                        </td>                 </tbody>                 <tfoot>                    <tr>                        <td colspan='4' style='text-align: left; padding-left: 15px'>                            <span>" + this._resources.GetGroupsClosed + "</span>                             <input type='checkbox' style='display: inline-block; position: relative; top: 3px; left: 10px' class='get-groups-closed'/>                        </td>                    </tr>                </tfoot>            </table>         </div>";
            };
            GroupDatasourceWidget.prototype.populateGroupPreferencesContainer = function ($container) {
                var $available = $container.find(".available-columns");
                var $grouped = $container.find(".grouping-columns");
                $container.find(".get-groups-closed").prop("checked", this._getGroupsClosed);
                for (var i = 0; i < this._columns.length; i++) {
                    var columnName = this._columns[i].name;
                    if (this._columns[i].groupable === false)
                        continue;
                    var option = "<option value='" + columnName + "'>" + this._columns[i].caption + "</option>";
                    $available.append(option);
                }
                for (var i = 0; i < this._groupBy.length; i++) {
                    var column = this._groupBy[i].column;
                    $container.find(".get-groups-closed").prop('checked', this._groupBy[i].getGroupsClosed);
                    var option = "<option value='" + column.name + "'>" + column.caption + "</option>";
                    $grouped.append(option);
                    $available.find("option[value='" + column.name + "']").hide();
                }
                $container.find(".add-group")
                    .on("click", function () {
                    var $selected = $available.find(":selected");
                    for (var i = 0; i < $selected.length; i++) {
                        if ($grouped.find("option[value='" + $selected.eq(i).val() + "']").length === 0) {
                            $grouped.append($selected.eq(i).clone());
                            $selected.eq(i).hide();
                        }
                    }
                    if ($available.children(":visible").length > 0) {
                        $available.val($available.children(":visible:first").val()).focus();
                    }
                });
                $container.find(".remove-group")
                    .on("click", function () {
                    var $selected = $grouped.find(":selected");
                    for (var i = $selected.length - 1; i >= 0; i--) {
                        $available.find("option[value='" + $selected.eq(i).val() + "']").show();
                    }
                    $selected.remove();
                    if ($grouped.children(":visible").length > 0) {
                        $grouped.val($grouped.children(":visible:first").val()).focus();
                    }
                });
                $container.find(".move-up")
                    .on("click", function () {
                    var $selected = $grouped.find(":selected");
                    $selected.eq(0).prev().before($selected);
                });
                $container.find(".move-down")
                    .on("click", function () {
                    var $selected = $grouped.find(":selected");
                    $selected.eq($selected.length - 1).next().after($selected);
                });
                $available.on("dblclick", function () {
                    $container.find(".add-group").click();
                });
                $grouped.on("dblclick", function () {
                    $container.find(".remove-group").click();
                });
            };
            return GroupDatasourceWidget;
        }(DatasourceWidget));
        Widgets.GroupDatasourceWidget = GroupDatasourceWidget;
        var OrderDatasourceWidget = /** @class */ (function (_super) {
            __extends(OrderDatasourceWidget, _super);
            function OrderDatasourceWidget(options) {
                var _this = _super.call(this, options) || this;
                _this._resources = options.resources || window._resourcesManager.resources;
                _this._orderBy = options.orderBy;
                if (_this._forceDraw)
                    _this.draw(options.container);
                return _this;
            }
            OrderDatasourceWidget.prototype.draw = function ($target) {
                var _this = this;
                if (this._container == null)
                    this._container = $target;
                this.retrieveColumnInfo(function () {
                    var $content = $(_this.getViewPreferencesMarkUp());
                    _this.populatePreferencesContainer($content);
                    $target.append($content);
                });
            };
            OrderDatasourceWidget.prototype.redraw = function (terms, options) {
                this._container.empty();
                if (options) {
                    this._columns = options.columns || this._columns;
                }
                this._orderBy = terms;
                this.draw(this._container);
            };
            OrderDatasourceWidget.prototype.getColumns = function () {
                return this._columns;
            };
            OrderDatasourceWidget.prototype.getDataSourceTerms = function (options) {
                var $rows = this._container.find(".row-preference");
                var columns = [];
                var orderInfos = [];
                var visibleFound = false;
                var visibilityChanged = false;
                for (var i = 0; i < $rows.length; i++) {
                    var $row = $rows.eq(i);
                    var columnName = $row.data("column");
                    var sortOrder = $row.find(".column-sort-order").val().trim();
                    var direction = $row.find(".sorting-direction:checked").val();
                    var isVisible = $row.find(".column-is-visible").is(":checked");
                    var originalColumn = this.findColumnInfoByName(columnName);
                    if (isVisible)
                        visibleFound = true;
                    if (isVisible !== originalColumn.isVisible)
                        visibilityChanged = true;
                    var column = {
                        name: columnName,
                        dataType: originalColumn.dataType,
                        width: originalColumn.width,
                        minWidth: originalColumn.minWidth,
                        customWidth: originalColumn.customWidth,
                        supportsAggregators: originalColumn.supportsAggregators,
                        isVisible: isVisible,
                        caption: originalColumn.caption,
                        mambaDataType: originalColumn.dataType
                    };
                    columns.push(column);
                    if (sortOrder.length === 0)
                        continue;
                    //orderInfos.push(new Widgets.ListOrderByInfo(column, direction, sortOrder));
                }
                // Quick Validation
                if (visibleFound === false) {
                    alert("Please select at least one visible column.");
                    return [];
                }
                // Sort by Sort Order
                orderInfos.sort(function (a, b) {
                    if (a.sortOrder < b.sortOrder)
                        return -1;
                    if (a.sortOrder > b.sortOrder)
                        return 1;
                    return 0;
                });
                // Column Visibility changed. Reset widths, so that they are recalculated
                if (visibilityChanged) {
                    for (var i = 0; i < columns.length; i++) {
                        columns[i].width = null;
                    }
                }
                this._columns = columns;
                return orderInfos;
            };
            OrderDatasourceWidget.prototype.getViewPreferencesMarkUp = function () {
                return "<div class='preferences-container collapsible-grid-main-container'>             <table class='preferences-table table table-hover'>                 <thead>                    <th>" + this._resources.Order + "</th>                    <th>" + this._resources.Visible + "</th>                    <th>" + this._resources.Column + "</th>                    <th>" + this._resources.Sorting + "</th>                    <th>" + this._resources.SortOrder + "</th>                </thead>                <tbody class='preferences-table-body'>                 </tbody>             </table>         </div>";
            };
            OrderDatasourceWidget.prototype.populatePreferencesContainer = function ($container) {
                var _this = this;
                for (var i = 0; i < this._columns.length; i++) {
                    var column = this._columns[i];
                    var checkedAttr = column.isVisible === true ? "checked='checked'" : "";
                    var $line = $("<tr class='row-preference' data-column='" + column.name + "'>                                    <td style='text-align: center'>                                        <span class='move-row-up glyphicon glyphicon-chevron-up'></span>                                        <span class='move-row-down glyphicon glyphicon-chevron-down'></span>                                    </td>                                    <td style='text-align: center'>                                        <input type='checkbox' class='column-is-visible' " + checkedAttr + "/>                                    </td>                                    <td>" + column.caption + "</td>                                    <td class='cell-for-sorting'>                                        <span class='sort-direction-icon glyphicon glyphicon-arrow-up'></span>                                        <input type='radio' value='" + Joove.OrderByDirections.ASC + "' name='" + column.name + "sorting' class='sorting-direction form-control' />                                        <span class='sort-direction-icon glyphicon glyphicon-arrow-down'></span>                                        <input type='radio' value='" + Joove.OrderByDirections.DESC + "' name='" + column.name + "sorting' class='sorting-direction form-control' />                                     </td>                                    <td class='cell-for-sorting'>                                         <input type='text' class='column-sort-order form-control' />                                     </td>                                </tr>");
                    $container.find(".preferences-table-body").append($line);
                    if (column.orderable === false) {
                        $line.find(".cell-for-sorting *").attr("disabled", "disabled");
                    }
                }
                for (var i = 0; i < this._orderBy.length; i++) {
                    var orderInfo = this._orderBy[i];
                    var column = orderInfo.column;
                    var $row = $container.find("[data-column='" + column.name + "']");
                    $row.find(".sorting-direction[value='" + orderInfo.direction + "']").attr("checked", "checked");
                    $row.find(".column-sort-order").val(parseInt(String(i + 1)));
                }
                $container.find(".move-row-up")
                    .on("click", function (evt) {
                    var $row = $(evt.target).closest("tr");
                    var $prevRow = $row.prev();
                    if ($prevRow.length === 0)
                        return;
                    $row.insertBefore($prevRow);
                    _this.flashElement($row);
                });
                $container.find(".move-row-down")
                    .on("click", function (evt) {
                    var $row = $(evt.target).closest("tr");
                    var $nextRow = $row.next();
                    if ($nextRow.length === 0)
                        return;
                    $row.insertAfter($nextRow);
                    _this.flashElement($row);
                });
            };
            return OrderDatasourceWidget;
        }(DatasourceWidget));
        Widgets.OrderDatasourceWidget = OrderDatasourceWidget;
    })(Widgets = Joove.Widgets || (Joove.Widgets = {}));
})(Joove || (Joove = {}));
;
/*! @preserve
 * numeral.js
 * version : 2.0.6
 * author : Adam Draper
 * license : MIT
 * http://adamwdraper.github.com/Numeral-js/
 */
!function (a, b) { "function" == typeof define && define.amd ? define(b) : "object" == typeof module && module.exports ? module.exports = b() : a.numeral = b() }(this, function () { function a(a, b) { this._input = a, this._value = b } var b, c, d = "2.0.6", e = {}, f = {}, g = { currentLocale: "en", zeroFormat: null, nullFormat: null, defaultFormat: "0,0", scalePercentBy100: !0 }, h = { currentLocale: g.currentLocale, zeroFormat: g.zeroFormat, nullFormat: g.nullFormat, defaultFormat: g.defaultFormat, scalePercentBy100: g.scalePercentBy100 }; return b = function (d) { var f, g, i, j; if (b.isNumeral(d)) f = d.value(); else if (0 === d || "undefined" == typeof d) f = 0; else if (null === d || c.isNaN(d)) f = null; else if ("string" == typeof d) if (h.zeroFormat && d === h.zeroFormat) f = 0; else if (h.nullFormat && d === h.nullFormat || !d.replace(/[^0-9]+/g, "").length) f = null; else { for (g in e) if (j = "function" == typeof e[g].regexps.unformat ? e[g].regexps.unformat() : e[g].regexps.unformat, j && d.match(j)) { i = e[g].unformat; break } i = i || b._.stringToNumber, f = i(d) } else f = Number(d) || null; return new a(d, f) }, b.version = d, b.isNumeral = function (b) { return b instanceof a }, b._ = c = { numberToFormat: function (a, c, d) { var e, g, h, i, j, k, l, m = f[b.options.currentLocale], n = !1, o = !1, p = 0, q = "", r = 1e12, s = 1e9, t = 1e6, u = 1e3, v = "", w = !1; if (a = a || 0, g = Math.abs(a), b._.includes(c, "(") ? (n = !0, c = c.replace(/[\(|\)]/g, "")) : (b._.includes(c, "+") || b._.includes(c, "-")) && (j = b._.includes(c, "+") ? c.indexOf("+") : 0 > a ? c.indexOf("-") : -1, c = c.replace(/[\+|\-]/g, "")), b._.includes(c, "a") && (e = c.match(/a(k|m|b|t)?/), e = e ? e[1] : !1, b._.includes(c, " a") && (q = " "), c = c.replace(new RegExp(q + "a[kmbt]?"), ""), g >= r && !e || "t" === e ? (q += m.abbreviations.trillion, a /= r) : r > g && g >= s && !e || "b" === e ? (q += m.abbreviations.billion, a /= s) : s > g && g >= t && !e || "m" === e ? (q += m.abbreviations.million, a /= t) : (t > g && g >= u && !e || "k" === e) && (q += m.abbreviations.thousand, a /= u)), b._.includes(c, "[.]") && (o = !0, c = c.replace("[.]", ".")), h = a.toString().split(".")[0], i = c.split(".")[1], k = c.indexOf(","), p = (c.split(".")[0].split(",")[0].match(/0/g) || []).length, i ? (b._.includes(i, "[") ? (i = i.replace("]", ""), i = i.split("["), v = b._.toFixed(a, i[0].length + i[1].length, d, i[1].length)) : v = b._.toFixed(a, i.length, d), h = v.split(".")[0], v = b._.includes(v, ".") ? m.delimiters.decimal + v.split(".")[1] : "", o && 0 === Number(v.slice(1)) && (v = "")) : h = b._.toFixed(a, 0, d), q && !e && Number(h) >= 1e3 && q !== m.abbreviations.trillion) switch (h = String(Number(h) / 1e3), q) { case m.abbreviations.thousand: q = m.abbreviations.million; break; case m.abbreviations.million: q = m.abbreviations.billion; break; case m.abbreviations.billion: q = m.abbreviations.trillion } if (b._.includes(h, "-") && (h = h.slice(1), w = !0), h.length < p) for (var x = p - h.length; x > 0; x--) h = "0" + h; return k > -1 && (h = h.toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1" + m.delimiters.thousands)), 0 === c.indexOf(".") && (h = ""), l = h + v + (q ? q : ""), n ? l = (n && w ? "(" : "") + l + (n && w ? ")" : "") : j >= 0 ? l = 0 === j ? (w ? "-" : "+") + l : l + (w ? "-" : "+") : w && (l = "-" + l), l }, stringToNumber: function (a) { var b, c, d, e = f[h.currentLocale], g = a, i = { thousand: 3, million: 6, billion: 9, trillion: 12 }; if (h.zeroFormat && a === h.zeroFormat) c = 0; else if (h.nullFormat && a === h.nullFormat || !a.replace(/[^0-9]+/g, "").length) c = null; else { c = 1, "." !== e.delimiters.decimal && (a = a.replace(/\./g, "").replace(e.delimiters.decimal, ".")); for (b in i) if (d = new RegExp("[^a-zA-Z]" + e.abbreviations[b] + "(?:\\)|(\\" + e.currency.symbol + ")?(?:\\))?)?$"), g.match(d)) { c *= Math.pow(10, i[b]); break } c *= (a.split("-").length + Math.min(a.split("(").length - 1, a.split(")").length - 1)) % 2 ? 1 : -1, a = a.replace(/[^0-9\.]+/g, ""), c *= Number(a) } return c }, isNaN: function (a) { return "number" == typeof a && isNaN(a) }, includes: function (a, b) { return -1 !== a.indexOf(b) }, insert: function (a, b, c) { return a.slice(0, c) + b + a.slice(c) }, reduce: function (a, b) { if (null === this) throw new TypeError("Array.prototype.reduce called on null or undefined"); if ("function" != typeof b) throw new TypeError(b + " is not a function"); var c, d = Object(a), e = d.length >>> 0, f = 0; if (3 === arguments.length) c = arguments[2]; else { for (; e > f && !(f in d) ;) f++; if (f >= e) throw new TypeError("Reduce of empty array with no initial value"); c = d[f++] } for (; e > f; f++) f in d && (c = b(c, d[f], f, d)); return c }, multiplier: function (a) { var b = a.toString().split("."); return b.length < 2 ? 1 : Math.pow(10, b[1].length) }, correctionFactor: function () { var a = Array.prototype.slice.call(arguments); return a.reduce(function (a, b) { var d = c.multiplier(b); return a > d ? a : d }, 1) }, toFixed: function (a, b, c, d) { var e, f, g, h, i = a.toString().split("."), j = b - (d || 0); return e = 2 === i.length ? Math.min(Math.max(i[1].length, j), b) : j, g = Math.pow(10, e), h = (c(a + "e+" + e) / g).toFixed(e), d > b - e && (f = new RegExp("\\.?0{1," + (d - (b - e)) + "}$"), h = h.replace(f, "")), h } }, b.options = h, b.formats = e, b.locales = f, b.locale = function (a) { return a && (h.currentLocale = a.toLowerCase()), h.currentLocale }, b.localeData = function (a) { if (!a) return f[h.currentLocale]; if (a = a.toLowerCase(), !f[a]) throw new Error("Unknown locale : " + a); return f[a] }, b.reset = function () { for (var a in g) h[a] = g[a] }, b.zeroFormat = function (a) { h.zeroFormat = "string" == typeof a ? a : null }, b.nullFormat = function (a) { h.nullFormat = "string" == typeof a ? a : null }, b.defaultFormat = function (a) { h.defaultFormat = "string" == typeof a ? a : "0.0" }, b.register = function (a, b, c) { if (b = b.toLowerCase(), this[a + "s"][b]) throw new TypeError(b + " " + a + " already registered."); return this[a + "s"][b] = c, c }, b.validate = function (a, c) { var d, e, f, g, h, i, j, k; if ("string" != typeof a && (a += "", console.warn && console.warn("Numeral.js: Value is not string. It has been co-erced to: ", a)), a = a.trim(), a.match(/^\d+$/)) return !0; if ("" === a) return !1; try { j = b.localeData(c) } catch (l) { j = b.localeData(b.locale()) } return f = j.currency.symbol, h = j.abbreviations, d = j.delimiters.decimal, e = "." === j.delimiters.thousands ? "\\." : j.delimiters.thousands, k = a.match(/^[^\d]+/), null !== k && (a = a.substr(1), k[0] !== f) ? !1 : (k = a.match(/[^\d]+$/), null !== k && (a = a.slice(0, -1), k[0] !== h.thousand && k[0] !== h.million && k[0] !== h.billion && k[0] !== h.trillion) ? !1 : (i = new RegExp(e + "{2}"), a.match(/[^\d.,]/g) ? !1 : (g = a.split(d), g.length > 2 ? !1 : g.length < 2 ? !!g[0].match(/^\d+.*\d$/) && !g[0].match(i) : 1 === g[0].length ? !!g[0].match(/^\d+$/) && !g[0].match(i) && !!g[1].match(/^\d+$/) : !!g[0].match(/^\d+.*\d$/) && !g[0].match(i) && !!g[1].match(/^\d+$/)))) }, b.fn = a.prototype = { clone: function () { return b(this) }, format: function (a, c) { var d, f, g, i = this._value, j = a || h.defaultFormat; if (c = c || Math.round, 0 === i && null !== h.zeroFormat) f = h.zeroFormat; else if (null === i && null !== h.nullFormat) f = h.nullFormat; else { for (d in e) if (j.match(e[d].regexps.format)) { g = e[d].format; break } g = g || b._.numberToFormat, f = g(i, j, c) } return f }, value: function () { return this._value }, input: function () { return this._input }, set: function (a) { return this._value = Number(a), this }, add: function (a) { function b(a, b, c, e) { return a + Math.round(d * b) } var d = c.correctionFactor.call(null, this._value, a); return this._value = c.reduce([this._value, a], b, 0) / d, this }, subtract: function (a) { function b(a, b, c, e) { return a - Math.round(d * b) } var d = c.correctionFactor.call(null, this._value, a); return this._value = c.reduce([a], b, Math.round(this._value * d)) / d, this }, multiply: function (a) { function b(a, b, d, e) { var f = c.correctionFactor(a, b); return Math.round(a * f) * Math.round(b * f) / Math.round(f * f) } return this._value = c.reduce([this._value, a], b, 1), this }, divide: function (a) { function b(a, b, d, e) { var f = c.correctionFactor(a, b); return Math.round(a * f) / Math.round(b * f) } return this._value = c.reduce([this._value, a], b), this }, difference: function (a) { return Math.abs(b(this._value).subtract(a).value()) } }, b.register("locale", "en", { delimiters: { thousands: ",", decimal: "." }, abbreviations: { thousand: "k", million: "m", billion: "b", trillion: "t" }, ordinal: function (a) { var b = a % 10; return 1 === ~~(a % 100 / 10) ? "th" : 1 === b ? "st" : 2 === b ? "nd" : 3 === b ? "rd" : "th" }, currency: { symbol: "$" } }), function () { b.register("format", "bps", { regexps: { format: /(BPS)/, unformat: /(BPS)/ }, format: function (a, c, d) { var e, f = b._.includes(c, " BPS") ? " " : ""; return a = 1e4 * a, c = c.replace(/\s?BPS/, ""), e = b._.numberToFormat(a, c, d), b._.includes(e, ")") ? (e = e.split(""), e.splice(-1, 0, f + "BPS"), e = e.join("")) : e = e + f + "BPS", e }, unformat: function (a) { return +(1e-4 * b._.stringToNumber(a)).toFixed(15) } }) }(), function () { var a = { base: 1e3, suffixes: ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"] }, c = { base: 1024, suffixes: ["B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"] }, d = a.suffixes.concat(c.suffixes.filter(function (b) { return a.suffixes.indexOf(b) < 0 })), e = d.join("|"); e = "(" + e.replace("B", "B(?!PS)") + ")", b.register("format", "bytes", { regexps: { format: /([0\s]i?b)/, unformat: new RegExp(e) }, format: function (d, e, f) { var g, h, i, j, k = b._.includes(e, "ib") ? c : a, l = b._.includes(e, " b") || b._.includes(e, " ib") ? " " : ""; for (e = e.replace(/\s?i?b/, ""), h = 0; h <= k.suffixes.length; h++) if (i = Math.pow(k.base, h), j = Math.pow(k.base, h + 1), null === d || 0 === d || d >= i && j > d) { l += k.suffixes[h], i > 0 && (d /= i); break } return g = b._.numberToFormat(d, e, f), g + l }, unformat: function (d) { var e, f, g = b._.stringToNumber(d); if (g) { for (e = a.suffixes.length - 1; e >= 0; e--) { if (b._.includes(d, a.suffixes[e])) { f = Math.pow(a.base, e); break } if (b._.includes(d, c.suffixes[e])) { f = Math.pow(c.base, e); break } } g *= f || 1 } return g } }) }(), function () { b.register("format", "currency", { regexps: { format: /(\$)/ }, format: function (a, c, d) { var e, f, g, h = b.locales[b.options.currentLocale], i = { before: c.match(/^([\+|\-|\(|\s|\$]*)/)[0], after: c.match(/([\+|\-|\)|\s|\$]*)$/)[0] }; for (c = c.replace(/\s?\$\s?/, ""), e = b._.numberToFormat(a, c, d), a >= 0 ? (i.before = i.before.replace(/[\-\(]/, ""), i.after = i.after.replace(/[\-\)]/, "")) : 0 > a && !b._.includes(i.before, "-") && !b._.includes(i.before, "(") && (i.before = "-" + i.before), g = 0; g < i.before.length; g++) switch (f = i.before[g]) { case "$": e = b._.insert(e, h.currency.symbol, g); break; case " ": e = b._.insert(e, " ", g + h.currency.symbol.length - 1) } for (g = i.after.length - 1; g >= 0; g--) switch (f = i.after[g]) { case "$": e = g === i.after.length - 1 ? e + h.currency.symbol : b._.insert(e, h.currency.symbol, -(i.after.length - (1 + g))); break; case " ": e = g === i.after.length - 1 ? e + " " : b._.insert(e, " ", -(i.after.length - (1 + g) + h.currency.symbol.length - 1)) } return e } }) }(), function () { b.register("format", "exponential", { regexps: { format: /(e\+|e-)/, unformat: /(e\+|e-)/ }, format: function (a, c, d) { var e, f = "number" != typeof a || b._.isNaN(a) ? "0e+0" : a.toExponential(), g = f.split("e"); return c = c.replace(/e[\+|\-]{1}0/, ""), e = b._.numberToFormat(Number(g[0]), c, d), e + "e" + g[1] }, unformat: function (a) { function c(a, c, d, e) { var f = b._.correctionFactor(a, c), g = a * f * (c * f) / (f * f); return g } var d = b._.includes(a, "e+") ? a.split("e+") : a.split("e-"), e = Number(d[0]), f = Number(d[1]); return f = b._.includes(a, "e-") ? f *= -1 : f, b._.reduce([e, Math.pow(10, f)], c, 1) } }) }(), function () { b.register("format", "ordinal", { regexps: { format: /(o)/ }, format: function (a, c, d) { var e, f = b.locales[b.options.currentLocale], g = b._.includes(c, " o") ? " " : ""; return c = c.replace(/\s?o/, ""), g += f.ordinal(a), e = b._.numberToFormat(a, c, d), e + g } }) }(), function () { b.register("format", "percentage", { regexps: { format: /(%)/, unformat: /(%)/ }, format: function (a, c, d) { var e, f = b._.includes(c, " %") ? " " : ""; return b.options.scalePercentBy100 && (a = 100 * a), c = c.replace(/\s?\%/, ""), e = b._.numberToFormat(a, c, d), b._.includes(e, ")") ? (e = e.split(""), e.splice(-1, 0, f + "%"), e = e.join("")) : e = e + f + "%", e }, unformat: function (a) { var c = b._.stringToNumber(a); return b.options.scalePercentBy100 ? .01 * c : c } }) }(), function () { b.register("format", "time", { regexps: { format: /(:)/, unformat: /(:)/ }, format: function (a, b, c) { var d = Math.floor(a / 60 / 60), e = Math.floor((a - 60 * d * 60) / 60), f = Math.round(a - 60 * d * 60 - 60 * e); return d + ":" + (10 > e ? "0" + e : e) + ":" + (10 > f ? "0" + f : f) }, unformat: function (a) { var b = a.split(":"), c = 0; return 3 === b.length ? (c += 60 * Number(b[0]) * 60, c += 60 * Number(b[1]), c += Number(b[2])) : 2 === b.length && (c += 60 * Number(b[0]), c += Number(b[1])), Number(c) } }) }(), b });;
/*!
* verbal-expressions JavaScript Library v0.3.0
* https://github.com/VerbalExpressions/JSVerbalExpressions
*
*
* Released under the MIT license
*
* Date: 2017-01-14
*
*/

!function(a){function b(){var a=new RegExp;return b.injectClassMethods(a),a}function c(){return new b}var d="VerEx";b.injectClassMethods=function(a){var c;for(c in b.prototype)b.prototype.hasOwnProperty(c)&&(a[c]=b.prototype[c]);return a},b.prototype={_prefixes:"",_source:"",_suffixes:"",_modifiers:"gm",sanitize:function(a){var b;return a.source?a.source:"number"==typeof a?a:(b=/([\].|*?+(){}^$\\:=[])/g,a.replace(b,"\\$&"))},add:function(a){return this._source+=a||"",this.compile(this._prefixes+this._source+this._suffixes,this._modifiers),this},startOfLine:function(a){return a=a!==!1,this._prefixes=a?"^":"",this.add()},endOfLine:function(a){return a=a!==!1,this._suffixes=a?"$":"",this.add()},then:function(a){return a=this.sanitize(a),this.add("(?:"+a+")")},find:function(a){return this.then(a)},maybe:function(a){return a=this.sanitize(a),this.add("(?:"+a+")?")},anything:function(){return this.add("(?:.*)")},anythingBut:function(a){return a=this.sanitize(a),this.add("(?:[^"+a+"]*)")},something:function(){return this.add("(?:.+)")},somethingBut:function(a){return a=this.sanitize(a),this.add("(?:[^"+a+"]+)")},replace:function(a,b){return a=a.toString(),a.replace(this,b)},lineBreak:function(){return this.add("(?:\\r\\n|\\r|\\n)")},br:function(){return this.lineBreak()},tab:function(){return this.add("\\t")},word:function(){return this.add("\\w+")},digit:function(){return this.add("\\d"),this},whitespace:function(){return this.add("\\s")},anyOf:function(a){return a=this.sanitize(a),this.add("["+a+"]")},any:function(a){return this.anyOf(a)},range:function(){var a,b,c=arguments.length,d=new Array(c/2),e=0,f=0;for(d[e++]="[";f<c;)a=this.sanitize(arguments[f++]),b=this.sanitize(arguments[f++]),d[e++]=a+"-"+b;return d[e++]="]",this.add(d.join(""))},addModifier:function(a){return this._modifiers.indexOf(a)===-1&&(this._modifiers+=a),this.add()},removeModifier:function(a){return this._modifiers=this._modifiers.replace(a,""),this.add()},withAnyCase:function(a){return a!==!1?this.addModifier("i"):this.removeModifier("i")},stopAtFirst:function(a){return a!==!1?this.removeModifier("g"):this.addModifier("g")},searchOneLine:function(a){return a!==!1?this.removeModifier("m"):this.addModifier("m")},repeatPrevious:function(){var a,b=/\d+/,c=arguments.length,d=new Array(c),e=0,f=0;for(e=0;e<c;e++)b.test(arguments[e])&&(d[f++]=arguments[e]);return f>0&&(d.length=f,a="{"+d.join(",")+"}"),this.add(a)},oneOrMore:function(){return this.add("+")},multiple:function(a){return a=a.source||this.sanitize(a),1===arguments.length&&this.add("(?:"+a+")*"),arguments.length>1&&(this.add("(?:"+a+")"),this.add("{"+arguments[1]+"}")),this},or:function(a){return this._prefixes+="(?:",this._suffixes=")"+this._suffixes,this.add(")|(?:"),a&&this.then(a),this},beginCapture:function(){return this._suffixes+=")",this.add("(")},endCapture:function(){return this._suffixes=this._suffixes.substring(0,this._suffixes.length-1),this.add(")")},toRegExp:function(){var a=this.toString().match(/\/(.*)\/([gimuy]+)?/);return new RegExp(a[1],a[2])}},"undefined"!=typeof module&&module.exports?module.exports=c:"function"==typeof define&&define.amd?define(d,[],function(){return b}):a[d]=c}(this);
//# sourceMappingURL=verbalexpressions.min.js.map;

angular
.module('Ul', [])
.provider('Ul', function () {
    var default_options = {};

    this.setOptions = function (options) {
        default_options = options;
    };

    this.$get = function () {
        return {
getOptions:
            function () {
                return default_options;
            }
        };
    };
})
.directive('uldirectiva', [
               '$timeout',
               '$parse',
               '$compile',
function ($timeout, $parse, $compile) {
    return {
scope: {

        },
link:
        function (scope, elm, attrs) {
            var _currentScope = scope.$parent;
            var controlName = elm.attr("jb-id");
            var options = JSON.parse(attrs.uloptions);

            var properties = {
ListType:
                options.ListType,
            };

            var context = {

            };

            var control = new UlCustomControl(elm.get(0), properties, context);
            control.init();


        }
    }
}
           ]);
;

angular
.module('Repeater', [])
.provider('Repeater', function () {
    var default_options = {};

    this.setOptions = function (options) {
        default_options = options;
    };

    this.$get = function () {
        return {
getOptions:
            function () {
                return default_options;
            }
        };
    };
})
.directive('repeaterdirectiva', [
               '$timeout',
               '$parse',
               '$compile',
function ($timeout, $parse, $compile) {
    return {
scope: {
ngcustomcollection: '='
        },
link:
        function (scope, elm, attrs) {
            var _currentScope = scope.$parent;
            var controlName = elm.attr("jb-id");
            var options = JSON.parse(attrs.repeateroptions);

            var properties = {
Collection:
                _currentScope.$eval(attrs.ngcustomcollection),

            };

            var context = {
CollectionChanged:
                function (newValue) {
                    var boundAttr = attrs.ngcustomcollection;
                    var current = _currentScope.$eval(boundAttr) || "";

                    if (_currentScope.$eval(boundAttr) == newValue) {
                        return;
                    }

                    $parse(boundAttr).assign(_currentScope, newValue);
                    if(!_currentScope.$$phase) {
                        _currentScope.$apply();
                    }
                },

            };

            var control = new RepeaterCustomControl(elm.get(0), properties, context);
            control.init();

            _currentScope.$watch(attrs.ngcustomcollection, function(value) {
                control.CollectionChanged(value || "", context);
            });

        }
    }
}
           ]);
;

angular
.module('NemoAce', [])
.provider('NemoAce', function () {
    var default_options = {};

    this.setOptions = function (options) {
        default_options = options;
    };

    this.$get = function () {
        return {
getOptions:
            function () {
                return default_options;
            }
        };
    };
})
.directive('nemoacedirectiva', [
               '$timeout',
               '$parse',
               '$compile',
function ($timeout, $parse, $compile) {
    return {
scope: {
ngcustomvalue: '='
        },
link:
        function (scope, elm, attrs) {
            var _currentScope = scope.$parent;
            var controlName = elm.attr("jb-id");
            var options = JSON.parse(attrs.nemoaceoptions);

            var properties = {
Language:
options.Language,Theme:
options.Theme,Value:
                _currentScope.$eval(attrs.ngcustomvalue),

            };

            var context = {
ValueChanged:
                function (newValue) {
                    var boundAttr = attrs.ngcustomvalue;
                    var current = _currentScope.$eval(boundAttr) || "";

                    if (_currentScope.$eval(boundAttr) == newValue) {
                        return;
                    }

                    $parse(boundAttr).assign(_currentScope, newValue);
                    if(!_currentScope.$$phase) {
                        _currentScope.$apply();
                    }
                },

            };

            var control = new NemoAceCustomControl(elm.get(0), properties, context);
            control.init();

            _currentScope.$watch(attrs.ngcustomvalue, function(value) {
                control.ValueChanged(value || "", context);
            });

        }
    }
}
           ]);
;
var Joove;
(function (Joove) {
    var Widgets;
    (function (Widgets) {
        var RecorderPanel = /** @class */ (function () {
            function RecorderPanel() {
                var _this = this;
                this.panel = "\n    <div id=\"recorder\">\n    <div class=\"status-heading\">\n        <p>Record your test</p>\n        <span>-</span>\n    </div>\n    <div class=\"status-body\">\n        <ul>\n            <li>\n                <button class=\"btn play\" disabled>Play</button>\n            </li>\n            <li>\n                <button class=\"btn start\">Record</button>\n            </li>\n            <li>\n                <button class=\"btn stop\" disabled>Stop</button>\n            </li>\n            <li>\n                <div class=\"upload\">\n                    <button class=\"btn load\">Load</button>\n                    <input type=\"file\" name=\"recording\" />\n                </div>\n            </li>\n            <li>\n                <button class=\"btn save\" disabled>Save</button>\n            </li>\n        </ul>\n    </div>\n    </div>";
                this.init = function () {
                    $('body').append(_this.panel);
                    _this.cnxt = $("#recorder");
                    $('input[type="file"]', _this.cnxt).change(_this.load);
                    $('input[type="file"]', _this.cnxt).change(function () { this.value = null; }); // Always fires onchange event
                    $('.play', _this.cnxt).click(_this.play);
                    $('.start', _this.cnxt).click(_this.start);
                    $('.stop', _this.cnxt).click(_this.stop);
                    $('.save', _this.cnxt).click(_this.save);
                    _this.cnxt.draggable();
                };
                this.load = function (e) {
                    var reader = new FileReader();
                    var file = e.target.files[0];
                    reader.onload = function (e) {
                        var fromLoad = JSON.parse(reader.result);
                        _this.recording = new Joove.Recording(fromLoad.states);
                        _this.recording.register(_this.nextStep);
                        _this.recording.name = file.name;
                        _this.setMsg("Load: " + _this.recording.name, "0 / " + _this.recording.numSteps());
                        $('.play', _this.cnxt).prop("disabled", false);
                    };
                    reader.readAsText(file);
                };
                this.nextStep = function (stepId) {
                    var nums = _this.recording.numSteps();
                    stepId = Math.ceil(stepId / 2);
                    if (stepId <= nums) {
                        _this.setStatus(stepId + " / " + _this.recording.numSteps());
                    }
                };
                this.play = function () {
                    _this.setMsg("Play: " + _this.recording.name);
                    $('.play', _this.cnxt).addClass("run");
                    _this.cnxt.removeClass("success");
                    _this.cnxt.removeClass("error");
                    _this.recording.play()
                        .then(function () {
                        _this.setMsg("End: " + _this.recording.name);
                        $('.play', _this.cnxt).removeClass("run");
                        _this.cnxt.addClass("success");
                    })
                        .catch(function () {
                        _this.setMsg("Error: " + _this.recording.name);
                        $('.play', _this.cnxt).removeClass("run");
                        _this.cnxt.addClass("error");
                    });
                };
                this.save = function () {
                    window._recorder.download();
                };
                this.start = function () {
                    window._recorder.start();
                    $('.stop', _this.cnxt).prop("disabled", false);
                    $('.start', _this.cnxt).prop("disabled", true);
                    $('.start', _this.cnxt).addClass("run");
                };
                this.stop = function () {
                    window._recorder.stop();
                    $('.start', _this.cnxt).prop("disabled", false);
                    $('.stop', _this.cnxt).prop("disabled", true);
                    $('.save', _this.cnxt).prop("disabled", false);
                    $('.start', _this.cnxt).removeClass("run");
                };
                this.setMsg = function (msg, status) {
                    $('.status-heading p', _this.cnxt).text(msg);
                    _this.setStatus(status);
                };
                this.setStatus = function (status) {
                    if (status != null) {
                        $('.status-heading span', _this.cnxt).text(status);
                    }
                };
                this.init();
            }
            return RecorderPanel;
        }());
        Widgets.RecorderPanel = RecorderPanel;
    })(Widgets = Joove.Widgets || (Joove.Widgets = {}));
})(Joove || (Joove = {}));
;
var Joove;
(function (Joove) {
    var Widgets;
    (function (Widgets) {
        var MenuVariant;
        (function (MenuVariant) {
            MenuVariant[MenuVariant["NavBar"] = 0] = "NavBar";
            MenuVariant[MenuVariant["SideNav"] = 1] = "SideNav";
        })(MenuVariant = Widgets.MenuVariant || (Widgets.MenuVariant = {}));
        $(document)
            .ready(function () {
            var InitGlobalMenuBar = function () {
                var variant = ($(".sidenav").length === 0)
                    ? MenuVariant.NavBar
                    : MenuVariant.SideNav;
                new MenuControl({
                    menuVariant: variant,
                    ratio: window.maxLeftMenuWidthRatio
                }).Init();
            };
            window._backEndInfoAggregator.registerOnCompleteHook(function () {
                InitGlobalMenuBar();
            });
        });
        var MenuControl = /** @class */ (function () {
            function MenuControl(options) {
                this.maxDrawTries = 0;
                this._responsiveTimeout = null;
                this._ratio = options.ratio || 0.75;
                this._menuVariant = options.menuVariant || MenuVariant.NavBar;
                this._menu = {};
            }
            MenuControl.prototype.Init = function () {
                this.HideEmptySubMenus();
                this._menu.left = $("[jb-type='MenuControl'] .nav:first");
                this._menu.right = $("[jb-type='MenuControl'] .nav:last");
                if (this._menuVariant === MenuVariant.SideNav) {
                    this.InitSideNav();
                }
                else {
                    this.InitNavBar();
                }
                this.RegisterEventHandlers();
                this.SaveMenuItems();
                // TODO Remove it
                $('[jb-type="MenuItemIcon"]').addClass("glyphicon");
                /* Ugly, temporary fix, put here since we're gonna migrate to a new Menu altogether. Resolves: #14340 */
                setTimeout(function () {
                    $("[jb-type='MenuControl']").show();
                }, 500);
            };
            MenuControl.prototype.SaveMenuItems = function () {
                this._menuItems = {
                    left: $("> li", this._menu.left).clone(true, true),
                    right: $("> li", this._menu.right).clone(true, true)
                };
                this.VisibleMenu(this._menuItems.left);
                this.VisibleMenu(this._menuItems.right);
            };
            MenuControl.prototype.VisibleMenu = function (menu) {
                for (var i = 0; i < menu.length; i++) {
                    var item = menu[i];
                    $(item).css("visibility", "visible");
                    $("li", item).css("visibility", "visible");
                }
            };
            MenuControl.prototype.InitSideNav = function () {
                //const isOpen = localStorage.getItem("sidenavIsOpen") === "true";
                //if (!isOpen) {
                //    $("#sidenav-toogle").toggleClass("pull");
                //    $("[jb-type='MenuControl'].sidenav").toggleClass("pull");
                //} 
                $(".nav [jb-type='MenuItem']").css("visibility", "visible");
                $(".master-page-footer").css("left", $("[jb-type='MenuControl']").width() + "px");
                $("#sidenav-toogle").on("click", function (event) {
                    event.preventDefault();
                    event.stopPropagation();
                    MenuControl.ToogleSidenav();
                });
            };
            MenuControl.PreInit = function () {
                $("[jb-type='MenuControl']").hide();
                var variant = ($(".sidenav").length === 0)
                    ? MenuVariant.NavBar
                    : MenuVariant.SideNav;
                if (variant != MenuVariant.SideNav) {
                    var $rootElement = $(".form-root-element");
                    $rootElement.css("margin-top", "50px");
                }
                else {
                    var isOpen = localStorage.getItem("sidenavIsOpen") === "true";
                    $("body").addClass("open-sidenav");
                    if (!isOpen) {
                        setTimeout(function () {
                            $("#sidenav-toogle").addClass("pull");
                            $("[jb-type='MenuControl'].sidenav").addClass("pull");
                            $(".open-sidenav").addClass("pull");
                        }, 500);
                    }
                }
            };
            MenuControl.prototype.InitNavBar = function () {
                var _this = this;
                this.MakeMenusResponsive();
                var $rootElement = this._menu.left.closest(".form-root-element");
                $rootElement.css("margin-top", "50px");
                setTimeout(function () {
                    _this.HandleDraw();
                    $(".nav [jb-type='MenuItem']").css("visibility", "visible");
                    $rootElement.animate({
                        "margin-top": _this._menu.left.closest("[jb-type='MenuControl']").height() + "px"
                    }, 50);
                }, 500);
            };
            MenuControl.prototype.CalculateMenuSize = function () {
                var menuHeaderWidth = $(".navbar-header").width();
                this._menuWidth = $("[jb-type='MenuControl']").width() - menuHeaderWidth;
                this._menuItemWidth = $("[jb-type='MenuControl'] .nav:first li:first").width();
            };
            MenuControl.ToogleSidenav = function (update) {
                if (update === void 0) { update = true; }
                $("#sidenav-toogle").toggleClass("pull");
                $(".sidenav").toggleClass("pull");
                if (update) {
                    var isOpen = localStorage.getItem("sidenavIsOpen") === "true";
                    localStorage.setItem("sidenavIsOpen", String(!isOpen));
                }
                //Check if any Datalists are displayed and refresh their size
                $("[jb-id][jb-type='DataList']:visible").each(function (index, element) {
                    var datatableInstance = Joove.Widgets.DataListControl.instancesDic[$(element).attr("jb-id")];
                    if (datatableInstance != undefined) {
                        setTimeout(function () { datatableInstance.updateDataTableSize(); }, 500);
                    }
                });
            };
            MenuControl.prototype.RegisterEventHandlers = function () {
                var _this = this;
                $("[jb-type='MenuControl']").on("click", ".jb-submenu", function (event) {
                    event.preventDefault();
                    event.stopPropagation();
                    var $target = $(event.currentTarget);
                    $target.siblings().removeClass("open");
                    $target.toggleClass("open");
                    _this.repositionSubmenu($target.find("[jb-type='MenuItemsContainer']").eq(0), $target);
                });
                var that = this;
                if (this._menuVariant !== MenuVariant.SideNav) {
                    $(window)
                        .resize(function () {
                        that.HandleDraw();
                    });
                }
                $(".jb-direct-link[jb-type='MenuItem']").on("mousedown", function (e) {
                    if (e.which != 2)
                        return;
                    $(this).data("openInNewWindow", true);
                    $(this).click();
                    return false;
                });
            };
            MenuControl.prototype.repositionSubmenu = function ($subMenu, $parent) {
                if (this._menuVariant == MenuVariant.SideNav || window.outerWidth < 768)
                    return;
                var menuWidth = $subMenu.width();
                var isOffScreenToRight = $subMenu.offset().left + menuWidth > window.innerWidth;
                var isOffScreenToLeft = $subMenu.offset().left <= 0;
                var topPosition = $parent.position().top;
                $subMenu.css("margin-top", topPosition + "px");
                $subMenu.toggleClass("offscreen-left", isOffScreenToLeft);
                $subMenu.toggleClass("offscreen-right", isOffScreenToRight === true || $parent.closest("ul").hasClass("offscreen-right") === true);
            };
            MenuControl.prototype.HandleDraw = function () {
                this.CalculateMenuSize();
                if ($("[jb-type='MenuControl']").width() < 760) {
                    this.ResetMenu(this._menu.left, "left");
                }
                this.Draw();
            };
            MenuControl.prototype.Draw = function () {
                if (this.maxDrawTries > MenuControl.MAX_DRAW_TRIES) {
                    this.maxDrawTries = 0;
                    return;
                }
                var leftMenuWidth = this._menuWidth * this._ratio;
                var rightMenuWidth = this._menuWidth * (1 - this._ratio);
                var leftItemsToShow = Math.floor(leftMenuWidth / this._menuItemWidth);
                if (leftItemsToShow > 0) {
                    this.HandleOverflowMenuItems(this._menu.left, "Left", leftItemsToShow);
                }
                //this.handleOverflowMenuItems("[jb-type='MenuControl'] .nav:first", "Right");
                var isReDraw = this.RecalculateMenuRatio(false);
                if (isReDraw) {
                    this.maxDrawTries = this.maxDrawTries + 1;
                    this.Draw();
                }
            };
            MenuControl.prototype.RecalculateMenuRatio = function (reset) {
                var menuHeight = $('[jb-type="MenuControl"] .navbar-collapse').height();
                var menuRightHeight = $('[jb-type="MenuControl"] .navbar-right').height();
                if (menuRightHeight == 0)
                    return false;
                if (menuHeight > menuRightHeight) {
                    this._ratio = this._ratio - 0.05;
                    return true;
                }
                else {
                    if (reset) {
                        this._ratio = window.maxLeftMenuWidthRatio || 0.75;
                    }
                    return false;
                }
            };
            MenuControl.prototype.GetMenuItemSize = function (menuQuery) {
                return $(menuQuery + " > li").length;
            };
            MenuControl.prototype.ResetMenu = function (menuQuery, name) {
                var $menu = $(menuQuery);
                $menu.empty();
                $menu.append(this._menuItems[name.toLowerCase()].clone(true, true));
                $('[jb-type="MenuItemIcon"]').addClass("glyphicon");
            };
            MenuControl.prototype.HandleOverflowMenuItems = function (menuQuery, name, leftItemsToShow) {
                var $menu = $(menuQuery);
                var items = $("> li", menuQuery);
                var lastMenuItem = $("> li", menuQuery).last();
                if (lastMenuItem.hasClass("jb-overflow-menu")) {
                    leftItemsToShow += 1;
                }
                if (items.length === leftItemsToShow) {
                    return;
                }
                if (items.length < leftItemsToShow) {
                    if (lastMenuItem.hasClass("jb-overflow-menu")) {
                        this.ResetMenu($menu, name);
                        this.HandleOverflowMenuItems(menuQuery, name, leftItemsToShow);
                    }
                }
                else {
                    if ($("[jb-id='MasterAdministrationResponsive" + name + "']").length === 0) {
                        var menuItemTemplate = MenuControl.GetJbOverflowMenuItem(name);
                        $menu.append(menuItemTemplate);
                        if ($(".nav [jb-type='MenuItem']").css("visibility") === "visible") {
                            menuItemTemplate.css("visibility", "visible");
                        }
                    }
                    var $leftMenuItems = items.slice(leftItemsToShow - 1, items.length).detach();
                    $leftMenuItems.appendTo("#okeyNav" + name);
                }
            };
            MenuControl.prototype.MarkEmptySubMenus = function () {
                $("[jb-type='MenuItemsContainer']:not(:has(*))").addClass("empty-submenu");
            };
            MenuControl.prototype.HideEmptySubMenus = function () {
                this.MarkEmptySubMenus();
                var failSafe = 9999;
                var counter = 0;
                while ($(".empty-submenu").length > 0) {
                    $(".empty-submenu").parent().remove();
                    this.MarkEmptySubMenus();
                    counter++;
                    if (counter > failSafe) {
                        console.error("Too many recursions for hiding Empty Sub Menus...");
                        break;
                    }
                }
            };
            MenuControl.prototype.GetChildMenu = function ($menuItem) {
                return $menuItem.children("[jb-type='MenuItemsContainer']").eq(0);
            };
            MenuControl.prototype.MakeMenusResponsive = function () {
                var _this = this;
                var $menus = $("[jb-type='MenuControl']");
                clearTimeout(this._responsiveTimeout);
                this._responsiveTimeout = setTimeout(function () {
                    for (var i = 0; i < $menus.length; i++) {
                        _this.AdjustDimensions($menus.eq(i));
                    }
                }, 250);
            };
            ;
            MenuControl.prototype.AdjustDimensions = function ($menu) {
                var $rootItems = $menu.children("[jb-type='MenuItemsContainer']").eq(0).children("[jb-type='MenuItem']");
                var $targetHamburger = $menu.find("[jb-id='__containerTemplate']").eq(0);
                var $targetContainer = $targetHamburger.children("[jb-type='MenuItemsContainer']").eq(0);
                if ($targetContainer.hasClass("hamburger") === false) {
                    $targetHamburger.find(".jb-no-icon")
                        .eq(0)
                        .removeClass("glyphicon-folder-open")
                        .addClass("glyphicon-menu-hamburger")
                        .css({
                        "margin-bottom": "3px",
                        "top": "5px"
                    });
                    $targetHamburger.find("[jb-type='MenuItemArrow']").remove();
                    $targetHamburger.addClass("hamburger");
                }
                var $menuTop = $menu.position().top;
                $rootItems.show().removeClass("to-hamburger");
                $targetContainer.empty();
                var hamburgerIsNeeded = false;
                var moveToHumburger = function ($item) {
                    var $clone = $item.clone(true);
                    $item.hide();
                    $targetContainer.append($clone);
                };
                for (var i = 0; i < $rootItems.length; i++) {
                    var $current = $rootItems.eq(i);
                    if ($current.position().top === $menuTop || $current.hasClass("hamburger") === true)
                        continue;
                    if (hamburgerIsNeeded === false && i > 0) {
                        // hamburgerIsNeeded = true;
                        var $prev = $rootItems.eq(i - 1);
                        $prev.addClass("to-hamburger");
                    }
                    hamburgerIsNeeded = true;
                    $current.addClass("to-hamburger");
                }
                $targetHamburger.toggle(hamburgerIsNeeded);
                if (hamburgerIsNeeded === false)
                    return;
                for (var i = 0; i < $rootItems.length; i++) {
                    var $current = $rootItems.eq(i);
                    if ($current.hasClass("to-hamburger") === false)
                        continue;
                    moveToHumburger($current);
                }
            };
            MenuControl.GetJbOverflowMenuItem = function (name) {
                return $("<li jb-id=\"MasterAdministrationResponsive" + name + "\" jb-type=\"MenuItem\" class=\"jb-submenu jb-overflow-menu jb-control\">\n                     <a jb-type=\"MenuItemLabelContainer\" data-toggle=\"dropdown\" class=\"dropdown-toggle jb-control\" style=\"min-height: 50px;\">\n                        <span jb-type=\"MenuItemLabel\" class=\"jb-control\"><span class=\"glyphicon glyphicon-option-horizontal jb-control\"></span></span>\n                     </a>\n                     <ul jb-type=\"MenuItemsContainer\" class=\"dropdown-menu jb-control\" id=\"okeyNav" + name + "\">\n                     </ul>\n                 </li>");
            };
            MenuControl.MAX_DRAW_TRIES = 20;
            return MenuControl;
        }());
        Widgets.MenuControl = MenuControl;
    })(Widgets = Joove.Widgets || (Joove.Widgets = {}));
})(Joove || (Joove = {}));
;
var __extends = (this && this.__extends) || (function () {
    var extendStatics = Object.setPrototypeOf ||
        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
var Joove;
(function (Joove) {
    var Widgets;
    (function (Widgets) {
        var JbImage = /** @class */ (function (_super) {
            __extends(JbImage, _super);
            function JbImage() {
                return _super !== null && _super.apply(this, arguments) || this;
            }
            return JbImage;
        }(Joove.BaseAngularProvider));
        function jbImage($timeout, $interval, ngRadio) {
            return {
                priority: 1001,
                restrict: "AE",
                require: "ngModel",
                scope: {
                    model: "=ngModel",
                    fromServer: "=jbFromServer",
                    canUpload: "=?jbUpload",
                    maximizeOnClick: "=?jbThumbnail",
                    imageType: "=jbImageType",
                    source: "=?ngAttrSrc",
                    imageFolder: "@jbImageFolder",
                    accept: "=?jbAccept",
                    dontMakeFormDirty: "=jbDoesntMakeFormDirty"
                },
                link: function ($scope, $element, $attrs, ngModelCtrl) {
                    if (Joove.Common.directiveScopeIsReady($element))
                        return;
                    $element.on("load", function () {
                        $element.removeClass("broken-image");
                    });
                    $element.on("load", function () {
                        $element.removeClass("broken-image");
                    });
                    $element.on("error", function () {
                        $element.addClass("broken-image");
                    });
                    Joove.Common.setDirectiveScope($element, $scope);
                    var name = Joove.Core.getElementName($element);
                    $scope.$uploadButton = null;
                    $scope.getDataToSend = function () {
                        var model = Joove.Common.getModel();
                        return Joove.Core.prepareDataForFileAction($element, model);
                    };
                    $scope.download = function (thumbnail, cb) {
                        var postData = {
                            model: $scope.getDataToSend(),
                            indexes: Joove.Common.getIndexesOfControl($element).key,
                            useThumbnail: thumbnail
                        };
                        Joove.Core.executeControllerAction(Joove.Core.getControllerForElement($element, false), name + "_Download", "POST", [], postData, null, function (data) { cb && cb(data); }, null, null, function (data) { console.log("Error loading image!", data); });
                    };
                    $scope.upload = function () {
                        var postData = $scope.getDataToSend();
                        var files = $scope.$uploadButton.get(0).files;
                        if ($scope.maxSize != null && $scope.maxSize > 0) {
                            for (var i = 0; i < files.length; i++) {
                                var file = files[0];
                                if (file.size > $scope.maxSize) {
                                    var msg = window._resourcesManager.getTooLargeFileMessage(file.name, file.size, $scope.maxSize);
                                    window._popUpManager.error("", msg);
                                    return;
                                }
                            }
                        }
                        Joove.Core.uploadFile({
                            files: files,
                            withProgressBar: false,
                            model: postData,
                            indexesKey: Joove.Common.getIndexesOfControl($element).key,
                            $element: $element,
                            onSuccess: function (data) {
                                $scope.fullSizeData = null;
                                if (data.Type != "FileUpload")
                                    return;
                                if (data.Legacy == true) {
                                    $scope.model = data.Data.FileName;
                                }
                                else {
                                    $scope.model = data;
                                }
                                $scope.setImage(data.ImageData);
                                $scope.$apply();
                            },
                            onError: function () {
                                $scope.setNotFoundImage();
                            }
                        });
                    };
                    $scope.setImage = function (imageData) {
                        if (imageData == null || imageData.length == null || imageData.length === 0) {
                            $scope.setNotFoundImage();
                        }
                        else {
                            var previousImage = $element.get(0);
                            var previousBroken_1 = $element.hasClass("broken-image");
                            var previousIncomplete_1 = previousImage.complete === false;
                            var previousSrc_1 = previousImage.src;
                            $element.attr("src", "data:image/jpeg;base64," + imageData);
                            setTimeout(function () {
                                if (previousIncomplete_1 == true || previousBroken_1 == true) {
                                    return;
                                }
                                var hadImage = (previousSrc_1 && previousSrc_1.trim && previousSrc_1.trim().length > 0);
                                if (hadImage == false) {
                                    return;
                                }
                                var currentImage = $element.get(0);
                                var currentBroken = $element.hasClass("broken-image");
                                if (currentImage.complete === false || currentBroken == true) {
                                    return;
                                }
                                if (previousSrc_1 != currentImage.src) {
                                    var dontMakeFormDirty = $scope.dontMakeFormDirty;
                                    if (previousSrc_1 == "data:image/jpeg;base64," + getNotFoundImageData()) {
                                        dontMakeFormDirty = true;
                                    }
                                    Joove.Core.onChange(currentImage, null, dontMakeFormDirty);
                                }
                            }, 50);
                        }
                    };
                    $scope.createUploadButton = function () {
                        var uniqTempId = Joove.Common.createRandomId(25);
                        var $container = $("<div class=\"image_upload_button\"></div>");
                        if ($scope.accept == null || $scope.accept.trim() == "") {
                            $scope.accept = "image/*";
                        }
                        $scope.$uploadButton = $("<input type='file' accept=\"" + $scope.accept + "\" jb-id='" + name + "UploadButton' id='" + uniqTempId + "'/>");
                        $scope.$label = $("<label for=\"" + uniqTempId + "\"><span class=\"fileattachment_progress\"><span class=\"fileattachment_progress_inner\"></span></span></label>");
                        $scope.$labelContent = $("<span class=\"fileattachment_content\">" + window._resourcesManager.getImageUploadTitle() + "</span>");
                        $scope.$label.prepend($scope.$labelContent);
                        $container.append($scope.$uploadButton);
                        $container.append($scope.$label);
                        $element.after($container);
                        $scope.$uploadButton.on("change", $scope.upload);
                    };
                    //This will fix those images that have a harcoded source (i.e. filesystem image in the form of src='/Resources/MyImage.png'), 
                    //but the Image itself is missing
                    $element.bind("error", function () {
                        $scope.setNotFoundImage();
                    });
                    //Set the Default image, if its was given
                    $scope.setDefaultFoundImage = function () {
                        var defaultPath = $element.attr("data-default-image") || "";
                        if (defaultPath.trim && defaultPath.trim() != "") {
                            $element.attr("src", defaultPath);
                            return true;
                        }
                        return false;
                    };
                    function getNotFoundImageData() {
                        return "iVBORw0KGgoAAAANSUhEUgAAAfQAAAFqCAYAAADsuqi5AAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAATOhJREFUeNrs3XlwnPl9Hvjnffu9+j7RuEnwBo8Zrw7Ski1VrGXssSuJIyYl2SQzWK/8R7JhnN1URUnAKrm8VhW5FSfxxvbUqrbKsw7pGSr2WjPaqo1qVqYmjqdGDmcsZWZIArwJgrga6Pt63+732D8GLwRyQAL9onE/nyqUZkYNoPH227+nv79TcBwHREREtLWJvAREREQMdCIiImKgExEREQOdiIiIGOhEREQMdCIiImKgExEREQOdiIiIGOhEREQMdCIiImKgExEREQOdiIiIGOhEREQMdCIiImKgExEREQOdiIiIGOhEREQMdCIiImKgExEREQOdiIiIGOhEREQMdCIiImKgExEREQOdiIiIGOhEREQMdCIiImKgExEREQOdiIiIGOhEREQMdCIiImKgExEREQOdiIiIGOhEREQMdCIiImKgExEREQOdiIiIGOhEREQMdCIiImKgExEREQOdiIiIGOhEREQMdCIiImKgExEREQOdiIiIGOhERETEQCciImKgExEREQOdiIiIGOhERETEQCciImKgExEREQOdiIiIGOhERETEQCciImKgExEREQOdiIiIGOhERETEQCciItqmJF4Coi1tuM0/7yIvKdHWJDiOw6tAtEXC2nGccLPZ7G02m4OmafZalhUxTTNsWRYsy4Jt23AcB5ZlPfcH+3w+CIIAURTh8/ng8/kgSVLZ5/OVJEmakGV5VJblCUEQygx9IgY6EXkIbtu2w7qunzAM44RhGOFGowHDMNBsNtFsNmGa5hPhbdt2W56EKIpPhLwkSZBlGbIsQ1VVKIoCVVXLqqpe0zTtmiiKZQY9EQOdiAEOwLKs3lqtdrJerw/WajXoug5d19FoNBZCe3HgLg7dhTexILTlSS1uCxZ/WHj6Ofh8PiiKAk3ToGkaAoEA/H7/aCAQuOrz+SYY8EQMdKJtH+CNRmOwUqmcqlQq4Wq1Cl3XYRgGLMuC4zgLgekGd7vCul0cx1kIevcDhyAI8Pl8UFUVmqYhGAwiFAqVQ6HQG4qijDLgiRjoRFs+wG3bDpdKpaFSqdRbqVRQq9VgGMZCeEuStBDeW5kb8qZpLoS8qqoIBAIIhUKIRCITkUjk0lPd9Ax4IgY60eauwguFwlCxWESlUoGu67AsC6IoQpblJ7rLtzPbttFsNmHbNnw+HzRNQygUQjQaRSwWu8TqnYiBTrQpQzybzQ4Vi0WUy2UYhgEAkGUZksTVoQBgmiaazSYAQFVVhMNhRKNRJJNJhjsRA51o44LcsqzeXC53LpfLoVgsotFoQBAEKIqyY6rw1VTvjUYDjuNAURREo1EkEgkkEolXFk2sY7ATMdCJ1q4aL5VKQ3Nzc4P5fB71ep0h3sZw9/v9iMfjSKVSo5FI5BKrdiIGOlHbq/HZ2dlzc3NzKJVKsG0biqLA5/PxCrWRZVloNBoQRRGRSASpVAodHR2s2okY6ESrC3Jd149PT0+fymazqNVqC5utbPVZ6Zud4zgLm+gEAgEkk0l0dXW9oWnaewx2IgY60YqDvFKpfHlqaupELpdDo9GAoiic3LZBTNNceA0SiQS6u7uvhUKhNxnsRAx0omcGeblcHpqYmBjM5XKwbRuqqsLn84Hvkw1uqAQBlmXBMAyIoohEIoHe3t7RcDh8icFOxEAneqIiHx8fP5HL5QB8vKxKFMVNH+Tuzm2L/3nxvz8rHN3/Xbwb3WbcmW6p527b9sKywEQigf7+flbsRAx02ulBXqvVTo6Pj5+cm5tbCPLNFmrufupP76vuBvDirWJXsm3sUtu3uie0Lf5AAPxk/3j3a7N9mHGDPZVKob+//2ogELjKYCcGOtEOCvJmszn46NGjoZmZGdi2DU3TNrwiX7x9qvs83O1hZVl2TztbOAFtfpb9hCzLEz6fb8Ln85VFUSyLolh6xrGni39X2LbtiG3bYcuywpZl9Zqm2Tt/NOvCyW6GYaDRaCxMUHPDf7NsW+tW7LquQxRFdHZ2YteuXZdkWR5lsBMDnWibh/nExMSFx48fo9FoQNO0DRsjdxxn4ShUx3GeOMUsEAhA0zT4/f4JVVVHVVVd6rhStDm0hp8V/vPHuQ7qut5br9fhfrmnwrm9A5IkbUjAu2Psuq5DURT09fWht7f3PEOdGOhE2zDIC4XCuQcPHvSWy+WFSne973/TNBcqcEmSFvY3DwaDCAaDo4FA4KokSRNrFNhtDXzTNHtrtdrJWq02WKlUUK1WUa/XYZomBEGAJEnrvjJAEISFnoVwOIw9e/ZMxGKxVxjsxEAn2gZB3mg0Bh88eDCUyWQgSRJUVV3XIHe7qwVBgKZpCIfD7te1YDB49anu8Ytb8Rq7lXytVjtZLpdPlEolVCoV1Ot12La9sKf9elXvgiAsHIrT2dmJgYGBxfvFM9iJgU601YJmZmbmwsOHD9FoNOD3+9dtnNxdO+3z+RAIBNwTxsqRSOTSol3PtmO4PHF0bLFY/CfFYjFcLBZRrVZhWdbCHID1CHXbtlGv16EoCgYGBtDZ2clueGKgE22lQDEM4/jdu3dPZbPZdeted7ctFQQBwWAQsVgMiURiNBwOv7GoCr+4E18P4OM98HO53GChUEC1Wl04mGWtt89d3A2fTCaxf//+N1RV5Y5zxEAn2gpV+b1792DbNvx+/5r/0kajAdM0oWka4vE4kslkORaL/cEODvHnvj6O44SLxeJQNpvtzeVy0HUdkiRBUZQ1fwL1eh2iKGLfvn2s1omBTrRZw8I0zd47d+6cm52dXdOqfPGuZQAQiUTQ0dGBVCrF5VIthrtpmr1zc3PnZmdnUSqV4DjOmu7Ot7ha7+jowIEDB16Zn4TI14sY6ESbIRgKhcK527dv9xqGgUAgsDZvFkGAaZowDAOSJCGRSKCrq2siGo2+suhhDAYPrx8AFIvFczMzM73ZbBamaUJVVUiStGZDJbVaDaqq4uDBg5wJTwx0os0QBo8ePbowNja2ZjPYFwe5oihIp9Po6uq66vf7uSvZGrye7gl3mUwGuq6vWW+LIAgwDAOmaWL37t3YtWsXu+CJgU60EY2/aZq9o6Oj57LZLAKBQNu7aRcHuaqq6OzsRHd3N5c/rVOwN5vNwampqaGZmRnU63Vomtb2it0dPqnVakgmkxgcHGQXPDHQidazsS+Xy0MjIyODa9HF/vSuY11dXejp6eH4+Aa91qZp9k5OTp6bmppa09393C74w4cP8xQ3YqATrUcDPzMzc+HOnTvw+Xxt7WIXBAGO4yzMhO7s7ERfXx+XOG2iiv3x48dD09PTsCwLfr9/4TVr1+tvGAYsy8KBAwc4C54Y6ERr2ag/fPjwwtjYGPx+f1u7XxePp6ZSKezevZsnd23Se6Ber58cGxs7OTc3B1EUoapq+xrE+WGWer2O3bt3Y2BggKFODHSidjbkjuOER0dHhzOZDILBYNt2fHMbcF3XEQ6HMTAwUI7H4xfZiG/+YC8Wi+cePHjQWyqV2jq+7u4wV61WkU6nMTg4eHF+TwHeD8RAJ1pN491sNgdv3LgxVCqVEAwG2/rD3WM3+/r60NfXx4Z7Cwb75OTkhbGxsYVu+HaqVquIRCI4evSoO4eC9wYx0Im8NNi6rh+/fv36KV3XEQgE2laBLd4KdN++fW9omsZx8i0c6oZhHL9///6pdm8qJAgCarUaNE3DsWPH3PuE9wgx0IlaaagrlcqXr1+/fsKtvNp1r9brdUiShD179nDi0zYL9kwmc+H+/fswTbNt1bogCKjX6/D5fDh27Ni1UCj0Ju8XYqATrbBxLhaL527cuNErCEJbZrIvHivnAR3bO9Qbjcbg3bt3h+bm5to2tu5OmnQcB0ePHnV3B+R9Qwx0ouc1yvl8fvjmzZthdwZzOxpjXdfhOA4GBgbQ29vLqnwHBPvU1NSF+/fvL5xD365Qt20bR44ccSdP8h4iBjrRUg1xLpcbvnnzZtg9fasd92etVkMgEMChQ4fc7lKG+Q4J9Wq1+uVbt26dqFQqbZlQKQjCwul6R44cKScSCYY6MdCJnlWZ+3y+VYe5u9tbvV5HZ2cnDhw4cFEURc5g34H3leM44bt37w5PTk62Zf8CN9Qty2KlTgx0oqcb3WKxeO769eu97QrzRqOBZrOJffv2oaenh13srNYxPT194e7du23ZYXBxqB87doxj6sRAJwIwXC6Xhz766KNBURTbEubujOTDhw8vPtqUjS1DHaVSaWhkZGSw2WyuehmkG+q2beOFF15w93/nfUYMdNqZjWytVjv54YcfnnQcpy1VkztefvToUXcWOxtYeuKeazQagzdv3mzLRkXuRDlBEPDiiy+62wXzniMGOu28hvWDDz4YajQabVln3mg00NHRgf3797OLnZ5777lbCc/OziIQCEAQhFWFer1eh6Io+Kmf+in3eF3ee7TuRF4C2ogG1bbt8I0bN4YMw2jbpjGO40CSJF5dWs5FQRDKhw8fPt/X14darQbbtj2HuuM48Pv9MAwDN27cGLJtO4z5Ln4iBjpt6zAHgJGRkeFKpdK27VwBQFVVjI+P4/bt2xcW/y6ipUIdAPbu3Xt+7969qNfrME1zVaEeCARQqVQwMjIyzPuPGOi0I8L87t27F7LZbFvD3BUIBDA1NcVQpxWHel9f3/kDBw5A1/W2hHo2m8Xdu3d5/xEDnba3iYmJC5OTkwgEAmv2O0KhEKampnDnzh02qrSiUO/u7j5/+PBhGIaBZrO5qjH1QCCAyclJTExMXODlJQY6bcvqPJ/PDz948ACapkEU1/bWC4VCmJycZKVOKw71jo6O84ODgwt7GHgNdVEUoWkaHjx4gHw+P8x7jxjotK3CXNf147dv3w5LktSWwzJWGurT09MMdVrXUHcnZ0qShNu3b4d1XT/Oe48Y6LQtwhwAbt++farZbLZtf/aVCgaDDHVqOdQPHTq0sGe711BXFAXNZhO3b98+xXuPGOi0LcL83r17FwqFwppMgltpqHOiHLUS6ul0+vz+/fuh6zosy/Ic6oFAAIVCAffu3eO9Rwx02tpmZ2cXJsFt5CZG7H6nVkO9u7t7YUmbbduefpAb6pOTk5idneUkOWKg09asznVdP37//n3Isux5Epy7X3aj0VjVzGO3UmeoUyuh3tfXt7D5jOdGVhQhyzLu378PjqcTA522XJgDwN27d1c1bu7uzZ5MJpFIJFCr1RjqtO6hvnfv3vPpdBrVanXV4+l3797leDox0GlrGR8fv5DL5Txv6+rujx0KhXDw4MHzhw4dOh+JRDw3qgx1Wk2oHzp06GI0GvX8odLdHjaXy2F8fJxd78RAp61RnZfL5aHx8XFomubpB7gnWEmShMOHD7/h/vcXXnjhYiwWQ6VSYajTuob6/N7vl1RVXThdzQtN0zA+Po5yuTzEe44Y6LSpwxwAHjx4MOj1oBRBEGCaJmzbxsGDB8uLjkC9KAhC+dixYxfj8TgrdVr3UFcUZfTQoUOjjuN4XqPu7sHw4MGDQd5zxECnTW18fPxCoVCApmmeutodx4Gu69izZw/i8fhFPHkM5UKox2Ixhjqte6hHIpFLe/fuRaPR8DTz3XEcaJqGQqHArndioNPmrc6r1eqXHz9+vKqu9lqthq6uLvT09Jx/VqPqhno0GmWo07rr6uo6393dvapJmpqm4fHjx6hWq1/m/UYMdNpUYQ4ADx8+PGFZlueudl3XEQqFsH//frcqv/i8UOeYOm1ElQ4A+/btuxiNRlGv1z13vVuWhYcPH57g/UYMdNpUpqenPc9qd8fNAeDAgQPXRFEsPyfMP1Gpx+Nxhjqta6gLglA+cODAVZ/P52k8ffGs9+npaXa9EwOdNkd1bppm78TEBGRZ9rykR9d17N69G6FQ6M0VhPkTDevRo0c5UY7WPdQDgcDV3bt3o9FoeF6aKcsyJiYmYJpmL+81YqDThhsfHz9Xq9U8bSDjjpunUin09vae99KwiqLIiXK0Ibq7u893dHR46np3N5yp1WoYHx8/x6tJDHTa0Oq8Wq1+eWZmxtOsdndbV1VVsW/fPne9+UUPz4Oz32lDqnQA2Lt37yVVVT1tT+zOep+ZmeEEOWKg04ZX5ydM04TP52v5e931vLt378ai9eaeG9e1CvVbt24x1OmZ952iKKO7d+9Gs9n0tJTN5/PBNE2Mj4+f4OUkBjptSHWey+WGs9ms5+q8Xq8jlUqhs7PzfJue05qE+szMDEOdniudTp9Pp9Oeu941TUM2m0UulxvmPUYMdFrXMAeAycnJMABPJ6k1m03IsoyBgYGrbhgz1GmrVukAMDAw8Iaqqmg2m603xPPvIfc9xXuMGOi0bubm5la1I5xhGOjr64Pf77/axjBnqNOGhbqqqu/19/ej0Wi0/M2Ld5Cbm5vjMjZioNP6VedTU1OeKnP34JVYLOZ1VvuGhzonytGzdHd3n4/H49B13dP9JooipqamwPuLGOi0LjKZzIVisQhVVVv+Xtu24TgO+vv7y27wbrVQ50Q5etb9BgD9/f0TgiDAsqyWf4CqqigWi8hkMqzSiYFOa1+dz8zMQBTFlsPR3d61o6NjqYNXtlylzlCnpe63aDT6SkdHh6cqXRAEiKKImZkZVunUMsHL+Cft3EDPZrMXRkdHPR3AYlkWHMfBiy++eHWNxs6f+9wdxwlfv359uFAoIBgMYrX3frVaRWdnJw4dOnS+hd6Gl3fYPXN5J75PdF0//sEHH5wSBMHTkk5d1zE4OIhkMnl+nd8ntIVJvATUiunp6YVKopVAdMfO+/v7sQFh7lbqw8eOHbvYrlB3K3UAF+ZDfXi5v2t6evqn33333XOhUGjb3iO2bcO2bfzsz/7sb0aj0R1ZpWuaNtzV1XXq0aNHLd9nblU/PT2NZDLJRocY6NT+qqNQKJxzx85bDcJmswlN09DT03NpIxvajQ51RVFKN2/eRK1WQyKR8LQRyVaQz+ebqqoOnzx58uEOrdLR09NzaXZ2dqjRaECW5RV/n+M4C2PphULhXCwWA6t0YqBTW2UymV7btiGKYssVR6PRwJ49e6AoyugGN04LoX7jxo3hfD6/rqGeSCRGzp07983XX3/9G9s51AOBgHzz5k3505/+9IF4PL4jq3RZloe7urrw4MGDls85EEURtm0jk8n0zgc60fL3DS8BraQ6r9VqJ/P5vOfqPBAIoKur65XN0ti6p7S18zz1FU6UuxyPx++cPXv2m+7xmV6W/212qqqiXC7jRz/60T/Hzps3sKC7u/uVUCjU8tp0t0rP5/Oo1WonwclxxECndpmdnT3ZaDRanuDjVuednZ2QJGkCm6frcE3OU5+ZmcHo6OiyoR6Lxe6cPXv2m4FAAPl8ftuFuuM4iEQiuHnzpj+fzx/YoW+biz6fbyKdTns6M93n86HRaGB2dvYkWyBioFNbqnPbtsPZbBayLHuuztPp9KVN+LcthHoikWhbqGcymZYr9e0Y6m6V/td//df/aidX6el0+lIgEGh5S1jHcSDLMnK5HGzbDrNKJwY6rVo2mx2u1WotTexZXJ13dHRshrHz54b60aNHN6RS386h7lbpIyMj8k6u0mVZHk2n056OV5VlGdVqFdlslmFODHRavbm5OU8hZ5omVFVFOp1+Y7M3umvR/Z7JZFoK9UAgsO3G1Fmlf6yjo+MNTdNgmmbL3ysIAubm5tgQEQOdVmW4VqudLJVKUBTFU3WeTCahadpqzzpf11BPJBKoVqur/oGtVupnzpz5ZjAY3Fahzir943tL07T3ksmkpypdURSUSiVOjiMGOq1ONpv1NBnOtm34fD6k0+nRrdTwLu5+b8c2saFQaMeHOqv0hSp91OfztbxM0Z0cl81mOTmOGOjkXT6fhyRJLU+GMwwD0WgU4XD4ErbWphhupX7enSi3Wq2G+tmzZ7dVqDuOg2g0uuOr9HA4fCkajcIwjJavnyRJyOfzbJCIgU6eDBeLxXOVSqXlyXBuI7SFt628CABHjx5tW/d7K6Eei8UWKvXtMlFOURRW6QBSqZSnTYxkWUalUkGxWDwHdrsTA508VOe9lmW1HCimaSIQCCCZTL6yhf/8he73jQj17TZRbtG69J1cpSOZTL4SDAZbXsImiiIsy0I+n+9ly0QMdGq1AQ4Xi0XPa88TicRm20jGc6i73e8bUam73e8rrdRt20az2YSu66jVaqhUKk981Wo16LqOZrO57lvOapqGSqWyk6v0iz6fbyKRSLQ8291dk14sFuE4TpgtFC2Fx6fSUoZLpdLQjRs3BmVZbmlimOM4aDabOHr06GgkEtnw8fNGo3Eqm81+ShAECILwibLIsqxgLBa7HggEJgC8/azrAQDXr1+/kMvlEAwGV/28KpUKOjs7MTg4uNzRqy8XCoUDr7322jdqtRri8fgTQWyaJgzDWNhaVFEUaJoGVVWhaRokSfpE74lhGNB1Hbquo9FowHEcKIoCVVU9Da+0+mEPAH7pl37pz5LJ5Ae6rq/5uIzjONL8ENCIoigb3Ws0XC6Xh27cuDEoSdKWfm8RA522SKA/evTowtjYWMsHlzQaDYRCIbzwwgub4hznR48e/d7rr7/+G5qmLVnh1ut1dHZ24itf+crLwWBwU4f666+//o1qtYpQKIRyuQzbthEOh5FKpZBOp0upVOrDWCx2JxwOPw4EAjOyLJeeDoz5UIjU6/VEuVzeUywWB+bm5l7MZDLJubk5lEolAB8vuWt1qeJKiKKIRqOBRqOxbsMItm1D13WcOXPm8q5du4Y2w/vr+vXrF0qlElRVXXljLQioVqvYvXs3du3axXPS6RN42hotqVQqwefztdzdblkWNtPpWqIoNmVZhizLSwaIqqqYnp7GlStXLp8+ffrlYDD4pWeE+kUAw8eOHTvvhnooFFrVKW2hUAiZTAYALsyH+rNOabsci8VePn369DevXLnyjXq9jqNHj2JgYODtvr6+t6PR6EP3cSsJBUVRoCgKotEo+vr6gPnu70ql0vf48eOfe/jw4S+MjY1hbm4OqqoiFAq1fMLe88JVkqS2/byV/s75uSDmZrkvY7EYCoVCqz0N8Pl8Cx+6iBjotGz1UK/XT3rZ6tUd54vFYtc20x/k8/ng8/meWRGmUinMzc1tSKgvPnp1uVCPx+Mvf/WrX/0388/5w5WG+Apcdj9gDA4OPh4cHPxjwzAit2/f/tXr169/YWxsDKIoIhqNti2I13OSnyAILe+jsNbi8fi1iYmJE+5xxCslyzJqtRrq9fpJv98PVun0xPuKl4CWqM5PeukSbTabCAaDCIVCb26lhsa27YVQf/311y9Xq9VeAF96xsMvAsBGrVNPpVJfT6VSX58P4ctrcDkuA7isquorL7zwwv95+vTpodOnT1/es2cPcrkcSqUS5ucj8I3i3cVgMPhmKBRqeXKcO2RRKpW4yQwx0Gl55XLZ0/dZloVoNLol/2Y31LPZbEuhnkwm2zb7fYV7v6+nywAu7969+/tf+cpXhk6fPv3tZDKJTCazrmPg21U0GoVpmp4+HHl9jxIDnXYQ27bDXjaTccf3YrHY6Bb+25FKpZDL5VYc6kePHm1bqLew9/uGBPvAwMB/+rVf+7Whn//5n79Tr9eRz+fXtVK3LAuNRmNDltytUaCPyrLc8t/ibjIzf6QqEQOdljRcqVRO1ev1lsccTdN0u9vfwBYe17NtG8lksqVKvZ2h3kL3+4YF+4kTJ775ta997WJHRwcymQwcx1mTYHd/ZrlcRi6Xg2VZUBQFPp8P1WoVuVwOzWZzq/YUXAyHw5cCgUDL3e4+nw/1eh2VSuUUuGscMdDpWarV6qCXbkDTNBEOhyEIwpbvC/Raqbubz7TjQJdN2P3+RLAnEomRX/u1Xxv67Gc/i9nZ2bZ3wYuiCMMwkM1m0dvbi7/zd/7O26dPn7549uzZr58+ffo3v/KVr1z+3Oc+VzJNc917CtopHA63HOiCIMA0TVSr1UG2WLQYZ7nT04HuqWEWBAGhUGjbXAe3Uncnyp05c2azzn5/2j+af/5SrVZLG4YRdhxn4X2uqmre7/fnJEnS5//Tt1ZRrb/80ksvDaVSqX/+1ltvvRgKhRAIBFbdHS4IAur1OgzDwC/+4i/+9ac+9al/v+h3Avh4/HnXrl0vf/rTnx747ne/+9uTk5NIJpNbrit+/kOwpw887egRIgY6bVOO44Sr1aqno1IVRUE4HH5jO12PpyfKnT59+tfnP7Q8N9Rv3LhxIZvNrnrzGbf7vZVQf/fdd79x+/btHkmSUKvVYJrmQpe4e2qXqqqIRCKIxWL1dDr9P/T19f1lLBa77yHgLwPAZz7zGQSDwX/w3e9+9xccx0EwGFxVsJqmCV3X8bf+1t96+8iRI/8Xnj2b/3IkEnn57NmzX7ty5cqrk5OTn9hJb7MLhUJvKIpyyrKslt537rCD4zhhrjighfvit37rt3gVCPh4/fkXp6am9oqi2FLV0Gw2EQqF0NPTcxmbbPy8VCq9dPPmzc+3us3mog85cI8yvXfv3t89dOjQf1EUJQbg4RIPfwfAF9Pp9NVKpXKyWCyuerc1RVFQKBRQr9dPplKpqwC+OP97nuXT77777otzc3OYX6e88HcLggDLslCv15HL5TA+Pi7fuXOnb2Rk5GfHxsb+tq7re2KxWFKW5SMA3m/haX6YSqWEzs5O8aOPPhp0n7eXHgpBEJDP5/HZz362/tM//dPfxPJL8z4UBOGF7u7ue7du3fqZpYLRcRyYpokjR478t0gk8t1NdHu+I0nS3kKhcFLX9ZYC3e12TyQSDVmWe5e5J2iH4Bg6LajVaie9TDKyLGtbdbcvVaknk0l3TP0PK5XKHmzS2e/9/f3v/ON//I8vptNpVCoVKIoCSZIWvhRFgd/vRzgcRiKRQDweh8/nw6NHj/DWW28dffXVV3/7z//8z3+/UCj8a8x336+0Wj9w4MCf/fIv//L/V61WYRiGpw9QjUYDsVgMn/nMZ/4NVr7O/nJHR8eHR44cqVcqlS03nh4KhWBZVmsNtyii2WyiVqtxPTox0GnJQPdcVbVjb/OtEOr5fB5XrlxZ91BvYfb7t6LR6KMzZ85cDIfDKzp6VZIkRCIRdHR0AACuXbsmvfrqq1//z//5P//rRqPx9RaC/fLhw4f/+G/+zb95s1AotBxSwMd76/f29iIWi91p8Vsv79u37/9WFMXT791IwWDQc+9RrVZjw0UMdPokXddbblhs24YsywgEAle3+/XZ6Erdnf0+MjLS9lB3A0JRFHR0dEBVVbzzzjvhP/zDP/zX9+7d+6VWQv348eP/22c/+1lks9mW7yfLspBKpR56uT7xePxOMBhsedb4RgsEAle9rEcXBAG6rrPhIgY6faIxD3tZf25ZFjRNg9/vv4YdsK/04kp9o7rfZ2dnWwr1SCSy4lB3g12WZXR1daFer+PKlSu//Pbbb7td8CsK9pdeemlo165dKz7H/akegxo8bGsrSVLdy4FCG+xiIBC4qmlayz0L7np0no9ODHR6gmEYg41Gw3Ogb4f159s11E+fPt1Spb747wyHw0gmk3jnnXfCf/Inf/J/mKaprSDUL8+H+r+XZRn1er2lSr1Wq3Vi/gS4VtTr9USrk8s2C7/f7ynQG40GDMPgenRioNOCYV3XT3jZUMZxnIXZ1DvJVqzUvYS6u6VvV1cX7t69i8uXL/9uvV6PryTU0+n0X3/uc5972Mpxn4qiYGpqKunhkrw8OTn5xWq1CknaeqtxNU1ruWfBnemu6/oJcMc4YqDTogq917KslgNdFEUEAoEdec12Qvf74mBPp9OYmprCt7/97QvNZnNFlfrnP//539y1axeKxeKK7q1AIICJiQncu3fv77Zapd+6desLW/XAmEAg0PJr4i5DNAyjly0YMdBpgZfJNbZtQ5IkaJp2badet63Y/e411G3bRjqdxuTkJL7zne/87kq/7/Of//x3Lcta0aQv9zm9++67f9+2bWmFof7yj3/84//53r17iEQiW/I+0jTtmiRJnjbF4cQ4YqDTExqNhucZ7qqqvocdMCFuO4W6l+73xaF++/ZtfP/73//9lVTp+/fv/7N9+/atqEp3HAeRSASTk5N48803X3UD+3lhfufOnb//gx/84DNel39tAhdVVX3P60z3RqPBBowY6PRkoHtp3GVZhiRJEzv9+i0O9ddee23Th/rZs2c9V+oAkEql8N5770k3b948s4JQx6c//ek/EwRhRYHlOA7i8Thu376N//Af/sOlx48ff2k+1F9eFPAvG4Zx7i/+4i9+98033/y7six7GofeLCRJmlAUpeVAF0WRgU4MdPoJy7J6vewQZ9s2VFXlBXwq1AuFwqYP9Ugk4rn73d0T3u/34y/+4i++OD9J7rlV+t69e7+7a9culMvlFVfR7jG2V65c+R+//e1vX/rLv/zL33n//fdv/Nf/+l+/8b3vfe/Sq6+++gc//OEPk6FQCH6/f8ufke410JvNJizL4jg6MdAJME2zp9lseprhzkBfOtSLxSIuX77shjqWC/VUKtXWUL958+aaTpRzHAfhcBjZbBbvvPPOb6+kSj98+PBfuYfFtPI73C74d999t/Pq1atH3n777QPXr1+HZVlIJpPYgmvPl6SqqqeZ7s1mE6Zp9vDdRwx0QqPROGzbtqdZtrIs8wIuEeqhUAi6rkPX9Y5lHn4RAI4cOdLWUJ+bm1txpe411G3bRiKRwEcffSRNT09/dplQv3zgwIFvJ5NJGIbR0gcH92jeeDyOeDyORCKBaDTq+QCYzVyhe1llYts2Go3GYb7ziIFOw6Zp9nrZ/1oQhFWfJrYdCYKAcrmMwcFBpFKplawAWAj1jep+9xrqsixD13X8+Mc//vXlHuv3+3O7du1CtVoFj/xc+lp6uS6WZcE0zV5wLToDnZeATNMMu5VQK5WTKIqQZXmUV/CT1wYABgYGWjkffs2639cy1B3HQTQaxb1795DP5/cu9/iBgYH/JIritqqs2xjoo61eG/ece9M0uf0rMdAJng6zcAN9fob7RV7Fn2g2m4hEIujp6XkLwNuthnq7u9/XOtQVRUGpVMKtW7d+Bct0u/f29r4Ti8U4M3uJ116SpAmvH3a22oE0xECnNQz0VhsRd0tQn89X4hV8kq7r6OjoQDQave2lYXdDfat0vzuOA03T8ODBg13LPTYUCj1OpVLcDGUJkiRNeJngN1+h8wISA53g6fxoN9AlSZrkFfzkB6SOjo7Maqo1YGt1v/v9fszOziKTyfzUco9NpVJZBtAn+Xy+stcZ+1vtDHhioNMasW3b05I1URTh8/kmeAWfJAgCOjo6rqG17vZnVuobsaQtEok8Onv27DcjkQiy2eyyoe7z+VCr1TA1NfXZZZ7G5XQ6/ddbdc/1NQ50T13uK92whxjoxAr9uRU6ffLDkaqqiMViN5Z56D969913J8bGxv4jnj3uvGZL2lYS6uFwePLs2bPfjMViK6rUBUFAJpP577DMmvRoNHrHy/nfOyTUWaETA53Wt0IHAFZZn2SaJjRNQzgcXnb8fGRkpOdP//RPv1qpVHo2c6ifOXPmm9FodNlQl2UZhUJh2bNLw+HwBAO9fe8pVujEQKcnAt1Lhc5AX/paapoGTdOeO4beaDTCkiShWq3itdde+8ZWCPXlut8lSUK5XIZhGM9dQqVpWpaB/uxA91KhM9CJgU6rws1BPsmyLPj9fsiy/NzUrdfr8VqthnQ67e79vulD/ezZs9+MRqPPDHWfzwfDMFCv15+7O54kSXVN0xhCfE8RA53YiGzuCl2Slu11hmEYccuy4DjO4gNdvlEulzck1Fcy+325MXVBEGBZFhqNxrKbnHg9+5uIGOj0HK3uEkdtCX7Zve6LT2l7/fXXNyTUVzr7/Xnd7+6uZdwFjoiBTrRjCILQfLqy3wyVequz35fqfncchyf2EDHQaYPChVXVBlzzp6+7G+qlUqmlSr2jo2PDJsotDnW3x0EUxSZfYSIGOm0Ahnkb31CiuKJtOBVFWXJXMPdI0lYq9cOHD2+KSl0QBPh8Pqiqml/u95imyVUSRAx04geBzR3ouq7DNM3g8x7n9/tnVVVdcumWW6kXi8VN3/0eCoUWQj2TySAQCMDv9z830JvNpr9er3NjIr6niIFOaxFCreJmFkvz+XzQdR26rqef9zhVVcvhcPiZ1bzX7veNDPVgMAjTNKEoSvl5P1vX9aSu66zQn/G6c5MnYqDTqgKdm1m0N9DL5fLAco+NxWJms9l87vVNJBIoFotbItS/8pWv/Mnhw4eXPaynXC4P6Lq+ouV9OzHQvVT1DHRioNNCCHmp0LnT17MDvVgsHlvmod9Kp9P/bbkPUl7G1Dcq1Hfv3v0rP/MzP9ML4FvP+5mFQuGAYRgMoSVYluWpQufwBTHQyXOF7na5W5bVyyv4yRDOZDI/C+BLz3tcd3f3+4FAYNkPRou731977bVvlEqlXdics99X4uXZ2dkXOVa8ZJj3rubkQyLeBbSqCt2yrDCv4JNkWcbc3Fx6ucel0+kPOjo6UK/XV/QhIZFIuGPqwysJ9cOHD7c91G/cuLHqUJ+dnU2yu/2TTNPsYYVODHRaFUmSWm5E3EA3TZMV+lNUVcXc3Bwqlcqe5R67Z8+eR7qur+j6b4ZQz2azq6rUi8XiwOzsLDRN443yyQo94iXQBUHgfARioNNPAt1LhW7bthvow7yKP6EoCgqFAiYmJn4Bz+92/9ahQ4f+YyQSQaPRWNHP3iyVusdQf3lycvILpVIJsszN5J4ybJpmr9dZ7gx0YqCT2xiUW90tzg30ZrM5yCu49LV5+PDhryz32Hg8fn/fvn0oFosrbsi3cvf7w4cPf8G9RvSkZrM52Gqgu7vzSZJU5hUkBjpdlCRpwssYnOM4eN6yq53KcRwEg0E8evQI9Xp92bH0T33qU3+oaVpL13Irdr/Pzc29ODo6inA4zA1UltBoNDxdF5/PB0mSJtzXmRjotIMpijIiimLLa2Adx1lxV/FOo6oqstks7ty58w+xTLd7V1fX+y+88IK51JGkaxHqG7CkDQCgaVpO0zRUKhXOyl66Qm850G3bhiiKUBRlhFeQ+K4iSJI0Kcuyp6VrhmHwAj7j2kiShJGRkS+t4OHf+sIXvvCbyWQS5XK5pS7Xp0O9WCxuyJK2lXS/h0Khxy+//PL5aDS65CltO51hGJ6WrMmyDEmSJnkFie8ogs/nm5BlueUKXRRFVujPaWjD4TAePXqE+/fv/4NlqnT4/f783/gbf+Mv6/V6yxv2LA71K1eubFj3+wpC/XIoFHp89uzZ8886enWnB3qr18O2bciyDJ/PN8ErSHw3EYCPZ2Z7DXQuXXv29XEcBz/60Y++tpIq/ciRI68fP37cnJ2dbblSWxzqr7322ooq9Y0O9Xg8zlCfZ5pmb7PZ9BToiqLwzUYMdHoy0FvtchdFEc1mE4ZhHAeXri1ZpUejUdy7dw9379792nJVOoBv/fzP//xvHDx4EJlMxlPjnkgkUC6XceXKlU0f6mfOnGGoz18nwzCOewl0x3EY6MRApyd52ejDPftb1/UTvILPvkY+nw8//OEP/8FKv+fv/b2/9896enpWFepu9ztDfWvQdf2E1zPiuUkPMdDpCaqqTvh8Pk+zbGu1Gi/gMlX6o0eP8MMf/vBbK6nSZVnWf/VXf/V8d3c3MpnMqrrfVzpRjqG+sWq1mqdVJj6fD6qqcvycGOj0k0Zd07RrkiR5mumu6zqv4DIikQj+6q/+6mAmk/nCSkLd7/fnX3755X+2f/9+TE9Pt3wK1+Lud4b65lev1z3NcJckCZqmXQPXoBMDnRZV6KOKorQ8w9rn863ocJGdXqX7/X40m0289dZbvz3/n5cNdUmS9K9+9av/0xe+8IVyNptFuVz2tE6dY+qb/v4I67re8gErlmVBURSoqjrKdxkx0GlxpV32+/2eAl3XddRqtZPgxLjnhms8HsejR4/w1ltv/WCF3/YtAN/60pe+9C9Onz79//j9fkxPT6PZbHreJpahvukM1+v1E14D3e/3QxAEbvtKDHR6kqZpnme6zwc6LVOpJ5NJvP/++3jvvff+7Qqq9IVg37dv3/d+/dd//V984QtfKBuGgdnZWTQajZZOaWu1+z2dTqNSqWxIqCcSiR0T6rVa7aTXGe6cEEcMdFpSIBDwdGiG4zhtqeZ2Ap/Ph1gshj//8z//1MjIyG+0EuqKovzOz/3cz/2Lr33ta79z4sQJEwBmZ2dRKpVgmmbbQ31wcPB8Z2fnhoT66dOnd0ylXq1WPe3hLggCAoEA31T0k/blt37rt3gVCAC+CADZbHav21i0EuiCICCdTl8F8M5m+qNKpdJLN2/e/LyXM9/XiizLEAQBN27cONzZ2elLJpMFAA9X+O3va5r2/b17984eO3bsWjQaTdu2nS6XyyiXy6jX6zBNE7Ztw3EcOI4D27Zh2/bCmOvs7Cx+9KMffXFgYKAYjUa/84zf8w6AL6ZSqau6rp8sFAqrXu+sKAqKxSIqlcrJ+Xvli8+4Xz5UFGXPoUOH3rt3797JXC6HYDDo+UAXx3FgmiaOHDny3yKRyHc32/tuYmLiZLPZbKnL3d3Dvbe396osyw822/uOGOi0sd6RJGkwm81+sdFotDyeZ5omkslkSZKkvZupcdmMge5uBuI4Dj766KMXU6lUJJVKZVoIdQB4X5bl/9LT02MfPXr0/z106NBIV1eXLxaLJf1+v+weh+sex7nomE10dnYiGAxCluVUf3//v3vePeGGer1eP5nP57dkqG/iQB/Wdf34xMTEYVEUW7o/TdOEpmno6+v7j4Ig/K9svggAJF4CcgmCUA4Gg6hUKpBleeWfCucnxlUqlVOapr3HK7myCisYDEIQBHznO9859dJLL/V+5jOf+Vfz//fbLfyobwFALBZDLBYD5rvRTdPU6vV6wjCM+KLX11RVtRwIBDKiKJor/PkXAQwPDg6eB3BhZmYGoVBoVX97KBRCNpvF9evXLxw7duw8Pu5+X2rZ1eVQKPTymTNnvv7666//ztzcHFKpVMvrtTezcrl8qtFotDwWblmWe/9wQhwx0GlpwWDQU4PpOA7K5TJSqRQvYguhHggE4PP58L3vfe/E3NzcD1566aX/Hh+Pq7/t8cd+CwAkSUI4HEY4HG7HU30i1DOZDILB4Kp6KEKhEHK53IpCPRgMLoR6NptFMpncNqFeqVQ89Tq4HwiJFuOkOHo60Ee9bDAjSRLKZRYLXhpmRVHQ0dGB999/H3/0R3/0g1wu9ymsfLLcelmYKNeO2e+O4yAYDCKXy61oolwwGJw5c+bM1xOJBObm5rbFRDnHccLlchmSJLV87SRJQjAY5PpzYqDTsxvtUCj0hpf16JIkoVaroVwuD4Hr0VtuoOcnFWJ2dhavvvrqv7127drvz4f6Zgr2DZ397oZ6MpncDrPfhyuVyqlqtdpyoLvrz0Oh0BvgDnHEQKdn3hCiWA6FQmg2m61+H5rNJorF4iCvovdgj8fj8Pv9+P73v3/0j/7oj37w8OHDX9lkwf5EqK/35jPbqVIvFAqDrW7pCwDNZhOhUAiiKLJLjBjo9Hxexl3dbsBiscgLuApuF3w6nUY2m8WVK1f+4Z/+6Z/+YGxs7NQmCva2dr8vDvXr16+3VKlv5VAvFostryZZzXuUGOi0A0UikauKorQ88UiSJFQqFVSr1S+D3e6rqtQdx0EkEkEikcCDBw9w5cqV37hy5coPPvroo39pGMZahvuXAHxpdnb2X87Nzf3L5/yOtne/L54ot9JQT6VSWzHUhyuVyper1WpLq0kWf+CLRCJX+U6hT7TBvAT0dEPt9/sRCAROlkolqKq68k+HogjDMJDP508Eg8E3eSlXH+yCICAej8O2bUxOTuLBgwcvJZPJl3bv3o2BgYE3+vr69oRCoQfz3+J1ZvyX5ivGg+Pj46cePnz40q1bt6BpGs6cOfNP4/H4s372hs9+P3369NevXLmy5Za0FQqFE81ms+Xx82aziUgkAr/ffxUcPycGOq2wSkc+n1/YlKSVUC8UCujr6+NFbHOwu8vQGo0GPvjgA3zwwQenIpHIqVQqhXQ6nUmlUtei0ejtcDh82+/3Z2RZLjw9Pus4DprNZqxWq/WVy+WBQqFwdG5u7qczmUxsbm5u4US3cDiMSqWCK1eu/N6ZM2f+6fwa92VDfbXr1BfPfm91SdtWCvV8Pt9yd7sgCLAsC5FIhG8KYqDTysVisdGJiYlBd6exlVIUBZVKBeVyeWh+nI9VRJspirKwY1uz2cT4+Dju3buXFgThbyuKAk3ToGkaVFVdqADdD2amaULXdRiGAV3X0Wg0Fn6mqqpIJBILvycejyOfz+O11177vbNnz65bqANoKdQDgcBWCvXhUqk01OrmTcDH3e2SJCEWi3G5Gi1dUPES0FINdDgcfiMQCCx76MdSVYRpmsjlcpztvg5kWUYoFEIikViYIW/bNsrlMjKZDB4/fozHjx9jfHwcjx8/RiaTQaVSgW3b8Pv9iMfjiMfjCAaDn+j+dY98rdVqeO21136vUCgcwzqOqS8OdTcMn/HQy4FAYMuMqedyOU+z203TRCAQQDgc5nI1YqBTS8FcjkajLZ297ZIkCblcDpZl9YKT49b3DS2KkGUZmqYhEAggFAo98RUIBKBpGmRZXlHouaFerVY3PNQdxwlv8VAfNk2zN5fLtVydC4KAZrOJaDTK7V6JgU6ti8fjEz6fr+XuS1mWUa1Wkc1mz/Eqbn3u0atupZ7P5zck1G/cuDG81UM9m82eq9VqLU+Gs20bPp8P8Xh8gnckMdCpVRej0egrXjaZcSuKubk5XsVtFOpupf76669vWKV+48YNN8yXDfWOjo5NF+rZbNbTqX/uZjLRaPQVsLudGOjksUqHaZotN0KqqqJYLHIr2G1YqVerVfzxH//xulfqi5e0raRSP3369Gaq1IfL5fJQsVhsaSmo++HYNE3MLx8keibOcqfnSiaTVycnJ09altVSoyiKIizLwuzs7OBG7mplmmYwn8/D7/dviwM9NkUVIIqYnJzEH/zBH/ze0NDQ7+/evfvt54R625e05fN53LhxY/jo0aMXBUF47uz3s2fP/i+vvfba/37r1q1Ss9n0b+R1y2Qyg5ZlQVXVlpaCWpYFRVGQTCa5mQw9/8Ofl6P7aEcZHhkZuZDL5Tyd2SwIAl544YU35s9JX/euwnK5/LVbt279E0mSqoIgNPlyti3UG/l8/lPxePzHL7zwwi8udw8BwOjo6Ko3n3Er1kqlgng8jmPHjl2cnyT2rHvr5UKhcGB0dPTlz33uc3s26j2k6/rxDz/88BSAltef67qORCKBw4cPnwe724mBTqtpjGZnZy/cunULfn9rBY4gCKhWqxgYGEB/fz8box1+H21gqG/43/7o0aMLY2NjCAaDLR9NXK/XcejQIXR0dPA9RM//oM1LQMtJJpMXg8Fgy5PjHMeBoijIZDJoNpuD4Fj6TtbWU9rcbWLd7vdlxtQ3NMwbjcbg7OwsFEVpOcybzSaCwSCSySSDnBjotPqGWBTFciKR8LQmXZZl1Go1ZDKZIV5K3ksAcOjQofPpdLptoT4/UW7Thnomkxmq1Wqe154nEgn3qFSGOjHQafU6OjquKooCy7JabnRlWUYmk+FGM7SmlfomDPVh0zR7Z2ZmPFXn7mS4jo4OToYjBjq1rxEOBAJX4/E4DMNouUp393efmpriRjP0RKXezlAvFAqbrvt9enr6nNfq3DAMxONxBAIBnqxGDHRqr3Q6PSGKYss7x7lV+vT0NMfSac1C3V3Stkkq9eFGozE4NTXlqTq3bRuiKKKzs5M7wxEDndrfAMdisVei0ajnKr1er2NycpJj6bSmoV4oFDZFqE9OTg7puu65Oo9Go9wZjhjotHa6uroWGs9WG1tVVTE9PQ1d14+zSqdtHOrD9Xr95MzMTMubyCx+b7nvNSIGOq2JZDJ5PhKJeKrSJUlCo9HA+Pj4KV5J2s6hPj4+frLZbLZ8CItbnUciESSTyfO8NYiBTmva8HZ2dsK2bU+Vh6ZpmJ2dRbFYPMcqnbZhqA/n8/nh2dlZaJrm6T1i2zY6OzufuC5EDHRaE+l0+rw7lt4qn88Hx3EwPj7e6zaAvKL0dKh3dXVtxVAfnq/Ow4IgeDo7wB07T6fTrM6JgU7r0+h2d3e3PNt9cZWez+cxNTV1gZeTlrq/Dh48uCUr9YmJiQuFQsHT2Dnw8ez27u5uVufEQKf1k0qlzsdiMei67ul8Z0VRMD4+DsMwOEGOnlmpb6FQH67X6ycfP37c8vGowMdj57quIxaLIZVKsTonBjqtb4Pb09NTdquKVsmyDMMw8PDhQ3eCHEOdtmqoDwPA2NjYyWaz2fIytcXvIfc9xeqcGOi0rg1uIpG4mEwmPVXpjuPA7/cjk8kgk8mw6522dKjPzMxcmJ2dhd/vb7mr3a3Ok8kkEonERYY5MdBpQ/T391+TJKnlPd4BQBRFyLKMsbExNBoN7iBHzw31TTpRbtgwjONjY2OQZdnT8JNlWZAkCf39/df4chMDnTassQ0Gg292dnZ6rtIVRYFhGLh//767gxxDnZYM9YMHD262UB8GgHv37p0yDMPTFq9udd7Z2YlgMPgmq3NioNNGV+mvBAIBNBoNz13vs7OznPVOGxbqtm17CvWJiYkLc3NzCAQCnsK80WggEAigv7//Fb7ExECnDW9oJUma6O3tRbPZ9LRURxAEKIqCsbEx1Gq1k6zSaT1DPZ/PezmlbbhSqXx5bGwMqqp66mp3HAfNZhO9vb2QJGmC1Tkx0GlT6OrqOp9IJFCv1z1V6bIsw7Is3Llz5+QmO9OatnmoezhPfdi27fCdO3dOAB+v2PBSndfrdSQSCXR1dXGZGjHQaXM1sgMDA9d8Ph9M0/TUsPr9fhSLRdy7d89tUBnqtG6hXigU8NFHHy0X6sMAcPfu3eFKpeJpe1cAME0TPp8PAwMD1xb/TUQMdNoUjWwwGHyzr68Puq57blgDgQCmpqYwPT3N8XRa11APBoMoFovLVuqTk5MXpqenPY2bu3RdR19fHyfCEQOdNq/+/v5V7SAniiIURcH9+/dRKpWGWKXTeof6c2a/D+fz+eEHDx5A0zRP9/fiHeH6+/vZ1U4MdNrcDeyePXtGBUHw3PXurue9devWINen00aE+hJj6sOGYRy/fft2WBRFSJLkuatdEATs2bNndPHzJ2Kg06ZsYMPh8KX+/v5Vdb2rqgrDMDAyMjLESXK03qG+eEzd/e8jIyOnTNP0fPAK8HFXe39/P8Lh8CWGObWb4PXGJHqOYQC4fv36hUKh4HmsURAEVCoVpNNpDA4OnmdFQyu5727fvn1henoawWBwdY2jIKBWq6GjowOCICCTyazqXq7VaojFYjh27BjvZWKFTlurYtq/f/8bsix72nDGrZSCwSAymQzu379/YXGjTbQelXogEEAul0M2m11VmDcaDciyjP3797/BMCcGOm25xlXTtPf27t2LZrPp6UQ2VyAQwOPHj/H48WOGOq17qCuK4mlbV5dt22g2m9i7dy80TXuPYU4MdNqSOjo6zvf09KBWq3mq0oGPZ777/X7cv39/8fawDHVaUahXKpUNeyJuV3tPTw86Ojo4q50Y6LS1G9Z9+/adj8VinkPdcRz4fD5omoa7d+8uPm6VoU7Lhnp3d/eqK/XVhHksFsO+ffs4bk4MdNo2Deuqx9MlSYKiKLh16xZmZ2cZ6tRSpb6eob543PzgwYMcNycGOm2fhlXTtPcOHjxYNk1zYS2ul1CXZRmKomB0dJShTi2H+np0v7t7MJimiYMHD5Y5bk4MdNp2DWs8Hr+4Z88e6LrueZIcQ51WE+o9PT1rHuq2bUPXdezZswfxePwiw5wY6LQt9fb2LkyS88oNdVVVMTIywolytOJQP3DgwPnu7u41DXV3Elxvby8nwREDnbZ3o7p///7zyWRyVTPf3TF1TdNw584dLmmjlir17u7uVX2oXIo7CS6ZTGL//v2cBEcMdNoZjerhw4cvhkKhtoS6u6SNm89QK6He398PwzDaGuahUAiHDx++yDAnBjrtmEZVFMXy0aNHL6mqinq9vqpQF0VxYfOZkZGRC9z7nVbC6+TMpcK8Xq9DVVUcPXr0kiiKZYY5bQTu5U4babhWq5388MMPT7oHsqz2fqxWq4hEIjhy5MglRVFG2bDS0/ecYRjHb9y4capWq63qTHM3zA3DgCAIePHFF68GAoGrvOeIgU47toEtl8tDH3300aB7FvpqG9harQZZlnH48OHRSCRyye0V4KXe2fcZABSLxXMjIyO9lmXB7/ev+l5rNBqwbRsvvPDCKE9QIwY6ETBcLBbPXb9+vdfn87Ul1A3DgGVZ2L9/P7q6ujhBiWGOycnJC/fu3VtY9tiOMLcsC8eOHZuIRqOv8P4iBjrRfKObz+eHb968GW5XqJumiXq9jp6eHuzfv/+iIAgc29yB95Vt2+E7d+4Mz8zMwO/3w+fztS3Mjxw5UuZac2KgEy3R+OZyueGbN2+G3W1e23F/VqtVhEIhHDp06FowGHyT1frOqcorlcqXb926dcIdL191gzkf5qZp4siRI+VEIsEwJwY60XKVuiiKbZkoJwgCdF2H4zjYu3cvuru72QW/A8J8YmLiwsOHDyEIAjRNa8t9ZBgGbNtmZU4MdKKVNsjFYvHcjRs3egVBaFuom6YJXdeRSqWwf/9+dxY8g32bBblhGMfv3r17KpvNQtM0SJLUtjB3HAdHjx7lmDkx0IlaaZwrlcqXr1+/fqIdM5IXq9frkCQJe/fuRTqdZrW+jcJ8ZmbmwoMHD2CaJvx+f3sayfl15j6fD8eOHbsWCoXe5P1CDHSiFhtpXdePX79+/ZSu66teM7y4gW42mzAMAx0dHdi7d+8bqqq+x2DfukGu6/rxe/funcpms1BVFbIst+1eqdVq0DQNx44de4MnpxEDnWgVDXaz2Ry8cePGUKlUQjAYbOsPdyuv3bt3o6enh9X6Frs3HMcJP378ePjx48ewbRuaprX1F7gbFR09evSSLMvcqIgY6ETtaLhHR0eHM5kMgsEgRFFsWwXmjq1HIhHs2bPHHR9lsG/yqjyfzw8/fPgwXC6X2zZW7t4Ttm2jWq0inU5jcHCQSx6JgU7U7kb84cOHF8bGxuD3+9vWgLvcGcypVAq7d+++6vf7rzLYN989UKvVTo6NjZ2cm5uDJEltmTT59Ae8er2O3bt3Y2BggL02xEAnWqsGfWZm5sKdO3fg8/na3pg7jrPQDd/V1YW+vj63q5WN+ga/7oZhHH/8+PGpmZkZ2LYNv9+/8Jq16/V3dxg8cOAAOjs7GebEQCda68a9XC4PjYyMDBqG0ZYNQ55u2C3Lgq7rUBQF3d3d6OnpeUWSpAk28Ov/WjebzcHJycmh6elpNBoNaJq26t3ellKr1aCqKg4fPuzuy87XmhjoROvR2Jum2Ts6Onoum80iEAi0vZF3u18Nw4Cmaejs7ER3dzcr9nUK8kajMTg1NTU0MzMDwzCgqmrbh1ncD2+1Wg3JZBKDg4PuBze+tsRAJ1rvhv/Ro0cXxsbG2j6eurjRd5e5aZqGdDqNrq4udwkTg73Nr2e9Xj85PT19MpPJoNForEmQu6+rYRgwTRO7d+/Grl272MVODHSijQ6BQqFw7vbt271r0QW/VMUuSRKSySQ6OzsXz4pnGHh8/YCPjzadnp7uzeVyME1zzYLc5XaxHzx4cCIWi3FlAzHQiTZLMJim2Xvnzp1zs7Ozbd1cZKlgtywLhmFAEAREIhF0dHQglUpxnL3FIG82m4Nzc3NDs7OzKJVKAABVVddkjNx97RZvKnTgwAF2sRMDnWizhsTMzMyFe/fuLcyEXmvu6VuapiGRSCCZTE5Eo9FL82uXGe5PvT6O44QLhcI/yWaz4Xw+D13X4Z6ut9bq9TpEUcS+ffs4i50Y6ERbITQWH9CxltX6YpZlodFoQBAEBINBxGIxJBKJ0UgkcmnRwy7uxNfDcZxwuVw+lcvlBguFAqrVKhzHgaIo8Pl8a9vILarKk8kk9u/fz61+iYFOtBWr9YcPH6LRaMDv97dth7nlNJtNNJtN+Hw+BINBRKNRRKPRcjQa/QNRFMvbOOCHF33A6S2VSkOFQiFcLBZRq9VgWRYURYEkSWvfuM3v+Fav16EoCgYGBliVEwOdaCuHS6PRGHz48OHQzMwMfD5fW87GXinHcWCaJprNJkRRhN/vRygUQiQSQTgcvhYIBK4u6prfikEzvOhvDVer1ZPlcvlEuVxGuVxeOIdekiTIsrx+DZsgQNd1WJaFzs5ODAwM8LhcYqATbZdgLxQK5x48eNBbLpfXrRv+aaZpwjTNhZDz+/0IBoMIhUIIBAKjgUDg6qKJdZst5Ief+lt6a7XayWq1OlitVlGpVKDrOkzThCAIkCRpXSrxp4Pc7V4Ph8PYs2cPZ7ATA51ouwb7xMTEhcePH6/prmOtVO+WZcFxHPh8PiiKAr/fv/CladqEqqqjmqZde6qSX4vAH17qP9q2HTYM44RhGIP1er1X13XUajXouo5GowHLsiAIAnw+HyRJgiAI69+QPbW7X19fH3p7e9m9Tgx0ou0e6s1mc/DRo0dD7r7gmqat2/j68wLetm2YpgnbtiEIAkRRXOiuVhRloWdh0deEJEkTPp9vwufzlUVRLIuiWHpO+Lu/K2zbdsS27bBlWWHLsnqbzWavZVm9jUZjYQ6AYRhw/919Xm6ASpIEURQ3JMAXB7lt29B1HaIoorOzE7t27eJufsRAJ9ppwV6r1U6Oj4+fnJubA/DxGuiNDKhnVMhPfC0OM7cydsPf5/MthOyz/g7HcRY+PLi9A4v/eXGbIIriE1+bieM4MAwDAJBKpdDf3381EAjwhDxioBPt5GCvVCpfHh8fP5HL5RaCfaMr9pWGmvsc3X9e/O/PqmoXfyB4+t83dYM1X5G7QZ5IJNDf338tFAq9ySAnBjoDnWgh2Mvl8tDExMRgLpeDbdtrumsZtRbk7u58oigikUigt7eXp6IRMdCJlq/Yp6amTuRyOTQajXVbO02fZJomGo0GZFlGMplEd3c3K3IiBjpRa8Gu6/rx6enpU9lsFrVabWGC2mbvmt7qHMdZmIgXCASQTCZ5wh0RA51o9cFuWVbv7Ozsubm5OZRKJdi2vS7blu407va5oigiEokglUqho6PjFZ/Px0NviBjoRO0LdgAolUpDc3Nzg/l8HvV6HYIgQFGUTTcLfKuwbRuNRgOO48Dv9yMejyOVSu30PfCJGOhE61m153K5c7lcDsViceFgFoZ7ayGuKAqi0SgSiQQSiQSrcSIGOtHGVe2NRmMwm80OFYtFlMvlhWVVsixzMt08d0974ONlgeFwGNFoFMlkcvE+6wxyIgY60eYJ90KhMFQsFhf2N7csC6IoQpblHVO927aNZrMJ27YXDsUJhUKIRqOIxWIMcSIGOtHWCXfbtsOlUmmoVCr1VioV1Go1GIYBx3EWtnXd6O1T22GpbWtVVUUgEHBPl5uIRCKXtvnRsUQMdKKdVL1XKpVTlUolXK1Woes6DMNY2HZ1pdu3bmRwL94q1g1vn88HVVXh9/vdEC+HQqE3WIUTMdCJdkTAW5bVW6vVTtbr9UH3BLPFp5gt3rvd3U/d3bd94U3cptBf3BbYtr0Q3E8/B/dUOE3ToGkaAoEA/H7/aCAQuLpoQhsDnIiBTrRzA34+TMO6rp+YP7I03Gg0YBjGwglo7pGri0O3HRZ/WHCPQnVPdVNV1T3trayq6jVN06491X3OACdioBPRSoJ+vooON5vN3mazOWiaZq9lWRHTNMOWZT0R8pZlPfcHP31C23yAl30+X0mSpAlZlkdlWZ54xjGsDG4iBjoRrXXorxLDmoiBTkRERBuF21kREREx0ImIiIiBTkRERAx0IiIiYqATEREx0ImIiIiBTkRERAx0IiIiYqATEREx0ImIiIiBTkRERAx0IiIiYqATEREx0ImIiIiBTkRERAx0IiIiYqATEREx0ImIiIiBTkRERAx0IiIiYqATEREx0ImIiIiBTkRERAx0IiIiYqATEREx0ImIiIiBTkRERAx0IiIiYqATEREx0ImIiIiBTkRERAx0IiIiYqATEREx0ImIiIiBTkRERAx0IiIiYqATEREx0ImIiIiBTkRERAx0IiIiYqATEREx0ImIiIiBTkRERAx0IiIiYqATERERA52IiIiBTkRERAx0IiIiYqATERERA52IiIiBTkRERAx0IiIiYqATERERA52IiIiBTkRERAx0IiIiYqATERERA52IiGi7+v8HAFqLuvQmDWEbAAAAAElFTkSuQmCC";
                    }
                    //Set the Default image, if given. Otherwise, set the hardcoded "Not Found" one
                    $scope.setNotFoundImage = function () {
                        if ($scope.setDefaultFoundImage() === false) {
                            $scope.setImage(getNotFoundImageData());
                        }
                    };
                    $scope.showFullSize = function () {
                        if ($scope.fullSizeData == null) {
                            $scope.download(false, function (data) {
                                $scope.fullSizeData = data;
                                $scope.showFullSize();
                            });
                        }
                        else {
                            var $fullImg = $("<img src='data:image/jpeg;base64," + $scope.fullSizeData + "' style='max-width: 100%; max-height: 100%; position: relative; top: 50%; transform: translateY(-50%);'/>").appendTo("body");
                            window._popUpManager.showCustomPopUp({
                                name: $element.attr("jb-id"),
                                title: $element.attr("title"),
                                width: "85%",
                                height: "85%",
                                destroyOnHide: true,
                                $elementContent: $fullImg,
                                cancelButton: true,
                                onShowCallback: function ($popUp) {
                                    $popUp.find("[jb-type='ModalBody']").css("text-align", "center");
                                },
                                dismissible: true
                            });
                        }
                    };
                    $scope.afterInit = function () {
                        if ($scope.canUpload == true) {
                            $scope.createUploadButton();
                        }
                        if ($scope.maximizeOnClick == true) {
                            $element.on("click", function () {
                                $scope.showFullSize();
                            });
                        }
                    };
                    $scope.init = function () {
                        if ($scope.fromServer == true) {
                            $scope.setNotFoundImage();
                            var hasFolder = $scope.imageFolder != null && $scope.imageFolder.trim() != "";
                            var hasModel = $scope.model != null && $scope.model.trim != null && $scope.model.trim() != "";
                            //If serving from FileSystem, lets get the image's URL and get on with it
                            if ($scope.imageType == "filesystem" && hasModel === true && hasFolder === true) {
                                var folder = $scope.imageFolder;
                                var defaultPath = $element.attr("data-default-image") || "";
                                $element.attr("src", "" + window._context.siteRoot + window._context.currentController + "/DownloadFileByPath?path=" + folder + $scope.model + "&defaultPath=" + defaultPath);
                            }
                            else {
                                var initInterval = setInterval(function () {
                                    if (Joove.Common.parentGridsAreReady($element) === true) {
                                        clearInterval(initInterval);
                                        new Joove.ElementViewPortObserver({
                                            $element: $element,
                                            interval: 1000,
                                            stopWhenEnters: true,
                                            onEnter: function () {
                                                $scope.download(true, function (data) {
                                                    $scope.setImage(data);
                                                });
                                            }
                                        }).start();
                                    }
                                }, 100);
                            }
                        }
                        $scope.afterInit();
                    };
                    $scope.init();
                    Joove.Common.markDirectiveScopeAsReady($element);
                }
            };
        }
        angular
            .module("jbImage", [])
            .provider("jbImage", new JbImage())
            .directive("jbImage", ["$timeout", "$interval", "jbImage", jbImage]);
    })(Widgets = Joove.Widgets || (Joove.Widgets = {}));
})(Joove || (Joove = {}));
;
//////////////////////////////////////////////////////////////////////////////////////////////
//  Use this javascript file to add custom functionality to your form.                      //
//  Please read the zAppDev JS Developer Api documentation for more info and code samples.  //
//  Documentation can be found at: http://community.zappdev.com/Content/ApiReference.html   //
//////////////////////////////////////////////////////////////////////////////////////////////

function handleMenu () {
    const symbiosisPages = new Set([
        "Explorer", 
        "MaterialList", 
        "MaterialForm", 
        "ProcessList", 
        "ProcessForm", 
        "ManageResources",
        "KnowledgeBaseExplorer",
    ]);
    
    if (symbiosisPages.has(window._context.currentController)) 
    {
        $('[jb-id="Matchmaking"] a').css({'border-color': 'transparent'})
    } 
    else 
    {
        console.log("Symbiosis");   
        $('[jb-id="Symbiosis"] a').css({'border-color': 'transparent'})
    }
}

function handleOwl () {
    $elem = $(".owl-carousel");

    $elem.owlCarousel({
        items: $elem.data("col_lg"),
        margin: $elem.data("item_space"),
        loop: $elem.data("loop"),
        autoplay: $elem.data("autoplay"),
        smartSpeed: $elem.data("smartspeed"),
        dots: $elem.data("dots"),
        nav: $elem.data("nav"),
        navText: ["<span class='prev'><i class='fa fa-long-arrow-left'></i></span>", "<span class='next'><i class='fa fa-long-arrow-right'></i></span>"],
        responsive: {
            0: {
                items: $elem.data("col_xs"),
                nav: false,
                dots: false,
            },
            768: {
                items: $elem.data("col_sm"),
                nav: false,
                dots: false,
            },
            992: {
                items: $elem.data("col_md"),
            },
            1200: {
                items: $elem.data("col_lg"),
            }
        }
    });
}

function killFlickering () {
  $("[jb-type='MenuItemsContainer']:not(:has(*))").addClass("empty-submenu");
  var failSafe = 9999;
  var counter = 0;
  while ($(".empty-submenu").length > 0) {
    $(".empty-submenu").parent().remove();
    $("[jb-type='MenuItemsContainer']:not(:has(*))").addClass("empty-submenu");
    counter++;
    if (counter > failSafe) {
      console.error("Too many recursions for hiding Empty Sub Menus...");
      break;
    }
  }
}


$onFormLoaded = function() {
    handleMenu();
    handleOwl ();
    killFlickering ();
}
    
$formExtend = function() {
    console.log("Form extension code executed!");
};
// Copyright (c) . All rights reserved.
// Licensed under the . See LICENSE file in the project root for full license information.
// This was autogenerated by zAppDev.
var DigicircMatchmaking;
(function (DigicircMatchmaking) {
    var Services;
    (function (Services) {
        /**
         * Client for 'ActorAPI' Service
         */
        var ActorAPIServiceClient = /** @class */ (function () {
            function ActorAPIServiceClient() {
            }
            /**
            *
            */
            ActorAPIServiceClient.AddResource = function (product, id) {
                var _data = { product: product, id: id };
                return axios.post(window._context.siteRoot + ActorAPIServiceClient.baseUrl + "addResource", _data);
            };
            /**
             * Base url for 'ActorAPI' Service
             */
            ActorAPIServiceClient.baseUrl = "api/ActorAPI/";
            return ActorAPIServiceClient;
        }());
        Services.ActorAPIServiceClient = ActorAPIServiceClient;
    })(Services = DigicircMatchmaking.Services || (DigicircMatchmaking.Services = {}));
})(DigicircMatchmaking || (DigicircMatchmaking = {}));
// Create service shortcut
if (window.$api == null) {
    window.$api = {};
}
window.$api.ActorAPI = DigicircMatchmaking.Services.ActorAPIServiceClient;
;
