{"version":3,"sources":["node_modules/currency-symbol-map/map.js","node_modules/currency-symbol-map/currency-symbol-map.js","node_modules/locale-currency/map.js","node_modules/locale-currency/index.js","node_modules/date-fns/esm/locale/cs/_lib/formatDistance/index.js","node_modules/date-fns/esm/locale/cs/_lib/formatLong/index.js","node_modules/date-fns/esm/locale/cs/_lib/formatRelative/index.js","node_modules/date-fns/esm/locale/cs/_lib/localize/index.js","node_modules/date-fns/esm/locale/cs/_lib/match/index.js","node_modules/date-fns/esm/locale/cs/index.js","node_modules/date-fns/esm/locale/de/_lib/formatDistance/index.js","node_modules/date-fns/esm/locale/de/_lib/formatLong/index.js","node_modules/date-fns/esm/locale/de/_lib/formatRelative/index.js","node_modules/date-fns/esm/locale/de/_lib/localize/index.js","node_modules/date-fns/esm/locale/de/_lib/match/index.js","node_modules/date-fns/esm/locale/de/index.js","node_modules/date-fns/esm/locale/en-CA/_lib/formatDistance/index.js","node_modules/date-fns/esm/locale/en-CA/_lib/formatLong/index.js","node_modules/date-fns/esm/locale/en-CA/index.js","node_modules/date-fns/esm/locale/es/_lib/formatDistance/index.js","node_modules/date-fns/esm/locale/es/_lib/formatLong/index.js","node_modules/date-fns/esm/locale/es/_lib/formatRelative/index.js","node_modules/date-fns/esm/locale/es/_lib/localize/index.js","node_modules/date-fns/esm/locale/es/_lib/match/index.js","node_modules/date-fns/esm/locale/es/index.js","node_modules/date-fns/esm/locale/fr/_lib/formatDistance/index.js","node_modules/date-fns/esm/locale/fr/_lib/formatLong/index.js","node_modules/date-fns/esm/locale/fr/_lib/formatRelative/index.js","node_modules/date-fns/esm/locale/fr/_lib/localize/index.js","node_modules/date-fns/esm/locale/fr/_lib/match/index.js","node_modules/date-fns/esm/locale/fr/index.js","node_modules/date-fns/esm/locale/fr-CA/_lib/formatLong/index.js","node_modules/date-fns/esm/locale/fr-CA/index.js","node_modules/date-fns/esm/locale/nl/_lib/formatDistance/index.js","node_modules/date-fns/esm/locale/nl/_lib/formatLong/index.js","node_modules/date-fns/esm/locale/nl/_lib/formatRelative/index.js","node_modules/date-fns/esm/locale/nl/_lib/localize/index.js","node_modules/date-fns/esm/locale/nl/_lib/match/index.js","node_modules/date-fns/esm/locale/nl/index.js","libs/galaxy/i18n/src/browser-locale/language.ts","libs/galaxy/i18n/src/browser-locale/browser-locale.ts","libs/galaxy/utility/locale/src/locale-utils.ts","libs/galaxy/utility/currency-utils/src/currency-utils.ts","libs/galaxy/pipes/src/currency/currency.pipe.ts","libs/galaxy/pipes/src/address/address.pipe.ts","libs/galaxy/pipes/src/async-status/async-status.pipe.ts","libs/galaxy/utility/date-utils/src/interface.ts","libs/galaxy/utility/date-utils/src/date-utils.ts","libs/galaxy/pipes/src/date/date.pipe.ts","libs/galaxy/utility/ordinal-utils/src/ordinal-utils.ts","libs/galaxy/pipes/src/ordinal/ordinal.pipe.ts","libs/galaxy/pipes/src/i-trust-this-html/i-trust-this-html.pipe.ts","node_modules/autolinker/dist/es2015/version.js","node_modules/autolinker/dist/es2015/utils.js","node_modules/autolinker/dist/es2015/regex-lib.js","node_modules/autolinker/dist/es2015/html-tag.js","node_modules/autolinker/dist/es2015/truncate/truncate-smart.js","node_modules/autolinker/dist/es2015/truncate/truncate-middle.js","node_modules/autolinker/dist/es2015/truncate/truncate-end.js","node_modules/autolinker/dist/es2015/anchor-tag-builder.js","node_modules/autolinker/dist/es2015/match/abstract-match.js","node_modules/autolinker/dist/es2015/parser/tld-regex.js","node_modules/autolinker/dist/es2015/parser/uri-utils.js","node_modules/autolinker/dist/es2015/match/url-match.js","node_modules/autolinker/dist/es2015/parser/email-utils.js","node_modules/autolinker/dist/es2015/match/email-match.js","node_modules/autolinker/dist/es2015/parser/hashtag-utils.js","node_modules/autolinker/dist/es2015/match/hashtag-match.js","node_modules/autolinker/dist/es2015/parser/mention-utils.js","node_modules/autolinker/dist/es2015/match/mention-match.js","node_modules/autolinker/dist/es2015/parser/phone-number-utils.js","node_modules/autolinker/dist/es2015/match/phone-match.js","node_modules/autolinker/dist/es2015/parser/parse-matches.js","node_modules/autolinker/dist/es2015/htmlParser/parse-html.js","node_modules/autolinker/dist/es2015/autolinker.js","node_modules/autolinker/dist/es2015/index.js","libs/galaxy/pipes/src/linky/linky.pipe.ts","libs/galaxy/pipes/src/format-stat/format-stat.pipe.ts","libs/galaxy/pipes/src/truncate-url/truncate-url.pipe.ts","libs/galaxy/pipes/src/pipes.module.ts"],"sourcesContent":["module.exports = {\n AED: 'د.إ',\n AFN: '؋',\n ALL: 'L',\n AMD: '֏',\n ANG: 'ƒ',\n AOA: 'Kz',\n ARS: '$',\n AUD: '$',\n AWG: 'ƒ',\n AZN: '₼',\n BAM: 'KM',\n BBD: '$',\n BDT: '৳',\n BGN: 'лв',\n BHD: '.د.ب',\n BIF: 'FBu',\n BMD: '$',\n BND: '$',\n BOB: '$b',\n BOV: 'BOV',\n BRL: 'R$',\n BSD: '$',\n BTC: '₿',\n BTN: 'Nu.',\n BWP: 'P',\n BYN: 'Br',\n BYR: 'Br',\n BZD: 'BZ$',\n CAD: '$',\n CDF: 'FC',\n CHE: 'CHE',\n CHF: 'CHF',\n CHW: 'CHW',\n CLF: 'CLF',\n CLP: '$',\n CNH: '¥',\n CNY: '¥',\n COP: '$',\n COU: 'COU',\n CRC: '₡',\n CUC: '$',\n CUP: '₱',\n CVE: '$',\n CZK: 'Kč',\n DJF: 'Fdj',\n DKK: 'kr',\n DOP: 'RD$',\n DZD: 'دج',\n EEK: 'kr',\n EGP: '£',\n ERN: 'Nfk',\n ETB: 'Br',\n ETH: 'Ξ',\n EUR: '€',\n FJD: '$',\n FKP: '£',\n GBP: '£',\n GEL: '₾',\n GGP: '£',\n GHC: '₵',\n GHS: 'GH₵',\n GIP: '£',\n GMD: 'D',\n GNF: 'FG',\n GTQ: 'Q',\n GYD: '$',\n HKD: '$',\n HNL: 'L',\n HRK: 'kn',\n HTG: 'G',\n HUF: 'Ft',\n IDR: 'Rp',\n ILS: '₪',\n IMP: '£',\n INR: '₹',\n IQD: 'ع.د',\n IRR: '﷼',\n ISK: 'kr',\n JEP: '£',\n JMD: 'J$',\n JOD: 'JD',\n JPY: '¥',\n KES: 'KSh',\n KGS: 'лв',\n KHR: '៛',\n KMF: 'CF',\n KPW: '₩',\n KRW: '₩',\n KWD: 'KD',\n KYD: '$',\n KZT: '₸',\n LAK: '₭',\n LBP: '£',\n LKR: '₨',\n LRD: '$',\n LSL: 'M',\n LTC: 'Ł',\n LTL: 'Lt',\n LVL: 'Ls',\n LYD: 'LD',\n MAD: 'MAD',\n MDL: 'lei',\n MGA: 'Ar',\n MKD: 'ден',\n MMK: 'K',\n MNT: '₮',\n MOP: 'MOP$',\n MRO: 'UM',\n MRU: 'UM',\n MUR: '₨',\n MVR: 'Rf',\n MWK: 'MK',\n MXN: '$',\n MXV: 'MXV',\n MYR: 'RM',\n MZN: 'MT',\n NAD: '$',\n NGN: '₦',\n NIO: 'C$',\n NOK: 'kr',\n NPR: '₨',\n NZD: '$',\n OMR: '﷼',\n PAB: 'B/.',\n PEN: 'S/.',\n PGK: 'K',\n PHP: '₱',\n PKR: '₨',\n PLN: 'zł',\n PYG: 'Gs',\n QAR: '﷼',\n RMB: '¥',\n RON: 'lei',\n RSD: 'Дин.',\n RUB: '₽',\n RWF: 'R₣',\n SAR: '﷼',\n SBD: '$',\n SCR: '₨',\n SDG: 'ج.س.',\n SEK: 'kr',\n SGD: 'S$',\n SHP: '£',\n SLL: 'Le',\n SOS: 'S',\n SRD: '$',\n SSP: '£',\n STD: 'Db',\n STN: 'Db',\n SVC: '$',\n SYP: '£',\n SZL: 'E',\n THB: '฿',\n TJS: 'SM',\n TMT: 'T',\n TND: 'د.ت',\n TOP: 'T$',\n TRL: '₤',\n TRY: '₺',\n TTD: 'TT$',\n TVD: '$',\n TWD: 'NT$',\n TZS: 'TSh',\n UAH: '₴',\n UGX: 'USh',\n USD: '$',\n UYI: 'UYI',\n UYU: '$U',\n UYW: 'UYW',\n UZS: 'лв',\n VEF: 'Bs',\n VES: 'Bs.S',\n VND: '₫',\n VUV: 'VT',\n WST: 'WS$',\n XAF: 'FCFA',\n XBT: 'Ƀ',\n XCD: '$',\n XOF: 'CFA',\n XPF: '₣',\n XSU: 'Sucre',\n XUA: 'XUA',\n YER: '﷼',\n ZAR: 'R',\n ZMW: 'ZK',\n ZWD: 'Z$',\n ZWL: '$'\n};","const currencySymbolMap = require('./map');\nmodule.exports = function getSymbolFromCurrency(currencyCode) {\n if (typeof currencyCode !== 'string') {\n return undefined;\n }\n const code = currencyCode.toUpperCase();\n if (!Object.prototype.hasOwnProperty.call(currencySymbolMap, code)) {\n return undefined;\n }\n return currencySymbolMap[code];\n};\nmodule.exports.currencySymbolMap = currencySymbolMap;","// Generated using ShowCurrencies.java\nvar map = {\n AD: 'EUR',\n AE: 'AED',\n AF: 'AFN',\n AG: 'XCD',\n AI: 'XCD',\n AL: 'ALL',\n AM: 'AMD',\n AN: 'ANG',\n AO: 'AOA',\n AR: 'ARS',\n AS: 'USD',\n AT: 'EUR',\n AU: 'AUD',\n AW: 'AWG',\n AX: 'EUR',\n AZ: 'AZN',\n BA: 'BAM',\n BB: 'BBD',\n BD: 'BDT',\n BE: 'EUR',\n BF: 'XOF',\n BG: 'BGN',\n BH: 'BHD',\n BI: 'BIF',\n BJ: 'XOF',\n BL: 'EUR',\n BM: 'BMD',\n BN: 'BND',\n BO: 'BOB',\n BQ: 'USD',\n BR: 'BRL',\n BS: 'BSD',\n BT: 'BTN',\n BV: 'NOK',\n BW: 'BWP',\n BY: 'BYR',\n BZ: 'BZD',\n CA: 'CAD',\n CC: 'AUD',\n CD: 'CDF',\n CF: 'XAF',\n CG: 'XAF',\n CH: 'CHF',\n CI: 'XOF',\n CK: 'NZD',\n CL: 'CLP',\n CM: 'XAF',\n CN: 'CNY',\n CO: 'COP',\n CR: 'CRC',\n CU: 'CUP',\n CV: 'CVE',\n CW: 'ANG',\n CX: 'AUD',\n CY: 'EUR',\n CZ: 'CZK',\n DE: 'EUR',\n DJ: 'DJF',\n DK: 'DKK',\n DM: 'XCD',\n DO: 'DOP',\n DZ: 'DZD',\n EC: 'USD',\n EE: 'EUR',\n EG: 'EGP',\n EH: 'MAD',\n ER: 'ERN',\n ES: 'EUR',\n ET: 'ETB',\n FI: 'EUR',\n FJ: 'FJD',\n FK: 'FKP',\n FM: 'USD',\n FO: 'DKK',\n FR: 'EUR',\n GA: 'XAF',\n GB: 'GBP',\n GD: 'XCD',\n GE: 'GEL',\n GF: 'EUR',\n GG: 'GBP',\n GH: 'GHS',\n GI: 'GIP',\n GL: 'DKK',\n GM: 'GMD',\n GN: 'GNF',\n GP: 'EUR',\n GQ: 'XAF',\n GR: 'EUR',\n GS: 'GBP',\n GT: 'GTQ',\n GU: 'USD',\n GW: 'XOF',\n GY: 'GYD',\n HK: 'HKD',\n HM: 'AUD',\n HN: 'HNL',\n HR: 'HRK',\n HT: 'HTG',\n HU: 'HUF',\n ID: 'IDR',\n IE: 'EUR',\n IL: 'ILS',\n IM: 'GBP',\n IN: 'INR',\n IO: 'USD',\n IQ: 'IQD',\n IR: 'IRR',\n IS: 'ISK',\n IT: 'EUR',\n JE: 'GBP',\n JM: 'JMD',\n JO: 'JOD',\n JP: 'JPY',\n KE: 'KES',\n KG: 'KGS',\n KH: 'KHR',\n KI: 'AUD',\n KM: 'KMF',\n KN: 'XCD',\n KP: 'KPW',\n KR: 'KRW',\n KW: 'KWD',\n KY: 'KYD',\n KZ: 'KZT',\n LA: 'LAK',\n LB: 'LBP',\n LC: 'XCD',\n LI: 'CHF',\n LK: 'LKR',\n LR: 'LRD',\n LS: 'LSL',\n LT: 'LTL',\n LU: 'EUR',\n LV: 'LVL',\n LY: 'LYD',\n MA: 'MAD',\n MC: 'EUR',\n MD: 'MDL',\n ME: 'EUR',\n MF: 'EUR',\n MG: 'MGA',\n MH: 'USD',\n MK: 'MKD',\n ML: 'XOF',\n MM: 'MMK',\n MN: 'MNT',\n MO: 'MOP',\n MP: 'USD',\n MQ: 'EUR',\n MR: 'MRO',\n MS: 'XCD',\n MT: 'EUR',\n MU: 'MUR',\n MV: 'MVR',\n MW: 'MWK',\n MX: 'MXN',\n MY: 'MYR',\n MZ: 'MZN',\n NA: 'NAD',\n NC: 'XPF',\n NE: 'XOF',\n NF: 'AUD',\n NG: 'NGN',\n NI: 'NIO',\n NL: 'EUR',\n NO: 'NOK',\n NP: 'NPR',\n NR: 'AUD',\n NU: 'NZD',\n NZ: 'NZD',\n OM: 'OMR',\n PA: 'PAB',\n PE: 'PEN',\n PF: 'XPF',\n PG: 'PGK',\n PH: 'PHP',\n PK: 'PKR',\n PL: 'PLN',\n PM: 'EUR',\n PN: 'NZD',\n PR: 'USD',\n PS: 'ILS',\n PT: 'EUR',\n PW: 'USD',\n PY: 'PYG',\n QA: 'QAR',\n RE: 'EUR',\n RO: 'RON',\n RS: 'RSD',\n RU: 'RUB',\n RW: 'RWF',\n SA: 'SAR',\n SB: 'SBD',\n SC: 'SCR',\n SD: 'SDG',\n SE: 'SEK',\n SG: 'SGD',\n SH: 'SHP',\n SI: 'EUR',\n SJ: 'NOK',\n SK: 'EUR',\n SL: 'SLL',\n SM: 'EUR',\n SN: 'XOF',\n SO: 'SOS',\n SR: 'SRD',\n ST: 'STD',\n SV: 'SVC',\n SX: 'ANG',\n SY: 'SYP',\n SZ: 'SZL',\n TC: 'USD',\n TD: 'XAF',\n TF: 'EUR',\n TG: 'XOF',\n TH: 'THB',\n TJ: 'TJS',\n TK: 'NZD',\n TL: 'USD',\n TM: 'TMT',\n TN: 'TND',\n TO: 'TOP',\n TR: 'TRY',\n TT: 'TTD',\n TV: 'AUD',\n TW: 'TWD',\n TZ: 'TZS',\n UA: 'UAH',\n UG: 'UGX',\n UM: 'USD',\n US: 'USD',\n UY: 'UYU',\n UZ: 'UZS',\n VA: 'EUR',\n VC: 'XCD',\n VE: 'VEF',\n VG: 'USD',\n VI: 'USD',\n VN: 'VND',\n VU: 'VUV',\n WF: 'XPF',\n WS: 'WST',\n YE: 'YER',\n YT: 'EUR',\n ZA: 'ZAR',\n ZM: 'ZMK',\n ZW: 'ZWL'\n};\nmodule.exports = map;","var map = require(\"./map\");\nvar getCountryCode = function (localeString) {\n var components = localeString.split(\"_\");\n if (components.length == 2) {\n return components.pop();\n }\n components = localeString.split(\"-\");\n if (components.length == 2) {\n return components.pop();\n }\n return localeString;\n};\nexports.getCurrency = function (locale) {\n var countryCode = getCountryCode(locale).toUpperCase();\n if (countryCode in map) {\n return map[countryCode];\n }\n return null;\n};\nexports.getLocales = function (currencyCode) {\n currencyCode = currencyCode.toUpperCase();\n var locales = [];\n for (countryCode in map) {\n if (map[countryCode] === currencyCode) {\n locales.push(countryCode);\n }\n }\n return locales;\n};","var formatDistanceLocale = {\n lessThanXSeconds: {\n one: {\n regular: 'méně než sekunda',\n past: 'před méně než sekundou',\n future: 'za méně než sekundu'\n },\n few: {\n regular: 'méně než {{count}} sekundy',\n past: 'před méně než {{count}} sekundami',\n future: 'za méně než {{count}} sekundy'\n },\n many: {\n regular: 'méně než {{count}} sekund',\n past: 'před méně než {{count}} sekundami',\n future: 'za méně než {{count}} sekund'\n }\n },\n xSeconds: {\n one: {\n regular: 'sekunda',\n past: 'před sekundou',\n future: 'za sekundu'\n },\n few: {\n regular: '{{count}} sekundy',\n past: 'před {{count}} sekundami',\n future: 'za {{count}} sekundy'\n },\n many: {\n regular: '{{count}} sekund',\n past: 'před {{count}} sekundami',\n future: 'za {{count}} sekund'\n }\n },\n halfAMinute: {\n type: 'other',\n other: {\n regular: 'půl minuty',\n past: 'před půl minutou',\n future: 'za půl minuty'\n }\n },\n lessThanXMinutes: {\n one: {\n regular: 'méně než minuta',\n past: 'před méně než minutou',\n future: 'za méně než minutu'\n },\n few: {\n regular: 'méně než {{count}} minuty',\n past: 'před méně než {{count}} minutami',\n future: 'za méně než {{count}} minuty'\n },\n many: {\n regular: 'méně než {{count}} minut',\n past: 'před méně než {{count}} minutami',\n future: 'za méně než {{count}} minut'\n }\n },\n xMinutes: {\n one: {\n regular: 'minuta',\n past: 'před minutou',\n future: 'za minutu'\n },\n few: {\n regular: '{{count}} minuty',\n past: 'před {{count}} minutami',\n future: 'za {{count}} minuty'\n },\n many: {\n regular: '{{count}} minut',\n past: 'před {{count}} minutami',\n future: 'za {{count}} minut'\n }\n },\n aboutXHours: {\n one: {\n regular: 'přibližně hodina',\n past: 'přibližně před hodinou',\n future: 'přibližně za hodinu'\n },\n few: {\n regular: 'přibližně {{count}} hodiny',\n past: 'přibližně před {{count}} hodinami',\n future: 'přibližně za {{count}} hodiny'\n },\n many: {\n regular: 'přibližně {{count}} hodin',\n past: 'přibližně před {{count}} hodinami',\n future: 'přibližně za {{count}} hodin'\n }\n },\n xHours: {\n one: {\n regular: 'hodina',\n past: 'před hodinou',\n future: 'za hodinu'\n },\n few: {\n regular: '{{count}} hodiny',\n past: 'před {{count}} hodinami',\n future: 'za {{count}} hodiny'\n },\n many: {\n regular: '{{count}} hodin',\n past: 'před {{count}} hodinami',\n future: 'za {{count}} hodin'\n }\n },\n xDays: {\n one: {\n regular: 'den',\n past: 'před dnem',\n future: 'za den'\n },\n few: {\n regular: '{{count}} dny',\n past: 'před {{count}} dny',\n future: 'za {{count}} dny'\n },\n many: {\n regular: '{{count}} dní',\n past: 'před {{count}} dny',\n future: 'za {{count}} dní'\n }\n },\n aboutXWeeks: {\n one: {\n regular: 'přibližně týden',\n past: 'přibližně před týdnem',\n future: 'přibližně za týden'\n },\n few: {\n regular: 'přibližně {{count}} týdny',\n past: 'přibližně před {{count}} týdny',\n future: 'přibližně za {{count}} týdny'\n },\n many: {\n regular: 'přibližně {{count}} týdnů',\n past: 'přibližně před {{count}} týdny',\n future: 'přibližně za {{count}} týdnů'\n }\n },\n xWeeks: {\n one: {\n regular: 'týden',\n past: 'před týdnem',\n future: 'za týden'\n },\n few: {\n regular: '{{count}} týdny',\n past: 'před {{count}} týdny',\n future: 'za {{count}} týdny'\n },\n many: {\n regular: '{{count}} týdnů',\n past: 'před {{count}} týdny',\n future: 'za {{count}} týdnů'\n }\n },\n aboutXMonths: {\n one: {\n regular: 'přibližně měsíc',\n past: 'přibližně před měsícem',\n future: 'přibližně za měsíc'\n },\n few: {\n regular: 'přibližně {{count}} měsíce',\n past: 'přibližně před {{count}} měsíci',\n future: 'přibližně za {{count}} měsíce'\n },\n many: {\n regular: 'přibližně {{count}} měsíců',\n past: 'přibližně před {{count}} měsíci',\n future: 'přibližně za {{count}} měsíců'\n }\n },\n xMonths: {\n one: {\n regular: 'měsíc',\n past: 'před měsícem',\n future: 'za měsíc'\n },\n few: {\n regular: '{{count}} měsíce',\n past: 'před {{count}} měsíci',\n future: 'za {{count}} měsíce'\n },\n many: {\n regular: '{{count}} měsíců',\n past: 'před {{count}} měsíci',\n future: 'za {{count}} měsíců'\n }\n },\n aboutXYears: {\n one: {\n regular: 'přibližně rok',\n past: 'přibližně před rokem',\n future: 'přibližně za rok'\n },\n few: {\n regular: 'přibližně {{count}} roky',\n past: 'přibližně před {{count}} roky',\n future: 'přibližně za {{count}} roky'\n },\n many: {\n regular: 'přibližně {{count}} roků',\n past: 'přibližně před {{count}} roky',\n future: 'přibližně za {{count}} roků'\n }\n },\n xYears: {\n one: {\n regular: 'rok',\n past: 'před rokem',\n future: 'za rok'\n },\n few: {\n regular: '{{count}} roky',\n past: 'před {{count}} roky',\n future: 'za {{count}} roky'\n },\n many: {\n regular: '{{count}} roků',\n past: 'před {{count}} roky',\n future: 'za {{count}} roků'\n }\n },\n overXYears: {\n one: {\n regular: 'více než rok',\n past: 'před více než rokem',\n future: 'za více než rok'\n },\n few: {\n regular: 'více než {{count}} roky',\n past: 'před více než {{count}} roky',\n future: 'za více než {{count}} roky'\n },\n many: {\n regular: 'více než {{count}} roků',\n past: 'před více než {{count}} roky',\n future: 'za více než {{count}} roků'\n }\n },\n almostXYears: {\n one: {\n regular: 'skoro rok',\n past: 'skoro před rokem',\n future: 'skoro za rok'\n },\n few: {\n regular: 'skoro {{count}} roky',\n past: 'skoro před {{count}} roky',\n future: 'skoro za {{count}} roky'\n },\n many: {\n regular: 'skoro {{count}} roků',\n past: 'skoro před {{count}} roky',\n future: 'skoro za {{count}} roků'\n }\n }\n};\nvar formatDistance = function formatDistance(token, count, options) {\n var pluralResult;\n var tokenValue = formatDistanceLocale[token];\n\n // cs pluralization\n if (tokenValue.type === 'other') {\n pluralResult = tokenValue.other;\n } else if (count === 1) {\n pluralResult = tokenValue.one;\n } else if (count > 1 && count < 5) {\n pluralResult = tokenValue.few;\n } else {\n pluralResult = tokenValue.many;\n }\n\n // times\n var suffixExist = (options === null || options === void 0 ? void 0 : options.addSuffix) === true;\n var comparison = options === null || options === void 0 ? void 0 : options.comparison;\n var timeResult;\n if (suffixExist && comparison === -1) {\n timeResult = pluralResult.past;\n } else if (suffixExist && comparison === 1) {\n timeResult = pluralResult.future;\n } else {\n timeResult = pluralResult.regular;\n }\n return timeResult.replace('{{count}}', String(count));\n};\nexport default formatDistance;","import buildFormatLongFn from \"../../../_lib/buildFormatLongFn/index.js\";\nvar dateFormats = {\n full: 'EEEE, d. MMMM yyyy',\n long: 'd. MMMM yyyy',\n medium: 'd. M. yyyy',\n short: 'dd.MM.yyyy'\n};\nvar timeFormats = {\n full: 'H:mm:ss zzzz',\n long: 'H:mm:ss z',\n medium: 'H:mm:ss',\n short: 'H:mm'\n};\nvar dateTimeFormats = {\n full: \"{{date}} 'v' {{time}}\",\n long: \"{{date}} 'v' {{time}}\",\n medium: '{{date}}, {{time}}',\n short: '{{date}}, {{time}}'\n};\nvar formatLong = {\n date: buildFormatLongFn({\n formats: dateFormats,\n defaultWidth: 'full'\n }),\n time: buildFormatLongFn({\n formats: timeFormats,\n defaultWidth: 'full'\n }),\n dateTime: buildFormatLongFn({\n formats: dateTimeFormats,\n defaultWidth: 'full'\n })\n};\nexport default formatLong;","var accusativeWeekdays = ['neděli', 'pondělí', 'úterý', 'středu', 'čtvrtek', 'pátek', 'sobotu'];\nvar formatRelativeLocale = {\n lastWeek: \"'poslední' eeee 've' p\",\n yesterday: \"'včera v' p\",\n today: \"'dnes v' p\",\n tomorrow: \"'zítra v' p\",\n nextWeek: function nextWeek(date) {\n var day = date.getUTCDay();\n return \"'v \" + accusativeWeekdays[day] + \" o' p\";\n },\n other: 'P'\n};\nvar formatRelative = function formatRelative(token, date) {\n var format = formatRelativeLocale[token];\n if (typeof format === 'function') {\n return format(date);\n }\n return format;\n};\nexport default formatRelative;","import buildLocalizeFn from \"../../../_lib/buildLocalizeFn/index.js\";\nvar eraValues = {\n narrow: ['př. n. l.', 'n. l.'],\n abbreviated: ['př. n. l.', 'n. l.'],\n wide: ['před naším letopočtem', 'našeho letopočtu']\n};\nvar quarterValues = {\n narrow: ['1', '2', '3', '4'],\n abbreviated: ['1. čtvrtletí', '2. čtvrtletí', '3. čtvrtletí', '4. čtvrtletí'],\n wide: ['1. čtvrtletí', '2. čtvrtletí', '3. čtvrtletí', '4. čtvrtletí']\n};\nvar monthValues = {\n narrow: ['L', 'Ú', 'B', 'D', 'K', 'Č', 'Č', 'S', 'Z', 'Ř', 'L', 'P'],\n abbreviated: ['led', 'úno', 'bře', 'dub', 'kvě', 'čvn', 'čvc', 'srp', 'zář', 'říj', 'lis', 'pro'],\n wide: ['leden', 'únor', 'březen', 'duben', 'květen', 'červen', 'červenec', 'srpen', 'září', 'říjen', 'listopad', 'prosinec']\n};\nvar formattingMonthValues = {\n narrow: ['L', 'Ú', 'B', 'D', 'K', 'Č', 'Č', 'S', 'Z', 'Ř', 'L', 'P'],\n abbreviated: ['led', 'úno', 'bře', 'dub', 'kvě', 'čvn', 'čvc', 'srp', 'zář', 'říj', 'lis', 'pro'],\n wide: ['ledna', 'února', 'března', 'dubna', 'května', 'června', 'července', 'srpna', 'září', 'října', 'listopadu', 'prosince']\n};\nvar dayValues = {\n narrow: ['ne', 'po', 'út', 'st', 'čt', 'pá', 'so'],\n short: ['ne', 'po', 'út', 'st', 'čt', 'pá', 'so'],\n abbreviated: ['ned', 'pon', 'úte', 'stř', 'čtv', 'pát', 'sob'],\n wide: ['neděle', 'pondělí', 'úterý', 'středa', 'čtvrtek', 'pátek', 'sobota']\n};\nvar dayPeriodValues = {\n narrow: {\n am: 'dop.',\n pm: 'odp.',\n midnight: 'půlnoc',\n noon: 'poledne',\n morning: 'ráno',\n afternoon: 'odpoledne',\n evening: 'večer',\n night: 'noc'\n },\n abbreviated: {\n am: 'dop.',\n pm: 'odp.',\n midnight: 'půlnoc',\n noon: 'poledne',\n morning: 'ráno',\n afternoon: 'odpoledne',\n evening: 'večer',\n night: 'noc'\n },\n wide: {\n am: 'dopoledne',\n pm: 'odpoledne',\n midnight: 'půlnoc',\n noon: 'poledne',\n morning: 'ráno',\n afternoon: 'odpoledne',\n evening: 'večer',\n night: 'noc'\n }\n};\nvar formattingDayPeriodValues = {\n narrow: {\n am: 'dop.',\n pm: 'odp.',\n midnight: 'půlnoc',\n noon: 'poledne',\n morning: 'ráno',\n afternoon: 'odpoledne',\n evening: 'večer',\n night: 'noc'\n },\n abbreviated: {\n am: 'dop.',\n pm: 'odp.',\n midnight: 'půlnoc',\n noon: 'poledne',\n morning: 'ráno',\n afternoon: 'odpoledne',\n evening: 'večer',\n night: 'noc'\n },\n wide: {\n am: 'dopoledne',\n pm: 'odpoledne',\n midnight: 'půlnoc',\n noon: 'poledne',\n morning: 'ráno',\n afternoon: 'odpoledne',\n evening: 'večer',\n night: 'noc'\n }\n};\nvar ordinalNumber = function ordinalNumber(dirtyNumber, _options) {\n var number = Number(dirtyNumber);\n return number + '.';\n};\nvar localize = {\n ordinalNumber: ordinalNumber,\n era: buildLocalizeFn({\n values: eraValues,\n defaultWidth: 'wide'\n }),\n quarter: buildLocalizeFn({\n values: quarterValues,\n defaultWidth: 'wide',\n argumentCallback: function argumentCallback(quarter) {\n return quarter - 1;\n }\n }),\n month: buildLocalizeFn({\n values: monthValues,\n defaultWidth: 'wide',\n formattingValues: formattingMonthValues,\n defaultFormattingWidth: 'wide'\n }),\n day: buildLocalizeFn({\n values: dayValues,\n defaultWidth: 'wide'\n }),\n dayPeriod: buildLocalizeFn({\n values: dayPeriodValues,\n defaultWidth: 'wide',\n formattingValues: formattingDayPeriodValues,\n defaultFormattingWidth: 'wide'\n })\n};\nexport default localize;","import buildMatchFn from \"../../../_lib/buildMatchFn/index.js\";\nimport buildMatchPatternFn from \"../../../_lib/buildMatchPatternFn/index.js\";\nvar matchOrdinalNumberPattern = /^(\\d+)\\.?/i;\nvar parseOrdinalNumberPattern = /\\d+/i;\nvar matchEraPatterns = {\n narrow: /^(p[řr](\\.|ed) Kr\\.|p[řr](\\.|ed) n\\. l\\.|po Kr\\.|n\\. l\\.)/i,\n abbreviated: /^(p[řr](\\.|ed) Kr\\.|p[řr](\\.|ed) n\\. l\\.|po Kr\\.|n\\. l\\.)/i,\n wide: /^(p[řr](\\.|ed) Kristem|p[řr](\\.|ed) na[šs][íi]m letopo[čc]tem|po Kristu|na[šs]eho letopo[čc]tu)/i\n};\nvar parseEraPatterns = {\n any: [/^p[řr]/i, /^(po|n)/i]\n};\nvar matchQuarterPatterns = {\n narrow: /^[1234]/i,\n abbreviated: /^[1234]\\. [čc]tvrtlet[íi]/i,\n wide: /^[1234]\\. [čc]tvrtlet[íi]/i\n};\nvar parseQuarterPatterns = {\n any: [/1/i, /2/i, /3/i, /4/i]\n};\nvar matchMonthPatterns = {\n narrow: /^[lúubdkčcszřrlp]/i,\n abbreviated: /^(led|[úu]no|b[řr]e|dub|kv[ěe]|[čc]vn|[čc]vc|srp|z[áa][řr]|[řr][íi]j|lis|pro)/i,\n wide: /^(leden|ledna|[úu]nora?|b[řr]ezen|b[řr]ezna|duben|dubna|kv[ěe]ten|kv[ěe]tna|[čc]erven(ec|ce)?|[čc]ervna|srpen|srpna|z[áa][řr][íi]|[řr][íi]jen|[řr][íi]jna|listopad(a|u)?|prosinec|prosince)/i\n};\nvar parseMonthPatterns = {\n narrow: [/^l/i, /^[úu]/i, /^b/i, /^d/i, /^k/i, /^[čc]/i, /^[čc]/i, /^s/i, /^z/i, /^[řr]/i, /^l/i, /^p/i],\n any: [/^led/i, /^[úu]n/i, /^b[řr]e/i, /^dub/i, /^kv[ěe]/i, /^[čc]vn|[čc]erven(?!\\w)|[čc]ervna/i, /^[čc]vc|[čc]erven(ec|ce)/i, /^srp/i, /^z[áa][řr]/i, /^[řr][íi]j/i, /^lis/i, /^pro/i]\n};\nvar matchDayPatterns = {\n narrow: /^[npuúsčps]/i,\n short: /^(ne|po|[úu]t|st|[čc]t|p[áa]|so)/i,\n abbreviated: /^(ned|pon|[úu]te|st[rř]|[čc]tv|p[áa]t|sob)/i,\n wide: /^(ned[ěe]le|pond[ěe]l[íi]|[úu]ter[ýy]|st[řr]eda|[čc]tvrtek|p[áa]tek|sobota)/i\n};\nvar parseDayPatterns = {\n narrow: [/^n/i, /^p/i, /^[úu]/i, /^s/i, /^[čc]/i, /^p/i, /^s/i],\n any: [/^ne/i, /^po/i, /^[úu]t/i, /^st/i, /^[čc]t/i, /^p[áa]/i, /^so/i]\n};\nvar matchDayPeriodPatterns = {\n any: /^dopoledne|dop\\.?|odpoledne|odp\\.?|p[ůu]lnoc|poledne|r[áa]no|odpoledne|ve[čc]er|(v )?noci?/i\n};\nvar parseDayPeriodPatterns = {\n any: {\n am: /^dop/i,\n pm: /^odp/i,\n midnight: /^p[ůu]lnoc/i,\n noon: /^poledne/i,\n morning: /r[áa]no/i,\n afternoon: /odpoledne/i,\n evening: /ve[čc]er/i,\n night: /noc/i\n }\n};\nvar match = {\n ordinalNumber: buildMatchPatternFn({\n matchPattern: matchOrdinalNumberPattern,\n parsePattern: parseOrdinalNumberPattern,\n valueCallback: function valueCallback(value) {\n return parseInt(value, 10);\n }\n }),\n era: buildMatchFn({\n matchPatterns: matchEraPatterns,\n defaultMatchWidth: 'wide',\n parsePatterns: parseEraPatterns,\n defaultParseWidth: 'any'\n }),\n quarter: buildMatchFn({\n matchPatterns: matchQuarterPatterns,\n defaultMatchWidth: 'wide',\n parsePatterns: parseQuarterPatterns,\n defaultParseWidth: 'any',\n valueCallback: function valueCallback(index) {\n return index + 1;\n }\n }),\n month: buildMatchFn({\n matchPatterns: matchMonthPatterns,\n defaultMatchWidth: 'wide',\n parsePatterns: parseMonthPatterns,\n defaultParseWidth: 'any'\n }),\n day: buildMatchFn({\n matchPatterns: matchDayPatterns,\n defaultMatchWidth: 'wide',\n parsePatterns: parseDayPatterns,\n defaultParseWidth: 'any'\n }),\n dayPeriod: buildMatchFn({\n matchPatterns: matchDayPeriodPatterns,\n defaultMatchWidth: 'any',\n parsePatterns: parseDayPeriodPatterns,\n defaultParseWidth: 'any'\n })\n};\nexport default match;","import formatDistance from \"./_lib/formatDistance/index.js\";\nimport formatLong from \"./_lib/formatLong/index.js\";\nimport formatRelative from \"./_lib/formatRelative/index.js\";\nimport localize from \"./_lib/localize/index.js\";\nimport match from \"./_lib/match/index.js\";\n/**\n * @type {Locale}\n * @category Locales\n * @summary Czech locale.\n * @language Czech\n * @iso-639-2 ces\n * @author David Rus [@davidrus]{@link https://github.com/davidrus}\n * @author Pavel Hrách [@SilenY]{@link https://github.com/SilenY}\n * @author Jozef Bíroš [@JozefBiros]{@link https://github.com/JozefBiros}\n */\nvar locale = {\n code: 'cs',\n formatDistance: formatDistance,\n formatLong: formatLong,\n formatRelative: formatRelative,\n localize: localize,\n match: match,\n options: {\n weekStartsOn: 1 /* Monday */,\n firstWeekContainsDate: 4\n }\n};\nexport default locale;","var formatDistanceLocale = {\n lessThanXSeconds: {\n standalone: {\n one: 'weniger als 1 Sekunde',\n other: 'weniger als {{count}} Sekunden'\n },\n withPreposition: {\n one: 'weniger als 1 Sekunde',\n other: 'weniger als {{count}} Sekunden'\n }\n },\n xSeconds: {\n standalone: {\n one: '1 Sekunde',\n other: '{{count}} Sekunden'\n },\n withPreposition: {\n one: '1 Sekunde',\n other: '{{count}} Sekunden'\n }\n },\n halfAMinute: {\n standalone: 'halbe Minute',\n withPreposition: 'halben Minute'\n },\n lessThanXMinutes: {\n standalone: {\n one: 'weniger als 1 Minute',\n other: 'weniger als {{count}} Minuten'\n },\n withPreposition: {\n one: 'weniger als 1 Minute',\n other: 'weniger als {{count}} Minuten'\n }\n },\n xMinutes: {\n standalone: {\n one: '1 Minute',\n other: '{{count}} Minuten'\n },\n withPreposition: {\n one: '1 Minute',\n other: '{{count}} Minuten'\n }\n },\n aboutXHours: {\n standalone: {\n one: 'etwa 1 Stunde',\n other: 'etwa {{count}} Stunden'\n },\n withPreposition: {\n one: 'etwa 1 Stunde',\n other: 'etwa {{count}} Stunden'\n }\n },\n xHours: {\n standalone: {\n one: '1 Stunde',\n other: '{{count}} Stunden'\n },\n withPreposition: {\n one: '1 Stunde',\n other: '{{count}} Stunden'\n }\n },\n xDays: {\n standalone: {\n one: '1 Tag',\n other: '{{count}} Tage'\n },\n withPreposition: {\n one: '1 Tag',\n other: '{{count}} Tagen'\n }\n },\n aboutXWeeks: {\n standalone: {\n one: 'etwa 1 Woche',\n other: 'etwa {{count}} Wochen'\n },\n withPreposition: {\n one: 'etwa 1 Woche',\n other: 'etwa {{count}} Wochen'\n }\n },\n xWeeks: {\n standalone: {\n one: '1 Woche',\n other: '{{count}} Wochen'\n },\n withPreposition: {\n one: '1 Woche',\n other: '{{count}} Wochen'\n }\n },\n aboutXMonths: {\n standalone: {\n one: 'etwa 1 Monat',\n other: 'etwa {{count}} Monate'\n },\n withPreposition: {\n one: 'etwa 1 Monat',\n other: 'etwa {{count}} Monaten'\n }\n },\n xMonths: {\n standalone: {\n one: '1 Monat',\n other: '{{count}} Monate'\n },\n withPreposition: {\n one: '1 Monat',\n other: '{{count}} Monaten'\n }\n },\n aboutXYears: {\n standalone: {\n one: 'etwa 1 Jahr',\n other: 'etwa {{count}} Jahre'\n },\n withPreposition: {\n one: 'etwa 1 Jahr',\n other: 'etwa {{count}} Jahren'\n }\n },\n xYears: {\n standalone: {\n one: '1 Jahr',\n other: '{{count}} Jahre'\n },\n withPreposition: {\n one: '1 Jahr',\n other: '{{count}} Jahren'\n }\n },\n overXYears: {\n standalone: {\n one: 'mehr als 1 Jahr',\n other: 'mehr als {{count}} Jahre'\n },\n withPreposition: {\n one: 'mehr als 1 Jahr',\n other: 'mehr als {{count}} Jahren'\n }\n },\n almostXYears: {\n standalone: {\n one: 'fast 1 Jahr',\n other: 'fast {{count}} Jahre'\n },\n withPreposition: {\n one: 'fast 1 Jahr',\n other: 'fast {{count}} Jahren'\n }\n }\n};\nvar formatDistance = function formatDistance(token, count, options) {\n var result;\n var tokenValue = options !== null && options !== void 0 && options.addSuffix ? formatDistanceLocale[token].withPreposition : formatDistanceLocale[token].standalone;\n if (typeof tokenValue === 'string') {\n result = tokenValue;\n } else if (count === 1) {\n result = tokenValue.one;\n } else {\n result = tokenValue.other.replace('{{count}}', String(count));\n }\n if (options !== null && options !== void 0 && options.addSuffix) {\n if (options.comparison && options.comparison > 0) {\n return 'in ' + result;\n } else {\n return 'vor ' + result;\n }\n }\n return result;\n};\nexport default formatDistance;","import buildFormatLongFn from \"../../../_lib/buildFormatLongFn/index.js\";\n// DIN 5008: https://de.wikipedia.org/wiki/Datumsformat#DIN_5008\nvar dateFormats = {\n full: 'EEEE, do MMMM y',\n // Montag, 7. Januar 2018\n long: 'do MMMM y',\n // 7. Januar 2018\n medium: 'do MMM y',\n // 7. Jan. 2018\n short: 'dd.MM.y' // 07.01.2018\n};\nvar timeFormats = {\n full: 'HH:mm:ss zzzz',\n long: 'HH:mm:ss z',\n medium: 'HH:mm:ss',\n short: 'HH:mm'\n};\nvar dateTimeFormats = {\n full: \"{{date}} 'um' {{time}}\",\n long: \"{{date}} 'um' {{time}}\",\n medium: '{{date}} {{time}}',\n short: '{{date}} {{time}}'\n};\nvar formatLong = {\n date: buildFormatLongFn({\n formats: dateFormats,\n defaultWidth: 'full'\n }),\n time: buildFormatLongFn({\n formats: timeFormats,\n defaultWidth: 'full'\n }),\n dateTime: buildFormatLongFn({\n formats: dateTimeFormats,\n defaultWidth: 'full'\n })\n};\nexport default formatLong;","var formatRelativeLocale = {\n lastWeek: \"'letzten' eeee 'um' p\",\n yesterday: \"'gestern um' p\",\n today: \"'heute um' p\",\n tomorrow: \"'morgen um' p\",\n nextWeek: \"eeee 'um' p\",\n other: 'P'\n};\nvar formatRelative = function formatRelative(token, _date, _baseDate, _options) {\n return formatRelativeLocale[token];\n};\nexport default formatRelative;","import buildLocalizeFn from \"../../../_lib/buildLocalizeFn/index.js\";\nvar eraValues = {\n narrow: ['v.Chr.', 'n.Chr.'],\n abbreviated: ['v.Chr.', 'n.Chr.'],\n wide: ['vor Christus', 'nach Christus']\n};\nvar quarterValues = {\n narrow: ['1', '2', '3', '4'],\n abbreviated: ['Q1', 'Q2', 'Q3', 'Q4'],\n wide: ['1. Quartal', '2. Quartal', '3. Quartal', '4. Quartal']\n};\n\n// Note: in German, the names of days of the week and months are capitalized.\n// If you are making a new locale based on this one, check if the same is true for the language you're working on.\n// Generally, formatted dates should look like they are in the middle of a sentence,\n// e.g. in Spanish language the weekdays and months should be in the lowercase.\nvar monthValues = {\n narrow: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n abbreviated: ['Jan', 'Feb', 'Mär', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez'],\n wide: ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember']\n};\n\n// https://st.unicode.org/cldr-apps/v#/de/Gregorian/\nvar formattingMonthValues = {\n narrow: monthValues.narrow,\n abbreviated: ['Jan.', 'Feb.', 'März', 'Apr.', 'Mai', 'Juni', 'Juli', 'Aug.', 'Sep.', 'Okt.', 'Nov.', 'Dez.'],\n wide: monthValues.wide\n};\nvar dayValues = {\n narrow: ['S', 'M', 'D', 'M', 'D', 'F', 'S'],\n short: ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa'],\n abbreviated: ['So.', 'Mo.', 'Di.', 'Mi.', 'Do.', 'Fr.', 'Sa.'],\n wide: ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag']\n};\n\n// https://www.unicode.org/cldr/charts/32/summary/de.html#1881\nvar dayPeriodValues = {\n narrow: {\n am: 'vm.',\n pm: 'nm.',\n midnight: 'Mitternacht',\n noon: 'Mittag',\n morning: 'Morgen',\n afternoon: 'Nachm.',\n evening: 'Abend',\n night: 'Nacht'\n },\n abbreviated: {\n am: 'vorm.',\n pm: 'nachm.',\n midnight: 'Mitternacht',\n noon: 'Mittag',\n morning: 'Morgen',\n afternoon: 'Nachmittag',\n evening: 'Abend',\n night: 'Nacht'\n },\n wide: {\n am: 'vormittags',\n pm: 'nachmittags',\n midnight: 'Mitternacht',\n noon: 'Mittag',\n morning: 'Morgen',\n afternoon: 'Nachmittag',\n evening: 'Abend',\n night: 'Nacht'\n }\n};\nvar formattingDayPeriodValues = {\n narrow: {\n am: 'vm.',\n pm: 'nm.',\n midnight: 'Mitternacht',\n noon: 'Mittag',\n morning: 'morgens',\n afternoon: 'nachm.',\n evening: 'abends',\n night: 'nachts'\n },\n abbreviated: {\n am: 'vorm.',\n pm: 'nachm.',\n midnight: 'Mitternacht',\n noon: 'Mittag',\n morning: 'morgens',\n afternoon: 'nachmittags',\n evening: 'abends',\n night: 'nachts'\n },\n wide: {\n am: 'vormittags',\n pm: 'nachmittags',\n midnight: 'Mitternacht',\n noon: 'Mittag',\n morning: 'morgens',\n afternoon: 'nachmittags',\n evening: 'abends',\n night: 'nachts'\n }\n};\nvar ordinalNumber = function ordinalNumber(dirtyNumber) {\n var number = Number(dirtyNumber);\n return number + '.';\n};\nvar localize = {\n ordinalNumber: ordinalNumber,\n era: buildLocalizeFn({\n values: eraValues,\n defaultWidth: 'wide'\n }),\n quarter: buildLocalizeFn({\n values: quarterValues,\n defaultWidth: 'wide',\n argumentCallback: function argumentCallback(quarter) {\n return quarter - 1;\n }\n }),\n month: buildLocalizeFn({\n values: monthValues,\n formattingValues: formattingMonthValues,\n defaultWidth: 'wide'\n }),\n day: buildLocalizeFn({\n values: dayValues,\n defaultWidth: 'wide'\n }),\n dayPeriod: buildLocalizeFn({\n values: dayPeriodValues,\n defaultWidth: 'wide',\n formattingValues: formattingDayPeriodValues,\n defaultFormattingWidth: 'wide'\n })\n};\nexport default localize;","import buildMatchFn from \"../../../_lib/buildMatchFn/index.js\";\nimport buildMatchPatternFn from \"../../../_lib/buildMatchPatternFn/index.js\";\nvar matchOrdinalNumberPattern = /^(\\d+)(\\.)?/i;\nvar parseOrdinalNumberPattern = /\\d+/i;\nvar matchEraPatterns = {\n narrow: /^(v\\.? ?Chr\\.?|n\\.? ?Chr\\.?)/i,\n abbreviated: /^(v\\.? ?Chr\\.?|n\\.? ?Chr\\.?)/i,\n wide: /^(vor Christus|vor unserer Zeitrechnung|nach Christus|unserer Zeitrechnung)/i\n};\nvar parseEraPatterns = {\n any: [/^v/i, /^n/i]\n};\nvar matchQuarterPatterns = {\n narrow: /^[1234]/i,\n abbreviated: /^q[1234]/i,\n wide: /^[1234](\\.)? Quartal/i\n};\nvar parseQuarterPatterns = {\n any: [/1/i, /2/i, /3/i, /4/i]\n};\nvar matchMonthPatterns = {\n narrow: /^[jfmasond]/i,\n abbreviated: /^(j[aä]n|feb|mär[z]?|apr|mai|jun[i]?|jul[i]?|aug|sep|okt|nov|dez)\\.?/i,\n wide: /^(januar|februar|märz|april|mai|juni|juli|august|september|oktober|november|dezember)/i\n};\nvar parseMonthPatterns = {\n narrow: [/^j/i, /^f/i, /^m/i, /^a/i, /^m/i, /^j/i, /^j/i, /^a/i, /^s/i, /^o/i, /^n/i, /^d/i],\n any: [/^j[aä]/i, /^f/i, /^mär/i, /^ap/i, /^mai/i, /^jun/i, /^jul/i, /^au/i, /^s/i, /^o/i, /^n/i, /^d/i]\n};\nvar matchDayPatterns = {\n narrow: /^[smdmf]/i,\n short: /^(so|mo|di|mi|do|fr|sa)/i,\n abbreviated: /^(son?|mon?|die?|mit?|don?|fre?|sam?)\\.?/i,\n wide: /^(sonntag|montag|dienstag|mittwoch|donnerstag|freitag|samstag)/i\n};\nvar parseDayPatterns = {\n any: [/^so/i, /^mo/i, /^di/i, /^mi/i, /^do/i, /^f/i, /^sa/i]\n};\nvar matchDayPeriodPatterns = {\n narrow: /^(vm\\.?|nm\\.?|Mitternacht|Mittag|morgens|nachm\\.?|abends|nachts)/i,\n abbreviated: /^(vorm\\.?|nachm\\.?|Mitternacht|Mittag|morgens|nachm\\.?|abends|nachts)/i,\n wide: /^(vormittags|nachmittags|Mitternacht|Mittag|morgens|nachmittags|abends|nachts)/i\n};\nvar parseDayPeriodPatterns = {\n any: {\n am: /^v/i,\n pm: /^n/i,\n midnight: /^Mitte/i,\n noon: /^Mitta/i,\n morning: /morgens/i,\n afternoon: /nachmittags/i,\n // will never be matched. Afternoon is matched by `pm`\n evening: /abends/i,\n night: /nachts/i // will never be matched. Night is matched by `pm`\n }\n};\nvar match = {\n ordinalNumber: buildMatchPatternFn({\n matchPattern: matchOrdinalNumberPattern,\n parsePattern: parseOrdinalNumberPattern,\n valueCallback: function valueCallback(value) {\n return parseInt(value);\n }\n }),\n era: buildMatchFn({\n matchPatterns: matchEraPatterns,\n defaultMatchWidth: 'wide',\n parsePatterns: parseEraPatterns,\n defaultParseWidth: 'any'\n }),\n quarter: buildMatchFn({\n matchPatterns: matchQuarterPatterns,\n defaultMatchWidth: 'wide',\n parsePatterns: parseQuarterPatterns,\n defaultParseWidth: 'any',\n valueCallback: function valueCallback(index) {\n return index + 1;\n }\n }),\n month: buildMatchFn({\n matchPatterns: matchMonthPatterns,\n defaultMatchWidth: 'wide',\n parsePatterns: parseMonthPatterns,\n defaultParseWidth: 'any'\n }),\n day: buildMatchFn({\n matchPatterns: matchDayPatterns,\n defaultMatchWidth: 'wide',\n parsePatterns: parseDayPatterns,\n defaultParseWidth: 'any'\n }),\n dayPeriod: buildMatchFn({\n matchPatterns: matchDayPeriodPatterns,\n defaultMatchWidth: 'wide',\n parsePatterns: parseDayPeriodPatterns,\n defaultParseWidth: 'any'\n })\n};\nexport default match;","import formatDistance from \"./_lib/formatDistance/index.js\";\nimport formatLong from \"./_lib/formatLong/index.js\";\nimport formatRelative from \"./_lib/formatRelative/index.js\";\nimport localize from \"./_lib/localize/index.js\";\nimport match from \"./_lib/match/index.js\";\n/**\n * @type {Locale}\n * @category Locales\n * @summary German locale.\n * @language German\n * @iso-639-2 deu\n * @author Thomas Eilmsteiner [@DeMuu]{@link https://github.com/DeMuu}\n * @author Asia [@asia-t]{@link https://github.com/asia-t}\n * @author Van Vuong Ngo [@vanvuongngo]{@link https://github.com/vanvuongngo}\n * @author RomanErnst [@pex]{@link https://github.com/pex}\n * @author Philipp Keck [@Philipp91]{@link https://github.com/Philipp91}\n */\nvar locale = {\n code: 'de',\n formatDistance: formatDistance,\n formatLong: formatLong,\n formatRelative: formatRelative,\n localize: localize,\n match: match,\n options: {\n weekStartsOn: 1 /* Monday */,\n firstWeekContainsDate: 4\n }\n};\nexport default locale;","var formatDistanceLocale = {\n lessThanXSeconds: {\n one: 'less than a second',\n other: 'less than {{count}} seconds'\n },\n xSeconds: {\n one: 'a second',\n other: '{{count}} seconds'\n },\n halfAMinute: 'half a minute',\n lessThanXMinutes: {\n one: 'less than a minute',\n other: 'less than {{count}} minutes'\n },\n xMinutes: {\n one: 'a minute',\n other: '{{count}} minutes'\n },\n aboutXHours: {\n one: 'about an hour',\n other: 'about {{count}} hours'\n },\n xHours: {\n one: 'an hour',\n other: '{{count}} hours'\n },\n xDays: {\n one: 'a day',\n other: '{{count}} days'\n },\n aboutXWeeks: {\n one: 'about a week',\n other: 'about {{count}} weeks'\n },\n xWeeks: {\n one: 'a week',\n other: '{{count}} weeks'\n },\n aboutXMonths: {\n one: 'about a month',\n other: 'about {{count}} months'\n },\n xMonths: {\n one: 'a month',\n other: '{{count}} months'\n },\n aboutXYears: {\n one: 'about a year',\n other: 'about {{count}} years'\n },\n xYears: {\n one: 'a year',\n other: '{{count}} years'\n },\n overXYears: {\n one: 'over a year',\n other: 'over {{count}} years'\n },\n almostXYears: {\n one: 'almost a year',\n other: 'almost {{count}} years'\n }\n};\nvar formatDistance = function formatDistance(token, count, options) {\n var result;\n var tokenValue = formatDistanceLocale[token];\n if (typeof tokenValue === 'string') {\n result = tokenValue;\n } else if (count === 1) {\n result = tokenValue.one;\n } else {\n result = tokenValue.other.replace('{{count}}', count.toString());\n }\n if (options !== null && options !== void 0 && options.addSuffix) {\n if (options.comparison && options.comparison > 0) {\n return 'in ' + result;\n } else {\n return result + ' ago';\n }\n }\n return result;\n};\nexport default formatDistance;","import buildFormatLongFn from \"../../../_lib/buildFormatLongFn/index.js\";\nvar dateFormats = {\n full: 'EEEE, MMMM do, yyyy',\n long: 'MMMM do, yyyy',\n medium: 'MMM d, yyyy',\n short: 'yyyy-MM-dd'\n};\nvar timeFormats = {\n full: 'h:mm:ss a zzzz',\n long: 'h:mm:ss a z',\n medium: 'h:mm:ss a',\n short: 'h:mm a'\n};\nvar dateTimeFormats = {\n full: \"{{date}} 'at' {{time}}\",\n long: \"{{date}} 'at' {{time}}\",\n medium: '{{date}}, {{time}}',\n short: '{{date}}, {{time}}'\n};\nvar formatLong = {\n date: buildFormatLongFn({\n formats: dateFormats,\n defaultWidth: 'full'\n }),\n time: buildFormatLongFn({\n formats: timeFormats,\n defaultWidth: 'full'\n }),\n dateTime: buildFormatLongFn({\n formats: dateTimeFormats,\n defaultWidth: 'full'\n })\n};\nexport default formatLong;","import formatRelative from \"../en-US/_lib/formatRelative/index.js\";\nimport localize from \"../en-US/_lib/localize/index.js\";\nimport match from \"../en-US/_lib/match/index.js\";\nimport formatDistance from \"./_lib/formatDistance/index.js\";\nimport formatLong from \"./_lib/formatLong/index.js\";\n/**\n * @type {Locale}\n * @category Locales\n * @summary English locale (Canada).\n * @language English\n * @iso-639-2 eng\n * @author Mark Owsiak [@markowsiak]{@link https://github.com/markowsiak}\n * @author Marco Imperatore [@mimperatore]{@link https://github.com/mimperatore}\n */\nvar locale = {\n code: 'en-CA',\n formatDistance: formatDistance,\n formatLong: formatLong,\n formatRelative: formatRelative,\n localize: localize,\n match: match,\n options: {\n weekStartsOn: 0 /* Sunday */,\n firstWeekContainsDate: 1\n }\n};\nexport default locale;","var formatDistanceLocale = {\n lessThanXSeconds: {\n one: 'menos de un segundo',\n other: 'menos de {{count}} segundos'\n },\n xSeconds: {\n one: '1 segundo',\n other: '{{count}} segundos'\n },\n halfAMinute: 'medio minuto',\n lessThanXMinutes: {\n one: 'menos de un minuto',\n other: 'menos de {{count}} minutos'\n },\n xMinutes: {\n one: '1 minuto',\n other: '{{count}} minutos'\n },\n aboutXHours: {\n one: 'alrededor de 1 hora',\n other: 'alrededor de {{count}} horas'\n },\n xHours: {\n one: '1 hora',\n other: '{{count}} horas'\n },\n xDays: {\n one: '1 día',\n other: '{{count}} días'\n },\n aboutXWeeks: {\n one: 'alrededor de 1 semana',\n other: 'alrededor de {{count}} semanas'\n },\n xWeeks: {\n one: '1 semana',\n other: '{{count}} semanas'\n },\n aboutXMonths: {\n one: 'alrededor de 1 mes',\n other: 'alrededor de {{count}} meses'\n },\n xMonths: {\n one: '1 mes',\n other: '{{count}} meses'\n },\n aboutXYears: {\n one: 'alrededor de 1 año',\n other: 'alrededor de {{count}} años'\n },\n xYears: {\n one: '1 año',\n other: '{{count}} años'\n },\n overXYears: {\n one: 'más de 1 año',\n other: 'más de {{count}} años'\n },\n almostXYears: {\n one: 'casi 1 año',\n other: 'casi {{count}} años'\n }\n};\nvar formatDistance = function formatDistance(token, count, options) {\n var result;\n var tokenValue = formatDistanceLocale[token];\n if (typeof tokenValue === 'string') {\n result = tokenValue;\n } else if (count === 1) {\n result = tokenValue.one;\n } else {\n result = tokenValue.other.replace('{{count}}', count.toString());\n }\n if (options !== null && options !== void 0 && options.addSuffix) {\n if (options.comparison && options.comparison > 0) {\n return 'en ' + result;\n } else {\n return 'hace ' + result;\n }\n }\n return result;\n};\nexport default formatDistance;","import buildFormatLongFn from \"../../../_lib/buildFormatLongFn/index.js\";\nvar dateFormats = {\n full: \"EEEE, d 'de' MMMM 'de' y\",\n long: \"d 'de' MMMM 'de' y\",\n medium: 'd MMM y',\n short: 'dd/MM/y'\n};\nvar timeFormats = {\n full: 'HH:mm:ss zzzz',\n long: 'HH:mm:ss z',\n medium: 'HH:mm:ss',\n short: 'HH:mm'\n};\nvar dateTimeFormats = {\n full: \"{{date}} 'a las' {{time}}\",\n long: \"{{date}} 'a las' {{time}}\",\n medium: '{{date}}, {{time}}',\n short: '{{date}}, {{time}}'\n};\nvar formatLong = {\n date: buildFormatLongFn({\n formats: dateFormats,\n defaultWidth: 'full'\n }),\n time: buildFormatLongFn({\n formats: timeFormats,\n defaultWidth: 'full'\n }),\n dateTime: buildFormatLongFn({\n formats: dateTimeFormats,\n defaultWidth: 'full'\n })\n};\nexport default formatLong;","var formatRelativeLocale = {\n lastWeek: \"'el' eeee 'pasado a la' p\",\n yesterday: \"'ayer a la' p\",\n today: \"'hoy a la' p\",\n tomorrow: \"'mañana a la' p\",\n nextWeek: \"eeee 'a la' p\",\n other: 'P'\n};\nvar formatRelativeLocalePlural = {\n lastWeek: \"'el' eeee 'pasado a las' p\",\n yesterday: \"'ayer a las' p\",\n today: \"'hoy a las' p\",\n tomorrow: \"'mañana a las' p\",\n nextWeek: \"eeee 'a las' p\",\n other: 'P'\n};\nvar formatRelative = function formatRelative(token, date, _baseDate, _options) {\n if (date.getUTCHours() !== 1) {\n return formatRelativeLocalePlural[token];\n } else {\n return formatRelativeLocale[token];\n }\n};\nexport default formatRelative;","import buildLocalizeFn from \"../../../_lib/buildLocalizeFn/index.js\";\nvar eraValues = {\n narrow: ['AC', 'DC'],\n abbreviated: ['AC', 'DC'],\n wide: ['antes de cristo', 'después de cristo']\n};\nvar quarterValues = {\n narrow: ['1', '2', '3', '4'],\n abbreviated: ['T1', 'T2', 'T3', 'T4'],\n wide: ['1º trimestre', '2º trimestre', '3º trimestre', '4º trimestre']\n};\nvar monthValues = {\n narrow: ['e', 'f', 'm', 'a', 'm', 'j', 'j', 'a', 's', 'o', 'n', 'd'],\n abbreviated: ['ene', 'feb', 'mar', 'abr', 'may', 'jun', 'jul', 'ago', 'sep', 'oct', 'nov', 'dic'],\n wide: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre']\n};\nvar dayValues = {\n narrow: ['d', 'l', 'm', 'm', 'j', 'v', 's'],\n short: ['do', 'lu', 'ma', 'mi', 'ju', 'vi', 'sá'],\n abbreviated: ['dom', 'lun', 'mar', 'mié', 'jue', 'vie', 'sáb'],\n wide: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado']\n};\nvar dayPeriodValues = {\n narrow: {\n am: 'a',\n pm: 'p',\n midnight: 'mn',\n noon: 'md',\n morning: 'mañana',\n afternoon: 'tarde',\n evening: 'tarde',\n night: 'noche'\n },\n abbreviated: {\n am: 'AM',\n pm: 'PM',\n midnight: 'medianoche',\n noon: 'mediodia',\n morning: 'mañana',\n afternoon: 'tarde',\n evening: 'tarde',\n night: 'noche'\n },\n wide: {\n am: 'a.m.',\n pm: 'p.m.',\n midnight: 'medianoche',\n noon: 'mediodia',\n morning: 'mañana',\n afternoon: 'tarde',\n evening: 'tarde',\n night: 'noche'\n }\n};\nvar formattingDayPeriodValues = {\n narrow: {\n am: 'a',\n pm: 'p',\n midnight: 'mn',\n noon: 'md',\n morning: 'de la mañana',\n afternoon: 'de la tarde',\n evening: 'de la tarde',\n night: 'de la noche'\n },\n abbreviated: {\n am: 'AM',\n pm: 'PM',\n midnight: 'medianoche',\n noon: 'mediodia',\n morning: 'de la mañana',\n afternoon: 'de la tarde',\n evening: 'de la tarde',\n night: 'de la noche'\n },\n wide: {\n am: 'a.m.',\n pm: 'p.m.',\n midnight: 'medianoche',\n noon: 'mediodia',\n morning: 'de la mañana',\n afternoon: 'de la tarde',\n evening: 'de la tarde',\n night: 'de la noche'\n }\n};\nvar ordinalNumber = function ordinalNumber(dirtyNumber, _options) {\n var number = Number(dirtyNumber);\n return number + 'º';\n};\nvar localize = {\n ordinalNumber: ordinalNumber,\n era: buildLocalizeFn({\n values: eraValues,\n defaultWidth: 'wide'\n }),\n quarter: buildLocalizeFn({\n values: quarterValues,\n defaultWidth: 'wide',\n argumentCallback: function argumentCallback(quarter) {\n return Number(quarter) - 1;\n }\n }),\n month: buildLocalizeFn({\n values: monthValues,\n defaultWidth: 'wide'\n }),\n day: buildLocalizeFn({\n values: dayValues,\n defaultWidth: 'wide'\n }),\n dayPeriod: buildLocalizeFn({\n values: dayPeriodValues,\n defaultWidth: 'wide',\n formattingValues: formattingDayPeriodValues,\n defaultFormattingWidth: 'wide'\n })\n};\nexport default localize;","import buildMatchPatternFn from \"../../../_lib/buildMatchPatternFn/index.js\";\nimport buildMatchFn from \"../../../_lib/buildMatchFn/index.js\";\nvar matchOrdinalNumberPattern = /^(\\d+)(º)?/i;\nvar parseOrdinalNumberPattern = /\\d+/i;\nvar matchEraPatterns = {\n narrow: /^(ac|dc|a|d)/i,\n abbreviated: /^(a\\.?\\s?c\\.?|a\\.?\\s?e\\.?\\s?c\\.?|d\\.?\\s?c\\.?|e\\.?\\s?c\\.?)/i,\n wide: /^(antes de cristo|antes de la era com[uú]n|despu[eé]s de cristo|era com[uú]n)/i\n};\nvar parseEraPatterns = {\n any: [/^ac/i, /^dc/i],\n wide: [/^(antes de cristo|antes de la era com[uú]n)/i, /^(despu[eé]s de cristo|era com[uú]n)/i]\n};\nvar matchQuarterPatterns = {\n narrow: /^[1234]/i,\n abbreviated: /^T[1234]/i,\n wide: /^[1234](º)? trimestre/i\n};\nvar parseQuarterPatterns = {\n any: [/1/i, /2/i, /3/i, /4/i]\n};\nvar matchMonthPatterns = {\n narrow: /^[efmajsond]/i,\n abbreviated: /^(ene|feb|mar|abr|may|jun|jul|ago|sep|oct|nov|dic)/i,\n wide: /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i\n};\nvar parseMonthPatterns = {\n narrow: [/^e/i, /^f/i, /^m/i, /^a/i, /^m/i, /^j/i, /^j/i, /^a/i, /^s/i, /^o/i, /^n/i, /^d/i],\n any: [/^en/i, /^feb/i, /^mar/i, /^abr/i, /^may/i, /^jun/i, /^jul/i, /^ago/i, /^sep/i, /^oct/i, /^nov/i, /^dic/i]\n};\nvar matchDayPatterns = {\n narrow: /^[dlmjvs]/i,\n short: /^(do|lu|ma|mi|ju|vi|s[áa])/i,\n abbreviated: /^(dom|lun|mar|mi[ée]|jue|vie|s[áa]b)/i,\n wide: /^(domingo|lunes|martes|mi[ée]rcoles|jueves|viernes|s[áa]bado)/i\n};\nvar parseDayPatterns = {\n narrow: [/^d/i, /^l/i, /^m/i, /^m/i, /^j/i, /^v/i, /^s/i],\n any: [/^do/i, /^lu/i, /^ma/i, /^mi/i, /^ju/i, /^vi/i, /^sa/i]\n};\nvar matchDayPeriodPatterns = {\n narrow: /^(a|p|mn|md|(de la|a las) (mañana|tarde|noche))/i,\n any: /^([ap]\\.?\\s?m\\.?|medianoche|mediodia|(de la|a las) (mañana|tarde|noche))/i\n};\nvar parseDayPeriodPatterns = {\n any: {\n am: /^a/i,\n pm: /^p/i,\n midnight: /^mn/i,\n noon: /^md/i,\n morning: /mañana/i,\n afternoon: /tarde/i,\n evening: /tarde/i,\n night: /noche/i\n }\n};\nvar match = {\n ordinalNumber: buildMatchPatternFn({\n matchPattern: matchOrdinalNumberPattern,\n parsePattern: parseOrdinalNumberPattern,\n valueCallback: function valueCallback(value) {\n return parseInt(value, 10);\n }\n }),\n era: buildMatchFn({\n matchPatterns: matchEraPatterns,\n defaultMatchWidth: 'wide',\n parsePatterns: parseEraPatterns,\n defaultParseWidth: 'any'\n }),\n quarter: buildMatchFn({\n matchPatterns: matchQuarterPatterns,\n defaultMatchWidth: 'wide',\n parsePatterns: parseQuarterPatterns,\n defaultParseWidth: 'any',\n valueCallback: function valueCallback(index) {\n return index + 1;\n }\n }),\n month: buildMatchFn({\n matchPatterns: matchMonthPatterns,\n defaultMatchWidth: 'wide',\n parsePatterns: parseMonthPatterns,\n defaultParseWidth: 'any'\n }),\n day: buildMatchFn({\n matchPatterns: matchDayPatterns,\n defaultMatchWidth: 'wide',\n parsePatterns: parseDayPatterns,\n defaultParseWidth: 'any'\n }),\n dayPeriod: buildMatchFn({\n matchPatterns: matchDayPeriodPatterns,\n defaultMatchWidth: 'any',\n parsePatterns: parseDayPeriodPatterns,\n defaultParseWidth: 'any'\n })\n};\nexport default match;","import formatDistance from \"./_lib/formatDistance/index.js\";\nimport formatLong from \"./_lib/formatLong/index.js\";\nimport formatRelative from \"./_lib/formatRelative/index.js\";\nimport localize from \"./_lib/localize/index.js\";\nimport match from \"./_lib/match/index.js\";\n/**\n * @type {Locale}\n * @category Locales\n * @summary Spanish locale.\n * @language Spanish\n * @iso-639-2 spa\n * @author Juan Angosto [@juanangosto]{@link https://github.com/juanangosto}\n * @author Guillermo Grau [@guigrpa]{@link https://github.com/guigrpa}\n * @author Fernando Agüero [@fjaguero]{@link https://github.com/fjaguero}\n * @author Gastón Haro [@harogaston]{@link https://github.com/harogaston}\n * @author Yago Carballo [@YagoCarballo]{@link https://github.com/YagoCarballo}\n */\nvar locale = {\n code: 'es',\n formatDistance: formatDistance,\n formatLong: formatLong,\n formatRelative: formatRelative,\n localize: localize,\n match: match,\n options: {\n weekStartsOn: 1 /* Monday */,\n firstWeekContainsDate: 1\n }\n};\nexport default locale;","var formatDistanceLocale = {\n lessThanXSeconds: {\n one: 'moins d’une seconde',\n other: 'moins de {{count}} secondes'\n },\n xSeconds: {\n one: '1 seconde',\n other: '{{count}} secondes'\n },\n halfAMinute: '30 secondes',\n lessThanXMinutes: {\n one: 'moins d’une minute',\n other: 'moins de {{count}} minutes'\n },\n xMinutes: {\n one: '1 minute',\n other: '{{count}} minutes'\n },\n aboutXHours: {\n one: 'environ 1 heure',\n other: 'environ {{count}} heures'\n },\n xHours: {\n one: '1 heure',\n other: '{{count}} heures'\n },\n xDays: {\n one: '1 jour',\n other: '{{count}} jours'\n },\n aboutXWeeks: {\n one: 'environ 1 semaine',\n other: 'environ {{count}} semaines'\n },\n xWeeks: {\n one: '1 semaine',\n other: '{{count}} semaines'\n },\n aboutXMonths: {\n one: 'environ 1 mois',\n other: 'environ {{count}} mois'\n },\n xMonths: {\n one: '1 mois',\n other: '{{count}} mois'\n },\n aboutXYears: {\n one: 'environ 1 an',\n other: 'environ {{count}} ans'\n },\n xYears: {\n one: '1 an',\n other: '{{count}} ans'\n },\n overXYears: {\n one: 'plus d’un an',\n other: 'plus de {{count}} ans'\n },\n almostXYears: {\n one: 'presqu’un an',\n other: 'presque {{count}} ans'\n }\n};\nvar formatDistance = function formatDistance(token, count, options) {\n var result;\n var form = formatDistanceLocale[token];\n if (typeof form === 'string') {\n result = form;\n } else if (count === 1) {\n result = form.one;\n } else {\n result = form.other.replace('{{count}}', String(count));\n }\n if (options !== null && options !== void 0 && options.addSuffix) {\n if (options.comparison && options.comparison > 0) {\n return 'dans ' + result;\n } else {\n return 'il y a ' + result;\n }\n }\n return result;\n};\nexport default formatDistance;","import buildFormatLongFn from \"../../../_lib/buildFormatLongFn/index.js\";\nvar dateFormats = {\n full: 'EEEE d MMMM y',\n long: 'd MMMM y',\n medium: 'd MMM y',\n short: 'dd/MM/y'\n};\nvar timeFormats = {\n full: 'HH:mm:ss zzzz',\n long: 'HH:mm:ss z',\n medium: 'HH:mm:ss',\n short: 'HH:mm'\n};\nvar dateTimeFormats = {\n full: \"{{date}} 'à' {{time}}\",\n long: \"{{date}} 'à' {{time}}\",\n medium: '{{date}}, {{time}}',\n short: '{{date}}, {{time}}'\n};\nvar formatLong = {\n date: buildFormatLongFn({\n formats: dateFormats,\n defaultWidth: 'full'\n }),\n time: buildFormatLongFn({\n formats: timeFormats,\n defaultWidth: 'full'\n }),\n dateTime: buildFormatLongFn({\n formats: dateTimeFormats,\n defaultWidth: 'full'\n })\n};\nexport default formatLong;","var formatRelativeLocale = {\n lastWeek: \"eeee 'dernier à' p\",\n yesterday: \"'hier à' p\",\n today: \"'aujourd’hui à' p\",\n tomorrow: \"'demain à' p'\",\n nextWeek: \"eeee 'prochain à' p\",\n other: 'P'\n};\nvar formatRelative = function formatRelative(token, _date, _baseDate, _options) {\n return formatRelativeLocale[token];\n};\nexport default formatRelative;","import buildLocalizeFn from \"../../../_lib/buildLocalizeFn/index.js\";\nvar eraValues = {\n narrow: ['av. J.-C', 'ap. J.-C'],\n abbreviated: ['av. J.-C', 'ap. J.-C'],\n wide: ['avant Jésus-Christ', 'après Jésus-Christ']\n};\nvar quarterValues = {\n narrow: ['T1', 'T2', 'T3', 'T4'],\n abbreviated: ['1er trim.', '2ème trim.', '3ème trim.', '4ème trim.'],\n wide: ['1er trimestre', '2ème trimestre', '3ème trimestre', '4ème trimestre']\n};\nvar monthValues = {\n narrow: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n abbreviated: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n wide: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre']\n};\nvar dayValues = {\n narrow: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n short: ['di', 'lu', 'ma', 'me', 'je', 've', 'sa'],\n abbreviated: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n wide: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi']\n};\nvar dayPeriodValues = {\n narrow: {\n am: 'AM',\n pm: 'PM',\n midnight: 'minuit',\n noon: 'midi',\n morning: 'mat.',\n afternoon: 'ap.m.',\n evening: 'soir',\n night: 'mat.'\n },\n abbreviated: {\n am: 'AM',\n pm: 'PM',\n midnight: 'minuit',\n noon: 'midi',\n morning: 'matin',\n afternoon: 'après-midi',\n evening: 'soir',\n night: 'matin'\n },\n wide: {\n am: 'AM',\n pm: 'PM',\n midnight: 'minuit',\n noon: 'midi',\n morning: 'du matin',\n afternoon: 'de l’après-midi',\n evening: 'du soir',\n night: 'du matin'\n }\n};\nvar ordinalNumber = function ordinalNumber(dirtyNumber, options) {\n var number = Number(dirtyNumber);\n var unit = options === null || options === void 0 ? void 0 : options.unit;\n if (number === 0) return '0';\n var feminineUnits = ['year', 'week', 'hour', 'minute', 'second'];\n var suffix;\n if (number === 1) {\n suffix = unit && feminineUnits.includes(unit) ? 'ère' : 'er';\n } else {\n suffix = 'ème';\n }\n return number + suffix;\n};\nvar localize = {\n ordinalNumber: ordinalNumber,\n era: buildLocalizeFn({\n values: eraValues,\n defaultWidth: 'wide'\n }),\n quarter: buildLocalizeFn({\n values: quarterValues,\n defaultWidth: 'wide',\n argumentCallback: function argumentCallback(quarter) {\n return quarter - 1;\n }\n }),\n month: buildLocalizeFn({\n values: monthValues,\n defaultWidth: 'wide'\n }),\n day: buildLocalizeFn({\n values: dayValues,\n defaultWidth: 'wide'\n }),\n dayPeriod: buildLocalizeFn({\n values: dayPeriodValues,\n defaultWidth: 'wide'\n })\n};\nexport default localize;","import buildMatchFn from \"../../../_lib/buildMatchFn/index.js\";\nimport buildMatchPatternFn from \"../../../_lib/buildMatchPatternFn/index.js\";\nvar matchOrdinalNumberPattern = /^(\\d+)(ième|ère|ème|er|e)?/i;\nvar parseOrdinalNumberPattern = /\\d+/i;\nvar matchEraPatterns = {\n narrow: /^(av\\.J\\.C|ap\\.J\\.C|ap\\.J\\.-C)/i,\n abbreviated: /^(av\\.J\\.-C|av\\.J-C|apr\\.J\\.-C|apr\\.J-C|ap\\.J-C)/i,\n wide: /^(avant Jésus-Christ|après Jésus-Christ)/i\n};\nvar parseEraPatterns = {\n any: [/^av/i, /^ap/i]\n};\nvar matchQuarterPatterns = {\n narrow: /^T?[1234]/i,\n abbreviated: /^[1234](er|ème|e)? trim\\.?/i,\n wide: /^[1234](er|ème|e)? trimestre/i\n};\nvar parseQuarterPatterns = {\n any: [/1/i, /2/i, /3/i, /4/i]\n};\nvar matchMonthPatterns = {\n narrow: /^[jfmasond]/i,\n abbreviated: /^(janv|févr|mars|avr|mai|juin|juill|juil|août|sept|oct|nov|déc)\\.?/i,\n wide: /^(janvier|février|mars|avril|mai|juin|juillet|août|septembre|octobre|novembre|décembre)/i\n};\nvar parseMonthPatterns = {\n narrow: [/^j/i, /^f/i, /^m/i, /^a/i, /^m/i, /^j/i, /^j/i, /^a/i, /^s/i, /^o/i, /^n/i, /^d/i],\n any: [/^ja/i, /^f/i, /^mar/i, /^av/i, /^ma/i, /^juin/i, /^juil/i, /^ao/i, /^s/i, /^o/i, /^n/i, /^d/i]\n};\nvar matchDayPatterns = {\n narrow: /^[lmjvsd]/i,\n short: /^(di|lu|ma|me|je|ve|sa)/i,\n abbreviated: /^(dim|lun|mar|mer|jeu|ven|sam)\\.?/i,\n wide: /^(dimanche|lundi|mardi|mercredi|jeudi|vendredi|samedi)/i\n};\nvar parseDayPatterns = {\n narrow: [/^d/i, /^l/i, /^m/i, /^m/i, /^j/i, /^v/i, /^s/i],\n any: [/^di/i, /^lu/i, /^ma/i, /^me/i, /^je/i, /^ve/i, /^sa/i]\n};\nvar matchDayPeriodPatterns = {\n narrow: /^(a|p|minuit|midi|mat\\.?|ap\\.?m\\.?|soir|nuit)/i,\n any: /^([ap]\\.?\\s?m\\.?|du matin|de l'après[-\\s]midi|du soir|de la nuit)/i\n};\nvar parseDayPeriodPatterns = {\n any: {\n am: /^a/i,\n pm: /^p/i,\n midnight: /^min/i,\n noon: /^mid/i,\n morning: /mat/i,\n afternoon: /ap/i,\n evening: /soir/i,\n night: /nuit/i\n }\n};\nvar match = {\n ordinalNumber: buildMatchPatternFn({\n matchPattern: matchOrdinalNumberPattern,\n parsePattern: parseOrdinalNumberPattern,\n valueCallback: function valueCallback(value) {\n return parseInt(value);\n }\n }),\n era: buildMatchFn({\n matchPatterns: matchEraPatterns,\n defaultMatchWidth: 'wide',\n parsePatterns: parseEraPatterns,\n defaultParseWidth: 'any'\n }),\n quarter: buildMatchFn({\n matchPatterns: matchQuarterPatterns,\n defaultMatchWidth: 'wide',\n parsePatterns: parseQuarterPatterns,\n defaultParseWidth: 'any',\n valueCallback: function valueCallback(index) {\n return index + 1;\n }\n }),\n month: buildMatchFn({\n matchPatterns: matchMonthPatterns,\n defaultMatchWidth: 'wide',\n parsePatterns: parseMonthPatterns,\n defaultParseWidth: 'any'\n }),\n day: buildMatchFn({\n matchPatterns: matchDayPatterns,\n defaultMatchWidth: 'wide',\n parsePatterns: parseDayPatterns,\n defaultParseWidth: 'any'\n }),\n dayPeriod: buildMatchFn({\n matchPatterns: matchDayPeriodPatterns,\n defaultMatchWidth: 'any',\n parsePatterns: parseDayPeriodPatterns,\n defaultParseWidth: 'any'\n })\n};\nexport default match;","import formatDistance from \"./_lib/formatDistance/index.js\";\nimport formatLong from \"./_lib/formatLong/index.js\";\nimport formatRelative from \"./_lib/formatRelative/index.js\";\nimport localize from \"./_lib/localize/index.js\";\nimport match from \"./_lib/match/index.js\";\n/**\n * @type {Locale}\n * @category Locales\n * @summary French locale.\n * @language French\n * @iso-639-2 fra\n * @author Jean Dupouy [@izeau]{@link https://github.com/izeau}\n * @author François B [@fbonzon]{@link https://github.com/fbonzon}\n */\nvar locale = {\n code: 'fr',\n formatDistance: formatDistance,\n formatLong: formatLong,\n formatRelative: formatRelative,\n localize: localize,\n match: match,\n options: {\n weekStartsOn: 1 /* Monday */,\n firstWeekContainsDate: 4\n }\n};\nexport default locale;","import buildFormatLongFn from \"../../../_lib/buildFormatLongFn/index.js\";\nvar dateFormats = {\n full: 'EEEE d MMMM y',\n long: 'd MMMM y',\n medium: 'd MMM y',\n short: 'yy-MM-dd'\n};\nvar timeFormats = {\n full: 'HH:mm:ss zzzz',\n long: 'HH:mm:ss z',\n medium: 'HH:mm:ss',\n short: 'HH:mm'\n};\nvar dateTimeFormats = {\n full: \"{{date}} 'à' {{time}}\",\n long: \"{{date}} 'à' {{time}}\",\n medium: '{{date}}, {{time}}',\n short: '{{date}}, {{time}}'\n};\nvar formatLong = {\n date: buildFormatLongFn({\n formats: dateFormats,\n defaultWidth: 'full'\n }),\n time: buildFormatLongFn({\n formats: timeFormats,\n defaultWidth: 'full'\n }),\n dateTime: buildFormatLongFn({\n formats: dateTimeFormats,\n defaultWidth: 'full'\n })\n};\nexport default formatLong;","// Same as fr\nimport formatDistance from \"../fr/_lib/formatDistance/index.js\";\nimport formatRelative from \"../fr/_lib/formatRelative/index.js\";\nimport localize from \"../fr/_lib/localize/index.js\";\nimport match from \"../fr/_lib/match/index.js\";\n// Unique for fr-CA\nimport formatLong from \"./_lib/formatLong/index.js\";\n/**\n * @type {Locale}\n * @category Locales\n * @summary French locale (Canada).\n * @language French\n * @iso-639-2 fra\n * @author Jean Dupouy [@izeau]{@link https://github.com/izeau}\n * @author François B [@fbonzon]{@link https://github.com/fbonzon}\n * @author Gabriele Petrioli [@gpetrioli]{@link https://github.com/gpetrioli}\n */\nvar locale = {\n code: 'fr-CA',\n formatDistance: formatDistance,\n formatLong: formatLong,\n formatRelative: formatRelative,\n localize: localize,\n match: match,\n // Unique for fr-CA\n options: {\n weekStartsOn: 0 /* Sunday */,\n firstWeekContainsDate: 1\n }\n};\nexport default locale;","var formatDistanceLocale = {\n lessThanXSeconds: {\n one: 'minder dan een seconde',\n other: 'minder dan {{count}} seconden'\n },\n xSeconds: {\n one: '1 seconde',\n other: '{{count}} seconden'\n },\n halfAMinute: 'een halve minuut',\n lessThanXMinutes: {\n one: 'minder dan een minuut',\n other: 'minder dan {{count}} minuten'\n },\n xMinutes: {\n one: 'een minuut',\n other: '{{count}} minuten'\n },\n aboutXHours: {\n one: 'ongeveer 1 uur',\n other: 'ongeveer {{count}} uur'\n },\n xHours: {\n one: '1 uur',\n other: '{{count}} uur'\n },\n xDays: {\n one: '1 dag',\n other: '{{count}} dagen'\n },\n aboutXWeeks: {\n one: 'ongeveer 1 week',\n other: 'ongeveer {{count}} weken'\n },\n xWeeks: {\n one: '1 week',\n other: '{{count}} weken'\n },\n aboutXMonths: {\n one: 'ongeveer 1 maand',\n other: 'ongeveer {{count}} maanden'\n },\n xMonths: {\n one: '1 maand',\n other: '{{count}} maanden'\n },\n aboutXYears: {\n one: 'ongeveer 1 jaar',\n other: 'ongeveer {{count}} jaar'\n },\n xYears: {\n one: '1 jaar',\n other: '{{count}} jaar'\n },\n overXYears: {\n one: 'meer dan 1 jaar',\n other: 'meer dan {{count}} jaar'\n },\n almostXYears: {\n one: 'bijna 1 jaar',\n other: 'bijna {{count}} jaar'\n }\n};\nvar formatDistance = function formatDistance(token, count, options) {\n var result;\n var tokenValue = formatDistanceLocale[token];\n if (typeof tokenValue === 'string') {\n result = tokenValue;\n } else if (count === 1) {\n result = tokenValue.one;\n } else {\n result = tokenValue.other.replace('{{count}}', String(count));\n }\n if (options !== null && options !== void 0 && options.addSuffix) {\n if (options.comparison && options.comparison > 0) {\n return 'over ' + result;\n } else {\n return result + ' geleden';\n }\n }\n return result;\n};\nexport default formatDistance;","import buildFormatLongFn from \"../../../_lib/buildFormatLongFn/index.js\";\nvar dateFormats = {\n full: 'EEEE d MMMM y',\n long: 'd MMMM y',\n medium: 'd MMM y',\n short: 'dd-MM-y'\n};\nvar timeFormats = {\n full: 'HH:mm:ss zzzz',\n long: 'HH:mm:ss z',\n medium: 'HH:mm:ss',\n short: 'HH:mm'\n};\nvar dateTimeFormats = {\n full: \"{{date}} 'om' {{time}}\",\n long: \"{{date}} 'om' {{time}}\",\n medium: '{{date}}, {{time}}',\n short: '{{date}}, {{time}}'\n};\nvar formatLong = {\n date: buildFormatLongFn({\n formats: dateFormats,\n defaultWidth: 'full'\n }),\n time: buildFormatLongFn({\n formats: timeFormats,\n defaultWidth: 'full'\n }),\n dateTime: buildFormatLongFn({\n formats: dateTimeFormats,\n defaultWidth: 'full'\n })\n};\nexport default formatLong;","var formatRelativeLocale = {\n lastWeek: \"'afgelopen' eeee 'om' p\",\n yesterday: \"'gisteren om' p\",\n today: \"'vandaag om' p\",\n tomorrow: \"'morgen om' p\",\n nextWeek: \"eeee 'om' p\",\n other: 'P'\n};\nvar formatRelative = function formatRelative(token, _date, _baseDate, _options) {\n return formatRelativeLocale[token];\n};\nexport default formatRelative;","import buildLocalizeFn from \"../../../_lib/buildLocalizeFn/index.js\";\nvar eraValues = {\n narrow: ['v.C.', 'n.C.'],\n abbreviated: ['v.Chr.', 'n.Chr.'],\n wide: ['voor Christus', 'na Christus']\n};\nvar quarterValues = {\n narrow: ['1', '2', '3', '4'],\n abbreviated: ['K1', 'K2', 'K3', 'K4'],\n wide: ['1e kwartaal', '2e kwartaal', '3e kwartaal', '4e kwartaal']\n};\nvar monthValues = {\n narrow: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n abbreviated: ['jan.', 'feb.', 'mrt.', 'apr.', 'mei', 'jun.', 'jul.', 'aug.', 'sep.', 'okt.', 'nov.', 'dec.'],\n wide: ['januari', 'februari', 'maart', 'april', 'mei', 'juni', 'juli', 'augustus', 'september', 'oktober', 'november', 'december']\n};\nvar dayValues = {\n narrow: ['Z', 'M', 'D', 'W', 'D', 'V', 'Z'],\n short: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],\n abbreviated: ['zon', 'maa', 'din', 'woe', 'don', 'vri', 'zat'],\n wide: ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag']\n};\nvar dayPeriodValues = {\n narrow: {\n am: 'AM',\n pm: 'PM',\n midnight: 'middernacht',\n noon: 'het middaguur',\n morning: \"'s ochtends\",\n afternoon: \"'s middags\",\n evening: \"'s avonds\",\n night: \"'s nachts\"\n },\n abbreviated: {\n am: 'AM',\n pm: 'PM',\n midnight: 'middernacht',\n noon: 'het middaguur',\n morning: \"'s ochtends\",\n afternoon: \"'s middags\",\n evening: \"'s avonds\",\n night: \"'s nachts\"\n },\n wide: {\n am: 'AM',\n pm: 'PM',\n midnight: 'middernacht',\n noon: 'het middaguur',\n morning: \"'s ochtends\",\n afternoon: \"'s middags\",\n evening: \"'s avonds\",\n night: \"'s nachts\"\n }\n};\nvar ordinalNumber = function ordinalNumber(dirtyNumber, _options) {\n var number = Number(dirtyNumber);\n return number + 'e';\n};\nvar localize = {\n ordinalNumber: ordinalNumber,\n era: buildLocalizeFn({\n values: eraValues,\n defaultWidth: 'wide'\n }),\n quarter: buildLocalizeFn({\n values: quarterValues,\n defaultWidth: 'wide',\n argumentCallback: function argumentCallback(quarter) {\n return quarter - 1;\n }\n }),\n month: buildLocalizeFn({\n values: monthValues,\n defaultWidth: 'wide'\n }),\n day: buildLocalizeFn({\n values: dayValues,\n defaultWidth: 'wide'\n }),\n dayPeriod: buildLocalizeFn({\n values: dayPeriodValues,\n defaultWidth: 'wide'\n })\n};\nexport default localize;","import buildMatchFn from \"../../../_lib/buildMatchFn/index.js\";\nimport buildMatchPatternFn from \"../../../_lib/buildMatchPatternFn/index.js\";\nvar matchOrdinalNumberPattern = /^(\\d+)e?/i;\nvar parseOrdinalNumberPattern = /\\d+/i;\nvar matchEraPatterns = {\n narrow: /^([vn]\\.? ?C\\.?)/,\n abbreviated: /^([vn]\\. ?Chr\\.?)/,\n wide: /^((voor|na) Christus)/\n};\nvar parseEraPatterns = {\n any: [/^v/, /^n/]\n};\nvar matchQuarterPatterns = {\n narrow: /^[1234]/i,\n abbreviated: /^K[1234]/i,\n wide: /^[1234]e kwartaal/i\n};\nvar parseQuarterPatterns = {\n any: [/1/i, /2/i, /3/i, /4/i]\n};\nvar matchMonthPatterns = {\n narrow: /^[jfmasond]/i,\n abbreviated: /^(jan.|feb.|mrt.|apr.|mei|jun.|jul.|aug.|sep.|okt.|nov.|dec.)/i,\n wide: /^(januari|februari|maart|april|mei|juni|juli|augustus|september|oktober|november|december)/i\n};\nvar parseMonthPatterns = {\n narrow: [/^j/i, /^f/i, /^m/i, /^a/i, /^m/i, /^j/i, /^j/i, /^a/i, /^s/i, /^o/i, /^n/i, /^d/i],\n any: [/^jan/i, /^feb/i, /^m(r|a)/i, /^apr/i, /^mei/i, /^jun/i, /^jul/i, /^aug/i, /^sep/i, /^okt/i, /^nov/i, /^dec/i]\n};\nvar matchDayPatterns = {\n narrow: /^[zmdwv]/i,\n short: /^(zo|ma|di|wo|do|vr|za)/i,\n abbreviated: /^(zon|maa|din|woe|don|vri|zat)/i,\n wide: /^(zondag|maandag|dinsdag|woensdag|donderdag|vrijdag|zaterdag)/i\n};\nvar parseDayPatterns = {\n narrow: [/^z/i, /^m/i, /^d/i, /^w/i, /^d/i, /^v/i, /^z/i],\n any: [/^zo/i, /^ma/i, /^di/i, /^wo/i, /^do/i, /^vr/i, /^za/i]\n};\nvar matchDayPeriodPatterns = {\n any: /^(am|pm|middernacht|het middaguur|'s (ochtends|middags|avonds|nachts))/i\n};\nvar parseDayPeriodPatterns = {\n any: {\n am: /^am/i,\n pm: /^pm/i,\n midnight: /^middernacht/i,\n noon: /^het middaguur/i,\n morning: /ochtend/i,\n afternoon: /middag/i,\n evening: /avond/i,\n night: /nacht/i\n }\n};\nvar match = {\n ordinalNumber: buildMatchPatternFn({\n matchPattern: matchOrdinalNumberPattern,\n parsePattern: parseOrdinalNumberPattern,\n valueCallback: function valueCallback(value) {\n return parseInt(value, 10);\n }\n }),\n era: buildMatchFn({\n matchPatterns: matchEraPatterns,\n defaultMatchWidth: 'wide',\n parsePatterns: parseEraPatterns,\n defaultParseWidth: 'any'\n }),\n quarter: buildMatchFn({\n matchPatterns: matchQuarterPatterns,\n defaultMatchWidth: 'wide',\n parsePatterns: parseQuarterPatterns,\n defaultParseWidth: 'any',\n valueCallback: function valueCallback(index) {\n return index + 1;\n }\n }),\n month: buildMatchFn({\n matchPatterns: matchMonthPatterns,\n defaultMatchWidth: 'wide',\n parsePatterns: parseMonthPatterns,\n defaultParseWidth: 'any'\n }),\n day: buildMatchFn({\n matchPatterns: matchDayPatterns,\n defaultMatchWidth: 'wide',\n parsePatterns: parseDayPatterns,\n defaultParseWidth: 'any'\n }),\n dayPeriod: buildMatchFn({\n matchPatterns: matchDayPeriodPatterns,\n defaultMatchWidth: 'any',\n parsePatterns: parseDayPeriodPatterns,\n defaultParseWidth: 'any'\n })\n};\nexport default match;","import formatDistance from \"./_lib/formatDistance/index.js\";\nimport formatLong from \"./_lib/formatLong/index.js\";\nimport formatRelative from \"./_lib/formatRelative/index.js\";\nimport localize from \"./_lib/localize/index.js\";\nimport match from \"./_lib/match/index.js\";\n/**\n * @type {Locale}\n * @category Locales\n * @summary Dutch locale.\n * @language Dutch\n * @iso-639-2 nld\n * @author Jorik Tangelder [@jtangelder]{@link https://github.com/jtangelder}\n * @author Ruben Stolk [@rubenstolk]{@link https://github.com/rubenstolk}\n * @author Lode Vanhove [@bitcrumb]{@link https://github.com/bitcrumb}\n * @author Edo Rivai [@edorivai]{@link https://github.com/edorivai}\n * @author Niels Keurentjes [@curry684]{@link https://github.com/curry684}\n * @author Stefan Vermaas [@stefanvermaas]{@link https://github.com/stefanvermaas}\n */\nvar locale = {\n code: 'nl',\n formatDistance: formatDistance,\n formatLong: formatLong,\n formatRelative: formatRelative,\n localize: localize,\n match: match,\n options: {\n weekStartsOn: 1 /* Monday */,\n firstWeekContainsDate: 4\n }\n};\nexport default locale;","export enum Language {\n AFRIKAANS = 'af',\n CZECH = 'cs',\n DUTCH = 'nl',\n ENGLISH = 'en',\n FRENCH = 'fr',\n FRENCH_CANADA = 'fr-ca',\n FRENCH_FRANCE = 'fr-fr',\n GERMAN = 'de',\n ITALIAN = 'it',\n JAPANESE = 'ja',\n PORTUGUESE = 'pt',\n RUSSIAN = 'ru',\n SPANISH_LATIN_AMERICA = 'es-419',\n}\n\nexport interface LanguageMapping {\n code: string;\n label: string;\n flag?: string;\n totalStrings?: number;\n translatedStrings?: number;\n}\n\nexport const LanguageMap: LanguageMapping[] = [\n { code: Language.ENGLISH, label: 'English', flag: '🇺🇸' },\n { code: Language.SPANISH_LATIN_AMERICA, label: 'English', flag: '🇪🇸' },\n { code: Language.FRENCH_FRANCE, label: 'Français', flag: '🇫🇷' },\n { code: Language.FRENCH_CANADA, label: 'Français', flag: '🇨🇦' },\n { code: Language.CZECH, label: 'Čeština', flag: '🇨🇿' },\n { code: Language.DUTCH, label: 'Nederlands', flag: '🇳🇱' },\n { code: Language.GERMAN, label: 'Deutsch', flag: '🇧🇪' },\n { code: Language.ITALIAN, label: 'Italiano', flag: '🇮🇹' },\n];\n","import { loadTranslations as _loadTranslations } from '@angular/localize';\nimport { LEXICON_FILE_FORMAT_OPTION } from '@galaxy/lexicon';\nimport { Language } from './language';\n\nconst LOCALE_LOCALSTORAGE_KEY = 'e5190deccf484eea9d9676c8fd75dbc0';\nconst LANGUAGE_OPTIONS = [\n Language.AFRIKAANS,\n Language.CZECH,\n Language.DUTCH,\n Language.ENGLISH,\n Language.FRENCH,\n Language.FRENCH_CANADA,\n Language.GERMAN,\n Language.ITALIAN,\n Language.PORTUGUESE,\n Language.RUSSIAN,\n Language.SPANISH_LATIN_AMERICA,\n];\n\ndeclare global {\n interface Window {\n partnerId: string;\n }\n}\n\n// public function for boostrapping internationalization for the application\n// weblateComponentName format example: 'advertising-intelligence/digital-ads-client'\nexport function bootstrapI18n(\n weblateComponentName: string,\n baseTranslations?: any,\n overrideLanguageOptions?: Language[],\n format?: LEXICON_FILE_FORMAT_OPTION,\n forceOtw?: boolean,\n environment?: string,\n): void {\n loadTranslationFile(\n getLocale(overrideLanguageOptions),\n weblateComponentName,\n baseTranslations,\n format,\n forceOtw,\n environment,\n );\n}\n\n// todo: I don't think I like this overrideLanguageOptions dealio, refactor\nexport function getLocale(overrideLanguageOptions?: Language[]): string {\n const language =\n getLanguageFromLocalStorage(overrideLanguageOptions) || detectLanguageFromBrowser() || Language.ENGLISH;\n let locale = language.toString();\n // safeguard/default\n if (!locale) {\n locale = 'en';\n }\n return locale;\n}\n\n// public function for setting the current language in local storage\nexport function setLanguage(language: Language | string): void {\n if (localStorage) {\n localStorage.setItem(LOCALE_LOCALSTORAGE_KEY, language);\n }\n}\n\nexport function getLanguageFromLocalStorage(overrideLanguageOptions?: Language[]): Language | undefined {\n if (localStorage) {\n const languageCode = localStorage.getItem(LOCALE_LOCALSTORAGE_KEY);\n if (languageCode) {\n return findLanguageFromCode(languageCode.toLowerCase(), overrideLanguageOptions);\n }\n }\n return undefined;\n}\n\nexport function detectLanguageFromBrowser(): Language | undefined {\n const browserLanguageCode = getBrowserCultureLang().toLowerCase();\n return findLanguageFromCode(browserLanguageCode);\n}\n\nexport function getBrowserCultureLang(): string {\n if (typeof window === 'undefined' || typeof window.navigator === 'undefined') {\n return '';\n }\n // Select language from various browser sources\n let browserCultureLang = Intl.NumberFormat().resolvedOptions().locale;\n if (!browserCultureLang && window.navigator.languages && window.navigator.languages.length) {\n browserCultureLang = window.navigator.languages[0];\n }\n browserCultureLang =\n browserCultureLang ||\n window.navigator.language ||\n (window.navigator as any).browserLanguage ||\n (window.navigator as any).userLanguage;\n return browserCultureLang.replace(/_/g, '-');\n}\n\nexport function findLanguageFromCode(languageCode: string, overrideLanguageOptions?: Language[]): Language | undefined {\n const languageOptions = overrideLanguageOptions ? overrideLanguageOptions : LANGUAGE_OPTIONS;\n // Search for full string\n let language = languageOptions.find((opt) => {\n return opt.toString().startsWith(languageCode);\n });\n // Search by partial language code\n if (!language && languageCode.indexOf('-') === 2) {\n language = languageOptions.find((opt) => {\n return opt.toString().startsWith(languageCode.slice(0, 2));\n });\n }\n return language;\n}\n\nexport function buildFilePath(\n locale: string,\n weblateComponentName: string,\n format?: LEXICON_FILE_FORMAT_OPTION,\n environment = 'prod',\n): string {\n const env = environment === 'prod' ? 'prod' : 'demo';\n const I18N_ASSETS_BASE_URL = `https://lexicon-${env}.apigateway.co/get-translations`;\n\n let filepath = I18N_ASSETS_BASE_URL + `?componentNames=${weblateComponentName}&languageCode=${locale}`;\n switch (format) {\n case LEXICON_FILE_FORMAT_OPTION.XLIFF1:\n filepath += `&format=xlf`;\n break;\n default:\n filepath += `&format=json`;\n break;\n }\n if (typeof window !== 'undefined' && window.partnerId) {\n filepath += `&partnerId=${window.partnerId}`;\n }\n return filepath;\n}\n\nexport function loadTranslationFile(\n locale: string,\n weblateComponentName: string,\n baseTranslations?: any,\n format?: LEXICON_FILE_FORMAT_OPTION,\n forceOtw?: boolean,\n environment?: string,\n): void {\n if (!('deployment' in window) && !forceOtw && baseTranslations) {\n loadTranslations(locale, flattenObject(baseTranslations));\n return;\n }\n\n const filepath = buildFilePath(locale, weblateComponentName, format, environment);\n const xhr = new XMLHttpRequest();\n xhr.onload = () => {\n if (xhr.status === 200) {\n let translations: Record;\n switch (format) {\n case LEXICON_FILE_FORMAT_OPTION.XLIFF1:\n translations = parseXliff(xhr.responseText);\n break;\n case LEXICON_FILE_FORMAT_OPTION.NESTED_JSON:\n translations = parseNestedJSON(xhr.responseText);\n break;\n case LEXICON_FILE_FORMAT_OPTION.FLAT_JSON:\n translations = parseFlatJSON(xhr.responseText);\n break;\n default:\n translations = parseNestedJSON(xhr.responseText);\n break;\n }\n if (Object.keys(translations).length !== 0) {\n loadTranslations(locale, translations);\n }\n }\n };\n const async = false;\n xhr.open('GET', filepath, async);\n xhr.send();\n}\n\nexport function loadTranslations(locale: string, translations: Record): void {\n if (translations && Object.keys(translations).length) {\n _loadTranslations(translations);\n }\n if (locale) {\n $localize.locale = locale;\n }\n}\n\nexport function parseXliff(content: string): Record {\n const translations: Record = {};\n const document = new DOMParser().parseFromString(content, 'text/xml');\n const textUnits = Array.from(document.getElementsByTagName('trans-unit'));\n textUnits.forEach((unit) => {\n const target = unit.getElementsByTagName('target').item(0);\n if (target) {\n translations[unit.id] = Array.from(target.childNodes)\n .map((child) => {\n if (child instanceof Text) {\n return child.wholeText;\n } else if (child instanceof Element) {\n return `{$${child.id}}`;\n }\n return '';\n })\n .join('');\n }\n });\n return translations;\n}\n\nexport function parseNestedJSON(content: string): Record {\n const parsedTranslationBundle = JSON.parse(content);\n return flattenObject(parsedTranslationBundle);\n}\n\nexport function parseFlatJSON(content: string): Record {\n return JSON.parse(content);\n}\n\nexport function flattenObject(ob: Record): any {\n const toReturn: Record = {};\n let flatObject: Record;\n for (const i in ob) {\n if (!(i in ob)) {\n continue;\n }\n if (typeof ob[i] === 'object') {\n flatObject = flattenObject(ob[i]);\n for (const x in flatObject) {\n if (!(x in flatObject)) {\n continue;\n }\n toReturn[i + '.' + x] = flatObject[x];\n }\n } else {\n toReturn[i] = ob[i];\n }\n }\n return toReturn;\n}\n","import { enUS, enCA, cs, frCA, nl, fr, de, es } from 'date-fns/locale';\nimport {\n getBrowserCultureLang,\n getLanguageFromLocalStorage,\n} from '@vendasta/galaxy/i18n/src/browser-locale/browser-locale';\n\nexport const supportedLocales = [enUS, enCA, cs, frCA, nl, fr, de, es];\n/**\n * Based the user's preferred language from the navigator and finds the best locale match.\n * @returns {Locale} Returns a Locale that is the best match, enUs as the fallback.\n */\nexport function getLocale(): Locale {\n const languageFromLocalStorage = getLanguageFromLocalStorage();\n const locale = languageFromLocalStorage ? languageFromLocalStorage : getBrowserCultureLang();\n if (locale === 'fr-FR' || locale === 'fr') {\n return fr;\n } else if (locale === 'fr-CA') {\n return frCA;\n } else if (locale === 'en-CA') {\n return enCA;\n } else if (locale === 'cs') {\n return cs;\n } else if (locale === 'nl') {\n return nl;\n } else if (locale === 'de') {\n return de;\n } else if (locale === 'es-419') {\n return es;\n }\n return enUS;\n}\n\n/**\n * @param locale {string} A locale code for the locale format, typically from navigator.language (BCP-47)\n * @return { string } A locale code that is ISO 639-1 to deal missing matching locale codes between BCP-47 and ISO 639-1\n * (ISO 639-1 w/ optional two character region subtag) ex) en, en-US, en-CA, fr-CA, fr\n */\nexport const getLocaleCode = (locale?: string): string | undefined => {\n if (!locale) {\n return getLocale().code;\n }\n return locale;\n};\n","import getSymbolFromCurrency from 'currency-symbol-map';\nimport { getCurrency } from 'locale-currency';\nimport { getLocaleCode } from '../../locale';\n\n/**\n * @param locale { string } A code for the locale format. (either BCP-47 or ISO 639-1)\n * @return { string } A locale code. (ISO 639-1 w/ optional two character region subtag) ex) en, en-US, en-CA, fr-CA, fr\n */\nexport const getCurrencyCode = (locale: string): string => {\n if (getLocaleCode(locale) == 'cs') {\n return getCurrency('cz');\n }\n return getCurrency(getLocaleCode(locale) || 'en');\n};\n\n/**\n * @param code {string } Three character currency code. (ISO 4217) ex) USD, CAD, AUS\n * @return {string} The currency symbol for the given currency code.\n */\nexport const getCurrencySymbol = (code: string): string | undefined => {\n return getSymbolFromCurrency(code);\n};\n","import { getCurrencySymbol } from '@vendasta/galaxy/utility/currency-utils';\nimport { getLocaleCode } from '@vendasta/galaxy/utility/locale';\nimport { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({ name: 'glxyCurrency' })\nexport class GalaxyCurrencyPipe implements PipeTransform {\n /**\n * @param value {string} the numerical value that is being converted to a currency string\n * @param currencyCode {string} Three character code to represent the currency (ISO 4217) ex) USD, CAD, AUS\n * @param locale {string} A locale code for the locale format rules to use. (ISO 639-1 w/ optional two character region subtag) ex) en, en-US, en-CA, fr-CA, fr\n * @returns {string} Returns a string of the localized currency value with the currency symbol for the given currency code. Includes currency code at the end if currency symbol is \"$\"\n */\n transform(value: number, currencyCode = 'USD', locale?: string): string {\n if (!value && value !== 0) {\n return '';\n }\n\n if (!locale) {\n locale = getLocaleCode();\n }\n\n let currencyString;\n try {\n currencyString = new Intl.NumberFormat(locale, {\n style: 'currency',\n currency: currencyCode,\n currencyDisplay: 'narrowSymbol',\n }).format(value);\n } catch (err) {\n currencyString = new Intl.NumberFormat(locale, {\n style: 'currency',\n currency: currencyCode,\n currencyDisplay: 'symbol',\n }).format(value);\n }\n\n const currencySymbol = getCurrencySymbol(currencyCode) || '$';\n\n // sometimes the Number format doesn't return a string with a currency symbol. Instead, it returns the currency code.\n // if that's the case we'll get currency symbol and replace the currency code with the symbol.\n // ex) currency is \"CZK\", number format returns \"CZK 3\", so we swap out the currency code for the symbol (Kč)\n if (currencyString.includes(currencyCode)) {\n currencyString = currencyString.replace(currencyCode, currencySymbol);\n }\n\n // we want to the currency code to the end of the string if the currency symbol is \"$\"\n // this is b/c most countries that use the \"$\" as their currency symbol hold different monetary values and each refer to a different currency code. ex) CAD vs USD\n // in contrast, the currency symbol of the Euro (€) has the same value across all countries that use the \"€\" symbol b/c they are all refering to the same currency code (EUR).\n if (currencySymbol === '$') {\n currencyString += ` ${currencyCode}`;\n }\n\n return currencyString;\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\ninterface Address {\n address?: string;\n address2?: string;\n city?: string;\n state?: string;\n country?: string;\n zip?: string;\n}\n// glxyAddress formats address information into a comma separate string\n@Pipe({ name: 'glxyAddress' })\nexport class GalaxyAddressPipe implements PipeTransform {\n transform(address: Address): string {\n if (!address) {\n return '';\n }\n return [\n address.address?.trim(),\n address.address2?.trim(),\n address.city?.trim(),\n address.state?.trim(),\n address.country?.trim(),\n address.zip?.trim(),\n ]\n .filter((v) => !!v)\n .join(', ');\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { Observable, catchError, defaultIfEmpty, map, of, startWith } from 'rxjs';\n\n// Based on https://medium.com/angular-in-depth/9d8e5497dd8\n// Thanks Alexey Zuev!\n\nexport enum Status {\n loading = 'loading',\n loaded = 'loaded',\n error = 'error',\n empty = 'empty',\n}\n\nexport type GlxyAsyncStatus =\n | {\n status: Status.loading;\n }\n | {\n status: Status.error;\n error?: string | Error;\n }\n | {\n status: Status.loaded;\n value: T;\n $implicit?: T;\n }\n | {\n status: Status.empty;\n };\n\nexport function isGalaxyAsyncStatus(value: unknown): value is GlxyAsyncStatus {\n // must have a status entry to be a valid GlxyAsyncStatus\n const statusKey = 'status';\n if (value === null || typeof value !== 'object') return false;\n if (!(statusKey in value)) return false;\n if (typeof value[statusKey] !== 'string') return false;\n if (!Object.values(Status).includes(value[statusKey] as Status)) return false;\n\n // if there is an error key, make sure it is the correct type\n if (value.status === Status.error) {\n const errorKey = 'error';\n if (errorKey in value && typeof value[errorKey] !== 'string' && !(value[errorKey] instanceof Error)) return false;\n }\n\n // if loaded status, make sure there is a value key, and that it is not undefined\n const valueKey = 'value';\n const implicitKey = '$implicit';\n if (value.status === Status.loaded) {\n if (!(valueKey in value)) return false;\n if (typeof value[valueKey] === 'undefined') return false;\n } else {\n if (valueKey in value && typeof value[valueKey] !== 'undefined') return false;\n if (implicitKey in value && typeof value[implicitKey] !== 'undefined') return false;\n }\n\n return true;\n}\n\nconst defaultError = 'Something went wrong';\n\n@Pipe({\n name: 'glxyAsyncStatus',\n})\nexport class GalaxyAsyncStatusPipe implements PipeTransform {\n transform(val: Observable | T>): Observable> {\n return val.pipe(\n map((value) => {\n if (\n value === null ||\n typeof value === 'undefined' ||\n (typeof value === 'object' && Object.keys(value).length == 0) ||\n (Array.isArray(value) && value.length === 0)\n ) {\n return {\n status: Status.empty,\n } as GlxyAsyncStatus;\n }\n\n if (isGalaxyAsyncStatus(value)) {\n if (value.status === Status.error && !value.error) {\n return {\n status: Status.error,\n error: defaultError,\n } as GlxyAsyncStatus;\n }\n\n if (value.status === Status.loaded && !value.$implicit) {\n return {\n status: Status.loaded,\n value: value.value,\n $implicit: value.value,\n } as GlxyAsyncStatus;\n }\n\n return value;\n }\n\n return {\n status: Status.loaded,\n value,\n $implicit: value,\n } as GlxyAsyncStatus;\n }),\n defaultIfEmpty({ status: Status.empty } as GlxyAsyncStatus),\n startWith({ status: Status.loading } as GlxyAsyncStatus),\n catchError((error) => {\n let errorText = defaultError;\n if (typeof error === 'string') {\n errorText = error;\n } else if (error instanceof Error) {\n errorText = error.message;\n }\n\n console.log('glxyAsyncStatus Error - ' + error.name + ': ' + errorText);\n return of({\n status: Status.error,\n error: errorText,\n } as GlxyAsyncStatus);\n }),\n );\n }\n}\n","export interface DateRange {\n start?: Date;\n end?: Date;\n}\n\nexport enum DateDuration {\n days = 'days',\n months = 'months',\n}\n\nexport enum DateFormat { // Wed Apr 01 2020 16:20:00 GMT-600\n mediumDay = 'LLL d', // MMM d (Apr 1)\n shortDate = 'L/d/yy', // M/d/yy (4/1/20)\n mediumDate = 'LLL d, y', // 'MMM d, y' (Apr 1, 2020)\n longDate = 'LLLL d, y', // 'MMMM d, y' (April 1, 2020)\n longMonth = 'LLLL y', // 'MMMM y' (April 2020)\n shortTime = 'h:mm a', // (4:20 PM)\n short = 'M/d/yy, h:mm a', // (4/1/20, 4:20 PM)\n medium = 'LLL d, y, h:mm a', // 'MMM d, y, h:mm:ss a' (removed the seconds) (Apr 1, 2020, 4:20 PM)\n long = 'LLLL d, y, h:mm a', // 'MMMM d, y, h:mm:ss a z' (removed the seconds and timezone) (April 1, 2020, 4:20 PM)\n mediumDateShortTime = 'LLL d, h:mm a', // 'MMM d, h:mm:ss a' (removed the seconds) (Apr 1, 4:20 PM)\n longLocalDate = 'PPP', // April 29, 1453 (changes order of day and month based on locale)\n mediumLocalDate = 'PP', // Apr 29, 1453 (changes order of day and month based on locale)\n}\n","import {\n addDays as add,\n addMinutes,\n isBefore as before,\n differenceInMonths as diffInMonths,\n differenceInCalendarDays,\n endOfDay,\n endOfMonth,\n format,\n formatDistance,\n parseISO,\n isSameDay as sameDay,\n startOfDay,\n startOfMonth,\n startOfWeek,\n subDays,\n subMonths,\n subYears,\n} from 'date-fns';\nimport { getLocale } from '../../locale';\nimport { DateDuration, DateFormat, DateRange } from './interface';\n\nconst MS_PER_MINUTE = 60 * 1000;\n\n/**\n * @param {Date} value What you wish to normalize\n * @param {(value: Date | number) => Date} dateFn A date function that takes in a date and applies some logic and returns a date\n * @returns {Date} normalized Date\n */\nexport function normalizeDateFunc(\n value: Date,\n dateFn: (value: Date | number, ...args: any[]) => Date,\n ...args: any[]\n): Date {\n const date = new Date(value);\n return addMinutes(dateFn(getUTCTime(date), ...args), -date.getTimezoneOffset());\n}\n\n/**\n * @param {Date} date - a given date\n * @param {number} amount - number of days to add to the date\n * @returns {Date} Returns a date that is \"amount\" of days in the future from the provided date.\n */\nexport function addDays(date: Date, amount: number): Date {\n return add(date, amount);\n}\n\n/**\n * @param {Date} date - a given date\n * @param {number} amount - number of days to subtract from the date\n * @returns {Date} Returns a date that is \"amount\" of days in the past from the provided date.\n */\nexport function subtractDays(date: Date, amount: number): Date {\n return subDays(date, amount);\n}\n\n/**\n * @param {Date} date - a given date\n * @param {number} amount - number of months to subtract from the date\n * @returns {Date} Returns a date that is \"amount\" of months in the past from the provided date.\n */\nexport function subtractMonths(date: Date, amount: number): Date {\n return subMonths(date, amount);\n}\n\n/**\n * @param {Date} date - a given date\n * @param {number} amount - number of years to subtract from the date\n * @returns {Date} Returns a date that is \"amount\" of years in the past from the provided date.\n */\nexport function subtractYears(date: Date, amount: number): Date {\n return subYears(date, amount);\n}\n\n/**\n * Given a date, a number, and either days or months we return a date that is that amount of days in the past to find the start date.\n * @example\n * // returns Tue Nov 14 2020\n * calculateStartDate(Tue Nov 17 2020, 3, 'days')\n * @example\n * // returns Thu Sept 17 2020\n * calculateStartDate(Thu Sept 17 2020, 2, 'months')\n * @param {Date} endDate - the end date of date range\n * @param {number} dur - the number of date units the date range is\n * @parm {DateDuration} unit - specifies whether we to \"dur\" days or \"dur\" months into the past for the start date\n * @returns {Date} Returns the date that is either \"dur\" days or \"dur\" months in the past in relation to the provided end date\n */\nexport function calculateStartDate(endDate: Date, dur: number, unit: DateDuration): Date {\n return unit === DateDuration.days ? subtractDays(endDate, dur) : subtractMonths(endDate, dur);\n}\n\n/**\n * @param {Date} value - a given date\n * @returns {string} Returns a localized string representation of the given date\n */\nexport function formatDate(\n value: Date,\n dateFormat: DateFormat | string = DateFormat.mediumLocalDate,\n locale?: Locale,\n): string {\n if (!locale) {\n locale = getLocale();\n }\n const date = new Date(value);\n return format(date, dateFormat, {\n locale,\n });\n}\n\n/**\n * @param {Date} date - a given date\n * @returns {string} Returns a string representation of the given date in UTC\n */\nexport function formatUTCDate(\n date: Date,\n dateFormat: DateFormat | string = DateFormat.mediumLocalDate,\n locale?: Locale,\n): string {\n return formatDate(getUTCTime(date), dateFormat, locale);\n}\n\n/**\n * @param {DateRange} dateRange - An object with start and end properties, both properties are of type Date\n * @returns {string} Returns a localized string representation of the start and end date, separated by a \"-\"\n */\nexport function formatDateRange(dateRange: DateRange): string {\n if (!dateRange || !dateRange.start || !dateRange.end) return '';\n return `${formatDate(dateRange.start)} - ${formatDate(dateRange.end)}`;\n}\n\nexport function formatUTCDateRange(dateRange: DateRange): string {\n if (!dateRange || !dateRange.start || !dateRange.end) return '';\n return `${formatUTCDate(dateRange.start)} - ${formatUTCDate(dateRange.end)}`;\n}\n\n/**\n * @returns {number} Returns the number of milliseconds that represent the timezone offset\n */\nexport function getTimezoneOffsetInMilliseconds(): number {\n return new Date().getTimezoneOffset() * MS_PER_MINUTE;\n}\n\n/**\n * @param {Date} date A date object\n * @returns {Date} returns the UTC time based off of the timezone of the client\n */\nexport function getUTCTime(date: Date): Date {\n return parseISO(date.toISOString().slice(0, -1));\n}\n\n/**\n * @param {Date} date - a given date\n * @returns {Date} Returns the given date at the start of the day (midnight)\n */\nexport function getStartOfDay(date: Date): Date {\n return startOfDay(date);\n}\n\n/**\n * @param {Date} date - a given date\n * @returns {Date} Returns the given date at the start of the day (midnight) in UTC\n * The start date of the UTC date from the given date\n * e.g. date: Wed Aug 31 2022 23:59:59 GMT-0600 (Central Standard Time) => Sept 1st in UTC\n * return: Thur Sept 01 2022 00:00:00 UTC\n */\nexport function getUTCStartOfDay(date: Date): Date {\n return normalizeDateFunc(date, startOfDay);\n}\n\n/**\n * @param {Date} date - a given date\n * @returns {Date} Returns the given date at the end of the day (minute before midnight)\n */\nexport function getEndOfDay(date: Date): Date {\n return endOfDay(date);\n}\n\n/**\n * @param {Date} date - a given date\n * @returns {Date} Returns the given date at the end of the day (minute before midnight) in UTC\n */\nexport function getUTCEndOfDay(date: Date): Date {\n return normalizeDateFunc(date, endOfDay);\n}\n\n/**\n * @param {Date} date - a given date\n * @returns {Date} Returns the given date at the start of the week (midnight)\n */\nexport function getStartOfWeek(date: Date): Date {\n return startOfWeek(date);\n}\n\n/**\n * @param {Date} date - a given date\n * @param {string} unit - unit of time\n * @returns {Date} Returns the start of a unit for the given date.\n */\nexport function getStartOf(\n date: Date,\n unit: 'month' | 'week' | 'day',\n options?: {\n locale?: Locale;\n weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6;\n },\n): Date {\n switch (unit) {\n case 'month':\n return startOfMonth(date);\n case 'week':\n return startOfWeek(date, options);\n case 'day':\n return startOfDay(date);\n }\n}\n\n/**\n * @param {Date} date - a given date\n * @returns {Date} Returns the given date at the start of the month (midnight)\n */\nexport function getStartOfMonth(date: Date): Date {\n return startOfMonth(date);\n}\n\n/**\n * @param {Date} date - a given date\n * @returns {Date} Returns the given date at the start of the month (midnight) in UTC\n */\nexport function getUTCStartOfMonth(date: Date): Date {\n return normalizeDateFunc(date, startOfMonth);\n}\n\n/**\n * @param {Date} date - a given date\n * @returns {Date} Returns the given date at the end of the month (minute before midnight)\n */\nexport function getEndOfMonth(date: Date): Date {\n return endOfMonth(date);\n}\n\n/**\n * @param {Date} date - a given date\n * @returns {Date} Returns the given date at the end of the month (minute before midnight) in UTC\n * The end of date of the UTC date from the given date\n * e.g. date: Thur Sept 01 2022 00:00:00 GMT-0600 (Central Standard Time) => Aug 31st in UTC\n * return: Wed Aug 31 2022 23:59:59 UTC\n */\nexport function getUTCEndOfMonth(date: Date): Date {\n return normalizeDateFunc(date, endOfMonth);\n}\n\n/**\n * @param {Date} endDate - a given date\n * @param {Date} startDate - a givend date, either on the same day as endDate, or in the past.\n * @returns {number} Returns the number of days in between the startDate and endDate.\n */\nexport function differenceInDays(endDate: Date, startDate: Date): number {\n return differenceInCalendarDays(endDate, startDate);\n}\n\n/**\n * @param {Date} endDate - a given date\n * @param {Date} startDate - a givend date, either on the same day as endDate, or in the past.\n * @returns {number} Returns the number of months in between the startDate and endDate.\n */\nexport function differenceInMonths(endDate: Date, startDate: Date): number {\n return diffInMonths(endDate, startDate);\n}\n\n/**\n * @param {Date} dateOne - a date object you want to compare from\n * @param {Date} dateTwo - a date object you want to compare against\n * @returns {boolean} Returns true if dateOne and dateTwo are dates with the same day\n */\nexport function isSameDay(dateOne: Date, dateTwo: Date): boolean {\n return sameDay(dateOne, dateTwo);\n}\n\n/**\n * @param {Date} dateOne - a date object you want to compare with\n * @param {Date} dateTwo - a date object you want to compare against\n * @returns {boolean} Returns true if dateOne is before dateTwo\n */\nexport function isBefore(dateOne: Date, dateTwo: Date): boolean {\n return before(dateOne, dateTwo);\n}\n\n/**\n * @param {Date} date - a given date\n * @param {Date} comparisonDate - a given date as the base for the relative comparison\n * @returns {string} Returns a localized string representation of the given date relative to the given base date\n */\nexport function formatTimeBetween(\n date: Date,\n comparisonDate: Date,\n includeSeconds = false,\n addSuffix = false,\n locale?: Locale,\n): string {\n if (!locale) {\n locale = getLocale();\n }\n return formatDistance(date, comparisonDate, { includeSeconds, addSuffix, locale });\n}\n\n/**\n * @param {Date} date - a given date\n * @returns {string} Returns a localized string representation of the given date relative to now (ex: \"3 days ago\")\n */\nexport function fromNow(date: Date, locale?: Locale): string {\n return formatTimeBetween(date, new Date(), false, true, locale);\n}\n\n/**\n * In North America, weeks start on Sundays, but other locales start the week on Monday or Saturday.\n * This function returns the days of the week in order for a locale.\n * @returns {string[]} week in localized order (indexed to north american week order)\n */\nexport function localizedWeekOrder(locale?: Locale): number[] {\n if (!locale) {\n locale = getLocale();\n }\n const weekStart = localizedWeekStart(locale);\n return [0, 1, 2, 3, 4, 5, 6].map((index) => {\n switch (weekStart) {\n case 'sat':\n return (index + 6) % 7;\n case 'sun':\n return index;\n case 'mon':\n return (index + 1) % 7;\n default:\n return index;\n }\n });\n}\n\n/**\n * In North America, weeks start on Sundays, but other locales start the week on Monday or Saturday.\n * This function maps a given index to the day of the week at the current locale.\n * Ex. The 0th weekday in Canada is Sunday (0 -> 0), the 0th weekday in Germany is Monday (0 -> 1)\n * @param {number} index - the requested index\n * @returns {number} day of the week for a weekday (indexed to north american week order)\n */\nexport function localizedWeekday(index: number, locale?: Locale): number {\n if (!locale) {\n locale = getLocale();\n }\n const weekStart = localizedWeekStart(locale);\n switch (weekStart) {\n case 'sat':\n return (index + 6) % 7;\n case 'sun':\n default:\n return index;\n case 'mon':\n return (index + 1) % 7;\n }\n}\n\n/**\n * In North America, weeks start on Sundays, but other locales start the week on Monday or Saturday.\n * This function compares the locale against known values for the first day of the week.\n * @returns {string} first three letters of a day of the week\n */\nexport function localizedWeekStart(locale?: Locale): string {\n if (!locale) {\n locale = getLocale();\n }\n const parts = locale.code?.match(\n /^([a-z]{2,3})(?:-([a-z]{3})(?=$|-))?(?:-([a-z]{4})(?=$|-))?(?:-([a-z]{2}|\\d{3})(?=$|-))?/i,\n );\n if (!parts) return 'sun';\n const [region, language] = [parts[4], parts[1]];\n\n const regionSat = 'AEAFBHDJDZEGIQIRJOKWLYOMQASDSY'.match(/../g);\n const regionSun =\n 'AGARASAUBDBRBSBTBWBZCACNCODMDOETGTGUHKHNIDILINJMJPKEKHKRLAMHMMMOMTMXMZNINPPAPEPHPKPRPTPYSASGSVTHTTTWUMUSVEVIWSYEZAZW'.match(\n /../g,\n );\n const languageSat = ['ar', 'arq', 'arz', 'fa'];\n const languageSun = 'amasbndzengnguhehiidjajvkmknkolomhmlmrmtmyneomorpapssdsmsnsutatethtnurzhzu'.match(/../g);\n\n return region\n ? regionSun?.includes(region)\n ? 'sun'\n : regionSat?.includes(region)\n ? 'sat'\n : 'mon'\n : languageSun?.includes(language)\n ? 'sun'\n : languageSat.includes(language)\n ? 'sat'\n : 'mon';\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { Locale } from 'date-fns';\nimport { formatDate, DateFormat } from '@vendasta/galaxy/utility/date-utils';\n\n@Pipe({ name: 'glxyDate' })\nexport class GalaxyDatePipe implements PipeTransform {\n transform(value: string | number | Date, dateFormat?: DateFormat, locale?: Locale): any {\n try {\n const date = new Date(value);\n return formatDate(date, dateFormat, locale);\n } catch (err) {\n return 'Not a valid date';\n }\n }\n}\n","/**\n * @param {string | number} value the value to get the ordinal suffix (e.g. st, nd, rd, th, etc.) for\n * @returns {string} the ordinal suffix\n */\nexport function ordinal(value: string | number): string {\n const num = Number(value);\n if (isNaN(num)) return '';\n\n if (num > 3 && num < 21) return 'th';\n\n const lastDigit = num % 10;\n return lastDigit === 1 ? 'st' : lastDigit === 2 ? 'nd' : lastDigit === 3 ? 'rd' : 'th';\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { ordinal } from '@vendasta/galaxy/utility/ordinal-utils';\n\n@Pipe({ name: 'glxyOrdinal' })\nexport class GalaxyOrdinalPipe implements PipeTransform {\n transform(value: string | number, excludeValueInResponse?: boolean): string {\n return excludeValueInResponse ? ordinal(value) : `${value}${ordinal(value)}`;\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\n\n// if we want to bypass sanitizer for more data types\n// https://medium.com/@swarnakishore/angular-safe-pipe-implementation-to-bypass-domsanitizer-stripping-out-content-c1bf0f1cc36b\n\n/**\n * A pipe to bypass Angular's dom sanitizer. Use when the html you wish to inject is safe, or will be used in a secure manner\n */\n@Pipe({ name: 'iTrustThisHtml' })\nexport class GalaxyITrustThisHtmlPipe implements PipeTransform {\n constructor(private sanitizer: DomSanitizer) {}\n\n transform(html: string): SafeHtml {\n return this.sanitizer.bypassSecurityTrustHtml(html);\n }\n}\n","// Important: this file is generated from the 'build' script and should not be\n// edited directly\nexport var version = '4.0.0';\n","/**\n * Simpler helper method to check for undefined simply for the benefit of\n * gaining better compression when minified by not needing to have multiple\n * comparisons to the `undefined` keyword in the codebase.\n */\nexport function isUndefined(value) {\n return value === undefined;\n}\n/**\n * Simpler helper method to check for a boolean type simply for the benefit of\n * gaining better compression when minified by not needing to have multiple\n * `typeof` comparisons in the codebase.\n */\nexport function isBoolean(value) {\n return typeof value === 'boolean';\n}\n/**\n * Assigns (shallow copies) the properties of `src` onto `dest`, if the\n * corresponding property on `dest` === `undefined`.\n *\n * @param {Object} dest The destination object.\n * @param {Object} src The source object.\n * @return {Object} The destination object (`dest`)\n */\nexport function defaults(dest, src) {\n for (var prop in src) {\n if (src.hasOwnProperty(prop) && isUndefined(dest[prop])) {\n dest[prop] = src[prop];\n }\n }\n return dest;\n}\n/**\n * Truncates the `str` at `len - ellipsisChars.length`, and adds the `ellipsisChars` to the\n * end of the string (by default, two periods: '..'). If the `str` length does not exceed\n * `len`, the string will be returned unchanged.\n *\n * @param {String} str The string to truncate and add an ellipsis to.\n * @param {Number} truncateLen The length to truncate the string at.\n * @param {String} [ellipsisChars=...] The ellipsis character(s) to add to the end of `str`\n * when truncated. Defaults to '...'\n */\nexport function ellipsis(str, truncateLen, ellipsisChars) {\n var ellipsisLength;\n if (str.length > truncateLen) {\n if (ellipsisChars == null) {\n ellipsisChars = '…';\n ellipsisLength = 3;\n } else {\n ellipsisLength = ellipsisChars.length;\n }\n str = str.substring(0, truncateLen - ellipsisLength) + ellipsisChars;\n }\n return str;\n}\n/**\n * Removes array elements by value. Mutates the input array.\n *\n * Using this instead of the ES5 Array.prototype.filter() function to prevent\n * creating many new arrays in memory for removing an element.\n *\n * @param arr The array to remove elements from. This array is mutated.\n * @param fn The element to remove.\n */\nexport function remove(arr, item) {\n for (var i = arr.length - 1; i >= 0; i--) {\n if (arr[i] === item) {\n arr.splice(i, 1);\n }\n }\n}\n/**\n * Removes array elements based on a filtering function. Mutates the input\n * array.\n *\n * Using this instead of the ES5 Array.prototype.filter() function to prevent\n * creating many new arrays in memory for filtering.\n *\n * @param arr The array to remove elements from. This array is mutated.\n * @param fn The predicate function which should return `true` to remove an\n * element.\n */\nexport function removeWithPredicate(arr, fn) {\n for (var i = arr.length - 1; i >= 0; i--) {\n if (fn(arr[i]) === true) {\n arr.splice(i, 1);\n }\n }\n}\n/**\n * Function that should never be called but is used to check that every\n * enum value is handled using TypeScript's 'never' type.\n */\nexport function assertNever(theValue) {\n throw new Error(\"Unhandled case for value: '\".concat(theValue, \"'\"));\n}\n","/*\n * This file builds and stores a library of the common regular expressions used\n * by the Autolinker utility.\n *\n * Other regular expressions may exist ad-hoc, but these are generally the\n * regular expressions that are shared between source files.\n */\n/**\n * Regular expression to match upper and lowercase ASCII letters\n */\nexport var letterRe = /[A-Za-z]/;\n/**\n * Regular expression to match ASCII digits\n */\nexport var digitRe = /[\\d]/;\n/**\n * Regular expression to match everything *except* ASCII digits\n */\nexport var nonDigitRe = /[\\D]/;\n/**\n * Regular expression to match whitespace\n */\nexport var whitespaceRe = /\\s/;\n/**\n * Regular expression to match quote characters\n */\nexport var quoteRe = /['\"]/;\n/**\n * Regular expression to match the range of ASCII control characters (0-31), and\n * the backspace char (127)\n */\nexport var controlCharsRe = /[\\x00-\\x1F\\x7F]/;\n/**\n * The string form of a regular expression that would match all of the\n * alphabetic (\"letter\") chars in the unicode character set when placed in a\n * RegExp character class (`[]`). This includes all international alphabetic\n * characters.\n *\n * These would be the characters matched by unicode regex engines `\\p{L}`\n * escape (\"all letters\").\n *\n * Taken from the XRegExp library: http://xregexp.com/ (thanks @https://github.com/slevithan)\n * Specifically: http://xregexp.com/v/3.2.0/xregexp-all.js, the 'Letter'\n * regex's bmp\n *\n * VERY IMPORTANT: This set of characters is defined inside of a Regular\n * Expression literal rather than a string literal to prevent UglifyJS from\n * compressing the unicode escape sequences into their actual unicode\n * characters. If Uglify compresses these into the unicode characters\n * themselves, this results in the error \"Range out of order in character\n * class\" when these characters are used inside of a Regular Expression\n * character class (`[]`). See usages of this const. Alternatively, we can set\n * the UglifyJS option `ascii_only` to true for the build, but that doesn't\n * help others who are pulling in Autolinker into their own build and running\n * UglifyJS themselves.\n */\n// prettier-ignore\nexport var alphaCharsStr = /A-Za-z\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u08A0-\\u08B4\\u08B6-\\u08BD\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0AF9\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58-\\u0C5A\\u0C60\\u0C61\\u0C80\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D54-\\u0D56\\u0D5F-\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16F1-\\u16F8\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u1884\\u1887-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1C80-\\u1C88\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2183\\u2184\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005\\u3006\\u3031-\\u3035\\u303B\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FD5\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA69D\\uA6A0-\\uA6E5\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7AE\\uA7B0-\\uA7B7\\uA7F7-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA8FD\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uA9E0-\\uA9E4\\uA9E6-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB65\\uAB70-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC/.source; // see note in above variable description\n/**\n * The string form of a regular expression that would match all emoji characters\n * Based on the emoji regex defined in this article: https://thekevinscott.com/emojis-in-javascript/\n */\nexport var emojiStr = /\\u2700-\\u27bf\\udde6-\\uddff\\ud800-\\udbff\\udc00-\\udfff\\ufe0e\\ufe0f\\u0300-\\u036f\\ufe20-\\ufe23\\u20d0-\\u20f0\\ud83c\\udffb-\\udfff\\u200d\\u3299\\u3297\\u303d\\u3030\\u24c2\\ud83c\\udd70-\\udd71\\udd7e-\\udd7f\\udd8e\\udd91-\\udd9a\\udde6-\\uddff\\ude01-\\ude02\\ude1a\\ude2f\\ude32-\\ude3a\\ude50-\\ude51\\u203c\\u2049\\u25aa-\\u25ab\\u25b6\\u25c0\\u25fb-\\u25fe\\u00a9\\u00ae\\u2122\\u2139\\udc04\\u2600-\\u26FF\\u2b05\\u2b06\\u2b07\\u2b1b\\u2b1c\\u2b50\\u2b55\\u231a\\u231b\\u2328\\u23cf\\u23e9-\\u23f3\\u23f8-\\u23fa\\udccf\\u2935\\u2934\\u2190-\\u21ff/.source;\n/**\n * The string form of a regular expression that would match all of the\n * combining mark characters in the unicode character set when placed in a\n * RegExp character class (`[]`).\n *\n * These would be the characters matched by unicode regex engines `\\p{M}`\n * escape (\"all marks\").\n *\n * Taken from the XRegExp library: http://xregexp.com/ (thanks @https://github.com/slevithan)\n * Specifically: http://xregexp.com/v/3.2.0/xregexp-all.js, the 'Mark'\n * regex's bmp\n *\n * VERY IMPORTANT: This set of characters is defined inside of a Regular\n * Expression literal rather than a string literal to prevent UglifyJS from\n * compressing the unicode escape sequences into their actual unicode\n * characters. If Uglify compresses these into the unicode characters\n * themselves, this results in the error \"Range out of order in character\n * class\" when these characters are used inside of a Regular Expression\n * character class (`[]`). See usages of this const. Alternatively, we can set\n * the UglifyJS option `ascii_only` to true for the build, but that doesn't\n * help others who are pulling in Autolinker into their own build and running\n * UglifyJS themselves.\n */\n// prettier-ignore\nexport var marksStr = /\\u0300-\\u036F\\u0483-\\u0489\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610-\\u061A\\u064B-\\u065F\\u0670\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED\\u0711\\u0730-\\u074A\\u07A6-\\u07B0\\u07EB-\\u07F3\\u0816-\\u0819\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u082D\\u0859-\\u085B\\u08D4-\\u08E1\\u08E3-\\u0903\\u093A-\\u093C\\u093E-\\u094F\\u0951-\\u0957\\u0962\\u0963\\u0981-\\u0983\\u09BC\\u09BE-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CD\\u09D7\\u09E2\\u09E3\\u0A01-\\u0A03\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81-\\u0A83\\u0ABC\\u0ABE-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AE2\\u0AE3\\u0B01-\\u0B03\\u0B3C\\u0B3E-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B62\\u0B63\\u0B82\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD7\\u0C00-\\u0C03\\u0C3E-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0C81-\\u0C83\\u0CBC\\u0CBE-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CE2\\u0CE3\\u0D01-\\u0D03\\u0D3E-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4D\\u0D57\\u0D62\\u0D63\\u0D82\\u0D83\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EB9\\u0EBB\\u0EBC\\u0EC8-\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F3E\\u0F3F\\u0F71-\\u0F84\\u0F86\\u0F87\\u0F8D-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u102B-\\u103E\\u1056-\\u1059\\u105E-\\u1060\\u1062-\\u1064\\u1067-\\u106D\\u1071-\\u1074\\u1082-\\u108D\\u108F\\u109A-\\u109D\\u135D-\\u135F\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B4-\\u17D3\\u17DD\\u180B-\\u180D\\u1885\\u1886\\u18A9\\u1920-\\u192B\\u1930-\\u193B\\u1A17-\\u1A1B\\u1A55-\\u1A5E\\u1A60-\\u1A7C\\u1A7F\\u1AB0-\\u1ABE\\u1B00-\\u1B04\\u1B34-\\u1B44\\u1B6B-\\u1B73\\u1B80-\\u1B82\\u1BA1-\\u1BAD\\u1BE6-\\u1BF3\\u1C24-\\u1C37\\u1CD0-\\u1CD2\\u1CD4-\\u1CE8\\u1CED\\u1CF2-\\u1CF4\\u1CF8\\u1CF9\\u1DC0-\\u1DF5\\u1DFB-\\u1DFF\\u20D0-\\u20F0\\u2CEF-\\u2CF1\\u2D7F\\u2DE0-\\u2DFF\\u302A-\\u302F\\u3099\\u309A\\uA66F-\\uA672\\uA674-\\uA67D\\uA69E\\uA69F\\uA6F0\\uA6F1\\uA802\\uA806\\uA80B\\uA823-\\uA827\\uA880\\uA881\\uA8B4-\\uA8C5\\uA8E0-\\uA8F1\\uA926-\\uA92D\\uA947-\\uA953\\uA980-\\uA983\\uA9B3-\\uA9C0\\uA9E5\\uAA29-\\uAA36\\uAA43\\uAA4C\\uAA4D\\uAA7B-\\uAA7D\\uAAB0\\uAAB2-\\uAAB4\\uAAB7\\uAAB8\\uAABE\\uAABF\\uAAC1\\uAAEB-\\uAAEF\\uAAF5\\uAAF6\\uABE3-\\uABEA\\uABEC\\uABED\\uFB1E\\uFE00-\\uFE0F\\uFE20-\\uFE2F/.source; // see note in above variable description\n/**\n * The string form of a regular expression that would match all of the\n * alphabetic (\"letter\") chars, emoji, and combining marks in the unicode character set\n * when placed in a RegExp character class (`[]`). This includes all\n * international alphabetic characters.\n *\n * These would be the characters matched by unicode regex engines `\\p{L}\\p{M}`\n * escapes and emoji characters.\n */\nexport var alphaCharsAndMarksStr = alphaCharsStr + emojiStr + marksStr;\n/**\n * The string form of a regular expression that would match all of the\n * decimal number chars in the unicode character set when placed in a RegExp\n * character class (`[]`).\n *\n * These would be the characters matched by unicode regex engines `\\p{Nd}`\n * escape (\"all decimal numbers\")\n *\n * Taken from the XRegExp library: http://xregexp.com/ (thanks @https://github.com/slevithan)\n * Specifically: http://xregexp.com/v/3.2.0/xregexp-all.js, the 'Decimal_Number'\n * regex's bmp\n *\n * VERY IMPORTANT: This set of characters is defined inside of a Regular\n * Expression literal rather than a string literal to prevent UglifyJS from\n * compressing the unicode escape sequences into their actual unicode\n * characters. If Uglify compresses these into the unicode characters\n * themselves, this results in the error \"Range out of order in character\n * class\" when these characters are used inside of a Regular Expression\n * character class (`[]`). See usages of this const. Alternatively, we can set\n * the UglifyJS option `ascii_only` to true for the build, but that doesn't\n * help others who are pulling in Autolinker into their own build and running\n * UglifyJS themselves.\n */\n// prettier-ignore\nexport var decimalNumbersStr = /0-9\\u0660-\\u0669\\u06F0-\\u06F9\\u07C0-\\u07C9\\u0966-\\u096F\\u09E6-\\u09EF\\u0A66-\\u0A6F\\u0AE6-\\u0AEF\\u0B66-\\u0B6F\\u0BE6-\\u0BEF\\u0C66-\\u0C6F\\u0CE6-\\u0CEF\\u0D66-\\u0D6F\\u0DE6-\\u0DEF\\u0E50-\\u0E59\\u0ED0-\\u0ED9\\u0F20-\\u0F29\\u1040-\\u1049\\u1090-\\u1099\\u17E0-\\u17E9\\u1810-\\u1819\\u1946-\\u194F\\u19D0-\\u19D9\\u1A80-\\u1A89\\u1A90-\\u1A99\\u1B50-\\u1B59\\u1BB0-\\u1BB9\\u1C40-\\u1C49\\u1C50-\\u1C59\\uA620-\\uA629\\uA8D0-\\uA8D9\\uA900-\\uA909\\uA9D0-\\uA9D9\\uA9F0-\\uA9F9\\uAA50-\\uAA59\\uABF0-\\uABF9\\uFF10-\\uFF19/.source; // see note in above variable description\n/**\n * The regular expression that will match all of the letters and decimal number\n * chars in the unicode character set when placed in a RegExp character class\n * (`[]`).\n *\n * These would be the characters matched by unicode regex engines\n * `[\\p{L}\\p{Nd}]` escape (\"all letters and decimal numbers\")\n */\nexport var alphaNumericCharsRe = new RegExp(\"[\".concat(alphaCharsStr + decimalNumbersStr, \"]\"));\n/**\n * The string form of a regular expression that would match all of the\n * letters, combining marks, and decimal number chars in the unicode character\n * set when placed in a RegExp character class (`[]`).\n *\n * These would be the characters matched by unicode regex engines\n * `[\\p{L}\\p{M}\\p{Nd}]` escape (\"all letters, combining marks, and decimal\n * numbers\")\n */\nexport var alphaNumericAndMarksCharsStr = alphaCharsAndMarksStr + decimalNumbersStr;\n/**\n * The regular expression that will match a single letter of the\n * {@link #alphaNumericAndMarksCharsStr}.\n */\nexport var alphaNumericAndMarksRe = new RegExp(\"[\".concat(alphaNumericAndMarksCharsStr, \"]\"));\n","import { whitespaceRe } from './regex-lib';\n/**\n * @class Autolinker.HtmlTag\n * @extends Object\n *\n * Represents an HTML tag, which can be used to easily build/modify HTML tags programmatically.\n *\n * Autolinker uses this abstraction to create HTML tags, and then write them out as strings. You may also use\n * this class in your code, especially within a {@link Autolinker#replaceFn replaceFn}.\n *\n * ## Examples\n *\n * Example instantiation:\n *\n * var tag = new Autolinker.HtmlTag( {\n * tagName : 'a',\n * attrs : { 'href': 'http://google.com', 'class': 'external-link' },\n * innerHtml : 'Google'\n * } );\n *\n * tag.toAnchorString(); // Google\n *\n * // Individual accessor methods\n * tag.getTagName(); // 'a'\n * tag.getAttr( 'href' ); // 'http://google.com'\n * tag.hasClass( 'external-link' ); // true\n *\n *\n * Using mutator methods (which may be used in combination with instantiation config properties):\n *\n * var tag = new Autolinker.HtmlTag();\n * tag.setTagName( 'a' );\n * tag.setAttr( 'href', 'http://google.com' );\n * tag.addClass( 'external-link' );\n * tag.setInnerHtml( 'Google' );\n *\n * tag.getTagName(); // 'a'\n * tag.getAttr( 'href' ); // 'http://google.com'\n * tag.hasClass( 'external-link' ); // true\n *\n * tag.toAnchorString(); // Google\n *\n *\n * ## Example use within a {@link Autolinker#replaceFn replaceFn}\n *\n * var html = Autolinker.link( \"Test google.com\", {\n * replaceFn : function( match ) {\n * var tag = match.buildTag(); // returns an {@link Autolinker.HtmlTag} instance, configured with the Match's href and anchor text\n * tag.setAttr( 'rel', 'nofollow' );\n *\n * return tag;\n * }\n * } );\n *\n * // generated html:\n * // Test google.com\n *\n *\n * ## Example use with a new tag for the replacement\n *\n * var html = Autolinker.link( \"Test google.com\", {\n * replaceFn : function( match ) {\n * var tag = new Autolinker.HtmlTag( {\n * tagName : 'button',\n * attrs : { 'title': 'Load URL: ' + match.getAnchorHref() },\n * innerHtml : 'Load URL: ' + match.getAnchorText()\n * } );\n *\n * return tag;\n * }\n * } );\n *\n * // generated html:\n * // Test \n */\nvar HtmlTag = /** @class */function () {\n /**\n * @method constructor\n * @param {Object} [cfg] The configuration properties for this class, in an Object (map)\n */\n function HtmlTag(cfg) {\n if (cfg === void 0) {\n cfg = {};\n }\n /**\n * @cfg {String} tagName\n *\n * The tag name. Ex: 'a', 'button', etc.\n *\n * Not required at instantiation time, but should be set using {@link #setTagName} before {@link #toAnchorString}\n * is executed.\n */\n this.tagName = ''; // default value just to get the above doc comment in the ES5 output and documentation generator\n /**\n * @cfg {Object.} attrs\n *\n * An key/value Object (map) of attributes to create the tag with. The keys are the attribute names, and the\n * values are the attribute values.\n */\n this.attrs = {}; // default value just to get the above doc comment in the ES5 output and documentation generator\n /**\n * @cfg {String} innerHTML\n *\n * The inner HTML for the tag.\n */\n this.innerHTML = ''; // default value just to get the above doc comment in the ES5 output and documentation generator\n this.tagName = cfg.tagName || '';\n this.attrs = cfg.attrs || {};\n this.innerHTML = cfg.innerHtml || cfg.innerHTML || ''; // accept either the camelCased form or the fully capitalized acronym as in the DOM\n }\n /**\n * Sets the tag name that will be used to generate the tag with.\n *\n * @param {String} tagName\n * @return {Autolinker.HtmlTag} This HtmlTag instance, so that method calls may be chained.\n */\n HtmlTag.prototype.setTagName = function (tagName) {\n this.tagName = tagName;\n return this;\n };\n /**\n * Retrieves the tag name.\n *\n * @return {String}\n */\n HtmlTag.prototype.getTagName = function () {\n return this.tagName || '';\n };\n /**\n * Sets an attribute on the HtmlTag.\n *\n * @param {String} attrName The attribute name to set.\n * @param {String} attrValue The attribute value to set.\n * @return {Autolinker.HtmlTag} This HtmlTag instance, so that method calls may be chained.\n */\n HtmlTag.prototype.setAttr = function (attrName, attrValue) {\n var tagAttrs = this.getAttrs();\n tagAttrs[attrName] = attrValue;\n return this;\n };\n /**\n * Retrieves an attribute from the HtmlTag. If the attribute does not exist, returns `undefined`.\n *\n * @param {String} attrName The attribute name to retrieve.\n * @return {String} The attribute's value, or `undefined` if it does not exist on the HtmlTag.\n */\n HtmlTag.prototype.getAttr = function (attrName) {\n return this.getAttrs()[attrName];\n };\n /**\n * Sets one or more attributes on the HtmlTag.\n *\n * @param {Object.} attrs A key/value Object (map) of the attributes to set.\n * @return {Autolinker.HtmlTag} This HtmlTag instance, so that method calls may be chained.\n */\n HtmlTag.prototype.setAttrs = function (attrs) {\n Object.assign(this.getAttrs(), attrs);\n return this;\n };\n /**\n * Retrieves the attributes Object (map) for the HtmlTag.\n *\n * @return {Object.} A key/value object of the attributes for the HtmlTag.\n */\n HtmlTag.prototype.getAttrs = function () {\n return this.attrs || (this.attrs = {});\n };\n /**\n * Sets the provided `cssClass`, overwriting any current CSS classes on the HtmlTag.\n *\n * @param {String} cssClass One or more space-separated CSS classes to set (overwrite).\n * @return {Autolinker.HtmlTag} This HtmlTag instance, so that method calls may be chained.\n */\n HtmlTag.prototype.setClass = function (cssClass) {\n return this.setAttr('class', cssClass);\n };\n /**\n * Convenience method to add one or more CSS classes to the HtmlTag. Will not add duplicate CSS classes.\n *\n * @param {String} cssClass One or more space-separated CSS classes to add.\n * @return {Autolinker.HtmlTag} This HtmlTag instance, so that method calls may be chained.\n */\n HtmlTag.prototype.addClass = function (cssClass) {\n var classAttr = this.getClass(),\n classes = !classAttr ? [] : classAttr.split(whitespaceRe),\n newClasses = cssClass.split(whitespaceRe),\n newClass;\n while (newClass = newClasses.shift()) {\n if (classes.indexOf(newClass) === -1) {\n classes.push(newClass);\n }\n }\n this.getAttrs()['class'] = classes.join(' ');\n return this;\n };\n /**\n * Convenience method to remove one or more CSS classes from the HtmlTag.\n *\n * @param {String} cssClass One or more space-separated CSS classes to remove.\n * @return {Autolinker.HtmlTag} This HtmlTag instance, so that method calls may be chained.\n */\n HtmlTag.prototype.removeClass = function (cssClass) {\n var classAttr = this.getClass(),\n classes = !classAttr ? [] : classAttr.split(whitespaceRe),\n removeClasses = cssClass.split(whitespaceRe),\n removeClass;\n while (classes.length && (removeClass = removeClasses.shift())) {\n var idx = classes.indexOf(removeClass);\n if (idx !== -1) {\n classes.splice(idx, 1);\n }\n }\n this.getAttrs()['class'] = classes.join(' ');\n return this;\n };\n /**\n * Convenience method to retrieve the CSS class(es) for the HtmlTag, which will each be separated by spaces when\n * there are multiple.\n *\n * @return {String}\n */\n HtmlTag.prototype.getClass = function () {\n return this.getAttrs()['class'] || '';\n };\n /**\n * Convenience method to check if the tag has a CSS class or not.\n *\n * @param {String} cssClass The CSS class to check for.\n * @return {Boolean} `true` if the HtmlTag has the CSS class, `false` otherwise.\n */\n HtmlTag.prototype.hasClass = function (cssClass) {\n return (' ' + this.getClass() + ' ').indexOf(' ' + cssClass + ' ') !== -1;\n };\n /**\n * Sets the inner HTML for the tag.\n *\n * @param {String} html The inner HTML to set.\n * @return {Autolinker.HtmlTag} This HtmlTag instance, so that method calls may be chained.\n */\n HtmlTag.prototype.setInnerHTML = function (html) {\n this.innerHTML = html;\n return this;\n };\n /**\n * Backwards compatibility method name.\n *\n * @param {String} html The inner HTML to set.\n * @return {Autolinker.HtmlTag} This HtmlTag instance, so that method calls may be chained.\n */\n HtmlTag.prototype.setInnerHtml = function (html) {\n return this.setInnerHTML(html);\n };\n /**\n * Retrieves the inner HTML for the tag.\n *\n * @return {String}\n */\n HtmlTag.prototype.getInnerHTML = function () {\n return this.innerHTML || '';\n };\n /**\n * Backward compatibility method name.\n *\n * @return {String}\n */\n HtmlTag.prototype.getInnerHtml = function () {\n return this.getInnerHTML();\n };\n /**\n * Generates the HTML string for the tag.\n *\n * @return {String}\n */\n HtmlTag.prototype.toAnchorString = function () {\n var tagName = this.getTagName(),\n attrsStr = this.buildAttrsStr();\n attrsStr = attrsStr ? ' ' + attrsStr : ''; // prepend a space if there are actually attributes\n return ['<', tagName, attrsStr, '>', this.getInnerHtml(), ''].join('');\n };\n /**\n * Support method for {@link #toAnchorString}, returns the string space-separated key=\"value\" pairs, used to populate\n * the stringified HtmlTag.\n *\n * @protected\n * @return {String} Example return: `attr1=\"value1\" attr2=\"value2\"`\n */\n HtmlTag.prototype.buildAttrsStr = function () {\n if (!this.attrs) return ''; // no `attrs` Object (map) has been set, return empty string\n var attrs = this.getAttrs(),\n attrsArr = [];\n for (var prop in attrs) {\n if (attrs.hasOwnProperty(prop)) {\n attrsArr.push(prop + '=\"' + attrs[prop] + '\"');\n }\n }\n return attrsArr.join(' ');\n };\n return HtmlTag;\n}();\nexport { HtmlTag };\n","/**\n * Date: 2015-10-05\n * Author: Kasper Søfren (https://github.com/kafoso)\n *\n * A truncation feature, where the ellipsis will be placed at a section within\n * the URL making it still somewhat human readable.\n *\n * @param {String} url\t\t\t\t\t\t A URL.\n * @param {Number} truncateLen\t\t The maximum length of the truncated output URL string.\n * @param {String} ellipsisChars\t The characters to place within the url, e.g. \"...\".\n * @return {String} The truncated URL.\n */\nexport function truncateSmart(url, truncateLen, ellipsisChars) {\n var ellipsisLengthBeforeParsing;\n var ellipsisLength;\n if (ellipsisChars == null) {\n ellipsisChars = '…';\n ellipsisLength = 3;\n ellipsisLengthBeforeParsing = 8;\n } else {\n ellipsisLength = ellipsisChars.length;\n ellipsisLengthBeforeParsing = ellipsisChars.length;\n }\n var parse_url = function (url) {\n // Functionality inspired by PHP function of same name\n var urlObj = {};\n var urlSub = url;\n var match = urlSub.match(/^([a-z]+):\\/\\//i);\n if (match) {\n urlObj.scheme = match[1];\n urlSub = urlSub.substr(match[0].length);\n }\n match = urlSub.match(/^(.*?)(?=(\\?|#|\\/|$))/i);\n if (match) {\n urlObj.host = match[1];\n urlSub = urlSub.substr(match[0].length);\n }\n match = urlSub.match(/^\\/(.*?)(?=(\\?|#|$))/i);\n if (match) {\n urlObj.path = match[1];\n urlSub = urlSub.substr(match[0].length);\n }\n match = urlSub.match(/^\\?(.*?)(?=(#|$))/i);\n if (match) {\n urlObj.query = match[1];\n urlSub = urlSub.substr(match[0].length);\n }\n match = urlSub.match(/^#(.*?)$/i);\n if (match) {\n urlObj.fragment = match[1];\n //urlSub = urlSub.substr(match[0].length); -- not used. Uncomment if adding another block.\n }\n return urlObj;\n };\n var buildUrl = function (urlObj) {\n var url = '';\n if (urlObj.scheme && urlObj.host) {\n url += urlObj.scheme + '://';\n }\n if (urlObj.host) {\n url += urlObj.host;\n }\n if (urlObj.path) {\n url += '/' + urlObj.path;\n }\n if (urlObj.query) {\n url += '?' + urlObj.query;\n }\n if (urlObj.fragment) {\n url += '#' + urlObj.fragment;\n }\n return url;\n };\n var buildSegment = function (segment, remainingAvailableLength) {\n var remainingAvailableLengthHalf = remainingAvailableLength / 2,\n startOffset = Math.ceil(remainingAvailableLengthHalf),\n endOffset = -1 * Math.floor(remainingAvailableLengthHalf),\n end = '';\n if (endOffset < 0) {\n end = segment.substr(endOffset);\n }\n return segment.substr(0, startOffset) + ellipsisChars + end;\n };\n if (url.length <= truncateLen) {\n return url;\n }\n var availableLength = truncateLen - ellipsisLength;\n var urlObj = parse_url(url);\n // Clean up the URL\n if (urlObj.query) {\n var matchQuery = urlObj.query.match(/^(.*?)(?=(\\?|\\#))(.*?)$/i);\n if (matchQuery) {\n // Malformed URL; two or more \"?\". Removed any content behind the 2nd.\n urlObj.query = urlObj.query.substr(0, matchQuery[1].length);\n url = buildUrl(urlObj);\n }\n }\n if (url.length <= truncateLen) {\n return url;\n }\n if (urlObj.host) {\n urlObj.host = urlObj.host.replace(/^www\\./, '');\n url = buildUrl(urlObj);\n }\n if (url.length <= truncateLen) {\n return url;\n }\n // Process and build the URL\n var str = '';\n if (urlObj.host) {\n str += urlObj.host;\n }\n if (str.length >= availableLength) {\n if (urlObj.host.length == truncateLen) {\n return (urlObj.host.substr(0, truncateLen - ellipsisLength) + ellipsisChars).substr(0, availableLength + ellipsisLengthBeforeParsing);\n }\n return buildSegment(str, availableLength).substr(0, availableLength + ellipsisLengthBeforeParsing);\n }\n var pathAndQuery = '';\n if (urlObj.path) {\n pathAndQuery += '/' + urlObj.path;\n }\n if (urlObj.query) {\n pathAndQuery += '?' + urlObj.query;\n }\n if (pathAndQuery) {\n if ((str + pathAndQuery).length >= availableLength) {\n if ((str + pathAndQuery).length == truncateLen) {\n return (str + pathAndQuery).substr(0, truncateLen);\n }\n var remainingAvailableLength = availableLength - str.length;\n return (str + buildSegment(pathAndQuery, remainingAvailableLength)).substr(0, availableLength + ellipsisLengthBeforeParsing);\n } else {\n str += pathAndQuery;\n }\n }\n if (urlObj.fragment) {\n var fragment = '#' + urlObj.fragment;\n if ((str + fragment).length >= availableLength) {\n if ((str + fragment).length == truncateLen) {\n return (str + fragment).substr(0, truncateLen);\n }\n var remainingAvailableLength2 = availableLength - str.length;\n return (str + buildSegment(fragment, remainingAvailableLength2)).substr(0, availableLength + ellipsisLengthBeforeParsing);\n } else {\n str += fragment;\n }\n }\n if (urlObj.scheme && urlObj.host) {\n var scheme = urlObj.scheme + '://';\n if ((str + scheme).length < availableLength) {\n return (scheme + str).substr(0, truncateLen);\n }\n }\n if (str.length <= truncateLen) {\n return str;\n }\n var end = '';\n if (availableLength > 0) {\n end = str.substr(-1 * Math.floor(availableLength / 2));\n }\n return (str.substr(0, Math.ceil(availableLength / 2)) + ellipsisChars + end).substr(0, availableLength + ellipsisLengthBeforeParsing);\n}\n","/**\n * Date: 2015-10-05\n * Author: Kasper Søfren (https://github.com/kafoso)\n *\n * A truncation feature, where the ellipsis will be placed in the dead-center of the URL.\n *\n * @param {String} url A URL.\n * @param {Number} truncateLen The maximum length of the truncated output URL string.\n * @param {String} ellipsisChars The characters to place within the url, e.g. \"..\".\n * @return {String} The truncated URL.\n */\nexport function truncateMiddle(url, truncateLen, ellipsisChars) {\n if (url.length <= truncateLen) {\n return url;\n }\n var ellipsisLengthBeforeParsing;\n var ellipsisLength;\n if (ellipsisChars == null) {\n ellipsisChars = '…';\n ellipsisLengthBeforeParsing = 8;\n ellipsisLength = 3;\n } else {\n ellipsisLengthBeforeParsing = ellipsisChars.length;\n ellipsisLength = ellipsisChars.length;\n }\n var availableLength = truncateLen - ellipsisLength;\n var end = '';\n if (availableLength > 0) {\n end = url.substr(-1 * Math.floor(availableLength / 2));\n }\n return (url.substr(0, Math.ceil(availableLength / 2)) + ellipsisChars + end).substr(0, availableLength + ellipsisLengthBeforeParsing);\n}\n","import { ellipsis } from '../utils';\n/**\n * A truncation feature where the ellipsis will be placed at the end of the URL.\n *\n * @param {String} anchorText\n * @param {Number} truncateLen The maximum length of the truncated output URL string.\n * @param {String} ellipsisChars The characters to place within the url, e.g. \"..\".\n * @return {String} The truncated URL.\n */\nexport function truncateEnd(anchorText, truncateLen, ellipsisChars) {\n return ellipsis(anchorText, truncateLen, ellipsisChars);\n}\n","import { HtmlTag } from './html-tag';\nimport { truncateSmart } from './truncate/truncate-smart';\nimport { truncateMiddle } from './truncate/truncate-middle';\nimport { truncateEnd } from './truncate/truncate-end';\n/**\n * @protected\n * @class Autolinker.AnchorTagBuilder\n * @extends Object\n *\n * Builds anchor (<a>) tags for the Autolinker utility when a match is\n * found.\n *\n * Normally this class is instantiated, configured, and used internally by an\n * {@link Autolinker} instance, but may actually be used indirectly in a\n * {@link Autolinker#replaceFn replaceFn} to create {@link Autolinker.HtmlTag HtmlTag}\n * instances which may be modified before returning from the\n * {@link Autolinker#replaceFn replaceFn}. For example:\n *\n * var html = Autolinker.link( \"Test google.com\", {\n * replaceFn : function( match ) {\n * var tag = match.buildTag(); // returns an {@link Autolinker.HtmlTag} instance\n * tag.setAttr( 'rel', 'nofollow' );\n *\n * return tag;\n * }\n * } );\n *\n * // generated html:\n * // Test google.com\n */\nvar AnchorTagBuilder = /** @class */function () {\n /**\n * @method constructor\n * @param {Object} [cfg] The configuration options for the AnchorTagBuilder instance, specified in an Object (map).\n */\n function AnchorTagBuilder(cfg) {\n if (cfg === void 0) {\n cfg = {};\n }\n /**\n * @cfg {Boolean} newWindow\n * @inheritdoc Autolinker#newWindow\n */\n this.newWindow = false; // default value just to get the above doc comment in the ES5 output and documentation generator\n /**\n * @cfg {Object} truncate\n * @inheritdoc Autolinker#truncate\n */\n this.truncate = {}; // default value just to get the above doc comment in the ES5 output and documentation generator\n /**\n * @cfg {String} className\n * @inheritdoc Autolinker#className\n */\n this.className = ''; // default value just to get the above doc comment in the ES5 output and documentation generator\n this.newWindow = cfg.newWindow || false;\n this.truncate = cfg.truncate || {};\n this.className = cfg.className || '';\n }\n /**\n * Generates the actual anchor (<a>) tag to use in place of the\n * matched text, via its `match` object.\n *\n * @param match The Match instance to generate an anchor tag from.\n * @return The HtmlTag instance for the anchor tag.\n */\n AnchorTagBuilder.prototype.build = function (match) {\n return new HtmlTag({\n tagName: 'a',\n attrs: this.createAttrs(match),\n innerHtml: this.processAnchorText(match.getAnchorText())\n });\n };\n /**\n * Creates the Object (map) of the HTML attributes for the anchor (<a>)\n * tag being generated.\n *\n * @protected\n * @param match The Match instance to generate an anchor tag from.\n * @return A key/value Object (map) of the anchor tag's attributes.\n */\n AnchorTagBuilder.prototype.createAttrs = function (match) {\n var attrs = {\n href: match.getAnchorHref() // we'll always have the `href` attribute\n };\n var cssClass = this.createCssClass(match);\n if (cssClass) {\n attrs['class'] = cssClass;\n }\n if (this.newWindow) {\n attrs['target'] = '_blank';\n attrs['rel'] = 'noopener noreferrer'; // Issue #149. See https://mathiasbynens.github.io/rel-noopener/\n }\n if (this.truncate) {\n if (this.truncate.length && this.truncate.length < match.getAnchorText().length) {\n attrs['title'] = match.getAnchorHref();\n }\n }\n return attrs;\n };\n /**\n * Creates the CSS class that will be used for a given anchor tag, based on\n * the `matchType` and the {@link #className} config.\n *\n * Example returns:\n *\n * - \"\" // no {@link #className}\n * - \"myLink myLink-url\" // url match\n * - \"myLink myLink-email\" // email match\n * - \"myLink myLink-phone\" // phone match\n * - \"myLink myLink-hashtag\" // hashtag match\n * - \"myLink myLink-mention myLink-twitter\" // mention match with Twitter service\n *\n * @protected\n * @param match The Match instance to generate an\n * anchor tag from.\n * @return The CSS class string for the link. Example return:\n * \"myLink myLink-url\". If no {@link #className} was configured, returns\n * an empty string.\n */\n AnchorTagBuilder.prototype.createCssClass = function (match) {\n var className = this.className;\n if (!className) {\n return '';\n } else {\n var returnClasses = [className],\n cssClassSuffixes = match.getCssClassSuffixes();\n for (var i = 0, len = cssClassSuffixes.length; i < len; i++) {\n returnClasses.push(className + '-' + cssClassSuffixes[i]);\n }\n return returnClasses.join(' ');\n }\n };\n /**\n * Processes the `anchorText` by truncating the text according to the\n * {@link #truncate} config.\n *\n * @private\n * @param anchorText The anchor tag's text (i.e. what will be\n * displayed).\n * @return The processed `anchorText`.\n */\n AnchorTagBuilder.prototype.processAnchorText = function (anchorText) {\n anchorText = this.doTruncate(anchorText);\n return anchorText;\n };\n /**\n * Performs the truncation of the `anchorText` based on the {@link #truncate}\n * option. If the `anchorText` is longer than the length specified by the\n * {@link #truncate} option, the truncation is performed based on the\n * `location` property. See {@link #truncate} for details.\n *\n * @private\n * @param anchorText The anchor tag's text (i.e. what will be\n * displayed).\n * @return The truncated anchor text.\n */\n AnchorTagBuilder.prototype.doTruncate = function (anchorText) {\n var truncate = this.truncate;\n if (!truncate || !truncate.length) return anchorText;\n var truncateLength = truncate.length,\n truncateLocation = truncate.location;\n if (truncateLocation === 'smart') {\n return truncateSmart(anchorText, truncateLength);\n } else if (truncateLocation === 'middle') {\n return truncateMiddle(anchorText, truncateLength);\n } else {\n return truncateEnd(anchorText, truncateLength);\n }\n };\n return AnchorTagBuilder;\n}();\nexport { AnchorTagBuilder };\n","/**\n * @abstract\n * @class Autolinker.match.AbstractMatch\n *\n * Represents a match found in an input string which should be Autolinked. A Match object is what is provided in a\n * {@link Autolinker#replaceFn replaceFn}, and may be used to query for details about the match.\n *\n * For example:\n *\n * var input = \"...\"; // string with URLs, Email Addresses, and Mentions (Twitter, Instagram, Soundcloud)\n *\n * var linkedText = Autolinker.link( input, {\n * replaceFn : function( match ) {\n * console.log( \"href = \", match.getAnchorHref() );\n * console.log( \"text = \", match.getAnchorText() );\n *\n * switch( match.getType() ) {\n * case 'url' :\n * console.log( \"url: \", match.getUrl() );\n *\n * case 'email' :\n * console.log( \"email: \", match.getEmail() );\n *\n * case 'mention' :\n * console.log( \"mention: \", match.getMention() );\n * }\n * }\n * } );\n *\n * See the {@link Autolinker} class for more details on using the {@link Autolinker#replaceFn replaceFn}.\n */\nvar AbstractMatch = /** @class */function () {\n /**\n * @member Autolinker.match.Match\n * @method constructor\n * @param {Object} cfg The configuration properties for the Match\n * instance, specified in an Object (map).\n */\n function AbstractMatch(cfg) {\n /**\n * @cfg {Autolinker.AnchorTagBuilder} tagBuilder (required)\n *\n * Reference to the AnchorTagBuilder instance to use to generate an anchor\n * tag for the Match.\n */\n // @ts-ignore\n this._ = null; // property used just to get the above doc comment into the ES5 output and documentation generator\n /**\n * @cfg {String} matchedText (required)\n *\n * The original text that was matched by the {@link Autolinker.matcher.Matcher}.\n */\n this.matchedText = ''; // default value just to get the above doc comment in the ES5 output and documentation generator\n /**\n * @cfg {Number} offset (required)\n *\n * The offset of where the match was made in the input string.\n */\n this.offset = 0; // default value just to get the above doc comment in the ES5 output and documentation generator\n this.tagBuilder = cfg.tagBuilder;\n this.matchedText = cfg.matchedText;\n this.offset = cfg.offset;\n }\n /**\n * Returns the original text that was matched.\n *\n * @return {String}\n */\n AbstractMatch.prototype.getMatchedText = function () {\n return this.matchedText;\n };\n /**\n * Sets the {@link #offset} of where the match was made in the input string.\n *\n * A {@link Autolinker.matcher.Matcher} will be fed only HTML text nodes,\n * and will therefore set an original offset that is relative to the HTML\n * text node itself. However, we want this offset to be relative to the full\n * HTML input string, and thus if using {@link Autolinker#parse} (rather\n * than calling a {@link Autolinker.matcher.Matcher} directly), then this\n * offset is corrected after the Matcher itself has done its job.\n *\n * @private\n * @param {Number} offset\n */\n AbstractMatch.prototype.setOffset = function (offset) {\n this.offset = offset;\n };\n /**\n * Returns the offset of where the match was made in the input string. This\n * is the 0-based index of the match.\n *\n * @return {Number}\n */\n AbstractMatch.prototype.getOffset = function () {\n return this.offset;\n };\n /**\n * Returns the CSS class suffix(es) for this match.\n *\n * A CSS class suffix is appended to the {@link Autolinker#className} in\n * the {@link Autolinker.AnchorTagBuilder} when a match is translated into\n * an anchor tag.\n *\n * For example, if {@link Autolinker#className} was configured as 'myLink',\n * and this method returns `[ 'url' ]`, the final class name of the element\n * will become: 'myLink myLink-url'.\n *\n * The match may provide multiple CSS class suffixes to be appended to the\n * {@link Autolinker#className} in order to facilitate better styling\n * options for different match criteria. See {@link Autolinker.match.Mention}\n * for an example.\n *\n * By default, this method returns a single array with the match's\n * {@link #getType type} name, but may be overridden by subclasses.\n *\n * @return {String[]}\n */\n AbstractMatch.prototype.getCssClassSuffixes = function () {\n return [this.type];\n };\n /**\n * Builds and returns an {@link Autolinker.HtmlTag} instance based on the\n * Match.\n *\n * This can be used to easily generate anchor tags from matches, and either\n * return their HTML string, or modify them before doing so.\n *\n * Example Usage:\n *\n * var tag = match.buildTag();\n * tag.addClass( 'cordova-link' );\n * tag.setAttr( 'target', '_system' );\n *\n * tag.toAnchorString(); // Google\n *\n * Example Usage in {@link Autolinker#replaceFn}:\n *\n * var html = Autolinker.link( \"Test google.com\", {\n * replaceFn : function( match ) {\n * var tag = match.buildTag(); // returns an {@link Autolinker.HtmlTag} instance\n * tag.setAttr( 'rel', 'nofollow' );\n *\n * return tag;\n * }\n * } );\n *\n * // generated html:\n * // Test google.com\n */\n AbstractMatch.prototype.buildTag = function () {\n return this.tagBuilder.build(this);\n };\n return AbstractMatch;\n}();\nexport { AbstractMatch };\n","// NOTE: THIS IS A GENERATED FILE\n// To update with the latest TLD list, run `npm run update-tld-regex`\nexport var tldRegexStr = '(?:xn--vermgensberatung-pwb|xn--vermgensberater-ctb|xn--clchc0ea0b2g2a9gcd|xn--w4r85el8fhu5dnra|northwesternmutual|travelersinsurance|vermögensberatung|xn--5su34j936bgsg|xn--bck1b9a5dre4c|xn--mgbah1a3hjkrd|xn--mgbai9azgqp6j|xn--mgberp4a5d4ar|xn--xkc2dl3a5ee0h|vermögensberater|xn--fzys8d69uvgm|xn--mgba7c0bbn0a|xn--mgbcpq6gpa1a|xn--xkc2al3hye2a|americanexpress|kerryproperties|sandvikcoromant|xn--i1b6b1a6a2e|xn--kcrx77d1x4a|xn--lgbbat1ad8j|xn--mgba3a4f16a|xn--mgbaakc7dvf|xn--mgbc0a9azcg|xn--nqv7fs00ema|americanfamily|bananarepublic|cancerresearch|cookingchannel|kerrylogistics|weatherchannel|xn--54b7fta0cc|xn--6qq986b3xl|xn--80aqecdr1a|xn--b4w605ferd|xn--fiq228c5hs|xn--h2breg3eve|xn--jlq480n2rg|xn--jlq61u9w7b|xn--mgba3a3ejt|xn--mgbaam7a8h|xn--mgbayh7gpa|xn--mgbbh1a71e|xn--mgbca7dzdo|xn--mgbi4ecexp|xn--mgbx4cd0ab|xn--rvc1e0am3e|international|lifeinsurance|travelchannel|wolterskluwer|xn--cckwcxetd|xn--eckvdtc9d|xn--fpcrj9c3d|xn--fzc2c9e2c|xn--h2brj9c8c|xn--tiq49xqyj|xn--yfro4i67o|xn--ygbi2ammx|construction|lplfinancial|scholarships|versicherung|xn--3e0b707e|xn--45br5cyl|xn--4dbrk0ce|xn--80adxhks|xn--80asehdb|xn--8y0a063a|xn--gckr3f0f|xn--mgb9awbf|xn--mgbab2bd|xn--mgbgu82a|xn--mgbpl2fh|xn--mgbt3dhd|xn--mk1bu44c|xn--ngbc5azd|xn--ngbe9e0a|xn--ogbpf8fl|xn--qcka1pmc|accountants|barclaycard|blackfriday|blockbuster|bridgestone|calvinklein|contractors|creditunion|engineering|enterprises|foodnetwork|investments|kerryhotels|lamborghini|motorcycles|olayangroup|photography|playstation|productions|progressive|redumbrella|williamhill|xn--11b4c3d|xn--1ck2e1b|xn--1qqw23a|xn--2scrj9c|xn--3bst00m|xn--3ds443g|xn--3hcrj9c|xn--42c2d9a|xn--45brj9c|xn--55qw42g|xn--6frz82g|xn--80ao21a|xn--9krt00a|xn--cck2b3b|xn--czr694b|xn--d1acj3b|xn--efvy88h|xn--fct429k|xn--fjq720a|xn--flw351e|xn--g2xx48c|xn--gecrj9c|xn--gk3at1e|xn--h2brj9c|xn--hxt814e|xn--imr513n|xn--j6w193g|xn--jvr189m|xn--kprw13d|xn--kpry57d|xn--mgbbh1a|xn--mgbtx2b|xn--mix891f|xn--nyqy26a|xn--otu796d|xn--pgbs0dh|xn--q9jyb4c|xn--rhqv96g|xn--rovu88b|xn--s9brj9c|xn--ses554g|xn--t60b56a|xn--vuq861b|xn--w4rs40l|xn--xhq521b|xn--zfr164b|சிங்கப்பூர்|accountant|apartments|associates|basketball|bnpparibas|boehringer|capitalone|consulting|creditcard|cuisinella|eurovision|extraspace|foundation|healthcare|immobilien|industries|management|mitsubishi|nextdirect|properties|protection|prudential|realestate|republican|restaurant|schaeffler|tatamotors|technology|university|vlaanderen|volkswagen|xn--30rr7y|xn--3pxu8k|xn--45q11c|xn--4gbrim|xn--55qx5d|xn--5tzm5g|xn--80aswg|xn--90a3ac|xn--9dbq2a|xn--9et52u|xn--c2br7g|xn--cg4bki|xn--czrs0t|xn--czru2d|xn--fiq64b|xn--fiqs8s|xn--fiqz9s|xn--io0a7i|xn--kput3i|xn--mxtq1m|xn--o3cw4h|xn--pssy2u|xn--q7ce6a|xn--unup4y|xn--wgbh1c|xn--wgbl6a|xn--y9a3aq|accenture|alfaromeo|allfinanz|amsterdam|analytics|aquarelle|barcelona|bloomberg|christmas|community|directory|education|equipment|fairwinds|financial|firestone|fresenius|frontdoor|furniture|goldpoint|hisamitsu|homedepot|homegoods|homesense|institute|insurance|kuokgroup|lancaster|landrover|lifestyle|marketing|marshalls|melbourne|microsoft|panasonic|passagens|pramerica|richardli|shangrila|solutions|statebank|statefarm|stockholm|travelers|vacations|xn--90ais|xn--c1avg|xn--d1alf|xn--e1a4c|xn--fhbei|xn--j1aef|xn--j1amh|xn--l1acc|xn--ngbrx|xn--nqv7f|xn--p1acf|xn--qxa6a|xn--tckwe|xn--vhquv|yodobashi|موريتانيا|abudhabi|airforce|allstate|attorney|barclays|barefoot|bargains|baseball|boutique|bradesco|broadway|brussels|builders|business|capetown|catering|catholic|cipriani|cityeats|cleaning|clinique|clothing|commbank|computer|delivery|deloitte|democrat|diamonds|discount|discover|download|engineer|ericsson|etisalat|exchange|feedback|fidelity|firmdale|football|frontier|goodyear|grainger|graphics|guardian|hdfcbank|helsinki|holdings|hospital|infiniti|ipiranga|istanbul|jpmorgan|lighting|lundbeck|marriott|maserati|mckinsey|memorial|merckmsd|mortgage|observer|partners|pharmacy|pictures|plumbing|property|redstone|reliance|saarland|samsclub|security|services|shopping|showtime|softbank|software|stcgroup|supplies|training|vanguard|ventures|verisign|woodside|xn--90ae|xn--node|xn--p1ai|xn--qxam|yokohama|السعودية|abogado|academy|agakhan|alibaba|android|athleta|auction|audible|auspost|avianca|banamex|bauhaus|bentley|bestbuy|booking|brother|bugatti|capital|caravan|careers|channel|charity|chintai|citadel|clubmed|college|cologne|comcast|company|compare|contact|cooking|corsica|country|coupons|courses|cricket|cruises|dentist|digital|domains|exposed|express|farmers|fashion|ferrari|ferrero|finance|fishing|fitness|flights|florist|flowers|forsale|frogans|fujitsu|gallery|genting|godaddy|grocery|guitars|hamburg|hangout|hitachi|holiday|hosting|hoteles|hotmail|hyundai|ismaili|jewelry|juniper|kitchen|komatsu|lacaixa|lanxess|lasalle|latrobe|leclerc|limited|lincoln|markets|monster|netbank|netflix|network|neustar|okinawa|oldnavy|organic|origins|philips|pioneer|politie|realtor|recipes|rentals|reviews|rexroth|samsung|sandvik|schmidt|schwarz|science|shiksha|singles|staples|storage|support|surgery|systems|temasek|theater|theatre|tickets|tiffany|toshiba|trading|walmart|wanggou|watches|weather|website|wedding|whoswho|windows|winners|xfinity|yamaxun|youtube|zuerich|католик|اتصالات|البحرين|الجزائر|العليان|پاکستان|كاثوليك|இந்தியா|abarth|abbott|abbvie|africa|agency|airbus|airtel|alipay|alsace|alstom|amazon|anquan|aramco|author|bayern|beauty|berlin|bharti|bostik|boston|broker|camera|career|casino|center|chanel|chrome|church|circle|claims|clinic|coffee|comsec|condos|coupon|credit|cruise|dating|datsun|dealer|degree|dental|design|direct|doctor|dunlop|dupont|durban|emerck|energy|estate|events|expert|family|flickr|futbol|gallup|garden|george|giving|global|google|gratis|health|hermes|hiphop|hockey|hotels|hughes|imamat|insure|intuit|jaguar|joburg|juegos|kaufen|kinder|kindle|kosher|lancia|latino|lawyer|lefrak|living|locker|london|luxury|madrid|maison|makeup|market|mattel|mobile|monash|mormon|moscow|museum|mutual|nagoya|natura|nissan|nissay|norton|nowruz|office|olayan|online|oracle|orange|otsuka|pfizer|photos|physio|pictet|quebec|racing|realty|reisen|repair|report|review|rocher|rogers|ryukyu|safety|sakura|sanofi|school|schule|search|secure|select|shouji|soccer|social|stream|studio|supply|suzuki|swatch|sydney|taipei|taobao|target|tattoo|tennis|tienda|tjmaxx|tkmaxx|toyota|travel|unicom|viajes|viking|villas|virgin|vision|voting|voyage|vuelos|walter|webcam|xihuan|yachts|yandex|zappos|москва|онлайн|ابوظبي|ارامكو|الاردن|المغرب|امارات|فلسطين|مليسيا|भारतम्|இலங்கை|ファッション|actor|adult|aetna|amfam|amica|apple|archi|audio|autos|azure|baidu|beats|bible|bingo|black|boats|bosch|build|canon|cards|chase|cheap|cisco|citic|click|cloud|coach|codes|crown|cymru|dabur|dance|deals|delta|drive|dubai|earth|edeka|email|epson|faith|fedex|final|forex|forum|gallo|games|gifts|gives|glass|globo|gmail|green|gripe|group|gucci|guide|homes|honda|horse|house|hyatt|ikano|irish|jetzt|koeln|kyoto|lamer|lease|legal|lexus|lilly|linde|lipsy|loans|locus|lotte|lotto|macys|mango|media|miami|money|movie|music|nexus|nikon|ninja|nokia|nowtv|omega|osaka|paris|parts|party|phone|photo|pizza|place|poker|praxi|press|prime|promo|quest|radio|rehab|reise|ricoh|rocks|rodeo|rugby|salon|sener|seven|sharp|shell|shoes|skype|sling|smart|smile|solar|space|sport|stada|store|study|style|sucks|swiss|tatar|tires|tirol|tmall|today|tokyo|tools|toray|total|tours|trade|trust|tunes|tushu|ubank|vegas|video|vodka|volvo|wales|watch|weber|weibo|works|world|xerox|yahoo|ישראל|ایران|بازار|بھارت|سودان|سورية|همراه|भारोत|संगठन|বাংলা|భారత్|ഭാരതം|嘉里大酒店|aarp|able|adac|aero|akdn|ally|amex|arab|army|arpa|arte|asda|asia|audi|auto|baby|band|bank|bbva|beer|best|bike|bing|blog|blue|bofa|bond|book|buzz|cafe|call|camp|care|cars|casa|case|cash|cbre|cern|chat|citi|city|club|cool|coop|cyou|data|date|dclk|deal|dell|desi|diet|dish|docs|dvag|erni|fage|fail|fans|farm|fast|fiat|fido|film|fire|fish|flir|food|ford|free|fund|game|gbiz|gent|ggee|gift|gmbh|gold|golf|goog|guge|guru|hair|haus|hdfc|help|here|hgtv|host|hsbc|icbc|ieee|imdb|immo|info|itau|java|jeep|jobs|jprs|kddi|kids|kiwi|kpmg|kred|land|lego|lgbt|lidl|life|like|limo|link|live|loan|loft|love|ltda|luxe|maif|meet|meme|menu|mini|mint|mobi|moda|moto|name|navy|news|next|nico|nike|ollo|open|page|pars|pccw|pics|ping|pink|play|plus|pohl|porn|post|prod|prof|qpon|read|reit|rent|rest|rich|room|rsvp|ruhr|safe|sale|sarl|save|saxo|scot|seat|seek|sexy|shaw|shia|shop|show|silk|sina|site|skin|sncf|sohu|song|sony|spot|star|surf|talk|taxi|team|tech|teva|tiaa|tips|town|toys|tube|vana|visa|viva|vivo|vote|voto|wang|weir|wien|wiki|wine|work|xbox|yoga|zara|zero|zone|дети|сайт|بارت|بيتك|ڀارت|تونس|شبكة|عراق|عمان|موقع|भारत|ভারত|ভাৰত|ਭਾਰਤ|ભારત|ଭାରତ|ಭಾರತ|ලංකා|アマゾン|グーグル|クラウド|ポイント|组织机构|電訊盈科|香格里拉|aaa|abb|abc|aco|ads|aeg|afl|aig|anz|aol|app|art|aws|axa|bar|bbc|bbt|bcg|bcn|bet|bid|bio|biz|bms|bmw|bom|boo|bot|box|buy|bzh|cab|cal|cam|car|cat|cba|cbn|cbs|ceo|cfa|cfd|com|cpa|crs|dad|day|dds|dev|dhl|diy|dnp|dog|dot|dtv|dvr|eat|eco|edu|esq|eus|fan|fit|fly|foo|fox|frl|ftr|fun|fyi|gal|gap|gay|gdn|gea|gle|gmo|gmx|goo|gop|got|gov|hbo|hiv|hkt|hot|how|ibm|ice|icu|ifm|inc|ing|ink|int|ist|itv|jcb|jio|jll|jmp|jnj|jot|joy|kfh|kia|kim|kpn|krd|lat|law|lds|llc|llp|lol|lpl|ltd|man|map|mba|med|men|mil|mit|mlb|mls|mma|moe|moi|mom|mov|msd|mtn|mtr|nab|nba|nec|net|new|nfl|ngo|nhk|now|nra|nrw|ntt|nyc|obi|one|ong|onl|ooo|org|ott|ovh|pay|pet|phd|pid|pin|pnc|pro|pru|pub|pwc|red|ren|ril|rio|rip|run|rwe|sap|sas|sbi|sbs|sca|scb|ses|sew|sex|sfr|ski|sky|soy|spa|srl|stc|tab|tax|tci|tdk|tel|thd|tjx|top|trv|tui|tvs|ubs|uno|uol|ups|vet|vig|vin|vip|wed|win|wme|wow|wtc|wtf|xin|xxx|xyz|you|yun|zip|бел|ком|қаз|мкд|мон|орг|рус|срб|укр|հայ|קום|عرب|قطر|كوم|مصر|कॉम|नेट|คอม|ไทย|ລາວ|ストア|セール|みんな|中文网|亚马逊|天主教|我爱你|新加坡|淡马锡|诺基亚|飞利浦|ac|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|bm|bn|bo|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|er|es|et|eu|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|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|su|sv|sx|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|za|zm|zw|ελ|ευ|бг|ею|рф|გე|닷넷|닷컴|삼성|한국|コム|世界|中信|中国|中國|企业|佛山|信息|健康|八卦|公司|公益|台湾|台灣|商城|商店|商标|嘉里|在线|大拿|娱乐|家電|广东|微博|慈善|手机|招聘|政务|政府|新闻|时尚|書籍|机构|游戏|澳門|点看|移动|网址|网店|网站|网络|联通|谷歌|购物|通販|集团|食品|餐厅|香港)';\nexport var tldRegex = new RegExp('^' + tldRegexStr + '$');\n","import { alphaNumericAndMarksRe, letterRe, digitRe } from '../regex-lib';\nimport { tldRegex } from './tld-regex';\n/**\n * A regular expression that is simply the character class of the characters\n * that may be used in a domain name, minus the '-' or '.'\n */\nexport var domainNameCharRegex = alphaNumericAndMarksRe;\n/**\n * The set of characters that will start a URL suffix (i.e. the path, query, and\n * hash part of the URL)\n */\nexport var urlSuffixStartCharsRe = /[\\/?#]/;\n/**\n * The set of characters that are allowed in the URL suffix (i.e. the path,\n * query, and hash part of the URL) which may also form the ending character of\n * the URL.\n *\n * The {@link #urlSuffixNotAllowedAsLastCharRe} are additional allowed URL\n * suffix characters, but (generally) should not be the last character of a URL.\n */\nexport var urlSuffixAllowedSpecialCharsRe = /[-+&@#/%=~_()|'$*\\[\\]{}\\u2713]/;\n/**\n * URL suffix characters (i.e. path, query, and has part of the URL) that are\n * not allowed as the *last character* in the URL suffix as they would normally\n * form the end of a sentence.\n *\n * The {@link #urlSuffixAllowedSpecialCharsRe} contains additional allowed URL\n * suffix characters which are allowed as the last character.\n */\nexport var urlSuffixNotAllowedAsLastCharRe = /[?!:,.;^]/;\n/**\n * Regular expression to match an http:// or https:// scheme.\n */\nexport var httpSchemeRe = /https?:\\/\\//i;\n/**\n * Regular expression to match an http:// or https:// scheme as the prefix of\n * a string.\n */\nexport var httpSchemePrefixRe = new RegExp('^' + httpSchemeRe.source, 'i');\nexport var urlSuffixedCharsNotAllowedAtEndRe = new RegExp(urlSuffixNotAllowedAsLastCharRe.source + '$');\n/**\n * A regular expression used to determine the schemes we should not autolink\n */\nexport var invalidSchemeRe = /^(javascript|vbscript):/i;\n// A regular expression used to determine if the URL is a scheme match (such as\n// 'http://google.com', and as opposed to a \"TLD match\"). This regular\n// expression is used to parse out the host along with if the URL has an\n// authority component (i.e. '//')\n//\n// Capturing groups:\n// 1. '//' if the URL has an authority component, empty string otherwise\n// 2. The host (if one exists). Ex: 'google.com'\n//\n// See https://www.rfc-editor.org/rfc/rfc3986#appendix-A for terminology\nexport var schemeUrlRe = /^[A-Za-z][-.+A-Za-z0-9]*:(\\/\\/)?([^:/]*)/;\n// A regular expression used to determine if the URL is a TLD match (such as\n// 'google.com', and as opposed to a \"scheme match\"). This regular\n// expression is used to help parse out the TLD (top-level domain) of the host.\n//\n// See https://www.rfc-editor.org/rfc/rfc3986#appendix-A for terminology\nexport var tldUrlHostRe = /^(?:\\/\\/)?([^/#?:]+)/; // optionally prefixed with protocol-relative '//' chars\n/**\n * Determines if the given character may start a scheme (ex: 'http').\n */\nexport function isSchemeStartChar(char) {\n return letterRe.test(char);\n}\n/**\n * Determines if the given character is a valid character in a scheme (such as\n * 'http' or 'ssh+git'), but only after the start char (which is handled by\n * {@link isSchemeStartChar}.\n */\nexport function isSchemeChar(char) {\n return letterRe.test(char) || digitRe.test(char) || char === '+' || char === '-' || char === '.';\n}\n/**\n * Determines if the character can begin a domain label, which must be an\n * alphanumeric character and not an underscore or dash.\n *\n * A domain label is a segment of a hostname such as subdomain.google.com.\n */\nexport function isDomainLabelStartChar(char) {\n return alphaNumericAndMarksRe.test(char);\n}\n/**\n * Determines if the character is part of a domain label (but not a domain label\n * start character).\n *\n * A domain label is a segment of a hostname such as subdomain.google.com.\n */\nexport function isDomainLabelChar(char) {\n return char === '_' || isDomainLabelStartChar(char);\n}\n/**\n * Determines if the character is a path character (\"pchar\") as defined by\n * https://tools.ietf.org/html/rfc3986#appendix-A\n *\n * pchar = unreserved / pct-encoded / sub-delims / \":\" / \"@\"\n *\n * unreserved = ALPHA / DIGIT / \"-\" / \".\" / \"_\" / \"~\"\n * pct-encoded = \"%\" HEXDIG HEXDIG\n * sub-delims = \"!\" / \"$\" / \"&\" / \"'\" / \"(\" / \")\"\n * / \"*\" / \"+\" / \",\" / \";\" / \"=\"\n *\n * Note that this implementation doesn't follow the spec exactly, but rather\n * follows URL path characters found out in the wild (spec might be out of date?)\n */\nexport function isPathChar(char) {\n return alphaNumericAndMarksRe.test(char) || urlSuffixAllowedSpecialCharsRe.test(char) || urlSuffixNotAllowedAsLastCharRe.test(char);\n}\n/**\n * Determines if the character given may begin the \"URL Suffix\" section of a\n * URI (i.e. the path, query, or hash section). These are the '/', '?' and '#'\n * characters.\n *\n * See https://tools.ietf.org/html/rfc3986#appendix-A\n */\nexport function isUrlSuffixStartChar(char) {\n return urlSuffixStartCharsRe.test(char);\n}\n/**\n * Determines if the TLD read in the host is a known TLD (Top-Level Domain).\n *\n * Example: 'com' would be a known TLD (for a host of 'google.com'), but\n * 'local' would not (for a domain name of 'my-computer.local').\n */\nexport function isKnownTld(tld) {\n return tldRegex.test(tld.toLowerCase()); // make sure the tld is lowercase for the regex\n}\n/**\n * Determines if the given `url` is a valid scheme-prefixed URL.\n */\nexport function isValidSchemeUrl(url) {\n // If the scheme is 'javascript:' or 'vbscript:', these link\n // types can be dangerous. Don't link them.\n if (invalidSchemeRe.test(url)) {\n return false;\n }\n var schemeMatch = url.match(schemeUrlRe);\n if (!schemeMatch) {\n return false;\n }\n var isAuthorityMatch = !!schemeMatch[1];\n var host = schemeMatch[2];\n if (isAuthorityMatch) {\n // Any match that has an authority ('//' chars) after the scheme is\n // valid, such as 'http://anything'\n return true;\n }\n // If there's no authority ('//' chars), check that we have a hostname\n // that looks valid.\n //\n // The host must contain at least one '.' char and have a domain label\n // with at least one letter to be considered valid.\n //\n // Accept:\n // - git:domain.com (scheme followed by a host\n // Do not accept:\n // - git:something ('something' doesn't look like a host)\n // - version:1.0 ('1.0' doesn't look like a host)\n if (host.indexOf('.') === -1 || !letterRe.test(host)) {\n return false;\n }\n return true;\n}\n/**\n * Determines if the given `url` is a match with a valid TLD.\n */\nexport function isValidTldMatch(url) {\n // TLD URL such as 'google.com', we need to confirm that we have a valid\n // top-level domain\n var tldUrlHostMatch = url.match(tldUrlHostRe);\n if (!tldUrlHostMatch) {\n // At this point, if the URL didn't match our TLD re, it must be invalid\n // (highly unlikely to happen, but just in case)\n return false;\n }\n var host = tldUrlHostMatch[0];\n var hostLabels = host.split('.');\n if (hostLabels.length < 2) {\n // 0 or 1 host label, there's no TLD. Ex: 'localhost'\n return false;\n }\n var tld = hostLabels[hostLabels.length - 1];\n if (!isKnownTld(tld)) {\n return false;\n }\n // TODO: Implement these conditions for TLD matcher:\n // (\n // this.longestDomainLabelLength <= 63 &&\n // this.domainNameLength <= 255\n // );\n return true;\n}\n// Regular expression to confirm a valid IPv4 address (ex: '192.168.0.1')\nvar ipV4Re = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;\n// Regular expression used to split the IPv4 address itself from any port/path/query/hash\nvar ipV4PartRe = /[:/?#]/;\n/**\n * Determines if the given URL is a valid IPv4-prefixed URL.\n */\nexport function isValidIpV4Address(url) {\n // Grab just the IP address\n var ipV4Part = url.split(ipV4PartRe, 1)[0]; // only 1 result needed\n return ipV4Re.test(ipV4Part);\n}\n","import { __extends } from \"tslib\";\nimport { AbstractMatch } from './abstract-match';\nimport { httpSchemePrefixRe } from '../parser/uri-utils';\n/**\n * A regular expression used to remove the 'www.' from URLs.\n */\nvar wwwPrefixRegex = /^(https?:\\/\\/)?(www\\.)?/i;\n/**\n * The regular expression used to remove the protocol-relative '//' from a URL\n * string, for purposes of formatting the anchor text. A protocol-relative URL\n * is, for example, \"//yahoo.com\"\n */\nvar protocolRelativeRegex = /^\\/\\//;\n/**\n * @class Autolinker.match.Url\n * @extends Autolinker.match.AbstractMatch\n *\n * Represents a Url match found in an input string which should be Autolinked.\n *\n * See this class's superclass ({@link Autolinker.match.Match}) for more details.\n */\nvar UrlMatch = /** @class */function (_super) {\n __extends(UrlMatch, _super);\n /**\n * @method constructor\n * @param {Object} cfg The configuration properties for the Match\n * instance, specified in an Object (map).\n */\n function UrlMatch(cfg) {\n var _this = _super.call(this, cfg) || this;\n /**\n * @public\n * @property {'url'} type\n *\n * A string name for the type of match that this class represents. Can be\n * used in a TypeScript discriminating union to type-narrow from the\n * `Match` type.\n */\n _this.type = 'url';\n /**\n * @cfg {String} url (required)\n *\n * The url that was matched.\n */\n _this.url = ''; // default value just to get the above doc comment in the ES5 output and documentation generator\n /**\n * @cfg {\"scheme\"/\"www\"/\"tld\"} urlMatchType (required)\n *\n * The type of URL match that this class represents. This helps to determine\n * if the match was made in the original text with a prefixed scheme (ex:\n * 'http://www.google.com'), a prefixed 'www' (ex: 'www.google.com'), or\n * was matched by a known top-level domain (ex: 'google.com').\n */\n _this.urlMatchType = 'scheme'; // default value just to get the above doc comment in the ES5 output and documentation generator\n /**\n * @cfg {Boolean} protocolRelativeMatch (required)\n *\n * `true` if the URL is a protocol-relative match. A protocol-relative match\n * is a URL that starts with '//', and will be either http:// or https://\n * based on the protocol that the site is loaded under.\n */\n _this.protocolRelativeMatch = false; // default value just to get the above doc comment in the ES5 output and documentation generator\n /**\n * @cfg {Object} stripPrefix (required)\n *\n * The Object form of {@link Autolinker#cfg-stripPrefix}.\n */\n _this.stripPrefix = {\n scheme: true,\n www: true\n }; // default value just to get the above doc comment in the ES5 output and documentation generator\n /**\n * @cfg {Boolean} stripTrailingSlash (required)\n * @inheritdoc Autolinker#cfg-stripTrailingSlash\n */\n _this.stripTrailingSlash = true; // default value just to get the above doc comment in the ES5 output and documentation generator\n /**\n * @cfg {Boolean} decodePercentEncoding (required)\n * @inheritdoc Autolinker#cfg-decodePercentEncoding\n */\n _this.decodePercentEncoding = true; // default value just to get the above doc comment in the ES5 output and documentation generator\n /**\n * @private\n * @property {Boolean} protocolPrepended\n *\n * Will be set to `true` if the 'http://' protocol has been prepended to the {@link #url} (because the\n * {@link #url} did not have a protocol)\n */\n _this.protocolPrepended = false;\n _this.urlMatchType = cfg.urlMatchType;\n _this.url = cfg.url;\n _this.protocolRelativeMatch = cfg.protocolRelativeMatch;\n _this.stripPrefix = cfg.stripPrefix;\n _this.stripTrailingSlash = cfg.stripTrailingSlash;\n _this.decodePercentEncoding = cfg.decodePercentEncoding;\n return _this;\n }\n /**\n * Returns a string name for the type of match that this class represents.\n * For the case of UrlMatch, returns 'url'.\n *\n * @return {String}\n */\n UrlMatch.prototype.getType = function () {\n return 'url';\n };\n /**\n * Returns a string name for the type of URL match that this class\n * represents.\n *\n * This helps to determine if the match was made in the original text with a\n * prefixed scheme (ex: 'http://www.google.com'), a prefixed 'www' (ex:\n * 'www.google.com'), or was matched by a known top-level domain (ex:\n * 'google.com').\n *\n * @return {\"scheme\"/\"www\"/\"tld\"}\n */\n UrlMatch.prototype.getUrlMatchType = function () {\n return this.urlMatchType;\n };\n /**\n * Returns the url that was matched, assuming the protocol to be 'http://' if the original\n * match was missing a protocol.\n *\n * @return {String}\n */\n UrlMatch.prototype.getUrl = function () {\n var url = this.url;\n // if the url string doesn't begin with a scheme, assume 'http://'\n if (!this.protocolRelativeMatch && this.urlMatchType !== 'scheme' && !this.protocolPrepended) {\n url = this.url = 'http://' + url;\n this.protocolPrepended = true;\n }\n return url;\n };\n /**\n * Returns the anchor href that should be generated for the match.\n *\n * @return {String}\n */\n UrlMatch.prototype.getAnchorHref = function () {\n var url = this.getUrl();\n return url.replace(/&/g, '&'); // any &'s in the URL should be converted back to '&' if they were displayed as & in the source html\n };\n /**\n * Returns the anchor text that should be generated for the match.\n *\n * @return {String}\n */\n UrlMatch.prototype.getAnchorText = function () {\n var anchorText = this.getMatchedText();\n if (this.protocolRelativeMatch) {\n // Strip off any protocol-relative '//' from the anchor text\n anchorText = stripProtocolRelativePrefix(anchorText);\n }\n if (this.stripPrefix.scheme) {\n anchorText = stripSchemePrefix(anchorText);\n }\n if (this.stripPrefix.www) {\n anchorText = stripWwwPrefix(anchorText);\n }\n if (this.stripTrailingSlash) {\n anchorText = removeTrailingSlash(anchorText); // remove trailing slash, if there is one\n }\n if (this.decodePercentEncoding) {\n anchorText = removePercentEncoding(anchorText);\n }\n return anchorText;\n };\n return UrlMatch;\n}(AbstractMatch);\nexport { UrlMatch };\n// Utility Functionality\n/**\n * Strips the scheme prefix (such as \"http://\" or \"https://\") from the given\n * `url`.\n *\n * @private\n * @param {String} url The text of the anchor that is being generated, for\n * which to strip off the url scheme.\n * @return {String} The `url`, with the scheme stripped.\n */\nfunction stripSchemePrefix(url) {\n return url.replace(httpSchemePrefixRe, '');\n}\n/**\n * Strips the 'www' prefix from the given `url`.\n *\n * @private\n * @param {String} url The text of the anchor that is being generated, for\n * which to strip off the 'www' if it exists.\n * @return {String} The `url`, with the 'www' stripped.\n */\nfunction stripWwwPrefix(url) {\n return url.replace(wwwPrefixRegex, '$1'); // leave any scheme ($1), it one exists\n}\n/**\n * Strips any protocol-relative '//' from the anchor text.\n *\n * @private\n * @param {String} text The text of the anchor that is being generated, for which to strip off the\n * protocol-relative prefix (such as stripping off \"//\")\n * @return {String} The `anchorText`, with the protocol-relative prefix stripped.\n */\nfunction stripProtocolRelativePrefix(text) {\n return text.replace(protocolRelativeRegex, '');\n}\n/**\n * Removes any trailing slash from the given `anchorText`, in preparation for the text to be displayed.\n *\n * @private\n * @param {String} anchorText The text of the anchor that is being generated, for which to remove any trailing\n * slash ('/') that may exist.\n * @return {String} The `anchorText`, with the trailing slash removed.\n */\nfunction removeTrailingSlash(anchorText) {\n if (anchorText.charAt(anchorText.length - 1) === '/') {\n anchorText = anchorText.slice(0, -1);\n }\n return anchorText;\n}\n/**\n * Decodes percent-encoded characters from the given `anchorText`, in\n * preparation for the text to be displayed.\n *\n * @private\n * @param {String} anchorText The text of the anchor that is being\n * generated, for which to decode any percent-encoded characters.\n * @return {String} The `anchorText`, with the percent-encoded characters\n * decoded.\n */\nfunction removePercentEncoding(anchorText) {\n // First, convert a few of the known % encodings to the corresponding\n // HTML entities that could accidentally be interpretted as special\n // HTML characters\n var preProcessedEntityAnchorText = anchorText.replace(/%22/gi, '"') // \" char\n .replace(/%26/gi, '&') // & char\n .replace(/%27/gi, ''') // ' char\n .replace(/%3C/gi, '<') // < char\n .replace(/%3E/gi, '>'); // > char\n try {\n // Now attempt to decode the rest of the anchor text\n return decodeURIComponent(preProcessedEntityAnchorText);\n } catch (e) {\n // Invalid % escape sequence in the anchor text\n return preProcessedEntityAnchorText;\n }\n}\n","import { alphaNumericAndMarksCharsStr, alphaNumericAndMarksRe } from '../regex-lib';\nimport { isKnownTld } from './uri-utils';\n/**\n * A regular expression to match a 'mailto:' prefix on an email address.\n */\nexport var mailtoSchemePrefixRe = /^mailto:/i;\n/**\n * Regular expression for all of the valid characters of the local part of an\n * email address.\n */\nvar emailLocalPartCharRegex = new RegExp(\"[\".concat(alphaNumericAndMarksCharsStr, \"!#$%&'*+/=?^_`{|}~-]\"));\n/**\n * Determines if the given character may start the \"local part\" of an email\n * address. The local part is the part to the left of the '@' sign.\n *\n * Technically according to the email spec, any of the characters in the\n * {@link emailLocalPartCharRegex} can start an email address (including any of\n * the special characters), but this is so rare in the wild and the\n * implementation is much simpler by only starting an email address with a word\n * character. This is especially important when matching the '{' character which\n * generally starts a brace that isn't part of the email address.\n */\nexport function isEmailLocalPartStartChar(char) {\n return alphaNumericAndMarksRe.test(char);\n}\n/**\n * Determines if the given character can be part of the \"local part\" of an email\n * address. The local part is the part to the left of the '@' sign.\n */\nexport function isEmailLocalPartChar(char) {\n return emailLocalPartCharRegex.test(char);\n}\n/**\n * Determines if the given email address is valid. We consider it valid if it\n * has a valid TLD in its host.\n *\n * @param emailAddress email address\n * @return true is email have valid TLD, false otherwise\n */\nexport function isValidEmail(emailAddress) {\n var emailAddressTld = emailAddress.split('.').pop() || '';\n return isKnownTld(emailAddressTld);\n}\n","import { __extends } from \"tslib\";\nimport { AbstractMatch } from './abstract-match';\n/**\n * @class Autolinker.match.Email\n * @extends Autolinker.match.AbstractMatch\n *\n * Represents a Email match found in an input string which should be Autolinked.\n *\n * See this class's superclass ({@link Autolinker.match.Match}) for more details.\n */\nvar EmailMatch = /** @class */function (_super) {\n __extends(EmailMatch, _super);\n /**\n * @method constructor\n * @param {Object} cfg The configuration properties for the Match\n * instance, specified in an Object (map).\n */\n function EmailMatch(cfg) {\n var _this = _super.call(this, cfg) || this;\n /**\n * @public\n * @property {'email'} type\n *\n * A string name for the type of match that this class represents. Can be\n * used in a TypeScript discriminating union to type-narrow from the\n * `Match` type.\n */\n _this.type = 'email';\n /**\n * @cfg {String} email (required)\n *\n * The email address that was matched.\n */\n _this.email = ''; // default value just to get the above doc comment in the ES5 output and documentation generator\n _this.email = cfg.email;\n return _this;\n }\n /**\n * Returns a string name for the type of match that this class represents.\n * For the case of EmailMatch, returns 'email'.\n *\n * @return {String}\n */\n EmailMatch.prototype.getType = function () {\n return 'email';\n };\n /**\n * Returns the email address that was matched.\n *\n * @return {String}\n */\n EmailMatch.prototype.getEmail = function () {\n return this.email;\n };\n /**\n * Returns the anchor href that should be generated for the match.\n *\n * @return {String}\n */\n EmailMatch.prototype.getAnchorHref = function () {\n return 'mailto:' + this.email;\n };\n /**\n * Returns the anchor text that should be generated for the match.\n *\n * @return {String}\n */\n EmailMatch.prototype.getAnchorText = function () {\n return this.email;\n };\n return EmailMatch;\n}(AbstractMatch);\nexport { EmailMatch };\n","import { alphaNumericAndMarksRe } from '../regex-lib';\n/**\n * Determines if the given `char` is a an allowed character in a hashtag. These\n * are underscores or any alphanumeric char.\n */\nexport function isHashtagTextChar(char) {\n return char === '_' || alphaNumericAndMarksRe.test(char);\n}\n/**\n * Determines if a hashtag match is valid.\n */\nexport function isValidHashtag(hashtag) {\n // Max length of 140 for a hashtag ('#' char + 139 word chars)\n return hashtag.length <= 140;\n}\nexport var hashtagServices = ['twitter', 'facebook', 'instagram', 'tiktok'];\n","import { __extends } from \"tslib\";\nimport { assertNever } from '../utils';\nimport { AbstractMatch } from './abstract-match';\n/**\n * @class Autolinker.match.Hashtag\n * @extends Autolinker.match.AbstractMatch\n *\n * Represents a Hashtag match found in an input string which should be\n * Autolinked.\n *\n * See this class's superclass ({@link Autolinker.match.Match}) for more\n * details.\n */\nvar HashtagMatch = /** @class */function (_super) {\n __extends(HashtagMatch, _super);\n /**\n * @method constructor\n * @param {Object} cfg The configuration properties for the Match\n * instance, specified in an Object (map).\n */\n function HashtagMatch(cfg) {\n var _this = _super.call(this, cfg) || this;\n /**\n * @public\n * @property {'hashtag'} type\n *\n * A string name for the type of match that this class represents. Can be\n * used in a TypeScript discriminating union to type-narrow from the\n * `Match` type.\n */\n _this.type = 'hashtag';\n /**\n * @cfg {String} serviceName\n *\n * The service to point hashtag matches to. See {@link Autolinker#hashtag}\n * for available values.\n */\n _this.serviceName = 'twitter'; // default value just to get the above doc comment in the ES5 output and documentation generator\n /**\n * @cfg {String} hashtag (required)\n *\n * The HashtagMatch that was matched, without the '#'.\n */\n _this.hashtag = ''; // default value just to get the above doc comment in the ES5 output and documentation generator\n _this.serviceName = cfg.serviceName;\n _this.hashtag = cfg.hashtag;\n return _this;\n }\n /**\n * Returns a string name for the type of match that this class represents.\n * For the case of HashtagMatch, returns 'hashtag'.\n *\n * @return {String}\n */\n HashtagMatch.prototype.getType = function () {\n return 'hashtag';\n };\n /**\n * Returns the configured {@link #serviceName} to point the HashtagMatch to.\n * Ex: 'facebook', 'twitter'.\n *\n * @return {String}\n */\n HashtagMatch.prototype.getServiceName = function () {\n return this.serviceName;\n };\n /**\n * Returns the matched hashtag, without the '#' character.\n *\n * @return {String}\n */\n HashtagMatch.prototype.getHashtag = function () {\n return this.hashtag;\n };\n /**\n * Returns the anchor href that should be generated for the match.\n *\n * @return {String}\n */\n HashtagMatch.prototype.getAnchorHref = function () {\n var serviceName = this.serviceName,\n hashtag = this.hashtag;\n switch (serviceName) {\n case 'twitter':\n return 'https://twitter.com/hashtag/' + hashtag;\n case 'facebook':\n return 'https://www.facebook.com/hashtag/' + hashtag;\n case 'instagram':\n return 'https://instagram.com/explore/tags/' + hashtag;\n case 'tiktok':\n return 'https://www.tiktok.com/tag/' + hashtag;\n default:\n // Shouldn't happen because Autolinker's constructor should block any invalid values, but just in case\n assertNever(serviceName);\n throw new Error(\"Invalid hashtag service: \".concat(serviceName));\n }\n };\n /**\n * Returns the anchor text that should be generated for the match.\n *\n * @return {String}\n */\n HashtagMatch.prototype.getAnchorText = function () {\n return '#' + this.hashtag;\n };\n /**\n * Returns the CSS class suffixes that should be used on a tag built with\n * the match. See {@link Autolinker.match.Match#getCssClassSuffixes} for\n * details.\n *\n * @return {String[]}\n */\n HashtagMatch.prototype.getCssClassSuffixes = function () {\n var cssClassSuffixes = _super.prototype.getCssClassSuffixes.call(this),\n serviceName = this.getServiceName();\n if (serviceName) {\n cssClassSuffixes.push(serviceName);\n }\n return cssClassSuffixes;\n };\n return HashtagMatch;\n}(AbstractMatch);\nexport { HashtagMatch };\n","var mentionRegexes = {\n twitter: /^@\\w{1,15}$/,\n instagram: /^@[_\\w]{1,30}$/,\n soundcloud: /^@[-a-z0-9_]{3,25}$/,\n // TikTok usernames are 1-24 characters containing letters, numbers, underscores\n // and periods, but cannot end in a period: https://support.tiktok.com/en/getting-started/setting-up-your-profile/changing-your-username\n tiktok: /^@[.\\w]{1,23}[\\w]$/\n};\n// Regex that allows for all possible mention characters for any service. We'll\n// confirm the match based on the user-configured service name after a match is\n// found.\nvar mentionTextCharRe = /[-\\w.]/;\n/**\n * Determines if the given character can be part of a mention's text characters.\n */\nexport function isMentionTextChar(char) {\n return mentionTextCharRe.test(char);\n}\n/**\n * Determines if the given `mention` text is valid.\n */\nexport function isValidMention(mention, serviceName) {\n var re = mentionRegexes[serviceName];\n return re.test(mention);\n}\nexport var mentionServices = ['twitter', 'instagram', 'soundcloud', 'tiktok'];\n","import { __extends } from \"tslib\";\nimport { AbstractMatch } from './abstract-match';\n/**\n * @class Autolinker.match.Mention\n * @extends Autolinker.match.AbstractMatch\n *\n * Represents a Mention match found in an input string which should be Autolinked.\n *\n * See this class's superclass ({@link Autolinker.match.Match}) for more details.\n */\nvar MentionMatch = /** @class */function (_super) {\n __extends(MentionMatch, _super);\n /**\n * @method constructor\n * @param {Object} cfg The configuration properties for the Match\n * instance, specified in an Object (map).\n */\n function MentionMatch(cfg) {\n var _this = _super.call(this, cfg) || this;\n /**\n * @public\n * @property {'mention'} type\n *\n * A string name for the type of match that this class represents. Can be\n * used in a TypeScript discriminating union to type-narrow from the\n * `Match` type.\n */\n _this.type = 'mention';\n /**\n * @cfg {String} serviceName\n *\n * The service to point mention matches to. See {@link Autolinker#mention}\n * for available values.\n */\n _this.serviceName = 'twitter'; // default value just to get the above doc comment in the ES5 output and documentation generator\n /**\n * @cfg {String} mention (required)\n *\n * The Mention that was matched, without the '@' character.\n */\n _this.mention = ''; // default value just to get the above doc comment in the ES5 output and documentation generator\n _this.mention = cfg.mention;\n _this.serviceName = cfg.serviceName;\n return _this;\n }\n /**\n * Returns a string name for the type of match that this class represents.\n * For the case of MentionMatch, returns 'mention'.\n *\n * @return {String}\n */\n MentionMatch.prototype.getType = function () {\n return 'mention';\n };\n /**\n * Returns the mention, without the '@' character.\n *\n * @return {String}\n */\n MentionMatch.prototype.getMention = function () {\n return this.mention;\n };\n /**\n * Returns the configured {@link #serviceName} to point the mention to.\n * Ex: 'instagram', 'twitter', 'soundcloud'.\n *\n * @return {String}\n */\n MentionMatch.prototype.getServiceName = function () {\n return this.serviceName;\n };\n /**\n * Returns the anchor href that should be generated for the match.\n *\n * @return {String}\n */\n MentionMatch.prototype.getAnchorHref = function () {\n switch (this.serviceName) {\n case 'twitter':\n return 'https://twitter.com/' + this.mention;\n case 'instagram':\n return 'https://instagram.com/' + this.mention;\n case 'soundcloud':\n return 'https://soundcloud.com/' + this.mention;\n case 'tiktok':\n return 'https://www.tiktok.com/@' + this.mention;\n default:\n // Shouldn't happen because Autolinker's constructor should block any invalid values, but just in case.\n throw new Error('Unknown service name to point mention to: ' + this.serviceName);\n }\n };\n /**\n * Returns the anchor text that should be generated for the match.\n *\n * @return {String}\n */\n MentionMatch.prototype.getAnchorText = function () {\n return '@' + this.mention;\n };\n /**\n * Returns the CSS class suffixes that should be used on a tag built with\n * the match. See {@link Autolinker.match.Match#getCssClassSuffixes} for\n * details.\n *\n * @return {String[]}\n */\n MentionMatch.prototype.getCssClassSuffixes = function () {\n var cssClassSuffixes = _super.prototype.getCssClassSuffixes.call(this),\n serviceName = this.getServiceName();\n if (serviceName) {\n cssClassSuffixes.push(serviceName);\n }\n return cssClassSuffixes;\n };\n return MentionMatch;\n}(AbstractMatch);\nexport { MentionMatch };\n","// Regex that holds the characters used to separate segments of a phone number\nvar separatorCharRe = /[-. ]/;\n// Regex that specifies any delimiter char that allows us to treat the number as\n// a phone number rather than just any other number that could appear in text.\nvar hasDelimCharsRe = /[-. ()]/;\n// \"Pause\" and \"Wait\" control chars\nvar controlCharRe = /[,;]/;\n// Over the years, many people have added to this regex, but it should have been\n// split up by country. Maybe one day we can break this down.\nvar mostPhoneNumbers = /(?:(?:(?:(\\+)?\\d{1,3}[-. ]?)?\\(?\\d{3}\\)?[-. ]?\\d{3}[-. ]?\\d{4})|(?:(\\+)(?:9[976]\\d|8[987530]\\d|6[987]\\d|5[90]\\d|42\\d|3[875]\\d|2[98654321]\\d|9[8543210]|8[6421]|6[6543210]|5[87654321]|4[987654310]|3[9643210]|2[70]|7|1)[-. ]?(?:\\d[-. ]?){6,12}\\d+))([,;]+[0-9]+#?)*/;\n// Regex for Japanese phone numbers\nvar japanesePhoneRe = /(0([1-9]-?[1-9]\\d{3}|[1-9]{2}-?\\d{3}|[1-9]{2}\\d{1}-?\\d{2}|[1-9]{2}\\d{2}-?\\d{1})-?\\d{4}|0[789]0-?\\d{4}-?\\d{4}|050-?\\d{4}-?\\d{4})/;\n// Combined regex\nvar validPhoneNumberRe = new RegExp(\"^\".concat(mostPhoneNumbers.source, \"|\").concat(japanesePhoneRe.source, \"$\"));\n/**\n * Determines if the character is a phone number separator character (i.e.\n * '-', '.', or ' ' (space))\n */\nexport function isPhoneNumberSeparatorChar(char) {\n return separatorCharRe.test(char);\n}\n/**\n * Determines if the character is a control character in a phone number. Control\n * characters are as follows:\n *\n * - ',': A 1 second pause. Useful for dialing extensions once the main phone number has been reached\n * - ';': A \"wait\" that waits for the user to take action (tap something, for instance on a smart phone)\n */\nexport function isPhoneNumberControlChar(char) {\n return controlCharRe.test(char);\n}\n/**\n * Determines if the given phone number text found in a string is a valid phone\n * number.\n *\n * Our state machine parser is simplified to grab anything that looks like a\n * phone number, and this function confirms the match.\n */\nexport function isValidPhoneNumber(phoneNumberText) {\n // We'll only consider the match as a phone number if there is some kind of\n // delimiter character (a prefixed '+' sign, or separator chars).\n //\n // Accepts:\n // (123) 456-7890\n // +38755233976\n // Does not accept:\n // 1234567890 (no delimiter chars - may just be a random number that's not a phone number)\n var hasDelimiters = phoneNumberText.charAt(0) === '+' || hasDelimCharsRe.test(phoneNumberText);\n return hasDelimiters && validPhoneNumberRe.test(phoneNumberText);\n}\n","import { __extends } from \"tslib\";\nimport { AbstractMatch } from './abstract-match';\n/**\n * @class Autolinker.match.Phone\n * @extends Autolinker.match.AbstractMatch\n *\n * Represents a Phone number match found in an input string which should be\n * Autolinked.\n *\n * See this class's superclass ({@link Autolinker.match.Match}) for more\n * details.\n */\nvar PhoneMatch = /** @class */function (_super) {\n __extends(PhoneMatch, _super);\n /**\n * @method constructor\n * @param {Object} cfg The configuration properties for the Match\n * instance, specified in an Object (map).\n */\n function PhoneMatch(cfg) {\n var _this = _super.call(this, cfg) || this;\n /**\n * @public\n * @property {'phone'} type\n *\n * A string name for the type of match that this class represents. Can be\n * used in a TypeScript discriminating union to type-narrow from the\n * `Match` type.\n */\n _this.type = 'phone';\n /**\n * @protected\n * @property {String} number (required)\n *\n * The phone number that was matched, without any delimiter characters.\n *\n * Note: This is a string to allow for prefixed 0's.\n */\n _this.number = ''; // default value just to get the above doc comment in the ES5 output and documentation generator\n /**\n * @protected\n * @property {Boolean} plusSign (required)\n *\n * `true` if the matched phone number started with a '+' sign. We'll include\n * it in the `tel:` URL if so, as this is needed for international numbers.\n *\n * Ex: '+1 (123) 456 7879'\n */\n _this.plusSign = false; // default value just to get the above doc comment in the ES5 output and documentation generator\n _this.number = cfg.number;\n _this.plusSign = cfg.plusSign;\n return _this;\n }\n /**\n * Returns a string name for the type of match that this class represents.\n * For the case of PhoneMatch, returns 'phone'.\n *\n * @return {String}\n */\n PhoneMatch.prototype.getType = function () {\n return 'phone';\n };\n /**\n * Returns the phone number that was matched as a string, without any\n * delimiter characters.\n *\n * Note: This is a string to allow for prefixed 0's.\n *\n * @return {String}\n */\n PhoneMatch.prototype.getPhoneNumber = function () {\n return this.number;\n };\n /**\n * Alias of {@link #getPhoneNumber}, returns the phone number that was\n * matched as a string, without any delimiter characters.\n *\n * Note: This is a string to allow for prefixed 0's.\n *\n * @return {String}\n */\n PhoneMatch.prototype.getNumber = function () {\n return this.getPhoneNumber();\n };\n /**\n * Returns the anchor href that should be generated for the match.\n *\n * @return {String}\n */\n PhoneMatch.prototype.getAnchorHref = function () {\n return 'tel:' + (this.plusSign ? '+' : '') + this.number;\n };\n /**\n * Returns the anchor text that should be generated for the match.\n *\n * @return {String}\n */\n PhoneMatch.prototype.getAnchorText = function () {\n return this.matchedText;\n };\n return PhoneMatch;\n}(AbstractMatch);\nexport { PhoneMatch };\n","import { alphaNumericAndMarksRe, digitRe } from '../regex-lib';\nimport { UrlMatch } from '../match/url-match';\nimport { remove, assertNever } from '../utils';\nimport { httpSchemeRe, isDomainLabelChar, isDomainLabelStartChar, isPathChar, isSchemeChar, isSchemeStartChar, isUrlSuffixStartChar, isValidIpV4Address, isValidSchemeUrl, isValidTldMatch, urlSuffixedCharsNotAllowedAtEndRe } from './uri-utils';\nimport { isEmailLocalPartChar, isEmailLocalPartStartChar, isValidEmail, mailtoSchemePrefixRe } from './email-utils';\nimport { EmailMatch } from '../match/email-match';\nimport { isHashtagTextChar, isValidHashtag } from './hashtag-utils';\nimport { HashtagMatch } from '../match/hashtag-match';\nimport { isMentionTextChar, isValidMention } from './mention-utils';\nimport { MentionMatch } from '../match/mention-match';\nimport { isPhoneNumberSeparatorChar, isPhoneNumberControlChar, isValidPhoneNumber } from './phone-number-utils';\nimport { PhoneMatch } from '../match/phone-match';\n// For debugging: search for and uncomment other \"For debugging\" lines\n// import CliTable from 'cli-table';\n/**\n * Parses URL, email, twitter, mention, and hashtag matches from the given\n * `text`.\n */\nexport function parseMatches(text, args) {\n var tagBuilder = args.tagBuilder;\n var stripPrefix = args.stripPrefix;\n var stripTrailingSlash = args.stripTrailingSlash;\n var decodePercentEncoding = args.decodePercentEncoding;\n var hashtagServiceName = args.hashtagServiceName;\n var mentionServiceName = args.mentionServiceName;\n var matches = [];\n var textLen = text.length;\n // An array of all active state machines. Empty array means we're in the\n // \"no url\" state\n var stateMachines = [];\n // For debugging: search for and uncomment other \"For debugging\" lines\n // const table = new CliTable({\n // head: ['charIdx', 'char', 'states', 'charIdx', 'startIdx', 'reached accept state'],\n // });\n var charIdx = 0;\n for (; charIdx < textLen; charIdx++) {\n var char = text.charAt(charIdx);\n if (stateMachines.length === 0) {\n stateNoMatch(char);\n } else {\n // Must loop through the state machines backwards for when one\n // is removed\n for (var stateIdx = stateMachines.length - 1; stateIdx >= 0; stateIdx--) {\n var stateMachine = stateMachines[stateIdx];\n switch (stateMachine.state) {\n // Protocol-relative URL states\n case 11 /* ProtocolRelativeSlash1 */:\n stateProtocolRelativeSlash1(stateMachine, char);\n break;\n case 12 /* ProtocolRelativeSlash2 */:\n stateProtocolRelativeSlash2(stateMachine, char);\n break;\n case 0 /* SchemeChar */:\n stateSchemeChar(stateMachine, char);\n break;\n case 1 /* SchemeHyphen */:\n stateSchemeHyphen(stateMachine, char);\n break;\n case 2 /* SchemeColon */:\n stateSchemeColon(stateMachine, char);\n break;\n case 3 /* SchemeSlash1 */:\n stateSchemeSlash1(stateMachine, char);\n break;\n case 4 /* SchemeSlash2 */:\n stateSchemeSlash2(stateMachine, char);\n break;\n case 5 /* DomainLabelChar */:\n stateDomainLabelChar(stateMachine, char);\n break;\n case 6 /* DomainHyphen */:\n stateDomainHyphen(stateMachine, char);\n break;\n case 7 /* DomainDot */:\n stateDomainDot(stateMachine, char);\n break;\n case 13 /* IpV4Digit */:\n stateIpV4Digit(stateMachine, char);\n break;\n case 14 /* IpV4Dot */:\n stateIPv4Dot(stateMachine, char);\n break;\n case 8 /* PortColon */:\n statePortColon(stateMachine, char);\n break;\n case 9 /* PortNumber */:\n statePortNumber(stateMachine, char);\n break;\n case 10 /* Path */:\n statePath(stateMachine, char);\n break;\n // Email States\n case 15 /* EmailMailto_M */:\n stateEmailMailto_M(stateMachine, char);\n break;\n case 16 /* EmailMailto_A */:\n stateEmailMailto_A(stateMachine, char);\n break;\n case 17 /* EmailMailto_I */:\n stateEmailMailto_I(stateMachine, char);\n break;\n case 18 /* EmailMailto_L */:\n stateEmailMailto_L(stateMachine, char);\n break;\n case 19 /* EmailMailto_T */:\n stateEmailMailto_T(stateMachine, char);\n break;\n case 20 /* EmailMailto_O */:\n stateEmailMailto_O(stateMachine, char);\n break;\n case 21 /* EmailMailto_Colon */:\n stateEmailMailtoColon(stateMachine, char);\n break;\n case 22 /* EmailLocalPart */:\n stateEmailLocalPart(stateMachine, char);\n break;\n case 23 /* EmailLocalPartDot */:\n stateEmailLocalPartDot(stateMachine, char);\n break;\n case 24 /* EmailAtSign */:\n stateEmailAtSign(stateMachine, char);\n break;\n case 25 /* EmailDomainChar */:\n stateEmailDomainChar(stateMachine, char);\n break;\n case 26 /* EmailDomainHyphen */:\n stateEmailDomainHyphen(stateMachine, char);\n break;\n case 27 /* EmailDomainDot */:\n stateEmailDomainDot(stateMachine, char);\n break;\n // Hashtag states\n case 28 /* HashtagHashChar */:\n stateHashtagHashChar(stateMachine, char);\n break;\n case 29 /* HashtagTextChar */:\n stateHashtagTextChar(stateMachine, char);\n break;\n // Mention states\n case 30 /* MentionAtChar */:\n stateMentionAtChar(stateMachine, char);\n break;\n case 31 /* MentionTextChar */:\n stateMentionTextChar(stateMachine, char);\n break;\n // Phone number states\n case 32 /* PhoneNumberOpenParen */:\n statePhoneNumberOpenParen(stateMachine, char);\n break;\n case 33 /* PhoneNumberAreaCodeDigit1 */:\n statePhoneNumberAreaCodeDigit1(stateMachine, char);\n break;\n case 34 /* PhoneNumberAreaCodeDigit2 */:\n statePhoneNumberAreaCodeDigit2(stateMachine, char);\n break;\n case 35 /* PhoneNumberAreaCodeDigit3 */:\n statePhoneNumberAreaCodeDigit3(stateMachine, char);\n break;\n case 36 /* PhoneNumberCloseParen */:\n statePhoneNumberCloseParen(stateMachine, char);\n break;\n case 37 /* PhoneNumberPlus */:\n statePhoneNumberPlus(stateMachine, char);\n break;\n case 38 /* PhoneNumberDigit */:\n statePhoneNumberDigit(stateMachine, char);\n break;\n case 39 /* PhoneNumberSeparator */:\n statePhoneNumberSeparator(stateMachine, char);\n break;\n case 40 /* PhoneNumberControlChar */:\n statePhoneNumberControlChar(stateMachine, char);\n break;\n case 41 /* PhoneNumberPoundChar */:\n statePhoneNumberPoundChar(stateMachine, char);\n break;\n default:\n assertNever(stateMachine.state);\n }\n }\n }\n // For debugging: search for and uncomment other \"For debugging\" lines\n // table.push([\n // charIdx,\n // char,\n // stateMachines.map(machine => State[machine.state]).join('\\n') || '(none)',\n // charIdx,\n // stateMachines.map(m => m.startIdx).join('\\n'),\n // stateMachines.map(m => m.acceptStateReached).join('\\n'),\n // ]);\n }\n // Capture any valid match at the end of the string\n // Note: this loop must happen in reverse because\n // captureMatchIfValidAndRemove() removes state machines from the array\n // and we'll end up skipping every other one if we remove while looping\n // forward\n for (var i = stateMachines.length - 1; i >= 0; i--) {\n stateMachines.forEach(function (stateMachine) {\n return captureMatchIfValidAndRemove(stateMachine);\n });\n }\n // For debugging: search for and uncomment other \"For debugging\" lines\n // console.log(`\\nRead string:\\n ${text}`);\n // console.log(table.toString());\n return matches;\n // Handles the state when we're not in a URL/email/etc. (i.e. when no state machines exist)\n function stateNoMatch(char) {\n if (char === '#') {\n // Hash char, start a Hashtag match\n stateMachines.push(createHashtagStateMachine(charIdx, 28 /* HashtagHashChar */));\n } else if (char === '@') {\n // '@' char, start a Mention match\n stateMachines.push(createMentionStateMachine(charIdx, 30 /* MentionAtChar */));\n } else if (char === '/') {\n // A slash could begin a protocol-relative URL\n stateMachines.push(createTldUrlStateMachine(charIdx, 11 /* ProtocolRelativeSlash1 */));\n } else if (char === '+') {\n // A '+' char can start a Phone number\n stateMachines.push(createPhoneNumberStateMachine(charIdx, 37 /* PhoneNumberPlus */));\n } else if (char === '(') {\n stateMachines.push(createPhoneNumberStateMachine(charIdx, 32 /* PhoneNumberOpenParen */));\n } else {\n if (digitRe.test(char)) {\n // A digit could start a phone number\n stateMachines.push(createPhoneNumberStateMachine(charIdx, 38 /* PhoneNumberDigit */));\n // A digit could start an IP address\n stateMachines.push(createIpV4UrlStateMachine(charIdx, 13 /* IpV4Digit */));\n }\n if (isEmailLocalPartStartChar(char)) {\n // Any email local part. An 'm' character in particular could\n // start a 'mailto:' match\n var startState = char.toLowerCase() === 'm' ? 15 /* EmailMailto_M */ : 22 /* EmailLocalPart */;\n stateMachines.push(createEmailStateMachine(charIdx, startState));\n }\n if (isSchemeStartChar(char)) {\n // An uppercase or lowercase letter may start a scheme match\n stateMachines.push(createSchemeUrlStateMachine(charIdx, 0 /* SchemeChar */));\n }\n if (alphaNumericAndMarksRe.test(char)) {\n // A unicode alpha character or digit could start a domain name\n // label for a TLD match\n stateMachines.push(createTldUrlStateMachine(charIdx, 5 /* DomainLabelChar */));\n }\n }\n // Anything else, remain in the \"non-url\" state by not creating any\n // state machines\n }\n // Implements ABNF: ALPHA *( ALPHA / DIGIT / \"+\" / \"-\" / \".\" )\n function stateSchemeChar(stateMachine, char) {\n if (char === ':') {\n stateMachine.state = 2 /* SchemeColon */;\n } else if (char === '-') {\n stateMachine.state = 1 /* SchemeHyphen */;\n } else if (isSchemeChar(char)) {\n // Stay in SchemeChar state\n } else {\n // Any other character, not a scheme\n remove(stateMachines, stateMachine);\n }\n }\n function stateSchemeHyphen(stateMachine, char) {\n if (char === '-') {\n // Stay in SchemeHyphen state\n // TODO: Should a colon following a dash be counted as the end of the scheme?\n // } else if (char === ':') {\n // stateMachine.state = State.SchemeColon;\n } else if (char === '/') {\n // Not a valid scheme match, but may be the start of a\n // protocol-relative match (such as //google.com)\n remove(stateMachines, stateMachine);\n stateMachines.push(createTldUrlStateMachine(charIdx, 11 /* ProtocolRelativeSlash1 */));\n } else if (isSchemeChar(char)) {\n stateMachine.state = 0 /* SchemeChar */;\n } else {\n // Any other character, not a scheme\n remove(stateMachines, stateMachine);\n }\n }\n function stateSchemeColon(stateMachine, char) {\n if (char === '/') {\n stateMachine.state = 3 /* SchemeSlash1 */;\n } else if (char === '.') {\n // We've read something like 'hello:.' - don't capture\n remove(stateMachines, stateMachine);\n } else if (isDomainLabelStartChar(char)) {\n stateMachine.state = 5 /* DomainLabelChar */;\n // It's possible that we read an \"introduction\" piece of text,\n // and the character after the current colon actually starts an\n // actual scheme. An example of this is:\n // \"The link:http://google.com\"\n // Hence, start a new machine to capture this match if so\n if (isSchemeStartChar(char)) {\n stateMachines.push(createSchemeUrlStateMachine(charIdx, 0 /* SchemeChar */));\n }\n } else {\n remove(stateMachines, stateMachine);\n }\n }\n function stateSchemeSlash1(stateMachine, char) {\n if (char === '/') {\n stateMachine.state = 4 /* SchemeSlash2 */;\n } else if (isPathChar(char)) {\n stateMachine.state = 10 /* Path */;\n stateMachine.acceptStateReached = true;\n } else {\n captureMatchIfValidAndRemove(stateMachine);\n }\n }\n function stateSchemeSlash2(stateMachine, char) {\n if (char === '/') {\n // 3rd slash, must be an absolute path (path-absolute in the\n // ABNF), such as in a file:///c:/windows/etc. See\n // https://tools.ietf.org/html/rfc3986#appendix-A\n stateMachine.state = 10 /* Path */;\n } else if (isDomainLabelStartChar(char)) {\n // start of \"authority\" section - see https://tools.ietf.org/html/rfc3986#appendix-A\n stateMachine.state = 5 /* DomainLabelChar */;\n stateMachine.acceptStateReached = true;\n } else {\n // not valid\n remove(stateMachines, stateMachine);\n }\n }\n // Handles reading a '/' from the NonUrl state\n function stateProtocolRelativeSlash1(stateMachine, char) {\n if (char === '/') {\n stateMachine.state = 12 /* ProtocolRelativeSlash2 */;\n } else {\n // Anything else, cannot be the start of a protocol-relative\n // URL.\n remove(stateMachines, stateMachine);\n }\n }\n // Handles reading a second '/', which could start a protocol-relative URL\n function stateProtocolRelativeSlash2(stateMachine, char) {\n if (isDomainLabelStartChar(char)) {\n stateMachine.state = 5 /* DomainLabelChar */;\n } else {\n // Anything else, not a URL\n remove(stateMachines, stateMachine);\n }\n }\n // Handles when we have read a domain label character\n function stateDomainLabelChar(stateMachine, char) {\n if (char === '.') {\n stateMachine.state = 7 /* DomainDot */;\n } else if (char === '-') {\n stateMachine.state = 6 /* DomainHyphen */;\n } else if (char === ':') {\n // Beginning of a port number, end the domain name\n stateMachine.state = 8 /* PortColon */;\n } else if (isUrlSuffixStartChar(char)) {\n // '/', '?', or '#'\n stateMachine.state = 10 /* Path */;\n } else if (isDomainLabelChar(char)) {\n // Stay in the DomainLabelChar state\n } else {\n // Anything else, end the domain name\n captureMatchIfValidAndRemove(stateMachine);\n }\n }\n function stateDomainHyphen(stateMachine, char) {\n if (char === '-') {\n // Remain in the DomainHyphen state\n } else if (char === '.') {\n // Not valid to have a '-.' in a domain label\n captureMatchIfValidAndRemove(stateMachine);\n } else if (isDomainLabelStartChar(char)) {\n stateMachine.state = 5 /* DomainLabelChar */;\n } else {\n captureMatchIfValidAndRemove(stateMachine);\n }\n }\n function stateDomainDot(stateMachine, char) {\n if (char === '.') {\n // domain names cannot have multiple '.'s next to each other.\n // It's possible we've already read a valid domain name though,\n // and that the '..' sequence just forms an ellipsis at the end\n // of a sentence\n captureMatchIfValidAndRemove(stateMachine);\n } else if (isDomainLabelStartChar(char)) {\n stateMachine.state = 5 /* DomainLabelChar */;\n stateMachine.acceptStateReached = true; // after hitting a dot, and then another domain label, we've reached an accept state\n } else {\n // Anything else, end the domain name\n captureMatchIfValidAndRemove(stateMachine);\n }\n }\n function stateIpV4Digit(stateMachine, char) {\n if (char === '.') {\n stateMachine.state = 14 /* IpV4Dot */;\n } else if (char === ':') {\n // Beginning of a port number\n stateMachine.state = 8 /* PortColon */;\n } else if (digitRe.test(char)) {\n // stay in the IPv4 digit state\n } else if (isUrlSuffixStartChar(char)) {\n stateMachine.state = 10 /* Path */;\n } else if (alphaNumericAndMarksRe.test(char)) {\n // If we hit an alpha character, must not be an IPv4\n // Example of this: 1.2.3.4abc\n remove(stateMachines, stateMachine);\n } else {\n captureMatchIfValidAndRemove(stateMachine);\n }\n }\n function stateIPv4Dot(stateMachine, char) {\n if (digitRe.test(char)) {\n stateMachine.octetsEncountered++;\n // Once we have encountered 4 octets, it's *potentially* a valid\n // IPv4 address. Our IPv4 regex will confirm the match later\n // though to make sure each octet is in the 0-255 range, and\n // there's exactly 4 octets (not 5 or more)\n if (stateMachine.octetsEncountered === 4) {\n stateMachine.acceptStateReached = true;\n }\n stateMachine.state = 13 /* IpV4Digit */;\n } else {\n captureMatchIfValidAndRemove(stateMachine);\n }\n }\n function statePortColon(stateMachine, char) {\n if (digitRe.test(char)) {\n stateMachine.state = 9 /* PortNumber */;\n } else {\n captureMatchIfValidAndRemove(stateMachine);\n }\n }\n function statePortNumber(stateMachine, char) {\n if (digitRe.test(char)) {\n // Stay in port number state\n } else if (isUrlSuffixStartChar(char)) {\n // '/', '?', or '#'\n stateMachine.state = 10 /* Path */;\n } else {\n captureMatchIfValidAndRemove(stateMachine);\n }\n }\n function statePath(stateMachine, char) {\n if (isPathChar(char)) {\n // Stay in the path state\n } else {\n captureMatchIfValidAndRemove(stateMachine);\n }\n }\n // Handles if we're reading a 'mailto:' prefix on the string\n function stateEmailMailto_M(stateMachine, char) {\n if (char.toLowerCase() === 'a') {\n stateMachine.state = 16 /* EmailMailto_A */;\n } else {\n stateEmailLocalPart(stateMachine, char);\n }\n }\n function stateEmailMailto_A(stateMachine, char) {\n if (char.toLowerCase() === 'i') {\n stateMachine.state = 17 /* EmailMailto_I */;\n } else {\n stateEmailLocalPart(stateMachine, char);\n }\n }\n function stateEmailMailto_I(stateMachine, char) {\n if (char.toLowerCase() === 'l') {\n stateMachine.state = 18 /* EmailMailto_L */;\n } else {\n stateEmailLocalPart(stateMachine, char);\n }\n }\n function stateEmailMailto_L(stateMachine, char) {\n if (char.toLowerCase() === 't') {\n stateMachine.state = 19 /* EmailMailto_T */;\n } else {\n stateEmailLocalPart(stateMachine, char);\n }\n }\n function stateEmailMailto_T(stateMachine, char) {\n if (char.toLowerCase() === 'o') {\n stateMachine.state = 20 /* EmailMailto_O */;\n } else {\n stateEmailLocalPart(stateMachine, char);\n }\n }\n function stateEmailMailto_O(stateMachine, char) {\n if (char.toLowerCase() === ':') {\n stateMachine.state = 21 /* EmailMailto_Colon */;\n } else {\n stateEmailLocalPart(stateMachine, char);\n }\n }\n function stateEmailMailtoColon(stateMachine, char) {\n if (isEmailLocalPartChar(char)) {\n stateMachine.state = 22 /* EmailLocalPart */;\n } else {\n remove(stateMachines, stateMachine);\n }\n }\n // Handles the state when we're currently in the \"local part\" of an\n // email address (as opposed to the \"domain part\")\n function stateEmailLocalPart(stateMachine, char) {\n if (char === '.') {\n stateMachine.state = 23 /* EmailLocalPartDot */;\n } else if (char === '@') {\n stateMachine.state = 24 /* EmailAtSign */;\n } else if (isEmailLocalPartChar(char)) {\n // stay in the \"local part\" of the email address\n // Note: because stateEmailLocalPart() is called from the\n // 'mailto' states (when the 'mailto' prefix itself has been\n // broken), make sure to set the state to EmailLocalPart\n stateMachine.state = 22 /* EmailLocalPart */;\n } else {\n // not an email address character\n remove(stateMachines, stateMachine);\n }\n }\n // Handles the state where we've read\n function stateEmailLocalPartDot(stateMachine, char) {\n if (char === '.') {\n // We read a second '.' in a row, not a valid email address\n // local part\n remove(stateMachines, stateMachine);\n } else if (char === '@') {\n // We read the '@' character immediately after a dot ('.'), not\n // an email address\n remove(stateMachines, stateMachine);\n } else if (isEmailLocalPartChar(char)) {\n stateMachine.state = 22 /* EmailLocalPart */;\n } else {\n // Anything else, not an email address\n remove(stateMachines, stateMachine);\n }\n }\n function stateEmailAtSign(stateMachine, char) {\n if (isDomainLabelStartChar(char)) {\n stateMachine.state = 25 /* EmailDomainChar */;\n } else {\n // Anything else, not an email address\n remove(stateMachines, stateMachine);\n }\n }\n function stateEmailDomainChar(stateMachine, char) {\n if (char === '.') {\n stateMachine.state = 27 /* EmailDomainDot */;\n } else if (char === '-') {\n stateMachine.state = 26 /* EmailDomainHyphen */;\n } else if (isDomainLabelChar(char)) {\n // Stay in the DomainChar state\n } else {\n // Anything else, we potentially matched if the criteria has\n // been met\n captureMatchIfValidAndRemove(stateMachine);\n }\n }\n function stateEmailDomainHyphen(stateMachine, char) {\n if (char === '-' || char === '.') {\n // Not valid to have two hyphens (\"--\") or hypen+dot (\"-.\")\n captureMatchIfValidAndRemove(stateMachine);\n } else if (isDomainLabelChar(char)) {\n stateMachine.state = 25 /* EmailDomainChar */;\n } else {\n // Anything else\n captureMatchIfValidAndRemove(stateMachine);\n }\n }\n function stateEmailDomainDot(stateMachine, char) {\n if (char === '.' || char === '-') {\n // not valid to have two dots (\"..\") or dot+hypen (\".-\")\n captureMatchIfValidAndRemove(stateMachine);\n } else if (isDomainLabelStartChar(char)) {\n stateMachine.state = 25 /* EmailDomainChar */;\n // After having read a '.' and then a valid domain character,\n // we now know that the domain part of the email is valid, and\n // we have found at least a partial EmailMatch (however, the\n // email address may have additional characters from this point)\n stateMachine.acceptStateReached = true;\n } else {\n // Anything else\n captureMatchIfValidAndRemove(stateMachine);\n }\n }\n // Handles the state when we've just encountered a '#' character\n function stateHashtagHashChar(stateMachine, char) {\n if (isHashtagTextChar(char)) {\n // '#' char with valid hash text char following\n stateMachine.state = 29 /* HashtagTextChar */;\n stateMachine.acceptStateReached = true;\n } else {\n remove(stateMachines, stateMachine);\n }\n }\n // Handles the state when we're currently in the hash tag's text chars\n function stateHashtagTextChar(stateMachine, char) {\n if (isHashtagTextChar(char)) {\n // Continue reading characters in the HashtagText state\n } else {\n captureMatchIfValidAndRemove(stateMachine);\n }\n }\n // Handles the state when we've just encountered a '@' character\n function stateMentionAtChar(stateMachine, char) {\n if (isMentionTextChar(char)) {\n // '@' char with valid mention text char following\n stateMachine.state = 31 /* MentionTextChar */;\n stateMachine.acceptStateReached = true;\n } else {\n remove(stateMachines, stateMachine);\n }\n }\n // Handles the state when we're currently in the mention's text chars\n function stateMentionTextChar(stateMachine, char) {\n if (isMentionTextChar(char)) {\n // Continue reading characters in the HashtagText state\n } else if (alphaNumericAndMarksRe.test(char)) {\n // Char is invalid for a mention text char, not a valid match.\n // Note that ascii alphanumeric chars are okay (which are tested\n // in the previous 'if' statement, but others are not)\n remove(stateMachines, stateMachine);\n } else {\n captureMatchIfValidAndRemove(stateMachine);\n }\n }\n function statePhoneNumberPlus(stateMachine, char) {\n if (digitRe.test(char)) {\n stateMachine.state = 38 /* PhoneNumberDigit */;\n } else {\n remove(stateMachines, stateMachine);\n // This character may start a new match. Add states for it\n stateNoMatch(char);\n }\n }\n function statePhoneNumberOpenParen(stateMachine, char) {\n if (digitRe.test(char)) {\n stateMachine.state = 33 /* PhoneNumberAreaCodeDigit1 */;\n } else {\n remove(stateMachines, stateMachine);\n }\n // It's also possible that the paren was just an open brace for\n // a piece of text. Start other machines\n stateNoMatch(char);\n }\n function statePhoneNumberAreaCodeDigit1(stateMachine, char) {\n if (digitRe.test(char)) {\n stateMachine.state = 34 /* PhoneNumberAreaCodeDigit2 */;\n } else {\n remove(stateMachines, stateMachine);\n }\n }\n function statePhoneNumberAreaCodeDigit2(stateMachine, char) {\n if (digitRe.test(char)) {\n stateMachine.state = 35 /* PhoneNumberAreaCodeDigit3 */;\n } else {\n remove(stateMachines, stateMachine);\n }\n }\n function statePhoneNumberAreaCodeDigit3(stateMachine, char) {\n if (char === ')') {\n stateMachine.state = 36 /* PhoneNumberCloseParen */;\n } else {\n remove(stateMachines, stateMachine);\n }\n }\n function statePhoneNumberCloseParen(stateMachine, char) {\n if (digitRe.test(char)) {\n stateMachine.state = 38 /* PhoneNumberDigit */;\n } else if (isPhoneNumberSeparatorChar(char)) {\n stateMachine.state = 39 /* PhoneNumberSeparator */;\n } else {\n remove(stateMachines, stateMachine);\n }\n }\n function statePhoneNumberDigit(stateMachine, char) {\n // For now, if we've reached any digits, we'll say that the machine\n // has reached its accept state. The phone regex will confirm the\n // match later.\n // Alternatively, we could count the number of digits to avoid\n // invoking the phone number regex\n stateMachine.acceptStateReached = true;\n if (isPhoneNumberControlChar(char)) {\n stateMachine.state = 40 /* PhoneNumberControlChar */;\n } else if (char === '#') {\n stateMachine.state = 41 /* PhoneNumberPoundChar */;\n } else if (digitRe.test(char)) {\n // Stay in the phone number digit state\n } else if (char === '(') {\n stateMachine.state = 32 /* PhoneNumberOpenParen */;\n } else if (isPhoneNumberSeparatorChar(char)) {\n stateMachine.state = 39 /* PhoneNumberSeparator */;\n } else {\n captureMatchIfValidAndRemove(stateMachine);\n // The transition from a digit character to a letter can be the\n // start of a new scheme URL match\n if (isSchemeStartChar(char)) {\n stateMachines.push(createSchemeUrlStateMachine(charIdx, 0 /* SchemeChar */));\n }\n }\n }\n function statePhoneNumberSeparator(stateMachine, char) {\n if (digitRe.test(char)) {\n stateMachine.state = 38 /* PhoneNumberDigit */;\n } else if (char === '(') {\n stateMachine.state = 32 /* PhoneNumberOpenParen */;\n } else {\n captureMatchIfValidAndRemove(stateMachine);\n // This character may start a new match. Add states for it\n stateNoMatch(char);\n }\n }\n // The \";\" characters is \"wait\" in a phone number\n // The \",\" characters is \"pause\" in a phone number\n function statePhoneNumberControlChar(stateMachine, char) {\n if (isPhoneNumberControlChar(char)) {\n // Stay in the \"control char\" state\n } else if (char === '#') {\n stateMachine.state = 41 /* PhoneNumberPoundChar */;\n } else if (digitRe.test(char)) {\n stateMachine.state = 38 /* PhoneNumberDigit */;\n } else {\n captureMatchIfValidAndRemove(stateMachine);\n }\n }\n // The \"#\" characters is \"pound\" in a phone number\n function statePhoneNumberPoundChar(stateMachine, char) {\n if (isPhoneNumberControlChar(char)) {\n stateMachine.state = 40 /* PhoneNumberControlChar */;\n } else if (digitRe.test(char)) {\n // According to some of the older tests, if there's a digit\n // after a '#' sign, the match is invalid. TODO: Revisit if this is true\n remove(stateMachines, stateMachine);\n } else {\n captureMatchIfValidAndRemove(stateMachine);\n }\n }\n /*\n * Captures a match if it is valid (i.e. has a full domain name for a\n * TLD match). If a match is not valid, it is possible that we want to\n * keep reading characters in order to make a full match.\n */\n function captureMatchIfValidAndRemove(stateMachine) {\n // Remove the state machine first. There are a number of code paths\n // which return out of this function early, so make sure we have\n // this done\n remove(stateMachines, stateMachine);\n // Make sure the state machine being checked has actually reached an\n // \"accept\" state. If it hasn't reach one, it can't be a match\n if (!stateMachine.acceptStateReached) {\n return;\n }\n var startIdx = stateMachine.startIdx;\n var matchedText = text.slice(stateMachine.startIdx, charIdx);\n // Handle any unbalanced braces (parens, square brackets, or curly\n // brackets) inside the URL. This handles situations like:\n // The link (google.com)\n // and\n // Check out this link here (en.wikipedia.org/wiki/IANA_(disambiguation))\n //\n // And also remove any punctuation chars at the end such as:\n // '?', ',', ':', '.', etc.\n matchedText = excludeUnbalancedTrailingBracesAndPunctuation(matchedText);\n if (stateMachine.type === 'url') {\n // We don't want to accidentally match a URL that is preceded by an\n // '@' character, which would be an email address\n var charBeforeUrlMatch = text.charAt(stateMachine.startIdx - 1);\n if (charBeforeUrlMatch === '@') {\n return;\n }\n // For the purpose of this parser, we've generalized 'www'\n // matches as part of 'tld' matches. However, for backward\n // compatibility, we distinguish beween TLD matches and matches\n // that begin with 'www.' so that users may turn off 'www'\n // matches. As such, we need to correct for that now if the\n // URL begins with 'www.'\n var urlMatchType = stateMachine.matchType;\n if (urlMatchType === 'scheme') {\n // Autolinker accepts many characters in a url's scheme (like `fake://test.com`).\n // However, in cases where a URL is missing whitespace before an obvious link,\n // (for example: `nowhitespacehttp://www.test.com`), we only want the match to start\n // at the http:// part. We will check if the match contains a common scheme and then\n // shift the match to start from there.\n var httpSchemeMatch = httpSchemeRe.exec(matchedText);\n if (httpSchemeMatch) {\n // If we found an overmatched URL, we want to find the index\n // of where the match should start and shift the match to\n // start from the beginning of the common scheme\n startIdx = startIdx + httpSchemeMatch.index;\n matchedText = matchedText.slice(httpSchemeMatch.index);\n }\n if (!isValidSchemeUrl(matchedText)) {\n return; // not a valid match\n }\n } else if (urlMatchType === 'tld') {\n if (!isValidTldMatch(matchedText)) {\n return; // not a valid match\n }\n } else if (urlMatchType === 'ipV4') {\n if (!isValidIpV4Address(matchedText)) {\n return; // not a valid match\n }\n } else {\n assertNever(urlMatchType);\n }\n matches.push(new UrlMatch({\n tagBuilder: tagBuilder,\n matchedText: matchedText,\n offset: startIdx,\n urlMatchType: urlMatchType,\n url: matchedText,\n protocolRelativeMatch: matchedText.slice(0, 2) === '//',\n // TODO: Do these settings need to be passed to the match,\n // or should we handle them here in UrlMatcher?\n stripPrefix: stripPrefix,\n stripTrailingSlash: stripTrailingSlash,\n decodePercentEncoding: decodePercentEncoding\n }));\n } else if (stateMachine.type === 'email') {\n // if the email address has a valid TLD, add it to the list of matches\n if (isValidEmail(matchedText)) {\n matches.push(new EmailMatch({\n tagBuilder: tagBuilder,\n matchedText: matchedText,\n offset: startIdx,\n email: matchedText.replace(mailtoSchemePrefixRe, '')\n }));\n }\n } else if (stateMachine.type === 'hashtag') {\n if (isValidHashtag(matchedText)) {\n matches.push(new HashtagMatch({\n tagBuilder: tagBuilder,\n matchedText: matchedText,\n offset: startIdx,\n serviceName: hashtagServiceName,\n hashtag: matchedText.slice(1)\n }));\n }\n } else if (stateMachine.type === 'mention') {\n if (isValidMention(matchedText, mentionServiceName)) {\n matches.push(new MentionMatch({\n tagBuilder: tagBuilder,\n matchedText: matchedText,\n offset: startIdx,\n serviceName: mentionServiceName,\n mention: matchedText.slice(1) // strip off the '@' character at the beginning\n }));\n }\n } else if (stateMachine.type === 'phone') {\n // remove any trailing spaces that were considered as \"separator\"\n // chars by the state machine\n matchedText = matchedText.replace(/ +$/g, '');\n if (isValidPhoneNumber(matchedText)) {\n var cleanNumber = matchedText.replace(/[^0-9,;#]/g, ''); // strip out non-digit characters exclude comma semicolon and #\n matches.push(new PhoneMatch({\n tagBuilder: tagBuilder,\n matchedText: matchedText,\n offset: startIdx,\n number: cleanNumber,\n plusSign: matchedText.charAt(0) === '+'\n }));\n }\n } else {\n assertNever(stateMachine);\n }\n }\n}\nvar openBraceRe = /[\\(\\{\\[]/;\nvar closeBraceRe = /[\\)\\}\\]]/;\nvar oppositeBrace = {\n ')': '(',\n '}': '{',\n ']': '['\n};\n/**\n * Determines if a match found has unmatched closing parenthesis,\n * square brackets or curly brackets. If so, these unbalanced symbol(s) will be\n * removed from the URL match itself.\n *\n * A match may have an extra closing parenthesis/square brackets/curly brackets\n * at the end of the match because these are valid URL path characters. For\n * example, \"wikipedia.com/something_(disambiguation)\" should be auto-linked.\n *\n * However, an extra parenthesis *will* be included when the URL itself is\n * wrapped in parenthesis, such as in the case of:\n *\n * \"(wikipedia.com/something_(disambiguation))\"\n *\n * In this case, the last closing parenthesis should *not* be part of the\n * URL itself, and this method will exclude it from the returned URL.\n *\n * For square brackets in URLs such as in PHP arrays, the same behavior as\n * parenthesis discussed above should happen:\n *\n * \"[http://www.example.com/foo.php?bar[]=1&bar[]=2&bar[]=3]\"\n *\n * The very last closing square bracket should not be part of the URL itself,\n * and therefore this method will remove it.\n *\n * @param matchedText The full matched URL/email/hashtag/etc. from the state\n * machine parser.\n * @return The updated matched text with extraneous suffix characters removed.\n */\nexport function excludeUnbalancedTrailingBracesAndPunctuation(matchedText) {\n var braceCounts = {\n '(': 0,\n '{': 0,\n '[': 0\n };\n for (var i = 0; i < matchedText.length; i++) {\n var char_1 = matchedText.charAt(i);\n if (openBraceRe.test(char_1)) {\n braceCounts[char_1]++;\n } else if (closeBraceRe.test(char_1)) {\n braceCounts[oppositeBrace[char_1]]--;\n }\n }\n var endIdx = matchedText.length - 1;\n var char;\n while (endIdx >= 0) {\n char = matchedText.charAt(endIdx);\n if (closeBraceRe.test(char)) {\n var oppositeBraceChar = oppositeBrace[char];\n if (braceCounts[oppositeBraceChar] < 0) {\n braceCounts[oppositeBraceChar]++;\n endIdx--;\n } else {\n break;\n }\n } else if (urlSuffixedCharsNotAllowedAtEndRe.test(char)) {\n // Walk back a punctuation char like '?', ',', ':', '.', etc.\n endIdx--;\n } else {\n break;\n }\n }\n return matchedText.slice(0, endIdx + 1);\n}\nfunction createSchemeUrlStateMachine(startIdx, state) {\n return {\n type: 'url',\n startIdx: startIdx,\n state: state,\n acceptStateReached: false,\n matchType: 'scheme'\n };\n}\nfunction createTldUrlStateMachine(startIdx, state) {\n return {\n type: 'url',\n startIdx: startIdx,\n state: state,\n acceptStateReached: false,\n matchType: 'tld'\n };\n}\nfunction createIpV4UrlStateMachine(startIdx, state) {\n return {\n type: 'url',\n startIdx: startIdx,\n state: state,\n acceptStateReached: false,\n matchType: 'ipV4',\n octetsEncountered: 1 // starts at 1 because we create this machine when encountering the first octet\n };\n}\nfunction createEmailStateMachine(startIdx, state) {\n return {\n type: 'email',\n startIdx: startIdx,\n state: state,\n acceptStateReached: false\n };\n}\nfunction createHashtagStateMachine(startIdx, state) {\n return {\n type: 'hashtag',\n startIdx: startIdx,\n state: state,\n acceptStateReached: false\n };\n}\nfunction createMentionStateMachine(startIdx, state) {\n return {\n type: 'mention',\n startIdx: startIdx,\n state: state,\n acceptStateReached: false\n };\n}\nfunction createPhoneNumberStateMachine(startIdx, state) {\n return {\n type: 'phone',\n startIdx: startIdx,\n state: state,\n acceptStateReached: false\n };\n}\n","import { __assign } from \"tslib\";\nimport { letterRe, digitRe, whitespaceRe, quoteRe, controlCharsRe } from '../regex-lib';\nimport { assertNever } from '../utils';\n// For debugging: search for other \"For debugging\" lines\n// import CliTable from 'cli-table';\n/**\n * Parses an HTML string, calling the callbacks to notify of tags and text.\n *\n * ## History\n *\n * This file previously used a regular expression to find html tags in the input\n * text. Unfortunately, we ran into a bunch of catastrophic backtracking issues\n * with certain input text, causing Autolinker to either hang or just take a\n * really long time to parse the string.\n *\n * The current code is intended to be a O(n) algorithm that walks through\n * the string in one pass, and tries to be as cheap as possible. We don't need\n * to implement the full HTML spec, but rather simply determine where the string\n * looks like an HTML tag, and where it looks like text (so that we can autolink\n * that).\n *\n * This state machine parser is intended just to be a simple but performant\n * parser of HTML for the subset of requirements we have. We simply need to:\n *\n * 1. Determine where HTML tags are\n * 2. Determine the tag name (Autolinker specifically only cares about ,\n *