|
27 | 27 | var assert = (condition, message = "Assertion failed") => {
|
28 | 28 | if (!condition) throw new Error(message);
|
29 | 29 | };
|
30 |
| - var version = "0.94.1"; |
| 30 | + var version = "0.95.0"; |
31 | 31 | function litecanvas(settings = {}) {
|
32 | 32 | const root = window, math = Math, TWO_PI = math.PI * 2, raf = requestAnimationFrame, _browserEventListeners = [], on = (elem, evt, callback) => {
|
33 | 33 | elem.addEventListener(evt, callback, false);
|
34 | 34 | _browserEventListeners.push(() => elem.removeEventListener(evt, callback, false));
|
35 |
| - }, beginPath = (c) => c.beginPath(), isNumber = Number.isFinite, zzfx = setupZzFX(root), defaults = { |
| 35 | + }, preventDefault = (ev) => ev.preventDefault(), beginPath = (c) => c.beginPath(), isNumber = Number.isFinite, zzfx = setupZzFX(root), defaults = { |
36 | 36 | width: null,
|
37 | 37 | height: null,
|
38 | 38 | autoscale: true,
|
39 |
| - pixelart: false, |
| 39 | + pixelart: true, |
40 | 40 | canvas: null,
|
41 | 41 | global: true,
|
42 | 42 | loop: null,
|
|
1099 | 1099 | * @param {{t: number}} tap
|
1100 | 1100 | */
|
1101 | 1101 | (tap) => tap && Date.now() - tap.t <= 300
|
1102 |
| - ), preventDefault = ( |
1103 |
| - /** |
1104 |
| - * @param {Event} ev |
1105 |
| - */ |
1106 |
| - (ev) => ev.preventDefault() |
1107 | 1102 | );
|
1108 | 1103 | let _pressingMouse = false;
|
1109 | 1104 | on(
|
|
1224 | 1219 | key = key.toLowerCase();
|
1225 | 1220 | return !key ? keySet.size > 0 : keySet.has("space" === key ? " " : key);
|
1226 | 1221 | };
|
| 1222 | + let _lastKey = ""; |
1227 | 1223 | on(root, "keydown", (event) => {
|
1228 | 1224 | const key = event.key.toLowerCase();
|
1229 | 1225 | if (!_keysDown.has(key)) {
|
1230 | 1226 | _keysDown.add(key);
|
1231 | 1227 | _keysPress.add(key);
|
| 1228 | + _lastKey = key === " " ? "space" : key; |
1232 | 1229 | }
|
1233 | 1230 | });
|
1234 | 1231 | on(root, "keyup", (event) => {
|
|
1239 | 1236 | instance.def(
|
1240 | 1237 | "iskeydown",
|
1241 | 1238 | /**
|
1242 |
| - * Checks if a which key is pressed (down) on the keyboard. |
1243 |
| - * Note: use `iskeydown()` to check for any key. |
1244 |
| - * |
1245 | 1239 | * @param {string} [key]
|
1246 | 1240 | * @returns {boolean}
|
1247 | 1241 | */
|
|
1256 | 1250 | instance.def(
|
1257 | 1251 | "iskeypressed",
|
1258 | 1252 | /**
|
1259 |
| - * Checks if a which key just got pressed on the keyboard. |
1260 |
| - * Note: use `iskeypressed()` to check for any key. |
1261 |
| - * |
1262 | 1253 | * @param {string} [key]
|
1263 | 1254 | * @returns {boolean}
|
1264 | 1255 | */
|
|
1270 | 1261 | return keyCheck(_keysPress, key);
|
1271 | 1262 | }
|
1272 | 1263 | );
|
| 1264 | + instance.def( |
| 1265 | + "lastkey", |
| 1266 | + /** |
| 1267 | + * @returns {string} |
| 1268 | + */ |
| 1269 | + () => _lastKey |
| 1270 | + ); |
1273 | 1271 | }
|
1274 | 1272 | _initialized = true;
|
1275 | 1273 | instance.emit("init", instance);
|
|
2215 | 2213 | window.pluginFrameRateMeter = E;
|
2216 | 2214 | })();
|
2217 | 2215 | (() => {
|
2218 |
| - var k = [[24, 60, 60, 24, 24, , 24], [54, 54, , , , , ,], [54, 54, 127, 54, 127, 54, 54], [12, 62, 3, 30, 48, 31, 12], [, 99, 51, 24, 12, 102, 99], [28, 54, 28, 110, 59, 51, 110], [6, 6, 3, , , , ,], [24, 12, 6, 6, 6, 12, 24], [6, 12, 24, 24, 24, 12, 6], [, 102, 60, 255, 60, 102, ,], [, 12, 12, 63, 12, 12, ,], [, , , , , 12, 12, 6], [, , , 63, , , ,], [, , , , , 12, 12], [96, 48, 24, 12, 6, 3, 1], [62, 99, 115, 123, 111, 103, 62], [12, 14, 12, 12, 12, 12, 63], [30, 51, 48, 28, 6, 51, 63], [30, 51, 48, 28, 48, 51, 30], [56, 60, 54, 51, 127, 48, 120], [63, 3, 31, 48, 48, 51, 30], [28, 6, 3, 31, 51, 51, 30], [63, 51, 48, 24, 12, 12, 12], [30, 51, 51, 30, 51, 51, 30], [30, 51, 51, 62, 48, 24, 14], [, 12, 12, , , 12, 12], [, 12, 12, , , 12, 12, 6], [24, 12, 6, 3, 6, 12, 24], [, , 63, , , 63, ,], [6, 12, 24, 48, 24, 12, 6], [30, 51, 48, 24, 12, , 12], [62, 99, 123, 123, 123, 3, 30], [12, 30, 51, 51, 63, 51, 51], [63, 102, 102, 62, 102, 102, 63], [60, 102, 3, 3, 3, 102, 60], [31, 54, 102, 102, 102, 54, 31], [127, 70, 22, 30, 22, 70, 127], [127, 70, 22, 30, 22, 6, 15], [60, 102, 3, 3, 115, 102, 124], [51, 51, 51, 63, 51, 51, 51], [30, 12, 12, 12, 12, 12, 30], [120, 48, 48, 48, 51, 51, 30], [103, 102, 54, 30, 54, 102, 103], [15, 6, 6, 6, 70, 102, 127], [99, 119, 127, 127, 107, 99, 99], [99, 103, 111, 123, 115, 99, 99], [28, 54, 99, 99, 99, 54, 28], [63, 102, 102, 62, 6, 6, 15], [30, 51, 51, 51, 59, 30, 56], [63, 102, 102, 62, 54, 102, 103], [30, 51, 7, 14, 56, 51, 30], [63, 45, 12, 12, 12, 12, 30], [51, 51, 51, 51, 51, 51, 63], [51, 51, 51, 51, 51, 30, 12], [99, 99, 99, 107, 127, 119, 99], [99, 99, 54, 28, 28, 54, 99], [51, 51, 51, 30, 12, 12, 30], [127, 99, 49, 24, 76, 102, 127], [30, 6, 6, 6, 6, 6, 30], [3, 6, 12, 24, 48, 96, 64], [30, 24, 24, 24, 24, 24, 30], [8, 28, 54, 99, , , ,], [, , , , , , , 255], [12, 12, 24, , , , ,], [, , 30, 48, 62, 51, 110], [7, 6, 6, 62, 102, 102, 59], [, , 30, 51, 3, 51, 30], [56, 48, 48, 62, 51, 51, 110], [, , 30, 51, 63, 3, 30], [28, 54, 6, 15, 6, 6, 15], [, , 110, 51, 51, 62, 48, 31], [7, 6, 54, 110, 102, 102, 103], [12, , 14, 12, 12, 12, 30], [48, , 48, 48, 48, 51, 51, 30], [7, 6, 102, 54, 30, 54, 103], [14, 12, 12, 12, 12, 12, 30], [, , 51, 127, 127, 107, 99], [, , 31, 51, 51, 51, 51], [, , 30, 51, 51, 51, 30], [, , 59, 102, 102, 62, 6, 15], [, , 110, 51, 51, 62, 48, 120], [, , 59, 110, 102, 6, 15], [, , 62, 3, 30, 48, 31], [8, 12, 62, 12, 12, 44, 24], [, , 51, 51, 51, 51, 110], [, , 51, 51, 51, 30, 12], [, , 99, 107, 127, 127, 54], [, , 99, 54, 28, 54, 99], [, , 51, 51, 51, 62, 48, 31], [, , 63, 25, 12, 38, 63], [56, 12, 12, 7, 12, 12, 56], [24, 24, 24, , 24, 24, 24], [7, 12, 12, 56, 12, 12, 7], [110, 59, , , , , ,]], w = { id: "basic", chars: k, first: 33, w: 8, h: 8 }; |
2219 |
| - var D = [[2, 2, 2, , 2], [5, 5], [5, 7, 5, 7, 5], [6, 3, 6, 7, 2], [5, 4, 2, 1, 5], [6, 3, 6, 5, 6], [2, 2, , , ,], [2, 1, 1, 1, 2], [2, 4, 4, 4, 2], [5, 2, 5], [, 2, 7, 2], [, , , , 2, 1], [, , 7], [, , , , 1], [4, 4, 2, 1, 1], [7, 5, 5, 5, 7], [3, 2, 2, 2, 7], [7, 4, 7, 1, 7], [7, 4, 7, 4, 7], [5, 5, 7, 4, 4], [7, 1, 7, 4, 7], [7, 1, 7, 5, 7], [7, 4, 4, 4, 4], [7, 5, 7, 5, 7], [7, 5, 7, 4, 7], [, , 2, , 2], [, , 2, , 2, 1], [4, 2, 1, 2, 4], [, 7, , 7], [1, 2, 4, 2, 1], [7, 4, 6, , 2], [2, 5, 5, 1, 6], [2, 5, 7, 5, 5], [3, 5, 3, 5, 3], [6, 1, 1, 1, 6], [3, 5, 5, 5, 3], [7, 1, 3, 1, 7], [7, 1, 3, 1, 1], [6, 1, 5, 5, 6], [5, 5, 7, 5, 5], [7, 2, 2, 2, 7], [4, 4, 4, 5, 2], [5, 5, 3, 5, 5], [1, 1, 1, 1, 7], [5, 7, 7, 5, 5], [7, 5, 5, 5, 5], [2, 5, 5, 5, 2], [7, 5, 7, 1, 1], [6, 5, 5, 3, 6], [3, 5, 3, 5, 5], [6, 1, 7, 4, 3], [7, 2, 2, 2, 2], [5, 5, 5, 5, 7], [5, 5, 5, 2, 2], [5, 5, 7, 7, 5], [5, 5, 2, 5, 5], [5, 5, 2, 2, 2], [7, 4, 2, 1, 7], [6, 2, 2, 2, 6], [1, 1, 2, 4, 4], [3, 2, 2, 2, 3], [2, 5], [, , , , 7], [1, 2], [, 6, 5, 5, 6], [1, 3, 5, 5, 3], [, 6, 1, 1, 6], [4, 6, 5, 5, 6], [, 2, 5, 3, 6], [4, 2, 7, 2, 2], [, 2, 5, 6, 4, 2], [1, 1, 3, 5, 5], [, 2, , 2, 2], [, 2, , 2, 2, 1], [1, 5, 3, 5, 5], [2, 2, 2, 2, 4], [, 5, 7, 5, 5], [, 3, 5, 5, 5], [, 2, 5, 5, 2], [, 3, 5, 5, 3, 1], [, 6, 5, 5, 6, 4], [, 2, 5, 1, 1], [, 6, 1, 4, 3], [2, 7, 2, 2, 4], [, 5, 5, 5, 6], [, 5, 5, 2, 2], [, 5, 5, 7, 5], [, 5, 2, 2, 5], [, 5, 5, 6, 4, 2], [, 7, 4, 1, 7], [6, 2, 1, 2, 6], [2, 2, 2, 2, 2], [3, 2, 4, 2, 3], [, 3, 6]], g = { id: "mini", chars: D, first: 33, w: 4, h: 6 }; |
2220 |
| - var y = plugin = (e, { cache: m = true } = {}) => { |
2221 |
| - let _ = e.text, A = e.textsize, E = e.textalign, z = e.textfont, C = w, T = g, c = m ? /* @__PURE__ */ new Map() : null, b = 300, a = 1, t = null, d = (x) => { |
2222 |
| - a = ~~Math.round(x); |
2223 |
| - }, F = () => console.warn("[litecanvas/plugin-pixel-font] textalign() has not yet been implemented for pixel fonts"), v = (x, o, r, s = 3) => { |
2224 |
| - let l = t.h || t.w; |
2225 |
| - for (let i = 0; i < l; i++) for (let n = 0; n < t.w; n++) (r[i] | 0) & 1 << n && e.rectfill(x + n * a, o + i * a, a, a, s); |
2226 |
| - }, I = (x, o, r, s = 3) => { |
2227 |
| - if (r += "", !a || !r.length) return; |
2228 |
| - let l = a * t.w, i = a * (t.h || t.w); |
2229 |
| - for (let n = 0; n < r.length; n++) { |
2230 |
| - let u = r[n], S = u.charCodeAt(), f = t.chars[S - t.first]; |
2231 |
| - if (f) if (m) { |
2232 |
| - let p = `${t.id}:${u}:${~~s}:${l}`; |
2233 |
| - c.has(p) || c.set(p, e.paint(l, i, () => { |
2234 |
| - v(0, 0, f, ~~s); |
| 2216 | + var F = [[24, 60, 60, 24, 24, , 24], [54, 54, , , , , ,], [54, 54, 127, 54, 127, 54, 54], [12, 62, 3, 30, 48, 31, 12], [, 99, 51, 24, 12, 102, 99], [28, 54, 28, 110, 59, 51, 110], [6, 6, 3, , , , ,], [24, 12, 6, 6, 6, 12, 24], [6, 12, 24, 24, 24, 12, 6], [, 102, 60, 255, 60, 102, ,], [, 12, 12, 63, 12, 12, ,], [, , , , , 12, 12, 6], [, , , 63, , , ,], [, , , , , 12, 12], [96, 48, 24, 12, 6, 3, 1], [62, 99, 115, 123, 111, 103, 62], [12, 14, 12, 12, 12, 12, 63], [30, 51, 48, 28, 6, 51, 63], [30, 51, 48, 28, 48, 51, 30], [56, 60, 54, 51, 127, 48, 120], [63, 3, 31, 48, 48, 51, 30], [28, 6, 3, 31, 51, 51, 30], [63, 51, 48, 24, 12, 12, 12], [30, 51, 51, 30, 51, 51, 30], [30, 51, 51, 62, 48, 24, 14], [, 12, 12, , , 12, 12], [, 12, 12, , , 12, 12, 6], [24, 12, 6, 3, 6, 12, 24], [, , 63, , , 63, ,], [6, 12, 24, 48, 24, 12, 6], [30, 51, 48, 24, 12, , 12], [62, 99, 123, 123, 123, 3, 30], [12, 30, 51, 51, 63, 51, 51], [63, 102, 102, 62, 102, 102, 63], [60, 102, 3, 3, 3, 102, 60], [31, 54, 102, 102, 102, 54, 31], [127, 70, 22, 30, 22, 70, 127], [127, 70, 22, 30, 22, 6, 15], [60, 102, 3, 3, 115, 102, 124], [51, 51, 51, 63, 51, 51, 51], [30, 12, 12, 12, 12, 12, 30], [120, 48, 48, 48, 51, 51, 30], [103, 102, 54, 30, 54, 102, 103], [15, 6, 6, 6, 70, 102, 127], [99, 119, 127, 127, 107, 99, 99], [99, 103, 111, 123, 115, 99, 99], [28, 54, 99, 99, 99, 54, 28], [63, 102, 102, 62, 6, 6, 15], [30, 51, 51, 51, 59, 30, 56], [63, 102, 102, 62, 54, 102, 103], [30, 51, 7, 14, 56, 51, 30], [63, 45, 12, 12, 12, 12, 30], [51, 51, 51, 51, 51, 51, 63], [51, 51, 51, 51, 51, 30, 12], [99, 99, 99, 107, 127, 119, 99], [99, 99, 54, 28, 28, 54, 99], [51, 51, 51, 30, 12, 12, 30], [127, 99, 49, 24, 76, 102, 127], [30, 6, 6, 6, 6, 6, 30], [3, 6, 12, 24, 48, 96, 64], [30, 24, 24, 24, 24, 24, 30], [8, 28, 54, 99, , , ,], [, , , , , , , 255], [12, 12, 24, , , , ,], [, , 30, 48, 62, 51, 110], [7, 6, 6, 62, 102, 102, 59], [, , 30, 51, 3, 51, 30], [56, 48, 48, 62, 51, 51, 110], [, , 30, 51, 63, 3, 30], [28, 54, 6, 15, 6, 6, 15], [, , 110, 51, 51, 62, 48, 31], [7, 6, 54, 110, 102, 102, 103], [12, , 14, 12, 12, 12, 30], [48, , 48, 48, 48, 51, 51, 30], [7, 6, 102, 54, 30, 54, 103], [14, 12, 12, 12, 12, 12, 30], [, , 51, 127, 127, 107, 99], [, , 31, 51, 51, 51, 51], [, , 30, 51, 51, 51, 30], [, , 59, 102, 102, 62, 6, 15], [, , 110, 51, 51, 62, 48, 120], [, , 59, 110, 102, 6, 15], [, , 62, 3, 30, 48, 31], [8, 12, 62, 12, 12, 44, 24], [, , 51, 51, 51, 51, 110], [, , 51, 51, 51, 30, 12], [, , 99, 107, 127, 127, 54], [, , 99, 54, 28, 54, 99], [, , 51, 51, 51, 62, 48, 31], [, , 63, 25, 12, 38, 63], [56, 12, 12, 7, 12, 12, 56], [24, 24, 24, , 24, 24, 24], [7, 12, 12, 56, 12, 12, 7], [110, 59, , , , , ,]], g = { id: "basic", chars: F, first: 33, w: 8, h: 8 }; |
| 2217 | + var I = [[2, 2, 2, , 2], [5, 5], [5, 7, 5, 7, 5], [6, 3, 6, 7, 2], [5, 4, 2, 1, 5], [6, 3, 6, 5, 6], [2, 2, , , ,], [2, 1, 1, 1, 2], [2, 4, 4, 4, 2], [5, 2, 5], [, 2, 7, 2], [, , , , 2, 1], [, , 7], [, , , , 1], [4, 4, 2, 1, 1], [7, 5, 5, 5, 7], [3, 2, 2, 2, 7], [7, 4, 7, 1, 7], [7, 4, 7, 4, 7], [5, 5, 7, 4, 4], [7, 1, 7, 4, 7], [7, 1, 7, 5, 7], [7, 4, 4, 4, 4], [7, 5, 7, 5, 7], [7, 5, 7, 4, 7], [, , 2, , 2], [, , 2, , 2, 1], [4, 2, 1, 2, 4], [, 7, , 7], [1, 2, 4, 2, 1], [7, 4, 6, , 2], [2, 5, 5, 1, 6], [2, 5, 7, 5, 5], [3, 5, 3, 5, 3], [6, 1, 1, 1, 6], [3, 5, 5, 5, 3], [7, 1, 3, 1, 7], [7, 1, 3, 1, 1], [6, 1, 5, 5, 6], [5, 5, 7, 5, 5], [7, 2, 2, 2, 7], [4, 4, 4, 5, 2], [5, 5, 3, 5, 5], [1, 1, 1, 1, 7], [5, 7, 7, 5, 5], [7, 5, 5, 5, 5], [2, 5, 5, 5, 2], [7, 5, 7, 1, 1], [6, 5, 5, 3, 6], [3, 5, 3, 5, 5], [6, 1, 7, 4, 3], [7, 2, 2, 2, 2], [5, 5, 5, 5, 7], [5, 5, 5, 2, 2], [5, 5, 7, 7, 5], [5, 5, 2, 5, 5], [5, 5, 2, 2, 2], [7, 4, 2, 1, 7], [6, 2, 2, 2, 6], [1, 1, 2, 4, 4], [3, 2, 2, 2, 3], [2, 5], [, , , , 7], [1, 2], [, 6, 5, 5, 6], [1, 3, 5, 5, 3], [, 6, 1, 1, 6], [4, 6, 5, 5, 6], [, 2, 5, 3, 6], [4, 2, 7, 2, 2], [, 2, 5, 6, 4, 2], [1, 1, 3, 5, 5], [, 2, , 2, 2], [, 2, , 2, 2, 1], [1, 5, 3, 5, 5], [2, 2, 2, 2, 4], [, 5, 7, 5, 5], [, 3, 5, 5, 5], [, 2, 5, 5, 2], [, 3, 5, 5, 3, 1], [, 6, 5, 5, 6, 4], [, 2, 5, 1, 1], [, 6, 1, 4, 3], [2, 7, 2, 2, 4], [, 5, 5, 5, 6], [, 5, 5, 2, 2], [, 5, 5, 7, 5], [, 5, 2, 2, 5], [, 5, 5, 6, 4, 2], [, 7, 4, 1, 7], [6, 2, 1, 2, 6], [2, 2, 2, 2, 2], [3, 2, 4, 2, 3], [, 3, 6]], y = { id: "mini", chars: I, first: 33, w: 4, h: 6 }; |
| 2218 | + var N = plugin = (e, { cache: u = true } = {}) => { |
| 2219 | + let w = e.text, _ = e.textsize, k = e.textalign, z = e.textfont, A = g, E = y, l = u ? /* @__PURE__ */ new Map() : null, C = 300, s = 1, a = null, f = (t) => { |
| 2220 | + s = ~~Math.round(t); |
| 2221 | + }, T = () => console.warn("[litecanvas/plugin-pixel-font] textalign() has not yet been implemented for pixel fonts"), d = (t, c, r, n = 3) => { |
| 2222 | + let i = a.h || a.w; |
| 2223 | + for (let o = 0; o < i; o++) for (let x = 0; x < a.w; x++) (r[o] | 0) & 1 << x && e.rectfill(t + x * s, c + o * s, s, s, n); |
| 2224 | + }, S = (t, c, r, n = 3) => { |
| 2225 | + if (r += "", !s || !r.length) return; |
| 2226 | + let i = s * a.w, o = s * (a.h || a.w); |
| 2227 | + for (let x = 0; x < r.length; x++) { |
| 2228 | + let m = r[x], v = m.charCodeAt(), p = a.chars[v - a.first]; |
| 2229 | + if (p) if (u) { |
| 2230 | + let b = `${a.id}:${m}:${~~n}:${i}`; |
| 2231 | + l.has(b) || l.set(b, e.paint(i, o, () => { |
| 2232 | + d(0, 0, p, ~~n); |
2235 | 2233 | }));
|
2236 |
| - let h = c.get(p); |
2237 |
| - h._ = e.T + b, e.image(x, o, h); |
2238 |
| - } else v(x, o, f, s); |
2239 |
| - x += l; |
| 2234 | + let h = l.get(b); |
| 2235 | + h._ = e.T + C, e.image(t, c, h); |
| 2236 | + } else d(t, c, p, n); |
| 2237 | + t += i; |
2240 | 2238 | }
|
2241 | 2239 | };
|
2242 |
| - if (m) { |
2243 |
| - let x = setInterval(() => { |
2244 |
| - let o = performance.now(); |
2245 |
| - for (let [r, s] of c) e.T > s._ && c.delete(r); |
2246 |
| - }, 1e3 * (b / 5)); |
| 2240 | + if (u) { |
| 2241 | + let c = setInterval(() => { |
| 2242 | + let r = performance.now(); |
| 2243 | + for (let [n, i] of l) e.T > i._ && l.delete(n); |
| 2244 | + }, 6e4); |
2247 | 2245 | e.listen("quit", () => {
|
2248 |
| - clearInterval(x), c.clear(); |
| 2246 | + clearInterval(c), l.clear(); |
2249 | 2247 | });
|
2250 | 2248 | }
|
2251 |
| - return { PIXEL_FONT_BASIC: C, PIXEL_FONT_MINI: T, textfont: (x) => { |
2252 |
| - typeof x == "object" ? (e.def("text", I), e.def("textsize", d), e.def("textalign", F), t = x, d(a || 1)) : (e.def("text", _), e.def("textsize", A), e.def("textalign", E), z(x)); |
| 2249 | + return { PIXEL_FONT_BASIC: A, PIXEL_FONT_MINI: E, textfont: (t) => { |
| 2250 | + typeof t == "object" ? (e.def("text", S), e.def("textsize", f), e.def("textalign", T), a = t, f(s || 1)) : (e.def("text", w), e.def("textsize", _), e.def("textalign", k), z(t)); |
2253 | 2251 | } };
|
2254 | 2252 | };
|
2255 |
| - window.pluginPixelFont = y; |
| 2253 | + window.pluginPixelFont = N; |
2256 | 2254 | })();
|
2257 | 2255 | })();
|
2258 | 2256 | /*! @litecanvas/utils by Luiz Bills | MIT Licensed */
|
|
0 commit comments