diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index eeebc21d95..e644a9297e 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -6,7 +6,7 @@ on:
branches: [main]
env:
- node-version: "16"
+ node-version: "18"
path: "KoLmafia"
jobs:
diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml
index 22294acc89..2b48486430 100644
--- a/.github/workflows/publish.yml
+++ b/.github/workflows/publish.yml
@@ -9,7 +9,7 @@ jobs:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
with:
- node-version: "16.x"
+ node-version: "18.x"
registry-url: "https://registry.npmjs.org"
- run: yarn
- run: yarn publish
diff --git a/__tests__/Kmail.ts b/__tests__/Kmail.ts
new file mode 100644
index 0000000000..25cd4ce99a
--- /dev/null
+++ b/__tests__/Kmail.ts
@@ -0,0 +1,198 @@
+import { isGiftable, Item, visitUrl } from "kolmafia";
+import { $item, Kmail } from "../src";
+
+import mocked = jest.mocked;
+
+jest.mock("kolmafia");
+
+const USER = 11;
+
+const mockItem1 = $item`Jumbo Dr. Lucifer`;
+const mockItem2 = $item`worthless trinket`;
+
+beforeEach(() => {
+ jest.clearAllMocks();
+});
+
+describe(Kmail.send, () => {
+ beforeEach(() => {
+ mocked(visitUrl).mockReturnValue(`
Message sent.
`);
+ mocked(isGiftable).mockReturnValue(true);
+ });
+
+ it("should send a kmail with a message", () => {
+ Kmail.send(USER, "Hello, world!");
+
+ expect(visitUrl).toHaveBeenCalledWith(
+ "sendmessage.php?action=send&pwd&towho=11&message=Hello%2C%20world!&sendmeat=0",
+ true,
+ true
+ );
+ });
+
+ it("should send a kmail with a message and meat", () => {
+ Kmail.send(USER, "Hello, world!", [], 100);
+
+ expect(visitUrl).toHaveBeenCalledWith(
+ "sendmessage.php?action=send&pwd&towho=11&message=Hello%2C%20world!&sendmeat=100",
+ true,
+ true
+ );
+ });
+
+ it("should send a kmail with a message and items", () => {
+ Kmail.send(USER, "Hello, world!", [mockItem1]);
+
+ expect(visitUrl).toHaveBeenCalledWith(
+ `sendmessage.php?action=send&pwd&towho=11&message=Hello%2C%20world!&sendmeat=0&whichitem1=${mockItem1.id}&howmany1=1`,
+ true,
+ true
+ );
+ });
+
+ it("should send a kmail with a message, items, and meat", () => {
+ Kmail.send(
+ USER,
+ "Hello, world!",
+ new Map([
+ [mockItem1, 11],
+ [mockItem2, 42],
+ ]),
+ 100
+ );
+
+ expect(visitUrl).toHaveBeenCalledWith(
+ `sendmessage.php?action=send&pwd&towho=11&message=Hello%2C%20world!&sendmeat=100&whichitem1=${mockItem1.id}&howmany1=11&whichitem2=${mockItem2.id}&howmany2=42`,
+ true,
+ true
+ );
+ });
+
+ it("should send at most 11 items per chunk", () => {
+ const mockItems = Array(15)
+ .fill(undefined)
+ .map((_, i) => Item.get(`mock item ${i}`));
+
+ Kmail.send(USER, "Hello, world!", mockItems, 100);
+
+ expect(visitUrl).toHaveBeenCalledTimes(2);
+ expect(visitUrl).toHaveBeenNthCalledWith(
+ 1,
+ `sendmessage.php?action=send&pwd&towho=11&message=Hello%2C%20world!&sendmeat=100&whichitem1=${mockItems[0].id}&howmany1=1&whichitem2=${mockItems[1].id}&howmany2=1&whichitem3=${mockItems[2].id}&howmany3=1&whichitem4=${mockItems[3].id}&howmany4=1&whichitem5=${mockItems[4].id}&howmany5=1&whichitem6=${mockItems[5].id}&howmany6=1&whichitem7=${mockItems[6].id}&howmany7=1&whichitem8=${mockItems[7].id}&howmany8=1&whichitem9=${mockItems[8].id}&howmany9=1&whichitem10=${mockItems[9].id}&howmany10=1&whichitem11=${mockItems[10].id}&howmany11=1`,
+ true,
+ true
+ );
+ expect(visitUrl).toHaveBeenNthCalledWith(
+ 2,
+ `sendmessage.php?action=send&pwd&towho=11&message=Hello%2C%20world!&sendmeat=0&whichitem1=${mockItems[11].id}&howmany1=1&whichitem2=${mockItems[12].id}&howmany2=1&whichitem3=${mockItems[13].id}&howmany3=1&whichitem4=${mockItems[14].id}&howmany4=1`,
+ true,
+ true
+ );
+ });
+
+ it.todo(
+ "should send a kmail with a message, items, and meat, and skip ungiftable items"
+ );
+
+ it.todo(
+ "should fallback to sending a gift if the user cannot receive meat or items"
+ );
+
+ it("should properly encode ampersand characters", () => {
+ Kmail.send(USER, "Hi there, give me all your money!&sendmeat=10000000000");
+
+ expect(visitUrl).toHaveBeenCalledWith(
+ "sendmessage.php?action=send&pwd&towho=11&message=Hi%20there%2C%20give%20me%20all%20your%20money!%26sendmeat%3D10000000000&sendmeat=0",
+ true,
+ true
+ );
+ });
+});
+
+describe(Kmail.gift, () => {
+ it("should send a gift with a message", () => {
+ Kmail.gift(USER, "Hello, world!");
+
+ expect(visitUrl).toHaveBeenCalledWith(
+ "town_sendgift.php?action=Yep.&pwd&fromwhere=0¬e=Hello%2C%20world!&insidenote=&towho=11&whichpackage=0&sendmeat=0",
+ true,
+ true
+ );
+ });
+
+ it("should send a gift with a message and an inside note", () => {
+ Kmail.gift(
+ USER,
+ "Hello, world!",
+ undefined,
+ undefined,
+ "This is not even funny."
+ );
+
+ expect(visitUrl).toHaveBeenCalledWith(
+ "town_sendgift.php?action=Yep.&pwd&fromwhere=0¬e=Hello%2C%20world!&insidenote=This%20is%20not%20even%20funny.&towho=11&whichpackage=0&sendmeat=0",
+ true,
+ true
+ );
+ });
+
+ it("should send a gift with a message and meat", () => {
+ Kmail.gift(USER, "Hello, world!", [], 100);
+
+ expect(visitUrl).toHaveBeenCalledWith(
+ "town_sendgift.php?action=Yep.&pwd&fromwhere=0¬e=Hello%2C%20world!&insidenote=&towho=11&whichpackage=0&sendmeat=100",
+ true,
+ true
+ );
+ });
+
+ it("should send a gift with a message and one item", () => {
+ Kmail.gift(USER, "Hello, world!", [mockItem1]);
+
+ expect(visitUrl).toHaveBeenCalledWith(
+ `town_sendgift.php?action=Yep.&pwd&fromwhere=0¬e=Hello%2C%20world!&insidenote=&towho=11&whichpackage=1&sendmeat=0&whichitem1=${mockItem1.id}&howmany1=1`,
+ true,
+ true
+ );
+ });
+
+ it("should send a gift with a message and multiple items", () => {
+ Kmail.gift(
+ USER,
+ "Hello, world!",
+ new Map([
+ [mockItem1, 11],
+ [mockItem2, 42],
+ ]),
+ 100
+ );
+
+ expect(visitUrl).toHaveBeenCalledWith(
+ `town_sendgift.php?action=Yep.&pwd&fromwhere=0¬e=Hello%2C%20world!&insidenote=&towho=11&whichpackage=2&sendmeat=100&whichitem1=${mockItem1.id}&howmany1=11&whichitem2=${mockItem2.id}&howmany2=42`,
+ true,
+ true
+ );
+ });
+
+ it("should send at most 3 items per chunk", () => {
+ const mockItems = Array(5)
+ .fill(undefined)
+ .map((_, i) => Item.get(`mock item ${i}`));
+
+ Kmail.gift(USER, "Hello, world!", mockItems, 100);
+
+ expect(visitUrl).toHaveBeenCalledTimes(2);
+ expect(visitUrl).toHaveBeenNthCalledWith(
+ 1,
+ `town_sendgift.php?action=Yep.&pwd&fromwhere=0¬e=Hello%2C%20world!&insidenote=&towho=11&whichpackage=3&sendmeat=100&whichitem1=${mockItems[0].id}&howmany1=1&whichitem2=${mockItems[1].id}&howmany2=1&whichitem3=${mockItems[2].id}&howmany3=1`,
+ true,
+ true
+ );
+ expect(visitUrl).toHaveBeenNthCalledWith(
+ 2,
+ `town_sendgift.php?action=Yep.&pwd&fromwhere=0¬e=Hello%2C%20world!&insidenote=&towho=11&whichpackage=2&sendmeat=0&whichitem1=${mockItems[3].id}&howmany1=1&whichitem2=${mockItems[4].id}&howmany2=1`,
+ true,
+ true
+ );
+ });
+});
diff --git a/__tests__/__mocks__/kolmafia.ts b/__tests__/__mocks__/kolmafia.ts
new file mode 100644
index 0000000000..cd60d4b077
--- /dev/null
+++ b/__tests__/__mocks__/kolmafia.ts
@@ -0,0 +1,173 @@
+function mockOneOrMany<
+ Ctor extends new (name: string) => T,
+ T extends MafiaClass
+>(
+ ctor: Ctor,
+ n: number | string | (number | string)[],
+ knownInstances: T[]
+): T | T[] {
+ function mockOne(name: number | string): T {
+ // to make mocking easier, we'll just tread ids as names
+ if (typeof name === "number") {
+ name = name.toString();
+ }
+ const existingInstance = knownInstances.find((i) => i.name === name);
+ if (existingInstance) {
+ return existingInstance;
+ }
+ const instance = new ctor(name);
+ knownInstances.push(instance);
+ return instance;
+ }
+
+ if (Array.isArray(n)) {
+ return n.map((name) => mockOne(name));
+ }
+ return mockOne(n);
+}
+
+abstract class MafiaClass {
+ constructor(readonly name: string) {}
+}
+
+export class Bounty extends MafiaClass {
+ private static knownInstances: Bounty[] = [];
+ static get = jest.fn((n) => mockOneOrMany(Bounty, n, Bounty.knownInstances));
+ static all = jest.fn(() => Bounty.knownInstances);
+ static none = {};
+}
+export class Class extends MafiaClass {
+ private static knownInstances: Class[] = [];
+ static get = jest.fn((n) => mockOneOrMany(Class, n, Class.knownInstances));
+ static all = jest.fn(() => Class.knownInstances);
+ static none = {};
+}
+export class Coinmaster extends MafiaClass {
+ private static knownInstances: Coinmaster[] = [];
+ static get = jest.fn((n) =>
+ mockOneOrMany(Coinmaster, n, Coinmaster.knownInstances)
+ );
+ static all = jest.fn(() => Coinmaster.knownInstances);
+ static none = {};
+}
+export class Effect extends MafiaClass {
+ private static knownInstances: Effect[] = [];
+ static get = jest.fn((n) => mockOneOrMany(Effect, n, Effect.knownInstances));
+ static all = jest.fn(() => Effect.knownInstances);
+ static none = {};
+}
+export class Element extends MafiaClass {
+ private static knownInstances: Element[] = [];
+ static get = jest.fn((n) =>
+ mockOneOrMany(Element, n, Element.knownInstances)
+ );
+ static all = jest.fn(() => Element.knownInstances);
+ static none = {};
+}
+export class Familiar extends MafiaClass {
+ private static knownInstances: Familiar[] = [];
+ static get = jest.fn((n) =>
+ mockOneOrMany(Familiar, n, Familiar.knownInstances)
+ );
+ static all = jest.fn(() => Familiar.knownInstances);
+ static none = {};
+}
+export class Item extends MafiaClass {
+ private static knownInstances: Item[] = [];
+ private static mockId = 11;
+ static get = jest.fn((n) => mockOneOrMany(Item, n, Item.knownInstances));
+ static all = jest.fn(() => Item.knownInstances);
+ static none = new Item("", -1, "");
+
+ constructor(
+ readonly name: string,
+ readonly id: number = ++Item.mockId,
+ readonly plural: string = `Multiple ${name}`
+ ) {
+ super(name);
+ }
+}
+
+export class Location extends MafiaClass {
+ private static knownInstances: Location[] = [];
+ static get = jest.fn((n) =>
+ mockOneOrMany(Location, n, Location.knownInstances)
+ );
+ static all = jest.fn(() => Location.knownInstances);
+ static none = {};
+}
+export class Modifier extends MafiaClass {
+ private static knownInstances: Modifier[] = [];
+ static get = jest.fn((n) =>
+ mockOneOrMany(Modifier, n, Modifier.knownInstances)
+ );
+ static all = jest.fn(() => Modifier.knownInstances);
+ static none = {};
+}
+export class Monster extends MafiaClass {
+ private static knownInstances: Monster[] = [];
+ static get = jest.fn((n) =>
+ mockOneOrMany(Monster, n, Monster.knownInstances)
+ );
+ static all = jest.fn(() => Monster.knownInstances);
+ static none = {};
+}
+export class Path extends MafiaClass {
+ private static knownInstances: Path[] = [];
+ static get = jest.fn((n) => mockOneOrMany(Path, n, Path.knownInstances));
+ static all = jest.fn(() => Path.knownInstances);
+ static none = {};
+}
+export class Phylum extends MafiaClass {
+ private static knownInstances: Phylum[] = [];
+ static get = jest.fn((n) => mockOneOrMany(Phylum, n, Phylum.knownInstances));
+ static all = jest.fn(() => Phylum.knownInstances);
+ static none = {};
+}
+export class Servant extends MafiaClass {
+ private static knownInstances: Servant[] = [];
+ static get = jest.fn((n) =>
+ mockOneOrMany(Servant, n, Servant.knownInstances)
+ );
+ static all = jest.fn(() => Servant.knownInstances);
+ static none = {};
+}
+export class Skill extends MafiaClass {
+ private static knownInstances: Skill[] = [];
+ static get = jest.fn((n) => mockOneOrMany(Skill, n, Skill.knownInstances));
+ static all = jest.fn(() => Skill.knownInstances);
+ static none = {};
+}
+export class Slot extends MafiaClass {
+ private static knownInstances: Slot[] = [];
+ static get = jest.fn((n) => mockOneOrMany(Slot, n, Slot.knownInstances));
+ static all = jest.fn(() => Slot.knownInstances);
+ static none = {};
+}
+export class Stat extends MafiaClass {
+ private static knownInstances: Stat[] = [];
+ static get = jest.fn((n) => mockOneOrMany(Stat, n, Stat.knownInstances));
+ static all = jest.fn(() => Stat.knownInstances);
+ static none = {};
+}
+export class Thrall extends MafiaClass {
+ private static knownInstances: Thrall[] = [];
+ static get = jest.fn((n) => mockOneOrMany(Thrall, n, Thrall.knownInstances));
+ static all = jest.fn(() => Thrall.knownInstances);
+ static none = {};
+}
+export class Vykea extends MafiaClass {
+ private static knownInstances: Vykea[] = [];
+ static get = jest.fn((n) => mockOneOrMany(Vykea, n, Vykea.knownInstances));
+ static all = jest.fn(() => Vykea.knownInstances);
+ static none = {};
+}
+
+export const getProperty = jest.fn();
+
+export const isGiftable = jest.fn();
+
+export const print = jest.fn((msg) => console.log(`[kolmafia.print] ${msg}`));
+
+export const toItem = jest.fn((name) => Item.get(name));
+export const visitUrl = jest.fn();
diff --git a/__tests__/url.ts b/__tests__/url.ts
new file mode 100644
index 0000000000..7ac82aa116
--- /dev/null
+++ b/__tests__/url.ts
@@ -0,0 +1,191 @@
+import { visitUrl } from "kolmafia";
+
+import { buildUrl, combineQuery, EMPTY_VALUE, fetchUrl } from "../src/url";
+
+jest.mock(
+ "kolmafia",
+ () => ({
+ visitUrl: jest.fn(),
+ }),
+ { virtual: true }
+);
+
+describe(buildUrl, () => {
+ it.each([
+ "test.php",
+ "test.php?foo=bar",
+ "test.php?foo=bar&baz=qux",
+ "https://www.google.com/",
+ ])("should not modify a given path if there is no query", (path) => {
+ expect(buildUrl(path)).toEqual(path);
+ });
+
+ it.each([
+ ["test.php", { foo: "bar" }, "test.php?foo=bar"],
+ ["test.php", { foo: "bar", baz: "qux" }, "test.php?foo=bar&baz=qux"],
+ ["test.php?foo=bar", { baz: "qux" }, "test.php?foo=bar&baz=qux"],
+ [
+ "test.php",
+ { message: "Send me hugs & kisses", foo: "bar=baz" },
+ "test.php?message=Send%20me%20hugs%20%26%20kisses&foo=bar%3Dbaz",
+ ],
+ [
+ "test.php?foo=bar%3Dbaz",
+ { message: "Send me hugs & kisses" },
+ "test.php?foo=bar%3Dbaz&message=Send%20me%20hugs%20%26%20kisses",
+ ],
+ ])(
+ "should append query (as object) to the given path",
+ (path, query, expected) => {
+ expect(buildUrl(path, query)).toEqual(expected);
+ }
+ );
+
+ it.each([
+ ["test.php", [["foo", "bar"]], "test.php?foo=bar"],
+ [
+ "test.php",
+ [
+ ["foo", "bar"],
+ ["baz", "qux"],
+ ],
+ "test.php?foo=bar&baz=qux",
+ ],
+ ["test.php?foo=bar", [["baz", "qux"]], "test.php?foo=bar&baz=qux"],
+ [
+ "test.php",
+ [
+ ["message", "Send me hugs & kisses"],
+ ["foo", "bar=baz"],
+ ],
+ "test.php?message=Send%20me%20hugs%20%26%20kisses&foo=bar%3Dbaz",
+ ],
+ [
+ "test.php?foo=bar%3Dbaz",
+ [["message", "Send me hugs & kisses"]],
+ "test.php?foo=bar%3Dbaz&message=Send%20me%20hugs%20%26%20kisses",
+ ],
+ ] as const)(
+ "should append query (as array) to the given path",
+ (path, query, expected) => {
+ expect(buildUrl(path, query)).toEqual(expected);
+ }
+ );
+
+ it.each([
+ ["test.php?foo=bar", { foo: "baz" }, "test.php?foo=bar&foo=baz"],
+ [
+ "test.php?foo=bar%3Dbaz",
+ { foo: "bar&baz" },
+ "test.php?foo=bar%3Dbaz&foo=bar%26baz",
+ ],
+ ])(
+ "should append a parameter even if it already exists",
+ (path, query, expected) => {
+ expect(buildUrl(path, query)).toEqual(expected);
+ }
+ );
+
+ it.each([
+ [
+ "test.php",
+ { foo: 42, bar: true, baz: EMPTY_VALUE },
+ "test.php?foo=42&bar=true&baz",
+ ],
+ [
+ "test.php",
+ [
+ ["foo", true],
+ ["bar", EMPTY_VALUE],
+ ["baz", 11],
+ ],
+ "test.php?foo=true&bar&baz=11",
+ ],
+ ] as const)(
+ "should correctly encode non-string types",
+ (path, query, expected) => {
+ expect(buildUrl(path, query)).toEqual(expected);
+ }
+ );
+
+ it.each([
+ [["foo", "bar", "baz"]],
+ [[["foo", "bar"], ["baz"], ["quux", "quuz"]]],
+ [
+ [
+ ["foo", "bar"],
+ ["baz", "qux", "quux"],
+ ],
+ ],
+ ])("should fail if a query parameter is not a pair", (query) => {
+ expect(() => buildUrl("test.php", query as any)).toThrow(
+ "may only contain pair"
+ );
+ });
+});
+
+describe(fetchUrl, () => {
+ it("should call visitUrl with post=false and encoded=true", () => {
+ fetchUrl("test.php", { foo: "bar&baz" });
+
+ expect(visitUrl).toHaveBeenCalledWith("test.php?foo=bar%26baz", true, true);
+ });
+
+ it("should call visitUrl with post=false if requested", () => {
+ fetchUrl("test.php", { foo: "bar&baz" }, { method: "GET" });
+
+ expect(visitUrl).toHaveBeenCalledWith(
+ "test.php?foo=bar%26baz",
+ false,
+ true
+ );
+ });
+});
+
+describe(combineQuery, () => {
+ it("should return an empty query array if no queries are given", () => {
+ expect(combineQuery()).toEqual([]);
+ });
+
+ it("should return the given query if only one query is given", () => {
+ expect(combineQuery({ foo: "bar" })).toEqual({ foo: "bar" });
+ });
+
+ it("should combine multiple object queries into one", () => {
+ expect(combineQuery({ foo: "bar" }, { baz: "qux" })).toEqual([
+ ["foo", "bar"],
+ ["baz", "qux"],
+ ]);
+ });
+
+ it("should combine multiple array queries into one", () => {
+ expect(combineQuery([["foo", "bar"]], [["baz", "qux"]])).toEqual([
+ ["foo", "bar"],
+ ["baz", "qux"],
+ ]);
+ });
+
+ it("should combine an object and an array into one", () => {
+ expect(combineQuery({ foo: "bar" }, [["baz", "qux"]])).toEqual([
+ ["foo", "bar"],
+ ["baz", "qux"],
+ ]);
+ });
+
+ it("should combine an array and an object into one", () => {
+ expect(combineQuery([["foo", "bar"]], { baz: "qux" })).toEqual([
+ ["foo", "bar"],
+ ["baz", "qux"],
+ ]);
+ });
+
+ it("should combine more than two queries", () => {
+ expect(
+ combineQuery({ foo: "bar" }, [["baz", "qux"]], { quux: "quuz" })
+ ).toEqual([
+ ["foo", "bar"],
+ ["baz", "qux"],
+ ["quux", "quuz"],
+ ]);
+ });
+});
diff --git a/package.json b/package.json
index 6555ff5e37..4021a80c4b 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "libram",
- "version": "0.8.15",
+ "version": "0.8.24",
"description": "JavaScript helper library for KoLmafia",
"module": "dist/index.js",
"types": "dist/index.d.ts",
@@ -43,17 +43,17 @@
"@typescript-eslint/parser": "^5.5.0",
"esbuild": "^0.17.0",
"esbuild-plugin-babel": "^0.2.3",
- "eslint": "^7.16.0",
+ "eslint": "^8.56.0",
"eslint-config-prettier": "^8.3.0",
"eslint-import-resolver-typescript": "^2.5.0",
"eslint-plugin-import": "^2.25.4",
"eslint-plugin-jest": "^25.2.3",
"eslint-plugin-jsdoc": "^46.5.0",
- "eslint-plugin-libram": "^0.2.33",
+ "eslint-plugin-libram": "^0.4.2",
"husky": "^4.3.6",
"java-parser": "^1.4.0",
"jest": "^27.1.0",
- "kolmafia": "^5.27647.0",
+ "kolmafia": "^5.27668.0",
"lint-staged": ">=10",
"node-fetch": "^2.6.1",
"prettier": "^2.1.2",
@@ -63,7 +63,7 @@
"typescript": "^4.5.2"
},
"peerDependencies": {
- "kolmafia": "^5.26781.0"
+ "kolmafia": "^5.27668.0"
},
"husky": {
"hooks": {
diff --git a/src/Kmail.ts b/src/Kmail.ts
index 724e49386b..ded00112de 100644
--- a/src/Kmail.ts
+++ b/src/Kmail.ts
@@ -5,6 +5,7 @@ import {
Item,
visitUrl,
} from "kolmafia";
+import { combineQuery, EMPTY_VALUE, fetchUrl, Query } from "./url";
import { arrayToCountedMap, chunk } from "./utils";
type RawKmail = {
@@ -56,11 +57,12 @@ export default class Kmail {
* @returns Number of kmails deleted
*/
static delete(kmails: Kmail[]): number {
- const results = visitUrl(
- `messages.php?the_action=delete&box=Inbox&pwd&${kmails
- .map((k) => `sel${k.id}=on`)
- .join("&")}`
- );
+ const results = fetchUrl("messages.php", [
+ ["the_action", "delete"],
+ ["box", "Inbox"],
+ ["pwd", EMPTY_VALUE],
+ ...kmails.map((k) => [`sel${k.id}`, "on"] as const),
+ ]);
return Number(results.match(/(\d) messages? deleted.<\/td>/)?.[1] ?? 0);
}
@@ -71,11 +73,10 @@ export default class Kmail {
items: Map- | Item[],
meat: number,
chunkSize: number,
- constructUrl: (
- meat: number,
- itemsQuery: string,
- chunkSize: number
- ) => string,
+ constructUrl: (args: { meat: number; chunkSize: number }) => {
+ path: string;
+ query: Query;
+ },
successString: string
) {
let m = meat;
@@ -90,19 +91,20 @@ export default class Kmail {
// Split the items to be sent into chunks of max 11 item types
for (const c of chunks.length > 0 ? chunks : [null]) {
- const itemsQuery =
- c === null
- ? []
- : c.map(
- ([item, quantity], index) =>
- `whichitem${index + 1}=${item.id}&howmany${
- index + 1
- }=${quantity}`
- );
+ const itemsQuery: Query = {};
+ if (c !== null) {
+ c.forEach(([item, quantity], i) => {
+ itemsQuery[`whichitem${i + 1}`] = item.id;
+ itemsQuery[`howmany${i + 1}`] = quantity;
+ });
+ }
+
+ const { path, query } = constructUrl({
+ meat: m,
+ chunkSize: c?.length ?? 0,
+ });
- const r = visitUrl(
- constructUrl(m, itemsQuery.join("&"), itemsQuery.length)
- );
+ const r = fetchUrl(path, combineQuery(query, itemsQuery));
if (r.includes("That player cannot receive Meat or items")) {
return Kmail.gift(to, message, items, meat);
@@ -142,10 +144,16 @@ export default class Kmail {
items,
meat,
11,
- (meat, itemsQuery) =>
- `sendmessage.php?action=send&pwd&towho=${to}&message=${message}${
- itemsQuery ? `&${itemsQuery}` : ""
- }&sendmeat=${meat}`,
+ ({ meat }) => ({
+ path: "sendmessage.php",
+ query: {
+ action: "send",
+ pwd: EMPTY_VALUE,
+ towho: to,
+ message,
+ sendmeat: meat,
+ },
+ }),
">Message sent."
);
}
@@ -170,17 +178,25 @@ export default class Kmail {
meat = 0,
insideNote = ""
): boolean {
- const baseUrl = `town_sendgift.php?action=Yep.&pwd&fromwhere=0¬e=${message}&insidenote=${insideNote}&towho=${to}`;
return Kmail._genericSend(
to,
message,
items,
meat,
3,
- (m, itemsQuery, chunkSize) =>
- `${baseUrl}&whichpackage=${chunkSize}${
- itemsQuery ? `&${itemsQuery}` : ""
- }&sendmeat=${m}`,
+ ({ meat, chunkSize }) => ({
+ path: `town_sendgift.php`,
+ query: {
+ action: "Yep.",
+ pwd: EMPTY_VALUE,
+ fromwhere: 0,
+ note: message,
+ insidenote: insideNote,
+ towho: to,
+ whichpackage: chunkSize,
+ sendmeat: meat,
+ },
+ }),
">Package sent."
);
}
diff --git a/src/Path.ts b/src/Path.ts
deleted file mode 100644
index c7e7ecb440..0000000000
--- a/src/Path.ts
+++ /dev/null
@@ -1,228 +0,0 @@
-import { Class } from "kolmafia";
-import { $classes } from "./template-string";
-
-export class Path {
- name: string;
- id: number;
- hasAllPerms: boolean; //here, we define avatar-ness around being its own class
- canUseSkillbooks: boolean;
- hasCampground: boolean;
- hasTerrarium: boolean;
- stomachSize: number;
- liverSize: number; //Defined as the lowest inebriety that makes you unable to drink more, just to make it fifteens across the board
- spleenSize: number;
- classes: Class[];
-
- /**
- *
- * @param name Name of path
- * @param id Path ID
- * @param hasAllPerms Does the player have immediate access to all permed skills>
- * @param canUseSkillbooks Does the player have ability to learn skills from skillbooks>
- * @param hasCampground Does the player have access to the campground?
- * @param hasTerrarium Does the player have access to terrarium.php
- * @param stomachSize Maximum fullness achievable at turn 0
- * @param liverSize The lowest inebriety that makes you unable to drink more
- * @param spleenSize Maximum spleen achievable at turn 0
- * @param classes Classes available in this path
- */
- constructor(
- name: string,
- id: number,
- hasAllPerms = true,
- canUseSkillbooks = true,
- hasCampground = true,
- hasTerrarium = true,
- stomachSize = 15,
- liverSize = 15,
- spleenSize = 15,
- classes = $classes`Seal Clubber, Turtle Tamer, Sauceror, Pastamancer, Disco Bandit, Accordion Thief`
- ) {
- this.name = name;
- this.id = id;
- this.hasAllPerms = hasAllPerms;
- this.canUseSkillbooks = canUseSkillbooks;
- this.hasCampground = hasCampground;
- this.hasTerrarium = hasTerrarium;
- this.stomachSize = stomachSize;
- this.liverSize = liverSize;
- this.spleenSize = spleenSize;
- this.classes = classes;
- }
-}
-
-export const Paths = {
- Unrestricted: new Path("Unrestricted", 0),
- Boozetafarian: new Path("Boozetafarian", 1, true, true, true, true, 0),
- Teetotaler: new Path("Teetotaler", 2, true, true, true, true, 15, 0),
- Oxygenarian: new Path("Oxygenarian", 3, true, true, true, true, 0, 0),
- BeesHateYou: new Path("Bees Hate You", 4),
- WayOfTheSurprisingFist: new Path("Way of the Surprising Fist", 6),
- Trendy: new Path("Trendy", 7),
- AvatarOfBoris: new Path(
- "Avatar of Boris",
- 8,
- false,
- false,
- true,
- false,
- 20,
- 5,
- 15,
- $classes`Avatar of Boris`
- ),
- BugbearInvasion: new Path("Bugbear Invasion", 9),
- ZombieSlayer: new Path(
- "Zombie Slayer",
- 10,
- false,
- false,
- true,
- true,
- 15,
- 5,
- 15,
- $classes`Zombie Master`
- ),
- ClassAct: new Path("Class Act", 11, false, false),
- AvatarofJarlsberg: new Path(
- "Avatar of Jarlsberg",
- 12,
- false,
- false,
- true,
- false,
- 10,
- 10,
- 15,
- $classes`Avatar of Jarlsberg`
- ),
- Big: new Path("BIG!", 14),
- KolHs: new Path("KOLHS", 15),
- ClassAct2: new Path("Class Act II: A Class For Pigs", 16, false),
- AvatarofSneakyPete: new Path(
- "Avatar of Sneaky Pete",
- 17,
- false,
- false,
- true,
- false,
- 5,
- 20,
- 15,
- $classes`Avatar of Sneaky Pete`
- ),
- SlowAndSteady: new Path("Slow and Steady", 18),
- HeavyRains: new Path("Heavy Rains", 19),
- Picky: new Path("Picky", 21, false, false),
- Standard: new Path("Standard", 22),
- ActuallyEdTheUndying: new Path(
- "Actually Ed the Undying",
- 23,
- false,
- false,
- false,
- false,
- 0,
- 0,
- 5,
- $classes`Ed the Undying`
- ),
- OneCrazyRandomSummer: new Path("One Crazy Random Summer", 24),
- CommunityService: new Path("Community Service", 25),
- AvatarOfWestOfLoathing: new Path(
- "Avatar of West of Loathing",
- 26,
- false,
- false,
- true,
- true,
- 10,
- 10,
- 10,
- $classes`Cow Puncher, Snake Oiler, Beanslinger`
- ),
- TheSource: new Path("The Source", 27),
- NuclearAutumn: new Path(
- "Nuclear Autumn",
- 28,
- false,
- false,
- false,
- true,
- 3,
- 3,
- 3
- ),
- GelatinousNoob: new Path(
- "Gelatinous Noob",
- 29,
- false,
- false,
- true,
- true,
- 0,
- 0,
- 0,
- $classes`Gelatinous Noob`
- ),
- LicenseToAdventure: new Path(
- "License to Adventure",
- 30,
- true,
- true,
- true,
- false,
- 0,
- 2,
- 15
- ), //Unsure how to log liver size here
- LiveAscendRepeat: new Path("Live. Ascend. Repeat.", 31),
- PocketFamiliars: new Path("Pocket Familiars", 32, false, false, true, false), //This is my opinion on the matter
- GLover: new Path("G-Lover", 33),
- DisguisesDelimit: new Path("Disguises Delimit", 34),
- DarkGyffte: new Path(
- "Dark Gyffte",
- 35,
- false,
- false,
- true,
- false,
- 5,
- 5,
- 15,
- $classes`Vampyre`
- ),
- TwoCrazyRandomSummer: new Path("Two Crazy Random Summer", 36),
- KingdomOfExploathing: new Path("Kingdom of Exploathing", 37),
- PathOfThePlumber: new Path(
- "Path of the Plumber",
- 38,
- false,
- false,
- true,
- true,
- 20,
- 0,
- 5,
- $classes`Plumber`
- ),
- LowKeySummer: new Path("Low Key Summer", 39),
- GreyGoo: new Path("Grey Goo", 40),
- YouRobot: new Path("You, Robot", 41, false, false, false, true, 0, 0, 0),
- QuantumTerrarium: new Path("Quantum Terrarium", 42, true, true, true, false),
- Wildfire: new Path("Wildfire", 43),
- GreyYou: new Path(
- "Grey You",
- 44,
- false,
- false,
- true,
- true,
- 0,
- 0,
- 0, // eslint-disable-next-line libram/verify-constants
- $classes`Grey Goo`
- ),
- Journeyman: new Path("Journeyman", 45, false, false),
-} as const;
diff --git a/src/actions/ActionSource.ts b/src/actions/ActionSource.ts
index 18d7970b99..0c45d4e472 100644
--- a/src/actions/ActionSource.ts
+++ b/src/actions/ActionSource.ts
@@ -79,7 +79,7 @@ function mergeConstraints(
): ActionConstraints | null {
const familiars = allConstraints
.map((constraints) => constraints.familiar)
- .filter((familiar) => familiar);
+ .filter(Boolean);
if (familiars.length > 1) {
// Inconsistent requirements.
return null;
diff --git a/src/actions/Banish.ts b/src/actions/Banish.ts
new file mode 100644
index 0000000000..9f0800fc02
--- /dev/null
+++ b/src/actions/Banish.ts
@@ -0,0 +1,224 @@
+import {
+ canEquip,
+ cliExecute,
+ myTurncount,
+ restoreMp,
+ retrieveItem,
+ visitUrl,
+} from "kolmafia";
+
+import { Macro } from "../combat";
+import { getFoldGroup, have } from "../lib";
+import { Requirement } from "../maximize";
+import { get } from "../property";
+import * as AsdonMartin from "../resources/2017/AsdonMartin";
+import { $item, $items, $skill } from "../template-string";
+import {
+ ActionSource,
+ findActionSource,
+ FindActionSourceConstraints,
+} from "./ActionSource";
+
+// Value of _lastCombatStarted the last time we updated scrapbook charges.
+let scrapbookChargesLastUpdated = get("_lastCombatStarted");
+
+// Free unlimited source every 30 turns.
+// Does not work on special monsters so needs a backup, see tryFindFreeRun.
+// banishedMonsters isn't updated if the banish succeeds on an unbanishable monster
+const asdonMartinSource: ActionSource = new ActionSource(
+ $skill`Asdon Martin: Spring-Loaded Front Bumper`,
+ () => {
+ if (!AsdonMartin.installed()) return 0;
+ const banishes = get("banishedMonsters").split(":");
+ const bumperIndex = banishes
+ .map((string) => string.toLowerCase())
+ .indexOf("spring-loaded front bumper");
+ if (bumperIndex === -1) return 1;
+ return myTurncount() - parseInt(banishes[bumperIndex + 1]) > 30 ? 1 : 0;
+ },
+ Macro.trySkill($skill`Asdon Martin: Spring-Loaded Front Bumper`),
+ {
+ preparation: () => AsdonMartin.fillTo(50),
+ }
+);
+
+const banishSources: ActionSource[] = [
+ // Free limited sources
+ new ActionSource(
+ $skill`Snokebomb`,
+ () => (have($skill`Snokebomb`) ? 3 - get("_snokebombUsed") : 0),
+ Macro.skill($skill`Snokebomb`),
+ {
+ preparation: () => restoreMp(50),
+ }
+ ),
+
+ new ActionSource(
+ $skill`Emotionally Chipped`,
+ () => (have($skill`Emotionally Chipped`) ? 3 - get("_feelHatredUsed") : 0),
+ Macro.skill($skill`Feel Hatred`)
+ ),
+
+ new ActionSource(
+ $item`Kremlin's Greatest Briefcase`,
+ () =>
+ have($item`Kremlin's Greatest Briefcase`)
+ ? 3 - get("_kgbTranquilizerDartUses")
+ : 0,
+ Macro.skill($skill`KGB tranquilizer dart`),
+ {
+ equipmentRequirements: () =>
+ new Requirement([], {
+ forceEquip: $items`Kremlin's Greatest Briefcase`,
+ }),
+ }
+ ),
+
+ new ActionSource(
+ $item`latte lovers member's mug`,
+ () =>
+ have($item`latte lovers member's mug`) && !get("_latteBanishUsed")
+ ? 1
+ : 0,
+ Macro.skill($skill`Throw Latte on Opponent`),
+ {
+ equipmentRequirements: () =>
+ new Requirement([], { forceEquip: $items`latte lovers member's mug` }),
+ }
+ ),
+
+ new ActionSource(
+ $item`Lil' Doctor™ bag`,
+ () => (have($item`Lil' Doctor™ bag`) ? 3 - get("_reflexHammerUsed") : 0),
+ Macro.skill($skill`Reflex Hammer`),
+ {
+ equipmentRequirements: () =>
+ new Requirement([], { forceEquip: $items`Lil' Doctor™ bag` }),
+ }
+ ),
+
+ new ActionSource(
+ $item`mafia middle finger ring`,
+ () =>
+ have($item`mafia middle finger ring`) &&
+ canEquip($item`mafia middle finger ring`) &&
+ !get("_mafiaMiddleFingerRingUsed")
+ ? 1
+ : 0,
+ Macro.skill($skill`Show them your ring`),
+ {
+ equipmentRequirements: () =>
+ new Requirement([], { forceEquip: $items`mafia middle finger ring` }),
+ }
+ ),
+
+ new ActionSource(
+ $item`V for Vivala mask`,
+ () =>
+ have($item`V for Vivala mask`) && !get("_vmaskBanisherUsed") ? 1 : 0,
+ Macro.skill($skill`Creepy Grin`),
+ {
+ equipmentRequirements: () =>
+ new Requirement([], { forceEquip: $items`V for Vivala mask` }),
+ preparation: () => restoreMp(30),
+ }
+ ),
+
+ new ActionSource(
+ $item`stinky cheese eye`,
+ () =>
+ getFoldGroup($item`stinky cheese eye`).some((item) => have(item)) &&
+ !get("_stinkyCheeseBanisherUsed")
+ ? 1
+ : 0,
+
+ Macro.skill($skill`Give Your Opponent the Stinkeye`),
+ {
+ equipmentRequirements: () =>
+ new Requirement([], { forceEquip: $items`stinky cheese eye` }),
+ preparation: () => {
+ if (!have($item`stinky cheese eye`)) {
+ cliExecute(`fold stinky cheese eye`);
+ }
+ return have($item`stinky cheese eye`);
+ },
+ }
+ ),
+
+ new ActionSource(
+ $skill`Show your boring familiar pictures`,
+ () => {
+ if (have($item`familiar scrapbook`)) {
+ if (scrapbookChargesLastUpdated !== get("_lastCombatStarted")) {
+ visitUrl("desc_item.php?whichitem=463063785");
+ scrapbookChargesLastUpdated = get("_lastCombatStarted");
+ }
+ return Math.floor(get("scrapbookCharges") / 100);
+ }
+ return 0;
+ },
+ Macro.skill($skill`Show your boring familiar pictures`),
+ {
+ equipmentRequirements: () =>
+ new Requirement([], { forceEquip: $items`familiar scrapbook` }),
+ }
+ ),
+
+ new ActionSource(
+ $item`human musk`,
+ () => Math.max(0, 3 - get("_humanMuskUses")),
+ Macro.item($item`human musk`),
+ {
+ preparation: () => retrieveItem($item`human musk`),
+ cost: () => ActionSource.defaultPriceFunction($item`human musk`),
+ }
+ ),
+
+ // Expensive unlimited sources
+ ...$items`Louder Than Bomb, divine champagne popper, tennis ball`.map(
+ (item) =>
+ new ActionSource(item, () => Infinity, Macro.item(item), {
+ preparation: () => retrieveItem(item),
+ cost: () => ActionSource.defaultPriceFunction(item),
+ })
+ ),
+];
+
+/**
+ * Find an available banish source subject to constraints.
+ *
+ * @param constraints Preexisting constraints that restrict possible sources.
+ * @returns Banish source satisfying constraints, or null.
+ */
+export function tryFindBanish(
+ constraints?: FindActionSourceConstraints
+): ActionSource | null {
+ let source = findActionSource(banishSources, constraints);
+
+ // Always try to use Asdon Martin: Spring-Loaded Front Bumper first,
+ // but only if another source has been found.
+ if (source && asdonMartinSource.available()) {
+ source = asdonMartinSource.merge(source);
+ }
+
+ return source;
+}
+
+/**
+ * Ensure an available banish source subject to constraints.
+ * Throws an error if no source can be found.
+ *
+ * @param constraints Preexisting constraints that restrict possible sources.
+ * @returns Banish source satisfying constraints.
+ */
+export function ensureBanish(
+ constraints?: FindActionSourceConstraints
+): ActionSource {
+ const source = tryFindBanish(constraints);
+
+ if (!source) {
+ throw new Error("Failed to ensure Banish source");
+ }
+
+ return source;
+}
diff --git a/src/actions/FreeRun.ts b/src/actions/FreeRun.ts
index 98fab12f42..f4f097a6e9 100644
--- a/src/actions/FreeRun.ts
+++ b/src/actions/FreeRun.ts
@@ -1,54 +1,20 @@
-import {
- canEquip,
- cliExecute,
- myTurncount,
- restoreMp,
- retrieveItem,
- visitUrl,
-} from "kolmafia";
+import { retrieveItem } from "kolmafia";
import { Macro } from "../combat";
-import {
- ensureEffect,
- getFoldGroup,
- getSongCount,
- getSongLimit,
- have,
-} from "../lib";
+import { ensureEffect, getSongCount, getSongLimit, have } from "../lib";
import { Requirement } from "../maximize";
import { get } from "../property";
import * as Bandersnatch from "../resources/2009/Bandersnatch";
import * as StompingBoots from "../resources/2011/StompingBoots";
-import * as AsdonMartin from "../resources/2017/AsdonMartin";
-import { $effect, $familiar, $item, $items, $skill } from "../template-string";
+import { $effect, $familiar, $item, $items } from "../template-string";
import {
ActionSource,
findActionSource,
FindActionSourceConstraints,
} from "./ActionSource";
-// Value of _lastCombatStarted the last time we updated scrapbook charges.
-let scrapbookChargesLastUpdated = get("_lastCombatStarted");
-
-// Free unlimited source every 30 turns.
-// Does not work on special monsters so needs a backup, see tryFindFreeRun.
-// banishedMonsters isn't updated if the free run succeeds on an unbanishable monster
-const asdonMartinSource: ActionSource = new ActionSource(
- $skill`Asdon Martin: Spring-Loaded Front Bumper`,
- () => {
- if (!AsdonMartin.installed()) return 0;
- const banishes = get("banishedMonsters").split(":");
- const bumperIndex = banishes
- .map((string) => string.toLowerCase())
- .indexOf("spring-loaded front bumper");
- if (bumperIndex === -1) return 1;
- return myTurncount() - parseInt(banishes[bumperIndex + 1]) > 30 ? 1 : 0;
- },
- Macro.trySkill($skill`Asdon Martin: Spring-Loaded Front Bumper`),
- {
- preparation: () => AsdonMartin.fillTo(50),
- }
-);
+// eslint-disable-next-line libram/verify-constants
+const EVERYTHING_LOOKS_GREEN = $effect`Everything Looks Green`;
const freeRunSources: ActionSource[] = [
// Free limited sources
@@ -81,107 +47,6 @@ const freeRunSources: ActionSource[] = [
}
),
- new ActionSource(
- $skill`Snokebomb`,
- () => (have($skill`Snokebomb`) ? 3 - get("_snokebombUsed") : 0),
- Macro.skill($skill`Snokebomb`),
- {
- preparation: () => restoreMp(50),
- }
- ),
-
- new ActionSource(
- $skill`Emotionally Chipped`,
- () => (have($skill`Emotionally Chipped`) ? 3 - get("_feelHatredUsed") : 0),
- Macro.skill($skill`Feel Hatred`)
- ),
-
- new ActionSource(
- $item`Kremlin's Greatest Briefcase`,
- () =>
- have($item`Kremlin's Greatest Briefcase`)
- ? 3 - get("_kgbTranquilizerDartUses")
- : 0,
- Macro.skill($skill`KGB tranquilizer dart`),
- {
- equipmentRequirements: () =>
- new Requirement([], {
- forceEquip: $items`Kremlin's Greatest Briefcase`,
- }),
- }
- ),
-
- new ActionSource(
- $item`latte lovers member's mug`,
- () =>
- have($item`latte lovers member's mug`) && !get("_latteBanishUsed")
- ? 1
- : 0,
- Macro.skill($skill`Throw Latte on Opponent`),
- {
- equipmentRequirements: () =>
- new Requirement([], { forceEquip: $items`latte lovers member's mug` }),
- }
- ),
-
- new ActionSource(
- $item`Lil' Doctor™ bag`,
- () => (have($item`Lil' Doctor™ bag`) ? 3 - get("_reflexHammerUsed") : 0),
- Macro.skill($skill`Reflex Hammer`),
- {
- equipmentRequirements: () =>
- new Requirement([], { forceEquip: $items`Lil' Doctor™ bag` }),
- }
- ),
-
- new ActionSource(
- $item`mafia middle finger ring`,
- () =>
- have($item`mafia middle finger ring`) &&
- canEquip($item`mafia middle finger ring`) &&
- !get("_mafiaMiddleFingerRingUsed")
- ? 1
- : 0,
- Macro.skill($skill`Show them your ring`),
- {
- equipmentRequirements: () =>
- new Requirement([], { forceEquip: $items`mafia middle finger ring` }),
- }
- ),
-
- new ActionSource(
- $item`V for Vivala mask`,
- () =>
- have($item`V for Vivala mask`) && !get("_vmaskBanisherUsed") ? 1 : 0,
- Macro.skill($skill`Creepy Grin`),
- {
- equipmentRequirements: () =>
- new Requirement([], { forceEquip: $items`V for Vivala mask` }),
- preparation: () => restoreMp(30),
- }
- ),
-
- new ActionSource(
- $item`stinky cheese eye`,
- () =>
- getFoldGroup($item`stinky cheese eye`).some((item) => have(item)) &&
- !get("_stinkyCheeseBanisherUsed")
- ? 1
- : 0,
-
- Macro.skill($skill`Give Your Opponent the Stinkeye`),
- {
- equipmentRequirements: () =>
- new Requirement([], { forceEquip: $items`stinky cheese eye` }),
- preparation: () => {
- if (!have($item`stinky cheese eye`)) {
- cliExecute(`fold stinky cheese eye`);
- }
- return have($item`stinky cheese eye`);
- },
- }
- ),
-
new ActionSource(
$item`navel ring of navel gazing`,
() =>
@@ -208,25 +73,6 @@ const freeRunSources: ActionSource[] = [
}
),
- new ActionSource(
- $skill`Show your boring familiar pictures`,
- () => {
- if (have($item`familiar scrapbook`)) {
- if (scrapbookChargesLastUpdated !== get("_lastCombatStarted")) {
- visitUrl("desc_item.php?whichitem=463063785");
- scrapbookChargesLastUpdated = get("_lastCombatStarted");
- }
- return Math.floor(get("scrapbookCharges") / 100);
- }
- return 0;
- },
- Macro.skill($skill`Show your boring familiar pictures`),
- {
- equipmentRequirements: () =>
- new Requirement([], { forceEquip: $items`familiar scrapbook` }),
- }
- ),
-
new ActionSource(
$item`peppermint parasol`,
() => Math.max(0, 3 - get("_navelRunaways")),
@@ -241,22 +87,26 @@ const freeRunSources: ActionSource[] = [
}
),
- new ActionSource(
- $item`human musk`,
- () => Math.max(0, 3 - get("_humanMuskUses")),
- Macro.item($item`human musk`),
- {
- preparation: () => retrieveItem($item`human musk`),
- cost: () => ActionSource.defaultPriceFunction($item`human musk`),
- }
+ // unlimited items that trigger everything looks green
+ ...$items`green smoke bomb, tattered scrap of paper, GOTO, T.U.R.D.S. Key`.map(
+ (item) =>
+ new ActionSource(
+ item,
+ () => (have(EVERYTHING_LOOKS_GREEN) ? 0 : 1),
+ Macro.item(item),
+ {
+ preparation: () => retrieveItem(item),
+ cost: () => ActionSource.defaultPriceFunction(item),
+ }
+ )
),
- // Expensive unlimited sources
- ...$items`Louder Than Bomb, divine champagne popper, tennis ball`.map(
+ // limited quest items
+ ...$items`fish-oil smoke bomb, giant eraser`.map(
(item) =>
- new ActionSource(item, () => Infinity, Macro.item(item), {
- preparation: () => retrieveItem(item),
- cost: () => ActionSource.defaultPriceFunction(item),
+ new ActionSource(item, () => (!have(item) ? 0 : 1), Macro.item(item), {
+ preparation: () => have(item),
+ cost: () => 0,
})
),
];
@@ -270,14 +120,7 @@ const freeRunSources: ActionSource[] = [
export function tryFindFreeRun(
constraints?: FindActionSourceConstraints
): ActionSource | null {
- let source = findActionSource(freeRunSources, constraints);
-
- // Always try to use Asdon Martin: Spring-Loaded Front Bumper first,
- // but only if another source has been found.
- if (source && asdonMartinSource.available()) {
- source = asdonMartinSource.merge(source);
- }
-
+ const source = findActionSource(freeRunSources, constraints);
return source;
}
diff --git a/src/actions/index.ts b/src/actions/index.ts
index c20fa997d1..f12c52a51b 100644
--- a/src/actions/index.ts
+++ b/src/actions/index.ts
@@ -1,3 +1,4 @@
export * from "./ActionSource";
+export * from "./Banish";
export * from "./FreeKill";
export * from "./FreeRun";
diff --git a/src/ascend.ts b/src/ascend.ts
index 6670389578..8e78f65c2a 100644
--- a/src/ascend.ts
+++ b/src/ascend.ts
@@ -13,6 +13,7 @@ import {
getPermedSkills,
toSkill,
} from "kolmafia";
+import { MoonSign, signNameToId } from "./moonSign";
import { get } from "./property";
import { ChateauMantegna } from "./resources";
import { $item, $items, $stat } from "./template-string";
@@ -48,28 +49,7 @@ export function permedSkills(): Map {
);
}
-export class AscendError extends Error {
- cause?: Skill | Item | Class | Path | string;
- constructor(cause?: Skill | Item | Class | Path | string) {
- if (!cause) {
- super("Failed to ascend--do you have a pending trade offer?");
- } else if (cause instanceof Skill) {
- const reason = cause.permable
- ? haveSkill(cause)
- ? "too karmaically expensive"
- : "not a skill you currently know"
- : "unpermable";
- super(`Skill ${cause} is ${reason}!`);
- } else if (cause instanceof Item) {
- super(`Invalid astral item: ${cause}!`);
- } else if (cause instanceof Class) {
- super(`Invalid class ${cause} for this path!`);
- } else if (cause instanceof Path) {
- super(`Invalid path ${cause}!`);
- } else super(cause);
- this.cause = cause;
- }
-}
+export class AscendError extends Error {}
const gardens = [
"packet of pumpkin seeds",
@@ -128,20 +108,6 @@ export class AscensionPrepError extends Error {
}
}
-const MoonSigns = [
- "Mongoose",
- "Wallaby",
- "Vole",
- "Platypus",
- "Opossum",
- "Marmot",
- "Wombat",
- "Blender",
- "Packrat",
-] as const;
-
-type MoonSign = typeof MoonSigns[number];
-
type InputMoonSign =
| number
| Lowercase
@@ -156,22 +122,6 @@ type InputMoonSign =
| "gnomish"
| "gnomish gnomads camp";
-/**
- * @param moon Moon sign name
- * @returns Moon sign id else 0
- */
-export function signNameToId(moon: MoonSign): number {
- return MoonSigns.indexOf(moon) + 1;
-}
-
-/**
- * @param id Moon sign id
- * @returns Name of moon sign else "None"
- */
-export function signIdToName(id: number): MoonSign | "None" {
- return MoonSigns[id - 1] || "None";
-}
-
/**
* Determine the id of the appropriate moon sign.
*
@@ -266,6 +216,9 @@ export function ascend(options: {
consumable: $item`astral six-pack`,
pet: $item`none`,
};
+ const prunedOptions = Object.fromEntries(
+ Object.entries(options).filter(([, value]) => value)
+ ) as typeof options;
const {
path,
playerClass,
@@ -275,12 +228,12 @@ export function ascend(options: {
consumable,
pet,
permOptions,
- } = { ...DEFAULT_OPTIONS, ...options };
+ } = { ...DEFAULT_OPTIONS, ...prunedOptions };
if (playerClass.path !== (path.avatar ? path : Path.none)) {
- throw new AscendError(playerClass);
+ throw new AscendError(`Invalid class ${playerClass} for this path!`);
}
- if (path.id < 0) throw new AscendError(path);
+ if (path.id < 0) throw new AscendError(`Invalid path: ${path}!`);
const moonId = inputToMoonId(moon, playerClass);
if (moonId < 1 || moonId > 9) throw new Error(`Invalid moon ${moon}`);
@@ -290,7 +243,7 @@ export function ascend(options: {
consumable
)
) {
- throw new AscendError(consumable);
+ throw new AscendError(`Invalid astral consumable: ${consumable}`);
}
if (
@@ -298,23 +251,38 @@ export function ascend(options: {
pet
)
) {
- throw new AscendError(pet);
+ throw new AscendError(`Invalid astral pet: ${pet}`);
}
- const illegalSkill = permOptions
- ? Array.from(permOptions.permSkills.keys()).find(
- (skill) => !skill.permable || !haveSkill(skill)
- )
- : undefined;
- if (illegalSkill) {
- throw new AscendError(illegalSkill);
+ const unownedSkills = [...(permOptions?.permSkills.keys() ?? [])].filter(
+ (skill) => !haveSkill(skill)
+ );
+ if (unownedSkills.length) {
+ throw new AscendError(
+ `You're trying to perm the following skills, but don't actually have them: ${unownedSkills.join(
+ ", "
+ )}`
+ );
+ }
+
+ const unpermableSkills = [...(permOptions?.permSkills.keys() ?? [])].filter(
+ (skill) => !skill.permable
+ );
+ if (unpermableSkills.length) {
+ throw new AscendError(
+ `You're trying to perm the following skills, but they're unpermable: ${unownedSkills.join(
+ ", "
+ )}`
+ );
}
if (!isInValhalla()) {
visitUrl("ascend.php?action=ascend&confirm=on&confirm2=on");
}
if (!isInValhalla()) {
- throw new AscendError();
+ throw new AscendError(
+ "Failed to ascend--do you have a pending trade offer?"
+ );
}
visitUrl("afterlife.php?action=pearlygates");
@@ -338,7 +306,10 @@ export function ascend(options: {
if (prospectivePermLevel > currentPermLevel) {
const expectedKarma = 100 * (prospectivePermLevel - currentPermLevel);
if (karma < expectedKarma) {
- if (!permOptions.neverAbort) throw new AscendError(skill);
+ if (!permOptions.neverAbort)
+ throw new AscendError(
+ `Skill ${skill} is too karmaically expensive!`
+ );
continue;
}
karma -= expectedKarma;
diff --git a/src/challengePaths/2015/CommunityService.ts b/src/challengePaths/2015/CommunityService.ts
index 1d961a9046..7c8918e9e8 100644
--- a/src/challengePaths/2015/CommunityService.ts
+++ b/src/challengePaths/2015/CommunityService.ts
@@ -466,8 +466,8 @@ export default class CommunityService {
(...effects) => {
const noncombatRate =
-1 * hypotheticalModifier("Combat Rate", ...effects);
- const unsoftcappedRate =
- noncombatRate > 25 ? 25 + (noncombatRate - 25) * 5 : noncombatRate;
+ const unsoftcappedRate = (rate: number): number =>
+ rate > 25 ? 25 + (rate - 25) * 5 : rate;
const currentFamiliarModifier =
-1 *
numericModifier(
@@ -482,11 +482,13 @@ export default class CommunityService {
myFamiliar(),
"Combat Rate",
familiarWeight(myFamiliar()) +
- hypotheticalModifier("Combat Rate", ...effects),
+ hypotheticalModifier("Familiar Weight", ...effects),
equippedItem($slot`familiar`)
);
const adjustedRate =
- unsoftcappedRate - currentFamiliarModifier + newFamiliarModifier;
+ unsoftcappedRate(noncombatRate) -
+ unsoftcappedRate(currentFamiliarModifier) +
+ unsoftcappedRate(newFamiliarModifier);
return 60 - 3 * Math.floor(adjustedRate / 5);
},
new Requirement(["-combat"], {})
diff --git a/src/combat.ts b/src/combat.ts
index c93d2f0aae..1bbcb96fbc 100644
--- a/src/combat.ts
+++ b/src/combat.ts
@@ -220,7 +220,7 @@ export class Macro {
const nextStepsStrings = ([] as string[]).concat(
...nextSteps.map((x) => (x instanceof Macro ? x.components : [x]))
);
- this.components.push(...nextStepsStrings.filter((s) => s.length > 0));
+ this.components.push(...nextStepsStrings.filter(Boolean));
return this;
}
diff --git a/src/diet/index.ts b/src/diet/index.ts
index 993554273f..5d374ed2b7 100644
--- a/src/diet/index.ts
+++ b/src/diet/index.ts
@@ -32,6 +32,7 @@ type RawDiet = RawDietEntry[];
type ConsumptionModifiers = {
forkMug: boolean;
seasoning: boolean;
+ whetStone: boolean;
mayoflex: boolean;
refinedPalate: boolean;
garish: boolean;
@@ -91,6 +92,7 @@ function expectedAdventures(
if (itemType(item) === "food" && modifiers.mayoflex) adventures++;
if (itemType(item) === "food" && modifiers.seasoning)
adventures += seasoningAdventures;
+ if (itemType(item) === "food" && modifiers.whetStone) adventures++;
return adventures;
}) / interpolated.length
);
@@ -185,6 +187,28 @@ export class MenuItem {
{ maximum: get("deepDishOfLegendEaten") ? 0 : 1 },
],
[$item`Pizza of Legend`, { maximum: get("pizzaOfLegendEaten") ? 0 : 1 }],
+ [
+ $item`jar of fermented pickle juice`,
+ { maximum: get("_pickleJuiceDrunk") ? 0 : 1 },
+ ],
+ [
+ $item`extra-greasy slider`,
+ { maximum: get("_extraGreasySliderEaten") ? 0 : 1 },
+ ],
+ [$item`voodoo snuff`, { maximum: get("_voodooSnuffUsed") ? 0 : 1 }],
+ [
+ $item`Ol' Scratch's salad fork`,
+ { maximum: get("_saladForkUsed") ? 0 : 1 },
+ ],
+ [$item`Frosty's frosty mug`, { maximum: get("_frostyMugUsed") ? 0 : 1 }],
+ [
+ $item`tin cup of mulligan stew`,
+ { maximum: get("_mulliganStewEaten") ? 0 : 1 },
+ ],
+ [
+ $item`Hodgman's blanket`,
+ { maximum: get("_hodgmansBlanketDrunk") ? 0 : 1 },
+ ],
] as [Item, MenuItemOptions][]);
}
@@ -271,6 +295,7 @@ class DietPlanner {
fork?: MenuItem;
mug?: MenuItem;
seasoning?: MenuItem;
+ whetStone?: MenuItem;
spleenValue = 0;
constructor(mpa: number, menu: MenuItem[]) {
@@ -282,6 +307,7 @@ class DietPlanner {
this.seasoning = menu.find(
(item) => item.item === $item`Special Seasoning`
);
+ this.whetStone = menu.find((item) => item.item === $item`whet stone`);
this.mayoLookup = new Map
- >();
if (mayoInstalled()) {
for (const mayo of [Mayo.flex, Mayo.zapine]) {
@@ -362,6 +388,7 @@ class DietPlanner {
const defaultModifiers = {
forkMug: false,
seasoning: this.seasoning ? helpers.includes(this.seasoning) : false,
+ whetStone: this.whetStone ? helpers.includes(this.whetStone) : false,
mayoflex: this.mayoLookup.size
? helpers.some((item) => item.item === Mayo.flex)
: false,
@@ -391,6 +418,14 @@ class DietPlanner {
helpers.push(this.seasoning);
}
+ if (
+ this.whetStone &&
+ itemType(menuItem.item) === "food" &&
+ this.mpa > mallPrice($item`whet stone`)
+ ) {
+ helpers.push(this.whetStone);
+ }
+
const forkMug =
itemType(menuItem.item) === "food"
? this.fork
@@ -751,6 +786,7 @@ class DietEntry {
expectedAdventures(this.menuItems[this.menuItems.length - 1].item, {
forkMug: fork || mug,
seasoning: items.includes($item`Special Seasoning`),
+ whetStone: items.includes($item`whet stone`),
mayoflex: items.includes(Mayo.flex),
refinedPalate: diet.refinedPalate,
garish: diet.garish,
diff --git a/src/index.ts b/src/index.ts
index 12f546a4c2..381d82630c 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -18,12 +18,12 @@ export {
skillModifiers,
} from "./modifierTypes";
export * from "./mood";
+export * from "./moonSign";
export * from "./propertyTyping";
export * from "./resources";
export * from "./since";
export * from "./template-string";
export { default as Kmail } from "./Kmail";
-export * from "./Path";
export { default as logger } from "./logger";
export * as console from "./console";
export * as property from "./property";
diff --git a/src/lib.ts b/src/lib.ts
index 9f0dad5105..178f48533b 100644
--- a/src/lib.ts
+++ b/src/lib.ts
@@ -54,6 +54,7 @@ import {
toSkill,
totalTurnsPlayed,
visitUrl,
+ xpath,
} from "kolmafia";
import logger from "./logger";
@@ -69,7 +70,7 @@ import {
$skill,
$stat,
} from "./template-string";
-import { makeByXFunction, chunk, flat } from "./utils";
+import { makeByXFunction, chunk, flat, notNull } from "./utils";
/**
* Determines the current maximum Accordion Thief songs the player can have in their head
@@ -1017,7 +1018,7 @@ export function realmAvailable(identifier: RealmType): boolean {
* @param realm the realm type to consider
* @returns The currency for the given zone
*/
-export function realmCurrency(realm: RealmType): Item | undefined {
+export function realmCurrency(realm: RealmType): Item | null {
switch (realm) {
case "sleaze":
return $item`Beach Buck`;
@@ -1031,6 +1032,8 @@ export function realmCurrency(realm: RealmType): Item | undefined {
return $item`Volcoino`;
case "fantasy":
return $item`Rubee™`;
+ default:
+ return null;
}
}
@@ -1046,5 +1049,92 @@ export function lgrCurrencies(): Item[] {
!(realm === "hot" && get("_luckyGoldRingVolcoino"))
)
.map(realmCurrency)
- .filter((i) => !!i) as Item[];
+ .filter(notNull);
+}
+
+const ACCOUNT_COMBAT_FLAGS = [
+ "aabosses",
+ "wowbar",
+ "bothcombatinterf",
+ "compactmanuel",
+ "eternalmrj",
+ "disablelovebugs",
+] as const;
+/**
+ * Different flags you can set on your account for how to handle combat:
+ * aabosses refers to the flag that lets autoattack trigger against special monsters
+ * wowbar refers to the flag to use the Combat Action Bar
+ * bothcombatinterf refers to the flag to use both the CAB
+ * compactmanuel refers to the flag to display monster manuel data horizontally
+ * eternalmrg refers to the flag to enable endless factoid delight
+ * disablelovebugs disables love bugs
+ */
+export type AccountCombatFlag = typeof ACCOUNT_COMBAT_FLAGS[number];
+
+/**
+ * Get the current value of all of your account's combat setting flags
+ * @param flags An array of the flags you want to get, defaults to all of them
+ * @returns An array of objects that contain the flags and their values as booleans
+ */
+export function getCombatFlags(
+ flags: AccountCombatFlag[] = [...ACCOUNT_COMBAT_FLAGS]
+): {
+ flag: AccountCombatFlag;
+ value: boolean;
+}[] {
+ const accountPage = visitUrl("account.php?tab=combat");
+ return flags.map((flag) => ({
+ flag,
+ value:
+ xpath(
+ accountPage,
+ `//*[@id="opt_flag_${flag}"]/label/input[@type='checkbox']@checked`
+ )[0] === "checked",
+ }));
+}
+
+/**
+ * Sets the given combat setting flags on your account
+ *
+ * @param flags A spread array of objects that contain a flag and its desired value; these look like the return value of `getCombatFlags`
+ * @returns the result of the associated `visitUrl` call
+ */
+export function setCombatFlags(
+ ...flags: { flag: AccountCombatFlag; value: boolean }[]
+): string {
+ return visitUrl(
+ `account.php?${
+ ([
+ ...flat(
+ flags.map(({ flag, value }) => [
+ `actions[]=flag_${flag}`,
+ `flag_${flag}=${Number(value)}`,
+ ])
+ ),
+ "action=Update",
+ "am=1",
+ "ajax=1",
+ ].join("&"),
+ true)
+ }`
+ );
+}
+
+/**
+ * Perform a given action with certain combat setting flags set, returning them to their initial values if possible
+ *
+ * @param action The action you want to do with the given combat setting flags
+ * @param flags A spread array of objects that contain a combat setting flag and its desired value; these look like the return value of `getCombatFlags`
+ * @returns The result of the action
+ */
+export function withCombatFlags(
+ action: () => T,
+ ...flags: { flag: AccountCombatFlag; value: boolean }[]
+) {
+ const initialValues = getCombatFlags(flags.map(({ flag }) => flag));
+ try {
+ return action();
+ } finally {
+ setCombatFlags(...initialValues);
+ }
}
diff --git a/src/maximize.ts b/src/maximize.ts
index 8fff4ca3a7..20993c3f94 100644
--- a/src/maximize.ts
+++ b/src/maximize.ts
@@ -134,6 +134,7 @@ const modeableCommands = [
"edpiece",
"retrocape",
"parka",
+ "jillcandle",
] as const;
export type Mode = typeof modeableCommands[number];
export type Modes = Partial<{ [x in Mode]: string }>;
@@ -144,6 +145,7 @@ export const modeableItems = {
edpiece: $item`The Crown of Ed the Undying`,
retrocape: $item`unwrapped knock-off retro superhero cape`,
parka: $item`Jurassic Parka`,
+ jillcandle: $item`LED candle`,
} as const;
export const modeableState = {
@@ -156,6 +158,7 @@ export const modeableState = {
" " +
getProperty("retroCapeWashingInstructions"),
parka: () => getProperty("parkaMode"),
+ jillcandle: () => getProperty("ledCandleMode"),
} as const;
/**
diff --git a/src/moonSign.ts b/src/moonSign.ts
new file mode 100644
index 0000000000..0e0252896b
--- /dev/null
+++ b/src/moonSign.ts
@@ -0,0 +1,28 @@
+const MoonSigns = [
+ "Mongoose",
+ "Wallaby",
+ "Vole",
+ "Platypus",
+ "Opossum",
+ "Marmot",
+ "Wombat",
+ "Blender",
+ "Packrat",
+] as const;
+export type MoonSign = typeof MoonSigns[number];
+
+/**
+ * @param moon Moon sign name
+ * @returns Moon sign id else 0
+ */
+export function signNameToId(moon: MoonSign): number {
+ return MoonSigns.indexOf(moon) + 1;
+}
+
+/**
+ * @param id Moon sign id
+ * @returns Name of moon sign else "None"
+ */
+export function signIdToName(id: number): MoonSign | "None" {
+ return MoonSigns[id - 1] || "None";
+}
diff --git a/src/property.ts b/src/property.ts
index 0c34a54c70..a7ca7b6af8 100644
--- a/src/property.ts
+++ b/src/property.ts
@@ -11,6 +11,8 @@ import {
MafiaClass,
Monster,
Phylum,
+ propertyExists,
+ removeProperty,
Servant,
setProperty,
Skill,
@@ -297,7 +299,7 @@ export function decrement(
type Properties = Partial<{
[P in KnownProperty]: unknown;
-}>;
+}> & { [x in string]: unknown };
/**
* Sets the value of a set of mafia properties
@@ -385,6 +387,7 @@ export function withChoice(
}
export class PropertiesManager {
+ private static EMPTY_PREFERENCE = Symbol("empty preference");
private properties: Properties = {};
get storedValues(): Properties {
@@ -400,8 +403,12 @@ export class PropertiesManager {
for (const [propertyName, propertyValue] of Object.entries(
propertiesToSet
)) {
- if (this.properties[propertyName as KnownProperty] === undefined) {
- this.properties[propertyName as KnownProperty] = get(propertyName);
+ if (!(propertyName in this.properties)) {
+ this.properties[propertyName as KnownProperty] = propertyExists(
+ propertyName
+ )
+ ? get(propertyName)
+ : PropertiesManager.EMPTY_PREFERENCE;
}
set(propertyName, propertyValue as { toString(): string });
}
@@ -416,7 +423,7 @@ export class PropertiesManager {
this.set(
Object.fromEntries(
Object.entries(choicesToSet).map(([choiceNumber, choiceValue]) => [
- `choiceAdventure${choiceNumber}` as KnownProperty,
+ `choiceAdventure${choiceNumber}`,
choiceValue,
])
) as Properties
@@ -440,9 +447,14 @@ export class PropertiesManager {
*/
reset(...properties: KnownProperty[]): void {
for (const property of properties) {
+ if (!(property in this.properties)) continue;
const value = this.properties[property];
- if (value) {
+ if (value === PropertiesManager.EMPTY_PREFERENCE) {
+ removeProperty(property);
+ } else if (value) {
set(property, value as { toString(): string });
+ } else {
+ set(property, "");
}
}
}
@@ -459,7 +471,7 @@ export class PropertiesManager {
*
* @param properties Properties for the manager to forget.
*/
- clear(...properties: KnownProperty[]): void {
+ clear(...properties: (KnownProperty | string)[]): void {
for (const property of properties) {
if (this.properties[property]) {
delete this.properties[property];
diff --git a/src/propertyTypes.ts b/src/propertyTypes.ts
index eef0c45252..50f154d588 100644
--- a/src/propertyTypes.ts
+++ b/src/propertyTypes.ts
@@ -1,13 +1,13 @@
/** THIS FILE IS AUTOMATICALLY GENERATED. See tools/parseDefaultProperties.ts for more information */
-export const booleanProperties = ["abortOnChoiceWhenNotInChoice", "addChatCommandLine", "addCreationQueue", "addStatusBarToFrames", "allowCloseableDesktopTabs", "allowNegativeTally", "allowNonMoodBurning", "allowSummonBurning", "autoHighlightOnFocus", "broadcastEvents", "cacheMallSearches", "chatBeep", "chatLinksUseRelay", "compactChessboard", "copyAsHTML", "customizedTabs", "debugBuy", "debugConsequences", "debugFoxtrotRemoval", "debugPathnames", "debugTopMenuStyle", "gapProtection", "gitInstallDependencies", "gitShowCommitMessages", "gitUpdateOnLogin", "greenScreenProtection", "guiUsesOneWindow", "hideServerDebugText", "logAcquiredItems", "logBattleAction", "logBrowserInteractions", "logChatMessages", "logChatRequests", "logCleanedHTML", "logDecoratedResponses", "logFamiliarActions", "logGainMessages", "logReadableHTML", "logPreferenceChange", "logMonsterHealth", "logReverseOrder", "logStatGains", "logStatusEffects", "logStatusOnLogin", "macroDebug", "macroLens", "mementoListActive", "mergeHobopolisChat", "pingLogin", "pingStealthyTimein", "printStackOnAbort", "proxySet", "relayAddSounds", "relayAddsCustomCombat", "relayAddsDiscoHelper", "relayAddsGraphicalCLI", "relayAddsQuickScripts", "relayAddsRestoreLinks", "relayAddsUpArrowLinks", "relayAddsUseLinks", "relayAddsWikiLinks", "relayAllowRemoteAccess", "relayBrowserOnly", "relayCacheUncacheable", "relayFormatsChatText", "relayHidesJunkMallItems", "relayMaintainsEffects", "relayMaintainsHealth", "relayMaintainsMana", "relayOverridesImages", "relayRunsAfterAdventureScript", "relayRunsBeforeBattleScript", "relayRunsBeforePVPScript", "relayScriptButtonFirst", "relayTextualizesEffects", "relayTrimsZapList", "relayUsesInlineLinks", "relayUsesIntegratedChat", "relayWarnOnRecoverFailure", "removeMalignantEffects", "saveSettingsOnSet", "sharePriceData", "showAllRequests", "showExceptionalRequests", "stealthLogin", "svnAlwaysAdd", "svnAlwaysOverwrite", "svnInstallDependencies", "svnShowCommitMessages", "svnUpdateOnLogin", "switchEquipmentForBuffs", "syncAfterSvnUpdate", "useChatToolbar", "useContactsFrame", "useDevProxyServer", "useDockIconBadge", "useHugglerChannel", "useImageCache", "useLastUserAgent", "useSystemTrayIcon", "useTabbedChatFrame", "useToolbars", "useCachedVolcanoMaps", "useZoneComboBox", "verboseSpeakeasy", "verboseFloundry", "wrapLongLines", "_gitUpdated", "_svnRepoFileFetched", "_svnUpdated", "antagonisticSnowmanKitAvailable", "arcadeGameHints", "armoryUnlocked", "autoForbidIgnoringStores", "autoCraft", "autoQuest", "autoEntangle", "autoGarish", "autoManaRestore", "autoFillMayoMinder", "autoPinkyRing", "autoPlantHardcore", "autoPlantSoftcore", "autoPotionID", "autoRepairBoxServants", "autoSatisfyWithCloset", "autoSatisfyWithCoinmasters", "autoSatisfyWithMall", "autoSatisfyWithNPCs", "autoSatisfyWithStash", "autoSatisfyWithStorage", "autoSetConditions", "autoSteal", "autoTuxedo", "backupCameraReverserEnabled", "badMoonEncounter01", "badMoonEncounter02", "badMoonEncounter03", "badMoonEncounter04", "badMoonEncounter05", "badMoonEncounter06", "badMoonEncounter07", "badMoonEncounter08", "badMoonEncounter09", "badMoonEncounter10", "badMoonEncounter11", "badMoonEncounter12", "badMoonEncounter13", "badMoonEncounter14", "badMoonEncounter15", "badMoonEncounter16", "badMoonEncounter17", "badMoonEncounter18", "badMoonEncounter19", "badMoonEncounter20", "badMoonEncounter21", "badMoonEncounter22", "badMoonEncounter23", "badMoonEncounter24", "badMoonEncounter25", "badMoonEncounter26", "badMoonEncounter27", "badMoonEncounter28", "badMoonEncounter29", "badMoonEncounter30", "badMoonEncounter31", "badMoonEncounter32", "badMoonEncounter33", "badMoonEncounter34", "badMoonEncounter35", "badMoonEncounter36", "badMoonEncounter37", "badMoonEncounter38", "badMoonEncounter39", "badMoonEncounter40", "badMoonEncounter41", "badMoonEncounter42", "badMoonEncounter43", "badMoonEncounter44", "badMoonEncounter45", "badMoonEncounter46", "badMoonEncounter47", "badMoonEncounter48", "barrelShrineUnlocked", "bigBrotherRescued", "blackBartsBootyAvailable", "bondAdv", "bondBeach", "bondBeat", "bondBooze", "bondBridge", "bondDesert", "bondDR", "bondDrunk1", "bondDrunk2", "bondHoney", "bondHP", "bondInit", "bondItem1", "bondItem2", "bondItem3", "bondJetpack", "bondMartiniDelivery", "bondMartiniPlus", "bondMartiniTurn", "bondMeat", "bondMox1", "bondMox2", "bondMPregen", "bondMus1", "bondMus2", "bondMys1", "bondMys2", "bondSpleen", "bondStat", "bondStat2", "bondStealth", "bondStealth2", "bondSymbols", "bondWar", "bondWeapon2", "bondWpn", "booPeakLit", "bootsCharged", "breakfastCompleted", "burrowgrubHiveUsed", "calzoneOfLegendEaten", "canteenUnlocked", "chaosButterflyThrown", "chatbotScriptExecuted", "chateauAvailable", "chatLiterate", "chatServesUpdates", "checkJackassHardcore", "checkJackassSoftcore", "clanAttacksEnabled", "coldAirportAlways", "considerShadowNoodles", "controlRoomUnlock", "concertVisited", "controlPanel1", "controlPanel2", "controlPanel3", "controlPanel4", "controlPanel5", "controlPanel6", "controlPanel7", "controlPanel8", "controlPanel9", "corralUnlocked", "dailyDungeonDone", "dampOldBootPurchased", "daycareOpen", "deepDishOfLegendEaten", "demonSummoned", "dinseyAudienceEngagement", "dinseyGarbagePirate", "dinseyRapidPassEnabled", "dinseyRollercoasterNext", "dinseySafetyProtocolsLoose", "doghouseBoarded", "dontStopForCounters", "drippingHallUnlocked", "drippyShieldUnlocked", "edUsedLash", "eldritchFissureAvailable", "eldritchHorrorAvailable", "errorOnAmbiguousFold", "essenceOfAnnoyanceAvailable", "essenceOfBearAvailable", "expressCardUsed", "falloutShelterChronoUsed", "falloutShelterCoolingTankUsed", "fireExtinguisherBatHoleUsed", "fireExtinguisherChasmUsed", "fireExtinguisherCyrptUsed", "fireExtinguisherDesertUsed", "fireExtinguisherHaremUsed", "fistTeachingsHaikuDungeon", "fistTeachingsPokerRoom", "fistTeachingsBarroomBrawl", "fistTeachingsConservatory", "fistTeachingsBatHole", "fistTeachingsFunHouse", "fistTeachingsMenagerie", "fistTeachingsSlums", "fistTeachingsFratHouse", "fistTeachingsRoad", "fistTeachingsNinjaSnowmen", "flickeringPixel1", "flickeringPixel2", "flickeringPixel3", "flickeringPixel4", "flickeringPixel5", "flickeringPixel6", "flickeringPixel7", "flickeringPixel8", "floristFriarAvailable", "floristFriarChecked", "frAlways", "frCemetaryUnlocked", "friarsBlessingReceived", "frMountainsUnlocked", "frSwampUnlocked", "frVillageUnlocked", "frWoodUnlocked", "getawayCampsiteUnlocked", "ghostPencil1", "ghostPencil2", "ghostPencil3", "ghostPencil4", "ghostPencil5", "ghostPencil6", "ghostPencil7", "ghostPencil8", "ghostPencil9", "gingerAdvanceClockUnlocked", "gingerBlackmailAccomplished", "gingerbreadCityAvailable", "gingerExtraAdventures", "gingerNegativesDropped", "gingerSewersUnlocked", "gingerSubwayLineUnlocked", "gingerRetailUnlocked", "glitchItemAvailable", "grabCloversHardcore", "grabCloversSoftcore", "guideToSafariAvailable", "guyMadeOfBeesDefeated", "hallowienerDefiledNook", "hallowienerGuanoJunction", "hallowienerKnollGym", "hallowienerMadnessBakery", "hallowienerMiddleChamber", "hallowienerOvergrownLot", "hallowienerSkeletonStore", "hallowienerSmutOrcs", "hallowienerSonofaBeach", "hallowienerVolcoino", "hardcorePVPWarning", "harvestBatteriesHardcore", "harvestBatteriesSoftcore", "hasAutumnaton", "hasBartender", "hasChef", "hasCocktailKit", "hasCosmicBowlingBall", "hasDetectiveSchool", "hasMaydayContract", "hasOven", "hasRange", "hasShaker", "hasSushiMat", "hasTwinkleVision", "haveBoxingDaydreamHardcore", "haveBoxingDaydreamSoftcore", "hermitHax0red", "holidayHalsBookAvailable", "horseryAvailable", "hotAirportAlways", "implementGlitchItem", "intenseCurrents", "itemBoughtPerAscension637", "itemBoughtPerAscension8266", "itemBoughtPerAscension10790", "itemBoughtPerAscension10794", "itemBoughtPerAscension10795", "itemBoughtPerCharacter6423", "itemBoughtPerCharacter6428", "itemBoughtPerCharacter6429", "kingLiberated", "lastPirateInsult1", "lastPirateInsult2", "lastPirateInsult3", "lastPirateInsult4", "lastPirateInsult5", "lastPirateInsult6", "lastPirateInsult7", "lastPirateInsult8", "lawOfAveragesAvailable", "leafletCompleted", "ledCandleDropped", "libraryCardUsed", "lockPicked", "logBastilleBattalionBattles", "loginRecoveryHardcore", "loginRecoverySoftcore", "lovebugsUnlocked", "loveTunnelAvailable", "lowerChamberUnlock", "madnessBakeryAvailable", "makePocketWishesHardcore", "makePocketWishesSoftcore", "manualOfNumberologyAvailable", "mappingMonsters", "mapToAnemoneMinePurchased", "mapToKokomoAvailable", "mapToMadnessReefPurchased", "mapToTheDiveBarPurchased", "mapToTheMarinaraTrenchPurchased", "mapToTheSkateParkPurchased", "maraisBeaverUnlock", "maraisCorpseUnlock", "maraisDarkUnlock", "maraisVillageUnlock", "maraisWildlifeUnlock", "maraisWizardUnlock", "maximizerAlwaysCurrent", "maximizerCreateOnHand", "maximizerCurrentMallPrices", "maximizerFoldables", "maximizerIncludeAll", "maximizerNoAdventures", "middleChamberUnlock", "milkOfMagnesiumActive", "moonTuned", "neverendingPartyAlways", "noncombatForcerActive", "oasisAvailable", "odeBuffbotCheck", "oilPeakLit", "oscusSodaUsed", "outrageousSombreroUsed", "overgrownLotAvailable", "ownsFloristFriar", "ownsSpeakeasy", "pathedSummonsHardcore", "pathedSummonsSoftcore", "pizzaOfLegendEaten", "popularTartUnlocked", "potatoAlarmClockUsed", "prAlways", "prayedForGlamour", "prayedForProtection", "prayedForVigor", "primaryLabCheerCoreGrabbed", "pyramidBombUsed", "rageGlandVented", "readManualHardcore", "readManualSoftcore", "relayShowSpoilers", "relayShowWarnings", "rememberDesktopSize", "replicaChateauAvailable", "replicaNeverendingPartyAlways", "replicaWitchessSetAvailable", "requireBoxServants", "requireSewerTestItems", "restUsingCampAwayTent", "restUsingChateau", "ROMOfOptimalityAvailable", "safePickpocket", "schoolOfHardKnocksDiplomaAvailable", "scriptCascadingMenus", "serverAddsCustomCombat", "SHAWARMAInitiativeUnlocked", "showForbiddenStores", "showGainsPerUnit", "showIgnoringStorePrices", "showNoSummonOnly", "showTurnFreeOnly", "skeletonStoreAvailable", "sleazeAirportAlways", "snojoAvailable", "sortByEffect", "sortByRoom", "spacegateAlways", "spacegateVaccine1", "spacegateVaccine2", "spacegateVaccine3", "spaceInvaderDefeated", "spelunkyHints", "spiceMelangeUsed", "spookyAirportAlways", "stenchAirportAlways", "stopForFixedWanderer", "stopForUltraRare", "styxPixieVisited", "superconductorDefeated", "suppressInappropriateNags", "suppressPowerPixellation", "suppressMallPriceCacheMessages", "telegraphOfficeAvailable", "telescopeLookedHigh", "timeTowerAvailable", "trackLightsOut", "uneffectWithHotTub", "universalSeasoningActive", "universalSeasoningAvailable", "useBookOfEverySkillHardcore", "useBookOfEverySkillSoftcore", "useCrimboToysHardcore", "useCrimboToysSoftcore", "verboseMaximizer", "visitLoungeHardcore", "visitLoungeSoftcore", "visitRumpusHardcore", "visitRumpusSoftcore", "voteAlways", "wildfireBarrelCaulked", "wildfireDusted", "wildfireFracked", "wildfirePumpGreased", "wildfireSprinkled", "yearbookCameraPending", "youRobotScavenged", "_2002MrStoreCreditsCollected", "_affirmationCookieEaten", "_affirmationHateUsed", "_airFryerUsed", "_akgyxothUsed", "_alienAnimalMilkUsed", "_alienPlantPodUsed", "_allYearSucker", "_aprilShower", "_armyToddlerCast", "_aug1Cast", "_aug2Cast", "_aug3Cast", "_aug4Cast", "_aug5Cast", "_aug6Cast", "_aug7Cast", "_aug8Cast", "_aug9Cast", "_aug10Cast", "_aug11Cast", "_aug12Cast", "_aug13Cast", "_aug14Cast", "_aug15Cast", "_aug16Cast", "_aug17Cast", "_aug18Cast", "_aug19Cast", "_aug20Cast", "_aug21Cast", "_aug22Cast", "_aug23Cast", "_aug24Cast", "_aug25Cast", "_aug26Cast", "_aug27Cast", "_aug28Cast", "_aug29Cast", "_aug30Cast", "_aug31Cast", "_augTodayCast", "_authorsInkUsed", "_baconMachineUsed", "_bagOfCandy", "_bagOfCandyUsed", "_bagOTricksUsed", "_ballastTurtleUsed", "_ballInACupUsed", "_ballpit", "_barrelPrayer", "_bastilleLastBattleWon", "_beachCombing", "_bendHellUsed", "_blackMonolithUsed", "_blankoutUsed", "_bonersSummoned", "_bookOfEverySkillUsed", "_borrowedTimeUsed", "_bowleggedSwaggerUsed", "_bowlFullOfJellyUsed", "_boxOfHammersUsed", "_brainPreservationFluidUsed", "_brassDreadFlaskUsed", "_cameraUsed", "_canSeekBirds", "_carboLoaded", "_cargoPocketEmptied", "_ceciHatUsed", "_chateauDeskHarvested", "_chateauMonsterFought", "_chibiChanged", "_chronerCrossUsed", "_chronerTriggerUsed", "_chubbyAndPlumpUsed", "_circadianRhythmsRecalled", "_circleDrumUsed", "_clanFortuneBuffUsed", "_claraBellUsed", "_coalPaperweightUsed", "_cocoaDispenserUsed", "_cocktailShakerUsed", "_coldAirportToday", "_coldOne", "_communismUsed", "_confusingLEDClockUsed", "_controlPanelUsed", "_cookbookbatRecipeDrops", "_corruptedStardustUsed", "_cosmicSixPackConjured", "_crappyCameraUsed", "_creepyVoodooDollUsed", "_crimboTraining", "_crimboTree", "_cursedKegUsed", "_cursedMicrowaveUsed", "_dailyDungeonMalwareUsed", "_darkChocolateHeart", "_daycareFights", "_daycareNap", "_daycareSpa", "_daycareToday", "_defectiveTokenChecked", "_defectiveTokenUsed", "_dinseyGarbageDisposed", "_discoKnife", "_distentionPillUsed", "_dnaHybrid", "_docClocksThymeCocktailDrunk", "_drippingHallDoor1", "_drippingHallDoor2", "_drippingHallDoor3", "_drippingHallDoor4", "_drippyCaviarUsed", "_drippyNuggetUsed", "_drippyPilsnerUsed", "_drippyPlumUsed", "_drippyWineUsed", "_eldritchHorrorEvoked", "_eldritchTentacleFought", "_entauntaunedToday", "_envyfishEggUsed", "_epicMcTwistUsed", "_essentialTofuUsed", "_etchedHourglassUsed", "_eternalCarBatteryUsed", "_everfullGlassUsed", "_eyeAndATwistUsed", "_fancyChessSetUsed", "_falloutShelterSpaUsed", "_fancyHotDogEaten", "_farmerItemsCollected", "_favoriteBirdVisited", "_firedJokestersGun", "_fireExtinguisherRefilled", "_fireStartingKitUsed", "_fireworksShop", "_fireworksShopHatBought", "_fireworksShopEquipmentBought", "_fireworkUsed", "_fishyPipeUsed", "_floundryItemCreated", "_floundryItemUsed", "_freePillKeeperUsed", "_frToday", "_fudgeSporkUsed", "_garbageItemChanged", "_gingerBiggerAlligators", "_gingerbreadCityToday", "_gingerbreadClockAdvanced", "_gingerbreadClockVisited", "_gingerbreadColumnDestroyed", "_gingerbreadMobHitUsed", "_glennGoldenDiceUsed", "_glitchItemImplemented", "_gnollEyeUsed", "_governmentPerDiemUsed", "_grimBuff", "_guildManualUsed", "_guzzlrQuestAbandoned", "_hardKnocksDiplomaUsed", "_hippyMeatCollected", "_hobbyHorseUsed", "_holidayFunUsed", "_holoWristCrystal", "_hotAirportToday", "_hungerSauceUsed", "_hyperinflatedSealLungUsed", "_iceHotelRoomsRaided", "_iceSculptureUsed", "_incredibleSelfEsteemCast", "_infernoDiscoVisited", "_internetDailyDungeonMalwareBought", "_internetGallonOfMilkBought", "_internetPlusOneBought", "_internetPrintScreenButtonBought", "_internetViralVideoBought", "_interviewIsabella", "_interviewMasquerade", "_interviewVlad", "_inquisitorsUnidentifiableObjectUsed", "_ironicMoustache", "_jackassPlumberGame", "_jarlsCheeseSummoned", "_jarlsCreamSummoned", "_jarlsDoughSummoned", "_jarlsEggsSummoned", "_jarlsFruitSummoned", "_jarlsMeatSummoned", "_jarlsPotatoSummoned", "_jarlsVeggiesSummoned", "_jingleBellUsed", "_jukebox", "_kgbFlywheelCharged", "_kgbLeftDrawerUsed", "_kgbOpened", "_kgbRightDrawerUsed", "_kolConSixPackUsed", "_kolhsCutButNotDried", "_kolhsIsskayLikeAnAshtray", "_kolhsPoeticallyLicenced", "_kolhsSchoolSpirited", "_kudzuSaladEaten", "_lastCombatLost", "_lastCombatWon", "_latteBanishUsed", "_latteCopyUsed", "_latteDrinkUsed", "_legendaryBeat", "_licenseToChillUsed", "_lodestoneUsed", "_lookingGlass", "_loveTunnelToday", "_loveTunnelUsed", "_luckyGoldRingVolcoino", "_lunchBreak", "_lupineHormonesUsed", "_lyleFavored", "_madLiquorDrunk", "_madTeaParty", "_mafiaMiddleFingerRingUsed", "_managerialManipulationUsed", "_mansquitoSerumUsed", "_mapToACandyRichBlockUsed", "_maydayDropped", "_mayoDeviceRented", "_mayoTankSoaked", "_meatballMachineUsed", "_meatifyMatterUsed", "_milkOfMagnesiumUsed", "_mimeArmyShotglassUsed", "_missGravesVermouthDrunk", "_missileLauncherUsed", "_molehillMountainUsed", "_momFoodReceived", "_mrBurnsgerEaten", "_muffinOrderedToday", "_mushroomGardenVisited", "_neverendingPartyToday", "_newYouQuestCompleted", "_olympicSwimmingPool", "_olympicSwimmingPoolItemFound", "_overflowingGiftBasketUsed", "_partyHard", "_pastaAdditive", "_perfectFreezeUsed", "_perfectlyFairCoinUsed", "_petePartyThrown", "_peteRiotIncited", "_photocopyUsed", "_pickyTweezersUsed", "_pingPongGame", "_pirateBellowUsed", "_pirateForkUsed", "_pixelOrbUsed", "_plumbersMushroomStewEaten", "_pneumaticityPotionUsed", "_portableSteamUnitUsed", "_pottedTeaTreeUsed", "_prToday", "_psychoJarFilled", "_psychoJarUsed", "_psychokineticHugUsed", "_rainStickUsed", "_redwoodRainStickUsed", "_replicaSnowconeTomeUsed", "_replicaResolutionLibramUsed", "_replicaSmithsTomeUsed", "_requestSandwichSucceeded", "_rhinestonesAcquired", "_seaJellyHarvested", "_setOfJacksUsed", "_sewingKitUsed", "_sexChanged", "_shadowAffinityToday", "_shadowForestLooted", "_shrubDecorated", "_silverDreadFlaskUsed", "_sitCourseCompleted", "_skateBuff1", "_skateBuff2", "_skateBuff3", "_skateBuff4", "_skateBuff5", "_sleazeAirportToday", "_sobrieTeaUsed", "_softwareGlitchTurnReceived", "_sotParcelReturned", "_spacegateMurderbot", "_spacegateRuins", "_spacegateSpant", "_spacegateToday", "_spacegateVaccine", "_spaghettiBreakfast", "_spaghettiBreakfastEaten", "_spinmasterLatheVisited", "_spinningWheel", "_spookyAirportToday", "_stabonicScrollUsed", "_steelyEyedSquintUsed", "_stenchAirportToday", "_stinkyCheeseBanisherUsed", "_strangeStalagmiteUsed", "_streamsCrossed", "_stuffedPocketwatchUsed", "_styxSprayUsed", "_summonAnnoyanceUsed", "_summonCarrotUsed", "_summonResortPassUsed", "_sweetToothUsed", "_syntheticDogHairPillUsed", "_tacoFlierUsed", "_telegraphOfficeToday", "_templeHiddenPower", "_tempuraAirUsed", "_thesisDelivered", "_timeSpinnerReplicatorUsed", "_toastSummoned", "_tonicDjinn", "_treasuryEliteMeatCollected", "_treasuryHaremMeatCollected", "_trivialAvocationsGame", "_tryptophanDartUsed", "_turtlePowerCast", "_twelveNightEnergyUsed", "_ultraMegaSourBallUsed", "_victorSpoilsUsed", "_villainLairCanLidUsed", "_villainLairColorChoiceUsed", "_villainLairDoorChoiceUsed", "_villainLairFirecrackerUsed", "_villainLairSymbologyChoiceUsed", "_villainLairWebUsed", "_vmaskBanisherUsed", "_voraciTeaUsed", "_volcanoItemRedeemed", "_volcanoSuperduperheatedMetal", "_voteToday", "_VYKEACafeteriaRaided", "_VYKEALoungeRaided", "_walfordQuestStartedToday", "_warbearBankUsed", "_warbearBreakfastMachineUsed", "_warbearGyrocopterUsed", "_warbearSodaMachineUsed", "_wildfireBarrelHarvested", "_witchessBuff", "_workshedItemUsed", "_zombieClover", "_preventScurvy", "lockedItem4637", "lockedItem4638", "lockedItem4639", "lockedItem4646", "lockedItem4647", "unknownRecipe3542", "unknownRecipe3543", "unknownRecipe3544", "unknownRecipe3545", "unknownRecipe3546", "unknownRecipe3547", "unknownRecipe3548", "unknownRecipe3749", "unknownRecipe3751", "unknownRecipe4172", "unknownRecipe4173", "unknownRecipe4174", "unknownRecipe5060", "unknownRecipe5061", "unknownRecipe5062", "unknownRecipe5063", "unknownRecipe5064", "unknownRecipe5066", "unknownRecipe5067", "unknownRecipe5069", "unknownRecipe5070", "unknownRecipe5072", "unknownRecipe5073", "unknownRecipe5670", "unknownRecipe5671", "unknownRecipe6501", "unknownRecipe6564", "unknownRecipe6565", "unknownRecipe6566", "unknownRecipe6567", "unknownRecipe6568", "unknownRecipe6569", "unknownRecipe6570", "unknownRecipe6571", "unknownRecipe6572", "unknownRecipe6573", "unknownRecipe6574", "unknownRecipe6575", "unknownRecipe6576", "unknownRecipe6577", "unknownRecipe6578", "unknownRecipe7752", "unknownRecipe7753", "unknownRecipe7754", "unknownRecipe7755", "unknownRecipe7756", "unknownRecipe7757", "unknownRecipe7758", "unknownRecipe10970", "unknownRecipe10971", "unknownRecipe10972", "unknownRecipe10973", "unknownRecipe10974", "unknownRecipe10975", "unknownRecipe10976", "unknownRecipe10977", "unknownRecipe10978", "unknownRecipe10988", "unknownRecipe10989", "unknownRecipe10990", "unknownRecipe10991", "unknownRecipe10992", "unknownRecipe11000"] as const;
+export const booleanProperties = ["abortOnChoiceWhenNotInChoice", "addChatCommandLine", "addCreationQueue", "addStatusBarToFrames", "allowCloseableDesktopTabs", "allowNegativeTally", "allowNonMoodBurning", "allowSummonBurning", "autoHighlightOnFocus", "broadcastEvents", "cacheMallSearches", "chatBeep", "chatLinksUseRelay", "compactChessboard", "copyAsHTML", "customizedTabs", "debugBuy", "debugConsequences", "debugFoxtrotRemoval", "debugPathnames", "debugTopMenuStyle", "gapProtection", "gitInstallDependencies", "gitShowCommitMessages", "gitUpdateOnLogin", "greenScreenProtection", "guiUsesOneWindow", "hideServerDebugText", "logAcquiredItems", "logBattleAction", "logBrowserInteractions", "logChatMessages", "logChatRequests", "logCleanedHTML", "logDecoratedResponses", "logFamiliarActions", "logGainMessages", "logReadableHTML", "logPreferenceChange", "logMonsterHealth", "logReverseOrder", "logStatGains", "logStatusEffects", "logStatusOnLogin", "macroDebug", "macroLens", "mementoListActive", "mergeHobopolisChat", "pingLogin", "pingStealthyTimein", "printStackOnAbort", "proxySet", "relayAddSounds", "relayAddsCustomCombat", "relayAddsDiscoHelper", "relayAddsGraphicalCLI", "relayAddsQuickScripts", "relayAddsRestoreLinks", "relayAddsUpArrowLinks", "relayAddsUseLinks", "relayAddsWikiLinks", "relayAllowRemoteAccess", "relayBrowserOnly", "relayCacheUncacheable", "relayFormatsChatText", "relayHidesJunkMallItems", "relayMaintainsEffects", "relayMaintainsHealth", "relayMaintainsMana", "relayOverridesImages", "relayRunsAfterAdventureScript", "relayRunsBeforeBattleScript", "relayRunsBeforePVPScript", "relayScriptButtonFirst", "relayTextualizesEffects", "relayTrimsZapList", "relayUsesInlineLinks", "relayUsesIntegratedChat", "relayWarnOnRecoverFailure", "removeMalignantEffects", "saveSettingsOnSet", "sharePriceData", "showAllRequests", "showExceptionalRequests", "stealthLogin", "svnAlwaysAdd", "svnAlwaysOverwrite", "svnInstallDependencies", "svnShowCommitMessages", "svnUpdateOnLogin", "switchEquipmentForBuffs", "syncAfterSvnUpdate", "useChatToolbar", "useContactsFrame", "useDevServer", "useDockIconBadge", "useHugglerChannel", "useImageCache", "useLastUserAgent", "useSystemTrayIcon", "useTabbedChatFrame", "useToolbars", "useCachedVolcanoMaps", "useZoneComboBox", "verboseSpeakeasy", "verboseFloundry", "wrapLongLines", "_gitUpdated", "_svnRepoFileFetched", "_svnUpdated", "antagonisticSnowmanKitAvailable", "arcadeGameHints", "armoryUnlocked", "autoForbidIgnoringStores", "autoCraft", "autoQuest", "autoEntangle", "autoGarish", "autoManaRestore", "autoFillMayoMinder", "autoPinkyRing", "autoPlantHardcore", "autoPlantSoftcore", "autoPotionID", "autoRepairBoxServants", "autoSatisfyWithCloset", "autoSatisfyWithCoinmasters", "autoSatisfyWithMall", "autoSatisfyWithNPCs", "autoSatisfyWithStash", "autoSatisfyWithStorage", "autoSetConditions", "autoSteal", "autoTuxedo", "backupCameraReverserEnabled", "badMoonEncounter01", "badMoonEncounter02", "badMoonEncounter03", "badMoonEncounter04", "badMoonEncounter05", "badMoonEncounter06", "badMoonEncounter07", "badMoonEncounter08", "badMoonEncounter09", "badMoonEncounter10", "badMoonEncounter11", "badMoonEncounter12", "badMoonEncounter13", "badMoonEncounter14", "badMoonEncounter15", "badMoonEncounter16", "badMoonEncounter17", "badMoonEncounter18", "badMoonEncounter19", "badMoonEncounter20", "badMoonEncounter21", "badMoonEncounter22", "badMoonEncounter23", "badMoonEncounter24", "badMoonEncounter25", "badMoonEncounter26", "badMoonEncounter27", "badMoonEncounter28", "badMoonEncounter29", "badMoonEncounter30", "badMoonEncounter31", "badMoonEncounter32", "badMoonEncounter33", "badMoonEncounter34", "badMoonEncounter35", "badMoonEncounter36", "badMoonEncounter37", "badMoonEncounter38", "badMoonEncounter39", "badMoonEncounter40", "badMoonEncounter41", "badMoonEncounter42", "badMoonEncounter43", "badMoonEncounter44", "badMoonEncounter45", "badMoonEncounter46", "badMoonEncounter47", "badMoonEncounter48", "barrelShrineUnlocked", "bigBrotherRescued", "blackBartsBootyAvailable", "bondAdv", "bondBeach", "bondBeat", "bondBooze", "bondBridge", "bondDesert", "bondDR", "bondDrunk1", "bondDrunk2", "bondHoney", "bondHP", "bondInit", "bondItem1", "bondItem2", "bondItem3", "bondJetpack", "bondMartiniDelivery", "bondMartiniPlus", "bondMartiniTurn", "bondMeat", "bondMox1", "bondMox2", "bondMPregen", "bondMus1", "bondMus2", "bondMys1", "bondMys2", "bondSpleen", "bondStat", "bondStat2", "bondStealth", "bondStealth2", "bondSymbols", "bondWar", "bondWeapon2", "bondWpn", "booPeakLit", "bootsCharged", "breakfastCompleted", "burrowgrubHiveUsed", "calzoneOfLegendEaten", "candyCaneSwordApartmentBuilding", "candyCaneSwordBlackForest", "candyCaneSwordBowlingAlley", "candyCaneSwordCopperheadClub", "candyCaneSwordDailyDungeon", "candyCaneSwordDefiledCranny", "candyCaneSwordFunHouse", "candyCaneSwordShore", "candyCaneSwordWarFratRoom", "candyCaneSwordWarFratZetas", "candyCaneSwordWarHippyBait", "candyCaneSwordWarHippyLine", "canteenUnlocked", "chaosButterflyThrown", "chatbotScriptExecuted", "chateauAvailable", "chatLiterate", "chatServesUpdates", "checkJackassHardcore", "checkJackassSoftcore", "clanAttacksEnabled", "coldAirportAlways", "considerShadowNoodles", "controlRoomUnlock", "concertVisited", "controlPanel1", "controlPanel2", "controlPanel3", "controlPanel4", "controlPanel5", "controlPanel6", "controlPanel7", "controlPanel8", "controlPanel9", "corralUnlocked", "crimbo23ArmoryAtWar", "crimbo23BarAtWar", "crimbo23CafeAtWar", "crimbo23CottageAtWar", "crimbo23FoundryAtWar", "dailyDungeonDone", "dampOldBootPurchased", "daycareOpen", "deepDishOfLegendEaten", "demonSummoned", "dinseyAudienceEngagement", "dinseyGarbagePirate", "dinseyRapidPassEnabled", "dinseyRollercoasterNext", "dinseySafetyProtocolsLoose", "doghouseBoarded", "dontStopForCounters", "drippingHallUnlocked", "drippyShieldUnlocked", "edUsedLash", "eldritchFissureAvailable", "eldritchHorrorAvailable", "errorOnAmbiguousFold", "essenceOfAnnoyanceAvailable", "essenceOfBearAvailable", "expressCardUsed", "falloutShelterChronoUsed", "falloutShelterCoolingTankUsed", "fireExtinguisherBatHoleUsed", "fireExtinguisherChasmUsed", "fireExtinguisherCyrptUsed", "fireExtinguisherDesertUsed", "fireExtinguisherHaremUsed", "fistTeachingsHaikuDungeon", "fistTeachingsPokerRoom", "fistTeachingsBarroomBrawl", "fistTeachingsConservatory", "fistTeachingsBatHole", "fistTeachingsFunHouse", "fistTeachingsMenagerie", "fistTeachingsSlums", "fistTeachingsFratHouse", "fistTeachingsRoad", "fistTeachingsNinjaSnowmen", "flickeringPixel1", "flickeringPixel2", "flickeringPixel3", "flickeringPixel4", "flickeringPixel5", "flickeringPixel6", "flickeringPixel7", "flickeringPixel8", "floristFriarAvailable", "floristFriarChecked", "frAlways", "frCemetaryUnlocked", "friarsBlessingReceived", "frMountainsUnlocked", "frSwampUnlocked", "frVillageUnlocked", "frWoodUnlocked", "getawayCampsiteUnlocked", "ghostPencil1", "ghostPencil2", "ghostPencil3", "ghostPencil4", "ghostPencil5", "ghostPencil6", "ghostPencil7", "ghostPencil8", "ghostPencil9", "gingerAdvanceClockUnlocked", "gingerBlackmailAccomplished", "gingerbreadCityAvailable", "gingerExtraAdventures", "gingerNegativesDropped", "gingerSewersUnlocked", "gingerSubwayLineUnlocked", "gingerRetailUnlocked", "glitchItemAvailable", "grabCloversHardcore", "grabCloversSoftcore", "guideToSafariAvailable", "guyMadeOfBeesDefeated", "hallowienerDefiledNook", "hallowienerGuanoJunction", "hallowienerKnollGym", "hallowienerMadnessBakery", "hallowienerMiddleChamber", "hallowienerOvergrownLot", "hallowienerSkeletonStore", "hallowienerSmutOrcs", "hallowienerSonofaBeach", "hallowienerVolcoino", "hardcorePVPWarning", "harvestBatteriesHardcore", "harvestBatteriesSoftcore", "hasAutumnaton", "hasBartender", "hasChef", "hasCocktailKit", "hasCosmicBowlingBall", "hasDetectiveSchool", "hasMaydayContract", "hasOven", "hasRange", "hasShaker", "hasSushiMat", "hasTwinkleVision", "haveBoxingDaydreamHardcore", "haveBoxingDaydreamSoftcore", "hermitHax0red", "holidayHalsBookAvailable", "horseryAvailable", "hotAirportAlways", "implementGlitchItem", "intenseCurrents", "itemBoughtPerAscension637", "itemBoughtPerAscension8266", "itemBoughtPerAscension10790", "itemBoughtPerAscension10794", "itemBoughtPerAscension10795", "itemBoughtPerCharacter6423", "itemBoughtPerCharacter6428", "itemBoughtPerCharacter6429", "kingLiberated", "lastPirateInsult1", "lastPirateInsult2", "lastPirateInsult3", "lastPirateInsult4", "lastPirateInsult5", "lastPirateInsult6", "lastPirateInsult7", "lastPirateInsult8", "lawOfAveragesAvailable", "leafletCompleted", "ledCandleDropped", "libraryCardUsed", "lockPicked", "logBastilleBattalionBattles", "loginRecoveryHardcore", "loginRecoverySoftcore", "lovebugsUnlocked", "loveTunnelAvailable", "lowerChamberUnlock", "madnessBakeryAvailable", "makePocketWishesHardcore", "makePocketWishesSoftcore", "manualOfNumberologyAvailable", "mappingMonsters", "mapToAnemoneMinePurchased", "mapToKokomoAvailable", "mapToMadnessReefPurchased", "mapToTheDiveBarPurchased", "mapToTheMarinaraTrenchPurchased", "mapToTheSkateParkPurchased", "maraisBeaverUnlock", "maraisCorpseUnlock", "maraisDarkUnlock", "maraisVillageUnlock", "maraisWildlifeUnlock", "maraisWizardUnlock", "maximizerAlwaysCurrent", "maximizerCreateOnHand", "maximizerCurrentMallPrices", "maximizerFoldables", "maximizerIncludeAll", "maximizerNoAdventures", "middleChamberUnlock", "milkOfMagnesiumActive", "moonTuned", "neverendingPartyAlways", "noncombatForcerActive", "oasisAvailable", "odeBuffbotCheck", "oilPeakLit", "oscusSodaUsed", "outrageousSombreroUsed", "overgrownLotAvailable", "ownsFloristFriar", "ownsSpeakeasy", "pathedSummonsHardcore", "pathedSummonsSoftcore", "pizzaOfLegendEaten", "popularTartUnlocked", "potatoAlarmClockUsed", "prAlways", "prayedForGlamour", "prayedForProtection", "prayedForVigor", "primaryLabCheerCoreGrabbed", "pyramidBombUsed", "rageGlandVented", "readManualHardcore", "readManualSoftcore", "relayShowSpoilers", "relayShowWarnings", "rememberDesktopSize", "replicaChateauAvailable", "replicaNeverendingPartyAlways", "replicaWitchessSetAvailable", "requireBoxServants", "requireSewerTestItems", "restUsingCampAwayTent", "restUsingChateau", "ROMOfOptimalityAvailable", "safePickpocket", "schoolOfHardKnocksDiplomaAvailable", "scriptCascadingMenus", "serverAddsCustomCombat", "SHAWARMAInitiativeUnlocked", "showForbiddenStores", "showGainsPerUnit", "showIgnoringStorePrices", "showNoSummonOnly", "showTurnFreeOnly", "skeletonStoreAvailable", "sleazeAirportAlways", "snojoAvailable", "sortByEffect", "sortByRoom", "spacegateAlways", "spacegateVaccine1", "spacegateVaccine2", "spacegateVaccine3", "spaceInvaderDefeated", "spelunkyHints", "spiceMelangeUsed", "spookyAirportAlways", "stenchAirportAlways", "stopForFixedWanderer", "stopForUltraRare", "styxPixieVisited", "superconductorDefeated", "suppressInappropriateNags", "suppressPowerPixellation", "suppressMallPriceCacheMessages", "telegraphOfficeAvailable", "telescopeLookedHigh", "timeTowerAvailable", "trackLightsOut", "uneffectWithHotTub", "universalSeasoningActive", "universalSeasoningAvailable", "useBookOfEverySkillHardcore", "useBookOfEverySkillSoftcore", "useCrimboToysHardcore", "useCrimboToysSoftcore", "verboseMaximizer", "visitLoungeHardcore", "visitLoungeSoftcore", "visitRumpusHardcore", "visitRumpusSoftcore", "voteAlways", "wildfireBarrelCaulked", "wildfireDusted", "wildfireFracked", "wildfirePumpGreased", "wildfireSprinkled", "yearbookCameraPending", "youRobotScavenged", "_2002MrStoreCreditsCollected", "_affirmationCookieEaten", "_affirmationHateUsed", "_airFryerUsed", "_akgyxothUsed", "_alienAnimalMilkUsed", "_alienPlantPodUsed", "_allYearSucker", "_aprilShower", "_armyToddlerCast", "_aug1Cast", "_aug2Cast", "_aug3Cast", "_aug4Cast", "_aug5Cast", "_aug6Cast", "_aug7Cast", "_aug8Cast", "_aug9Cast", "_aug10Cast", "_aug11Cast", "_aug12Cast", "_aug13Cast", "_aug14Cast", "_aug15Cast", "_aug16Cast", "_aug17Cast", "_aug18Cast", "_aug19Cast", "_aug20Cast", "_aug21Cast", "_aug22Cast", "_aug23Cast", "_aug24Cast", "_aug25Cast", "_aug26Cast", "_aug27Cast", "_aug28Cast", "_aug29Cast", "_aug30Cast", "_aug31Cast", "_augTodayCast", "_authorsInkUsed", "_baconMachineUsed", "_bagOfCandy", "_bagOfCandyUsed", "_bagOTricksUsed", "_ballastTurtleUsed", "_ballInACupUsed", "_ballpit", "_barrelPrayer", "_bastilleLastBattleWon", "_beachCombing", "_bendHellUsed", "_blackMonolithUsed", "_blankoutUsed", "_bonersSummoned", "_bookOfEverySkillUsed", "_borrowedTimeUsed", "_bowleggedSwaggerUsed", "_bowlFullOfJellyUsed", "_boxOfHammersUsed", "_brainPreservationFluidUsed", "_brassDreadFlaskUsed", "_cameraUsed", "_canSeekBirds", "_candyCaneSwordBackAlley", "_candyCaneSwordHauntedBedroom", "_candyCaneSwordHauntedLibrary", "_candyCaneSwordLyle", "_candyCaneSwordMadnessBakery", "_candyCaneSwordOvergrownLot", "_candyCaneSwordOvergrownShrine", "_candyCaneSwordPalindome", "_candyCaneSwordSouthOfTheBorder", "_candyCaneSwordSpookyForest", "_carboLoaded", "_cargoPocketEmptied", "_ceciHatUsed", "_chateauDeskHarvested", "_chateauMonsterFought", "_chibiChanged", "_chronerCrossUsed", "_chronerTriggerUsed", "_chubbyAndPlumpUsed", "_circadianRhythmsRecalled", "_circleDrumUsed", "_clanFortuneBuffUsed", "_claraBellUsed", "_coalPaperweightUsed", "_cocoaDispenserUsed", "_cocktailShakerUsed", "_coldAirportToday", "_coldOne", "_communismUsed", "_confusingLEDClockUsed", "_controlPanelUsed", "_cookbookbatRecipeDrops", "_corruptedStardustUsed", "_cosmicSixPackConjured", "_crappyCameraUsed", "_creepyVoodooDollUsed", "_crimboTraining", "_crimboTree", "_cursedKegUsed", "_cursedMicrowaveUsed", "_dailyDungeonMalwareUsed", "_darkChocolateHeart", "_daycareFights", "_daycareNap", "_daycareSpa", "_daycareToday", "_defectiveTokenChecked", "_defectiveTokenUsed", "_dinseyGarbageDisposed", "_discoKnife", "_distentionPillUsed", "_dnaHybrid", "_docClocksThymeCocktailDrunk", "_drippingHallDoor1", "_drippingHallDoor2", "_drippingHallDoor3", "_drippingHallDoor4", "_drippyCaviarUsed", "_drippyNuggetUsed", "_drippyPilsnerUsed", "_drippyPlumUsed", "_drippyWineUsed", "_eldritchHorrorEvoked", "_eldritchTentacleFought", "_entauntaunedToday", "_envyfishEggUsed", "_epicMcTwistUsed", "_essentialTofuUsed", "_etchedHourglassUsed", "_eternalCarBatteryUsed", "_everfullGlassUsed", "_extraGreasySliderEaten", "_eyeAndATwistUsed", "_fancyChessSetUsed", "_falloutShelterSpaUsed", "_fancyHotDogEaten", "_farmerItemsCollected", "_favoriteBirdVisited", "_firedJokestersGun", "_fireExtinguisherRefilled", "_fireStartingKitUsed", "_fireworksShop", "_fireworksShopHatBought", "_fireworksShopEquipmentBought", "_fireworkUsed", "_fishyPipeUsed", "_floundryItemCreated", "_floundryItemUsed", "_freePillKeeperUsed", "_frToday", "_frostyMugUsed", "_fudgeSporkUsed", "_garbageItemChanged", "_gingerBiggerAlligators", "_gingerbreadCityToday", "_gingerbreadClockAdvanced", "_gingerbreadClockVisited", "_gingerbreadColumnDestroyed", "_gingerbreadMobHitUsed", "_glennGoldenDiceUsed", "_glitchItemImplemented", "_gnollEyeUsed", "_governmentPerDiemUsed", "_grimBuff", "_guildManualUsed", "_guzzlrQuestAbandoned", "_hardKnocksDiplomaUsed", "_hippyMeatCollected", "_hobbyHorseUsed", "_hodgmansBlanketDrunk", "_holidayFunUsed", "_holoWristCrystal", "_hotAirportToday", "_hungerSauceUsed", "_hyperinflatedSealLungUsed", "_iceHotelRoomsRaided", "_iceSculptureUsed", "_incredibleSelfEsteemCast", "_infernoDiscoVisited", "_internetDailyDungeonMalwareBought", "_internetGallonOfMilkBought", "_internetPlusOneBought", "_internetPrintScreenButtonBought", "_internetViralVideoBought", "_interviewIsabella", "_interviewMasquerade", "_interviewVlad", "_inquisitorsUnidentifiableObjectUsed", "_ironicMoustache", "_jackassPlumberGame", "_jarlsCheeseSummoned", "_jarlsCreamSummoned", "_jarlsDoughSummoned", "_jarlsEggsSummoned", "_jarlsFruitSummoned", "_jarlsMeatSummoned", "_jarlsPotatoSummoned", "_jarlsVeggiesSummoned", "_jingleBellUsed", "_jukebox", "_kgbFlywheelCharged", "_kgbLeftDrawerUsed", "_kgbOpened", "_kgbRightDrawerUsed", "_kolConSixPackUsed", "_kolhsCutButNotDried", "_kolhsIsskayLikeAnAshtray", "_kolhsPoeticallyLicenced", "_kolhsSchoolSpirited", "_kudzuSaladEaten", "_lastCombatLost", "_lastCombatWon", "_latteBanishUsed", "_latteCopyUsed", "_latteDrinkUsed", "_leafAntEggCrafted", "_leafDayShortenerCrafted", "_leafTattooCrafted", "_leavesJumped", "_legendaryBeat", "_licenseToChillUsed", "_lodestoneUsed", "_lookingGlass", "_loveTunnelToday", "_loveTunnelUsed", "_luckyGoldRingVolcoino", "_lunchBreak", "_lupineHormonesUsed", "_lyleFavored", "_madLiquorDrunk", "_madTeaParty", "_mafiaMiddleFingerRingUsed", "_managerialManipulationUsed", "_mansquitoSerumUsed", "_mapToACandyRichBlockUsed", "_maydayDropped", "_mayoDeviceRented", "_mayoTankSoaked", "_meatballMachineUsed", "_meatifyMatterUsed", "_milkOfMagnesiumUsed", "_mimeArmyShotglassUsed", "_missGravesVermouthDrunk", "_missileLauncherUsed", "_molehillMountainUsed", "_momFoodReceived", "_mrBurnsgerEaten", "_muffinOrderedToday", "_mulliganStewEaten", "_mushroomGardenVisited", "_neverendingPartyToday", "_newYouQuestCompleted", "_olympicSwimmingPool", "_olympicSwimmingPoolItemFound", "_overflowingGiftBasketUsed", "_partyHard", "_pastaAdditive", "_perfectFreezeUsed", "_perfectlyFairCoinUsed", "_petePartyThrown", "_peteRiotIncited", "_photocopyUsed", "_pickyTweezersUsed", "_pickleJuiceDrunk", "_pingPongGame", "_pirateBellowUsed", "_pirateForkUsed", "_pixelOrbUsed", "_plumbersMushroomStewEaten", "_pneumaticityPotionUsed", "_portableSteamUnitUsed", "_pottedTeaTreeUsed", "_prToday", "_psychoJarFilled", "_psychoJarUsed", "_psychokineticHugUsed", "_punchingMirrorUsed", "_rainStickUsed", "_redwoodRainStickUsed", "_replicaSnowconeTomeUsed", "_replicaResolutionLibramUsed", "_replicaSmithsTomeUsed", "_requestSandwichSucceeded", "_rhinestonesAcquired", "_saladForkUsed", "_seaJellyHarvested", "_setOfJacksUsed", "_sewingKitUsed", "_sexChanged", "_shadowAffinityToday", "_shadowForestLooted", "_shrubDecorated", "_silverDreadFlaskUsed", "_sitCourseCompleted", "_skateBuff1", "_skateBuff2", "_skateBuff3", "_skateBuff4", "_skateBuff5", "_sleazeAirportToday", "_snowballFactoryUsed", "_sobrieTeaUsed", "_softwareGlitchTurnReceived", "_sotParcelReturned", "_spacegateMurderbot", "_spacegateRuins", "_spacegateSpant", "_spacegateToday", "_spacegateVaccine", "_spaghettiBreakfast", "_spaghettiBreakfastEaten", "_spinmasterLatheVisited", "_spinningWheel", "_spookyAirportToday", "_stabonicScrollUsed", "_steelyEyedSquintUsed", "_stenchAirportToday", "_stinkyCheeseBanisherUsed", "_strangeStalagmiteUsed", "_streamsCrossed", "_stuffedPocketwatchUsed", "_styxSprayUsed", "_summonAnnoyanceUsed", "_summonCarrotUsed", "_summonResortPassUsed", "_sweetToothUsed", "_syntheticDogHairPillUsed", "_tacoFlierUsed", "_telegraphOfficeToday", "_templeHiddenPower", "_tempuraAirUsed", "_thesisDelivered", "_tiedUpFlamingLeafletFought", "_tiedUpFlamingMonsteraFought", "_tiedUpLeaviathanFought", "_timeSpinnerReplicatorUsed", "_toastSummoned", "_tonicDjinn", "_treasuryEliteMeatCollected", "_treasuryHaremMeatCollected", "_trivialAvocationsGame", "_tryptophanDartUsed", "_turtlePowerCast", "_twelveNightEnergyUsed", "_ultraMegaSourBallUsed", "_victorSpoilsUsed", "_villainLairCanLidUsed", "_villainLairColorChoiceUsed", "_villainLairDoorChoiceUsed", "_villainLairFirecrackerUsed", "_villainLairSymbologyChoiceUsed", "_villainLairWebUsed", "_vmaskBanisherUsed", "_voraciTeaUsed", "_volcanoItemRedeemed", "_volcanoSuperduperheatedMetal", "_voodooSnuffUsed", "_voteToday", "_VYKEACafeteriaRaided", "_VYKEALoungeRaided", "_walfordQuestStartedToday", "_warbearBankUsed", "_warbearBreakfastMachineUsed", "_warbearGyrocopterUsed", "_warbearSodaMachineUsed", "_wildfireBarrelHarvested", "_witchessBuff", "_workshedItemUsed", "_zombieClover", "_preventScurvy", "lockedItem4637", "lockedItem4638", "lockedItem4639", "lockedItem4646", "lockedItem4647", "unknownRecipe3542", "unknownRecipe3543", "unknownRecipe3544", "unknownRecipe3545", "unknownRecipe3546", "unknownRecipe3547", "unknownRecipe3548", "unknownRecipe3749", "unknownRecipe3751", "unknownRecipe4172", "unknownRecipe4173", "unknownRecipe4174", "unknownRecipe5060", "unknownRecipe5061", "unknownRecipe5062", "unknownRecipe5063", "unknownRecipe5064", "unknownRecipe5066", "unknownRecipe5067", "unknownRecipe5069", "unknownRecipe5070", "unknownRecipe5072", "unknownRecipe5073", "unknownRecipe5670", "unknownRecipe5671", "unknownRecipe6501", "unknownRecipe6564", "unknownRecipe6565", "unknownRecipe6566", "unknownRecipe6567", "unknownRecipe6568", "unknownRecipe6569", "unknownRecipe6570", "unknownRecipe6571", "unknownRecipe6572", "unknownRecipe6573", "unknownRecipe6574", "unknownRecipe6575", "unknownRecipe6576", "unknownRecipe6577", "unknownRecipe6578", "unknownRecipe7752", "unknownRecipe7753", "unknownRecipe7754", "unknownRecipe7755", "unknownRecipe7756", "unknownRecipe7757", "unknownRecipe7758", "unknownRecipe10970", "unknownRecipe10971", "unknownRecipe10972", "unknownRecipe10973", "unknownRecipe10974", "unknownRecipe10975", "unknownRecipe10976", "unknownRecipe10977", "unknownRecipe10978", "unknownRecipe10988", "unknownRecipe10989", "unknownRecipe10990", "unknownRecipe10991", "unknownRecipe10992", "unknownRecipe11000"] as const;
export type BooleanProperty = typeof booleanProperties[number];
-export const numericProperties = ["coinMasterIndex", "dailyDeedsVersion", "defaultDropdown1", "defaultDropdown2", "defaultDropdownSplit", "defaultLimit", "fixedThreadPoolSize", "itemManagerIndex", "lastBuffRequestType", "lastGlobalCounterDay", "lastImageCacheClear", "pingDefaultTestPings", "pingLoginCount", "pingLoginGoal", "pingLoginThreshold", "pingTestPings", "previousUpdateRevision", "relayDelayForSVN", "relaySkillButtonCount", "scriptButtonPosition", "statusDropdown", "svnThreadPoolSize", "toolbarPosition", "_beachTides", "_g9Effect", "8BitBonusTurns", "8BitScore", "addingScrolls", "affirmationCookiesEaten", "aminoAcidsUsed", "antagonisticSnowmanKitCost", "ascensionsToday", "asolDeferredPoints", "asolPointsPigSkinner", "asolPointsCheeseWizard", "asolPointsJazzAgent", "autoAbortThreshold", "autoAntidote", "autoBuyPriceLimit", "autumnatonQuestTurn", "availableCandyCredits", "availableDimes", "availableFunPoints", "availableMrStore2002Credits", "availableQuarters", "availableStoreCredits", "availableSwagger", "averageSwagger", "awolMedicine", "awolPointsBeanslinger", "awolPointsCowpuncher", "awolPointsSnakeoiler", "awolDeferredPointsBeanslinger", "awolDeferredPointsCowpuncher", "awolDeferredPointsSnakeoiler", "awolVenom", "bagOTricksCharges", "ballpitBonus", "bankedKarma", "bartenderTurnsUsed", "basementMallPrices", "basementSafetyMargin", "batmanFundsAvailable", "batmanBonusInitialFunds", "batmanTimeLeft", "bearSwagger", "beeCounter", "beGregariousCharges", "beGregariousFightsLeft", "birdformCold", "birdformHot", "birdformRoc", "birdformSleaze", "birdformSpooky", "birdformStench", "blackBartsBootyCost", "blackPuddingsDefeated", "blackForestProgress", "blankOutUsed", "bloodweiserDrunk", "bondPoints", "bondVillainsDefeated", "boneAbacusVictories", "bookOfFactsGummi", "bookOfFactsPinata", "booPeakProgress", "borisPoints", "breakableHandling", "breakableHandling1964", "breakableHandling9691", "breakableHandling9692", "breakableHandling9699", "breathitinCharges", "brodenBacteria", "brodenSprinkles", "buffBotMessageDisposal", "buffBotPhilanthropyType", "buffJimmyIngredients", "burnoutsDefeated", "burrowgrubSummonsRemaining", "camelSpit", "camerasUsed", "campAwayDecoration", "candyWitchTurnsUsed", "candyWitchCandyTotal", "carboLoading", "catBurglarBankHeists", "cellarLayout", "charitableDonations", "chasmBridgeProgress", "chefTurnsUsed", "chessboardsCleared", "chibiAlignment", "chibiBirthday", "chibiFitness", "chibiIntelligence", "chibiLastVisit", "chibiSocialization", "chilledToTheBone", "cinchoSaltAndLime", "cinderellaMinutesToMidnight", "cinderellaScore", "cocktailSummons", "commerceGhostCombats", "controlPanelOmega", "cornucopiasOpened", "cosmicBowlingBallReturnCombats", "cozyCounter6332", "cozyCounter6333", "cozyCounter6334", "craftingClay", "craftingLeather", "craftingStraw", "crimbo16BeardChakraCleanliness", "crimbo16BootsChakraCleanliness", "crimbo16BungChakraCleanliness", "crimbo16CrimboHatChakraCleanliness", "crimbo16GutsChakraCleanliness", "crimbo16HatChakraCleanliness", "crimbo16JellyChakraCleanliness", "crimbo16LiverChakraCleanliness", "crimbo16NippleChakraCleanliness", "crimbo16NoseChakraCleanliness", "crimbo16ReindeerChakraCleanliness", "crimbo16SackChakraCleanliness", "crimboTrainingSkill", "crimboTreeDays", "cubelingProgress", "currentExtremity", "currentHedgeMazeRoom", "currentMojoFilters", "currentNunneryMeat", "currentPortalEnergy", "currentReplicaStoreYear", "cursedMagnifyingGlassCount", "cyrptAlcoveEvilness", "cyrptCrannyEvilness", "cyrptNicheEvilness", "cyrptNookEvilness", "cyrptTotalEvilness", "darkGyfftePoints", "daycareEquipment", "daycareInstructors", "daycareLastScavenge", "daycareToddlers", "dbNemesisSkill1", "dbNemesisSkill2", "dbNemesisSkill3", "desertExploration", "desktopHeight", "desktopWidth", "dinseyFilthLevel", "dinseyFunProgress", "dinseyNastyBearsDefeated", "dinseySocialJusticeIProgress", "dinseySocialJusticeIIProgress", "dinseyTouristsFed", "dinseyToxicMultiplier", "doctorBagQuestLights", "doctorBagUpgrades", "dreadScroll1", "dreadScroll2", "dreadScroll3", "dreadScroll4", "dreadScroll5", "dreadScroll6", "dreadScroll7", "dreadScroll8", "dripAdventuresSinceAscension", "drippingHallAdventuresSinceAscension", "drippingTreesAdventuresSinceAscension", "drippyBatsUnlocked", "drippyJuice", "drippyOrbsClaimed", "drunkenSwagger", "edDefeatAbort", "edPoints", "eldritchTentaclesFought", "electricKoolAidEaten", "elfGratitude", "encountersUntilDMTChoice", "encountersUntilYachtzeeChoice", "encountersUntilNEPChoice", "encountersUntilSRChoice", "ensorceleeLevel", "entauntaunedColdRes", "essenceOfAnnoyanceCost", "essenceOfBearCost", "extraRolloverAdventures", "falloutShelterLevel", "familiarSweat", "fingernailsClipped", "fistSkillsKnown", "flyeredML", "fossilB", "fossilD", "fossilN", "fossilP", "fossilS", "fossilW", "fratboysDefeated", "frenchGuardTurtlesFreed", "funGuyMansionKills", "garbageChampagneCharge", "garbageFireProgress", "garbageShirtCharge", "garbageTreeCharge", "garlandUpgrades", "getsYouDrunkTurnsLeft", "ghostPepperTurnsLeft", "gingerDigCount", "gingerLawChoice", "gingerMuscleChoice", "gingerTrainScheduleStudies", "gladiatorBallMovesKnown", "gladiatorBladeMovesKnown", "gladiatorNetMovesKnown", "glitchItemCost", "glitchItemImplementationCount", "glitchItemImplementationLevel", "glitchSwagger", "gloverPoints", "gnasirProgress", "goldenMrAccessories", "gongPath", "gooseDronesRemaining", "goreCollected", "gourdItemCount", "greyYouPoints", "grimoire1Summons", "grimoire2Summons", "grimoire3Summons", "grimstoneCharge", "guardTurtlesFreed", "guideToSafariCost", "guyMadeOfBeesCount", "guzzlrBronzeDeliveries", "guzzlrDeliveryProgress", "guzzlrGoldDeliveries", "guzzlrPlatinumDeliveries", "haciendaLayout", "hallowiener8BitRealm", "hallowienerCoinspiracy", "hareMillisecondsSaved", "hareTurnsUsed", "heavyRainsStartingThunder", "heavyRainsStartingRain", "heavyRainsStartingLightning", "heroDonationBoris", "heroDonationJarlsberg", "heroDonationSneakyPete", "hiddenApartmentProgress", "hiddenBowlingAlleyProgress", "hiddenHospitalProgress", "hiddenOfficeProgress", "hiddenTavernUnlock", "highTopPumped", "hippiesDefeated", "holidayHalsBookCost", "holidaySwagger", "homemadeRobotUpgrades", "homebodylCharges", "hpAutoRecovery", "hpAutoRecoveryTarget", "iceSwagger", "jarlsbergPoints", "jungCharge", "junglePuns", "knownAscensions", "kolhsTotalSchoolSpirited", "lastAnticheeseDay", "lastArcadeAscension", "lastBadMoonReset", "lastBangPotionReset", "lastBattlefieldReset", "lastBeardBuff", "lastBreakfast", "lastCartographyBooPeak", "lastCartographyCastleTop", "lastCartographyDarkNeck", "lastCartographyDefiledNook", "lastCartographyFratHouse", "lastCartographyFratHouseVerge", "lastCartographyGuanoJunction", "lastCartographyHauntedBilliards", "lastCartographyHippyCampVerge", "lastCartographyZeppelinProtesters", "lastCastleGroundUnlock", "lastCastleTopUnlock", "lastCellarReset", "lastChanceThreshold", "lastChasmReset", "lastColosseumRoundWon", "lastCouncilVisit", "lastCounterDay", "lastDesertUnlock", "lastDispensaryOpen", "lastDMTDuplication", "lastDwarfFactoryReset", "lastEVHelmetValue", "lastEVHelmetReset", "lastEmptiedStorage", "lastFilthClearance", "lastGoofballBuy", "lastGuildStoreOpen", "lastGuyMadeOfBeesReset", "lastFratboyCall", "lastFriarCeremonyAscension", "lastFriarsElbowNC", "lastFriarsHeartNC", "lastFriarsNeckNC", "lastHippyCall", "lastIslandUnlock", "lastKeyotronUse", "lastKingLiberation", "lastLightsOutTurn", "lastMushroomPlot", "lastMiningReset", "lastNemesisReset", "lastPaperStripReset", "lastPirateEphemeraReset", "lastPirateInsultReset", "lastPlusSignUnlock", "lastQuartetAscension", "lastQuartetRequest", "lastSecondFloorUnlock", "lastShadowForgeUnlockAdventure", "lastSkateParkReset", "lastStillBeatingSpleen", "lastTavernAscension", "lastTavernSquare", "lastTelescopeReset", "lastTempleAdventures", "lastTempleButtonsUnlock", "lastTempleUnlock", "lastThingWithNoNameDefeated", "lastTowelAscension", "lastTr4pz0rQuest", "lastTrainsetConfiguration", "lastVioletFogMap", "lastVoteMonsterTurn", "lastWartDinseyDefeated", "lastWuTangDefeated", "lastYearbookCameraAscension", "lastZapperWand", "lastZapperWandExplosionDay", "lawOfAveragesCost", "legacyPoints", "libramSummons", "lightsOutAutomation", "louvreDesiredGoal", "louvreGoal", "lovebugsAridDesert", "lovebugsBeachBuck", "lovebugsBooze", "lovebugsChroner", "lovebugsCoinspiracy", "lovebugsCyrpt", "lovebugsFreddy", "lovebugsFunFunds", "lovebugsHoboNickel", "lovebugsItemDrop", "lovebugsMeat", "lovebugsMeatDrop", "lovebugsMoxie", "lovebugsMuscle", "lovebugsMysticality", "lovebugsOilPeak", "lovebugsOrcChasm", "lovebugsPowder", "lovebugsWalmart", "lttQuestDifficulty", "lttQuestStageCount", "manaBurnSummonThreshold", "manaBurningThreshold", "manaBurningTrigger", "manorDrawerCount", "manualOfNumberologyCost", "mapToKokomoCost", "masksUnlocked", "maximizerMRUSize", "maximizerCombinationLimit", "maximizerEquipmentLevel", "maximizerEquipmentScope", "maximizerMaxPrice", "maximizerPriceLevel", "maxManaBurn", "mayflyExperience", "mayoLevel", "meansuckerPrice", "merkinVocabularyMastery", "miniAdvClass", "miniMartinisDrunk", "moleTunnelLevel", "mothershipProgress", "mpAutoRecovery", "mpAutoRecoveryTarget", "munchiesPillsUsed", "mushroomGardenCropLevel", "nextParanormalActivity", "nextQuantumFamiliarOwnerId", "nextQuantumFamiliarTurn", "noobPoints", "noobDeferredPoints", "noodleSummons", "nsContestants1", "nsContestants2", "nsContestants3", "nuclearAutumnPoints", "numericSwagger", "nunsVisits", "oilPeakProgress", "optimalSwagger", "optimisticCandleProgress", "palindomeDudesDefeated", "parasolUsed", "pendingMapReflections", "pingpongSkill", "pirateSwagger", "plantingDay", "plumberBadgeCost", "plumberCostumeCost", "plumberPoints", "poolSharkCount", "poolSkill", "primaryLabGooIntensity", "prismaticSummons", "procrastinatorLanguageFluency", "promptAboutCrafting", "puzzleChampBonus", "pyramidPosition", "quantumPoints", "reagentSummons", "reanimatorArms", "reanimatorLegs", "reanimatorSkulls", "reanimatorWeirdParts", "reanimatorWings", "recentLocations", "redSnapperProgress", "relayPort", "relocatePygmyJanitor", "relocatePygmyLawyer", "rockinRobinProgress", "ROMOfOptimalityCost", "rumpelstiltskinKidsRescued", "rumpelstiltskinTurnsUsed", "rwbMonsterCount", "safariSwagger", "sausageGrinderUnits", "schoolOfHardKnocksDiplomaCost", "schoolSwagger", "scrapbookCharges", "screechCombats", "scriptMRULength", "seaodesFound", "SeasoningSwagger", "sexChanges", "shenInitiationDay", "shockingLickCharges", "singleFamiliarRun", "skillBurn3", "skillBurn90", "skillBurn153", "skillBurn154", "skillBurn155", "skillBurn1019", "skillBurn5017", "skillBurn6014", "skillBurn6015", "skillBurn6016", "skillBurn6020", "skillBurn6021", "skillBurn6022", "skillBurn6023", "skillBurn6024", "skillBurn6026", "skillBurn6028", "skillBurn7323", "skillBurn14008", "skillBurn14028", "skillBurn14038", "skillBurn15011", "skillBurn15028", "skillBurn17005", "skillBurn22034", "skillBurn22035", "skillBurn23301", "skillBurn23302", "skillBurn23303", "skillBurn23304", "skillBurn23305", "skillBurn23306", "skillLevel46", "skillLevel47", "skillLevel48", "skillLevel117", "skillLevel118", "skillLevel121", "skillLevel128", "skillLevel134", "skillLevel144", "skillLevel180", "skillLevel188", "skillLevel227", "skillLevel7254", "slimelingFullness", "slimelingStacksDropped", "slimelingStacksDue", "smoresEaten", "smutOrcNoncombatProgress", "sneakyPetePoints", "snojoMoxieWins", "snojoMuscleWins", "snojoMysticalityWins", "sourceAgentsDefeated", "sourceEnlightenment", "sourceInterval", "sourcePoints", "sourceTerminalGram", "sourceTerminalPram", "sourceTerminalSpam", "spaceBabyLanguageFluency", "spacePirateLanguageFluency", "spelunkyNextNoncombat", "spelunkySacrifices", "spelunkyWinCount", "spookyPuttyCopiesMade", "spookyVHSTapeMonsterTurn", "statbotUses", "sugarCounter4178", "sugarCounter4179", "sugarCounter4180", "sugarCounter4181", "sugarCounter4182", "sugarCounter4183", "sugarCounter4191", "summonAnnoyanceCost", "sweat", "tacoDanCocktailSauce", "tacoDanFishMeat", "tavernLayout", "telescopeUpgrades", "tempuraSummons", "timeSpinnerMedals", "timesRested", "tomeSummons", "totalCharitableDonations", "trainsetPosition", "turtleBlessingTurns", "twinPeakProgress", "twoCRSPoints", "unicornHornInflation", "universalSeasoningCost", "usable1HWeapons", "usable1xAccs", "usable2HWeapons", "usable3HWeapons", "usableAccessories", "usableHats", "usableOffhands", "usableOther", "usablePants", "usableShirts", "valueOfAdventure", "valueOfInventory", "valueOfStill", "valueOfTome", "vintnerCharge", "vintnerWineLevel", "violetFogGoal", "walfordBucketProgress", "warehouseProgress", "welcomeBackAdv", "whetstonesUsed", "wolfPigsEvicted", "wolfTurnsUsed", "writingDesksDefeated", "xoSkeleltonXProgress", "xoSkeleltonOProgress", "yearbookCameraAscensions", "yearbookCameraUpgrades", "youRobotBody", "youRobotBottom", "youRobotLeft", "youRobotPoints", "youRobotRight", "youRobotTop", "zeppelinProtestors", "zigguratLianas", "zombiePoints", "_absintheDrops", "_abstractionDropsCrown", "_aguaDrops", "_xenomorphCharge", "_ancestralRecallCasts", "_antihangoverBonus", "_astralDrops", "_augSkillsCast", "_autumnatonQuests", "_backUpUses", "_badlyRomanticArrows", "_badgerCharge", "_balefulHowlUses", "_banderRunaways", "_bastilleCheese", "_bastilleGames", "_bastilleGameTurn", "_bastilleLastCheese", "_beanCannonUses", "_bearHugs", "_beerLensDrops", "_bellydancerPickpockets", "_benettonsCasts", "_birdsSoughtToday", "_bookOfFactsWishes", "_bookOfFactsTatters", "_boomBoxFights", "_boomBoxSongsLeft", "_bootStomps", "_boxingGloveArrows", "_brickoEyeSummons", "_brickoFights", "_campAwayCloudBuffs", "_campAwaySmileBuffs", "_candySummons", "_captainHagnkUsed", "_carnieCandyDrops", "_carrotNoseDrops", "_catBurglarCharge", "_catBurglarHeistsComplete", "_cheerleaderSteam", "_chestXRayUsed", "_chibiAdventures", "_chipBags", "_chocolateCigarsUsed", "_chocolateCoveredPingPongBallsUsed", "_chocolateSculpturesUsed", "_chocolatesUsed", "_chronolithActivations", "_chronolithNextCost", "_cinchUsed", "_cinchoRests", "_circadianRhythmsAdventures", "_clanFortuneConsultUses", "_clipartSummons", "_cloversPurchased", "_coldMedicineConsults", "_coldMedicineEquipmentTaken", "_companionshipCasts", "_cookbookbatCrafting", "_cosmicBowlingSkillsUsed", "_crimbo21ColdResistance", "_dailySpecialPrice", "_daycareGymScavenges", "_daycareRecruits", "_deckCardsDrawn", "_deluxeKlawSummons", "_demandSandwich", "_detectiveCasesCompleted", "_disavowed", "_dnaPotionsMade", "_donhosCasts", "_douseFoeUses", "_dreamJarDrops", "_drunkPygmyBanishes", "_edDefeats", "_edLashCount", "_elronsCasts", "_enamorangs", "_energyCollected", "_expertCornerCutterUsed", "_favorRareSummons", "_feastUsed", "_feelinTheRhythm", "_feelPrideUsed", "_feelExcitementUsed", "_feelHatredUsed", "_feelLonelyUsed", "_feelNervousUsed", "_feelEnvyUsed", "_feelDisappointedUsed", "_feelSuperiorUsed", "_feelLostUsed", "_feelNostalgicUsed", "_feelPeacefulUsed", "_fingertrapArrows", "_fireExtinguisherCharge", "_fragrantHerbsUsed", "_freeBeachWalksUsed", "_frButtonsPressed", "_fudgeWaspFights", "_gapBuffs", "_garbageFireDrops", "_garbageFireDropsCrown", "_genieFightsUsed", "_genieWishesUsed", "_gibbererAdv", "_gibbererCharge", "_gingerbreadCityTurns", "_glarkCableUses", "_glitchMonsterFights", "_gnomeAdv", "_godLobsterFights", "_goldenMoneyCharge", "_gongDrops", "_gothKidCharge", "_gothKidFights", "_greyYouAdventures", "_grimBrotherCharge", "_grimFairyTaleDrops", "_grimFairyTaleDropsCrown", "_grimoireConfiscatorSummons", "_grimoireGeekySummons", "_grimstoneMaskDrops", "_grimstoneMaskDropsCrown", "_grooseCharge", "_grooseDrops", "_grubbyWoolDrops", "_guzzlrDeliveries", "_guzzlrGoldDeliveries", "_guzzlrPlatinumDeliveries", "_hareAdv", "_hareCharge", "_highTopPumps", "_hipsterAdv", "_hoardedCandyDropsCrown", "_hoboUnderlingSummons", "_holoWristDrops", "_holoWristProgress", "_hotAshesDrops", "_hotJellyUses", "_hotTubSoaks", "_humanMuskUses", "_iceballUses", "_inigosCasts", "_jerksHealthMagazinesUsed", "_jiggleCheese", "_jiggleCream", "_jiggleLife", "_jiggleSteak", "_jitbCharge", "_juneCleaverFightsLeft", "_juneCleaverEncounters", "_juneCleaverStench", "_juneCleaverSpooky", "_juneCleaverSleaze", "_juneCleaverHot", "_juneCleaverCold", "_juneCleaverSkips", "_jungDrops", "_kgbClicksUsed", "_kgbDispenserUses", "_kgbTranquilizerDartUses", "_klawSummons", "_kloopCharge", "_kloopDrops", "_kolhsAdventures", "_kolhsSavedByTheBell", "_lastDailyDungeonRoom", "_lastSausageMonsterTurn", "_lastZomboEye", "_latteRefillsUsed", "_leafblowerML", "_legionJackhammerCrafting", "_llamaCharge", "_longConUsed", "_lovebugsBeachBuck", "_lovebugsChroner", "_lovebugsCoinspiracy", "_lovebugsFreddy", "_lovebugsFunFunds", "_lovebugsHoboNickel", "_lovebugsWalmart", "_loveChocolatesUsed", "_lynyrdSnareUses", "_machineTunnelsAdv", "_macrometeoriteUses", "_mafiaThumbRingAdvs", "_mapToACandyRichBlockDrops", "_mayflowerDrops", "_mayflySummons", "_mediumSiphons", "_meteoriteAdesUsed", "_meteorShowerUses", "_micrometeoriteUses", "_mildEvilPerpetrated", "_miniMartiniDrops", "_monkeyPawWishesUsed", "_monsterHabitatsFightsLeft", "_monsterHabitatsRecalled", "_monstersMapped", "_mushroomGardenFights", "_nanorhinoCharge", "_navelRunaways", "_neverendingPartyFreeTurns", "_newYouQuestSharpensDone", "_newYouQuestSharpensToDo", "_nextColdMedicineConsult", "_nextQuantumAlignment", "_nightmareFuelCharges", "_noobSkillCount", "_nuclearStockpileUsed", "_oilExtracted", "_olfactionsUsed", "_optimisticCandleDropsCrown", "_oreDropsCrown", "_otoscopeUsed", "_oysterEggsFound", "_pantsgivingBanish", "_pantsgivingCount", "_pantsgivingCrumbs", "_pantsgivingFullness", "_pasteDrops", "_peteJukeboxFixed", "_peteJumpedShark", "_petePeeledOut", "_pieDrops", "_piePartsCount", "_pixieCharge", "_pocketProfessorLectures", "_poisonArrows", "_pokeGrowFertilizerDrops", "_poolGames", "_powderedGoldDrops", "_powderedMadnessUses", "_powerfulGloveBatteryPowerUsed", "_powerPillDrops", "_powerPillUses", "_precisionCasts", "_questPartyFairItemsOpened", "_radlibSummons", "_raindohCopiesMade", "_rapidPrototypingUsed", "_raveStealCount", "_reflexHammerUsed", "_resolutionAdv", "_resolutionRareSummons", "_riftletAdv", "_robinEggDrops", "_roboDrops", "_rogueProgramCharge", "_romanticFightsLeft", "_saberForceMonsterCount", "_saberForceUses", "_saberMod", "_saltGrainsConsumed", "_sandwormCharge", "_saplingsPlanted", "_sausageFights", "_sausagesEaten", "_sausagesMade", "_sealFigurineUses", "_sealScreeches", "_sealsSummoned", "_shadowBricksUsed", "_shadowRiftCombats", "_shatteringPunchUsed", "_shortOrderCookCharge", "_shrubCharge", "_sloppyDinerBeachBucks", "_smilesOfMrA", "_smithsnessSummons", "_snojoFreeFights", "_snojoParts", "_snokebombUsed", "_snowconeSummons", "_snowglobeDrops", "_snowSuitCount", "_sourceTerminalDigitizeMonsterCount", "_sourceTerminalDigitizeUses", "_sourceTerminalDuplicateUses", "_sourceTerminalEnhanceUses", "_sourceTerminalExtrudes", "_sourceTerminalPortscanUses", "_spaceFurDropsCrown", "_spacegatePlanetIndex", "_spacegateTurnsLeft", "_spaceJellyfishDrops", "_speakeasyDrinksDrunk", "_speakeasyFreeFights", "_spelunkerCharges", "_spelunkingTalesDrops", "_spikolodonSpikeUses", "_spookyJellyUses", "_stackLumpsUses", "_steamCardDrops", "_stickerSummons", "_stinkyCheeseCount", "_stressBallSqueezes", "_sugarSummons", "_sweatOutSomeBoozeUsed", "_taffyRareSummons", "_taffyYellowSummons", "_thanksgettingFoodsEaten", "_thingfinderCasts", "_thinknerdPackageDrops", "_thorsPliersCrafting", "_timeHelmetAdv", "_timeSpinnerMinutesUsed", "_tokenDrops", "_transponderDrops", "_turkeyBlastersUsed", "_turkeyBooze", "_turkeyMuscle", "_turkeyMyst", "_turkeyMoxie", "_unaccompaniedMinerUsed", "_unconsciousCollectiveCharge", "_universalSeasoningsUsed", "_universeCalculated", "_universeImploded", "_usedReplicaBatoomerang", "_vampyreCloakeFormUses", "_villainLairProgress", "_vitachocCapsulesUsed", "_vmaskAdv", "_voidFreeFights", "_volcanoItem1", "_volcanoItem2", "_volcanoItem3", "_volcanoItemCount1", "_volcanoItemCount2", "_volcanoItemCount3", "_voteFreeFights", "_VYKEACompanionLevel", "_warbearAutoAnvilCrafting", "_waxGlobDrops", "_whiteRiceDrops", "_witchessFights", "_xoHugsUsed", "_yellowPixelDropsCrown", "_zapCount", "_zombieSmashPocketsUsed"] as const;
+export const numericProperties = ["coinMasterIndex", "dailyDeedsVersion", "defaultDropdown1", "defaultDropdown2", "defaultDropdownSplit", "defaultLimit", "fixedThreadPoolSize", "itemManagerIndex", "lastBuffRequestType", "lastGlobalCounterDay", "lastImageCacheClear", "pingDefaultTestPings", "pingLoginCount", "pingLoginGoal", "pingLoginThreshold", "pingTestPings", "previousUpdateRevision", "relayDelayForSVN", "relaySkillButtonCount", "scriptButtonPosition", "statusDropdown", "svnThreadPoolSize", "toolbarPosition", "_beachTides", "_g9Effect", "8BitBonusTurns", "8BitScore", "addingScrolls", "affirmationCookiesEaten", "aminoAcidsUsed", "antagonisticSnowmanKitCost", "ascensionsToday", "asolDeferredPoints", "asolPointsPigSkinner", "asolPointsCheeseWizard", "asolPointsJazzAgent", "autoAbortThreshold", "autoAntidote", "autoBuyPriceLimit", "autumnatonQuestTurn", "availableCandyCredits", "availableDimes", "availableFunPoints", "availableMrStore2002Credits", "availableQuarters", "availableStoreCredits", "availableSwagger", "averageSwagger", "awolMedicine", "awolPointsBeanslinger", "awolPointsCowpuncher", "awolPointsSnakeoiler", "awolDeferredPointsBeanslinger", "awolDeferredPointsCowpuncher", "awolDeferredPointsSnakeoiler", "awolVenom", "bagOTricksCharges", "ballpitBonus", "bankedKarma", "bartenderTurnsUsed", "basementMallPrices", "basementSafetyMargin", "batmanFundsAvailable", "batmanBonusInitialFunds", "batmanTimeLeft", "bearSwagger", "beeCounter", "beGregariousCharges", "beGregariousFightsLeft", "birdformCold", "birdformHot", "birdformRoc", "birdformSleaze", "birdformSpooky", "birdformStench", "blackBartsBootyCost", "blackPuddingsDefeated", "blackForestProgress", "blankOutUsed", "bloodweiserDrunk", "bondPoints", "bondVillainsDefeated", "boneAbacusVictories", "bookOfFactsGummi", "bookOfFactsPinata", "booPeakProgress", "borisPoints", "breakableHandling", "breakableHandling1964", "breakableHandling9691", "breakableHandling9692", "breakableHandling9699", "breathitinCharges", "brodenBacteria", "brodenSprinkles", "buffBotMessageDisposal", "buffBotPhilanthropyType", "buffJimmyIngredients", "burnoutsDefeated", "burrowgrubSummonsRemaining", "camelSpit", "camerasUsed", "campAwayDecoration", "candyWitchTurnsUsed", "candyWitchCandyTotal", "carboLoading", "catBurglarBankHeists", "cellarLayout", "charitableDonations", "chasmBridgeProgress", "chefTurnsUsed", "chessboardsCleared", "chibiAlignment", "chibiBirthday", "chibiFitness", "chibiIntelligence", "chibiLastVisit", "chibiSocialization", "chilledToTheBone", "cinchoSaltAndLime", "cinderellaMinutesToMidnight", "cinderellaScore", "cocktailSummons", "commerceGhostCombats", "controlPanelOmega", "cornucopiasOpened", "cosmicBowlingBallReturnCombats", "cozyCounter6332", "cozyCounter6333", "cozyCounter6334", "craftingClay", "craftingLeather", "craftingStraw", "crimbo16BeardChakraCleanliness", "crimbo16BootsChakraCleanliness", "crimbo16BungChakraCleanliness", "crimbo16CrimboHatChakraCleanliness", "crimbo16GutsChakraCleanliness", "crimbo16HatChakraCleanliness", "crimbo16JellyChakraCleanliness", "crimbo16LiverChakraCleanliness", "crimbo16NippleChakraCleanliness", "crimbo16NoseChakraCleanliness", "crimbo16ReindeerChakraCleanliness", "crimbo16SackChakraCleanliness", "crimboTrainingSkill", "crimboTreeDays", "cubelingProgress", "currentExtremity", "currentHedgeMazeRoom", "currentMojoFilters", "currentNunneryMeat", "currentPortalEnergy", "currentReplicaStoreYear", "cursedMagnifyingGlassCount", "cyrptAlcoveEvilness", "cyrptCrannyEvilness", "cyrptNicheEvilness", "cyrptNookEvilness", "cyrptTotalEvilness", "darkGyfftePoints", "daycareEquipment", "daycareInstructors", "daycareLastScavenge", "daycareToddlers", "dbNemesisSkill1", "dbNemesisSkill2", "dbNemesisSkill3", "desertExploration", "desktopHeight", "desktopWidth", "dinseyFilthLevel", "dinseyFunProgress", "dinseyNastyBearsDefeated", "dinseySocialJusticeIProgress", "dinseySocialJusticeIIProgress", "dinseyTouristsFed", "dinseyToxicMultiplier", "doctorBagQuestLights", "doctorBagUpgrades", "dreadScroll1", "dreadScroll2", "dreadScroll3", "dreadScroll4", "dreadScroll5", "dreadScroll6", "dreadScroll7", "dreadScroll8", "dripAdventuresSinceAscension", "drippingHallAdventuresSinceAscension", "drippingTreesAdventuresSinceAscension", "drippyBatsUnlocked", "drippyJuice", "drippyOrbsClaimed", "drunkenSwagger", "edDefeatAbort", "edPoints", "eldritchTentaclesFought", "electricKoolAidEaten", "elfGratitude", "encountersUntilDMTChoice", "encountersUntilYachtzeeChoice", "encountersUntilNEPChoice", "encountersUntilSRChoice", "ensorceleeLevel", "entauntaunedColdRes", "essenceOfAnnoyanceCost", "essenceOfBearCost", "extraRolloverAdventures", "falloutShelterLevel", "familiarSweat", "fingernailsClipped", "fistSkillsKnown", "flyeredML", "fossilB", "fossilD", "fossilN", "fossilP", "fossilS", "fossilW", "fratboysDefeated", "frenchGuardTurtlesFreed", "funGuyMansionKills", "garbageChampagneCharge", "garbageFireProgress", "garbageShirtCharge", "garbageTreeCharge", "garlandUpgrades", "getsYouDrunkTurnsLeft", "ghostPepperTurnsLeft", "gingerDigCount", "gingerLawChoice", "gingerMuscleChoice", "gingerTrainScheduleStudies", "gladiatorBallMovesKnown", "gladiatorBladeMovesKnown", "gladiatorNetMovesKnown", "glitchItemCost", "glitchItemImplementationCount", "glitchItemImplementationLevel", "glitchSwagger", "gloverPoints", "gnasirProgress", "goldenMrAccessories", "gongPath", "gooseDronesRemaining", "goreCollected", "gourdItemCount", "greyYouPoints", "grimoire1Summons", "grimoire2Summons", "grimoire3Summons", "grimstoneCharge", "guardTurtlesFreed", "guideToSafariCost", "guyMadeOfBeesCount", "guzzlrBronzeDeliveries", "guzzlrDeliveryProgress", "guzzlrGoldDeliveries", "guzzlrPlatinumDeliveries", "haciendaLayout", "hallowiener8BitRealm", "hallowienerCoinspiracy", "hareMillisecondsSaved", "hareTurnsUsed", "heavyRainsStartingThunder", "heavyRainsStartingRain", "heavyRainsStartingLightning", "heroDonationBoris", "heroDonationJarlsberg", "heroDonationSneakyPete", "hiddenApartmentProgress", "hiddenBowlingAlleyProgress", "hiddenHospitalProgress", "hiddenOfficeProgress", "hiddenTavernUnlock", "highTopPumped", "hippiesDefeated", "holidayHalsBookCost", "holidaySwagger", "homemadeRobotUpgrades", "homebodylCharges", "hpAutoRecovery", "hpAutoRecoveryTarget", "iceSwagger", "jarlsbergPoints", "jungCharge", "junglePuns", "knownAscensions", "kolhsTotalSchoolSpirited", "lastAnticheeseDay", "lastArcadeAscension", "lastBadMoonReset", "lastBangPotionReset", "lastBattlefieldReset", "lastBeardBuff", "lastBreakfast", "lastCartographyBooPeak", "lastCartographyCastleTop", "lastCartographyDarkNeck", "lastCartographyDefiledNook", "lastCartographyFratHouse", "lastCartographyFratHouseVerge", "lastCartographyGuanoJunction", "lastCartographyHauntedBilliards", "lastCartographyHippyCampVerge", "lastCartographyZeppelinProtesters", "lastCastleGroundUnlock", "lastCastleTopUnlock", "lastCellarReset", "lastChanceThreshold", "lastChasmReset", "lastColosseumRoundWon", "lastCouncilVisit", "lastCounterDay", "lastDesertUnlock", "lastDispensaryOpen", "lastDMTDuplication", "lastDwarfFactoryReset", "lastEVHelmetValue", "lastEVHelmetReset", "lastEmptiedStorage", "lastFilthClearance", "lastGoofballBuy", "lastGuildStoreOpen", "lastGuyMadeOfBeesReset", "lastFratboyCall", "lastFriarCeremonyAscension", "lastFriarsElbowNC", "lastFriarsHeartNC", "lastFriarsNeckNC", "lastHippyCall", "lastIslandUnlock", "lastKeyotronUse", "lastKingLiberation", "lastLightsOutTurn", "lastMushroomPlot", "lastMiningReset", "lastNemesisReset", "lastPaperStripReset", "lastPirateEphemeraReset", "lastPirateInsultReset", "lastPlusSignUnlock", "lastQuartetAscension", "lastQuartetRequest", "lastSecondFloorUnlock", "lastShadowForgeUnlockAdventure", "lastSkateParkReset", "lastStillBeatingSpleen", "lastTavernAscension", "lastTavernSquare", "lastTelescopeReset", "lastTempleAdventures", "lastTempleButtonsUnlock", "lastTempleUnlock", "lastThingWithNoNameDefeated", "lastTowelAscension", "lastTr4pz0rQuest", "lastTrainsetConfiguration", "lastVioletFogMap", "lastVoteMonsterTurn", "lastWartDinseyDefeated", "lastWuTangDefeated", "lastYearbookCameraAscension", "lastZapperWand", "lastZapperWandExplosionDay", "lawOfAveragesCost", "legacyPoints", "libramSummons", "lightsOutAutomation", "louvreDesiredGoal", "louvreGoal", "lovebugsAridDesert", "lovebugsBeachBuck", "lovebugsBooze", "lovebugsChroner", "lovebugsCoinspiracy", "lovebugsCyrpt", "lovebugsFreddy", "lovebugsFunFunds", "lovebugsHoboNickel", "lovebugsItemDrop", "lovebugsMeat", "lovebugsMeatDrop", "lovebugsMoxie", "lovebugsMuscle", "lovebugsMysticality", "lovebugsOilPeak", "lovebugsOrcChasm", "lovebugsPowder", "lovebugsWalmart", "lttQuestDifficulty", "lttQuestStageCount", "manaBurnSummonThreshold", "manaBurningThreshold", "manaBurningTrigger", "manorDrawerCount", "manualOfNumberologyCost", "mapToKokomoCost", "masksUnlocked", "maximizerMRUSize", "maximizerCombinationLimit", "maximizerEquipmentLevel", "maximizerEquipmentScope", "maximizerMaxPrice", "maximizerPriceLevel", "maxManaBurn", "mayflyExperience", "mayoLevel", "meansuckerPrice", "merkinVocabularyMastery", "miniAdvClass", "miniMartinisDrunk", "moleTunnelLevel", "mothershipProgress", "mpAutoRecovery", "mpAutoRecoveryTarget", "munchiesPillsUsed", "mushroomGardenCropLevel", "nextParanormalActivity", "nextQuantumFamiliarOwnerId", "nextQuantumFamiliarTurn", "noobPoints", "noobDeferredPoints", "noodleSummons", "nsContestants1", "nsContestants2", "nsContestants3", "nuclearAutumnPoints", "numericSwagger", "nunsVisits", "oilPeakProgress", "optimalSwagger", "optimisticCandleProgress", "palindomeDudesDefeated", "parasolUsed", "pendingMapReflections", "pingpongSkill", "pirateSwagger", "plantingDay", "plumberBadgeCost", "plumberCostumeCost", "plumberPoints", "poolSharkCount", "poolSkill", "primaryLabGooIntensity", "prismaticSummons", "procrastinatorLanguageFluency", "promptAboutCrafting", "puzzleChampBonus", "pyramidPosition", "quantumPoints", "reagentSummons", "reanimatorArms", "reanimatorLegs", "reanimatorSkulls", "reanimatorWeirdParts", "reanimatorWings", "recentLocations", "redSnapperProgress", "relayPort", "relocatePygmyJanitor", "relocatePygmyLawyer", "rockinRobinProgress", "ROMOfOptimalityCost", "rumpelstiltskinKidsRescued", "rumpelstiltskinTurnsUsed", "rwbMonsterCount", "safariSwagger", "sausageGrinderUnits", "schoolOfHardKnocksDiplomaCost", "schoolSwagger", "scrapbookCharges", "screechCombats", "scriptMRULength", "seaodesFound", "SeasoningSwagger", "sexChanges", "shenInitiationDay", "shockingLickCharges", "singleFamiliarRun", "skillBurn3", "skillBurn90", "skillBurn153", "skillBurn154", "skillBurn155", "skillBurn1019", "skillBurn5017", "skillBurn6014", "skillBurn6015", "skillBurn6016", "skillBurn6020", "skillBurn6021", "skillBurn6022", "skillBurn6023", "skillBurn6024", "skillBurn6026", "skillBurn6028", "skillBurn7323", "skillBurn14008", "skillBurn14028", "skillBurn14038", "skillBurn15011", "skillBurn15028", "skillBurn17005", "skillBurn22034", "skillBurn22035", "skillBurn23301", "skillBurn23302", "skillBurn23303", "skillBurn23304", "skillBurn23305", "skillBurn23306", "skillLevel46", "skillLevel47", "skillLevel48", "skillLevel117", "skillLevel118", "skillLevel121", "skillLevel128", "skillLevel134", "skillLevel135", "skillLevel144", "skillLevel180", "skillLevel188", "skillLevel227", "skillLevel7254", "slimelingFullness", "slimelingStacksDropped", "slimelingStacksDue", "smoresEaten", "smutOrcNoncombatProgress", "sneakyPetePoints", "snojoMoxieWins", "snojoMuscleWins", "snojoMysticalityWins", "sourceAgentsDefeated", "sourceEnlightenment", "sourceInterval", "sourcePoints", "sourceTerminalGram", "sourceTerminalPram", "sourceTerminalSpam", "spaceBabyLanguageFluency", "spacePirateLanguageFluency", "spelunkyNextNoncombat", "spelunkySacrifices", "spelunkyWinCount", "spookyPuttyCopiesMade", "spookyVHSTapeMonsterTurn", "statbotUses", "sugarCounter4178", "sugarCounter4179", "sugarCounter4180", "sugarCounter4181", "sugarCounter4182", "sugarCounter4183", "sugarCounter4191", "summonAnnoyanceCost", "sweat", "tacoDanCocktailSauce", "tacoDanFishMeat", "tavernLayout", "telescopeUpgrades", "tempuraSummons", "timeSpinnerMedals", "timesRested", "tomeSummons", "totalCharitableDonations", "trainsetPosition", "turtleBlessingTurns", "twinPeakProgress", "twoCRSPoints", "unicornHornInflation", "universalSeasoningCost", "usable1HWeapons", "usable1xAccs", "usable2HWeapons", "usable3HWeapons", "usableAccessories", "usableHats", "usableOffhands", "usableOther", "usablePants", "usableShirts", "valueOfAdventure", "valueOfInventory", "valueOfStill", "valueOfTome", "vintnerCharge", "vintnerWineLevel", "violetFogGoal", "walfordBucketProgress", "warehouseProgress", "welcomeBackAdv", "wereProfessorStomach", "wereProfessorLiver", "wereProfessorPoints", "whetstonesUsed", "wolfPigsEvicted", "wolfTurnsUsed", "writingDesksDefeated", "xoSkeleltonXProgress", "xoSkeleltonOProgress", "yearbookCameraAscensions", "yearbookCameraUpgrades", "youRobotBody", "youRobotBottom", "youRobotLeft", "youRobotPoints", "youRobotRight", "youRobotTop", "zeppelinProtestors", "zigguratLianas", "zombiePoints", "_absintheDrops", "_abstractionDropsCrown", "_aguaDrops", "_xenomorphCharge", "_ancestralRecallCasts", "_antihangoverBonus", "_astralDrops", "_augSkillsCast", "_automatedFutureManufactures", "_autumnatonQuests", "_backUpUses", "_badlyRomanticArrows", "_badgerCharge", "_balefulHowlUses", "_banderRunaways", "_bastilleCheese", "_bastilleGames", "_bastilleGameTurn", "_bastilleLastCheese", "_beanCannonUses", "_bearHugs", "_beerLensDrops", "_bellydancerPickpockets", "_benettonsCasts", "_birdsSoughtToday", "_bookOfFactsWishes", "_bookOfFactsTatters", "_boomBoxFights", "_boomBoxSongsLeft", "_bootStomps", "_boxingGloveArrows", "_brickoEyeSummons", "_brickoFights", "_campAwayCloudBuffs", "_campAwaySmileBuffs", "_candySummons", "_captainHagnkUsed", "_carnieCandyDrops", "_carnivorousPottedPlantWins", "_carrotNoseDrops", "_catBurglarCharge", "_catBurglarHeistsComplete", "_cheerleaderSteam", "_chestXRayUsed", "_chibiAdventures", "_chipBags", "_chocolateCigarsUsed", "_chocolateCoveredPingPongBallsUsed", "_chocolateSculpturesUsed", "_chocolatesUsed", "_chronolithActivations", "_chronolithNextCost", "_cinchUsed", "_cinchoRests", "_circadianRhythmsAdventures", "_clanFortuneConsultUses", "_clipartSummons", "_cloversPurchased", "_coldMedicineConsults", "_coldMedicineEquipmentTaken", "_companionshipCasts", "_cookbookbatCrafting", "_cosmicBowlingSkillsUsed", "_crimbo21ColdResistance", "_dailySpecialPrice", "_daycareGymScavenges", "_daycareRecruits", "_deckCardsDrawn", "_deluxeKlawSummons", "_demandSandwich", "_detectiveCasesCompleted", "_disavowed", "_dnaPotionsMade", "_donhosCasts", "_douseFoeUses", "_dreamJarDrops", "_drunkPygmyBanishes", "_edDefeats", "_edLashCount", "_elronsCasts", "_enamorangs", "_energyCollected", "_expertCornerCutterUsed", "_extraTimeUsed", "_favorRareSummons", "_feastUsed", "_feelinTheRhythm", "_feelPrideUsed", "_feelExcitementUsed", "_feelHatredUsed", "_feelLonelyUsed", "_feelNervousUsed", "_feelEnvyUsed", "_feelDisappointedUsed", "_feelSuperiorUsed", "_feelLostUsed", "_feelNostalgicUsed", "_feelPeacefulUsed", "_fingertrapArrows", "_fireExtinguisherCharge", "_fragrantHerbsUsed", "_freeBeachWalksUsed", "_frButtonsPressed", "_fudgeWaspFights", "_gapBuffs", "_garbageFireDrops", "_garbageFireDropsCrown", "_genieFightsUsed", "_genieWishesUsed", "_gibbererAdv", "_gibbererCharge", "_gingerbreadCityTurns", "_glarkCableUses", "_glitchMonsterFights", "_gnomeAdv", "_godLobsterFights", "_goldenMoneyCharge", "_gongDrops", "_gothKidCharge", "_gothKidFights", "_greyYouAdventures", "_grimBrotherCharge", "_grimFairyTaleDrops", "_grimFairyTaleDropsCrown", "_grimoireConfiscatorSummons", "_grimoireGeekySummons", "_grimstoneMaskDrops", "_grimstoneMaskDropsCrown", "_grooseCharge", "_grooseDrops", "_grubbyWoolDrops", "_guzzlrDeliveries", "_guzzlrGoldDeliveries", "_guzzlrPlatinumDeliveries", "_hareAdv", "_hareCharge", "_highTopPumps", "_hipsterAdv", "_hoardedCandyDropsCrown", "_hoboUnderlingSummons", "_holoWristDrops", "_holoWristProgress", "_hotAshesDrops", "_hotJellyUses", "_hotTubSoaks", "_humanMuskUses", "_iceballUses", "_inigosCasts", "_jerksHealthMagazinesUsed", "_jiggleCheese", "_jiggleCream", "_jiggleLife", "_jiggleSteak", "_jitbCharge", "_juneCleaverFightsLeft", "_juneCleaverEncounters", "_juneCleaverStench", "_juneCleaverSpooky", "_juneCleaverSleaze", "_juneCleaverHot", "_juneCleaverCold", "_juneCleaverSkips", "_jungDrops", "_kgbClicksUsed", "_kgbDispenserUses", "_kgbTranquilizerDartUses", "_klawSummons", "_kloopCharge", "_kloopDrops", "_kolhsAdventures", "_kolhsSavedByTheBell", "_lastDailyDungeonRoom", "_lastSausageMonsterTurn", "_lastZomboEye", "_latteRefillsUsed", "_leafblowerML", "_leafLassosCrafted", "_leafMonstersFought", "_leavesBurned", "_legionJackhammerCrafting", "_llamaCharge", "_longConUsed", "_lovebugsBeachBuck", "_lovebugsChroner", "_lovebugsCoinspiracy", "_lovebugsFreddy", "_lovebugsFunFunds", "_lovebugsHoboNickel", "_lovebugsWalmart", "_loveChocolatesUsed", "_lynyrdSnareUses", "_machineTunnelsAdv", "_macrometeoriteUses", "_mafiaThumbRingAdvs", "_mapToACandyRichBlockDrops", "_mayflowerDrops", "_mayflySummons", "_mediumSiphons", "_meteoriteAdesUsed", "_meteorShowerUses", "_micrometeoriteUses", "_mildEvilPerpetrated", "_mimicEggsDonated", "_mimicEggsObtained", "_miniMartiniDrops", "_monkeyPawWishesUsed", "_monsterHabitatsFightsLeft", "_monsterHabitatsRecalled", "_monstersMapped", "_mushroomGardenFights", "_nanorhinoCharge", "_navelRunaways", "_neverendingPartyFreeTurns", "_newYouQuestSharpensDone", "_newYouQuestSharpensToDo", "_nextColdMedicineConsult", "_nextQuantumAlignment", "_nightmareFuelCharges", "_noobSkillCount", "_nuclearStockpileUsed", "_oilExtracted", "_olfactionsUsed", "_optimisticCandleDropsCrown", "_oreDropsCrown", "_otoscopeUsed", "_oysterEggsFound", "_pantsgivingBanish", "_pantsgivingCount", "_pantsgivingCrumbs", "_pantsgivingFullness", "_pasteDrops", "_peteJukeboxFixed", "_peteJumpedShark", "_petePeeledOut", "_pieDrops", "_piePartsCount", "_pixieCharge", "_pocketProfessorLectures", "_poisonArrows", "_pokeGrowFertilizerDrops", "_poolGames", "_powderedGoldDrops", "_powderedMadnessUses", "_powerfulGloveBatteryPowerUsed", "_powerPillDrops", "_powerPillUses", "_precisionCasts", "_questPartyFairItemsOpened", "_radlibSummons", "_raindohCopiesMade", "_rapidPrototypingUsed", "_raveStealCount", "_reflexHammerUsed", "_resolutionAdv", "_resolutionRareSummons", "_riftletAdv", "_robinEggDrops", "_roboDrops", "_rogueProgramCharge", "_romanticFightsLeft", "_saberForceMonsterCount", "_saberForceUses", "_saberMod", "_saltGrainsConsumed", "_sandwormCharge", "_saplingsPlanted", "_sausageFights", "_sausagesEaten", "_sausagesMade", "_sealFigurineUses", "_sealScreeches", "_sealsSummoned", "_shadowBricksUsed", "_shadowRiftCombats", "_shatteringPunchUsed", "_shortOrderCookCharge", "_shrubCharge", "_sloppyDinerBeachBucks", "_smilesOfMrA", "_smithsnessSummons", "_snojoFreeFights", "_snojoParts", "_snokebombUsed", "_snowconeSummons", "_snowglobeDrops", "_snowSuitCount", "_sourceTerminalDigitizeMonsterCount", "_sourceTerminalDigitizeUses", "_sourceTerminalDuplicateUses", "_sourceTerminalEnhanceUses", "_sourceTerminalExtrudes", "_sourceTerminalPortscanUses", "_spaceFurDropsCrown", "_spacegatePlanetIndex", "_spacegateTurnsLeft", "_spaceJellyfishDrops", "_speakeasyDrinksDrunk", "_speakeasyFreeFights", "_spelunkerCharges", "_spelunkingTalesDrops", "_spikolodonSpikeUses", "_spookyJellyUses", "_stackLumpsUses", "_steamCardDrops", "_stickerSummons", "_stinkyCheeseCount", "_stressBallSqueezes", "_sugarSummons", "_surprisinglySweetSlashUsed", "_surprisinglySweetStabUsed", "_sweatOutSomeBoozeUsed", "_taffyRareSummons", "_taffyYellowSummons", "_thanksgettingFoodsEaten", "_thingfinderCasts", "_thinknerdPackageDrops", "_thorsPliersCrafting", "_timeHelmetAdv", "_timeSpinnerMinutesUsed", "_tokenDrops", "_transponderDrops", "_turkeyBlastersUsed", "_turkeyBooze", "_turkeyMuscle", "_turkeyMyst", "_turkeyMoxie", "_unaccompaniedMinerUsed", "_unconsciousCollectiveCharge", "_universalSeasoningsUsed", "_universeCalculated", "_universeImploded", "_usedReplicaBatoomerang", "_vampyreCloakeFormUses", "_villainLairProgress", "_vitachocCapsulesUsed", "_vmaskAdv", "_voidFreeFights", "_volcanoItem1", "_volcanoItem2", "_volcanoItem3", "_volcanoItemCount1", "_volcanoItemCount2", "_volcanoItemCount3", "_voteFreeFights", "_VYKEACompanionLevel", "_warbearAutoAnvilCrafting", "_waxGlobDrops", "_whiteRiceDrops", "_witchessFights", "_xoHugsUsed", "_yellowPixelDropsCrown", "_zapCount", "_zombieSmashPocketsUsed"] as const;
export type NumericProperty = typeof numericProperties[number];
-export const monsterProperties = ["beGregariousMonster", "cameraMonster", "chateauMonster", "clumsinessGroveBoss", "crappyCameraMonster", "crudeMonster", "enamorangMonster", "envyfishMonster", "glacierOfJerksBoss", "holdHandsMonster", "iceSculptureMonster", "lastCopyableMonster", "longConMonster", "maelstromOfLoversBoss", "makeFriendsMonster", "merkinLockkeyMonster", "monkeyPointMonster", "motifMonster", "nosyNoseMonster", "olfactedMonster", "photocopyMonster", "rainDohMonster", "romanticTarget", "rufusDesiredEntity", "rwbMonster", "screencappedMonster", "spookyPuttyMonster", "spookyVHSTapeMonster", "stenchCursedMonster", "superficiallyInterestedMonster", "waxMonster", "yearbookCameraTarget", "_gallapagosMonster", "_jiggleCreamedMonster", "_latteMonster", "_monsterHabitatsMonster", "_nanorhinoBanishedMonster", "_newYouQuestMonster", "_relativityMonster", "_saberForceMonster", "_sourceTerminalDigitizeMonster", "_voteMonster"] as const;
+export const monsterProperties = ["beGregariousMonster", "cameraMonster", "chateauMonster", "clumsinessGroveBoss", "crappyCameraMonster", "crudeMonster", "enamorangMonster", "envyfishMonster", "glacierOfJerksBoss", "holdHandsMonster", "iceSculptureMonster", "lastCopyableMonster", "longConMonster", "maelstromOfLoversBoss", "makeFriendsMonster", "merkinLockkeyMonster", "monkeyPointMonster", "motifMonster", "nosyNoseMonster", "olfactedMonster", "photocopyMonster", "rainDohMonster", "romanticTarget", "rufusDesiredEntity", "rwbMonster", "screencappedMonster", "spookyPuttyMonster", "spookyVHSTapeMonster", "stenchCursedMonster", "superficiallyInterestedMonster", "waxMonster", "yearbookCameraTarget", "_gallapagosMonster", "_jiggleCreamedMonster", "_latteMonster", "_monsterHabitatsMonster", "_nanorhinoBanishedMonster", "_newYouQuestMonster", "_prankCardMonster", "_relativityMonster", "_saberForceMonster", "_sourceTerminalDigitizeMonster", "_trickCoinMonster", "_voteMonster"] as const;
export type MonsterProperty = typeof monsterProperties[number];
-export const locationProperties = ["autumnatonQuestLocation", "currentJunkyardLocation", "doctorBagQuestLocation", "ghostLocation", "guzzlrQuestLocation", "nextSpookyravenElizabethRoom", "nextSpookyravenStephenRoom", "rwbLocation", "sourceOracleTarget", "_floundryBassLocation", "_floundryCarpLocation", "_floundryCodLocation", "_floundryHatchetfishLocation", "_floundryTroutLocation", "_floundryTunaLocation", "_sotParcelLocation"] as const;
+export const locationProperties = ["autumnatonQuestLocation", "currentJunkyardLocation", "doctorBagQuestLocation", "ghostLocation", "guzzlrQuestLocation", "lastAdventure", "nextAdventure", "nextSpookyravenElizabethRoom", "nextSpookyravenStephenRoom", "rwbLocation", "sourceOracleTarget", "_floundryBassLocation", "_floundryCarpLocation", "_floundryCodLocation", "_floundryHatchetfishLocation", "_floundryTroutLocation", "_floundryTunaLocation", "_sotParcelLocation"] as const;
export type LocationProperty = typeof locationProperties[number];
-export const stringProperties = ["autoLogin", "browserBookmarks", "chatFontSize", "combatHotkey0", "combatHotkey1", "combatHotkey2", "combatHotkey3", "combatHotkey4", "combatHotkey5", "combatHotkey6", "combatHotkey7", "combatHotkey8", "combatHotkey9", "commandLineNamespace", "dailyDeedsOptions", "defaultBorderColor", "displayName", "externalEditor", "getBreakfast", "headerStates", "highlightList", "http.proxyHost", "http.proxyPassword", "http.proxyPort", "http.proxyUser", "https.proxyHost", "https.proxyPassword", "https.proxyPort", "https.proxyUser", "initialDesktop", "initialFrames", "lastRelayUpdate", "lastUserAgent", "lastUsername", "logPreferenceChangeFilter", "loginScript", "loginServerName", "loginWindowLogo", "logoutScript", "pingDefaultTestPage", "pingLatest", "pingLoginAbort", "pingLoginCheck", "pingLoginFail", "pingLongest", "pingShortest", "pingTestPage", "previousNotifyList", "previousUpdateVersion", "saveState", "saveStateActive", "scriptList", "swingLookAndFeel", "userAgent", "8BitColor", "afterAdventureScript", "autoOlfact", "autoPutty", "autumnatonUpgrades", "backupCameraMode", "banishedMonsters", "banishedPhyla", "banishingShoutMonsters", "batmanStats", "batmanZone", "batmanUpgrades", "battleAction", "beachHeadsUnlocked", "beforePVPScript", "betweenBattleScript", "boomBoxSong", "breakfastAlways", "breakfastHardcore", "breakfastSoftcore", "buffBotCasting", "buyScript", "cargoPocketsEmptied", "cargoPocketScraps", "chatbotScript", "chatPlayerScript", "chibiName", "choiceAdventureScript", "chosenTrip", "clanFortuneReply1", "clanFortuneReply2", "clanFortuneReply3", "clanFortuneWord1", "clanFortuneWord2", "clanFortuneWord3", "commerceGhostItem", "counterScript", "copperheadClubHazard", "crimbotChassis", "crimbotArm", "crimbotPropulsion", "crystalBallPredictions", "csServicesPerformed", "currentAstralTrip", "currentDistillateMods", "currentEasyBountyItem", "currentHardBountyItem", "currentHippyStore", "currentJunkyardTool", "currentLlamaForm", "currentMood", "currentPVPSeason", "currentPvpVictories", "currentSpecialBountyItem", "currentSITSkill", "customCombatScript", "cyrusAdjectives", "defaultFlowerLossMessage", "defaultFlowerWinMessage", "demonName1", "demonName2", "demonName3", "demonName4", "demonName5", "demonName6", "demonName7", "demonName8", "demonName9", "demonName10", "demonName11", "demonName12", "demonName13", "dinseyGatorStenchDamage", "dinseyRollercoasterStats", "doctorBagQuestItem", "dolphinItem", "duckAreasCleared", "duckAreasSelected", "edPiece", "enamorangMonsterTurn", "ensorcelee", "EVEDirections", "extraCosmeticModifiers", "familiarScript", "forbiddenStores", "gameProBossSpecialPower", "gooseReprocessed", "grimoireSkillsHardcore", "grimoireSkillsSoftcore", "grimstoneMaskPath", "guzzlrQuestClient", "guzzlrQuestBooze", "guzzlrQuestTier", "harvestGardenHardcore", "harvestGardenSoftcore", "hpAutoRecoveryItems", "invalidBuffMessage", "jickSwordModifier", "juneCleaverQueue", "kingLiberatedScript", "lassoTraining", "lastAdventure", "lastBangPotion819", "lastBangPotion820", "lastBangPotion821", "lastBangPotion822", "lastBangPotion823", "lastBangPotion824", "lastBangPotion825", "lastBangPotion826", "lastBangPotion827", "lastChanceBurn", "lastChessboard", "lastCombatEnvironments", "lastDwarfDiceRolls", "lastDwarfDigitRunes", "lastDwarfEquipmentRunes", "lastDwarfFactoryItem118", "lastDwarfFactoryItem119", "lastDwarfFactoryItem120", "lastDwarfFactoryItem360", "lastDwarfFactoryItem361", "lastDwarfFactoryItem362", "lastDwarfFactoryItem363", "lastDwarfFactoryItem364", "lastDwarfFactoryItem365", "lastDwarfFactoryItem910", "lastDwarfFactoryItem3199", "lastDwarfOfficeItem3208", "lastDwarfOfficeItem3209", "lastDwarfOfficeItem3210", "lastDwarfOfficeItem3211", "lastDwarfOfficeItem3212", "lastDwarfOfficeItem3213", "lastDwarfOfficeItem3214", "lastDwarfOreRunes", "lastDwarfHopper1", "lastDwarfHopper2", "lastDwarfHopper3", "lastDwarfHopper4", "lastEncounter", "lastMacroError", "lastMessageId", "lastPaperStrip3144", "lastPaperStrip4138", "lastPaperStrip4139", "lastPaperStrip4140", "lastPaperStrip4141", "lastPaperStrip4142", "lastPaperStrip4143", "lastPaperStrip4144", "lastPirateEphemera", "lastPorkoBoard", "lastPorkoPayouts", "lastPorkoExpected", "lastSlimeVial3885", "lastSlimeVial3886", "lastSlimeVial3887", "lastSlimeVial3888", "lastSlimeVial3889", "lastSlimeVial3890", "lastSlimeVial3891", "lastSlimeVial3892", "lastSlimeVial3893", "lastSlimeVial3894", "lastSlimeVial3895", "lastSlimeVial3896", "latteIngredients", "latteModifier", "latteUnlocks", "ledCandleMode", "libramSkillsHardcore", "libramSkillsSoftcore", "louvreOverride", "lovePotion", "lttQuestName", "maximizerList", "maximizerMRUList", "mayoInMouth", "mayoMinderSetting", "merkinQuestPath", "mineLayout1", "mineLayout2", "mineLayout3", "mineLayout4", "mineLayout5", "mineLayout6", "mpAutoRecoveryItems", "muffinOnOrder", "nextAdventure", "nextDistillateMods", "nextQuantumFamiliarName", "nextQuantumFamiliarOwner", "nsChallenge2", "nsChallenge3", "nsChallenge4", "nsChallenge5", "nsTowerDoorKeysUsed", "oceanAction", "oceanDestination", "parkaMode", "pastaThrall1", "pastaThrall2", "pastaThrall3", "pastaThrall4", "pastaThrall5", "pastaThrall6", "pastaThrall7", "pastaThrall8", "peteMotorbikeTires", "peteMotorbikeGasTank", "peteMotorbikeHeadlight", "peteMotorbikeCowling", "peteMotorbikeMuffler", "peteMotorbikeSeat", "pieStuffing", "plantingDate", "plantingLength", "plantingScript", "plumberCostumeWorn", "pokefamBoosts", "postAscensionScript", "preAscensionScript", "questClumsinessGrove", "questDoctorBag", "questECoBucket", "questESlAudit", "questESlBacteria", "questESlCheeseburger", "questESlCocktail", "questESlDebt", "questESlFish", "questESlMushStash", "questESlSalt", "questESlSprinkles", "questESpClipper", "questESpEVE", "questESpFakeMedium", "questESpGore", "questESpJunglePun", "questESpOutOfOrder", "questESpSerum", "questESpSmokes", "questEStFishTrash", "questEStGiveMeFuel", "questEStNastyBears", "questEStSocialJusticeI", "questEStSocialJusticeII", "questEStSuperLuber", "questEStWorkWithFood", "questEStZippityDooDah", "questEUNewYou", "questF01Primordial", "questF02Hyboria", "questF03Future", "questF04Elves", "questF05Clancy", "questG01Meatcar", "questG02Whitecastle", "questG03Ego", "questG04Nemesis", "questG05Dark", "questG06Delivery", "questG07Myst", "questG08Moxie", "questG09Muscle", "questGlacierOfJerks", "questGuzzlr", "questI01Scapegoat", "questI02Beat", "questL02Larva", "questL03Rat", "questL04Bat", "questL05Goblin", "questL06Friar", "questL07Cyrptic", "questL08Trapper", "questL09Topping", "questL10Garbage", "questL11Black", "questL11Business", "questL11Curses", "questL11Desert", "questL11Doctor", "questL11MacGuffin", "questL11Manor", "questL11Palindome", "questL11Pyramid", "questL11Ron", "questL11Shen", "questL11Spare", "questL11Worship", "questL12HippyFrat", "questL12War", "questL13Final", "questL13Warehouse", "questLTTQuestByWire", "questM01Untinker", "questM02Artist", "questM03Bugbear", "questM05Toot", "questM06Gourd", "questM07Hammer", "questM08Baker", "questM09Rocks", "questM10Azazel", "questM11Postal", "questM12Pirate", "questM13Escape", "questM14Bounty", "questM15Lol", "questM16Temple", "questM17Babies", "questM18Swamp", "questM19Hippy", "questM20Necklace", "questM21Dance", "questM22Shirt", "questM23Meatsmith", "questM24Doc", "questM25Armorer", "questM26Oracle", "questMaelstromOfLovers", "questPAGhost", "questRufus", "questS01OldGuy", "questS02Monkees", "raveCombo1", "raveCombo2", "raveCombo3", "raveCombo4", "raveCombo5", "raveCombo6", "recoveryScript", "relayCounters", "retroCapeSuperhero", "retroCapeWashingInstructions", "royalty", "rufusDesiredArtifact", "rufusDesiredItems", "rufusQuestTarget", "rufusQuestType", "scriptMRUList", "seahorseName", "shadowLabyrinthGoal", "shadowRiftIngress", "shenQuestItem", "shrubGarland", "shrubGifts", "shrubLights", "shrubTopper", "sideDefeated", "sidequestArenaCompleted", "sidequestFarmCompleted", "sidequestJunkyardCompleted", "sidequestLighthouseCompleted", "sidequestNunsCompleted", "sidequestOrchardCompleted", "skateParkStatus", "snowsuit", "sourceTerminalChips", "sourceTerminalEducate1", "sourceTerminalEducate2", "sourceTerminalEnquiry", "sourceTerminalEducateKnown", "sourceTerminalEnhanceKnown", "sourceTerminalEnquiryKnown", "sourceTerminalExtrudeKnown", "spadingData", "spadingScript", "speakeasyName", "spelunkyStatus", "spelunkyUpgrades", "spookyravenRecipeUsed", "stationaryButton1", "stationaryButton2", "stationaryButton3", "stationaryButton4", "stationaryButton5", "streamCrossDefaultTarget", "sweetSynthesisBlacklist", "telescope1", "telescope2", "telescope3", "telescope4", "telescope5", "testudinalTeachings", "textColors", "thanksMessage", "tomeSkillsHardcore", "tomeSkillsSoftcore", "trackVoteMonster", "trainsetConfiguration", "trapperOre", "umbrellaState", "umdLastObtained", "vintnerWineEffect", "vintnerWineName", "vintnerWineType", "violetFogLayout", "volcanoMaze1", "volcanoMaze2", "volcanoMaze3", "volcanoMaze4", "volcanoMaze5", "walfordBucketItem", "warProgress", "watchedPreferences", "workteaClue", "yourFavoriteBird", "yourFavoriteBirdMods", "youRobotCPUUpgrades", "_bastilleBoosts", "_bastilleChoice1", "_bastilleChoice2", "_bastilleChoice3", "_bastilleCurrentStyles", "_bastilleEnemyCastle", "_bastilleEnemyName", "_bastilleLastBattleResults", "_bastilleLastEncounter", "_bastilleStats", "_beachHeadsUsed", "_beachLayout", "_beachMinutes", "_birdOfTheDay", "_birdOfTheDayMods", "_bittycar", "_campAwaySmileBuffSign", "_citizenZone", "_citizenZoneMods", "_cloudTalkMessage", "_cloudTalkSmoker", "_coatOfPaintModifier", "_dailySpecial", "_deckCardsSeen", "_feastedFamiliars", "_floristPlantsUsed", "_frAreasUnlocked", "_frHoursLeft", "_frMonstersKilled", "_horsery", "_horseryCrazyMox", "_horseryCrazyMus", "_horseryCrazyMys", "_horseryCrazyName", "_horseryCurrentName", "_horseryDarkName", "_horseryNormalName", "_horseryPaleName", "_jickJarAvailable", "_jiggleCheesedMonsters", "_lastCombatStarted", "_lastPirateRealmIsland", "_locketMonstersFought", "_mummeryMods", "_mummeryUses", "_newYouQuestSkill", "_noHatModifier", "_pantogramModifier", "_pottedPowerPlant", "_questESp", "_questPartyFair", "_questPartyFairProgress", "_questPartyFairQuest", "_roboDrinks", "_roninStoragePulls", "_spacegateAnimalLife", "_spacegateCoordinates", "_spacegateGear", "_spacegateHazards", "_spacegateIntelligentLife", "_spacegatePlanetName", "_spacegatePlantLife", "_stolenAccordions", "_tempRelayCounters", "_timeSpinnerFoodAvailable", "_unknownEasyBountyItem", "_unknownHardBountyItem", "_unknownSpecialBountyItem", "_untakenEasyBountyItem", "_untakenHardBountyItem", "_untakenSpecialBountyItem", "_userMods", "_villainLairColor", "_villainLairKey", "_voteLocal1", "_voteLocal2", "_voteLocal3", "_voteLocal4", "_voteMonster1", "_voteMonster2", "_voteModifier", "_VYKEACompanionType", "_VYKEACompanionRune", "_VYKEACompanionName"] as const;
+export const stringProperties = ["autoLogin", "browserBookmarks", "chatFontSize", "combatHotkey0", "combatHotkey1", "combatHotkey2", "combatHotkey3", "combatHotkey4", "combatHotkey5", "combatHotkey6", "combatHotkey7", "combatHotkey8", "combatHotkey9", "commandBufferGCLI", "commandBufferTabbedChat", "commandLineNamespace", "dailyDeedsOptions", "defaultBorderColor", "displayName", "externalEditor", "getBreakfast", "headerStates", "highlightList", "http.proxyHost", "http.proxyPassword", "http.proxyPort", "http.proxyUser", "https.proxyHost", "https.proxyPassword", "https.proxyPort", "https.proxyUser", "initialDesktop", "initialFrames", "lastRelayUpdate", "lastUserAgent", "lastUsername", "logPreferenceChangeFilter", "loginScript", "loginServerName", "loginWindowLogo", "logoutScript", "pingDefaultTestPage", "pingLatest", "pingLoginAbort", "pingLoginCheck", "pingLoginFail", "pingLongest", "pingShortest", "pingTestPage", "previousNotifyList", "previousUpdateVersion", "saveState", "saveStateActive", "scriptList", "swingLookAndFeel", "userAgent", "8BitColor", "afterAdventureScript", "autoOlfact", "autoPutty", "autumnatonUpgrades", "backupCameraMode", "banishedMonsters", "banishedPhyla", "banishingShoutMonsters", "batmanStats", "batmanZone", "batmanUpgrades", "battleAction", "beachHeadsUnlocked", "beforePVPScript", "betweenBattleScript", "boomBoxSong", "breakfastAlways", "breakfastHardcore", "breakfastSoftcore", "buffBotCasting", "buyScript", "cargoPocketsEmptied", "cargoPocketScraps", "chatbotScript", "chatPlayerScript", "chibiName", "choiceAdventureScript", "chosenTrip", "clanFortuneReply1", "clanFortuneReply2", "clanFortuneReply3", "clanFortuneWord1", "clanFortuneWord2", "clanFortuneWord3", "commerceGhostItem", "counterScript", "copperheadClubHazard", "crimbo23ArmoryControl", "crimbo23BarControl", "crimbo23CafeControl", "crimbo23CottageControl", "crimbo23FoundryControl", "crimbotChassis", "crimbotArm", "crimbotPropulsion", "crystalBallPredictions", "csServicesPerformed", "currentAstralTrip", "currentDistillateMods", "currentEasyBountyItem", "currentHardBountyItem", "currentHippyStore", "currentJunkyardTool", "currentLlamaForm", "currentMood", "currentPVPSeason", "currentPvpVictories", "currentSpecialBountyItem", "currentSITSkill", "customCombatScript", "cyrusAdjectives", "defaultFlowerLossMessage", "defaultFlowerWinMessage", "demonName1", "demonName2", "demonName3", "demonName4", "demonName5", "demonName6", "demonName7", "demonName8", "demonName9", "demonName10", "demonName11", "demonName12", "demonName13", "dinseyGatorStenchDamage", "dinseyRollercoasterStats", "doctorBagQuestItem", "dolphinItem", "duckAreasCleared", "duckAreasSelected", "edPiece", "enamorangMonsterTurn", "ensorcelee", "EVEDirections", "extraCosmeticModifiers", "familiarScript", "forbiddenStores", "gameProBossSpecialPower", "gooseReprocessed", "grimoireSkillsHardcore", "grimoireSkillsSoftcore", "grimstoneMaskPath", "guzzlrQuestClient", "guzzlrQuestBooze", "guzzlrQuestTier", "harvestGardenHardcore", "harvestGardenSoftcore", "hpAutoRecoveryItems", "invalidBuffMessage", "jickSwordModifier", "juneCleaverQueue", "kingLiberatedScript", "lassoTraining", "lastBangPotion819", "lastBangPotion820", "lastBangPotion821", "lastBangPotion822", "lastBangPotion823", "lastBangPotion824", "lastBangPotion825", "lastBangPotion826", "lastBangPotion827", "lastChanceBurn", "lastChessboard", "lastCombatEnvironments", "lastDwarfDiceRolls", "lastDwarfDigitRunes", "lastDwarfEquipmentRunes", "lastDwarfFactoryItem118", "lastDwarfFactoryItem119", "lastDwarfFactoryItem120", "lastDwarfFactoryItem360", "lastDwarfFactoryItem361", "lastDwarfFactoryItem362", "lastDwarfFactoryItem363", "lastDwarfFactoryItem364", "lastDwarfFactoryItem365", "lastDwarfFactoryItem910", "lastDwarfFactoryItem3199", "lastDwarfOfficeItem3208", "lastDwarfOfficeItem3209", "lastDwarfOfficeItem3210", "lastDwarfOfficeItem3211", "lastDwarfOfficeItem3212", "lastDwarfOfficeItem3213", "lastDwarfOfficeItem3214", "lastDwarfOreRunes", "lastDwarfHopper1", "lastDwarfHopper2", "lastDwarfHopper3", "lastDwarfHopper4", "lastEncounter", "lastMacroError", "lastMessageId", "lastPaperStrip3144", "lastPaperStrip4138", "lastPaperStrip4139", "lastPaperStrip4140", "lastPaperStrip4141", "lastPaperStrip4142", "lastPaperStrip4143", "lastPaperStrip4144", "lastPirateEphemera", "lastPorkoBoard", "lastPorkoPayouts", "lastPorkoExpected", "lastSlimeVial3885", "lastSlimeVial3886", "lastSlimeVial3887", "lastSlimeVial3888", "lastSlimeVial3889", "lastSlimeVial3890", "lastSlimeVial3891", "lastSlimeVial3892", "lastSlimeVial3893", "lastSlimeVial3894", "lastSlimeVial3895", "lastSlimeVial3896", "latteIngredients", "latteModifier", "latteUnlocks", "ledCandleMode", "libramSkillsHardcore", "libramSkillsSoftcore", "louvreOverride", "lovePotion", "lttQuestName", "maximizerList", "maximizerMRUList", "mayoInMouth", "mayoMinderSetting", "merkinQuestPath", "mineLayout1", "mineLayout2", "mineLayout3", "mineLayout4", "mineLayout5", "mineLayout6", "mpAutoRecoveryItems", "muffinOnOrder", "nextDistillateMods", "nextQuantumFamiliarName", "nextQuantumFamiliarOwner", "nsChallenge2", "nsChallenge3", "nsChallenge4", "nsChallenge5", "nsTowerDoorKeysUsed", "oceanAction", "oceanDestination", "parkaMode", "pastaThrall1", "pastaThrall2", "pastaThrall3", "pastaThrall4", "pastaThrall5", "pastaThrall6", "pastaThrall7", "pastaThrall8", "peteMotorbikeTires", "peteMotorbikeGasTank", "peteMotorbikeHeadlight", "peteMotorbikeCowling", "peteMotorbikeMuffler", "peteMotorbikeSeat", "pieStuffing", "plantingDate", "plantingLength", "plantingScript", "plumberCostumeWorn", "pokefamBoosts", "postAscensionScript", "preAscensionScript", "questClumsinessGrove", "questDoctorBag", "questECoBucket", "questESlAudit", "questESlBacteria", "questESlCheeseburger", "questESlCocktail", "questESlDebt", "questESlFish", "questESlMushStash", "questESlSalt", "questESlSprinkles", "questESpClipper", "questESpEVE", "questESpFakeMedium", "questESpGore", "questESpJunglePun", "questESpOutOfOrder", "questESpSerum", "questESpSmokes", "questEStFishTrash", "questEStGiveMeFuel", "questEStNastyBears", "questEStSocialJusticeI", "questEStSocialJusticeII", "questEStSuperLuber", "questEStWorkWithFood", "questEStZippityDooDah", "questEUNewYou", "questF01Primordial", "questF02Hyboria", "questF03Future", "questF04Elves", "questF05Clancy", "questG01Meatcar", "questG02Whitecastle", "questG03Ego", "questG04Nemesis", "questG05Dark", "questG06Delivery", "questG07Myst", "questG08Moxie", "questG09Muscle", "questGlacierOfJerks", "questGuzzlr", "questI01Scapegoat", "questI02Beat", "questL02Larva", "questL03Rat", "questL04Bat", "questL05Goblin", "questL06Friar", "questL07Cyrptic", "questL08Trapper", "questL09Topping", "questL10Garbage", "questL11Black", "questL11Business", "questL11Curses", "questL11Desert", "questL11Doctor", "questL11MacGuffin", "questL11Manor", "questL11Palindome", "questL11Pyramid", "questL11Ron", "questL11Shen", "questL11Spare", "questL11Worship", "questL12HippyFrat", "questL12War", "questL13Final", "questL13Warehouse", "questLTTQuestByWire", "questM01Untinker", "questM02Artist", "questM03Bugbear", "questM05Toot", "questM06Gourd", "questM07Hammer", "questM08Baker", "questM09Rocks", "questM10Azazel", "questM11Postal", "questM12Pirate", "questM13Escape", "questM14Bounty", "questM15Lol", "questM16Temple", "questM17Babies", "questM18Swamp", "questM19Hippy", "questM20Necklace", "questM21Dance", "questM22Shirt", "questM23Meatsmith", "questM24Doc", "questM25Armorer", "questM26Oracle", "questMaelstromOfLovers", "questPAGhost", "questRufus", "questS01OldGuy", "questS02Monkees", "raveCombo1", "raveCombo2", "raveCombo3", "raveCombo4", "raveCombo5", "raveCombo6", "recoveryScript", "relayCounters", "retroCapeSuperhero", "retroCapeWashingInstructions", "royalty", "rufusDesiredArtifact", "rufusDesiredItems", "rufusQuestTarget", "rufusQuestType", "scriptMRUList", "seahorseName", "shadowLabyrinthGoal", "shadowRiftIngress", "shenQuestItem", "shrubGarland", "shrubGifts", "shrubLights", "shrubTopper", "sideDefeated", "sidequestArenaCompleted", "sidequestFarmCompleted", "sidequestJunkyardCompleted", "sidequestLighthouseCompleted", "sidequestNunsCompleted", "sidequestOrchardCompleted", "skateParkStatus", "snowsuit", "sourceTerminalChips", "sourceTerminalEducate1", "sourceTerminalEducate2", "sourceTerminalEnquiry", "sourceTerminalEducateKnown", "sourceTerminalEnhanceKnown", "sourceTerminalEnquiryKnown", "sourceTerminalExtrudeKnown", "spadingData", "spadingScript", "speakeasyName", "spelunkyStatus", "spelunkyUpgrades", "spookyravenRecipeUsed", "stationaryButton1", "stationaryButton2", "stationaryButton3", "stationaryButton4", "stationaryButton5", "streamCrossDefaultTarget", "sweetSynthesisBlacklist", "telescope1", "telescope2", "telescope3", "telescope4", "telescope5", "testudinalTeachings", "textColors", "thanksMessage", "tomeSkillsHardcore", "tomeSkillsSoftcore", "trackVoteMonster", "trainsetConfiguration", "trapperOre", "umbrellaState", "umdLastObtained", "vintnerWineEffect", "vintnerWineName", "vintnerWineType", "violetFogLayout", "volcanoMaze1", "volcanoMaze2", "volcanoMaze3", "volcanoMaze4", "volcanoMaze5", "walfordBucketItem", "warProgress", "watchedPreferences", "workteaClue", "yourFavoriteBird", "yourFavoriteBirdMods", "youRobotCPUUpgrades", "_automatedFutureSide", "_bastilleBoosts", "_bastilleChoice1", "_bastilleChoice2", "_bastilleChoice3", "_bastilleCurrentStyles", "_bastilleEnemyCastle", "_bastilleEnemyName", "_bastilleLastBattleResults", "_bastilleLastEncounter", "_bastilleStats", "_beachHeadsUsed", "_beachLayout", "_beachMinutes", "_birdOfTheDay", "_birdOfTheDayMods", "_bittycar", "_campAwaySmileBuffSign", "_citizenZone", "_citizenZoneMods", "_cloudTalkMessage", "_cloudTalkSmoker", "_coatOfPaintModifier", "_dailySpecial", "_deckCardsSeen", "_feastedFamiliars", "_floristPlantsUsed", "_frAreasUnlocked", "_frHoursLeft", "_frMonstersKilled", "_futuristicCollarModifier", "_futuristicHatModifier", "_futuristicShirtModifier", "_horsery", "_horseryCrazyMox", "_horseryCrazyMus", "_horseryCrazyMys", "_horseryCrazyName", "_horseryCurrentName", "_horseryDarkName", "_horseryNormalName", "_horseryPaleName", "_jickJarAvailable", "_jiggleCheesedMonsters", "_lastCombatStarted", "_lastPirateRealmIsland", "_locketMonstersFought", "_mummeryMods", "_mummeryUses", "_newYouQuestSkill", "_noHatModifier", "_pantogramModifier", "_pottedPowerPlant", "_questESp", "_questPartyFair", "_questPartyFairProgress", "_questPartyFairQuest", "_roboDrinks", "_roninStoragePulls", "_savageBeastMods", "_spacegateAnimalLife", "_spacegateCoordinates", "_spacegateGear", "_spacegateHazards", "_spacegateIntelligentLife", "_spacegatePlanetName", "_spacegatePlantLife", "_stolenAccordions", "_tempRelayCounters", "_timeSpinnerFoodAvailable", "_unknownEasyBountyItem", "_unknownHardBountyItem", "_unknownSpecialBountyItem", "_untakenEasyBountyItem", "_untakenHardBountyItem", "_untakenSpecialBountyItem", "_userMods", "_villainLairColor", "_villainLairKey", "_voteLocal1", "_voteLocal2", "_voteLocal3", "_voteLocal4", "_voteMonster1", "_voteMonster2", "_voteModifier", "_VYKEACompanionType", "_VYKEACompanionRune", "_VYKEACompanionName"] as const;
export type StringProperty = typeof stringProperties[number];
export const numericOrStringProperties = ["statusEngineering", "statusGalley", "statusMedbay", "statusMorgue", "statusNavigation", "statusScienceLab", "statusSonar", "statusSpecialOps", "statusWasteProcessing", "choiceAdventure2", "choiceAdventure3", "choiceAdventure4", "choiceAdventure5", "choiceAdventure6", "choiceAdventure7", "choiceAdventure8", "choiceAdventure9", "choiceAdventure10", "choiceAdventure11", "choiceAdventure12", "choiceAdventure14", "choiceAdventure15", "choiceAdventure16", "choiceAdventure17", "choiceAdventure18", "choiceAdventure19", "choiceAdventure20", "choiceAdventure21", "choiceAdventure22", "choiceAdventure23", "choiceAdventure24", "choiceAdventure25", "choiceAdventure26", "choiceAdventure27", "choiceAdventure28", "choiceAdventure29", "choiceAdventure40", "choiceAdventure41", "choiceAdventure42", "choiceAdventure45", "choiceAdventure46", "choiceAdventure47", "choiceAdventure71", "choiceAdventure72", "choiceAdventure73", "choiceAdventure74", "choiceAdventure75", "choiceAdventure76", "choiceAdventure77", "choiceAdventure86", "choiceAdventure87", "choiceAdventure88", "choiceAdventure89", "choiceAdventure90", "choiceAdventure91", "choiceAdventure105", "choiceAdventure106", "choiceAdventure107", "choiceAdventure108", "choiceAdventure109", "choiceAdventure110", "choiceAdventure111", "choiceAdventure112", "choiceAdventure113", "choiceAdventure114", "choiceAdventure115", "choiceAdventure116", "choiceAdventure117", "choiceAdventure118", "choiceAdventure120", "choiceAdventure123", "choiceAdventure125", "choiceAdventure126", "choiceAdventure127", "choiceAdventure129", "choiceAdventure131", "choiceAdventure132", "choiceAdventure135", "choiceAdventure136", "choiceAdventure137", "choiceAdventure138", "choiceAdventure139", "choiceAdventure140", "choiceAdventure141", "choiceAdventure142", "choiceAdventure143", "choiceAdventure144", "choiceAdventure145", "choiceAdventure146", "choiceAdventure147", "choiceAdventure148", "choiceAdventure149", "choiceAdventure151", "choiceAdventure152", "choiceAdventure153", "choiceAdventure154", "choiceAdventure155", "choiceAdventure156", "choiceAdventure157", "choiceAdventure158", "choiceAdventure159", "choiceAdventure160", "choiceAdventure161", "choiceAdventure162", "choiceAdventure163", "choiceAdventure164", "choiceAdventure165", "choiceAdventure166", "choiceAdventure167", "choiceAdventure168", "choiceAdventure169", "choiceAdventure170", "choiceAdventure171", "choiceAdventure172", "choiceAdventure177", "choiceAdventure178", "choiceAdventure180", "choiceAdventure181", "choiceAdventure182", "choiceAdventure184", "choiceAdventure185", "choiceAdventure186", "choiceAdventure187", "choiceAdventure188", "choiceAdventure189", "choiceAdventure191", "choiceAdventure197", "choiceAdventure198", "choiceAdventure199", "choiceAdventure200", "choiceAdventure201", "choiceAdventure202", "choiceAdventure203", "choiceAdventure204", "choiceAdventure205", "choiceAdventure206", "choiceAdventure207", "choiceAdventure208", "choiceAdventure211", "choiceAdventure212", "choiceAdventure213", "choiceAdventure214", "choiceAdventure215", "choiceAdventure216", "choiceAdventure217", "choiceAdventure218", "choiceAdventure219", "choiceAdventure220", "choiceAdventure221", "choiceAdventure222", "choiceAdventure223", "choiceAdventure224", "choiceAdventure225", "choiceAdventure230", "choiceAdventure272", "choiceAdventure273", "choiceAdventure276", "choiceAdventure277", "choiceAdventure278", "choiceAdventure279", "choiceAdventure280", "choiceAdventure281", "choiceAdventure282", "choiceAdventure283", "choiceAdventure284", "choiceAdventure285", "choiceAdventure286", "choiceAdventure287", "choiceAdventure288", "choiceAdventure289", "choiceAdventure290", "choiceAdventure291", "choiceAdventure292", "choiceAdventure293", "choiceAdventure294", "choiceAdventure295", "choiceAdventure296", "choiceAdventure297", "choiceAdventure298", "choiceAdventure299", "choiceAdventure302", "choiceAdventure303", "choiceAdventure304", "choiceAdventure305", "choiceAdventure306", "choiceAdventure307", "choiceAdventure308", "choiceAdventure309", "choiceAdventure310", "choiceAdventure311", "choiceAdventure317", "choiceAdventure318", "choiceAdventure319", "choiceAdventure320", "choiceAdventure321", "choiceAdventure322", "choiceAdventure326", "choiceAdventure327", "choiceAdventure328", "choiceAdventure329", "choiceAdventure330", "choiceAdventure331", "choiceAdventure332", "choiceAdventure333", "choiceAdventure334", "choiceAdventure335", "choiceAdventure336", "choiceAdventure337", "choiceAdventure338", "choiceAdventure339", "choiceAdventure340", "choiceAdventure341", "choiceAdventure342", "choiceAdventure343", "choiceAdventure344", "choiceAdventure345", "choiceAdventure346", "choiceAdventure347", "choiceAdventure348", "choiceAdventure349", "choiceAdventure350", "choiceAdventure351", "choiceAdventure352", "choiceAdventure353", "choiceAdventure354", "choiceAdventure355", "choiceAdventure356", "choiceAdventure357", "choiceAdventure358", "choiceAdventure360", "choiceAdventure361", "choiceAdventure362", "choiceAdventure363", "choiceAdventure364", "choiceAdventure365", "choiceAdventure366", "choiceAdventure367", "choiceAdventure372", "choiceAdventure376", "choiceAdventure387", "choiceAdventure388", "choiceAdventure389", "choiceAdventure390", "choiceAdventure391", "choiceAdventure392", "choiceAdventure393", "choiceAdventure395", "choiceAdventure396", "choiceAdventure397", "choiceAdventure398", "choiceAdventure399", "choiceAdventure400", "choiceAdventure401", "choiceAdventure402", "choiceAdventure403", "choiceAdventure423", "choiceAdventure424", "choiceAdventure425", "choiceAdventure426", "choiceAdventure427", "choiceAdventure428", "choiceAdventure429", "choiceAdventure430", "choiceAdventure431", "choiceAdventure432", "choiceAdventure433", "choiceAdventure435", "choiceAdventure438", "choiceAdventure439", "choiceAdventure442", "choiceAdventure444", "choiceAdventure445", "choiceAdventure446", "choiceAdventure447", "choiceAdventure448", "choiceAdventure449", "choiceAdventure451", "choiceAdventure452", "choiceAdventure453", "choiceAdventure454", "choiceAdventure455", "choiceAdventure456", "choiceAdventure457", "choiceAdventure458", "choiceAdventure460", "choiceAdventure461", "choiceAdventure462", "choiceAdventure463", "choiceAdventure464", "choiceAdventure465", "choiceAdventure467", "choiceAdventure468", "choiceAdventure469", "choiceAdventure470", "choiceAdventure471", "choiceAdventure472", "choiceAdventure473", "choiceAdventure474", "choiceAdventure475", "choiceAdventure477", "choiceAdventure478", "choiceAdventure480", "choiceAdventure483", "choiceAdventure484", "choiceAdventure485", "choiceAdventure486", "choiceAdventure488", "choiceAdventure489", "choiceAdventure490", "choiceAdventure491", "choiceAdventure496", "choiceAdventure497", "choiceAdventure502", "choiceAdventure503", "choiceAdventure504", "choiceAdventure505", "choiceAdventure506", "choiceAdventure507", "choiceAdventure509", "choiceAdventure510", "choiceAdventure511", "choiceAdventure512", "choiceAdventure513", "choiceAdventure514", "choiceAdventure515", "choiceAdventure517", "choiceAdventure518", "choiceAdventure519", "choiceAdventure521", "choiceAdventure522", "choiceAdventure523", "choiceAdventure527", "choiceAdventure528", "choiceAdventure529", "choiceAdventure530", "choiceAdventure531", "choiceAdventure532", "choiceAdventure533", "choiceAdventure534", "choiceAdventure535", "choiceAdventure536", "choiceAdventure538", "choiceAdventure539", "choiceAdventure542", "choiceAdventure543", "choiceAdventure544", "choiceAdventure546", "choiceAdventure548", "choiceAdventure549", "choiceAdventure550", "choiceAdventure551", "choiceAdventure552", "choiceAdventure553", "choiceAdventure554", "choiceAdventure556", "choiceAdventure557", "choiceAdventure558", "choiceAdventure559", "choiceAdventure560", "choiceAdventure561", "choiceAdventure562", "choiceAdventure563", "choiceAdventure564", "choiceAdventure565", "choiceAdventure566", "choiceAdventure567", "choiceAdventure568", "choiceAdventure569", "choiceAdventure571", "choiceAdventure572", "choiceAdventure573", "choiceAdventure574", "choiceAdventure575", "choiceAdventure576", "choiceAdventure577", "choiceAdventure578", "choiceAdventure579", "choiceAdventure581", "choiceAdventure582", "choiceAdventure583", "choiceAdventure584", "choiceAdventure594", "choiceAdventure595", "choiceAdventure596", "choiceAdventure597", "choiceAdventure598", "choiceAdventure599", "choiceAdventure600", "choiceAdventure603", "choiceAdventure604", "choiceAdventure616", "choiceAdventure634", "choiceAdventure640", "choiceAdventure654", "choiceAdventure655", "choiceAdventure656", "choiceAdventure657", "choiceAdventure658", "choiceAdventure664", "choiceAdventure669", "choiceAdventure670", "choiceAdventure671", "choiceAdventure672", "choiceAdventure673", "choiceAdventure674", "choiceAdventure675", "choiceAdventure676", "choiceAdventure677", "choiceAdventure678", "choiceAdventure679", "choiceAdventure681", "choiceAdventure683", "choiceAdventure684", "choiceAdventure685", "choiceAdventure686", "choiceAdventure687", "choiceAdventure688", "choiceAdventure689", "choiceAdventure690", "choiceAdventure691", "choiceAdventure692", "choiceAdventure693", "choiceAdventure694", "choiceAdventure695", "choiceAdventure696", "choiceAdventure697", "choiceAdventure698", "choiceAdventure700", "choiceAdventure701", "choiceAdventure705", "choiceAdventure706", "choiceAdventure707", "choiceAdventure708", "choiceAdventure709", "choiceAdventure710", "choiceAdventure711", "choiceAdventure712", "choiceAdventure713", "choiceAdventure714", "choiceAdventure715", "choiceAdventure716", "choiceAdventure717", "choiceAdventure721", "choiceAdventure725", "choiceAdventure729", "choiceAdventure733", "choiceAdventure737", "choiceAdventure741", "choiceAdventure745", "choiceAdventure749", "choiceAdventure753", "choiceAdventure771", "choiceAdventure778", "choiceAdventure780", "choiceAdventure781", "choiceAdventure783", "choiceAdventure784", "choiceAdventure785", "choiceAdventure786", "choiceAdventure787", "choiceAdventure788", "choiceAdventure789", "choiceAdventure791", "choiceAdventure793", "choiceAdventure794", "choiceAdventure795", "choiceAdventure796", "choiceAdventure797", "choiceAdventure803", "choiceAdventure805", "choiceAdventure808", "choiceAdventure809", "choiceAdventure813", "choiceAdventure815", "choiceAdventure830", "choiceAdventure832", "choiceAdventure833", "choiceAdventure834", "choiceAdventure835", "choiceAdventure837", "choiceAdventure838", "choiceAdventure839", "choiceAdventure840", "choiceAdventure841", "choiceAdventure842", "choiceAdventure851", "choiceAdventure852", "choiceAdventure853", "choiceAdventure854", "choiceAdventure855", "choiceAdventure856", "choiceAdventure857", "choiceAdventure858", "choiceAdventure866", "choiceAdventure873", "choiceAdventure875", "choiceAdventure876", "choiceAdventure877", "choiceAdventure878", "choiceAdventure879", "choiceAdventure880", "choiceAdventure881", "choiceAdventure882", "choiceAdventure888", "choiceAdventure889", "choiceAdventure918", "choiceAdventure919", "choiceAdventure920", "choiceAdventure921", "choiceAdventure923", "choiceAdventure924", "choiceAdventure925", "choiceAdventure926", "choiceAdventure927", "choiceAdventure928", "choiceAdventure929", "choiceAdventure930", "choiceAdventure931", "choiceAdventure932", "choiceAdventure940", "choiceAdventure941", "choiceAdventure942", "choiceAdventure943", "choiceAdventure944", "choiceAdventure945", "choiceAdventure946", "choiceAdventure950", "choiceAdventure955", "choiceAdventure957", "choiceAdventure958", "choiceAdventure959", "choiceAdventure960", "choiceAdventure961", "choiceAdventure962", "choiceAdventure963", "choiceAdventure964", "choiceAdventure965", "choiceAdventure966", "choiceAdventure970", "choiceAdventure973", "choiceAdventure974", "choiceAdventure975", "choiceAdventure976", "choiceAdventure977", "choiceAdventure979", "choiceAdventure980", "choiceAdventure981", "choiceAdventure982", "choiceAdventure983", "choiceAdventure988", "choiceAdventure989", "choiceAdventure993", "choiceAdventure998", "choiceAdventure1000", "choiceAdventure1003", "choiceAdventure1005", "choiceAdventure1006", "choiceAdventure1007", "choiceAdventure1008", "choiceAdventure1009", "choiceAdventure1010", "choiceAdventure1011", "choiceAdventure1012", "choiceAdventure1013", "choiceAdventure1015", "choiceAdventure1016", "choiceAdventure1017", "choiceAdventure1018", "choiceAdventure1019", "choiceAdventure1020", "choiceAdventure1021", "choiceAdventure1022", "choiceAdventure1023", "choiceAdventure1026", "choiceAdventure1027", "choiceAdventure1028", "choiceAdventure1029", "choiceAdventure1030", "choiceAdventure1031", "choiceAdventure1032", "choiceAdventure1033", "choiceAdventure1034", "choiceAdventure1035", "choiceAdventure1036", "choiceAdventure1037", "choiceAdventure1038", "choiceAdventure1039", "choiceAdventure1040", "choiceAdventure1041", "choiceAdventure1042", "choiceAdventure1044", "choiceAdventure1045", "choiceAdventure1046", "choiceAdventure1048", "choiceAdventure1051", "choiceAdventure1052", "choiceAdventure1053", "choiceAdventure1054", "choiceAdventure1055", "choiceAdventure1056", "choiceAdventure1057", "choiceAdventure1059", "choiceAdventure1060", "choiceAdventure1061", "choiceAdventure1062", "choiceAdventure1065", "choiceAdventure1067", "choiceAdventure1068", "choiceAdventure1069", "choiceAdventure1070", "choiceAdventure1071", "choiceAdventure1073", "choiceAdventure1077", "choiceAdventure1080", "choiceAdventure1081", "choiceAdventure1082", "choiceAdventure1083", "choiceAdventure1084", "choiceAdventure1085", "choiceAdventure1091", "choiceAdventure1094", "choiceAdventure1095", "choiceAdventure1096", "choiceAdventure1097", "choiceAdventure1102", "choiceAdventure1106", "choiceAdventure1107", "choiceAdventure1108", "choiceAdventure1110", "choiceAdventure1114", "choiceAdventure1115", "choiceAdventure1116", "choiceAdventure1118", "choiceAdventure1119", "choiceAdventure1120", "choiceAdventure1121", "choiceAdventure1122", "choiceAdventure1123", "choiceAdventure1171", "choiceAdventure1172", "choiceAdventure1173", "choiceAdventure1174", "choiceAdventure1175", "choiceAdventure1193", "choiceAdventure1195", "choiceAdventure1196", "choiceAdventure1197", "choiceAdventure1198", "choiceAdventure1199", "choiceAdventure1202", "choiceAdventure1203", "choiceAdventure1204", "choiceAdventure1205", "choiceAdventure1206", "choiceAdventure1207", "choiceAdventure1208", "choiceAdventure1209", "choiceAdventure1210", "choiceAdventure1211", "choiceAdventure1212", "choiceAdventure1213", "choiceAdventure1214", "choiceAdventure1215", "choiceAdventure1219", "choiceAdventure1222", "choiceAdventure1223", "choiceAdventure1224", "choiceAdventure1225", "choiceAdventure1226", "choiceAdventure1227", "choiceAdventure1228", "choiceAdventure1229", "choiceAdventure1236", "choiceAdventure1237", "choiceAdventure1238", "choiceAdventure1239", "choiceAdventure1240", "choiceAdventure1241", "choiceAdventure1242", "choiceAdventure1243", "choiceAdventure1244", "choiceAdventure1245", "choiceAdventure1246", "choiceAdventure1247", "choiceAdventure1248", "choiceAdventure1249", "choiceAdventure1250", "choiceAdventure1251", "choiceAdventure1252", "choiceAdventure1253", "choiceAdventure1254", "choiceAdventure1255", "choiceAdventure1256", "choiceAdventure1266", "choiceAdventure1280", "choiceAdventure1281", "choiceAdventure1282", "choiceAdventure1283", "choiceAdventure1284", "choiceAdventure1285", "choiceAdventure1286", "choiceAdventure1287", "choiceAdventure1288", "choiceAdventure1289", "choiceAdventure1290", "choiceAdventure1291", "choiceAdventure1292", "choiceAdventure1293", "choiceAdventure1294", "choiceAdventure1295", "choiceAdventure1296", "choiceAdventure1297", "choiceAdventure1298", "choiceAdventure1299", "choiceAdventure1300", "choiceAdventure1301", "choiceAdventure1302", "choiceAdventure1303", "choiceAdventure1304", "choiceAdventure1305", "choiceAdventure1307", "choiceAdventure1310", "choiceAdventure1312", "choiceAdventure1313", "choiceAdventure1314", "choiceAdventure1315", "choiceAdventure1316", "choiceAdventure1317", "choiceAdventure1318", "choiceAdventure1319", "choiceAdventure1321", "choiceAdventure1322", "choiceAdventure1323", "choiceAdventure1324", "choiceAdventure1325", "choiceAdventure1326", "choiceAdventure1327", "choiceAdventure1328", "choiceAdventure1332", "choiceAdventure1333", "choiceAdventure1335", "choiceAdventure1340", "choiceAdventure1341", "choiceAdventure1345", "choiceAdventure1389", "choiceAdventure1392", "choiceAdventure1397", "choiceAdventure1399", "choiceAdventure1405", "choiceAdventure1411", "choiceAdventure1415", "choiceAdventure1427", "choiceAdventure1428", "choiceAdventure1429", "choiceAdventure1430", "choiceAdventure1431", "choiceAdventure1432", "choiceAdventure1433", "choiceAdventure1434", "choiceAdventure1436", "choiceAdventure1460", "choiceAdventure1461", "choiceAdventure1467", "choiceAdventure1468", "choiceAdventure1469", "choiceAdventure1470", "choiceAdventure1471", "choiceAdventure1472", "choiceAdventure1473", "choiceAdventure1474", "choiceAdventure1475", "choiceAdventure1486", "choiceAdventure1487", "choiceAdventure1488", "choiceAdventure1489", "choiceAdventure1491", "choiceAdventure1494", "choiceAdventure1505"] as const;
export type NumericOrStringProperty = typeof numericOrStringProperties[number];
diff --git a/src/resources/2013/Florist.ts b/src/resources/2013/Florist.ts
index 1f84272b02..75ce0814a3 100644
--- a/src/resources/2013/Florist.ts
+++ b/src/resources/2013/Florist.ts
@@ -2,13 +2,14 @@ import {
floristAvailable,
getFloristPlants,
Location,
- myLocation,
runChoice,
visitUrl,
} from "kolmafia";
import { EnvironmentType } from "../../lib";
import { mergeModifiers, Modifiers } from "../../modifier";
import { get } from "../../property";
+import { $location } from "../../template-string";
+import { notNull } from "../../utils";
type SpecialFlowerAbility = "Delevels Enemy" | "Blocks Attacks" | "Poison";
class Flower {
@@ -36,17 +37,23 @@ class Flower {
visitUrl("place.php?whichplace=forestvillage&action=fv_friar");
}
- static plantNamesInZone(location = myLocation()): string[] {
+ static plantNamesInZone(
+ location = get("lastAdventure") ?? $location.none
+ ): string[] {
return getFloristPlants()[location.toString()] ?? [];
}
- static plantsInZone(location = myLocation()): Flower[] {
+ static plantsInZone(
+ location = get("lastAdventure") ?? $location.none
+ ): Flower[] {
return this.plantNamesInZone(location)
.map((flowerName) => toFlower(flowerName))
- .filter((flower) => flower !== undefined) as Flower[];
+ .filter(notNull);
}
- static modifiersInZone(location = myLocation()): Modifiers {
+ static modifiersInZone(
+ location = get("lastAdventure") ?? $location.none
+ ): Modifiers {
const plants = this.plantsInZone(location);
if (!plants) return {};
const modifiers = plants
@@ -55,12 +62,12 @@ class Flower {
return mergeModifiers(...modifiers);
}
- isPlantedHere(location = myLocation()): boolean {
+ isPlantedHere(location = get("lastAdventure") ?? $location.none): boolean {
const plantedHere = Flower.plantNamesInZone(location)?.includes(this.name);
return plantedHere !== undefined && plantedHere;
}
- available(location = myLocation()): boolean {
+ available(location = get("lastAdventure") ?? $location.none): boolean {
return (
this.environment === (location.environment as EnvironmentType) &&
!get("_floristPlantsUsed").includes(this.name) &&
@@ -100,8 +107,8 @@ export function have(): boolean {
* @param name The flower name
* @returns a Flower instance
*/
-function toFlower(name: string): Flower | undefined {
- return all.find((flower) => name === flower.name);
+function toFlower(name: string): Flower | null {
+ return all.find((flower) => name === flower.name) ?? null;
}
/**
@@ -123,7 +130,7 @@ export function flowersIn(location: Location): Flower[] {
* @returns an array of the Flowers we can plant in that location
*/
export function flowersAvailableFor(
- location: Location = myLocation()
+ location = get("lastAdventure") ?? $location.none
): Flower[] {
return all.filter((flower) => flower.available(location));
}
@@ -132,7 +139,9 @@ export function flowersAvailableFor(
* @param location The location to check
* @returns `true` if the location has 3 flowers in it; `false` otherwise
*/
-export function isFull(location = myLocation()): boolean {
+export function isFull(
+ location = get("lastAdventure") ?? $location.none
+): boolean {
return flowersIn(location).length === 3;
}
diff --git a/src/resources/2016/SourceTerminal.ts b/src/resources/2016/SourceTerminal.ts
index 63e9822f9e..9982667408 100644
--- a/src/resources/2016/SourceTerminal.ts
+++ b/src/resources/2016/SourceTerminal.ts
@@ -131,7 +131,7 @@ export function educate(skills: Skill | [Skill, Skill]): boolean {
export function getSkills(): Skill[] {
return (["sourceTerminalEducate1", "sourceTerminalEducate2"] as const)
.map((p) => get(p))
- .filter((s) => s !== "")
+ .filter(Boolean)
.map((s) => Skill.get(s.slice(0, -4)));
}
diff --git a/src/resources/2017/AsdonMartin.ts b/src/resources/2017/AsdonMartin.ts
index c5c532984d..d57119e16d 100644
--- a/src/resources/2017/AsdonMartin.ts
+++ b/src/resources/2017/AsdonMartin.ts
@@ -31,14 +31,14 @@ enum PriceAge {
* @returns Whether the Asdon is our current active workshed
*/
export function installed(): boolean {
- return getWorkshed() === $item`Asdon Martin keyfob`;
+ return getWorkshed() === $item`Asdon Martin keyfob (on ring)`;
}
/**
* @returns `true` if we `have` the Asdon or if it's installed
*/
export function have(): boolean {
- return installed() || haveItem($item`Asdon Martin keyfob`);
+ return installed() || haveItem($item`Asdon Martin keyfob (on ring)`);
}
const fuelSkiplist = $items`cup of "tea", thermos of "whiskey", Lucky Lindy, Bee's Knees, Sockdollager, Ish Kabibble, Hot Socks, Phonus Balonus, Flivver, Sloppy Jalopy, glass of "milk"`;
diff --git a/src/resources/2019/CampAway.ts b/src/resources/2019/CampAway.ts
index 2c71d15968..8d6a191623 100644
--- a/src/resources/2019/CampAway.ts
+++ b/src/resources/2019/CampAway.ts
@@ -7,7 +7,7 @@ import {
use,
visitUrl,
} from "kolmafia";
-import { signIdToName } from "../../ascend";
+import { signIdToName } from "../../moonSign";
import { get, withChoice } from "../../property";
import { $item } from "../../template-string";
import { random } from "../../utils";
diff --git a/src/resources/2021/CrystalBall.ts b/src/resources/2021/CrystalBall.ts
index 1b12a4051c..a570e7cefc 100644
--- a/src/resources/2021/CrystalBall.ts
+++ b/src/resources/2021/CrystalBall.ts
@@ -9,8 +9,8 @@ import {
myTotalTurnsSpent,
totalTurnsPlayed,
} from "kolmafia";
-import { logger } from "../..";
import { canVisitUrl } from "../../lib";
+import logger from "../../logger";
import { get } from "../../property";
export const orb = Item.get("miniature crystal ball");
diff --git a/src/resources/2023/BurningLeaves.ts b/src/resources/2023/BurningLeaves.ts
new file mode 100644
index 0000000000..222a38028c
--- /dev/null
+++ b/src/resources/2023/BurningLeaves.ts
@@ -0,0 +1,82 @@
+import { Item, Monster, cliExecute, itemAmount, runChoice } from "kolmafia";
+import { haveInCampground } from "../../lib";
+import { get } from "../../property";
+import { $item, $monster } from "../../template-string";
+
+const item = $item`A Guide to Burning Leaves`;
+
+export const burnFor = new Map([
+ [$monster`flaming leaflet`, 11],
+ [$item`autumnic bomb`, 37],
+ [$item`impromptu torch`, 42],
+ [$item`flaming fig leaf`, 43],
+ [$item`smoldering drape`, 44],
+ [$item`distilled resin`, 50],
+ [$item`autumnal aegis`, 66],
+ [$item`lit leaf lasso`, 69],
+ [$item`forest canopy bed`, 74],
+ [$item`autumnic balm`, 99],
+ [$monster`flaming monstera`, 111],
+ [$item`day shortener`, 222],
+ [$monster`leaviathan`, 666],
+ [$item`coping juice`, 1111],
+ [$item`smoldering leafcutter ant egg`, 6666],
+ [$item`super-heated leaf`, 11111],
+]);
+
+/**
+ * @returns Whether or not we currently `have` the GuidetoBurningLeaves
+ */
+export function have(): boolean {
+ return haveInCampground(item);
+}
+
+/**
+ * @returns The number of leaves we have remaining
+ */
+export function numberOfLeaves(): number {
+ return itemAmount($item`inflammable leaf`);
+}
+
+/**
+ * @returns Whether or not we can do the requested burn
+ * @param leaves determines the number of leaves to burn
+ */
+export function burnSpecialLeaves(leaves: Item | Monster): boolean {
+ const lea = burnFor.get(leaves);
+ if (lea === undefined || lea > numberOfLeaves()) {
+ return false;
+ }
+ return cliExecute(`leaves ${leaves}`);
+}
+
+/**
+ * @returns Whether or not we can do the requested burn
+ * @param leaves determines the number of leaves to burn
+ */
+export function burnLeaves(leaves: number): boolean {
+ if (leaves > numberOfLeaves()) {
+ return false;
+ }
+ return cliExecute(`leaves ${leaves}`);
+}
+
+function visitLeaves() {
+ cliExecute("leaves");
+}
+
+/**
+ * Checks whether you can, then Jumps in the Flames
+ * @returns Whether or not you jumped in the flames
+ */
+export function jumpInFire(): boolean {
+ if (get("_leavesJumped")) {
+ return false;
+ }
+ if (get("_leavesBurned") === 0) {
+ return false;
+ }
+ visitLeaves();
+ runChoice(2);
+ return get("_leavesJumped");
+}
diff --git a/src/resources/2024/ChestMimic.ts b/src/resources/2024/ChestMimic.ts
new file mode 100644
index 0000000000..931b84eda7
--- /dev/null
+++ b/src/resources/2024/ChestMimic.ts
@@ -0,0 +1,134 @@
+import {
+ Monster,
+ runChoice,
+ runCombat,
+ toMonster,
+ visitUrl,
+ xpath,
+} from "kolmafia";
+import { directlyUse, have as have_ } from "../../lib";
+import { get } from "../../property";
+import { $familiar, $item } from "../../template-string";
+
+const familiar = $familiar`Chest Mimic`;
+
+/**
+ * @returns Whether you `have` the Chest Mimic familiar.
+ */
+export function have(): boolean {
+ return have_(familiar);
+}
+
+const visitBank = () =>
+ visitUrl("place.php?whichplace=town_right&action=townright_dna", false);
+
+const canDonate = () => have_($item`mimic egg`) && get("_mimicEggsDonated") < 3;
+const canReceive = () =>
+ familiar.experience >= 100 && get("_mimicEggsObtained") < 11;
+
+const makeXpath = (selectNumber: number, disabled: boolean): string =>
+ `//select[@name="mid][${selectNumber}]/option[position()>0]${
+ disabled ? "[@disabled]" : ""
+ }/@value`;
+
+function getMonsters(selectNumber: number, page: string): Monster[] {
+ const total = xpath(page, makeXpath(selectNumber, false));
+ const disabled = new Set(xpath(page, makeXpath(selectNumber, true)));
+ return total
+ .filter((m) => !disabled.has(m))
+ .map((id) => toMonster(Number(id)));
+}
+
+/**
+ * @returns List of monsters available for donation at this time
+ */
+export function getDonableMonsters(): Monster[] {
+ if (!canDonate()) return [];
+ const selectNumber = canReceive() ? 2 : 1;
+
+ try {
+ const page = visitBank();
+ return getMonsters(selectNumber, page);
+ } finally {
+ visitUrl("main.php");
+ }
+}
+
+/**
+ * @returns List of monsters available to receive as an egg at this time
+ */
+export function getReceivableMonsters(): Monster[] {
+ if (!canReceive()) return [];
+ try {
+ const page = visitBank();
+ return getMonsters(1, page);
+ } finally {
+ visitUrl("main.php");
+ }
+}
+
+/**
+ * Donate an egg to the DNA bank
+ *
+ * @param monster The monster whose egg you want to donate
+ * @returns Whether we succeeded in our endeavor
+ */
+export function donate(monster: Monster): boolean {
+ if (!canDonate()) return false;
+
+ try {
+ const selectNumber = canReceive() ? 2 : 1;
+ const page = visitBank();
+ const available = getMonsters(selectNumber, page);
+ if (!available.includes(monster)) return false;
+ return runChoice(1, `mid=${monster.id}`).includes(
+ "You donate your egg to science."
+ );
+ } finally {
+ visitUrl("main.php");
+ }
+}
+
+/**
+ * Receive an egg from the DNA bank
+ *
+ * @param monster The monster whose egg you want to receive
+ * @returns Whether we succeeded in our endeavor
+ */
+export function receive(monster: Monster): boolean {
+ if (!canReceive()) return false;
+
+ try {
+ const page = visitBank();
+ const available = getMonsters(1, page);
+
+ if (!available.includes(monster)) return false;
+ return runChoice(2, `mid=${monster.id}`).includes(
+ "Your mimic pops into a backroom and returns a few moments later with a fresh mimic egg!"
+ );
+ } finally {
+ visitUrl("main.php");
+ }
+}
+
+/**
+ * Differentiate a Mimic egg into a monster, and fight it!
+ *
+ * @param monster The monster to differentiate your egg into
+ * @param combat Any parameters you'd like to pass to `runCombat`
+ * @returns Whether we successfully differentiated our egg
+ */
+export function differentiate(
+ monster: Monster,
+ ...combat: Parameters
+): boolean {
+ const page = directlyUse($item`mimic egg`);
+ const monsters = getMonsters(1, page);
+ if (!monsters.includes(monster)) {
+ visitUrl("main.php");
+ return false;
+ }
+ runChoice(1, `mid=${monster.id}`);
+ runCombat(...combat);
+ return true;
+}
diff --git a/src/resources/index.ts b/src/resources/index.ts
index 19323ad27b..7d90a268d4 100644
--- a/src/resources/index.ts
+++ b/src/resources/index.ts
@@ -43,9 +43,11 @@ import * as GreyGoose from "./2022/GreyGoose";
import * as JuneCleaver from "./2022/JuneCleaver";
import * as TrainSet from "./2022/TrainSet";
import * as AugustScepter from "./2023/AugustScepter";
+import * as BurningLeaves from "./2023/BurningLeaves";
import * as CinchoDeMayo from "./2023/CinchoDeMayo";
import * as ClosedCircuitPayphone from "./2023/ClosedCircuitPayphone";
import * as CursedMonkeyPaw from "./2023/CursedMonkeyPaw";
+import * as ChestMimic from "./2024/ChestMimic";
export {
AugustScepter,
@@ -54,9 +56,11 @@ export {
Bandersnatch,
BarrelShrine,
BeachComb,
+ BurningLeaves,
CampAway,
Cartography,
ChateauMantegna,
+ ChestMimic,
CinchoDeMayo,
ClosedCircuitPayphone,
CombatLoversLocket,
diff --git a/src/session.ts b/src/session.ts
index 67c338ded2..3b6a49035b 100644
--- a/src/session.ts
+++ b/src/session.ts
@@ -118,7 +118,7 @@ function inventoryOperation(
const diffEntries: [Item, number][] = [...difference.entries()];
- return new Map
- (diffEntries.filter((value) => value[1] !== 0));
+ return new Map
- (diffEntries.filter(([, value]) => value !== 0));
}
/**
diff --git a/src/url.ts b/src/url.ts
new file mode 100644
index 0000000000..a93ea844a8
--- /dev/null
+++ b/src/url.ts
@@ -0,0 +1,85 @@
+import { visitUrl } from "kolmafia";
+
+export const EMPTY_VALUE = Symbol("empty");
+type QValue = string | number | boolean | typeof EMPTY_VALUE;
+export type QueryList = readonly (readonly [key: string, value: QValue])[];
+export type QueryObject = Record;
+export type Query = QueryList | QueryObject;
+
+type Options = {
+ method?: "GET" | "POST";
+};
+
+/**
+ * Fetches a URL and returns the response
+ * @param path Path to resource, e.g. "clan_basement.php"
+ * @param query Query parameters,
+ * either as an object, e.g. { action: "cleansewer" },
+ * or as a list of [key, value] pairs, e.g. [["action", "cleansewer"]]
+ * @param options Additional options
+ * @param options.method HTTP method to use, either "GET" or "POST", defaults to "POST"
+ * @returns the response from visiting the URL
+ */
+export function fetchUrl(
+ path: string,
+ query: Query = [],
+ options: Options = {}
+): string {
+ const { method = "POST" } = options;
+
+ const url = buildUrl(path, query);
+
+ return visitUrl(url, method === "POST", true);
+}
+
+/**
+ * Builds a URL from a path and query
+ * @param path Path to resource, e.g. "clan_basement.php"
+ * @param query Query parameters,
+ * either as an object, e.g. { action: "cleansewer" },
+ * or as a list of [key, value] pairs, e.g. [["action", "cleansewer"]]
+ * @returns the constructed URL, e.g. "clan_basement.php?action=cleansewer"
+ */
+export function buildUrl(path: string, query: Query = []): string {
+ const urlParams = Array.isArray(query) ? query : Object.entries(query);
+ if (urlParams.length === 0) {
+ return path;
+ }
+
+ const chunks = [path];
+ let sep = path.includes("?") ? "&" : "?";
+ for (const param of urlParams) {
+ if (param.length !== 2) {
+ throw new Error(`Query parameter array may only contain pair elements`);
+ }
+ const [key, value] = param;
+ chunks.push(sep);
+ sep = "&";
+ chunks.push(encodeURIComponent(key));
+ if (value !== EMPTY_VALUE) {
+ chunks.push("=");
+ chunks.push(encodeURIComponent(value));
+ }
+ }
+ return chunks.join("");
+}
+
+/**
+ * Combines a list of queries into a single query
+ * @param queries a list of query objects and/or arrays, can be mixed
+ * @returns a single query
+ */
+export function combineQuery(...queries: Query[]): Query {
+ if (queries.length === 1) {
+ return queries[0];
+ }
+ const result = [];
+ for (const query of queries) {
+ if (Array.isArray(query)) {
+ result.push(...query);
+ } else {
+ result.push(...Object.entries(query));
+ }
+ }
+ return result;
+}
diff --git a/tools/parseDefaultProperties.ts b/tools/parseDefaultProperties.ts
index 90642126e3..069d2bb234 100644
--- a/tools/parseDefaultProperties.ts
+++ b/tools/parseDefaultProperties.ts
@@ -49,6 +49,8 @@ const otherLocations = [
"nextSpookyravenElizabethRoom",
"nextSpookyravenStephenRoom",
"sourceOracleTarget",
+ "lastAdventure",
+ "nextAdventure",
];
/**
* @param property Property name
diff --git a/tools/parseItemSkillNames.ts b/tools/parseItemSkillNames.ts
index f2ea0238ea..040e58615b 100644
--- a/tools/parseItemSkillNames.ts
+++ b/tools/parseItemSkillNames.ts
@@ -32,7 +32,6 @@ async function overlappingItems(): Promise {
)
);
}
-
async function overlappingSkills(): Promise {
const response = await nodeFetch(SKILLS_FILE);
const text = await response.text();
@@ -41,8 +40,8 @@ async function overlappingSkills(): Promise {
const skills: string[] = [];
for (const line of lines) {
if (!line || line.startsWith("#") || !line.includes("\t")) continue;
- const [_id, name, _image, type, _mpCost] = line.split("\t");
- if (["5", "7", "8"].includes(type)) skills.push(name);
+ const [_id, name, _image, tags, _mpCost] = line.split("\t");
+ if (tags.split(",").includes("combat")) skills.push(name);
}
return skills.filter((name1) =>
diff --git a/yarn.lock b/yarn.lock
index be51ccb52e..8eb936be2c 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2,6 +2,11 @@
# yarn lockfile v1
+"@aashutoshrathi/word-wrap@^1.2.3":
+ version "1.2.6"
+ resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf"
+ integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==
+
"@ampproject/remapping@^2.0.0":
version "2.1.0"
resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.1.0.tgz#72becdf17ee44b2d1ac5651fb12f1952c336fe23"
@@ -9,13 +14,6 @@
dependencies:
"@jridgewell/trace-mapping" "^0.3.0"
-"@babel/code-frame@7.12.11":
- version "7.12.11"
- resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f"
- integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==
- dependencies:
- "@babel/highlight" "^7.10.4"
-
"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.7":
version "7.16.7"
resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789"
@@ -265,7 +263,7 @@
"@babel/traverse" "^7.17.0"
"@babel/types" "^7.17.0"
-"@babel/highlight@^7.10.4", "@babel/highlight@^7.16.7":
+"@babel/highlight@^7.16.7":
version "7.16.10"
resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.10.tgz#744f2eb81579d6eea753c227b0f570ad785aba88"
integrity sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==
@@ -1089,34 +1087,56 @@
resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.17.0.tgz#d2253fef7e7cd11f010f688fa4f5ebb2875f34c1"
integrity sha512-W6IIQ9Rt43I/GqfXeBFLk0TvowKBoirs9sw2LPfhHax6ayMlW5PhFzSJ76I1ac9Pk/aRcSMrHWvVyZs8ZPK2wA==
-"@eslint/eslintrc@^0.4.3":
- version "0.4.3"
- resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c"
- integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==
+"@eslint-community/eslint-utils@^4.2.0":
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59"
+ integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==
+ dependencies:
+ eslint-visitor-keys "^3.3.0"
+
+"@eslint-community/regexpp@^4.6.1":
+ version "4.10.0"
+ resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63"
+ integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==
+
+"@eslint/eslintrc@^2.1.4":
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad"
+ integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==
dependencies:
ajv "^6.12.4"
- debug "^4.1.1"
- espree "^7.3.0"
- globals "^13.9.0"
- ignore "^4.0.6"
+ debug "^4.3.2"
+ espree "^9.6.0"
+ globals "^13.19.0"
+ ignore "^5.2.0"
import-fresh "^3.2.1"
- js-yaml "^3.13.1"
- minimatch "^3.0.4"
+ js-yaml "^4.1.0"
+ minimatch "^3.1.2"
strip-json-comments "^3.1.1"
-"@humanwhocodes/config-array@^0.5.0":
- version "0.5.0"
- resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9"
- integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==
+"@eslint/js@8.56.0":
+ version "8.56.0"
+ resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.56.0.tgz#ef20350fec605a7f7035a01764731b2de0f3782b"
+ integrity sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==
+
+"@humanwhocodes/config-array@^0.11.13":
+ version "0.11.14"
+ resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b"
+ integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==
dependencies:
- "@humanwhocodes/object-schema" "^1.2.0"
- debug "^4.1.1"
- minimatch "^3.0.4"
+ "@humanwhocodes/object-schema" "^2.0.2"
+ debug "^4.3.1"
+ minimatch "^3.0.5"
-"@humanwhocodes/object-schema@^1.2.0":
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45"
- integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==
+"@humanwhocodes/module-importer@^1.0.1":
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c"
+ integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==
+
+"@humanwhocodes/object-schema@^2.0.2":
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz#d9fae00a2d5cb40f92cfe64b47ad749fbc38f917"
+ integrity sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==
"@istanbuljs/load-nyc-config@^1.0.0":
version "1.1.0"
@@ -1334,7 +1354,7 @@
resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b"
integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
-"@nodelib/fs.walk@^1.2.3":
+"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8":
version "1.2.8"
resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a"
integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==
@@ -1602,6 +1622,11 @@
"@typescript-eslint/types" "5.11.0"
eslint-visitor-keys "^3.0.0"
+"@ungap/structured-clone@^1.2.0":
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406"
+ integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==
+
abab@^2.0.3, abab@^2.0.5:
version "2.0.5"
resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a"
@@ -1615,7 +1640,7 @@ acorn-globals@^6.0.0:
acorn "^7.1.1"
acorn-walk "^7.1.1"
-acorn-jsx@^5.3.1:
+acorn-jsx@^5.3.2:
version "5.3.2"
resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
@@ -1630,7 +1655,7 @@ acorn-walk@^8.1.1:
resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1"
integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==
-acorn@^7.1.1, acorn@^7.4.0:
+acorn@^7.1.1:
version "7.4.1"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa"
integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
@@ -1640,6 +1665,11 @@ acorn@^8.2.4, acorn@^8.4.1:
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf"
integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==
+acorn@^8.9.0:
+ version "8.11.3"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a"
+ integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==
+
agent-base@6:
version "6.0.2"
resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77"
@@ -1655,7 +1685,7 @@ aggregate-error@^3.0.0:
clean-stack "^2.0.0"
indent-string "^4.0.0"
-ajv@^6.10.0, ajv@^6.12.4:
+ajv@^6.12.4:
version "6.12.6"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
@@ -1665,21 +1695,6 @@ ajv@^6.10.0, ajv@^6.12.4:
json-schema-traverse "^0.4.1"
uri-js "^4.2.2"
-ajv@^8.0.1:
- version "8.10.0"
- resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.10.0.tgz#e573f719bd3af069017e3b66538ab968d040e54d"
- integrity sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==
- dependencies:
- fast-deep-equal "^3.1.1"
- json-schema-traverse "^1.0.0"
- require-from-string "^2.0.2"
- uri-js "^4.2.2"
-
-ansi-colors@^4.1.1:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348"
- integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==
-
ansi-escapes@^4.2.1, ansi-escapes@^4.3.0:
version "4.3.2"
resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e"
@@ -1746,6 +1761,11 @@ argparse@^1.0.7:
dependencies:
sprintf-js "~1.0.2"
+argparse@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
+ integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
+
array-includes@^3.1.4:
version "3.1.4"
resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.4.tgz#f5b493162c760f3539631f005ba2bb46acb45ba9"
@@ -2174,7 +2194,7 @@ data-urls@^2.0.0:
whatwg-mimetype "^2.3.0"
whatwg-url "^8.0.0"
-debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3:
+debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3:
version "4.3.3"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664"
integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==
@@ -2302,13 +2322,6 @@ emoji-regex@^9.2.2:
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72"
integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==
-enquirer@^2.3.5:
- version "2.3.6"
- resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d"
- integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==
- dependencies:
- ansi-colors "^4.1.1"
-
error-ex@^1.3.1:
version "1.3.2"
resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
@@ -2489,13 +2502,13 @@ eslint-plugin-jsdoc@^46.5.0:
semver "^7.5.4"
spdx-expression-parse "^3.0.1"
-eslint-plugin-libram@^0.2.33:
- version "0.2.33"
- resolved "https://registry.yarnpkg.com/eslint-plugin-libram/-/eslint-plugin-libram-0.2.33.tgz#e6d1108151762857f776c9e95247fbb18b0295d9"
- integrity sha512-nQEJlxHt7h+a5zG2ZZ9qJxFrY5gQMor3g2dMQrYqDv9E32HsN5OwV3REz4cdS/eJ0GbvQnIqN2/lIHQ5GFNb7g==
+eslint-plugin-libram@^0.4.2:
+ version "0.4.2"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-libram/-/eslint-plugin-libram-0.4.2.tgz#013fe258d40f9a7ba4e8c7be7835b9daf2d1aeff"
+ integrity sha512-l2SIYEfs38CeHPlMQssTCjP7QJfnfHf2yrVJm06zfU34YP5wvKtuHO8GO9OpDowndkr+dYiEnr+vEP/CfzbvIw==
dependencies:
- html-entities "^2.3.2"
- requireindex "~1.1.0"
+ html-entities "^2.4.0"
+ requireindex "~1.2.0"
eslint-scope@^5.1.1:
version "5.1.1"
@@ -2505,12 +2518,13 @@ eslint-scope@^5.1.1:
esrecurse "^4.3.0"
estraverse "^4.1.1"
-eslint-utils@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27"
- integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==
+eslint-scope@^7.2.2:
+ version "7.2.2"
+ resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f"
+ integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==
dependencies:
- eslint-visitor-keys "^1.1.0"
+ esrecurse "^4.3.0"
+ estraverse "^5.2.0"
eslint-utils@^3.0.0:
version "3.0.0"
@@ -2519,11 +2533,6 @@ eslint-utils@^3.0.0:
dependencies:
eslint-visitor-keys "^2.0.0"
-eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e"
- integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==
-
eslint-visitor-keys@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303"
@@ -2534,74 +2543,70 @@ eslint-visitor-keys@^3.0.0:
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.2.0.tgz#6fbb166a6798ee5991358bc2daa1ba76cc1254a1"
integrity sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ==
-eslint@^7.16.0:
- version "7.32.0"
- resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d"
- integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==
- dependencies:
- "@babel/code-frame" "7.12.11"
- "@eslint/eslintrc" "^0.4.3"
- "@humanwhocodes/config-array" "^0.5.0"
- ajv "^6.10.0"
+eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3:
+ version "3.4.3"
+ resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800"
+ integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
+
+eslint@^8.56.0:
+ version "8.56.0"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.56.0.tgz#4957ce8da409dc0809f99ab07a1b94832ab74b15"
+ integrity sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==
+ dependencies:
+ "@eslint-community/eslint-utils" "^4.2.0"
+ "@eslint-community/regexpp" "^4.6.1"
+ "@eslint/eslintrc" "^2.1.4"
+ "@eslint/js" "8.56.0"
+ "@humanwhocodes/config-array" "^0.11.13"
+ "@humanwhocodes/module-importer" "^1.0.1"
+ "@nodelib/fs.walk" "^1.2.8"
+ "@ungap/structured-clone" "^1.2.0"
+ ajv "^6.12.4"
chalk "^4.0.0"
cross-spawn "^7.0.2"
- debug "^4.0.1"
+ debug "^4.3.2"
doctrine "^3.0.0"
- enquirer "^2.3.5"
escape-string-regexp "^4.0.0"
- eslint-scope "^5.1.1"
- eslint-utils "^2.1.0"
- eslint-visitor-keys "^2.0.0"
- espree "^7.3.1"
- esquery "^1.4.0"
+ eslint-scope "^7.2.2"
+ eslint-visitor-keys "^3.4.3"
+ espree "^9.6.1"
+ esquery "^1.4.2"
esutils "^2.0.2"
fast-deep-equal "^3.1.3"
file-entry-cache "^6.0.1"
- functional-red-black-tree "^1.0.1"
- glob-parent "^5.1.2"
- globals "^13.6.0"
- ignore "^4.0.6"
- import-fresh "^3.0.0"
+ find-up "^5.0.0"
+ glob-parent "^6.0.2"
+ globals "^13.19.0"
+ graphemer "^1.4.0"
+ ignore "^5.2.0"
imurmurhash "^0.1.4"
is-glob "^4.0.0"
- js-yaml "^3.13.1"
+ is-path-inside "^3.0.3"
+ js-yaml "^4.1.0"
json-stable-stringify-without-jsonify "^1.0.1"
levn "^0.4.1"
lodash.merge "^4.6.2"
- minimatch "^3.0.4"
+ minimatch "^3.1.2"
natural-compare "^1.4.0"
- optionator "^0.9.1"
- progress "^2.0.0"
- regexpp "^3.1.0"
- semver "^7.2.1"
- strip-ansi "^6.0.0"
- strip-json-comments "^3.1.0"
- table "^6.0.9"
+ optionator "^0.9.3"
+ strip-ansi "^6.0.1"
text-table "^0.2.0"
- v8-compile-cache "^2.0.3"
-espree@^7.3.0, espree@^7.3.1:
- version "7.3.1"
- resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6"
- integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==
+espree@^9.6.0, espree@^9.6.1:
+ version "9.6.1"
+ resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f"
+ integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==
dependencies:
- acorn "^7.4.0"
- acorn-jsx "^5.3.1"
- eslint-visitor-keys "^1.3.0"
+ acorn "^8.9.0"
+ acorn-jsx "^5.3.2"
+ eslint-visitor-keys "^3.4.1"
esprima@^4.0.0, esprima@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
-esquery@^1.4.0:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5"
- integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==
- dependencies:
- estraverse "^5.1.0"
-
-esquery@^1.5.0:
+esquery@^1.4.2, esquery@^1.5.0:
version "1.5.0"
resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b"
integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==
@@ -2830,6 +2835,13 @@ glob-parent@^5.1.2:
dependencies:
is-glob "^4.0.1"
+glob-parent@^6.0.2:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3"
+ integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==
+ dependencies:
+ is-glob "^4.0.3"
+
glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.7, glob@^7.2.0:
version "7.2.0"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023"
@@ -2847,10 +2859,10 @@ globals@^11.1.0:
resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
-globals@^13.6.0, globals@^13.9.0:
- version "13.12.1"
- resolved "https://registry.yarnpkg.com/globals/-/globals-13.12.1.tgz#ec206be932e6c77236677127577aa8e50bf1c5cb"
- integrity sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==
+globals@^13.19.0:
+ version "13.24.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171"
+ integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==
dependencies:
type-fest "^0.20.2"
@@ -2871,6 +2883,11 @@ graceful-fs@^4.2.9:
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96"
integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==
+graphemer@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6"
+ integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==
+
has-bigints@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113"
@@ -2912,11 +2929,6 @@ html-encoding-sniffer@^2.0.1:
dependencies:
whatwg-encoding "^1.0.5"
-html-entities@^2.3.2:
- version "2.3.3"
- resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.3.tgz#117d7626bece327fc8baace8868fa6f5ef856e46"
- integrity sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==
-
html-entities@^2.4.0:
version "2.4.0"
resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.4.0.tgz#edd0cee70402584c8c76cc2c0556db09d1f45061"
@@ -2972,17 +2984,12 @@ iconv-lite@0.4.24:
dependencies:
safer-buffer ">= 2.1.2 < 3"
-ignore@^4.0.6:
- version "4.0.6"
- resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
- integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
-
ignore@^5.1.8, ignore@^5.2.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a"
integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==
-import-fresh@^3.0.0, import-fresh@^3.2.1:
+import-fresh@^3.2.1:
version "3.3.0"
resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==
@@ -3120,6 +3127,11 @@ is-number@^7.0.0:
resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+is-path-inside@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283"
+ integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==
+
is-potential-custom-element-name@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5"
@@ -3642,6 +3654,13 @@ js-yaml@^3.13.1:
argparse "^1.0.7"
esprima "^4.0.0"
+js-yaml@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602"
+ integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==
+ dependencies:
+ argparse "^2.0.1"
+
jsdoc-type-pratt-parser@~4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz#136f0571a99c184d84ec84662c45c29ceff71114"
@@ -3700,11 +3719,6 @@ json-schema-traverse@^0.4.1:
resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
-json-schema-traverse@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2"
- integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==
-
json-stable-stringify-without-jsonify@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
@@ -3734,10 +3748,10 @@ kleur@^3.0.3:
resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e"
integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==
-kolmafia@^5.27647.0:
- version "5.27647.0"
- resolved "https://registry.yarnpkg.com/kolmafia/-/kolmafia-5.27647.0.tgz#2dc25d213840bd55627eb5217df18854a6e2d8d6"
- integrity sha512-oc62x2PBNmmF6xjeizVu3azXZp2mi2L2Fbxu4lAsf1pitldA9a2SI5Dj9M/RalgXXMi5cmNmM9xcwfFgtzikvw==
+kolmafia@^5.27668.0:
+ version "5.27668.0"
+ resolved "https://registry.yarnpkg.com/kolmafia/-/kolmafia-5.27668.0.tgz#8e22057d6d91d96e8237af028e90d9f60ca1b987"
+ integrity sha512-tOK3LvxqR7yzVgXBjoKNXOGnVtmXTXr4evhZpUMJmk3jaZ6QqWaP1Ws827YzoosBgCfiswp8O1CnuCqlXIhRzQ==
leven@^3.1.0:
version "3.1.0"
@@ -3840,11 +3854,6 @@ lodash.merge@^4.6.2:
resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
-lodash.truncate@^4.4.2:
- version "4.4.2"
- resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193"
- integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=
-
lodash@4.17.21, lodash@^4.7.0:
version "4.17.21"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
@@ -3938,6 +3947,13 @@ minimatch@^3.0.4:
dependencies:
brace-expansion "^1.1.7"
+minimatch@^3.0.5, minimatch@^3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
+ integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
+ dependencies:
+ brace-expansion "^1.1.7"
+
minimist@^1.2.0, minimist@^1.2.5:
version "1.2.5"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
@@ -4057,17 +4073,17 @@ optionator@^0.8.1:
type-check "~0.3.2"
word-wrap "~1.2.3"
-optionator@^0.9.1:
- version "0.9.1"
- resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499"
- integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==
+optionator@^0.9.3:
+ version "0.9.3"
+ resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64"
+ integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==
dependencies:
+ "@aashutoshrathi/word-wrap" "^1.2.3"
deep-is "^0.1.3"
fast-levenshtein "^2.0.6"
levn "^0.4.1"
prelude-ls "^1.2.1"
type-check "^0.4.0"
- word-wrap "^1.2.3"
p-limit@^1.1.0:
version "1.3.0"
@@ -4240,11 +4256,6 @@ pretty-format@^27.0.0, pretty-format@^27.5.1:
ansi-styles "^5.0.0"
react-is "^17.0.1"
-progress@^2.0.0:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
- integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
-
prompts@^2.0.1:
version "2.4.2"
resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069"
@@ -4302,7 +4313,7 @@ regexp-to-ast@0.4.0:
resolved "https://registry.yarnpkg.com/regexp-to-ast/-/regexp-to-ast-0.4.0.tgz#f3dbcb42726cd71902ba50193f63eab5325cd7cb"
integrity sha512-4qf/7IsIKfSNHQXSwial1IFmfM1Cc/whNBQqRwe0V2stPe7KmN1U0tWQiIx6JiirgSrisjE0eECdNf7Tav1Ntw==
-regexpp@^3.1.0, regexpp@^3.2.0:
+regexpp@^3.2.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2"
integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==
@@ -4336,15 +4347,10 @@ require-directory@^2.1.1:
resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
-require-from-string@^2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909"
- integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==
-
-requireindex@~1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/requireindex/-/requireindex-1.1.0.tgz#e5404b81557ef75db6e49c5a72004893fe03e162"
- integrity sha512-LBnkqsDE7BZKvqylbmn7lTIVdpx4K/QCduRATpO5R+wtPmky/a8pN1bO2D6wXppn1497AJF9mNjqAXr6bdl9jg==
+requireindex@~1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/requireindex/-/requireindex-1.2.0.tgz#3463cdb22ee151902635aa6c9535d4de9c2ef1ef"
+ integrity sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==
resolve-cwd@^3.0.0:
version "3.0.0"
@@ -4448,7 +4454,7 @@ semver@7.0.0:
resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e"
integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==
-semver@7.x, semver@^7.2.1, semver@^7.3.2, semver@^7.3.5:
+semver@7.x, semver@^7.3.2, semver@^7.3.5:
version "7.3.5"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7"
integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==
@@ -4604,7 +4610,7 @@ string-length@^4.0.1:
char-regex "^1.0.2"
strip-ansi "^6.0.0"
-string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
+string-width@^4.1.0, string-width@^4.2.0:
version "4.2.3"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
@@ -4667,7 +4673,7 @@ strip-final-newline@^2.0.0:
resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
-strip-json-comments@^3.1.0, strip-json-comments@^3.1.1:
+strip-json-comments@^3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
@@ -4716,17 +4722,6 @@ symbol-tree@^3.2.4:
resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2"
integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==
-table@^6.0.9:
- version "6.8.0"
- resolved "https://registry.yarnpkg.com/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca"
- integrity sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==
- dependencies:
- ajv "^8.0.1"
- lodash.truncate "^4.4.2"
- slice-ansi "^4.0.0"
- string-width "^4.2.3"
- strip-ansi "^6.0.1"
-
terminal-link@^2.0.0:
version "2.1.1"
resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994"
@@ -4959,11 +4954,6 @@ v8-compile-cache-lib@^3.0.0:
resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.0.tgz#0582bcb1c74f3a2ee46487ceecf372e46bce53e8"
integrity sha512-mpSYqfsFvASnSn5qMiwrr4VKfumbPyONLCOPmsR3A6pTY/r0+tSaVbgPWSAIuzbk3lCTa+FForeTiO+wBQGkjA==
-v8-compile-cache@^2.0.3:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee"
- integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==
-
v8-to-istanbul@^8.1.0:
version "8.1.1"
resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz#77b752fd3975e31bbcef938f85e9bd1c7a8d60ed"
@@ -5071,7 +5061,7 @@ which@^2.0.1:
dependencies:
isexe "^2.0.0"
-word-wrap@^1.2.3, word-wrap@~1.2.3:
+word-wrap@~1.2.3:
version "1.2.3"
resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==
|