From 5e6846933b608cbf18088aa6258a309d03bc87f9 Mon Sep 17 00:00:00 2001 From: Tinker Twins Date: Sat, 10 Aug 2024 20:22:32 -0400 Subject: [PATCH] Update website --- docs/about/index.md | 4 ++-- docs/assets/javascripts/search.js | 10 ---------- docs/competitions/f1tenth-sim-racing-cdc-2024.md | 6 +++--- docs/competitions/f1tenth-sim-racing-iros-2024.md | 6 +++--- docs/index.html | 4 ++-- 5 files changed, 10 insertions(+), 20 deletions(-) delete mode 100644 docs/assets/javascripts/search.js diff --git a/docs/about/index.md b/docs/about/index.md index 4841081..d7bfa81 100644 --- a/docs/about/index.md +++ b/docs/about/index.md @@ -128,7 +128,7 @@ We encourage you to take a look at the following presentations to gain a better | [](https://youtu.be/bk7lJfD4H0s) | [](https://youtu.be/R_GZ1LkMWGQ) | | [OpenCAV CUICAR AuE Seminar](https://youtu.be/bk7lJfD4H0s) | [SMRDC 2023 Finalist Pitch](https://youtu.be/R_GZ1LkMWGQ) | | [](https://youtu.be/0yS1-RpqhcE) | [](https://youtu.be/8jyCJUOaLaI) | -| [MECC 2023 Video Pesentation](https://youtu.be/0yS1-RpqhcE) | [IROS 2023 Presentation](https://youtu.be/8jyCJUOaLaI) | +| [MECC 2023 Video Presentation](https://youtu.be/0yS1-RpqhcE) | [IROS 2023 Presentation](https://youtu.be/8jyCJUOaLaI) | | | | ### Publications @@ -263,7 +263,7 @@ archivePrefix = {arXiv}, primaryClass = {cs.RO} } ``` -This work has been accepted at **2024 Ground Vehicle Systems Engineering and Technology Symposium (GVSETS). Distribution Statement A. Approved for public release; distribution is unlimited. OPSEC #8451.** +This work has been accepted at **2024 Ground Vehicle Systems Engineering and Technology Symposium (GVSETS). Distribution Statement A. Approved for public release; distribution is unlimited. OPSEC \#8451.** ### Technical Reports diff --git a/docs/assets/javascripts/search.js b/docs/assets/javascripts/search.js deleted file mode 100644 index f26225f..0000000 --- a/docs/assets/javascripts/search.js +++ /dev/null @@ -1,10 +0,0 @@ -"use strict"; (() => { - var xe = Object.create; var G = Object.defineProperty, ve = Object.defineProperties, Se = Object.getOwnPropertyDescriptor, Te = Object.getOwnPropertyDescriptors, Qe = Object.getOwnPropertyNames, Y = Object.getOwnPropertySymbols, Ee = Object.getPrototypeOf, X = Object.prototype.hasOwnProperty, be = Object.prototype.propertyIsEnumerable; var Z = Math.pow, J = (t, e, r) => e in t ? G(t, e, { enumerable: !0, configurable: !0, writable: !0, value: r }) : t[e] = r, _ = (t, e) => { for (var r in e || (e = {})) X.call(e, r) && J(t, r, e[r]); if (Y) for (var r of Y(e)) be.call(e, r) && J(t, r, e[r]); return t }, B = (t, e) => ve(t, Te(e)); var Le = (t, e) => () => (e || t((e = { exports: {} }).exports, e), e.exports); var we = (t, e, r, n) => { if (e && typeof e == "object" || typeof e == "function") for (let i of Qe(e)) !X.call(t, i) && i !== r && G(t, i, { get: () => e[i], enumerable: !(n = Se(e, i)) || n.enumerable }); return t }; var Pe = (t, e, r) => (r = t != null ? xe(Ee(t)) : {}, we(e || !t || !t.__esModule ? G(r, "default", { value: t, enumerable: !0 }) : r, t)); var W = (t, e, r) => new Promise((n, i) => { var s = u => { try { a(r.next(u)) } catch (c) { i(c) } }, o = u => { try { a(r.throw(u)) } catch (c) { i(c) } }, a = u => u.done ? n(u.value) : Promise.resolve(u.value).then(s, o); a((r = r.apply(t, e)).next()) }); var te = Le((K, ee) => { - (function () { - var t = function (e) { var r = new t.Builder; return r.pipeline.add(t.trimmer, t.stopWordFilter, t.stemmer), r.searchPipeline.add(t.stemmer), e.call(r, r), r.build() }; t.version = "2.3.9"; t.utils = {}, t.utils.warn = function (e) { return function (r) { e.console && console.warn && console.warn(r) } }(this), t.utils.asString = function (e) { return e == null ? "" : e.toString() }, t.utils.clone = function (e) { if (e == null) return e; for (var r = Object.create(null), n = Object.keys(e), i = 0; i < n.length; i++) { var s = n[i], o = e[s]; if (Array.isArray(o)) { r[s] = o.slice(); continue } if (typeof o == "string" || typeof o == "number" || typeof o == "boolean") { r[s] = o; continue } throw new TypeError("clone is not deep and does not support nested objects") } return r }, t.FieldRef = function (e, r, n) { this.docRef = e, this.fieldName = r, this._stringValue = n }, t.FieldRef.joiner = "/", t.FieldRef.fromString = function (e) { var r = e.indexOf(t.FieldRef.joiner); if (r === -1) throw "malformed field ref string"; var n = e.slice(0, r), i = e.slice(r + 1); return new t.FieldRef(i, n, e) }, t.FieldRef.prototype.toString = function () { return this._stringValue == null && (this._stringValue = this.fieldName + t.FieldRef.joiner + this.docRef), this._stringValue }; t.Set = function (e) { if (this.elements = Object.create(null), e) { this.length = e.length; for (var r = 0; r < this.length; r++)this.elements[e[r]] = !0 } else this.length = 0 }, t.Set.complete = { intersect: function (e) { return e }, union: function () { return this }, contains: function () { return !0 } }, t.Set.empty = { intersect: function () { return this }, union: function (e) { return e }, contains: function () { return !1 } }, t.Set.prototype.contains = function (e) { return !!this.elements[e] }, t.Set.prototype.intersect = function (e) { var r, n, i, s = []; if (e === t.Set.complete) return this; if (e === t.Set.empty) return e; this.length < e.length ? (r = this, n = e) : (r = e, n = this), i = Object.keys(r.elements); for (var o = 0; o < i.length; o++) { var a = i[o]; a in n.elements && s.push(a) } return new t.Set(s) }, t.Set.prototype.union = function (e) { return e === t.Set.complete ? t.Set.complete : e === t.Set.empty ? this : new t.Set(Object.keys(this.elements).concat(Object.keys(e.elements))) }, t.idf = function (e, r) { var n = 0; for (var i in e) i != "_index" && (n += Object.keys(e[i]).length); var s = (r - n + .5) / (n + .5); return Math.log(1 + Math.abs(s)) }, t.Token = function (e, r) { this.str = e || "", this.metadata = r || {} }, t.Token.prototype.toString = function () { return this.str }, t.Token.prototype.update = function (e) { return this.str = e(this.str, this.metadata), this }, t.Token.prototype.clone = function (e) { return e = e || function (r) { return r }, new t.Token(e(this.str, this.metadata), this.metadata) }; t.tokenizer = function (e, r) { if (e == null || e == null) return []; if (Array.isArray(e)) return e.map(function (g) { return new t.Token(t.utils.asString(g).toLowerCase(), t.utils.clone(r)) }); for (var n = e.toString().toLowerCase(), i = n.length, s = [], o = 0, a = 0; o <= i; o++) { var u = n.charAt(o), c = o - a; if (u.match(t.tokenizer.separator) || o == i) { if (c > 0) { var f = t.utils.clone(r) || {}; f.position = [a, c], f.index = s.length, s.push(new t.Token(n.slice(a, o), f)) } a = o + 1 } } return s }, t.tokenizer.separator = /[\s\-]+/; t.Pipeline = function () { this._stack = [] }, t.Pipeline.registeredFunctions = Object.create(null), t.Pipeline.registerFunction = function (e, r) { r in this.registeredFunctions && t.utils.warn("Overwriting existing registered function: " + r), e.label = r, t.Pipeline.registeredFunctions[e.label] = e }, t.Pipeline.warnIfFunctionNotRegistered = function (e) { - var r = e.label && e.label in this.registeredFunctions; r || t.utils.warn(`Function is not registered with pipeline. This may cause problems when serialising the index. -`, e) - }, t.Pipeline.load = function (e) { var r = new t.Pipeline; return e.forEach(function (n) { var i = t.Pipeline.registeredFunctions[n]; if (i) r.add(i); else throw new Error("Cannot load unregistered function: " + n) }), r }, t.Pipeline.prototype.add = function () { var e = Array.prototype.slice.call(arguments); e.forEach(function (r) { t.Pipeline.warnIfFunctionNotRegistered(r), this._stack.push(r) }, this) }, t.Pipeline.prototype.after = function (e, r) { t.Pipeline.warnIfFunctionNotRegistered(r); var n = this._stack.indexOf(e); if (n == -1) throw new Error("Cannot find existingFn"); n = n + 1, this._stack.splice(n, 0, r) }, t.Pipeline.prototype.before = function (e, r) { t.Pipeline.warnIfFunctionNotRegistered(r); var n = this._stack.indexOf(e); if (n == -1) throw new Error("Cannot find existingFn"); this._stack.splice(n, 0, r) }, t.Pipeline.prototype.remove = function (e) { var r = this._stack.indexOf(e); r != -1 && this._stack.splice(r, 1) }, t.Pipeline.prototype.run = function (e) { for (var r = this._stack.length, n = 0; n < r; n++) { for (var i = this._stack[n], s = [], o = 0; o < e.length; o++) { var a = i(e[o], o, e); if (!(a == null || a === "")) if (Array.isArray(a)) for (var u = 0; u < a.length; u++)s.push(a[u]); else s.push(a) } e = s } return e }, t.Pipeline.prototype.runString = function (e, r) { var n = new t.Token(e, r); return this.run([n]).map(function (i) { return i.toString() }) }, t.Pipeline.prototype.reset = function () { this._stack = [] }, t.Pipeline.prototype.toJSON = function () { return this._stack.map(function (e) { return t.Pipeline.warnIfFunctionNotRegistered(e), e.label }) }; t.Vector = function (e) { this._magnitude = 0, this.elements = e || [] }, t.Vector.prototype.positionForIndex = function (e) { if (this.elements.length == 0) return 0; for (var r = 0, n = this.elements.length / 2, i = n - r, s = Math.floor(i / 2), o = this.elements[s * 2]; i > 1 && (o < e && (r = s), o > e && (n = s), o != e);)i = n - r, s = r + Math.floor(i / 2), o = this.elements[s * 2]; if (o == e || o > e) return s * 2; if (o < e) return (s + 1) * 2 }, t.Vector.prototype.insert = function (e, r) { this.upsert(e, r, function () { throw "duplicate index" }) }, t.Vector.prototype.upsert = function (e, r, n) { this._magnitude = 0; var i = this.positionForIndex(e); this.elements[i] == e ? this.elements[i + 1] = n(this.elements[i + 1], r) : this.elements.splice(i, 0, e, r) }, t.Vector.prototype.magnitude = function () { if (this._magnitude) return this._magnitude; for (var e = 0, r = this.elements.length, n = 1; n < r; n += 2) { var i = this.elements[n]; e += i * i } return this._magnitude = Math.sqrt(e) }, t.Vector.prototype.dot = function (e) { for (var r = 0, n = this.elements, i = e.elements, s = n.length, o = i.length, a = 0, u = 0, c = 0, f = 0; c < s && f < o;)a = n[c], u = i[f], a < u ? c += 2 : a > u ? f += 2 : a == u && (r += n[c + 1] * i[f + 1], c += 2, f += 2); return r }, t.Vector.prototype.similarity = function (e) { return this.dot(e) / this.magnitude() || 0 }, t.Vector.prototype.toArray = function () { for (var e = new Array(this.elements.length / 2), r = 1, n = 0; r < this.elements.length; r += 2, n++)e[n] = this.elements[r]; return e }, t.Vector.prototype.toJSON = function () { return this.elements }; t.stemmer = function () { var e = { ational: "ate", tional: "tion", enci: "ence", anci: "ance", izer: "ize", bli: "ble", alli: "al", entli: "ent", eli: "e", ousli: "ous", ization: "ize", ation: "ate", ator: "ate", alism: "al", iveness: "ive", fulness: "ful", ousness: "ous", aliti: "al", iviti: "ive", biliti: "ble", logi: "log" }, r = { icate: "ic", ative: "", alize: "al", iciti: "ic", ical: "ic", ful: "", ness: "" }, n = "[^aeiou]", i = "[aeiouy]", s = n + "[^aeiouy]*", o = i + "[aeiou]*", a = "^(" + s + ")?" + o + s, u = "^(" + s + ")?" + o + s + "(" + o + ")?$", c = "^(" + s + ")?" + o + s + o + s, f = "^(" + s + ")?" + i, g = new RegExp(a), l = new RegExp(c), m = new RegExp(u), x = new RegExp(f), v = /^(.+?)(ss|i)es$/, d = /^(.+?)([^s])s$/, y = /^(.+?)eed$/, b = /^(.+?)(ed|ing)$/, E = /.$/, w = /(at|bl|iz)$/, R = new RegExp("([^aeiouylsz])\\1$"), j = new RegExp("^" + s + i + "[^aeiouwxy]$"), C = /^(.+?[^aeiou])y$/, D = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/, N = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/, M = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/, V = /^(.+?)(s|t)(ion)$/, P = /^(.+?)e$/, z = /ll$/, $ = new RegExp("^" + s + i + "[^aeiouwxy]$"), A = function (h) { var S, k, L, p, T, O, F; if (h.length < 3) return h; if (L = h.substr(0, 1), L == "y" && (h = L.toUpperCase() + h.substr(1)), p = v, T = d, p.test(h) ? h = h.replace(p, "$1$2") : T.test(h) && (h = h.replace(T, "$1$2")), p = y, T = b, p.test(h)) { var Q = p.exec(h); p = g, p.test(Q[1]) && (p = E, h = h.replace(p, "")) } else if (T.test(h)) { var Q = T.exec(h); S = Q[1], T = x, T.test(S) && (h = S, T = w, O = R, F = j, T.test(h) ? h = h + "e" : O.test(h) ? (p = E, h = h.replace(p, "")) : F.test(h) && (h = h + "e")) } if (p = C, p.test(h)) { var Q = p.exec(h); S = Q[1], h = S + "i" } if (p = D, p.test(h)) { var Q = p.exec(h); S = Q[1], k = Q[2], p = g, p.test(S) && (h = S + e[k]) } if (p = N, p.test(h)) { var Q = p.exec(h); S = Q[1], k = Q[2], p = g, p.test(S) && (h = S + r[k]) } if (p = M, T = V, p.test(h)) { var Q = p.exec(h); S = Q[1], p = l, p.test(S) && (h = S) } else if (T.test(h)) { var Q = T.exec(h); S = Q[1] + Q[2], T = l, T.test(S) && (h = S) } if (p = P, p.test(h)) { var Q = p.exec(h); S = Q[1], p = l, T = m, O = $, (p.test(S) || T.test(S) && !O.test(S)) && (h = S) } return p = z, T = l, p.test(h) && T.test(h) && (p = E, h = h.replace(p, "")), L == "y" && (h = L.toLowerCase() + h.substr(1)), h }; return function (I) { return I.update(A) } }(), t.Pipeline.registerFunction(t.stemmer, "stemmer"); t.generateStopWordFilter = function (e) { var r = e.reduce(function (n, i) { return n[i] = i, n }, {}); return function (n) { if (n && r[n.toString()] !== n.toString()) return n } }, t.stopWordFilter = t.generateStopWordFilter(["a", "able", "about", "across", "after", "all", "almost", "also", "am", "among", "an", "and", "any", "are", "as", "at", "be", "because", "been", "but", "by", "can", "cannot", "could", "dear", "did", "do", "does", "either", "else", "ever", "every", "for", "from", "get", "got", "had", "has", "have", "he", "her", "hers", "him", "his", "how", "however", "i", "if", "in", "into", "is", "it", "its", "just", "least", "let", "like", "likely", "may", "me", "might", "most", "must", "my", "neither", "no", "nor", "not", "of", "off", "often", "on", "only", "or", "other", "our", "own", "rather", "said", "say", "says", "she", "should", "since", "so", "some", "than", "that", "the", "their", "them", "then", "there", "these", "they", "this", "tis", "to", "too", "twas", "us", "wants", "was", "we", "were", "what", "when", "where", "which", "while", "who", "whom", "why", "will", "with", "would", "yet", "you", "your"]), t.Pipeline.registerFunction(t.stopWordFilter, "stopWordFilter"); t.trimmer = function (e) { return e.update(function (r) { return r.replace(/^\W+/, "").replace(/\W+$/, "") }) }, t.Pipeline.registerFunction(t.trimmer, "trimmer"); t.TokenSet = function () { this.final = !1, this.edges = {}, this.id = t.TokenSet._nextId, t.TokenSet._nextId += 1 }, t.TokenSet._nextId = 1, t.TokenSet.fromArray = function (e) { for (var r = new t.TokenSet.Builder, n = 0, i = e.length; n < i; n++)r.insert(e[n]); return r.finish(), r.root }, t.TokenSet.fromClause = function (e) { return "editDistance" in e ? t.TokenSet.fromFuzzyString(e.term, e.editDistance) : t.TokenSet.fromString(e.term) }, t.TokenSet.fromFuzzyString = function (e, r) { for (var n = new t.TokenSet, i = [{ node: n, editsRemaining: r, str: e }]; i.length;) { var s = i.pop(); if (s.str.length > 0) { var o = s.str.charAt(0), a; o in s.node.edges ? a = s.node.edges[o] : (a = new t.TokenSet, s.node.edges[o] = a), s.str.length == 1 && (a.final = !0), i.push({ node: a, editsRemaining: s.editsRemaining, str: s.str.slice(1) }) } if (s.editsRemaining != 0) { if ("*" in s.node.edges) var u = s.node.edges["*"]; else { var u = new t.TokenSet; s.node.edges["*"] = u } if (s.str.length == 0 && (u.final = !0), i.push({ node: u, editsRemaining: s.editsRemaining - 1, str: s.str }), s.str.length > 1 && i.push({ node: s.node, editsRemaining: s.editsRemaining - 1, str: s.str.slice(1) }), s.str.length == 1 && (s.node.final = !0), s.str.length >= 1) { if ("*" in s.node.edges) var c = s.node.edges["*"]; else { var c = new t.TokenSet; s.node.edges["*"] = c } s.str.length == 1 && (c.final = !0), i.push({ node: c, editsRemaining: s.editsRemaining - 1, str: s.str.slice(1) }) } if (s.str.length > 1) { var f = s.str.charAt(0), g = s.str.charAt(1), l; g in s.node.edges ? l = s.node.edges[g] : (l = new t.TokenSet, s.node.edges[g] = l), s.str.length == 1 && (l.final = !0), i.push({ node: l, editsRemaining: s.editsRemaining - 1, str: f + s.str.slice(2) }) } } } return n }, t.TokenSet.fromString = function (e) { for (var r = new t.TokenSet, n = r, i = 0, s = e.length; i < s; i++) { var o = e[i], a = i == s - 1; if (o == "*") r.edges[o] = r, r.final = a; else { var u = new t.TokenSet; u.final = a, r.edges[o] = u, r = u } } return n }, t.TokenSet.prototype.toArray = function () { for (var e = [], r = [{ prefix: "", node: this }]; r.length;) { var n = r.pop(), i = Object.keys(n.node.edges), s = i.length; n.node.final && (n.prefix.charAt(0), e.push(n.prefix)); for (var o = 0; o < s; o++) { var a = i[o]; r.push({ prefix: n.prefix.concat(a), node: n.node.edges[a] }) } } return e }, t.TokenSet.prototype.toString = function () { if (this._str) return this._str; for (var e = this.final ? "1" : "0", r = Object.keys(this.edges).sort(), n = r.length, i = 0; i < n; i++) { var s = r[i], o = this.edges[s]; e = e + s + o.id } return e }, t.TokenSet.prototype.intersect = function (e) { for (var r = new t.TokenSet, n = void 0, i = [{ qNode: e, output: r, node: this }]; i.length;) { n = i.pop(); for (var s = Object.keys(n.qNode.edges), o = s.length, a = Object.keys(n.node.edges), u = a.length, c = 0; c < o; c++)for (var f = s[c], g = 0; g < u; g++) { var l = a[g]; if (l == f || f == "*") { var m = n.node.edges[l], x = n.qNode.edges[f], v = m.final && x.final, d = void 0; l in n.output.edges ? (d = n.output.edges[l], d.final = d.final || v) : (d = new t.TokenSet, d.final = v, n.output.edges[l] = d), i.push({ qNode: x, output: d, node: m }) } } } return r }, t.TokenSet.Builder = function () { this.previousWord = "", this.root = new t.TokenSet, this.uncheckedNodes = [], this.minimizedNodes = {} }, t.TokenSet.Builder.prototype.insert = function (e) { var r, n = 0; if (e < this.previousWord) throw new Error("Out of order word insertion"); for (var i = 0; i < e.length && i < this.previousWord.length && e[i] == this.previousWord[i]; i++)n++; this.minimize(n), this.uncheckedNodes.length == 0 ? r = this.root : r = this.uncheckedNodes[this.uncheckedNodes.length - 1].child; for (var i = n; i < e.length; i++) { var s = new t.TokenSet, o = e[i]; r.edges[o] = s, this.uncheckedNodes.push({ parent: r, char: o, child: s }), r = s } r.final = !0, this.previousWord = e }, t.TokenSet.Builder.prototype.finish = function () { this.minimize(0) }, t.TokenSet.Builder.prototype.minimize = function (e) { for (var r = this.uncheckedNodes.length - 1; r >= e; r--) { var n = this.uncheckedNodes[r], i = n.child.toString(); i in this.minimizedNodes ? n.parent.edges[n.char] = this.minimizedNodes[i] : (n.child._str = i, this.minimizedNodes[i] = n.child), this.uncheckedNodes.pop() } }; t.Index = function (e) { this.invertedIndex = e.invertedIndex, this.fieldVectors = e.fieldVectors, this.tokenSet = e.tokenSet, this.fields = e.fields, this.pipeline = e.pipeline }, t.Index.prototype.search = function (e) { return this.query(function (r) { var n = new t.QueryParser(e, r); n.parse() }) }, t.Index.prototype.query = function (e) { for (var r = new t.Query(this.fields), n = Object.create(null), i = Object.create(null), s = Object.create(null), o = Object.create(null), a = Object.create(null), u = 0; u < this.fields.length; u++)i[this.fields[u]] = new t.Vector; e.call(r, r); for (var u = 0; u < r.clauses.length; u++) { var c = r.clauses[u], f = null, g = t.Set.empty; c.usePipeline ? f = this.pipeline.runString(c.term, { fields: c.fields }) : f = [c.term]; for (var l = 0; l < f.length; l++) { var m = f[l]; c.term = m; var x = t.TokenSet.fromClause(c), v = this.tokenSet.intersect(x).toArray(); if (v.length === 0 && c.presence === t.Query.presence.REQUIRED) { for (var d = 0; d < c.fields.length; d++) { var y = c.fields[d]; o[y] = t.Set.empty } break } for (var b = 0; b < v.length; b++)for (var E = v[b], w = this.invertedIndex[E], R = w._index, d = 0; d < c.fields.length; d++) { var y = c.fields[d], j = w[y], C = Object.keys(j), D = E + "/" + y, N = new t.Set(C); if (c.presence == t.Query.presence.REQUIRED && (g = g.union(N), o[y] === void 0 && (o[y] = t.Set.complete)), c.presence == t.Query.presence.PROHIBITED) { a[y] === void 0 && (a[y] = t.Set.empty), a[y] = a[y].union(N); continue } if (i[y].upsert(R, c.boost, function (ye, me) { return ye + me }), !s[D]) { for (var M = 0; M < C.length; M++) { var V = C[M], P = new t.FieldRef(V, y), z = j[V], $; ($ = n[P]) === void 0 ? n[P] = new t.MatchData(E, y, z) : $.add(E, y, z) } s[D] = !0 } } } if (c.presence === t.Query.presence.REQUIRED) for (var d = 0; d < c.fields.length; d++) { var y = c.fields[d]; o[y] = o[y].intersect(g) } } for (var A = t.Set.complete, I = t.Set.empty, u = 0; u < this.fields.length; u++) { var y = this.fields[u]; o[y] && (A = A.intersect(o[y])), a[y] && (I = I.union(a[y])) } var h = Object.keys(n), S = [], k = Object.create(null); if (r.isNegated()) { h = Object.keys(this.fieldVectors); for (var u = 0; u < h.length; u++) { var P = h[u], L = t.FieldRef.fromString(P); n[P] = new t.MatchData } } for (var u = 0; u < h.length; u++) { var L = t.FieldRef.fromString(h[u]), p = L.docRef; if (A.contains(p) && !I.contains(p)) { var T = this.fieldVectors[L], O = i[L.fieldName].similarity(T), F; if ((F = k[p]) !== void 0) F.score += O, F.matchData.combine(n[L]); else { var Q = { ref: p, score: O, matchData: n[L] }; k[p] = Q, S.push(Q) } } } return S.sort(function (pe, ge) { return ge.score - pe.score }) }, t.Index.prototype.toJSON = function () { var e = Object.keys(this.invertedIndex).sort().map(function (n) { return [n, this.invertedIndex[n]] }, this), r = Object.keys(this.fieldVectors).map(function (n) { return [n, this.fieldVectors[n].toJSON()] }, this); return { version: t.version, fields: this.fields, fieldVectors: r, invertedIndex: e, pipeline: this.pipeline.toJSON() } }, t.Index.load = function (e) { var r = {}, n = {}, i = e.fieldVectors, s = Object.create(null), o = e.invertedIndex, a = new t.TokenSet.Builder, u = t.Pipeline.load(e.pipeline); e.version != t.version && t.utils.warn("Version mismatch when loading serialised index. Current version of lunr '" + t.version + "' does not match serialized index '" + e.version + "'"); for (var c = 0; c < i.length; c++) { var f = i[c], g = f[0], l = f[1]; n[g] = new t.Vector(l) } for (var c = 0; c < o.length; c++) { var f = o[c], m = f[0], x = f[1]; a.insert(m), s[m] = x } return a.finish(), r.fields = e.fields, r.fieldVectors = n, r.invertedIndex = s, r.tokenSet = a.root, r.pipeline = u, new t.Index(r) }; t.Builder = function () { this._ref = "id", this._fields = Object.create(null), this._documents = Object.create(null), this.invertedIndex = Object.create(null), this.fieldTermFrequencies = {}, this.fieldLengths = {}, this.tokenizer = t.tokenizer, this.pipeline = new t.Pipeline, this.searchPipeline = new t.Pipeline, this.documentCount = 0, this._b = .75, this._k1 = 1.2, this.termIndex = 0, this.metadataWhitelist = [] }, t.Builder.prototype.ref = function (e) { this._ref = e }, t.Builder.prototype.field = function (e, r) { if (/\//.test(e)) throw new RangeError("Field '" + e + "' contains illegal character '/'"); this._fields[e] = r || {} }, t.Builder.prototype.b = function (e) { e < 0 ? this._b = 0 : e > 1 ? this._b = 1 : this._b = e }, t.Builder.prototype.k1 = function (e) { this._k1 = e }, t.Builder.prototype.add = function (e, r) { var n = e[this._ref], i = Object.keys(this._fields); this._documents[n] = r || {}, this.documentCount += 1; for (var s = 0; s < i.length; s++) { var o = i[s], a = this._fields[o].extractor, u = a ? a(e) : e[o], c = this.tokenizer(u, { fields: [o] }), f = this.pipeline.run(c), g = new t.FieldRef(n, o), l = Object.create(null); this.fieldTermFrequencies[g] = l, this.fieldLengths[g] = 0, this.fieldLengths[g] += f.length; for (var m = 0; m < f.length; m++) { var x = f[m]; if (l[x] == null && (l[x] = 0), l[x] += 1, this.invertedIndex[x] == null) { var v = Object.create(null); v._index = this.termIndex, this.termIndex += 1; for (var d = 0; d < i.length; d++)v[i[d]] = Object.create(null); this.invertedIndex[x] = v } this.invertedIndex[x][o][n] == null && (this.invertedIndex[x][o][n] = Object.create(null)); for (var y = 0; y < this.metadataWhitelist.length; y++) { var b = this.metadataWhitelist[y], E = x.metadata[b]; this.invertedIndex[x][o][n][b] == null && (this.invertedIndex[x][o][n][b] = []), this.invertedIndex[x][o][n][b].push(E) } } } }, t.Builder.prototype.calculateAverageFieldLengths = function () { for (var e = Object.keys(this.fieldLengths), r = e.length, n = {}, i = {}, s = 0; s < r; s++) { var o = t.FieldRef.fromString(e[s]), a = o.fieldName; i[a] || (i[a] = 0), i[a] += 1, n[a] || (n[a] = 0), n[a] += this.fieldLengths[o] } for (var u = Object.keys(this._fields), s = 0; s < u.length; s++) { var c = u[s]; n[c] = n[c] / i[c] } this.averageFieldLength = n }, t.Builder.prototype.createFieldVectors = function () { for (var e = {}, r = Object.keys(this.fieldTermFrequencies), n = r.length, i = Object.create(null), s = 0; s < n; s++) { for (var o = t.FieldRef.fromString(r[s]), a = o.fieldName, u = this.fieldLengths[o], c = new t.Vector, f = this.fieldTermFrequencies[o], g = Object.keys(f), l = g.length, m = this._fields[a].boost || 1, x = this._documents[o.docRef].boost || 1, v = 0; v < l; v++) { var d = g[v], y = f[d], b = this.invertedIndex[d]._index, E, w, R; i[d] === void 0 ? (E = t.idf(this.invertedIndex[d], this.documentCount), i[d] = E) : E = i[d], w = E * ((this._k1 + 1) * y) / (this._k1 * (1 - this._b + this._b * (u / this.averageFieldLength[a])) + y), w *= m, w *= x, R = Math.round(w * 1e3) / 1e3, c.insert(b, R) } e[o] = c } this.fieldVectors = e }, t.Builder.prototype.createTokenSet = function () { this.tokenSet = t.TokenSet.fromArray(Object.keys(this.invertedIndex).sort()) }, t.Builder.prototype.build = function () { return this.calculateAverageFieldLengths(), this.createFieldVectors(), this.createTokenSet(), new t.Index({ invertedIndex: this.invertedIndex, fieldVectors: this.fieldVectors, tokenSet: this.tokenSet, fields: Object.keys(this._fields), pipeline: this.searchPipeline }) }, t.Builder.prototype.use = function (e) { var r = Array.prototype.slice.call(arguments, 1); r.unshift(this), e.apply(this, r) }, t.MatchData = function (e, r, n) { for (var i = Object.create(null), s = Object.keys(n || {}), o = 0; o < s.length; o++) { var a = s[o]; i[a] = n[a].slice() } this.metadata = Object.create(null), e !== void 0 && (this.metadata[e] = Object.create(null), this.metadata[e][r] = i) }, t.MatchData.prototype.combine = function (e) { for (var r = Object.keys(e.metadata), n = 0; n < r.length; n++) { var i = r[n], s = Object.keys(e.metadata[i]); this.metadata[i] == null && (this.metadata[i] = Object.create(null)); for (var o = 0; o < s.length; o++) { var a = s[o], u = Object.keys(e.metadata[i][a]); this.metadata[i][a] == null && (this.metadata[i][a] = Object.create(null)); for (var c = 0; c < u.length; c++) { var f = u[c]; this.metadata[i][a][f] == null ? this.metadata[i][a][f] = e.metadata[i][a][f] : this.metadata[i][a][f] = this.metadata[i][a][f].concat(e.metadata[i][a][f]) } } } }, t.MatchData.prototype.add = function (e, r, n) { if (!(e in this.metadata)) { this.metadata[e] = Object.create(null), this.metadata[e][r] = n; return } if (!(r in this.metadata[e])) { this.metadata[e][r] = n; return } for (var i = Object.keys(n), s = 0; s < i.length; s++) { var o = i[s]; o in this.metadata[e][r] ? this.metadata[e][r][o] = this.metadata[e][r][o].concat(n[o]) : this.metadata[e][r][o] = n[o] } }, t.Query = function (e) { this.clauses = [], this.allFields = e }, t.Query.wildcard = new String("*"), t.Query.wildcard.NONE = 0, t.Query.wildcard.LEADING = 1, t.Query.wildcard.TRAILING = 2, t.Query.presence = { OPTIONAL: 1, REQUIRED: 2, PROHIBITED: 3 }, t.Query.prototype.clause = function (e) { return "fields" in e || (e.fields = this.allFields), "boost" in e || (e.boost = 1), "usePipeline" in e || (e.usePipeline = !0), "wildcard" in e || (e.wildcard = t.Query.wildcard.NONE), e.wildcard & t.Query.wildcard.LEADING && e.term.charAt(0) != t.Query.wildcard && (e.term = "*" + e.term), e.wildcard & t.Query.wildcard.TRAILING && e.term.slice(-1) != t.Query.wildcard && (e.term = "" + e.term + "*"), "presence" in e || (e.presence = t.Query.presence.OPTIONAL), this.clauses.push(e), this }, t.Query.prototype.isNegated = function () { for (var e = 0; e < this.clauses.length; e++)if (this.clauses[e].presence != t.Query.presence.PROHIBITED) return !1; return !0 }, t.Query.prototype.term = function (e, r) { if (Array.isArray(e)) return e.forEach(function (i) { this.term(i, t.utils.clone(r)) }, this), this; var n = r || {}; return n.term = e.toString(), this.clause(n), this }, t.QueryParseError = function (e, r, n) { this.name = "QueryParseError", this.message = e, this.start = r, this.end = n }, t.QueryParseError.prototype = new Error, t.QueryLexer = function (e) { this.lexemes = [], this.str = e, this.length = e.length, this.pos = 0, this.start = 0, this.escapeCharPositions = [] }, t.QueryLexer.prototype.run = function () { for (var e = t.QueryLexer.lexText; e;)e = e(this) }, t.QueryLexer.prototype.sliceString = function () { for (var e = [], r = this.start, n = this.pos, i = 0; i < this.escapeCharPositions.length; i++)n = this.escapeCharPositions[i], e.push(this.str.slice(r, n)), r = n + 1; return e.push(this.str.slice(r, this.pos)), this.escapeCharPositions.length = 0, e.join("") }, t.QueryLexer.prototype.emit = function (e) { this.lexemes.push({ type: e, str: this.sliceString(), start: this.start, end: this.pos }), this.start = this.pos }, t.QueryLexer.prototype.escapeCharacter = function () { this.escapeCharPositions.push(this.pos - 1), this.pos += 1 }, t.QueryLexer.prototype.next = function () { if (this.pos >= this.length) return t.QueryLexer.EOS; var e = this.str.charAt(this.pos); return this.pos += 1, e }, t.QueryLexer.prototype.width = function () { return this.pos - this.start }, t.QueryLexer.prototype.ignore = function () { this.start == this.pos && (this.pos += 1), this.start = this.pos }, t.QueryLexer.prototype.backup = function () { this.pos -= 1 }, t.QueryLexer.prototype.acceptDigitRun = function () { var e, r; do e = this.next(), r = e.charCodeAt(0); while (r > 47 && r < 58); e != t.QueryLexer.EOS && this.backup() }, t.QueryLexer.prototype.more = function () { return this.pos < this.length }, t.QueryLexer.EOS = "EOS", t.QueryLexer.FIELD = "FIELD", t.QueryLexer.TERM = "TERM", t.QueryLexer.EDIT_DISTANCE = "EDIT_DISTANCE", t.QueryLexer.BOOST = "BOOST", t.QueryLexer.PRESENCE = "PRESENCE", t.QueryLexer.lexField = function (e) { return e.backup(), e.emit(t.QueryLexer.FIELD), e.ignore(), t.QueryLexer.lexText }, t.QueryLexer.lexTerm = function (e) { if (e.width() > 1 && (e.backup(), e.emit(t.QueryLexer.TERM)), e.ignore(), e.more()) return t.QueryLexer.lexText }, t.QueryLexer.lexEditDistance = function (e) { return e.ignore(), e.acceptDigitRun(), e.emit(t.QueryLexer.EDIT_DISTANCE), t.QueryLexer.lexText }, t.QueryLexer.lexBoost = function (e) { return e.ignore(), e.acceptDigitRun(), e.emit(t.QueryLexer.BOOST), t.QueryLexer.lexText }, t.QueryLexer.lexEOS = function (e) { e.width() > 0 && e.emit(t.QueryLexer.TERM) }, t.QueryLexer.termSeparator = t.tokenizer.separator, t.QueryLexer.lexText = function (e) { for (; ;) { var r = e.next(); if (r == t.QueryLexer.EOS) return t.QueryLexer.lexEOS; if (r.charCodeAt(0) == 92) { e.escapeCharacter(); continue } if (r == ":") return t.QueryLexer.lexField; if (r == "~") return e.backup(), e.width() > 0 && e.emit(t.QueryLexer.TERM), t.QueryLexer.lexEditDistance; if (r == "^") return e.backup(), e.width() > 0 && e.emit(t.QueryLexer.TERM), t.QueryLexer.lexBoost; if (r == "+" && e.width() === 1 || r == "-" && e.width() === 1) return e.emit(t.QueryLexer.PRESENCE), t.QueryLexer.lexText; if (r.match(t.QueryLexer.termSeparator)) return t.QueryLexer.lexTerm } }, t.QueryParser = function (e, r) { this.lexer = new t.QueryLexer(e), this.query = r, this.currentClause = {}, this.lexemeIdx = 0 }, t.QueryParser.prototype.parse = function () { this.lexer.run(), this.lexemes = this.lexer.lexemes; for (var e = t.QueryParser.parseClause; e;)e = e(this); return this.query }, t.QueryParser.prototype.peekLexeme = function () { return this.lexemes[this.lexemeIdx] }, t.QueryParser.prototype.consumeLexeme = function () { var e = this.peekLexeme(); return this.lexemeIdx += 1, e }, t.QueryParser.prototype.nextClause = function () { var e = this.currentClause; this.query.clause(e), this.currentClause = {} }, t.QueryParser.parseClause = function (e) { var r = e.peekLexeme(); if (r != null) switch (r.type) { case t.QueryLexer.PRESENCE: return t.QueryParser.parsePresence; case t.QueryLexer.FIELD: return t.QueryParser.parseField; case t.QueryLexer.TERM: return t.QueryParser.parseTerm; default: var n = "expected either a field or a term, found " + r.type; throw r.str.length >= 1 && (n += " with value '" + r.str + "'"), new t.QueryParseError(n, r.start, r.end) } }, t.QueryParser.parsePresence = function (e) { var r = e.consumeLexeme(); if (r != null) { switch (r.str) { case "-": e.currentClause.presence = t.Query.presence.PROHIBITED; break; case "+": e.currentClause.presence = t.Query.presence.REQUIRED; break; default: var n = "unrecognised presence operator'" + r.str + "'"; throw new t.QueryParseError(n, r.start, r.end) }var i = e.peekLexeme(); if (i == null) { var n = "expecting term or field, found nothing"; throw new t.QueryParseError(n, r.start, r.end) } switch (i.type) { case t.QueryLexer.FIELD: return t.QueryParser.parseField; case t.QueryLexer.TERM: return t.QueryParser.parseTerm; default: var n = "expecting term or field, found '" + i.type + "'"; throw new t.QueryParseError(n, i.start, i.end) } } }, t.QueryParser.parseField = function (e) { var r = e.consumeLexeme(); if (r != null) { if (e.query.allFields.indexOf(r.str) == -1) { var n = e.query.allFields.map(function (o) { return "'" + o + "'" }).join(", "), i = "unrecognised field '" + r.str + "', possible fields: " + n; throw new t.QueryParseError(i, r.start, r.end) } e.currentClause.fields = [r.str]; var s = e.peekLexeme(); if (s == null) { var i = "expecting term, found nothing"; throw new t.QueryParseError(i, r.start, r.end) } switch (s.type) { case t.QueryLexer.TERM: return t.QueryParser.parseTerm; default: var i = "expecting term, found '" + s.type + "'"; throw new t.QueryParseError(i, s.start, s.end) } } }, t.QueryParser.parseTerm = function (e) { var r = e.consumeLexeme(); if (r != null) { e.currentClause.term = r.str.toLowerCase(), r.str.indexOf("*") != -1 && (e.currentClause.usePipeline = !1); var n = e.peekLexeme(); if (n == null) { e.nextClause(); return } switch (n.type) { case t.QueryLexer.TERM: return e.nextClause(), t.QueryParser.parseTerm; case t.QueryLexer.FIELD: return e.nextClause(), t.QueryParser.parseField; case t.QueryLexer.EDIT_DISTANCE: return t.QueryParser.parseEditDistance; case t.QueryLexer.BOOST: return t.QueryParser.parseBoost; case t.QueryLexer.PRESENCE: return e.nextClause(), t.QueryParser.parsePresence; default: var i = "Unexpected lexeme type '" + n.type + "'"; throw new t.QueryParseError(i, n.start, n.end) } } }, t.QueryParser.parseEditDistance = function (e) { var r = e.consumeLexeme(); if (r != null) { var n = parseInt(r.str, 10); if (isNaN(n)) { var i = "edit distance must be numeric"; throw new t.QueryParseError(i, r.start, r.end) } e.currentClause.editDistance = n; var s = e.peekLexeme(); if (s == null) { e.nextClause(); return } switch (s.type) { case t.QueryLexer.TERM: return e.nextClause(), t.QueryParser.parseTerm; case t.QueryLexer.FIELD: return e.nextClause(), t.QueryParser.parseField; case t.QueryLexer.EDIT_DISTANCE: return t.QueryParser.parseEditDistance; case t.QueryLexer.BOOST: return t.QueryParser.parseBoost; case t.QueryLexer.PRESENCE: return e.nextClause(), t.QueryParser.parsePresence; default: var i = "Unexpected lexeme type '" + s.type + "'"; throw new t.QueryParseError(i, s.start, s.end) } } }, t.QueryParser.parseBoost = function (e) { var r = e.consumeLexeme(); if (r != null) { var n = parseInt(r.str, 10); if (isNaN(n)) { var i = "boost must be numeric"; throw new t.QueryParseError(i, r.start, r.end) } e.currentClause.boost = n; var s = e.peekLexeme(); if (s == null) { e.nextClause(); return } switch (s.type) { case t.QueryLexer.TERM: return e.nextClause(), t.QueryParser.parseTerm; case t.QueryLexer.FIELD: return e.nextClause(), t.QueryParser.parseField; case t.QueryLexer.EDIT_DISTANCE: return t.QueryParser.parseEditDistance; case t.QueryLexer.BOOST: return t.QueryParser.parseBoost; case t.QueryLexer.PRESENCE: return e.nextClause(), t.QueryParser.parsePresence; default: var i = "Unexpected lexeme type '" + s.type + "'"; throw new t.QueryParseError(i, s.start, s.end) } } }, function (e, r) { typeof define == "function" && define.amd ? define(r) : typeof K == "object" ? ee.exports = r() : e.lunr = r() }(this, function () { return t }) - })() - }); var de = Pe(te()); function re(t, e = document) { let r = ke(t, e); if (typeof r == "undefined") throw new ReferenceError(`Missing element: expected "${t}" to be present`); return r } function ke(t, e = document) { return e.querySelector(t) || void 0 } Object.entries || (Object.entries = function (t) { let e = []; for (let r of Object.keys(t)) e.push([r, t[r]]); return e }); Object.values || (Object.values = function (t) { let e = []; for (let r of Object.keys(t)) e.push(t[r]); return e }); typeof Element != "undefined" && (Element.prototype.scrollTo || (Element.prototype.scrollTo = function (t, e) { typeof t == "object" ? (this.scrollLeft = t.left, this.scrollTop = t.top) : (this.scrollLeft = t, this.scrollTop = e) }), Element.prototype.replaceWith || (Element.prototype.replaceWith = function (...t) { let e = this.parentNode; if (e) { t.length === 0 && e.removeChild(this); for (let r = t.length - 1; r >= 0; r--) { let n = t[r]; typeof n == "string" ? n = document.createTextNode(n) : n.parentNode && n.parentNode.removeChild(n), r ? e.insertBefore(this.previousSibling, n) : e.replaceChild(n, this) } } })); function ne(t) { let e = new Map; for (let r of t) { let [n] = r.location.split("#"), i = e.get(n); typeof i == "undefined" ? e.set(n, r) : (e.set(r.location, r), r.parent = i) } return e } function H(t, e, r) { var s; e = new RegExp(e, "g"); let n, i = 0; do { n = e.exec(t); let o = (s = n == null ? void 0 : n.index) != null ? s : t.length; if (i < o && r(i, o), n) { let [a] = n; i = n.index + a.length, a.length === 0 && (e.lastIndex = n.index + 1) } } while (n) } function ie(t, e) { let r = 0, n = 0, i = 0; for (let s = 0; i < t.length; i++)t.charAt(i) === "<" && i > n ? e(r, 1, n, n = i) : t.charAt(i) === ">" && (t.charAt(n + 1) === "/" ? --s === 0 && e(r++, 2, n, i + 1) : t.charAt(i - 1) !== "/" && s++ === 0 && e(r, 0, n, i + 1), n = i + 1); i > n && e(r, 1, n, i) } function se(t, e, r, n = !1) { return q([t], e, r, n).pop() } function q(t, e, r, n = !1) { let i = [0]; for (let s = 1; s < e.length; s++) { let o = e[s - 1], a = e[s], u = o[o.length - 1] >>> 2 & 1023, c = a[0] >>> 12; i.push(+(u > c) + i[i.length - 1]) } return t.map((s, o) => { let a = 0, u = new Map; for (let f of r.sort((g, l) => g - l)) { let g = f & 1048575, l = f >>> 20; if (i[l] !== o) continue; let m = u.get(l); typeof m == "undefined" && u.set(l, m = []), m.push(g) } if (u.size === 0) return s; let c = []; for (let [f, g] of u) { let l = e[f], m = l[0] >>> 12, x = l[l.length - 1] >>> 12, v = l[l.length - 1] >>> 2 & 1023; n && m > a && c.push(s.slice(a, m)); let d = s.slice(m, x + v); for (let y of g.sort((b, E) => E - b)) { let b = (l[y] >>> 12) - m, E = (l[y] >>> 2 & 1023) + b; d = [d.slice(0, b), "", d.slice(b, E), "", d.slice(E)].join("") } if (a = x + v, c.push(d) === 2) break } return n && a < s.length && c.push(s.slice(a)), c.join("") }) } function oe(t) { let e = []; if (typeof t == "undefined") return e; let r = Array.isArray(t) ? t : [t]; for (let n = 0; n < r.length; n++) { let i = lunr.tokenizer.table, s = i.length; ie(r[n], (o, a, u, c) => { var f; switch (i[f = o += s] || (i[f] = []), a) { case 0: case 2: i[o].push(u << 12 | c - u << 2 | a); break; case 1: let g = r[n].slice(u, c); H(g, lunr.tokenizer.separator, (l, m) => { if (typeof lunr.segmenter != "undefined") { let x = g.slice(l, m); if (/^[MHIK]$/.test(lunr.segmenter.ctype_(x))) { let v = lunr.segmenter.segment(x); for (let d = 0, y = 0; d < v.length; d++)i[o] || (i[o] = []), i[o].push(u + l + y << 12 | v[d].length << 2 | a), e.push(new lunr.Token(v[d].toLowerCase(), { position: o << 20 | i[o].length - 1 })), y += v[d].length; return } } i[o].push(u + l << 12 | m - l << 2 | a), e.push(new lunr.Token(g.slice(l, m).toLowerCase(), { position: o << 20 | i[o].length - 1 })) }) } }) } return e } function ae(t, e = r => r) { return t.trim().split(/"([^"]+)"/g).map((r, n) => n & 1 ? r.replace(/^\b|^(?![^\x00-\x7F]|$)|\s+/g, " +") : r).join("").replace(/"|(?:^|\s+)[*+\-:^~]+(?=\s+|$)/g, "").split(/\s+/g).reduce((r, n) => { let i = e(n); return [...r, ...Array.isArray(i) ? i : [i]] }, []).map(r => /([~^]$)/.test(r) ? `${r}1` : r).map(r => /(^[+-]|[~^]\d+$)/.test(r) ? r : `${r}*`).join(" ") } function ue(t) { return ae(t, e => { let r = [], n = new lunr.QueryLexer(e); n.run(); for (let { type: i, str: s, start: o, end: a } of n.lexemes) switch (i) { case "FIELD": ["title", "text", "tags"].includes(s) || (e = [e.slice(0, a), " ", e.slice(a + 1)].join("")); break; case "TERM": H(s, lunr.tokenizer.separator, (...u) => { r.push([e.slice(0, o), s.slice(...u), e.slice(a)].join("")) }) }return r }) } function ce(t) { let e = new lunr.Query(["title", "text", "tags"]); new lunr.QueryParser(t, e).parse(); for (let n of e.clauses) n.usePipeline = !0, n.term.startsWith("*") && (n.wildcard = lunr.Query.wildcard.LEADING, n.term = n.term.slice(1)), n.term.endsWith("*") && (n.wildcard = lunr.Query.wildcard.TRAILING, n.term = n.term.slice(0, -1)); return e.clauses } function le(t, e) { var i; let r = new Set(t), n = {}; for (let s = 0; s < e.length; s++)for (let o of r) e[s].startsWith(o.term) && (n[o.term] = !0, r.delete(o)); for (let s of r) (i = lunr.stopWordFilter) != null && i.call(lunr, s.term) && (n[s.term] = !1); return n } function he(t, e) { let r = new Set, n = new Uint16Array(t.length); for (let s = 0; s < t.length; s++)for (let o = s + 1; o < t.length; o++)t.slice(s, o) in e && (n[s] = o - s); let i = [0]; for (let s = i.length; s > 0;) { let o = i[--s]; for (let u = 1; u < n[o]; u++)n[o + u] > n[o] - u && (r.add(t.slice(o, o + u)), i[s++] = o + u); let a = o + n[o]; n[a] && a < t.length - 1 && (i[s++] = a), r.add(t.slice(o, a)) } return r.has("") ? new Set([t]) : r } function Oe(t) { return e => r => { if (typeof r[e] == "undefined") return; let n = [r.location, e].join(":"); return t.set(n, lunr.tokenizer.table = []), r[e] } } function Re(t, e) { let [r, n] = [new Set(t), new Set(e)]; return [...new Set([...r].filter(i => !n.has(i)))] } var U = class { constructor({ config: e, docs: r, options: n }) { let i = Oe(this.table = new Map); this.map = ne(r), this.options = n, this.index = lunr(function () { this.metadataWhitelist = ["position"], this.b(0), e.lang.length === 1 && e.lang[0] !== "en" ? this.use(lunr[e.lang[0]]) : e.lang.length > 1 && this.use(lunr.multiLanguage(...e.lang)), this.tokenizer = oe, lunr.tokenizer.separator = new RegExp(e.separator), lunr.segmenter = "TinySegmenter" in lunr ? new lunr.TinySegmenter : void 0; let s = Re(["trimmer", "stopWordFilter", "stemmer"], e.pipeline); for (let o of e.lang.map(a => a === "en" ? lunr : lunr[a])) for (let a of s) this.pipeline.remove(o[a]), this.searchPipeline.remove(o[a]); this.ref("location"); for (let [o, a] of Object.entries(e.fields)) this.field(o, B(_({}, a), { extractor: i(o) })); for (let o of r) this.add(o, { boost: o.boost }) }) } search(e) { if (e = e.replace(new RegExp("\\p{sc=Han}+", "gu"), s => [...he(s, this.index.invertedIndex)].join("* ")), e = ue(e), !e) return { items: [] }; let r = ce(e).filter(s => s.presence !== lunr.Query.presence.PROHIBITED), n = this.index.search(e).reduce((s, { ref: o, score: a, matchData: u }) => { let c = this.map.get(o); if (typeof c != "undefined") { c = _({}, c), c.tags && (c.tags = [...c.tags]); let f = le(r, Object.keys(u.metadata)); for (let l of this.index.fields) { if (typeof c[l] == "undefined") continue; let m = []; for (let d of Object.values(u.metadata)) typeof d[l] != "undefined" && m.push(...d[l].position); if (!m.length) continue; let x = this.table.get([c.location, l].join(":")), v = Array.isArray(c[l]) ? q : se; c[l] = v(c[l], x, m, l !== "text") } let g = +!c.parent + Object.values(f).filter(l => l).length / Object.keys(f).length; s.push(B(_({}, c), { score: a * (1 + Z(g, 2)), terms: f })) } return s }, []).sort((s, o) => o.score - s.score).reduce((s, o) => { let a = this.map.get(o.location); if (typeof a != "undefined") { let u = a.parent ? a.parent.location : a.location; s.set(u, [...s.get(u) || [], o]) } return s }, new Map); for (let [s, o] of n) if (!o.find(a => a.location === s)) { let a = this.map.get(s); o.push(B(_({}, a), { score: 0, terms: {} })) } let i; if (this.options.suggest) { let s = this.index.query(o => { for (let a of r) o.term(a.term, { fields: ["title"], presence: lunr.Query.presence.REQUIRED, wildcard: lunr.Query.wildcard.TRAILING }) }); i = s.length ? Object.keys(s[0].matchData.metadata) : [] } return _({ items: [...n.values()] }, typeof i != "undefined" && { suggest: i }) } }; var fe; function Ie(t) { return W(this, null, function* () { let e = "../lunr"; if (typeof parent != "undefined" && "IFrameWorker" in parent) { let n = re("script[src]"), [i] = n.src.split("/worker"); e = e.replace("..", i) } let r = []; for (let n of t.lang) { switch (n) { case "ja": r.push(`${e}/tinyseg.js`); break; case "hi": case "th": r.push(`${e}/wordcut.js`); break }n !== "en" && r.push(`${e}/min/lunr.${n}.min.js`) } t.lang.length > 1 && r.push(`${e}/min/lunr.multi.min.js`), r.length && (yield importScripts(`${e}/min/lunr.stemmer.support.min.js`, ...r)) }) } function Fe(t) { return W(this, null, function* () { switch (t.type) { case 0: return yield Ie(t.data.config), fe = new U(t.data), { type: 1 }; case 2: let e = t.data; try { return { type: 3, data: fe.search(e) } } catch (r) { return console.warn(`Invalid query: ${e} \u2013 see https://bit.ly/2s3ChXG`), console.warn(r), { type: 3, data: { items: [] } } } default: throw new TypeError("Invalid message type") } }) } self.lunr = de.default; addEventListener("message", t => W(void 0, null, function* () { postMessage(yield Fe(t.data)) })); -})(); diff --git a/docs/competitions/f1tenth-sim-racing-cdc-2024.md b/docs/competitions/f1tenth-sim-racing-cdc-2024.md index f0b255a..0a1c47a 100644 --- a/docs/competitions/f1tenth-sim-racing-cdc-2024.md +++ b/docs/competitions/f1tenth-sim-racing-cdc-2024.md @@ -75,7 +75,7 @@ Following is a brief summary of each event:

-AutoDRIVE is envisioned to be an open, comprehensive, flexible and integrated cyber-physical ecosystem for enhancing autonomous driving research and education. It bridges the gap between software simulation and hardware deployment by providing the AutoDRIVE Simulator and AutoDRIVE Testbed, a well-suited duo for real2sim and sim2real transfer targetting vehicles and environments of varying scales and operational design domains. It also offers AutoDRIVE Devkit, a developer's kit for rapid and flexible development of autonomy algorithms using a variety of programming languages and software frameworks. For the Sim Racing League, teams will develop their autonomous racing algorithms using the AutoDRIVE Devkit to interface with the AutoDRIVE Simulator in real-time. +AutoDRIVE is envisioned to be an open, comprehensive, flexible and integrated cyber-physical ecosystem for enhancing autonomous driving research and education. It bridges the gap between software simulation and hardware deployment by providing the AutoDRIVE Simulator and AutoDRIVE Testbed, a well-suited duo for real2sim and sim2real transfer targeting vehicles and environments of varying scales and operational design domains. It also offers AutoDRIVE Devkit, a developer's kit for rapid and flexible development of autonomy algorithms using a variety of programming languages and software frameworks. For the Sim Racing League, teams will develop their autonomous racing algorithms using the AutoDRIVE Devkit to interface with the AutoDRIVE Simulator in real-time.

@@ -83,7 +83,7 @@ Following is a brief summary of each event: F1TENTH is an international community of researchers, engineers, and autonomous systems enthusiasts. It is centered around the idea of converting a 1:10 scale RC car into an autonomous vehicle for research and education; check out the documentation to build your own F1TENTH autonomous racecar. Additionally, if you are new to the field of autonomous racing, you can refer to the complete course material, which is open sourced. If you already have some experience with autonomous racing, feel free to delve deeper into the research enabled by F1TENTH. Lastly, you can also check out the physical F1TENTH races that are being organized all around the world. For the Sim Racing League, teams will not require a physical F1TENTH vehicle; however, the learning resources can certainly be useful to get your autonomous racing fundamentals right!

-As the next few steps, we recommend all the teams interested in particiating in the F1TENTH Sim Racing League to get accustomed with the competition framework: +As the next few steps, we recommend all the teams interested in participating in the F1TENTH Sim Racing League to get accustomed with the competition framework:
@@ -101,7 +101,7 @@ This competition is open for everyone around the world - students, researchers,

-Registration for the Sim Racing League is free of cost and seperate from the Physical Racing League and the conference registrations themselves. The above form signs you up only for the Sim Racing League, and for its orientation and information sessions. Although you can participate in the Sim Racing League without attending the conference, we strongly encourage all competition participants to attent the conference in person. This will help you connect with the broader AutoDRIVE and F1TENTH communities, and you can also witness/participate in the physical F1TENTH autonomous racing competition! +Registration for the Sim Racing League is free of cost and separate from the Physical Racing League and the conference registrations themselves. The above form signs you up only for the Sim Racing League, and for its orientation and information sessions. Although you can participate in the Sim Racing League without attending the conference, we strongly encourage all competition participants to attend the conference in person. This will help you connect with the broader AutoDRIVE and F1TENTH communities, and you can also witness/participate in the physical F1TENTH autonomous racing competition!

diff --git a/docs/competitions/f1tenth-sim-racing-iros-2024.md b/docs/competitions/f1tenth-sim-racing-iros-2024.md index 4c1fd88..871dee1 100644 --- a/docs/competitions/f1tenth-sim-racing-iros-2024.md +++ b/docs/competitions/f1tenth-sim-racing-iros-2024.md @@ -75,7 +75,7 @@ Following is a brief summary of each event:

-AutoDRIVE is envisioned to be an open, comprehensive, flexible and integrated cyber-physical ecosystem for enhancing autonomous driving research and education. It bridges the gap between software simulation and hardware deployment by providing the AutoDRIVE Simulator and AutoDRIVE Testbed, a well-suited duo for real2sim and sim2real transfer targetting vehicles and environments of varying scales and operational design domains. It also offers AutoDRIVE Devkit, a developer's kit for rapid and flexible development of autonomy algorithms using a variety of programming languages and software frameworks. For the Sim Racing League, teams will develop their autonomous racing algorithms using the AutoDRIVE Devkit to interface with the AutoDRIVE Simulator in real-time. +AutoDRIVE is envisioned to be an open, comprehensive, flexible and integrated cyber-physical ecosystem for enhancing autonomous driving research and education. It bridges the gap between software simulation and hardware deployment by providing the AutoDRIVE Simulator and AutoDRIVE Testbed, a well-suited duo for real2sim and sim2real transfer targeting vehicles and environments of varying scales and operational design domains. It also offers AutoDRIVE Devkit, a developer's kit for rapid and flexible development of autonomy algorithms using a variety of programming languages and software frameworks. For the Sim Racing League, teams will develop their autonomous racing algorithms using the AutoDRIVE Devkit to interface with the AutoDRIVE Simulator in real-time.

@@ -83,7 +83,7 @@ Following is a brief summary of each event: F1TENTH is an international community of researchers, engineers, and autonomous systems enthusiasts. It is centered around the idea of converting a 1:10 scale RC car into an autonomous vehicle for research and education; check out the documentation to build your own F1TENTH autonomous racecar. Additionally, if you are new to the field of autonomous racing, you can refer to the complete course material, which is open sourced. If you already have some experience with autonomous racing, feel free to delve deeper into the research enabled by F1TENTH. Lastly, you can also check out the physical F1TENTH races that are being organized all around the world. For the Sim Racing League, teams will not require a physical F1TENTH vehicle; however, the learning resources can certainly be useful to get your autonomous racing fundamentals right!

-As the next few steps, we recommend all the teams interested in particiating in the F1TENTH Sim Racing League to get accustomed with the competition framework: +As the next few steps, we recommend all the teams interested in participating in the F1TENTH Sim Racing League to get accustomed with the competition framework:
@@ -101,7 +101,7 @@ This competition is open for everyone around the world - students, researchers,

-Registration for the Sim Racing League is free of cost and seperate from the Physical Racing League and the conference registrations themselves. The above form signs you up only for the Sim Racing League, and for its orientation and information sessions. Although you can participate in the Sim Racing League without attending the conference, we strongly encourage all competition participants to attent the conference in person. This will help you connect with the broader AutoDRIVE and F1TENTH communities, and you can also witness/participate in the physical F1TENTH autonomous racing competition! +Registration for the Sim Racing League is free of cost and separate from the Physical Racing League and the conference registrations themselves. The above form signs you up only for the Sim Racing League, and for its orientation and information sessions. Although you can participate in the Sim Racing League without attending the conference, we strongly encourage all competition participants to attend the conference in person. This will help you connect with the broader AutoDRIVE and F1TENTH communities, and you can also witness/participate in the physical F1TENTH autonomous racing competition!

diff --git a/docs/index.html b/docs/index.html index 57a5be0..3089c00 100644 --- a/docs/index.html +++ b/docs/index.html @@ -339,7 +339,7 @@

Open Source

Comprehensive

The ecosystem offers an all-in-one framework for developing, simulating and - deploying autonomy algorithms targetted + deploying autonomy algorithms targeted towards vehicles and environments across different scales, configurations and operational design domains (ODDs).

@@ -1717,7 +1717,7 @@

"search.suggest", "toc.follow" ], - "search": "assets/javascripts/search.js", + "search": "assets/javascripts/workers/search.b8dbb3d2.min.js", "translations": { "clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard",