{"version":3,"file":"linkify.es-7225a065.js","sources":["../../../node_modules/linkifyjs/dist/linkify.es.js"],"sourcesContent":["// THIS FILE IS AUTOMATICALLY GENERATED DO NOT EDIT DIRECTLY\n// See update-tlds.js for encoding/decoding format\n// https://data.iana.org/TLD/tlds-alpha-by-domain.txt\nconst encodedTlds = 'aaa1rp3barth4b0ott3vie4c1le2ogado5udhabi7c0ademy5centure6ountant0s9o1tor4d0s1ult4e0g1ro2tna4f0l1rica5g0akhan5ency5i0g1rbus3force5tel5kdn3l0faromeo7ibaba4pay4lfinanz6state5y2sace3tom5m0azon4ericanexpress7family11x2fam3ica3sterdam8nalytics7droid5quan4z2o0l2partments8p0le4q0uarelle8r0ab1mco4chi3my2pa2t0e3s0da2ia2sociates9t0hleta5torney7u0ction5di0ble3o3spost5thor3o0s4vianca6w0s2x0a2z0ure5ba0by2idu3namex3narepublic11d1k2r0celona5laycard4s5efoot5gains6seball5ketball8uhaus5yern5b0c1t1va3cg1n2d1e0ats2uty4er2ntley5rlin4st0buy5t2f1g1h0arti5i0ble3d1ke2ng0o3o1z2j1lack0friday9ockbuster8g1omberg7ue3m0s1w2n0pparibas9o0ats3ehringer8fa2m1nd2o0k0ing5sch2tik2on4t1utique6x2r0adesco6idgestone9oadway5ker3ther5ussels7s1t1uild0ers6siness6y1zz3v1w1y1z0h3ca0b1fe2l0l1vinklein9m0era3p2non3petown5ital0one8r0avan4ds2e0er0s4s2sa1e1h1ino4t0ering5holic7ba1n1re2s2c1d1enter4o1rn3f0a1d2g1h0anel2nel4rity4se2t2eap3intai5ristmas6ome4urch5i0priani6rcle4sco3tadel4i0c2y0eats7k1l0aims4eaning6ick2nic1que6othing5ud3ub0med6m1n1o0ach3des3ffee4llege4ogne5m0cast4mbank4unity6pany2re3uter5sec4ndos3struction8ulting7tact3ractors9oking0channel11l1p2rsica5untry4pon0s4rses6pa2r0edit0card4union9icket5own3s1uise0s6u0isinella9v1w1x1y0mru3ou3z2dabur3d1nce3ta1e1ing3sun4y2clk3ds2e0al0er2s3gree4livery5l1oitte5ta3mocrat6ntal2ist5si0gn4v2hl2iamonds6et2gital5rect0ory7scount3ver5h2y2j1k1m1np2o0cs1tor4g1mains5t1wnload7rive4tv2ubai3nlop4pont4rban5vag2r2z2earth3t2c0o2deka3u0cation8e1g1mail3erck5nergy4gineer0ing9terprises10pson4quipment8r0icsson6ni3s0q1tate5t0isalat7u0rovision8s2vents5xchange6pert3osed4ress5traspace10fage2il1rwinds6th3mily4n0s2rm0ers5shion4t3edex3edback6rrari3ero6i0at2delity5o2lm2nal1nce1ial7re0stone6mdale6sh0ing5t0ness6j1k1lickr3ghts4r2orist4wers5y2m1o0o0d0network8tball6rd1ex2sale4um3undation8x2r0ee1senius7l1ogans4ntdoor4ier7tr2ujitsu5n0d2rniture7tbol5yi3ga0l0lery3o1up4me0s3p1rden4y2b0iz3d0n2e0a1nt0ing5orge5f1g0ee3h1i0ft0s3ves2ing5l0ass3e1obal2o4m0ail3bh2o1x2n1odaddy5ld0point6f2o0dyear5g0le4p1t1v2p1q1r0ainger5phics5tis4een3ipe3ocery4up4s1t1u0ardian6cci3ge2ide2tars5ru3w1y2hair2mburg5ngout5us3bo2dfc0bank7ealth0care8lp1sinki6re1mes5gtv3iphop4samitsu7tachi5v2k0t2m1n1ockey4ldings5iday5medepot5goods5s0ense7nda3rse3spital5t0ing5t0eles2s3mail5use3w2r1sbc3t1u0ghes5yatt3undai7ibm2cbc2e1u2d1e0ee3fm2kano4l1m0amat4db2mo0bilien9n0c1dustries8finiti5o2g1k1stitute6urance4e4t0ernational10uit4vestments10o1piranga7q1r0ish4s0maili5t0anbul7t0au2v3jaguar4va3cb2e0ep2tzt3welry6io2ll2m0p2nj2o0bs1urg4t1y2p0morgan6rs3uegos4niper7kaufen5ddi3e0rryhotels6logistics9properties14fh2g1h1i0a1ds2m1nder2le4tchen5wi3m1n1oeln3matsu5sher5p0mg2n2r0d1ed3uokgroup8w1y0oto4z2la0caixa5mborghini8er3ncaster5ia3d0rover6xess5salle5t0ino3robe5w0yer5b1c1ds2ease3clerc5frak4gal2o2xus4gbt3i0dl2fe0insurance9style7ghting6ke2lly3mited4o2ncoln4de2k2psy3ve1ing5k1lc1p2oan0s3cker3us3l1ndon4tte1o3ve3pl0financial11r1s1t0d0a3u0ndbeck6xe1ury5v1y2ma0cys3drid4if1son4keup4n0agement7go3p1rket0ing3s4riott5shalls7serati6ttel5ba2c0kinsey7d1e0d0ia3et2lbourne7me1orial6n0u2rckmsd7g1h1iami3crosoft7l1ni1t2t0subishi9k1l0b1s2m0a2n1o0bi0le4da2e1i1m1nash3ey2ster5rmon3tgage6scow4to0rcycles9v0ie4p1q1r1s0d2t0n1r2u0seum3ic3tual5v1w1x1y1z2na0b1goya4me2tura4vy3ba2c1e0c1t0bank4flix4work5ustar5w0s2xt0direct7us4f0l2g0o2hk2i0co2ke1on3nja3ssan1y5l1o0kia3rthwesternmutual14on4w0ruz3tv4p1r0a1w2tt2u1yc2z2obi1server7ffice5kinawa6layan0group9dnavy5lo3m0ega4ne1g1l0ine5oo2pen3racle3nge4g0anic5igins6saka4tsuka4t2vh3pa0ge2nasonic7ris2s1tners4s1y3ssagens7y2ccw3e0t2f0izer5g1h0armacy6d1ilips5one2to0graphy6s4ysio5ics1tet2ures6d1n0g1k2oneer5zza4k1l0ace2y0station9umbing5s3m1n0c2ohl2ker3litie5rn2st3r0america6xi3ess3ime3o0d0uctions8f1gressive8mo2perties3y5tection8u0dential9s1t1ub2w0c2y2qa1pon3uebec3st5racing4dio4e0ad1lestate6tor2y4cipes5d0stone5umbrella9hab3ise0n3t2liance6n0t0als5pair3ort3ublican8st0aurant8view0s5xroth6ich0ardli6oh3l1o1p2o0cher3ks3deo3gers4om3s0vp3u0gby3hr2n2w0e2yukyu6sa0arland6fe0ty4kura4le1on3msclub4ung5ndvik0coromant12ofi4p1rl2s1ve2xo3b0i1s2c0a1b1haeffler7midt4olarships8ol3ule3warz5ience5ot3d1e0arch3t2cure1ity6ek2lect4ner3rvices6ven3w1x0y3fr2g1h0angrila6rp2w2ell3ia1ksha5oes2p0ping5uji3w0time7i0lk2na1gles5te3j1k0i0n2y0pe4l0ing4m0art3ile4n0cf3o0ccer3ial4ftbank4ware6hu2lar2utions7ng1y2y2pa0ce3ort2t3r0l2s1t0ada2ples4r1tebank4farm7c0group6ockholm6rage3e3ream4udio2y3yle4u0cks3pplies3y2ort5rf1gery5zuki5v1watch4iss4x1y0dney4stems6z2tab1ipei4lk2obao4rget4tamotors6r2too4x0i3c0i2d0k2eam2ch0nology8l1masek5nnis4va3f1g1h0d1eater2re6iaa2ckets5enda4ffany5ps2res2ol4j0maxx4x2k0maxx5l1m0all4n1o0day3kyo3ols3p1ray3shiba5tal3urs3wn2yota3s3r0ade1ing4ining5vel0channel7ers0insurance16ust3v2t1ube2i1nes3shu4v0s2w1z2ua1bank3s2g1k1nicom3versity8o2ol2ps2s1y1z2va0cations7na1guard7c1e0gas3ntures6risign5mögensberater2ung14sicherung10t2g1i0ajes4deo3g1king4llas4n1p1rgin4sa1ion4va1o3laanderen9n1odka3lkswagen7vo3te1ing3o2yage5u0elos6wales2mart4ter4ng0gou5tch0es6eather0channel12bcam3er2site5d0ding5ibo2r3f1hoswho6ien2ki2lliamhill9n0dows4e1ners6me2olterskluwer11odside6rk0s2ld3w2s1tc1f3xbox3erox4finity6ihuan4n2xx2yz3yachts4hoo3maxun5ndex5e1odobashi7ga2kohama6u0tube6t1un3za0ppos4ra3ero3ip2m1one3uerich6w2';\n// Internationalized domain names containing non-ASCII\nconst encodedUtlds = 'ελ1υ2бг1ел3дети4ею2католик6ом3мкд2он1сква6онлайн5рг3рус2ф2сайт3рб3укр3қаз3հայ3ישראל5קום3ابوظبي5تصالات6رامكو5لاردن4بحرين5جزائر5سعودية6عليان5مغرب5مارات5یران5بارت2زار4يتك3ھارت5تونس4سودان3رية5شبكة4عراق2ب2مان4فلسطين6قطر3كاثوليك6وم3مصر2ليسيا5وريتانيا7قع4همراه5پاکستان7ڀارت4कॉम3नेट3भारत0म्3ोत5संगठन5বাংলা5ভারত2ৰত4ਭਾਰਤ4ભારત4ଭାରତ4இந்தியா6லங்கை6சிங்கப்பூர்11భారత్5ಭಾರತ4ഭാരതം5ලංකා4คอม3ไทย3ລາວ3გე2みんな3アマゾン4クラウド4グーグル4コム2ストア3セール3ファッション6ポイント4世界2中信1国1國1文网3亚马逊3企业2佛山2信息2健康2八卦2公司1益2台湾1灣2商城1店1标2嘉里0大酒店5在线2大拿2天主教3娱乐2家電2广东2微博2慈善2我爱你3手机2招聘2政务1府2新加坡2闻2时尚2書籍2机构2淡马锡3游戏2澳門2点看2移动2组织机构4网址1店1站1络2联通2谷歌2购物2通販2集团2電訊盈科4飞利浦3食品2餐厅2香格里拉3港2닷넷1컴2삼성2한국2';\n\n/**\n * @template A\n * @template B\n * @param {A} target\n * @param {B} properties\n * @return {A & B}\n */\nconst assign = (target, properties) => {\n  for (const key in properties) {\n    target[key] = properties[key];\n  }\n  return target;\n};\n\n/**\n * Finite State Machine generation utilities\n */\n\n/**\n * @template T\n * @typedef {{ [group: string]: T[] }} Collections\n */\n\n/**\n * @typedef {{ [group: string]: true }} Flags\n */\n\n// Keys in scanner Collections instances\nconst numeric = 'numeric';\nconst ascii = 'ascii';\nconst alpha = 'alpha';\nconst asciinumeric = 'asciinumeric';\nconst alphanumeric = 'alphanumeric';\nconst domain = 'domain';\nconst emoji = 'emoji';\nconst scheme = 'scheme';\nconst slashscheme = 'slashscheme';\nconst whitespace = 'whitespace';\n\n/**\n * @template T\n * @param {string} name\n * @param {Collections<T>} groups to register in\n * @returns {T[]} Current list of tokens in the given collection\n */\nfunction registerGroup(name, groups) {\n  if (!(name in groups)) {\n    groups[name] = [];\n  }\n  return groups[name];\n}\n\n/**\n * @template T\n * @param {T} t token to add\n * @param {Collections<T>} groups\n * @param {Flags} flags\n */\nfunction addToGroups(t, flags, groups) {\n  if (flags[numeric]) {\n    flags[asciinumeric] = true;\n    flags[alphanumeric] = true;\n  }\n  if (flags[ascii]) {\n    flags[asciinumeric] = true;\n    flags[alpha] = true;\n  }\n  if (flags[asciinumeric]) {\n    flags[alphanumeric] = true;\n  }\n  if (flags[alpha]) {\n    flags[alphanumeric] = true;\n  }\n  if (flags[alphanumeric]) {\n    flags[domain] = true;\n  }\n  if (flags[emoji]) {\n    flags[domain] = true;\n  }\n  for (const k in flags) {\n    const group = registerGroup(k, groups);\n    if (group.indexOf(t) < 0) {\n      group.push(t);\n    }\n  }\n}\n\n/**\n * @template T\n * @param {T} t token to check\n * @param {Collections<T>} groups\n * @returns {Flags} group flags that contain this token\n */\nfunction flagsForToken(t, groups) {\n  const result = {};\n  for (const c in groups) {\n    if (groups[c].indexOf(t) >= 0) {\n      result[c] = true;\n    }\n  }\n  return result;\n}\n\n/**\n * @template T\n * @typedef {null | T } Transition\n */\n\n/**\n * Define a basic state machine state. j is the list of character transitions,\n * jr is the list of regex-match transitions, jd is the default state to\n * transition to t is the accepting token type, if any. If this is the terminal\n * state, then it does not emit a token.\n *\n * The template type T represents the type of the token this state accepts. This\n * should be a string (such as of the token exports in `text.js`) or a\n * MultiToken subclass (from `multi.js`)\n *\n * @template T\n * @param {T} [token] Token that this state emits\n */\nfunction State(token) {\n  if (token === void 0) {\n    token = null;\n  }\n  // this.n = null; // DEBUG: State name\n  /** @type {{ [input: string]: State<T> }} j */\n  this.j = {}; // IMPLEMENTATION 1\n  // this.j = []; // IMPLEMENTATION 2\n  /** @type {[RegExp, State<T>][]} jr */\n  this.jr = [];\n  /** @type {?State<T>} jd */\n  this.jd = null;\n  /** @type {?T} t */\n  this.t = token;\n}\n\n/**\n * Scanner token groups\n * @type Collections<string>\n */\nState.groups = {};\nState.prototype = {\n  accepts() {\n    return !!this.t;\n  },\n  /**\n   * Follow an existing transition from the given input to the next state.\n   * Does not mutate.\n   * @param {string} input character or token type to transition on\n   * @returns {?State<T>} the next state, if any\n   */\n  go(input) {\n    const state = this;\n    const nextState = state.j[input];\n    if (nextState) {\n      return nextState;\n    }\n    for (let i = 0; i < state.jr.length; i++) {\n      const regex = state.jr[i][0];\n      const nextState = state.jr[i][1]; // note: might be empty to prevent default jump\n      if (nextState && regex.test(input)) {\n        return nextState;\n      }\n    }\n    // Nowhere left to jump! Return default, if any\n    return state.jd;\n  },\n  /**\n   * Whether the state has a transition for the given input. Set the second\n   * argument to true to only look for an exact match (and not a default or\n   * regular-expression-based transition)\n   * @param {string} input\n   * @param {boolean} exactOnly\n   */\n  has(input, exactOnly) {\n    if (exactOnly === void 0) {\n      exactOnly = false;\n    }\n    return exactOnly ? input in this.j : !!this.go(input);\n  },\n  /**\n   * Short for \"transition all\"; create a transition from the array of items\n   * in the given list to the same final resulting state.\n   * @param {string | string[]} inputs Group of inputs to transition on\n   * @param {Transition<T> | State<T>} [next] Transition options\n   * @param {Flags} [flags] Collections flags to add token to\n   * @param {Collections<T>} [groups] Master list of token groups\n   */\n  ta(inputs, next, flags, groups) {\n    for (let i = 0; i < inputs.length; i++) {\n      this.tt(inputs[i], next, flags, groups);\n    }\n  },\n  /**\n   * Short for \"take regexp transition\"; defines a transition for this state\n   * when it encounters a token which matches the given regular expression\n   * @param {RegExp} regexp Regular expression transition (populate first)\n   * @param {T | State<T>} [next] Transition options\n   * @param {Flags} [flags] Collections flags to add token to\n   * @param {Collections<T>} [groups] Master list of token groups\n   * @returns {State<T>} taken after the given input\n   */\n  tr(regexp, next, flags, groups) {\n    groups = groups || State.groups;\n    let nextState;\n    if (next && next.j) {\n      nextState = next;\n    } else {\n      // Token with maybe token groups\n      nextState = new State(next);\n      if (flags && groups) {\n        addToGroups(next, flags, groups);\n      }\n    }\n    this.jr.push([regexp, nextState]);\n    return nextState;\n  },\n  /**\n   * Short for \"take transitions\", will take as many sequential transitions as\n   * the length of the given input and returns the\n   * resulting final state.\n   * @param {string | string[]} input\n   * @param {T | State<T>} [next] Transition options\n   * @param {Flags} [flags] Collections flags to add token to\n   * @param {Collections<T>} [groups] Master list of token groups\n   * @returns {State<T>} taken after the given input\n   */\n  ts(input, next, flags, groups) {\n    let state = this;\n    const len = input.length;\n    if (!len) {\n      return state;\n    }\n    for (let i = 0; i < len - 1; i++) {\n      state = state.tt(input[i]);\n    }\n    return state.tt(input[len - 1], next, flags, groups);\n  },\n  /**\n   * Short for \"take transition\", this is a method for building/working with\n   * state machines.\n   *\n   * If a state already exists for the given input, returns it.\n   *\n   * If a token is specified, that state will emit that token when reached by\n   * the linkify engine.\n   *\n   * If no state exists, it will be initialized with some default transitions\n   * that resemble existing default transitions.\n   *\n   * If a state is given for the second argument, that state will be\n   * transitioned to on the given input regardless of what that input\n   * previously did.\n   *\n   * Specify a token group flags to define groups that this token belongs to.\n   * The token will be added to corresponding entires in the given groups\n   * object.\n   *\n   * @param {string} input character, token type to transition on\n   * @param {T | State<T>} [next] Transition options\n   * @param {Flags} [flags] Collections flags to add token to\n   * @param {Collections<T>} [groups] Master list of groups\n   * @returns {State<T>} taken after the given input\n   */\n  tt(input, next, flags, groups) {\n    groups = groups || State.groups;\n    const state = this;\n\n    // Check if existing state given, just a basic transition\n    if (next && next.j) {\n      state.j[input] = next;\n      return next;\n    }\n    const t = next;\n\n    // Take the transition with the usual default mechanisms and use that as\n    // a template for creating the next state\n    let nextState,\n      templateState = state.go(input);\n    if (templateState) {\n      nextState = new State();\n      assign(nextState.j, templateState.j);\n      nextState.jr.push.apply(nextState.jr, templateState.jr);\n      nextState.jd = templateState.jd;\n      nextState.t = templateState.t;\n    } else {\n      nextState = new State();\n    }\n    if (t) {\n      // Ensure newly token is in the same groups as the old token\n      if (groups) {\n        if (nextState.t && typeof nextState.t === 'string') {\n          const allFlags = assign(flagsForToken(nextState.t, groups), flags);\n          addToGroups(t, allFlags, groups);\n        } else if (flags) {\n          addToGroups(t, flags, groups);\n        }\n      }\n      nextState.t = t; // overwrite anything that was previously there\n    }\n\n    state.j[input] = nextState;\n    return nextState;\n  }\n};\n\n// Helper functions to improve minification (not exported outside linkifyjs module)\n\n/**\n * @template T\n * @param {State<T>} state\n * @param {string | string[]} input\n * @param {Flags} [flags]\n * @param {Collections<T>} [groups]\n */\nconst ta = (state, input, next, flags, groups) => state.ta(input, next, flags, groups);\n\n/**\n * @template T\n * @param {State<T>} state\n * @param {RegExp} regexp\n * @param {T | State<T>} [next]\n * @param {Flags} [flags]\n * @param {Collections<T>} [groups]\n */\nconst tr = (state, regexp, next, flags, groups) => state.tr(regexp, next, flags, groups);\n\n/**\n * @template T\n * @param {State<T>} state\n * @param {string | string[]} input\n * @param {T | State<T>} [next]\n * @param {Flags} [flags]\n * @param {Collections<T>} [groups]\n */\nconst ts = (state, input, next, flags, groups) => state.ts(input, next, flags, groups);\n\n/**\n * @template T\n * @param {State<T>} state\n * @param {string} input\n * @param {T | State<T>} [next]\n * @param {Collections<T>} [groups]\n * @param {Flags} [flags]\n */\nconst tt = (state, input, next, flags, groups) => state.tt(input, next, flags, groups);\n\n/******************************************************************************\nText Tokens\nIdentifiers for token outputs from the regexp scanner\n******************************************************************************/\n\n// A valid web domain token\nconst WORD = 'WORD'; // only contains a-z\nconst UWORD = 'UWORD'; // contains letters other than a-z, used for IDN\n\n// Special case of word\nconst LOCALHOST = 'LOCALHOST';\n\n// Valid top-level domain, special case of WORD (see tlds.js)\nconst TLD = 'TLD';\n\n// Valid IDN TLD, special case of UWORD (see tlds.js)\nconst UTLD = 'UTLD';\n\n// The scheme portion of a web URI protocol. Supported types include: `mailto`,\n// `file`, and user-defined custom protocols. Limited to schemes that contain\n// only letters\nconst SCHEME = 'SCHEME';\n\n// Similar to SCHEME, except makes distinction for schemes that must always be\n// followed by `://`, not just `:`. Supported types include `http`, `https`,\n// `ftp`, `ftps`\nconst SLASH_SCHEME = 'SLASH_SCHEME';\n\n// Any sequence of digits 0-9\nconst NUM = 'NUM';\n\n// Any number of consecutive whitespace characters that are not newline\nconst WS = 'WS';\n\n// New line (unix style)\nconst NL$1 = 'NL'; // \\n\n\n// Opening/closing bracket classes\nconst OPENBRACE = 'OPENBRACE'; // {\nconst OPENBRACKET = 'OPENBRACKET'; // [\nconst OPENANGLEBRACKET = 'OPENANGLEBRACKET'; // <\nconst OPENPAREN = 'OPENPAREN'; // (\nconst CLOSEBRACE = 'CLOSEBRACE'; // }\nconst CLOSEBRACKET = 'CLOSEBRACKET'; // ]\nconst CLOSEANGLEBRACKET = 'CLOSEANGLEBRACKET'; // >\nconst CLOSEPAREN = 'CLOSEPAREN'; // )\n\n// Various symbols\nconst AMPERSAND = 'AMPERSAND'; // &\nconst APOSTROPHE = 'APOSTROPHE'; // '\nconst ASTERISK = 'ASTERISK'; // *\nconst AT = 'AT'; // @\nconst BACKSLASH = 'BACKSLASH'; // \\\nconst BACKTICK = 'BACKTICK'; // `\nconst CARET = 'CARET'; // ^\nconst COLON = 'COLON'; // :\nconst COMMA = 'COMMA'; // ,\nconst DOLLAR = 'DOLLAR'; // $\nconst DOT = 'DOT'; // .\nconst EQUALS = 'EQUALS'; // =\nconst EXCLAMATION = 'EXCLAMATION'; // !\nconst HYPHEN = 'HYPHEN'; // -\nconst PERCENT = 'PERCENT'; // %\nconst PIPE = 'PIPE'; // |\nconst PLUS = 'PLUS'; // +\nconst POUND = 'POUND'; // #\nconst QUERY = 'QUERY'; // ?\nconst QUOTE = 'QUOTE'; // \"\n\nconst SEMI = 'SEMI'; // ;\nconst SLASH = 'SLASH'; // /\nconst TILDE = 'TILDE'; // ~\nconst UNDERSCORE = 'UNDERSCORE'; // _\n\n// Emoji symbol\nconst EMOJI$1 = 'EMOJI';\n\n// Default token - anything that is not one of the above\nconst SYM = 'SYM';\n\nvar tk = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tWORD: WORD,\n\tUWORD: UWORD,\n\tLOCALHOST: LOCALHOST,\n\tTLD: TLD,\n\tUTLD: UTLD,\n\tSCHEME: SCHEME,\n\tSLASH_SCHEME: SLASH_SCHEME,\n\tNUM: NUM,\n\tWS: WS,\n\tNL: NL$1,\n\tOPENBRACE: OPENBRACE,\n\tOPENBRACKET: OPENBRACKET,\n\tOPENANGLEBRACKET: OPENANGLEBRACKET,\n\tOPENPAREN: OPENPAREN,\n\tCLOSEBRACE: CLOSEBRACE,\n\tCLOSEBRACKET: CLOSEBRACKET,\n\tCLOSEANGLEBRACKET: CLOSEANGLEBRACKET,\n\tCLOSEPAREN: CLOSEPAREN,\n\tAMPERSAND: AMPERSAND,\n\tAPOSTROPHE: APOSTROPHE,\n\tASTERISK: ASTERISK,\n\tAT: AT,\n\tBACKSLASH: BACKSLASH,\n\tBACKTICK: BACKTICK,\n\tCARET: CARET,\n\tCOLON: COLON,\n\tCOMMA: COMMA,\n\tDOLLAR: DOLLAR,\n\tDOT: DOT,\n\tEQUALS: EQUALS,\n\tEXCLAMATION: EXCLAMATION,\n\tHYPHEN: HYPHEN,\n\tPERCENT: PERCENT,\n\tPIPE: PIPE,\n\tPLUS: PLUS,\n\tPOUND: POUND,\n\tQUERY: QUERY,\n\tQUOTE: QUOTE,\n\tSEMI: SEMI,\n\tSLASH: SLASH,\n\tTILDE: TILDE,\n\tUNDERSCORE: UNDERSCORE,\n\tEMOJI: EMOJI$1,\n\tSYM: SYM\n});\n\n// Note that these two Unicode ones expand into a really big one with Babel\nconst ASCII_LETTER = /[a-z]/;\nconst LETTER = /\\p{L}/u; // Any Unicode character with letter data type\nconst EMOJI = /\\p{Emoji}/u; // Any Unicode emoji character\nconst EMOJI_VARIATION$1 = /\\ufe0f/;\nconst DIGIT = /\\d/;\nconst SPACE = /\\s/;\n\nvar regexp = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tASCII_LETTER: ASCII_LETTER,\n\tLETTER: LETTER,\n\tEMOJI: EMOJI,\n\tEMOJI_VARIATION: EMOJI_VARIATION$1,\n\tDIGIT: DIGIT,\n\tSPACE: SPACE\n});\n\n/**\n\tThe scanner provides an interface that takes a string of text as input, and\n\toutputs an array of tokens instances that can be used for easy URL parsing.\n*/\nconst NL = '\\n'; // New line character\nconst EMOJI_VARIATION = '\\ufe0f'; // Variation selector, follows heart and others\nconst EMOJI_JOINER = '\\u200d'; // zero-width joiner\n\nlet tlds = null,\n  utlds = null; // don't change so only have to be computed once\n\n/**\n * Scanner output token:\n * - `t` is the token name (e.g., 'NUM', 'EMOJI', 'TLD')\n * - `v` is the value of the token (e.g., '123', '❤️', 'com')\n * - `s` is the start index of the token in the original string\n * - `e` is the end index of the token in the original string\n * @typedef {{t: string, v: string, s: number, e: number}} Token\n */\n\n/**\n * @template T\n * @typedef {{ [collection: string]: T[] }} Collections\n */\n\n/**\n * Initialize the scanner character-based state machine for the given start\n * state\n * @param {[string, boolean][]} customSchemes List of custom schemes, where each\n * item is a length-2 tuple with the first element set to the string scheme, and\n * the second element set to `true` if the `://` after the scheme is optional\n */\nfunction init$2(customSchemes) {\n  if (customSchemes === void 0) {\n    customSchemes = [];\n  }\n  // Frequently used states (name argument removed during minification)\n  /** @type Collections<string> */\n  const groups = {}; // of tokens\n  State.groups = groups;\n  /** @type State<string> */\n  const Start = new State();\n  if (tlds == null) {\n    tlds = decodeTlds(encodedTlds);\n  }\n  if (utlds == null) {\n    utlds = decodeTlds(encodedUtlds);\n  }\n\n  // States for special URL symbols that accept immediately after start\n  tt(Start, \"'\", APOSTROPHE);\n  tt(Start, '{', OPENBRACE);\n  tt(Start, '[', OPENBRACKET);\n  tt(Start, '<', OPENANGLEBRACKET);\n  tt(Start, '(', OPENPAREN);\n  tt(Start, '}', CLOSEBRACE);\n  tt(Start, ']', CLOSEBRACKET);\n  tt(Start, '>', CLOSEANGLEBRACKET);\n  tt(Start, ')', CLOSEPAREN);\n  tt(Start, '&', AMPERSAND);\n  tt(Start, '*', ASTERISK);\n  tt(Start, '@', AT);\n  tt(Start, '`', BACKTICK);\n  tt(Start, '^', CARET);\n  tt(Start, ':', COLON);\n  tt(Start, ',', COMMA);\n  tt(Start, '$', DOLLAR);\n  tt(Start, '.', DOT);\n  tt(Start, '=', EQUALS);\n  tt(Start, '!', EXCLAMATION);\n  tt(Start, '-', HYPHEN);\n  tt(Start, '%', PERCENT);\n  tt(Start, '|', PIPE);\n  tt(Start, '+', PLUS);\n  tt(Start, '#', POUND);\n  tt(Start, '?', QUERY);\n  tt(Start, '\"', QUOTE);\n  tt(Start, '/', SLASH);\n  tt(Start, ';', SEMI);\n  tt(Start, '~', TILDE);\n  tt(Start, '_', UNDERSCORE);\n  tt(Start, '\\\\', BACKSLASH);\n  const Num = tr(Start, DIGIT, NUM, {\n    [numeric]: true\n  });\n  tr(Num, DIGIT, Num);\n\n  // State which emits a word token\n  const Word = tr(Start, ASCII_LETTER, WORD, {\n    [ascii]: true\n  });\n  tr(Word, ASCII_LETTER, Word);\n\n  // Same as previous, but specific to non-fsm.ascii alphabet words\n  const UWord = tr(Start, LETTER, UWORD, {\n    [alpha]: true\n  });\n  tr(UWord, ASCII_LETTER); // Non-accepting\n  tr(UWord, LETTER, UWord);\n\n  // Whitespace jumps\n  // Tokens of only non-newline whitespace are arbitrarily long\n  // If any whitespace except newline, more whitespace!\n  const Ws = tr(Start, SPACE, WS, {\n    [whitespace]: true\n  });\n  tt(Start, NL, NL$1, {\n    [whitespace]: true\n  });\n  tt(Ws, NL); // non-accepting state to avoid mixing whitespaces\n  tr(Ws, SPACE, Ws);\n\n  // Emoji tokens. They are not grouped by the scanner except in cases where a\n  // zero-width joiner is present\n  const Emoji = tr(Start, EMOJI, EMOJI$1, {\n    [emoji]: true\n  });\n  tr(Emoji, EMOJI, Emoji);\n  tt(Emoji, EMOJI_VARIATION, Emoji);\n  // tt(Start, EMOJI_VARIATION, Emoji); // This one is sketchy\n\n  const EmojiJoiner = tt(Emoji, EMOJI_JOINER);\n  tr(EmojiJoiner, EMOJI, Emoji);\n  // tt(EmojiJoiner, EMOJI_VARIATION, Emoji); // also sketchy\n\n  // Generates states for top-level domains\n  // Note that this is most accurate when tlds are in alphabetical order\n  const wordjr = [[ASCII_LETTER, Word]];\n  const uwordjr = [[ASCII_LETTER, null], [LETTER, UWord]];\n  for (let i = 0; i < tlds.length; i++) {\n    fastts(Start, tlds[i], TLD, WORD, wordjr);\n  }\n  for (let i = 0; i < utlds.length; i++) {\n    fastts(Start, utlds[i], UTLD, UWORD, uwordjr);\n  }\n  addToGroups(TLD, {\n    tld: true,\n    ascii: true\n  }, groups);\n  addToGroups(UTLD, {\n    utld: true,\n    alpha: true\n  }, groups);\n\n  // Collect the states generated by different protocols. NOTE: If any new TLDs\n  // get added that are also protocols, set the token to be the same as the\n  // protocol to ensure parsing works as expected.\n  fastts(Start, 'file', SCHEME, WORD, wordjr);\n  fastts(Start, 'mailto', SCHEME, WORD, wordjr);\n  fastts(Start, 'http', SLASH_SCHEME, WORD, wordjr);\n  fastts(Start, 'https', SLASH_SCHEME, WORD, wordjr);\n  fastts(Start, 'ftp', SLASH_SCHEME, WORD, wordjr);\n  fastts(Start, 'ftps', SLASH_SCHEME, WORD, wordjr);\n  addToGroups(SCHEME, {\n    scheme: true,\n    ascii: true\n  }, groups);\n  addToGroups(SLASH_SCHEME, {\n    slashscheme: true,\n    ascii: true\n  }, groups);\n\n  // Register custom schemes. Assumes each scheme is asciinumeric with hyphens\n  customSchemes = customSchemes.sort((a, b) => a[0] > b[0] ? 1 : -1);\n  for (let i = 0; i < customSchemes.length; i++) {\n    const sch = customSchemes[i][0];\n    const optionalSlashSlash = customSchemes[i][1];\n    const flags = optionalSlashSlash ? {\n      [scheme]: true\n    } : {\n      [slashscheme]: true\n    };\n    if (sch.indexOf('-') >= 0) {\n      flags[domain] = true;\n    } else if (!ASCII_LETTER.test(sch)) {\n      flags[numeric] = true; // numbers only\n    } else if (DIGIT.test(sch)) {\n      flags[asciinumeric] = true;\n    } else {\n      flags[ascii] = true;\n    }\n    ts(Start, sch, sch, flags);\n  }\n\n  // Localhost token\n  ts(Start, 'localhost', LOCALHOST, {\n    ascii: true\n  });\n\n  // Set default transition for start state (some symbol)\n  Start.jd = new State(SYM);\n  return {\n    start: Start,\n    tokens: assign({\n      groups\n    }, tk)\n  };\n}\n\n/**\n\tGiven a string, returns an array of TOKEN instances representing the\n\tcomposition of that string.\n\n\t@method run\n\t@param {State<string>} start scanner starting state\n\t@param {string} str input string to scan\n\t@return {Token[]} list of tokens, each with a type and value\n*/\nfunction run$1(start, str) {\n  // State machine is not case sensitive, so input is tokenized in lowercased\n  // form (still returns regular case). Uses selective `toLowerCase` because\n  // lowercasing the entire string causes the length and character position to\n  // vary in some non-English strings with V8-based runtimes.\n  const iterable = stringToArray(str.replace(/[A-Z]/g, c => c.toLowerCase()));\n  const charCount = iterable.length; // <= len if there are emojis, etc\n  const tokens = []; // return value\n\n  // cursor through the string itself, accounting for characters that have\n  // width with length 2 such as emojis\n  let cursor = 0;\n\n  // Cursor through the array-representation of the string\n  let charCursor = 0;\n\n  // Tokenize the string\n  while (charCursor < charCount) {\n    let state = start;\n    let nextState = null;\n    let tokenLength = 0;\n    let latestAccepting = null;\n    let sinceAccepts = -1;\n    let charsSinceAccepts = -1;\n    while (charCursor < charCount && (nextState = state.go(iterable[charCursor]))) {\n      state = nextState;\n\n      // Keep track of the latest accepting state\n      if (state.accepts()) {\n        sinceAccepts = 0;\n        charsSinceAccepts = 0;\n        latestAccepting = state;\n      } else if (sinceAccepts >= 0) {\n        sinceAccepts += iterable[charCursor].length;\n        charsSinceAccepts++;\n      }\n      tokenLength += iterable[charCursor].length;\n      cursor += iterable[charCursor].length;\n      charCursor++;\n    }\n\n    // Roll back to the latest accepting state\n    cursor -= sinceAccepts;\n    charCursor -= charsSinceAccepts;\n    tokenLength -= sinceAccepts;\n\n    // No more jumps, just make a new token from the last accepting one\n    tokens.push({\n      t: latestAccepting.t,\n      // token type/name\n      v: str.slice(cursor - tokenLength, cursor),\n      // string value\n      s: cursor - tokenLength,\n      // start index\n      e: cursor // end index (excluding)\n    });\n  }\n\n  return tokens;\n}\n\n/**\n * Convert a String to an Array of characters, taking into account that some\n * characters like emojis take up two string indexes.\n *\n * Adapted from core-js (MIT license)\n * https://github.com/zloirock/core-js/blob/2d69cf5f99ab3ea3463c395df81e5a15b68f49d9/packages/core-js/internals/string-multibyte.js\n *\n * @function stringToArray\n * @param {string} str\n * @returns {string[]}\n */\nfunction stringToArray(str) {\n  const result = [];\n  const len = str.length;\n  let index = 0;\n  while (index < len) {\n    let first = str.charCodeAt(index);\n    let second;\n    let char = first < 0xd800 || first > 0xdbff || index + 1 === len || (second = str.charCodeAt(index + 1)) < 0xdc00 || second > 0xdfff ? str[index] // single character\n    : str.slice(index, index + 2); // two-index characters\n    result.push(char);\n    index += char.length;\n  }\n  return result;\n}\n\n/**\n * Fast version of ts function for when transition defaults are well known\n * @param {State<string>} state\n * @param {string} input\n * @param {string} t\n * @param {string} defaultt\n * @param {[RegExp, State<string>][]} jr\n * @returns {State<string>}\n */\nfunction fastts(state, input, t, defaultt, jr) {\n  let next;\n  const len = input.length;\n  for (let i = 0; i < len - 1; i++) {\n    const char = input[i];\n    if (state.j[char]) {\n      next = state.j[char];\n    } else {\n      next = new State(defaultt);\n      next.jr = jr.slice();\n      state.j[char] = next;\n    }\n    state = next;\n  }\n  next = new State(t);\n  next.jr = jr.slice();\n  state.j[input[len - 1]] = next;\n  return next;\n}\n\n/**\n * Converts a string of Top-Level Domain names encoded in update-tlds.js back\n * into a list of strings.\n * @param {str} encoded encoded TLDs string\n * @returns {str[]} original TLDs list\n */\nfunction decodeTlds(encoded) {\n  const words = [];\n  const stack = [];\n  let i = 0;\n  let digits = '0123456789';\n  while (i < encoded.length) {\n    let popDigitCount = 0;\n    while (digits.indexOf(encoded[i + popDigitCount]) >= 0) {\n      popDigitCount++; // encountered some digits, have to pop to go one level up trie\n    }\n\n    if (popDigitCount > 0) {\n      words.push(stack.join('')); // whatever preceded the pop digits must be a word\n      for (let popCount = parseInt(encoded.substring(i, i + popDigitCount), 10); popCount > 0; popCount--) {\n        stack.pop();\n      }\n      i += popDigitCount;\n    } else {\n      stack.push(encoded[i]); // drop down a level into the trie\n      i++;\n    }\n  }\n  return words;\n}\n\n/**\n * An object where each key is a valid DOM Event Name such as `click` or `focus`\n * and each value is an event handler function.\n *\n * https://developer.mozilla.org/en-US/docs/Web/API/Element#events\n * @typedef {?{ [event: string]: Function }} EventListeners\n */\n\n/**\n * All formatted properties required to render a link, including `tagName`,\n * `attributes`, `content` and `eventListeners`.\n * @typedef {{ tagName: any, attributes: {[attr: string]: any}, content: string,\n * eventListeners: EventListeners }} IntermediateRepresentation\n */\n\n/**\n * Specify either an object described by the template type `O` or a function.\n *\n * The function takes a string value (usually the link's href attribute), the\n * link type (`'url'`, `'hashtag`', etc.) and an internal token representation\n * of the link. It should return an object of the template type `O`\n * @template O\n * @typedef {O | ((value: string, type: string, token: MultiToken) => O)} OptObj\n */\n\n/**\n * Specify either a function described by template type `F` or an object.\n *\n * Each key in the object should be a link type (`'url'`, `'hashtag`', etc.). Each\n * value should be a function with template type `F` that is called when the\n * corresponding link type is encountered.\n * @template F\n * @typedef {F | { [type: string]: F}} OptFn\n */\n\n/**\n * Specify either a value with template type `V`, a function that returns `V` or\n * an object where each value resolves to `V`.\n *\n * The function takes a string value (usually the link's href attribute), the\n * link type (`'url'`, `'hashtag`', etc.) and an internal token representation\n * of the link. It should return an object of the template type `V`\n *\n * For the object, each key should be a link type (`'url'`, `'hashtag`', etc.).\n * Each value should either have type `V` or a function that returns V. This\n * function similarly takes a string value and a token.\n *\n * Example valid types for `Opt<string>`:\n *\n * ```js\n * 'hello'\n * (value, type, token) => 'world'\n * { url: 'hello', email: (value, token) => 'world'}\n * ```\n * @template V\n * @typedef {V | ((value: string, type: string, token: MultiToken) => V) | { [type: string]: V | ((value: string, token: MultiToken) => V) }} Opt\n */\n\n/**\n * See available options: https://linkify.js.org/docs/options.html\n * @typedef {{\n * \tdefaultProtocol?: string,\n *  events?: OptObj<EventListeners>,\n * \tformat?: Opt<string>,\n * \tformatHref?: Opt<string>,\n * \tnl2br?: boolean,\n * \ttagName?: Opt<any>,\n * \ttarget?: Opt<string>,\n * \trel?: Opt<string>,\n * \tvalidate?: Opt<boolean>,\n * \ttruncate?: Opt<number>,\n * \tclassName?: Opt<string>,\n * \tattributes?: OptObj<({ [attr: string]: any })>,\n *  ignoreTags?: string[],\n * \trender?: OptFn<((ir: IntermediateRepresentation) => any)>\n * }} Opts\n */\n\n/**\n * @type Required<Opts>\n */\nconst defaults = {\n  defaultProtocol: 'http',\n  events: null,\n  format: noop,\n  formatHref: noop,\n  nl2br: false,\n  tagName: 'a',\n  target: null,\n  rel: null,\n  validate: true,\n  truncate: Infinity,\n  className: null,\n  attributes: null,\n  ignoreTags: [],\n  render: null\n};\n\n/**\n * Utility class for linkify interfaces to apply specified\n * {@link Opts formatting and rendering options}.\n *\n * @param {Opts | Options} [opts] Option value overrides.\n * @param {(ir: IntermediateRepresentation) => any} [defaultRender] (For\n *   internal use) default render function that determines how to generate an\n *   HTML element based on a link token's derived tagName, attributes and HTML.\n *   Similar to render option\n */\nfunction Options(opts, defaultRender) {\n  if (defaultRender === void 0) {\n    defaultRender = null;\n  }\n  let o = assign({}, defaults);\n  if (opts) {\n    o = assign(o, opts instanceof Options ? opts.o : opts);\n  }\n\n  // Ensure all ignored tags are uppercase\n  const ignoredTags = o.ignoreTags;\n  const uppercaseIgnoredTags = [];\n  for (let i = 0; i < ignoredTags.length; i++) {\n    uppercaseIgnoredTags.push(ignoredTags[i].toUpperCase());\n  }\n  /** @protected */\n  this.o = o;\n  if (defaultRender) {\n    this.defaultRender = defaultRender;\n  }\n  this.ignoreTags = uppercaseIgnoredTags;\n}\nOptions.prototype = {\n  o: defaults,\n  /**\n   * @type string[]\n   */\n  ignoreTags: [],\n  /**\n   * @param {IntermediateRepresentation} ir\n   * @returns {any}\n   */\n  defaultRender(ir) {\n    return ir;\n  },\n  /**\n   * Returns true or false based on whether a token should be displayed as a\n   * link based on the user options.\n   * @param {MultiToken} token\n   * @returns {boolean}\n   */\n  check(token) {\n    return this.get('validate', token.toString(), token);\n  },\n  // Private methods\n\n  /**\n   * Resolve an option's value based on the value of the option and the given\n   * params. If operator and token are specified and the target option is\n   * callable, automatically calls the function with the given argument.\n   * @template {keyof Opts} K\n   * @param {K} key Name of option to use\n   * @param {string} [operator] will be passed to the target option if it's a\n   * function. If not specified, RAW function value gets returned\n   * @param {MultiToken} [token] The token from linkify.tokenize\n   * @returns {Opts[K] | any}\n   */\n  get(key, operator, token) {\n    const isCallable = operator != null;\n    let option = this.o[key];\n    if (!option) {\n      return option;\n    }\n    if (typeof option === 'object') {\n      option = token.t in option ? option[token.t] : defaults[key];\n      if (typeof option === 'function' && isCallable) {\n        option = option(operator, token);\n      }\n    } else if (typeof option === 'function' && isCallable) {\n      option = option(operator, token.t, token);\n    }\n    return option;\n  },\n  /**\n   * @template {keyof Opts} L\n   * @param {L} key Name of options object to use\n   * @param {string} [operator]\n   * @param {MultiToken} [token]\n   * @returns {Opts[L] | any}\n   */\n  getObj(key, operator, token) {\n    let obj = this.o[key];\n    if (typeof obj === 'function' && operator != null) {\n      obj = obj(operator, token.t, token);\n    }\n    return obj;\n  },\n  /**\n   * Convert the given token to a rendered element that may be added to the\n   * calling-interface's DOM\n   * @param {MultiToken} token Token to render to an HTML element\n   * @returns {any} Render result; e.g., HTML string, DOM element, React\n   *   Component, etc.\n   */\n  render(token) {\n    const ir = token.render(this); // intermediate representation\n    const renderFn = this.get('render', null, token) || this.defaultRender;\n    return renderFn(ir, token.t, token);\n  }\n};\nfunction noop(val) {\n  return val;\n}\n\nvar options = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tdefaults: defaults,\n\tOptions: Options,\n\tassign: assign\n});\n\n/******************************************************************************\n\tMulti-Tokens\n\tTokens composed of arrays of TextTokens\n******************************************************************************/\n\n/**\n * @param {string} value\n * @param {Token[]} tokens\n */\nfunction MultiToken(value, tokens) {\n  this.t = 'token';\n  this.v = value;\n  this.tk = tokens;\n}\n\n/**\n * Abstract class used for manufacturing tokens of text tokens. That is rather\n * than the value for a token being a small string of text, it's value an array\n * of text tokens.\n *\n * Used for grouping together URLs, emails, hashtags, and other potential\n * creations.\n * @class MultiToken\n * @property {string} t\n * @property {string} v\n * @property {Token[]} tk\n * @abstract\n */\nMultiToken.prototype = {\n  isLink: false,\n  /**\n   * Return the string this token represents.\n   * @return {string}\n   */\n  toString() {\n    return this.v;\n  },\n  /**\n   * What should the value for this token be in the `href` HTML attribute?\n   * Returns the `.toString` value by default.\n   * @param {string} [scheme]\n   * @return {string}\n  */\n  toHref(scheme) {\n    return this.toString();\n  },\n  /**\n   * @param {Options} options Formatting options\n   * @returns {string}\n   */\n  toFormattedString(options) {\n    const val = this.toString();\n    const truncate = options.get('truncate', val, this);\n    const formatted = options.get('format', val, this);\n    return truncate && formatted.length > truncate ? formatted.substring(0, truncate) + '…' : formatted;\n  },\n  /**\n   *\n   * @param {Options} options\n   * @returns {string}\n   */\n  toFormattedHref(options) {\n    return options.get('formatHref', this.toHref(options.get('defaultProtocol')), this);\n  },\n  /**\n   * The start index of this token in the original input string\n   * @returns {number}\n   */\n  startIndex() {\n    return this.tk[0].s;\n  },\n  /**\n   * The end index of this token in the original input string (up to this\n   * index but not including it)\n   * @returns {number}\n   */\n  endIndex() {\n    return this.tk[this.tk.length - 1].e;\n  },\n  /**\n  \tReturns an object  of relevant values for this token, which includes keys\n  \t* type - Kind of token ('url', 'email', etc.)\n  \t* value - Original text\n  \t* href - The value that should be added to the anchor tag's href\n  \t\tattribute\n  \t\t@method toObject\n  \t@param {string} [protocol] `'http'` by default\n  */\n  toObject(protocol) {\n    if (protocol === void 0) {\n      protocol = defaults.defaultProtocol;\n    }\n    return {\n      type: this.t,\n      value: this.toString(),\n      isLink: this.isLink,\n      href: this.toHref(protocol),\n      start: this.startIndex(),\n      end: this.endIndex()\n    };\n  },\n  /**\n   *\n   * @param {Options} options Formatting option\n   */\n  toFormattedObject(options) {\n    return {\n      type: this.t,\n      value: this.toFormattedString(options),\n      isLink: this.isLink,\n      href: this.toFormattedHref(options),\n      start: this.startIndex(),\n      end: this.endIndex()\n    };\n  },\n  /**\n   * Whether this token should be rendered as a link according to the given options\n   * @param {Options} options\n   * @returns {boolean}\n   */\n  validate(options) {\n    return options.get('validate', this.toString(), this);\n  },\n  /**\n   * Return an object that represents how this link should be rendered.\n   * @param {Options} options Formattinng options\n   */\n  render(options) {\n    const token = this;\n    const href = this.toHref(options.get('defaultProtocol'));\n    const formattedHref = options.get('formatHref', href, this);\n    const tagName = options.get('tagName', href, token);\n    const content = this.toFormattedString(options);\n    const attributes = {};\n    const className = options.get('className', href, token);\n    const target = options.get('target', href, token);\n    const rel = options.get('rel', href, token);\n    const attrs = options.getObj('attributes', href, token);\n    const eventListeners = options.getObj('events', href, token);\n    attributes.href = formattedHref;\n    if (className) {\n      attributes.class = className;\n    }\n    if (target) {\n      attributes.target = target;\n    }\n    if (rel) {\n      attributes.rel = rel;\n    }\n    if (attrs) {\n      assign(attributes, attrs);\n    }\n    return {\n      tagName,\n      attributes,\n      content,\n      eventListeners\n    };\n  }\n};\n\n/**\n * Create a new token that can be emitted by the parser state machine\n * @param {string} type readable type of the token\n * @param {object} props properties to assign or override, including isLink = true or false\n * @returns {new (value: string, tokens: Token[]) => MultiToken} new token class\n */\nfunction createTokenClass(type, props) {\n  class Token extends MultiToken {\n    constructor(value, tokens) {\n      super(value, tokens);\n      this.t = type;\n    }\n  }\n  for (const p in props) {\n    Token.prototype[p] = props[p];\n  }\n  Token.t = type;\n  return Token;\n}\n\n/**\n\tRepresents a list of tokens making up a valid email address\n*/\nconst Email = createTokenClass('email', {\n  isLink: true,\n  toHref() {\n    return 'mailto:' + this.toString();\n  }\n});\n\n/**\n\tRepresents some plain text\n*/\nconst Text = createTokenClass('text');\n\n/**\n\tMulti-linebreak token - represents a line break\n\t@class Nl\n*/\nconst Nl = createTokenClass('nl');\n\n/**\n\tRepresents a list of text tokens making up a valid URL\n\t@class Url\n*/\nconst Url = createTokenClass('url', {\n  isLink: true,\n  /**\n  \tLowercases relevant parts of the domain and adds the protocol if\n  \trequired. Note that this will not escape unsafe HTML characters in the\n  \tURL.\n  \t\t@param {string} [scheme] default scheme (e.g., 'https')\n  \t@return {string} the full href\n  */\n  toHref(scheme) {\n    if (scheme === void 0) {\n      scheme = defaults.defaultProtocol;\n    }\n    // Check if already has a prefix scheme\n    return this.hasProtocol() ? this.v : `${scheme}://${this.v}`;\n  },\n  /**\n   * Check whether this URL token has a protocol\n   * @return {boolean}\n   */\n  hasProtocol() {\n    const tokens = this.tk;\n    return tokens.length >= 2 && tokens[0].t !== LOCALHOST && tokens[1].t === COLON;\n  }\n});\n\nvar multi = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tMultiToken: MultiToken,\n\tBase: MultiToken,\n\tcreateTokenClass: createTokenClass,\n\tEmail: Email,\n\tText: Text,\n\tNl: Nl,\n\tUrl: Url\n});\n\n/**\n\tNot exactly parser, more like the second-stage scanner (although we can\n\ttheoretically hotswap the code here with a real parser in the future... but\n\tfor a little URL-finding utility abstract syntax trees may be a little\n\toverkill).\n\n\tURL format: http://en.wikipedia.org/wiki/URI_scheme\n\tEmail format: http://en.wikipedia.org/wiki/EmailAddress (links to RFC in\n\treference)\n\n\t@module linkify\n\t@submodule parser\n\t@main run\n*/\nconst makeState = arg => new State(arg);\n\n/**\n * Generate the parser multi token-based state machine\n * @param {{ groups: Collections<string> }} tokens\n */\nfunction init$1(_ref) {\n  let {\n    groups\n  } = _ref;\n  // Types of characters the URL can definitely end in\n  const qsAccepting = groups.domain.concat([AMPERSAND, ASTERISK, AT, BACKSLASH, BACKTICK, CARET, DOLLAR, EQUALS, HYPHEN, NUM, PERCENT, PIPE, PLUS, POUND, SLASH, SYM, TILDE, UNDERSCORE]);\n\n  // Types of tokens that can follow a URL and be part of the query string\n  // but cannot be the very last characters\n  // Characters that cannot appear in the URL at all should be excluded\n  const qsNonAccepting = [APOSTROPHE, CLOSEANGLEBRACKET, CLOSEBRACE, CLOSEBRACKET, CLOSEPAREN, COLON, COMMA, DOT, EXCLAMATION, OPENANGLEBRACKET, OPENBRACE, OPENBRACKET, OPENPAREN, QUERY, QUOTE, SEMI];\n\n  // For addresses without the mailto prefix\n  // Tokens allowed in the localpart of the email\n  const localpartAccepting = [AMPERSAND, APOSTROPHE, ASTERISK, BACKSLASH, BACKTICK, CARET, CLOSEBRACE, DOLLAR, EQUALS, HYPHEN, OPENBRACE, PERCENT, PIPE, PLUS, POUND, QUERY, SLASH, SYM, TILDE, UNDERSCORE];\n\n  // The universal starting state.\n  /**\n   * @type State<Token>\n   */\n  const Start = makeState();\n  const Localpart = tt(Start, TILDE); // Local part of the email address\n  ta(Localpart, localpartAccepting, Localpart);\n  ta(Localpart, groups.domain, Localpart);\n  const Domain = makeState(),\n    Scheme = makeState(),\n    SlashScheme = makeState();\n  ta(Start, groups.domain, Domain); // parsed string ends with a potential domain name (A)\n  ta(Start, groups.scheme, Scheme); // e.g., 'mailto'\n  ta(Start, groups.slashscheme, SlashScheme); // e.g., 'http'\n\n  ta(Domain, localpartAccepting, Localpart);\n  ta(Domain, groups.domain, Domain);\n  const LocalpartAt = tt(Domain, AT); // Local part of the email address plus @\n\n  tt(Localpart, AT, LocalpartAt); // close to an email address now\n\n  // Local part of an email address can be e.g. 'http' or 'mailto'\n  tt(Scheme, AT, LocalpartAt);\n  tt(SlashScheme, AT, LocalpartAt);\n  const LocalpartDot = tt(Localpart, DOT); // Local part of the email address plus '.' (localpart cannot end in .)\n  ta(LocalpartDot, localpartAccepting, Localpart);\n  ta(LocalpartDot, groups.domain, Localpart);\n  const EmailDomain = makeState();\n  ta(LocalpartAt, groups.domain, EmailDomain); // parsed string starts with local email info + @ with a potential domain name\n  ta(EmailDomain, groups.domain, EmailDomain);\n  const EmailDomainDot = tt(EmailDomain, DOT); // domain followed by DOT\n  ta(EmailDomainDot, groups.domain, EmailDomain);\n  const Email$1 = makeState(Email); // Possible email address (could have more tlds)\n  ta(EmailDomainDot, groups.tld, Email$1);\n  ta(EmailDomainDot, groups.utld, Email$1);\n  tt(LocalpartAt, LOCALHOST, Email$1);\n\n  // Hyphen can jump back to a domain name\n  const EmailDomainHyphen = tt(EmailDomain, HYPHEN); // parsed string starts with local email info + @ with a potential domain name\n  ta(EmailDomainHyphen, groups.domain, EmailDomain);\n  ta(Email$1, groups.domain, EmailDomain);\n  tt(Email$1, DOT, EmailDomainDot);\n  tt(Email$1, HYPHEN, EmailDomainHyphen);\n\n  // Final possible email states\n  const EmailColon = tt(Email$1, COLON); // URL followed by colon (potential port number here)\n  /*const EmailColonPort = */\n  ta(EmailColon, groups.numeric, Email); // URL followed by colon and port numner\n\n  // Account for dots and hyphens. Hyphens are usually parts of domain names\n  // (but not TLDs)\n  const DomainHyphen = tt(Domain, HYPHEN); // domain followed by hyphen\n  const DomainDot = tt(Domain, DOT); // domain followed by DOT\n  ta(DomainHyphen, groups.domain, Domain);\n  ta(DomainDot, localpartAccepting, Localpart);\n  ta(DomainDot, groups.domain, Domain);\n  const DomainDotTld = makeState(Url); // Simplest possible URL with no query string\n  ta(DomainDot, groups.tld, DomainDotTld);\n  ta(DomainDot, groups.utld, DomainDotTld);\n  ta(DomainDotTld, groups.domain, Domain);\n  ta(DomainDotTld, localpartAccepting, Localpart);\n  tt(DomainDotTld, DOT, DomainDot);\n  tt(DomainDotTld, HYPHEN, DomainHyphen);\n  tt(DomainDotTld, AT, LocalpartAt);\n  const DomainDotTldColon = tt(DomainDotTld, COLON); // URL followed by colon (potential port number here)\n  const DomainDotTldColonPort = makeState(Url); // TLD followed by a port number\n  ta(DomainDotTldColon, groups.numeric, DomainDotTldColonPort);\n\n  // Long URL with optional port and maybe query string\n  const Url$1 = makeState(Url);\n\n  // URL with extra symbols at the end, followed by an opening bracket\n  const UrlNonaccept = makeState(); // URL followed by some symbols (will not be part of the final URL)\n\n  // Query strings\n  ta(Url$1, qsAccepting, Url$1);\n  ta(Url$1, qsNonAccepting, UrlNonaccept);\n  ta(UrlNonaccept, qsAccepting, Url$1);\n  ta(UrlNonaccept, qsNonAccepting, UrlNonaccept);\n\n  // Become real URLs after `SLASH` or `COLON NUM SLASH`\n  // Here works with or without scheme:// prefix\n  tt(DomainDotTld, SLASH, Url$1);\n  tt(DomainDotTldColonPort, SLASH, Url$1);\n\n  // Note that domains that begin with schemes are treated slighly differently\n  const SchemeColon = tt(Scheme, COLON); // e.g., 'mailto:'\n  const SlashSchemeColon = tt(SlashScheme, COLON); // e.g., 'http:'\n  const SlashSchemeColonSlash = tt(SlashSchemeColon, SLASH); // e.g., 'http:/'\n\n  const UriPrefix = tt(SlashSchemeColonSlash, SLASH); // e.g., 'http://'\n\n  // Scheme states can transition to domain states\n  ta(Scheme, groups.domain, Domain);\n  tt(Scheme, DOT, DomainDot);\n  tt(Scheme, HYPHEN, DomainHyphen);\n  ta(SlashScheme, groups.domain, Domain);\n  tt(SlashScheme, DOT, DomainDot);\n  tt(SlashScheme, HYPHEN, DomainHyphen);\n\n  // Force URL with scheme prefix followed by anything sane\n  ta(SchemeColon, groups.domain, Url$1);\n  tt(SchemeColon, SLASH, Url$1);\n  ta(UriPrefix, groups.domain, Url$1);\n  ta(UriPrefix, qsAccepting, Url$1);\n  tt(UriPrefix, SLASH, Url$1);\n\n  // URL, followed by an opening bracket\n  const UrlOpenbrace = tt(Url$1, OPENBRACE); // URL followed by {\n  const UrlOpenbracket = tt(Url$1, OPENBRACKET); // URL followed by [\n  const UrlOpenanglebracket = tt(Url$1, OPENANGLEBRACKET); // URL followed by <\n  const UrlOpenparen = tt(Url$1, OPENPAREN); // URL followed by (\n\n  tt(UrlNonaccept, OPENBRACE, UrlOpenbrace);\n  tt(UrlNonaccept, OPENBRACKET, UrlOpenbracket);\n  tt(UrlNonaccept, OPENANGLEBRACKET, UrlOpenanglebracket);\n  tt(UrlNonaccept, OPENPAREN, UrlOpenparen);\n\n  // Closing bracket component. This character WILL be included in the URL\n  tt(UrlOpenbrace, CLOSEBRACE, Url$1);\n  tt(UrlOpenbracket, CLOSEBRACKET, Url$1);\n  tt(UrlOpenanglebracket, CLOSEANGLEBRACKET, Url$1);\n  tt(UrlOpenparen, CLOSEPAREN, Url$1);\n  tt(UrlOpenbrace, CLOSEBRACE, Url$1);\n\n  // URL that beings with an opening bracket, followed by a symbols.\n  // Note that the final state can still be `UrlOpenbrace` (if the URL only\n  // has a single opening bracket for some reason).\n  const UrlOpenbraceQ = makeState(Url); // URL followed by { and some symbols that the URL can end it\n  const UrlOpenbracketQ = makeState(Url); // URL followed by [ and some symbols that the URL can end it\n  const UrlOpenanglebracketQ = makeState(Url); // URL followed by < and some symbols that the URL can end it\n  const UrlOpenparenQ = makeState(Url); // URL followed by ( and some symbols that the URL can end it\n  ta(UrlOpenbrace, qsAccepting, UrlOpenbraceQ);\n  ta(UrlOpenbracket, qsAccepting, UrlOpenbracketQ);\n  ta(UrlOpenanglebracket, qsAccepting, UrlOpenanglebracketQ);\n  ta(UrlOpenparen, qsAccepting, UrlOpenparenQ);\n  const UrlOpenbraceSyms = makeState(); // UrlOpenbrace followed by some symbols it cannot end it\n  const UrlOpenbracketSyms = makeState(); // UrlOpenbracketQ followed by some symbols it cannot end it\n  const UrlOpenanglebracketSyms = makeState(); // UrlOpenanglebracketQ followed by some symbols it cannot end it\n  const UrlOpenparenSyms = makeState(); // UrlOpenparenQ followed by some symbols it cannot end it\n  ta(UrlOpenbrace, qsNonAccepting);\n  ta(UrlOpenbracket, qsNonAccepting);\n  ta(UrlOpenanglebracket, qsNonAccepting);\n  ta(UrlOpenparen, qsNonAccepting);\n\n  // URL that begins with an opening bracket, followed by some symbols\n  ta(UrlOpenbraceQ, qsAccepting, UrlOpenbraceQ);\n  ta(UrlOpenbracketQ, qsAccepting, UrlOpenbracketQ);\n  ta(UrlOpenanglebracketQ, qsAccepting, UrlOpenanglebracketQ);\n  ta(UrlOpenparenQ, qsAccepting, UrlOpenparenQ);\n  ta(UrlOpenbraceQ, qsNonAccepting, UrlOpenbraceQ);\n  ta(UrlOpenbracketQ, qsNonAccepting, UrlOpenbracketQ);\n  ta(UrlOpenanglebracketQ, qsNonAccepting, UrlOpenanglebracketQ);\n  ta(UrlOpenparenQ, qsNonAccepting, UrlOpenparenQ);\n  ta(UrlOpenbraceSyms, qsAccepting, UrlOpenbraceSyms);\n  ta(UrlOpenbracketSyms, qsAccepting, UrlOpenbracketQ);\n  ta(UrlOpenanglebracketSyms, qsAccepting, UrlOpenanglebracketQ);\n  ta(UrlOpenparenSyms, qsAccepting, UrlOpenparenQ);\n  ta(UrlOpenbraceSyms, qsNonAccepting, UrlOpenbraceSyms);\n  ta(UrlOpenbracketSyms, qsNonAccepting, UrlOpenbracketSyms);\n  ta(UrlOpenanglebracketSyms, qsNonAccepting, UrlOpenanglebracketSyms);\n  ta(UrlOpenparenSyms, qsNonAccepting, UrlOpenparenSyms);\n\n  // Close brace/bracket to become regular URL\n  tt(UrlOpenbracketQ, CLOSEBRACKET, Url$1);\n  tt(UrlOpenanglebracketQ, CLOSEANGLEBRACKET, Url$1);\n  tt(UrlOpenparenQ, CLOSEPAREN, Url$1);\n  tt(UrlOpenbraceQ, CLOSEBRACE, Url$1);\n  tt(UrlOpenbracketSyms, CLOSEBRACKET, Url$1);\n  tt(UrlOpenanglebracketSyms, CLOSEANGLEBRACKET, Url$1);\n  tt(UrlOpenparenSyms, CLOSEPAREN, Url$1);\n  tt(UrlOpenbraceSyms, CLOSEPAREN, Url$1);\n  tt(Start, LOCALHOST, DomainDotTld); // localhost is a valid URL state\n  tt(Start, NL$1, Nl); // single new line\n\n  return {\n    start: Start,\n    tokens: tk\n  };\n}\n\n/**\n * Run the parser state machine on a list of scanned string-based tokens to\n * create a list of multi tokens, each of which represents a URL, email address,\n * plain text, etc.\n *\n * @param {State<MultiToken>} start parser start state\n * @param {string} input the original input used to generate the given tokens\n * @param {Token[]} tokens list of scanned tokens\n * @returns {MultiToken[]}\n */\nfunction run(start, input, tokens) {\n  let len = tokens.length;\n  let cursor = 0;\n  let multis = [];\n  let textTokens = [];\n  while (cursor < len) {\n    let state = start;\n    let secondState = null;\n    let nextState = null;\n    let multiLength = 0;\n    let latestAccepting = null;\n    let sinceAccepts = -1;\n    while (cursor < len && !(secondState = state.go(tokens[cursor].t))) {\n      // Starting tokens with nowhere to jump to.\n      // Consider these to be just plain text\n      textTokens.push(tokens[cursor++]);\n    }\n    while (cursor < len && (nextState = secondState || state.go(tokens[cursor].t))) {\n      // Get the next state\n      secondState = null;\n      state = nextState;\n\n      // Keep track of the latest accepting state\n      if (state.accepts()) {\n        sinceAccepts = 0;\n        latestAccepting = state;\n      } else if (sinceAccepts >= 0) {\n        sinceAccepts++;\n      }\n      cursor++;\n      multiLength++;\n    }\n    if (sinceAccepts < 0) {\n      // No accepting state was found, part of a regular text token add\n      // the first text token to the text tokens array and try again from\n      // the next\n      cursor -= multiLength;\n      if (cursor < len) {\n        textTokens.push(tokens[cursor]);\n        cursor++;\n      }\n    } else {\n      // Accepting state!\n      // First close off the textTokens (if available)\n      if (textTokens.length > 0) {\n        multis.push(initMultiToken(Text, input, textTokens));\n        textTokens = [];\n      }\n\n      // Roll back to the latest accepting state\n      cursor -= sinceAccepts;\n      multiLength -= sinceAccepts;\n\n      // Create a new multitoken\n      const Multi = latestAccepting.t;\n      const subtokens = tokens.slice(cursor - multiLength, cursor);\n      multis.push(initMultiToken(Multi, input, subtokens));\n    }\n  }\n\n  // Finally close off the textTokens (if available)\n  if (textTokens.length > 0) {\n    multis.push(initMultiToken(Text, input, textTokens));\n  }\n  return multis;\n}\n\n/**\n * Utility function for instantiating a new multitoken with all the relevant\n * fields during parsing.\n * @param {new (value: string, tokens: Token[]) => MultiToken} Multi class to instantiate\n * @param {string} input original input string\n * @param {Token[]} tokens consecutive tokens scanned from input string\n * @returns {MultiToken}\n */\nfunction initMultiToken(Multi, input, tokens) {\n  const startIdx = tokens[0].s;\n  const endIdx = tokens[tokens.length - 1].e;\n  const value = input.slice(startIdx, endIdx);\n  return new Multi(value, tokens);\n}\n\nconst warn = typeof console !== 'undefined' && console && console.warn || (() => {});\nconst warnAdvice = 'until manual call of linkify.init(). Register all schemes and plugins before invoking linkify the first time.';\n\n// Side-effect initialization state\nconst INIT = {\n  scanner: null,\n  parser: null,\n  tokenQueue: [],\n  pluginQueue: [],\n  customSchemes: [],\n  initialized: false\n};\n\n/**\n * @typedef {{\n * \tstart: State<string>,\n * \ttokens: { groups: Collections<string> } & typeof tk\n * }} ScannerInit\n */\n\n/**\n * @typedef {{\n * \tstart: State<MultiToken>,\n * \ttokens: typeof multi\n * }} ParserInit\n */\n\n/**\n * @typedef {(arg: { scanner: ScannerInit }) => void} TokenPlugin\n */\n\n/**\n * @typedef {(arg: { scanner: ScannerInit, parser: ParserInit }) => void} Plugin\n */\n\n/**\n * De-register all plugins and reset the internal state-machine. Used for\n * testing; not required in practice.\n * @private\n */\nfunction reset() {\n  State.groups = {};\n  INIT.scanner = null;\n  INIT.parser = null;\n  INIT.tokenQueue = [];\n  INIT.pluginQueue = [];\n  INIT.customSchemes = [];\n  INIT.initialized = false;\n}\n\n/**\n * Register a token plugin to allow the scanner to recognize additional token\n * types before the parser state machine is constructed from the results.\n * @param {string} name of plugin to register\n * @param {TokenPlugin} plugin function that accepts the scanner state machine\n * and available scanner tokens and collections and extends the state machine to\n * recognize additional tokens or groups.\n */\nfunction registerTokenPlugin(name, plugin) {\n  if (typeof plugin !== 'function') {\n    throw new Error(`linkifyjs: Invalid token plugin ${plugin} (expects function)`);\n  }\n  for (let i = 0; i < INIT.tokenQueue.length; i++) {\n    if (name === INIT.tokenQueue[i][0]) {\n      warn(`linkifyjs: token plugin \"${name}\" already registered - will be overwritten`);\n      INIT.tokenQueue[i] = [name, plugin];\n      return;\n    }\n  }\n  INIT.tokenQueue.push([name, plugin]);\n  if (INIT.initialized) {\n    warn(`linkifyjs: already initialized - will not register token plugin \"${name}\" ${warnAdvice}`);\n  }\n}\n\n/**\n * Register a linkify plugin\n * @param {string} name of plugin to register\n * @param {Plugin} plugin function that accepts the parser state machine and\n * extends the parser to recognize additional link types\n */\nfunction registerPlugin(name, plugin) {\n  if (typeof plugin !== 'function') {\n    throw new Error(`linkifyjs: Invalid plugin ${plugin} (expects function)`);\n  }\n  for (let i = 0; i < INIT.pluginQueue.length; i++) {\n    if (name === INIT.pluginQueue[i][0]) {\n      warn(`linkifyjs: plugin \"${name}\" already registered - will be overwritten`);\n      INIT.pluginQueue[i] = [name, plugin];\n      return;\n    }\n  }\n  INIT.pluginQueue.push([name, plugin]);\n  if (INIT.initialized) {\n    warn(`linkifyjs: already initialized - will not register plugin \"${name}\" ${warnAdvice}`);\n  }\n}\n\n/**\n * Detect URLs with the following additional protocol. Anything with format\n * \"protocol://...\" will be considered a link. If `optionalSlashSlash` is set to\n * `true`, anything with format \"protocol:...\" will be considered a link.\n * @param {string} protocol\n * @param {boolean} [optionalSlashSlash]\n */\nfunction registerCustomProtocol(scheme, optionalSlashSlash) {\n  if (optionalSlashSlash === void 0) {\n    optionalSlashSlash = false;\n  }\n  if (INIT.initialized) {\n    warn(`linkifyjs: already initialized - will not register custom scheme \"${scheme}\" ${warnAdvice}`);\n  }\n  if (!/^[0-9a-z]+(-[0-9a-z]+)*$/.test(scheme)) {\n    throw new Error(`linkifyjs: incorrect scheme format.\n1. Must only contain digits, lowercase ASCII letters or \"-\"\n2. Cannot start or end with \"-\"\n3. \"-\" cannot repeat`);\n  }\n  INIT.customSchemes.push([scheme, optionalSlashSlash]);\n}\n\n/**\n * Initialize the linkify state machine. Called automatically the first time\n * linkify is called on a string, but may be called manually as well.\n */\nfunction init() {\n  // Initialize scanner state machine and plugins\n  INIT.scanner = init$2(INIT.customSchemes);\n  for (let i = 0; i < INIT.tokenQueue.length; i++) {\n    INIT.tokenQueue[i][1]({\n      scanner: INIT.scanner\n    });\n  }\n\n  // Initialize parser state machine and plugins\n  INIT.parser = init$1(INIT.scanner.tokens);\n  for (let i = 0; i < INIT.pluginQueue.length; i++) {\n    INIT.pluginQueue[i][1]({\n      scanner: INIT.scanner,\n      parser: INIT.parser\n    });\n  }\n  INIT.initialized = true;\n}\n\n/**\n * Parse a string into tokens that represent linkable and non-linkable sub-components\n * @param {string} str\n * @return {MultiToken[]} tokens\n */\nfunction tokenize(str) {\n  if (!INIT.initialized) {\n    init();\n  }\n  return run(INIT.parser.start, str, run$1(INIT.scanner.start, str));\n}\n\n/**\n * Find a list of linkable items in the given string.\n * @param {string} str string to find links in\n * @param {string | Opts} [type] either formatting options or specific type of\n * links to find, e.g., 'url' or 'email'\n * @param {Opts} [opts] formatting options for final output. Cannot be specified\n * if opts already provided in `type` argument\n */\nfunction find(str, type, opts) {\n  if (type === void 0) {\n    type = null;\n  }\n  if (opts === void 0) {\n    opts = null;\n  }\n  if (type && typeof type === 'object') {\n    if (opts) {\n      throw Error(`linkifyjs: Invalid link type ${type}; must be a string`);\n    }\n    opts = type;\n    type = null;\n  }\n  const options = new Options(opts);\n  const tokens = tokenize(str);\n  const filtered = [];\n  for (let i = 0; i < tokens.length; i++) {\n    const token = tokens[i];\n    if (token.isLink && (!type || token.t === type) && options.check(token)) {\n      filtered.push(token.toFormattedObject(options));\n    }\n  }\n  return filtered;\n}\n\n/**\n * Is the given string valid linkable text of some sort. Note that this does not\n * trim the text for you.\n *\n * Optionally pass in a second `type` param, which is the type of link to test\n * for.\n *\n * For example,\n *\n *     linkify.test(str, 'email');\n *\n * Returns `true` if str is a valid email.\n * @param {string} str string to test for links\n * @param {string} [type] optional specific link type to look for\n * @returns boolean true/false\n */\nfunction test(str, type) {\n  if (type === void 0) {\n    type = null;\n  }\n  const tokens = tokenize(str);\n  return tokens.length === 1 && tokens[0].isLink && (!type || tokens[0].t === type);\n}\n\nexport { MultiToken, Options, State, createTokenClass, find, init, multi, options, regexp, registerCustomProtocol, registerPlugin, registerTokenPlugin, reset, stringToArray, test, tokenize };\n"],"names":["encodedTlds","encodedUtlds","assign","target","properties","key","numeric","ascii","alpha","asciinumeric","alphanumeric","domain","emoji","scheme","slashscheme","whitespace","registerGroup","name","groups","addToGroups","t","flags","k","group","flagsForToken","result","c","State","token","input","state","nextState","i","regex","exactOnly","inputs","next","regexp","len","templateState","allFlags","ta","tr","ts","tt","WORD","UWORD","LOCALHOST","TLD","UTLD","SCHEME","SLASH_SCHEME","NUM","WS","NL$1","OPENBRACE","OPENBRACKET","OPENANGLEBRACKET","OPENPAREN","CLOSEBRACE","CLOSEBRACKET","CLOSEANGLEBRACKET","CLOSEPAREN","AMPERSAND","APOSTROPHE","ASTERISK","AT","BACKSLASH","BACKTICK","CARET","COLON","COMMA","DOLLAR","DOT","EQUALS","EXCLAMATION","HYPHEN","PERCENT","PIPE","PLUS","POUND","QUERY","QUOTE","SEMI","SLASH","TILDE","UNDERSCORE","EMOJI$1","SYM","tk","ASCII_LETTER","LETTER","EMOJI","DIGIT","SPACE","NL","EMOJI_VARIATION","EMOJI_JOINER","tlds","utlds","init$2","customSchemes","Start","decodeTlds","Num","Word","UWord","Ws","Emoji","EmojiJoiner","wordjr","uwordjr","fastts","a","b","sch","run$1","start","str","iterable","stringToArray","charCount","tokens","cursor","charCursor","tokenLength","latestAccepting","sinceAccepts","charsSinceAccepts","index","first","second","char","defaultt","jr","encoded","words","stack","digits","popDigitCount","popCount","defaults","noop","Options","opts","defaultRender","o","ignoredTags","uppercaseIgnoredTags","ir","operator","isCallable","option","obj","val","MultiToken","value","options","truncate","formatted","protocol","href","formattedHref","tagName","content","attributes","className","rel","attrs","eventListeners","createTokenClass","type","props","Token","p","Email","Text","Nl","Url","makeState","arg","init$1","_ref","qsAccepting","qsNonAccepting","localpartAccepting","Localpart","Domain","Scheme","SlashScheme","LocalpartAt","LocalpartDot","EmailDomain","EmailDomainDot","Email$1","EmailDomainHyphen","EmailColon","DomainHyphen","DomainDot","DomainDotTld","DomainDotTldColon","DomainDotTldColonPort","Url$1","UrlNonaccept","SchemeColon","SlashSchemeColon","SlashSchemeColonSlash","UriPrefix","UrlOpenbrace","UrlOpenbracket","UrlOpenanglebracket","UrlOpenparen","UrlOpenbraceQ","UrlOpenbracketQ","UrlOpenanglebracketQ","UrlOpenparenQ","UrlOpenbraceSyms","UrlOpenbracketSyms","UrlOpenanglebracketSyms","UrlOpenparenSyms","run","multis","textTokens","secondState","multiLength","initMultiToken","Multi","subtokens","startIdx","endIdx","warn","warnAdvice","INIT","reset","registerCustomProtocol","optionalSlashSlash","init","tokenize","find","filtered"],"mappings":"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","x_google_ignoreList":[0]}