{"version":3,"file":"pages/advanced-search.js","sources":["webpack:///webpack/bootstrap","webpack:///./node_modules/expressive-annotations-validate/dist/expressive.annotations.validate.js","webpack:///./wwwroot/scripts/pages/advanced-search.js"],"sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t\"pages/advanced-search\": 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/dist/\";\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([\"./wwwroot/scripts/pages/advanced-search.js\",\"common\"]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","/* expressive.annotations.validate.js - v2.7.4\r\n * Client-side component of ExpressiveAnnotations - annotation-based conditional validation library.\r\n * https://github.com/jwaliszko/ExpressiveAnnotations\r\n *\r\n * Copyright (c) 2014 Jarosław Waliszko\r\n * Licensed MIT: http://opensource.org/licenses/MIT */\r\n\r\n(function($, window) {\r\n    'use strict';\r\nvar\r\n    backup = window.ea, // map over the ea in case of overwrite\r\n    buffer = window.console,\r\n\r\n    api = { // to be accessed from outer scope\r\n        settings: {\r\n            debug: false, // outputs debug messages to the web console (should be disabled in release code not to introduce redundant overhead)\r\n            optimize: true, // if flag is on, requirement expression is not needlessly evaluated for non-empty fields (otherwise, it is evaluated\r\n                            // and such an evaluation result is provided to the eavalid event)\r\n            enumsAsNumbers: true, // specifies whether values of enum types are internally treated as integral numerics or string identifiers (should be consistent\r\n                                  // with the way of how input fields values are stored in HTML)\r\n            registerAllMethods: false, // specifies whether all of the built-in and custom methods are to be registered within the model context (excluding these\r\n                                       // having naming conflicts with the field identifiers), or the essential ones only (actually used in the expression)\r\n            dependencyTriggers: 'change keyup', // a string containing one or more space-separated DOM field event types (such as \"change\", \"keyup\" or custom event\r\n                                                // names) for which fields directly dependent on referenced DOM field are validated - for this feature to be off\r\n                                                // entirely, initialize with empty string, null or undefined (validation will be fired on form submit attempt only)\r\n\r\n            apply: function(options) { // alternative way of settings setup (recommended), crucial to invoke e.g. for new set of dependency triggers to be re-bound\r\n                function verifySetup() {\r\n                    if (!typeHelper.isBool(api.settings.debug)) {\r\n                        throw 'EA settings error: debug value must be a boolean (true or false)';\r\n                    }\r\n                    if (!typeHelper.isBool(api.settings.optimize)) {\r\n                        throw 'EA settings error: optimize value must be a boolean (true or false)';\r\n                    }\r\n                    if (!typeHelper.isBool(api.settings.enumsAsNumbers)) {\r\n                        throw 'EA settings error: enumsAsNumbers value must be a boolean (true or false)';\r\n                    }\r\n                    if (!typeHelper.isBool(api.settings.registerAllMethods)) {\r\n                        throw 'EA settings error: registerAllMethods value must be a boolean (true or false)';\r\n                    }\r\n                    if (!typeHelper.isString(api.settings.dependencyTriggers)\r\n                        && api.settings.dependencyTriggers !== null && api.settings.dependencyTriggers !== undefined) {\r\n                        throw 'EA settings error: dependencyTriggers value must be a string (multiple event types can be bound at once by including each one separated by a space), null or undefined';\r\n                    }\r\n                }\r\n                function extend(target, source) { // custom implementation over jQuery.extend() because null/undefined merge is needed as well\r\n                    for (var key in source) {\r\n                        if (source.hasOwnProperty(key)) {\r\n                            target[key] = source[key];\r\n                        }\r\n                    }\r\n                }\r\n\r\n                extend(api.settings, options);\r\n                verifySetup();\r\n\r\n                $('form').each(function() {\r\n                    $(this).find('input, select, textarea').off('.expressive.annotations'); // remove all event handlers in the '.expressive.annotations' namespace\r\n                    validationHelper.bindFields(this, true);\r\n                });\r\n\r\n                logger.info(typeHelper.string.format(\"EA settings applied:\\n{0}\", options));\r\n            }\r\n        },\r\n        addMethod: function(name, func) {    // provide custom function to be accessible for expression\r\n            toolchain.addMethod(name, func); // parameters: name - method name\r\n        },                                   //             func - method body\r\n                                             // e.g. if server-side uses following attribute: [AssertThat(\"IsBloodType(BloodType)\")], where IsBloodType() is a custom method available at C# side,\r\n                                             // its client-side equivalent, mainly function of the same signature (name and the number of parameters), must be also provided, i.e.\r\n                                             // ea.addMethod('IsBloodType', function(group) {\r\n                                             //     return /^(A|B|AB|0)[\\+-]$/.test(group);\r\n                                             // });\r\n        addValueParser: function(name, func) {     // provide custom deserialization methods for values of these DOM fields, which are accordingly decorated with ValueParser attribute at the server-side\r\n            typeHelper.addValueParser(name, func); // parameters: name - parser name\r\n        },                                         //             func - parse logic\r\n                                                   // e.g. for objects when stored in non-json format or dates when stored in non-standard format (not proper for Date.parse(dateString)),\r\n                                                   // i.e. suppose DOM field date string is given in dd/mm/yyyy format:\r\n                                                   // ea.addValueParser('dateparser', function(value, field) { // parameters: value - raw data string extracted by default from DOM element\r\n                                                   //                                                          //             field - DOM element name for which parser was invoked\r\n                                                   //     var arr = value.split('/'); return new Date(arr[2], arr[1] - 1, arr[0]).getTime(); // return milliseconds since January 1, 1970, 00:00:00 UTC\r\n                                                   // });\r\n                                                   // multiple parsers can be registered at once when, separated by whitespace, are provided to name parameter, i.e. ea.addValueParser('p1 p2', ...\r\n                                                   // finally, if value parser is registered under the name of some type, e.g. datetime, int32, etc., all DOM fields of such a type are going to be deserialized using such a parser\r\n        noConflict: function() {\r\n            if (window.ea === this) {\r\n                window.ea = backup;\r\n            }\r\n            return this;\r\n        }\r\n    },\r\n\r\n    logger = {\r\n        info: function(message) {\r\n            if (api.settings.debug && buffer && typeof buffer.log === 'function') { // flush in debug mode only\r\n                buffer.log('[info] ' + logger.prep(message, new Date()));\r\n            }\r\n        },\r\n        warn: function(message) {\r\n            if (buffer && typeof buffer.warn === 'function') {\r\n                buffer.warn('[warn] ' + logger.prep(message, new Date()));\r\n            }\r\n        },\r\n        fail: function(message) {\r\n            if (buffer && typeof buffer.error === 'function') {\r\n                buffer.error('[fail] ' + logger.prep(message, new Date()));\r\n            }\r\n        },\r\n        prep: function(message, date) {\r\n            message = typeHelper.string.tryParse(message);\r\n            var lines = message.split('\\n');\r\n            var stamp = date !== undefined && date !== null ? '(' + typeHelper.datetime.stamp(date) + '): ' : '';\r\n            var fline = stamp + lines.shift();\r\n            return lines.length > 0\r\n                ? fline + '\\n' + typeHelper.string.indent(lines.join('\\n'), 19)\r\n                : fline;\r\n        }\r\n    },\r\n\r\n    toolchain = {\r\n        methods: {},\r\n        addMethod: function(name, func) { // add multiple function signatures to methods object (methods overloading, based only on numbers of arguments)\r\n            var old = this.methods[name];\r\n            this.methods[name] = function() {\r\n                if (func.length === arguments.length) {\r\n                    return func.apply(this, arguments);\r\n                }\r\n                if (typeof old === 'function') {\r\n                    return old.apply(this, arguments);\r\n                }\r\n                return func.apply(this, arguments); // no exact signature match, most likely variable number of arguments is accepted\r\n            };\r\n        },\r\n        registerMethods: function(model, essentialMethods, fieldName) {\r\n            var i, name, body;\r\n            this.initialize();\r\n            if (api.settings.registerAllMethods) {\r\n                for (name in this.methods) {\r\n                    if (this.methods.hasOwnProperty(name)) {\r\n                        if (model.hasOwnProperty(name)) {\r\n                            logger.warn(typeHelper.string.format('Field {0} - skipping {1}(...) method registration, naming conflict with the field identifier.', fieldName, name));\r\n                            continue;\r\n                        }\r\n                        body = this.methods[name];\r\n                        model[name] = body;\r\n                    }\r\n                }\r\n                return;\r\n            }\r\n\r\n            for (i = 0; i < essentialMethods.length; i++) {\r\n                name = essentialMethods[i];\r\n                if (this.methods.hasOwnProperty(name)) { // if not available, exception will be thrown later, during expression evaluation (not thrown here on purpose - too early, let the log to become more complete)\r\n                    body = this.methods[name];\r\n                    model[name] = body;\r\n                }\r\n            }\r\n        },\r\n        initialize: function() {\r\n            var that = this;\r\n            this.addMethod('Now', function() { // return milliseconds\r\n                return Date.now(); // now() is faster than new Date().getTime()\r\n            });\r\n            this.addMethod('Today', function() { // return milliseconds\r\n                return new Date(new Date().setHours(0, 0, 0, 0)).getTime();\r\n            });\r\n            this.addMethod('ToDate', function(dateString) { // return milliseconds\r\n                return Date.parse(dateString);\r\n            });\r\n            this.addMethod('Date', function(year, month, day) { // months are 1-based, return milliseconds\r\n                return new Date(new Date(year, month - 1, day).setFullYear(year)).getTime();\r\n            });\r\n            this.addMethod('Date', function(year, month, day, hour, minute, second) { // months are 1-based, return milliseconds\r\n                return new Date(new Date(year, month - 1, day, hour, minute, second).setFullYear(year)).getTime();\r\n            });\r\n            this.addMethod('TimeSpan', function(days, hours, minutes, seconds) { // return milliseconds\r\n                return seconds * 1e3 + minutes * 6e4 + hours * 36e5 + days * 864e5;\r\n            });\r\n            this.addMethod('Length', function(str) {\r\n                return str !== null && str !== undefined ? str.length : 0;\r\n            });\r\n            this.addMethod('Trim', function(str) {\r\n                return str !== null && str !== undefined ? $.trim(str) : null;\r\n            });\r\n            this.addMethod('Concat', function(strA, strB) {\r\n                return [strA, strB].join('');\r\n            });\r\n            this.addMethod('Concat', function(strA, strB, strC) {\r\n                return [strA, strB, strC].join('');\r\n            });\r\n            this.addMethod('CompareOrdinal', function(strA, strB) {\r\n                if (strA === strB) {\r\n                    return 0;\r\n                }\r\n                if (strA !== null && strB === null) {\r\n                    return 1;\r\n                }\r\n                if (strA === null && strB !== null) {\r\n                    return -1;\r\n                }\r\n                return strA > strB ? 1 : -1;\r\n            });\r\n            this.addMethod('CompareOrdinalIgnoreCase', function(strA, strB) {\r\n                strA = (strA !== null && strA !== undefined) ? strA.toLowerCase() : null;\r\n                strB = (strB !== null && strB !== undefined) ? strB.toLowerCase() : null;\r\n                return that.methods.CompareOrdinal(strA, strB);\r\n            });\r\n            this.addMethod('StartsWith', function(str, prefix) {\r\n                return str !== null && str !== undefined && prefix !== null && prefix !== undefined && str.slice(0, prefix.length) === prefix;\r\n            });\r\n            this.addMethod('StartsWithIgnoreCase', function(str, prefix) {\r\n                str = (str !== null && str !== undefined) ? str.toLowerCase() : null;\r\n                prefix = (prefix !== null && prefix !== undefined) ? prefix.toLowerCase() : null;\r\n                return that.methods.StartsWith(str, prefix);\r\n            });\r\n            this.addMethod('EndsWith', function(str, suffix) {\r\n                return str !== null && str !== undefined && suffix !== null && suffix !== undefined && str.slice(-suffix.length) === suffix;\r\n            });\r\n            this.addMethod('EndsWithIgnoreCase', function(str, suffix) {\r\n                str = (str !== null && str !== undefined) ? str.toLowerCase() : null;\r\n                suffix = (suffix !== null && suffix !== undefined) ? suffix.toLowerCase() : null;\r\n                return that.methods.EndsWith(str, suffix);\r\n            });\r\n            this.addMethod('Contains', function(str, substr) {\r\n                return str !== null && str !== undefined && substr !== null && substr !== undefined && str.indexOf(substr) > -1;\r\n            });\r\n            this.addMethod('ContainsIgnoreCase', function(str, substr) {\r\n                str = (str !== null && str !== undefined) ? str.toLowerCase() : null;\r\n                substr = (substr !== null && substr !== undefined) ? substr.toLowerCase() : null;\r\n                return that.methods.Contains(str, substr);\r\n            });\r\n            this.addMethod('IsNullOrWhiteSpace', function(str) {\r\n                return str === null || !/\\S/.test(str);\r\n            });\r\n            this.addMethod('IsDigitChain', function(str) {\r\n                return /^[0-9]+$/.test(str);\r\n            });\r\n            this.addMethod('IsNumber', function(str) {\r\n                return /^[+-]?(?:(?:[0-9]+)|(?:[0-9]+[eE][+-]?[0-9]+)|(?:[0-9]*\\.[0-9]+(?:[eE][+-]?[0-9]+)?))$/.test(str);\r\n            });\r\n            this.addMethod('IsEmail', function(str) {\r\n                // taken from HTML5 specification: http://www.w3.org/TR/html5/forms.html#e-mail-state-(type=email)\r\n                return /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(str);\r\n            });\r\n            this.addMethod('IsPhone', function(str) {\r\n                // taken from PhoneAttribute implementation: https://referencesource.microsoft.com/#System.ComponentModel.DataAnnotations/DataAnnotations/PhoneAttribute.cs, adjusted for JavaScript regex engine - since JS doesn't use lookbehind feature, alternative approach used (as described here: http://stackoverflow.com/q/7376238/270315)\r\n                return /^(\\+\\s?)?((?!\\+.*)\\(\\+?\\d+([\\s\\-\\.]?\\d+)?\\)|\\d+)([\\s\\-\\.]?(\\(\\d+([\\s\\-\\.]?\\d+)?\\)|\\d+))*(\\s?(x|ext\\.?)\\s?\\d+)?$/.test(str);\r\n            });\r\n            this.addMethod('IsUrl', function(str) {\r\n                // contributed by Diego Perini: https://gist.github.com/dperini/729294 (https://mathiasbynens.be/demo/url-regex)\r\n                return /^(?:(?:https?|ftp):\\/\\/)(?:\\S+(?::\\S*)?@)?(?:(?!(?:10|127)(?:\\.\\d{1,3}){3})(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))(?::\\d{2,5})?(?:\\/\\S*)?$/i.test(str);\r\n            });\r\n            this.addMethod('IsRegexMatch', function(str, regex) {\r\n                return str !== null && str !== undefined && regex !== null && regex !== undefined && new RegExp(regex).test(str);\r\n            });\r\n            this.addMethod('Guid', function(str) {\r\n                var guid = typeHelper.guid.tryParse(str);\r\n                if (guid.error) {\r\n                    throw guid.msg;\r\n                }\r\n                return guid;\r\n            });\r\n            this.addMethod('Min', function(values) { // accepts both, array and variable number of arguments\r\n                if (arguments.length === 0)\r\n                    throw \"no arguments\";\r\n\r\n                if (arguments.length === 1) {\r\n                    if (typeHelper.isArray(values)) {\r\n                        if (values.length === 0)\r\n                            throw \"empty sequence\";\r\n                        return Math.min.apply(null, values);\r\n                    }\r\n                }\r\n                return Math.min.apply(null, arguments);\r\n            });\r\n            this.addMethod('Max', function(values) { // accepts both, array and variable number of arguments\r\n                if (arguments.length === 0)\r\n                    throw \"no arguments\";\r\n\r\n                if (arguments.length === 1) {\r\n                    if (typeHelper.isArray(values)) {\r\n                        if (values.length === 0)\r\n                            throw \"empty sequence\";\r\n                        return Math.max.apply(null, values);\r\n                    }\r\n                }\r\n                return Math.max.apply(null, arguments);\r\n            });\r\n            this.addMethod('Sum', function(values) { // accepts both, array and variable number of arguments\r\n                if (arguments.length === 0)\r\n                    throw \"no arguments\";\r\n\r\n                var sum = 0, i, l;\r\n                if (arguments.length === 1) {\r\n                    if (typeHelper.isArray(values)) {\r\n                        if (values.length === 0)\r\n                            throw \"empty sequence\";\r\n                        for (i = 0, l = values.length; i < l; i++) {\r\n                            sum += parseFloat(values[i]);\r\n                        }\r\n                        return sum;\r\n                    }\r\n                }\r\n                for (i = 0, l = arguments.length; i < l; i++) {\r\n                    sum += parseFloat(arguments[i]);\r\n                }\r\n                return sum;\r\n            });\r\n            this.addMethod('Average', function(values) { // accepts both, array and variable number of arguments\r\n                if (arguments.length === 0)\r\n                    throw \"no arguments\";\r\n\r\n                var sum, i, l, arr = new Array();\r\n                if (arguments.length === 1) {\r\n                    if (typeHelper.isArray(values)) {\r\n                        if (values.length === 0)\r\n                            throw \"empty sequence\";\r\n                        sum = that.methods.Sum(values);\r\n                        return sum / values.length;\r\n                    }\r\n                }\r\n                for (i = 0, l = arguments.length; i < l; i++) {\r\n                    arr.push(arguments[i]);\r\n                }\r\n                sum = that.methods.Sum(arr);\r\n                return sum / arguments.length;\r\n            });\r\n        }\r\n    },\r\n\r\n    typeHelper = {\r\n        parsers: {},\r\n        addValueParser: function(name, func) {\r\n            $.each(name.split(/\\s+/), function(idx, parser) {\r\n                if (/\\S/.test(parser)) {\r\n                    typeHelper.parsers[parser] = func;\r\n                }\r\n            });\r\n        },\r\n        array: {\r\n            contains: function(arr, item) {\r\n                var i = arr.length;\r\n                while (i--) {\r\n                    if (arr[i] === item) {\r\n                        return true;\r\n                    }\r\n                }\r\n                return false;\r\n            }\r\n        },\r\n        object: {\r\n            keys: function(obj) {\r\n                var key, arr = [];\r\n                for (key in obj) {\r\n                    if (obj.hasOwnProperty(key)) {\r\n                        arr.push(key);\r\n                    }\r\n                }\r\n                return arr;\r\n            },\r\n            tryParse: function(value) {\r\n                try {\r\n                    return $.parseJSON(value);\r\n                } catch (ex) {\r\n                    return { error: true, msg: 'Given value was not recognized as a valid JSON. ' + ex };\r\n                }\r\n            }\r\n        },\r\n        string: {\r\n            format: function(text, params) {\r\n                function makeParam(value) {\r\n                    var replacer = function(key, value) {\r\n                        return typeof value === 'function' ? 'function(...) {...}' : value;\r\n                    }\r\n                    if (api.settings.registerAllMethods) {\r\n                        replacer = null; // do not print all of the methods not to disturb the console output\r\n                    }\r\n                    value = typeHelper.isObject(value) ? JSON.stringify(value, replacer, 4): value;\r\n                    value = typeHelper.isString(value) ? value.replace(/\\$/g, '$$$$'): value; // escape $ sign for string.replace()\r\n                    return value;\r\n                }\r\n                function applyParam(text, param, idx) {\r\n                    return text.replace(new RegExp('\\\\{' + idx + '\\\\}', 'gm'), param);\r\n                }\r\n\r\n                var i;\r\n                if (params instanceof Array) {\r\n                    for (i = 0; i < params.length; i++) {\r\n                        text = applyParam(text, makeParam(params[i]), i);\r\n                    }\r\n                    return text;\r\n                }\r\n                for (i = 0; i < arguments.length - 1; i++) {\r\n                    text = applyParam(text, makeParam(arguments[i + 1]), i);\r\n                }\r\n                return text;\r\n            },\r\n            indent: function(str, spaces) {\r\n                var indent = Array((spaces || 0) + 1).join(' ');\r\n                return str.replace(/^/gm, indent);\r\n            },\r\n            tryParse: function(value) {\r\n                if (typeHelper.isString(value)) {\r\n                    return value;\r\n                }\r\n                if (value !== undefined && value !== null) {\r\n                    return value.toString();\r\n                }\r\n                return { error: true, msg: 'Given value was not recognized as a valid string.' };\r\n            }\r\n        },\r\n        bool: {\r\n            tryParse: function(value) {\r\n                if (typeHelper.isBool(value)) {\r\n                    return value;\r\n                }\r\n                if (typeHelper.isString(value)) {\r\n                    value = $.trim(value).toLowerCase();\r\n                    if (value === 'true' || value === 'false') {\r\n                        return value === 'true';\r\n                    }\r\n                }\r\n                return { error: true, msg: 'Given value was not recognized as a valid boolean.' };\r\n            }\r\n        },\r\n        number: {\r\n            tryParse: function(value) {\r\n                function isNumber(n) {\r\n                    return typeHelper.isNumeric(parseFloat(n)) && isFinite(n);\r\n                }\r\n\r\n                if (isNumber(value)) {\r\n                    return parseFloat(value);\r\n                }\r\n                return { error: true, msg: 'Given value was not recognized as a valid number.' };\r\n            }\r\n        },\r\n        timespan: {\r\n            tryParse: function(value) {\r\n                if (typeHelper.isTimeSpan(value)) {\r\n                    var DAY = 2, HOUR = 3, MINUTE = 4, SECOND = 5, MILLISECOND = 6;\r\n                    var match = /(\\-)?(?:(\\d*)\\.)?(\\d+)\\:(\\d+)(?:\\:(\\d+)\\.?(\\d{3})?)?/.exec(value);\r\n                    var sign = (match[1] === '-') ? -1 : 1;\r\n                    var d = {\r\n                        days: typeHelper.number.tryParse(match[DAY] || 0) * sign,\r\n                        hours: typeHelper.number.tryParse(match[HOUR] || 0) * sign,\r\n                        minutes: typeHelper.number.tryParse(match[MINUTE] || 0) * sign,\r\n                        seconds: typeHelper.number.tryParse(match[SECOND] || 0) * sign,\r\n                        milliseconds: typeHelper.number.tryParse(match[MILLISECOND] || 0) * sign\r\n                    };\r\n                    var millisec = d.milliseconds +\r\n                        d.seconds * 1e3 + // 1000\r\n                        d.minutes * 6e4 + // 1000 * 60\r\n                        d.hours * 36e5 +  // 1000 * 60 * 60\r\n                        d.days * 864e5;   // 1000 * 60 * 60 * 24\r\n                    return millisec;\r\n                }\r\n                return { error: true, msg: 'Given value was not recognized as a valid .NET style timespan string.' };\r\n            }\r\n        },\r\n        datetime: {\r\n            stamp: function(date) {\r\n                function pad(n) { return ('0' + n).slice(-2); }\r\n                return pad(date.getHours()) + ':' + pad(date.getMinutes()) + ':' + pad(date.getSeconds());\r\n            },\r\n            tryParse: function(value) {\r\n                if (typeHelper.isDate(value)) {\r\n                    return value.getTime(); // return the time value in milliseconds\r\n                }\r\n                if (typeHelper.isString(value)) {\r\n                    var millisec = Date.parse(value); // default parsing of string representing an RFC 2822 or ISO 8601 date\r\n                    if (typeHelper.isNumeric(millisec)) {\r\n                        return millisec;\r\n                    }\r\n                }\r\n                return { error: true, msg: 'Given value was not recognized as a valid RFC 2822 or ISO 8601 date.' };\r\n            }\r\n        },\r\n        guid: {\r\n            tryParse: function(value) {\r\n                if (typeHelper.isGuid(value)) {\r\n                    return value.toUpperCase();\r\n                }\r\n                return { error: true, msg: 'Given value was not recognized as a valid guid - guid should contain 32 digits with 4 dashes (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).' };\r\n            }\r\n        },\r\n        enumeration: {\r\n            tryParse: function(value) {\r\n                return api.settings.enumsAsNumbers ? typeHelper.number.tryParse(value) : typeHelper.string.tryParse(value);\r\n            }\r\n        },\r\n        isTimeSpan: function(value) {\r\n            return /(\\-)?(?:(\\d*)\\.)?(\\d+)\\:(\\d+)(?:\\:(\\d+)\\.?(\\d{3})?)?/.test(value); // regex for recognition of .NET style timespan string, taken from moment.js v2.9.0\r\n        },\r\n        isNumeric: function(value) {\r\n            return typeof value === 'number' && !isNaN(value);\r\n        },\r\n        isDate: function(value) {\r\n            return value instanceof Date;\r\n        },\r\n        isObject: function(value) {\r\n            return typeof value === 'object' || value instanceof Object;\r\n        },\r\n        isString: function(value) {\r\n            return typeof value === 'string' || value instanceof String;\r\n        },\r\n        isBool: function(value) {\r\n            return typeof value === 'boolean' || value instanceof Boolean;\r\n        },\r\n        isGuid: function(value) {\r\n            return /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(value); // basic check\r\n        },\r\n        isArray: function(value) {\r\n            return Object.prototype.toString.call(value) === '[object Array]';\r\n        },\r\n        tryParse: function(value, type, field, parser) {\r\n            var parseFunc;\r\n            if (parser !== null && parser !== undefined) {\r\n                parseFunc = typeHelper.findValueParser(field, parser); // pointed by attribute custom field-specific parser lookup - highest parsing priority\r\n                if (!parseFunc.error) {\r\n                    return parseFunc(value, field);\r\n                }\r\n                logger.warn(parseFunc.msg);\r\n            }\r\n            parseFunc = typeHelper.findValueParser(field, type); // custom type-specific parser lookup - secondary parsing priority\r\n            if (!parseFunc.error) {\r\n                logger.warn(typeHelper.string.format('Overridden {0} type parsing runs for {1} field. All fields of {0} type are going to be parsed using your value parser. If such a behavior is unintentional, change the name of your value parser to one, which does not indicate at {0} (or any other) type name.', type, field));\r\n                return parseFunc(value, field);\r\n            }\r\n            return typeHelper.tryAutoParse(value, type); // built-in parser lookup - lowest parsing priority\r\n        },\r\n        tryAutoParse: function(value, type) {\r\n            return typeHelper.hasOwnProperty(type)\r\n                ? typeHelper[type].tryParse(value)\r\n                : typeHelper.object.tryParse(value);\r\n        },\r\n        findValueParser: function(field, parser) {\r\n            var parseFunc = typeHelper.parsers[parser]; // custom parsing lookup\r\n            if (typeof parseFunc === 'function') {\r\n                return parseFunc;\r\n            }\r\n            return { error: true, msg: typeHelper.string.format('Custom value parser {0} not found. Consider its registration with ea.addValueParser(), or remove redundant ValueParser attribute from {1} model field.', parser, field) };\r\n        }\r\n    },\r\n\r\n    modelHelper = {\r\n        getPrefix: function(str) {\r\n            return (str !== undefined && str !== null) ? str.substr(0, str.lastIndexOf('.') + 1) : '';\r\n        },\r\n        extractValue: function(form, name, prefix, type, parser) {\r\n            function getValue(element) {\r\n                var elementType = element.attr('type');\r\n                switch (elementType) {\r\n                    case 'checkbox':\r\n                        if (element.length > 2) {\r\n                            logger.warn(typeHelper.string.format('DOM field {0} is ambiguous (unless custom value parser is provided).', element.attr('name')));\r\n                        }\r\n                        return element.is(':checked');\r\n                    case 'radio':\r\n                        return element.filter(':checked').val();\r\n                    default:\r\n                        if (element.length > 1) {\r\n                            logger.warn(typeHelper.string.format('DOM field {0} is ambiguous (unless custom value parser is provided).', element.attr('name')));\r\n                        }\r\n                        return element.val();\r\n                }\r\n            }\r\n\r\n            var field, fieldName, rawValue, parsedValue;\r\n            fieldName = prefix + name;\r\n            field = $(form).find(typeHelper.string.format(':input[name=\"{0}\"]', fieldName));\r\n            if (field.length === 0) {\r\n                throw typeHelper.string.format('DOM field {0} not found.', fieldName);\r\n            }\r\n            rawValue = getValue(field);\r\n            if (rawValue === null || rawValue === undefined  || rawValue === '') { // field value not set\r\n                return null;\r\n            }\r\n            parsedValue = typeHelper.tryParse(rawValue, type, fieldName, parser); // convert field value to required type\r\n            if (parsedValue !== null && parsedValue !== undefined && parsedValue.error) {\r\n                throw typeHelper.string.format('DOM field {0} value conversion to {1} failed. {2}', fieldName, type, parsedValue.msg);\r\n            }\r\n            return parsedValue;\r\n        },\r\n        deserializeObject: function(form, fieldsMap, constsMap, enumsMap, parsersMap, prefix) {\r\n            function buildField(fieldName, fieldValue, object) {\r\n                var props, parent, i, match, arrayIndex, arrayName, arrayPat;\r\n                arrayPat = /^([a-z_0-9]+)\\[([0-9]+)\\]$/i;\r\n                props = fieldName.split('.');\r\n                parent = object;\r\n                for (i = 0; i < props.length - 1; i++) {\r\n                    fieldName = props[i];\r\n\r\n                    match = arrayPat.exec(fieldName); // check for array element access\r\n                    if (match) {\r\n                        fieldName = match[1];\r\n                        arrayIndex = match[2];\r\n                        if (!parent.hasOwnProperty(fieldName)) {\r\n                            parent[fieldName] = {};\r\n                        }\r\n                        parent[fieldName][arrayIndex] = parent[fieldName][arrayIndex] || {}; // create if needed\r\n                        parent = parent[fieldName][arrayIndex];\r\n                        continue;\r\n                    }\r\n\r\n                    if (!parent.hasOwnProperty(fieldName)) {\r\n                        parent[fieldName] = {};\r\n                    }\r\n                    parent = parent[fieldName];\r\n                }\r\n                fieldName = props[props.length - 1];\r\n\r\n                var endMatch = arrayPat.exec(fieldName);\r\n                if (endMatch) { // our fieldName matches array access pattern i.e. arr[idx]\r\n                    arrayName = endMatch[1];\r\n                    arrayIndex = endMatch[2];\r\n                    parent[arrayName] = parent[arrayName] || []; // create if needed\r\n                    parent[arrayName][arrayIndex] = fieldValue;\r\n                } else {\r\n                    parent[fieldName] = fieldValue;\r\n                }\r\n            }\r\n\r\n            var model = {}, name, type, value, parser;\r\n            for (name in fieldsMap) {\r\n                if (fieldsMap.hasOwnProperty(name)) {\r\n                    type = fieldsMap[name];\r\n                    parser = parsersMap[name];\r\n                    value = this.extractValue(form, name, prefix, type, parser);\r\n                    buildField(name, value, model);\r\n                }\r\n            }\r\n            for (name in constsMap) {\r\n                if (constsMap.hasOwnProperty(name)) {\r\n                    value = constsMap[name];\r\n                    buildField(name, value, model);\r\n                }\r\n            }\r\n            for (name in enumsMap) {\r\n                if (enumsMap.hasOwnProperty(name)) {\r\n                    value = api.settings.enumsAsNumbers ? enumsMap[name] : name.split('.').pop();\r\n                    buildField(name, value, model);\r\n                }\r\n            }\r\n            return model;\r\n        },\r\n        adjustGivenValue: function(value, element, params) {\r\n            value = element.type === 'checkbox' ? element.checked : value; // special treatment for checkbox, because when unchecked, false value should be retrieved instead of undefined\r\n\r\n            var field = element.name.replace(params.prefix, '');\r\n            var parser = params.parsersMap[field];\r\n            if (parser !== null && parser !== undefined) {\r\n                var parseFunc = typeHelper.findValueParser(element.name, parser); // pointed by attribute custom field-specific parser lookup - highest parsing priority\r\n                if (!parseFunc.error) {\r\n                    return parseFunc(value, element.name);\r\n                }\r\n                logger.warn(parseFunc.msg);\r\n            }\r\n            return value;\r\n        },\r\n        ctxEval: function(exp, ctx) { // evaluates expression in the scope of context object\r\n            return (new Function('expression', 'context', 'with(context){return eval(expression)}'))(exp, ctx); // function constructor used on purpose (a hack), for 'with' statement not to collide with strict mode, which\r\n                                                                                                                // is applied to entire module scope (BTW 'use strict'; pragma intentionally not put to function constructor)\r\n        }\r\n    },\r\n\r\n    validationHelper = {\r\n        referencesMap: [],\r\n        collectReferences: function(fields, refField, prefix) {\r\n            var i, name;\r\n            for (i = 0; i < fields.length; i++) {\r\n                name = prefix + fields[i];\r\n                if (name !== refField) {\r\n                    this.referencesMap[name] = this.referencesMap[name] || [];\r\n                    if (!typeHelper.array.contains(this.referencesMap[name], refField)) {\r\n                        this.referencesMap[name].push(refField);\r\n                    }\r\n                }\r\n            }\r\n        },\r\n        validateReferences: function(name, form) {\r\n            var i, field, referencedFields, validator;\r\n            validator = $(form).validate(); // get validator attached to the form\r\n            referencedFields = this.referencesMap[name];\r\n            if (referencedFields !== undefined && referencedFields !== null) {\r\n                logger.info(typeHelper.string.format('Validation triggered for the following dependencies of {0} field:\\n{1}.', name, referencedFields.join(', ')));\r\n                i = referencedFields.length;\r\n                while (i--) {\r\n                    field = $(form).find(typeHelper.string.format(':input[data-val][name=\"{0}\"]', referencedFields[i])).not(validator.settings.ignore);\r\n                    if (field.length !== 0) {\r\n                        field.valid();\r\n                    }\r\n                }\r\n            } else {\r\n                logger.info(typeHelper.string.format('No fields dependent on {0} detected.', name));\r\n            }\r\n        },\r\n        bindFields: function(form, force) { // attach validation handlers to dependency triggers (events) for some form elements\r\n            if (api.settings.dependencyTriggers !== null && api.settings.dependencyTriggers !== undefined && api.settings.dependencyTriggers !== '') {\r\n                var namespacedEvents = [];\r\n                $.each(api.settings.dependencyTriggers.split(/\\s+/), function(idx, event) {\r\n                    if (/\\S/.test(event)) {\r\n                        namespacedEvents.push(typeHelper.string.format('{0}.expressive.annotations', event));\r\n                    }\r\n                });\r\n                // attach handlers to all inputs that do not have 'ea-triggers-bound' class (unless force is true)\r\n                $(form).find('input, select, textarea').not(function(idx, element) {\r\n                    var bound = $(element).hasClass('ea-triggers-bound');\r\n                    $(element).addClass('ea-triggers-bound');\r\n                    return !force && bound;\r\n                }).on(namespacedEvents.join(' '), function(event) {\r\n                    var field = $(this).attr('name');\r\n                    logger.info(typeHelper.string.format('Dependency validation trigger - {0} event, handled.', event.type));\r\n                    validationHelper.validateReferences(field, form); // validate referenced fields only\r\n                });\r\n            }\r\n        }\r\n    },\r\n\r\n    buildAdapter = function(adapter, options) {\r\n        var rules = {\r\n            prefix: modelHelper.getPrefix(options.element.name),\r\n            form: options.form\r\n        };\r\n        for (var key in options.params) {\r\n            if (options.params.hasOwnProperty(key)) {\r\n                rules[key] = options.params[key] !== undefined ? $.parseJSON(options.params[key]) : {};\r\n            }\r\n        }\r\n        if (options.message) {\r\n            options.messages[adapter] = function(params, element) {\r\n                var message, field, guid, value;\r\n                message = options.message;\r\n                for (field in params.errFieldsMap) {\r\n                    if (params.errFieldsMap.hasOwnProperty(field)) {\r\n                        guid = params.errFieldsMap[field];\r\n                        value = modelHelper.extractValue(params.form, field, params.prefix, 'string', null);\r\n\r\n                        var re = new RegExp(guid, 'g'); // with this regex...\r\n                        message = message.replace(re, value); // ...occurrences are replaced globally\r\n                    }\r\n                }\r\n                return message;\r\n            };\r\n        }\r\n        validationHelper.bindFields(options.form);\r\n        validationHelper.collectReferences(typeHelper.object.keys(rules.fieldsMap), options.element.name, rules.prefix);\r\n        options.rules[adapter] = rules;\r\n    },\r\n\r\n    computeAssertThat = function(method, value, element, params) {\r\n        value = modelHelper.adjustGivenValue(value, element, params); // preprocess given value (here basically we are concerned about determining if such a value is null or not, to determine if the attribute\r\n                                                                      // logic should be invoked or not - full type-detection parsing is not required at this stage, but we may have to extract such a value using\r\n                                                                      // value parser, e.g. for an array which values are distracted among multiple fields)\r\n        if (value !== undefined && value !== null && value !== '') { // check if the field value is set (continue if so, otherwise skip condition verification)\r\n            var model = modelHelper.deserializeObject(params.form, params.fieldsMap, params.constsMap, params.enumsMap, params.parsersMap, params.prefix);\r\n            toolchain.registerMethods(model, params.methodsList, element.name);\r\n            var message = 'Field {0} - {1} expression:\\n[{2}]\\nto be executed within the following context{3}:\\n{4}';\r\n            logger.info(typeHelper.string.format(message, element.name, method, params.expression, api.settings.registerAllMethods ? ' (methods not shown)' : '', model));\r\n            var exprVal = modelHelper.ctxEval(params.expression, model); // verify assertion, if not satisfied => notify (return false)\r\n            return {\r\n                valid: exprVal,\r\n                condition: exprVal\r\n            }\r\n        }\r\n        return {\r\n            valid: true,\r\n            condition: undefined // undefined always when value is set (computation redundant)\r\n        }\r\n    },\r\n\r\n    computeRequiredIf = function(method, value, element, params) {\r\n        value = modelHelper.adjustGivenValue(value, element, params);\r\n\r\n        var exprVal = undefined, model;\r\n        var message = 'Field {0} - {1} expression:\\n[{2}]\\nto be executed within the following context{3}:\\n{4}';\r\n        if (!api.settings.optimize) { // no optimization - compute requirement condition (which now may have changed) despite the fact field value may be provided\r\n            model = modelHelper.deserializeObject(params.form, params.fieldsMap, params.constsMap, params.enumsMap, params.parsersMap, params.prefix);\r\n            toolchain.registerMethods(model, params.methodsList, element.name);\r\n            logger.info(typeHelper.string.format(message, element.name, method, params.expression, api.settings.registerAllMethods ? ' (methods not shown)' : '', model));\r\n            exprVal = modelHelper.ctxEval(params.expression, model);\r\n        }\r\n\r\n        if (value === undefined || value === null || value === '' // check if the field value is not set (undefined, null or empty string treated at client as null at server)\r\n            || (!/\\S/.test(value) && !params.allowEmpty)) {\r\n\r\n            if (exprVal !== undefined) {\r\n                return {\r\n                    valid: !exprVal,\r\n                    condition: exprVal\r\n                }\r\n            }\r\n\r\n            model = modelHelper.deserializeObject(params.form, params.fieldsMap, params.constsMap, params.enumsMap, params.parsersMap, params.prefix);\r\n            toolchain.registerMethods(model, params.methodsList, element.name);\r\n            logger.info(typeHelper.string.format(message, element.name, method, params.expression, api.settings.registerAllMethods ? ' (methods not shown)' : '', model));\r\n            exprVal = modelHelper.ctxEval(params.expression, model); // verify requirement, if satisfied => notify (return false)\r\n            return {\r\n                valid: !exprVal,\r\n                condition: exprVal\r\n            }\r\n        }\r\n        return {\r\n            valid: true,\r\n            condition: exprVal  // undefined when optimize flag is on and value is not set (computation redundant)\r\n        }\r\n    },\r\n\r\n    annotations = ' abcdefghijklmnopqrstuvwxyz'; // suffixes for attributes annotating single field multiple times\r\n\r\n    // bind requirements first...\r\n    $.each(annotations.split(''), function() { // it would be ideal to have exactly as many handlers as there are unique annotations, but the number of annotations isn't known untill DOM is ready\r\n        var adapter = typeHelper.string.format('requiredif{0}', $.trim(this));\r\n        $.validator.unobtrusive.adapters.add(adapter, ['expression', 'fieldsMap', 'constsMap', 'enumsMap', 'methodsList', 'parsersMap', 'errFieldsMap', 'allowEmpty'], function(options) {\r\n            buildAdapter(adapter, options);\r\n        });\r\n    });\r\n\r\n    // ...then move to asserts\r\n    $.each(annotations.split(''), function() {\r\n        var adapter = typeHelper.string.format('assertthat{0}', $.trim(this));\r\n        $.validator.unobtrusive.adapters.add(adapter, ['expression', 'fieldsMap', 'constsMap', 'enumsMap', 'methodsList', 'parsersMap', 'errFieldsMap'], function(options) {\r\n            buildAdapter(adapter, options);\r\n        });\r\n    });\r\n\r\n    $.each(annotations.split(''), function() {\r\n        var suffix = $.trim(this);\r\n        var method = typeHelper.string.format('assertthat{0}', suffix);\r\n        $.validator.addMethod(method, function(value, element, params) {\r\n            try {\r\n                var result = computeAssertThat(method, value, element, params);\r\n\r\n                logger.info(typeHelper.string.format('Field {0} - {1} outcome: {2}, assertion {3}.',\r\n                    element.name,\r\n                    method,\r\n                    result.condition === undefined\r\n                        ? 'assertion expression computation redundant'\r\n                        : result.condition\r\n                            ? 'expression true'\r\n                            : 'expression false',\r\n                    result.valid ? 'satisfied' : 'not satisfied'));\r\n\r\n                $(element).trigger('eavalid', ['assertthat', result.valid, params.expression]);\r\n                return result.valid;\r\n            } catch (ex) {\r\n                logger.fail(ex);\r\n            }\r\n        }, '');\r\n    });\r\n\r\n    $.each(annotations.split(''), function() {\r\n        var suffix = $.trim(this);\r\n        var method = typeHelper.string.format('requiredif{0}', suffix);\r\n        $.validator.addMethod(method, function(value, element, params) {\r\n            try {\r\n                var result = computeRequiredIf(method, value, element, params);\r\n\r\n                logger.info(typeHelper.string.format('Field {0} - {1} outcome: {2}, requirement {3}.',\r\n                    element.name,\r\n                    method,\r\n                    result.condition === undefined\r\n                        ? 'requirement expression computation redundant'\r\n                        : result.condition\r\n                            ? 'required'\r\n                            : 'not required',\r\n                    result.valid ? 'satisfied' : 'not satisfied'));\r\n\r\n                $(element).trigger('eavalid', ['requiredif', result.valid, params.expression, result.condition, annotations.indexOf(suffix)]);\r\n                return result.valid;\r\n            } catch (ex) {\r\n                logger.fail(ex);\r\n            }\r\n        }, '');\r\n    });\r\n\r\n    window.ea = api; // expose some tiny api to the ea global object\r\n\r\n}(jQuery, window));\r\n","import $ from \"jquery\";\r\nimport \"selectedIcons\";\r\nimport \"components/top-menu\";\r\nimport \"components/header\";\r\nimport \"components/footer\";\r\nimport \"components/dynamic-grid\";\r\nimport \"bootstrap/js/dist/alert\";\r\nimport JSZip from \"jszip/dist/jszip\";\r\nimport \"@progress/kendo-ui/js/kendo.autocomplete\";\r\nimport \"@progress/kendo-ui/js/kendo.grid\";\r\nimport \"@progress/kendo-ui/js/kendo.aspnetmvc\";\r\nimport \"@progress/kendo-ui/js/kendo.datepicker\";\r\nimport \"jquery-validation/dist/jquery.validate\";\r\nimport \"jquery-validation-unobtrusive/dist/jquery.validate.unobtrusive\";\r\nimport \"expressive-annotations-validate/dist/expressive.annotations.validate\";\r\n\r\nwindow.JSZip = JSZip;\r\n\r\n$(document).ready(() => {\r\n    $(\".collapse\").on(\"show.bs.collapse\", event => {\r\n        $(event.target).parent().find(\"svg:first\").toggleClass(\"fa-minus\").toggleClass(\"fa-plus\");\r\n    });\r\n\r\n    $(\".collapse\").on(\"hidden.bs.collapse\", event => {\r\n        $(event.target).parent().find(\"svg:first\").toggleClass(\"fa-plus\").toggleClass(\"fa-minus\");\r\n    });\r\n});"],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACvJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;AC72BA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;;;;A","sourceRoot":""}