PageSourceSearch

https://forms.louisvilleco.gov/Resources/scripts/jquery.inputmask.bundle.js

js louisvilleco.gov collected 2026-09-24 18:18:36 UTC 168,787 bytes, 2,621 lines download raw bytes

1/*!
2* jquery.inputmask.bundle.js
3* https://github.com/RobinHerbots/jquery.inputmask
4* Copyright (c) 2010 - 2016 Robin Herbots
5* Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
6* Version: 3.3.2-43
7*/
8!function($) {
9    function Inputmask(alias, options) {
10        return this instanceof Inputmask ? ($.isPlainObject(alias) ? options = alias : (options = options || {}, 
11        options.alias = alias), this.el = void 0, this.opts = $.extend(!0, {}, this.defaults, options), 
12        this.noMasksCache = options && void 0 !== options.definitions, this.userOptions = options || {}, 
13        this.events = {}, void resolveAlias(this.opts.alias, options, this.opts)) : new Inputmask(alias, options);
14    }
15    function isInputEventSupported(eventName) {
16        var el = document.createElement("input"), evName = "on" + eventName, isSupported = evName in el;
17        return isSupported || (el.setAttribute(evName, "return;"), isSupported = "function" == typeof el[evName]), 
18        el = null, isSupported;
19    }
20    function isElementTypeSupported(input, opts) {
21        var elementType = input.getAttribute("type"), isSupported = "INPUT" === input.tagName && -1 !== $.inArray(elementType, opts.supportsInputType) || input.isContentEditable || "TEXTAREA" === input.tagName;
22        if (!isSupported && "INPUT" === input.tagName) {
23            var el = document.createElement("input");
24            el.setAttribute("type", elementType), isSupported = "text" === el.type, el = null;
25        }
26        return isSupported;
27    }
28    function resolveAlias(aliasStr, options, opts) {
29        var aliasDefinition = opts.aliases[aliasStr];
30        return aliasDefinition ? (aliasDefinition.alias && resolveAlias(aliasDefinition.alias, void 0, opts), 
31        $.extend(!0, opts, aliasDefinition), $.extend(!0, opts, options), !0) : (null === opts.mask && (opts.mask = aliasStr), 
32        !1);
33    }
34    function importAttributeOptions(npt, opts, userOptions) {
35        function importOption(option, optionData) {
36            optionData = void 0 !== optionData ? optionData : npt.getAttribute("data-inputmask-" + option), 
37            null !== optionData && ("string" == typeof optionData && (0 === option.indexOf("on") ? optionData = window[optionData] : "false" === optionData ? optionData = !1 : "true" === optionData && (optionData = !0)), 
38            userOptions[option] = optionData);
39        }
40        var option, dataoptions, optionData, p, attrOptions = npt.getAttribute("data-inputmask");
41        if (attrOptions && "" !== attrOptions && (attrOptions = attrOptions.replace(new RegExp("'", "g"), '"'), 
42        dataoptions = JSON.parse("{" + attrOptions + "}")), dataoptions) {
43            optionData = void 0;
44            for (p in dataoptions) if ("alias" === p.toLowerCase()) {
45                optionData = dataoptions[p];
46                break;
47            }
48        }
49        importOption("alias", optionData), userOptions.alias && resolveAlias(userOptions.alias, userOptions, opts);
50        for (option in opts) {
51            if (dataoptions) {
52                optionData = void 0;
53                for (p in dataoptions) if (p.toLowerCase() === option.toLowerCase()) {
54                    optionData = dataoptions[p];
55                    break;
56                }
57            }
58            importOption(option, optionData);
59        }
60        return $.extend(!0, opts, userOptions), opts;
61    }
62    function generateMaskSet(opts, nocache) {
63        function analyseMask(mask) {
64            function MaskToken(isGroup, isOptional, isQuantifier, isAlternator) {
65                this.matches = [], this.isGroup = isGroup || !1, this.isOptional = isOptional || !1, 
66                this.isQuantifier = isQuantifier || !1, this.isAlternator = isAlternator || !1, 
67                this.quantifier = {
68                    min: 1,
69                    max: 1
70                };
71            }
72            function insertTestDefinition(mtoken, element, position) {
73                var maskdef = opts.definitions[element];
74                position = void 0 !== position ? position : mtoken.matches.length;
75                var prevMatch = mtoken.matches[position - 1];
76                if (maskdef && !escaped) {
77                    maskdef.placeholder = $.isFunction(maskdef.placeholder) ? maskdef.placeholder(opts) : maskdef.placeholder;
78                    for (var prevalidators = maskdef.prevalidator, prevalidatorsL = prevalidators ? prevalidators.length : 0, i = 1; i < maskdef.cardinality; i++) {
79                        var prevalidator = prevalidatorsL >= i ? prevalidators[i - 1] : [], validator = prevalidator.validator, cardinality = prevalidator.cardinality;
80                        mtoken.matches.splice(position++, 0, {
81                            fn: validator ? "string" == typeof validator ? new RegExp(validator) : new function() {
82                                this.test = validator;
83                            }() : new RegExp("."),
84                            cardinality: cardinality ? cardinality : 1,
85                            optionality: mtoken.isOptional,
86                            newBlockMarker: void 0 === prevMatch || prevMatch.def !== (maskdef.definitionSymbol || element),
87                            casing: maskdef.casing,
88                            def: maskdef.definitionSymbol || element,
89                            placeholder: maskdef.placeholder,
90                            mask: element
91                        }), prevMatch = mtoken.matches[position - 1];
92                    }
93                    mtoken.matches.splice(position++, 0, {
94                        fn: maskdef.validator ? "string" == typeof maskdef.validator ? new RegExp(maskdef.validator) : new function() {
95                            this.test = maskdef.validator;
96                        }() : new RegExp("."),
97                        cardinality: maskdef.cardinality,
98                        optionality: mtoken.isOptional,
99                        newBlockMarker: void 0 === prevMatch || prevMatch.def !== (maskdef.definitionSymbol || element),
100                        casing: maskdef.casing,
101                        def: maskdef.definitionSymbol || element,
102                        placeholder: maskdef.placeholder,
103                        mask: element
104                    });
105                } else mtoken.matches.splice(position++, 0, {
106                    fn: null,
107                    cardinality: 0,
108                    optionality: mtoken.isOptional,
109                    newBlockMarker: void 0 === prevMatch || prevMatch.def !== element,
110                    casing: null,
111                    def: opts.staticDefinitionSymbol || element,
112                    placeholder: void 0 !== opts.staticDefinitionSymbol ? element : void 0,
113                    mask: element
114                }), escaped = !1;
115            }
116            function verifyGroupMarker(lastMatch, isOpenGroup) {
117                lastMatch.isGroup && (lastMatch.isGroup = !1, insertTestDefinition(lastMatch, opts.groupmarker.start, 0), 
118                isOpenGroup !== !0 && insertTestDefinition(lastMatch, opts.groupmarker.end));
119            }
120            function maskCurrentToken(m, currentToken, lastMatch, extraCondition) {
121                currentToken.matches.length > 0 && (void 0 === extraCondition || extraCondition) && (lastMatch = currentToken.matches[currentToken.matches.length - 1], 
122                verifyGroupMarker(lastMatch)), insertTestDefinition(currentToken, m);
123            }
124            function defaultCase() {
125                if (openenings.length > 0) {
126                    if (currentOpeningToken = openenings[openenings.length - 1], maskCurrentToken(m, currentOpeningToken, lastMatch, !currentOpeningToken.isAlternator), 
127                    currentOpeningToken.isAlternator) {
128                        alternator = openenings.pop();
129                        for (var mndx = 0; mndx < alternator.matches.length; mndx++) alternator.matches[mndx].isGroup = !1;
130                        openenings.length > 0 ? (currentOpeningToken = openenings[openenings.length - 1], 
131                        currentOpeningToken.matches.push(alternator)) : currentToken.matches.push(alternator);
132                    }
133                } else maskCurrentToken(m, currentToken, lastMatch);
134            }
135            function reverseTokens(maskToken) {
136                function reverseStatic(st) {
137                    return st === opts.optionalmarker.start ? st = opts.optionalmarker.end : st === opts.optionalmarker.end ? st = opts.optionalmarker.start : st === opts.groupmarker.start ? st = opts.groupmarker.end : st === opts.groupmarker.end && (st = opts.groupmarker.start), 
138                    st;
139                }
140                maskToken.matches = maskToken.matches.reverse();
141                for (var match in maskToken.matches) {
142                    var intMatch = parseInt(match);
143                    if (maskToken.matches[match].isQuantifier && maskToken.matches[intMatch + 1] && maskToken.matches[intMatch + 1].isGroup) {
144                        var qt = maskToken.matches[match];
145                        maskToken.matches.splice(match, 1), maskToken.matches.splice(intMatch + 1, 0, qt);
146                    }
147                    void 0 !== maskToken.matches[match].matches ? maskToken.matches[match] = reverseTokens(maskToken.matches[match]) : maskToken.matches[match] = reverseStatic(maskToken.matches[match]);
148                }
149                return maskToken;
150            }
151            for (var match, m, openingToken, currentOpeningToken, alternator, lastMatch, groupToken, tokenizer = /(?:[?*+]|\{[0-9\+\*]+(?:,[0-9\+\*]*)?\})|[^.?*+^${[]()|\\]+|./g, escaped = !1, currentToken = new MaskToken(), openenings = [], maskTokens = []; match = tokenizer.exec(mask); ) if (m = match[0], 
152            escaped) defaultCase(); else switch (m.charAt(0)) {
153              case opts.escapeChar:
154                escaped = !0;
155                break;
156
157              case opts.optionalmarker.end:
158              case opts.groupmarker.end:
159                if (openingToken = openenings.pop(), void 0 !== openingToken) if (openenings.length > 0) {
160                    if (currentOpeningToken = openenings[openenings.length - 1], currentOpeningToken.matches.push(openingToken), 
161                    currentOpeningToken.isAlternator) {
162                        alternator = openenings.pop();
163                        for (var mndx = 0; mndx < alternator.matches.length; mndx++) alternator.matches[mndx].isGroup = !1;
164                        openenings.length > 0 ? (currentOpeningToken = openenings[openenings.length - 1], 
165                        currentOpeningToken.matches.push(alternator)) : currentToken.matches.push(alternator);
166                    }
167                } else currentToken.matches.push(openingToken); else defaultCase();
168                break;
169
170              case opts.optionalmarker.start:
171                openenings.push(new MaskToken(!1, !0));
172                break;
173
174              case opts.groupmarker.start:
175                openenings.push(new MaskToken(!0));
176                break;
177
178              case opts.quantifiermarker.start:
179                var quantifier = new MaskToken(!1, !1, !0);
180                m = m.replace(/[{}]/g, "");
181                var mq = m.split(","), mq0 = isNaN(mq[0]) ? mq[0] : parseInt(mq[0]), mq1 = 1 === mq.length ? mq0 : isNaN(mq[1]) ? mq[1] : parseInt(mq[1]);
182                if (("*" === mq1 || "+" === mq1) && (mq0 = "*" === mq1 ? 0 : 1), quantifier.quantifier = {
183                    min: mq0,
184                    max: mq1
185                }, openenings.length > 0) {
186                    var matches = openenings[openenings.length - 1].matches;
187                    match = matches.pop(), match.isGroup || (groupToken = new MaskToken(!0), groupToken.matches.push(match), 
188                    match = groupToken), matches.push(match), matches.push(quantifier);
189                } else match = currentToken.matches.pop(), match.isGroup || (groupToken = new MaskToken(!0), 
190                groupToken.matches.push(match), match = groupToken), currentToken.matches.push(match), 
191                currentToken.matches.push(quantifier);
192                break;
193
194              case opts.alternatormarker:
195                openenings.length > 0 ? (currentOpeningToken = openenings[openenings.length - 1], 
196                lastMatch = currentOpeningToken.matches.pop()) : lastMatch = currentToken.matches.pop(), 
197                lastMatch.isAlternator ? openenings.push(lastMatch) : (alternator = new MaskToken(!1, !1, !1, !0), 
198                alternator.matches.push(lastMatch), openenings.push(alternator));
199                break;
200
201              default:
202                defaultCase();
203            }
204            for (;openenings.length > 0; ) openingToken = openenings.pop(), verifyGroupMarker(openingToken, !0), 
205            currentToken.matches.push(openingToken);
206            return currentToken.matches.length > 0 && (lastMatch = currentToken.matches[currentToken.matches.length - 1], 
207            verifyGroupMarker(lastMatch), maskTokens.push(currentToken)), opts.numericInput && reverseTokens(maskTokens[0]), 
208            maskTokens;
209        }
210        function generateMask(mask, metadata) {
211            if (null === mask || "" === mask) return void 0;
212            if (1 === mask.length && opts.greedy === !1 && 0 !== opts.repeat && (opts.placeholder = ""), 
213            opts.repeat > 0 || "*" === opts.repeat || "+" === opts.repeat) {
214                var repeatStart = "*" === opts.repeat ? 0 : "+" === opts.repeat ? 1 : opts.repeat;
215                mask = opts.groupmarker.start + mask + opts.groupmarker.end + opts.quantifiermarker.start + repeatStart + "," + opts.repeat + opts.quantifiermarker.end;
216            }
217            var masksetDefinition;
218            return void 0 === Inputmask.prototype.masksCache[mask] || nocache === !0 ? (masksetDefinition = {
219                mask: mask,
220                maskToken: analyseMask(mask),
221                validPositions: {},
222                _buffer: void 0,
223                buffer: void 0,
224                tests: {},
225                metadata: metadata
226            }, nocache !== !0 && (Inputmask.prototype.masksCache[opts.numericInput ? mask.split("").reverse().join("") : mask] = masksetDefinition, 
227            masksetDefinition = $.extend(!0, {}, Inputmask.prototype.masksCache[opts.numericInput ? mask.split("").reverse().join("") : mask]))) : masksetDefinition = $.extend(!0, {}, Inputmask.prototype.masksCache[opts.numericInput ? mask.split("").reverse().join("") : mask]), 
228            masksetDefinition;
229        }
230        function preProcessMask(mask) {
231            return mask = mask.toString();
232        }
233        var ms;
234        if ($.isFunction(opts.mask) && (opts.mask = opts.mask(opts)), $.isArray(opts.mask)) {
235            if (opts.mask.length > 1) {
236                opts.keepStatic = null === opts.keepStatic ? !0 : opts.keepStatic;
237                var altMask = "(";
238                return $.each(opts.numericInput ? opts.mask.reverse() : opts.mask, function(ndx, msk) {
239                    altMask.length > 1 && (altMask += ")|("), altMask += preProcessMask(void 0 === msk.mask || $.isFunction(msk.mask) ? msk : msk.mask);
240                }), altMask += ")", generateMask(altMask, opts.mask);
241            }
242            opts.mask = opts.mask.pop();
243        }
244        return opts.mask && (ms = void 0 === opts.mask.mask || $.isFunction(opts.mask.mask) ? generateMask(preProcessMask(opts.mask), opts.mask) : generateMask(preProcessMask(opts.mask.mask), opts.mask)), 
245        ms;
246    }
247    function maskScope(actionObj, maskset, opts) {
248        function getMaskTemplate(baseOnInput, minimalPos, includeInput) {
249            minimalPos = minimalPos || 0;
250            var ndxIntlzr, test, testPos, maskTemplate = [], pos = 0, lvp = getLastValidPosition();
251            maxLength = void 0 !== el ? el.maxLength : void 0, -1 === maxLength && (maxLength = void 0);
252            do {
253                if (baseOnInput === !0 && getMaskSet().validPositions[pos]) {
254                    var validPos = getMaskSet().validPositions[pos];
255                    test = validPos.match, ndxIntlzr = validPos.locator.slice(), maskTemplate.push(includeInput === !0 ? validPos.input : getPlaceholder(pos, test));
256                } else testPos = getTestTemplate(pos, ndxIntlzr, pos - 1), test = testPos.match, 
257                ndxIntlzr = testPos.locator.slice(), (opts.jitMasking === !1 || lvp > pos || isFinite(opts.jitMasking) && opts.jitMasking > pos) && maskTemplate.push(getPlaceholder(pos, test));
258                pos++;
259            } while ((void 0 === maxLength || maxLength > pos) && (null !== test.fn || "" !== test.def) || minimalPos > pos);
260            return "" === maskTemplate[maskTemplate.length - 1] && maskTemplate.pop(), getMaskSet().maskLength = pos + 1, 
261            maskTemplate;
262        }
263        function getMaskSet() {
264            return maskset;
265        }
266        function resetMaskSet(soft) {
267            var maskset = getMaskSet();
268            maskset.buffer = void 0, soft !== !0 && (maskset._buffer = void 0, maskset.validPositions = {}, 
269            maskset.p = 0);
270        }
271        function getLastValidPosition(closestTo, strict, validPositions) {
272            var before = -1, after = -1, valids = validPositions || getMaskSet().validPositions;
273            void 0 === closestTo && (closestTo = -1);
274            for (var posNdx in valids) {
275                var psNdx = parseInt(posNdx);
276                valids[psNdx] && (strict || null !== valids[psNdx].match.fn) && (closestTo >= psNdx && (before = psNdx), 
277                psNdx >= closestTo && (after = psNdx));
278            }
279            return -1 !== before && closestTo - before > 1 || closestTo > after ? before : after;
280        }
281        function setValidPosition(pos, validTest, fromSetValid, isSelection) {
282            if (isSelection || opts.insertMode && void 0 !== getMaskSet().validPositions[pos] && void 0 === fromSetValid) {
283                var i, positionsClone = $.extend(!0, {}, getMaskSet().validPositions), lvp = getLastValidPosition();
284                for (i = pos; lvp >= i; i++) delete getMaskSet().validPositions[i];
285                getMaskSet().validPositions[pos] = validTest;
286                var j, valid = !0, vps = getMaskSet().validPositions, needsValidation = !1;
287                for (i = j = pos; lvp >= i; i++) {
288                    var t = positionsClone[i];
289                    if (void 0 !== t) for (var posMatch = j, prevPosMatch = -1; posMatch < getMaskSet().maskLength && (null == t.match.fn && vps[i] && (vps[i].match.optionalQuantifier === !0 || vps[i].match.optionality === !0) || null != t.match.fn); ) {
290                        if (null === t.match.fn || !opts.keepStatic && vps[i] && (void 0 !== vps[i + 1] && getTests(i + 1, vps[i].locator.slice(), i).length > 1 || void 0 !== vps[i].alternation) ? posMatch++ : posMatch = seekNext(j), 
291                        needsValidation === !1 && positionsClone[posMatch] && positionsClone[posMatch].match.def === t.match.def) {
292                            getMaskSet().validPositions[posMatch] = $.extend(!0, {}, positionsClone[posMatch]), 
293                            getMaskSet().validPositions[posMatch].input = t.input, j = posMatch, valid = !0;
294                            break;
295                        }
296                        if (positionCanMatchDefinition(posMatch, t.match.def)) {
297                            var result = isValid(posMatch, t.input, !0, !0);
298                            if (valid = result !== !1, j = result.caret || result.insert ? getLastValidPosition() : posMatch, 
299                            needsValidation = !0, valid) break;
300                        } else {
301                            if (valid = null == t.match.fn, prevPosMatch === posMatch) break;
302                            prevPosMatch = posMatch;
303                        }
304                    }
305                    if (!valid) break;
306                }
307                if (!valid) return getMaskSet().validPositions = $.extend(!0, {}, positionsClone), 
308                resetMaskSet(!0), !1;
309            } else getMaskSet().validPositions[pos] = validTest;
310            return resetMaskSet(!0), !0;
311        }
312        function stripValidPositions(start, end, nocheck, strict) {
313            function IsEnclosedStatic(pos) {
314                var posMatch = getMaskSet().validPositions[pos];
315                if (void 0 !== posMatch && null === posMatch.match.fn) {
316                    var prevMatch = getMaskSet().validPositions[pos - 1], nextMatch = getMaskSet().validPositions[pos + 1];
317                    return void 0 !== prevMatch && void 0 !== nextMatch;
318                }
319                return !1;
320            }
321            var i, startPos = start, positionsClone = $.extend(!0, {}, getMaskSet().validPositions), needsValidation = !1;
322            for (getMaskSet().p = start, i = end - 1; i >= startPos; i--) void 0 !== getMaskSet().validPositions[i] && (nocheck === !0 || !IsEnclosedStatic(i) && opts.canClearPosition(getMaskSet(), i, getLastValidPosition(), str
322ict, opts) !== !1) && delete getMaskSet().validPositions[i];
323            for (resetMaskSet(!0), i = startPos + 1; i <= getLastValidPosition(); ) {
324                for (;void 0 !== getMaskSet().validPositions[startPos]; ) startPos++;
325                var s = getMaskSet().validPositions[startPos];
326                if (startPos > i && (i = startPos + 1), void 0 === getMaskSet().validPositions[i] && isMask(i) || void 0 !== s) i++; else {
327                    var t = getTestTemplate(i);
328                    needsValidation === !1 && positionsClone[startPos] && positionsClone[startPos].match.def === t.match.def ? (getMaskSet().validPositions[startPos] = $.extend(!0, {}, positionsClone[startPos]), 
329                    getMaskSet().validPositions[startPos].input = t.input, delete getMaskSet().validPositions[i], 
330                    i++) : positionCanMatchDefinition(startPos, t.match.def) ? isValid(startPos, t.input || getPlaceholder(i), !0) !== !1 && (delete getMaskSet().validPositions[i], 
331                    i++, needsValidation = !0) : isMask(i) || (i++, startPos--), startPos++;
332                }
333            }
334            resetMaskSet(!0);
335        }
336        function determineTestTemplate(tests, ignoreGreedy) {
337            for (var testPos, testPositions = tests, lvp = getLastValidPosition(), lvTest = getMaskSet().validPositions[lvp] || getTests(0)[0], lvTestAltArr = void 0 !== lvTest.alternation ? lvTest.locator[lvTest.alternation].toString().split(",") : [], ndx = 0; ndx < testPositions.length && (testPos = testPositions[ndx], 
338            !testPos.match || (!opts.greedy && !ignoreGreedy || testPos.match.optionalQuantifier === !0) && (testPos.match.optionality !== !1 && testPos.match.newBlockMarker !== !1 || testPos.match.optionalQuantifier === !0) || !(void 0 === lvTest.alternation || lvTest.alternation !== testPos.alternation || void 0 !== testPos.locator[lvTest.alternation] && checkAlternationMatch(testPos.locator[lvTest.alternation].toString().split(","), lvTestAltArr))); ndx++) ;
339            return testPos;
340        }
341        function getTestTemplate(pos, ndxIntlzr, tstPs) {
342            return getMaskSet().validPositions[pos] || determineTestTemplate(getTests(pos, ndxIntlzr ? ndxIntlzr.slice() : ndxIntlzr, tstPs));
343        }
344        function getTest(pos) {
345            return getMaskSet().validPositions[pos] ? getMaskSet().validPositions[pos] : getTests(pos)[0];
346        }
347        function positionCanMatchDefinition(pos, def) {
348            for (var valid = !1, tests = getTests(pos), tndx = 0; tndx < tests.length; tndx++) if (tests[tndx].match && tests[tndx].match.def === def) {
349                valid = !0;
350                break;
351            }
352            return valid;
353        }
354        function selectBestMatch(pos, alternateNdx) {
355            var bestMatch, indexPos;
356            return (getMaskSet().tests[pos] || getMaskSet().validPositions[pos]) && $.each(getMaskSet().tests[pos] || [ getMaskSet().validPositions[pos] ], function(ndx, lmnt) {
357                var ndxPos = lmnt.alternation ? lmnt.locator[lmnt.alternation].toString().indexOf(alternateNdx) : -1;
358                (void 0 === indexPos || indexPos > ndxPos) && -1 !== ndxPos && (bestMatch = lmnt, 
359                indexPos = ndxPos);
360            }), bestMatch;
361        }
362        function getTests(pos, ndxIntlzr, tstPs) {
363            function resolveTestFromToken(maskToken, ndxInitializer, loopNdx, quantifierRecurse) {
364                function handleMatch(match, loopNdx, quantifierRecurse) {
365                    function isFirstMatch(latestMatch, tokenGroup) {
366                        var firstMatch = 0 === $.inArray(latestMatch, tokenGroup.matches);
367                        return firstMatch || $.each(tokenGroup.matches, function(ndx, match) {
368                            return match.isQuantifier === !0 && (firstMatch = isFirstMatch(latestMatch, tokenGroup.matches[ndx - 1])) ? !1 : void 0;
369                        }), firstMatch;
370                    }
371                    function resolveNdxInitializer(pos, alternateNdx) {
372                        var bestMatch = selectBestMatch(pos, alternateNdx);
373                        return bestMatch ? bestMatch.locator.slice(bestMatch.alternation + 1) : void 0;
374                    }
375                    function staticCanMatchDefinition(source, target) {
376                        return null === source.match.fn && null !== target.match.fn ? target.match.fn.test(source.match.def, getMaskSet(), pos, !1, opts, !1) : !1;
377                    }
378                    if (testPos > 1e4) throw "Inputmask: There is probably an error in your mask definition or in the code. Create an issue on github with an example of the mask you are using. " + getMaskSet().mask;
379                    if (testPos === pos && void 0 === match.matches) return matches.push({
380                        match: match,
381                        locator: loopNdx.reverse(),
382                        cd: cacheDependency
383                    }), !0;
384                    if (void 0 !== match.matches) {
385                        if (match.isGroup && quantifierRecurse !== match) {
386                            if (match = handleMatch(maskToken.matches[$.inArray(match, maskToken.matches) + 1], loopNdx)) return !0;
387                        } else if (match.isOptional) {
388                            var optionalToken = match;
389                            if (match = resolveTestFromToken(match, ndxInitializer, loopNdx, quantifierRecurse)) {
390                                if (latestMatch = matches[matches.length - 1].match, !isFirstMatch(latestMatch, optionalToken)) return !0;
391                                insertStop = !0, testPos = pos;
392                            }
393                        } else if (match.isAlternator) {
394                            var maltMatches, alternateToken = match, malternateMatches = [], currentMatches = matches.slice(), loopNdxCnt = loopNdx.length, altIndex = ndxInitializer.length > 0 ? ndxInitializer.shift() : -1;
395                            if (-1 === altIndex || "string" == typeof altIndex) {
396                                var amndx, currentPos = testPos, ndxInitializerClone = ndxInitializer.slice(), altIndexArr = [];
397                                if ("string" == typeof altIndex) altIndexArr = altIndex.split(","); else for (amndx = 0;
397 amndx < alternateToken.matches.length; amndx++) altIndexArr.push(amndx);
398                                for (var ndx = 0; ndx < altIndexArr.length; ndx++) {
399                                    if (amndx = parseInt(altIndexArr[ndx]), matches = [], ndxInitializer = resolveNdxInitializer(testPos, amndx) || ndxInitializerClone.slice(), 
400                                    match = handleMatch(alternateToken.matches[amndx] || maskToken.matches[amndx], [ amndx ].concat(loopNdx), quantifierRecurse) || match, 
401                                    match !== !0 && void 0 !== match && altIndexArr[altIndexArr.length - 1] < alternateToken.matches.length) {
402                                        var ntndx = $.inArray(match, maskToken.matches) + 1;
403                                        maskToken.matches.length > ntndx && (match = handleMatch(maskToken.matches[ntndx], [ ntndx ].concat(loopNdx.slice(1, loopNdx.length)), quantifierRecurse), 
404                                        match && (altIndexArr.push(ntndx.toString()), $.each(matches, function(ndx, lmnt) {
405                                            lmnt.alternation = loopNdx.length - 1;
406                                        })));
407                                    }
408                                    maltMatches = matches.slice(), testPos = currentPos, matches = [];
409                                    for (var ndx1 = 0; ndx1 < maltMatches.length; ndx1++) {
410                                        var altMatch = maltMatches[ndx1], hasMatch = !1;
411                                        altMatch.alternation = altMatch.alternation || loopNdxCnt;
412                                        for (var ndx2 = 0; ndx2 < malternateMatches.length; ndx2++) {
413                                            var altMatch2 = malternateMatches[ndx2];
414                                            if (("string" != typeof altIndex || -1 !== $.inArray(altMatch.locator[altMatch.alternation].toString(), altIndexArr)) && (altMatch.match.def === altMatch2.match.def || staticCanMatchDefinition(altMatch, altMatch2))) {
415                                                hasMatch = altMatch.match.mask === altMatch2.match.mask, -1 === altMatch2.locator[altMatch.alternation].toString().indexOf(altMatch.locator[altMatch.alternation]) && (altMatch2.locator[altMatch.alternation] = altMatch2.locator[altMatch.alternation] + "," + altMatch.locator[altMatch.alternation], 
416                                                altMatch2.alternation = altMatch.alternation);
417                                                break;
418                                            }
419                                        }
420                                        hasMatch || malternateMatches.push(altMatch);
421                                    }
422                                }
423                                "string" == typeof altIndex && (malternateMatches = $.map(malternateMatches, function(lmnt, ndx) {
424                                    if (isFinite(ndx)) {
425                                        var mamatch, alternation = lmnt.alternation, altLocArr = lmnt.locator[alternation].toString().split(",");
426                                        lmnt.locator[alternation] = void 0, lmnt.alternation = void 0;
427                                        for (var alndx = 0; alndx < altLocArr.length; alndx++) mamatch = -1 !== $.inArray(altLocArr[alndx], altIndexArr), 
428                                        mamatch && (void 0 !== lmnt.locator[alternation] ? (lmnt.locator[alternation] += ",", 
429                                        lmnt.locator[alternation] += altLocArr[alndx]) : lmnt.locator[alternation] = parseInt(altLocArr[alndx]), 
430                                        lmnt.alternation = alternation);
431                                        if (void 0 !== lmnt.locator[alternation]) return lmnt;
432                                    }
433                                })), matches = currentMatches.concat(malternateMatches), testPos = pos, insertStop = matches.length > 0, 
434                                ndxInitializer = ndxInitializerClone.slice();
435                            } else match = handleMatch(alternateToken.matches[altIndex] || maskToken.matches[altIndex], [ altIndex ].concat(loopNdx), quantifierRecurse);
436                            if (match) return !0;
437                        } else if (match.isQuantifier && quantifierRecurse !== maskToken.matches[$.inArray(match, maskToken.matches) - 1]) for (var qt = match, qndx = ndxInitializer.length > 0 ? ndxInitializer.shift() : 0; qndx < (isNaN(qt.quantifier.max) ? qndx + 1 : qt.quantifier.max) && pos >= testPos; qndx++) {
438                            var tokenGroup = maskToken.matches[$.inArray(qt, maskToken.matches) - 1];
439                            if (match = handleMatch(tokenGroup, [ qndx ].concat(loopNdx), tokenGroup)) {
440                                if (latestMatch = matches[matches.length - 1].match, latestMatch.optionalQuantifier = qndx > qt.quantifier.min - 1, 
441                                isFirstMatch(latestMatch, tokenGroup)) {
442                                    if (qndx > qt.quantifier.min - 1) {
443                                        insertStop = !0, testPos = pos;
444                                        break;
445                                    }
446                                    return !0;
447                                }
448                                return !0;
449                            }
450                        } else if (match = resolveTestFromToken(match, ndxInitializer, loopNdx, quantifierRecurse)) return !0;
451                    } else testPos++;
452                }
453                for (var tndx = ndxInitializer.length > 0 ? ndxInitializer.shift() : 0; tndx < maskToken.matches.length; tndx++) if (maskToken.matches[tndx].isQuantifier !== !0) {
454                    var match = handleMatch(maskToken.matches[tndx], [ tndx ].concat(loopNdx), quantifierRecurse);
455                    if (match && testPos === pos) return match;
456                    if (testPos > pos) break;
457                }
458            }
459            function mergeLocators(tests) {
460                var locator = [];
461                return $.isArray(tests) || (tests = [ tests ]), tests.length > 0 && (void 0 === tests[0].alternation ? (locator = determineTestTemplate(tests.slice()).locator.slice(), 
462                0 === locator.length && (locator = tests[0].locator.slice())) : $.each(tests, function(ndx, tst) {
463                    if ("" !== tst.def) if (0 === locator.length) locator = t
463st.locator.slice(); else for (var i = 0; i < locator.length; i++) tst.locator[i] && -1 === locator[i].toString().indexOf(tst.locator[i]) && (locator[i] += "," + tst.locator[i]);
464                })), locator;
465            }
466            function filterTests(tests) {
467                return tests;
468            }
469            var latestMatch, maskTokens = getMaskSet().maskToken, testPos = ndxIntlzr ? tstPs : 0, ndxInitializer = ndxIntlzr ? ndxIntlzr.slice() : [ 0 ], matches = [], insertStop = !1, cacheDependency = ndxIntlzr ? ndxIntlzr.join("") : "";
470            if (pos > -1) {
471                if (void 0 === ndxIntlzr) {
472                    for (var test, previousPos = pos - 1; void 0 === (test = getMaskSet().validPositions[previousPos] || getMaskSet().tests[previousPos]) && previousPos > -1; ) previousPos--;
473                    void 0 !== test && previousPos > -1 && (ndxInitializer = mergeLocators(test), cacheDependency = ndxInitializer.join(""), 
474                    testPos = previousPos);
475                }
476                if (getMaskSet().tests[pos] && getMaskSet().tests[pos][0].cd === cacheDependency) return filterTests(getMaskSet().tests[pos]);
477                for (var mtndx = ndxInitializer.shift(); mtndx < maskTokens.length; mtndx++) {
478                    var match = resolveTestFromToken(maskTokens[mtndx], ndxInitializer, [ mtndx ]);
479                    if (match && testPos === pos || testPos > pos) break;
480                }
481            }
482            return (0 === matches.length || insertStop) && matches.push({
483                match: {
484                    fn: null,
485                    cardinality: 0,
486                    optionality: !0,
487                    casing: null,
488                    def: "",
489                    placeholder: ""
490                },
491                locator: [],
492                cd: cacheDependency
493            }), void 0 !== ndxIntlzr && getMaskSet().tests[pos] ? $.extend(!0, [], matches) : (getMaskSet().tests[pos] = $.extend(!0, [], matches), 
494            getMaskSet().tests[pos]);
495        }
496        function getBufferTemplate() {
497            return void 0 === getMaskSet()._buffer && (getMaskSet()._buffer = getMaskTemplate(!1, 1), 
498            void 0 === getMaskSet().buffer && getMaskSet()._buffer.slice()), getMaskSet()._buffer;
499        }
500        function getBuffer(noCache) {
501            return (void 0 === getMaskSet().buffer || noCache === !0) && (getMaskSet().buffer = getMaskTemplate(!0, getLastValidPosition(), !0)), 
502            getMaskSet().buffer;
503        }
504        function refreshFromBuffer(start, end, buffer) {
505            var i;
506            if (start === !0) resetMaskSet(), start = 0, end = buffer.length; else for (i = start; end > i; i++) delete getMaskSet().validPositions[i];
507            for (i = start; end > i; i++) resetMaskSet(!0), buffer[i] !== opts.skipOptionalPartCharacter && isValid(i, buffer[i], !0, !0);
508        }
509        function casing(elem, test, pos) {
510            switch (test.casing) {
511              case "upper":
512                elem = elem.toUpperCase();
513                break;
514
515              case "lower":
516                elem = elem.toLowerCase();
517                break;
518
519              case "title":
520                var posBefore = getMaskSet().validPositions[pos - 1];
521                elem = 0 === pos || posBefore && posBefore.input === String.fromCharCode(Inputmask.keyCode.SPACE) ? elem.toUpperCase() : elem.toLowerCase();
522            }
523            return elem;
524        }
525        function checkAlternationMatch(altArr1, altArr2) {
526            for (var altArrC = opts.greedy ? altArr2 : altArr2.slice(0, 1), isMatch = !1, alndx = 0; alndx < altArr1.length; alndx++) if (-1 !== $.inArray(altArr1[alndx], altArrC)) {
527                isMatch = !0;
528                break;
529            }
530            return isMatch;
531        }
532        function isValid(pos, c, strict, fromSetValid) {
533            function isSelection(posObj) {
534                return isRTL ? posObj.begin - posObj.end > 1 || posObj.begin - posObj.end === 1 && opts.insertMode : posObj.end - posObj.begin > 1 || posObj.end - posObj.begin === 1 && opts.insertMode;
535            }
536            function _isValid(position, c, strict, fromSetValid) {
537                var rslt = !1;
538                return $.each(getTests(position), function(ndx, tst) {
539                    for (var test = tst.match, loopend = c ? 1 : 0, chrs = "", i = test.cardinality; i > loopend; i--) chrs += getBufferElement(position - (i - 1));
540                    if (c && (chrs += c), getBuffer(!0), rslt = null != test.fn ? test.fn.test(chrs, getMaskSet(), position, strict, opts, isSelection(pos)) : c !== test.def && c !== opts.skipOptionalPartCharacter || "" === test.def ? !1 : {
541                        c: test.placeholder || test.def,
542                        pos: position
543                    }, rslt !== !1) {
544                        var elem = void 0 !== rslt.c ? rslt.c : c;
545                        elem = elem === opts.skipOptionalPartCharacter && null === test.fn ? test.placeholder || test.def : elem;
546                        var validatedPos = position, possibleModifiedBuffer = getBuffer();
547                        if (void 0 !== rslt.remove && ($.isArray(rslt.remove) || (rslt.remove = [ rslt.remove ]), 
548                        $.each(rslt.remove.sort(function(a, b) {
549                            return b - a;
550                        }), function(ndx, lmnt) {
551                            stripValidPositions(lmnt, lmnt + 1, !0);
552                        })), void 0 !== rslt.insert && ($.isArray(rslt.insert) || (rslt.insert = [ rslt.insert ]), 
553                        $.each(rslt.insert.sort(function(a, b) {
554                            return a - b;
555                        }), function(ndx, lmnt) {
556                            isValid(lmnt.pos, lmnt.c, !1, fromSetValid);
557                        })), rslt.refreshFromBuffer) {
558                            var refresh = rslt.refreshFromBuffer;
559                            if (strict = !0, refreshFromBuffer(refresh === !0 ? refresh : refresh.start, refresh.end, possibleModifiedBuffer), 
560                            void 0 === rslt.pos && void 0 === rslt.c) return rslt.pos = getLastValidPosition(), 
561                            !1;
562                            if (validatedPos = void 0 !== rslt.pos ? rslt.pos : position, validatedPos !== position) return rslt = $.extend(rslt, isValid(validatedPos, elem, !0, fromSetValid)), 
563                            !1;
564                        } else if (rslt !== !0 && void 0 !== rslt.pos && rslt.pos !== position && (validatedPos = rslt.pos, 
565                        refreshFromBuffer(position, validatedPos, getBuffer().slice()), validatedPos !== position)) return rslt = $.extend(rslt, isValid(validatedPos, elem, !0)), 
566                        !1;
567                        return rslt !== !0 && void 0 === rslt.pos && void 0 === rslt.c ? !1 : (ndx > 0 && resetMaskSet(!0), 
568                        setValidPosition(validatedPos, $.extend({}, tst, {
569                            input: casing(elem, test, validatedPos)
570                        }), fromSetValid, isSelection(pos)) || (rslt = !1), !1);
571                    }
572                }), rslt;
573            }
574            function alternate(pos, c, strict, fromSetValid) {
575                for (var lastAlt, alternation, isValidRslt, altPos, i, validPos, validPsClone = $.extend(!0, {}, getMaskSet().validPositions), lAlt = getLastValidPosition(); lAlt >= 0 && (altPos = getMaskSet().validPositions[lAlt], 
576                !altPos || void 0 === altPos.alternation || (lastAlt = lAlt, alternation = getMaskSet().validPositions[lastAlt].alternation, 
577                getTestTemplate(lastAlt).locator[altPos.alternation] === altPos.locator[altPos.alternation])); lAlt--) ;
578                if (void 0 !== alternation) {
579                    lastAlt = parseInt(lastAlt);
580                    for (var decisionPos in getMaskSet().validPositions) if (decisionPos = parseInt(decisionPos), 
581                    altPos = getMaskSet().validPositions[decisionPos], decisionPos >= lastAlt && void 0 !== altPos.alternation) {
582                        var altNdxs;
583                        0 === lastAlt ? (altNdxs = [], $.each(getMaskSet().tests[lastAlt], function(ndx, test) {
584                            void 0 !== test.locator[alternation] && (altNdxs = altNdxs.concat(test.locator[alternation].toString().split(",")));
585                        })) : altNdxs = getMaskSet().validPositions[lastAlt].locator[alternation].toString().split(",");
586                        var decisionTaker = void 0 !== altPos.locator[alternation] ? altPos.locator[alternation] : altNdxs[0];
587                        decisionTaker.length > 0 && (decisionTaker = decisionTaker.split(",")[0]);
588                        for (var mndx = 0; mndx < altNdxs.length; mndx++) {
589                            var validInputs = [], staticInputsBeforePos = 0, staticInputsBeforePosAlternate = 0;
590                            if (decisionTaker < altNdxs[mndx]) {
591                                for (var possibilityPos, possibilities, dp = decisionPos; dp >= 0; dp--) if (possibilityPos = getMaskSet().validPositions[dp], 
592                                void 0 !== possibilityPos) {
593                                    var bestMatch = selectBestMatch(dp, altNdxs[mndx]);
594                                    getMaskSet().validPositions[dp].match.def !== bestMatch.match.def && (getMaskSet().validPositions[dp].generatedInput !== !0 && validInputs.push(getMaskSet().validPositions[dp].input), 
595                                    getMaskSet().validPositions[dp] = bestMatch, getMaskSet().validPositions[dp].input = getPlaceholder(dp), 
596                                    null === getMaskSet().validPositions[dp].match.fn && staticInputsBeforePosAlternate++, 
597                                    possibilityPos = bestMatch), possibilities = possibilityPos.locator[alternation], 
598                                    possibilityPos.locator[alternation] = parseInt(altNdxs[mndx]);
599                                    break;
600                                }
601                                if (decisionTaker !== possibilityPos.locator[alternation]) {
602                                    for (i = decisionPos + 1; i < getLastValidPosition(void 0, !0) + 1; i++) validPos = getMaskSet().validPositions[i], 
603                                    validPos && null != validPos.match.fn ? val
603idInputs.push(validPos.input) : pos > i && staticInputsBeforePos++, 
604                                    delete getMaskSet().validPositions[i];
605                                    for (resetMaskSet(!0), opts.keepStatic = !opts.keepStatic, isValidRslt = !0; validInputs.length > 0; ) {
606                                        var input = validInputs.shift();
607                                        if (input !== opts.skipOptionalPartCharacter && !(isValidRslt = isValid(getLastValidPosition(void 0, !0) + 1, input, !1, fromSetValid))) break;
608                                    }
609                                    if (possibilityPos.alternation = alternation, possibilityPos.locator[alternation] = possibilities, 
610                                    isValidRslt) {
611                                        var targetLvp = getLastValidPosition(pos) + 1;
612                                        for (i = decisionPos + 1; i < getLastValidPosition() + 1; i++) validPos = getMaskSet().validPositions[i], 
613                                        (void 0 === validPos || null == validPos.match.fn) && pos > i && staticInputsBeforePosAlternate++;
614                                        pos += staticInputsBeforePosAlternate - staticInputsBeforePos, isValidRslt = isValid(pos > targetLvp ? targetLvp : pos, c, strict, fromSetValid);
615                                    }
616                                    if (opts.keepStatic = !opts.keepStatic, isValidRslt) return isValidRslt;
617                                    resetMaskSet(), getMaskSet().validPositions = $.extend(!0, {}, validPsClone);
618                                }
619                            }
620                        }
621                        break;
622                    }
623                }
624                return !1;
625            }
626            function trackbackAlternations(originalPos, newPos) {
627                for (var vp = getMaskSet().validPositions[newPos], targetLocator = vp.locator, tll = targetLocator.length, ps = originalPos; newPos > ps; ps++) if (void 0 === getMaskSet().validPositions[ps] && !isMask(ps, !0)) {
628                    var tests = getTests(ps), bestMatch = tests[0], equality = -1;
629                    $.each(tests, function(ndx, tst) {
630                        for (var i = 0; tll > i && (void 0 !== tst.locator[i] && checkAlternationMatch(tst.locator[i].toString().split(","), targetLocator[i].toString().split(","))); i++) i > equality && (equality = i, 
631                        bestMatch = tst);
632                    }), setValidPosition(ps, $.extend({}, bestMatch, {
633                        input: bestMatch.match.placeholder || bestMatch.match.def
634                    }), !0);
635                }
636            }
637            strict = strict === !0;
638            var maskPos = pos;
639            void 0 !== pos.begin && (maskPos = isRTL && !isSelection(pos) ? pos.end : pos.begin);
640            for (var result = !1, positionsClone = $.extend(!0, {}, getMaskSet().validPositions), pndx = maskPos - 1; pndx > -1 && !getMaskSet().validPositions[pndx]; pndx--) ;
641            var testTemplate;
642            for (pndx++; maskPos > pndx; pndx++) void 0 === getMaskSet().validPositions[pndx] && (opts.jitMasking === !1 || opts.jitMasking > pndx) && ((testTemplate = getTestTemplate(pndx, getTestTemplate(pndx - 1).locator, pndx - 1)).match.def === opts.radixPointDefinitionSymbol || !isMask(pndx, !0) || $.inArray(opts.radixPoint, getBuffer()) < pndx && testTemplate.match.fn && testTemplate.match.fn.test(getPlaceholder(pndx), getMaskSet(), pndx, !1, opts)) && (result = _isValid(pndx, testTemplate.match.placeholder || (null == testTemplate.match.fn ? testTemplate.match.def : "" !== getPlaceholder(pndx) ? getPlaceholder(pndx) : getBuffer()[pndx]), !0, fromSetValid), 
643            result !== !1 && (getMaskSet().validPositions[result.pos || pndx].generatedInput = !0));
644            if (isSelection(pos) && (handleRemove(void 0, Inputmask.keyCode.DELETE, pos), maskPos = getMaskSet().p), 
645            maskPos < getMaskSet().maskLength && (result = _isValid(maskPos, c, strict, fromSetValid), 
646            (!strict || fromSetValid === !0) && result === !1)) {
647                var currentPosValid = getMaskSet().validPositions[maskPos];
648                if (!currentPosValid || null !== currentPosValid.match.fn || currentPosValid.match.def !== c && c !== opts.skipOptionalPartCharacter) {
649                    if ((opts.insertMode || void 0 === getMaskSet().validPositions[seekNext(maskPos)]) && !isMask(maskPos, !0)) {
650                        var testsFromPos = getTests(maskPos).slice();
651                        "" === testsFromPos[testsFromPos.length - 1].match.def && testsFromPos.pop();
652                        var staticChar = determineTestTemplate(testsFromPos, !0);
653                        staticChar && (staticChar = staticChar.match.placeholder || staticChar.match.def, 
654                        _isValid(maskPos, staticChar, strict, fromSetValid));
655                        for (var nPos = maskPos + 1, snPos = seekNext(maskPos); snPos >= nPos; nPos++) if (result = _isValid(nPos, c, strict, fromSetValid), 
656                        result !== !1) {
657                            trackbackAlternations(maskPos, nPos), maskPos = nPos;
658                            break;
659                        }
660                    }
661                } else result = {
662                    caret: seekNext(maskPos)
663                };
664            }
665            return result === !1 && opts.keepStatic && (result = alternate(maskPos, c, strict, fromSetValid)), 
666            result === !0 && (result = {
667                pos: maskPos
668            }), $.isFunction(opts.postValidation) && result !== !1 && !strict && fromSetValid !== !0 && (result = opts.postValidation(getBuffer(!0), result, opts) ? result : !1), 
669            void 0 === result.pos && (result.pos = maskPos), result === !1 && (resetMaskSet(!0), 
670            getMaskSet().validPositions = $.extend(!0, {}, positionsClone)), result;
671        }
672        function isMask(pos, strict) {
673            var test;
674            if (strict ? (test = getTestTemplate(pos).match, "" === test.def && (test = getTest(pos).match)) : test = getTest(pos).match, 
675            null != test.fn) return test.fn;
676            if (strict !== !0 && pos > -1 && !opts.keepStatic && void 0 === getMaskSet().validPositions[pos]) {
677                var tests = getTests(pos);
678                return tests.length > 2;
679            }
680            return !1;
681        }
682        function seekNext(pos, newBlock) {
683            var maskL = getMaskSet().maskLength;
684            if (pos >= maskL) return maskL;
685            for (var position = pos; ++position < maskL && (newBlock === !0 && (getTest(position).match.newBlockMarker !== !0 || !isMask(position)) || newBlock !== !0 && !isMask(position)); ) ;
686            return position;
687        }
688        function seekPrevious(pos, newBlock) {
689            var tests, position = pos;
690            if (0 >= position) return 0;
691            for (;
691--position > 0 && (newBlock === !0 && getTest(position).match.newBlockMarker !== !0 || newBlock !== !0 && !isMask(position) && (tests = getTests(position), 
692            tests.length < 2 || 2 === tests.length && "" === tests[1].match.def)); ) ;
693            return position;
694        }
695        function getBufferElement(position) {
696            return void 0 === getMaskSet().validPositions[position] ? getPlaceholder(position) : getMaskSet().validPositions[position].input;
697        }
698        function writeBuffer(input, buffer, caretPos, event, triggerInputEvent) {
699            if (event && $.isFunction(opts.onBeforeWrite)) {
700                var result = opts.onBeforeWrite(event, buffer, caretPos, opts);
701                if (result) {
702                    if (result.refreshFromBuffer) {
703                        var refresh = result.refreshFromBuffer;
704                        refreshFromBuffer(refresh === !0 ? refresh : refresh.start, refresh.end, result.buffer || buffer), 
705                        buffer = getBuffer(!0);
706                    }
707                    void 0 !== caretPos && (caretPos = void 0 !== result.caret ? result.caret : caretPos);
708                }
709            }
710            input.inputmask._valueSet(buffer.join("")), void 0 === caretPos || void 0 !== event && "blur" === event.type || caret(input, caretPos), 
711            triggerInputEvent === !0 && (skipInputEvent = !0, $(input).trigger("input"));
712        }
713        function getPlaceholder(pos, test) {
714            if (test = test || getTest(pos).match, void 0 !== test.placeholder) return test.placeholder;
715            if (null === test.fn) {
716                if (pos > -1 && !opts.keepStatic && void 0 === getMaskSet().validPositions[pos]) {
717                    var prevTest, tests = getTests(pos), staticAlternations = [];
718                    if (tests.length > 2) for (var i = 0; i < tests.length; i++) if (tests[i].match.optionality !== !0 && tests[i].match.optionalQuantifier !== !0 && (null === tests[i].match.fn || void 0 === prevTest || tests[i].match.fn.test(prevTest.match.def, getMaskSet(), pos, !0, opts) !== !1) && (staticAlternations.push(tests[i]), 
719                    null === tests[i].match.fn && (prevTest = tests[i]), staticAlternations.length > 1 && new RegExp("[0-9a-bA-Z]").test(staticAlternations[0].match.def))) return opts.placeholder.charAt(pos % opts.placeholder.length);
720                }
721                return test.def;
722            }
723            return opts.placeholder.charAt(pos % opts.placeholder.length);
724        }
725        function checkVal(input, writeOut, strict, nptvl) {
726            function isTemplateMatch() {
727                var isMatch = !1, charCodeNdx = getBufferTemplate().slice(initialNdx, seekNext(initialNdx)).join("").indexOf(charCodes);
728                if (-1 !== charCodeNdx && !isMask(initialNdx)) {
729                    isMatch = !0;
730                    for (var bufferTemplateArr = getBufferTemplate().slice(initialNdx, initialNdx + charCodeNdx), i = 0; i < bufferTemplateArr.length; i++) if (" " !== bufferTemplateArr[i]) {
731                        isMatch = !1;
732                        break;
733                    }
734                }
735                return isMatch;
736            }
737            var result, inputValue = nptvl.slice(), charCodes = "", initialNdx = 0;
738            if (resetMaskSet(), getMaskSet().p = seekNext(-1), !strict) if (opts.autoUnmask !== !0) {
739                var staticInput = getBufferTemplate().slice(0, seekNext(-1)).join(""), matches = inputValue.join("").match(new RegExp("^" + Inputmask.escapeRegex(staticInput), "g"));
740                matches && matches.length > 0 && (inputValue.splice(0, matches.length * staticInput.length), 
741                initialNdx = seekNext(initialNdx));
742            } else initialNdx = seekNext(initialNdx);
743            $.each(inputValue, function(ndx, charCode) {
744                if (void 0 !== charCode) {
745                    var keypress = new $.Event("keypress");
746                    keypress.which = charCode.charCodeAt(0), charCodes += charCode;
747                    var lvp = getLastValidPosition(void 0, !0), lvTest = getMaskSet().validPositions[lvp], nextTest = getTestTemplate(lvp + 1, lvTest ? lvTest.locator.slice() : void 0, lvp);
748                    if (!isTemplateMatch() || strict || opts.autoUnmask) {
749                        var pos = strict ? ndx : null == nextTest.match.fn && nextTest.match.optionality && lvp + 1 < getMaskSet().p ? lvp + 1 : getMaskSet().p;
750                        result = keypressEvent.call(input, keypress, !0, !1, strict, pos), initialNdx = pos + 1, 
751                        charCodes = "";
752                    } else result = keypressEvent.call(input, keypress, !0, !1, !0, lvp + 1);
753                    if (!strict && $.isFunction(opts.onBeforeWrite) && (result = opts.onBeforeWrite(keypress, getBuffer(), result.forwardPosition, opts), 
754                    result && result.refreshFromBuffer)) {
755                        var refresh = result.refreshFromBuffer;
756                        refreshFromBuffer(refresh === !0 ? refresh : refresh.start, refresh.end, result.buffer), 
757                        resetMaskSet(!0), result.caret && (getMaskSet().p = result.caret);
758                    }
759                }
760            }), writeOut && writeBuffer(input, getBuffer(), document.activeElement === input ? seekNext(getLastValidPosition(0)) : void 0, new $.Event("checkval"));
761        }
762        function unmaskedvalue(input) {
763            if (input && void 0 === input.inputmask) return input.value;
764            var umValue = [], vps = getMaskSet().validPositions;
765            for (var pndx in vps) vps[pndx].match && null != vps[pndx].match.fn && umValue.push(vps[pndx].input);
766            var unmaskedValue = 0 === umValue.length ? "" : (isRTL ? umValue.reverse() : umValue).join("");
767            if ($.isFunction(opts.onUnMask)) {
768                var bufferValue = (isRTL ? getBuffer().slice().reverse() : getBuffer()).join("");
769                unmaskedValue = opts.onUnMask(bufferValue, unmaskedValue, opts) || unmaskedValue;
770            }
771            return unmaskedValue;
772        }
773        function caret(input, begin, end, notranslate) {
774            function translatePosition(pos) {
775                if (notranslate !== !0 && isRTL && "number" == typeof pos && (!opts.greedy || "" !== opts.placeholder)) {
776                    var bffrLght = getBuffer().join("").length;
777                    pos = bffrLght - pos;
778                }
779                return pos;
780            }
781            var range;
782            if ("number" != typeof begin) return input.setSelectionRange ? (begin = input.selectionStart, 
783            end = input.selectionEnd) : window.getSelection ? (range = window.getSelection().getRangeAt(0), 
784            (range.commonAncestorContainer.parentNode === input || range.commonAncestorContainer === input) && (begin = range.startOffset, 
785            end = range.endOffset)) : document.selection && document.selection.createRange && (range = document.selection.createRange(), 
786            begin = 0 - range.duplicate().moveStart("character", -input.inputmask._valueGet().length), 
787            end = begin + range.text.length), {
788                begin: translatePosition(begin),
789                end: translatePosition(end)
790            };
791            begin = translatePosition(begin), end = translatePosition(end), end = "number" == typeof end ? end : begin;
792            var scrollCalc = parseInt(((input.ownerDocument.defaultView || window).getComputedStyle ? (input.ownerDocument.defaultView || window).getComputedStyle(input, null) : input.currentStyle).fontSize) * end;
793            if (input.scrollLeft = scrollCalc > input.scrollWidth ? scrollCalc : 0, mobile || opts.insertMode !== !1 || begin !== end || end++, 
794            input.setSelectionRange) input.selectionStart = begin, input.selectionEnd = end; else if (window.getSelection) {
795                if (range = document.createRange(), void 0 === input.firstChild || null === input.firstChild) {
796                    var textNode = document.createTextNode("");
797                    input.appendChild(textNode);
798                }
799                range.setStart(input.firstChild, begin < input.inputmask._valueGet().length ? begin : input.inputmask._valueGet().length), 
800                range.setEnd(input.firstChild, end < input.inputmask._valueGet().length ? end : input.inputmask._valueGet().length), 
801                range.collapse(!0);
802                var sel = window.getSelection();
803                sel.removeAllRanges(), sel.addRange(range);
804            } else input.createTextRange && (range = input.createTextRange(), range.collapse(!0), 
805            range.moveEnd("character", end), range.moveStart("character", begin), range.select());
806        }
807        function determineLastRequiredPosition(returnDefinition) {
808            var pos, testPos, buffer = getBuffer(), bl = buffer.length, lvp = getLastValidPosition(), positions = {}, lvTest = getMaskSet().validPositions[lvp], ndxIntlzr = void 0 !== lvTest ? lvTest.locator.slice() : void 0;
809            for (pos = lvp + 1; pos < buffer.length; pos++) testPos = getTestTemplate(pos, ndxIntlzr, pos - 1), 
810            ndxIntlzr = testPos.locator.slice(), positions[pos] = $.extend(!0, {}, testPos);
811            var lvTestAlt = lvTest && void 0 !== lvTest.alternation ? lvTest.locator[lvTest.alternation] : void 0;
812            for (pos = bl - 1; pos > lvp && (testPos = positions[pos], (testPos.match.optionality || testPos.match.optionalQuantifier || lvTestAlt && (lvTestAlt !== positions[pos].locator[lvTest.alternation] && null != testPos.match.fn || null === testPos.match.fn && testPos.locator[lvTest.alternation] && checkAlternationMatch(testPos.locator[lvTest.alternation].toString().split(","), lvTestAlt.toString().split(",")) && "" !== getTests(pos)[0].def)) && buffer[pos] === getPlaceholder(pos, testPos.match)); pos--) bl--;
813            return returnDefinition ? {
814                l: bl,
815                def: positions[bl] ? positions[bl].match : void 0
816            } : bl;
817        }
818        function clearOptionalTail(buffer) {
819            for (var rl = determineLastRequiredPosition(), lmib = buffer.length - 1; lmib > rl && !isMask(lmib); lmib--) ;
820            return buffer.splice(rl, lmib + 1 - rl), buffer;
821        }
822        function isComplete(buffer) {
823            if ($.isFunction(opts.isComplete)) return opts.isComplete(buffer, opts);
824            if ("*" === opts.repeat) return void 0;
825            var complete = !1, lrp = determineLastRequiredPosition(!0), aml = seekPrevious(lrp.l);
826            if (void 0 === lrp.def || lrp.def.newBlockMarker || lrp.def.optionality || lrp.def.optionalQuantifier) {
827                complete = !0;
828                for (var i = 0; aml >= i; i++) {
829                    var test = getTestTemplate(i).match;
830                    if (null !== test.fn && void 0 === getMaskSet().validPositions[i] && test.optionality !== !0 && test.optionalQuantifier !== !0 || null === test.fn && buffer[i] !== getPlaceholder(i, test)) {
831                        complete = !1;
832                        break;
833                    }
834                }
835            }
836            return complete;
837        }
838        function patchValueProperty(npt) {
839            function patchValhook(type) {
840                if ($.valHooks && (void 0 === $.valHooks[type] || $.valHooks[type].inputmaskpatch !== !0)) {
841                    var valhookGet = $.valHooks[type] && $.valHooks[type].get ? $.valHooks[type].get : function(elem) {
842                        return elem.value;
843                    }, valhookSet = $.valHooks[type] && $.valHooks[type].set ? $.valHooks[type].set : function(elem, value) {
844                        return elem.value = value, elem;
845                    };
846                    $.valHooks[type] = {
847                        get: function(elem) {
848                            if (elem.inputmask) {
849                                if (elem.inputmask.opts.autoUnmask) return elem.inputmask.unmaskedvalue();
850                                var result = valhookGet(elem);
851                                return -1 !== getLastValidPosition(void 0, void 0, elem.inputmask.maskset.validPositions) || opts.nullable !== !0 ? result : "";
852                            }
853                            return valhookGet(elem);
854                        },
855                        set: function(elem, value) {
856                            var result, $elem = $(elem);
857                            return result = valhookSet(elem, value), elem.inputmask && $elem.trigger("setvalue"), 
858                            result;
859                        },
860                        inputmaskpatch: !0
861                    };
862                }
863            }
864            function getter() {
865                return this.inputmask ? this.inputmask.opts.autoUnmask ? this.inputmask.unmaskedvalue() : -1 !== getLastValidPosition() || opts.nullable !== !0 ? document.activeElement === this && opts.clearMaskOnLostFocus ? (isRTL ? clearOptionalTail(getBuffer().slice()).reverse() : clearOptionalTail(getBuffer().slice())).join("") : valueGet.call(this) : "" : valueGet.call(this);
866            }
867            function setter(value) {
868                valueSet.call(this, value), this.inputmask && $(this).trigger("setvalue");
869            }
870            function installNativeValueSetFallback(npt) {
871                EventRuler.on(npt, "mouseenter", function(event) {
872                    var $input = $(this), input = this, value = input.inputmask._valueGet();
873                    value !== getBuffer().join("") && $input.trigger("setvalue");
874                });
875            }
876            var valueGet, valueSet;
877            if (!npt.inputmask.__valueGet) {
878                if (Object.getOwnPropertyDescriptor) {
879                    "function" != typeof Object.getPrototypeOf && (Object.getPrototypeOf = "object" == typeof "test".__proto__ ? function(object) {
880                        return object.__proto__;
881                    } : function(object) {
882                        return object.constructor.prototype;
883                    });
884                    var valueProperty = Object.getPrototypeOf ? Object.getOwnPropertyDescriptor(Object.getPrototypeOf(npt), "value") : void 0;
885                    valueProperty && valueProperty.get && valueProperty.set ? (valueGet = valueProperty.get, 
886                    valueSet = valueProperty.set, Object.defineProperty(npt, "value", {
887                        get: getter,
888                        set: setter,
889                        configurable: !0
890                    })) : "INPUT" !== npt.tagName && (valueGet = function() {
891                        return this.textContent;
892                    }, valueSet = function(value) {
893                        this.textContent = value;
894                    }, Object.defineProperty(npt, "value", {
895                        get: getter,
896                        set: setter,
897                        configurable: !0
898                    }));
899                } else document.__lookupGetter__ && npt.__lookupGetter__("value") && (valueGet = npt.__lookupGetter__("value"), 
900                valueSet = npt.__lookupSetter__("value"), npt.__defineGetter__("value", getter), 
901                npt.__defineSetter__("value", setter));
902                npt.inputmask.__valueGet = valueGet, npt.inputmask._valueGet = function(overruleRTL) {
903                    return isRTL && overruleRTL !== !0 ? valueGet.call(this.el).split("").reverse().join("") : valueGet.call(this.el);
904                }, npt.inputmask.__valueSet = valueSet, npt.inputmask._valueSet = function(value, overruleRTL) {
905                    valueSet.call(this.el, null === value || void 0 === value ? "" : overruleRTL !== !0 && isRTL ? value.split("").reverse().join("") : value);
906                }, void 0 === valueGet && (valueGet = function() {
907                    return this.value;
908                }, valueSet = function(value) {
909                    this.value = value;
910                }, patchValhook(npt.type), installNativeValueSetFallback(npt));
911            }
912        }
913        function handleRemove(input, k, pos, strict) {
914            function generalize() {
915                if (opts.keepStatic) {
916                    resetMaskSet(!0);
917                    var lastAlt, validInputs = [], positionsClone = $.extend(!0, {}, getMaskSet().validPositions);
918                    for (lastAlt = getLastValidPosition(); lastAlt >= 0; lastAlt--) {
919                        var validPos = getMaskSet().validPositions[lastAlt];
920                        if (validPos && (null != validPos.match.fn && validInputs.push(validPos.input), 
921                        delete getMaskSet().validPositions[lastAlt], void 0 !== validPos.alternation && validPos.locator[validPos.alternation] === getTestTemplate(lastAlt).locator[validPos.alternation])) break;
922                    }
923                    if (lastAlt > -1) for (;validInputs.length > 0; ) {
924                        getMaskSet().p = seekNext(getLastValidPosition());
925                        var keypress = new $.Event("keypress");
926                        keypress.which = validInputs.pop().charCodeAt(0), keypressEvent.call(input, keypress, !0, !1, !1, getMaskSet().p);
927                    } else getMaskSet().validPositions = $.extend(!0, {}, positionsClone);
928                }
929            }
930            if ((opts.numericInput || isRTL) && (k === Inputmask.keyCode.BACKSPACE ? k = Inputmask.keyCode.DELETE : k === Inputmask.keyCode.DELETE && (k = Inputmask.keyCode.BACKSPACE), 
931            isRTL)) {
932                var pend = pos.end;
933                pos.end = pos.begin, pos.begin = pend;
934            }
935            k === Inputmask.keyCode.BACKSPACE && (pos.end - pos.begin < 1 || opts.insertMode === !1) ? (pos.begin = seekPrevious(pos.begin), 
936            void 0 === getMaskSet().validPositions[pos.begin] || getMaskSet().validPositions[pos.begin].input !== opts.groupSeparator && getMaskSet().validPositions[pos.begin].input !== opts.radixPoint || pos.begin--) : k === Inputmask.keyCode.DELETE && pos.begin === pos.end && (pos.end = isMask(pos.end) ? pos.end + 1 : seekNext(pos.end) + 1, 
937            void 0 === getMaskSet().validPositions[pos.begin] || getMaskSet().validPositions[pos.begin].input !== opts.groupSeparator && getMaskSet().validPositions[pos.begin].input !== opts.radixPoint || pos.end++), 
938            stripValidPositions(pos.begin, pos.end, !1, strict), strict !== !0 && generalize();
939            var lvp = getLastValidPosition(pos.begin);
940            lvp < pos.begin ? getMaskSet().p = seekNext(lvp) : strict !== !0 && (getMaskSet().p = pos.begin);
941        }
942        function keydownEvent(e) {
943            var input = this, $input = $(input), k = e.keyCode, pos = caret(input);
944            if (k === Inputmask.keyCode.BACKSPACE || k === Inputmask.keyCode.DELETE || iphone && k === Inputmask.keyCode.BACKSPACE_SAFARI || e.ctrlKey && k === Inputmask.keyCode.X && !isInputEventSupported("cut")) e.preventDefault(), 
945            handleRemove(input, k, pos), writeBuffer(input, getBuffer(), getMaskSet().p, e, undoValue !== getBuffer().join("")), 
946            input.inputmask._valueGet() === getBufferTemplate().join("") ? $input.trigger("cleared") : isComplete(getBuffer()) === !0 && $input.trigger("complete"), 
947            opts.showTooltip && (input.title = opts.tooltip || getMaskSet().mask); else if (k === Inputmask.keyCode.END || k === Inputmask.keyCode.PAGE_DOWN) {
948                e.preventDefault();
949                var caretPos = seekNext(getLastValidPosition());
950                opts.insertMode || caretPos !== getMaskSet().maskLength || e.shiftKey || caretPos--, 
951                caret(input, e.shiftKey ? pos.begin : caretPos, caretPos, !0);
952            } else k === Inputmask.keyCode.HOME && !e.shiftKey || k === Inputmask.keyCode.PAGE_UP ? (e.preventDefault(), 
953            caret(input, 0, e.shiftKey ? pos.begin : 0, !0)) : (opts.undoOnEscape && k === Inputmask.keyCode.ESCAPE || 90 === k && e.ctrlKey) && e.altKey !== !0 ? (checkVal(input, !0, !1, undoValue.split("")), 
954            $input.trigger("click")) : k !== Inputmask.keyCode.INSERT || e.shiftKey || e.ctrlKey ? opts.tabThrough === !0 && k === Inputmask.keyCode.TAB ? (e.shiftKey === !0 ? (null === getTest(pos.begin).match.fn && (pos.begin = seekNext(pos.begin)), 
955            pos.end = seekPrevious(pos.begin, !0), pos.begin = seekPrevious(pos.end, !0)) : (pos.begin = seekNext(pos.begin, !0), 
956            pos.end = seekNext(pos.begin, !0), pos.end < getMaskSet().maskLength && pos.end--), 
957            pos.begin < getMaskSet().maskLength && (e.preventDefault(), caret(input, pos.begin, pos.end))) : opts.insertMode !== !1 || e.shiftKey || (k === Inputmask.keyCode.RIGHT ? setTimeout(function() {
958                var caretPos = caret(input);
959                caret(input, caretPos.begin);
960            }, 0) : k === Inputmask.keyCode.LEFT && setTimeout(function() {
961                var caretPos = caret(input);
962                caret(input, isRTL ? caretPos.begin + 1 : caretPos.begin - 1);
963            }, 0)) : (opts.insertMode = !opts.insertMode, caret(input, opts.insertMode || pos.begin !== getMaskSet().maskLength ? pos.begin : pos.begin - 1));
964            opts.onKeyDown.call(this, e, getBuffer(), caret(input).begin, opts), ignorable = -1 !== $.inArray(k, opts.ignorables);
965        }
966        function keypressEvent(e, checkval, writeOut, strict, ndx) {
967            var input = this, $input = $(input), k = e.which || e.charCode || e.keyCode;
968            if (!(checkval === !0 || e.ctrlKey && e.altKey) && (e.ctrlKey || e.metaKey || ignorable)) return k === Inputmask.keyCode.ENTER && undoValue !== getBuffer().join("") && (undoValue = getBuffer().join(""), 
969            setTimeout(function() {
970                $input.trigger("change");
971            }, 0)), !0;
972            if (k) {
973                46 === k && e.shiftKey === !1 && "," === opts.radixPoint && (k = 44);
974                var forwardPosition, pos = checkval ? {
975                    begin: ndx,
976                    end: ndx
977                } : caret(input), c = String.fromCharCode(k);
978                getMaskSet().writeOutBuffer = !0;
979                var valResult = isValid(pos, c, strict);
980                if (valResult !== !1) {
981                    var p = valResult.pos;
982                    if (resetMaskSet(!0), void 0 !== valResult.caret) forwardPosition = valResult.caret; else {
983                        var vps = getMaskSet().validPositions;
984                        forwardPosition = !opts.keepStatic && (void 0 !== vps[p + 1] && getTests(p + 1, vps[p].locator.slice(), p).length > 1 || void 0 !== vps[p].alternation) ? p + 1 : seekNext(p);
985                    }
986                    getMaskSet().p = forwardPosition;
987                }
988                if (writeOut !== !1) {
989                    var self = this;
990                    if (setTimeout(function() {
991                        opts.onKeyValidation.call(self, k, valResult, opts);
992                    }, 0), getMaskSet().writeOutBuffer && valResult !== !1) {
993                        var buffer = getBuffer();
994                        writeBuffer(input, buffer, opts.numericInput && void 0 === valResult.caret ? seekPrevious(forwardPosition) : forwardPosition, e, checkval !== !0), 
995                        checkval !== !0 && setTimeout(function() {
996                            isComplete(buffer) === !0 && $input.trigger("complete");
997                        }, 0);
998                    }
999                }
1000                if (opts.showTooltip && (input.title = opts.tooltip || getMaskSet().mask), e.preventDefault(), 
1001                checkval) return valResult.forwardPosition = forwardPosition, valResult;
1002            }
1003        }
1004        function pasteEvent(e) {
1005            var tempValue, input = this, ev = e.originalEvent || e, $input = $(input), inputValue = input.inputmask._valueGet(!0), caretPos = caret(input);
1006            isRTL && (tempValue = caretPos.end, caretPos.end = caretPos.begin, caretPos.begin = tempValue);
1007            var valueBeforeCaret = inputValue.substr(0, caretPos.begin), valueAfterCaret = inputValue.substr(caretPos.end, inputValue.length);
1008            valueBeforeCaret === (isRTL ? getBufferTemplate().reverse() : getBufferTemplate()).slice(0, caretPos.begin).join("") && (valueBeforeCaret = ""), 
1009            valueAfterCaret === (isRTL ? getBufferTemplate().reverse() : getBufferTemplate()).slice(caretPos.end).join("") && (valueAfterCaret = ""), 
1010            isRTL && (tempValue = valueBeforeCaret, valueBeforeCaret = valueAfterCaret, valueAfterCaret = tempValue), 
1011            window.clipboardData && window.clipboardData.getData ? inputValue = valueBeforeCaret + window.clipboardData.getData("Text") + valueAfterCaret : ev.clipboardData && ev.clipboardData.getData && (inputValue = valueBeforeCaret + ev.clipboardData.getData("text/plain") + valueAfterCaret);
1012            var pasteValue = inputValue;
1013            if ($.isFunction(opts.onBeforePaste)) {
1014                if (pasteValue = opts.onBeforePaste(inputValue, opts), pasteValue === !1) return e.preventDefault();
1015                pasteValue || (pasteValue = inputValue);
1016            }
1017            return checkVal(input, !1, !1, isRTL ? pasteValue.split("").reverse() : pasteValue.toString().split("")), 
1018            writeBuffer(input, getBuffer(), seekNext(getLastValidPosition()), e, !0), isComplete(getBuffer()) === !0 && $input.trigger("complete"), 
1019            e.preventDefault();
1020        }
1021        function inputFallBackEvent(e) {
1022            var input = this, inputValue = input.inputmask._valueGet();
1023            if (getBuffer().join("") !== inputValue) {
1024                var caretPos = caret(input);
1025                if (inputValue = inputValue.replace(new RegExp("(" + Inputmask.escapeRegex(getBufferTemplate().join("")) + ")*"), ""), 
1026                iemobile) {
1027                    var inputChar = inputValue.replace(getBuffer().join(""), "");
1028                    if (1 === inputChar.length) {
1029                        var keypress = new $.Event("keypress");
1030                        return keypress.which = inputChar.charCodeAt(0), keypressEvent.call(input, keypress, !0, !0, !1, getMaskSet().validPositions[caretPos.begin - 1] ? caretPos.begin : caretPos.begin - 1), 
1031                        !1;
1032                    }
1033                }
1034                if (caretPos.begin > inputValue.length && (caret(input, inputValue.length), caretPos = caret(input)), 
1035                getBuffer().length - inputValue.length !== 1 || inputValue.charAt(caretPos.begin) === getBuffer()[caretPos.begin] || inputValue.charAt(caretPos.begin + 1) === getBuffer()[caretPos.begin] || isMask(caretPos.begin)) {
1036                    for (var lvp = getLastValidPosition() + 1, bufferTemplate = getBuffer().slice(lvp).join(""); null === inputValue.match(Inputmask.escapeRegex(bufferTemplate) + "$"); ) bufferTemplate = bufferTemplate.slice(1);
1037                    inputValue = inputValue.replace(bufferTemplate, ""), inputValue = inputValue.split(""), 
1038                    checkVal(input, !0, !1, inputValue), isComplete(getBuffer()) === !0 && $(input).trigger("complete");
1039                } else e.keyCode = Inputmask.keyCode.BACKSPACE, keydownEvent.call(input, e);
1040                e.preventDefault();
1041            }
1042        }
1043        function setValueEvent(e) {
1044            var input = this, value = input.inputmask._valueGet();
1045            checkVal(input, !0, !1, ($.isFunction(opts.onBeforeMask) ? opts.onBeforeMask(value, opts) || value : value).split("")), 
1046            undoValue = getBuffer().join(""), (opts.clearMaskOnLostFocus || opts.clearIncomplete) && input.inputmask._valueGet() === getBufferTemplate().join("") && input.inputmask._valueSet("");
1047        }
1048        function focusEvent(e) {
1049            var input = this, nptValue = input.inputmask._valueGet();
1050            opts.showMaskOnFocus && (!opts.showMaskOnHover || opts.showMaskOnHover && "" === nptValue) ? input.inputmask._valueGet() !== getBuffer().join("") && writeBuffer(input, getBuffer(), seekNext(getLastValidPosition())) : mouseEnter === !1 && caret(input, seekNext(getLastValidPosition())), 
1051            opts.positionCaretOnTab === !0 && setTimeout(function() {
1052                caret(input, seekNext(getLastValidPosition()));
1053            }, 0), undoValue = getBuffer().join("");
1054        }
1055        function mouseleaveEvent(e) {
1056            var input = this;
1057            if (mouseEnter = !1, opts.clearMaskOnLostFocus && document.activeElement !== input) {
1058                var buffer = getBuffer().slice(), nptValue = input.inputmask._valueGet();
1059                nptValue !== input.getAttribute("placeholder") && "" !== nptValue && (-1 === getLastValidPosition() && nptValue === getBufferTemplate().join("") ? buffer = [] : clearOptionalTail(buffer), 
1060                writeBuffer(input, buffer));
1061            }
1062        }
1063        function clickEvent(e) {
1064            function doRadixFocus(clickPos) {
1065                if ("" !== opts.radixPoint) {
1066                    var vps = getMaskSet().validPositions;
1067                    if (void 0 === vps[clickPos] || vps[clickPos].input === getPlaceholder(clickPos)) {
1068                        if (clickPos < seekNext(-1)) return !0;
1069                        var radixPos = $.inArray(opts.radixPoint, getBuffer());
1070                        if (-1 !== radixPos) {
1071                            for (var vp in vps) if (vp > radixPos && vps[vp].input !== getPlaceholder(vp)) return !1;
1072                            return !0;
1073                        }
1074                    }
1075                }
1076                return !1;
1077            }
1078            var input = this;
1079            setTimeout(function() {
1080                if (document.activeElement === input) {
1081                    var selectedCaret = caret(input);
1082                    if (selectedCaret.begin === selectedCaret.end) switch (opts.positionCaretOnClick) {
1083                      case "none":
1084                        break;
1085
1086                      case "radixFocus":
1087                        if (doRadixFocus(selectedCaret.begin)) {
1088                            caret(input, opts.numericInput ? seekNext($.inArray(opts.radixPoint, getBuffer())) : $.inArray(opts.radixPoint, getBuffer()));
1089                            break;
1090                        }
1091
1092                      default:
1093                        var clickPosition = selectedCaret.begin, lvclickPosition = getLastValidPosition(clickPosition, !0), lastPosition = seekNext(lvclickPosition);
1094                        if (lastPosition > clickPosition) caret(input, isMask(clickPosition) || isMask(clickPosition - 1) ? clickPosition : seekNext(clickPosition)); else {
1095                            var placeholder = getPlaceholder(lastPosition);
1096                            ("" !== placeholder && getBuffer()[lastPosition] !== placeholder || !isMask(lastPosition, !0) && getTest(lastPosition).match.def === placeholder) && (lastPosition = seekNext(lastPosition)), 
1097                            caret(input, lastPosition);
1098                        }
1099                    }
1100                }
1101            }, 0);
1102        }
1103        function dblclickEvent(e) {
1104            var input = this;
1105            setTimeout(function() {
1106                caret(input, 0, seekNext(getLastValidPosition()));
1107            }, 0);
1108        }
1109        function cutEvent(e) {
1110            var input = this, $input = $(input), pos = caret(input), ev = e.originalEvent || e, clipboardData = window.clipboardData || ev.clipboardData, clipData = isRTL ? getBuffer().slice(pos.end, pos.begin) : getBuffer().slice(pos.begin, pos.end);
1111            clipboardData.setData("text", isRTL ? clipData.reverse().join("") : clip
1111Data.join("")), 
1112            document.execCommand && document.execCommand("copy"), handleRemove(input, Inputmask.keyCode.DELETE, pos), 
1113            writeBuffer(input, getBuffer(), getMaskSet().p, e, undoValue !== getBuffer().join("")), 
1114            input.inputmask._valueGet() === getBufferTemplate().join("") && $input.trigger("cleared"), 
1115            opts.showTooltip && (input.title = opts.tooltip || getMaskSet().mask);
1116        }
1117        function blurEvent(e) {
1118            var $input = $(this), input = this;
1119            if (input.inputmask) {
1120                var nptValue = input.inputmask._valueGet(), buffer = getBuffer().slice();
1121                undoValue !== buffer.join("") && setTimeout(function() {
1122                    $input.trigger("change"), undoValue = buffer.join("");
1123                }, 0), "" !== nptValue && (opts.clearMaskOnLostFocus && (-1 === getLastValidPosition() && nptValue === getBufferTemplate().join("") ? buffer = [] : clearOptionalTail(buffer)), 
1124                isComplete(buffer) === !1 && (setTimeout(function() {
1125                    $input.trigger("incomplete");
1126                }, 0), opts.clearIncomplete && (resetMaskSet(), buffer = opts.clearMaskOnLostFocus ? [] : getBufferTemplate().slice())), 
1127                writeBuffer(input, buffer, void 0, e));
1128            }
1129        }
1130        function mouseenterEvent(e) {
1131            var input = this;
1132            mouseEnter = !0, document.activeElement !== input && opts.showMaskOnHover && input.inputmask._valueGet() !== getBuffer().join("") && writeBuffer(input, getBuffer());
1133        }
1134        function submitEvent(e) {
1135            undoValue !== getBuffer().join("") && $el.trigger("change"), opts.clearMaskOnLostFocus && -1 === getLastValidPosition() && el.inputmask._valueGet && el.inputmask._valueGet() === getBufferTemplate().join("") && el.inputmask._valueSet(""), 
1136            opts.removeMaskOnSubmit && (el.inputmask._valueSet(el.inputmask.unmaskedvalue(), !0), 
1137            setTimeout(function() {
1138                writeBuffer(el, getBuffer());
1139            }, 0));
1140        }
1141        function resetEvent(e) {
1142            setTimeout(function() {
1143                $el.trigger("setvalue");
1144            }, 0);
1145        }
1146        function mask(elem) {
1147            if (el = elem, $el = $(el), opts.showTooltip && (el.title = opts.tooltip || getMaskSet().mask), 
1148            ("rtl" === el.dir || opts.rightAlign) && (el.style.textAlign = "right"), ("rtl" === el.dir || opts.numericInput) && (el.dir = "ltr", 
1149            el.removeAttribute("dir"), el.inputmask.isRTL = !0, isRTL = !0), EventRuler.off(el), 
1150            patchValueProperty(el), isElementTypeSupported(el, opts) && (EventRuler.on(el, "submit", submitEvent), 
1151            EventRuler.on(el, "reset", resetEvent), EventRuler.on(el, "mouseenter", mouseenterEvent), 
1152            EventRuler.on(el, "blur", blurEvent), EventRuler.on(el, "focus", focusEvent), EventRuler.on(el, "mouseleave", mouseleaveEvent), 
1153            EventRuler.on(el, "click", clickEvent), EventRuler.on(el, "dblclick", dblclickEvent), 
1154            EventRuler.on(el, "paste", pasteEvent), EventRuler.on(el, "dragdrop", pasteEvent), 
1155            EventRuler.on(el, "drop", pasteEvent), EventRuler.on(el, "cut", cutEvent), EventRuler.on(el, "complete", opts.oncomplete), 
1156            EventRuler.on(el, "incomplete", opts.onincomplete), EventRuler.on(el, "cleared", opts.oncleared), 
1157            opts.inputEventOnly !== !0 && (EventRuler.on(el, "keydown", keydownEvent), EventRuler.on(el, "keypress", keypressEvent)), 
1158            EventRuler.on(el, "input", inputFallBackEvent)), EventRuler.on(el, "setvalue", setValueEvent), 
1159            "" !== el.inputmask._valueGet() || opts.clearMaskOnLostFocus === !1 || document.activeElement === el) {
1160                var initialValue = $.isFunction(opts.onBeforeMask) ? opts.onBeforeMask(el.inputmask._valueGet(), opts) || el.inputmask._valueGet() : el.inputmask._valueGet();
1161                checkVal(el, !0, !1, initialValue.split(""));
1162                var buffer = getBuffer().slice();
1163                undoValue = buffer.join(""), isComplete(buffer) === !1 && opts.clearIncomplete && resetMaskSet(), 
1164                opts.clearMaskOnLostFocus && document.activeElement !== el && (-1 === getLastValidPosition() ? buffer = [] : clearOptionalTail(buffer)), 
1165                writeBuffer(el, buffer), document.activeElement === el && caret(el, seekNext(getLastValidPosition()));
1166            }
1167        }
1168        var undoValue, el, $el, maxLength, valueBuffer, isRTL = !1, skipKeyPressEvent = !1, skipInputEvent = !1, ignorable = !1, mouseEnter = !0, EventRuler = {
1169            on: function(input, eventName, eventHandler) {
1170                var ev = function(e) {
1171                    if (void 0 === this.inputmask && "FORM" !== this.nodeName) {
1172                        var imOpts = $.data(this, "_inputmask_opts");
1173                        imOpts ? new Inputmask(imOpts).mask(this) : EventRuler.off(this);
1174                    } else {
1175                        if ("setvalue" === e.type || !(this.disabled || this.readOnly && !("keydown" === e.type && e.ctrlKey && 67 === e.keyCode || opts.tabThrough === !1 && e.keyCode === Inputmask.keyCode.TAB))) {
1176                            switch (e.type) {
1177                              case "input":
1178                                if (skipInputEvent === !0) return skipInputEvent = !1, e.preventDefault();
1179                                break;
1180
1181                              case "keydown":
1182                                skipKeyPressEvent = !1, skipInputEvent = !1;
1183                                break;
1184
1185                              case "keypress":
1186                                if (skipKeyPressEvent === !0) return e.preventDefault();
1187                                skipKeyPressEvent = !0;
1188                                break;
1189
1190                              case "click":
1191                                if (iemobile) {
1192                                    var that = this;
1193                                    return setTimeout(function() {
1194                                        eventHandler.apply(that, arguments);
1195                                    }, 0), !1;
1196                                }
1197                            }
1198                            var returnVal = eventHandler.apply(this, arguments);
1199                            return returnVal === !1 && (e.preventDefault(), e.stopPropagation()), returnVal;
1200                        }
1201                        e.preventDefault();
1202                    }
1203                };
1204                input.inputmask.events[eventName] = input.inputmask.events[eventName] || [], input.inputmask.events[eventName].push(ev), 
1205                -1 !== $.inArray(eventName, [ "submit", "reset" ]) ? null != input.form && $(input.form).on(eventName, ev) : $(input).on(eventName, ev);
1206            },
1207            off: function(input, event) {
1208                if (input.inputmask && input.inputmask.events) {
1209                    var events;
1210                    event ? (events = [], events[event] = input.inputmask.events[event]) : events = input.inputmask.events, 
1211                    $.each(events, function(eventName, evArr) {
1212                        for (;evArr.length > 0; ) {
1213                            var ev = evArr.pop();
1214                            -1 !== $.inArray(eventName, [ "submit", "reset" ]) ? null != input.form && $(input.form).off(eventName, ev) : $(input).off(eventName, ev);
1215                        }
1216                        delete input.inputmask.events[eventName];
1217                    });
1218                }
1219            }
1220        };
1221        if (void 0 !== actionObj) switch (actionObj.action) {
1222          case "isComplete":
1223            return el = actionObj.el, isComplete(getBuffer());
1224
1225          case "unmaskedvalue":
1226            return el = actionObj.el, void 0 !== el && void 0 !== el.inputmask ? (maskset = el.inputmask.maskset, 
1227            opts = el.inputmask.opts, isRTL = el.inputmask.isRTL) : (valueBuffer = actionObj.value, 
1228            opts.numericInput && (isRTL = !0), valueBuffer = ($.isFunction(opts.onBeforeMask) ? opts.onBeforeMask(valueBuffer, opts) || valueBuffer : valueBuffer).split(""), 
1229            checkVal(void 0, !1, !1, isRTL ? valueBuffer.reverse() : valueBuffer), $.isFunction(opts.onBeforeWrite) && opts.onBeforeWrite(void 0, getBuffer(), 0, opts)), 
1230            unmaskedvalue(el);
1231
1232          case "mask":
1233            el = actionObj.el, maskset = el.inputmask.maskset, opts = el.inputmask.opts, isRTL = el.inputmask.isRTL, 
1234            undoValue = getBuffer().join(""), mask(el);
1235            break;
1236
1237          case "format":
1238            return opts.numericInput && (isRTL = !0), valueBuffer = ($.isFunction(opts.onBeforeMask) ? opts.onBeforeMask(actionObj.value, opts) || actionObj.value : actionObj.value).split(""), 
1239            checkVal(void 0, !1, !1, isRTL ? valueBuffer.reverse() : valueBuffer), $.isFunction(opts.onBeforeWrite) && opts.onBeforeWrite(void 0, getBuffer(), 0, opts), 
1240            actionObj.metadata ? {
1241                value: isRTL ? getBuffer().slice().reverse().join("") : getBuffer().join(""),
1242                metadata: maskScope({
1243                    action: "getmetadata"
1244                }, maskset, opts)
1245            } : isRTL ? getBuffer().slice().reverse().join("") : getBuffer().join("");
1246
1247          case "isValid":
1248            opts.numericInput && (isRTL = !0), actionObj.value ? (valueBuffer = actionObj.value.split(""), 
1249            checkVal(void 0, !1, !0, isRTL ? valueBuffer.reverse() : valueBuffer)) : actionObj.value = getBuffer().join("");
1250            for (var buffer = getBuffer(), rl = determineLastRequiredPosition(), lmib = buffer.length - 1; lmib > rl && !isMask(lmib); lmib--) ;
1251            return buffer.splice(rl, lmib + 1 - rl), isComplete(buffer) && actionObj.value === getBuffer().join("");
1252
1253          case "getemptymask":
1254            return getBufferTemplate().join("");
1255
1256          case "remove":
1257            el = actionObj.el, $el = $(el), maskset = el.inputmask.maskset, opts = el.inputmask.opts, 
1258            el.inputmask._valueSet(unmaskedvalue(el)), EventRuler.off(el);
1259            var valueProperty;
1260            Object.getOwnPropertyDescriptor && Object.getPrototypeOf ? (valueProperty = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(el), "value"), 
1261            valueProperty && el.inputmask.__valueGet && Object.defineProperty(el, "value", {
1262                get: el.inputmask.__valueGet,
1263                set: el.inputmask.__valueSet,
1264                configurable: !0
1265            })) : document.__lookupGetter__ && el.__lookupGetter__("value") && el.inputmask.__valueGet && (el.__defineGetter__("value", el.inputmask.__valueGet), 
1266            el.__defineSetter__("value", el.inputmask.__valueSet)), el.inputmask = void 0;
1267            break;
1268
1269          case "getmetadata":
1270            if ($.isArray(maskset.metadata)) {
1271                for (var alternation, lvp = getLastValidPosition(void 0, !0), firstAlt = lvp; firstAlt >= 0; firstAlt--) if (getMaskSet().validPositions[firstAlt] && void 0 !== getMaskSet().validPositions[firstAlt].alternation) {
1272                    alternation = getMaskSet().validPositions[firstAlt].alternation;
1273                    break;
1274                }
1275                return void 0 !== alternation ? maskset.metadata[getMaskSet().validPositions[firstAlt].locator[alternation]] : [];
1276            }
1277            return maskset.metadata;
1278        }
1279    }
1280    Inputmask.prototype = {
1281        defaults: {
1282            placeholder: "_",
1283            optionalmarker: {
1284                start: "[",
1285                end: "]"
1286            },
1287            quantifiermarker: {
1288                start: "{",
1289                end: "}"
1290            },
1291            groupmarker: {
1292                start: "(",
1293                end: ")"
1294            },
1295            alternatormarker: "|",
1296            escapeChar: "\\",
1297            mask: null,
1298            oncomplete: $.noop,
1299            onincomplete: $.noop,
1300            oncleared: $.noop,
1301            repeat: 0,
1302            greedy: !0,
1303            autoUnmask: !1,
1304            removeMaskOnSubmit: !1,
1305            clearMaskOnLostFocus: !0,
1306            insertMode: !0,
1307            clearIncomplete: !1,
1308            aliases: {},
1309            alias: null,
1310            onKeyDown: $.noop,
1311            onBeforeMask: null,
1312            onBeforePaste: function(pastedValue, opts) {
1313                return $.isFunction(opts.onBeforeMask) ? opts.onBeforeMask(pastedValue, opts) : pastedValue;
1314            },
1315            onBeforeWrite: null,
1316            onUnMask: null,
1317            showMaskOnFocus: !0,
1318            showMaskOnHover: !0,
1319            onKeyValidation: $.noop,
1320            skipOptionalPartCharacter: " ",
1321            showTooltip: !1,
1322            tooltip: void 0,
1323            numericInput: !1,
1324            rightAlign: !1,
1325            undoOnEscape: !0,
1326            radixPoint: "",
1327            radixPointDefinitionSymbol: void 0,
1328            groupSeparator: "",
1329            keepStatic: null,
1330            positionCaretOnTab: !1,
1331            tabThrough: !1,
1332            supportsInputType: [ "text", "tel", "password" ],
1333            definitions: {
1334                "9": {
1335                    validator: "[0-9]",
1336                    cardinality: 1,
1337                    definitionSymbol: "*"
1338                },
1339                a: {
1340                    validator: "[A-Za-z\u0410-\u044f\u0401\u0451\xc0-\xff\xb5]",
1341                    cardinality: 1,
1342                    definitionSymbol: "*"
1343                },
1344                "*": {
1345                    validator: "[0-9A-Za-z\u0410-\u044f\u0401\u0451\xc0-\xff\xb5]",
1346                    cardinality: 1
1347                }
1348            },
1349            ignorables: [ 8, 9, 13, 19, 27, 33, 34, 35, 36, 37, 38, 39, 40, 45, 46, 93, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123 ],
1350            isComplete: null,
1351            canClearPosition: $.noop,
1352            postValidation: null,
1353            staticDefinitionSymbol: void 0,
1354            jitMasking: !1,
1355            nullable: !0,
1356            inputEventOnly: !1,
1357            positionCaretOnClick: "lvp"
1358        },
1359        masksCache: {},
1360        mask: function(elems) {
1361            var that = this;
1362            return "string" == typeof elems && (elems = document.getElementById(elems) || document.querySelectorAll(elems)), 
1363            elems = elems.nodeName ? [ elems ] : elems, $.each(elems, function(ndx, el) {
1364                var scopedOpts = $.extend(!0, {}, that.opts);
1365                importAttributeOptions(el, scopedOpts, $.extend(!0, {}, that.userOptions));
1366                var maskset = generateMaskSet(scopedOpts, that.noMasksCache);
1367                void 0 !== maskset && (void 0 !== el.inputmask && el.inputmask.remove(), el.inputmask = new Inputmask(), 
1368                el.inputmask.opts = scopedOpts, el.inputmask.noMasksCache = that.noMasksCache, el.
1368inputmask.userOptions = $.extend(!0, {}, that.userOptions), 
1369                el.inputmask.el = el, el.inputmask.maskset = maskset, el.inputmask.isRTL = !1, $.data(el, "_inputmask_opts", scopedOpts), 
1370                maskScope({
1371                    action: "mask",
1372                    el: el
1373                }));
1374            }), elems && elems[0] ? elems[0].inputmask || this : this;
1375        },
1376        option: function(options, noremask) {
1377            return "string" == typeof options ? this.opts[options] : "object" == typeof options ? ($.extend(this.userOptions, options), 
1378            this.el && noremask !== !0 && this.mask(this.el), this) : void 0;
1379        },
1380        unmaskedvalue: function(value) {
1381            return maskScope({
1382                action: "unmaskedvalue",
1383                el: this.el,
1384                value: value
1385            }, this.el && this.el.inputmask ? this.el.inputmask.maskset : generateMaskSet(this.opts, this.noMasksCache), this.opts);
1386        },
1387        remove: function() {
1388            return this.el ? (maskScope({
1389                action: "remove",
1390                el: this.el
1391            }), this.el.inputmask = void 0, this.el) : void 0;
1392        },
1393        getemptymask: function() {
1394            return maskScope({
1395                action: "getemptymask"
1396            }, this.maskset || generateMaskSet(this.opts, this.noMasksCache), this.opts);
1397        },
1398        hasMaskedValue: function() {
1399            return !this.opts.autoUnmask;
1400        },
1401        isComplete: function() {
1402            return maskScope({
1403                action: "isComplete",
1404                el: this.el
1405            }, this.maskset || generateMaskSet(this.opts, this.noMasksCache), this.opts);
1406        },
1407        getmetadata: function() {
1408            return maskScope({
1409                action: "getmetadata"
1410            }, this.maskset || generateMaskSet(this.opts, this.noMasksCache), this.opts);
1411        },
1412        isValid: function(value) {
1413            return maskScope({
1414                action: "isValid",
1415                value: value
1416            }, this.maskset || generateMaskSet(this.opts, this.noMasksCache), this.opts);
1417        },
1418        format: function(value, metadata) {
1419            return maskScope({
1420                action: "format",
1421                value: value,
1422                metadata: metadata
1423            }, this.maskset || generateMaskSet(this.opts, this.noMasksCache), this.opts);
1424        }
1425    }, Inputmask.extendDefaults = function(options) {
1426        $.extend(!0, Inputmask.prototype.defaults, options);
1427    }, Inputmask.extendDefinitions = function(definition) {
1428        $.extend(!0, Inputmask.prototype.defaults.definitions, definition);
1429    }, Inputmask.extendAliases = function(alias) {
1430        $.extend(!0, Inputmask.prototype.defaults.aliases, alias);
1431    }, Inputmask.format = function(value, options, metadata) {
1432        return Inputmask(options).format(value, metadata);
1433    }, Inputmask.unmask = function(value, options) {
1434        return Inputmask(options).unmaskedvalue(value);
1435    }, Inputmask.isValid = function(value, options) {
1436        return Inputmask(options).isValid(value);
1437    }, Inputmask.remove = function(elems) {
1438        $.each(elems, function(ndx, el) {
1439            el.inputmask && el.inputmask.remove();
1440        });
1441    }, Inputmask.escapeRegex = function(str) {
1442        var specials = [ "/", ".", "*", "+", "?", "|", "(", ")", "[", "]", "{", "}", "\\", "$", "^" ];
1443        return str.replace(new RegExp("(\\" + specials.join("|\\") + ")", "gim"), "\\$1");
1444    }, Inputmask.keyCode = {
1445        ALT: 18,
1446        BACKSPACE: 8,
1447        BACKSPACE_SAFARI: 127,
1448        CAPS_LOCK: 20,
1449        COMMA: 188,
1450        COMMAND: 91,
1451        COMMAND_LEFT: 91,
1452        COMMAND_RIGHT: 93,
1453        CONTROL: 17,
1454        DELETE: 46,
1455        DOWN: 40,
1456        END: 35,
1457        ENTER: 13,
1458        ESCAPE: 27,
1459        HOME: 36,
1460        INSERT: 45,
1461        LEFT: 37,
1462        MENU: 93,
1463        NUMPAD_ADD: 107,
1464        NUMPAD_DECIMAL: 110,
1465        NUMPAD_DIVIDE: 111,
1466        NUMPAD_ENTER: 108,
1467        NUMPAD_MULTIPLY: 106,
1468        NUMPAD_SUBTRACT: 109,
1469        PAGE_DOWN: 34,
1470        PAGE_UP: 33,
1471        PERIOD: 190,
1472        RIGHT: 39,
1473        SHIFT: 16,
1474        SPACE: 32,
1475        TAB: 9,
1476        UP: 38,
1477        WINDOWS: 91,
1478        X: 88
1479    };
1480    var ua = navigator.userAgent, mobile = /mobile/i.test(ua), iemobile = /iemobile/i.test(ua), iphone = /iphone/i.test(ua) && !iemobile;
1481    return window.Inputmask = Inputmask, Inputmask;
1482}(jQuery), function($, Inputmask) {
1483    return void 0 === $.fn.inputmask && ($.fn.inputmask = function(fn, options) {
1484        var nptmask, input = this[0];
1485        if (void 0 === options && (options = {}), "string" == typeof fn) switch (fn) {
1486          case "unmaskedvalue":
1487            return input && input.inputmask ? input.inputmask.unmaskedvalue() : $(input).val();
1488
1489          case "remove":
1490            return this.each(function() {
1491                this.inputmask && this.inputmask.remove();
1492            });
1493
1494          case "getemptymask":
1495            return input && input.inputmask ? input.inputmask.getemptymask() : "";
1496
1497          case "hasMaskedValue":
1498            return input && input.inputmask ? input.inputmask.hasMaskedValue() : !1;
1499
1500          case "isComplete":
1501            return input && input.inputmask ? input.inputmask.isComplete() : !0;
1502
1503          case "getmetadata":
1504            return input && input.inputmask ? input.inputmask.getmetadata() : void 0;
1505
1506          case "setvalue":
1507            $(input).val(options), input && void 0 === input.inputmask && $(input).triggerHandler("setvalue");
1508            break;
1509
1510          case "option":
1511            if ("string" != typeof options) return this.each(function() {
1512                return void 0 !== this.inputmask ? this.inputmask.option(options) : void 0;
1513            });
1514            if (input && void 0 !== input.inputmask) return input.inputmask.option(options);
1515            break;
1516
1517          default:
1518            return options.alias = fn, nptmask = new Inputmask(options), this.each(function() {
1519                nptmask.mask(this);
1520            });
1521        } else {
1522            if ("object" == typeof fn) return nptmask = new Inputmask(fn), void 0 === fn.mask && void 0 === fn.alias ? this.each(function() {
1523                return void 0 !== this.inputmask ? this.inputmask.option(fn) : void nptmask.mask(this);
1524            }) : this.each(function() {
1525                nptmask.mask(this);
1526            });
1527            if (void 0 === fn) return this.each(function() {
1528                nptmask = new Inputmask(options), nptmask.mask(this);
1529            });
1530        }
1531    }), $.fn.inputmask;
1532}(jQuery, Inputmask), function($, Inputmask) {
1533    return Inputmask.extendDefinitions({
1534        h: {
1535            validator: "[01][0-9]|2[0-3]",
1536            cardinality: 2,
1537            prevalidator: [ {
1538                validator: "[0-2]",
1539                cardinality: 1
1540            } ]
1541        },
1542        s: {
1543            validator: "[0-5][0-9]",
1544            cardinality: 2,
1545            prevalidator: [ {
1546                validator: "[0-5]",
1547                cardinality: 1
1548            } ]
1549        },
1550        d: {
1551            validator: "0[1-9]|[12][0-9]|3[01]",
1552            cardinality: 2,
1553            prevalidator: [ {
1554                validator: "[0-3]",
1555                cardinality: 1
1556            } ]
1557        },
1558        m: {
1559            validator: "0[1-9]|1[012]",
1560            cardinality: 2,
1561            prevalidator: [ {
1562                validator: "[01]",
1563                cardinality: 1
1564            } ]
1565        },
1566        y: {
1567            validator: "(19|20)\\d{2}",
1568            cardinality: 4,
1569            prevalidator: [ {
1570                validator: "[12]",
1571                cardinality: 1
1572            }, {
1573                validator: "(19|20)",
1574                cardinality: 2
1575            }, {
1576                validator: "(19|20)\\d",
1577                cardinality: 3
1578            } ]
1579        }
1580    }), Inputmask.extendAliases({
1581        "dd/mm/yyyy": {
1582            mask: "1/2/y",
1583            placeholder: "dd/mm/yyyy",
1584            regex: {
1585                val1pre: new RegExp("[0-3]"),
1586                val1: new RegExp("0[1-9]|[12][0-9]|3[01]"),
1587                val2pre: function(separator) {
1588                    var escapedSeparator = Inputmask.escapeRegex.call(this, separator);
1589                    return new RegExp("((0[1-9]|[12][0-9]|3[01])" + escapedSeparator + "[01])");
1590                },
1591                val2: function(separator) {
1592                    var escapedSeparator = Inputmask.escapeRegex.call(this, separator);
1593                    return new RegExp("((0[1-9]|[12][0-9])" + escapedSeparator + "(0[1-9]|1[012]))|(30" + escapedSeparator + "(0[13-9]|1[012]))|(31" + escapedSeparator + "(0[13578]|1[02]))");
1594                }
1595            },
1596            leapday: "29/02/",
1597            separator: "/",
1598            yearrange: {
1599                minyear: 1900,
1600                maxyear: 2099
1601            },
1602            isInYearRange: function(chrs, minyear, maxyear) {
1603                if (isNaN(chrs)) return !1;
1604                var enteredyear = parseInt(chrs.concat(minyear.toString().slice(chrs.length))), enteredyear2 = parseInt(chrs.concat(maxyear.toString().slice(chrs.length)));
1605                return (isNaN(enteredyear) ? !1 : enteredyear >= minyear && maxyear >= enteredyear) || (isNaN(enteredyear2) ? !1 : enteredyear2 >= minyear && maxyear >= enteredyear2);
1606            },
1607            determinebaseyear: function(minyear, maxyear, hint) {
1608                var currentyear = new Date().getFullYear();
1609                if (minyear > currentyear) return minyear;
1610                if (currentyear > maxyear) {
1611                    for (var maxYearPrefix = maxyear.toString().slice(0, 2), maxYearPostfix = maxyear.toString().slice(2, 4); maxYearPrefix + hint > maxyear; ) maxYearPrefix--;
1612                    var maxxYear = maxYearPrefix + maxYearPostfix;
1613                    return minyear > maxxYear ? minyear : maxxYear;
1614                }
1615                if (currentyear >= minyear && maxyear >= currentyear) {
1616                    for (var currentYearPrefix = currentyear.toString().slice(0, 2); currentYearPrefix + hint > maxyear; ) currentYearPrefix--;
1617                    var currentYearAndHint = currentYearPrefix + hint;
1618                    return minyear > currentYearAndHint ? minyear : currentYearAndHint;
1619                }
1620                return currentyear;
1621            },
1622            onKeyDown: function(e, buffer, caretPos, opts) {
1623                var $input = $(this);
1624                if (e.ctrlKey && e.keyCode === Inputmask.keyCode.RIGHT) {
1625                    var today = new Date();
1626                    $input.val(today.getDate().toString() + (today.getMonth() + 1).toString() + today.getFullYear().toString()), 
1627                    $input.trigger("setvalue");
1628                }
1629            },
1630            getFrontValue: function(mask, buffer, opts) {
1631                for (var start = 0, length = 0, i = 0; i < mask.length && "2" !== mask.charAt(i); i++) {
1632                    var definition = opts.definitions[mask.charAt(i)];
1633                    definition ? (start += length, length = definition.cardinality) : length++;
1634                }
1635                return buffer.join("").substr(start, length);
1636            },
1637            definitions: {
1638                "1": {
1639                    validator: function(chrs, maskset, pos, strict, opts) {
1640                        var isValid = opts.regex.val1.test(chrs);
1641                        return strict || isValid || chrs.charAt(1) !== opts.separator && -1 === "-./".indexOf(chrs.charAt(1)) || !(isValid = opts.regex.val1.test("0" + chrs.charAt(0))) ? isValid : (maskset.buffer[pos - 1] = "0", 
1642                        {
1643                            refreshFromBuffer: {
1644                                start: pos - 1,
1645                                end: pos
1646                            },
1647                            pos: pos,
1648                            c: chrs.charAt(0)
1649                        });
1650                    },
1651                    cardinality: 2,
1652                    prevalidator: [ {
1653                        validator: function(chrs, maskset, pos, strict, opts) {
1654                            var pchrs = chrs;
1655                            isNaN(maskset.buffer[pos + 1]) || (pchrs += maskset.buffer[pos + 1]);
1656                            var isValid = 1 === pchrs.length ? opts.regex.val1pre.test(pchrs) : opts.regex.val1.test(pchrs);
1657                            if (!strict && !isValid) {
1658                                if (isValid = opts.regex.val1.test(chrs + "0")) return maskset.buffer[pos] = chrs, 
1659                                maskset.buffer[++pos] = "0", {
1660                                    pos: pos,
1661                                    c: "0"
1662                                };
1663                                if (isValid = opts.regex.val1.test("0" + chrs)) return maskset.buffer[pos] = "0", 
1664                                pos++, {
1665                                    pos: pos
1666                                };
1667                            }
1668                            return isValid;
1669                        },
1670                        cardinality: 1
1671                    } ]
1672                },
1673                "2": {
1674                    validator: function(chrs, maskset, pos, strict, opts) {
1675                        var frontValue = opts.getFrontValue(maskset.mask, maskset.buffer, opts);
1676                        -1 !== frontValue.indexOf(opts.placeholder[0]) && (frontValue = "01" + opts.separator);
1677                        var isValid = opts.regex.val2(opts.separator).test(frontValue + chrs);
1678                        if (!strict && !isValid && (chrs.charAt(1) === opts.separator || -1 !== "-./".indexOf(chrs.charAt(1))) && (isValid = opts.regex.val2(opts.separator).test(frontValue + "0" + chrs.charAt(0)))) return maskset.buffer[pos - 1] = "0", 
1679                        {
1680                            refreshFromBuffer: {
1681                                start: pos - 1,
1682                                end: pos
1683                            },
1684                            pos: pos,
1685                            c: chrs.charAt(0)
1686                        };
1687                        if (opts.mask.indexOf("2") === opts.mask.length - 1 && isValid) {
1688                            var dayMonthValue = maskset.buffer.join("").substr(4, 4) + chrs;
1689                            if (dayMonthValue !== opts.leapday) return !0;
1690                            var year = parseInt(maskset.buffer.join("").substr(0, 4), 10);
1691                            return year % 4 === 0 ? year % 100 === 0 ? year % 400 === 0 ? !0 : !1 : !0 : !1;
1692                        }
1693                        return isValid;
1694                    },
1695                    cardinality: 2,
1696                    prevalidator: [ {
1697                        validator: function(chrs, maskset, pos, strict, opts) {
1698                            isNaN(maskset.buffer[pos + 1]) || (chrs += maskset.buffer[pos + 1]);
1699                            var frontValue = opts.getFrontValue(maskset.mask, maskset.buffer, opts);
1700                            -1 !== frontValue.indexOf(opts.placeholder[0]) && (frontValue = "01" + opts.separator);
1701                            var isValid = 1 === chrs.length ? opts.regex.val2pre(opts.separator).test(frontValue + chrs) : opts.regex.val2(opts.separator).test(frontValue + chrs);
1702                            return strict || isValid || !(isValid = opts.regex.val2(opts.separator).test(frontValue + "0" + chrs)) ? isValid : (maskset.buffer[pos] = "0", 
1703                            pos++, {
1704                                pos: pos
1705                            });
1706                        },
1707                        cardinality: 1
1708                    } ]
1709                },
1710                y: {
1711                    validator: function(chrs, maskset, pos, strict, opts) {
1712                        if (opts.isInYearRange(chrs, opts.yearrange.minyear, opts.yearrange.maxyear)) {
1713                            var dayMonthValue = maskset.buffer.join("").substr(0, 6);
1714                            if (dayMonthValue !== opts.leapday) return !0;
1715                            var year = parseInt(chrs, 10);
1716                            return year % 4 === 0 ? year % 100 === 0 ? year % 400 === 0 ? !0 : !1 : !0 : !1;
1717                        }
1718                        return !1;
1719                    },
1720                    cardinality: 4,
1721                    prevalidator: [ {
1722                        validator: function(chrs, maskset, pos, strict, opts) {
1723                            var isValid = opts.isInYearRange(chrs, opts.yearrange.minyear, opts.yearrange.maxyear);
1724                            if (!strict && !isValid) {
1725                                var yearPrefix = opts.determinebaseyear(opts.yearrange.minyear, opts.yearrange.maxyear, chrs + "0").toString().slice(0, 1);
1726                                if (isValid = opts.isInYearRange(yearPrefix + chrs, opts.yearrange.minyear, opts.yearrange.maxyear)) return maskset.buffer[pos++] = yearPrefix.charAt(0), 
1727                                {
1728                                    pos: pos
1729                                };
1730                                if (yearPrefix = opts.determinebaseyear(opts.yearrange.minyear, opts.yearrange.maxyear, chrs + "0").toString().slice(0, 2), 
1731                                isValid = opts.isInYearRange(yearPrefix + chrs, opts.yearrange.minyear, opts.yearrange.maxyear)) return maskset.buffer[pos++] = yearPrefix.charAt(0), 
1732                                maskset.buffer[pos++] = yearPrefix.charAt(1), {
1733                                    pos: pos
1734                                };
1735                            }
1736                            return isValid;
1737                        },
1738                        cardinality: 1
1739                    }, {
1740                        validator: function(chrs, maskset, pos, strict, opts) {
1741                            var isValid = opts.isInYearRange(chrs, opts.yearrange.minyear, opts.yearrange.maxyear);
1742                            if (!strict && !isValid) {
1743                                var yearPrefix = opts.determinebaseyear(opts.yearrange.minyear, opts.yearrange.maxyear, chrs).toString().slice(0, 2);
1744                                if (isValid = opts.isInYearRange(chrs[0] + yearPrefix[1] + chrs[1], opts.yearrange.minyear, opts.yearrange.maxyear)) return maskset.buffer[pos++] = yearPrefix.charAt(1), 
1745                                {
1746                                    pos: pos
1747                                };
1748                                if (yearPrefix = opts.determinebaseyear(opts.yearrange.minyear, opts.yearrange.maxyear, chrs).toString().slice(0, 2), 
1749                                opts.isInYearRange(yearPrefix + chrs, opts.yearrange.minyear, opts.yearrange.maxyear)) {
1750                                    var dayMonthValue = maskset.buffer.join("").substr(0, 6);
1751                                    if (dayMonthValue !== opts.leapday) isValid = !0; else {
1752                                        var year = parseInt(chrs, 10);
1753                                        isValid = year % 4 === 0 ? year % 100 === 0 ? year % 400 === 0 ? !0 : !1 : !0 : !1;
1754                                    }
1755                                } else isValid = !1;
1756                                if (isValid) return maskset.buffer[pos - 1] = yearPrefix.charAt(0), maskset.buffer[pos++] = yearPrefix.charAt(1), 
1757                                maskset.buffer[pos++] = chrs.charAt(0), {
1758                                    refreshFromBuffer: {
1759                                        start: pos - 3,
1760                                        end: pos
1761                                    },
1762                                    pos: pos
1763                                };
1764                            }
1765                            return isValid;
1766                        },
1767                        cardinality: 2
1768                    }, {
1769                        validator: function(chrs, maskset, pos, strict, opts) {
1770                            return opts.isInYearRange(chrs, opts.yearrange.minyear, opts.yearrange.maxyear);
1771                        },
1772                        cardinality: 3
1773                    } ]
1774                }
1775            },
1776            insertMode: !1,
1777            autoUnmask: !1
1778        },
1779        "mm/dd/yyyy": {
1780            placeholder: "mm/dd/yyyy",
1781            alias: "dd/mm/yyyy",
1782            regex: {
1783                val2pre: function(separator) {
1784                    var escapedSeparator = Inputmask.escapeRegex.call(this, separator);
1785                    return new RegExp("((0[13-9]|1[012])" + escapedSeparator + "[0-3])|(02" + escapedSeparator + "[0-2])");
1786                },
1787                val2: function(separator) {
1788                    var escapedSeparator = Inputmask.escapeRegex.call(this, separator);
1789                    return new RegExp("((0[1-9]|1[012])" + escapedSeparator + "(0[1-9]|[12][0-9]))|((0[13-9]|1[012])" + escapedSeparator + "30)|((0[13578]|1[02])" + escapedSeparator + "31)");
1790                },
1791                val1pre: new RegExp("[01]"),
1792                val1: new RegExp("0[1-9]|1[012]")
1793            },
1794            leapday: "02/29/",
1795            onKeyDown: function(e, buffer, caretPos, opts) {
1796                var $input = $(this);
1797                if (e.ctrlKey && e.keyCode === Inputmask.keyCode.RIGHT) {
1798                    var today = new Date();
1799                    $input.val((today.getMonth() + 1).toString() + today.getDate().toString() + today.getFullYear().toString()), 
1800                    $input.trigger("setvalue");
1801                }
1802            }
1803        },
1804        "yyyy/mm/dd": {
1805            mask: "y/1/2",
1806            placeholder: "yyyy/mm/dd",
1807            alias: "mm/dd/yyyy",
1808            leapday: "/02/29",
1809            onKeyDown: function(e, buffer, caretPos, opts) {
1810                var $input = $(this);
1811                if (e.ctrlKey && e.keyCode === Inputmask.keyCode.RIGHT) {
1812                    var today = new Date();
1813                    $input.val(today.getFullYear().toString() + (today.getMonth() + 1).toString() + today.getDate().toString()), 
1814                    $input.trigger("setvalue");
1815                }
1816            }
1817        },
1818        "dd.mm.yyyy": {
1819            mask: "1.2.y",
1820            placeholder: "dd.mm.yyyy",
1821            leapday: "29.02.",
1822            separator: ".",
1823            alias: "dd/mm/yyyy"
1824        },
1825        "dd-mm-yyyy": {
1826            mask: "1-2-y",
1827            placeholder: "dd-mm-yyyy",
1828            leapday: "29-02-",
1829            separator: "-",
1830            alias: "dd/mm/yyyy"
1831        },
1832        "mm.dd.yyyy": {
1833            mask: "1.2.y",
1834            placeholder: "mm.dd.yyyy",
1835            leapday: "02.29.",
1836            separator: ".",
1837            alias: "mm/dd/yyyy"
1838        },
1839        "mm-dd-yyyy": {
1840            mask: "1-2-y",
1841            placeholder: "mm-dd-yyyy",
1842            leapday: "02-29-",
1843            separator: "-",
1844            alias: "mm/dd/yyyy"
1845        },
1846        "yyyy.mm.dd": {
1847            mask: "y.1.2",
1848            placeholder: "yyyy.mm.dd",
1849            leapday: ".02.29",
1850            separator: ".",
1851            alias: "yyyy/mm/dd"
1852        },
1853        "yyyy-mm-dd": {
1854            mask: "y-1-2",
1855            placeholder: "yyyy-mm-dd",
1856            leapday: "-02-29",
1857            separator: "-",
1858            alias: "yyyy/mm/dd"
1859        },
1860        datetime: {
1861            mask: "1/2/y h:s",
1862            placeholder: "dd/mm/yyyy hh:mm",
1863            alias: "dd/mm/yyyy",
1864            regex: {
1865                hrspre: new RegExp("[012]"),
1866                hrs24: new RegExp("2[0-4]|1[3-9]"),
1867                hrs: new RegExp("[01][0-9]|2[0-4]"),
1868                ampm: new RegExp("^[a|p|A|P][m|M]"),
1869                mspre: new RegExp("[0-5]"),
1870                ms: new RegExp("[0-5][0-9]")
1871            },
1872            timeseparator: ":",
1873            hourFormat: "24",
1874            definitions: {
1875                h: {
1876                    validator: function(chrs, maskset, pos, strict, opts) {
1877                        if ("24" === opts.hourFormat && 24 === parseInt(chrs, 10)) return maskset.buffer[pos - 1] = "0", 
1878                        maskset.buffer[pos] = "0", {
1879                            refreshFromBuffer: {
1880                                start: pos - 1,
1881                                end: pos
1882                            },
1883                            c: "0"
1884                        };
1885                        var isValid = opts.regex.hrs.test(chrs);
1886                        if (!strict && !isValid && (chrs.charAt(1) === opts.timeseparator || -1 !== "-.:".indexOf(chrs.charAt(1))) && (isValid = opts.regex.hrs.test("0" + chrs.charAt(0)))) return maskset.buffer[pos - 1] = "0", 
1887                        maskset.buffer[pos] = chrs.charAt(0), pos++, {
1888                            refreshFromBuffer: {
1889                                start: pos - 2,
1890                                end: pos
1891                            },
1892                            pos: pos,
1893                            c: opts.timeseparator
1894                        };
1895                        if (isValid && "24" !== opts.hourFormat && opts.regex.hrs24.test(chrs)) {
1896                            var tmp = parseInt(chrs, 10);
1897                            return 24 === tmp ? (maskset.buffer[pos + 5] = "a", maskset.buffer[pos + 6] = "m") : (maskset.buffer[pos + 5] = "p", 
1898                            maskset.buffer[pos + 6] = "m"), tmp -= 12, 10 > tmp ? (maskset.buffer[pos] = tmp.toString(), 
1899                            maskset.buffer[pos - 1] = "0") : (maskset.buffer[pos] = tmp.toString().charAt(1), 
1900                            maskset.buffer[pos - 1] = tmp.toString().charAt(0)), {
1901                                refreshFromBuffer: {
1902                                    start: pos - 1,
1903                                    end: pos + 6
1904                                },
1905                                c: maskset.buffer[pos]
1906                            };
1907                        }
1908                        return isValid;
1909                    },
1910                    cardinality: 2,
1911                    prevalidator: [ {
1912                        validator: function(chrs, maskset, pos, strict, opts) {
1913                            var isValid = opts.regex.hrspre.test(chrs);
1914                            return strict || isValid || !(isValid = opts.regex.hrs.test("0" + chrs)) ? isValid : (maskset.buffer[pos] = "0", 
1915                            pos++, {
1916                                pos: pos
1917                            });
1918                        },
1919                        cardinality: 1
1920                    } ]
1921                },
1922                s: {
1923                    validator: "[0-5][0-9]",
1924                    cardinality: 2,
1925                    prevalidator: [ {
1926                        validator: function(chrs, maskset, pos, strict, opts) {
1927                            var isValid = opts.regex.mspre.test(chrs);
1928                            return strict || isValid || !(isValid = opts.regex.ms.test("0" + chrs)) ? isValid : (maskset.buffer[pos] = "0", 
1929                            pos++, {
1930                                pos: pos
1931                            });
1932                        },
1933                        cardinality: 1
1934                    } ]
1935                },
1936                t: {
1937                    validator: function(chrs, maskset, pos, strict, opts) {
1938                        return opts.regex.ampm.test(chrs + "m");
1939                    },
1940                    casing: "lower",
1941                    cardinality: 1
1942                }
1943            },
1944            insertMode: !1,
1945            autoUnmask: !1
1946        },
1947        datetime12: {
1948            mask: "1/2/y h:s t\\m",
1949            placeholder: "dd/mm/yyyy hh:mm xm",
1950            alias: "datetime",
1951            hourFormat: "12"
1952        },
1953        "mm/dd/yyyy hh:mm xm": {
1954            mask: "1/2/y h:s t\\m",
1955            placeholder: "mm/dd/yyyy hh:mm xm",
1956            alias: "datetime12",
1957            regex: {
1958                val2pre: function(separator) {
1959                    var escapedSeparator = Inputmask.escapeRegex.call(this, separator);
1960                    return new RegExp("((0[13-9]|1[012])" + escapedSeparator + "[0-3])|(02" + escapedSeparator + "[0-2])");
1961                },
1962                val2: function(separator) {
1963                    var escapedSeparator = Inputmask.escapeRegex.call(this, separator);
1964                    return new RegExp("((0[1-9]|1[012])" + escapedSeparator + "(0[1-9]|[12][0-9]))|((0[13-9]|1[012])" + escapedSeparator + "30)|((0[13578]|1[02])" + escapedSeparator + "31)");
1965                },
1966                val1pre: new RegExp("[01]"),
1967                val1: new RegExp("0[1-9]|1[012]")
1968            },
1969            leapday: "02/29/",
1970            onKeyDown: function(e, buffer, caretPos, opts) {
1971                var $input = $(this);
1972                if (e.ctrlKey && e.keyCode === Inputmask.keyCode.RIGHT) {
1973                    var today = new Date();
1974                    $input.val((today.getMonth() + 1).toString() + today.getDate().toString() + today.getFullYear().toString()), 
1975                    $input.trigger("setvalue");
1976                }
1977            }
1978        },
1979        "hh:mm t": {
1980            mask: "h:s t\\m",
1981            placeholder: "hh:mm xm",
1982            alias: "datetime",
1983            hourFormat: "12"
1984        },
1985        "h:s t": {
1986            mask: "h:s t\\m",
1987            placeholder: "hh:mm xm",
1988            alias: "datetime",
1989            hourFormat: "12"
1990        },
1991        "hh:mm:ss": {
1992            mask: "h:s:s",
1993            placeholder: "hh:mm:ss",
1994            alias: "datetime",
1995            autoUnmask: !1
1996        },
1997        "hh:mm": {
1998            mask: "h:s",
1999            placeholder: "hh:mm",
2000            alias: "datetime",
2001            autoUnmask: !1
2002        },
2003        date: {
2004            alias: "dd/mm/yyyy"
2005        },
2006        "mm/yyyy": {
2007            mask: "1/y",
2008            placeholder: "mm/yyyy",
2009            leapday: "donotuse",
2010            separator: "/",
2011            alias: "mm/dd/yyyy"
2012        },
2013        shamsi: {
2014            regex: {
2015                val2pre: function(separator) {
2016                    var escapedSeparator = Inputmask.escapeRegex.call(this, separator);
2017                    return new RegExp("((0[1-9]|1[012])" + escapedSeparator + "[0-3])");
2018                },
2019                val2: function(separator) {
2020                    var escapedSeparator = Inputmask.escapeRegex.call(this, separator);
2021                    return new RegExp("((0[1-9]|1[012])" + escapedSeparator + "(0[1-9]|[12][0-9]))|((0[1-9]|1[012])" + escapedSeparator + "30)|((0[1-6])" + escapedSeparator + "31)");
2022                },
2023                val1pre: new RegExp("[01]"),
2024                val1: new RegExp("0[1-9]|1[012]")
2025            },
2026            yearrange: {
2027                minyear: 1300,
2028                maxyear: 1499
2029            },
2030            mask: "y/1/2",
2031            leapday: "/12/30",
2032            placeholder: "yyyy/mm/dd",
2033            alias: "mm/dd/yyyy",
2034            clearIncomplete: !0
2035        }
2036    }), Inputmask;
2037}(jQuery, Inputmask), function($, Inputmask) {
2038    return Inputmask.extendDefinitions({
2039        A: {
2040            validator: "[A-Za-z\u0410-\u044f\u0401\u0451\xc0-\xff\xb5]",
2041            cardinality: 1,
2042            casing: "upper"
2043        },
2044        "&": {
2045            validator: "[0-9A-Za-z\u0410-\u044f\u0401\u0451\xc0-\xff\xb5]",
2046            cardinality: 1,
2047            casing: "upper"
2048        },
2049        "#": {
2050            validator: "[0-9A-Fa-f]",
2051            cardinality: 1,
2052            casing: "upper"
2053        }
2054    }), Inputmask.extendAliases({
2055        url: {
2056            definitions: {
2057                i: {
2058                    validator: ".",
2059                    cardinality: 1
2060                }
2061            },
2062            mask: "(\\http://)|(\\http\\s://)|(ftp://)|(ftp\\s://)i{+}",
2063            insertMode: !1,
2064            autoUnmask: !1
2065        },
2066        ip: {
2067            mask: "i[i[i]].i[i[i]].i[i[i]].i[i[i]]",
2068            definitions: {
2069                i: {
2070                    validator: function(chrs, maskset, pos, strict, opts) {
2071                        return pos - 1 > -1 && "." !== maskset.buffer[pos - 1] ? (chrs = maskset.buffer[pos - 1] + chrs, 
2072                        chrs = pos - 2 > -1 && "." !== maskset.buffer[pos - 2] ? maskset.buffer[pos - 2] + chrs : "0" + chrs) : chrs = "00" + chrs, 
2073                        new RegExp("25[0-5]|2[0-4][0-9]|[01][0-9][0-9]").test(chrs);
2074                    },
2075                    cardinality: 1
2076                }
2077            },
2078            onUnMask: function(maskedValue, unmaskedValue, opts) {
2079                return maskedValue;
2080            }
2081        },
2082        email: {
2083            mask: "*{1,64}[.*{1,64}][.*{1,64}][.*{1,63}]@-{1,63}.-{1,63}[.-{1,63}][.-{1,63}]",
2084            greedy: !1,
2085            onBeforePaste: function(pastedValue, opts) {
2086                return pastedValue = pastedValue.toLowerCase(), pastedValue.replace("mailto:", "");
2087            },
2088            definitions: {
2089                "*": {
2090                    validator: "[0-9A-Za-z!#$%&'*+/=?^_`{|}~-]",
2091                    cardinality: 1,
2092                    casing: "lower"
2093                },
2094                "-": {
2095                    validator: "[0-9A-Za-z-]",
2096                    cardinality: 1,
2097                    casing: "lower"
2098                }
2099            },
2100            onUnMask: function(maskedValue, unmaskedValue, opts) {
2101                return maskedValue;
2102            }
2103        },
2104        mac: {
2105            mask: "##:##:##:##:##:##"
2106        },
2107        vin: {
2108            mask: "V{13}9{4}",
2109            definitions: {
2110                V: {
2111                    validator: "[A-HJ-NPR-Za-hj-npr-z\\d]",
2112                    cardinality: 1,
2113                    casing: "upper"
2114                }
2115            },
2116            clearIncomplete: !0,
2117            autoUnmask: !0
2118        }
2119    }), Inputmask;
2120}(jQuery, Inputmask), function($, Inputmask) {
2121    return Inputmask.extendAliases({
2122        numeric: {
2123            mask: function(opts) {
2124                function autoEscape(txt) {
2125                    for (var escapedTxt = "", i = 0; i < txt.length; i++) escapedTxt += opts.definitions[txt.charAt(i)] || opts.optionalmarker.start === txt.charAt(i) || opts.optionalmarker.end === txt.charAt(i) || opts.quantifiermarker.start === txt.charAt(i) || opts.quantifiermarker.end === txt.charAt(i) || opts.groupmarker.start === txt.charAt(i) || opts.groupmarker.end === txt.charAt(i) || opts.alternatormarker === txt.charAt(i) ? "\\" + txt.charAt(i) : txt.charAt(i);
2126                    return escapedTxt;
2127                }
2128                if (0 !== opts.repeat && isNaN(opts.integerDigits) && (opts.integerDigits = opts.repeat), 
2129                opts.repeat = 0, opts.groupSeparator === opts.radixPoint && ("." === opts.radixPoint ? opts.groupSeparator = "," : "," === opts.radixPoint ? opts.groupSeparator = "." : opts.groupSeparator = ""), 
2130                " " === opts.groupSeparator && (opts.skipOptionalPartCharacter = void 0), opts.autoGroup = opts.autoGroup && "" !== opts.groupSeparator, 
2131                opts.autoGroup && ("string" == typeof opts.groupSize && isFinite(opts.groupSize) && (opts.groupSize = parseInt(opts.groupSize)), 
2132                isFinite(opts.integerDigits))) {
2133                    var seps = Math.floor(opts.integerDigits / opts.groupSize), mod = opts.integerDigits % opts.groupSize;
2134                    opts.integerDigits = parseInt(opts.integerDigits) + (0 === mod ? seps - 1 : seps), 
2135                    opts.integerDigits < 1 && (opts.integerDigits = "*");
2136                }
2137                opts.placeholder.length > 1 && (opts.placeholder = opts.placeholder.charAt(0)), 
2138                "radixFocus" === opts.positionCaretOnClick && "" === opts.placeholder && opts.integerOptional === !1 && (opts.positionCaretOnClick = "lvp"), 
2139                opts.definitions[";"] = opts.definitions["~"], opts.definitions[";"].definitionSymbol = "~", 
2140                opts.numericInput === !0 && (opts.positionCaretOnClick = "radixFocus" === opts.positionCaretOnClick ? "lvp" : opts.positionCaretOnClick, 
2141                opts.digitsOptional = !1, isNaN(opts.digits) && (opts.digits = 2), opts.decimalProtect = !1);
2142                var mask = autoEscape(opts.prefix);
2143                return mask += "[+]", mask += opts.integerOptional === !0 ? "~{1," + opts.integerDigits + "}" : "~{" + opts.integerDigits + "}", 
2144                void 0 !== opts.digits && (isNaN(opts.digits) || parseInt(opts.digits) > 0) && (opts.decimalProtect && (opts.radixPointDefinitionSymbol = ":"), 
2145                mask += opts.digitsOptional ? "[" + (opts.decimalProtect ? ":" : opts.radixPoint) + ";{1," + opts.digits + "}]" : (opts.decimalProtect ? ":" : opts.radixPoint) + ";{" + opts.digits + "}"), 
2146                mask += "[-]", mask += autoEscape(opts.suffix), opts.greedy = !1, null !== opts.min && (opts.min = opts.min.toString().replace(new RegExp(Inputmask.escapeRegex(opts.groupSeparator), "g"), ""), 
2147                "," === opts.radixPoint && (opts.min = opts.min.replace(opts.radixPoint, "."))), 
2148                null !== opts.max && (opts.max = opts.max.toString().replace(new RegExp(Inputmask.escapeRegex(opts.groupSeparator), "g"), ""), 
2149                "," === opts.radixPoint && (opts.max = opts.max.replace(opts.radixPoint, "."))), 
2150                mask;
2151            },
2152            placeholder: "",
2153            greedy: !1,
2154            digits: "*",
2155            digitsOptional: !0,
2156            radixPoint: ".",
2157            positionCaretOnClick: "radixFocus",
2158            groupSize: 3,
2159            groupSeparator: "",
2160            autoGroup: !1,
2161            allowPlus: !0,
2162            allowMinus: !0,
2163            negationSymbol: {
2164                front: "-",
2165                back: ""
2166            },
2167            integerDigits: "+",
2168            integerOptional: !0,
2169            prefix: "",
2170            suffix: "",
2171            rightAlign: !0,
2172            decimalProtect: !0,
2173            min: null,
2174            max: null,
2175            step: 1,
2176            insertMode: !0,
2177            autoUnmask: !1,
2178            unmaskAsNumber: !1,
2179            postFormat: function(buffer, pos, opts) {
2180                opts.numericInput === !0 && (buffer = buffer.reverse(), isFinite(pos) && (pos = buffer.join("").length - pos - 1));
2181                var i, l;
2182                pos = pos >= buffer.length ? buffer.length - 1 : pos < opts.prefix.length ? opts.prefix.length : pos;
2183                var charAtPos = buffer[pos], cbuf = buffer.slice();
2184                charAtPos === opts.groupSeparator && (cbuf.splice(pos--, 1), charAtPos = cbuf[pos]
2184), 
2185                cbuf[pos] = "!";
2186                var bufVal = cbuf.join(""), bufValOrigin = bufVal;
2187                if (bufVal = bufVal.replace(new RegExp(Inputmask.escapeRegex(opts.suffix) + "$"), ""), 
2188                bufVal = bufVal.replace(new RegExp("^" + Inputmask.escapeRegex(opts.prefix)), ""), 
2189                bufVal.length > 0 && opts.autoGroup || -1 !== bufVal.indexOf(opts.groupSeparator)) {
2190                    var escapedGroupSeparator = Inputmask.escapeRegex(opts.groupSeparator);
2191                    bufVal = bufVal.replace(new RegExp(escapedGroupSeparator, "g"), "");
2192                    var radixSplit = bufVal.split(charAtPos === opts.radixPoint ? "!" : opts.radixPoint);
2193                    if (bufVal = "" === opts.radixPoint ? bufVal : radixSplit[0], charAtPos !== opts.negationSymbol.front && (bufVal = bufVal.replace("!", "?")), 
2194                    bufVal.length > opts.groupSize) for (var reg = new RegExp("([-+]?[\\d?]+)([\\d?]{" + opts.groupSize + "})"); reg.test(bufVal) && "" !== opts.groupSeparator; ) bufVal = bufVal.replace(reg, "$1" + opts.groupSeparator + "$2"), 
2195                    bufVal = bufVal.replace(opts.groupSeparator + opts.groupSeparator, opts.groupSeparator);
2196                    bufVal = bufVal.replace("?", "!"), "" !== opts.radixPoint && radixSplit.length > 1 && (bufVal += (charAtPos === opts.radixPoint ? "!" : opts.radixPoint) + radixSplit[1]);
2197                }
2198                bufVal = opts.prefix + bufVal + opts.suffix;
2199                var needsRefresh = bufValOrigin !== bufVal;
2200                if (needsRefresh) for (buffer.length = bufVal.length, i = 0, l = bufVal.length; l > i; i++) buffer[i] = bufVal.charAt(i);
2201                var newPos = $.inArray("!", bufVal);
2202                return buffer[newPos] = charAtPos, newPos = opts.numericInput && isFinite(pos) ? buffer.join("").length - newPos - 1 : newPos, 
2203                opts.numericInput && (buffer = buffer.reverse(), $.inArray(opts.radixPoint, buffer) < newPos && buffer.join("").length - opts.suffix.length !== newPos && (newPos -= 1)), 
2204                {
2205                    pos: newPos,
2206                    refreshFromBuffer: needsRefresh,
2207                    buffer: buffer
2208                };
2209            },
2210            onBeforeWrite: function(e, buffer, caretPos, opts) {
2211                var rslt;
2212                if (e && ("blur" === e.type || "checkval" === e.type || "keydown" === e.type)) {
2213                    var maskedValue = opts.numericInput ? buffer.slice().reverse().join("") : buffer.join(""), processValue = maskedValue.replace(opts.prefix, "");
2214                    processValue = processValue.replace(opts.suffix, ""), processValue = processValue.replace(new RegExp(Inputmask.escapeRegex(opts.groupSeparator), "g"), ""), 
2215                    "," === opts.radixPoint && (processValue = processValue.replace(opts.radixPoint, "."));
2216                    var isNegative = processValue.match(new RegExp("[-" + Inputmask.escapeRegex(opts.negationSymbol.front) + "]", "g"));
2217                    if (isNegative = null !== isNegative && 1 === isNegative.length, processValue = processValue.replace(new RegExp("[-" + Inputmask.escapeRegex(opts.negationSymbol.front) + "]", "g"), ""), 
2218                    processValue = processValue.replace(new RegExp(Inputmask.escapeRegex(opts.negationSymbol.back) + "$"), ""), 
2219                    isNaN(opts.placeholder) && (processValue = processValue.replace(new RegExp(Inputmask.escapeRegex(opts.placeholder), "g"), "")), 
2220                    processValue = processValue === opts.negationSymbol.front ? processValue + "0" : processValue, 
2221                    "" !== processValue && isFinite(processValue)) {
2222                        var floatValue = parseFloat(processValue), signedFloatValue = isNegative ? -1 * floatValue : floatValue;
2223                        if (null !== opts.min && isFinite(opts.min) && signedFloatValue < parseFloat(opts.min) ? (floatValue = Math.abs(opts.min), 
2224                        isNegative = opts.min < 0, maskedValue = void 0) : null !== opts.max && isFinite(opts.max) && signedFloatValue > parseFloat(opts.max) && (floatValue = Math.abs(opts.max), 
2225                        isNegative = opts.max < 0, maskedValue = void 0), processValue = floatValue.toString().replace(".", opts.radixPoint).split(""), 
2226                        isFinite(opts.digits)) {
2227                            var radixPosition = $.inArray(opts.radixPoint, processValue), rpb = $.inArray(opts.radixPoint, maskedValue);
2228                            -1 === radixPosition && (processValue.push(opts.radixPoint), radixPosition = processValue.length - 1);
2229                            for (var i = 1; i <= opts.digits; i++) opts.digitsOptional || void 0 !== processValue[radixPosition + i] && processValue[radixPosition + i] !== opts.placeholder.charAt(0) ? -1 !== rpb && void 0 !== maskedValue[rpb + i] && (processValue[radixPosition + i] = processValue[radixPosition + i] || maskedValue[rpb + i]) : processValue[radixPosition + i] = "0";
2230                            processValue[processValue.length - 1] === opts.radixPoint && delete processValue[processValue.length - 1];
2231                        }
2232                        if (floatValue.toString() !== processValue && floatValue.toString() + "." !== processValue || isNegative) return !isNegative || 0 === floatValue && "blur" === e.type || (processValue.unshift(opts.negationSymbol.front), 
2233                        processValue.push(opts.negationSymbol.back)), processValue = (opts.prefix + processValue.join("")).split(""), 
2234                        opts.numericInput && (processValue = processValue.reverse()), rslt = opts.postFormat(processValue, opts.numericInput ? caretPos : caretPos - 1, opts), 
2235                        rslt.buffer && (rslt.refreshFromBuffer = rslt.buffer.join("") !== buffer.join("")), 
2236                        rslt;
2237                    }
2238                }
2239                return opts.autoGroup ? (rslt = opts.postFormat(buffer, opts.numericInput ? caretPos : caretPos - 1, opts), 
2240                rslt.caret = caretPos <= opts.prefix.length ? rslt.pos : rslt.pos + 1, rslt) 
2240: void 0;
2241            },
2242            regex: {
2243                integerPart: function(opts) {
2244                    return new RegExp("[" + Inputmask.escapeRegex(opts.negationSymbol.front) + "+]?\\d+");
2245                },
2246                integerNPart: function(opts) {
2247                    return new RegExp("[\\d" + Inputmask.escapeRegex(opts.groupSeparator) + Inputmask.escapeRegex(opts.placeholder.charAt(0)) + "]+");
2248                }
2249            },
2250            signHandler: function(chrs, maskset, pos, strict, opts) {
2251                if (!strict && opts.allowMinus && "-" === chrs || opts.allowPlus && "+" === chrs) {
2252                    var matchRslt = maskset.buffer.join("").match(opts.regex.integerPart(opts));
2253                    if (matchRslt && matchRslt[0].length > 0) return maskset.buffer[matchRslt.index] === ("-" === chrs ? "+" : opts.negationSymbol.front) ? "-" === chrs ? "" !== opts.negationSymbol.back ? {
2254                        pos: matchRslt.index,
2255                        c: opts.negationSymbol.front,
2256                        remove: matchRslt.index,
2257                        caret: pos,
2258                        insert: {
2259                            pos: maskset.buffer.length - opts.suffix.length - 1,
2260                            c: opts.negationSymbol.back
2261                        }
2262                    } : {
2263                        pos: matchRslt.index,
2264                        c: opts.negationSymbol.front,
2265                        remove: matchRslt.index,
2266                        caret: pos
2267                    } : "" !== opts.negationSymbol.back ? {
2268                        pos: matchRslt.index,
2269                        c: "+",
2270                        remove: [ matchRslt.index, maskset.buffer.length - opts.suffix.length - 1 ],
2271                        caret: pos
2272                    } : {
2273                        pos: matchRslt.index,
2274                        c: "+",
2275                        remove: matchRslt.index,
2276                        caret: pos
2277                    } : maskset.buffer[matchRslt.index] === ("-" === chrs ? opts.negationSymbol.front : "+") ? "-" === chrs && "" !== opts.negationSymbol.back ? {
2278                        remove: [ matchRslt.index, maskset.buffer.length - opts.suffix.length - 1 ],
2279                        caret: pos - 1
2280                    } : {
2281                        remove: matchRslt.index,
2282                        caret: pos - 1
2283                    } : "-" === chrs ? "" !== opts.negationSymbol.back ? {
2284                        pos: matchRslt.index,
2285                        c: opts.negationSymbol.front,
2286                        caret: pos + 1,
2287                        insert: {
2288                            pos: maskset.buffer.length - opts.suffix.length,
2289                            c: opts.negationSymbol.back
2290                        }
2291                    } : {
2292                        pos: matchRslt.index,
2293                        c: opts.negationSymbol.front,
2294                        caret: pos + 1
2295                    } : {
2296                        pos: matchRslt.index,
2297                        c: chrs,
2298                        caret: pos + 1
2299                    };
2300                }
2301                return !1;
2302            },
2303            radixHandler: function(chrs, maskset, pos, strict, opts) {
2304                if (!strict && opts.numericInput !== !0 && chrs === opts.radixPoint && void 0 !== opts.digits && (isNaN(opts.digits) || parseInt(opts.digits) > 0)) {
2305                    var radixPos = $.inArray(opts.radixPoint, maskset.buffer), integerValue = maskset.buffer.join("").match(opts.regex.integerPart(opts));
2306                    if (-1 !== radixPos && maskset.validPositions[radixPos]) return maskset.validPositions[radixPos - 1] ? {
2307                        caret: radixPos + 1
2308                    } : {
2309                        pos: integerValue.index,
2310                        c: integerValue[0],
2311                        caret: radixPos + 1
2312                    };
2313                    if (!integerValue || "0" === integerValue[0] && integerValue.index + 1 !== pos) return maskset.buffer[integerValue ? integerValue.index : pos] = "0", 
2314                    {
2315                        pos: (integerValue ? integerValue.index : pos) + 1,
2316                        c: opts.radixPoint
2317                    };
2318                }
2319                return !1;
2320            },
2321            leadingZeroHandler: function(chrs, maskset, pos, strict, opts, isSelection) {
2322                if (!strict) {
2323                    var buffer = maskset.buffer.slice("");
2324                    if (buffer.splice(0, opts.prefix.length), buffer.splice(buffer.length - opts.suffix.length, opts.suffix.length), 
2325                    opts.numericInput === !0) {
2326                        var buffer = buffer.reverse(), bufferChar = buffer[0];
2327                        if ("0" === bufferChar && void 0 === maskset.validPositions[pos - 1]) return {
2328                            pos: pos,
2329                            remove: buffer.length - 1
2330                        };
2331                    } else {
2332                        pos -= opts.prefix.length;
2333                        var radixPosition = $.inArray(opts.radixPoint, buffer), matchRslt = buffer.slice(0, -1 !== radixPosition ? radixPosition : void 0).join("").match(opts.regex.integerNPart(opts));
2334                        if (matchRslt && (-1 === radixPosition || radixPosition >= pos)) {
2335                            var decimalPart = -1 === radixPosition ? 0 : parseInt(buffer.slice(radixPosition + 1).join(""));
2336                            if (0 === matchRslt[0].indexOf("" !== opts.placeholder ? opts.placeholder.charAt(0) : "0") && (matchRslt.index + 1 === pos || isSelection !== !0 && 0 === decimalPart)) return maskset.buffer.splice(matchRslt.index + opts.prefix.length, 1), 
2337                            {
2338                                pos: matchRslt.index + opts.prefix.length,
2339                                remove: matchRslt.index + opts.prefix.length
2340                            };
2341                            if ("0" === chrs && pos <= matchRslt.index && matchRslt[0] !== opts.groupSeparator) return !1;
2342                        }
2343                    }
2344                }
2345                return !0;
2346            },
2347            definitions: {
2348                "~": {
2349                    validator: function(chrs, maskset, pos, strict, opts, isSelection) {
2350                        var isValid = opts.signHandler(chrs, maskset, pos, strict, opts);
2351                        if (!isValid && (isValid = opts.radixHandler(chrs, maskset, pos, strict, opts), 
2352                        !isValid && (isValid = strict ? new RegExp("[0-9" + Inputmask.escapeRegex(opts.groupSeparator) + "]").test(chrs) : new RegExp("[0-9]").test(chrs), 
2353                        isValid === !0 && (isValid = opts.leadingZeroHandler(chrs, maskset, pos, strict, opts, isSelection), 
2354                        isValid === !0)))) {
2355                            var radixPosition = $.inArray(opts.radixPoint, maskset.buffer);
2356                            isValid = -1 !== radixPosition && (opts.digitsOptional === !1 || maskset.validPositions[pos]) && opts.numericInput !== !0 && pos > radixPosition && !strict ? {
2357                                pos: pos,
2358                                remove: pos
2359                            } : {
2360                                pos: pos
2361                            };
2362                        }
2363                        return isValid;
2364                    },
2365                    cardinality: 1
2366                },
2367                "+": {
2368                    validator: function(chrs, maskset, pos, strict, opts) {
2369                        var isValid = opts.signHandler(chrs, maskset, pos, strict, opts);
2370                        return !isValid && (strict && opts.allowMinus && chrs === opts.negationSymbol.front || opts.allowMinus && "-" === chrs || opts.allowPlus && "+" === chrs) && (isValid = strict || "-" !== chrs ? !0 : "" !== opts.negationSymbol.back ? {
2371                            pos: pos,
2372                            c: "-" === chrs ? opts.negationSymbol.front : "+",
2373                            caret: pos + 1,
2374                            insert: {
2375                                pos: maskset.buffer.length,
2376                                c: opts.negationSymbol.back
2377                            }
2378                        } : {
2379                            pos: pos,
2380                            c: "-" === chrs ? opts.negationSymbol.front : "+",
2381                            caret: pos + 1
2382                        }), isValid;
2383                    },
2384                    cardinality: 1,
2385                    placeholder: ""
2386                },
2387                "-": {
2388                    validator: function(chrs, maskset, pos, strict, opts) {
2389                        var isValid = opts.signHandler(chrs, maskset, pos, strict, opts);
2390                        return !isValid && strict && opts.allowMinus && chrs === opts.negationSymbol.back && (isValid = !0), 
2391                        isValid;
2392                    },
2393                    cardinality: 1,
2394                    placeholder: ""
2395                },
2396                ":": {
2397                    validator: function(chrs, maskset, pos, strict, opts) {
2398                        var isValid = opts.signHandler(chrs, maskset, pos, strict, opts);
2399                        if (!isValid) {
2400                            var radix = "[" + Inputmask.escapeRegex(opts.radixPoint) + "]";
2401                            isValid = new RegExp(radix).test(chrs), isValid && maskset.validPositions[pos] && maskset.validPositions[pos].match.placeholder === opts.radixPoint && (isValid = {
2402                                caret: pos + 1
2403                            });
2404                        }
2405                        return isValid ? {
2406                            c: opts.radixPoint
2407                        } : isValid;
2408                    },
2409                    cardinality: 1,
2410                    placeholder: function(opts) {
2411                        return opts.radixPoint;
2412                    }
2413                }
2414            },
2415            onUnMask: function(maskedValue, unmaskedValue, opts) {
2416                if ("" === unmaskedValue && opts.nullable === !0) return unmaskedValue;
2417                var processValue = maskedValue.replace(opts.prefix, "");
2418                return processValue = processValue.replace(opts.suffix, ""), processValue = processValue.replace(new RegExp(Inputmask.escapeRegex(opts.groupSeparator), "g"), ""), 
2419                opts.unmaskAsNumber ? ("" !== opts.radixPoint && -1 !== processValue.indexOf(opts.radixPoint) && (processValue = processValue.replace(Inputmask.escapeRegex.call(this, opts.radixPoint), ".")), 
2420                Number(processValue)) : processValue;
2421            },
2422            isComplete: function(buffer, opts) {
2423                var maskedValue = buffer.join(""), bufClone = buffer.slice();
2424                if (opts.postFormat(bufClone, 0, opts), bufClone.join("") !== maskedValue) return !1;
2425                var processValue = maskedValue.replace(opts.prefix, "");
2426                return processValue = processValue.replace(opts.suffix, ""), processValue = processValue.replace(new RegExp(Inputmask.escapeRegex(opts.groupSeparator), "g"), ""), 
2427                "," === opts.radixPoint && (processValue = processValue.replace(Inputmask.escapeRegex(opts.radixPoint), ".")), 
2428                isFinite(processValue);
2429            },
2430            onBeforeMask: function(initialValue, opts) {
2431                if ("" !== opts.radixPoint && isFinite(initialValue)) initialValue = initialValue.toString().replace(".", opts.radixPoint); else {
2432                    var kommaMatches = initialValue.match(/,/g), dotMatches = initialValue.match(/\./g);
2433                    dotMatches && kommaMatches ? dotMatches.length > kommaMatches.length ? (initialValue = initialValue.replace(/\./g, ""), 
2434                    initialValue = initialValue.replace(",", opts.radixPoint)) : kommaMatches.length > dotMatches.length ? (initialValue = initialValue.replace(/,/g, ""), 
2435                    initialValue = initialValue.replace(".", opts.radixPoint)) : initialValue = initialValue.indexOf(".") < initialValue.indexOf(",") ? initialValue.replace(/\./g, "") : initialValue = initialValue.replace(/,/g, "") : initialValue = initialValue.replace(new RegExp(Inputmask.escapeRegex(opts.groupSeparator), "g"), "");
2436                }
2437                if (0 === opts.digits && (-1 !== initialValue.indexOf(".") ? initialValue = initialValue.substring(0, initialValue.indexOf(".")) : -1 !== initialValue.indexOf(",") && (initialValue = initialValue.substring(0, initialValue.indexOf(",")))), 
2438                "" !== opts.radixPoint && isFinite(opts.digits) && -1 !== initialValue.indexOf(opts.radixPoint)) {
2439                    var valueParts = initialValue.split(opts.radixPoint), decPart = valueParts[1].match(new RegExp("\\d*"))[0];
2440                    if (parseInt(opts.digits) < decPart.toString().length) {
2441                        var digitsFactor = Math.pow(10, parseInt(opts.digits));
2442                        initialValue = initialValue.replace(Inputmask.escapeRegex(opts.radixPoint), "."), 
2443                        initialValue = Math.round(parseFloat(initialValue) * digitsFactor) / digitsFactor, 
2444                        initialValue = initialValue.toString().replace(".", opts.radixPoint);
2445                    }
2446                }
2447                return initialValue.toString();
2448            },
2449            canClearPosition: function(maskset, position, lvp, strict, opts) {
2450                var positionInput = maskset.validPositions[position].input, canClear = positionInput !== opts.radixPoint || null !== maskset.validPositions[position].match.fn && opts.decimalProtect === !1 || isFinite(positionInput) || position === lvp || positionInput === opts.groupSeparator || positionInput === opts.negationSymbol.front || positionInput === opts.negationSymbol.back;
2451                return canClear;
2452            },
2453            onKeyDown: function(e, buffer, caretPos, opts) {
2454                var $input = $(this);
2455                if (e.ctrlKey) switch (e.keyCode) {
2456                  case Inputmask.keyCode.UP:
2457                    $input.val(parseFloat(this.inputmask.unmaskedvalue()) + parseInt(opts.step)), $input.trigger("setvalue");
2458                    break;
2459
2460                  case Inputmask.keyCode.DOWN:
2461                    $input.val(parseFloat(this.inputmask.unmaskedvalue()) - parseInt(opts.step)), $input.trigger("setvalue");
2462                }
2463            }
2464        },
2465        currency: {
2466            prefix: "$ ",
2467            groupSeparator: ",",
2468            alias: "numeric",
2469            placeholder: "0",
2470            autoGroup: !0,
2471            digits: 2,
2472            digitsOptional: !1,
2473            clearMaskOnLostFocus: !1
2474        },
2475        decimal: {
2476            alias: "numeric"
2477        },
2478        integer: {
2479            alias: "numeric",
2480            digits: 0,
2481            radixPoint: ""
2482        },
2483        percentage: {
2484            alias: "numeric",
2485            digits: 2,
2486            radixPoint: ".",
2487            placeholder: "0",
2488            autoGroup: !1,
2489            min: 0,
2490            max: 100,
2491            suffix: " %",
2492            allowPlus: !1,
2493            allowMinus: !1
2494        }
2495    }), Inputmask;
2496}(jQuery, Inputmask), function($, Inputmask) {
2497    return Inputmask.extendAliases({
2498        abstractphone: {
2499            countrycode: "",
2500            phoneCodes: [],
2501            mask: function(opts) {
2502                return opts.definitions = {
2503                    "#": opts.definitions[9]
2504                }, opts.phoneCodes.sort(function(a, b) {
2505                    return (a.mask || a) < (b.mask || b) ? -1 : 1;
2506                });
2507            },
2508            keepStatic: !1,
2509            onBeforeMask: function(value, opts) {
2510                var processedValue = value.replace(/^0{1,2}/, "").replace(/[\s]/g, "");
2511                return (processedValue.indexOf(opts.countrycode) > 1 || -1 === processedValue.indexOf(opts.countrycode)) && (processedValue = "+" + opts.countrycode + processedValue), 
2512                processedValue;
2513            }
2514        }
2515    }), Inputmask;
2516}(jQuery, Inputmask), function($, Inputmask) {
2517    return Inputmask.extendAliases({
2518        Regex: {
2519            mask: "r",
2520            greedy: !1,
2521            repeat: "*",
2522            regex: null,
2523            regexTokens: null,
2524            tokenizer: /\[\^?]?(?:[^\\\]]+|\\[\S\s]?)*]?|\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9][0-9]*|x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4}|c[A-Za-z]|[\S\s]?)|\((?:\?[:=!]?)?|(?:[?*+]|\{[0-9]+(?:,[0-9]*)?\})\??|[^.?*+^${[()|\\]+|./g,
2525            quantifierFilter: /[0-9]+[^,]/,
2526            isComplete: function(buffer, opts) {
2527                return new RegExp(opts.regex).test(buffer.join(""));
2528            },
2529            definitions: {
2530                r: {
2531                    validator: function(chrs, maskset, pos, strict, opts) {
2532                        function RegexToken(isGroup, isQuantifier) {
2533                            this.matches = [], this.isGroup = isGroup || !1, this.isQuantifier = isQuantifier || !1, 
2534                            this.quantifier = {
2535                                min: 1,
2536                                max: 1
2537                            }, this.repeaterPart = void 0;
2538                        }
2539                        function analyseRegex() {
2540                            var match, m, currentToken = new RegexToken(), opengroups = [];
2541                            for (opts.regexTokens = []; match = opts.tokenizer.exec(opts.regex); ) switch (m = match[0], 
2542                            m.charAt(0)) {
2543                              case "(":
2544                                opengroups.push(new RegexToken(!0));
2545                                break;
2546
2547                              case ")":
2548                                groupToken = opengroups.pop(), opengroups.length > 0 ? opengroups[opengroups.length - 1].matches.push(groupToken) : currentToken.matches.push(groupToken);
2549                                break;
2550
2551                              case "{":
2552                              case "+":
2553                              case "*":
2554                                var quantifierToken = new RegexToken(!1, !0);
2555                                m = m.replace(/[{}]/g, "");
2556                                var mq = m.split(","), mq0 = isNaN(mq[0]) ? mq[0] : parseInt(mq[0]), mq1 = 1 === mq.length ? mq0 : isNaN(mq[1]) ? mq[1] : parseInt(mq[1]);
2557                                if (quantifierToken.quantifier = {
2558                                    min: mq0,
2559                                    max: mq1
2560                                }, opengroups.length > 0) {
2561                                    var matches = opengroups[opengroups.length - 1].matches;
2562                                    match = matches.pop(), match.isGroup || (groupToken = new RegexToken(!0), groupToken.matches.push(match), 
2563                                    match = groupToken), matches.push(match), matches.push(quantifierToken);
2564                                } else match = currentToken.matches.pop(), match.isGroup || (groupToken = new RegexToken(!0), 
2565                                groupToken.matches.push(match), match = groupToken), currentToken.matches.push(match), 
2566                                currentToken.matches.push(quantifierToken);
2567                                break;
2568
2569                              default:
2570                                opengroups.length > 0 ? opengroups[opengroups.length - 1].matches.push(m) : currentToken.matches.push(m);
2571                            }
2572                            currentToken.matches.length > 0 && opts.regexTokens.push(currentToken);
2573                        }
2574                        function validateRegexToken(token, fromGroup) {
2575                            var isvalid = !1;
2576                            fromGroup && (regexPart += "(", openGroupCount++);
2577                            for (var mndx = 0; mndx < token.matches.length; mndx++) {
2578                                var matchToken = token.matches[mndx];
2579                                if (matchToken.isGroup === !0) isvalid = validateRegexToken(matchToken, !0); else if (matchToken.isQuantifier === !0) {
2580                                    var crrntndx = $.inArray(matchToken, token.matches), matchGroup = token.matches[crrntndx - 1], regexPartBak = regexPart;
2581                                    if (isNaN(matchToken.quantifier.max)) {
2582                                        for (;matchToken.repeaterPart && matchToken.repeaterPart !== regexPart && matchToken.repeaterPart.length > regexPart.length && !(isvalid = validateRegexToken(matchGroup, !0)); ) ;
2583                                        isvalid = isvalid || validateRegexToken(matchGroup, !0), isvalid && (matchToken.repeaterPart = regexPart), 
2584                                        regexPart = regexPartBak + matchToken.quantifier.max;
2585                                    } else {
2586                                        for (var i = 0, qm = matchToken.quantifier.max - 1; qm > i && !(isvalid = validateRegexToken(matchGroup, !0)); i++) ;
2587                                        regexPart = regexPartBak + "{" + matchToken.quantifier.min + "," + matchToken.quantifier.max + "}";
2588                                    }
2589                                } else if (void 0 !== matchToken.matches) for (var k = 0; k < matchToken.length && !(isvalid = validateRegexToken(matchToken[k], fromGroup)); k++) ; else {
2590                                    var testExp;
2591                                    if ("[" == matchToken.charAt(0)) {
2592                                        testExp = regexPart, testExp += matchToken;
2593                                        for (var j = 0; openGroupCount > j; j++) testExp += ")";
2594                                        var exp = new RegExp("^(" + testExp + ")$");
2595                                        isvalid = exp.test(bufferStr);
2596                                    } else for (var l = 0, tl = matchToken.length; tl > l; l++) if ("\\" !== matchToken.charAt(l)) {
2597                                        testExp = regexPart, testExp += matchToken.substr(0, l + 1), testExp = testExp.replace(/\|$/, "");
2598                                        for (var j = 0; openGroupCount > j; j++) testExp += ")";
2599                                        var exp = new RegExp("^(" + testExp + ")$");
2600                                        if (isvalid = exp.test(bufferStr)) break;
2601                                    }
2602                                    regexPart += matchToken;
2603                                }
2604                                if (isvalid) break;
2605                            }
2606                            return fromGroup && (regexPart += ")", openGroupCount--), isvalid;
2607                        }
2608                        var bufferStr, groupToken, cbuffer = maskset.buffer.slice(), regexPart = "", isValid = !1, openGroupCount = 0;
2609                        null === opts.regexTokens && analyseRegex(), cbuffer.splice(pos, 0, chrs), bufferStr = cbuffer.join("");
2610                        for (var i = 0; i < opts.regexTokens.length; i++) {
2611                            var regexToken = opts.regexTokens[i];
2612                            if (isValid = validateRegexToken(regexToken, regexToken.isGroup)) break;
2613                        }
2614                        return isValid;
2615                    },
2616                    cardinality: 1
2617                }
2618            }
2619        }
2620    }), Inputmask;
2621}(jQuery, Inputmask);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.