@technobuddha/library
Version:
A large library of useful functions
437 lines • 20 kB
JavaScript
import { matchCase } from "./match-case.js";
import { empty, space } from "./unicode.js";
/**
* Return the plural version of the input string
* @param input - The word to pluralize
* @param quantity - The quantity to prepend to the word. If omitted nothing is prepended. If quantity is one the singular form is returned.
* @param include - If true and quantity is supplied, the quantity is prepended to the output.
* @returns The plural form of the input, or if a quantity is supplied - the quantity and the singular/plural form of the input (whichever is appropriate)
* @example
* ```typescript
* plural('cat'); // cats
* plural('mouse', 1); // mouse
* plural('mouse', 2); // mice
* plural('dog', 1, true); // 1 dog
* plural('dog', 2, true); // 2 dogs
* ```
* @group String
* @category Parts of Speech
*/
export function plural(input, quantity, include = false) {
if (quantity === 1 || quantity === -1) {
return include ? quantity.toString() + space + input : input;
}
let lc = input.toLocaleLowerCase();
let suffix = empty;
let prefix = empty;
let result = null;
for (const p of database.prefixes) {
if (lc.startsWith(p)) {
prefix = p;
lc = lc.slice(p.length);
break;
}
}
for (const s of database.suffixes) {
if (lc.endsWith(s)) {
suffix = s;
lc = lc.slice(0, Math.max(0, lc.length - s.length));
break;
}
}
if (database.uncountableWords.includes(lc)) {
result = matchCase(prefix + lc + suffix, input);
}
if (!result && lc in database.irregulars) {
result = matchCase(prefix + database.irregulars[lc] + suffix, input);
}
if (!result) {
for (const v of database.uncountableRules) {
if (v.test(lc)) {
result = matchCase(prefix + lc + suffix, input);
break;
}
}
}
if (!result) {
for (const v of database.rules) {
if (v[0].test(lc)) {
result = matchCase(prefix + lc.replace(v[0], v[1]) + suffix, input);
break;
}
}
}
result ??= matchCase(`${prefix}${lc}s${suffix}`, input);
return include && quantity != null ? `${quantity}${space}${result}` : result;
}
const database = {
rules: [
// cspell:disable
[/(stig|sto|dog|sche|anathe)ma$/iu, '$1mata'],
[/(alumn|alg|antenn|ecclesi|faun|formul|larv|nebul|vertebr)a$/iu, '$1ae'],
[/child$/iu, 'children'],
[/(giraf|sa)fe$/iu, '$1fes'],
[/fe$/iu, 'ves'],
[/(l|m)ouse$/iu, '$1ice'],
[/goose$/iu, 'geese'],
[/zampone$/iu, 'zamponi'],
[/ff$/iu, 'ffs'],
[/(belie|brie|che|chie|cle|gul|i|proo|roo)f$/iu, '$1fs'],
[/(its|her|him|them)self$/iu, 'themselves'],
[/f$/iu, 'ves'],
[/tooth$/iu, 'teeth'],
[/(epo|matriar|patriar|stoma)ch$/iu, '$1chs'],
[/([sc])h$/iu, '$1hes'],
[/(aqua)rium$/iu, '$1ira'],
[/(seraph|cherub)im$/iu, '$1im'],
[/(memorand|millenni|ov|quor|strat|symposi)um$/iu, '$1a'],
[
/(addend|agend|automat|bacteri|curricul|dat|desiderat|endotheli|errat|extrem|fusari|medi)um$/iu,
'$1a',
],
[/(m|wom)an/iu, '$1en'],
[/(criteri|hedr|heli|phenomen|prolegomen|organ)on$/iu, '$1a'],
[/person$/iu, 'people'],
[
/(alt|armadill|boler|bong|bronc|cell|dynam|embarg|hal|hell|gazeb|gyr|jumb|kil|lim)o$/iu,
'$1os',
],
[
/(maestr|metr|mosquit|octav|pian|piccol|pint|phot|ponch|sil|sombrer|sopran|stere|stilett)o$/iu,
'$1os',
],
[/(temp|tornad|tors|tw|volcan)o$/iu, '$1os'],
[/([^aeiou])o$/iu, '$1oes'],
[/(gen|visc)us$/iu, '$1era'],
[
/(alumn|bacill|cirr|cact|foc|fung|hippopotam|loc|nucle|octop|radi|pegas|stimul|strat|syllab|termin|uter)us$/iu,
'$1i',
],
[
/(ax|analys|antithes|bas|cris|diagnos|ellips|emphas|hypothes|neuros|oas|paralys|synthes|synops|test|thes)is$/iu,
'$1es',
],
[/(ephemer)is$/iu, '$1ides'],
[/(bu|ga)s$/iu, '$1sses'],
[/(corp)us$/iu, '$1ora'],
[/s$/iu, 'ses'],
[/foot$/iu, 'feet'],
[/(b|bur|chat|tabl)eau$/iu, '$1eaux'],
[/(whisk)ey$/iu, '$1ies'],
[/([^aeiou]|qu)y$/iu, '$1ies'],
[/(append|matr)ix$/iu, '$1ices'],
[/(cod|ind|mur|vert)ex$/iu, '$1ices'],
[/(ap)ex$/iu, '$1ices'],
[/x$/iu, 'xes'],
[/(fez|qui)z$/iu, '$1zzes'],
[/z$/iu, 'zes'],
],
uncountableRules: [
/(adult|child)hood$/iu,
/craft$/iu,
/deer$/iu,
/fish$/iu,
/measles$/iu,
/pox$/iu,
/sheep$/iu,
/wood$/iu,
/ographuy$/iu,
/itis$/iu,
/ology$/iu,
/[hw]ealth$/iu,
/bage$/iu,
/llows$/iu,
/ment$/iu,
/friut$/iu,
/(?<!func)tion$/iu,
/work$/iu,
/ing$/iu,
/ism$/iu,
/tics$/iu,
/moose$/iu,
/trout$/iu,
],
// cspell:enable
uncountableWords: [
'abroad',
'acoustics',
'advice',
'aid',
'air',
'alcohol',
'alms',
'alpenglow',
'aluminum',
'ammo',
'anger',
'anime',
'applause',
'Operations',
'art',
'athletics',
'audio',
'awareness',
'barracks',
'bad',
'bakeware',
'beyond',
'bifocals',
'binoculars',
'bison',
'blood',
'bloomers',
'blouse',
'boots',
'bourgeois',
'bowling',
'bricklaying',
'butter',
'calculus',
'cappuccino',
'caribou',
'carp',
'cash',
'casino',
'castanets',
'cattle',
'celeriac',
'chafe',
'chalk',
'chaos',
'chassis',
'chess',
'children',
'chino',
'clippers',
'cod',
'commerce',
'concrete',
'corps',
'courage',
'deadness',
'debris',
'deer',
'diabetes',
'dirt',
'disco',
'doldrums',
'dungarees',
'economics',
'egg',
'electricity',
'elk',
'energy',
'ethics',
'expertise',
'fauna',
'faux pas',
'fedelini',
'fibre',
'fiberglass',
'flesh',
'flounder',
'forestry',
'fun',
'furniture',
'gain',
'glass',
'glasses',
'golf',
'graffiti',
'gratitude',
'grief',
'grouse',
'guidance',
'guilt',
'haddock',
'happiness',
'hardware',
'hair',
'halibut',
'headquarters',
'helium',
'helo',
'help',
'herpes',
'high jinks',
'homework',
'housework',
'humidity',
'humour',
'hypochondria',
'hypothermia',
'ides',
'ikebana',
'importance',
'impudence',
'incandescence',
'indigence',
'innocence',
'insignia',
'jeans',
'jodhpur',
'judo',
'justice',
'karate',
'kendo',
'knickers',
'knowledge',
'kudos',
'labour',
'laughter',
'leisure',
'legal',
'literature',
'livestock',
'loneliness',
'lycra',
'lye',
'macaroni',
'machinery',
'mackerel',
'macrame',
'magic',
'mail',
'manga',
'mambo',
'mankind',
'math',
'means',
'media',
'methane',
'mews',
'might',
'most',
'mud',
'mullet',
'multimedia',
'music',
'neon',
'news',
'nitrogen',
'normal',
'oatmeal',
'obedience',
'opium',
'osmosis',
'outback',
'oxygen',
'pants',
'pantology',
'pantyhose',
'passion',
'patience',
'peace',
'penicillin',
'permafrost',
'physics',
'pike',
'plankton',
'platinum',
'plenty',
'pliers',
'police',
'polo',
'premises',
'propane',
'prose',
'pseudoscience',
'pyjamas',
'quicksand',
'radio',
'random',
'rain',
'rendezvous',
'reinscription',
'relief',
'research',
'rice',
'salmon',
'septicaemia',
'school',
'schoolchild',
'scissors',
'series',
'sewage',
'shambles',
'shorts',
'shrimp',
'sick',
'smithereens',
'smog',
'soccer',
'software',
'soot',
'soy',
'species',
'squid',
'staff',
'stamina',
'stupid',
'subconscious',
'subsidence',
'sugar',
'sunglasses',
'sunshine',
'sushi',
'suspenders',
'sweats',
'sweet',
'sweets',
'swine',
'temporariness',
'terracotta',
'tennis',
'thanks',
'them',
'tights',
'timpani',
'titanium',
'tongs',
'tonight',
'tortellini',
'traffic',
'trigonometry',
'trousers',
'tuna',
'tweezers',
'underclothes',
'underneath',
'underpants',
'underwear',
'veal',
'vermicelli',
'video',
'vinyl',
'virus',
'violence',
'viscose',
'warmth',
'weedkiller',
'welfare',
'wheat',
'whitebait',
'wildebeest',
'wildlife',
'worth',
'yoga',
'you',
'young',
],
irregulars: {
i: 'we',
me: 'us',
he: 'they',
she: 'they',
is: 'are',
was: 'were',
has: 'have',
this: 'these',
that: 'those',
die: 'dice',
ox: 'oxen',
},
suffixes: ['-up', '-out', '-in-law', '-in-trade'],
prefixes: ['anti-', 'bi-', 'co-', 'semi-', 'mal-', 'ex-', 'sub-', 'dis-', 'non-', 'un-', 'over-'],
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1cmFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3BsdXJhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUMsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFNUM7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCxNQUFNLFVBQVUsTUFBTSxDQUFDLEtBQWEsRUFBRSxRQUFpQixFQUFFLE9BQU8sR0FBRyxLQUFLO0lBQ3RFLElBQUksUUFBUSxLQUFLLENBQUMsSUFBSSxRQUFRLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN0QyxPQUFPLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxHQUFHLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUMvRCxDQUFDO0lBRUQsSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDbkMsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ25CLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQztJQUNuQixJQUFJLE1BQU0sR0FBRyxJQUFxQixDQUFDO0lBRW5DLEtBQUssTUFBTSxDQUFDLElBQUksUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2xDLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3JCLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDWCxFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDeEIsTUFBTTtRQUNSLENBQUM7SUFDSCxDQUFDO0lBRUQsS0FBSyxNQUFNLENBQUMsSUFBSSxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDbEMsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDbkIsTUFBTSxHQUFHLENBQUMsQ0FBQztZQUNYLEVBQUUsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ3BELE1BQU07UUFDUixDQUFDO0lBQ0gsQ0FBQztJQUVELElBQUksUUFBUSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQzNDLE1BQU0sR0FBRyxTQUFTLENBQUMsTUFBTSxHQUFHLEVBQUUsR0FBRyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVELElBQUksQ0FBQyxNQUFNLElBQUksRUFBRSxJQUFJLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN6QyxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBRUQsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1osS0FBSyxNQUFNLENBQUMsSUFBSSxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUMxQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDZixNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sR0FBRyxFQUFFLEdBQUcsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNoRCxNQUFNO1lBQ1IsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1osS0FBSyxNQUFNLENBQUMsSUFBSSxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQ2xCLE1BQU0sR0FBRyxTQUFTLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDcEUsTUFBTTtZQUNSLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELE1BQU0sS0FBSyxTQUFTLENBQUMsR0FBRyxNQUFNLEdBQUcsRUFBRSxJQUFJLE1BQU0sRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRXhELE9BQU8sT0FBTyxJQUFJLFFBQVEsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxHQUFHLEtBQUssR0FBRyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0FBQy9FLENBQUM7QUFxQkQsTUFBTSxRQUFRLEdBQVk7SUFDeEIsS0FBSyxFQUFFO1FBQ0wsaUJBQWlCO1FBQ2pCLENBQUMsaUNBQWlDLEVBQUUsUUFBUSxDQUFDO1FBQzdDLENBQUMsK0RBQStELEVBQUUsTUFBTSxDQUFDO1FBRXpFLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQztRQUV4QixDQUFDLGlCQUFpQixFQUFFLE9BQU8sQ0FBQztRQUM1QixDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUM7UUFDaEIsQ0FBQyxjQUFjLEVBQUUsT0FBTyxDQUFDO1FBQ3pCLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQztRQUNyQixDQUFDLFlBQVksRUFBRSxTQUFTLENBQUM7UUFFekIsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDO1FBQ2hCLENBQUMsOENBQThDLEVBQUUsTUFBTSxDQUFDO1FBQ3hELENBQUMsMkJBQTJCLEVBQUUsWUFBWSxDQUFDO1FBQzNDLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQztRQUVmLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQztRQUNyQixDQUFDLGtDQUFrQyxFQUFFLE9BQU8sQ0FBQztRQUM3QyxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUM7UUFFdkIsQ0FBQyxlQUFlLEVBQUUsT0FBTyxDQUFDO1FBQzFCLENBQUMsc0JBQXNCLEVBQUUsTUFBTSxDQUFDO1FBQ2hDLENBQUMsZ0RBQWdELEVBQUUsS0FBSyxDQUFDO1FBQ3pEO1lBQ0UsK0ZBQStGO1lBQy9GLEtBQUs7U0FDTjtRQUVELENBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQztRQUN2QixDQUFDLG9EQUFvRCxFQUFFLEtBQUssQ0FBQztRQUM3RCxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUM7UUFFdkI7WUFDRSx1RkFBdUY7WUFDdkYsTUFBTTtTQUNQO1FBQ0Q7WUFDRSw4RkFBOEY7WUFDOUYsTUFBTTtTQUNQO1FBQ0QsQ0FBQyxrQ0FBa0MsRUFBRSxNQUFNLENBQUM7UUFDNUMsQ0FBQyxnQkFBZ0IsRUFBRSxPQUFPLENBQUM7UUFFM0IsQ0FBQyxpQkFBaUIsRUFBRSxPQUFPLENBQUM7UUFDNUI7WUFDRSw4R0FBOEc7WUFDOUcsS0FBSztTQUNOO1FBQ0Q7WUFDRSwrR0FBK0c7WUFDL0csTUFBTTtTQUNQO1FBQ0QsQ0FBQyxnQkFBZ0IsRUFBRSxRQUFRLENBQUM7UUFDNUIsQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDO1FBQ3pCLENBQUMsYUFBYSxFQUFFLE9BQU8sQ0FBQztRQUN4QixDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUM7UUFFZixDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUM7UUFFbkIsQ0FBQyx5QkFBeUIsRUFBRSxRQUFRLENBQUM7UUFFckMsQ0FBQyxjQUFjLEVBQUUsT0FBTyxDQUFDO1FBQ3pCLENBQUMsbUJBQW1CLEVBQUUsT0FBTyxDQUFDO1FBRTlCLENBQUMsb0JBQW9CLEVBQUUsUUFBUSxDQUFDO1FBQ2hDLENBQUMseUJBQXlCLEVBQUUsUUFBUSxDQUFDO1FBQ3JDLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQztRQUN2QixDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUM7UUFFZixDQUFDLGVBQWUsRUFBRSxRQUFRLENBQUM7UUFDM0IsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDO0tBQ2hCO0lBQ0QsZ0JBQWdCLEVBQUU7UUFDaEIsc0JBQXNCO1FBQ3RCLFVBQVU7UUFDVixTQUFTO1FBQ1QsU0FBUztRQUNULFlBQVk7UUFDWixRQUFRO1FBQ1IsVUFBVTtRQUNWLFNBQVM7UUFDVCxhQUFhO1FBQ2IsU0FBUztRQUNULFVBQVU7UUFDVixjQUFjO1FBQ2QsU0FBUztRQUNULFVBQVU7UUFDVixTQUFTO1FBQ1QsVUFBVTtRQUNWLGtCQUFrQjtRQUNsQixTQUFTO1FBQ1QsUUFBUTtRQUNSLFFBQVE7UUFDUixTQUFTO1FBQ1QsVUFBVTtRQUNWLFVBQVU7S0FDWDtJQUNELGdCQUFnQjtJQUVoQixnQkFBZ0IsRUFBRTtRQUNoQixRQUFRO1FBQ1IsV0FBVztRQUNYLFFBQVE7UUFDUixLQUFLO1FBQ0wsS0FBSztRQUNMLFNBQVM7UUFDVCxNQUFNO1FBQ04sV0FBVztRQUNYLFVBQVU7UUFDVixNQUFNO1FBQ04sT0FBTztRQUNQLE9BQU87UUFDUCxVQUFVO1FBQ1YsWUFBWTtRQUNaLEtBQUs7UUFDTCxXQUFXO1FBQ1gsT0FBTztRQUNQLFdBQVc7UUFDWCxVQUFVO1FBQ1YsS0FBSztRQUNMLFVBQVU7UUFDVixRQUFRO1FBQ1IsVUFBVTtRQUNWLFlBQVk7UUFDWixPQUFPO1FBQ1AsT0FBTztRQUNQLFVBQVU7UUFDVixRQUFRO1FBQ1IsT0FBTztRQUNQLFdBQVc7UUFDWCxTQUFTO1FBQ1QsYUFBYTtRQUNiLFFBQVE7UUFDUixVQUFVO1FBQ1YsWUFBWTtRQUNaLFNBQVM7UUFDVCxNQUFNO1FBQ04sTUFBTTtRQUNOLFFBQVE7UUFDUixXQUFXO1FBQ1gsUUFBUTtRQUNSLFVBQVU7UUFDVixPQUFPO1FBQ1AsT0FBTztRQUNQLE9BQU87UUFDUCxTQUFTO1FBQ1QsT0FBTztRQUNQLFVBQVU7UUFDVixPQUFPO1FBQ1AsVUFBVTtRQUNWLEtBQUs7UUFDTCxVQUFVO1FBQ1YsVUFBVTtRQUNWLE9BQU87UUFDUCxTQUFTO1FBQ1QsVUFBVTtRQUNWLFFBQVE7UUFDUixNQUFNO1FBQ04sVUFBVTtRQUNWLE1BQU07UUFDTixPQUFPO1FBQ1AsVUFBVTtRQUNWLFdBQVc7UUFDWCxXQUFXO1FBQ1gsS0FBSztRQUNMLGFBQWE7UUFDYixLQUFLO1FBQ0wsUUFBUTtRQUNSLFFBQVE7UUFDUixXQUFXO1FBQ1gsT0FBTztRQUNQLFVBQVU7UUFDVixVQUFVO1FBQ1YsT0FBTztRQUNQLFlBQVk7UUFDWixPQUFPO1FBQ1AsVUFBVTtRQUNWLFVBQVU7UUFDVixLQUFLO1FBQ0wsV0FBVztRQUNYLE1BQU07UUFDTixPQUFPO1FBQ1AsU0FBUztRQUNULE1BQU07UUFDTixVQUFVO1FBQ1YsV0FBVztRQUNYLE9BQU87UUFDUCxRQUFRO1FBQ1IsVUFBVTtRQUNWLE9BQU87UUFDUCxTQUFTO1FBQ1QsV0FBVztRQUNYLFVBQVU7UUFDVixNQUFNO1FBQ04sU0FBUztRQUNULGNBQWM7UUFDZCxRQUFRO1FBQ1IsTUFBTTtRQUNOLE1BQU07UUFDTixRQUFRO1FBQ1IsWUFBWTtRQUNaLFVBQVU7UUFDVixXQUFXO1FBQ1gsVUFBVTtRQUNWLFFBQVE7UUFDUixjQUFjO1FBQ2QsYUFBYTtRQUNiLE1BQU07UUFDTixTQUFTO1FBQ1QsWUFBWTtRQUNaLFdBQVc7UUFDWCxlQUFlO1FBQ2YsV0FBVztRQUNYLFdBQVc7UUFDWCxVQUFVO1FBQ1YsT0FBTztRQUNQLFNBQVM7UUFDVCxNQUFNO1FBQ04sU0FBUztRQUNULFFBQVE7UUFDUixPQUFPO1FBQ1AsVUFBVTtRQUNWLFdBQVc7UUFDWCxPQUFPO1FBQ1AsUUFBUTtRQUNSLFVBQVU7UUFDVixTQUFTO1FBQ1QsT0FBTztRQUNQLFlBQVk7UUFDWixXQUFXO1FBQ1gsWUFBWTtRQUNaLE9BQU87UUFDUCxLQUFLO1FBQ0wsVUFBVTtRQUNWLFdBQVc7UUFDWCxVQUFVO1FBQ1YsU0FBUztRQUNULE9BQU87UUFDUCxNQUFNO1FBQ04sT0FBTztRQUNQLE9BQU87UUFDUCxTQUFTO1FBQ1QsTUFBTTtRQUNOLE9BQU87UUFDUCxPQUFPO1FBQ1AsU0FBUztRQUNULE1BQU07UUFDTixPQUFPO1FBQ1AsTUFBTTtRQUNOLEtBQUs7UUFDTCxRQUFRO1FBQ1IsWUFBWTtRQUNaLE9BQU87UUFDUCxNQUFNO1FBQ04sTUFBTTtRQUNOLFVBQVU7UUFDVixRQUFRO1FBQ1IsU0FBUztRQUNULFdBQVc7UUFDWCxPQUFPO1FBQ1AsU0FBUztRQUNULFNBQVM7UUFDVCxRQUFRO1FBQ1IsT0FBTztRQUNQLFdBQVc7UUFDWCxXQUFXO1FBQ1gsU0FBUztRQUNULFVBQVU7UUFDVixPQUFPO1FBQ1AsWUFBWTtRQUNaLFlBQVk7UUFDWixTQUFTO1FBQ1QsTUFBTTtRQUNOLFVBQVU7UUFDVixVQUFVO1FBQ1YsUUFBUTtRQUNSLFFBQVE7UUFDUixRQUFRO1FBQ1IsTUFBTTtRQUNOLFVBQVU7UUFDVixTQUFTO1FBQ1QsT0FBTztRQUNQLGVBQWU7UUFDZixTQUFTO1FBQ1QsV0FBVztRQUNYLE9BQU87UUFDUCxRQUFRO1FBQ1IsTUFBTTtRQUNOLFlBQVk7UUFDWixlQUFlO1FBQ2YsUUFBUTtRQUNSLFVBQVU7UUFDVixNQUFNO1FBQ04sUUFBUTtRQUNSLGFBQWE7UUFDYixRQUFRO1FBQ1IsYUFBYTtRQUNiLFVBQVU7UUFDVixRQUFRO1FBQ1IsUUFBUTtRQUNSLFVBQVU7UUFDVixRQUFRO1FBQ1IsUUFBUTtRQUNSLE1BQU07UUFDTixhQUFhO1FBQ2IsTUFBTTtRQUNOLFFBQVE7UUFDUixVQUFVO1FBQ1YsTUFBTTtRQUNOLEtBQUs7UUFDTCxTQUFTO1FBQ1QsT0FBTztRQUNQLE9BQU87UUFDUCxTQUFTO1FBQ1QsUUFBUTtRQUNSLGNBQWM7UUFDZCxZQUFZO1FBQ1osT0FBTztRQUNQLFlBQVk7UUFDWixVQUFVO1FBQ1YsT0FBTztRQUNQLFlBQVk7UUFDWixRQUFRO1FBQ1IsT0FBTztRQUNQLFFBQVE7UUFDUixPQUFPO1FBQ1AsZUFBZTtRQUNmLFlBQVk7UUFDWixRQUFRO1FBQ1IsUUFBUTtRQUNSLE1BQU07UUFDTixRQUFRO1FBQ1IsU0FBUztRQUNULFVBQVU7UUFDVixPQUFPO1FBQ1AsU0FBUztRQUNULFlBQVk7UUFDWixTQUFTO1FBQ1QsY0FBYztRQUNkLFVBQVU7UUFDVixNQUFNO1FBQ04sVUFBVTtRQUNWLGNBQWM7UUFDZCxZQUFZO1FBQ1osWUFBWTtRQUNaLFdBQVc7UUFDWCxNQUFNO1FBQ04sWUFBWTtRQUNaLE9BQU87UUFDUCxPQUFPO1FBQ1AsT0FBTztRQUNQLFVBQVU7UUFDVixTQUFTO1FBQ1QsUUFBUTtRQUNSLFlBQVk7UUFDWixTQUFTO1FBQ1QsT0FBTztRQUNQLFdBQVc7UUFDWCxZQUFZO1FBQ1osVUFBVTtRQUNWLE9BQU87UUFDUCxNQUFNO1FBQ04sS0FBSztRQUNMLE9BQU87S0FDUjtJQUNELFVBQVUsRUFBRTtRQUNWLENBQUMsRUFBRSxJQUFJO1FBQ1AsRUFBRSxFQUFFLElBQUk7UUFDUixFQUFFLEVBQUUsTUFBTTtRQUNWLEdBQUcsRUFBRSxNQUFNO1FBQ1gsRUFBRSxFQUFFLEtBQUs7UUFDVCxHQUFHLEVBQUUsTUFBTTtRQUNYLEdBQUcsRUFBRSxNQUFNO1FBQ1gsSUFBSSxFQUFFLE9BQU87UUFDYixJQUFJLEVBQUUsT0FBTztRQUNiLEdBQUcsRUFBRSxNQUFNO1FBQ1gsRUFBRSxFQUFFLE1BQU07S0FDWDtJQUNELFFBQVEsRUFBRSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFdBQVcsQ0FBQztJQUNqRCxRQUFRLEVBQUUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDO0NBQ2xHLENBQUMifQ==