diff --git a/.gitignore b/.gitignore index 322fbf702..58324be04 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ .DS_Store node_modules coverage +.nyc_output package-lock.json yarn.lock diff --git a/.nycrc b/.nycrc new file mode 100644 index 000000000..27bf7b772 --- /dev/null +++ b/.nycrc @@ -0,0 +1,13 @@ +{ + "reporter": [ + "html", + "text-summary" + ], + "include": [ + "src/**/*.js" + ], + "exclude": [ + "validator.js", + "lib/**/*.js" + ] +} diff --git a/lib/alpha.js b/lib/alpha.js index f3669408d..58767b7b6 100644 --- a/lib/alpha.js +++ b/lib/alpha.js @@ -87,9 +87,9 @@ for (var _locale, _i = 0; _i < arabicLocales.length; _i++) { } // Source: https://en.wikipedia.org/wiki/Decimal_mark -var dotDecimal = []; +var dotDecimal = ['ar-EG', 'ar-LB', 'ar-LY']; exports.dotDecimal = dotDecimal; -var commaDecimal = ['bg-BG', 'cs-CZ', 'da-DK', 'de-DE', 'el-GR', 'es-ES', 'fr-FR', 'it-IT', 'ku-IQ', 'hu-HU', 'nb-NO', 'nn-NO', 'nl-NL', 'pl-PL', 'pt-PT', 'ru-RU', 'sl-SI', 'sr-RS@latin', 'sr-RS', 'sv-SE', 'tr-TR', 'uk-UA']; +var commaDecimal = ['bg-BG', 'cs-CZ', 'da-DK', 'de-DE', 'el-GR', 'en-ZM', 'es-ES', 'fr-FR', 'it-IT', 'ku-IQ', 'hu-HU', 'nb-NO', 'nn-NO', 'nl-NL', 'pl-PL', 'pt-PT', 'ru-RU', 'sl-SI', 'sr-RS@latin', 'sr-RS', 'sv-SE', 'tr-TR', 'uk-UA']; exports.commaDecimal = commaDecimal; for (var _i2 = 0; _i2 < dotDecimal.length; _i2++) { diff --git a/lib/isISO8601.js b/lib/isISO8601.js index e29eebb29..db6d8808c 100644 --- a/lib/isISO8601.js +++ b/lib/isISO8601.js @@ -25,7 +25,7 @@ var isValidDate = function isValidDate(str) { var oYear = Number(ordinalMatch[1]); var oDay = Number(ordinalMatch[2]); // if is leap year - if (oYear % 4 === 0 && oYear % 100 !== 0) return oDay <= 366; + if (oYear % 4 === 0 && oYear % 100 !== 0 || oYear % 400 === 0) return oDay <= 366; return oDay <= 365; } @@ -37,7 +37,6 @@ var isValidDate = function isValidDate(str) { var dayString = day ? "0".concat(day).slice(-2) : day; // create a date object and compare var d = new Date("".concat(year, "-").concat(monthString || '01', "-").concat(dayString || '01')); - if (isNaN(d.getUTCFullYear())) return false; if (month && day) { return d.getUTCFullYear() === year && d.getUTCMonth() + 1 === month && d.getUTCDate() === day; diff --git a/lib/isIdentityCard.js b/lib/isIdentityCard.js index 031f9a75b..5e46ba2ab 100644 --- a/lib/isIdentityCard.js +++ b/lib/isIdentityCard.js @@ -78,14 +78,15 @@ var validators = { } }; -function isIdentityCard(str) { - var locale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'any'; +function isIdentityCard(str, locale) { (0, _assertString.default)(str); if (locale in validators) { return validators[locale](str); } else if (locale === 'any') { for (var key in validators) { + // https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes + // istanbul ignore else if (validators.hasOwnProperty(key)) { var validator = validators[key]; diff --git a/lib/isIn.js b/lib/isIn.js index e24f7cb8c..97b83ed06 100644 --- a/lib/isIn.js +++ b/lib/isIn.js @@ -21,6 +21,8 @@ function isIn(str, options) { var array = []; for (i in options) { + // https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes + // istanbul ignore else if ({}.hasOwnProperty.call(options, i)) { array[i] = (0, _toString.default)(options[i]); } diff --git a/lib/isMobilePhone.js b/lib/isMobilePhone.js index a51ab74e2..f72fd257d 100644 --- a/lib/isMobilePhone.js +++ b/lib/isMobilePhone.js @@ -101,6 +101,8 @@ function isMobilePhone(str, locale, options) { if (Array.isArray(locale)) { return locale.some(function (key) { + // https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes + // istanbul ignore else if (phones.hasOwnProperty(key)) { var phone = phones[key]; @@ -115,6 +117,7 @@ function isMobilePhone(str, locale, options) { return phones[locale].test(str); // alias falsey locale as 'any' } else if (!locale || locale === 'any') { for (var key in phones) { + // istanbul ignore else if (phones.hasOwnProperty(key)) { var phone = phones[key]; diff --git a/lib/isPostalCode.js b/lib/isPostalCode.js index 8b2b07e30..459da1c1b 100644 --- a/lib/isPostalCode.js +++ b/lib/isPostalCode.js @@ -74,6 +74,8 @@ function _default(str, locale) { return patterns[locale].test(str); } else if (locale === 'any') { for (var key in patterns) { + // https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes + // istanbul ignore else if (patterns.hasOwnProperty(key)) { var pattern = patterns[key]; diff --git a/lib/ltrim.js b/lib/ltrim.js index b7159fd07..fc39160f3 100644 --- a/lib/ltrim.js +++ b/lib/ltrim.js @@ -10,8 +10,9 @@ var _assertString = _interopRequireDefault(require("./util/assertString")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function ltrim(str, chars) { - (0, _assertString.default)(str); - var pattern = chars ? new RegExp("^[".concat(chars, "]+"), 'g') : /^\s+/g; + (0, _assertString.default)(str); // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Escaping + + var pattern = chars ? new RegExp("^[".concat(chars.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), "]+"), 'g') : /^\s+/g; return str.replace(pattern, ''); } diff --git a/lib/rtrim.js b/lib/rtrim.js index 6b24d69e4..af50c6959 100644 --- a/lib/rtrim.js +++ b/lib/rtrim.js @@ -10,15 +10,10 @@ var _assertString = _interopRequireDefault(require("./util/assertString")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function rtrim(str, chars) { - (0, _assertString.default)(str); - var pattern = chars ? new RegExp("[".concat(chars, "]")) : /\s/; - var idx = str.length - 1; + (0, _assertString.default)(str); // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Escaping - for (; idx >= 0 && pattern.test(str[idx]); idx--) { - ; - } - - return idx < str.length ? str.substr(0, idx + 1) : str; + var pattern = chars ? new RegExp("[".concat(chars.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), "]+$"), 'g') : /\s+$/g; + return str.replace(pattern, ''); } module.exports = exports.default; diff --git a/package.json b/package.json index 4cf3699fe..e28154d54 100644 --- a/package.json +++ b/package.json @@ -47,6 +47,7 @@ "eslint-config-airbnb-base": "^12.1.0", "eslint-plugin-import": "^2.11.0", "mocha": "^5.1.1", + "nyc": "^14.1.0", "rollup": "^0.43.0", "rollup-plugin-babel": "^4.0.1", "uglify-js": "^3.0.19" @@ -62,7 +63,7 @@ "build:node": "babel src -d .", "build": "npm run build:browser && npm run build:node", "pretest": "npm run lint && npm run build", - "test": "mocha --require @babel/register --reporter dot" + "test": "nyc mocha --require @babel/register --reporter dot" }, "engines": { "node": ">= 0.10" diff --git a/src/lib/alpha.js b/src/lib/alpha.js index 3f4cddf58..d20ea7855 100644 --- a/src/lib/alpha.js +++ b/src/lib/alpha.js @@ -83,9 +83,9 @@ for (let locale, i = 0; i < arabicLocales.length; i++) { } // Source: https://en.wikipedia.org/wiki/Decimal_mark -export const dotDecimal = []; +export const dotDecimal = ['ar-EG', 'ar-LB', 'ar-LY']; export const commaDecimal = [ - 'bg-BG', 'cs-CZ', 'da-DK', 'de-DE', 'el-GR', 'es-ES', 'fr-FR', 'it-IT', 'ku-IQ', 'hu-HU', 'nb-NO', + 'bg-BG', 'cs-CZ', 'da-DK', 'de-DE', 'el-GR', 'en-ZM', 'es-ES', 'fr-FR', 'it-IT', 'ku-IQ', 'hu-HU', 'nb-NO', 'nn-NO', 'nl-NL', 'pl-PL', 'pt-PT', 'ru-RU', 'sl-SI', 'sr-RS@latin', 'sr-RS', 'sv-SE', 'tr-TR', 'uk-UA', ]; diff --git a/src/lib/isISO8601.js b/src/lib/isISO8601.js index e127767b5..304738786 100644 --- a/src/lib/isISO8601.js +++ b/src/lib/isISO8601.js @@ -14,8 +14,7 @@ const isValidDate = (str) => { const oYear = Number(ordinalMatch[1]); const oDay = Number(ordinalMatch[2]); // if is leap year - if (oYear % 4 === 0 - && oYear % 100 !== 0) return oDay <= 366; + if ((oYear % 4 === 0 && oYear % 100 !== 0) || oYear % 400 === 0) return oDay <= 366; return oDay <= 365; } const match = str.match(/(\d{4})-?(\d{0,2})-?(\d*)/).map(Number); @@ -27,7 +26,6 @@ const isValidDate = (str) => { // create a date object and compare const d = new Date(`${year}-${monthString || '01'}-${dayString || '01'}`); - if (isNaN(d.getUTCFullYear())) return false; if (month && day) { return d.getUTCFullYear() === year && (d.getUTCMonth() + 1) === month diff --git a/src/lib/isIdentityCard.js b/src/lib/isIdentityCard.js index eaa15e503..99e8e5cdb 100644 --- a/src/lib/isIdentityCard.js +++ b/src/lib/isIdentityCard.js @@ -80,12 +80,14 @@ const validators = { }, }; -export default function isIdentityCard(str, locale = 'any') { +export default function isIdentityCard(str, locale) { assertString(str); if (locale in validators) { return validators[locale](str); } else if (locale === 'any') { for (const key in validators) { + // https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes + // istanbul ignore else if (validators.hasOwnProperty(key)) { const validator = validators[key]; if (validator(str)) { diff --git a/src/lib/isIn.js b/src/lib/isIn.js index 2b00355ef..e7f15804f 100644 --- a/src/lib/isIn.js +++ b/src/lib/isIn.js @@ -7,6 +7,8 @@ export default function isIn(str, options) { if (Object.prototype.toString.call(options) === '[object Array]') { const array = []; for (i in options) { + // https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes + // istanbul ignore else if ({}.hasOwnProperty.call(options, i)) { array[i] = toString(options[i]); } diff --git a/src/lib/isMobilePhone.js b/src/lib/isMobilePhone.js index b13b17db7..0688f29b9 100644 --- a/src/lib/isMobilePhone.js +++ b/src/lib/isMobilePhone.js @@ -89,6 +89,8 @@ export default function isMobilePhone(str, locale, options) { } if (Array.isArray(locale)) { return locale.some((key) => { + // https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes + // istanbul ignore else if (phones.hasOwnProperty(key)) { const phone = phones[key]; if (phone.test(str)) { @@ -102,6 +104,7 @@ export default function isMobilePhone(str, locale, options) { // alias falsey locale as 'any' } else if (!locale || locale === 'any') { for (const key in phones) { + // istanbul ignore else if (phones.hasOwnProperty(key)) { const phone = phones[key]; if (phone.test(str)) { diff --git a/src/lib/isPostalCode.js b/src/lib/isPostalCode.js index 1ac1c9353..424b28fba 100644 --- a/src/lib/isPostalCode.js +++ b/src/lib/isPostalCode.js @@ -64,6 +64,8 @@ export default function (str, locale) { return patterns[locale].test(str); } else if (locale === 'any') { for (const key in patterns) { + // https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes + // istanbul ignore else if (patterns.hasOwnProperty(key)) { const pattern = patterns[key]; if (pattern.test(str)) { diff --git a/src/lib/ltrim.js b/src/lib/ltrim.js index 7f1ee11cd..372d2df8e 100644 --- a/src/lib/ltrim.js +++ b/src/lib/ltrim.js @@ -2,6 +2,7 @@ import assertString from './util/assertString'; export default function ltrim(str, chars) { assertString(str); - const pattern = chars ? new RegExp(`^[${chars}]+`, 'g') : /^\s+/g; + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Escaping + const pattern = chars ? new RegExp(`^[${chars.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}]+`, 'g') : /^\s+/g; return str.replace(pattern, ''); } diff --git a/src/lib/rtrim.js b/src/lib/rtrim.js index 54000c16c..b53d23f57 100644 --- a/src/lib/rtrim.js +++ b/src/lib/rtrim.js @@ -2,11 +2,7 @@ import assertString from './util/assertString'; export default function rtrim(str, chars) { assertString(str); - const pattern = chars ? new RegExp(`[${chars}]`) : /\s/; - - let idx = str.length - 1; - for (; idx >= 0 && pattern.test(str[idx]); idx--) - ; - - return idx < str.length ? str.substr(0, idx + 1) : str; + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Escaping + const pattern = chars ? new RegExp(`[${chars.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}]+$`, 'g') : /\s+$/g; + return str.replace(pattern, ''); } diff --git a/test/exports.js b/test/exports.js index 2016d1d3e..2de5f3a6f 100644 --- a/test/exports.js +++ b/test/exports.js @@ -1,10 +1,10 @@ import assert from 'assert'; import validator from '../index'; -import { locales as isPostalCodeLocales } from '../lib/isPostalCode'; -import { locales as isAlphaLocales } from '../lib/isAlpha'; -import { locales as isAlphanumericLocales } from '../lib/isAlphanumeric'; -import { locales as isMobilePhoneLocales } from '../lib/isMobilePhone'; -import { locales as isFloatLocales } from '../lib/isFloat'; +import { locales as isPostalCodeLocales } from '../src/lib/isPostalCode'; +import { locales as isAlphaLocales } from '../src/lib/isAlpha'; +import { locales as isAlphanumericLocales } from '../src/lib/isAlphanumeric'; +import { locales as isMobilePhoneLocales } from '../src/lib/isMobilePhone'; +import { locales as isFloatLocales } from '../src/lib/isFloat'; describe('Exports', () => { it('should export validators', () => { diff --git a/test/sanitizers.js b/test/sanitizers.js index 23ed3f76d..869b34f04 100644 --- a/test/sanitizers.js +++ b/test/sanitizers.js @@ -1,5 +1,5 @@ import { format } from 'util'; -import validator from '../index'; +import validator from '../src/index'; function test(options) { let args = options.args || []; @@ -91,11 +91,24 @@ describe('Sanitizers', () => { expect: { '010100201000': '201000' }, }); + test({ + sanitizer: 'ltrim', + args: ['\\S'], + expect: { '\\S01010020100001': '01010020100001' }, + }); + + test({ sanitizer: 'rtrim', args: ['01'], expect: { '010100201000': '0101002' }, }); + + test({ + sanitizer: 'rtrim', + args: ['\\S'], + expect: { '01010020100001\\S': '01010020100001' }, + }); }); it('should convert strings to integers', () => { @@ -246,6 +259,10 @@ describe('Sanitizers', () => { 'test@yandex.ua': 'test@yandex.ru', 'test@yandex.com': 'test@yandex.ru', 'test@yandex.by': 'test@yandex.ru', + '@gmail.com': false, + '@icloud.com': false, + '@outlook.com': false, + '@yahoo.com': false, }, }); @@ -268,6 +285,7 @@ describe('Sanitizers', () => { 'SOME.name@yahoo.ca': 'some.name@yahoo.ca', 'SOME.name@outlook.ie': 'some.name@outlook.ie', 'SOME.name@me.com': 'some.name@me.com', + 'SOME.name@yandex.ru': 'some.name@yandex.ru', }, }); @@ -280,6 +298,7 @@ describe('Sanitizers', () => { icloud_lowercase: false, outlookdotcom_lowercase: false, yahoo_lowercase: false, + yandex_lowercase: false, }], expect: { 'TEST@FOO.COM': 'TEST@foo.com', // all_lowercase @@ -289,6 +308,7 @@ describe('Sanitizers', () => { 'ME@outlook.COM': 'ME@outlook.com', // outlookdotcom_lowercase 'JOHN@live.CA': 'JOHN@live.ca', // outlookdotcom_lowercase 'ME@ymail.COM': 'ME@ymail.com', // yahoo_lowercase + 'ME@yandex.RU': 'ME@yandex.ru', // yandex_lowercase }, }); diff --git a/test/validators.js b/test/validators.js index 6efd894e5..ff4b31dad 100644 --- a/test/validators.js +++ b/test/validators.js @@ -2,13 +2,27 @@ import { format } from 'util'; import assert from 'assert'; import fs from 'fs'; import vm from 'vm'; -import validator from '../index'; +import validator from '../src/index'; let validator_js = fs.readFileSync(require.resolve('../validator.js')).toString(); function test(options) { let args = options.args || []; args.unshift(null); + if (options.error) { + options.error.forEach((error) => { + args[0] = error; + try { + assert.throws(() => validator[options.validator](...args)); + } catch (err) { + let warning = format( + 'validator.%s(%s) passed but should error', + options.validator, args.join(', ') + ); + throw new Error(warning); + } + }); + } if (options.valid) { options.valid.forEach((valid) => { args[0] = valid; @@ -108,12 +122,16 @@ describe('Validators', () => { validator: 'isEmail', args: [{ domain_specific_validation: true }], valid: [ - 'foo@bar.com', + 'foobar@gmail.com', + 'foo.bar@gmail.com', + 'foo.bar@googlemail.com', + `${repeat('a', 30)}@gmail.com`, ], invalid: [ `${repeat('a', 31)}@gmail.com`, 'test@gmail.com', 'test.1@gmail.com', + '.foobar@gmail.com', ], }); }); @@ -270,6 +288,7 @@ describe('Validators', () => { invalid: [ 'email@0.0.0.256', 'email@26.0.0.256', + 'email@[266.266.266.266]', ], }); }); @@ -1218,6 +1237,17 @@ describe('Validators', () => { }); }); + it('should error on invalid locale', () => { + test({ + validator: 'isAlpha', + args: ['is-NOT'], + error: [ + 'abc', + 'ABC', + ], + }); + }); + it('should validate alphanumeric strings', () => { test({ validator: 'isAlphanumeric', @@ -1612,12 +1642,14 @@ describe('Validators', () => { }); it('should error on invalid locale', () => { - try { - validator.isAlphanumeric('abc123', 'in-INVALID'); - assert(false); - } catch (err) { - assert(true); - } + test({ + validator: 'isAlphanumeric', + args: ['is-NOT'], + error: [ + '1234568960', + 'abc123', + ], + }); }); it('should validate numeric strings', () => { @@ -1885,6 +1917,28 @@ describe('Validators', () => { ], }); + test({ + validator: 'isDecimal', + args: [{ locale: ['ar-EG'] }], + valid: [ + '0.01', + ], + invalid: [ + '0,01', + ], + }); + + test({ + validator: 'isDecimal', + args: [{ locale: ['en-ZM'] }], + valid: [ + '0,01', + ], + invalid: [ + '0.01', + ], + }); + test({ validator: 'isDecimal', args: [{ force_decimal: true }], @@ -1960,6 +2014,18 @@ describe('Validators', () => { }); }); + it('should error on invalid locale', () => { + test({ + validator: 'isDecimal', + args: [{ locale: ['is-NOT'] }], + error: [ + '123', + '0.01', + '0,01', + ], + }); + }); + it('should validate lowercase strings', () => { test({ validator: 'isLowercase', @@ -2411,56 +2477,65 @@ describe('Validators', () => { }); it('should validate hash strings', () => { - test({ - validator: 'isHash', - args: ['md5', 'md4', 'ripemd128', 'tiger128'], - valid: [ - 'd94f3f016ae679c3008de268209132f2', - '751adbc511ccbe8edf23d486fa4581cd', - '88dae00e614d8f24cfd5a8b3f8002e93', - '0bf1c35032a71a14c2f719e5a14c1e96', - ], - invalid: [ - 'KYT0bf1c35032a71a14c2f719e5a14c1', - 'q94375dj93458w34', - '39485729348', - '%&FHKJFvk', - ], + ['md5', 'md4', 'ripemd128', 'tiger128'].forEach((algorithm) => { + test({ + validator: 'isHash', + args: [algorithm], + valid: [ + 'd94f3f016ae679c3008de268209132f2', + '751adbc511ccbe8edf23d486fa4581cd', + '88dae00e614d8f24cfd5a8b3f8002e93', + '0bf1c35032a71a14c2f719e5a14c1e96', + ], + invalid: [ + 'KYT0bf1c35032a71a14c2f719e5a14c1', + 'q94375dj93458w34', + '39485729348', + '%&FHKJFvk', + ], + }); }); - test({ - validator: 'isHash', - args: ['crc32', 'crc32b'], - valid: [ - 'd94f3f01', - '751adbc5', - '88dae00e', - '0bf1c350', - ], - invalid: [ - 'KYT0bf1c35032a71a14c2f719e5a14c1', - 'q94375dj93458w34', - 'q943', - '39485729348', - '%&FHKJFvk', - ], + + ['crc32', 'crc32b'].forEach((algorithm) => { + test({ + validator: 'isHash', + args: [algorithm], + valid: [ + 'd94f3f01', + '751adbc5', + '88dae00e', + '0bf1c350', + ], + invalid: [ + 'KYT0bf1c35032a71a14c2f719e5a14c1', + 'q94375dj93458w34', + 'q943', + '39485729348', + '%&FHKJFvk', + ], + }); }); - test({ - validator: 'isHash', - args: ['sha1', 'tiger160', 'ripemd160'], - valid: [ - '3ca25ae354e192b26879f651a51d92aa8a34d8d3', - 'aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d', - 'beb8c3f30da46be179b8df5f5ecb5e4b10508230', - 'efd5d3b190e893ed317f38da2420d63b7ae0d5ed', - ], - invalid: [ - 'KYT0bf1c35032a71a14c2f719e5a14c1', - 'KYT0bf1c35032a71a14c2f719e5a14c1dsjkjkjkjkkjk', - 'q94375dj93458w34', - '39485729348', - '%&FHKJFvk', - ], + + ['sha1', 'tiger160', 'ripemd160'].forEach((algorithm) => { + test({ + validator: 'isHash', + args: [algorithm], + valid: [ + '3ca25ae354e192b26879f651a51d92aa8a34d8d3', + 'aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d', + 'beb8c3f30da46be179b8df5f5ecb5e4b10508230', + 'efd5d3b190e893ed317f38da2420d63b7ae0d5ed', + ], + invalid: [ + 'KYT0bf1c35032a71a14c2f719e5a14c1', + 'KYT0bf1c35032a71a14c2f719e5a14c1dsjkjkjkjkkjk', + 'q94375dj93458w34', + '39485729348', + '%&FHKJFvk', + ], + }); }); + test({ validator: 'isHash', args: ['sha256'], @@ -2820,6 +2895,12 @@ describe('Validators', () => { valid: ['1', '2', '3'], invalid: ['4', ''], }); + test({ + validator: 'isIn', + args: [['1', '2', '3', { foo: 'bar' }, () => 5, { toString: 'test' }]], + valid: ['1', '2', '3', ''], + invalid: ['4'], + }); test({ validator: 'isIn', invalid: ['foo', ''] }); }); @@ -3040,6 +3121,17 @@ describe('Validators', () => { }); }); + it('should error on invalid locale', () => { + test({ + validator: 'isIdentityCard', + args: ['is-NOT'], + error: [ + '99999999R', + '12345678Z', + ], + }); + }); + it('should validate ISINs', () => { test({ validator: 'isISIN', @@ -4898,13 +4990,21 @@ describe('Validators', () => { }); }); + it('should error on invalid locale', () => { + test({ + validator: 'isMobilePhone', + args: [{ locale: ['is-NOT'] }], + error: [ + '+123456789', + '012345', + ], + }); + }); + it('should validate currency', () => { + // -$##,###.## (en-US, en-CA, en-AU, en-NZ, en-HK) test({ validator: 'isCurrency', - args: [ - {}, - '-$##,###.## (en-US, en-CA, en-AU, en-NZ, en-HK)', - ], valid: [ '-$10,123.45', '$10,123.45', @@ -4951,13 +5051,13 @@ describe('Validators', () => { ], }); + // -$##,###.## (en-US, en-CA, en-AU, en-NZ, en-HK) test({ validator: 'isCurrency', args: [ { allow_decimal: false, }, - '-$##,###.## (en-US, en-CA, en-AU, en-NZ, en-HK)', ], valid: [ '-$10,123', @@ -5013,13 +5113,13 @@ describe('Validators', () => { ], }); + // -$##,###.## (en-US, en-CA, en-AU, en-NZ, en-HK) test({ validator: 'isCurrency', args: [ { require_decimal: true, }, - '-$##,###.## (en-US, en-CA, en-AU, en-NZ, en-HK)', ], valid: [ '-$10,123.45', @@ -5067,13 +5167,13 @@ describe('Validators', () => { ], }); + // -$##,###.## (en-US, en-CA, en-AU, en-NZ, en-HK) test({ validator: 'isCurrency', args: [ { digits_after_decimal: [1, 3], }, - '-$##,###.## (en-US, en-CA, en-AU, en-NZ, en-HK)', ], valid: [ '-$10,123.4', @@ -5121,13 +5221,13 @@ describe('Validators', () => { ], }); + // -$##,###.## with $ required (en-US, en-CA, en-AU, en-NZ, en-HK) test({ validator: 'isCurrency', args: [ { require_symbol: true, }, - '-$##,###.## with $ required (en-US, en-CA, en-AU, en-NZ, en-HK)', ], valid: [ '-$10,123.45', @@ -5184,6 +5284,7 @@ describe('Validators', () => { ], }); + // ¥-##,###.## (zh-CN) test({ validator: 'isCurrency', args: [ @@ -5191,7 +5292,6 @@ describe('Validators', () => { symbol: '¥', negative_sign_before_digits: true, }, - '¥-##,###.## (zh-CN)', ], valid: [ '123,456.78', @@ -5237,6 +5337,61 @@ describe('Validators', () => { ], }); + test({ + validator: 'isCurrency', + args: [ + { + negative_sign_after_digits: true, + }, + ], + valid: [ + '$10,123.45-', + '$10,123.45', + '$10123.45', + '10,123.45', + '10123.45', + '10,123', + '1,123,456', + '1123456', + '1.39', + '.03', + '0.10', + '$0.10', + '$0.01-', + '$.99-', + '$100,234,567.89', + '$10,123', + '10,123', + '10123-', + ], + invalid: [ + '-123', + '1.234', + '$1.1', + '$ 32.50', + '500$', + '.0001', + '$.001', + '$0.001', + '12,34.56', + '123456,123,123456', + '123,4', + ',123', + '$-,123', + '$', + '.', + ',', + '00', + '$-', + '$-,.', + '-', + '-$', + '', + '- $', + ], + }); + + // ¥##,###.## with no negatives (zh-CN) test({ validator: 'isCurrency', args: [ @@ -5244,7 +5399,6 @@ describe('Validators', () => { symbol: '¥', allow_negatives: false, }, - '¥##,###.## with no negatives (zh-CN)', ], valid: [ '123,456.78', @@ -5292,6 +5446,7 @@ describe('Validators', () => { ], }); + // R ## ###,## and R-10 123,25 (el-ZA) test({ validator: 'isCurrency', args: [ @@ -5302,7 +5457,6 @@ describe('Validators', () => { decimal_separator: ',', allow_negative_sign_placeholder: true, }, - 'R ## ###,## and R-10 123,25 (el-ZA)', ], valid: [ '123 456,78', @@ -5350,6 +5504,7 @@ describe('Validators', () => { ], }); + // -€ ##.###,## (it-IT) test({ validator: 'isCurrency', args: [ @@ -5359,7 +5514,6 @@ describe('Validators', () => { decimal_separator: ',', allow_space_after_symbol: true, }, - '-€ ##.###,## (it-IT)', ], valid: [ '123.456,78', @@ -5422,6 +5576,7 @@ describe('Validators', () => { ], }); + // -##.###,## € (el-GR) test({ validator: 'isCurrency', args: [ @@ -5432,7 +5587,6 @@ describe('Validators', () => { decimal_separator: ',', allow_space_after_digits: true, }, - '-##.###,## € (el-GR)', ], valid: [ '123.456,78', @@ -5491,6 +5645,7 @@ describe('Validators', () => { ], }); + // kr. -##.###,## (da-DK) test({ validator: 'isCurrency', args: [ @@ -5501,7 +5656,6 @@ describe('Validators', () => { decimal_separator: ',', allow_space_after_symbol: true, }, - 'kr. -##.###,## (da-DK)', ], valid: [ '123.456,78', @@ -5555,6 +5709,7 @@ describe('Validators', () => { ], }); + // kr. ##.###,## with no negatives (da-DK) test({ validator: 'isCurrency', args: [ @@ -5566,7 +5721,6 @@ describe('Validators', () => { decimal_separator: ',', allow_space_after_symbol: true, }, - 'kr. ##.###,## with no negatives (da-DK)', ], valid: [ '123.456,78', @@ -5626,13 +5780,13 @@ describe('Validators', () => { ], }); + // ($##,###.##) (en-US, en-HK) test({ validator: 'isCurrency', args: [ { parens_for_negatives: true, }, - '($##,###.##) (en-US, en-HK)', ], valid: [ '1,234', @@ -5696,11 +5850,11 @@ describe('Validators', () => { ], }); + // $##,###.## with no negatives (en-US, en-CA, en-AU, en-HK) test({ validator: 'isCurrency', args: [ { allow_negatives: false }, - '$##,###.## with no negatives (en-US, en-CA, en-AU, en-HK)', ], valid: [ '$10,123.45', @@ -5750,7 +5904,9 @@ describe('Validators', () => { '-$10,123.45', ], }); + }); + it('should validate booleans', () => { test({ validator: 'isBoolean', valid: [ @@ -5812,6 +5968,8 @@ describe('Validators', () => { '2009-05-19 143922.500', '2009-05-19 1439,55', '2009-10-10', + '2020-366', + '2000-366', ]; const invalidISO8601 = [ @@ -5871,11 +6029,14 @@ describe('Validators', () => { '2000-02-29', '2009-123', '2009-222', + '2020-366', + '2400-366', ], invalid: [ '2010-02-30', '2009-02-29', '2009-366', + '2019-02-31', ], }); }); @@ -5980,9 +6141,9 @@ describe('Validators', () => { }); it('should error on non-string input', () => { - let empty = [undefined, null, [], NaN]; - empty.forEach((item) => { - assert.throws(validator.isEmpty.bind(null, item)); + test({ + validator: 'isEmpty', + error: [undefined, null, [], NaN], }); }); @@ -6006,6 +6167,8 @@ describe('Validators', () => { invalid: [ 'dataxbase64', 'data:HelloWorld', + 'data:,A%20brief%20invalid%20[note', + 'file:text/plain;base64,SGVsbG8sIFdvcmxkIQ%3D%3D', 'data:text/html;charset=,%3Ch1%3EHello!%3C%2Fh1%3E', 'data:text/html;charset,%3Ch1%3EHello!%3C%2Fh1%3E', 'data:base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD///+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4Ug9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC', '', @@ -6330,6 +6493,17 @@ describe('Validators', () => { }); }); + it('should error on invalid locale', () => { + test({ + validator: 'isPostalCode', + args: ['is-NOT'], + error: [ + '293940', + '1234', + ], + }); + }); + it('should validate MIME types', () => { test({ validator: 'isMimeType', diff --git a/validator.js b/validator.js index a63d34b2f..285e54e2f 100644 --- a/validator.js +++ b/validator.js @@ -741,8 +741,8 @@ for (var _locale, _i = 0; _i < arabicLocales.length; _i++) { } // Source: https://en.wikipedia.org/wiki/Decimal_mark -var dotDecimal = []; -var commaDecimal = ['bg-BG', 'cs-CZ', 'da-DK', 'de-DE', 'el-GR', 'es-ES', 'fr-FR', 'it-IT', 'ku-IQ', 'hu-HU', 'nb-NO', 'nn-NO', 'nl-NL', 'pl-PL', 'pt-PT', 'ru-RU', 'sl-SI', 'sr-RS@latin', 'sr-RS', 'sv-SE', 'tr-TR', 'uk-UA']; +var dotDecimal = ['ar-EG', 'ar-LB', 'ar-LY']; +var commaDecimal = ['bg-BG', 'cs-CZ', 'da-DK', 'de-DE', 'el-GR', 'en-ZM', 'es-ES', 'fr-FR', 'it-IT', 'ku-IQ', 'hu-HU', 'nb-NO', 'nn-NO', 'nl-NL', 'pl-PL', 'pt-PT', 'ru-RU', 'sl-SI', 'sr-RS@latin', 'sr-RS', 'sv-SE', 'tr-TR', 'uk-UA']; for (var _i2 = 0; _i2 < dotDecimal.length; _i2++) { decimal[dotDecimal[_i2]] = decimal['en-US']; @@ -1056,6 +1056,8 @@ function isIn(str, options) { var array = []; for (i in options) { + // https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes + // istanbul ignore else if ({}.hasOwnProperty.call(options, i)) { array[i] = toString$1(options[i]); } @@ -1179,14 +1181,15 @@ var validators = { }, 0); } }; -function isIdentityCard(str) { - var locale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'any'; +function isIdentityCard(str, locale) { assertString(str); if (locale in validators) { return validators[locale](str); } else if (locale === 'any') { for (var key in validators) { + // https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes + // istanbul ignore else if (validators.hasOwnProperty(key)) { var validator = validators[key]; @@ -1405,6 +1408,8 @@ function isMobilePhone(str, locale, options) { if (Array.isArray(locale)) { return locale.some(function (key) { + // https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes + // istanbul ignore else if (phones.hasOwnProperty(key)) { var phone = phones[key]; @@ -1419,6 +1424,7 @@ function isMobilePhone(str, locale, options) { return phones[locale].test(str); // alias falsey locale as 'any' } else if (!locale || locale === 'any') { for (var key in phones) { + // istanbul ignore else if (phones.hasOwnProperty(key)) { var phone = phones[key]; @@ -1525,7 +1531,7 @@ var isValidDate = function isValidDate(str) { var oYear = Number(ordinalMatch[1]); var oDay = Number(ordinalMatch[2]); // if is leap year - if (oYear % 4 === 0 && oYear % 100 !== 0) return oDay <= 366; + if (oYear % 4 === 0 && oYear % 100 !== 0 || oYear % 400 === 0) return oDay <= 366; return oDay <= 365; } @@ -1537,7 +1543,6 @@ var isValidDate = function isValidDate(str) { var dayString = day ? "0".concat(day).slice(-2) : day; // create a date object and compare var d = new Date("".concat(year, "-").concat(monthString || '01', "-").concat(dayString || '01')); - if (isNaN(d.getUTCFullYear())) return false; if (month && day) { return d.getUTCFullYear() === year && d.getUTCMonth() + 1 === month && d.getUTCDate() === day; @@ -1766,6 +1771,8 @@ var isPostalCode = function (str, locale) { return patterns[locale].test(str); } else if (locale === 'any') { for (var key in patterns) { + // https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes + // istanbul ignore else if (patterns.hasOwnProperty(key)) { var pattern = patterns[key]; @@ -1782,21 +1789,17 @@ var isPostalCode = function (str, locale) { }; function ltrim(str, chars) { - assertString(str); - var pattern = chars ? new RegExp("^[".concat(chars, "]+"), 'g') : /^\s+/g; + assertString(str); // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Escaping + + var pattern = chars ? new RegExp("^[".concat(chars.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), "]+"), 'g') : /^\s+/g; return str.replace(pattern, ''); } function rtrim(str, chars) { - assertString(str); - var pattern = chars ? new RegExp("[".concat(chars, "]")) : /\s/; - var idx = str.length - 1; + assertString(str); // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Escaping - for (; idx >= 0 && pattern.test(str[idx]); idx--) { - - } - - return idx < str.length ? str.substr(0, idx + 1) : str; + var pattern = chars ? new RegExp("[".concat(chars.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), "]+$"), 'g') : /\s+$/g; + return str.replace(pattern, ''); } function trim(str, chars) { diff --git a/validator.min.js b/validator.min.js index a0e3a3819..d68b9335d 100644 --- a/validator.min.js +++ b/validator.min.js @@ -20,4 +20,4 @@ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):t.validator=e()}(this,function(){"use strict";function a(t){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function A(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var r=[],n=!0,o=!1,i=void 0;try{for(var a,l=t[Symbol.iterator]();!(n=(a=l.next()).done)&&(r.push(a.value),!e||r.length!==e);n=!0);}catch(t){o=!0,i=t}finally{try{n||null==l.return||l.return()}finally{if(o)throw i}}return r}(t,e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}()}function m(t){var e;if(!("string"==typeof t||t instanceof String))throw e=null===t?"null":"object"===(e=a(t))&&t.constructor&&t.constructor.hasOwnProperty("name")?t.constructor.name:"a ".concat(e),new TypeError("Expected string but received ".concat(e,"."))}function o(t){return m(t),t=Date.parse(t),isNaN(t)?null:new Date(t)}function r(t){return m(t),parseFloat(t)}function i(t){return"object"===a(t)&&null!==t?t="function"==typeof t.toString?t.toString():"[object Object]":(null==t||isNaN(t)&&!t.length)&&(t=""),String(t)}function v(t,e){var r=0i)return!1;if("::"===t)return!0;"::"===t.substr(0,2)?(r.shift(),r.shift(),n=!0):"::"===t.substr(t.length-2)&&(r.pop(),r.pop(),n=!0);for(var a=0;a$/i,E=/^[a-z\d!#\$%&'\*\+\-\/=\?\^_`{\|}~]+$/i,x=/^[a-z\d]+$/,C=/^([\s\x01-\x08\x0b\x0c\x0e-\x1f\x7f\x21\x23-\x5b\x5d-\x7e]|(\\[\x01-\x09\x0b\x0c\x0d-\x7f]))*$/i,N=/^[a-z\d!#\$%&'\*\+\-\/=\?\^_`{\|}~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+$/i,M=/^([\s\x01-\x08\x0b\x0c\x0e-\x1f\x7f\x21\x23-\x5b\x5d-\x7e\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]|(\\[\x01-\x09\x0b\x0c\x0d-\x7f\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))*$/i;var d={protocols:["http","https","ftp"],require_tld:!0,require_protocol:!1,require_host:!0,require_valid_protocol:!0,allow_underscores:!1,allow_trailing_dot:!1,allow_protocol_relative_urls:!1},f=/^\[([^\]]+)\](?::([0-9]+))?$/;function p(t,e){for(var r=0;r=e.min,o=!e.hasOwnProperty("max")||t<=e.max,i=!e.hasOwnProperty("lt")||te.gt;return r.test(t)&&n&&o&&i&&a}var z=/^[\x00-\x7F]+$/;var Y=/[^\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]/;var V=/[\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]/;var j=/[^\x00-\x7F]/;var J=/[\uD800-\uDBFF][\uDC00-\uDFFF]/;function q(t,e){return t.some(function(t){return e===t})}var X=Object.keys(I);var Q={force_decimal:!1,decimal_digits:"1,",locale:"en-US"},tt=["","-","+"];var et=/^[0-9A-F]+$/i;function rt(t){return m(t),et.test(t)}var nt=/^#?([0-9A-F]{3}|[0-9A-F]{6})$/i;var ot=/^[A-Z]{2}[0-9A-Z]{3}\d{2}\d{5}$/;var it=/^[a-f0-9]{32}$/;var at={md5:32,md4:32,sha1:40,sha256:64,sha384:96,sha512:128,ripemd128:32,ripemd160:40,tiger128:32,tiger160:40,tiger192:48,crc32:8,crc32b:8};var lt=/^([A-Za-z0-9\-_~+\/]+[=]{0,2})\.([A-Za-z0-9\-_~+\/]+[=]{0,2})(?:\.([A-Za-z0-9\-_~+\/]+[=]{0,2}))?$/;var st={ignore_whitespace:!1};var ut={3:/^[0-9A-F]{8}-[0-9A-F]{4}-3[0-9A-F]{3}-[0-9A-F]{4}-[0-9A-F]{12}$/i,4:/^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,5:/^[0-9A-F]{8}-[0-9A-F]{4}-5[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,all:/^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i};var ct=/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11}|6[27][0-9]{14})$/;var dt={ES:function(t){m(t);var e={X:0,Y:1,Z:2},r=t.trim().toUpperCase();if(!/^[0-9X-Z][0-9]{7}[TRWAGMYFPDXBNJZSQVHLCKE]$/.test(r))return!1;var n=r.slice(0,-1).replace(/[X,Y,Z]/g,function(t){return e[t]});return r.endsWith(["T","R","W","A","G","M","Y","F","P","D","X","B","N","J","Z","S","Q","V","H","L","C","K","E"][n%23])},"zh-TW":function(t){var o={A:10,B:11,C:12,D:13,E:14,F:15,G:16,H:17,I:34,J:18,K:19,L:20,M:21,N:22,O:35,P:23,Q:24,R:25,S:26,T:27,U:28,V:29,W:32,X:30,Y:31,Z:33},e=t.trim().toUpperCase();return!!/^[A-Z][0-9]{9}$/.test(e)&&Array.from(e).reduce(function(t,e,r){if(0!==r)return 9===r?(10-t%10-Number(e))%10==0:t+Number(e)*(9-r);var n=o[e];return n%10*9+Math.floor(n/10)},0)}};var ft=/^[A-Z]{2}[0-9A-Z]{9}[0-9]$/;var pt=/^(?:[0-9]{9}X|[0-9]{10})$/,ht=/^(?:[0-9]{13})$/,gt=[1,3];var At={"ar-AE":/^((\+?971)|0)?5[024568]\d{7}$/,"ar-DZ":/^(\+?213|0)(5|6|7)\d{8}$/,"ar-EG":/^((\+?20)|0)?1[0125]\d{8}$/,"ar-IQ":/^(\+?964|0)?7[0-9]\d{8}$/,"ar-JO":/^(\+?962|0)?7[789]\d{7}$/,"ar-KW":/^(\+?965)[569]\d{7}$/,"ar-SA":/^(!?(\+?966)|0)?5\d{8}$/,"ar-SY":/^(!?(\+?963)|0)?9\d{8}$/,"ar-TN":/^(\+?216)?[2459]\d{7}$/,"be-BY":/^(\+?375)?(24|25|29|33|44)\d{7}$/,"bg-BG":/^(\+?359|0)?8[789]\d{7}$/,"bn-BD":/^(\+?880|0)1[1356789][0-9]{8}$/,"cs-CZ":/^(\+?420)? ?[1-9][0-9]{2} ?[0-9]{3} ?[0-9]{3}$/,"da-DK":/^(\+?45)?\s?\d{2}\s?\d{2}\s?\d{2}\s?\d{2}$/,"de-DE":/^(\+49)?0?1(5[0-25-9]\d|6([23]|0\d?)|7([0-57-9]|6\d))\d{7}$/,"el-GR":/^(\+?30|0)?(69\d{8})$/,"en-AU":/^(\+?61|0)4\d{8}$/,"en-GB":/^(\+?44|0)7\d{9}$/,"en-GH":/^(\+233|0)(20|50|24|54|27|57|26|56|23|28)\d{7}$/,"en-HK":/^(\+?852\-?)?[456789]\d{3}\-?\d{4}$/,"en-IE":/^(\+?353|0)8[356789]\d{7}$/,"en-IN":/^(\+?91|0)?[6789]\d{9}$/,"en-KE":/^(\+?254|0)(7|1)\d{8}$/,"en-MU":/^(\+?230|0)?\d{8}$/,"en-NG":/^(\+?234|0)?[789]\d{9}$/,"en-NZ":/^(\+?64|0)[28]\d{7,9}$/,"en-PK":/^((\+92)|(0092))-{0,1}\d{3}-{0,1}\d{7}$|^\d{11}$|^\d{4}-\d{7}$/,"en-RW":/^(\+?250|0)?[7]\d{8}$/,"en-SG":/^(\+65)?[89]\d{7}$/,"en-TZ":/^(\+?255|0)?[67]\d{8}$/,"en-UG":/^(\+?256|0)?[7]\d{8}$/,"en-US":/^((\+1|1)?( |-)?)?(\([2-9][0-9]{2}\)|[2-9][0-9]{2})( |-)?([2-9][0-9]{2}( |-)?[0-9]{4})$/,"en-ZA":/^(\+?27|0)\d{9}$/,"en-ZM":/^(\+?26)?09[567]\d{7}$/,"es-CL":/^(\+?56|0)[2-9]\d{1}\d{7}$/,"es-ES":/^(\+?34)?(6\d{1}|7[1234])\d{7}$/,"es-MX":/^(\+?52)?(1|01)?\d{10,11}$/,"es-PY":/^(\+?595|0)9[9876]\d{7}$/,"es-UY":/^(\+598|0)9[1-9][\d]{6}$/,"et-EE":/^(\+?372)?\s?(5|8[1-4])\s?([0-9]\s?){6,7}$/,"fa-IR":/^(\+?98[\-\s]?|0)9[0-39]\d[\-\s]?\d{3}[\-\s]?\d{4}$/,"fi-FI":/^(\+?358|0)\s?(4(0|1|2|4|5|6)?|50)\s?(\d\s?){4,8}\d$/,"fo-FO":/^(\+?298)?\s?\d{2}\s?\d{2}\s?\d{2}$/,"fr-FR":/^(\+?33|0)[67]\d{8}$/,"he-IL":/^(\+972|0)([23489]|5[012345689]|77)[1-9]\d{6}$/,"hu-HU":/^(\+?36)(20|30|70)\d{7}$/,"id-ID":/^(\+?62|0)8(1[123456789]|2[1238]|3[1238]|5[12356789]|7[78]|9[56789]|8[123456789])([\s?|\d]{5,11})$/,"it-IT":/^(\+?39)?\s?3\d{2} ?\d{6,7}$/,"ja-JP":/^(\+?81|0)[789]0[ \-]?[1-9]\d{2}[ \-]?\d{5}$/,"kk-KZ":/^(\+?7|8)?7\d{9}$/,"kl-GL":/^(\+?299)?\s?\d{2}\s?\d{2}\s?\d{2}$/,"ko-KR":/^((\+?82)[ \-]?)?0?1([0|1|6|7|8|9]{1})[ \-]?\d{3,4}[ \-]?\d{4}$/,"lt-LT":/^(\+370|8)\d{8}$/,"ms-MY":/^(\+?6?01){1}(([0145]{1}(\-|\s)?\d{7,8})|([236789]{1}(\s|\-)?\d{7}))$/,"nb-NO":/^(\+?47)?[49]\d{7}$/,"nl-BE":/^(\+?32|0)4?\d{8}$/,"nn-NO":/^(\+?47)?[49]\d{7}$/,"pl-PL":/^(\+?48)? ?[5-8]\d ?\d{3} ?\d{2} ?\d{2}$/,"pt-BR":/(?=^(\+?5{2}\-?|0)[1-9]{2}\-?\d{4}\-?\d{4}$)(^(\+?5{2}\-?|0)[1-9]{2}\-?[6-9]{1}\d{3}\-?\d{4}$)|(^(\+?5{2}\-?|0)[1-9]{2}\-?9[6-9]{1}\d{3}\-?\d{4}$)/,"pt-PT":/^(\+?351)?9[1236]\d{7}$/,"ro-RO":/^(\+?4?0)\s?7\d{2}(\/|\s|\.|\-)?\d{3}(\s|\.|\-)?\d{3}$/,"ru-RU":/^(\+?7|8)?9\d{9}$/,"sl-SI":/^(\+386\s?|0)(\d{1}\s?\d{3}\s?\d{2}\s?\d{2}|\d{2}\s?\d{3}\s?\d{3})$/,"sk-SK":/^(\+?421)? ?[1-9][0-9]{2} ?[0-9]{3} ?[0-9]{3}$/,"sr-RS":/^(\+3816|06)[- \d]{5,9}$/,"sv-SE":/^(\+?46|0)[\s\-]?7[\s\-]?[02369]([\s\-]?\d){7}$/,"th-TH":/^(\+66|66|0)\d{9}$/,"tr-TR":/^(\+?90|0)?5\d{9}$/,"uk-UA":/^(\+?38|8)?0\d{9}$/,"vi-VN":/^(\+?84|0)((3([2-9]))|(5([2689]))|(7([0|6-9]))|(8([1-6|89]))|(9([0-9])))([0-9]{7})$/,"zh-CN":/^((\+|00)86)?1([358][0-9]|4[579]|6[67]|7[0135678]|9[189])[0-9]{8}$/,"zh-TW":/^(\+?886\-?|0)?9\d{8}$/};At["en-CA"]=At["en-US"],At["fr-BE"]=At["nl-BE"],At["zh-HK"]=At["en-HK"];var mt=Object.keys(At);var vt={symbol:"$",require_symbol:!1,allow_space_after_symbol:!1,symbol_after_digits:!1,allow_negatives:!0,parens_for_negatives:!1,negative_sign_before_digits:!1,negative_sign_after_digits:!1,allow_negative_sign_placeholder:!1,thousands_separator:",",decimal_separator:".",allow_decimal:!0,require_decimal:!1,digits_after_decimal:[2],allow_space_after_digits:!1};var $t=/^([\+-]?\d{4}(?!\d{2}\b))((-?)((0[1-9]|1[0-2])(\3([12]\d|0[1-9]|3[01]))?|W([0-4]\d|5[0-3])(-?[1-7])?|(00[1-9]|0[1-9]\d|[12]\d{2}|3([0-5]\d|6[1-6])))([T\s]((([01]\d|2[0-3])((:?)[0-5]\d)?|24:?00)([\.,]\d+(?!:))?)?(\17[0-5]\d([\.,]\d+)?)?([zZ]|([\+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?)?$/;var _t=/([01][0-9]|2[0-3])/,Ft=/[0-5][0-9]/,St=new RegExp("[-+]".concat(_t.source,":").concat(Ft.source)),Rt=new RegExp("([zZ]|".concat(St.source,")")),Et=new RegExp("".concat(_t.source,":").concat(Ft.source,":").concat(/([0-5][0-9]|60)/.source).concat(/(\.[0-9]+)?/.source)),xt=new RegExp("".concat(/[0-9]{4}/.source,"-").concat(/(0[1-9]|1[0-2])/.source,"-").concat(/([12]\d|0[1-9]|3[01])/.source)),Ct=new RegExp("".concat(Et.source).concat(Rt.source)),Nt=new RegExp("".concat(xt.source,"[ tT]").concat(Ct.source));var Mt=["AD","AE","AF","AG","AI","AL","AM","AO","AQ","AR","AS","AT","AU","AW","AX","AZ","BA","BB","BD","BE","BF","BG","BH","BI","BJ","BL","BM","BN","BO","BQ","BR","BS","BT","BV","BW","BY","BZ","CA","CC","CD","CF","CG","CH","CI","CK","CL","CM","CN","CO","CR","CU","CV","CW","CX","CY","CZ","DE","DJ","DK","DM","DO","DZ","EC","EE","EG","EH","ER","ES","ET","FI","FJ","FK","FM","FO","FR","GA","GB","GD","GE","GF","GG","GH","GI","GL","GM","GN","GP","GQ","GR","GS","GT","GU","GW","GY","HK","HM","HN","HR","HT","HU","ID","IE","IL","IM","IN","IO","IQ","IR","IS","IT","JE","JM","JO","JP","KE","KG","KH","KI","KM","KN","KP","KR","KW","KY","KZ","LA","LB","LC","LI","LK","LR","LS","LT","LU","LV","LY","MA","MC","MD","ME","MF","MG","MH","MK","ML","MM","MN","MO","MP","MQ","MR","MS","MT","MU","MV","MW","MX","MY","MZ","NA","NC","NE","NF","NG","NI","NL","NO","NP","NR","NU","NZ","OM","PA","PE","PF","PG","PH","PK","PL","PM","PN","PR","PS","PT","PW","PY","QA","RE","RO","RS","RU","RW","SA","SB","SC","SD","SE","SG","SH","SI","SJ","SK","SL","SM","SN","SO","SR","SS","ST","SV","SX","SY","SZ","TC","TD","TF","TG","TH","TJ","TK","TL","TM","TN","TO","TR","TT","TV","TW","TZ","UA","UG","UM","US","UY","UZ","VA","VC","VE","VG","VI","VN","VU","WF","WS","YE","YT","ZA","ZM","ZW"];var wt=["AFG","ALA","ALB","DZA","ASM","AND","AGO","AIA","ATA","ATG","ARG","ARM","ABW","AUS","AUT","AZE","BHS","BHR","BGD","BRB","BLR","BEL","BLZ","BEN","BMU","BTN","BOL","BES","BIH","BWA","BVT","BRA","IOT","BRN","BGR","BFA","BDI","KHM","CMR","CAN","CPV","CYM","CAF","TCD","CHL","CHN","CXR","CCK","COL","COM","COG","COD","COK","CRI","CIV","HRV","CUB","CUW","CYP","CZE","DNK","DJI","DMA","DOM","ECU","EGY","SLV","GNQ","ERI","EST","ETH","FLK","FRO","FJI","FIN","FRA","GUF","PYF","ATF","GAB","GMB","GEO","DEU","GHA","GIB","GRC","GRL","GRD","GLP","GUM","GTM","GGY","GIN","GNB","GUY","HTI","HMD","VAT","HND","HKG","HUN","ISL","IND","IDN","IRN","IRQ","IRL","IMN","ISR","ITA","JAM","JPN","JEY","JOR","KAZ","KEN","KIR","PRK","KOR","KWT","KGZ","LAO","LVA","LBN","LSO","LBR","LBY","LIE","LTU","LUX","MAC","MKD","MDG","MWI","MYS","MDV","MLI","MLT","MHL","MTQ","MRT","MUS","MYT","MEX","FSM","MDA","MCO","MNG","MNE","MSR","MAR","MOZ","MMR","NAM","NRU","NPL","NLD","NCL","NZL","NIC","NER","NGA","NIU","NFK","MNP","NOR","OMN","PAK","PLW","PSE","PAN","PNG","PRY","PER","PHL","PCN","POL","PRT","PRI","QAT","REU","ROU","RUS","RWA","BLM","SHN","KNA","LCA","MAF","SPM","VCT","WSM","SMR","STP","SAU","SEN","SRB","SYC","SLE","SGP","SXM","SVK","SVN","SLB","SOM","ZAF","SGS","SSD","ESP","LKA","SDN","SUR","SJM","SWZ","SWE","CHE","SYR","TWN","TJK","TZA","THA","TLS","TGO","TKL","TON","TTO","TUN","TUR","TKM","TCA","TUV","UGA","UKR","ARE","GBR","USA","UMI","URY","UZB","VUT","VEN","VNM","VGB","VIR","WLF","ESH","YEM","ZMB","ZWE"];var It=/^[A-Z2-7]+=*$/;var Lt=/[^A-Z0-9+\/=]/i;var Tt=/^[a-z]+\/[a-z0-9\-\+]+$/i,Zt=/^[a-z\-]+=[a-z0-9\-]+$/i,yt=/^[a-z0-9!\$&'\(\)\*\+,;=\-\._~:@\/\?%\s]*$/i;var Bt=/^magnet:\?xt=urn:[a-z0-9]+:[a-z0-9]{32,40}&dn=.+&tr=.+$/i;var bt=/^(application|audio|font|image|message|model|multipart|text|video)\/[a-zA-Z0-9\.\-\+]{1,100}$/i,Ut=/^text\/[a-zA-Z0-9\.\-\+]{1,100};\s?charset=("[a-zA-Z0-9\.\-\+\s]{0,70}"|[a-zA-Z0-9\.\-\+]{0,70})(\s?\([a-zA-Z0-9\.\-\+\s]{1,20}\))?$/i,Ot=/^multipart\/[a-zA-Z0-9\.\-\+]{1,100}(;\s?(boundary|charset)=("[a-zA-Z0-9\.\-\+\s]{0,70}"|[a-zA-Z0-9\.\-\+]{0,70})(\s?\([a-zA-Z0-9\.\-\+\s]{1,20}\))?){0,2}$/i;var Gt=/^\(?[+-]?(90(\.0+)?|[1-8]?\d(\.\d+)?)$/,Pt=/^\s?[+-]?(180(\.0+)?|1[0-7]\d(\.\d+)?|\d{1,2}(\.\d+)?)\)?$/,Dt=/^\d{4}$/,kt=/^\d{5}$/,Kt=/^\d{6}$/,Ht={AD:/^AD\d{3}$/,AT:Dt,AU:Dt,BE:Dt,BG:Dt,CA:/^[ABCEGHJKLMNPRSTVXY]\d[ABCEGHJ-NPRSTV-Z][\s\-]?\d[ABCEGHJ-NPRSTV-Z]\d$/i,CH:Dt,CZ:/^\d{3}\s?\d{2}$/,DE:kt,DK:Dt,DZ:kt,EE:kt,ES:kt,FI:kt,FR:/^\d{2}\s?\d{3}$/,GB:/^(gir\s?0aa|[a-z]{1,2}\d[\da-z]?\s?(\d[a-z]{2})?)$/i,GR:/^\d{3}\s?\d{2}$/,HR:/^([1-5]\d{4}$)/,HU:Dt,ID:kt,IL:kt,IN:Kt,IS:/^\d{3}$/,IT:kt,JP:/^\d{3}\-\d{4}$/,KE:kt,LI:/^(948[5-9]|949[0-7])$/,LT:/^LT\-\d{5}$/,LU:Dt,LV:/^LV\-\d{4}$/,MX:kt,NL:/^\d{4}\s?[a-z]{2}$/i,NO:Dt,PL:/^\d{2}\-\d{3}$/,PT:/^\d{4}\-\d{3}?$/,RO:Kt,RU:Kt,SA:kt,SE:/^\d{3}\s?\d{2}$/,SI:Dt,SK:/^\d{3}\s?\d{2}$/,TN:Dt,TW:/^\d{3}(\d{2})?$/,UA:kt,US:/^\d{5}(-\d{4})?$/,ZA:Dt,ZM:kt},Wt=Object.keys(Ht);function zt(t,e){m(t);var r=e?new RegExp("^[".concat(e,"]+"),"g"):/^\s+/g;return t.replace(r,"")}function Yt(t,e){m(t);for(var r=e?new RegExp("[".concat(e,"]")):/\s/,n=t.length-1;0<=n&&r.test(t[n]);n--);return n]/.test(r)){if(!e)return!1;if(!(r.split('"').length===r.split('\\"').length))return!1}return!0}(n))return!1}else if(e.require_display_name)return!1}if(!e.ignore_max_length&&254]/.test(t))return!1;if(0===t.indexOf("mailto:"))return!1;var r,n,o,i,a,l,s,u;if(e=v(e,d),1<(s=(t=(s=(t=(s=t.split("#")).shift()).split("?")).shift()).split("://")).length){if(r=s.shift().toLowerCase(),e.require_valid_protocol&&-1===e.protocols.indexOf(r))return!1}else{if(e.require_protocol)return!1;if("//"===t.substr(0,2)){if(!e.allow_protocol_relative_urls)return!1;s[0]=t.substr(2)}}if(""===(t=s.join("://")))return!1;if(""===(t=(s=t.split("/")).shift())&&!e.require_host)return!0;if(1<(s=t.split("@")).length){if(e.disallow_auth)return!1;if(0<=(n=s.shift()).indexOf(":")&&2=e.min)&&(!e.hasOwnProperty("max")||n<=e.max)&&(!e.hasOwnProperty("lt")||ne.gt)},isFloatLocales:X,isDecimal:function(t,e){if(m(t),(e=v(e,Q)).locale in I)return!q(tt,t.replace(/ /g,""))&&function(t){return new RegExp("^[-+]?([0-9]+)?(\\".concat(I[t.locale],"[0-9]{").concat(t.decimal_digits,"})").concat(t.force_decimal?"":"?","$"))}(e).test(t);throw new Error("Invalid locale '".concat(e.locale,"'"))},isHexadecimal:rt,isDivisibleBy:function(t,e){return m(t),r(t)%parseInt(e,10)==0},isHexColor:function(t){return m(t),nt.test(t)},isISRC:function(t){return m(t),ot.test(t)},isMD5:function(t){return m(t),it.test(t)},isHash:function(t,e){return m(t),new RegExp("^[a-f0-9]{".concat(at[e],"}$")).test(t)},isJWT:function(t){return m(t),lt.test(t)},isJSON:function(t){m(t);try{var e=JSON.parse(t);return!!e&&"object"===a(e)}catch(t){}return!1},isEmpty:function(t,e){return m(t),0===((e=v(e,st)).ignore_whitespace?t.trim().length:t.length)},isLength:function(t,e){var r,n;m(t),n="object"===a(e)?(r=e.min||0,e.max):(r=e,arguments[2]);var o=t.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g)||[],i=t.length-o.length;return r<=i&&(void 0===n||i<=n)},isByteLength:$,isUUID:function(t){var e=1/g,">").replace(/\//g,"/").replace(/\\/g,"\").replace(/`/g,"`")},unescape:function(t){return m(t),t.replace(/&/g,"&").replace(/"/g,'"').replace(/'/g,"'").replace(/</g,"<").replace(/>/g,">").replace(///g,"/").replace(/\/g,"\\").replace(/`/g,"`")},stripLow:function(t,e){return m(t),Vt(t,e?"\\x00-\\x09\\x0B\\x0C\\x0E-\\x1F\\x7F":"\\x00-\\x1F\\x7F")},whitelist:function(t,e){return m(t),t.replace(new RegExp("[^".concat(e,"]+"),"g"),"")},blacklist:Vt,isWhitelisted:function(t,e){m(t);for(var r=t.length-1;0<=r;r--)if(-1===e.indexOf(t[r]))return!1;return!0},normalizeEmail:function(t,e){e=v(e,jt);var r=t.split("@"),n=r.pop(),o=[r.join("@"),n];if(o[1]=o[1].toLowerCase(),"gmail.com"===o[1]||"googlemail.com"===o[1]){if(e.gmail_remove_subaddress&&(o[0]=o[0].split("+")[0]),e.gmail_remove_dots&&(o[0]=o[0].replace(/\.+/g,te)),!o[0].length)return!1;(e.all_lowercase||e.gmail_lowercase)&&(o[0]=o[0].toLowerCase()),o[1]=e.gmail_convert_googlemaildotcom?"gmail.com":o[1]}else if(0<=Jt.indexOf(o[1])){if(e.icloud_remove_subaddress&&(o[0]=o[0].split("+")[0]),!o[0].length)return!1;(e.all_lowercase||e.icloud_lowercase)&&(o[0]=o[0].toLowerCase())}else if(0<=qt.indexOf(o[1])){if(e.outlookdotcom_remove_subaddress&&(o[0]=o[0].split("+")[0]),!o[0].length)return!1;(e.all_lowercase||e.outlookdotcom_lowercase)&&(o[0]=o[0].toLowerCase())}else if(0<=Xt.indexOf(o[1])){if(e.yahoo_remove_subaddress){var i=o[0].split("-");o[0]=1i)return!1;if("::"===t)return!0;"::"===t.substr(0,2)?(r.shift(),r.shift(),n=!0):"::"===t.substr(t.length-2)&&(r.pop(),r.pop(),n=!0);for(var a=0;a$/i,E=/^[a-z\d!#\$%&'\*\+\-\/=\?\^_`{\|}~]+$/i,x=/^[a-z\d]+$/,M=/^([\s\x01-\x08\x0b\x0c\x0e-\x1f\x7f\x21\x23-\x5b\x5d-\x7e]|(\\[\x01-\x09\x0b\x0c\x0d-\x7f]))*$/i,C=/^[a-z\d!#\$%&'\*\+\-\/=\?\^_`{\|}~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+$/i,w=/^([\s\x01-\x08\x0b\x0c\x0e-\x1f\x7f\x21\x23-\x5b\x5d-\x7e\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]|(\\[\x01-\x09\x0b\x0c\x0d-\x7f\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))*$/i;var d={protocols:["http","https","ftp"],require_tld:!0,require_protocol:!1,require_host:!0,require_valid_protocol:!0,allow_underscores:!1,allow_trailing_dot:!1,allow_protocol_relative_urls:!1},f=/^\[([^\]]+)\](?::([0-9]+))?$/;function p(t,e){for(var r=0;r=e.min,o=!e.hasOwnProperty("max")||t<=e.max,i=!e.hasOwnProperty("lt")||te.gt;return r.test(t)&&n&&o&&i&&a}var z=/^[\x00-\x7F]+$/;var Y=/[^\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]/;var V=/[\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]/;var j=/[^\x00-\x7F]/;var J=/[\uD800-\uDBFF][\uDC00-\uDFFF]/;function q(t,e){return t.some(function(t){return e===t})}var X=Object.keys(L);var Q={force_decimal:!1,decimal_digits:"1,",locale:"en-US"},tt=["","-","+"];var et=/^[0-9A-F]+$/i;function rt(t){return m(t),et.test(t)}var nt=/^#?([0-9A-F]{3}|[0-9A-F]{6})$/i;var ot=/^[A-Z]{2}[0-9A-Z]{3}\d{2}\d{5}$/;var it=/^[a-f0-9]{32}$/;var at={md5:32,md4:32,sha1:40,sha256:64,sha384:96,sha512:128,ripemd128:32,ripemd160:40,tiger128:32,tiger160:40,tiger192:48,crc32:8,crc32b:8};var lt=/^([A-Za-z0-9\-_~+\/]+[=]{0,2})\.([A-Za-z0-9\-_~+\/]+[=]{0,2})(?:\.([A-Za-z0-9\-_~+\/]+[=]{0,2}))?$/;var st={ignore_whitespace:!1};var ut={3:/^[0-9A-F]{8}-[0-9A-F]{4}-3[0-9A-F]{3}-[0-9A-F]{4}-[0-9A-F]{12}$/i,4:/^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,5:/^[0-9A-F]{8}-[0-9A-F]{4}-5[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,all:/^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i};var ct=/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11}|6[27][0-9]{14})$/;var dt={ES:function(t){m(t);var e={X:0,Y:1,Z:2},r=t.trim().toUpperCase();if(!/^[0-9X-Z][0-9]{7}[TRWAGMYFPDXBNJZSQVHLCKE]$/.test(r))return!1;var n=r.slice(0,-1).replace(/[X,Y,Z]/g,function(t){return e[t]});return r.endsWith(["T","R","W","A","G","M","Y","F","P","D","X","B","N","J","Z","S","Q","V","H","L","C","K","E"][n%23])},"zh-TW":function(t){var o={A:10,B:11,C:12,D:13,E:14,F:15,G:16,H:17,I:34,J:18,K:19,L:20,M:21,N:22,O:35,P:23,Q:24,R:25,S:26,T:27,U:28,V:29,W:32,X:30,Y:31,Z:33},e=t.trim().toUpperCase();return!!/^[A-Z][0-9]{9}$/.test(e)&&Array.from(e).reduce(function(t,e,r){if(0!==r)return 9===r?(10-t%10-Number(e))%10==0:t+Number(e)*(9-r);var n=o[e];return n%10*9+Math.floor(n/10)},0)}};var ft=/^[A-Z]{2}[0-9A-Z]{9}[0-9]$/;var pt=/^(?:[0-9]{9}X|[0-9]{10})$/,gt=/^(?:[0-9]{13})$/,ht=[1,3];var At={"ar-AE":/^((\+?971)|0)?5[024568]\d{7}$/,"ar-DZ":/^(\+?213|0)(5|6|7)\d{8}$/,"ar-EG":/^((\+?20)|0)?1[0125]\d{8}$/,"ar-IQ":/^(\+?964|0)?7[0-9]\d{8}$/,"ar-JO":/^(\+?962|0)?7[789]\d{7}$/,"ar-KW":/^(\+?965)[569]\d{7}$/,"ar-SA":/^(!?(\+?966)|0)?5\d{8}$/,"ar-SY":/^(!?(\+?963)|0)?9\d{8}$/,"ar-TN":/^(\+?216)?[2459]\d{7}$/,"be-BY":/^(\+?375)?(24|25|29|33|44)\d{7}$/,"bg-BG":/^(\+?359|0)?8[789]\d{7}$/,"bn-BD":/^(\+?880|0)1[1356789][0-9]{8}$/,"cs-CZ":/^(\+?420)? ?[1-9][0-9]{2} ?[0-9]{3} ?[0-9]{3}$/,"da-DK":/^(\+?45)?\s?\d{2}\s?\d{2}\s?\d{2}\s?\d{2}$/,"de-DE":/^(\+49)?0?1(5[0-25-9]\d|6([23]|0\d?)|7([0-57-9]|6\d))\d{7}$/,"el-GR":/^(\+?30|0)?(69\d{8})$/,"en-AU":/^(\+?61|0)4\d{8}$/,"en-GB":/^(\+?44|0)7\d{9}$/,"en-GH":/^(\+233|0)(20|50|24|54|27|57|26|56|23|28)\d{7}$/,"en-HK":/^(\+?852\-?)?[456789]\d{3}\-?\d{4}$/,"en-IE":/^(\+?353|0)8[356789]\d{7}$/,"en-IN":/^(\+?91|0)?[6789]\d{9}$/,"en-KE":/^(\+?254|0)(7|1)\d{8}$/,"en-MU":/^(\+?230|0)?\d{8}$/,"en-NG":/^(\+?234|0)?[789]\d{9}$/,"en-NZ":/^(\+?64|0)[28]\d{7,9}$/,"en-PK":/^((\+92)|(0092))-{0,1}\d{3}-{0,1}\d{7}$|^\d{11}$|^\d{4}-\d{7}$/,"en-RW":/^(\+?250|0)?[7]\d{8}$/,"en-SG":/^(\+65)?[89]\d{7}$/,"en-TZ":/^(\+?255|0)?[67]\d{8}$/,"en-UG":/^(\+?256|0)?[7]\d{8}$/,"en-US":/^((\+1|1)?( |-)?)?(\([2-9][0-9]{2}\)|[2-9][0-9]{2})( |-)?([2-9][0-9]{2}( |-)?[0-9]{4})$/,"en-ZA":/^(\+?27|0)\d{9}$/,"en-ZM":/^(\+?26)?09[567]\d{7}$/,"es-CL":/^(\+?56|0)[2-9]\d{1}\d{7}$/,"es-ES":/^(\+?34)?(6\d{1}|7[1234])\d{7}$/,"es-MX":/^(\+?52)?(1|01)?\d{10,11}$/,"es-PY":/^(\+?595|0)9[9876]\d{7}$/,"es-UY":/^(\+598|0)9[1-9][\d]{6}$/,"et-EE":/^(\+?372)?\s?(5|8[1-4])\s?([0-9]\s?){6,7}$/,"fa-IR":/^(\+?98[\-\s]?|0)9[0-39]\d[\-\s]?\d{3}[\-\s]?\d{4}$/,"fi-FI":/^(\+?358|0)\s?(4(0|1|2|4|5|6)?|50)\s?(\d\s?){4,8}\d$/,"fo-FO":/^(\+?298)?\s?\d{2}\s?\d{2}\s?\d{2}$/,"fr-FR":/^(\+?33|0)[67]\d{8}$/,"he-IL":/^(\+972|0)([23489]|5[012345689]|77)[1-9]\d{6}$/,"hu-HU":/^(\+?36)(20|30|70)\d{7}$/,"id-ID":/^(\+?62|0)8(1[123456789]|2[1238]|3[1238]|5[12356789]|7[78]|9[56789]|8[123456789])([\s?|\d]{5,11})$/,"it-IT":/^(\+?39)?\s?3\d{2} ?\d{6,7}$/,"ja-JP":/^(\+?81|0)[789]0[ \-]?[1-9]\d{2}[ \-]?\d{5}$/,"kk-KZ":/^(\+?7|8)?7\d{9}$/,"kl-GL":/^(\+?299)?\s?\d{2}\s?\d{2}\s?\d{2}$/,"ko-KR":/^((\+?82)[ \-]?)?0?1([0|1|6|7|8|9]{1})[ \-]?\d{3,4}[ \-]?\d{4}$/,"lt-LT":/^(\+370|8)\d{8}$/,"ms-MY":/^(\+?6?01){1}(([0145]{1}(\-|\s)?\d{7,8})|([236789]{1}(\s|\-)?\d{7}))$/,"nb-NO":/^(\+?47)?[49]\d{7}$/,"nl-BE":/^(\+?32|0)4?\d{8}$/,"nn-NO":/^(\+?47)?[49]\d{7}$/,"pl-PL":/^(\+?48)? ?[5-8]\d ?\d{3} ?\d{2} ?\d{2}$/,"pt-BR":/(?=^(\+?5{2}\-?|0)[1-9]{2}\-?\d{4}\-?\d{4}$)(^(\+?5{2}\-?|0)[1-9]{2}\-?[6-9]{1}\d{3}\-?\d{4}$)|(^(\+?5{2}\-?|0)[1-9]{2}\-?9[6-9]{1}\d{3}\-?\d{4}$)/,"pt-PT":/^(\+?351)?9[1236]\d{7}$/,"ro-RO":/^(\+?4?0)\s?7\d{2}(\/|\s|\.|\-)?\d{3}(\s|\.|\-)?\d{3}$/,"ru-RU":/^(\+?7|8)?9\d{9}$/,"sl-SI":/^(\+386\s?|0)(\d{1}\s?\d{3}\s?\d{2}\s?\d{2}|\d{2}\s?\d{3}\s?\d{3})$/,"sk-SK":/^(\+?421)? ?[1-9][0-9]{2} ?[0-9]{3} ?[0-9]{3}$/,"sr-RS":/^(\+3816|06)[- \d]{5,9}$/,"sv-SE":/^(\+?46|0)[\s\-]?7[\s\-]?[02369]([\s\-]?\d){7}$/,"th-TH":/^(\+66|66|0)\d{9}$/,"tr-TR":/^(\+?90|0)?5\d{9}$/,"uk-UA":/^(\+?38|8)?0\d{9}$/,"vi-VN":/^(\+?84|0)((3([2-9]))|(5([2689]))|(7([0|6-9]))|(8([1-6|89]))|(9([0-9])))([0-9]{7})$/,"zh-CN":/^((\+|00)86)?1([358][0-9]|4[579]|6[67]|7[0135678]|9[189])[0-9]{8}$/,"zh-TW":/^(\+?886\-?|0)?9\d{8}$/};At["en-CA"]=At["en-US"],At["fr-BE"]=At["nl-BE"],At["zh-HK"]=At["en-HK"];var mt=Object.keys(At);var $t={symbol:"$",require_symbol:!1,allow_space_after_symbol:!1,symbol_after_digits:!1,allow_negatives:!0,parens_for_negatives:!1,negative_sign_before_digits:!1,negative_sign_after_digits:!1,allow_negative_sign_placeholder:!1,thousands_separator:",",decimal_separator:".",allow_decimal:!0,require_decimal:!1,digits_after_decimal:[2],allow_space_after_digits:!1};var vt=/^([\+-]?\d{4}(?!\d{2}\b))((-?)((0[1-9]|1[0-2])(\3([12]\d|0[1-9]|3[01]))?|W([0-4]\d|5[0-3])(-?[1-7])?|(00[1-9]|0[1-9]\d|[12]\d{2}|3([0-5]\d|6[1-6])))([T\s]((([01]\d|2[0-3])((:?)[0-5]\d)?|24:?00)([\.,]\d+(?!:))?)?(\17[0-5]\d([\.,]\d+)?)?([zZ]|([\+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?)?$/;var _t=/([01][0-9]|2[0-3])/,Ft=/[0-5][0-9]/,St=new RegExp("[-+]".concat(_t.source,":").concat(Ft.source)),Rt=new RegExp("([zZ]|".concat(St.source,")")),Et=new RegExp("".concat(_t.source,":").concat(Ft.source,":").concat(/([0-5][0-9]|60)/.source).concat(/(\.[0-9]+)?/.source)),xt=new RegExp("".concat(/[0-9]{4}/.source,"-").concat(/(0[1-9]|1[0-2])/.source,"-").concat(/([12]\d|0[1-9]|3[01])/.source)),Mt=new RegExp("".concat(Et.source).concat(Rt.source)),Ct=new RegExp("".concat(xt.source,"[ tT]").concat(Mt.source));var wt=["AD","AE","AF","AG","AI","AL","AM","AO","AQ","AR","AS","AT","AU","AW","AX","AZ","BA","BB","BD","BE","BF","BG","BH","BI","BJ","BL","BM","BN","BO","BQ","BR","BS","BT","BV","BW","BY","BZ","CA","CC","CD","CF","CG","CH","CI","CK","CL","CM","CN","CO","CR","CU","CV","CW","CX","CY","CZ","DE","DJ","DK","DM","DO","DZ","EC","EE","EG","EH","ER","ES","ET","FI","FJ","FK","FM","FO","FR","GA","GB","GD","GE","GF","GG","GH","GI","GL","GM","GN","GP","GQ","GR","GS","GT","GU","GW","GY","HK","HM","HN","HR","HT","HU","ID","IE","IL","IM","IN","IO","IQ","IR","IS","IT","JE","JM","JO","JP","KE","KG","KH","KI","KM","KN","KP","KR","KW","KY","KZ","LA","LB","LC","LI","LK","LR","LS","LT","LU","LV","LY","MA","MC","MD","ME","MF","MG","MH","MK","ML","MM","MN","MO","MP","MQ","MR","MS","MT","MU","MV","MW","MX","MY","MZ","NA","NC","NE","NF","NG","NI","NL","NO","NP","NR","NU","NZ","OM","PA","PE","PF","PG","PH","PK","PL","PM","PN","PR","PS","PT","PW","PY","QA","RE","RO","RS","RU","RW","SA","SB","SC","SD","SE","SG","SH","SI","SJ","SK","SL","SM","SN","SO","SR","SS","ST","SV","SX","SY","SZ","TC","TD","TF","TG","TH","TJ","TK","TL","TM","TN","TO","TR","TT","TV","TW","TZ","UA","UG","UM","US","UY","UZ","VA","VC","VE","VG","VI","VN","VU","WF","WS","YE","YT","ZA","ZM","ZW"];var Nt=["AFG","ALA","ALB","DZA","ASM","AND","AGO","AIA","ATA","ATG","ARG","ARM","ABW","AUS","AUT","AZE","BHS","BHR","BGD","BRB","BLR","BEL","BLZ","BEN","BMU","BTN","BOL","BES","BIH","BWA","BVT","BRA","IOT","BRN","BGR","BFA","BDI","KHM","CMR","CAN","CPV","CYM","CAF","TCD","CHL","CHN","CXR","CCK","COL","COM","COG","COD","COK","CRI","CIV","HRV","CUB","CUW","CYP","CZE","DNK","DJI","DMA","DOM","ECU","EGY","SLV","GNQ","ERI","EST","ETH","FLK","FRO","FJI","FIN","FRA","GUF","PYF","ATF","GAB","GMB","GEO","DEU","GHA","GIB","GRC","GRL","GRD","GLP","GUM","GTM","GGY","GIN","GNB","GUY","HTI","HMD","VAT","HND","HKG","HUN","ISL","IND","IDN","IRN","IRQ","IRL","IMN","ISR","ITA","JAM","JPN","JEY","JOR","KAZ","KEN","KIR","PRK","KOR","KWT","KGZ","LAO","LVA","LBN","LSO","LBR","LBY","LIE","LTU","LUX","MAC","MKD","MDG","MWI","MYS","MDV","MLI","MLT","MHL","MTQ","MRT","MUS","MYT","MEX","FSM","MDA","MCO","MNG","MNE","MSR","MAR","MOZ","MMR","NAM","NRU","NPL","NLD","NCL","NZL","NIC","NER","NGA","NIU","NFK","MNP","NOR","OMN","PAK","PLW","PSE","PAN","PNG","PRY","PER","PHL","PCN","POL","PRT","PRI","QAT","REU","ROU","RUS","RWA","BLM","SHN","KNA","LCA","MAF","SPM","VCT","WSM","SMR","STP","SAU","SEN","SRB","SYC","SLE","SGP","SXM","SVK","SVN","SLB","SOM","ZAF","SGS","SSD","ESP","LKA","SDN","SUR","SJM","SWZ","SWE","CHE","SYR","TWN","TJK","TZA","THA","TLS","TGO","TKL","TON","TTO","TUN","TUR","TKM","TCA","TUV","UGA","UKR","ARE","GBR","USA","UMI","URY","UZB","VUT","VEN","VNM","VGB","VIR","WLF","ESH","YEM","ZMB","ZWE"];var Lt=/^[A-Z2-7]+=*$/;var It=/[^A-Z0-9+\/=]/i;var Zt=/^[a-z]+\/[a-z0-9\-\+]+$/i,Tt=/^[a-z\-]+=[a-z0-9\-]+$/i,yt=/^[a-z0-9!\$&'\(\)\*\+,;=\-\._~:@\/\?%\s]*$/i;var Bt=/^magnet:\?xt=urn:[a-z0-9]+:[a-z0-9]{32,40}&dn=.+&tr=.+$/i;var bt=/^(application|audio|font|image|message|model|multipart|text|video)\/[a-zA-Z0-9\.\-\+]{1,100}$/i,Ut=/^text\/[a-zA-Z0-9\.\-\+]{1,100};\s?charset=("[a-zA-Z0-9\.\-\+\s]{0,70}"|[a-zA-Z0-9\.\-\+]{0,70})(\s?\([a-zA-Z0-9\.\-\+\s]{1,20}\))?$/i,Gt=/^multipart\/[a-zA-Z0-9\.\-\+]{1,100}(;\s?(boundary|charset)=("[a-zA-Z0-9\.\-\+\s]{0,70}"|[a-zA-Z0-9\.\-\+]{0,70})(\s?\([a-zA-Z0-9\.\-\+\s]{1,20}\))?){0,2}$/i;var Ot=/^\(?[+-]?(90(\.0+)?|[1-8]?\d(\.\d+)?)$/,Pt=/^\s?[+-]?(180(\.0+)?|1[0-7]\d(\.\d+)?|\d{1,2}(\.\d+)?)\)?$/,Dt=/^\d{4}$/,kt=/^\d{5}$/,Kt=/^\d{6}$/,Ht={AD:/^AD\d{3}$/,AT:Dt,AU:Dt,BE:Dt,BG:Dt,CA:/^[ABCEGHJKLMNPRSTVXY]\d[ABCEGHJ-NPRSTV-Z][\s\-]?\d[ABCEGHJ-NPRSTV-Z]\d$/i,CH:Dt,CZ:/^\d{3}\s?\d{2}$/,DE:kt,DK:Dt,DZ:kt,EE:kt,ES:kt,FI:kt,FR:/^\d{2}\s?\d{3}$/,GB:/^(gir\s?0aa|[a-z]{1,2}\d[\da-z]?\s?(\d[a-z]{2})?)$/i,GR:/^\d{3}\s?\d{2}$/,HR:/^([1-5]\d{4}$)/,HU:Dt,ID:kt,IL:kt,IN:Kt,IS:/^\d{3}$/,IT:kt,JP:/^\d{3}\-\d{4}$/,KE:kt,LI:/^(948[5-9]|949[0-7])$/,LT:/^LT\-\d{5}$/,LU:Dt,LV:/^LV\-\d{4}$/,MX:kt,NL:/^\d{4}\s?[a-z]{2}$/i,NO:Dt,PL:/^\d{2}\-\d{3}$/,PT:/^\d{4}\-\d{3}?$/,RO:Kt,RU:Kt,SA:kt,SE:/^\d{3}\s?\d{2}$/,SI:Dt,SK:/^\d{3}\s?\d{2}$/,TN:Dt,TW:/^\d{3}(\d{2})?$/,UA:kt,US:/^\d{5}(-\d{4})?$/,ZA:Dt,ZM:kt},Wt=Object.keys(Ht);function zt(t,e){m(t);var r=e?new RegExp("^[".concat(e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),"]+"),"g"):/^\s+/g;return t.replace(r,"")}function Yt(t,e){m(t);var r=e?new RegExp("[".concat(e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),"]+$"),"g"):/\s+$/g;return t.replace(r,"")}function Vt(t,e){return m(t),t.replace(new RegExp("[".concat(e,"]+"),"g"),"")}var jt={all_lowercase:!0,gmail_lowercase:!0,gmail_remove_dots:!0,gmail_remove_subaddress:!0,gmail_convert_googlemaildotcom:!0,outlookdotcom_lowercase:!0,outlookdotcom_remove_subaddress:!0,yahoo_lowercase:!0,yahoo_remove_subaddress:!0,yandex_lowercase:!0,icloud_lowercase:!0,icloud_remove_subaddress:!0},Jt=["icloud.com","me.com"],qt=["hotmail.at","hotmail.be","hotmail.ca","hotmail.cl","hotmail.co.il","hotmail.co.nz","hotmail.co.th","hotmail.co.uk","hotmail.com","hotmail.com.ar","hotmail.com.au","hotmail.com.br","hotmail.com.gr","hotmail.com.mx","hotmail.com.pe","hotmail.com.tr","hotmail.com.vn","hotmail.cz","hotmail.de","hotmail.dk","hotmail.es","hotmail.fr","hotmail.hu","hotmail.id","hotmail.ie","hotmail.in","hotmail.it","hotmail.jp","hotmail.kr","hotmail.lv","hotmail.my","hotmail.ph","hotmail.pt","hotmail.sa","hotmail.sg","hotmail.sk","live.be","live.co.uk","live.com","live.com.ar","live.com.mx","live.de","live.es","live.eu","live.fr","live.it","live.nl","msn.com","outlook.at","outlook.be","outlook.cl","outlook.co.il","outlook.co.nz","outlook.co.th","outlook.com","outlook.com.ar","outlook.com.au","outlook.com.br","outlook.com.gr","outlook.com.pe","outlook.com.tr","outlook.com.vn","outlook.cz","outlook.de","outlook.dk","outlook.es","outlook.fr","outlook.hu","outlook.id","outlook.ie","outlook.in","outlook.it","outlook.jp","outlook.kr","outlook.lv","outlook.my","outlook.ph","outlook.pt","outlook.sa","outlook.sg","outlook.sk","passport.com"],Xt=["rocketmail.com","yahoo.ca","yahoo.co.uk","yahoo.com","yahoo.de","yahoo.fr","yahoo.in","yahoo.it","ymail.com"],Qt=["yandex.ru","yandex.ua","yandex.kz","yandex.com","yandex.by","ya.ru"];function te(t){return 1]/.test(r)){if(!e)return!1;if(r.split('"').length!==r.split('\\"').length)return!1}return!0}(n))return!1}else if(e.require_display_name)return!1}if(!e.ignore_max_length&&254]/.test(t))return!1;if(0===t.indexOf("mailto:"))return!1;var r,n,o,i,a,l,s,u;if(e=$(e,d),1<(s=(t=(s=(t=(s=t.split("#")).shift()).split("?")).shift()).split("://")).length){if(r=s.shift().toLowerCase(),e.require_valid_protocol&&-1===e.protocols.indexOf(r))return!1}else{if(e.require_protocol)return!1;if("//"===t.substr(0,2)){if(!e.allow_protocol_relative_urls)return!1;s[0]=t.substr(2)}}if(""===(t=s.join("://")))return!1;if(""===(t=(s=t.split("/")).shift())&&!e.require_host)return!0;if(1<(s=t.split("@")).length){if(e.disallow_auth)return!1;if(0<=(n=s.shift()).indexOf(":")&&2=e.min)&&(!e.hasOwnProperty("max")||n<=e.max)&&(!e.hasOwnProperty("lt")||ne.gt)},isFloatLocales:X,isDecimal:function(t,e){if(m(t),(e=$(e,Q)).locale in L)return!q(tt,t.replace(/ /g,""))&&function(t){return new RegExp("^[-+]?([0-9]+)?(\\".concat(L[t.locale],"[0-9]{").concat(t.decimal_digits,"})").concat(t.force_decimal?"":"?","$"))}(e).test(t);throw new Error("Invalid locale '".concat(e.locale,"'"))},isHexadecimal:rt,isDivisibleBy:function(t,e){return m(t),r(t)%parseInt(e,10)==0},isHexColor:function(t){return m(t),nt.test(t)},isISRC:function(t){return m(t),ot.test(t)},isMD5:function(t){return m(t),it.test(t)},isHash:function(t,e){return m(t),new RegExp("^[a-f0-9]{".concat(at[e],"}$")).test(t)},isJWT:function(t){return m(t),lt.test(t)},isJSON:function(t){m(t);try{var e=JSON.parse(t);return!!e&&"object"===a(e)}catch(t){}return!1},isEmpty:function(t,e){return m(t),0===((e=$(e,st)).ignore_whitespace?t.trim().length:t.length)},isLength:function(t,e){var r,n;m(t),n="object"===a(e)?(r=e.min||0,e.max):(r=e,arguments[2]);var o=t.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g)||[],i=t.length-o.length;return r<=i&&(void 0===n||i<=n)},isByteLength:v,isUUID:function(t){var e=1/g,">").replace(/\//g,"/").replace(/\\/g,"\").replace(/`/g,"`")},unescape:function(t){return m(t),t.replace(/&/g,"&").replace(/"/g,'"').replace(/'/g,"'").replace(/</g,"<").replace(/>/g,">").replace(///g,"/").replace(/\/g,"\\").replace(/`/g,"`")},stripLow:function(t,e){return m(t),Vt(t,e?"\\x00-\\x09\\x0B\\x0C\\x0E-\\x1F\\x7F":"\\x00-\\x1F\\x7F")},whitelist:function(t,e){return m(t),t.replace(new RegExp("[^".concat(e,"]+"),"g"),"")},blacklist:Vt,isWhitelisted:function(t,e){m(t);for(var r=t.length-1;0<=r;r--)if(-1===e.indexOf(t[r]))return!1;return!0},normalizeEmail:function(t,e){e=$(e,jt);var r=t.split("@"),n=r.pop(),o=[r.join("@"),n];if(o[1]=o[1].toLowerCase(),"gmail.com"===o[1]||"googlemail.com"===o[1]){if(e.gmail_remove_subaddress&&(o[0]=o[0].split("+")[0]),e.gmail_remove_dots&&(o[0]=o[0].replace(/\.+/g,te)),!o[0].length)return!1;(e.all_lowercase||e.gmail_lowercase)&&(o[0]=o[0].toLowerCase()),o[1]=e.gmail_convert_googlemaildotcom?"gmail.com":o[1]}else if(0<=Jt.indexOf(o[1])){if(e.icloud_remove_subaddress&&(o[0]=o[0].split("+")[0]),!o[0].length)return!1;(e.all_lowercase||e.icloud_lowercase)&&(o[0]=o[0].toLowerCase())}else if(0<=qt.indexOf(o[1])){if(e.outlookdotcom_remove_subaddress&&(o[0]=o[0].split("+")[0]),!o[0].length)return!1;(e.all_lowercase||e.outlookdotcom_lowercase)&&(o[0]=o[0].toLowerCase())}else if(0<=Xt.indexOf(o[1])){if(e.yahoo_remove_subaddress){var i=o[0].split("-");o[0]=1