';
-
- // Inject pause menu button into all story passages
- if (passage.tags && (passage.tags.includes("page") || passage.tags.includes("variation"))) {
- twPassage.html(pauseMenuHTML + twPassage.html());
- }
-});
-
-//
-// Helpers
-//
-
-// Prints a debug message to the console if in debug mode
-function debugMessage(message) {
- if (debug) console.log("DEBUG: " + message);
-}
-
-// Checks network connection
-window.story.networkCheck = function (nextPassage) {
- $.get(apiUrl + "status").done(function() {
- debugMessage("Connection to server made successfully");
-
- window.story.network = true;
- }).catch(function(error) {
- debugMessage("Connection to server failed: " + error);
-
- saveNotification = SimpleNotification.error({
- title: "Network Connection Failed!",
- text: "Could not connect to the remote server, Cloud Saving unavailable."
- }, {
- duration: 10 * 1000,
- position: "bottom-right"
- });
- // Show the next passage regardless
- }).then(function() {
- window.story.show(nextPassage);
- });
-}
-
-// Shows "No Connection" error message
-window.story.noConnection = function () {
- saveNotification = SimpleNotification.error({
- title: "Network Connection Failed!",
- text: "Could not connect to the remote server, Cloud Saving unavailable."
- }, {
- duration: 10 * 1000,
- position: "bottom-right"
- });
-}
-
-// Redirects one passage to another after a given time
-window.story.redirect = function (pageName, time = 5) {
- debugMessage(`Redirecting to ${pageName} in ${time} seconds`);
-
- let timeLeft = time;
-
- function tick() {
- if (--timeLeft === 0) window.story.show(pageName);
-
- _.delay(tick, 1000);
- }
-
- _.delay(tick, 1000);
-};
-
-// Displays text on screen after x period of time
-window.story.delayedText = function (time = 1000, id = "delayed", fadeIn = 1000) {
- debugMessage(`Showing delayed text ${id} in ${time} milliseconds`);
-
- _.delay(function() {
- $(`#${id}`).fadeIn(fadeIn);
- }, time);
-}
-
-// Sets an achievement and shows a popup
-window.story.achievement = function (chapter, shorthand, title, text) {
- try {
- if (window.story.state.achievements[chapter][shorthand]) {
- debugMessage(`Chapter ${chapter} achievement ${shorthand} already earned`);
- return;
- } else {
- debugMessage(`Chapter ${chapter} achievement ${shorthand} earned, showing ${achievements}`);
- }
-
- window.story.state.achievements[chapter][shorthand] = true;
- } catch (_) {
- window.story.state.achievements[chapter] = {};
- window.story.state.achievements[chapter][shorthand] = true;
- }
-
- if (achievements) {
- SimpleNotification.info({
- title: `Achievement: ${title}`,
- text,
- }, {
- duration: 10 * 1000,
- position: "bottom-right",
- closeButton: false,
- closeOnClick: false
- });
- }
-};
-
-// Sets a story choice
-window.story.setChoice = function (chapter, choice, value = true) {
- debugMessage(`Chapter ${chapter} choice ${choice} set to ${value}`);
-
- try {
- window.story.state.choices[chapter][choice] = value;
- } catch (_) {
- window.story.state.choices[chapter] = {};
- window.story.state.choices[chapter][choice] = value;
- }
-};
-
-// Gets a story choice
-window.story.getChoice = function (chapter, choice) {
- try {
- return window.story.state.choices[chapter][choice];
- } catch (_) {
- // TODO: Replace with an enum or similar, since
- // there are cases where the choice not being set
- // should result in a different action from the
- // choice being set to false
- return false;
- }
-};
-
-// Gets all the choices from a chapter
-window.story.getChoices = function (chapter) {
- try {
- return Object.entries(window.story.state.choices[chapter]) || [];
- } catch (_) {
- return [];
- }
-}
-
-// Returns the name picked for Tiffany
-window.story.tiffany = function () {
- try {
- return window.story.state.choices["Chapter1"]["TiffanyName"] || "Tiffany";
- } catch (_) {
- return "Tiffany";
- }
-}
-
-// Links a player's account to the current session
-window.story.linkCode = function () {
- const input = $("#linkingCode");
- const button = $("#linkingCodeButton");
- const code = input.val();
-
- saveNotification = SimpleNotification.info({
- title: "Linking account"
- }, {
- position: "bottom-right"
- });
-
- input.prop("disabled", true);
- button.attr("onclick", "");
-
- if (!code || code === "") {
- debugMessage(`Empty linking code provided`);
-
- saveNotification.setType("error");
- saveNotification.setTitle("Error: No Code");
- saveNotification.setText("No code entered!");
-
- input.prop("disabled", false);
- button.attr("onclick", "window.story.linkCode()");
- return;
- }
-
- if (code.length != 9) {
- debugMessage(`Linking code wrong length`);
-
- saveNotification.setType("error");
- saveNotification.setTitle("Error: Invalid Code");
- saveNotification.setText("Entered code is invalid!");
- input.prop("disabled", false);
- button.attr("onclick", "window.story.linkCode()");
- return;
- }
-
- $.post(apiUrl + "link", {
- code
- }).done(function(data) {
- debugMessage(`Account linked with code ${code}`);
-
- saveNotification.setType("success");
- saveNotification.setTitle("Account Linked!");
-
- window.story.player.name = data.userName;
- window.story.player.id = data.userId;
- window.story.player.key = data.userKey;
-
- debugMessage(`Name: ${window.story.player.name}, ID: ${window.story.player.id}, User Key: ${window.story.player.key}`);
-
- window.story.saving = true;
-
- window.story.show("Linked");
- }).catch(function(error) {
- debugMessage(`Account failed to link with code ${code}: ` + error);
-
- SimpleNotification.error({
- title: `Error: ${error.status}`,
- text: error.responseText
- }, {
- position: "bottom-right"
- });
-
- input.prop("disabled", false);
- button.attr("onclick", "window.story.linkCode()");
- });
-}
-
-// Saves player's game
-window.story.saveGame = function () {
- saveNotification = SimpleNotification.info({
- title: "Auto-Saving..."
- }, {
- position: "bottom-right"
- });
-
- $.post(apiUrl + "save", {
- key: window.story.player.key,
- data: {
- saveSlot: window.story.saveSlot,
- saveData: JSON.stringify(window.story.state)
- }
- }).done(function() {
- debugMessage("Game saved");
-
- saveNotification.setType("success");
- saveNotification.setTitle("Auto-Save Complete!");
- }).catch(function(error) {
- debugMessage("Game failed to save: " + error);
-
- saveNotification.setType("error");
- saveNotification.setTitle("Auto-Save Failed!");
- saveNotification.setText(error.responseText);
- });
-}
-
-// Loads all player saves
-window.story.loadSaves = function (newGame = false) {
- $.post(apiUrl + "saves", {
- key: window.story.player.key
- }).done(function(data) {
- debugMessage(`Loaded ${data.length} saves for ${window.story.player.key}`);
-
- $("#slotsLoading").hide();
-
- if (data.length === 0 && !newGame) {
- saveNotification = SimpleNotification.message({
- title: "No Saved Games!"
- }, {
- position: "bottom-right"
- });
- return;
- }
-
- if (!newGame) {
- $.each( data, function( _, value ) {
- const lastUsed = new Date(value.lastActive);
- $("#savesContainer").append(`Save Slot ${value.slot} Chapter: ${value.data.lastPassage.charAt(1)} Last passage: ${value.data.lastPassage} Last Used: ${lastUsed.toLocaleDateString()}`);
- });
- } else {
- $.each( data, function( _, value ) {
- $("#saveSlot" + value.slot).text("Save Slot " + value.slot + " (In Use)");
- });
- }
-
- if (newGame) {
- $("#saveSlotSelector").fadeIn(500);
- } else {
- $("#savesContainer").fadeIn(500);
- }
- }).catch(function(error) {
- debugMessage(`Failed to load saves for ${window.story.player.key}: ` + error);
-
- saveNotification = SimpleNotification.error({
- title: "Load Failed!",
- text: error.responseText
- }, {
- position: "bottom-right"
- });
- });
-}
-
-// Loads a player's save
-window.story.loadSave = function (saveSlot) {
- window.story.show("Loading Save");
-
- saveNotification = SimpleNotification.info({
- title: "Loading Save..."
- }, {
- position: "bottom-right"
- });
-
- $.post(apiUrl + "load", {
- key: window.story.player.key,
- saveSlot: saveSlot,
- }).done(function(data) {
- debugMessage(`Loaded save ${saveSlot} for ${window.story.player.key}`);
-
- justLoaded = true;
-
- window.story.state = data;
- window.story.saveSlot = saveSlot;
-
- saveNotification.setType("success");
- saveNotification.setTitle("Save Loaded!");
-
- _.delay(function() {
- window.story.show(window.story.state.lastPassage);
- }, 1000);
- }).catch(function(error) {
- debugMessage(`Failed to load save ${saveSlot} for ${window.story.player.key}: ` + error);
-
- saveNotification.setType("error");
- saveNotification.setTitle("Load Failed!");
- saveNotification.setText(error.responseText);
-
- _.delay(function() {
- window.story.show("Saved Games");
- }, 1000);
- });
-}
-
-// Hides generate button and shows linking form
-window.story.toggleLinkingDisplays = function (reverse = false) {
- debugMessage(`Linking buttons toggled (${reverse})`);
-
- if (!reverse) {
- $("#generateButton").hide();
- $("#linkingForm").show();
- } else {
- $("#generateButton").show();
- $("#linkingForm").hide();
- }
-}
-
-// Selects a slot of a new game, and starts new game
-window.story.selectSlot = function () {
- debugMessage(`Starting game in save slot ${$("#slots").val()}`);
-
- window.story.saveSlot = $("#slots").val();
-
- saveNotification = SimpleNotification.info({
- title: "Save Slot " + window.story.saveSlot + " Selected"
- }, {
- position: "bottom-right"
- });
-
- _.delay(function() {
- window.story.show("C1 Intro");
- }, 1000);
-}
-
-// Shows an example save notification
-window.story.exampleSave = function () {
- saveNotification = SimpleNotification.info({
- title: "Auto-Saving..."
- }, {
- position: "bottom-right"
- });
-
- _.delay(function() {
- saveNotification.setType("success");
- saveNotification.setTitle("Auto-Save Complete!");
- }, 1000);
-}
-
-// Toggles Debug Mode off
-window.story.toggleDebug = function () {
- debugMessage(`Debug toggled (${!debug})`);
-
- debug = !debug;
-
- if (debug) {
- debugNotification = SimpleNotification.message({
- title: "Alpha Build",
- text: "Content subject to change!",
- }, {
- position: "bottom-right",
- sticky: true,
- closeButton: false,
- closeOnClick: false
- });
- } else {
- debugNotification.remove();
- }
-
- SimpleNotification.info({
- title: `Debug Mode ${debug ? "Enabled" : "Disabled"}`
- }, {
- duration: 2 * 1000,
- position: "bottom-right",
- closeButton: false,
- closeOnClick: false
- });
-}
-
-// Toggles Custom Font
-window.story.toggleFont = function () {
- debugMessage(`Font toggled (${!font})`);
-
- font = !font;
-
- if (font) {
- $("body").css({
- "font-size": "unset",
- "font": "27px 'DeadWalking', Arial, sans-serif"
- });
- } else {
- $("body").css({
- "font": "unset",
- "font-size": "27px"
- });
- }
-
- SimpleNotification.info({
- title: `Font ${font ? "Enabled" : "Disabled"}`
- }, {
- duration: 2 * 1000,
- position: "bottom-right",
- closeButton: false,
- closeOnClick: false
- });
-}
-
-// Loads statistics
-window.story.loadStats = function () {
- $.post(apiUrl + "stats", {
- key: window.story.player.key,
- chapter: window.story.state.chapter
- }).done(function(data) {
- debugMessage(`Loaded ${data.length} stats for chapter ${window.story.state.chapter} ${window.story.player.key}`);
-
- $("#statsLoading").hide();
-
- for (const stat in data) {
- if (
- !window.story.state.choices[window.story.state.chapter] ||
- // If choice was never set, not to be confused with choice being set to false
- !Object.prototype.hasOwnProperty.call(window.story.state.choices[window.story.state.chapter], stat)
- ) {
- continue;
- }
-
- let message;
-
- if (window.story.getChoice(window.story.state.chapter, stat)) {
- message = `You and ${data[stat][0]} of players ${window.story.choiceDescriptions[window.story.state.chapter][stat][0]}`;
- } else {
- message = `You and ${data[stat][1]} of players ${window.story.choiceDescriptions[window.story.state.chapter][stat][1]}`;
- }
-
- $("#statsContainer").append(`
${message}
`);
- }
-
- $("#statsContainer").fadeIn(500);
- }).catch(function(error) {
- debugMessage(`Failed to load stats for chapter ${window.story.state.chapter} ${window.story.player.key}`);
-
- saveNotification = SimpleNotification.error({
- title: "Load Failed!",
- text: error.responseText
- }, {
- position: "bottom-right"
- });
- });
-}
-
-// Loads achievements
-window.story.loadAchievements = function () {
- // Fake loading to allow the passage to load or else jQuery won't make the changes
- _.delay(function() {
- $("#achievementsLoading").hide();
-
- let earnedAchievements = 0;
- const totalAchievements = Object.entries(window.story.achievementDescriptions[window.story.state.chapter]).length;
-
- $("#achievementsCounter").text(`${earnedAchievements}/${totalAchievements} Achievements Earned`);
-
- for (const [internal, [name, description]] of Object.entries(window.story.achievementDescriptions[window.story.state.chapter])) {
- if (!window.story.state.achievements[window.story.state.chapter] || !window.story.state.achievements[window.story.state.chapter][internal]) {
- continue;
- }
-
- $("#achievementsCounter").text(`${++earnedAchievements}/${totalAchievements} Achievements Earned`);
-
- $("#achievementsContainer").append(`
- ${name}: ${description.replaceAll("*", "")}
`);
- }
-
- if (totalAchievements > 0) $("#achievementsContainer").append(``);
-
- $("#achievementsCounter").fadeIn(500);
- $("#achievementsContainer").fadeIn(500);
- }, 1000);
-}
-
-// Toggles opening of pause menu
-window.story.pauseMenu = function () {
- debugMessage(`Pause menu toggled (${prePausePassage == null})`);
-
- if (prePausePassage == null) {
- prePausePassage = window.passage.name;
-
- window.story.show("Pause Menu");
- } else {
- window.story.show(prePausePassage);
-
- prePausePassage = null;
- }
-}
-
-// Toggles showing of achievements
-window.story.toggleAchievements = function () {
- debugMessage(`Achievements toggled (${!achievements})`);
-
- achievements = !achievements;
-
- SimpleNotification.info({
- title: `Achievements ${achievements ? "Enabled" : "Disabled"}`
- }, {
- duration: 2 * 1000,
- position: "bottom-right",
- closeButton: false,
- closeOnClick: false
- });
-}
-
-// Renders a passage and replaces text
-window.story.customRender = function (passageName) {
- const passage = window.story.passage(passageName);
-
- // Replace %Tiffany% with what the player chose to call Tiffany
- if (passage.source.includes("%Tiffany%")) {
- passage.source = passage.source.replaceAll("%Tiffany%", window.story.tiffany());
- }
-
- return window.story.render(passageName);
-}
-
-//
-// External Scripts
-//
-
-// toggleFullscreen.js
-// https://gist.github.com/demonixis/5188326
-window.story.toggleFullscreen = function (event) {
- let element = document.documentElement;
-
- if (event instanceof HTMLElement) element = event;
-
- const isFullscreen = document.webkitIsFullScreen || document.mozFullScreen || false;
-
- debugMessage(`Fullscreen toggled (${!isFullscreen})`);
-
- element.requestFullScreen = element.requestFullScreen || element.webkitRequestFullScreen || element.mozRequestFullScreen || function () { return false; };
- document.cancelFullScreen = document.cancelFullScreen || document.webkitCancelFullScreen || document.mozCancelFullScreen || function () { return false; };
-
- isFullscreen ? document.cancelFullScreen() : element.requestFullScreen();
-}
-
-// SimpleNotification
-// https://github.com/Glagan/SimpleNotification
-// https://github.com/Glagan/SimpleNotification/blob/master/LICENSE
-const simpleNotification = document.createElement("script");
-simpleNotification.src = "assets/javascript/simpleNotification.min.js";
-
-document.head.appendChild(simpleNotification);
-
-///
-/// Initialization
-///
-
-// Adds Favicons
-$("head").append('');
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index 4ada893..3e2a2b1 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,151 +1,213 @@
{
"name": "purpose",
"version": "1.1.0",
- "lockfileVersion": 2,
+ "lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "purpose",
"version": "1.1.0",
"devDependencies": {
- "eslint": "^8.26.0",
- "stylelint": "^14.14.0",
- "stylelint-config-standard": "^29.0.0"
+ "eslint": "^9.21.0",
+ "shx": "^0.3.4",
+ "stylelint": "^16.14.1",
+ "stylelint-config-standard": "^37.0.0"
}
},
"node_modules/@babel/code-frame": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz",
- "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==",
+ "version": "7.26.2",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz",
+ "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/highlight": "^7.18.6"
+ "@babel/helper-validator-identifier": "^7.25.9",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.0.0"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-validator-identifier": {
- "version": "7.19.1",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz",
- "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
+ "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
- "node_modules/@babel/highlight": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz",
- "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==",
+ "node_modules/@csstools/css-parser-algorithms": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz",
+ "integrity": "sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==",
"dev": true,
- "dependencies": {
- "@babel/helper-validator-identifier": "^7.18.6",
- "chalk": "^2.0.0",
- "js-tokens": "^4.0.0"
- },
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT",
"engines": {
- "node": ">=6.9.0"
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@csstools/css-tokenizer": "^3.0.3"
}
},
- "node_modules/@babel/highlight/node_modules/ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "node_modules/@csstools/css-tokenizer": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz",
+ "integrity": "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==",
"dev": true,
- "dependencies": {
- "color-convert": "^1.9.0"
- },
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT",
"engines": {
- "node": ">=4"
+ "node": ">=18"
}
},
- "node_modules/@babel/highlight/node_modules/chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "node_modules/@csstools/media-query-list-parser": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.2.tgz",
+ "integrity": "sha512-EUos465uvVvMJehckATTlNqGj4UJWkTmdWuDMjqvSUkjGpmOyFZBVwb4knxCm/k2GMTXY+c/5RkdndzFYWeX5A==",
"dev": true,
- "dependencies": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- },
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT",
"engines": {
- "node": ">=4"
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@csstools/css-parser-algorithms": "^3.0.4",
+ "@csstools/css-tokenizer": "^3.0.3"
}
},
- "node_modules/@babel/highlight/node_modules/color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "node_modules/@csstools/selector-specificity": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz",
+ "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==",
"dev": true,
- "dependencies": {
- "color-name": "1.1.3"
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss-selector-parser": "^7.0.0"
}
},
- "node_modules/@babel/highlight/node_modules/color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
- "dev": true
+ "node_modules/@dual-bundle/import-meta-resolve": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz",
+ "integrity": "sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
},
- "node_modules/@babel/highlight/node_modules/escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz",
+ "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==",
"dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "eslint-visitor-keys": "^3.4.3"
+ },
"engines": {
- "node": ">=0.8.0"
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
}
},
- "node_modules/@babel/highlight/node_modules/has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.12.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
+ "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=4"
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
}
},
- "node_modules/@babel/highlight/node_modules/supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "node_modules/@eslint/config-array": {
+ "version": "0.19.2",
+ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.2.tgz",
+ "integrity": "sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==",
"dev": true,
+ "license": "Apache-2.0",
"dependencies": {
- "has-flag": "^3.0.0"
+ "@eslint/object-schema": "^2.1.6",
+ "debug": "^4.3.1",
+ "minimatch": "^3.1.2"
},
"engines": {
- "node": ">=4"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
- "node_modules/@csstools/selector-specificity": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.0.2.tgz",
- "integrity": "sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg==",
+ "node_modules/@eslint/core": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.12.0.tgz",
+ "integrity": "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==",
"dev": true,
- "engines": {
- "node": "^12 || ^14 || >=16"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/csstools"
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@types/json-schema": "^7.0.15"
},
- "peerDependencies": {
- "postcss": "^8.2",
- "postcss-selector-parser": "^6.0.10"
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
"node_modules/@eslint/eslintrc": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz",
- "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==",
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.0.tgz",
+ "integrity": "sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"ajv": "^6.12.4",
"debug": "^4.3.2",
- "espree": "^9.4.0",
- "globals": "^13.15.0",
+ "espree": "^10.0.1",
+ "globals": "^14.0.0",
"ignore": "^5.2.0",
"import-fresh": "^3.2.1",
"js-yaml": "^4.1.0",
@@ -153,24 +215,82 @@
"strip-json-comments": "^3.1.1"
},
"engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"url": "https://opencollective.com/eslint"
}
},
- "node_modules/@humanwhocodes/config-array": {
- "version": "0.11.6",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.6.tgz",
- "integrity": "sha512-jJr+hPTJYKyDILJfhNSHsjiwXYf26Flsz8DvNndOsHs5pwSnpGUEy8yzF0JYhCEvTDdV2vuOK5tt8BVhwO5/hg==",
+ "node_modules/@eslint/js": {
+ "version": "9.21.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.21.0.tgz",
+ "integrity": "sha512-BqStZ3HX8Yz6LvsF5ByXYrtigrV5AXADWLAGc7PH/1SxOb7/FIYYMszZZWiUou/GB9P2lXWk2SV4d+Z8h0nknw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/object-schema": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz",
+ "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/plugin-kit": {
+ "version": "0.2.7",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.7.tgz",
+ "integrity": "sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/core": "^0.12.0",
+ "levn": "^0.4.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@humanfs/core": {
+ "version": "0.19.1",
+ "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
+ "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanfs/node": {
+ "version": "0.16.6",
+ "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz",
+ "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==",
"dev": true,
+ "license": "Apache-2.0",
"dependencies": {
- "@humanwhocodes/object-schema": "^1.2.1",
- "debug": "^4.1.1",
- "minimatch": "^3.0.4"
+ "@humanfs/core": "^0.19.1",
+ "@humanwhocodes/retry": "^0.3.0"
},
"engines": {
- "node": ">=10.10.0"
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz",
+ "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
}
},
"node_modules/@humanwhocodes/module-importer": {
@@ -178,6 +298,7 @@
"resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
"integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
"dev": true,
+ "license": "Apache-2.0",
"engines": {
"node": ">=12.22"
},
@@ -186,17 +307,36 @@
"url": "https://github.com/sponsors/nzakas"
}
},
- "node_modules/@humanwhocodes/object-schema": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
- "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
- "dev": true
+ "node_modules/@humanwhocodes/retry": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz",
+ "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@keyv/serialize": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.0.3.tgz",
+ "integrity": "sha512-qnEovoOp5Np2JDGonIDL6Ayihw0RhnRh6vxPuHo4RDn1UOzwEo4AeIfpL6UGIrsceWrCMiVPgwRjbHu4vYFc3g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "buffer": "^6.0.3"
+ }
},
"node_modules/@nodelib/fs.scandir": {
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
"integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@nodelib/fs.stat": "2.0.5",
"run-parallel": "^1.1.9"
@@ -210,6 +350,7 @@
"resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
"integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">= 8"
}
@@ -219,6 +360,7 @@
"resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
"integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@nodelib/fs.scandir": "2.1.5",
"fastq": "^1.6.0"
@@ -227,29 +369,26 @@
"node": ">= 8"
}
},
- "node_modules/@types/minimist": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz",
- "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==",
- "dev": true
- },
- "node_modules/@types/normalize-package-data": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz",
- "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==",
- "dev": true
+ "node_modules/@types/estree": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
+ "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
+ "dev": true,
+ "license": "MIT"
},
- "node_modules/@types/parse-json": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
- "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==",
- "dev": true
+ "node_modules/@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/acorn": {
- "version": "8.8.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz",
- "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==",
+ "version": "8.14.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz",
+ "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==",
"dev": true,
+ "license": "MIT",
"bin": {
"acorn": "bin/acorn"
},
@@ -262,6 +401,7 @@
"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
"integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
"dev": true,
+ "license": "MIT",
"peerDependencies": {
"acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
}
@@ -271,6 +411,7 @@
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
@@ -287,6 +428,7 @@
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=8"
}
@@ -296,6 +438,7 @@
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"color-convert": "^2.0.1"
},
@@ -310,31 +453,25 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
- "dev": true
+ "dev": true,
+ "license": "Python-2.0"
},
"node_modules/array-union": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
"integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=8"
}
},
- "node_modules/arrify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
- "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/astral-regex": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
"integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=8"
}
@@ -343,63 +480,108 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
},
"node_modules/brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
}
},
"node_modules/braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "fill-range": "^7.0.1"
+ "fill-range": "^7.1.1"
},
"engines": {
"node": ">=8"
}
},
- "node_modules/callsites": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
- "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "node_modules/buffer": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
+ "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
"dev": true,
- "engines": {
- "node": ">=6"
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.2.1"
}
},
- "node_modules/camelcase": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
- "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "node_modules/cacheable": {
+ "version": "1.8.8",
+ "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-1.8.8.tgz",
+ "integrity": "sha512-OE1/jlarWxROUIpd0qGBSKFLkNsotY8pt4GeiVErUYh/NUeTNrT+SBksUgllQv4m6a0W/VZsLuiHb88maavqEw==",
"dev": true,
- "engines": {
- "node": ">=6"
+ "license": "MIT",
+ "dependencies": {
+ "hookified": "^1.7.0",
+ "keyv": "^5.2.3"
}
},
- "node_modules/camelcase-keys": {
- "version": "6.2.2",
- "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz",
- "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==",
+ "node_modules/cacheable/node_modules/keyv": {
+ "version": "5.2.3",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.2.3.tgz",
+ "integrity": "sha512-AGKecUfzrowabUv0bH1RIR5Vf7w+l4S3xtQAypKaUpTdIR1EbrAcTxHCrpo9Q+IWeUlFE2palRtgIQcgm+PQJw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "camelcase": "^5.3.1",
- "map-obj": "^4.0.0",
- "quick-lru": "^4.0.1"
- },
+ "@keyv/serialize": "^1.0.2"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=6"
}
},
"node_modules/chalk": {
@@ -407,6 +589,7 @@
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
@@ -423,6 +606,7 @@
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"color-name": "~1.1.4"
},
@@ -434,41 +618,56 @@
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/colord": {
"version": "2.9.3",
"resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz",
"integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/cosmiconfig": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz",
- "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==",
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz",
+ "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@types/parse-json": "^4.0.0",
- "import-fresh": "^3.2.1",
- "parse-json": "^5.0.0",
- "path-type": "^4.0.0",
- "yaml": "^1.10.0"
+ "env-paths": "^2.2.1",
+ "import-fresh": "^3.3.0",
+ "js-yaml": "^4.1.0",
+ "parse-json": "^5.2.0"
},
"engines": {
- "node": ">=10"
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/d-fischer"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.9.5"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
}
},
"node_modules/cross-spawn": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
- "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"path-key": "^3.1.0",
"shebang-command": "^2.0.0",
@@ -479,12 +678,27 @@
}
},
"node_modules/css-functions-list": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.3.tgz",
+ "integrity": "sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12 || >=16"
+ }
+ },
+ "node_modules/css-tree": {
"version": "3.1.0",
- "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.1.0.tgz",
- "integrity": "sha512-/9lCvYZaUbBGvYUgYGFJ4dcYiyqdhSjG7IPVluoV8A1ILjkF7ilmhp1OGUz8n+nmBcu0RNrQAzgD8B6FJbrt2w==",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz",
+ "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==",
"dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mdn-data": "2.12.2",
+ "source-map-js": "^1.0.1"
+ },
"engines": {
- "node": ">=12.22"
+ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0"
}
},
"node_modules/cssesc": {
@@ -492,6 +706,7 @@
"resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
"integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
"dev": true,
+ "license": "MIT",
"bin": {
"cssesc": "bin/cssesc"
},
@@ -500,12 +715,13 @@
}
},
"node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
+ "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "ms": "2.1.2"
+ "ms": "^2.1.3"
},
"engines": {
"node": ">=6.0"
@@ -516,48 +732,19 @@
}
}
},
- "node_modules/decamelize": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
- "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/decamelize-keys": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz",
- "integrity": "sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg==",
- "dev": true,
- "dependencies": {
- "decamelize": "^1.1.0",
- "map-obj": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/decamelize-keys/node_modules/map-obj": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
- "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/deep-is": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
"integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/dir-glob": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
"integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"path-type": "^4.0.0"
},
@@ -565,29 +752,29 @@
"node": ">=8"
}
},
- "node_modules/doctrine": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
- "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
- "dev": true,
- "dependencies": {
- "esutils": "^2.0.2"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
"node_modules/emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
- "node_modules/error-ex": {
- "version": "1.3.2",
+ "node_modules/env-paths": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
+ "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/error-ex": {
+ "version": "1.3.2",
"resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
"integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"is-arrayish": "^0.2.1"
}
@@ -597,6 +784,7 @@
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
"integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=10"
},
@@ -605,132 +793,145 @@
}
},
"node_modules/eslint": {
- "version": "8.26.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.26.0.tgz",
- "integrity": "sha512-kzJkpaw1Bfwheq4VXUezFriD1GxszX6dUekM7Z3aC2o4hju+tsR/XyTC3RcoSD7jmy9VkPU3+N6YjVU2e96Oyg==",
- "dev": true,
- "dependencies": {
- "@eslint/eslintrc": "^1.3.3",
- "@humanwhocodes/config-array": "^0.11.6",
+ "version": "9.21.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.21.0.tgz",
+ "integrity": "sha512-KjeihdFqTPhOMXTt7StsDxriV4n66ueuF/jfPNC3j/lduHwr/ijDwJMsF+wyMJethgiKi5wniIE243vi07d3pg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@eslint-community/regexpp": "^4.12.1",
+ "@eslint/config-array": "^0.19.2",
+ "@eslint/core": "^0.12.0",
+ "@eslint/eslintrc": "^3.3.0",
+ "@eslint/js": "9.21.0",
+ "@eslint/plugin-kit": "^0.2.7",
+ "@humanfs/node": "^0.16.6",
"@humanwhocodes/module-importer": "^1.0.1",
- "@nodelib/fs.walk": "^1.2.8",
- "ajv": "^6.10.0",
+ "@humanwhocodes/retry": "^0.4.2",
+ "@types/estree": "^1.0.6",
+ "@types/json-schema": "^7.0.15",
+ "ajv": "^6.12.4",
"chalk": "^4.0.0",
- "cross-spawn": "^7.0.2",
+ "cross-spawn": "^7.0.6",
"debug": "^4.3.2",
- "doctrine": "^3.0.0",
"escape-string-regexp": "^4.0.0",
- "eslint-scope": "^7.1.1",
- "eslint-utils": "^3.0.0",
- "eslint-visitor-keys": "^3.3.0",
- "espree": "^9.4.0",
- "esquery": "^1.4.0",
+ "eslint-scope": "^8.2.0",
+ "eslint-visitor-keys": "^4.2.0",
+ "espree": "^10.3.0",
+ "esquery": "^1.5.0",
"esutils": "^2.0.2",
"fast-deep-equal": "^3.1.3",
- "file-entry-cache": "^6.0.1",
+ "file-entry-cache": "^8.0.0",
"find-up": "^5.0.0",
"glob-parent": "^6.0.2",
- "globals": "^13.15.0",
- "grapheme-splitter": "^1.0.4",
"ignore": "^5.2.0",
- "import-fresh": "^3.0.0",
"imurmurhash": "^0.1.4",
"is-glob": "^4.0.0",
- "is-path-inside": "^3.0.3",
- "js-sdsl": "^4.1.4",
- "js-yaml": "^4.1.0",
"json-stable-stringify-without-jsonify": "^1.0.1",
- "levn": "^0.4.1",
"lodash.merge": "^4.6.2",
"minimatch": "^3.1.2",
"natural-compare": "^1.4.0",
- "optionator": "^0.9.1",
- "regexpp": "^3.2.0",
- "strip-ansi": "^6.0.1",
- "strip-json-comments": "^3.1.0",
- "text-table": "^0.2.0"
+ "optionator": "^0.9.3"
},
"bin": {
"eslint": "bin/eslint.js"
},
"engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
- "url": "https://opencollective.com/eslint"
+ "url": "https://eslint.org/donate"
+ },
+ "peerDependencies": {
+ "jiti": "*"
+ },
+ "peerDependenciesMeta": {
+ "jiti": {
+ "optional": true
+ }
}
},
"node_modules/eslint-scope": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz",
- "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==",
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz",
+ "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==",
"dev": true,
+ "license": "BSD-2-Clause",
"dependencies": {
"esrecurse": "^4.3.0",
"estraverse": "^5.2.0"
},
"engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- }
- },
- "node_modules/eslint-utils": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
- "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
- "dev": true,
- "dependencies": {
- "eslint-visitor-keys": "^2.0.0"
- },
- "engines": {
- "node": "^10.0.0 || ^12.0.0 || >= 14.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
- "url": "https://github.com/sponsors/mysticatea"
- },
- "peerDependencies": {
- "eslint": ">=5"
+ "url": "https://opencollective.com/eslint"
}
},
- "node_modules/eslint-utils/node_modules/eslint-visitor-keys": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
- "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+ "node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
"dev": true,
+ "license": "Apache-2.0",
"engines": {
- "node": ">=10"
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
}
},
- "node_modules/eslint-visitor-keys": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
- "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
+ "node_modules/eslint/node_modules/eslint-visitor-keys": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz",
+ "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==",
"dev": true,
+ "license": "Apache-2.0",
"engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
}
},
"node_modules/espree": {
- "version": "9.4.0",
- "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz",
- "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==",
+ "version": "10.3.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz",
+ "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==",
"dev": true,
+ "license": "BSD-2-Clause",
"dependencies": {
- "acorn": "^8.8.0",
+ "acorn": "^8.14.0",
"acorn-jsx": "^5.3.2",
- "eslint-visitor-keys": "^3.3.0"
+ "eslint-visitor-keys": "^4.2.0"
},
"engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/espree/node_modules/eslint-visitor-keys": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz",
+ "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"url": "https://opencollective.com/eslint"
}
},
"node_modules/esquery": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
- "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
+ "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
"dev": true,
+ "license": "BSD-3-Clause",
"dependencies": {
"estraverse": "^5.1.0"
},
@@ -743,6 +944,7 @@
"resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
"integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
"dev": true,
+ "license": "BSD-2-Clause",
"dependencies": {
"estraverse": "^5.2.0"
},
@@ -755,6 +957,7 @@
"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
"integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
"dev": true,
+ "license": "BSD-2-Clause",
"engines": {
"node": ">=4.0"
}
@@ -764,6 +967,7 @@
"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
"integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
"dev": true,
+ "license": "BSD-2-Clause",
"engines": {
"node": ">=0.10.0"
}
@@ -772,19 +976,21 @@
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/fast-glob": {
- "version": "3.2.12",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz",
- "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==",
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@nodelib/fs.stat": "^2.0.2",
"@nodelib/fs.walk": "^1.2.3",
"glob-parent": "^5.1.2",
"merge2": "^1.3.0",
- "micromatch": "^4.0.4"
+ "micromatch": "^4.0.8"
},
"engines": {
"node": ">=8.6.0"
@@ -795,6 +1001,7 @@
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"dev": true,
+ "license": "ISC",
"dependencies": {
"is-glob": "^4.0.1"
},
@@ -806,49 +1013,72 @@
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
"integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/fast-levenshtein": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
"integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-uri": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz",
+ "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
+ ],
+ "license": "BSD-3-Clause"
},
"node_modules/fastest-levenshtein": {
"version": "1.0.16",
"resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz",
"integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">= 4.9.1"
}
},
"node_modules/fastq": {
- "version": "1.13.0",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
- "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
+ "version": "1.19.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.0.tgz",
+ "integrity": "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==",
"dev": true,
+ "license": "ISC",
"dependencies": {
"reusify": "^1.0.4"
}
},
"node_modules/file-entry-cache": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
- "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
+ "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "flat-cache": "^3.0.4"
+ "flat-cache": "^4.0.0"
},
"engines": {
- "node": "^10.12.0 || >=12.0.0"
+ "node": ">=16.0.0"
}
},
"node_modules/fill-range": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
- "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"to-regex-range": "^5.0.1"
},
@@ -861,6 +1091,7 @@
"resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
"integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"locate-path": "^6.0.0",
"path-exists": "^4.0.0"
@@ -873,41 +1104,50 @@
}
},
"node_modules/flat-cache": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
- "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
+ "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "flatted": "^3.1.0",
- "rimraf": "^3.0.2"
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.4"
},
"engines": {
- "node": "^10.12.0 || >=12.0.0"
+ "node": ">=16"
}
},
"node_modules/flatted": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz",
- "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==",
- "dev": true
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz",
+ "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==",
+ "dev": true,
+ "license": "ISC"
},
"node_modules/fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
"integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
- "dev": true
+ "dev": true,
+ "license": "ISC"
},
"node_modules/function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
- "dev": true
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
},
"node_modules/glob": {
"version": "7.2.3",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
"integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
"dev": true,
+ "license": "ISC",
"dependencies": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
@@ -928,6 +1168,7 @@
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
"integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
"dev": true,
+ "license": "ISC",
"dependencies": {
"is-glob": "^4.0.3"
},
@@ -940,6 +1181,7 @@
"resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
"integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"global-prefix": "^3.0.0"
},
@@ -952,6 +1194,7 @@
"resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
"integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"ini": "^1.3.5",
"kind-of": "^6.0.2",
@@ -966,6 +1209,7 @@
"resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
"integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
"dev": true,
+ "license": "ISC",
"dependencies": {
"isexe": "^2.0.0"
},
@@ -974,15 +1218,13 @@
}
},
"node_modules/globals": {
- "version": "13.17.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz",
- "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==",
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
+ "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
"dev": true,
- "dependencies": {
- "type-fest": "^0.20.2"
- },
+ "license": "MIT",
"engines": {
- "node": ">=8"
+ "node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
@@ -993,6 +1235,7 @@
"resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
"integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"array-union": "^2.1.0",
"dir-glob": "^3.0.1",
@@ -1012,61 +1255,45 @@
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz",
"integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==",
- "dev": true
- },
- "node_modules/grapheme-splitter": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz",
- "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==",
- "dev": true
- },
- "node_modules/hard-rejection": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz",
- "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==",
"dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/has": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
- "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
- "dev": true,
- "dependencies": {
- "function-bind": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4.0"
- }
+ "license": "MIT"
},
"node_modules/has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=8"
}
},
- "node_modules/hosted-git-info": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
- "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==",
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "lru-cache": "^6.0.0"
+ "function-bind": "^1.1.2"
},
"engines": {
- "node": ">=10"
+ "node": ">= 0.4"
}
},
+ "node_modules/hookified": {
+ "version": "1.7.1",
+ "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.7.1.tgz",
+ "integrity": "sha512-OXcdHsXeOiD7OJ5zvWj8Oy/6RCdLwntAX+wUrfemNcMGn6sux4xbEHi2QXwqePYhjQ/yvxxq2MvCRirdlHscBw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/html-tags": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz",
- "integrity": "sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==",
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz",
+ "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=8"
},
@@ -1074,20 +1301,43 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "BSD-3-Clause"
+ },
"node_modules/ignore": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
- "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">= 4"
}
},
"node_modules/import-fresh": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
- "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
+ "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"parent-module": "^1.0.0",
"resolve-from": "^4.0.0"
@@ -1099,38 +1349,23 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/import-lazy": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz",
- "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/imurmurhash": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
"integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=0.8.19"
}
},
- "node_modules/indent-string": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
- "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/inflight": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
"integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
"dev": true,
+ "license": "ISC",
"dependencies": {
"once": "^1.3.0",
"wrappy": "1"
@@ -1140,27 +1375,44 @@
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
- "dev": true
+ "dev": true,
+ "license": "ISC"
},
"node_modules/ini": {
"version": "1.3.8",
"resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
"integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
- "dev": true
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/interpret": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz",
+ "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.10"
+ }
},
"node_modules/is-arrayish": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
"integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/is-core-module": {
- "version": "2.11.0",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz",
- "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==",
+ "version": "2.16.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
+ "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "has": "^1.0.3"
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -1171,6 +1423,7 @@
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
"integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=0.10.0"
}
@@ -1180,6 +1433,7 @@
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=8"
}
@@ -1189,6 +1443,7 @@
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"is-extglob": "^2.1.1"
},
@@ -1201,33 +1456,17 @@
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=0.12.0"
}
},
- "node_modules/is-path-inside": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
- "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-plain-obj": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
- "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/is-plain-object": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
"integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=0.10.0"
}
@@ -1236,25 +1475,22 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
- "dev": true
- },
- "node_modules/js-sdsl": {
- "version": "4.1.5",
- "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz",
- "integrity": "sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==",
- "dev": true
+ "dev": true,
+ "license": "ISC"
},
"node_modules/js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/js-yaml": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
"integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"argparse": "^2.0.1"
},
@@ -1262,44 +1498,67 @@
"js-yaml": "bin/js-yaml.js"
}
},
+ "node_modules/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/json-parse-even-better-errors": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
"integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/json-schema-traverse": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/json-stable-stringify-without-jsonify": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
"integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/keyv": {
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "json-buffer": "3.0.1"
+ }
},
"node_modules/kind-of": {
"version": "6.0.3",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
"integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/known-css-properties": {
- "version": "0.25.0",
- "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.25.0.tgz",
- "integrity": "sha512-b0/9J1O9Jcyik1GC6KC42hJ41jKwdO/Mq8Mdo5sYN+IuRTXs2YFHZC3kZSx6ueusqa95x3wLYe/ytKjbAfGixA==",
- "dev": true
+ "version": "0.35.0",
+ "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.35.0.tgz",
+ "integrity": "sha512-a/RAk2BfKk+WFGhhOCAYqSiFLc34k8Mt/6NWRI4joER0EYUzXIcFivjjnoD3+XU1DggLn/tZc3DOAgke7l8a4A==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/levn": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
"integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"prelude-ls": "^1.2.1",
"type-check": "~0.4.0"
@@ -1312,13 +1571,15 @@
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
"integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/locate-path": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
"integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"p-locate": "^5.0.0"
},
@@ -1333,81 +1594,42 @@
"version": "4.6.2",
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
"integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/lodash.truncate": {
"version": "4.4.2",
"resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
"integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==",
- "dev": true
- },
- "node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "dev": true,
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/map-obj": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz",
- "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==",
"dev": true,
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
+ "license": "MIT"
},
"node_modules/mathml-tag-names": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz",
"integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==",
"dev": true,
+ "license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/wooorm"
}
},
- "node_modules/meow": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz",
- "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==",
+ "node_modules/mdn-data": {
+ "version": "2.12.2",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz",
+ "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==",
"dev": true,
- "dependencies": {
- "@types/minimist": "^1.2.0",
- "camelcase-keys": "^6.2.2",
- "decamelize": "^1.2.0",
- "decamelize-keys": "^1.1.0",
- "hard-rejection": "^2.1.0",
- "minimist-options": "4.1.0",
- "normalize-package-data": "^3.0.0",
- "read-pkg-up": "^7.0.1",
- "redent": "^3.0.0",
- "trim-newlines": "^3.0.0",
- "type-fest": "^0.18.0",
- "yargs-parser": "^20.2.3"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
+ "license": "CC0-1.0"
},
- "node_modules/meow/node_modules/type-fest": {
- "version": "0.18.1",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz",
- "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==",
+ "node_modules/meow": {
+ "version": "13.2.0",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz",
+ "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=10"
+ "node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
@@ -1418,37 +1640,31 @@
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
"integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">= 8"
}
},
"node_modules/micromatch": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
- "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "braces": "^3.0.2",
+ "braces": "^3.0.3",
"picomatch": "^2.3.1"
},
"engines": {
"node": ">=8.6"
}
},
- "node_modules/min-indent": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
- "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
"node_modules/minimatch": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"dev": true,
+ "license": "ISC",
"dependencies": {
"brace-expansion": "^1.1.7"
},
@@ -1456,31 +1672,35 @@
"node": "*"
}
},
- "node_modules/minimist-options": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz",
- "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==",
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
"dev": true,
- "dependencies": {
- "arrify": "^1.0.1",
- "is-plain-obj": "^1.1.0",
- "kind-of": "^6.0.3"
- },
- "engines": {
- "node": ">= 6"
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/nanoid": {
- "version": "3.3.4",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
- "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==",
+ "version": "3.3.8",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz",
+ "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==",
"dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
"bin": {
"nanoid": "bin/nanoid.cjs"
},
@@ -1492,28 +1712,15 @@
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
"integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
- "dev": true
- },
- "node_modules/normalize-package-data": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz",
- "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==",
"dev": true,
- "dependencies": {
- "hosted-git-info": "^4.0.1",
- "is-core-module": "^2.5.0",
- "semver": "^7.3.4",
- "validate-npm-package-license": "^3.0.1"
- },
- "engines": {
- "node": ">=10"
- }
+ "license": "MIT"
},
"node_modules/normalize-path": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=0.10.0"
}
@@ -1523,22 +1730,24 @@
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
"dev": true,
+ "license": "ISC",
"dependencies": {
"wrappy": "1"
}
},
"node_modules/optionator": {
- "version": "0.9.1",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
- "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+ "version": "0.9.4",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
+ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"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"
+ "word-wrap": "^1.2.5"
},
"engines": {
"node": ">= 0.8.0"
@@ -1549,6 +1758,7 @@
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
"integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"yocto-queue": "^0.1.0"
},
@@ -1564,6 +1774,7 @@
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
"integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"p-limit": "^3.0.2"
},
@@ -1574,20 +1785,12 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/p-try": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
- "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
"node_modules/parent-module": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
"integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"callsites": "^3.0.0"
},
@@ -1600,6 +1803,7 @@
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
"integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@babel/code-frame": "^7.0.0",
"error-ex": "^1.3.1",
@@ -1618,6 +1822,7 @@
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=8"
}
@@ -1627,6 +1832,7 @@
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=0.10.0"
}
@@ -1636,6 +1842,7 @@
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
"integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=8"
}
@@ -1644,28 +1851,32 @@
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/path-type": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
"integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/picocolors": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
- "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
- "dev": true
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "dev": true,
+ "license": "ISC"
},
"node_modules/picomatch": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=8.6"
},
@@ -1674,9 +1885,9 @@
}
},
"node_modules/postcss": {
- "version": "8.4.18",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz",
- "integrity": "sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==",
+ "version": "8.5.3",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz",
+ "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==",
"dev": true,
"funding": [
{
@@ -1686,50 +1897,62 @@
{
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
}
],
+ "license": "MIT",
"dependencies": {
- "nanoid": "^3.3.4",
- "picocolors": "^1.0.0",
- "source-map-js": "^1.0.2"
+ "nanoid": "^3.3.8",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
},
"engines": {
"node": "^10 || ^12 || >=14"
}
},
- "node_modules/postcss-media-query-parser": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz",
- "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==",
- "dev": true
- },
"node_modules/postcss-resolve-nested-selector": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz",
- "integrity": "sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==",
- "dev": true
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz",
+ "integrity": "sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/postcss-safe-parser": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz",
- "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==",
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz",
+ "integrity": "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==",
"dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss-safe-parser"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
"engines": {
- "node": ">=12.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
+ "node": ">=18.0"
},
"peerDependencies": {
- "postcss": "^8.3.3"
+ "postcss": "^8.4.31"
}
},
"node_modules/postcss-selector-parser": {
- "version": "6.0.10",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz",
- "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==",
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz",
+ "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"cssesc": "^3.0.0",
"util-deprecate": "^1.0.2"
@@ -1742,22 +1965,25 @@
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
"integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/prelude-ls": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
"integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">= 0.8.0"
}
},
"node_modules/punycode": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
- "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=6"
}
@@ -1780,169 +2006,19 @@
"type": "consulting",
"url": "https://feross.org/support"
}
- ]
- },
- "node_modules/quick-lru": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz",
- "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/read-pkg": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
- "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
- "dev": true,
- "dependencies": {
- "@types/normalize-package-data": "^2.4.0",
- "normalize-package-data": "^2.5.0",
- "parse-json": "^5.0.0",
- "type-fest": "^0.6.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/read-pkg-up": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
- "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
- "dev": true,
- "dependencies": {
- "find-up": "^4.1.0",
- "read-pkg": "^5.2.0",
- "type-fest": "^0.8.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/read-pkg-up/node_modules/find-up": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
- "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
- "dev": true,
- "dependencies": {
- "locate-path": "^5.0.0",
- "path-exists": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/read-pkg-up/node_modules/locate-path": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
- "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
- "dev": true,
- "dependencies": {
- "p-locate": "^4.1.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/read-pkg-up/node_modules/p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
- "dev": true,
- "dependencies": {
- "p-try": "^2.0.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/read-pkg-up/node_modules/p-locate": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
- "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
- "dev": true,
- "dependencies": {
- "p-limit": "^2.2.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/read-pkg-up/node_modules/type-fest": {
- "version": "0.8.1",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
- "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/read-pkg/node_modules/hosted-git-info": {
- "version": "2.8.9",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
- "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
- "dev": true
- },
- "node_modules/read-pkg/node_modules/normalize-package-data": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
- "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
- "dev": true,
- "dependencies": {
- "hosted-git-info": "^2.1.4",
- "resolve": "^1.10.0",
- "semver": "2 || 3 || 4 || 5",
- "validate-npm-package-license": "^3.0.1"
- }
- },
- "node_modules/read-pkg/node_modules/semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
- "dev": true,
- "bin": {
- "semver": "bin/semver"
- }
- },
- "node_modules/read-pkg/node_modules/type-fest": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
- "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
+ ],
+ "license": "MIT"
},
- "node_modules/redent": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
- "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
+ "node_modules/rechoir": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
+ "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==",
"dev": true,
"dependencies": {
- "indent-string": "^4.0.0",
- "strip-indent": "^3.0.0"
+ "resolve": "^1.1.6"
},
"engines": {
- "node": ">=8"
- }
- },
- "node_modules/regexpp": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
- "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
- "dev": true,
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/mysticatea"
+ "node": ">= 0.10"
}
},
"node_modules/require-from-string": {
@@ -1950,23 +2026,28 @@
"resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
"integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/resolve": {
- "version": "1.22.1",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
- "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
+ "version": "1.22.10",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
+ "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "is-core-module": "^2.9.0",
+ "is-core-module": "^2.16.0",
"path-parse": "^1.0.7",
"supports-preserve-symlinks-flag": "^1.0.0"
},
"bin": {
"resolve": "bin/resolve"
},
+ "engines": {
+ "node": ">= 0.4"
+ },
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
@@ -1976,35 +2057,22 @@
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
"integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=4"
}
},
"node_modules/reusify": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
- "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
+ "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
"dev": true,
+ "license": "MIT",
"engines": {
"iojs": ">=1.0.0",
"node": ">=0.10.0"
}
},
- "node_modules/rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "dev": true,
- "dependencies": {
- "glob": "^7.1.3"
- },
- "bin": {
- "rimraf": "bin.js"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
"node_modules/run-parallel": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
@@ -2024,30 +2092,17 @@
"url": "https://feross.org/support"
}
],
+ "license": "MIT",
"dependencies": {
"queue-microtask": "^1.2.2"
}
},
- "node_modules/semver": {
- "version": "7.3.8",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
- "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
- "dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/shebang-command": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
"integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"shebang-regex": "^3.0.0"
},
@@ -2060,21 +2115,65 @@
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=8"
}
},
+ "node_modules/shelljs": {
+ "version": "0.8.5",
+ "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz",
+ "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "glob": "^7.0.0",
+ "interpret": "^1.0.0",
+ "rechoir": "^0.6.2"
+ },
+ "bin": {
+ "shjs": "bin/shjs"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/shx": {
+ "version": "0.3.4",
+ "resolved": "https://registry.npmjs.org/shx/-/shx-0.3.4.tgz",
+ "integrity": "sha512-N6A9MLVqjxZYcVn8hLmtneQWIJtp8IKzMP4eMnx+nqkvXoqinUPCbUFLp2UcWTEIUONhlk0ewxr/jaVGlc+J+g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "minimist": "^1.2.3",
+ "shelljs": "^0.8.5"
+ },
+ "bin": {
+ "shx": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/signal-exit": {
- "version": "3.0.7",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
- "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
- "dev": true
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
},
"node_modules/slash": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
"integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=8"
}
@@ -2084,6 +2183,7 @@
"resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
"integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"ansi-styles": "^4.0.0",
"astral-regex": "^2.0.0",
@@ -2097,51 +2197,21 @@
}
},
"node_modules/source-map-js": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
- "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
"dev": true,
+ "license": "BSD-3-Clause",
"engines": {
"node": ">=0.10.0"
}
},
- "node_modules/spdx-correct": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
- "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
- "dev": true,
- "dependencies": {
- "spdx-expression-parse": "^3.0.0",
- "spdx-license-ids": "^3.0.0"
- }
- },
- "node_modules/spdx-exceptions": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
- "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
- "dev": true
- },
- "node_modules/spdx-expression-parse": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
- "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
- "dev": true,
- "dependencies": {
- "spdx-exceptions": "^2.1.0",
- "spdx-license-ids": "^3.0.0"
- }
- },
- "node_modules/spdx-license-ids": {
- "version": "3.0.12",
- "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz",
- "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==",
- "dev": true
- },
"node_modules/string-width": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
@@ -2156,6 +2226,7 @@
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"ansi-regex": "^5.0.1"
},
@@ -2163,23 +2234,12 @@
"node": ">=8"
}
},
- "node_modules/strip-indent": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
- "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
- "dev": true,
- "dependencies": {
- "min-indent": "^1.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/strip-json-comments": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
"integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=8"
},
@@ -2187,100 +2247,163 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/style-search": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz",
- "integrity": "sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==",
- "dev": true
- },
"node_modules/stylelint": {
- "version": "14.14.0",
- "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-14.14.0.tgz",
- "integrity": "sha512-yUI+4xXfPHVnueYddSQ/e1GuEA/2wVhWQbGj16AmWLtQJtn28lVxfS4b0CsWyVRPgd3Auzi0NXOthIEUhtQmmA==",
+ "version": "16.14.1",
+ "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.14.1.tgz",
+ "integrity": "sha512-oqCL7AC3786oTax35T/nuLL8p2C3k/8rHKAooezrPGRvUX0wX+qqs5kMWh5YYT4PHQgVDobHT4tw55WgpYG6Sw==",
"dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/stylelint"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/stylelint"
+ }
+ ],
+ "license": "MIT",
"dependencies": {
- "@csstools/selector-specificity": "^2.0.2",
+ "@csstools/css-parser-algorithms": "^3.0.4",
+ "@csstools/css-tokenizer": "^3.0.3",
+ "@csstools/media-query-list-parser": "^4.0.2",
+ "@csstools/selector-specificity": "^5.0.0",
+ "@dual-bundle/import-meta-resolve": "^4.1.0",
"balanced-match": "^2.0.0",
"colord": "^2.9.3",
- "cosmiconfig": "^7.0.1",
- "css-functions-list": "^3.1.0",
- "debug": "^4.3.4",
- "fast-glob": "^3.2.12",
+ "cosmiconfig": "^9.0.0",
+ "css-functions-list": "^3.2.3",
+ "css-tree": "^3.1.0",
+ "debug": "^4.3.7",
+ "fast-glob": "^3.3.3",
"fastest-levenshtein": "^1.0.16",
- "file-entry-cache": "^6.0.1",
+ "file-entry-cache": "^10.0.5",
"global-modules": "^2.0.0",
"globby": "^11.1.0",
"globjoin": "^0.1.4",
- "html-tags": "^3.2.0",
- "ignore": "^5.2.0",
- "import-lazy": "^4.0.0",
+ "html-tags": "^3.3.1",
+ "ignore": "^7.0.3",
"imurmurhash": "^0.1.4",
"is-plain-object": "^5.0.0",
- "known-css-properties": "^0.25.0",
+ "known-css-properties": "^0.35.0",
"mathml-tag-names": "^2.1.3",
- "meow": "^9.0.0",
- "micromatch": "^4.0.5",
+ "meow": "^13.2.0",
+ "micromatch": "^4.0.8",
"normalize-path": "^3.0.0",
- "picocolors": "^1.0.0",
- "postcss": "^8.4.17",
- "postcss-media-query-parser": "^0.2.3",
- "postcss-resolve-nested-selector": "^0.1.1",
- "postcss-safe-parser": "^6.0.0",
- "postcss-selector-parser": "^6.0.10",
+ "picocolors": "^1.1.1",
+ "postcss": "^8.5.1",
+ "postcss-resolve-nested-selector": "^0.1.6",
+ "postcss-safe-parser": "^7.0.1",
+ "postcss-selector-parser": "^7.0.0",
"postcss-value-parser": "^4.2.0",
"resolve-from": "^5.0.0",
"string-width": "^4.2.3",
- "strip-ansi": "^6.0.1",
- "style-search": "^0.1.0",
- "supports-hyperlinks": "^2.3.0",
+ "supports-hyperlinks": "^3.1.0",
"svg-tags": "^1.0.0",
- "table": "^6.8.0",
- "v8-compile-cache": "^2.3.0",
- "write-file-atomic": "^4.0.2"
+ "table": "^6.9.0",
+ "write-file-atomic": "^5.0.1"
},
"bin": {
- "stylelint": "bin/stylelint.js"
+ "stylelint": "bin/stylelint.mjs"
},
"engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/stylelint"
+ "node": ">=18.12.0"
}
},
"node_modules/stylelint-config-recommended": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-9.0.0.tgz",
- "integrity": "sha512-9YQSrJq4NvvRuTbzDsWX3rrFOzOlYBmZP+o513BJN/yfEmGSr0AxdvrWs0P/ilSpVV/wisamAHu5XSk8Rcf4CQ==",
+ "version": "15.0.0",
+ "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-15.0.0.tgz",
+ "integrity": "sha512-9LejMFsat7L+NXttdHdTq94byn25TD+82bzGRiV1Pgasl99pWnwipXS5DguTpp3nP1XjvLXVnEJIuYBfsRjRkA==",
"dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/stylelint"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/stylelint"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.12.0"
+ },
"peerDependencies": {
- "stylelint": "^14.10.0"
+ "stylelint": "^16.13.0"
}
},
"node_modules/stylelint-config-standard": {
- "version": "29.0.0",
- "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-29.0.0.tgz",
- "integrity": "sha512-uy8tZLbfq6ZrXy4JKu3W+7lYLgRQBxYTUUB88vPgQ+ZzAxdrvcaSUW9hOMNLYBnwH+9Kkj19M2DHdZ4gKwI7tg==",
+ "version": "37.0.0",
+ "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-37.0.0.tgz",
+ "integrity": "sha512-+6eBlbSTrOn/il2RlV0zYGQwRTkr+WtzuVSs1reaWGObxnxLpbcspCUYajVQHonVfxVw2U+h42azGhrBvcg8OA==",
"dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/stylelint"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/stylelint"
+ }
+ ],
+ "license": "MIT",
"dependencies": {
- "stylelint-config-recommended": "^9.0.0"
+ "stylelint-config-recommended": "^15.0.0"
+ },
+ "engines": {
+ "node": ">=18.12.0"
},
"peerDependencies": {
- "stylelint": "^14.14.0"
+ "stylelint": "^16.13.0"
}
},
"node_modules/stylelint/node_modules/balanced-match": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz",
"integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/stylelint/node_modules/file-entry-cache": {
+ "version": "10.0.6",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-10.0.6.tgz",
+ "integrity": "sha512-0wvv16mVo9nN0Md3k7DMjgAPKG/TY4F/gYMBVb/wMThFRJvzrpaqBFqF6km9wf8QfYTN+mNg5aeaBLfy8k35uA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flat-cache": "^6.1.6"
+ }
+ },
+ "node_modules/stylelint/node_modules/flat-cache": {
+ "version": "6.1.6",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.6.tgz",
+ "integrity": "sha512-F+CKgSwp0pzLx67u+Zy1aCueVWFAHWbXepvXlZ+bWVTaASbm5SyCnSJ80Fp1ePEmS57wU+Bf6cx6525qtMZ4lQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cacheable": "^1.8.8",
+ "flatted": "^3.3.2",
+ "hookified": "^1.7.0"
+ }
+ },
+ "node_modules/stylelint/node_modules/ignore": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.3.tgz",
+ "integrity": "sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
},
"node_modules/stylelint/node_modules/resolve-from": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
"integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=8"
}
@@ -2290,6 +2413,7 @@
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"has-flag": "^4.0.0"
},
@@ -2298,16 +2422,20 @@
}
},
"node_modules/supports-hyperlinks": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz",
- "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==",
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.2.0.tgz",
+ "integrity": "sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"has-flag": "^4.0.0",
"supports-color": "^7.0.0"
},
"engines": {
- "node": ">=8"
+ "node": ">=14.18"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-hyperlinks?sponsor=1"
}
},
"node_modules/supports-preserve-symlinks-flag": {
@@ -2315,6 +2443,7 @@
"resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">= 0.4"
},
@@ -2329,10 +2458,11 @@
"dev": true
},
"node_modules/table": {
- "version": "6.8.0",
- "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz",
- "integrity": "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==",
+ "version": "6.9.0",
+ "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz",
+ "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==",
"dev": true,
+ "license": "BSD-3-Clause",
"dependencies": {
"ajv": "^8.0.1",
"lodash.truncate": "^4.4.2",
@@ -2345,15 +2475,16 @@
}
},
"node_modules/table/node_modules/ajv": {
- "version": "8.11.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz",
- "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==",
+ "version": "8.17.1",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
+ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "fast-deep-equal": "^3.1.1",
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
"json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2",
- "uri-js": "^4.2.2"
+ "require-from-string": "^2.0.2"
},
"funding": {
"type": "github",
@@ -2364,19 +2495,15 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
- "dev": true
- },
- "node_modules/text-table": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
- "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"is-number": "^7.0.0"
},
@@ -2384,20 +2511,12 @@
"node": ">=8.0"
}
},
- "node_modules/trim-newlines": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz",
- "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/type-check": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
"integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"prelude-ls": "^1.2.1"
},
@@ -2405,23 +2524,12 @@
"node": ">= 0.8.0"
}
},
- "node_modules/type-fest": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
- "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/uri-js": {
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
"integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
"dev": true,
+ "license": "BSD-2-Clause",
"dependencies": {
"punycode": "^2.1.0"
}
@@ -2430,29 +2538,15 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
- "dev": true
- },
- "node_modules/v8-compile-cache": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
- "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
- "dev": true
- },
- "node_modules/validate-npm-package-license": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
- "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
"dev": true,
- "dependencies": {
- "spdx-correct": "^3.0.0",
- "spdx-expression-parse": "^3.0.0"
- }
+ "license": "MIT"
},
"node_modules/which": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
"dev": true,
+ "license": "ISC",
"dependencies": {
"isexe": "^2.0.0"
},
@@ -2464,10 +2558,11 @@
}
},
"node_modules/word-wrap": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
- "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=0.10.0"
}
@@ -2476,43 +2571,21 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
- "dev": true
+ "dev": true,
+ "license": "ISC"
},
"node_modules/write-file-atomic": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz",
- "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==",
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz",
+ "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==",
"dev": true,
+ "license": "ISC",
"dependencies": {
"imurmurhash": "^0.1.4",
- "signal-exit": "^3.0.7"
+ "signal-exit": "^4.0.1"
},
"engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
- "dev": true
- },
- "node_modules/yaml": {
- "version": "1.10.2",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
- "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
- "dev": true,
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/yargs-parser": {
- "version": "20.2.9",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
- "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
- "dev": true,
- "engines": {
- "node": ">=10"
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
"node_modules/yocto-queue": {
@@ -2520,6 +2593,7 @@
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
"integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=10"
},
@@ -2527,1872 +2601,5 @@
"url": "https://github.com/sponsors/sindresorhus"
}
}
- },
- "dependencies": {
- "@babel/code-frame": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz",
- "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==",
- "dev": true,
- "requires": {
- "@babel/highlight": "^7.18.6"
- }
- },
- "@babel/helper-validator-identifier": {
- "version": "7.19.1",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz",
- "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==",
- "dev": true
- },
- "@babel/highlight": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz",
- "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==",
- "dev": true,
- "requires": {
- "@babel/helper-validator-identifier": "^7.18.6",
- "chalk": "^2.0.0",
- "js-tokens": "^4.0.0"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "requires": {
- "color-convert": "^1.9.0"
- }
- },
- "chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "requires": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- }
- },
- "color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dev": true,
- "requires": {
- "color-name": "1.1.3"
- }
- },
- "color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
- "dev": true
- },
- "escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
- "dev": true
- },
- "has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
- "dev": true
- },
- "supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "requires": {
- "has-flag": "^3.0.0"
- }
- }
- }
- },
- "@csstools/selector-specificity": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.0.2.tgz",
- "integrity": "sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg==",
- "dev": true,
- "requires": {}
- },
- "@eslint/eslintrc": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz",
- "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==",
- "dev": true,
- "requires": {
- "ajv": "^6.12.4",
- "debug": "^4.3.2",
- "espree": "^9.4.0",
- "globals": "^13.15.0",
- "ignore": "^5.2.0",
- "import-fresh": "^3.2.1",
- "js-yaml": "^4.1.0",
- "minimatch": "^3.1.2",
- "strip-json-comments": "^3.1.1"
- }
- },
- "@humanwhocodes/config-array": {
- "version": "0.11.6",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.6.tgz",
- "integrity": "sha512-jJr+hPTJYKyDILJfhNSHsjiwXYf26Flsz8DvNndOsHs5pwSnpGUEy8yzF0JYhCEvTDdV2vuOK5tt8BVhwO5/hg==",
- "dev": true,
- "requires": {
- "@humanwhocodes/object-schema": "^1.2.1",
- "debug": "^4.1.1",
- "minimatch": "^3.0.4"
- }
- },
- "@humanwhocodes/module-importer": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
- "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
- "dev": true
- },
- "@humanwhocodes/object-schema": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
- "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
- "dev": true
- },
- "@nodelib/fs.scandir": {
- "version": "2.1.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
- "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
- "dev": true,
- "requires": {
- "@nodelib/fs.stat": "2.0.5",
- "run-parallel": "^1.1.9"
- }
- },
- "@nodelib/fs.stat": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
- "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
- "dev": true
- },
- "@nodelib/fs.walk": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
- "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
- "dev": true,
- "requires": {
- "@nodelib/fs.scandir": "2.1.5",
- "fastq": "^1.6.0"
- }
- },
- "@types/minimist": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz",
- "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==",
- "dev": true
- },
- "@types/normalize-package-data": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz",
- "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==",
- "dev": true
- },
- "@types/parse-json": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
- "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==",
- "dev": true
- },
- "acorn": {
- "version": "8.8.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz",
- "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==",
- "dev": true
- },
- "acorn-jsx": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
- "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
- "dev": true,
- "requires": {}
- },
- "ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
- "dev": true,
- "requires": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
- }
- },
- "ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "dev": true
- },
- "ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "requires": {
- "color-convert": "^2.0.1"
- }
- },
- "argparse": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
- "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
- "dev": true
- },
- "array-union": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
- "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
- "dev": true
- },
- "arrify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
- "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==",
- "dev": true
- },
- "astral-regex": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
- "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
- "dev": true
- },
- "balanced-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
- "dev": true
- },
- "brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dev": true,
- "requires": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
- "dev": true,
- "requires": {
- "fill-range": "^7.0.1"
- }
- },
- "callsites": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
- "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
- "dev": true
- },
- "camelcase": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
- "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
- "dev": true
- },
- "camelcase-keys": {
- "version": "6.2.2",
- "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz",
- "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==",
- "dev": true,
- "requires": {
- "camelcase": "^5.3.1",
- "map-obj": "^4.0.0",
- "quick-lru": "^4.0.1"
- }
- },
- "chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- }
- },
- "color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "requires": {
- "color-name": "~1.1.4"
- }
- },
- "color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "colord": {
- "version": "2.9.3",
- "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz",
- "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==",
- "dev": true
- },
- "concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
- "dev": true
- },
- "cosmiconfig": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz",
- "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==",
- "dev": true,
- "requires": {
- "@types/parse-json": "^4.0.0",
- "import-fresh": "^3.2.1",
- "parse-json": "^5.0.0",
- "path-type": "^4.0.0",
- "yaml": "^1.10.0"
- }
- },
- "cross-spawn": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
- "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
- "dev": true,
- "requires": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
- }
- },
- "css-functions-list": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.1.0.tgz",
- "integrity": "sha512-/9lCvYZaUbBGvYUgYGFJ4dcYiyqdhSjG7IPVluoV8A1ILjkF7ilmhp1OGUz8n+nmBcu0RNrQAzgD8B6FJbrt2w==",
- "dev": true
- },
- "cssesc": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
- "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
- "dev": true
- },
- "debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "dev": true,
- "requires": {
- "ms": "2.1.2"
- }
- },
- "decamelize": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
- "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
- "dev": true
- },
- "decamelize-keys": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz",
- "integrity": "sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg==",
- "dev": true,
- "requires": {
- "decamelize": "^1.1.0",
- "map-obj": "^1.0.0"
- },
- "dependencies": {
- "map-obj": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
- "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==",
- "dev": true
- }
- }
- },
- "deep-is": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
- "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
- "dev": true
- },
- "dir-glob": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
- "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
- "dev": true,
- "requires": {
- "path-type": "^4.0.0"
- }
- },
- "doctrine": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
- "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
- "dev": true,
- "requires": {
- "esutils": "^2.0.2"
- }
- },
- "emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true
- },
- "error-ex": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
- "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
- "dev": true,
- "requires": {
- "is-arrayish": "^0.2.1"
- }
- },
- "escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
- "dev": true
- },
- "eslint": {
- "version": "8.26.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.26.0.tgz",
- "integrity": "sha512-kzJkpaw1Bfwheq4VXUezFriD1GxszX6dUekM7Z3aC2o4hju+tsR/XyTC3RcoSD7jmy9VkPU3+N6YjVU2e96Oyg==",
- "dev": true,
- "requires": {
- "@eslint/eslintrc": "^1.3.3",
- "@humanwhocodes/config-array": "^0.11.6",
- "@humanwhocodes/module-importer": "^1.0.1",
- "@nodelib/fs.walk": "^1.2.8",
- "ajv": "^6.10.0",
- "chalk": "^4.0.0",
- "cross-spawn": "^7.0.2",
- "debug": "^4.3.2",
- "doctrine": "^3.0.0",
- "escape-string-regexp": "^4.0.0",
- "eslint-scope": "^7.1.1",
- "eslint-utils": "^3.0.0",
- "eslint-visitor-keys": "^3.3.0",
- "espree": "^9.4.0",
- "esquery": "^1.4.0",
- "esutils": "^2.0.2",
- "fast-deep-equal": "^3.1.3",
- "file-entry-cache": "^6.0.1",
- "find-up": "^5.0.0",
- "glob-parent": "^6.0.2",
- "globals": "^13.15.0",
- "grapheme-splitter": "^1.0.4",
- "ignore": "^5.2.0",
- "import-fresh": "^3.0.0",
- "imurmurhash": "^0.1.4",
- "is-glob": "^4.0.0",
- "is-path-inside": "^3.0.3",
- "js-sdsl": "^4.1.4",
- "js-yaml": "^4.1.0",
- "json-stable-stringify-without-jsonify": "^1.0.1",
- "levn": "^0.4.1",
- "lodash.merge": "^4.6.2",
- "minimatch": "^3.1.2",
- "natural-compare": "^1.4.0",
- "optionator": "^0.9.1",
- "regexpp": "^3.2.0",
- "strip-ansi": "^6.0.1",
- "strip-json-comments": "^3.1.0",
- "text-table": "^0.2.0"
- }
- },
- "eslint-scope": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz",
- "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==",
- "dev": true,
- "requires": {
- "esrecurse": "^4.3.0",
- "estraverse": "^5.2.0"
- }
- },
- "eslint-utils": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
- "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
- "dev": true,
- "requires": {
- "eslint-visitor-keys": "^2.0.0"
- },
- "dependencies": {
- "eslint-visitor-keys": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
- "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
- "dev": true
- }
- }
- },
- "eslint-visitor-keys": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
- "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
- "dev": true
- },
- "espree": {
- "version": "9.4.0",
- "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz",
- "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==",
- "dev": true,
- "requires": {
- "acorn": "^8.8.0",
- "acorn-jsx": "^5.3.2",
- "eslint-visitor-keys": "^3.3.0"
- }
- },
- "esquery": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
- "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
- "dev": true,
- "requires": {
- "estraverse": "^5.1.0"
- }
- },
- "esrecurse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
- "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
- "dev": true,
- "requires": {
- "estraverse": "^5.2.0"
- }
- },
- "estraverse": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
- "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
- "dev": true
- },
- "esutils": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
- "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
- "dev": true
- },
- "fast-deep-equal": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
- "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
- "dev": true
- },
- "fast-glob": {
- "version": "3.2.12",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz",
- "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==",
- "dev": true,
- "requires": {
- "@nodelib/fs.stat": "^2.0.2",
- "@nodelib/fs.walk": "^1.2.3",
- "glob-parent": "^5.1.2",
- "merge2": "^1.3.0",
- "micromatch": "^4.0.4"
- },
- "dependencies": {
- "glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dev": true,
- "requires": {
- "is-glob": "^4.0.1"
- }
- }
- }
- },
- "fast-json-stable-stringify": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
- "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
- "dev": true
- },
- "fast-levenshtein": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
- "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
- "dev": true
- },
- "fastest-levenshtein": {
- "version": "1.0.16",
- "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz",
- "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==",
- "dev": true
- },
- "fastq": {
- "version": "1.13.0",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
- "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
- "dev": true,
- "requires": {
- "reusify": "^1.0.4"
- }
- },
- "file-entry-cache": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
- "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
- "dev": true,
- "requires": {
- "flat-cache": "^3.0.4"
- }
- },
- "fill-range": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
- "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
- "dev": true,
- "requires": {
- "to-regex-range": "^5.0.1"
- }
- },
- "find-up": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
- "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
- "dev": true,
- "requires": {
- "locate-path": "^6.0.0",
- "path-exists": "^4.0.0"
- }
- },
- "flat-cache": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
- "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
- "dev": true,
- "requires": {
- "flatted": "^3.1.0",
- "rimraf": "^3.0.2"
- }
- },
- "flatted": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz",
- "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==",
- "dev": true
- },
- "fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
- "dev": true
- },
- "function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
- "dev": true
- },
- "glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
- "dev": true,
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.1.1",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- },
- "glob-parent": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
- "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
- "dev": true,
- "requires": {
- "is-glob": "^4.0.3"
- }
- },
- "global-modules": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
- "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
- "dev": true,
- "requires": {
- "global-prefix": "^3.0.0"
- }
- },
- "global-prefix": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
- "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
- "dev": true,
- "requires": {
- "ini": "^1.3.5",
- "kind-of": "^6.0.2",
- "which": "^1.3.1"
- },
- "dependencies": {
- "which": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
- "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
- "dev": true,
- "requires": {
- "isexe": "^2.0.0"
- }
- }
- }
- },
- "globals": {
- "version": "13.17.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz",
- "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==",
- "dev": true,
- "requires": {
- "type-fest": "^0.20.2"
- }
- },
- "globby": {
- "version": "11.1.0",
- "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
- "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
- "dev": true,
- "requires": {
- "array-union": "^2.1.0",
- "dir-glob": "^3.0.1",
- "fast-glob": "^3.2.9",
- "ignore": "^5.2.0",
- "merge2": "^1.4.1",
- "slash": "^3.0.0"
- }
- },
- "globjoin": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz",
- "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==",
- "dev": true
- },
- "grapheme-splitter": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz",
- "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==",
- "dev": true
- },
- "hard-rejection": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz",
- "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==",
- "dev": true
- },
- "has": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
- "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
- "dev": true,
- "requires": {
- "function-bind": "^1.1.1"
- }
- },
- "has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true
- },
- "hosted-git-info": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
- "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==",
- "dev": true,
- "requires": {
- "lru-cache": "^6.0.0"
- }
- },
- "html-tags": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz",
- "integrity": "sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==",
- "dev": true
- },
- "ignore": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
- "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
- "dev": true
- },
- "import-fresh": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
- "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
- "dev": true,
- "requires": {
- "parent-module": "^1.0.0",
- "resolve-from": "^4.0.0"
- }
- },
- "import-lazy": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz",
- "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==",
- "dev": true
- },
- "imurmurhash": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
- "dev": true
- },
- "indent-string": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
- "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
- "dev": true
- },
- "inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
- "dev": true,
- "requires": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
- "dev": true
- },
- "ini": {
- "version": "1.3.8",
- "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
- "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
- "dev": true
- },
- "is-arrayish": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
- "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
- "dev": true
- },
- "is-core-module": {
- "version": "2.11.0",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz",
- "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==",
- "dev": true,
- "requires": {
- "has": "^1.0.3"
- }
- },
- "is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
- "dev": true
- },
- "is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
- "dev": true
- },
- "is-glob": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
- "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
- "dev": true,
- "requires": {
- "is-extglob": "^2.1.1"
- }
- },
- "is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "dev": true
- },
- "is-path-inside": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
- "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
- "dev": true
- },
- "is-plain-obj": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
- "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==",
- "dev": true
- },
- "is-plain-object": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
- "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
- "dev": true
- },
- "isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
- "dev": true
- },
- "js-sdsl": {
- "version": "4.1.5",
- "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz",
- "integrity": "sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==",
- "dev": true
- },
- "js-tokens": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
- "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
- "dev": true
- },
- "js-yaml": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
- "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
- "dev": true,
- "requires": {
- "argparse": "^2.0.1"
- }
- },
- "json-parse-even-better-errors": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
- "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
- "dev": true
- },
- "json-schema-traverse": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
- "dev": true
- },
- "json-stable-stringify-without-jsonify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
- "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
- "dev": true
- },
- "kind-of": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
- "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
- "dev": true
- },
- "known-css-properties": {
- "version": "0.25.0",
- "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.25.0.tgz",
- "integrity": "sha512-b0/9J1O9Jcyik1GC6KC42hJ41jKwdO/Mq8Mdo5sYN+IuRTXs2YFHZC3kZSx6ueusqa95x3wLYe/ytKjbAfGixA==",
- "dev": true
- },
- "levn": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
- "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
- "dev": true,
- "requires": {
- "prelude-ls": "^1.2.1",
- "type-check": "~0.4.0"
- }
- },
- "lines-and-columns": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
- "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
- "dev": true
- },
- "locate-path": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
- "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
- "dev": true,
- "requires": {
- "p-locate": "^5.0.0"
- }
- },
- "lodash.merge": {
- "version": "4.6.2",
- "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
- "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
- "dev": true
- },
- "lodash.truncate": {
- "version": "4.4.2",
- "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
- "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==",
- "dev": true
- },
- "lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "dev": true,
- "requires": {
- "yallist": "^4.0.0"
- }
- },
- "map-obj": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz",
- "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==",
- "dev": true
- },
- "mathml-tag-names": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz",
- "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==",
- "dev": true
- },
- "meow": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz",
- "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==",
- "dev": true,
- "requires": {
- "@types/minimist": "^1.2.0",
- "camelcase-keys": "^6.2.2",
- "decamelize": "^1.2.0",
- "decamelize-keys": "^1.1.0",
- "hard-rejection": "^2.1.0",
- "minimist-options": "4.1.0",
- "normalize-package-data": "^3.0.0",
- "read-pkg-up": "^7.0.1",
- "redent": "^3.0.0",
- "trim-newlines": "^3.0.0",
- "type-fest": "^0.18.0",
- "yargs-parser": "^20.2.3"
- },
- "dependencies": {
- "type-fest": {
- "version": "0.18.1",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz",
- "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==",
- "dev": true
- }
- }
- },
- "merge2": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
- "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
- "dev": true
- },
- "micromatch": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
- "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
- "dev": true,
- "requires": {
- "braces": "^3.0.2",
- "picomatch": "^2.3.1"
- }
- },
- "min-indent": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
- "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
- "dev": true
- },
- "minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dev": true,
- "requires": {
- "brace-expansion": "^1.1.7"
- }
- },
- "minimist-options": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz",
- "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==",
- "dev": true,
- "requires": {
- "arrify": "^1.0.1",
- "is-plain-obj": "^1.1.0",
- "kind-of": "^6.0.3"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- },
- "nanoid": {
- "version": "3.3.4",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
- "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==",
- "dev": true
- },
- "natural-compare": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
- "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
- "dev": true
- },
- "normalize-package-data": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz",
- "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==",
- "dev": true,
- "requires": {
- "hosted-git-info": "^4.0.1",
- "is-core-module": "^2.5.0",
- "semver": "^7.3.4",
- "validate-npm-package-license": "^3.0.1"
- }
- },
- "normalize-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
- "dev": true
- },
- "once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
- "dev": true,
- "requires": {
- "wrappy": "1"
- }
- },
- "optionator": {
- "version": "0.9.1",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
- "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
- "dev": true,
- "requires": {
- "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": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
- "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
- "dev": true,
- "requires": {
- "yocto-queue": "^0.1.0"
- }
- },
- "p-locate": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
- "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
- "dev": true,
- "requires": {
- "p-limit": "^3.0.2"
- }
- },
- "p-try": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
- "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
- "dev": true
- },
- "parent-module": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
- "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
- "dev": true,
- "requires": {
- "callsites": "^3.0.0"
- }
- },
- "parse-json": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
- "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "^7.0.0",
- "error-ex": "^1.3.1",
- "json-parse-even-better-errors": "^2.3.0",
- "lines-and-columns": "^1.1.6"
- }
- },
- "path-exists": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
- "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
- "dev": true
- },
- "path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
- "dev": true
- },
- "path-key": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
- "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
- "dev": true
- },
- "path-parse": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
- "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
- "dev": true
- },
- "path-type": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
- "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
- "dev": true
- },
- "picocolors": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
- "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
- "dev": true
- },
- "picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "dev": true
- },
- "postcss": {
- "version": "8.4.18",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz",
- "integrity": "sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==",
- "dev": true,
- "requires": {
- "nanoid": "^3.3.4",
- "picocolors": "^1.0.0",
- "source-map-js": "^1.0.2"
- }
- },
- "postcss-media-query-parser": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz",
- "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==",
- "dev": true
- },
- "postcss-resolve-nested-selector": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz",
- "integrity": "sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==",
- "dev": true
- },
- "postcss-safe-parser": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz",
- "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==",
- "dev": true,
- "requires": {}
- },
- "postcss-selector-parser": {
- "version": "6.0.10",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz",
- "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==",
- "dev": true,
- "requires": {
- "cssesc": "^3.0.0",
- "util-deprecate": "^1.0.2"
- }
- },
- "postcss-value-parser": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
- "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
- "dev": true
- },
- "prelude-ls": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
- "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
- "dev": true
- },
- "punycode": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
- "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
- "dev": true
- },
- "queue-microtask": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
- "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
- "dev": true
- },
- "quick-lru": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz",
- "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==",
- "dev": true
- },
- "read-pkg": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
- "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
- "dev": true,
- "requires": {
- "@types/normalize-package-data": "^2.4.0",
- "normalize-package-data": "^2.5.0",
- "parse-json": "^5.0.0",
- "type-fest": "^0.6.0"
- },
- "dependencies": {
- "hosted-git-info": {
- "version": "2.8.9",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
- "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
- "dev": true
- },
- "normalize-package-data": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
- "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
- "dev": true,
- "requires": {
- "hosted-git-info": "^2.1.4",
- "resolve": "^1.10.0",
- "semver": "2 || 3 || 4 || 5",
- "validate-npm-package-license": "^3.0.1"
- }
- },
- "semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
- "dev": true
- },
- "type-fest": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
- "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
- "dev": true
- }
- }
- },
- "read-pkg-up": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
- "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
- "dev": true,
- "requires": {
- "find-up": "^4.1.0",
- "read-pkg": "^5.2.0",
- "type-fest": "^0.8.1"
- },
- "dependencies": {
- "find-up": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
- "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
- "dev": true,
- "requires": {
- "locate-path": "^5.0.0",
- "path-exists": "^4.0.0"
- }
- },
- "locate-path": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
- "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
- "dev": true,
- "requires": {
- "p-locate": "^4.1.0"
- }
- },
- "p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
- "dev": true,
- "requires": {
- "p-try": "^2.0.0"
- }
- },
- "p-locate": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
- "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
- "dev": true,
- "requires": {
- "p-limit": "^2.2.0"
- }
- },
- "type-fest": {
- "version": "0.8.1",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
- "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
- "dev": true
- }
- }
- },
- "redent": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
- "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
- "dev": true,
- "requires": {
- "indent-string": "^4.0.0",
- "strip-indent": "^3.0.0"
- }
- },
- "regexpp": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
- "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
- "dev": true
- },
- "require-from-string": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
- "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
- "dev": true
- },
- "resolve": {
- "version": "1.22.1",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
- "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
- "dev": true,
- "requires": {
- "is-core-module": "^2.9.0",
- "path-parse": "^1.0.7",
- "supports-preserve-symlinks-flag": "^1.0.0"
- }
- },
- "resolve-from": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
- "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
- "dev": true
- },
- "reusify": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
- "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
- "dev": true
- },
- "rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "dev": true,
- "requires": {
- "glob": "^7.1.3"
- }
- },
- "run-parallel": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
- "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
- "dev": true,
- "requires": {
- "queue-microtask": "^1.2.2"
- }
- },
- "semver": {
- "version": "7.3.8",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
- "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
- "dev": true,
- "requires": {
- "lru-cache": "^6.0.0"
- }
- },
- "shebang-command": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
- "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
- "dev": true,
- "requires": {
- "shebang-regex": "^3.0.0"
- }
- },
- "shebang-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
- "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
- "dev": true
- },
- "signal-exit": {
- "version": "3.0.7",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
- "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
- "dev": true
- },
- "slash": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
- "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
- "dev": true
- },
- "slice-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
- "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
- "dev": true,
- "requires": {
- "ansi-styles": "^4.0.0",
- "astral-regex": "^2.0.0",
- "is-fullwidth-code-point": "^3.0.0"
- }
- },
- "source-map-js": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
- "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
- "dev": true
- },
- "spdx-correct": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
- "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
- "dev": true,
- "requires": {
- "spdx-expression-parse": "^3.0.0",
- "spdx-license-ids": "^3.0.0"
- }
- },
- "spdx-exceptions": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
- "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
- "dev": true
- },
- "spdx-expression-parse": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
- "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
- "dev": true,
- "requires": {
- "spdx-exceptions": "^2.1.0",
- "spdx-license-ids": "^3.0.0"
- }
- },
- "spdx-license-ids": {
- "version": "3.0.12",
- "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz",
- "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==",
- "dev": true
- },
- "string-width": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "dev": true,
- "requires": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- }
- },
- "strip-ansi": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "dev": true,
- "requires": {
- "ansi-regex": "^5.0.1"
- }
- },
- "strip-indent": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
- "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
- "dev": true,
- "requires": {
- "min-indent": "^1.0.0"
- }
- },
- "strip-json-comments": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
- "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
- "dev": true
- },
- "style-search": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz",
- "integrity": "sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==",
- "dev": true
- },
- "stylelint": {
- "version": "14.14.0",
- "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-14.14.0.tgz",
- "integrity": "sha512-yUI+4xXfPHVnueYddSQ/e1GuEA/2wVhWQbGj16AmWLtQJtn28lVxfS4b0CsWyVRPgd3Auzi0NXOthIEUhtQmmA==",
- "dev": true,
- "requires": {
- "@csstools/selector-specificity": "^2.0.2",
- "balanced-match": "^2.0.0",
- "colord": "^2.9.3",
- "cosmiconfig": "^7.0.1",
- "css-functions-list": "^3.1.0",
- "debug": "^4.3.4",
- "fast-glob": "^3.2.12",
- "fastest-levenshtein": "^1.0.16",
- "file-entry-cache": "^6.0.1",
- "global-modules": "^2.0.0",
- "globby": "^11.1.0",
- "globjoin": "^0.1.4",
- "html-tags": "^3.2.0",
- "ignore": "^5.2.0",
- "import-lazy": "^4.0.0",
- "imurmurhash": "^0.1.4",
- "is-plain-object": "^5.0.0",
- "known-css-properties": "^0.25.0",
- "mathml-tag-names": "^2.1.3",
- "meow": "^9.0.0",
- "micromatch": "^4.0.5",
- "normalize-path": "^3.0.0",
- "picocolors": "^1.0.0",
- "postcss": "^8.4.17",
- "postcss-media-query-parser": "^0.2.3",
- "postcss-resolve-nested-selector": "^0.1.1",
- "postcss-safe-parser": "^6.0.0",
- "postcss-selector-parser": "^6.0.10",
- "postcss-value-parser": "^4.2.0",
- "resolve-from": "^5.0.0",
- "string-width": "^4.2.3",
- "strip-ansi": "^6.0.1",
- "style-search": "^0.1.0",
- "supports-hyperlinks": "^2.3.0",
- "svg-tags": "^1.0.0",
- "table": "^6.8.0",
- "v8-compile-cache": "^2.3.0",
- "write-file-atomic": "^4.0.2"
- },
- "dependencies": {
- "balanced-match": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz",
- "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==",
- "dev": true
- },
- "resolve-from": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
- "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
- "dev": true
- }
- }
- },
- "stylelint-config-recommended": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-9.0.0.tgz",
- "integrity": "sha512-9YQSrJq4NvvRuTbzDsWX3rrFOzOlYBmZP+o513BJN/yfEmGSr0AxdvrWs0P/ilSpVV/wisamAHu5XSk8Rcf4CQ==",
- "dev": true,
- "requires": {}
- },
- "stylelint-config-standard": {
- "version": "29.0.0",
- "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-29.0.0.tgz",
- "integrity": "sha512-uy8tZLbfq6ZrXy4JKu3W+7lYLgRQBxYTUUB88vPgQ+ZzAxdrvcaSUW9hOMNLYBnwH+9Kkj19M2DHdZ4gKwI7tg==",
- "dev": true,
- "requires": {
- "stylelint-config-recommended": "^9.0.0"
- }
- },
- "supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- },
- "supports-hyperlinks": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz",
- "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0",
- "supports-color": "^7.0.0"
- }
- },
- "supports-preserve-symlinks-flag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
- "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
- "dev": true
- },
- "svg-tags": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz",
- "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==",
- "dev": true
- },
- "table": {
- "version": "6.8.0",
- "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz",
- "integrity": "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==",
- "dev": true,
- "requires": {
- "ajv": "^8.0.1",
- "lodash.truncate": "^4.4.2",
- "slice-ansi": "^4.0.0",
- "string-width": "^4.2.3",
- "strip-ansi": "^6.0.1"
- },
- "dependencies": {
- "ajv": {
- "version": "8.11.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz",
- "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==",
- "dev": true,
- "requires": {
- "fast-deep-equal": "^3.1.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2",
- "uri-js": "^4.2.2"
- }
- },
- "json-schema-traverse": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
- "dev": true
- }
- }
- },
- "text-table": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
- "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
- "dev": true
- },
- "to-regex-range": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
- "dev": true,
- "requires": {
- "is-number": "^7.0.0"
- }
- },
- "trim-newlines": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz",
- "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==",
- "dev": true
- },
- "type-check": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
- "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
- "dev": true,
- "requires": {
- "prelude-ls": "^1.2.1"
- }
- },
- "type-fest": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
- "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
- "dev": true
- },
- "uri-js": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
- "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
- "dev": true,
- "requires": {
- "punycode": "^2.1.0"
- }
- },
- "util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
- "dev": true
- },
- "v8-compile-cache": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
- "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
- "dev": true
- },
- "validate-npm-package-license": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
- "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
- "dev": true,
- "requires": {
- "spdx-correct": "^3.0.0",
- "spdx-expression-parse": "^3.0.0"
- }
- },
- "which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "dev": true,
- "requires": {
- "isexe": "^2.0.0"
- }
- },
- "word-wrap": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
- "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
- "dev": true
- },
- "wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
- "dev": true
- },
- "write-file-atomic": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz",
- "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==",
- "dev": true,
- "requires": {
- "imurmurhash": "^0.1.4",
- "signal-exit": "^3.0.7"
- }
- },
- "yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
- "dev": true
- },
- "yaml": {
- "version": "1.10.2",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
- "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
- "dev": true
- },
- "yargs-parser": {
- "version": "20.2.9",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
- "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
- "dev": true
- },
- "yocto-queue": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
- "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
- "dev": true
- }
}
}
diff --git a/package.json b/package.json
index 8822256..c1de58d 100644
--- a/package.json
+++ b/package.json
@@ -4,8 +4,9 @@
"description": "Purpose is an episodic story about a young woman struggling with the loss of her sister in the Walker-infested post-apocalyptic world. Join her on her journey as you make decisions that influence the outcome of the story, in this text-based multiple-choice adventure inspired by Telltale Games' The Walking Dead.",
"main": "index.js",
"scripts": {
- "jslint": "eslint . index.js",
- "csslint": "npx stylelint style.css"
+ "jslint": "npx eslint --ext .js \"src\"",
+ "csslint": "npx stylelint \"src/**/*.css\"",
+ "copy": "shx cp -r src/* dist && shx mv dist/Purpose.html dist/index.html"
},
"repository": {
"type": "git",
@@ -17,8 +18,9 @@
},
"homepage": "https://github.com/cm8263/Purpose#readme",
"devDependencies": {
- "eslint": "^8.26.0",
- "stylelint": "^14.14.0",
- "stylelint-config-standard": "^29.0.0"
+ "eslint": "^9.21.0",
+ "shx": "^0.3.4",
+ "stylelint": "^16.14.1",
+ "stylelint-config-standard": "^37.0.0"
}
}
diff --git a/Purpose.html b/src/Purpose.html
similarity index 54%
rename from Purpose.html
rename to src/Purpose.html
index df278e8..3e19b4f 100644
--- a/Purpose.html
+++ b/src/Purpose.html
@@ -10,315 +10,489 @@
- <h1>Chapter One</h1>
-<h3>Poor Choices</h3>
+document.head.appendChild(script);<% window.story.state.chapter = "Chapter1"; %>
-<%
-window.story.state.chapter = "Chapter1";
+<ui>special</ui>
+<music>limping</music>
-window.story.delayedText(2000, "one", 0);
-window.story.delayedText(3000, "two", 0);
-window.story.delayedText(4000, "three", 0);
-window.story.delayedText(5000, "four");
-%>
+<action>Chapter One: Poor Choices</action>
+
+<character.one.limping.ditto>Sarah</character>
+
+<action>Go.</action>
+<action>Run.</action>
+<action>Hide.</action>
+
+<special>back-street</special>
+
+<action>That is what has been repeating in my head, over and over...</action>
+<action>...as I hobble along this street, out in the open...</action>
+<action>...blood dripping from my left leg.</action>
+<action>In my 20 years on this earth I have never done anything more stupid than that; I should know better.</action>
+<action>I do know better... but I slipped up, and it nearly got me killed.</action>
+
+<choices>[[[Continue limping]|C1P2]]</choices><ui>special</ui>
+<special>back-street</special>
+<character.one.limping.ditto>Sarah</character>
+
+<action>I continue to limp down the sidewalk, I'm not feeling too good.</action>
+<action>The adrenaline must be wearing off, I'm starting to get dizzy.</action>
+<action>Might be blood loss, might be nerves; regardless, I need to get off the street.</action>
-<div-#one>Go.</div>
-<div-#two>Run.</div>
-<div-#three>Hide.</div>
+<choices>[[[Look around]|C1P3]]</choices><ui>special</ui>
+<special>back-street</special>
+<character.one.limping.ditto>Sarah</character>
-<div-#four>
+<action>I look around, there are a few houses dotted along either side of the suburban street.</action>
+<action>With my previous encounter still fresh in my mind, I'm not too keen to go back into one, but I don't have much of a choice.</action>
-That is what's repeating in my head, over and over, as I’m hobbling along this sidewalk, out in the open, blood dripping from my left leg.
+<choices>[[[Head to closest house]|C1P4]]</choices><ui>special</ui>
+<special>back-street</special>
+<character.one.limping.ditto>Sarah</character>
-In my 20 years on this earth I have never done anything more stupid than that; I should know better, I do know better... but I slipped up, and it nearly got me killed.
+<action>I B-line it for the nearest house.</action>
-[[[Continue limping]|C1P2]]
+<special>back-wall</special>
-</div>I continue to limp down the sidewalk, I'm not feeling too good. The adrenaline must be wearing off, I'm starting to get dizzy. Might be blood loss, might be nerves; regardless, I need to get off the street.
+<action>It has a decent brick wall surrounding it; that'll do, it should be enough to keep the walkers out for now.</action>
-[[[Look around]|C1P3]]I look around, there are a few houses dotted along either side of the suburban street; with my previous encounter still fresh in my mind, I'm not too keen to go back into one, but I don't have much of a choice.
+<special>back-garden</special>
+<rumble>1 1 200</rumble>
-[[[Head to the closest house]|C1P4]]I B-line it for the nearest house, it has a decent brick wall surrounding it; that'll do, it should be enough to keep the walkers out for now.
+<action>I hop over the wall and land in the back garden, if you could still call it that with how overgrown it is.</action>
+<action>The garden has walls on three sides, and a house on the fourth side. It has a few trees, some with large roots, and a few overgrown flowerbeds; other than that, there's not much here.</action>
+<action>The house is two stories, with the ground floor having a roofed patio, and the top floor a large circular window.</action>
+<action>Getting closer, I can see two ways I might be able to get in: the back door, or a window around the side of the house.</action>
-I hop over the wall and land in the back garden, if you could still call it that with how overgrown it is. The garden has walls on three sides, and a house on the fourth side. It has a few trees, some with large roots, and a few overgrown flowerbeds; other than that, there's not much here.
+<choices>
+ [[[Go to the window]|C1P5V2]]
+ [[[Go to the back door]|C1P5V1]]
+</choices><ui>special</ui>
+<special>back-door</special>
+<character.one.limping.ditto>Sarah</character>
-The house is two stories, with the ground floor having a roofed patio, and the top floor a large circular window. Getting closer, I can see two ways I might be able to get in: the back door, or a window around the side of the house.
+<%
+if (!window.passage.tried) {
+ window.passage.tried = true;
+%>
-[[[Go to the window]|C1P5V2]]<br>
-[[[Go to the back door]|C1P5V1]]<% if (!window.passage.tried) { %>
+<action>I go up the patio steps and head to the back door, it's a large, sturdy-looking wooden door.</action>
+<action>I look down, there's a doormat that reads "COME BACK WHEN YOU HAVE TACOS & BOOZE".</action>
-I go up the patio steps and head to the back door, it's a large, sturdy-looking wooden door.
+<character.one.limping.happy.limping>Sarah</character>
-I look down, there's a doormat that reads "COME BACK WHEN YOU HAVE TACOS & BOOZE", I smirk; yeah, I wish. Looking around the patio, there's nothing much here, just a few dead potted plants, and some crusty old shoes.
+<action>I smirk; yeah, I wish.</action>
+
+<character.one.limping.ditto>Sarah</character>
+
+<action>Looking around the patio, there's nothing much here, just a few dead potted plants, and some crusty old shoes.</action>
<% } else { %>
-I go back up the patio steps and head to the back door.
+<action>I go back up the patio steps and head to the back door.</action>
<% } %>
-<%= window.story.customRender("F: Door entry options") %>
+<%= window.story.render("F: Door entry options") %><ui>special</ui>
+<special>back-window</special>
+<character.one.limping.ditto>Sarah</character>
-<% window.passage.tried = true %><% if (!window.passage.tried) { %>
+<%
+if (!window.passage.tried) {
+ window.passage.tried = true;
+%>
-As I limp up to the window, I can see it has been partially boarded up. The boards look old and rotted, and it doesn't look like they were put up very well in the first place. I shouldn't have any trouble pulling them off.
+<action>As I limp up to the window, I can see it has been partially boarded up.</action>
+<action>The boards look old and rotted, and it doesn't look like they were put up very well in the first place.</action>
+<action>I shouldn't have any trouble pulling them off.</action>
<% } else { %>
-I limp back to the boarded-up window.
+<action>I limp back to the boarded-up window.</action>
<% } %>
-<%= window.story.customRender("F: Window entry options") %>
-
-<% window.passage.tried = true %><%
+<%= window.story.render("F: Window entry options") %><%
window.story.setChoice("Chapter1", "Knocked");
-window.story.delayedText(3000);
-
-_.delay(function() {
- window.story.achievement("Chapter1", "Knocked", "Knock, knock", "Who's *there?*");
- }, 3000);
+window.story.achievement("Chapter1", "Knocked");
%>
-I knock and wait...
+<ui>special</ui>
+<special>back-door</special>
+<character.one.limping.ditto>Sarah</character>
-<div-#delayed>
+<rumble>0.75 0 200</rumble>
+<wait>750</wait>
+<rumble>0.75 0 200</rumble>
+<wait>750</wait>
+<rumble>0.75 0 200</rumble>
+<wait>750</wait>
-Yeah, well, it was worth a try I guess?
+<action>I knock and wait...</action>
+<action>...</action>
+<action>Yeah, well, it was worth a try I guess?</action>
-<%= window.story.customRender("F: Door entry options") %>
+<%= window.story.render("F: Door entry options") %><ui>special</ui>
+<special>back-door</special>
+<character.one.limping.ditto>Sarah</character>
-</div><% if (!window.passage.tried) { %>
+<%
+if (!window.passage.tried) {
+ window.passage.tried = true;
+%>
-I try the door handle: locked... shit. Well, on the bright side that might mean this place hasn't been looted yet. That's only good to me if I can get inside though.
+<action>I try the door handle...</action>
+<action>Locked... shit.</action>
+<action>Well, on the bright side that might mean this place hasn't been looted yet. That's only good to me if I can get inside though.</action>
<% } else { %>
-Still locked. I need to find a way into this place and fast.
+<action>Still locked.</action>
+<action>I need to find a way into this place and fast.</action>
<% } %>
-<%= window.story.customRender("F: Door entry options") %>
+<%= window.story.render("F: Door entry options") %><% window.story.setChoice("Chapter1", "Kicked"); %>
-<% window.passage.tried = true %><% window.story.setChoice("Chapter1", "Kicked") %>
+<ui>special</ui>
+<special>back-door</special>
+<character.one.limping.ditto>Sarah</character>
-I muster what little strength I have left, and kick the door with my good leg. The door shuddered but didn't open. That was pretty loud too.
+<rumble>1 0.5 300</rumble>
-Well, I've committed to this now, so I might as well kick it again, what the hell. I take a breath, pause, then kick the door with all my strength.
+<action>I muster what little strength I have left, and kick the door with my good leg.</action>
+<action>The door shuddered but doesn't open.</action>
+<action>That was pretty loud too...</action>
+<action>Well, I've committed to this now, so I might as well kick it again, what the hell.</action>
-I lose my balance and fall backward, sliding down the patio steps, landing directly on my leg wound, <%= window.story.customRender("F: Mother Comments") %>, but, at least the door opened. I lie there for a moment while the pain subsides.
+<rumble>1 1 300</rumble>
-[[[Get up, and go inside]|C1P6]]<%
-window.story.setChoice("Chapter1", "LookedIn");
+<action>I take a breath, pause, then kick the door with all my strength.</action>
+<character.one.limping.pain.limping>Sarah</character>
+
+<rumble>1 1 200</rumble>
+
+<action>I lose my balance and fall backward, sliding down the patio steps, landing directly on my leg wound.</action>
+<action><%= window.story.render("F: Mother Comments") %>, but, at least the door opened.</action>
+<action>I lie there for a moment while the pain subsides.</action>
+
+<character.one.limping.ditto>Sarah</character>
+
+<choices>[[[Get up, and go inside]|C1P6]]</choices><% window.story.setChoice("Chapter1", "LookedIn"); %>
+
+<ui>special</ui>
+<special>backw-indow</special>
+<character.one.limping.ditto>Sarah</character>
+
+<%
if (!window.passage.tried) {
+ window.passage.tried = true;
%>
-I place my head against the window; the cold glass provides a refreshing moment of relief... Then I open my eyes.
-
-It's dim inside, but I can make out some cupboards, a sink, and what I think is an ironing board; must be a laundry room. Nothing of particular interest sticks out, I can see where the back door enters, it doesn't appear to be blocked by anything. I can also see another door, it must lead to the next room, it's closed.
+<action>I place my head against the window...</action>
+<action>...the cold glass provides a refreshing moment of relief.</action>
+<action>Then I open my eyes.</action>
+<action>It's dim inside, but I can make out some cupboards, a sink, and what I think is an ironing board.</action>
+<action>It must be a laundry room. Nothing of particular interest sticks out.</action>
+<action>I can see where the back door enters, it doesn't appear to be blocked by anything.</action>
+<action>I can also see another door, it must lead to the next room, it's closed.</action>
<% } else { %>
-It's still too dark inside properly. It looks like a laundry room maybe?
+<action>It's still too dark inside properly.</action>
+<action>It looks like a laundry room, maybe?</action>
<% } %>
-<%= window.story.customRender("F: Window entry options") %>
+<%= window.story.render("F: Window entry options") %><% window.story.setChoice("Chapter1", "Kicked", false); %>
+
+<ui>special</ui>
+<special>back-window</special>
+<character.one.limping.ditto>Sarah</character>
+
+<action>I grab the board with both hands and pull, hard.</action>
+<action>Too hard.</action>
+
+<special>back-window-broken</special>
+
+<action>The board comes right off, pulling bits of the moldy window frame it was nailed to with it.</action>
+
+<rumble>1 1 200</rumble>
+
+<action>I fall backward, and narrowly avoid hitting my head on a large tree root.</action>
+
+<character.one.limping.pain.limping>Sarah</character>
-<% window.passage.tried = true %><% window.story.setChoice("Chapter1", "Kicked", false) %>
+<action>I do, however, manage to land directly on my leg wound.</action>
+<action><%= window.story.render("F: Mother Comments") %>.</action>
-I grab the board with both hands and pull hard. Too hard.
+<character.one.limping.ditto>Sarah</character>
-The board comes right off, pulling bits of the moldy window frame it was nailed to with it. I fall backward, and narrowly avoid hitting my head on a large tree root. I did, however, manage to land directly on my leg wound. <%= window.story.customRender("F: Mother Comments") %>.
+<choices>[[[Get up]|C1P5V221]]</choices><% window.story.stopMenuMusic(); %>
-[[[Get up, and go to the window]|C1P5V221]]<% window.story.delayedText(2000, "delayed", 5000) %>
+<ui>minimal</ui>
-<div-#delayed>
+<action>The choices you make have an impact on the story.</action>
-The choices you make have an impact on the story.
+<% if (window.story.saving) { %>
+
+<action>The game saves every few passages. You can also save manually using the save button at the top of the screen.</action>
+
+<% } %>
-<% if (window.story.saving) print("A notification will appear each time the game saves; the game saves every few passages. If you refresh or close the game, you will be able to pick up from the passage the game last showed a save notification at. <a.normal-link onclick=\"window.story.exampleSave()\">Click here</a> to view an example save notification.") %>
+<choices>[[Start Game|C1P1]]</choices><ui>special</ui>
+<special>back-window-broken</special>
+<character.one.limping.ditto>Sarah</character>
-This game has no sound; <a.normal-link href="https://www.youtube.com/watch?v=_Rn3_ZaG678" target="_blank">click here</a> for suggested, optional background music.
+<action>Looking at the window, there's just enough room to squeeze through.</action>
+<action>One problem though: the glass is still intact.</action>
+<action>Normally I'd be looking for a more tasteful way to get in, but that fall knocked my last bit of "taste" out of me.</action>
+<action>I'm getting pretty dizzy now, things are starting to get blurry; not good.</action>
+<action>I need, to get inside.</action>
+<action>Now.</action>
+<action>I look around, I see a small rock I could use to break the glass...</action>
+<action>...or, I could use my elbow.</action>
+<action>The rock would lower my chances of cutting myself.</action>
+<action>But my elbow might be quieter...</action>
-[[Start Game|C1P1]]
-Looking at the window, there's just enough room to squeeze through, one problem though: the glass is still intact. Normally I'd be looking for a more tasteful way to get in, but that fall knocked my last bit of "taste" out of me. I'm getting pretty dizzy now, things are starting to get blurry; not good. I need, to get inside, now.
+<choices>
+ [[[Use elbow]|C1P5V2211]]
+ [[[Use the rock]|C1P5V2212]]
+</choices><ui>special</ui>
+<special>back-window-broken</special>
+<character.one.limping.ditto>Sarah</character>
-I look around, I see a small rock I could use to break the glass... or, I could use my elbow. The rock would lower my chances of cutting myself, but my elbow might be quieter.
+<action>I pick up the rock and throw it at the glass.</action>
-[[[Use elbow]|C1P5V2211]]<br>
-[[[Use the rock]|C1P5V2212]]
-I pick up the rock and throw it at the glass. The glass bursts into shinny dust, and lo and behold, it made a lot of noise.
+<rumble>0.5 0.5 350</rumble>
-<%= window.story.customRender("F: Here goes nothing") %>This is probably a bad idea, but what the hell. I bunch up my sleeve for extra padding, brace my elbow, then push.
+<action>The glass bursts into shinny dust...</action>
+<action>...and lo and behold, it made a lot of noise.</action>
-The glass was not very strong and gave way easily, but the bits of broken glass hitting the floor inside was still loud. I pull my arm back, looks like I tore my sleeve a little bit, but didn't cut myself.
+<%= window.story.render("F: Here goes nothing") %><ui>special</ui>
+<special>back-window-broken</special>
+<character.one.limping.ditto>Sarah</character>
-<%= window.story.customRender("F: Here goes nothing") %><% if (window.story.getChoice("Chapter1", "Kicked")) { %>
+<action>This is probably a bad idea, but what the hell.</action>
+<action>I bunch up my sleeve for extra padding, brace my elbow, then push.</action>
-I get up, walk back up the patio steps, then go through and close the door behind me. Looks like I've busted the lock though, I'll need something to stop the door swinging open.
+<rumble>0.5 0.5 200</rumble>
-I look down and see a small doorstop, perfect. It won't stop anything from getting in, but it will stop the door from flapping in the breeze.
+<action>The glass was not very strong and gave way easily, but the bits of broken glass hitting the floor inside was still loud.</action>
+<action>I pull my arm back, looks like I tore my sleeve a little bit, but didn't cut myself.</action>
-Between the kicking and the fall, I'm feeling very dizzy.
+<%= window.story.render("F: Here goes nothing") %><ui>special</ui>
+<character.one.limping.ditto>Sarah</character>
+
+<% if (window.story.getChoice("Chapter1", "Kicked")) { %>
+
+<action>I get up, walk back up the patio steps, then go through and close the door behind me.</action>
+<action>Looks like I've busted the lock though, I'll need something to stop the door swinging open.</action>
+<action>I look down and see a small doorstop, perfect.</action>
+<action>It won't stop anything from getting in, but it will stop the door from flapping in the breeze.</action>
+<action>Between the kicking and the fall, I'm feeling very dizzy.</action>
<% } else { %>
-I crawl through the window, making sure not to touch any of the broken glass as I get up. The window is pretty small, I was only just able to fit; I doubt a walker would be smart enough to get in, and if a human wanted to get in, well, they could always use the door.
+<action>I crawl through the window, making sure not to touch any of the broken glass as I get up.</action>
+<action>The window is pretty small, I was only just able to fit...</action>
+<action>...I doubt a walker would be smart enough to get in...</action>
+<action>...and if a human wanted to get in, well, they could always use the door.</action>
<% } %>
-I wait a moment for my eyes to adjust to the dark, then I look around the room. <% if (window.story.getChoice("Chapter1", "LookedIn")) { print("It is definitely") } else { print("Looks like") } %> a laundry room, there's a washing machine and dryer in the corner, and an ironing board propped up against one of the walls. The room looks safe for now.
-
-Now that I'm inside, I need to deal with my leg; to do that, I'm going to need some supplies:
+<action>I wait a moment for my eyes to adjust to the dark, then I look around the room. </action>
-- something to clean the wound
-- something to bandage my leg with
+<special>laundryroom</special>
-I could also use a weapon... I left my knife in that guy's head, so I won't be getting that back any time soon.
+<action><% print(window.story.getChoice("Chapter1", "LookedIn") ? "It is definitely" : "Looks like") %> a laundry room.</action>
+<action>There's a washing machine and dryer in the corner, and an ironing board propped up against one of the walls.</action>
+<action>The room looks safe for now.</action>
+<action>Now that I'm inside, I need to deal with my leg.</action>
+<action>I'm going to need some supplies.</action>
+<action>Something to clean the wound, and something to bandage my leg with.</action>
+<action>I could also use a weapon...</action>
+<action>I left my knife in that guy's head, so I won't be getting that back any time soon.</action>
-<%= window.story.customRender("F: Search options") %><%
-if (window.passage.name != "C1P7V1"){
- window.passage.tried = true;
-}
+<choices><%= window.story.render("F: Search options") %></choices><ui>special</ui>
+<special>laundryroom</special>
+<character.one.limping.ditto>Sarah</character>
-if (
- window.story.getChoice("Chapter1", "Soap") &&
- window.story.getChoice("Chapter1", "Tape") &&
- window.story.getChoice("Chapter1", "Tap")
-) {
- window.story.setChoice("Chapter1", "Sink")
-}
+<%
+if (window.story.getChoice("Chapter1", "Soap") && window.story.getChoice("Chapter1", "Tape") && window.story.getChoice("Chapter1", "Tap")) window.story.setChoice("Chapter1", "Sink");
if (!window.story.getChoice("Chapter1", "Sink")) {
if (!window.passage.tried) {
+ window.passage.tried = true;
%>
-I limp over to the sink and take a look. There's a crusty old soap bar sitting next to the tap... I don't think that's going to do me any good. There's also a shelf under the sink.
+<action>I limp over to the sink and take a look.</action>
+<action>There's a crusty old soap bar sitting next to the tap...</action>
+<action>I don't think that's going to do me any good.</action>
+<action>There's also a shelf under the sink.</action>
<%
} else {
%>
-I wonder if there's anything else around here I can use.
+<action>I wonder if there's anything else around here I can use.</action>
<%
-
}
+%>
+
+<% } else { %>
- if (!window.story.getChoice("Chapter1", "Soap")) {
- print("[[[Take the soap bar]|C1P7V11]]<br>");
- }
+<action>Nothing else around the sink.</action>
- if (!window.story.getChoice("Chapter1", "Tape")) {
- print("[[[Look under the sink]|C1P7V12]]<br>");
- }
+<% } %>
- if (!window.story.getChoice("Chapter1", "Tap")) {
- print("[[[Try turning on the tap]|C1P7V13]]<br>");
- }
-
-} else { %>
+<choices>
+ <%
+ if (!window.story.getChoice("Chapter1", "Soap")) print("[[[Take the soap bar]|C1P7V11]]");
-Nothing else around the sink.
+ if (!window.story.getChoice("Chapter1", "Tape")) print("[[[Look under the sink]|C1P7V12]]");
-<% } %>
+ if (!window.story.getChoice("Chapter1", "Tap")) print("[[[Try turning on the tap]|C1P7V13]]");
+ %>
-<%= window.story.customRender("F: Search options") %>
+ <%= window.story.render("F: Search options") %>
+</choices><ui>special</ui>
+<special>laundryroom</special>
+<character.one.limping.ditto>Sarah</character>
-<% window.passage.tried = true %><% if (!window.passage.tried) { %>
+<%
+if (!window.passage.tried) {
+ window.passage.tried = true;
+%>
-I walk over to the cupboards and open them. They have lots of old chemical bottles and cleaning supplies, but, I do find some "Hospital Grade" disinfectant; looks like a cheap home brand bottle, but it's better than nothing. I'm pretty sure this is meant to be used on floors and furniture, but, it will definitely do, considering the circumstances.
+<action>I walk over to the cupboards and open them.</action>
+<action>They have lots of old chemical bottles and cleaning supplies, but, I do find some "Hospital Grade" disinfectant.</action>
+<action>Looks like a cheap home brand bottle, but it's better than nothing.</action>
+
+<character.one.limping.sad.limping>Sarah</character>
+
+<action>I'm pretty sure this is meant to be used on floors and furniture, but, it will definitely do...</action>
+<action>...considering the circumstances.</action>
+
+<character.one.limping.ditto>Sarah</character>
<% } else { %>
-I take another look, but all I find are some old chemicals and cleaning supplies<% if (!window.story.getChoice("Chapter1", "Disinfectant")) print(", nothing useful except maybe that disinfectant") %>.
+<action>I take another look, but all I find are some old chemicals and cleaning supplies.</action>
+<% if (!window.story.getChoice("Chapter1", "Disinfectant")) print("<action>Nothing useful except maybe that disinfectant.</action>"); %>
<% } %>
-<% if (!window.story.getChoice("Chapter1", "Disinfectant")) {
- print("[[[Take the disinfectant]|C1P7V31]]<br>");
-} %>
+<choices>
+ <% if (!window.story.getChoice("Chapter1", "Disinfectant")) print("[[[Take the disinfectant]|C1P7V31]]"); %>
-<%= window.story.customRender("F: Search options") %>
+ <%= window.story.render("F: Search options") %>
+</choices><ui>special</ui>
+<special>machines</special>
+<character.one.limping.ditto>Sarah</character>
-<% window.passage.tried = true %><% if (!window.passage.tried) { %>
+<%
+if (!window.passage.tried) {
+ window.passage.tried = true;
+%>
-I get up to the washing machine and dryer; they look old and dusty, but otherwise in good shape. I remember when I use to have to do my laundry... feels like a lifetime ago now.
+<action>I get up to the washing machine and dryer; they look old and dusty, but otherwise in good shape.</action>
+<action>I remember when I use to have to do my laundry...</action>
+<action>...feels like a lifetime ago now.</action>
<% } else { %>
-Honestly surprising how good shape these things are still in.
+<action>Honestly surprising how good shape these things are still in.</action>
-<% }
+<% } %>
-if (!window.story.getChoice("Chapter1", "Dryer")) {
- print("[[[Search the dryer]|C1P7V22]]<br>");
-}
+<choices>
+ <%
+ if (!window.story.getChoice("Chapter1", "Dryer")) print("[[[Search the dryer]|C1P7V22]]");
-if (!window.story.getChoice("Chapter1", "Washer")) {
- print("[[[Search the washing machine]|C1P7V21]]<br>");
-}
+ if (!window.story.getChoice("Chapter1", "Washer")) print("[[[Search the washing machine]|C1P7V21]]");
+ %>
+
+ <%= window.story.render("F: Search options") %>
+</choices><%
+window.story.setChoice("Chapter1", "Soap");
+window.story.achievement("Chapter1", "Soap");
+%>
- %>
+<ui>special</ui>
+<special>laundryroom</special>
+<character.one.limping.ditto>Sarah</character>
-<%= window.story.customRender("F: Search options") %>
+<action>With a bit of effort, I separate the soap from the bench.</action>
+<action>It's hard as a rock...</action>
-<% window.passage.tried = true %><%
-window.story.setChoice("Chapter1", "Soap");
-window.story.achievement("Chapter1", "Soap", "Nothing wasted", "You never know when it will come in handy!");
+<choices>[[[Return to the sink]|C1P7V1]]</choices><ui>special</ui>
+<special>laundryroom</special>
+<character.one.limping.ditto>Sarah</character>
+
+<% if (!window.passage.tried) {
+ window.passage.tried = true;
%>
-With a bit of effort, I separate the soap from the bench. It's hard as a rock...
+<action>I look in the cabinet under the sink-</action>
-<%= window.story.customRender("C1P7V1") %><% if (!window.passage.tried) { %>
+<character.one.limping.happy.limping>Sarah</character>
-I look in the cabinet under the sink- Bingo! There's some duck tape; that's always useful.
+<action>Bingo! There's some duck tape; that's always useful.</action>
+
+<character.one.limping.ditto>Sarah</character>
+
+<% } else if (window.story.getChoice("Chapter1", "Tape")) { %>
+
+<action>Nothing else there.</action>
<% } else { %>
-Still just the duck tape, not a bad find.
+<action>Still just the duck tape, not a bad find.</action>
<% } %>
-[[[Take the duck tape]|C1P7V121]]<br>
-[[[Return to the sink]|C1P7V1]]
+<choices>
+ <% if (!window.story.getChoice("Chapter1", "Tape")) print("[[[Take the duck tape]|C1P7V121]]"); %>
+ [[[Return to the sink]|C1P7V1]]
+</choices><% window.story.setChoice("Chapter1", "Tap"); %>
-<% window.passage.tried = true %><%
-window.story.setChoice("Chapter1", "Tap");
+<ui>special</ui>
+<special>tap</special>
+<character.one.limping.ditto>Sarah</character>
-window.story.delayedText(2000);
-%>
+<action>I turn on the tap.</action>
+<action>...</action>
-I turn on the tap.
+<character.one.limping.sad.limping>Sarah</character>
-<div-#delayed>
+<action>Nothing: that would have been too good to be true.</action>
-Nothing: that would have been too good to be true.
+<character.one.limping.ditto>Sarah</character>
-<%= window.story.customRender("C1P7V1") %>
+<choices>[[[Return to the sink]|C1P7V1]]</choices><% window.story.setChoice("Chapter1", "Tape"); %>
-</div><% window.story.setChoice("Chapter1", "Tape") %>
+<ui>special</ui>
+<special>laundryroom</special>
+<character.one.limping.ditto>Sarah</character>
-I pick up the duck tape.
+<action>I pick up the duck tape.</action>
-<%= window.story.customRender("C1P7V1") %><%
+<choices>[[[Return to the sink]|C1P7V1]]</choices><ui>special</ui>
+<character.one.limping.ditto>Sarah</character>
+
+<%
let itemsCollected = 0;
for (const [item, value] of window.story.getChoices("Chapter1")) {
switch (item) {
case "Tape":
- if (value) itemsCollected++;
- break;
-
case "Disinfectant":
- if (value) itemsCollected++;
- break;
-
case "Shirt":
if (value) itemsCollected++;
break;
@@ -332,337 +506,668 @@
"I didn't find anything";
window.story.setChoice("Chapter1", "ItemsCollected", itemsCollected);
-
-window.story.delayedText(10000);
%>
-<% print(found) %>, but that's enough searching; my head is pounding now. I've pushed myself too far, but I didn't have much of a choice did I? I just need... I need to... um, shit, come on Sarah, stay with it.
+<action><% print(found) %>, but that's enough searching.</action>
+
+<character.one.limping.sad.limping>Sarah</character>
+
+<action>My head is pounding now. </action>
+<action>I've pushed myself too far, but I didn't have much of a choice did I?</action>
+
+<character.one.limping.ditto>Sarah</character>
+
+<action>I just need...</action>
+<action>...</action>
+<action>I need to...</action>
+<action>Um.</action>
+
+<character.one.limping.angry.limping>Sarah</character>
+
+<action>Shit, come on Sarah, stay with it.</action>
+
+<character.one.limping.ditto>Sarah</character>
-<div#delayed style="Display: None">
+<action>I, need, to...</action>
+<action>...just need to sit down.</action>
-I just need to sit down, for a few minutes... catch my breath...
+<character.one.limping.sad.limping>Sarah</character>
-[[[Colapse and pass out]|C1P8R1]]
+<action>For a few minutes...</action>
+<action>Catch... my... breath...</action>
-</div><%
+<stopmusic/>
+
+<choices>[[[Collapse and pass out]|C1P8R1]]</choices>`<ui>special</ui>
+<special>laundryroom</special>
+<character.one.limping.ditto>Sarah</character>
+
+<%
window.story.setChoice("Chapter1", "Cupboards");
window.story.setChoice("Chapter1", "Disinfectant");
%>
-I pick up the disinfectant.
+<action>I pick up the disinfectant.</action>
-<%= window.story.customRender("F: Search options") %><% window.story.setChoice("Chapter1", "Washer") %>
+<choices><%= window.story.render("F: Search options") %></choices><%
+window.story.setChoice("Chapter1", "Washer");
+if (window.story.getChoice("Chapter1", "Washer") && window.story.getChoice("Chapter1", "Dryer")) window.story.setChoice("Chapter1", "WandD");
+%>
-I open the washing machine: whole lotta nothin.
+<ui>special</ui>
+<special>machines</special>
+<character.one.limping.ditto>Sarah</character>
-<% if (!window.story.getChoice("Chapter1", "Dryer")) {
- print("[[[Search the dryer]|C1P7V22]]<br>");
-} %>
+<action>I open the washing machine: whole lotta nothin.</action>
-<%= window.story.customRender("F: Search options") %>
+<choices>
+ <% if (!window.story.getChoice("Chapter1", "Dryer")) print("[[[Search the dryer]|C1P7V22]]"); %>
+ <%= window.story.render("F: Search options") %>
+</choices><% if (window.story.getChoice("Chapter1", "Washer") && window.story.getChoice("Chapter1", "Dryer")) window.story.setChoice("Chapter1", "WandD"); %>
-<%
-if (
- window.story.getChoice("Chapter1", "Washer") &&
- window.story.getChoice("Chapter1", "Dryer")
-) {
- window.story.setChoice("Chapter1", "WandD");
-}
-%><% if (!window.passage.tried) { %>
+<ui>special</ui>
+<special>machines</special>
+<character.one.limping.ditto>Sarah</character>
-I open the dryer- Jackpot! A 'clean' white shirt, I can use this as a bandage; looks like it has been sitting in here for years, but the closed dryer door did a good job of keeping it clean.
+<% if (!window.passage.tried) {
+ window.passage.tried = true;
+%>
-<% } else { %>
+<action>I open the dryer-</action>
-Still just that one white shirt in the dryer.
+<character.one.limping.happy.limping>Sarah</character>
-<% }
+<action>Jackpot!</action>
+<action>A 'clean' white shirt, I can use this as a bandage.</action>
-if (!window.story.getChoice("Chapter1", "Shirt")) {
- print("[[[Take the shirt]|C1P7V221]]<br>");
-}
+<character.one.limping.ditto>Sarah</character>
-if (!window.story.getChoice("Chapter1", "Washer")) {
- print("[[[Search the washing machine]|C1P7V21]]<br>");
-} %>
+<action>Looks like it has been sitting in here for years.</action>
+<action>I guess the closed dryer door did a good job of keeping it clean.</action>
-<%= window.story.customRender("F: Search options") %>
+<% } else { %>
-<%
-if (
- window.story.getChoice("Chapter1", "Washer") &&
- window.story.getChoice("Chapter1", "Dryer")
-) {
- window.story.setChoice("Chapter1", "WandD");
-}
+<action>Still just that one white shirt in the dryer.</action>
+
+<% } %>
+
+<choices>
+ <%
+ if (!window.story.getChoice("Chapter1", "Shirt")) print("[[[Take the shirt]|C1P7V221]]");
+ if (!window.story.getChoice("Chapter1", "Washer")) print("[[[Search the washing machine]|C1P7V21]]");
+ %>
-window.passage.tried = true;
-%><%
+ <%= window.story.render("F: Search options") %>
+</choices><%
window.story.setChoice("Chapter1", "Dryer");
window.story.setChoice("Chapter1", "Shirt");
+
+if (window.story.getChoice("Chapter1", "Washer") && window.story.getChoice("Chapter1", "Dryer")) window.story.setChoice("Chapter1", "WandD");
%>
-I take out the white shirt.
+<ui>special</ui>
+<special>machines</special>
+<character.one.limping.ditto>Sarah</character>
-<% if (!window.story.getChoice("Chapter1", "Washer")) {
- print("[[[Search the washing machine]|C1P7V21]]<br>");
-} %>
+<action>I take out the white shirt.</action>
-<%= window.story.customRender("F: Search options") %>
+<choices>
+ <% if (!window.story.getChoice("Chapter1", "Washer")) print("[[[Search the washing machine]|C1P7V21]]"); %>
-<%
-if (
- window.story.getChoice("Chapter1", "Washer") &&
- window.story.getChoice("Chapter1", "Dryer")
-) {
- window.story.setChoice("Chapter1", "WandD");
-}
-%><i>
+ <%= window.story.render("F: Search options") %>
+</choices><flashback/>
+<ui>standard</ui>
+<character.one>Unknown</character>
+
+<speech.unknown>Sarah?</speech>
+<speech.unknown>Sarah get up, it's half past one in the afternoon!</speech>
+
+<action>A woman is shouting at me from somewhere downstairs.</action>
+
+<choices>
+ [[...|C1P9V2]]
+ [[No, fuck off|C1P9V3]]
+ [[It's too cold|C1P9V1]]
+</choices><flashback/>
+<ui>standard</ui>
+<character.one>Sarah</character>
+<character.two>Unknown</character>
+<sound>knocking</sound>
+
+<action>Someone's softly knocking on the door.</action>
+
+<character.one.angry.eyes>Sarah</character>
+
+<speech.sarah>Go away.</speech>
+
+<character.one>Sarah</character>
+
+<sound>door</sound>
+
+<action>The door opens.</action>
+
+<character.two>Unknown</character>
+
+<speech.unknown>Sis?</speech>
+<speech.unknown>Come on, get up.</speech>
+
+<action>The voice is different from before.</action>
+
+<character.one.sad.eyes>Sarah</character>
+
+<action>I crack my eyes open to look at the source of the voice.</action>
+
+<character.two>Sophia</character>
+
+<action>Sure enough, my sister is standing in the doorway.</action>
+
+<character.two.excited>Sophia</character>
+
+<speech.sophia>You said you'd show me your new workplace today.</speech>
+<speech.sophia>Remember?</speech>
+
+<choices>
+ [[...|C1P11V2]]
+ [[I don't care|C1P11V1]]
+ [[Ask me tomorrow|C1P11V3]]
+</choices><flashback/>
+<ui>standard</ui>
+<character.one>Sarah</character>
+<character.two>?Sophia</character>
+
+<action>She's right up close to my face now.</action>
+<action>I can feel her cold breath.</action>
+
+<speech.sophia>If you don't get up...</speech>
+<speech.sophia>...you'll die.</speech>
+<action>She says in a low monotone voice.</action>
+
+<character.one.sad>Sarah</character>
+
+<speech.sarah>What the fuck...</speech>
+<action>I roll over and open my eyes.</action>
+
+<character.two.close-up.neutral-close-up.close-up>Sophia</character>
+<rumble>1 0.5 300</rumble>
+<sound>stinger</sound>
+
+<action>My sister is right there.</action>
+<action>Inches from my face.</action>
+<action>Staring.</action>
+<action>But, something's wrong.</action>
+<action>Her eyes...</action>
+
+<character.two.demonic>Sophia</character>
+
+<action>...they're like two little pinpricks burning into my soul.</action>
+
+<character.one.angry>Sarah</character>
+
+<speech.sarah>Get off me Sophia!</speech>
+<action>I try to move her.</action>
+
+<character.one.sad.angry>Sarah</character>
+
+<action>But I can't!</action>
+<action>I... I don't have the strength.</action>
+<action>She's like a dead weight on my chest.</action>
-"Sarah? Get up, it's half past one in the afternoon!", a woman shouts.
+<speech.sophia>We can be together.</speech>
+<speech.sophia>Forever.</speech>
+<speech.sophia>Just stop fighting...</speech>
-</i>
+<action>Her eyes are locked with mine, unblinking.</action>
-[[...|C1P9V2]]<br>
-[[No, fuck off|C1P9V3]]<br>
-[[It's too cold|C1P9V1]]<i>
+<choices>
+ [[...|C1P13R1]]
+ [[No, Sophia!|C1P13R1]]
+ [[Sophia, please!|C1P13R1]]
+</choices><ui>standard</ui>
+<character.one.sad.angry>Sarah</character>
+<character.two>Unknown</character>
+<stopmusic/>
-\*Knock knock\*
+<speech.unknown>Woah woah, hey, relax!</speech>
+<speech.unknown>It's alright, you're safe...</speech>
+<speech.unknown>...you're safe now.</speech>
-There's someone at the door.
+<action>It's a woman's voice, but different from the one before.</action>
+<action>I try to open my eyes, but they're so heavy.</action>
+<action>It's blurry, and I can't see properly.</action>
+<action>I can make out a face, it's close to me...</action>
-"Go away", I say, as someone opens the door.
+<character.two.neutral.neutral-mask.neutral-mask>Lucy</character>
-"Sis? Come on, get up. You said you'd show me where your new job is, remember?", a young girl's voice says.
+<action>...but, it's not Sophia's.</action>
-</i>
+<speech.lucy>Just relax, everything's going to be alright.</speech>
-[[...|C1P11V2]]<br>
-[[I don't care|C1P11V1]]<br>
-[[Ask me tomorrow|C1P11V3]]<i>
+<action>She's talking in a soothing voice.</action>
+<action>I can feel a gentle hand on my shoulder.</action>
-They're right up close to my face now, I can feel their breathing.
+<speech.sarah>Soph...</speech>
+<speech.sarah>Sophia...</speech>
+<speech.sarah>I couldn't... I- I tried...</speech>
-"If you don't get up, you'll die", the girl says in a low monotone voice.
+<action>I can hardly manage to sputter.</action>
+<action>Everything's going dark..</action>
-"What the fuck", I whisper as I roll over and open my eyes.
+<speech.lucy>Shh...</speech>
+<speech.lucy>Everything's going to be alright.</speech>
-My sister is right there, inches from my face, staring. But, something is wrong: her eyes, they're like two little pinpricks burning into my soul.
+<choices>[[[Pass out]|C1P14R1]]</choices><ui>special</ui>
+<character.one.pain.eyes>Sarah</character>
+<music>sofa</music>
-"Get off me Sophia", I say as I try to move here; but I can't, I don't have the strength. She's like a dead weight on my chest.
+<action>I wake with a jolt.</action>
+<action>I look around, I don't recognize where I am.</action>
+<action>I'm laying down on a sofa, it smells terrible...</action>
-"We can be together, forever: just let go.", Sophia says, her hazel eyes still locked with mine.
+<character.one.sad.eyes>Sarah</character>
-</i>
+<action>...actually, that might be me.</action>
+<action>The room is dark; it's evening perhaps?</action>
+<action>I'm in some kind of living room.</action>
-[[...|C1P13R1]]<br>
-[[No, Sophia!|C1P13R1]]<br>
-[[Sophia, please!|C1P13R1]]"Woah Woah, hey, relax, it's alright, you're safe... you're safe", a woman's voice says, different from the one before.
+<special>living-room</special>
-I try to open my eyes, but they're so heavy: it's blurry, and I can't see properly. I can make out a face, it's close to me, but, it's not Sophia's.
+<action>There's another sofa across from me, an armchair, and a coffee table in the middle of the room.</action>
+<action>There's a TV and cabinet on one wall, a window on another, and doors on the other two.</action>
+<action>I raise my arm to my head and-</action>
-"Just relax, everything's going to be alright", the woman says in a soothing voice. I feel a gentle hand on my shoulder.
+<character.one.angry.eyes>Sarah</character>
-"Soph... Sophia... I couldn't... I- I tried..." I manage to sputter, but everything's going dark... I don't have the strength...
+<action>What the hell?!</action>
-[[[Pass out]|C1P14R1]]I wake with a jolt. I look around, I don't recognize where I am. I'm laying down on a sofa, it smells terrible... actually, that might be me.
+<character.one.angry>Sarah</character>
-The room is dark; it's evening perhaps? I'm in some kind of living room, there's another sofa across from me, an armchair, and a coffee table in the middle of the room. There's a TV and cabinet on one wall, a window on another, and doors on the other two.
+<action>There's something sticking into my hand, and there's a tube attached.</action>
+<action>I follow the tubing with my eyes to a bag of clear fluid hanging from what looks like an old coat hanger stand.</action>
+<action>Where the hell am I, and what the fuck is in my arm?!</action>
-I raise my arm to my head and- What the hell? There's something sticking into my hand, and there's a tube attached; I follow it with my eyes to a bag of clear fluid hanging from what looks like an old hat hanger.
+<choices>
+ [[[Leave it alone]|C1P15V1]]
+ [[[Try ripping it out]|C1P15V2]]
+ [[[Disconnect the tubing]|C1P15V3]]
+</choices><flashback/>
+<ui>standard</ui>
+<character.one.sad.eyes>Sarah</character>
-Where the hell am I, and what the fuck is in my arm?!
+<speech.sarah>It's too cold... and my bed is so warm.</speech>
-[[[Leave it alone]|C1P15V1]]<br>
-[[[Try ripping it out]|C1P15V2]]<br>
-[[[Try disconnecting the tubing]|C1P15V3]]<i>
+<action>I mumble back.</action>
+
+<%= window.story.render("F: Stay in bed") %><% window.story.achievement("Chapter1", "Filter") %>
+
+<flashback/>
+<ui>standard</ui>
+<character.one.angry.eyes>Sarah</character>
+
+<speech.sarah>Fuck off, I'll stay in bed as long as I want!</speech>
+
+<character.one.pain.eyes>Sarah</character>
+<character.two>Unknown</character>
+
+<speech.unknown>Watch that tone young woman or you'll be sleeping outside!</speech>
+
+<%= window.story.render("F: Stay in bed") %><flashback/>
+<ui>standard</ui>
+<character.one>Sarah</character>
+<character.two>Sophia</character>
+
+<action>I close my eyes, groan, and rollover.</action>
+
+<character.two>?Sophia</character>
-"It's too cold... and my bed is so warm", I mumble back.
+<speech.sophia>Pleeeeeease can you take me today?</speech>
+<speech.sophia>It sounds so cool!</speech>
-</i>
+<action>I hear her ask from behind me.</action>
-<%= window.story.customRender("F: Stay in bed") %><% window.story.achievement("Chapter1", "Filter", "No Filter", "Speaking your mind, *even when you shouldn't.*") %>
+<sound>bed</sound>
-<i>
+<action>She's climbing onto my bed.</action>
+<action>Now she's crawling up towards me.</action>
+<action>I swear, if she gives me a wet willie, I will body slam her.</action>
+<action>I don't care if she's a minor.</action>
-"Fuck off, I'll stay in bed as long as I want!", I whine back.
+<music>flashback</music>
-"Watch that tone young woman or you'll be sleeping outside!", the woman's voice snaps back.
+<choices>[[[Brace for impact]|C1P13]]</choices><flashback/>
+<ui>standard</ui>
+<character.one.sad.eyes>Sarah</character>
+<character.two.excited>Sophia</character>
-</i>
+<speech.sarah>I don't care...</speech>
+<speech.sarah>I'll show you another day.</speech>
+<action>I rub my leg, it's a bit sore.</action>
-<%= window.story.customRender("F: Stay in bed") %><i>
-I groan and rollover.
+<character.two>Sophia</character>
-"Pleeease can you take me today? It sounds so cool!", the girl says.
+<speech.sophia>You keep saying that though!</speech>
-\*Creak, creak\*
+<character.one.angry.eyes>Sarah</character>
-Someone is climbing onto my bed; they're crawling up towards me.
+<speech.sarah>I said no, now get lost already.</speech>
-I swear, if she gives me a wet willie, I will body slam her; I don't care if she's a minor.
+<%= window.story.render("F: Rollover") %><flashback/>
+<ui>standard</ui>
+<character.one>Sarah</character>
+<character.two.excited>Sophia</character>
-</i>
+<speech.sarah>Not today.</speech>
+<speech.sarah>Remind me tomorrow...</speech>
+<action>I rub my leg, it's a bit sore.</action>
-[[[Brace for impact]|C1P13]]<i>
+<character.two>Sophia</character>
-"I don't care", I grumble. "I'll show you another day", I say as I rub my leg, it's a bit sore.
+<speech.sophia>That's what you said yesterday though!</speech>
-"You keep saying that though!", the girl says.
+<character.one.sad.eyes>Sarah</character>
-"I said no, now get lost", I groan.
+<speech.sarah>And I'll probably say the same thing tomorrow.</speech>
+<action>I groan under my breath.</action>
-</i>
+<%= window.story.render("F: Rollover") %><% window.story.redirect("C1P14", 3) %><% window.story.redirect("C1P15", 7) %><ui>special</ui>
+<special>living-room</special>
+<character.one.sad.eyes>Sarah</character>
-[[[Rollover]|C1P12]]<i>
+<action>I had better not touch it; I don't need another injury.</action>
+<action>Speaking of which, I had better check on my leg.</action>
+<action>I carefully lean forward and inspect my leg.</action>
-"Not today", I grumble. "Remind me tomorrow", I say as I rub my leg, it's a bit sore.
+<character.one.happy.eyes>Sarah</character>
-"That's what you said yesterday though!", the girl says.
+<action>Woah...</action>
+<action>Someone has bandaged it properly...</action>
-"And I'll probably say the same thing tomorrow", I groan under my breath.
+<choices>[[[Inspect the dressing]|C1P16]]</choices><ui>special</ui>
+<special>living-room</special>
+<character.one.angry.eyes>Sarah</character>
-</i>
+<action>I don't what this thing is...</action>
+<action>...who put it in me...</action>
+<action>...or what that fluid is...</action>
+<action>...but I know it's not good!</action>
+<action>This will probably hurt, so I'm better off just pulling it out quickly.</action>
-[[[Rollover]|C1P12]]<% window.story.redirect("C1P14", 3) %><% window.story.redirect("C1P15", 7) %>I had better not touch it; I don't need another injury. Speaking of which, I had better check my leg.
+<speech.sarah>Alright, deep breath, you can do this...</speech>
+<speech.sarah>You can do this.</speech>
-I carefully lean forward and inspect my leg. Someone has bandaged it properly...
+<choices>[[[Pull it out]|C1P16]]</choices><ui>special</ui>
+<special>living-room</special>
+<character.one.sad.eyes>Sarah</character>
-[[[Inspect the dressing]|C1P16]]I don't what this thing is, who put it in me, or what that fluid is, but I know it's not good. This will probably hurt, so I'm better off just pulling it out quickly.
+<action>I don't really want to touch the thing sticking in my hand.</action>
+<action>But there must be a way to disconnect this tubing?</action>
+<action>Taking a closer look, I think I can just unscrew it at the part where the tubing connects with the thing in my hand.</action>
+<action>Worth a shot, here goes nothing.</action>
-Alright, deep breath, you can do this... you can do this.
+<choices>[[[Disconnect the tubbing]|C1P16]]</choices><ui>special</ui>
+<special>living-room</special>
+<character.one>Sarah</character>
+<killmusic/>
-[[[Pull it out]|C1P16]]I don't really want to touch the thing sticking in my hand, but I must be able to disconnect this tubing.
+<sound>behind-door</sound>
-Taking a closer look, I think I can just unscrew it at the part where the tubing connects with the thing in my arm. Worth a shot, here goes nothing.
+<action>I hear something behind me.</action>
+<action>I freeze for a moment, then look behind me.</action>
-[[[Disconnect the tubbing]|C1P16]]\*Creek\*
+<character.one.angry.eyes>Sarah</character>
-I freeze for a moment, then look behind me: there's a closed door, but I can see a shadow underneath- someone's standing on the other side.
+<action>There's a closed door, but I can see a shadow underneath-</action>
-[[...|C1P16V2]]<br>
-[[I'm armed, back off! [Lie]|C1P16V1]]<br>
-[[Who are you? Show yourself!|C1P16V3]]<% window.story.setChoice("Chapter1", "Nothing2") %>
+<character.one.angry>Sarah</character>
-My eyes are locked on the shadow, watching, waiting for it to move.
+<action>Someone's standing on the other side.</action>
-<%= window.story.customRender("F: Meeting Tiffany") %>"I have a weapon, stay away, or I'll kill you!", I shout.
+<choices>
+ [[...|C1P16V2]]
+ [[Show yourself!|C1P16V3]]
+ [[I'm armed, back off! [Lie]|C1P16V1]]
+</choices><% window.story.setChoice("Chapter1", "Nothing2") %>
-<%= window.story.customRender("F: Meeting Tiffany") %>"Who are you, what have you done to me? Show yourself!", I shout.
+<ui>standard</ui>
+<character.one.sad.eyes>Sarah</character>
-<%= window.story.customRender("F: Meeting Tiffany") %>I wince and refrain from shouting several words and I'm sure my mother would kill me if she heardI carefully push out bits of glass still left attached to the frame, and take one last look inside... well shit, here goes nothing.
+<action>My eyes are locked on the shadow, watching, waiting for it to move.</action>
-[[[Climb in the window]|C1P6]]<%
+<%= window.story.render("F: Meeting Tiffany") %><ui>standard</ui>
+<character.one.angry>Sarah</character>
+
+<speech.sarah>I have a weapon, stay away, or I'll kill you!</speech>
+
+<%= window.story.render("F: Meeting Tiffany") %><ui>standard</ui>
+<character.one.angry>Sarah</character>
+
+<speech.sarah>Who are you, what have you done to me?</speech>
+<speech.sarah>Show yourself!</speech>
+
+<%= window.story.render("F: Meeting Tiffany") %>I wince and refrain from shouting several words I'm sure my mother would kill me if she heard<action>I carefully push out bits of glass still left attached to the frame, and take one last look inside...</action>
+<action>Well shit, here goes nothing.</action>
+
+<choices>[[[Climb in the window]|C1P6]]</choices><%
const passageName = window.passage.name;
-if (!passageName.startsWith("C1P7V1")) {
- print("[[[Search the sink]|C1P7V1]]<br>");
-}
+if (!passageName.startsWith("C1P7V1")) print("[[[Search sink]|C1P7V1]]");
-if (!passageName.startsWith("C1P7V3")) {
- print("[[[Search the cupboards]|C1P7V3]]<br>");
-}
+if (!passageName.startsWith("C1P7V3")) print("[[[Search cupboards]|C1P7V3]]");
-if (!passageName.startsWith("C1P7V2")) {
- print("[[[Search the washing machine and dryer]|C1P7V2]]<br>")
-}
+if (!passageName.startsWith("C1P7V2")) print("[[[Search washing machine and dryer]|C1P7V2]]");
%>
+[[[Leave the laundry room]|C1P8]]<choices>
+ <% if (!window.story.getChoice("Chapter1", "Knocked")) print("[[[Knock on door]|C1P5V11]]"); %>
+ [[[Go to window]|C1P5V2]]
+ <% if (window.passage.name != "C1P5V12") print("[[[Try door handle]|C1P5V12]]"); %>
+ [[[Kick the door in]|C1P5V13]]
+</choices><choices>
+ [[[Go to the door]|C1P5V1]]
+ <% if (window.passage.name != "C1P5V21") print("[[[Look inside the house]|C1P5V21]]") %>
+ [[[Pull off lowest board]|C1P5V22]]
+</choices><wait>1000</wait>
+<sound>collapse</sound>
+<rumble>1 1 200</rumble>
+
+<% window.story.redirect("C1P9") %><action>The door is starting to open slowly.</action>
+
+<character.one.angry>Sarah</character>
+
+<action>I tense up ready to fight.</action>
+<action>The door is open far enough now that I can see a person-</action>
+<action>A very small person...</action>
+
+<character.one.angry.eyes>Sarah</character>
+
+<action>...a child...</action>
+
+<character.one>Sarah</character>
+<character.two>Tiffany</character>
+<characteroverride.two>???</characteroverride>
+<music>calm</music>
+
+<action>...a little girl.</action>
+<action>She can't be more than 7 or 8 years old.</action>
+<action>I can just make out shoulder-length blonde hair, bright blue eyes, a dark blue dress with white dots, and some kind of stuffed toy in her hands.</action>
+<action>Our eyes meet and we stare at each other for a moment.</action>
+<action>There's not a hint of fear in her eyes, just pure curiosity.</action>
+
+<choices>
+ [[...|C1P17V2]]
+ [[Hello there?|C1P17V1]]
+ [[What's your name?|C1P17V3]]
+</choices><% if (!window.story.getChoice("Chapter1", "Nothing3")) { %>
+
+<action>She doesn't reply.</action>
+<action>She's just continues to stare.</action>
-[[[Leave the laundry room]|C1P8]]<%
-if (!window.story.getChoice("Chapter1", "Knocked")) {
- print("[[[Knock on the door]|C1P5V11]]<br>");
-}
+<% } %>
-if (window.passage.name != "C1P5V12") {
- print("[[[Try the door handle]|C1P5V12]]<br>");
-}
-%>
-[[[Go back to the window]|C1P5V2]]<br>
-[[[Try kicking the door in]|C1P5V13]]<% const currentPassage = window.passage.name %>
-[[[Go back to the door]|C1P5V1]]<br>
-<% if (currentPassage != "C1P5V21") print("[[[Look inside the house]|C1P5V21]]<br>") %>
-[[[Try pulling the lowest board off]|C15V22]]<% window.story.redirect("C1P9") %>The door is starting to open slowly, I tense up ready to fight.
+<character.two>Unknown</character>
+<killmusic/>
+
+<speech.unknown>Tiffany!</speech>
+
+<action>A woman shouts from somewhere behind her.</action>
+
+<character.two.scared.ditto>Tiffany</character>
+<characteroverride.two>???</characteroverride>
+
+
+<action>The curiosity in her eyes is quickly replaced by panic.</action>
+
+<resetcharacter.two/>
+<sound>door-close</sound>
+
+<action>The door snaps shut again.</action>
+<action>I hear footsteps behind the door and muffled voices.</action>
+
+<character.one.sad.eyes>Sarah</character>
+
+<action>I was ready to fight my way out of here, but, now I'm not sure what to do.</action>
+
+<choices>[[[Wait]|C1P18]]</choices><% window.story.achievement("Chapter1", "HelloThere") %>
+
+<ui>standard</ui>
+<character.one>Sarah</character>
+<character.two>Tiffany</character>
+<characteroverride.two>???</characteroverride>
+
+<speech.sarah>Hello there...</speech>
-The door is open far enough now that I can see a person, a very small person: a child, a girl.
+<%= window.story.render("F: Tiffany bad girl") %><% window.story.setChoice("Chapter1", "Nothing3") %>
-She can't be more than 7 or 8 years old... I can just make out shoulder-length blonde hair, bright blue eyes, and a dark blue dress with white dots.
+<ui>standard</ui>
+<character.one>Sarah</character>
+<character.two>Tiffany</character>
+<characteroverride.two>???</characteroverride>
-Our eyes meet and we stare at each other for a moment, there's not a hint of fear in her eyes, just pure curiosity.
+<action>I stare into her eyes for a moment longer.</action>
-<%= window.story.customRender("F: Meeting Tiffany options") %><% if (!window.story.getChoice("Chapter1", "Nothing3")) {
- print("She doesn't reply, she's just staring...");
-} %>
+<%= window.story.render("F: Tiffany bad girl") %><ui>standard</ui>
+<character.one>Sarah</character>
+<character.two>Tiffany</character>
+<characteroverride.two>???</characteroverride>
-"Tiffany!", a woman says somewhere behind her. The curiosity in her eyes is quickly replaced by panic, and the door snaps shut.
+<speech.sarah>What's your name?</speech>
-I hear footsteps behind the door and muffled voices. I was ready to fight my way out of here, but, now I'm not sure what to do.
+<%= window.story.render("F: Tiffany bad girl") %><ui>standard</ui>
+<character.one>Sarah</character>
-[[[Wait]|C1P18]][[...|C1P17V2]]<br>
-[[Hello there?|C1P17V1]]<br>
-[[What's your name?|C1P17V3]]<% window.story.achievement("Chapter1", "HelloThere", "Hello There", "General Kenobi... you are a bold one.") %>
+<action>The voices have stopped, there's more footsteps.</action>
-"Hello there", I say cautiously.
+<sound>door</sound>
-<%= window.story.customRender("F: Tiffany bad girl") %><% window.story.setChoice("Chapter1", "Nothing3") %>
+<action>The door is opening.</action>
+<action>A woman steps through.</action>
-I stare into her eyes for a moment longer.
+<character.two>Lucy</character>
+<characteroverride.two>???</characteroverride>
-<%= window.story.customRender("F: Tiffany bad girl") %>"What's your name?" I say cautiously.
+<action>They have brown hair done up in a bun, soft brown eyes, is wearing cargo pants and a t-shirt, and is in her mid-30s if I had to guess.</action>
+<action>She has a sort of weathered look about her.</action>
+<action>They've noticed I'm looking them over.</action>
-<%= window.story.customRender("F: Tiffany bad girl") %>The voices stop, there are more footsteps- The door is opening.
+<speech.lucy.!two>Sizing me up are you?</speech>
-A woman steps through. She has brown hair done up in a bun, soft brown eyes, is wearing cargo pants and a t-shirt, and is in her mid-30s if I had to guess. She has a sort of weathered look about her.
+<choices>
+ [[...|C1P18V2]]
+ [[Yeah|C1P18V1]]
+ [[Why would I be?|C1P18V3]]
+</choices><ui>standard</ui>
+<character.one>Sarah</character>
+<character.two>Lucy</character>
+<characteroverride.two>???</characteroverride>
-She notices I am looking her over.
+<speech.sarah>Yeah, I am.</speech>
-"Sizing me up are you?", she asks.
+<action>I maintain eye contact.</action>
-[[...|C1P18V2]]<br>
-[[Yeah|C1P18V1]]<br>
-[[Why would I be?|C1P18V3]]"Yeah, I am", I say while keeping eye contact.
+<speech.lucy.!two>How am I fairing?</speech>
-"How am I fairing?", the woman replies.
+<choices>
+ [[...|C1P18V12]]
+ [[A threat|C1P18V11]]
+ [[Not a threat|C1P18V13]]
+</choices><% window.story.setChoice("Chapter1", "Nothing4"); %>
-[[...|C1P18V12]]<br>
-[[A threat|C1P18V11]]<br>
-[[Not a threat|C1P18V13]]<% window.story.setChoice("Chapter1", "Nothing4") %>
+<ui>standard</ui>
+<character.one>Sarah</character>
+<character.two>Lucy</character>
+<characteroverride.two>???</characteroverride>
-Well, she's caught me, no point stopping I suppose. I continue to look her over; she doesn't seem bothered by it. She's still standing in the doorway.
+<action>Well, she's caught me, no point stopping I suppose.</action>
+<action>I continue to look her over, she doesn't seem bothered by it.</action>
+<action>She's still standing in the doorway.</action>
-<%= window.story.customRender("F: My name is Lucy") %>"Why would I be doing a thing like that I wonder?", I remark sarcastically.
+<%= window.story.render("F: My name is Lucy") %><ui>standard</ui>
+<character.one.angry.eyes>Sarah</character>
+<character.two>Lucy</character>
+<characteroverride.two>???</characteroverride>
-"Hmm, I don't know; maybe it has something to do with waking up on a stranger couch?", the woman replies without missing a beat.
+<speech.sarah>Why would I be doing a thing like that I wonder?</speech>
-"Could be...", I say back.
+<action>I remark sarcastically.</action>
-<%= window.story.customRender("F: My name is Lucy") %>I stare for a moment longer, then shrug.
+<speech.lucy.!two>Hmm, I don't know, maybe it has something to do with waking up on a stranger's couch?</speech>
-The lady gives me a half-smile.
+<action>She replies without missing a beat.</action>
-<%= window.story.customRender("F: My name is Lucy") %>"You're definitely a threat: I don't know you", I say.
+<speech.sarah>Could be...</speech>
-"Cautious; not a bad trait to have these days.", she replies.
+<%= window.story.render("F: My name is Lucy") %><ui>standard</ui>
+<character.one>Sarah</character>
+<character.two>Lucy</character>
+<characteroverride.two>???</characteroverride>
-<%= window.story.customRender("F: My name is Lucy") %>"You're not a threat: if you wanted to kill me, you'd have done it while I was passed out", I say.
+<action>I stare for a moment longer, then shrug.</action>
-"Good point, but what if I wanted you to be awake when I killed you?", she asks. I stare back at her, unsure how to reply.
+<character.two.happy.mouth>Lucy</character>
+<characteroverride.two>???</characteroverride>
-<%= window.story.customRender("F: My name is Lucy") %>She steps through the door and closes it behind her.
+<action>She gives me a half-smile.</action>
-"My name is Lucy, and it seems you've already met my daughter, Tiffany", Lucy says.
+<%= window.story.render("F: My name is Lucy") %><ui>standard</ui>
+<character.one>Sarah</character>
+<character.two>Lucy</character>
+<characteroverride.two>???</characteroverride>
-"I'd welcome you to our home, but the broken <% window.story.getChoice("Chapter1", "Kicked") ? print("back door") : print("window") %> suggests you already helped yourself", Lucy says as she folds her arms.
+<speech.sarah>Definitely a threat, I don't know you.</speech>
-Guess that explains where I am.
+<speech.lucy.!two>Cautious; not a bad trait to have these days.</speech>
-<% if (!window.story.getChoice("Chapter1", "Knocked")) {
- print("[[...|C1P19V2]]<br>");
-} %>
-[[Sorry|C1P19V1]]<br>
-[[I had no choice|C1P19V3]]<br>
-<% if (window.story.getChoice("Chapter1", "Knocked")) {
- print("[[I did knock|C1P19V4]]");
-} %>Protagonist - Sarah:
+<%= window.story.render("F: My name is Lucy") %><ui>standard</ui>
+<character.one>Sarah</character>
+<character.two>Lucy</character>
+<characteroverride.two>???</characteroverride>
+
+<speech.sarah>You're not a threat.</speech>
+<speech.sarah>If you wanted to hurt me, you'd have done it while I was passed out.</speech>
+
+<speech.lucy.!two>Unless of course I only get my kicks out of hurting people when they're awake.</speech>
+
+<character.one.angry.eyes>Sarah</character>
+
+<action>I stare back at her uneasily, unsure how to reply.</action>
+
+<%= window.story.render("F: My name is Lucy") %><sound>door-close</sound>
+
+<action>She steps through the door and closes it behind her.</action>
+
+<character.two>Lucy</character>
+
+<speech.lucy>My name is Lucy.</speech>
+<speech.lucy>It seems you've already met my daughter, Tiffany.</speech>
+<speech.lucy>I'd welcome you to our home, but the broken <% print(window.story.getChoice("Chapter1", "Kicked") ? "back door" : "window") %> suggests you've already helped yourself.</speech>
+
+<action>She folds her arms disapprovingly.</action>
+<action>I guess that explains where I am.</action>
+
+<choices>
+ [[...|C1P19V2]]
+ [[Sorry|C1P19V1]]
+ <% if (window.story.getChoice("Chapter1", "Knocked")) print("[[I did knock|C1P19V4]]"); %>
+ [[I had no choice|C1P19V3]]
+</choices>Protagonist - Sarah:
- 20 years old
- Brown eyes
- Messy, short brown hair
@@ -687,89 +1192,207 @@
- 27 years old
- Long black hair in a ponytail
- Light green eyes
-- Tall and skinny<% window.story.setChoice("Chapter1", "Nothing5") %>
+- Tall and skinny<% window.story.setChoice("Chapter1", "Nothing5"); %>
+
+<ui>standard</ui>
+<character.one.sad.eyes>Sarah</character>
+<character.two>Lucy</character>
+
+<action>Well, this is awkward...</action>
+<action>I maintain eye contact with her.</action>
+
+<%= window.story.render("F: Anyway, since") %><ui>standard</ui>
+<character.one.sad.eyes>Sarah</character>
+<character.two>Lucy</character>
+
+<speech.sarah>Ah, right... sorry about that.</speech>
+
+<action>I awkwardly scratch the back of my head.</action>
+
+<speech.lucy>Don't sweat it, we only set up shop here a few days ago ourselves.</speech>
+
+<%= window.story.render("F: Anyway, since") %><% window.story.setChoice("Chapter1", "NoChoice"); %>
+
+<ui>standard</ui>
+<character.one>Sarah</character>
+<character.two>Lucy</character>
+
+<speech.sarah>I didn't have much of a choice.</speech>
+<speech.sarah>If I stayed out there I would have been a meal for the walkers by the end of the day.</speech>
+
+<speech.lucy>That is true, you really weren't in great shape.</speech>
+<speech.lucy>That much I can attest to.</speech>
+
+<%= window.story.render("F: Anyway, since") %><ui>standard</ui>
+<character.one.happy.eyes>Sarah</character>
+<character.two>Lucy</character>
+
+<speech.sarah>I did knock before I came in.</speech>
+
+<character.two.happy.mouth>Lucy</character>
+
+<speech.lucy>Yeah, you did.</speech>
+<speech.lucy>I was half tempted to open the door just to see who was crazy enough to still knock these days.</speech>
+
+<%= window.story.render("F: Anyway, since") %><character.one>Sarah</character>
+<character.two>Lucy</character>
+
+<action>Lucy takes a few more steps into the room.</action>
+<action>She then sits in an armchair across from me.</action>
+
+<speech.lucy>Anyway, since you went and collapsed in my laundry room, you left me with a difficult choice.</speech>
+<speech.lucy>Put you outside, which I could tell just by looking at the state you were in would be a death sentence...</speech>
+<speech.lucy>...kill you there and then, which would also, you know, be a death sentence...</speech>
+<speech.lucy>...or, bring you in and patch you up.</speech>
+
+<action>She's says very casually.</action>
+
+<choices>
+ [[...|C1P20V2]]
+ [[Thanks|C1P20V1]]
+ [[Should have let me die|C1P20V3]]
+</choices><% window.story.setChoice("Chapter1", "Nothing6"); %>
+
+<ui>standard</ui>
+<character.one.angry.eyes>Sarah</character>
+<character.two>Lucy</character>
+
+<action>I continue to stare at Lucy.</action>
+
+<%= window.story.render("F: I used your stuff") %><ui>standard</ui>
+<character.one.happy.eyes>Sarah</character>
+<character.two>Lucy</character>
-Well, this is awkward... I maintain eye contact with her.
+<speech.sarah>Thanks for choosing option number three, I think...</speech>
-<%= window.story.customRender("F: Anyway, since") %>"Ah, right... sorry about that", I say as I awkwardly scratch the back of my head.
+<%= window.story.render("F: I used your stuff") %><ui>standard</ui>
+<character.one>Sarah</character>
+<character.two>Lucy</character>
-"Don't sweat it, we only set up shop here a few days ago ourselves", Lucy remarks."
+<speech.sarah>You should have left me to die.</speech>
-<%= window.story.customRender("F: Anyway, since") %><% window.story.setChoice("Chapter1", "NoChoice") %>
+<character.two.happy.eyes>Lucy</character>
-"I didn't have much of a choice, if I stayed out there I would have been a meal for the walkers by the end of the day", I remark.
+<speech.lucy>Oh, and why's that?</speech>
-"That is true, you really weren't in great shape. That much I can attest to that", Lucy replies.
+<speech.sarah>That's what I would have done in your position.</speech>
+<speech.sarah>Supplies are scarce these days, and I was in pretty bad shape.</speech>
+<speech.sarah>I was, and still am, a stranger.</speech>
+<speech.sarah>For all you know, I could have got hurt breaking into someone else's house, just like I did yours.</speech>
-<%= window.story.customRender("F: Anyway, since") %>"I did try knocking before I came in", I remark.
+<character.two.concern.eyes>Lucy</character>
-"Yeah, you did", Lucy chuckles.
+<action>Lucy raises an eyebrow.</action>
-"I was half tempted to open the door just to see who was crazy enough to still knock these days", Lucy says.
+<character.one.sad.eyes>Sarah</character>
-<%= window.story.customRender("F: Anyway, since") %>Lucy takes a few more steps into the room and sits in an armchair across from me.
+<action>Shit, might have given too much away there...</action>
-"Anyway, since you went and collapsed in my laundry room, you left me with a difficult choice: put you outside, which I could tell just by looking at the state you were in would be a death sentence; kill you there and then, which would also, you know, be a death sentence; or bring you in and patch you up", Lucy says very casually.
+<speech.lucy>I guess I'm just too trusting</speech>
-[[...|C1P20V2]]<br>
-[[Thanks|C1P20V1]]<br>
-[[Should have let me die|C1P20V3]]<% window.story.setChoice("Chapter1", "Nothing6") %>
+<%= window.story.render("F: I used your stuff") %><speech.lucy>Yup. It's called a cannula, and that bag it's connected to, is just salty water.</speech>
+<speech.lucy>You're lucky you broke into the one house around here with a nurse in it.</speech>
-I continue to stare at Lucy.
+<character.two.happy>Lucy</character>
-<%= window.story.customRender("F: I used your stuff") %>"Thanks for choosing option number three, I think", I reply cautiously.
+<speech.lucy>Albeit an ill-equipped one.</speech>
-<%= window.story.customRender("F: I used your stuff") %>"You should have left me to die", I state.
+<action>She chuckles at her own comment.</action>
-"Oh, and why's that?", Lucy asks.
+<character.two.concern>Lucy</character>
-"That's what I would have done in your position. Supplies are scarce these days, I was in pretty bad shape, and I was, and still am, a stranger. For all you know, I could have got hurt breaking into someone else's house, just like I did yours", I state matter-of-factly.
+<action>Lucy then pauses and sits forward in her chair.</action>
-"Good point, I guess I'm just too trusting", Lucy replies.
+<speech.lucy>Speaking of injuries, how exactly did you manage to get yourself so scrapped up?</speech>
-<%= window.story.customRender("F: I used your stuff") %>"Yup. It's called a cannula, and that bag it's connected to, is just salty water", Lucy explains.
+<action>Lucy gestures to my leg.</action>
+<action>I suspected this would come up.</action>
+<action>I'm not sure what to say...</action>
-"You're lucky that you broke into the one house around here with a nurse in it, albeit an ill-supplied nurse", Lucy chuckles.
+<choices>
+ [[[Lie to Lucy]|C1P22V2]]
+ [[[Tell Lucy the Truth]|C1P22V1]]
+</choices><% window.story.setChoice("Chapter1", "Lied", false); %>
-Lucy pauses, then sits forward in her chair.
+<ui>standard</ui>
+<character.one>Sarah</character>
+<character.two>Lucy</character>
-"Speaking of injuries, how *did* you manage to get yourself so banged up anyway?", Lucy asks as she gestures to my leg.
+<action>Honesty is the best policy, right?</action>
+<action>I take a deep breath, preparing myself for whatever might happen next.</action>
-[[[Tell Lucy the Truth]|C1P22V1]][[[Lie to Lucy]|C1P22V2]]<% window.story.setChoice("Chapter1", "Lied", false) %>
+<character.one.sad>Sarah</character>
-"I killed a man", I state.
+<speech.sarah>I killed a man.</speech>
-Lucy sits there for a moment, then her slight smile drops as she realizes I wasn't joking.
+<action>Lucy sits there staring.</action>
-She pauses for a moment.
+<character.two.concern>Lucy</character>
-"Did he deserve it?", she asks.
+<action>Her expression tenses up as she realizes I wasn't joking.</action>
+<action>She pauses for a moment.</action>
-[[...|C1P22V12]]<br>
-[[Yes, it was unprovoked|C1P22V11]]<br>
-[[No, wrong place wrong time|C1P22V13]]<% window.story.setChoice("Chapter1", "Lied") %>
+<speech.lucy>Did he deserve it?</speech>
-"I cut myself climbing a fence", I say; I'm not good at lying.
+<choices>
+ [[...|C1P22V12]]
+ [[Yes, it was unprovoked|C1P22V11]]
+ [[No, wrong place wrong time|C1P22V13]]
+</choices><% window.story.setChoice("Chapter1", "Lied"); %>
-"Uh-huh", Lucy says, clearly unconvinced.
+<ui>standard</ui>
+<character.one>Sarah</character>
+<character.two>Lucy</character>
-"Must have been a hellova fence", she adds.
+<action>She might kill me on the spot if I tell her the truth.</action>
+<action>I better come up with something, quickly.</action>
-[[Yeah|C1P22V21]]<br>
-[[It was|C1P22V22]]<br>
-[[Biggest ever|C1P22V23]]<% window.story.setChoice("Chapter1", "Nothing1") %>
+<character.one.sad.eyes>Sarah</character>
-<i>
+<speech.sarah>I, uh, cut myself climbing a fence.</speech>
-I couldn't care less...
+<action>Fuck I'm a terrible lier.</action>
-</i>
+<character.two.concern>Lucy</character>
-<%= window.story.customRender("F: Stay in bed") %>Game & Infrastructure - Christopher "Inferno" M.<br>
-<a href="https://purpose-game.com" target="_blank">https://purpose-game.com</a><br><br>
+<speech.lucy>Uh-huh.</speech>
-Artwork - Daniel "DanDarkDesigns" Ayala<br>
-<a href="https://www.artstation.com/darkcan" target="_blank">https://www.artstation.com/darkcan</a>
+<action>She's clearly not convinced.</action>
+
+<speech.lucy>Must have been a hellova fence...</speech>
+
+<choices>
+ [[Yeah|C1P22V21]]
+ [[It was|C1P22V22]]
+ [[Biggest ever|C1P22V23]]
+</choices><% window.story.setChoice("Chapter1", "Nothing1") %>
+
+<flashback/>
+<ui>standard</ui>
+<character.one.sad.eyes>Sarah</character>
+
+<action>I couldn't care less...</action>
+
+<%= window.story.render("F: Stay in bed") %>Game & Infrastructure - Christopher "Inferno" M.<br>
+<a href="https://inferno-chris.com" target="_blank">https://inferno-chris.com</a><br><br>
+
+Artwork, UI Design, & Sound Design - Despoina "DesDarkDesigns"<br>
+<a href="https://linktr.ee/despoinanyx" target="_blank">https://linktr.ee/despoinanyx</a>
+
+V2 Conversion Assistance - Chase Rimmer<br>
+<a href="https://sites.google.com/view/chase-rimmer/home" target="_blank">https://sites.google.com/view/chase-rimmer/home</a>
+
+UI Sound Effects - Kenney Vleugels<br>
+<a href="https://kenney.nl" target="_blank">https://kenney.nl</a>
+
+SFX - Reference Individual File Metadata<br>
+<a href="https://freesound.org/" target="_blank">https://freesound.org/</a>
+<a href="https://creativecommons.org/publicdomain/zero/1.0/" target="_blank">(https://creativecommons.org/publicdomain/zero/1.0/)</a>
+<a href="https://creativecommons.org/licenses/by/3.0/" target="_blank">(https://creativecommons.org/licenses/by/3.0/)</a>
+<a href="https://creativecommons.org/licenses/by/4.0/" target="_blank">(https://creativecommons.org/licenses/by/4.0/)</a>
+
+Music - Reference Individual File Metadata<br>
+<a href="https://www.humblebundle.com" target="_blank">https://www.humblebundle.com</a>
Dead Font Walking Font - Allison James<br>
<a href="https://www.1001fonts.com/dead-font-walking-font.html" target="_blank">https://www.1001fonts.com/dead-font-walking-font.html</a>
@@ -780,9 +1403,21 @@
SimpleNotification - Glagan & Contributors<br>
<a href="https://github.com/Glagan/SimpleNotification" target="_blank">https://github.com/Glagan/SimpleNotification</a>
-toggleFullscreen.js - demonixis<br>
+toggleFullscreen.js - demonixis
<a href="https://gist.github.com/demonixis/5188326" target="_blank">https://gist.github.com/demonixis/5188326</a>
+jquery-typewriter-plugin - 0xPranavDoshi<br>
+<a href="https://github.com/0xPranavDoshi/jquery-typewriter" target="_blank">https://github.com/0xPranavDoshi/jquery-typewriter</a>
+
+Steam-like Trading Card Interaction - imchell<br>
+<a href="https://github.com/imchell/steam-like-card-curation" target="_blank">https://github.com/imchell/steam-like-card-curation</a>
+
+Drift - imgix<br>
+<a href="https://github.com/imgix/drift" target="_blank">https://github.com/imgix/drift</a>
+
+Underscore.js - DocumentCloud & Contributors<br>
+<a href="https://underscorejs.org/" target="_blank">https://underscorejs.org/</a>
+
jQuery - OpenJS Foundation & Contributors<br>
<a href="https://jquery.com/" target="_blank">https://jquery.com/</a>
@@ -790,11 +1425,16 @@
<a href="https://github.com/videlais/snowman" target="_blank">https://github.com/videlais/snowman</a>
Twine 2 - Twine and Twee<br>
-<a href="https://twinery.org/" target="_blank">https://twinery.org/</a>[[[Stay in bed]|C1P11]]<% window.story.setChoice("Chapter1", "Nothing7") %>
+<a href="https://twinery.org/" target="_blank">https://twinery.org/</a><choices>[[[Stay in bed]|C1P11]]</choices><% window.story.setChoice("Chapter1", "Nothing7") %>
-I huff and ignore her.
+<flashback/>
+<ui>standard</ui>
+<character.one.angry.eyes>Sarah</character>
+<character.two.excited>Sophia</character>
-[[[Rollover]|C1P12]]<%
+<action>I huff and ignore her.</action>
+
+<%= window.story.render("F: Rollover") %><%
let verbal = true;
if (
@@ -808,293 +1448,648 @@
) {
verbal = false;
- window.story.achievement("Chapter1", "Nothing", "Silent Treatment", "You have the right to remain silent...");
+ window.story.achievement("Chapter1", "Nothing", "Silent Treatment");
}
%>
-Lucy crosses her arms.
+<character.one>Sarah</character>
+<character.two.concern>Lucy</character>
+
+<action>Lucy crosses her arms.</action>
<% if (window.story.getChoice("Chapter1", "Disinfectant")) { %>
-"You know that disinfectant you had on you is for cleaning floors, right?", Lucy remarks.
+<speech.lucy>You know that disinfectant you had on you is for cleaning floors, right?</speech>
-"Yeah I know, but it was all I could find. I couldn't exactly take myself down to the local chemist", I reply.
+<speech.sarah>Yeah I know, but it was all I could find.</speech>
+<speech.sarah>I couldn't exactly take myself down to the local chemist.</speech>
-"<% if (!verbal) { print("She does speak! "); verbal = true; } %>Well, good thing you had it because I was all out, and you would have had a nasty infection if I hadn't used it. Definitely shaved a few days off your recovery", Lucy says.
+<%
+if (!verbal) {
+ verbal = true;
+%>
+<speech.lucy>So she does speak...</speech>
+<% } %>
+
+<speech.lucy>Well, good thing you had it because I was all out, and you would have had a nasty infection if I hadn't used it.</speech>
+<speech.lucy>Definitely shaved a few days off your recovery.</speech>
<% } else { %>
-"I didn't have anything to properly clean that wound with, so you developed a nasty infection for a little while there. It resolved within a few days though", Lucy says.
+<speech.lucy>Anyway, I didn't have anything to properly clean your wound with, so you picked up a nasty infection.</speech>
+<speech.lucy>Lucky for you, it resolved in a few days, and you're no worse for wear it appears.</speech>
<% } %>
<% if (window.story.getChoice("Chapter1", "Soap")) { %>
-"Also, what the hell was the soap bar for?", Lucy adds.
+<character.two.happy.eyes>Lucy</character>
+
+<speech.lucy>Also, what the hell was the soap bar for?</speech>
<% } %>
-"Hold on, *Days?!*", I exclaim.
+<character.one.happy.eyes>Sarah</character>
+<character.two.concern>Lucy</character>
-"<% if (!verbal) print("She does speak! ") %>Oh yeah, you had one foot in the grave. That's why I had to give you IV fluids, couldn't have you dying of dehydration on me after all the effort I put into *not* killing you", Lucy states calmly.
+<speech.sarah>Hold on, days!?</speech>
-[[[Raise arm]|C1P21V2]]<br>
-[[Like in Hospital?|C1P21V3]]<br>
-[[The thing in my arm?|C1P21V1]]
-I raise my arm with the thing sticking out of it.
+<% if (!verbal) { %>
-<%= window.story.customRender("F: How did you?") %>"Is that what this thing sticking in my arm is for?", I enquire.
+<speech.lucy>Ah, so she does speak.</speech>
-<%= window.story.customRender("F: How did you?") %>"Oh, like when you're in the hospital?", I enquire.
+<% } %>
-<%= window.story.customRender("F: How did you?") %>I look down for a moment, then back at Lucy. But I think that's all she needed to see.
+<speech.lucy>Oh yeah, you had one foot in the grave.</speech>
+<speech.lucy>That's why I had to give you IV fluids.</speech>
+<speech.lucy>Couldn't have you dying of dehydration on me after all the effort I put into not killing you.</speech>
-"I'll take that as a no then", Lucy says in a flat tone.
+<action>This lady has a strange sense of humor...</action>
-<%= window.story.customRender("F: Picking fights") %>
+<choices>
+ [[[Raise arm]|C1P21V2]]
+ [[Like in Hospital?|C1P21V3]]
+ [[The thing in my arm?|C1P21V1]]
+</choices><ui>standard</ui>
+<character.one>Sarah</character>
+<character.two>Lucy</character>
-<%= window.story.customRender("F: Dying action") %>"Yes, definitely. <%= window.story.customRender("F: Basement") %>
+<action>I raise my arm with the thing sticking out of it.</action>
-"I didn't mean to walk into his place, he could have just asked me to leave, or tried to talk to me, or something, but instead, he saw a *defenseless little girl*, and tried to kill me. So yeah, it was self-defense. The prick had it coming", I say passionately.
+<%= window.story.render("F: How did you?") %><ui>standard</ui>
+<character.one>Sarah</character>
+<character.two>Lucy</character>
-<%= window.story.customRender("F: Dying action") %>"No, it was a bad case of wrong place, wrong time. <%= window.story.customRender("F: Basement") %>
+<speech.sarah>Is that what this thing sticking in my arm is for?</speech>
-<%= window.story.customRender("F: Picking fights") %>
+<%= window.story.render("F: How did you?") %><ui>standard</ui>
+<character.one>Sarah</character>
+<character.two>Lucy</character>
-<%= window.story.customRender("F: Dying action") %>I was going house by house, scavenging what I could. I went into this one place, started poking around, but I got sloppy, didn't clear the place fully before I started going through it. He was in the basement, and we bumped into each other on the stairs. We looked at each other for a moment, then he came at me with a hacksaw", I explain.
+<speech.sarah>Oh... like, in the hospital?</speech>
-"So it was self-defense", Lucy says, sounding unconvinced."I wasn't trying to pick a fight, hell, I wasn't even trying to find people, I was just looking for food, like everyone else these days. Yes, I was in this guy's house and he probably had the right to defend himself, but I possed no threat to him, and he attacked first... after he came at me, it was me or him", I try to justify.Lucy's expression hasn't changed much, she looks a little tenser though.
+<%= window.story.render("F: How did you?") %><ui>standard</ui>
+<character.one.sad.eyes>Sarah</character>
+<character.two>Lucy</character>
-"Anyway, to put a long story short, I got the upper hand, put him on the floor, and got on top of him, then I plunged my knife deep into the side of his neck. I thought it was over, so I let go... the last thing he did on this earth, was pull that knife out of his neck, and put it in my leg", I explain.
+<action>I look away from Lucy for a moment, studying a speck on the floor, then back.</action>
+<action>But I think that's all she needed to see.</action>
-"I was so surprised, it took me a moment to process what had just happened, and, before I'd even had time to do anything about it, he turned! The walker grabbed me, and I didn't have anything else at hand, so I pulled the same stunt he did: yanked the knife out of my leg, and put it in his fucking head", I say.
+<speech.lucy>I'll take that as a 'no' then.</speech>
-"Language", Lucy snaps.
+<%= window.story.render("F: Picking fights") %>
-[[...|C1P23V2]]<br>
-[[What...?|C1P23V1]]<br>
-[[Seriously?|C1P23V3]]I give her my best 'What the Fuck' look.
+<%= window.story.render("F: Dying action") %><ui>standard</ui>
+<character.one>Sarah</character>
+<character.two>Lucy</character>
-<%= window.story.customRender("F: Habit") %>"What...?", I say, confused.
+<speech.sarah>Yes, definitely.</speech>
-<%= window.story.customRender("F: Habit") %>"Seriously? I just told you I killed a guy and you're worried about my use of the F-Bomb?", I say, confuzzled.
+<%= window.story.render("F: Basement") %>
-<%= window.story.customRender("F: Habit") %>"Sorry, habit. I don't like Tiffany swearing... she's too young", Lucy says apologetically.
+<speech.sarah>Its not like I meant to walk into his place.</speech>
-We look at each other for a few moments.
+<character.one.angry.eyes>Sarah</character>
-"Speaking of names, I never caught yours", Lucy remarks.
+<speech.sarah>He could have just asked me to leave, or tried to talk to me, or something!</speech>
+<speech.sarah>But no, instead, he saw a defenseless little girl, and tried to kill me.</speech>
+<speech.sarah>So yeah, it was self-defense!</speech>
-"It's Sarah", I say.
+<action>I take a breath.</action>
-"Sarah... that's a nice name", Lucy trails off.
+<character.one.angry>Sarah</character>
-We sit in silence for a moment.
+<speech.sarah>The prick had it coming.</speech>
-[[She must mean a lot to you|C1P24]]- Tiffany gets hurt and you use the ducktape and or white shirt to bandage the wound up. If you don't have it or don't use it, Tiff passes out and you carry her, if you do, she spots someone or something useful.
+<%= window.story.render("F: Dying action") %><ui>standard</ui>
+<character.one>Sarah</character>
+<character.two>Lucy</character>
-- Tiff makes fun of/questions why Sophia gave up, make you angry
+<speech.sarah>No, it was a bad case of wrong place, wrong time.</speech>
-- If did not tell Tiff to eat, she gets hungry
+<%= window.story.render("F: Basement") %>
-- Leg wound ~~has affect when running~~ becomes persistent, relay more on Tiffany
+<%= window.story.render("F: Picking fights") %>
-- Revist "Purpose"
+<%= window.story.render("F: Dying action") %><speech.sarah>I was going house to house, scavenging what food I could.</speech>
+<speech.sarah>I went into this one place, started poking around, but I got sloppy...</speech>
+<speech.sarah>I didn't make sure the whole place was empty before I started going through it.</speech>
+<speech.sarah>He was in the basement, we bumped into each other on the stairs.</speech>
+<speech.sarah>We stared at each other for a moment, but then before I could do anything else, he came at me with a hacksaw!</speech>
-- 7 Stages of Grief for Tiffany https://i.redd.it/7zs3hv8ryrh51.jpg
+<character.two.concern.eyes>Lucy</character>
-- Dog companion that carries stuff
+<speech.lucy>So it was self-defense?</speech>
-- Tiff gets sick/a chill from being in the rain
+<action>Lucy doesn't sound convinced.</action><character.one.sad.eyes>Sarah</character>
-- Next flashback is Sarah with Baby Sophia trying to stop her crying in cot"She must mean a lot to you", I say.
+<speech.sarah>I wasn't trying to pick a fight, hell, I wasn't even trying to find people!</speech>
+<speech.sarah>I was just looking for food, like everyone else.</speech>
+<speech.sarah>Yes, I was in this guy's house and he probably had the right to defend himself.</speech>
+<speech.sarah>But I posed no threat to him, and he attacked first...</speech>
+<speech.sarah>After he came at me, it was me or him.</speech>
-"She means everything to me", Lucy replies, not missing a beat.
+<action>I try to sound justified.</action><character.two.concern.eyes>Lucy</character>
-We both sit quietly for a moment.
+<action>Lucy's expression hasn't changed much.</action>
+<action>A little tenser maybe.</action>
-[[Tell me about Tiff|C1P25]]I was trying to get away from a pack of walkers, got cornered, and had to climb it, but it had wire on top of it. Wasn't fun, but I didn't have a choice", I say, trying to sound convincing.
+<character.one>Sarah</character>
-<% if (window.story.getChoice("Chapter1", "NoChoice")) {
- window.story.achievement("Chapter1", "NoChoice", "Broken Record", "You need some new material.");
-%>
+<speech.sarah>Anyway, to put a long story short, I managed to get the upper hand.</speech>
+<speech.sarah>I put him on the floor, and got on top of him.</speech>
+<speech.sarah>And then I plunged my knife deep into the side of his neck.</speech>
-"Seems to be a running theme with you", Lucy remarks.
+<action>I let out a breath I didn't realize I was holding.</action>
-<% } %>
+<speech.sarah>I thought it was over, so I let go...</speech>
-Lucy sighs.
+<action>I force a little chuckle at the thought of the next part.</action>
-"Look, kid- What's your name?", Lucy asks.
+<character.one>Sarah</character>
-[[Sarah|C1P23V4]]"Oh it was. <%= window.story.customRender("F: Got cornered") %>"Yeah, hellova fence. <%= window.story.customRender("F: Got cornered") %>"It was crazy, the biggest fence I'd ever seen. <%= window.story.customRender("F: Got cornered") %>"It's Sarah", I say.
+<speech.sarah>The last thing that man did on this earth, was pull that knife out of his neck, and put it in my leg.</speech>
+<speech.sarah>I was so surprised, it took me a moment to process what had just happened!</speech>
+<speech.sarah>But before I'd even had time to cry out, he turned into walker.</speech>
+<speech.sarah>He, it, grabbed me, and I didn't have anything else to fight with, so...</speech>
-No point in giving a fake name, I'd probably just forget it anyway.
+<action>I wince at the memory.</action>
-"Ok, Sarah, before the world went to hell in a handbasket, I was Wound Care Nurse for 9 years, so I know my cuts pretty well, well enough to know you're full of shit", Lucy states.
+<speech.sarah>...I pulled the same stunt he did: I yanked the knife out of my leg, and put it in its fucking head.</speech>
-Oh boy, not good.
+<speech.lucy>Language.</speech>
-"I don't really care about how you hurt your leg, if you want to keep that to yourself, that's fine. Only one thing matters to me, and she's likely standing on the other side of that door listening right now, so, be straight with me: are you going to do something to get my little girl hurt? Because if the answer is yes... ", Lucy says, as she pulls a knife out from behind her back and rests it on her legs. It looks like an old kitchen knife.
+<action>Lucy's quick snapping of the word catches me off-guard.</action>
-"I'll just kill you now, save us both the hassle", she finishes in a monotone voice.
+<choices>
+ [[...|C1P23V2]]
+ [[What...?|C1P23V1]]
+ [[Seriously?|C1P23V3]]
+</choices><ui>standard</ui>
+<character.one.happy.eyes>Sarah</character>
+<character.two>Lucy</character>
-The air is tense, we stare at each other for a moment.
+<action>I give her my best 'What the Fuck?' look.</action>
-[[She must mean a lot to you|C1P24]]"Tell me about Tiff", I say<% if (window.story.getChoice("Chapter1", "Lied")) print(", trying to change the subject") %>.
+<%= window.story.render("F: Habit") %><ui>standard</ui>
+<character.one.happy.eyes>Sarah</character>
+<character.two>Lucy</character>
-"Tiff*any* is the only good thing left in this world", Lucy remarks.
+<speech>What...?</speech>
-She pauses for a moment.
+<%= window.story.render("F: Habit") %><ui>standard</ui>
+<character.one.happy.eyes>Sarah</character>
+<character.two>Lucy</character>
-"How about a trade. I'll tell you about Tiffany... if you...", Lucy trails off.
+<speech.sarah>Seriously?</speech>
+<speech.sarah>I just told you I killed a dude, and you're worried about my use of the F-Bomb?</speech>
-[[...|C1P25V2]]<br>
-[[Go on...|C1P25V1]]<br>
-[[If I what?|C1P25V3]]<img.title-image>
+<action>This lady must be crazy.</action>
-<div#title-button>
-[[Play Game|Save Options]]
-[[Extras|Extras]]
-[[Settings|Global Settings]]
-[[Credits|Global Credits]]
-</div>Lucy pauses again, then looks at me with an almost apologetic look.
+<%= window.story.render("F: Habit") %><speech.lucy>Sorry... habit.</speech>
-<%= window.story.customRender("F: Tell me about Sophia") %>"Go on...", I say uncertainly.
+<character.two.sad.eyes>Lucy</character>
-<%= window.story.customRender("F: Tell me about Sophia") %>"If I what?", I ask.
+<speech.lucy>I uh, don't like Tiffany swearing...</speech>
+<speech.lucy>She's too young...</speech>
-<%= window.story.customRender("F: Tell me about Sophia") %>Lucy takes a deep breath, what the hell is she about to say that has made her so uncomfortable all of a sudden?
+<action>She sounds almost apologetic.</action>
+<action>There's a few moments of awkward silence.</action>
-"Sophia", she finally says.
+<speech.lucy>Speaking of names... I never caught yours?</speech>
-"If you tell me who Sophia is", she says.
+<speech>It's Sarah.</speech>
-[[[Pause in shock]|C1P26]]menu: Title Screen/Menu/Miscellaneous player interaction stuff.
+<speech.lucy>Sarah... that's a nice name...</speech>
-save: Auto-save when player reaches this page.
+<action>She trails off, her mind clearly somewhere else.</action>
+<action>Maybe she's think about her girl?</action>
-noFade: Do not fade this passage in when swapping passages, it will handle the transition itself.
+<choices>[[She must mean a lot to you|C1P24]]</choices>Moved to https://github.com/orgs/Purpose-Game/projects/1<ui>standard</ui>
+<character.one>Sarah</character>
+<character.two>Lucy</character>
-page: Passage is dedicated to telling part of the story.
+<speech.sarah>She must mean a lot to you.</speech>
-variation: Passage is a variation of a story page, as a result of a player choice.
+<speech.lucy>She means everything to me.</speech>
-floater: Passage acts as a template to be included in other passages.
+<action>Lucy replies, not missing a beat.</action>
+<action>We both sit quietly for a few moments.</action>
-redirect: Passage redirects to another passage after a given period of time.
+<choices>[[Tell me about Tiff|C1P25]]</choices><speech.sarah>I was trying to get away from a pack of walkers, and I got cornered.</speech>
+<speech.sarah>I had to climb this fence, but it had wire on top of it.</speech>
+<speech.sarah>Wasn't fun, but I didn't have a choice.</speech>
-info: Passage is for developer reference, not for use in-game (directly).
+<action>I try hard to sound convincing.</action>
-addition: Normal page or variation passage added after story was finished, saves reordering passages.
+<% if (window.story.getChoice("Chapter1", "NoChoice")) {
+ window.story.achievement("Chapter1", "NoChoice");
+%>
+
+<character.two.concern.eyes>Lucy</character>
-No Tag: Temporary/Test pageI pause for a moment. It feels like she just slapped me across the face.
+<speech.lucy>No choice huh?</speech>
+<speech.lucy>Seems to be a reoccurring theme with you.</speech>
-Sophia, my little sister... how does she even know about her? Why does she want to know about her?
+<% } %>
+
+<character.two>Lucy</character>
-"It's pretty clear she's important to you", Lucy says, interrupting my thoughts.
+<action>Lucy sighs.</action>
-"You want to know about what's important in my life, so it seems only fair you tell me about what's important in yours", she stipulates.
+<speech.lucy>Look, kid-</speech>
+<speech.lucy>What's your name?</speech>
-I look at her with a mixture of emotions showing.
+<choices>[[Sarah|C1P23V4]]</choices><ui>standard</ui>
+<character.one>Sarah</character>
+<character.two>Lucy</character>
-"How... how do you know-", I start to say.
+<speech.sarah>Oh it was.</speech>
-"You were calling out to her, while you were under. You were on death's doorstep, and that's who was in your mind...", she explains.
+<%= window.story.render("F: Got cornered") %><ui>standard</ui>
+<character.one>Sarah</character>
+<character.two>Lucy</character>
-[[She's dead|C1P27V1]]<br>
-[[I loved her, very much|C1P27V2]]<br>
-[[She gave up a long time ago|C1P27V3]]"She was my sister", I say in a quivering tone, with tears starting to form.
+<speech.sarah>Yeah, hellova fence.</speech>
-I take a deep breath to center myself.
+<%= window.story.render("F: Got cornered") %><ui>standard</ui>
+<character.one>Sarah</character>
+<character.two>Lucy</character>
-"And she's dead", I finish.
+<speech.sarah>It was crazy, the biggest fence I'd ever seen. </speech>
-<%= window.story.customRender("F: Pain in her eyes") %>"I loved-", I start to say, but my emotions flare up and I have to stop.
+<%= window.story.render("F: Got cornered") %><ui>standard</ui>
+<character.one>Sarah</character>
+<character.two>Lucy</character>
-I take a deep breath and wipe away the tears that are forming.
+<speech.sarah>It's Sarah.</speech>
-"I loved my little sister, very, very much", I manage to get out.
+<action>Not much point in giving a fake name, I'd probably just forget it anyway.</action>
-<%= window.story.customRender("F: Pain in her eyes") %>"My little sister...", I trail off, as tears start to run down my face.
+<speech.lucy>Ok, Sarah, before the world went to hell in a handbasket, I was Wound Care Nurse for 9 years.</speech>
+<speech.lucy>So I know my cuts pretty well.</speech>
-I wipe away the tears and try again.
+<character.two.concern>Lucy</character>
-"My little sister, gave up, a long time ago", I manage to get out.
+<speech.lucy>Well enough to know you're full of shit.</speech>
-<%= window.story.customRender("F: Pain in her eyes") %>Lucy looks at me; pain in her eyes.
+<character.one.sad.eyes>Sarah</character>
-"How-", Lucy starts to say, but chocks up on her own emotions.
+<action>Oh boy, not good.</action>
-"How old was she when...", she trails off.
+<speech.lucy>To be honest, I don't really care how you hurt your leg.</speech>
+<speech.lucy>If you want to keep that to yourself, that's fine.</speech>
+<speech.lucy>There's only one thing that matters to me, and she's likely standing on the other side of that door listening right now.</speech>
+<speech.lucy>So, be straight with me: are you going to do something to get my little girl hurt?</speech>
+<speech.lucy>Because if the answer is yes...</speech>
-Why does she want to know that? Why is she pushing me for information? Can't she see this hurts me? Does she not care?
+<action>Lucy pulls out a large kitchen knife out from behind her back and rests it on her legs.</action>
-I pause for a moment, then reply.
+<speech.lucy>I'll just kill you now, save us both the hassle.</speech>
-"Seven", I say.
+<action>The air is tense, we stare at each other.</action>
+<action>I've gotta say something.</action>
-Lucy puts her hand to her mouth, then looks towards the closed door on the other side of the room. The strong "I could kill you where you sit right now" woman from a few minutes ago is gone; replaced by... a mother.
+<choices>[[She must mean a lot to you|C1P24]]</choices><ui>standard</ui>
+<character.one>Sarah</character>
+<character.two>Lucy</character>
+
+<speech.sarah>Tell me about Tiff.</speech>
<% if (window.story.getChoice("Chapter1", "Lied")) { %>
-I'm glace at her knife. Lucy notices, she looks down at it, then back at me. She puts it away back behind her back.
+<action>I try to change the subject off me.</action>
<% } %>
-[[[Weep quietly]|C1P28]]I quietly let my emotions run. It's been a long time since I've thought about her.
+<speech.lucy>Tiff-ANY is the only good thing left in this world.</speech>
+
+<action>She trails off.</action>
+
+<speech.lucy>How about a trade?</speech>
+<speech.lucy>I'll tell you about Tiffany...</speech>
+
+<character.two.sad.eyes>Lucy</character>
+
+<speech.lucy>...if you...</speech>
+
+<action>She can't look at me.</action>
+<action>She looks really unconformable all of a sudden.</action>
+
+<choices>
+ [[...|C1P25V2]]
+ [[Go on...|C1P25V1]]
+ [[If I what?|C1P25V3]]
+</choices><% window.story.startMenuMusic() %>
+
+<img.title-image>
+
+<div#title-button>
+<!-- [[Play Game|Save Options]] -->
+[[Play Game|Game Options]]
+[[Extras|Extras]]
+[[Settings|Global Settings]]
+[[Credits|Global Credits]]
+</div><ui>standard</ui>
+<character.one>Sarah</character>
+<character.two>Lucy</character>
+
+<action>Lucy pauses again.</action>
+
+<character.two.sad.eyes>Lucy</character>
+
+<action>Then looks at me with an almost apologetic look.</action>
+
+<%= window.story.render("F: Tell me about Sophia") %><ui>standard</ui>
+<character.one>Sarah</character>
+<character.two>Lucy</character>
+
+<speech.sarah>Go on...</speech>
+
+<action>I'm feeling a bit uncertain about this.</action>
+
+<%= window.story.render("F: Tell me about Sophia") %><ui>standard</ui>
+<character.one>Sarah</character>
+<character.two>Lucy</character>
+
+<speech.sarah>If I what?</speech>
+
+<%= window.story.render("F: Tell me about Sophia") %><character.two.happy.eyes>Lucy</character>
+
+<action>Lucy takes a deep breath.</action>
+<action>What the hell is she about to say that has made her so uncomfortable all of a sudden?</action>
+
+<speech.lucy>...Sophia</speech>
+
+<character.one.pain.eyes>Sarah</character>
+
+<action>I feel a pit form in my stomach.</action>
+
+<character.one.sad.eyes>Sarah</character>
+
+<action>I want to verbalize my disbelief, but I'm too shocked to manage even that.</action>
+
+<speech.lucy>I'll tell you about Tiffany, if you tell me who Sophia is.</speech>
+
+<action>How does she know about Sophia?</action>
+<action>Why does she want to know about Sophia?</action>
+<action>What the hell is going on?!</action>
+
+<choices>[[[Pause in shock]|C1P26]]</choices>menu: Title Screen/Menu/Miscellaneous player interaction stuff.
+
+save: Auto-save when player reaches this page.
+
+noFade: Do not fade this passage in when swapping passages, it will handle the transition itself.
+
+page: Passage is dedicated to telling part of the story.
+
+variation: Passage is a variation of a story page, as a result of a player choice.
+
+floater: Passage acts as a template to be included in other passages.
+
+redirect: Passage redirects to another passage after a given period of time.
+
+info: Passage is for developer reference, not for use in-game (directly).
+
+addition: Normal page or variation passage added after story was finished, saves reordering passages.
+
+No Tag: Temporary/Test page/Disused<ui>standard</ui>
+<character.one.sad.eyes>Sarah</character>
+<character.two>Lucy</character>
+
+<action>I pause for a moment.</action>
+<action>It feels like she just gut punched me.</action>
+<action>Sophia, my little sister...</action>
+
+<speech.lucy>It's pretty clear she's important to you.</speech>
+
+<action>Lucy interrupts my thoughts.</action>
+
+<speech.lucy>You want to know about what's important in my life...</speech>
+<speech.lucy>...so it seems only fair you tell me about what's important in yours.</speech>
+
+<character.one.pain.eyes>Sarah</character>
-We sit in silence for a few minutes, then without saying a word, Lucy gets up and leaves the room; leaving me alone with my consciousness.
+<action>I look at her with a mixture of emotions showing.</action>
-With Lucy gone, I don't have a reason to hold back anymore. I lay back on the sofa, and close my eyes.
+<speech.sarah>How... how do you know-</speech>
-[[[Bawl eyes out]|C1P29]]I begin to bawl.
+<speech.lucy>You called out to her, while you were under, a lot.</speech>
+<speech.lucy>You were on death's doorstep, and that's who was on your mind...</speech>
-Raw, hard, tears.
+<character.one.sad.eyes>Sarah</character>
-I never had the chance to properly mourn her, I was too busy focusing on my own survival, and for what? So I could die somewhere else another day?
+<action>How do I even explain this...</action>
+<action>I'm not sure I fully understand it myself.</action>
+<action>Lucy is looking at me expecting.</action>
+<action>I channel what little emotional stability I have left and answer.</action>
-[[[Reflect on Sophia's death]|C1P30]]<% window.story.delayedText(4000, "delayed", 3000) %>
+<choices>
+ [[She's dead|C1P27V1]]
+ [[I loved her|C1P27V2]]
+ [[She gave up|C1P27V3]]
+</choices><ui>standard</ui>
+<character.one.pain.eyes>Sarah</character>
+<character.two>Lucy</character>
-I think about her while I'm laying here.
+<speech.sarah>She was my sister...</speech>
-Maybe the reason I never dealt with her death, was because I was scared. Scared that I'd realize that I-
+<action>My voice quivers.</action>
-<div-#delayed>
+<character.one.sad.eyes>Sarah</character>
-I have nothing to live for.
+<action>I can feel the burning of tears at the corners of my eyes.</action>
+<action>I take a deep breath to center myself.</action>
-[[[Continue crying]|C1P31]]
+<speech.sarah>...and she's dead</speech>
-</div>The tears continue to stream down my face.
+<action>I manage to finish, before choking on the lump forming in my throat.</action>
+
+<%= window.story.render("F: Pain in her eyes") %><ui>standard</ui>
+<character.one.pain.eyes>Sarah</character>
+<character.two>Lucy</character>
+
+<speech.sarah>I loved-</speech>
+
+<action>I choke on a lump forming in my throat and need to stop.</action>
+
+<character.one.sad.eyes>Sarah</character>
+
+<action>I take a deep breath and wipe away the tears forming in the corners of my eyes.</action>
+
+<speech>I loved my little sister, very, very much.</speech>
+
+<action>That's all I can manage to get out.</action>
+
+<%= window.story.render("F: Pain in her eyes") %><ui>standard</ui>
+<character.one.pain.eyes>Sarah</character>
+<character.two>Lucy</character>
+
+<speech.sarah>My little sister...</speech>
+
+<action>I trail off, as I notice tears start to run down my face.</action>
+<action>I wipe them away, take a breath, and try again.</action>
+
+<speech.sarah>My little sister... gave up</speech>
+
+<action>I trail off again, as I stare at the floor.</action>
+
+<speech.sarah>She couldn't survive this is world...</speech>
+
+<%= window.story.render("F: Pain in her eyes") %><character.two.sad.eyes>Lucy</character>
+
+<action>Lucy looks at me, pain in her eyes.</action>
+
+<speech.lucy>How did she-</speech>
-I had one job as a big sister: look after my little sister, and I failed horribly.
+<action>She starts, but changes her mind.</action>
-How can I live with myself... how have I lived with myself?
+<speech.lucy>How old was she when...</speech>
-I'm exhausted... mentally and physically.
+<character.one.angry.eyes>Sarah</character>
-[[[Reflect on near-death experience]|C1P32]]I reflect on my near-death experience. Would it have been better if that guy had’ve killed me? I'm tired, I've had enough; what's even the point in living...
+<action>Why does she want to know that?</action>
+<action>Why is she pushing me for information?</action>
+<action>Can't she see this hurts me?</action>
+<action>Does she not care?</action>
-[[I have no purpose|C1P33V1]] [[I need a new purpose|C1P33V2]]<% window.story.setChoice("Chapter1", "NewPurpose", false) %>
+<character.one.pain.eyes>Sarah</character>
-I have no purpose in life. What's the point in living at all?
+<action>I pause to try and calm myself down.</action>
-The world would be better off without me. People like that guy I killed can attest to that...
+<speech.sarah>Seven.</speech>
-[[[Cry yourself to sleep]|C1P33R1]]<% window.story.setChoice("Chapter1", "NewPurpose") %>
+<action>At first she doesn't react.</action>
+<action>Then she puts her hand to her mouth.</action>
+<action>Lucy looks towards the closed door on the other side of the room.</action>
-I need a new purpose in life. Something worth living for. Surviving by itself isn't good enough; it's an excuse.
+<% if (window.story.getChoice("Chapter1", "Lied")) { %>
+
+<action>The strong "I could kill you where you sit right now" woman from a few minutes ago? Gone.</action>
+
+<% } else { %>
-I need to atone for what I did.
+<action>The imposing, tough woman from a few minutes ago? Gone.</action>
-I can't bring Sophia back... but maybe I can find something good in this world to dedicate myself to, in her name.
+<% } %>
-[[[Cry yourself to sleep]|C1P33R1]]<%
-window.story.achievement("Chapter1", "RollCredits", "Roll Credits", "And that's a Sin.")
+<action>All I see now...</action>
+<action>...is a mother.</action>
+
+<character.one.sad.eyes>Sarah</character>
+
+<choices>[[[Weep quietly]|C1P28]]</choices><ui>standard</ui>
+<character.one.sad.eyes>Sarah</character>
+<character.two.sad.eyes>Lucy</character>
+
+<action>I quietly let my emotions run.</action>
+<action>It's been a long time since I've thought about Sophia.</action>
+<action>We sit in silence for a few minutes.</action>
+
+<resetcharacter.two/>
+
+<action>Without saying a word, Lucy gets up and leaves the room.</action>
+<action>Leaving me alone with my conscience.</action>
+<action>With Lucy gone, I don't have a reason to hold back anymore.</action>
+
+<ui>special</ui>
+<special>living-room</special>
+<character.one.sad.eyes>Sarah</character>
+
+<action>I lay back on the sofa, and close my eyes.</action>
+
+<choices>[[[Bawl eyes out]|C1P29]]</choices><ui>special</ui>
+<special>living-room</special>
+<character.one.sad>Sarah</character>
+
+<action>I begin to bawl.</action>
+<action>Raw, hard, tears.</action>
+<action>I never had the chance to properly mourn her.</action>
+<action>I was too busy focusing on my own survival, and for what?</action>
+<action>So I could die somewhere else another day?</action>
+
+<choices>[[[Reflect on her death]|C1P30]]</choices><ui>special</ui>
+<special>living-room</special>
+<character.one.sad>Sarah</character>
+
+<action>I think about Sophia while I'm laying here.</action>
+<action>Maybe the reason I never dealt with her death...</action>
+<action>...was because I was scared.</action>
+<action>Scared that I'd realize that now that she's gone, I-</action>
+<action>I have nothing, and no one to live for.</action>
+
+<choices>[[[Continue crying]|C1P31]]</choices><ui>special</ui>
+<special>living-room</special>
+<character.one.sad>Sarah</character>
+
+<action>The tears continue to stream down my face.</action>
+<action>I had one job as a big sister: look after my little sister.</action>
+<action>And I failed.</action>
+<action>Horribly.</action>
+<action>How can I live with myself... how have I lived with myself?</action>
+<action>I'm exhausted...</action>
+<action>Mentally and physically.</action>
+
+<choices>[[[Reflect on experience]|C1P32]]</choices><ui>special</ui>
+<special>living-room</special>
+<character.one.sad>Sarah</character>
+
+<action>I reflect on my near-death experience.</action>
+<action>Would it have been better if that guy had of killed me?</action>
+<action>What's the point in it all.</action>
+<action>I'm tired, I've had enough.</action>
+<action>What's even the point in carrying on...</action>
+
+<choices>
+ [[I have no purpose|C1P33V1]]
+ [[I need a new purpose|C1P33V2]]
+</choices><% window.story.setChoice("Chapter1", "NewPurpose", false); %>
+
+<ui>special</ui>
+<special>living-room</special>
+<character.one.sad>Sarah</character>
+
+<action>I have no purpose in life.</action>
+<action>Why bother going on at all?</action>
+<action>The world would be better off without me.</action>
+<action>People like that guy I killed would attest to that...</action>
+<action>I'm worthless.</action>
+<action>More than that, I'm pathetic.</action>
+<action>And I know it.</action>
+
+<choices>[[[Cry yourself to sleep]|C1P33R1]]</choices><% window.story.setChoice("Chapter1", "NewPurpose"); %>
+
+<ui>special</ui>
+<special>living-room</special>
+<character.one.sad>Sarah</character>
+
+<action>What am I even saying.</action>
+<action>If Sophia could see me now she'd be so disappointed in me.</action>
+<action>"Why are you giving up sis?", she'd probably say.</action>
+<action>"Get up and let's go!"</action>
+<action>She was always pushing me to do more, to be more.</action>
+<action>I might have been the big sister, but she was always the positive one.</action>
+<action>Always the one that supported me get back on my feet when my job inevitably feel through.</action>
+<action>Even near the end, when she didn't want to carry on.</action>
+<action>Even when I forced her to carry on, one step at a time.</action>
+<action>She wanted me to push on...</action>
+<action>...albeit without her.</action>
+<action>To keep living.</action>
+<action>To find something to live for.</action>
+<action>Find...</action>
+<action>...a way to honour her life.</action>
+<action>I've made up my mind.</action>
+<action>I need a new purpose in life.</action>
+<action>Something worth living for.</action>
+<action>Surviving on its own isn't good enough: it's an excuse.</action>
+<action>I need to do more than live.</action>
+<action>I need to live for Sophia.</action>
+
+<choices>[[[Cry yourself to sleep]|C1P33R1]]</choices><%
+window.story.achievement("Chapter1", "RollCredits");
window.story.redirect("C1P34", 7);
-%>"Chapter1", "Knocked" - Knocked on the door to see if anyone was home
+%>"Chapter1", "Knocked" - Knocked on the door to see if anyone was home
"Chapter1", "Kicked" - Kicked the door in to get inside
@@ -1198,1975 +2193,4249 @@
!"Chapter1", "LucySavesStranger" - Lucy stayed inside and tried to keep the stranger out
+"Chapter1", "CharlesName" - Player learns Charles' name.
+
"Chapter1", "TriedToSaveLucy" - Tried to save Lucy, let Tiffany watch her mom die
!"Chapter1", "TriedToSaveLucy" - Did as Lucy asked, took Tiffany and went
-"Chapter1", "StrangerDied" - Made decisions that resulted in the death of the stranger.<img.title-image>
+"Chapter1", "StrangerDied" - Made decisions that resulted in the death of the stranger.<img.title-image>
+
+<%= window.story.render("Credits") %>
+
+[[Back|Title Screen]]<ui>standard</ui>
+<character.one.pain.eyes>Sarah</character>
+<character.two>Unknown</character>
+
+<speech.unknown>Sarah?</speech>
+
+<action>I start to stir from my sleep.</action>
+<action>Someone's speaking in a soft voice.</action>
+<action>And there's someone near my face again...</action>
+<action>Sophia back to haunt me?</action>
+<action>I squint, it's bright and my vision is blurry.</action>
+<action>There's a face, eyes, but...</action>
+<action>...they're blue, very blue.</action>
+
+<choices>[[[Rub eyes]|C1P35]]</choices><ui>standard</ui>
+<character.one.pain.eyes>Sarah</character>
+<character.two>Unknown</character>
+
+<action>I rub my eyes and open them again.</action>
+
+<character.one>Sarah</character>
+<character.two>Tiffany</character>
+
+<speech.tiffany>Sarah?</speech>
+
+<action>It's Tiffany.</action>
+<action>She's sitting on the coffee table, watching me.</action>
+<action>How does she know my name?</action>
+<action>Lucy must have told her...</action>
+
+<choices>
+ [[...|C1P35V2]]
+ [[Morning...?|C1P35V1]]
+ [[Lose something over here?|C1P35V3]]
+</choices><ui>standard</ui>
+<character.one>Sarah</character>
+<character.two.happy.eyes>Tiffany</character>
-<%= window.story.customRender("Credits") %>
+<action>I stare back at her for a moment.</action>
-[[Back|Title Screen]]<i>"Sarah?"</i>, a voice says softly. I start to stir from my sleep.
+<%= window.story.render("F: Breakfast?") %><ui>standard</ui>
+<character.one>Sarah</character>
+<character.two.happy.eyes>Tiffany</character>
-There's someone near my face again... Sophia back to haunt me?
+<speech.sarah>Um...</speech>
-I squint, it's bright and my vision is blurry. There's a face, eyes, but... they're blue, very blue.
+<action>My throat is dry.</action>
+<action>I cough to clear it a little, then try again.</action>
-[[[Rub eyes]|C1P35]]I rub my eyes and open them again.
+<speech.sarah>Good morning...?</speech>
-"Sarah?", the voice says again.
+<speech.tiffany>Good morning!</speech>
-It's Tiffany. She's sitting on the coffee table, watching me.
+<action>This is the first time I've heard her talk.</action>
+<action>She speaks cheerily and with a high pitch.</action>
-How does she know my name? Lucy must have told her...
+<speech.tiffany>How did you sleep?</speech>
-[[...|C1P35V2]]<br>
-[[Morning...?|C1P35V1]]<br>
-[[Lose something over here?|C1P35V3]]I stare back at her for a moment.
+<speech.sarah>Like a log.</speech>
-<%= window.story.customRender("F: Breakfast?") %>"Um...", I start. My throat is still dry. I cough to clear it a little.
+<character.two.happy>Tiffany</character>
-"Good morning...?", I say, a hint of uncertainty in my voice.
+<speech.tiffany>Logs don't sleep silly.</speech>
-"Good morning!", she replies in a cherry, high pitch voice.
+<speech.sarah>No, it's a figure of-</speech>
+<speech.sarah>You know what, never mind.</speech>
-"Did you sleep OK?", she asks.
+<action>I'm way too tired to try to explain.</action>
+<action>She giggles at me.</action>
-"Yeah, actually. Like a log", I reply.
+<%= window.story.render("F: Breakfast?") %><% window.story.setChoice("Chapter1", "Laughed"); %>
-A slightly puzzled look appears across her face.
+<ui>standard</ui>
+<character.one>Sarah</character>
+<character.two.happy.eyes>Tiffany</character>
-"Logs don't sleep, they're not alive", she states.
+<speech.sarah>Did you lose something over here?</speech>
-"No, I meant- Never mind", I say; it's too early to even try to explain.
+<character.two.confused.eyes>Tiffany</character>
-She shrugs.
+<action>A puzzled look appears on her face.</action>
-<%= window.story.customRender("F: Breakfast?") %><% window.story.setChoice("Chapter1", "Laughed") %>
+<speech.tiffany>I don't think so...</speech>
-"Did you lose something over here?", I remark.
+<action>She replies in a high-pitched voice.</action>
-A puzzled look appears on her face.
+<character.one.happy>Sarah</character>
-"I don't think so", she replies in a high-pitched voice.
+<action>I chuckle a little.</action>
-I chuckle a little.
+<character.two.confused>Tiffany</character>
-The puzzled look intensifies.
+<action>Her puzzled look intensifies.</action>
-"What, what's funny?", she asks.
+<speech.tiffany>What, what's funny?</speech>
-"Nothing, nothing", I reply, holding back my laughter.
+<speech.sarah>Nothing, nothing...</speech>
-She shakes her head.
+<action>I manage to say through my stifled laughter.</action>
+<action>She shakes her head.</action>
+<action>I can't remember the last time I laughed...</action>
-I can't remember the last time I laughed...
+<%= window.story.render("F: Breakfast?") %><character.one>Sarah</character>
+<character.two.happy.eyes>Tiffany</character>
-<%= window.story.customRender("F: Breakfast?") %>"Would you like some breakfast?", she asks, a hint of excitement in her voice.
+<speech.tiffany>Would you like some breakfast?</speech>
-I'm starving, I hadn't had a proper meal for days before I got here, and who knows how long I've been on this sofa for.
+<action>There's a hint of excitement in her voice.</action>
+<action>I'm starving, I hadn't had a proper meal for days before I wound up here.</action>
+<action>And who knows how long I've been on this sofa for.</action>
-[[Yeah, thanks Tiff|C1P35R1]] [[Yeah, thanks Tiffany|C1P35R2]]<%
+<choices>
+ [[Yeah, Tiff|C1P35R1]]
+ [[Yeah, Tiffany|C1P35R2]]
+</choices><%
window.story.setChoice("Chapter1", "Tiffany", false);
window.story.setChoice("Chapter1", "TiffanyName", "Tiff");
-window.story.redirect("C1P36", 1);
-%><%
+window.story.redirect("C1P36", 0);
+%><%
window.story.setChoice("Chapter1", "Tiffany");
window.story.setChoice("Chapter1", "TiffanyName", "Tiffany");
-window.story.redirect("C1P36", 1);
-%>"Yeah, thanks <% print(window.story.tiffany()) %>", I say.
+window.story.redirect("C1P36", 0);
+%><ui>standard</ui>
+<character.one.happy.eyes>Sarah</character>
+<character.two.happy.eyes>Tiffany</character>
+
+<speech.sarah>Yeah, thanks %Tiffany%.</speech>
+
+<character.two.happy>Tiffany</character>
+
+<action>Her face lights up with a smile.</action>
+
+<% if (window.story.tiffany() === "Tiff") { %>
+
+<action>I think she likes that nickname.</action>
+
+<% } %>
+
+<speech.tiffany>Come on then!</speech>
+
+<action>She jumps up from the table and heads for the door.</action>
+
+<speech.sarah>Hey, %Tiffany%, wait!</speech>
+
+<ui>special</ui>
+<special>living-room</special>
+<character.one>Sarah</character>
+
+<action>Too late, she's already out the door by the time the words leave my mouth.</action>
+<action>I still have this thing in my arm, what did Lucy call it... a cannula, I think?</action>
+<action>The other door swings open behind me, speak of the devil.</action>
+
+<ui>standard</ui>
+<character.one>Sarah</character>
+<character.two>Lucy</character>
+
+<speech.lucy>Morning.</speech>
+<speech.lucy>I didn't think you'd be awake this early.</speech>
+
+<action>Hmph.</action>
+
+<speech.lucy>How are you feeling?</speech>
+
+<action>She closes the door and walks over towards me.</action>
+
+<choices>
+ [[Better|C1P36V1]]
+ [[I'll live|C1P36V2]]
+ [[Like shit|C1P36V3]]
+</choices><ui>standard</ui>
+<character.one>Sarah</character>
+<character.two>Lucy</character>
+
+<speech.sarah>Better, actually.</speech>
+
+<speech.lucy>Good.</speech>
+<speech.lucy>Those fluids did you the world of good.</speech>
+
+<action>She nods in the direction of the coat hanger stand.</action>
+
+<%= window.story.render("F: Get that out") %><ui>standard</ui>
+<character.one>Sarah</character>
+<character.two>Lucy</character>
+
+<speech.sarah>I'll live.</speech>
+
+<character.two.happy.mouth>Lucy</character>
+
+<speech.lucy>Very presumptuous of you.</speech>
+
+<action>A smirk creeps across her face.</action>
+
+<character.two>Lucy</character>
+
+<%= window.story.render("F: Get that out") %><ui>standard</ui>
+<character.one>Sarah</character>
+<character.two>Lucy</character>
+
+<speech.sarah>Like shit.</speech>
+
+<character.two.concern.mouth>Lucy</character>
+
+<action>She takes a breath as if to say something, but stops then shakes her head.</action>
+
+<speech.lucy>Well, you look the part.</speech>
+<speech.lucy>Once you get some food in you you'll feel better.</speech>
+
+<%= window.story.render("F: Get that out") %><action>Lucy points at my arm.</action>
+
+<speech.lucy>Let's get that out, shall we?</speech>
+
+<choices>
+ [[Yeah... sure|C1P37V1]]
+ [[Will it hurt?|C1P37V2]]
+ [[Can I keep it?|C1P37V3]]
+</choices><ui>standard</ui>
+<character.one>Sarah</character>
+<character.two>Lucy</character>
+
+<speech.sarah>Uh, yeah... sure.</speech>
+
+<action>I try to sound at least a little confident.</action>
+
+<speech.lucy>Don't stress, it will only take a second.</speech>
+
+<%= window.story.render("F: Peel back") %><ui>standard</ui>
+<character.one>Sarah</character>
+<character.two>Lucy</character>
+
+<speech.sarah>Will it... hurt?</speech>
+
+<% if (window.story.getChoice("Chapter1", "Lied")) { %>
+
+<speech.lucy>No, not really.</speech>
+<speech.lucy>Might feel a bit weird though.</speech>
+
+<% } else { %>
+
+<speech.lucy>Not as much as pulling a knife out I would imagine.</speech>
+
+<action>Yikes. I can't tell if that was her attempting to be humorous or not.</action>
+
+<% } %>
+
+<%= window.story.render("F: Peel back") %><ui>standard</ui>
+<character.one.happy.eyes>Sarah</character>
+<character.two>Lucy</character>
+
+<speech.sarah>Can I keep it? Sounds useful.</speech>
+
+<character.one>Sarah</character>
+
+<speech.lucy>No, they're not designed to be permanent.</speech>
+<speech.lucy>Any more than a few days and you risk getting an infection.</speech>
+
+<%= window.story.render("F: Peel back") %><action>Lucy moves to sit across from me on the coffee table.</action>
+<action>She extends her hand out, beckoning me to give her mine.</action>
+<action>I hesitate for a moment.</action>
+<action>I guess if she wanted to hurt me, she would have done it by now...</action>
+<action>I place my hand in hers.</action>
+<action>She disconnects the tubbing and peels back the tape.</action>
+<action>She reaches into one of the pockets of her cargo pants and takes out a packet of cotton wool balls.</action>
+<action>Then in one smooth motion, she swiftly pulls out the cannula and holds the cotton wool where it was inserted.</action>
+
+<choices>
+ [[Impressive|C1P38V1]]
+ [[[Cry fake pain]|C1P38V2]]
+ [[You're experienced|C1P38V3]]
+</choices><ui>standard</ui>
+<character.one.happy.eyes>Sarah</character>
+<character.two>Lucy</character>
+
+<speech.sarah>Impressive, I didn't feel a thing.</speech>
+
+<character.two.happy.mouth>Lucy</character>
+
+<action>Lucy smiles.</action>
+
+<speech.lucy>Thanks, I use to do these daily...</speech>
+<speech.lucy>I miss it sometimes.</speech>
+
+<character.two>Lucy</character>
+
+<action>Her smile fades.</action>
+
+<%= window.story.render("F: Breakfast time!") %><% window.story.achievement("Chapter1", "Drama"); %>
+
+<ui>standard</ui>
+<character.one.angry.eyes>Sarah</character>
+<character.two>Lucy</character>
+
+<speech.sarah>Argh!</speech>
+
+<action>Lucy doesn't bother to move her head up, just her eyes so they meet mine.</action>
+
+<character.one>Sarah</character>
+<character.two.concern.eyes>Lucy</character>
+
+<action>She gives me a look that says "Really?", then looks away again.</action>
+
+<character.two>Lucy</character>
+
+<action>Well, I thought it was pretty funny.</action>
+
+<%= window.story.render("F: Breakfast time!") %><ui>standard</ui>
+<character.one>Sarah</character>
+<character.two>Lucy</character>
+
+<speech.sarah>You've clearly done that a few times before</speech>
+
+<speech.lucy>Mhm, once or twice.</speech>
+
+<action>She mumbles back.</action>
+
+<%= window.story.render("F: Breakfast time!") %>"Chapter1", "Knocked", "Knock, knock", "Who's *there?*"
+
+"Chapter1", "Soap", "Nothing wasted", "You never know when it will come in handy!"
+
+"Chapter1", "Filter", "No Filter", "Speaking your mind, *even when you shouldn't.*"
+
+"Chapter1", "HelloThere", "Hello There", "General Kenobi... you are a bold one."
+
+"Chapter1", "Nothing", "Silent Treatment", "You have the right to remain silent..."
+
+"Chapter1", "NoChoice", "Broken Record", "You need some new material."
+
+"Chapter1", "RollCredits", "Roll Credits", "And that's a Sin."
+
+"Chapter1", "Drama", "Drama Queen", "You should have been an actor."
+
+"Chapter1", "Walkers", "Walkers?", "What do you call the ones that run?"
+
+"Chapter1", "Scorpion", "Scorpion", "*Get over here*"<action>Lucy reaches back into one of her pockets with her free hand.</action>
+<action>She pulls out a roll of tape, then tearing a bit off, secures the cotton wool ball to my hand.</action>
+
+<speech.lucy>Alright, you're good to go.</speech>
+
+<speech.sarah>Just like that?</speech>
+
+<speech.lucy>Just like that.</speech>
+
+<action>She stands up and heads for one of the doors.</action>
+
+<speech.lucy>Let's get some food in you.</speech>
+
+<action>I slowly start to get off the sofa.</action>
+<action>Lucy opens the door.</action>
+
+<speech.lucy>Through here and down this hallway, when you're ready.</speech>
+
+<resetcharacter.two>
+
+<action>Lucy exits through the door, leaving me alone.</action>
+
+<speech.sarah>Thanks...</speech>
+
+<ui>special</ui>
+<special>living-room</special>
+<character.one>Sarah</character>
+
+<action>Well, that sounded like an invitation to have a look around.</action>
+<action>I stand up-</action>
+
+<character.one.pain>Sarah</character>
+
+<action>Woah, my left leg is, like, stiff?</action>
+<action>It feels kinda like when you sit on it for too long and you cut all the blood off from it.</action>
+<action>I slowly take a few steps...</action>
+<character.one.pain.eyes>Sarah</character>
+<action>Yeah, okay, I can manage this.</action>
+
+<character.one>Sarah</character>
+
+<%= window.story.render("F: Living room search options") %><choices>
+ <%
+ if (!window.story.getChoice("Chapter1", "LivingWindow")) print("[[[Look at window]|C1P39V2]]");
+
+ if (!window.story.getChoice("Chapter1", "Door2")) print("[[[Go to second door]|C1P39V1]]");
+
+ if (!window.story.getChoice("Chapter1", "CoffeeTable")) print("[[[Look at coffee table]|C1P39V3]]");
+
+ if (!window.story.getChoice("Chapter1", "Saline")) print("[[[Look at bag of clear fluid]|C1P39V4]]");
+
+ if (!window.story.getChoice("Chapter1", "TVandC")) print("[[[Look at the TV and cabinet]|C1P39V5]]");
+ %>
+
+ [[[Follow Lucy]|C1P40]]
+</choices><% window.story.setChoice("Chapter1", "Door2"); %>
+
+<ui>special</ui>
+<special>living-room</special>
+<character.one>Sarah</character>
+
+<action>I walk around to the other door and open it.</action>
+<action>Huh, a familiar sight, it's the laundry room.</action>
+<action>There's a red stain on the floor just near the door.</action>
+<action>I guess that's where I passed out...</action>
+<action>I'm glad I didn't hit my head.</action>
+<action>I close the door.</action>
+
+<%= window.story.render("F: Living room search options") %><% window.story.setChoice("Chapter1", "CoffeeTable"); %>
+
+<ui>special</ui>
+<special>living-room</special>
+<character.one>Sarah</character>
+
+<action>I walk up to the coffee table.</action>
+<action>It's pretty ordinary, a few coffee stains here and there, otherwise in good shape.</action>
+<action>I wonder if Lucy has any coffee?</action>
+<action>I would kill for a coffee.</action>
+
+<%= window.story.render("F: Living room search options") %><ui>special</ui>
+<special>living-room</special>
+<character.one>Sarah</character>
+
+<% if (window.story.getChoice("Chapter1", "TVandC")) { %>
+
+ <%= window.story.render("F: Living room search options") %>
+
+<% } else { %>
+ <% window.story.setChoice("Chapter1", "TVandC"); %>
+
+ <action>I walk over to the TV and cabinet.</action>
+ <action>The TV looks reasonably new, one of those fancy new super flat ones.</action>
+ <action>Well, I guess not new anymore.</action>
+ <action>I bend down and open the cabinet.</action>
+ <action>There's a load of old TV crap, set-top boxes and what have you, and-</action>
+
+ <character.one.happy.eyes>Sarah</character>
+
+ <action>What's this? A spinning top.</action>
+ <action>I wonder what this doing in here.</action>
+
+ <character.one>Sarah</character>
+
+ <choices>
+ [[[Take spinning top]|C1P39V51]]
+ [[[Leave spinning top]|C1P39V5]]
+ </choices>
+<% } %><% window.story.setChoice("Chapter1", "Saline"); %>
+
+<ui>special</ui>
+<special>living-room</special>
+<character.one>Sarah</character>
+
+<action>I walk up to the coat hanger stand and look at the clear bag of fluid.</action>
+<action>What's left of it anyway.</action>
+<action>I take the bag off the hanger.</action>
+<action>It's a long, crumpled up, clear bag, and it looks rather worn.</action>
+<action>There's some writing on it I can still make out though.</action>
+<action>"Sodium Chloride 0.9% 1000ml - For Intravenous Infusion"</action>
+<action>"Sterile non-pyrogenic... osmolality 308 mOsm/kg water... isotonic... pH 4.5 - 7"</action>
+
+<character.one.pain.eyes>Sarah</character>
+
+<action>I feel like I'm back in high school science class again.</action>
+<action>I have no clue what any of this means.</action>
+
+<character.one>Sarah</character>
+
+<action>I put the bag back on the hanger.</action>
+
+<%= window.story.render("F: Living room search options") %><ui>standard</ui>
+<character.one>Sarah</character>
+
+<action>I head to the door Lucy went through, wary of my leg.</action>
+<action>I open the door.</action>
+<action>The hallway has doors on all four sides, and a set of stairs on one side.</action>
+
+<character.two>Unknown</character>
+<characteroverride.two>Lucy</characteroverride>
+
+<speech.unknown>Tiffany, stop playing with your food...</speech>
+
+<resetcharacter.two/>
+
+<action>I can hear Lucy say somewhere behind the furthest door.</action>
+<action>That must be to the kitchen.</action>
+
+<%= window.story.render("F: Hallway search options") %><% window.story.setChoice("Chapter1", "LivingWindow"); %>
+
+<ui>special</ui>
+<special>living-room</special>
+<character.one>Sarah</character>
+
+<action>I walk over to the window.</action>
+<action>It's been boarded up from the outside, but there are a few cracks I can look through.</action>
+<action>I squat down and have a look through one.</action>
+<action>It looks out onto a small front garden and the street, and-</action>
+
+<character.one.happy.eyes>Sarah</character>
+
+<action>Whoa, that's actually quite a lot of walkers.</action>
+<action>Looks like they're just passing through, maybe 10 or 20 of them?</action>
+
+<character.one>Sarah</character>
+
+<action>I should probably let Lucy know...</action>
+<action>Anyway, the front garden is much smaller than the back garden.</action>
+<action>It's got a small fence running around it, only about half a meter high.</action>
+<action>The weather doesn't look great actually, it's pretty overcast, and I can see storm clouds rolling in.</action>
+<action>I wonder how this place will hold up in the rain...</action>
+<action>I stand up again.</action>
+
+<%= window.story.render("F: Living room search options") %><% window.story.setChoice("Chapter1", "SpinningTop"); %>
+
+<ui>special</ui>
+<special>living-room</special>
+<character.one>Sarah</character>
+
+<action>I pick up the spinning top.</action>
+<action>%Tiffany% might like this.</action>
+
+<%= window.story.render("F: Living room search options") %><% window.story.setChoice("Chapter1", "Stairs"); %>
+
+<ui>special</ui>
+<character.one>Sarah</character>
+
+<action>I walk up to the stairs.</action>
+<action>They bend and go to the left as they go up.</action>
+<action>I better not go up there.</action>
+
+<% if (window.story.getChoice("Chapter1", "Lied")) { %>
+
+ <action>Lucy doesn't trust me as it is, no need to give her an excuse.</action>
+
+<% } else { %>
+
+ <action>I don't want to push my luck and risk a free meal.</action>
+
+<% } %>
+
+<%= window.story.render("F: Hallway search options") %><ui>special</ui>
+<character.one>Sarah</character>
+
+<% if (window.story.getChoice("Chapter1", "FreshenUp")) { %>
+
+ <%= window.story.render("F: Hallway search options") %>
+
+<% } else { %>
+ <% window.story.setChoice("Chapter1", "FreshenUp"); %>
+
+ <action>I walk up to the door on the left and open it.</action>
+ <action>It's a bathroom!</action>
+ <action>I could use a freshening up...</action>
+
+ <choices>
+ [[[Enter bathroom]|C1P40V21]]
+ [[[Leave bathroom]|C1P40V2]]
+ </choices>
+<% } %><% window.story.setChoice("Chapter1", "Frontdoor"); %>
+
+<ui>special</ui>
+<character.one>Sarah</character>
+
+<action>I walk up to the door, it's larger than the other doors, and has locks on it.</action>
+<action>This must be the front door.</action>
+<action>I don't really want to go out there right now.</action>
+
+<% if (window.story.getChoice("Chapter1", "LivingWindow")) { %>
+
+ <action>Especially not with all those walkers out there.</action>
+
+<% } %>
+
+<%= window.story.render("F: Hallway search options") %><% if (!window.story.getChoice("Chapter1", "Haircut")) window.story.setChoice("Chapter1", "Haircut", false); %>
+
+<ui>special</ui>
+<special>kitchen</special>
+<character.one>Sarah</character>
+
+<action>I walk to the end of the hallway, and go through the kitchen door.</action>
+<action>%Tiffany% and Lucy are sitting at a table in the middle of the small room.</action>
+<action>Benches line two sides of the room, and there's a door on the far side.</action>
+<action>There's a portable gas stove with a can of something on top of it on one of the benches.</action>
+
+<% if(window.story.getChoice("Chapter1", "CoffeeTable")) { %>
+
+ <action>No sign of a coffee pot though, damn.</action>
+
+<% } %>
+
+<ui>standard</ui>
+<character.one>Sarah</character>
+<character.two.happy>Tiffany</character>
+
+<action>%Tiffany% looks up from her meal and sees me, a smile fills her face.</action>
+
+<speech.tiffany>Come sit here!</speech>
+
+<action>She's gesturing to the chair next to her.</action>
+
+<character.two>Lucy</character>
+
+<action>I shoot a glace over at Lucy, who gives a small nod of approval.</action>
+
+<choices>[[[Sit next to %Tiffany%]|C1P42]]</choices><choices>
+ <%
+ if (!window.story.getChoice("Chapter1", "Stairs")) print("[[[Look at stairs]|C1P40V1]]");
+
+ if (!window.story.getChoice("Chapter1", "FreshenUp")) print("[[[Look at left door]|C1P40V2]]");
+
+ if (!window.story.getChoice("Chapter1", "Frontdoor")) print("[[[Look at right door]|C1P40V3]]");
+ %>
+
+ [[[Go to the kitchen]|C1P41]]
+</choices><% window.story.setChoice("Chapter1", "Bathroom"); %>
+
+<ui>special</ui>
+<character.one>Sarah</character>
+
+<action>I step inside.</action>
+<action>There's a sink with some water in it; it looks pretty clean.</action>
+<action>I walk over to it, dip my hands in, and run my hands over my face.</action>
+
+<character.one.happy.eyes>Sarah</character>
+
+<action>Wow, that feels fantastic...</action>
+<action>I don't recall the last time I had a wash.</action>
+
+<character.one>Sarah</character>
+
+<action>I give my face and arms a good scrub.</action>
+<action>The water turns a nasty brown color.</action>
+<action>I look at the mirror above the sink.</action>
+
+<character.one.pain.eyes>Sarah</character>
+
+<action>My eyes are plagued by red lines...</action>
+<action>...my hair is in complete disarray...</action>
+<action>...not to mention it's getting a bit long too.</action>
+<action>I wonder if there's some scissors around here?</action>
+<action>That might be overstepping actually, maybe I should get going</action>
+
+<choices>
+ [[[Leave bathroom]|C1P40V211]]
+ [[[Search for scissors]|C1P40V212]]
+</choices><ui>special</ui>
+<character.one>Sarah</character>
+
+<action>Maybe later.</action>
+<action>I let out the water in the sink, and leave the bathroom.</action>
+
+<%= window.story.render("F: Hallway search options") %><% window.story.setChoice("Chapter1", "Haircut"); %>
+
+<ui>special</ui>
+<character.one>Sarah</character>
+
+<action>I search around the bathroom.</action>
+<action>I find a small vanity box on top of a self in the corner of the room.</action>
+<action>It has some bits and pieces, and-</action>
+<action>Score! A pair of scissors.</action>
+<action>They look in pretty good condition too, only a little rusty.</action>
+<action>I walk back over to the sink and start cutting my hair.</action>
+<action>Doesn't need to be fancy, just functional...</action>
+<action>There we go, that's a bit better.</action>
+<action>I pocket the scissors.</action>
+<action>I doubt that box was Lucy's, judging by all the dust on it.</action>
+<action>Not to mention finding a pair is not easy these days.</action>
+<action>I let the hair filled water in the sink go, and head back into the hallway.</action>
+
+<%= window.story.render("F: Hallway search options") %><ui>special</ui>
+<special>kitchen</special>
+<character.one>Sarah</character>
+<music>calm</music>
+<sound>chair</sound>
+
+<action>I sit down at the table.</action>
+
+<ui>standard</ui>
+<character.one>Sarah</character>
+<character.two>Lucy</character>
+
+<speech.lucy>I'll fix you a bowl.</speech>
+
+<sound>chair2</sound>
+
+<action>She stands up from the table.</action>
+
+<% if (window.story.getChoice("Chapter1", "Haircut")) { %>
+
+ <character.two.confused>Tiffany</character>
+
+ <action>%Tiffany% looks at me, puzzled.</action>
+
+ <speech.tiffany>You look different.</speech>
+ <speech.sarah>I cut my hair.</speech>
+ <speech.sarah>It's important to keep your hair short.</speech>
+ <speech.tiffany>Why?</speech>
+
+ <character.one.pain.eyes>Sarah</character>
+
+ <speech.sarah>So, um, 'bad people', can't grab you as easily...</speech>
+
+ <character.two.confused.neutral>%Tiffany%</character>
+
+ <speech.tiffany>Like the monsters?</speech>
+ <speech.sarah>Well yeah, but also-</speech>
+
+ <character.two.concern.eyes>Lucy</character>
+
+ <action>Lucy is walking back over, shooting me a dirty look.</action>
+
+ <character.one>Sarah</character>
+ <character.two.confused.neutral>%Tiffany%</character>
+
+ <speech.sarah>Uhh...</speech>
+
+<% } else { %>
+
+ <action>Lucy walks over to the portable stove.</action>
+ <action>She stirs the contents of the can on top of it.</action>
+ <action>Then she pours some of it out into a bowl.</action>
+
+ <character.two.happy>Tiffany</character>
+
+ <action>I glance over at %Tiffany%.</action>
+ <action>She's just staring at me and smiling, a little creepy I must say.</action>
+ <action>Lucy walks back over to us.</action>
+
+<% } %>
+
+<ui>special</ui>
+<special>beans</special>
+<character.one>Lucy</character>
+<sound>bowl</sound>
+
+<speech.lucy>Here, Beans and Cheese.</speech>
+
+<choices>[[[Take the bowl]|C1P43]]</choices><ui>standard</ui>
+<character.one.happy.eyes>Sarah</character>
+<character.two>Lucy</character>
+
+<speech.sarah>Thanks, I haven't had a hot meal in... well, a long time.</speech>
+
+<speech.lucy>Mhm.</speech>
+
+<action>Lucy grunts.</action>
+<action>I'm starving, I dig right in.</action>
+
+<character.two.confused.sad>Tiffany</character>
+
+<action>I can feel %Tiffany% staring at me.</action>
+<action>I stop eating and look at her.</action>
+<action>She has a hilariously cute look of disgust on her face.</action>
+
+<speech.tiffany>How can you eat that?</speech>
+
+<character.one.happy>Sarah</character>
+
+<action>I stifle a laugh in response, nearly choking on beans.</action>
+
+<character.two.concern.eyes>Lucy</character>
+
+<action>A quick glance at Lucy confirms she is not impressed by the comment.</action>
+
+<speech.lucy>You're free to go find your own meal little miss picky.</speech>
+
+<action>Lucy rolls her eyes.</action>
+
+<choices>
+ [[It tastes good|C1P43V1]]
+ [[You need to eat|C1P43V3]]
+ [[What do you like?|C1P43V2]]
+</choices><% window.story.loadSaves() %>
+
+<img.title-image>
+
+<span#slotsLoading>Loading...</span>
+
+<div-#savesContainer></div>
+
+[[Back|Game Options]]<img.title-image>
+
+This game has an optional Cloud Saving feature, to enable it, click the button below and follow the instructions. itch.io account required.
+
+<% if (window.story.network) { %>
+
+<div#title-button>[[Enable Cloud Saving|Linking]]</div>
+
+<% } else { %>
+
+<div#title-button><a0 onclick="window.story.noConnection()"><s>Enable Cloud Saving</s><br><span.smaller>(Could not connect to remote server)</span></a></div>
+
+<% } %>
+
+If you choose not to enable Cloud Saving, your progress will be lost when you refresh or leave the game.
+
+<div#title-button>[[Continue without Saving|Game Options]]</div>
+
+[[Back|Title Screen]]<img.title-image>
+
+Clicking the button below will open a new tab, ask you to authorize Purpose (this game) to access your public itch.io information, and will then give you a temporary "Linking Code" to use below. Purpose only uses your itch.io information for saving your game progress. Purpose does not have access to your E-Mail, Password, or any other personal information.
+
+<u>NOTE: Treat your Linking Code like a password, do not share it, and if you are recording or streaming, do not show it to your audience. Linking Codes are one use, and expire if not used.</u>
+
+<hr>
+
+<div#title-button>
+ <a#generateButton href="https://purpose-game.com/auth" target="_blank" onclick="window.story.toggleLinkingDisplays()">Generate Linking Code</a>
+</div>
+
+<form-#linkingForm action="javascript:void(0)">
+ <label for="linking-code">Linking Code</label><br>
+ <input#linking-code type="text" name="code" placeholder="Paste Here" autocomplete="off" maxlength="9">
+
+ <button0#linking-codeButton onclick="window.story.linkCode()">Link</button><br>
+
+ <a.small.normal-link onclick="window.story.toggleLinkingDisplays(true)">I need another Linking Code</a>
+</form>
+
+[[Back|Save Options]]<img.title-image>
+
+Thanks for linking your itch.io account with Purpose, <% print(window.story.player.name) %>. Your story progress and achievements will now be saved to the Cloud.
+
+You will need to re-link your account each time you play the game.
+
+<div#title-button>[[Continue|Game Options]]</div><img.title-image>
+
+<div#title-button>
+<%
+if (window.story.saving) {
+ print("[[New Game|New Game]]");
+ print("[[Saved Games|Saved Games]]");
+} else {
+ print("[[New Game|C1 Intro]]");
+ if (window.story.network) print("[[Enable Saving|Save Options]]");
+}
+%>
+<a onclick="window.story.toggleFullscreen()">Toggle Fullscreen</a>
+</div><% window.story.loadSaves(true) %>
+
+<img.title-image>
+
+Select a Save Slot to start a new game.
+
+<u>NOTE: Selecting a Save Slot that is already in use will override any saved data.</u>
+
+<span#slotsLoading>Loading...</span>
+
+<form-#saveSlotSelector action="javascript:void(0)">
+ <label for="slots">Choose a Save Slot:</label>
+ <select#slots name="slots">
+ <option#saveSlot1 value="1">Save Slot 1</option>
+ <option#saveSlot2 value="2">Save Slot 2</option>
+ <option#saveSlot3 value="3">Save Slot 3</option>
+ <option#saveSlot4 value="4">Save Slot 4</option>
+ </select>
+
+ <button0#selectSlotButton onclick="window.story.selectSlot()">Select Slot and Start Game</button>
+</form>
+
+[[Back|Game Options]]<ui>standard</ui>
+<character.one.happy.eyes>Sarah</character>
+<character.two.confused.sad>Tiffany</character>
+
+<speech.sarah>Eat up, it tastes good.</speech>
+
+<action>I say with a mouthful</action>
+
+<speech.tiffany>But, it's all gluggy and gross.</speech>
+
+<character.two.concern.sad>Lucy</character>
+
+<speech.lucy>That's because you let it go cold...</speech>
+
+<action>Lucy replies with a sigh.</action>
+
+<%= window.story.render("F: Come chat") %><ui>standard</ui>
+<character.one.happy.eyes>Sarah</character>
+<character.two.confused.sad>Tiffany</character>
+
+<speech.sarah>What do you like to eat %Tiffany%?</speech>
+
+<character.two.happy>Tiffany</character>
+
+<speech.tiffany>Oh, easy!</speech>
+<speech.tiffany>Pizza and peanut butter sandwiches!</speech>
+
+<speech.sarah>At the same time?</speech>
+
+<speech.tiffany>No silly!</speech>
+
+<speech.sarah>Well, not much of either of those around these days.</speech>
+
+<%= window.story.render("F: Come chat") %><% window.story.setChoice("Chapter1", "Eating"); %>
+
+<ui>standard</ui>
+<character.one>Sarah</character>
+<character.two.confused.sad>Tiffany</character>
+
+<speech.sarah>Eat up, you need food for strength.</speech>
+
+<speech.tiffany>But, it's all gluggy and gross...</speech>
+
+<speech.sarah>Doesn't matter.</speech>
+<speech.sarah>You never know when you're going to get your next meal.</speech>
+<speech.sarah>Have to eat when you can.</speech>
+
+<character.two.concern.sad>Lucy</character>
+
+<action>I glance at Lucy to gauge her thoughts.</action>
+<action>She looks back uncomfortably, but doesn't say anything.</action>
+
+<character.two.confused.eyes>Tiffany</character>
+
+<speech.tiffany>Hmm, I guess that makes sense.</speech>
+
+<action>She replies, sounding defeated.</action>
+<action>%Tiffany% sticks her spoon into the bowl and starts to eat.</action>
+<action>Maybe I taught her something important.</action>
+
+<%= window.story.render("F: Come chat") %><action>I get back to my bowl.</action>
+
+<character.two>Lucy</character>
+
+<speech.lucy>Sarah, come chat with me when you're finished eating.</speech>
+
+<action>She stands up and heads for the other door.</action>
+
+<character.one.happy.eyes>Sarah</character>
+
+<speech.sarah>Oh yeah, sure...</speech>
+
+<action>Lucy leaves the room.</action>
+<action>I wonder what that's about...</action>
+<action>Also very trusting of her to leave me alone with %Tiffany%.</action>
+
+<choices>[[[Keep eating]|C1P44]]</choices><ui>standard</ui>
+<character.one>Sarah</character>
+<character.two>Tiffany</character>
+
+<% if (window.story.getChoice("Chapter1", "Eating")) { %>
+
+<action>I look over at %Tiffany%, she's actually making decent process on her meal.</action>
+<action>I suppose that's good.</action>
+
+<% } else { %>
+
+<action>I look over at %Tiffany%, she's still playing with her food...</action>
+
+<% } %>
+
+<% if (window.story.getChoice("Chapter1", "SpinningTop")) { %>
+
+ <action>Oh yeah, I should give this to %Tiffany% before I forget.</action>
+
+ <choices>[[[Give %Tiffany%spinning top]|C1P44V4]]</choices>
+
+<% } else { %>
+
+ <action>With Lucy out of the room, I could find out a bit about %Tiffany%...</action>
+
+ <%= window.story.render("F: Tiff Breakfast Talk Options") %>
+
+<% } %><% window.story.setChoice("Chapter1", "TiffBackstory", "Dad"); %>
+
+<ui>standard</ui>
+<character.one>Sarah</character>
+<character.two>Tiffany</character>
+
+<speech.sarah>So, uh, where's your dad?</speech>
+
+<character.two.happy.eyes>Tiffany</character>
+
+<action>%Tiffany% looks up from her meal.</action>
+
+<character.two>Tiffany</character>
+
+<speech.tiffany>He got eaten by monsters...</speech>
+
+<action>She replies, sounding a little downtrodden.</action>
+
+<character.one.pain.eyes>Sarah</character>
+
+<speech.sarah>Ah, I'm sorry to hear that.</speech>
+
+<speech.tiffany>Don't be, he was being silly.</speech>
+
+<character.one.happy.eyes>Sarah</character>
+
+<speech.sarah>Oh...</speech>
+
+<action>I wonder what she means by that...</action>
+
+<speech.sarah>How so?</speech>
+
+<speech.tiffany>He was really lazy all of the time, and kept doing silly things.</speech>
+<speech.tiffany>One day we went down in this cool underground tunnel, and we found a bunch of monsters.</speech>
+<speech.tiffany>Mom picked me up and we ran away, but dad just stood there.</speech>
+<speech.tiffany>Mom tried to tell him to move, but he didn't.</speech>
+<speech.tiffany>I don't know why.</speech>
+<speech.tiffany>Mom doesn't like to talk about it with me...</speech>
+
+<action>We sit for a moment, while I process what the little girl just described to me.</action>
+<action>Damn...</action>
+
+<character.two.happy.eyes>Tiffany</character>
+
+<speech.tiffany>Anyway, what about your dad?</speech>
+
+<action>She remarks cheerfully.</action>
+
+<speech.sarah>Oh well, I'm not sure actually.</speech>
+<speech.sarah>I couldn't get back to him or my mom after everything went tits up.</speech>
+<speech.sarah>I like to think they're out there, somewhere...</speech>
+
+<action>But it's not likely...</action>
+<action>Should I have tried harder to find them?</action>
+<action>They were probably worried sick.</action>
+
+<%= window.story.render("F: Better get going") %><% window.story.setChoice("Chapter1", "TiffBackstory", "Lonely"); %>
+
+<ui>standard</ui>
+<character.one>Sarah</character>
+<character.two>Tiffany</character>
+
+<speech.sarah>So... where have you guys been staying?</speech>
+<speech.sarah>Have you moved around a lot?</speech>
+
+<action>%Tiffany% looks up from her meal.</action>
+
+<speech.tiffany>We move houses every once in a while.</speech>
+<speech.tiffany>Sometimes we stay longer, but mom doesn't like doing that.</speech>
+<speech.tiffany>She finds a safe place, and then leaves me there during the day.</speech>
+<speech.tiffany>That way she can go out looking for food and other stuff.</speech>
+
+<action>Lucy leaves %Tiffany% all alone?</action>
+<action>That's rough...</action>
+
+<speech.sarah>That... must be lonely.</speech>
+
+<speech.tiffany>It is, but mom says that it's too dangerous for me to come with her.</speech>
+<speech.tiffany>Except when we move houses, I guess.</speech>
+
+<action>I can tell she's not a huge fan of that arrangement.</action>
+
+<speech.tiffany>What about you?</speech>
+
+<speech.sarah>Oh, me?</speech>
+<speech.sarah>Well uh, I move around a lot.</speech>
+<speech.sarah>Sometimes I'll stay in a house, like you, but most of the time I just sleep wherever it's safest.</speech>
+<speech.sarah>Being by myself means it's pretty easy to pack up and go at a moment's notice, which has its perks.</speech>
+
+<speech.tiffany>Don't you get lonely too?</speech>
+
+<speech.sarah>Sometimes I guess, but I'm used to it.</speech>
+<speech.sarah>I've been on my own for a lonnnng fuckin' time.</speech>
+
+<%= window.story.render("F: Better get going") %><%
+window.story.achievement("Chapter1", "Walkers");
+window.story.setChoice("Chapter1", "TiffBackstory", "Killing");
+%>
+
+<ui>standard</ui>
+<character.one>Sarah</character>
+<character.two>Tiffany</character>
+
+<speech.sarah>So... how many walkers have you killed?</speech>
+
+<character.two.happy.eyes>Tiffany</character>
+
+<action>She looks up from her meal, surprised.</action>
+
+<speech.tiffany>Walkers?</speech>
+
+<character.two.confused.eyes>Tiffany</character>
+
+<speech.tiffany>Is that what you call the monsters?</speech>
+
+<speech.sarah>Yeah, the monsters.</speech>
+
+<character.two>Tiffany</character>
+
+<speech.tiffany>Oh...</speech>
+<speech.tiffany>I haven't...</speech>
+
+<action>She trails off, sounding uneasy.</action>
+
+<speech.tiffany>I don't know how to.</speech>
+
+<speech.sarah>It's not hard, you just have to aim for the head.</speech>
+
+<action>I reply with a mouth full, looking at her.</action>
+<action>She doesn't meet my gaze.</action>
+
+<speech.sarah>Might be a little hard, considering how little you are.</speech>
+
+<action>I load another spoonful of beans.</action>
+
+<speech.sarah>But don't let that stop you!</speech>
+
+<action>Her brow furrows like she's deep in thought.</action>
+
+<% if (window.story.getChoice("Chapter1", "Eating")) { %>
+
+<action>There's another piece of useful advise for her.</action>
+
+<% } else { %>
+
+<action>Hopefully she'll take what I said on board.</action>
+
+<% } %>
+
+<character.two.confused.eyes>Tiffany</character>
+
+<speech.tiffany>Why do you call them walkers?</speech>
+
+<action>She's still caught up on that haha.</action>
+
+<character.one.happy.eyes>Sarah</character>
+
+<speech.sarah>Because they fuckin' walk everywhere.</speech>
+
+<%= window.story.render("F: Better get going") %><ui>standard</ui>
+<character.one.pain.eyes>Sarah</character>
+<character.two.confused.eyes>Tiffany</character>
+
+<speech.sarah>Anyway...</speech>
+
+<character.one>Sarah</character>
+
+<speech.sarah>I had better go chat with your mom...</speech>
+
+<action>I get up from the table.</action>
+
+<resetcharacter.two/>
+
+<action>I start for the other door in the room.</action>
+<action>The sound of gentle tapping on the roof indicates it's raining outside.</action>
+<action>I wonder how this place will hold up in the rain.</action>
+<action>I get to the door and open it, then step through.</action>
+<action>It's a dining room, there's a long 8 or so seater table in the middle of the room.</action>
+<action>On one side there's a window with the curtains pulled.</action>
+<action>Another sports a display table with some picture frames on it.</action>
+
+<character.two>Lucy</character>
+
+<action>Lucy is standing at the display table, holding one of the picture frames.</action>
+
+<character.two.happy.eyes>Lucy</character>
+
+<action>Lucy turns to look at me as I close the door.</action>
+
+<character.two>Lucy</character>
+
+<action>She looks away again, back at the picture frame.</action>
+
+<speech.lucy>I'm sorry about last night.</speech>
+
+<choices>
+ [[...|C1P45V1]]
+ [[No stress|C1P45V2]]
+ [[You broke our deal|C1P45V3]]
+</choices><character.two.confused.eyes>Tiffany</character>
+
+<action>%Tiffany%'s face slowly contorts into a look of shock.</action>
+
+<speech.tiffany>Swear!</speech>
+
+<character.one.pain.eyes>Sarah</character>
+
+<action>There's an awkward pause.</action>
+
+<speech.sarah>Um...</speech>
+<speech.sarah>...sorry?</speech>
+
+<action>Another awkward pause.</action>
+<action>I seek refuge in the bowl below me.</action>
+<action>I scrape the last drops out of the bowl.</action>
+
+<choices>[[I better go talk to Lucy|C1P45]]</choices><ui>standard</ui>
+<character.one>Sarah</character>
+<character.two>Lucy</character>
+
+<action>I stay by the door.</action>
+<action>An uncomfortable silence settles in.</action>
+
+<%= window.story.render("F: Broke our deal") %><ui>standard</ui>
+<character.one>Sarah</character>
+<character.two>Lucy</character>
+
+<action>This again...</action>
+
+<speech.sarah>Don't worry about it.</speech>
+<speech.sarah>It was clearly... difficult, for both of us.</speech>
+
+<%= window.story.render("F: Broke our deal") %><ui>standard</ui>
+<character.one>Sarah</character>
+<character.two>Lucy</character>
+
+<action>Oh yeah, I'd forgotten.</action>
+
+<speech.sarah>Mhm, you broke our deal.</speech>
+
+<%= window.story.render("F: Broke our deal") %><action>Lucy puts the picture frame down and turns to face me.</action>
+
+<% if (window.passage.name === "C1P45V3") { %>
+
+<speech.lucy>Yes, I did.</speech>
+
+<% } else { %>
+
+<speech.lucy>I broke our deal last night.</speech>
+
+<% } %>
+
+<speech.lucy>That's why I wanted to talk to you.</speech>
+
+<action>Lucy sighs.</action>
+
+<speech.lucy>I'd be lying if I said I didn't ask about your sister...</speech>
+<speech.lucy>Just to find out more about the kind of person you are.</speech>
+
+<action>I figured as much.</action>
+
+<speech.sarah>Well, I'd be lying if I said I didn't ask about %Tiffany% for the same reason.</speech>
+
+<character.two.happy.mouth>Lucy</character>
+
+<action>A slight smile appears across her face.</action>
+
+<speech.lucy>Fair enough.</speech>
+
+<choices>[[[Walk over to Lucy]|C1P46]]</choices><ui>standard</ui>
+<character.one>Sarah</character>
+<character.two>Lucy</character>
+
+<action>I walk towards Lucy.</action>
+<action>I glance over at the picture frames she was looking at.</action>
+<action>They're not of her or of %Tiffany%, as I suspected.</action>
+<action>Just some random family.</action>
+<action>A happy, random family.</action>
+
+<speech.lucy>You know, Tiffany used to be like the little boy in these pictures.</speech>
+<speech.lucy>Happy, carefree, and surrounded by loving parents.</speech>
+
+<action>She's talking without making eye contact with me.</action>
+
+<speech.lucy>Then when everything went to shit, she lost all that...</speech>
+<speech.lucy>...and there wasn't a damn thing I could do about it.</speech>
+
+<choices>
+ [[...|C1P46V1]]
+ [[She's still happy|C1P46V2]]
+ [[She's still loved|C1P46V3]]
+</choices><ui>standard</ui>
+<character.one>Sarah</character>
+<character.two>Lucy</character>
+
+<action>I look at Lucy, then back at the frames.</action>
+
+<%= window.story.render("F: Happy cuz of you") %><ui>standard</ui>
+<character.one>Sarah</character>
+<character.two>Lucy</character>
+
+<speech.sarah>Well, she still looks pretty happy to me.</speech>
+
+<%= window.story.render("F: Happy cuz of you") %><ui>standard</ui>
+<character.one>Sarah</character>
+<character.two.happy.eyes>Lucy</character>
+
+<speech.sarah>Not all of it.</speech>
+<speech.sarah>You still love her, don't you?</speech>
+
+<character.two>Lucy</character>
+
+<%= window.story.render("F: Happy cuz of you") %><action>Lucy lets out a sigh.</action>
+
+<% if (window.passage.name === "C1P46V1" || window.passage.name === "C1P46V2") { %>
+
+ <speech.lucy>Your seeing a side of her that I haven't seen in a long time.</speech>
+ <speech.lucy>A side I haven't been able to coax out of her since her father died.</speech>
+
+<% } else { %>
+
+ <speech.lucy>Of course I do.</speech>
+ <action>She pauses for a moment.</action>
+ <speech.lucy>But I don't think that's enough.</speech>
+ <speech.lucy>She needs more.</speech>
+
+<% } %>
+
+<action>Lucy continues to look at the frames.</action>
+
+<speech.lucy>Watching how she behaves around you, reminds me how she use to be.</speech>
+<speech.lucy>You are the first thing to bring any joy into her life in a very long time.</speech>
+<speech.lucy>I do my best to keep her alive and fed...</speech>
+<speech.lucy>...but that leaves me so little time to keep her happy.</speech>
+
+<action>She looks away from the frames, at one of the blank walls.</action>
+
+<speech.lucy>Back... before... I used to work all the time.</speech>
+<speech.lucy>Doing shift work meant I didn't get to see Tiffany very much.</speech>
+<speech.lucy>When she wasn't at pre-school, she was home with her father.</speech>
+<speech.lucy>They were such a good team, and how that he's gone...</speech>
+
+<character.two.sad.eyes>Lucy</character>
+
+<action>She finally turns to look at me.</action>
+
+<speech.lucy>I don't know what to do to make her happy anymore.</speech>
+
+<choices>
+ [[...|C1P47V1]]
+ <%
+ switch (window.story.getChoice("Chapter1", "TiffBackstory")) {
+ case "Lonely":
+ print("[[She's lonely|C1P47V31]]");
+ break;
+
+ case "Dad":
+ print("[[She misses her dad|C1P47V32]]");
+ break;
+
+ case "Killing":
+ print("[[She's not involved enough|C1P47V33]]");
+ break;
+ }
+ %>
+</choices><ui>standard</ui>
+<character.one>Sarah</character>
+<character.two.sad.eyes>Lucy</character>
+
+<action>I wonder why Lucy is telling me all this.</action>
+<action>I'm not sure where this is going...</action>
+
+<%= window.story.render("F: Tiff is a child") %>"Jealous?", I ask?
+
+Lucy scoffs.
+
+"Yeah, I guess I am a little bit", she says, smiling slightly.
+
+<%= window.story.render("F: Tiff is a child") %><ui>standard</ui>
+<character.one.angry.eyes>Sarah</character>
+<character.two.sad.eyes>Lucy</character>
+
+<action>Says the woman leaving %Tiffany% alone all day!</action>
+
+<speech.sarah>Can you blame her?</speech>
+<speech.sarah>When she's left alone all day long?</speech>
+
+<action>I didn't realize how rude that sounded till the words actually left my mouth.</action>
+<action>Oh well, it's true.</action>
+
+<character.two.concern.eyes>Lucy</character>
+
+<action>Lucy looks at to me with a mixture of anger and shock.</action>
+
+<character.two.sad.eyes>Lucy</character>
+
+<action>It quickly fades away though.</action>
+<action>She knows I'm right.</action>
+
+<%= window.story.render("F: Tiff is a child") %><ui>standard</ui>
+<character.one>Sarah</character>
+<character.two.sad.eyes>Lucy</character>
+
+<action>I'm not sure how to talk about this with her.</action>
+<action>%Tiffany% only told me a little bit about her dad...</action>
+<action>But I think it needs to be said.</action>
+
+<speech.sarah>I agree that she probably misses her dad...</speech>
+<speech.sarah>...and I won't pretend to understand what he, and the rest of you guys went through...</speech>
+<speech.sarah>..but...</speech>
+
+<action>This is a bad idea, but I'm in deep now, might as well say it.</action>
+
+<speech.sarah>From what I gather, he might not have been the best person to...</speech>
+<speech.sarah>...you know, have around, nowadays.</speech>
+
+<action>No reaction from Lucy.</action>
+
+<character.one.pain.eyes>Sarah</character>
+
+<action>This silence is killing me, I gotta say something else.</action>
+
+<character.one.happy.eyes>Sarah</character>
+
+<speech.sarah>And that's not to say he wasn't a great guy!</speech>
+<speech.sarah>I'm sure he was, but, you know, those feelings can be hard to deal with at the best of times.</speech>
+<speech.sarah>'The apocalypse' isn't really an ideal environment...</speech>
+
+<character.one.pain.eyes>Sarah</character>
+
+<action>I would know...</action>
+<action>We stand in awkward silence again.</action>
+
+<speech.lucy>I appreciate what he was going through must have been difficult.</speech>
+<speech.lucy>But Tiffany and I were relying on him, and I don't think I can ever forgive him.</speech>
+
+<%= window.story.render("F: Tiff is a child") %><ui>standard</ui>
+<character.one>Sarah</character>
+<character.two.sad.eyes>Lucy</character>
+
+<speech.sarah>I'm not sure what you were expecting.</speech>
+
+<action>Lucy looks at me in confusion.</action>
+
+<speech.sarah>%Tiffany% told me she hasn't ever killed a walker.</speech>
+<speech.sarah>Honestly I'm a little impressed that you've gotten this far without her needing to.</speech>
+<speech.sarah>However, for that to be the case, she's obviously lived a far too sheltered life.</speech>
+<speech.sarah>Killing walkers isn't the best example, but you get what I mean right?</speech>
+<speech.sarah>You need to involve her in the day-to-day stuff.</speech>
+<speech.sarah>If for no other reason than one day she's going to need to know how to do it herself, alone.</speech>
+
+<character.two.concern.eyes>Lucy</character>
+
+<action>Lucy takes a breath as if to say something...</action>
+
+<character.two.sad.eyes>Lucy</character>
+
+<action>But stops and looks away instead.</action>
+<action>She knows I'm right.</action>
+<action>That was actually kinda profound of me, huh.</action>
+
+<%= window.story.render("F: Tiff is a child") %><action>Lucy sighs, and moves away over towards the window.</action>
+
+<speech.lucy>Tiffany didn't even get the chance to go to school...</speech>
+<speech.lucy>Didn't get to make friends.</speech>
+<speech.lucy>Didn't get to go out on play dates.</speech>
+<speech.lucy>Didn't get to learn.</speech>
+<speech.lucy>Didn't get to...</speech>
+<speech.lucy>Have a childhood.</speech>
+<speech.lucy>There's not a handbook on 'How to raise a child in the apocalypse', but I'm trying my best.</speech>
+
+<action>She looks out the window.</action>
+<action>...</action>
+<action>I've gotta ask her...</action>
+
+<choices>[[Why did you save me?|C1P48]]</choices><ui>standard</ui>
+<character.one>Sarah</character>
+<character.two.sad.eyes>Lucy</character>
+
+<speech.sarah>Why did you save me, really?</speech>
+
+<action>Lucy is silent for a few moments.</action>
+
+<character.two>Lucy</character>
+
+<action>Then she turns to face me.</action>
+
+<speech.lucy>I saved you, because one day, maybe soon, that might be my little girl, running around out there, needing help.</speech>
+<speech.lucy>And I wanted to prove to myself that there are still good people out there.</speech>
+<speech.lucy>Who would help my girl, in her time of need.</speech>
+
+<action>We stare at each other.</action>
+
+<choices>
+ [[...|C1P48V1]]
+ [[There will be|C1P48V2]]
+ [[There won't be|C1P48V3]]
+</choices><% window.story.setChoice("Chapter1", "WillHelp", false); %>
+
+<ui>standard</ui>
+<character.one>Sarah</character>
+<character.two>Lucy</character>
+
+<action>I'm not sure what to say...</action>
+<action>Lucy looks at me.</action>
+
+<character.two.sad.eyes>Lucy</character>
+
+<action>She nods slowly.</action>
+<action>She understands there are not many good people left.</action>
+
+<%= window.story.render("F: Stay") %><% window.story.setChoice("Chapter1", "WillHelp"); %>
+
+<ui>standard</ui>
+<character.one>Sarah</character>
+<character.two>Lucy</character>
+
+<speech.sarah>There will be.</speech>
+
+<character.one.happy.eyes>Sarah</character>
+
+<speech.sarah>I'm sure of it.</speech>
+
+<character.two.happy>Lucy</character>
+
+<action>Lucy looks at me for a moment, then gives a faint smiles.</action>
+
+<speech.lucy>Do you really think so?</speech>
+
+<speech.sarah>Yeah, why not.</speech>
+<speech.sarah>I mean, me standing her after you looked after me is proof, isn't it?</speech>
+
+<speech.lucy>I suppose it is.</speech>
+
+<%= window.story.render("F: Stay") %><% window.story.setChoice("Chapter1", "WillHelp", false); %>
+
+<ui>standard</ui>
+<character.one>Sarah</character>
+<character.two>Lucy</character>
+
+<speech.sarah>There won't be.</speech>
+<speech.sarah>This isn't a magic fairy world where everyone gets along.</speech>
+<speech.sarah>It's killed or be killed out there.</speech>
+
+<character.two.sad.eyes>Lucy</character>
+
+<speech.lucy>Deep down, I think I know that.</speech>
+
+<%= window.story.render("F: Stay") %><action>Lucy takes a moment to recollect herself.</action>
+
+<character.two>Lucy</character>
+
+<speech.lucy>I've been trying to think of a good way of wording this, but I keep drawing a blank, so I'm just going to say it.</speech>
+<speech.lucy>I want you to think about staying with Tiffany and I for a while.</speech>
+
+<character.one.happy.eyes>Sarah</character>
+
+<action>My heart skips a beat.</action>
+
+<speech.lucy>I know it's a lot to lay on you all at once, but...</speech>
+
+<character.two.happy.eyes>Lucy</character>
+
+<speech.lucy>I think we could make a good team.</speech>
+<speech.lucy>Not to mention your leg still isn't 100%, so you might need a hand with that.</speech>
+
+<action>I haven't been with other people since...</action>
+
+<character.one.sad.eyes>Sarah</character>
+
+<action>Sophia.</action>
+
+<speech.lucy>Plus, I think Tiffany would benefit from having someone closer to her age around.</speech>
+
+<character.one>Sarah</character>
+
+<action>She does realize I'm more than double her age right.</action>
+
+<character.one.happy.eyes>Sarah</character>
+<character.two.happy>Lucy</character>
+
+<speech.lucy>I don't know if you'll be a good or bad influence on her, but I'm willing to find out, if you are.</speech>
+
+<action>This is a lot to process.</action>
+<action>I have to think about it.</action>
+<action>I've known these people for like, five minutes.</action>
+<action>They seem nice, but is this even something I want?</action>
+
+<choices>[[[Think about Lucy's offer]|C1P49]]</choices><ui>standard</ui>
+<character.one.happy.eyes>Sarah</character>
+<character.two.happy>Lucy</character>
+
+<action>I think about it for a minute.</action>
+<action>Lucy staring at me all the while.</action>
+
+<% if (window.story.getChoice("Chapter1", "NewPurpose")) { %>
+
+<action>Well, I said I needed a new purpose...</action>
+<action>...this isn't exactly what I had in mind, but...</action>
+<action>Sigh.</action>
+<action>I can't bring Sophia back.</action>
+<action>But maybe, just maybe...</action>
+
+<character.one.happy>Sarah</character>
+
+<action>I can honor her through helping %Tiffany%.</action>
+
+<% } else { %>
+
+<character.one.pain.eyes>Sarah</character>
+
+<action>I don't know...</action>
+<action>I don't want, no, I can't have another little girl's blood on my hands.</action>
+<action>%Tiffany% might be better off without me.</action>
+
+<character.one.pain>Sarah</character>
+
+<action>I'm worthless after all...</action>
+<action>...right?</action>
+
+<% } %>
+
+<choices>
+ [[I'll stay|C1P50]]
+ [[I'm not staying|C1P50]]
+</choices><ui>standard</ui>
+<character.two.happy>Lucy</character>
+
+<% if (window.story.getChoice("Chapter1", "NewPurpose")) { %>
+
+<character.one.happy>Sarah</character>
+
+<% } else { %>
+
+<character.one.pain>Sarah</character>
+
+<% } %>
+
+<speech.sarah>I-</speech>
+
+<character.one.angry.eyes>Sarah</character>
+<character.two>Unknown</character>
+
+<speech.unknown>AAARGH!</speech>
+
+<action>Someone, or something, screamed that from outside!</action>
+
+<character.two.concern>Lucy</character>
+
+<action>Lucy and I both look towards the direction of the source.</action>
+<action>It sounded like it came from somewhere out the front of the house.</action>
+<action>We look back at each other.</action>
+
+<choices>
+ [[I'll watch %Tiffany%, go!|C1P51V1]]
+ [[You watch %Tiffany%, I'll go!|C1P51V2]]
+</choices><% window.story.setChoice("Chapter1", "Protect"); %>
+
+<ui>standard</ui>
+<character.one.angry>Sarah</character>
+<character.two.concern>Lucy</character>
+
+<speech.sarah>I'll watch %Tiffany%, go find out what the fuck that was!</speech>
+
+<action>Lucy looks at me and nods, then runs out the door.</action>
+
+<resetcharacter.two/>
+
+<action>I follow behind her.</action>
+
+<choices>[[[Go to %Tiffany%]|C1P52V1]]</choices><% window.story.setChoice("Chapter1", "Protect", false); %>
+
+<ui>standard</ui>
+<character.one.angry>Sarah</character>
+<character.two.concern>Lucy</character>
+
+<speech.sarah>You watch %Tiffany%, I'll go find out what the fuck that was!</speech>
+
+<action>I head for the door.</action>
+
+<speech.lucy>Right!</speech>
+
+<choices>[[[Go through the door]|C1P52V2]]</choices><ui>standard</ui>
+<character.one.angry>Sarah</character>
+
+<action>I go through the doorway back into the Kitchen.</action>
+
+<character.two.concern>Lucy</character>
+
+<action>Lucy is already at the door to the hallway</action>
+
+<character.two.confused.sad>Tiffany</character>
+
+<speech.tiffany>Mom?!</speech>
+
+<%= window.story.render("F: Sounds like a guy") %>
+
+<character.two.confused.sad>Tiffany</character>
+
+<speech.sarah>Don't worry, Lucy's handling it.</speech>
+
+<action>I say as I approach %Tiffany%.</action>
+
+<speech.Tiffany>Handling what?</speech>
+
+<action>Her eyes are locked on mine, I can see the fear in them.</action>
+
+<speech.sarah>Nothing good...</speech>
+
+<resetcharacter.two/>
+
+<action>I walk to the corner of the room so I can see down the hallway.</action>
+
+<choices>[[[Look at Lucy]|C1P53V1]]</choices><ui>standard</ui>
+<character.one.angry>Sarah</character>
+
+<action>I walk through the doorway back into the Kitchen.</action>
+<action>Then head straight for the door to the hallway.</action>
+
+<character.two.confused.sad>Tiffany</character>
+
+<speech.tiffany>Sarah?!</speech>
+
+<%= window.story.render("F: Sounds like a guy") %>
+
+<speech.sarah>Stay with your mom, I'm handling it.</speech>
+
+<action>I say as I walk past %Tiffany% and out into the hallway.</action>
+
+<character.two.confused.sad>Tiffany</character>
+
+<speech.tiffany>Handling what?</speech>
+
+<resetcharacter.two/>
+
+<action>I hear her ask behind me.</action>
+<action>But I'm around out the door and headed down the hallway.</action>
+<action>I'm at the front door now, I can hear a commotion outside.</action>
+
+<choices>[[[Look through peephole]|C1P53V2]]</choices><ui>standard</ui>
+<character.one.angry>Sarah</character>
+
+<action>I look down the hallway.</action>
+
+<character.two.concern>Lucy</character>
+
+<action>I can see Lucy standing at the front door.</action>
+<action>She's looking through the peephole.</action>
+
+<character.two>Unknown</character>
+
+<speech.unknown>Someone, please!</speech>
+
+<character.two.concern>Lucy</character>
+
+<action>Lucy steps back from the door and looks at me.</action>
+<action>What is she going to do?</action>
+
+<% if (!window.story.getChoice("Chapter1", "WillHelp") && window.story.getChoice("Chapter1", "Lied")) { %>
+
+ <choices>[[[Watch Lucy]|C1P53V11]]</choices>
+
+<% } else { %>
+
+ <choices>[[[Watch Lucy]|C1P53V12]]</choices>
+
+<% } %><% window.story.setChoice("Chapter1", "LucySavesStranger", false); %>
+
+<ui>standard</ui>
+<character.one.angry>Sarah</character>
+<character.two.concern>Lucy</character>
+
+<action>She holds eye contact for a moment, then looks back at the door.</action>
+<action>Looks like she's made her mind up.</action>
+<action>She looks around the door; is she looking for a way to lock it?</action>
+<action>I guess she's not going out there, probably for the best.</action>
+
+<character.two.confused.sad>Tiffany</character>
+
+<speech.tiffany>Sarah, what's mom doing?</speech>
+
+<action>%Tiffany% says from the table.</action>
+<action>I look back at her, she looks terrified.</action>
+
+<choices>
+ [[...|C1P53V122]]
+ [[She's keeping us safe|C1P53V121]]
+ [[She's helping someone [Lie]|C1P53V123]]
+</choices><% window.story.setChoice("Chapter1", "LucySavesStranger"); %>
+
+<ui>standard</ui>
+<character.one.angry>Sarah</character>
+<character.two.concern>Lucy</character>
+
+<action>She looks away, she must have made up her mind.</action>
+
+<character.two.fighting.ditto>Lucy</character>
+
+<action>Lucy pulls out her knife, opens the door, and disappears through it.</action>
+
+<character.one.happy.eyes>Sarah</character>
+<resetcharacter.two/>
+
+<action>What the hell is she doing?!</action>
+<action>I turn to the boarded-up window on my left.</action>
+<action>I try to find a gap to look through...</action>
+<action>...but between the boards and the rain outside, I can't see jack shit.</action>
+<action>Just walkers.</action>
+
+<character.one.angry.eyes>Sarah</character>
+<character.two.confused.sad>Tiffany</character>
+
+<action>I look back at %Tiffany%.</action>
+<action>She's still sitting at the table, looking terrified.</action>
+
+<choices>
+ [[...|C1P53V112]]
+ [[She'll be fine|C1P53V111]]
+ [[[Extend hand to %Tiffany%]|C1P53V113]]
+</choices><% window.story.networkCheck("Alpha") %>
+
+Loading, please wait...This game is in an alpha state (v<% print(window.story.version) %>), all content is subject to change.
+
+[[Understood|Title Screen]]<ui>standard</ui>
+<character.one.angry.eyes>Sarah</character>
+
+<action>I look through the peephole.</action>
+
+<% if (window.story.getChoice("Chapter1", "LivingWindow")) { %>
+
+<action>The weather looks to have gotten worse since I looked earlier.</action>
+
+<% } else { %>
+
+<action>The weather looks terrible outside.</action>
+
+<% } %>
+
+<action>The rain is really coming down heavy.</action>
+
+<% if (window.story.getChoice("Chapter1", "LivingWindow")) { %>
+
+<action>There's a lot of walkers outside, even more than when I looked before</action>
+
+<% } else { %>
+
+<action>Looks like there's quite a few walkers out there.</action>
+
+<% } %>
+
+<action>I think they're all focused on something in the middle of the street.</action>
+<action>It's difficult to see, but...</action>
+<action>There!</action>
+<action>There's a guy out there!</action>
+
+<character.two.fighting.ditto>Charles</character>
+<characteroverride.two>???</characteroverride>
+
+<speech.charles.!two.fighting>Get fucked you mindless dogs!</speech>
+
+<action>He's pretty tall, but skinny, wearing a trench coat or something.</action>
+<action>And with the way he's wildly swinging that axe around, he's going to get himself killed.</action>
+
+<resetcharacter.two/>
+
+<action>I step back from the peephole and look towards the end of the hallway.</action>
+
+<character.two.concern>Lucy</character>
+
+<action>Lucy is standing in the corner of the Kitchen, looking at me.</action>
+<action>Our eyes lock for a moment.</action>
+
+<character.two>Unknown</character>
+
+<speech.unknown>You're gonna have to earn your dinner today fuckheads!</speech>
+
+<resetcharacter.two/>
+
+<action>I look back towards the door.</action>
+
+<% if (window.story.getChoice("Chapter1", "WillHelp")) { %>
+
+<action>I told Lucy people still help each other out.</action>
+<action>It might be time to practice what I preach.</action>
+
+<% } %>
+
+<action>I could go out and help him...</action>
+<action>Or, I can make sure nothing gets through this door.</action>
+
+<choices>
+ [[[Help stranger]|C1P53V21]]
+ [[[Do not help stranger]|C1P53V22]]
+</choices><% window.story.setChoice("Chapter1", "SaveStranger"); %>
+
+<ui>standard</ui>
+<character.one.angry.eyes>Sarah</character>
+
+<action>Shit.</action>
+<action>This is a bad idea.</action>
+<action>I look back at Lucy for a moment.</action>
+
+<% if (window.story.getChoice("Chapter1", "WillHelp")) { %>
+
+<character.two.happy.eyes>Lucy</character>
+<action>She nods.</action>
+
+<% } else { %>
+
+<character.two.concern>Lucy</character>
+<action>She slowly shakes her head at me.</action>
+
+<% } %>
+
+<action>She understands what I'm about to do.</action>
+
+<resetcharacter.two/>
+
+<action>I unlock the door, open it, and step outside.</action>
+<action>I close the door behind me and immediately get slapped by the rain.</action>
+<action>It's pouring out here.</action>
+<action>I reach down for my knife-</action>
+<action>Fuck, I forgot I don't have it!</action>
+
+<% if (window.story.getChoice("Chapter1", "Haircut")) { %>
+
+<action>I feel around in my pockets, ah!</action>
+<action>The scissors!</action>
+<action>Seems like a waste, they'll be ruined...</action>
+<action>...but better than going out here with my bare hands.</action>
+
+<% } else { %>
+
+<action>I feel around in my pockets...</action>
+<action>Nothing I can use as a weapon.</action>
+<action>Shit.</action>
+<action>Guess I'm going to have to be smart about how I move around these walkers.</action>
+
+<% } %>
+
+<action>I look for the guy.</action>
+<action>He's in the middle of the street a couple of meters away.</action>
+<action>He hasn't noticed me, and neither have any of the walkers.</action>
+<action>Between all the noise he's making and the rain, they're totally focused on him.</action>
+<action>There must be at least 20 or 30 walkers...</action>
+<action>No way I can take them all out, not without a proper weapon.</action>
+<action>My options are limited here.</action>
+<action>Maybe I can get his attention from here and have him come to me?</action>
+<action>That would save having to fight my way over to him.</action>
+<action>Or I can try and clear a path to him, and get his attention when I'm closer to him.</action>
+<action>Whatever I decide, I had better do it quick.</action>
-Her face lights up with a smile. <% if (window.story.tiffany() === "Tiff") { print("I think she likes that nickname.") } %>
+<choices>
+ [[[Yell at stranger]|C1P53V211]]
+ [[[Go over to stranger]|C1P53V212]]
+</choices><% window.story.setChoice("Chapter1", "SaveStranger", false); %>
-"Come on then!", she says, jumping up from the table and heading for the door.
+<ui>standard</ui>
+<character.one.angry.eyes>Sarah</character>
-"Hey, <% print(window.story.tiffany()) %>, wait!", I say, but she's already out the door by the time the words leave my mouth.
+<action>No way in hell am I stepping out there.</action>
+<action>I look back at Lucy for a moment.</action>
-I still have this thing in my arm, what did Lucy call it- a cannula, I think?
+<% if (window.story.getChoice("Chapter1", "WillHelp")) { %>
-The other door swings open, speak of the devil. Lucy walks in.
+<character.two.sad.eyes>Lucy</character>
+<action>She looks at me, disappointed.</action>
-"Morning, didn't think you'd be awake this early. How are you feeling?", she asks, closing the door behind her.
+<% } else { %>
-[[Better|C1P36V1]]<br>
-[[I'll live|C1P36V2]]<br>
-[[Like shit|C1P36V3]]"Better, actually", I say.
+<character.two.concern>Lucy</character>
+<action>She slowly nods her head at me.</action>
-"Good, those fluids did you the world of good", she replies.
+<% } %>
-<%= window.story.customRender("F: Get that out") %>"I'll live", I say.
+<resetcharacter.two/>
-"Very presumptuous of you", Lucy says with a smirk.
+<action>I look back at the door.</action>
+<action>There's not much in the way of locking...</action>
+<action>In fact, the lock looks busted.</action>
+<action>I guess that's how Lucy and %Tiffany% got in.</action>
+<action>If I could move a chair or a table in front of the door, that might be enough to-</action>
+<action>BANG</action>
-<%= window.story.customRender("F: Get that out") %>"Like shit", I say.
+<character.one.happy.eyes>Sarah</character>
-She takes a breath as if to say something, but stops then shakes her head.
+<action>What the hell?!</action>
+<action>That was on the other side of the door.</action>
+<action>How'd a walker get up here so quickly-</action>
-"Hmm, you haven't had anything to eat in days. Once you get some food in you you'll feel better. But first", she says.
+<character.two>Unknown</character>
-<%= window.story.customRender("F: Get that out") %>Lucy points at my arm.
+<speech.unknown>Hey! Anyone in here?</speech>
-"Let's get that out shall we?", she remarks.
+<character.one.pain.angry>Sarah</character>
-[[Yeah... sure|C1P37V1]]<br>
-[[Will it hurt?|C1P37V2]]<br>
-[[Can I keep it?|C1P37V3]]"Uh, yeah... sure", I say uncertainly.
+<action>That's coming from the other side of the door!</action>
+<action>Shit, shit, shit.</action>
+<action>Now what?!</action>
-Lucy comes over and gives me a reassuring look.
+<character.one.angry>Sarah</character>
-"Don't worry, it will only take a second", she says.
+<action>It won't take him long to figure out it's not fucking locked!</action>
-<%= window.story.customRender("F: Peel back") %>"Will it, uh, hurt?", I ask uncertainly.
+<choices>
+ [[Go away!|C1P53V221]]
+ [[%Tiffany% run!|C1P53V222]]
+ [[[Hold the door closed]|C1P53V223]]
+</choices><% window.story.achievement("Chapter1", "Scorpion"); %>
-<% if (window.story.getChoice("Chapter1", "Lied")) { %>
+<ui>standard</ui>
+<character.one.angry.eyes>Sarah</character>
-"No, not at all. Might feel a bit weird, but shouldn't hurt", she replies.
+<action>I can't go over to him, its too dangerous.</action>
-<% } else { %>
+<speech.sarah>Hey! You!</speech>
-"Not as much as pulling a knife out, if that's what you're asking", she remarks, a grin on her face.
+<character.two.fighting.ditto>Charles</character>
+<characteroverride.two>???</characteroverride>
-I roll my eyes at her.
+<action>He stops swinging his axe for a moment and looks at me.</action>
+<action>At first his expression is surprised, but he quickly recovers.</action>
-<% } %>
+<speech.sarah>Get over here!</speech>
-<%= window.story.customRender("F: Peel back") %>"Can I keep it? Seems handy", I ask.
+<action>He nods, and gets back to swinging.</action>
+<action>Slowly he starts making his way towards me.</action>
-"First off, was that a pun? And secondly, no, it'll just increase your chances of getting an infection", she replies.
+<resetcharacter.two/>
-"Yeah, I guess that was", I say as I chuckle.
+<action>Ah crap, my shouting drew some unwanted attention.</action>
+<action>A few walkers have started heading my direction.</action>
-<% if (!window.story.getChoice("Chapter1", "Laughed")) {
- window.story.setChoice("Chapter1", "Laughed");
-%>
+<% if (window.story.getChoice("Chapter1", "Haircut")) { %>
-I can't remember the last time I laughed...
+<choices>[[[Use Scissors]|C1P53V2111]]</choices>
-<% } %>
+<% } else { %>
-<%= window.story.customRender("F: Peel back") %>Lucy sits across from me on the coffee table, then puts her hand out and beckons me to give her my hand.
+<choices>[[[Look for a weapon]|C1P53V2112]]</choices>
-I place my hand on hers.
+<% } %><ui>standard</ui>
+<character.one.angry.eyes>Sarah</character>
-She peels back the tape and disconnects the tubbing. She reaches into the pockets of her cargo pants, takes out a ball of cotton wool, then in one smooth motion, swiftly and gently pulls out the cannula, and holds the cotton wool where it was inserted.
+<action>I had better try and get over to him.</action>
+<action>No point yelling and drawing more walkers.</action>
+<action>The path between him and I is actually pretty clear, most of the walkers are on the street.</action>
+<action>There's only one walker directly in my way.</action>
+<action>I start towards it, the rain is covering up the sound of my movement, so I've got that going for me at least.</action>
-[[Impressive|C1P38V1]]<br>
-[[[Cry out in fake pain]|C1P38V2]]<br>
-[[You've done that a few times|C1P38V3]]"Impressive, I didn't feel a thing", I remark.
+<% if (window.story.getChoice("Chapter1", "Haircut")) { %>
-Lucy smiles.
+<action>I get up right behind it.</action>
-"Thanks, I use to do these daily... I miss it sometimes", she replies.
+<%= window.story.render("F: Scissor takedown") %>
-Her smile fades.
+<% } else { %>
-<%= window.story.customRender("F: Breakfast time!") %><% window.story.achievement("Chapter1", "Drama", "Drama Queen", "You should have been an actor.") %>
+<character.one.angry>Sarah</character>
-"Argh!", I exclaim.
+<action>I get up right behind it, then I quickly kick out its left knee.</action>
+<action>It makes a pronounced snapping noise and bends abnormally.</action>
+<action>The walker tumbles, I push it to the ground, then stomp its head in.</action>
-Lucy doesn't bother to move her head up, just her eyes. She gives me a look that says "Shut up", then looks away again.
+<character.one.angry.eyes>Sarah</character>
-I thought it was pretty funny.
+<action>I take a breath, its been a while since I've had to do that.</action>
+<action>Its head has turned to mush... and I now have said mush all over my shoes. Great.</action>
-<%= window.story.customRender("F: Breakfast time!") %>"Clearly you've done that a few times before", I remark.
+<% } %>
-"Oh yeah, once or twice", she replies.
+<choices>[[[Continue forward]|C1P53V2121]]</choices><ui>standard</ui>
+<character.one.angry.eyes>Sarah</character>
-<%= window.story.customRender("F: Breakfast time!") %>"Chapter1", "Knocked", "Knock, knock", "Who's *there?*"
+<action>I take a few steps forward towards the closest walker, then wait for him to get within arm's length.</action>
-"Chapter1", "Soap", "Nothing wasted", "You never know when it will come in handy!"
+<%= window.story.render("F: Scissor takedown") %>
-"Chapter1", "Filter", "No Filter", "Speaking your mind, *even when you shouldn't.*"
+<%= window.story.render("F: Ow my leg") %><ui>standard</ui>
+<character.one.angry.eyes>Sarah</character>
-"Chapter1", "HelloThere", "Hello There", "General Kenobi... you are a bold one."
+<action>I look around for a weapon.</action>
-"Chapter1", "Nothing", "Silent Treatment", "You have the right to remain silent..."
+<character.one.angry>Sarah</character>
-"Chapter1", "NoChoice", "Broken Record", "You need some new material."
+<action>For fuck's sake, there's nothing out here!</action>
+<action>Just a doormat and a potted plant.</action>
-"Chapter1", "RollCredits", "Roll Credits", "And that's a Sin."
+<character.one.happy.eyes>Sarah</character>
-"Chapter1", "Drama", "Drama Queen", "You should have been an actor."
+<action>Wait, the plant, that could do.</action>
+<action>I walk over to it and pick it up.</action>
-"Chapter1", "Walkers", "Walkers?", "What do you call the ones that run?"
+<character.one.happy>Sarah</character>
-"Chapter1", "Nerve", "Struck a Nerve", "Found a touchy subject"
+<action>It's got a fair bit of weight to it, this will work.</action>
-"Chapter1", "Scorpion", "Scorpion", "*Get over here*"Lucy reaches back into her pocket with her free hand and pulls out a roll of... something. It looks like tape, but fabric-like.
+<character.one.angry.eyes>Sarah</character>
-"Alright, you're good to go", Lucy says, tearing a bit of tape off and using it to secure the cotton wool ball to my hand.
+<action>I look back towards the walkers, the closest one is just a few meters from me.</action>
+<action>I get close to it, brace myself, and then throw the potted plant right at it.</action>
+<action>The pot connects with the walker's head and shatters.</action>
+<action>The walker goes down like a sack of potatoes.</action>
-"Let's get some food in you", she says as she gets up and heads towards the door.
+<%= window.story.render("F: Ow my leg") %><character.one.pain>Sarah</character>
-I slowly get up off the sofa.
+<action>ARGH, shit!</action>
-"Through here and down this hallway, when you're ready", Lucy says as she reaches the door, then goes through it, leaving me alone.
+<character.one.pain.eyes>Sarah</character>
-That sounded like an invitation to have a look around.
+<action>I forgot about my leg.</action>
+<action>That really hurt.</action>
+<action>I look up, there are still two walkers headed for me, shit.</action>
+<action>I take a step back-</action>
+<action>GRRR, shit, I've properly fucked my leg.</action>
+<action>This isn't good.</action>
+<action>I start to hobble back towards the door, pain shooting up my leg.</action>
-I stand up- Woah, my left leg is, like, stiff? It feels kinda like when you sit on it for too long and you cut all the blood off from it.
+<character.two.fighting.ditto>Charles</character>
+<characteroverride.two>???</characteroverride>
-I slowly take a few steps; yeah, I can manage this. She'll be right.
+<action>I look back over at the stranger.</action>
+<action>We make eye contact for a moment, he sees I'm hurt.</action>
+<action>He nods again, this time with a slight smirk.</action>
-<%= window.story.customRender("F: Living room search options") %><%
-if (!window.story.getChoice("Chapter1", "Door2")) {
- print("[[[Go through second door]|C1P39V1]]<br>");
-}
+<speech.charles.fighting>Hey, dummies, over here!</speech>
-if (!window.story.getChoice("Chapter1", "LivingWindow")) {
- print("[[[Look out of the window]|C1P39V2]]<br>");
-}
+<action>He does his best to shout over the top of the rain.</action>
+<action>It works, the walkers following me stop and slowly swing back towards him.</action>
-if (!window.story.getChoice("Chapter1", "CoffeeTable")) {
- print("[[[Look at the coffee table]|C1P39V3]]<br>");
-}
+<speech.charles.fighting>Yeah that's right idiots, come over here!</speech>
-if (!window.story.getChoice("Chapter1", "Saline")) {
- print("[[[Look at bag of clear fluid]|C1P39V4]]<br>");
-}
+<action>He's crazy, but it's working.</action>
-if (!window.story.getChoice("Chapter1", "TVandC")) {
- print("[[[Look at the TV and cabinet]|C1P39V5]]<br>");
-}
-%>
+<choices>[[[Open the door to the house]|C1P53V21111]]</choices><% window.story.setChoice("Chapter1", "CharlesName"); %>
-[[[Go through hallway door]|C1P40]]<% window.story.setChoice("Chapter1", "Door2") %>
+<ui>standard</ui>
+<character.one.pain>Sarah</character>
-I walk around to the other door and open it. Huh, a familiar sight: it's the laundry room.
+<action>I shuffle back to the front door and open it.</action>
+<action>I look back towards the stranger.</action>
-There's a red stain on the floor just near the door, I guess that's where I passed out... good thing I didn't hit my head.
+<character.two.fighting.ditto>Charles</character>
+<characteroverride.two>???</characteroverride>
-I close the door.
+<action>He's made it most of the way over to me now.</action>
-<%= window.story.customRender("F: Living room search options") %><% window.story.setChoice("Chapter1", "CoffeeTable") %>
+<speech.sarah>Hurry up!</speech>
-I walk up to the coffee table. It's pretty ordinary, a few coffee stains here and there, otherwise in good shape.
+<action>He takes one final swing, then bolts towards the door.</action>
+<action>I step inside and out of the way, right as he comes crashing in.</action>
-I wonder if Lucy has any coffee? I haven't had any in years.
+<character.one.angry.eyes>Sarah</character>
-<%= window.story.customRender("F: Living room search options") %><% window.story.setChoice("Chapter1", "TVandC") %>
+<action>I slam the door behind him.</action>
-I walk over to the TV and cabinet. The TV looks reasonably new, one of those fancy new super flat ones. Well, I guess not new anymore.
+<character.two>Charles</character>
+<characteroverride.two>???</characteroverride>
-I bend down and open the cabinet. There's a load of old TV crap, set-top boxes and what have you, and- What's this: a spinning top. What's this doing in here?
+<action>We both stand there for a moment, soaking wet, and panting.</action>
-[[[Take spinning top]|C1P39V51]]
+<speech.charles>Thanks...</speech>
-<%= window.story.customRender("F: Living room search options") %><% window.story.setChoice("Chapter1", "Saline") %>
+<action>He manages to say, between gasps.</action>
-I walk up to the hat hanger and look at the clear bag of fluid, what's left of it anyway.
+<speech.sarah>No problem.</speech>
-I take it off the hanger, it's a long, crumpled up, clear bag, and it looks rather worn. There's some writing on it I can still make out though, "Sodium Chloride 0.9% 1000ml - For Intravenous Infusion". I thought Lucy said it was just salty water...
+<character.two>Charles</character>
-There's more writing near the bottom, "Sterile non-pyrogenic... osmolality 308 mOsm/kg water... isotonic... pH 4.5 - 7", OK I feel like I'm back in highschool science class again, I have no clue what any of this means.
+<speech.charles>Name's Charles.</speech>
-I put the bag back on the hanger.
+<speech.sarah>Sarah; that's Lucy.</speech>
-<%= window.story.customRender("F: Living room search options") %>I head to the door, wary of my leg. I then go through the door to the hallway. The hallway has doors on all four sides, and a set of stairs on one side.
+<action>I gesture over my shoulder back towards the kitchen.</action>
+<action>Charles jumps a little, he must not have seen her.</action>
+<action>He quickly recovers and gives a slow-wave.</action>
-<i>"Tiffany, stop playing with your food..."</i>, I hear Lucy say somewhere behind the furthest door. That must be to the kitchen.
+<choices>[[[Turn towards Lucy]|C1P53V211111]]</choices><action>I quickly kick out its left knee, it makes a pronounced snapping noise and bends abnormally.</action>
+<action>The walker tumbles, its head bent over, perfectly within reach.</action>
-<%= window.story.customRender("F: Hallway search options") %><% window.story.setChoice("Chapter1", "LivingWindow") %>
+<character.one.angry.eyes>Sarah</character>
-I walk over to the window. It's been boarded up from the outside, but there are a few cracks I can look through. I squat down and have a look through one.
+<action>I take the scissors and drive them deep into the back of its head, it makes a horrid gurgling sound, then flops to the ground.</action>
-It looks out onto a small front garden and the street, and- Whoa, that's actually quite a lot of walkers. Looks like they're just passing through, maybe 10 or 20 of them? I should probably let Lucy know...
+<character.one.angry>Sarah</character>
-Anyway, the front garden is much smaller than the back garden, it's got a small fence running around it, only about half a meter high. The weather doesn't look great actually, it's pretty overcast, and I can see storm clouds rolling in. I wonder how this place will hold up in the rain.
+<action>I go to pull the scissors out of its head-</action>
-I stand up again.
+<character.one.angry.eyes>Sarah</character>
-<%= window.story.customRender("F: Living room search options") %><% window.story.setChoice("Chapter1", "SpinningTop") %>
+<action>Shit, it's snapped off at the handle, leaving the sharp end in the walker's head.</action>
+<action>Figures.</action><ui>standard</ui>
+<character.one.angry.eyes>Sarah</character>
-I pick up the spinning top. <% print(window.story.tiffany()) %> might like this.
+<action>I take a step towards the stranger-</action>
-<%= window.story.customRender("F: Living room search options") %><% window.story.setChoice("Chapter1", "Stairs") %>
+<character.one.pain>Sarah</character>
-I walk up to the stairs, they bend and go to the left as they go up. I better not go up there, <% if (window.story.getChoice("Chapter1", "Lied")) { print("Lucy doesn't trust me as it is, no need to give her another excuse") } else { print("don't want to push my luck and risk a free meal") } %>.
+<action>ARGH, shit!</action>
-<%= window.story.customRender("F: Hallway search options") %>I walk up to the door on the left and open it. It's a bathroom! I could really use a freshening up...
+<character.one.pain.eyes>Sarah</character>
-[[[Enter bathroom]|C1P40V21]]
+<action>I forgot about my leg.</action>
+<action>I've properly fucked it taking down that walker.</action>
+<action>I'm not as close to him as I would have liked, but this is going to have to do.</action>
-<%= window.story.customRender("F: Hallway search options") %><% window.story.setChoice("Chapter1", "Frontdoor") %>
+<speech.sarah>Hey!</speech>
-I walk up to the door, it's larger than the other doors, and has locks on it: this must be the front door. I don't really want to go out there right now<% if (window.story.getChoice("Chapter1", "LivingWindow")) print(", not with all those walkers out there") %>.
+<action>I do my best to shout over the rain, as I wave my hands as well.</action>
-<%= window.story.customRender("F: Hallway search options") %><%
-if (!window.story.getChoice("Chapter1", "Haircut")) {
- window.story.setChoice("Chapter1", "Haircut", false);
-}
-%>
+<character.two.fighting.ditto>Charles</character>
+<characteroverride.two>???</characteroverride>
-I walk to the end of the hallway and go through the kitchen door.
+<action>He stops swinging his axe for a moment and looks at me.</action>
+<action>At first his expression is surprised, but he quickly recovers.</action>
-%Tiffany% and Lucy are sitting at a table in the middle of the small room. Benches line two sides of the room, and there's a door on the far side. There's a portable gas stove with a can on top of it on one of the benches<% if(window.story.getChoice("Chapter1", "CoffeeTable")) print(", no coffee pot though, damn") %>.
+<speech.charles.fighting>Hey!</speech>
-%Tiffany% looks up from her meal and sees me, a huge smile fills her face.
+<action>He exclaims back at me.</action>
-"Come sit here!", %Tiffany% says, gesturing to the chair next to her. I look over at Lucy, she gives a slight smile and nods her approval.
+<speech.sarah>Come on, let's get inside!</speech>
-[[[Sit next to %Tiffany%]|C1P42]]<%
-if (!window.story.getChoice("Chapter1", "Stairs")) {
- print("[[[Look at stairs]|C1P40V1]]<br>");
-}
+<action>He nods and starts heading towards me, swinging at walkers as he goes.</action>
-if (!window.story.getChoice("Chapter1", "Bathroom") && window.passage.name != "C1P40V2") {
- print("[[[Look at door on the left]|C1P40V2]]<br>");
-}
+<choices>[[[Head back to the house]|C1P53V21111]]</choices><ui>standard</ui>
+<character.one.angry>Sarah</character>
-if (!window.story.getChoice("Chapter1", "Frontdoor")) {
- print("[[[Look at door on the right]|C1P40V3]]<br>");
-}
-%>
+<speech.sarah>Go aw-</speech>
-[[[Go through kitchen door]|C1P41]]<% window.story.setChoice("Chapter1", "Bathroom") %>
+<%= window.story.render("F: Door swings open") %><ui>standard</ui>
+<character.one.angry>Sarah</character>
-I step inside. There's a sink with some water in it, it looks pretty clean too. I walk over to it, dip my hands in, and run my hands over my face. Wow, that feels great, I don't recall the last time I had a wash.
+<speech.sarah>%Tiffany% ru-</speech>
-I give my face and arms a good scrub, the water turns a nasty brown color. I look at the mirror above the sink. My brown eyes are plagued by red lines. My brown messy hair is in complete disarray; it's getting a bit long for my liking too.
+<%= window.story.render("F: Door swings open") %><ui>standard</ui>
+<character.one.angry>Sarah</character>
-I wonder if there is a pair of scissors around here?
+<action>I push against the door with all my weight.</action>
-[[[Leave bathroom]|C1P40V211]]<br>
-[[[Search for scissors]|C1P40V212]]Ah well, another time. I let out the water in the sink and leave the bathroom.
+<%= window.story.render("F: Door swings open") %><action>CRASH</action>
-<%= window.story.customRender("F: Hallway search options") %><% window.story.setChoice("Chapter1", "Haircut") %>
+<character.two.fighting.ditto>Charles</character>
+<characteroverride.two>???</characteroverride>
-I search around the bathroom. I find a small vanity box and open it, it contains some bits and bobs, and- Perfect, a pair of scissors.
+<action>Suddenly, the door swings open, and a man comes crashing through.</action>
+<action>The man lands on the stairs, soaked.</action>
+<action>I get knocked to the ground by the door and land awkwardly on my bad leg.</action>
-I walk back over to the sink and start cutting my hair. Doesn't need to be pretty, just functional...
+<character.one.pain>Sarah</character>
-There we go, that's a bit better.
+<action>Argh, for fuck's sake.</action>
-I pocket the scissors, I doubt that box was Lucy's, judging by the dust on it, and finding a pair is not easy these days.
+<character.one.angry.eyes>Sarah</character>
-I let the water in the sink go, and head back into the hallway.
+<action>I get onto my knees and look at the man.</action>
-<%= window.story.customRender("F: Hallway search options") %>I sit down at the table.
+<character.two>Charles</character>
+<characteroverride.two>???</characteroverride>
-"I'll fix you a bowl", Lucy says as she stands up from the table.
+<action>He props himself up as well and our eyes meet, a look of shock on his face.</action>
+<action>There's a moment of silence, before his expression quickly turns into one of anger.</action>
-<% if (window.story.getChoice("Chapter1", "Haircut")) { %>
+<character.two.angry>Charles</character>
+<characteroverride.two>???</characteroverride>
-%Tiffany% looks at me, puzzled.
+<speech.charles>Oi, why didn't you help me out there!</speech>
+<speech.charles>There's no way you didn't hear me!</speech>
-"You look different", she says.
+<choices>
+ [[I don't know you!|C1P53V2211]]
+ [[I was going to! [Lie]|C1P53V2213]]
+ [[You were going to get yourself killed!|C1P53V2212]]
+</choices><ui>standard</ui>
+<character.one.angry>Sarah</character>
+<character.two.angry>Charles</character>
+<characteroverride.two>???</characteroverride>
-"I cut my hair; it's important to keep your hair short", I reply.
+<action>Who the hell does this guy think he is?</action>
-"Why?", %Tiffany% asks.
+<speech.sarah>I don't know you, and I don't owe you shit!</speech>
-"So, um, *bad people*, can't grab you as easily", I reply.
+<%= window.story.render("F: Not now") %><ui>standard</ui>
+<character.one.angry>Sarah</character>
+<character.two.angry>Charles</character>
+<characteroverride.two>???</characteroverride>
-"Like the monsters?", %Tiffany% says.
+<action>Is this guy for real?</action>
-"Well yeah, but also-", I start to respond.
+<speech.sarah>You were carrying on like a headless chicken!</speech>
+<speech.sarah>You've pulled every walker within a half-mile, and it looked like you were trying to get yourself killed!</speech>
-Lucy is walking back over, shooting me a dirty look.
+<%= window.story.render("F: Not now") %><ui>standard</ui>
+<character.one.angry>Sarah</character>
+<character.two.angry>Charles</character>
+<characteroverride.two>???</characteroverride>
-I trail off.
+<speech.sarah>I was about to, OKAY?</speech>
-<% } else { %>
+<action>The look on his face tells me he's not convinced.</action>
-She walks over to the portable stove and fills a bowl with the contents of the can. %Tiffany% staring and smiling at me the whole time. Lucy walks back over to me.
+<%= window.story.render("F: Not now") %><character.one.concern>Lucy</character>
-<% } %>
+<speech.lucy>Hey!</speech>
+<speech.lucy>Now's not the time, we've got bigger problems.</speech>
-"Here you go, Beans and Cheese!", Lucy exclaims.
+<action>Lucy says from somewhere behind me.</action>
-[[[Take the bowl]|C1P43]]I take the bowl and set it down.
+<character.two>Charles</character>
+<characteroverride.two>???</characteroverride>
-"Thanks, I haven't had a hot meal in... well, a long time", I remark.
+<action>The stranger looks startled, he must not have seen her.</action>
+<action>He takes a breath as if to say something, but doesn't.</action>
-I'm starving, I dig right in.
+<character.two.angry>Charles</character>
+<characteroverride.two>???</characteroverride>
-I can feel %Tiffany% staring at me, I stop eating and look at her. She has a hilariously cute look of disgust on her face.
+<action>He shoots me a dirty look, then begins to stand up.</action>
+<action>What an asshole.</action>
-"How can you eat *that*?", she asks unapologetically.
+<choices>[[[Stand up]|C1P53V22111]]</choices><ui>standard</ui>
+<character.one.angry>Sarah</character>
+<character.two.concern>Lucy</character>
-I nearly choke laughing; Lucy was not so impressed.
+<action>I get up off the floor awkwardly, getting knocked down really did a number on my leg.</action>
-"You're free to go find your own meal little miss picky", she replies, rolling her eyes.
+<%= window.story.render("F: What we need to do now") %><ui>standard</ui>
+<character.one.pain.eyes>Sarah</character>
+<character.two.concern>Lucy</character>
-[[Eat, it tastes good|C1P43V1]]<br>
-[[What do you like to eat?|C1P43V2]]<br>
-[[You need food for strength|C1P43V3]]<% window.story.loadSaves() %>
+<action>I awkwardly spin to face Lucy, I really did a number on my leg.</action>
-<img.title-image>
+<%= window.story.render("F: What we need to do now") %><speech.sarah>Alright, what we need to do now is-</speech>
-<span#slotsLoading>Loading...</span>
+<action>CRASH</action>
+<action>Suddenly a hand appears through one of the boarded-up windows in the hallway, between the front door and the kitchen.</action>
-<div-#savesContainer></div>
+<character.two.fighting.ditto>Lucy</character>
-[[Back|Game Options]]<img.title-image>
+<speech.lucy.fighting>Walkers!</speech>
-This game has an optional Cloud Saving feature, to enable it, click the button below and follow the instructions. itch.io account required.
+<action>Lucy shouts, as the sound of glass and wood breaking erupts.</action>
-<% if (window.story.network) { %>
+<choices>
+ [[<% print(window.story.getChoice("Chapter1", "SaveStranger") ? "Charles," : "The") %> Bat!|C1P54V21]]
+ [[Upstairs, quickly!|C1P54V22]]
+ [[[Run to %Tiffany%]|C1P54V23]]
+</choices><ui>standard</ui>
+<character.one.angry.eyes>Sarah</character>
+<character.two>Charles</character>
-<div#title-button>[[Enable Cloud Saving|Linking]]</div>
+<% if (window.story.getChoice("Chapter1", "SaveStranger")) { %>
+
+<speech.sarah>Charles, your axe!</speech>
<% } else { %>
-<div#title-button><a0 onclick="window.story.noConnection()"><s>Enable Cloud Saving</s><br><span.smaller>(Could not connect to remote server)</span></a></div>
+<characteroverride.two>???</characteroverride>
+
+<speech.sarah>Axe, now!</speech>
<% } %>
-If you choose not to enable Cloud Saving, your progress will be lost when you refresh or leave the game.
+<action>He grabs it and throws it in my direction.</action>
+<action>I catch it, and head towards the window, pushing through the pain in my leg.</action>
-<div#title-button>[[Continue without Saving|Game Options]]</div>
+<resetcharacter.two/>
-[[Back|Title Screen]]<img.title-image>
+<character.one.angry>Sarah</character>
-Clicking the button below will open a new tab, ask you to authorize Purpose (this game) to access your public itch.io information, and will then give you a temporary "Linking Code" to use below. Purpose only uses your itch.io information for saving your game progress. Purpose does not have access to your E-Mail, Password, or any other personal information.
+<action>As I approach, I raise the axe well above my head and bring it down on the arm with all my strength.</action>
+<action>The axe connects with the arm and keeps going.</action>
+<action>The arm makes a horrible snapping noise, as whatever bones were left in the walker's arm turn to dust.</action>
+<action>The axe hits the ground and buries into the wooden floor.</action>
+<action>The arm, pointing 90 degrees downward and only connected by a thin bit of skin now, continues to twitch and wriggle</action>
+<action>I give the axe pull, but it's stuck in the ground.</action>
+<action>No time to muck around with it now.</action>
-<u>NOTE: Treat your Linking Code like a password, do not share it, and if you are recording or streaming, do not show it to your audience. Linking Codes are one use, and expire if not used.</u>
+<character.two.concern>Lucy</character>
-<hr>
+<action>I look up towards the kitchen to meet Lucy's gaze.</action>
-<div#title-button>
- <a#generateButton href="https://purpose-game.com/auth" target="_blank" onclick="window.story.toggleLinkingDisplays()">Generate Linking Code</a>
-</div>
+<speech.sarah>Let's, go!</speech>
-<form-#linkingForm action="javascript:void(0)">
- <label for="linking-code">Linking Code</label><br>
- <input#linking-code type="text" name="code" placeholder="Paste Here" autocomplete="off" maxlength="9">
+<action>Lucy grabs %Tiffany% from somewhere beside her, and starts booking it down the hallway towards me.</action>
- <button0#linking-codeButton onclick="window.story.linkCode()">Link</button><br>
-
- <a.small.normal-link onclick="window.story.toggleLinkingDisplays(true)">I need another Linking Code</a>
-</form>
+<choices>[[[Head for the stairs]|C1P55]]</choices><ui>standard</ui>
+<character.one.angry.eyes>Sarah</character>
-[[Back|Save Options]]<img.title-image>
+<speech.sarah>Upstairs, quickly!</speech>
-Thanks for linking your itch.io account with Purpose, <% print(window.story.player.name) %>. Your story progress and achievements will now be saved to the Cloud.
+<character.two.scared>Charles</character>
-You will need to re-link your account each time you play the game.
+<% if (!window.story.getChoice("Chapter1", "SaveStranger")) { %>
-<div#title-button>[[Continue|Game Options]]</div><img.title-image>
+<characteroverride.two>???</characteroverride>
-<div#title-button>
-<%
-if (window.story.saving) {
- print("[[New Game|New Game]]");
- print("[[Saved Games|Saved Games]]");
-} else {
- print("[[New Game|C1 Intro]]");
- if (window.story.network) print("[[Enable Saving|Save Options]]");
-}
-%>
-<a onclick="window.story.toggleFullscreen()">Toggle Fullscreen</a>
-</div><% window.story.loadSaves(true) %>
+<% } %>
-<img.title-image>
+<action><% print(window.story.getChoice("Chapter1", "SaveStranger") ? "Charles" : "The stranger") %> doesn't need to be told twice, he scrambles to the stairs and starts going up.</action>
-Select a Save Slot to start a new game.
+<character.two.concern>Lucy</character>
-<u>NOTE: Selecting a Save Slot that is already in use will override any saved data.</u>
+<action>I look back at Lucy, she's got %Tiffany% and is headed down the hallway towards me.</action>
+<action>As she passes the window, the hand suddenly reaches out and grabs Lucy's pants.</action>
-<span#slotsLoading>Loading...</span>
+<character.two.scared.ditto>Tiffany</character>
-<form-#saveSlotSelector action="javascript:void(0)">
- <label for="slots">Choose a Save Slot:</label>
- <select#slots name="slots">
- <option#saveSlot1 value="1">Save Slot 1</option>
- <option#saveSlot2 value="2">Save Slot 2</option>
- <option#saveSlot3 value="3">Save Slot 3</option>
- <option#saveSlot4 value="4">Save Slot 4</option>
- </select>
-
- <button0#selectSlotButton onclick="window.story.selectSlot()">Select Slot and Start Game</button>
-</form>
+<speech.tiffany>EEEP!</speech>
-[[Back|Game Options]]"Eat up, it tastes good", I say with a mouthful.
+<character.one.angry>Sarah</character>
-"It's all gluggy and gross", %Tiffany% replies.
+<speech.sarah>Come to me %Tiffany%!</speech>
-"That's because you let it go cold...", Lucy says with a sigh.
+<character.one.concern>Lucy</character>
-<%= window.story.customRender("F: Come chat") %>"What do you like to eat?", I ask %Tiffany%.
+<action>%Tiffany% doesn't move, but Lucy lets go of her and shoves her in my direction.</action>
-"Pizza, and peanut butter sandwiches!", she replies excitedly.
+<character.one>Sarah</character>
-"Not much of that around these days", I remark.
+<action>%Tiffany% stumbles towards me, and I catch her in a hug.</action>
-<%= window.story.customRender("F: Come chat") %><% window.story.setChoice("Chapter1", "Eating") %>
+<character.two.fighting.ditto>Lucy</character>
-"Eat up, you need food for strength", I say.
+<action>I look back at Lucy again, she has her knife out now.</action>
+<action>She takes several quick jabs at the arm, then takes a swipe at it.</action>
+<action>The arm comes clean off from the rest of the walker.</action>
-"But it's all gluggy and gross", %Tiffany% replies.
+<choices>[[[Head for the stairs]|C1P55]]</choices><ui>standard</ui>
+<character.one.angry>Sarah</character>
-"Doesn't matter, you never know when you're going to get your next meal. Have to eat while you can", I remark.
+<action>Without thinking I bolt for the kitchen, pushing through the pain in my leg.</action>
-I glance at Lucy. She looks back uncomfortably but doesn't say anything.
+<character.two.concern>Lucy</character>
-"Hmm, I guess that makes sense", %Tiffany% says, sounding defeated.
+<speech.lucy>Stop!</speech>
-%Tiffany% starts to eat, I think I taught her something important.
+<character.one.angry.eyes>Sarah</character>
-<%= window.story.customRender("F: Come chat") %>I get back to my bowl.
+<action>I stop dead in my tracks.</action>
-"Sarah, come chat with me when you're finished", Lucy says, as she stands up and heads for the other door.
+<speech.lucy>We're coming to you.</speech>
-"Yeah, sure", I reply.
+<character.two.scared>Charles</character>
-Lucy leaves the room.
+<% if (!window.story.getChoice("Chapter1", "SaveStranger")) { %>
-[[[Keep eating]|C1P44]]<% if (window.story.getChoice("Chapter1", "Eating")) { %>
+<characteroverride.two>???</characteroverride>
-I look over at %Tiffany%, she's actually making decent process on her meal. Good.
+<% } %>
-<% } else { %>
+<action>I nod, and turn back to <% print(window.story.getChoice("Chapter1", "SaveStranger") ? "Charles" : "the stranger") %>.</action>
-I look over at %Tiffany%, she's still playing with her food...
+<speech.sarah>Get upstairs.</speech>
-<% }
+<action>He doesn't need to be told twice, he starts scrambling up the stairs.</action>
-if (window.story.getChoice("Chapter1", "SpinningTop")) {
- print(`[[[Give %Tiffany% the spinning top]|C1P44V4]]`);
-} %>
+<character.two.fighting.ditto>Lucy</character>
-<%= window.story.customRender("F: Tiff Breakfast Talk Options") %><% window.story.setChoice("Chapter1", "TiffBackstory", "Dad") %>
+<action>I look back at Lucy, she's got %Tiffany% in one hand, and her knife in the other.</action>
+<action>They're head down the hallway towards me.</action>
+<action>As she passes the window, she makes one clean swipe at the hand, and it comes clean off.</action>
-"So, uh, where's your dad?", I ask %Tiffany%.
+<character.one>Sarah</character>
-She looks up from her meal.
+<action>Impressive.</action>
-"He got eaten by monsters", she replies, sounding a little downtrodden.
+<choices>[[[Head for the stairs]|C1P55]]</choices><ui>standard</ui>
+<character.one>Sarah</character>
+<character.two>Lucy</character>
-"Sorry to hear that", I reply.
+<action>I head for the stairs, %Tiffany% and Lucy right behind me.</action>
-"Don't be, he was being silly", she adds.
+<% if (window.story.getChoice("Chapter1", "SaveStranger") || window.story.getChoice("Chapter1", "LucySavesStranger")) { %>
-"How so?", I ask.
+<action>No sign of Charles, he must be upstairs already.</action>
-"He was really sad all of the time and kept making silly mistakes. One day we were down in this cool underground train station, and we walked into a bunch of monsters. Mom picked me up and ran away, but dad just stood there, Mom tried to shout at him to move, but he didn't", she remarks.
+<% } else { %>
-We sit for a moment, while I process what this little girl just described to me.
+<character.two.sad>Charles</character>
+<characteroverride.two>???</characteroverride>
-"Anyway, where's your dad?", she asks cheerfully.
+<action>I glance over at the stranger.</action>
+<action>He has two walkers on him now, his face is contorted, but totally silent...</action>
-"I'm not sure, I couldn't get back to him or my mom after everything went to shit. I like to think they're out there somewhere, but it's unlikely", I reply.
+<% } %>
-<%= window.story.customRender("F: Better get going") %><% window.story.setChoice("Chapter1", "TiffBackstory", "Lonely") %>
+<character.two>Lucy</character>
-"So, where have you guys been staying, have you moved around a lot?", I ask %Tiffany%.
+<action>I get to the first step and stop.</action>
+<action>I look behind me to make sure the other two are still following me.</action>
+<action>Lucy hot on my heels, %Tiffany% just behind her.</action>
-She looks up from her meal.
+<character.one.happy.eyes>Sarah</character>
+<character.two.concern>Lucy</character>
-"We move houses every few days, sometimes we stay longer, but mostly not. Mom finds a safe house, and then leaves me there during the day to go out looking for food and stuff", she replies.
+<action>BANG, BANG BANG, BANG</action>
+<action>The door!</action>
+<action>Lucy hears it too.</action>
-"That... must be lonely", I say, feeling bad for her.
+<character.one.angry.eyes>Sarah</character>
+<character.two.fighting.ditto>Lucy</character>
-"Yeah it is, but mom says that it's too dangerous outside for me to come with her, except when we move houses", she replies, sounding a little annoyed.
+<speech.lucy.fighting>Don't stop, keep going!</speech>
-"What about you?", %Tiffany% asks.
+<action>She exclaims as she practically pushes %Tiffany% to the stairs.</action>
+<action>She then turns around and throws herself against the door.</action>
+<action>CRASH, BANG</action>
-"Um, I move around a lot. Sometimes I'll stay in a house, like you, but most of the time I just sleep wherever it's safest. Being by myself means it's pretty easy to pack up and go at a moment's notice, which has its perks", I explain.
+<speech.lucy.fighting>Argh!</speech>
-"Don't you get lonely too?", she asks.
+<resetcharacter.two/>
-"Sometimes, but I'm used to it. I've been on my own for a shit long time", I reply.
+<action>The front door has come clean off its hinges.</action>
+<action>It's landed on Lucy, and there are a pile of walkers on top of the fallen door!</action>
-<%= window.story.customRender("F: Better get going") %><%
-window.story.setChoice("Chapter1", "TiffBackstory", "Killing");
+<character.one.angry>Sarah</character>
-_.delay(function() {
- window.story.achievement("Chapter1", "Walkers", "Walkers?", "What do you call the ones that run?")
-}, 30 * 1000);
-%>
+<speech.sarah>Shit, no!</speech>
-"So, how many walkers have you killed?", I ask %Tiffany%.
+<character.two.scared.ditto>Tiffany</character>
-She looks up from her meal.
+<action>I head back down the stairs, passing %Tiffany% who's frozen in place.</action>
-"Walker? Is that what you call the monsters?", she asks, sounding a little confused.
+<resetcharacter.two/>
-"Yeah, the monsters. How many have you killed?", I reply.
+<action>Lucy must have dropped her knife because it's laying on the stairs in front of her.</action>
-"Oh, I haven't killed any... I don't know how to", she replies, sounding uneasy.
+<character.one.fighting.ditto>Sarah</character>
-"It's not hard, you just have to aim for the head", I reply with a mouth full, looking at her.
+<action>I pick it up and start towards the walkers.</action>
-"Might be a little hard, considering how little you are, but don't let that stop you!", I remark, as I load another spoonful.
+<character.two>?Lucy</character>
-%Tiffany% looks away for a moment, like she's thinking.
+<speech.lucy>No!</speech>
-<% if (window.story.getChoice("Chapter1", "Eating")) { %>
+<action>Lucy wails from somewhere beneath the door.</action>
-I taught her another important thing.
+<speech.lucy>Get Tiffany and go, please!</speech>
-<% } else { %>
+<action>The walkers are starting to get up.</action>
-I think I taught her something important.
+<character.two.scared.ditto>Tiffany</character>
-<% } %>
+<action>I look back at %Tiffany%, she's still frozen in place, hands to her face, looking down at her mom.</action>
-"Why do you call them walkers?", she asks.
+<choices>
+ [[[Try to help Lucy]|C1P55V1]]
+ [[[Grab %Tiffany% and go]|C1P55V2]]
+</choices><% window.story.setChoice("Chapter1", "TriedToSaveLucy"); %>
-Still caught up on that, gee.
+<ui>standard</ui>
+<character.one.fighting.ditto>Sarah</character>
+<character.two.scared.ditto>Tiffany</character>
-"Because they bloody walk everywhere", I reply.
+<action>Fuck that, I can't just leave her!</action>
+<action>I step past %Tiffany% back towards Lucy.</action>
-<%= window.story.customRender("F: Better get going") %>"Anyway, uh, I had better go chat with your mom", I say, getting up from the table.
+<resetcharacter.two/>
-I head to the other door in the room. I can hear rain outside, the gentle tapping on the roof is actually pretty soothing... I get to the door and open it, then step through.
+<action>I get to the last step...</action>
+<action>...right as one of the fallen walkers leans over and takes a chunk out of Lucy's neck.</action>
-It's a dining room, there's a long 8 or so seater table in the middle of the room, a window with the curtains pulled on one wall, and a display table with some picture frames on it on the far wall. Lucy is standing at the display table, holding one of the frames.
+<character.two>?Lucy</character>
-Lucy turns to look at me as I close the door. She looks away again, back at the picture frame.
+<speech.lucy>Argh! Ugh...</speech>
-"I'm sorry about last night", she says.
+<action>Lucy makes a horrible gurgling sound.</action>
-[[...|C1P45V1]]<br>
-[[No stress|C1P45V2]]<br>
-[[You broke our deal|C1P45V3]]%Tiffany%'s face contorts into a look of shock.
+<speech.sarah.fighting>No! NO!</speech>
-"Swear!", she exclaims.
+<character.one.pain>Sarah</character>
-There's an awkward pause.
+<action>Not again, not again!</action>
-"Um, sorry?", I reply.
+<speech.lucy>G... go...</speech>
-Another awkward pause.
+<action>I can just hear her make out.</action>
+<action>More walkers are coming through the open doorway now.</action>
+<action>There's no way I can get to Lucy, and even if there was...</action>
+<action>I take one last look at Lucy, then spin around to %Tiffany%.</action>
-I scrape the last drops out of the bowl: all finished.
+<character.two.scared.ditto>Tiffany</character>
-[[I better go talk to Lucy|C1P45]]I stay by the door, there's an uncomfortable silence.
+<action>The look on her face will be burned into my brain for as long as I live.</action>
+<action>Her blue eyes staring, unblinking, tears budding in the corners of her eyes, her face slowly going pale.</action>
-<%= window.story.customRender("F: Broke our deal") %>"Don't worry about it. It was clearly... difficult, for both of us", I say.
+<choices>[[[Grab %Tiffany%]|C1P55V11]]</choices><% window.story.setChoice("Chapter1", "TriedToSaveLucy", false); %>
-<%= window.story.customRender("F: Broke our deal") %>"You broke our deal", I remark.
+<ui>standard</ui>
+<character.one.angry>Sarah</character>
+<character.two.scared.ditto>Tiffany</character>
-<%= window.story.customRender("F: Broke our deal") %>Lucy puts the picture frame down and turns to face me.
+<action>I go down the stairs towards %Tiffany% and grab her by the hand.</action>
-"<% if (window.passage.name === "C1P45V3") { print("Yes, I did.") } else { print("I broke our deal, last night.") } %> That's why I wanted to talk to you", Lucy sighs.
+<speech.sarah>Come on %Tiffany%, we need to go, now!</speech>
-"I'd be lying if I said I didn't ask about... your sister, just to find out more about the kind of person you are", she remarks.
+<action>I say as I start pulling her up the stairs.</action>
-"I'd be lying if I said I didn't ask about <% print(window.story.tiffany()) %> for the same reason", I reply.
+<speech.tiffany>No! Mom!</speech>
-Lucy gives a slight smile.
+<action>The pitch of her scream is piercing.</action>
-"Fair enough", she replies.
+<character.two>?Lucy</character>
-[[[Walk over to Lucy]|C1P46]]I walk over to Lucy. I glance down at the picture frames she was looking at, they're not of her, or of %Tiffany%; just some random family, a happy, family.
+<speech.lucy>Argh! Ugh...</speech>
-"Tiffany used to be like the little boy in these pictures", Lucy says, gesturing to the picture frames.
+<action>Lucy gurgles somewhere behind me.</action>
-"Happy, carefree, and surrounded by a loving family. Then when everything went to shit, she lost all that, and there was nothing I could, can, do about it", Lucy remarks.
+<character.one.pain.eyes>Sarah</character>
-[[...|C1P46V1]]<br>
-[[She's still happy|C1P46V2]]<br>
-[[You still love her|C1P46V3]]I look at Lucy, then back at the frames.
+<action>I don't look back.</action>
-<%= window.story.customRender("F: Happy cuz of you") %>"She still looks pretty happy to me", I state.
+<character.two.scared.ditto>Tiffany</character>
-<%= window.story.customRender("F: Happy cuz of you") %>"You still love her, she has that", I say.
+<speech.sarah>%Tiffany%, move!</speech>
-<%= window.story.customRender("F: Happy cuz of you") %>"<% if (window.passage.name === "C1P46V2") { print ("She's happy because of you.") } else { print("And that's not enough.") } %>", Lucy remarks.
+<action>I start dragging her up the steps.</action>
-"You are the first thing, the first *person* to bring any joy into her life in a very long time. I try to keep her happy, but I'm so busy trying to keep her alive and fed, I just don't have the time. You don't even need to do anything, just being around you is enough to lift her spirits!", Lucy exclaims.
+<choices>[[[Go up the stairs]|C1P56]]</choices><ui>standard</ui>
+<character.one.angry>Sarah</character>
+<character.two.scared.ditto>Tiffany</character>
-[[...|C1P47V1]]<br>
-[[Jealous?|C1P47V2]]<br>
-<%
-switch (window.story.getChoice("Chapter1", "TiffBackstory")) {
- case "Lonely":
- print("[[She's lonely|C1P47V31]]");
- break;
-
- case "Dad":
- print("[[She misses her dad|C1P47V32]]");
- break;
-
- case "Killing":
- print("[[You don't involve her enough|C1P47V33]]");
- break;
-}
-%>I'm not sure where this is going...
+<action>I bolt make up the stairs towards %Tiffany%, then grab her by the hand.</action>
-<%= window.story.customRender("F: Tiff is a child") %>"Jealous?", I ask?
+<speech.sarah>Come on %Tiffany%, there's nothing we can do for her now.</speech>
-Lucy scoffs.
+<action>I say as I start pulling her up the stairs.</action>
+<action>She doesn't say a word, she must be in shock...</action>
+<action>I guess I am too for that matter.</action>
+<action>Lucy continues to gurgle somewhere behind me.</action>
-"Yeah, I guess I am a little bit", she says, smiling slightly.
+<character.one.pain.eyes>Sarah</character>
-<%= window.story.customRender("F: Tiff is a child") %>"She's just lonely. And I mean can you blame her, when she's left alone all day long?", I remark. I didn't realize how rude that sounded till the words left my mouth.
+<action>I don't look back.</action>
-Lucy turns to me with a mixture of anger and shock, but it quickly fades away to a look of pain.
+<choices>[[[Go up the stairs]|C1P56]]</choices><ui>standard</ui>
+<character.one.angry>Sarah</character>
+<character.two.scared.ditto>Tiffany</character>
-She knows I'm right.
+<action>We climb to the top of the stairs...</action>
-<%= window.story.customRender("F: Tiff is a child") %><% window.story.achievement("Chapter1", "Nerve", "Struck a Nerve", "Found a touchy subject") %>
+<character.one.pain>Sarah</character>
-"She just misses her dad; it sounded like he was going through al-", I start.
+<action>Why do people keep dying around me?</action>
+<action>Am I just a death magnet?</action>
-"Don't talk about my husband", Lucy snaps.
+<character.one.angry>Sarah</character>
-I'm caught off guard, I bite my tongue.
+<action>Ugh, no time for this now!</action>
+<action>We need to get out of here.</action>
+<action>I start to look around: we are in another hallway.</action>
+<action>There are three doors along the sides and some kind of open room at the end.</action>
-"He abandoned us, abandoned *Tiffany*, when she needed him most. That's it, end of story", Lucy spits out.
+<character.two.sad.confused>Tiffany</character>
-There's an awkward silence. I guess she either doesn't understand, or doesn't want to understand it, from his perspective.
+<speech.tiffany>We need to go back and get her</speech>
-<%= window.story.customRender("F: Tiff is a child") %>"You don't get her involved enough", I say.
+<character.one.pain>Sarah</character>
-Lucy looks at me in confusion.
+<speech.sarah>Huh, what?</speech>
-"She said she hasn't even killed a walker", I explain.
+<action>I'm caught a little off-guard.</action>
-"How can you expect her to be happy when you don't let her do anything?", I ask.
+<speech.tiffany>We need to go get mom!</speech>
-Lucy takes a breath as if to say something, but stops and looks away instead.
+<action>She's half shouting, half crying.</action>
-She knows I'm right.
+<choices>
+ [[%Tiffany%, she's dead|C1P56V1]]
+ [[Keep your voice down!|C1P56V2]]
+ [[That's not your mom anymore...|C1P56V3]]
+</choices><ui>standard</ui>
+<character.one.happy.eyes>Sarah</character>
+<character.two>Tiffany</character>
-<%= window.story.customRender("F: Tiff is a child") %>Lucy moves away towards the window.
+<speech.sarah>Oh by the way, I found something for you.</speech>
-"She's just a child. She didn't even get the chance to go to school...", Lucy trails off.
+<action>I get the spinning top out of my pocket.</action>
-"I'm doing the best I can to keep her alive; there's not exactly a handbook on 'How to raise a child in the apocalypse'", she remarks.
+<character.two.happy.eyes>Tiffany</character>
-She looks out the window for a few moments.
+<speech.tiffany>Huh, you did?</speech>
-[[Why did you save me?|C1P48]]"Why did you save me, really", I ask.
+<action>Her eyes light up.</action>
-Lucy is silent for a moment.
+<speech.sarah>Here.</speech>
-"I saved you, because one day, maybe soon, that might be my little girl, running around out there, needing help...", she trails off.
+<action>I pass %Tiffany% the spinning top.</action>
-She's still facing away from me, but I hear a sniffle.
+<speech.tiffany>What is it?</speech>
-"And I can only hope that people are as kind to her, as I have been to you", she finishes.
+<action>She says, taking it in her small hands.</action>
-She turns to face me, tears streaking down her eyes.
+<speech.sarah>It's called a spinning top.</speech>
+<speech.sarah>It's a toy, kinda.</speech>
-[[...|C1P48V1]]<br>
-[[They will be|C1P48V2]]<br>
-[[They won't be|C1P48V3]]<% window.story.setChoice("Chapter1", "WillHelp", false) %>
+<speech.tiffany>How does it work?</speech>
-I'm not sure what to say.
+<action>She sounds intrigued.</action>
-<%= window.story.customRender("F: Stay") %><% window.story.setChoice("Chapter1", "WillHelp") %>
+<speech.sarah>Here, I'll show you.</speech>
-"They will be", I say.
+<action>I reach out and place my hand on hers, moving the spinning top the correct way up.</action>
+<action>Then I move our hands down to the tabletop.</action>
+<action>I let go.</action>
-<%= window.story.customRender("F: Stay") %><% window.story.setChoice("Chapter1", "WillHelp", false) %>
+<speech.sarah>Okay, now you just need to twist your fingers, and let go.</speech>
-"They won't be", I say.
+<action>She does as I instruct, and the spinning top spins.</action>
+<action>The colors on the spinning top glitter in the poorly lit room.</action>
-<%= window.story.customRender("F: Stay") %><% if (window.passage.name === "C1P48V1") { %>
+<speech.tiffany>Woah...</speech>
-Lucy looks at me... she understands there are not many good people left these days. She takes a breath, wiping her tears away.
+<action>We sit and watch it till it spins itself out.</action>
+<action>%Tiffany% picks up the spinning top and examines it more closely.</action>
+<action>Speaking of examining, now isn't a bad time to find out a bit more about %Tiffany%...</action>
-<% } else if (window.passage.name === "C1P48V2") { %>
+<%= window.story.render("F: Tiff Breakfast Talk Options") %><choices>
+ [[Where's dad?|C1P44V1]]
+ [[Where've you been staying?|C1P44V2]]
+ [[How many walkers you killed?|C1P44V3]]
+</choices><ui>standard</ui>
+<character.one.angry.eyes>Sarah</character>
+<character.two.confused.sad>Tiffany</character>
-"Do you really think so?", she asks, taking a breath, wiping her tears away.
+<speech.sarah>Don't worry %Tiffany%, she'll be fine.</speech>
+<speech.sarah>Your mom can handle herself.</speech>
-"I do", I say confidently.
+<action>I do my best to sound reassuring.</action>
+<action>She slowly nods her head, but I think she's only doing it for my benefit...</action>
-<% } else if (window.passage.name === "C1P48V3") { %>
+<%= window.story.render("F: Clap o' thunder") %><ui>standard</ui>
+<character.one.angry.eyes>Sarah</character>
+<character.two.confused.sad>Tiffany</character>
-"Deep down, I think I know that", she says, taking a breath, wiping her tears away.
+<action>I really have no idea what to say to her right now that would make her feel better.</action>
+<action>She looks so frightened.</action>
+<action>Maybe I should have gone outside instead...</action>
-<% } %>
+<%= window.story.render("F: Clap o' thunder") %><ui>standard</ui>
+<character.one.angry.eyes>Sarah</character>
+<character.two.confused.sad>Tiffany</character>
-Lucy takes a moment to center herself.
+<action>Maybe she'll feel better if she holds my hand.</action>
+<action>That use to help Sophia when she was scared...</action>
+<action>I extend my arm out in her direction.</action>
+<action>She looks up at me, keeps still for a moment, then jumps out of her chair.</action>
-"I'm not sure how to say this, so I'll just say it: I'd like it if you stayed with us", Lucy says.
+<character.one.happy.eyes>Sarah</character>
-My heart skips a beat, I haven't been with other people long term since... Sophia.
+<action>She rushes over and wraps both her little arms around my waist.</action>
+<action>Woah, okay, not what I was going for, but sure, that works.</action>
+<action>I lower my arm back down and hold her.</action>
-"I know it's a lot to lay on you all at once, but, I've thought about it;<% if (window.story.getChoice("Chapter1", "ItemsCollected") > 0) print(" you're resourceful,") %> you clearly know how to survive out there, you can pull your own weight, and you'll have an influence on Tiffany", she explains.
+<%= window.story.render("F: Clap o' thunder") %><action>We wait.</action>
-"Don't know if it will be a good or bad influence, we'll have to find out, together", she says with a slight smile.
+<character.one.angry.eyes>Sarah</character>
-This is a lot to process, I have to think about this for a minute. I've known these people for like, five minutes; they seem nice, but is this even something I want?
+<action>Nothing happens for a few moments.</action>
+<action>BANG</action>
+<action>%Tiffany% jumps as the sound of a clap of thunder rings out.</action>
+<action>The weather is really taking a turn for the worst.</action>
+<action>What is Lucy doing out there...</action>
+<action>I haven't heard any shouting in a minute or two.</action>
+<action>SLAM</action>
-[[[Think about Lucy's offer]|C1P49]]I think about it for a minute, Lucy staring at me all the while.
+<character.two.fighting.ditto>Lucy</character>
-<% if (window.story.getChoice("Chapter1", "NewPurpose")) { %>
+<action>This time I jump, as the front door swings open, and Lucy comes crashing through.</action>
-Well, I said I needed a new purpose; this isn't exactly what I had in mind, but...
+<speech.lucy.fighting>Come on!</speech>
-I can't bring Sophia back, but maybe I can honor her through helping %Tiffany%.
+<action>She's shouting at someone outside.</action>
+<action>She moves to the door, looking ready to close it.</action>
-<% } else { %>
+<character.one.fighting.ditto>Lucy</character>
+<character.two.fighting.ditto>Charles</character>
+<characteroverride.two>???</characteroverride>
-I don't know... I don't want, no, I *can't* have another little girl's blood on my hands. %Tiffany% might be better off without me.
+<action>Suddenly, a man comes bolting through and crashes into the stairs.</action>
+<action>Lucy kicks the door closed behind him.</action>
-<% } %>
+<choices>[[[Look at the stranger]|C1P54V11]]</choices><% window.story.setChoice("Chapter1", "CharlesName"); %>
-[[I'll stay|C1P50]] [[I'm not staying|C1P50]]"I-", I start to say.
+<ui>standard</ui>
+<character.one.happy.eyes>Sarah</character>
+<character.two.fighting.ditto>Charles</character>
+<characteroverride.two>???</characteroverride>
+<action>I look at the stranger slumped on the stairs, panting.</action>
+<action>He looks pretty tall, but kinda skinny.</action>
+<action>He's wearing a trench coat or something, has light green eyes, and long black hair in a ponytail.</action>
+<action>I also notice an axe lying next to him, it's covered in walker bits.</action>
-<i>"AAARGH!"</i>, someone, or something, screams from outside.
+<character.two>Charles</character>
+<characteroverride.two>???</characteroverride>
-Lucy and I both look towards the direction of the source. It sounded like it came from somewhere outside the front of the house.
+<speech.charles>Thanks...</speech>
-[[I got %Tiffany%, go!|C1P51V1]]
-[[Watch %Tiffany%, I'll go!|C1P51V2]]<% window.story.setChoice("Chapter1", "Protect") %>
+<action>He manages to say between breaths.</action>
-"I'll protect %Tiffany%, go find out what *the fuck* that was!", I exclaim.
+<character.one.concern>Lucy</character>
-Lucy looks at me and nods, then runs out the door, I go right behind her.
+<speech.lucy>Don't mention it.</speech>
-[[[Go to %Tiffany%]|C1P52V1]]<% window.story.setChoice("Chapter1", "Protect", false) %>
+<character.two>Charles</character>
-"You protect <% print(window.story.tiffany()) %>, I'll go find out what *the fuck* that was!", I exclaim as I head for the door.
+<speech.charles>Name's Charles.</speech>
-"Right!", I hear Lucy say behind me.
+<speech.lucy>Lucy, and that's Sarah and Tiffany.</speech>
-[[[Go through the door]|C1P52V2]]I go through the doorway back into the Kitchen, Lucy is already at the door to the hallway.
+<action>She vaguely gestures back down the hallway towards us.</action>
+<action>Charles jumps a little, he must not have seen us.</action>
+<action>He quickly recovers and gives me a nod.</action>
-"Mom?!", %Tiffany% says, sounding distressed.
+<choices>
+ [[We need to hide|C1P54V111]]
+ [[We need to get out of here|C1P54V112]]
+ [[We need to fortify this place|C1P54V113]]
+</choices><ui>standard</ui>
+<character.one.angry.eyes>Sarah</character>
+<character.two>Charles</character>
-<i>"Oh fuck, help!"</i>, the voice screams from outside. It sounds like a guy.
+<speech.sarah>We should hide.</speech>
+<speech.sarah>Those walkers will be on us any minute.</speech>
-"Don't worry, she's handling it", I say as I approach %Tiffany%.
+<%= window.story.render("F: Smash") %><ui>standard</ui>
+<character.one.angry.eyes>Sarah</character>
+<character.two.confused.sad>Tiffany</character>
-"Handling what?", she asks looking at me, fear in her eyes.
+<action>I don't know how to explain to her Lucy isn't helping whoever's outside...</action>
-"Nothing good...", I reply.
+<%= window.story.render("F: Let me in!") %><ui>standard</ui>
+<character.one.angry.eyes>Sarah</character>
+<character.two.confused.sad>Tiffany</character>
-I walk to the corner of the room so I can see down the hallway.
+<speech.sarah>She's making sure we stay safe.</speech>
-[[[Look at Lucy]|C1P53V1]]I walk through the doorway back into the Kitchen and head straight for the door to the hallway.
+<action>I try to sound reassuring.</action>
+<action>She slowly nods her head, but I think she's unconvinced.</action>
-"Sarah?!", %Tiffany% says, clearly distressed.
+<%= window.story.render("F: Let me in!") %><ui>standard</ui>
+<character.one.angry.eyes>Sarah</character>
+<character.two.confused.sad>Tiffany</character>
-<i>"Oh fuck, help!"</i>, the voice screams from outside. It sounds like a guy.
+<speech.sarah>She's just, um, helping someone outside, okay?</speech>
-"Stay with your mom, I'm handling it", I say as I walk past her and out into the hallway.
+<action>I look back down the hallway.</action>
-"Handling what?", I hear her ask behind me.
+<character.two.sad.concern>Lucy</character>
-I'm at the front door now, I can hear a commotion outside.
+<action>Lucy's looking at me, an uneasy expression on her face, but she quickly gets back to the door.</action>
-[[[Look through the peephole]|C1P53V2]]I look down the hallway, I can see Lucy standing at the front door. She's looking through the peephole.
+<%= window.story.render("F: Let me in!") %><action>BANG BANG BANG</action>
+<action>That sounded like the front door.</action>
-<i>"Someone, please!"</i>, the voice screams again.
+<character.two>Unknown</character>
-Lucy steps back from the door and looks at me. Our eyes lock: what is she going to do?
+<speech.unknown>Hey! Anyone in here?</speech>
-<div#lucyAction></div>
+<action>Sounds like a man's voice from the other side of the door.</action>
+<action>They might be trying to get in here!</action>
-<script>
-// Using script tags here instead of Underscore templates because you can't use if statements and a render in Interpolation tags
-if (!window.story.getChoice("Chapter1", "WillHelp") && window.story.getChoice("Chapter1", "Lied")) {
- $("#lucyAction").replaceWith(window.story.customRender("F: Lucy stays inside"));
-} else {
- $("#lucyAction").replaceWith(window.story.customRender("F: Lucy goes outside"));
-}
-</script><% window.story.setChoice("Chapter1", "LucySavesStranger", false) %>
+<character.one.fighting.ditto>Lucy</character>
-She holds eye contact for a moment, then looks back at the door, and looks around it. Is she looking for a way to lock it? I guess she's not going out there. Probably for the best.
+<action>Lucy takes a step back from the door and pulls her knife out.</action>
+<action>Shit, what is she going to do?</action>
-"Sarah, what's mom doing", %Tiffany% says from the table. I look back at her, she looks terrified.
+<choices>
+ [[%Tiffany%, run!|C1P54V12]]
+ [[Lucy, be careful!|C1P54V12]]
+ [[Lucy, don't do it!|C1P54V12]]
+</choices><ui>standard</ui>
+<character.one.angry.eyes>Sarah</character>
-[[...|C1P53V122]]<br>
-[[She's keeping us safe|C1P53V121]]<br>
-[[She's helping someone outside [Lie]|C1P53V123]]<% window.story.setChoice("Chapter1", "LucySavesStranger") %>
+<action>I take a breath to speak-</action>
+<action>CRASH</action>
-Lucy pulls out her knife, opens the door, and disappears through it.
+<character.two.fighting.ditto>Charles</character>
+<characteroverride.two>???</characteroverride>
-What the hell is she doing?! I turn to the boarded-up window on my left, I try to find a gap to look through, but between the boards and the rain outside, I can't see jack shit... just, walkers.
+<action>Suddenly, the door swings open, and a man comes crashing through.</action>
-I look back at %Tiffany%, she's still sitting at the table, looking terrified.
+<character.one.fighting.ditto>Lucy</character>
-[[...|C1P53V112]]<br>
-[[She'll be fine %Tiffany%|C1P53V111]]<br>
-[[[Extend hand out to %Tiffany%]|C1P53V113]]<% window.story.networkCheck("Alpha") %>
+<action>Lucy gets knocked out of the way and nearly falls to the ground.</action>
+<action>The man lands on the stairs.</action>
+<action>He's pretty tall, but skinny, wearing a trench coat or something, has light green eyes, long black hair in a ponytail and is soaking wet.</action>
+<action>He is also holding an axe in one hand.</action>
-Loading, please wait...This game is in an alpha state (v<% print(window.story.version) %>), all content is subject to change.
+<character.two>Charles</character>
+<characteroverride.two>???</characteroverride>
-[[Understood|Title Screen]]I look through the peephole, <% if (window.story.getChoice("Chapter1", "LivingWindow")) { print("the weather has gotten a lot worse too") } else { print("the weather is terrible outside") } %>, the rain is coming down heavy. There's a lot of walkers outside<% if (window.story.getChoice("Chapter1", "LivingWindow")) print(", even more than when I looked before") %>, they're all focused on something in the middle of the street, it's difficult to see... There! A guy outside!
+<action>He props himself up on the stars he fell on.</action>
+<action>There's a moment of silence.</action>
-<i>"Get away from me!"</i>, he screams.
+<character.two.angry>Charles</character>
+<characteroverride.two>???</characteroverride>
-He's pretty tall, but skinny, wearing a trench coat or something, wildly swinging a bat around: he's going to get himself killed.
+<action>Then his expression turns to one of anger.</action>
-I step back from the peephole and look towards the end of the hallway. Lucy is standing in the corner of the Kitchen, looking at me. Our eyes lock for a moment.
+<speech.charles>Oi, why didn't you-</speech>
-<i>"Anyone, please, help!"</i>, the guy screams from outside.
+<action>Before he even has time to finish, Lucy is back on her feet.</action>
+<action>She's lunging towards him with her knife!</action>
-I look back towards the door.<% if (window.story.getChoice("Chapter1", "WillHelp")) print (" I told Lucy people still help each other out, might be time to put my money where my mouth is.") %> I could go out and help him... or, I can make sure nothing gets through this door.
+<choices>
+ [[...|C1P54V1212]]
+ [[Lucy stop!|C1P54V1211]]
+ [[Watch out for the axe!|C1P54V1213]]
+</choices><ui>standard</ui>
+<character.one.angry>Sarah</character>
+<character.two.fighting.ditto>Lucy</character>
-[[[Help the stranger]|C1P53V21]]
-[[[Do not help the stranger]|C1P53V22]]<% window.story.setChoice("Chapter1", "SaveStranger") %>
+<speech.sarah>Lucy, stop!</speech>
-Shit. This is a bad idea. I look back at Lucy for a moment, <% if (window.story.getChoice("Chapter1", "WillHelp")) { print ("she nods") } else { print("she slowly shakes her head at me") } %>, she understands what I'm about to do. I unlock the door, open it, and step outside.
+<action>What the hell is she doing?!</action>
-I close the door behind me and immediately get slapped by the rain. It's pouring out here. I reach down for my knife- fuck, I forgot I don't have it!
+<%= window.story.render("F: wtf") %><ui>standard</ui>
+<character.one.angry>Sarah</character>
+<character.two.fighting.ditto>Lucy</character>
-<% if (window.story.getChoice("Chapter1", "Haircut")) { %>
+<action>I don't know what the hell she's doing, but now isn't the time to interrupt.</action>
-I feel around in my pockets, ah! The scissors! Seems like a waste, they'll be ruined, but better than going out here with my bare hands...
+<%= window.story.render("F: wtf") %><ui>standard</ui>
+<character.one.angry>Sarah</character>
+<character.two.fighting.ditto>Lucy</character>
-<% } else { %>
+<speech.sarah>Watch out for the axe!</speech>
-I feel around in my pockets... nothing I can use as a weapon. Guess I'm going to have to be smart about how I move around these walkers.
+<%= window.story.render("F: wtf") %><character.one.fighting.ditto>Lucy</character>
+<character.two.angry>Charles</character>
+<characteroverride.two>???</characteroverride>
-<% } %>
+<speech.charles>What the- argh, FUCK, are you doing?!</speech>
-I look for the guy, he's in the middle of the street a couple of meters away, he hasn't noticed me, and neither have any of the walkers. Between all the noise he's making and the rain, they're totally focused on him.
+<action>They're both tumbling around on the ground now.</action>
+<action>Lucy has the knife right near his throat, but he has his arms up in front of him.</action>
+<action>She can't push it close enough to get him-</action>
-They must be at least 20 or 30 walkers, no way we can take them all out, not without proper weapons. My options are limited here: maybe I can get his attention from here and have him come over here to the house, save having to fight my way to him; or, I can try and clear a path to him, and get his attention when I'm closer to him.
+<speech.charles>ARGH!</speech>
-[[[Yell at him]|C1P53V211]]
-[[[Go over to him]|C1P53V212]]<% window.story.setChoice("Chapter1", "SaveStranger", false) %>
+<action>Lucy dropped the knife from one hand, caught it with the other, and took a swipe the guy's arm.</action>
+<action>Where did she learn to do that...</action>
-No way in hell am I stepping out there. I look back at Lucy for a moment, <% if (window.story.getChoice("Chapter1", "WillHelp")) { print ("she looks at me, disapointed, but doesn't say anthing") } else { print("she slowly nods her head at me") } %>.
+<character.two.scared>Charles</character>
+<characteroverride.two>???</characteroverride>
-I look at the door, there's not much in the way of locking, in fact, the lock looks busted. I guess that's how Lucy got in. If I could move a chair or a table in front of the door, that might be enough to-
+<action>Lucy backs off, the stranger, still on the floor, has started crawling back down the hallway towards the living room.</action>
+<action>Holding the now bleeding arm across his chest.</action>
-\*Bang\*
+<speech.charles>What the hell is wrong with you people?!</speech>
-What the hell, that was on the other side of the door, how'd a walker get up here so quickly-
+<action>The pain evident in his voice.</action>
+<action>Lucy takes a defensive stance, staying between us and the man.</action>
-"Hey! Anyone in here?", a man's voice shouts from the other side of the door.
+<choices>[[[Look at %Tiffany%]|C1P54V12111]]</choices><% window.story.setChoice("Chapter1", "StrangerDied"); %>
-Shit! Now what?! It won't take him long to figure out it's not fucking locked!
+<%= window.story.render("F: Feet on seat") %>
-[[Go away!|C1P53V221]]<br>
-[[<% print (window.story.tiffany()) %> run!|C1P53V222]]<br>
-[[[Hold the door closed]|C1P53V223]]<% window.story.achievement("Chapter1", "Scorpion", "Scorpion", "*Get over here*") %>
+<action>I take a step towards her-</action>
+<action>CRASH</action>
-I don't want to have to go over to him, too dangerous.
+<character.one.happy.eyes>Sarah</character>
-"Hey! You!", I yell at the man.
+<action>Shit, is Lucy alright?</action>
-He stops swinging his bat for a moment and looks at me, with the expression on his face you'd have thought he just laid eyes on a pot of gold.
+<resetcharacter.two/>
-"Get over here!", I yell at him.
+<action>I quickly look back down the hallway.</action>
+<action>A hand has appeared through one of the boarded-up windows in the hallway.</action>
-He nods, and gets back to swinging, slowly moving towards me.
+<character.two.scared>Charles</character>
+<characteroverride.two>???</characteroverride>
-Uh-oh, that drew some unwanted attention as well. A few walkers have started heading my direction now, shit!
+<action>It's grabbed the stranger by his injured arm.</action>
-<% if (window.story.getChoice("Chapter1", "Haircut")) { %>
-[[[Use Scissors]|C1P53V2111]]
-<% } else { %>
-[[[Look around for a weapon]|C1P53V2112]]
-<% } %>I had better go over to him, no point yelling and drawing more walkers.
+<speech.charles>Oh god, no!</speech>
-The path between him and I is actually pretty clear, most of the walkers are on the street, there's only one walker directly in my way. I start towards it, the rain is covering up the sound of my walking, so I've got that going for me at least.
+<action>He getting pulled towards the window.</action>
+<action>A walker forces its head through the glass.</action>
-<% if (window.story.getChoice("Chapter1", "Haircut")) { %>
+<character.one.fighting.ditto>Lucy</character>
-I get up right behind it, then <%= window.story.customRender("F: Scissor takedown") %>
+<speech.lucy.fighting>Walkers!</speech>
-<% } else { %>
+<action>Lucy shouts, as the sound of glass and wood breaking erupts.</action>
-I get up right behind it, then I quickly kick out its left knee, it makes a pronounced snapping noise and bends abnormally. The walker tumbles to its knees. I push it to the ground, then stomp its head in.
+<speech.charles>AAARRHHH!</speech>
-I take a breath, been a while since I've had to do that. Its head has turned to mush... and I have said mush all over my shoes; a problem for later.
+<action>The man screams, as the walker head takes a bite out of his arm.</action>
+<action>Lucy starts running down the hallway towards us.</action>
-<% } %>
+<%= window.story.render("F: You're heavy") %><character.one.angry.eyes>Sarah</character>
+<character.two.scared.ditto>Tiffany</character>
-[[[Keep heading towards the stranger]|C1P53V2121]]I take a few steps forward towards the closest walker, then wait for him to get within arm's length. <%= window.story.customRender("F: Scissor takedown") %>
+<action>I turn towards %Tiffany%.</action>
-<%= window.story.customRender("F: Ow my leg") %>I look around for a weapon. There's nothing out here! Just a doormat and a potted plant.
+<speech.sarah>Come on %Tiffany%, we need to move.</speech>
-Wait, the plant, that could do. I walk over to it and start to pick it up. It's got a fair bit of weight to it. I look back towards the walkers, the closest one is just a few meters from me. I brace myself, and then throw the potted plant right at it.
+<action>She looks up at me, but doesn't move.</action>
-The pot connects with the walker's head and shatters. The walker goes down like a sack of potatoes.
+<speech.sarah>Come on!</speech>
-<%= window.story.customRender("Ow my leg") %>Fuck, I forgot about my leg, argh! That really hurt. I look up, there are still two walkers headed for me, shit. I take a step back- ARGH, shit, I've properly buggered my leg: this isn't good.
+<action>She still just stares back at me.</action>
-I start to hobble back towards the door, pain shooting up my leg; I look back over at the stranger. We make eye contact for a moment, he sees I'm hurt and I'm being followed. There's a moment of panic in his eyes, then he must have had an idea, because he smiles.
+<character.one>Sarah</character>
-"Hey! Hey, dummies; over here!", he shouts over the top of the rain.
+<action>This isn't working, I need to change tactics.</action>
+<action>I stretch my arms out toward her and beckon.</action>
+<action>She looks at me for a moment, then turns and puts her hands up towards me.</action>
+<action>I grab her and pick her up.</action>
+<action>God she's heavier than she looks.</action>
+<action>I balance her properly so she's sitting on my hips, as she wraps her hands around my neck to hold herself.</action>
+<action>I take a step towards the door-</action>
-The walkers following me stop and slowly swing back towards him.
+<character.one.happy.eyes>Sarah</character>
-"Yeah that's right idiots, over here!", he shouts again.
+<action>Oof, I forgot about my leg.</action>
+<action>This could be interesting...</action>
-He must be crazy, but it's working.
+<choices>[[[Head down the hallway]|C1P54V11111]]</choices><ui>standard</ui>
+<character.one>Sarah</character>
+<character.two.confused.sad>Tiffany</character>
-[[[Open the door to the house]|C1P53V21111]]I shuffle back to the front door and open it, I look back towards the stranger. He's made it most of the way over to me now.
+<action>I get to the doorway and start down the hallway, %Tiffany% in tow.</action>
-"Come on!", I shout at him.
+<character.two.concern>Lucy</character>
-He takes one final swing, then bolts towards the door. I step inside and out of the way, right as he comes crashing in. I slam the door behind him.
+<action>Lucy and I bump into each other.</action>
-We both stand there for a moment, soaking wet, and panting. I notice he's got light green eyes, and long black hair in a ponytail.
+<character.two.happy.eyes>Lucy</character>
-"Thanks...", he manages to say, between breaths.
+<action>We exchange brief glances, she looks grateful.</action>
-"Don't mention it", I reply.
+<character.two.concern>Lucy</character>
-"My name's Charles", he says between puffs.
+<action>We're halfway down the hallway now, Lucy right behind me-</action>
-"Sarah, and that's Lucy", I say as I gesture over my shoulder back towards the kitchen.
+<character.two.confused.sad>Tiffany</character>
-Charles jumps a little, he must not have seen her; but he quickly recovers and gives a little slow-wave.
+<speech.tiffany>Eeek!</speech>
-[[[Turn towards Lucy]|C1P53V211111]]I quickly kick out its left knee, it makes a pronounced snapping noise and bends abnormally. The walker tumbles to its knees, its head bent over, perfectly within reach. I take the scissors and drive them deep into the back of its head, it makes a horrid gurgling sound, then flops to the ground. I go to pull the scissors out of its head, but they snap at the handle, leaving the sharp end in the walker's head. Figures.I take a step towards the stranger- ARGH, shit! I forgot about my leg; I've properly buggered it taking down that walker.
+<action>%Tiffany% says right into my ear.</action>
+<action>Before I have a chance to process the sound, her arms around my neck pull back, tight.</action>
-I'm not as close to him as I would have liked, but this will have to do.
+<character.one.pain>Sarah</character>
+<resetcharacter.two/>
-"Hey!", I shout over the rain, as I wave my hands in the air.
+<action>I choke and fall backward.</action>
+<action>SMACK</action>
+<action>I hit the ground.</action>
+<action>Argh, my leg, again! Can't catch a break...</action>
+<action>I quickly refocus my vision, and look around for %Tiffany%.</action>
-He stops swinging his bat for a moment and looks at me, with the expression on his face you'd have thought he just laid eyes on a pot of gold.
+<character.two.scared.ditto>Tiffany</character>
-"Hey! Someone actually heard me!", he exclaims happily.
+<action>A hand has come through one of the windows and grabbed her leg!</action>
+<action>I gotta get up and-</action>
-"Come on, let's get inside", I say back to him.
+<character.one.fighting.ditto>Lucy</character>
-He nods and starts heading towards me, swinging as he goes.
+<action>Lucy appears out of nowhere with her knife, takes one swipe at the hand, and detaches it from the arm it was connected to.</action>
+<action>Impressive.</action>
-[[[Head back to the house]|C1P53V21111]]"Go aw-", I start to say.
+<character.one.concern>Lucy</character>
-<%= window.story.customRender("F: Door swings open") %>"<% print(window.story.tiffany()) %> ru-", I start to say.
+<speech.lucy>Are you alright Tiffany?</speech>
-<%= window.story.customRender("F: Door swings open") %>I lean on the door-
+<speech.tiffany>Yes.</speech>
-<%= window.story.customRender("F: Door swings open") %>\*Crash\*
+<action>%Tiffany% replies as a small squeak.</action>
-Suddenly, the door swings open, and a man comes crashing through. I get knocked to the ground by the door and land awkwardly on my bad leg. Argh, fuck's sake. The man lands on the stairs, soaked.
+<speech.lucy>Rest when you're dead Sarah, move!</speech>
-I get onto my knees and look at the man, he props himself up as well and our eyes meet, a look of shock on his face. He's got light green eyes, and long black hair in a ponytail... and he has a bat.
+<action>Lucy says as she helps %Tiffany% up.</action>
+<action>She's right, this is not a good spot to be in.</action>
+<action>I manage to get on my knees, pain shooting up my bad leg.</action>
+<action>I push through it and get back on my feet.</action>
-There's a moment of silence. His expression turns to one of anger.
+<choices>[[[Head for the stairs]|C1P55]]</choices><ui>standard</ui>
+<character.one.angry.eyes>Sarah</character>
+<character.two>Charles</character>
-"Oi, why didn't you help me out there! There's no way you didn't hear me!", the stranger says angrily.
+<speech.sarah>We should get moving.</speech>
+<speech.sarah>Those walkers won't take long to get in here.</speech>
-[[I don't know you!|C1P53V2211]]<br>
-[[You were going to get yourself killed!|C1P53V2212]]<br>
-[[I was going to! [Lie]|C1P53V2213]]Who the hell does this guy think he is?
+<%= window.story.render("F: Smash") %><ui>standard</ui>
+<character.one.angry.eyes>Sarah</character>
+<character.two>Charles</character>
-"I don't know you, and I don't owe you shit!", I snap back.
+<speech.sarah>We need to fortify this place, ASAP.</speech>
+<speech.sarah>Those walkers will make quick work of those shitty windows.</speech>
-<%= window.story.customRender("F: Not now") %>Is this guy for real?
+<%= window.story.render("F: Smash") %><%= window.story.render("F: Feet on seat") %>
-"You were carrying on like a headless chicken! You've pulled every walker within a half-mile, and it looked like you were trying to get yourself killed!", I snap back at him.
+<character.two>Unknown</character>
+<characteroverride.two>Lucy</characteroverride>
+
+<speech.unknown>I'm coming!</speech>
-<%= window.story.customRender("F: Not now") %>"I was about to, OK?", I say; the look on his face says he's not convinced.
+<action>Lucy shouts from the hallway.</action>
-<%= window.story.customRender("F: Not now") %>"Hey! Now's not the time, we've got bigger problems", Lucy says from somewhere behind me.
+<%= window.story.render("F: You're heavy") %><action>Charles stands up.</action>
-The stranger looks startled, he must not have seen her. He takes a breath as if to say something, but doesn't. He shoots me a dirty look, then begins to stand up.
+<speech.charles>She's right.</speech>
-What an asshole.
+<character.one.happy.eyes>Sarah</character>
+<character.two.scared.eyes>Charles</character>
-[[[Stand up]|C1P53V22111]]I get up off the floor awkwardly, getting knocked down really did a number on my leg.
+<action>SMASH</action>
+<action>A hand suddenly appears through one of the boarded-up windows in the hallway, near Charles.</action>
-<%= window.story.customRender("F: What we need to do now") %>I awkwardly spin towards Lucy, I really did a number on my leg.
+<character.one.happy.sad>Lucy</character>
-<%= window.story.customRender("F: What we need to do now") %>"Alright, what we need to do now is-", I begin to say.
+<speech.lucy>Walkers!</speech>
-\*Crash\*
+<action>Lucy shouts, as the sound of glass and wood breaking erupts.</action>
-A hand appears through one of the boarded-up windows in the hallway, between the front door and the kitchen.
+<speech.charles>Shit!</speech>
-"Walkers!", Lucy shouts, as the sound of glass and wood breaking around the house starts to be heard.
+<character.one.fighting.ditto>Lucy</character>
-[[<% if (window.story.getChoice("Chapter1", "SaveStranger")) { print("Charles,") } else { print("The") } %> Bat!|C1P54V21]]<br>
-[[Upstairs, quickly!|C1P54V22]]<br>
-[[[Run to the kitchen]|C1P54V23]]<% if (window.story.getChoice("Chapter1", "SaveStranger")) { %>
-"Charles, the bat!", I turn and shout.
-<% } else { %>
-"The bat!", I turn and shout.
-<% } %>
+<action>Lucy moves towards him to help.</action>
-He grabs it and throws it in my direction, I catch it, and head towards the window, pushing through the pain in my leg. As I approach, I raise the bat well above my head and bring it down on the arm with all my strength.
+<speech.lucy.fighting>Head upstairs!</speech>
-The bat hits the arm and keeps going; the arm makes a horrible snapping noise, as whatever bones were left in the walker's arm turned to dust. The bat hits the ground and splits in two. The arm, pointing 90 degrees downward now, continues to twitch and wriggle.
+<action>Lucy shouts over her shoulder at %Tiffany% and I.</action>
+<action>We need to get going, now.</action>
-I drop the bat and look up towards the kitchen to meet Lucy's gaze.
+<choices>[[[Get %Tiffany%]|C1P54V1111]]</choices><img.title-image>
-"Let's, go!", I shout.
+<%= window.story.render("Settings") %>
-Lucy grabs <% print(window.story.tiffany()) %> from somewhere beside her and starts booking it down the hallway towards me.
+[[Back|Title Screen]]<img.title-image>
-[[[Head for the stairs]|C1P55]]"Upstairs, quickly!", I shout.
+<div#title-button>
+[[Artwork|Artwork]]
+<a href="https://purpose-game.com" target="_blank">Website</a>
+<a href="https://discord.gg/jNgAEjW7gd" target="_blank">Discord</a>
+<a href="https://github.com/cm8263/Purpose" target="_blank">GitHub</a>
+</div>
-<% if (window.story.getChoice("Chapter1", "SaveStranger")) { print("Charles") } else { print("The stranger") } %> doesn't need to be told twice, he scrambles to the stairs and starts going up.
+[[Back|Title Screen]]<div#title-button>
+[[Sarah]]
+[[Tiffany]]
+[[Lucy]]
+[[Charles]]
+[[Sophia]]
+</div>
-I look back at Lucy, she's got <% print(window.story.tiffany()) %> and is headed down the hallway towards me. As she passes the window, the hand suddenly reaches out and grabs Lucy's pants. <% print(window.story.tiffany()) %> screams.
+[[Back|Extras]]<%= window.story.render("F: Artwork") %>
-"Come to me!", I shout at <% print(window.story.tiffany()) %>.
+<% window.story.createGalleryItem(1, "Sarah", "neutral"); %>
+<% window.story.createGalleryItem(2, "Sarah", "limping"); %>
+<% window.story.createGalleryItem(3, "Sarah", "fighting"); %>
+<% window.story.createGalleryItem(4, "Sarah", "pain", "pain", "neutral"); %>
+<% window.story.createGalleryItem(5, "Sarah", "happy", "happy", "neutral"); %>
+<% window.story.createGalleryItem(6, "Sarah", "sad", "sad", "neutral"); %>
+<% window.story.createGalleryItem(7, "Sarah", "angry", "sad", "neutral"); %><%= window.story.render("F: Artwork") %>
-<% print(window.story.tiffany()) %> doesn't move, but Lucy lets go of her and shoves her in my direction. <% print(window.story.tiffany()) %> stumbles towards me, and I catch her in a hug.
+<% window.story.createGalleryItem(1, "Tiffany", "neutral"); %>
+<% window.story.createGalleryItem(2, "Tiffany", "scared"); %>
+<% window.story.createGalleryItem(3, "Tiffany", "confused", "confused", "neutral"); %>
+<% window.story.createGalleryItem(4, "Tiffany", "happy", "happy", "neutral"); %>
+<% window.story.createGalleryItem(5, "Tiffany", "sad", "sad", "neutral"); %><ui>standard</ui>
+<character.one.pain>Sarah</character>
+<character.two.sad.confused>Tiffany</character>
-I look back at Lucy again, she has her knife out now. She quickly stabs the arm several times, then takes a swipe at it. The arm comes clean off.
+<speech.sarah>%Tiffany%, listen to me.</speech>
+<speech.sarah>I know you don't want to accept this right now, but Sarah is gone.</speech>
+<speech.sarah>And unless you want...</speech>
-[[[Head for the stairs]|C1P55]]Without thinking I bolt for the kitchen, pushing through the pain in my leg.
+<action>I was going to say unless you want to join her, but I don't want to give her any ideas.</action>
-"No!", Lucy shouts. I stop running.
+<speech.sarah>...unless you want to waste the sacrifice she made, for you, we need to go, now.</speech>
-"We'll come to you", she says. I nod, and turn back to <% if (window.story.getChoice("Chapter1", "SaveStranger")) { print("Charles") } else { print("the stranger") } %>.
+<%= window.story.render("F: Softening the blow") %><ui>standard</ui>
+<character.one.pain>Sarah</character>
+<character.two.sad.confused>Tiffany</character>
-"Get upstairs", I shout. He doesn't need to be told twice, he starts scrambling up the stairs.
+<speech.sarah>Keep your voice down %Tiffany%!</speech>
+<speech.sarah>Those walkers are going to find their way up here soon enough, no need to speed them along.</speech>
-I look back at Lucy, she's got <% print(window.story.tiffany()) %> in one hand, her knife in the other, and is head down the hallway towards me. As she passes the window, she makes one clean swipe at the hand and it comes clean off. Impressive.
+<%= window.story.render("F: Softening the blow") %><ui>standard</ui>
+<character.one.pain>Sarah</character>
+<character.two.sad.confused>Tiffany</character>
-[[[Head for the stairs]|C1P55]]<% window.story.delayedText(20 * 1000) %>
+<speech.sarah>%Tiffany%, that's...</speech>
+<speech.sarah>That's not your mom anymore.</speech>
-I head for the stairs, %Tiffany% and Lucy right behind me. <% if (window.story.getChoice("Chapter1", "SaveStranger") || window.story.getChoice("Chapter1", "LucySavesStranger")) { print("No sign of Charles, he must be upstairs already.") } else if (window.story.getChoice("Chapter1", "StrangerDied")) { "I glance over at the stranger, he has two walkers on him now; his face is contorted, but totally silent... poor guy." } %>
+<%= window.story.render("F: Softening the blow") %><action>Tears run down her small face, she doesn't reply.</action>
-I get to the first step and stop, I look behind me to make sure the other two are still following me. %Tiffany% hot on my heels, Lucy just behind her.
+<speech.sarah>We will mourn your mum later, I promise</speech>
-\*Bang, bang bang, bang\*
+<action>I add, trying to soften the blow.</action>
+<action>CREAK, CREAK, CREAK</action>
-The door! Lucy hears it too.
+<character.one.angry.eyes>Sarah</character>
-"Don't stop, keep going!", she exclaims, practically pushing %Tiffany% to the stairs, then turning around and throwing herself against the door. I start heading up-
+<action>I look behind me to the stairs, I can hear walkers making their way up.</action>
+<action>Time to move.</action>
-<div-#delayed>
+<choices>[[[Look around the hallway]|C1P57]]</choices><ui>standard</ui>
+<character.one>Sarah</character>
+<character.two.sad.confused>Tiffany</character>
-\*Crash, bang\*
+<action>Pulling %Tiffany% along behind me, I start down the hallway.</action>
+<action>I stick my head through the first doorway.</action>
+<action>It looks like an office, it has a desk, a computer, some books, and nothing else; nothing useful.</action>
+<action>I hobble down to the next door, this one is a bedroom.</action>
+<action>It has a bed frame but no mattress, a wardrobe, and a cupboard.</action>
+<action>The cupboard door is open, I can see a few clothes hanging, but no weapons or tools to help get us out of here.</action>
+<action>I head for the final door, it's closed.</action>
+<action>I open it: another bedroom.</action>
+<action>Two mattresses on the floor, backpacks in the corner of the room, and a pair of clothes sitting on top of a dresser...</action>
+<action>This must be where %Tiffany% and Sarah were sleeping.</action>
-"Argh!", Lucy shouts behind me.
+<character.two.sad.eyes>Tiffany</character>
-I look behind me; the front door has come clean off its hinges, landed on Lucy, and there are four or five walkers piled on top of the fallen door!
+<action>I look down at %Tiffany%, she still has tears running down her face, but she looks otherwise emotionless.</action>
+<action>I don't know if that's good or bad considering the circumstances.</action>
-"Shit, no!", I exclaim, as I head back down the stairs. Lucy must have dropped her knife because it's laying on the stairs in front of her. I pick it up and start towards the walkers.
+<choices>[[[Look at the backpacks]|C1P58]]</choices><ui>standard</ui>
+<character.one>Sarah</character>
+<character.two.sad.eyes>Tiffany</character>
-"No!", Lucy wails.
+<action>I step into the room and go over to the backpacks.</action>
+<action>One is a black sling backpack, with a single strap that connects with a clip in the middle.</action>
+<action>This one must be... was, Sarah's.</action>
+<action>I look at the other one, it's a smaller white backpack with polka dots...</action>
+<action>%Tiffany%'s.</action>
-"Get Tiffany and go, please!", she cries out.
+<character.one.neutral.neutral.neutral-backpack>Sarah</character>
-The walkers are starting to get up. I look down at %Tiffany%, she's frozen in place, hands to her face, looking down at her mom.
+<action>I pick up the sling backpack and strap it on.</action>
+<action>Then pick up the white one.</action>
-[[[Try to help Lucy]|C1P55V1]]
-[[[Grab %Tiffany% and go]|C1P55V2]]
+<speech.sarah>Put this on %Tiffany%.</speech>
-</div><% window.story.setChoice("Chapter1", "TriedToSaveLucy") %>
+<action>She just stares back at me blankly.</action>
-Fuck that, I can't just leave her!
+<character.one.pain.neutral.neutral-backpack>Sarah</character>
-I step past %Tiffany% back towards Lucy. I get to the last step right as one of the fallen walkers leans over and takes a massive chunk out of Lucy's neck.
+<action>We don't have time for this.</action>
-"Argh! Ugh...", Lucy gurgles.
+<character.two.sad.neutral.neutral-backpack>Tiffany</character>
-"No!", I exclaim. Not again, not again!
+<action>I spin her around, as gently as I can, and put the backpack on her.</action>
+<action>%Tiffany% acting limp as I put her arms through the small straps.</action>
+<action>I pick up the clothes from the dresser and shove them into %Tiffany%'s bag.</action>
+<action>I quickly look around for anything else useful: there's nothing.</action>
-"Just... go...", Lucy manages to gargle.
+<choices>[[[Leave the room]|C1P58A1]]</choices>Hello!
-More walkers are coming through the open doorway now. I take one last look at Lucy, then spin around to %Tiffany%.
+Thanks for poking around the source code. For starters, if you're looking at this in your browser, or you've downloaded the HTML file from itch.io, the source code is freely available on GitHub, so go get it from there instead: https://github.com/cm8263/Purpose
-The look on her face will be burned into my brain for as long as I live. Her blue eyes staring, unblinking, tears budding in the corners of her eyes, her face slowly going pale. She won't forget this.
+It goes without saying that there may be spoilers in here, either in passages you might not have seen or in the developer reference passages. Also, taking a look under the hood can ruin the magic, so, fair warning.
-[[[Grab %Tiffany%]|C1P55V11]]<% window.story.setChoice("Chapter1", "TriedToSaveLucy", false) %>
+All that out of the way, have fun, and feel free to leave PRs on GitHub with improvements!
-I go down the stairs towards %Tiffany% and grab her by the hand.
+- Christopher<ui>standard</ui>
+<character.one.neutral.neutral.neutral-backpack>Sarah</character>
-"Come on %Tiffany%, we need to go, now!", I say, pulling her up the stairs.
+<action>That stupid soap bar, perfect!</action>
+<action>I take it out of my pocket, it's still hard as a rock.</action>
+<action>Just what I need.</action>
-"No! Mom!", she screams, the pitch of her voice is piercing.
+<%= window.story.render("F: The window shatters") %><ui>standard</ui>
+<character.one.neutral.neutral.neutral-backpack>Sarah</character>
+<character.two.sad.neutral.neutral-backpack>Tiffany</character>
-"Argh! Ugh...", Lucy gurgles somewhere behind me. I don't look back.
+<action>I step out onto the patio roof behind %Tiffany%, it's bucketing rain out here.</action>
+<action>I can barely see, and it's soo windy out here too.</action>
-"%Tiffany%, move!", I shout, continuing to pull her up the stairs.
+<character.one.pain.neutral.neutral-backpack>Sarah</character>
-[[[Go up the stairs]|C1P56]]I go up the stairs towards %Tiffany% and grab her by the hand.
+<action>I shield my eyes from the rain and look down at the garden, it's clear of walkers, good.</action>
-"Come on %Tiffany%, there's nothing we can do for her", I say, pulling her up the stairs.
+<% if (!window.story.getChoice("Chapter1", "StrangerDied")) { %>
-She doesn't say a word, she must be in shock... I guess I am too for that matter.
+<character.two>Charles</character>
+
+ <% if (!window.story.getChoice("Chapter1", "CharlesName")) { %>
+
+ <characteroverride.two>???</characteroverride>
+
+ <% } %>
-"Ugh, ugh...", Lucy gurgles somewhere behind me. I don't look back.
+<speech.charles>Well now what?</speech>
-[[[Go up the stairs]|C1P56]]We climb to the top of the stairs... Why do people keep dying around me? Am I just a death maganet? Ugh, no time for this now, we need to get out of here.
+<action>He shouts over the rain.</action>
+<action>Gee, give us a second, will you?</action>
-I start to look around, we are in another hallway, there are three doors along the sides and some kind of open room at the end.
+<% } %>
-"We need to go back and get her", %Tiffany% says.
+<action>I look around for a good way to get down off the roof...</action>
+<action>I don't see anything that would help us get down.</action>
-"What?", I reply, caught a little off-guard.
+<character.two.sad.neutral.neutral-backpack>Tiffany</character>
-"We need to go get mom!", she half shouts half cries.
+<action>I could probably lower %Tiffany% down myself, but how would I get down?</action>
+<action>Ugh, one problem at a time.</action>
-[[%Tiffany%, she's dead|C1P56V1]]<br>
-[[Keep your voice down!|C1P56V2]]<br>
-[[That's not your mom anymore...|C1P56V3]]"Hey, I got you something", I say to %Tiffany%, as I get the spinning top out of my pocket.
+<speech.sarah>%Tiffany%, come over here, I'm going to lower you down.</speech>
-"You did?", she replies, her eyes lighting up as if it was Christmas.
+<action>I have to shout to be heard over the rain.</action>
+<action>We step over towards the edge of the roof; the stairs leading up to the patio directly below us.</action>
-"Here", I say, holding out the spinning top.
+<speech.tiffany>How are you going to get me down there?</speech>
-"What is it?", %Tiffany% asks, taking it in her small hands.
+<action>She whimpers in response.</action>
+<action>I can barely hear her, but at least she's talking again.</action>
-"It's called a spinning top... it's a toy, kinda", I reply.
+<speech.sarah>You're going to start to climb down, then I'm going to hold your hands and lower you the rest of the way.</speech>
-"How does it work?", %Tiffany% says, sounding intrigued.
+<character.two.confused.sad.neutral-backpack>Tiffany</character>
-"Let me show you", I reply.
+<speech.tiffany>I can't do that!</speech>
-I reach out and place my hand on hers, move the spinning top the correct way up, then move our hands down to the tabletop. I take my hand back.
+<action>She looks up at me with her piercing blue eyes wide open.</action>
-"Now, grab the top, and twist", I remark.
+<choices>
+ [[You need to|C1P59V1]]
+ [[Yes you can, it's not so bad|C1P59V2]]
+ [[%Tiffany%, less talking, more doing|C1P59V3]]
+</choices><ui>standard</ui>
+<character.one.pain.neutral.neutral-backpack>Sarah</character>
+<character.two.confused.sad.neutral-backpack>Tiffany</character>
-She does, and the spinning top spins.
+<speech.sarah>I know this is scary %Tiffany%, but you need to, or else the monsters are going to get us.</speech>
-"Woah", %Tiffany% says, as the colors on the spinning top glitter.
+<%= window.story.render("F: Lowering") %><ui>standard</ui>
+<character.one.pain.neutral.neutral-backpack>Sarah</character>
+<character.two.confused.sad.neutral-backpack>Tiffany</character>
-We both sit and watch it for a moment, till it spins itself out.
+<speech.sarah>Yes you can %Tiffany%, it's not as bad as it looks, I promise.</speech>
-<%= window.story.customRender("F: Tiff Breakfast Talk Options") %>[[Where's your dad?|C1P44V1]]<br>
-[[Where have you guys been staying?|C1P44V2]]<br>
-[[How many walkers have you killed?|C1P44V3]]<br>
+<action>I try to sound reassuring.</action>
-[[[Go talk to Lucy]|C1P45]]"Don't worry <% print (window.story.tiffany()) %>, she'll be fine. She can handle herself", I say, trying to sound reassuring.
+<%= window.story.render("F: Lowering") %><ui>standard</ui>
+<character.one.pain.neutral.neutral-backpack>Sarah</character>
+<character.two.confused.sad.neutral-backpack>Tiffany</character>
-She slowly nods her head, but I think she's only doing that for my benefit...
+<speech.sarah>Less talking, more doing %Tiffany%.</speech>
+<speech.sarah>The sooner you start, the sooner you finish</speech>
-<%= window.story.customRender("F: Clap o' thunder") %>I really have no idea what to say to her right now that would make her feel better.
+<%= window.story.render("F: Lowering") %><action>She looks away from me and down at the edge of the roof, then slowly nods her head.</action>
-<%= window.story.customRender("F: Clap o' thunder") %>Maybe she'll feel better if she holds my hand, I don't know...
+<speech.sarah>Alright, good.</speech>
+<speech.sarah>Carefully climb off the edge, then hang onto it, and I'll grab you, okay?</speech>
-I extend my arm out in her direction, she looks up at me, keeps still for a moment, then jumps out of her chair. She rushes over and wraps both her little arms around my waist.
+<action>%Tiffany% precariously lowers herself off the roof.</action>
-Woah, OK, that's not what I was going for, but sure, that works. I lower my arm back down and hold her.
+<character.two.scared.scared.scared-backpack>Tiffany</character>
-<%= window.story.customRender("F: Clap o' thunder") %>Nothing happens for a few moments.
+<speech.tiffany>Mmmmm</speech>
-\*Bang\*
+<action>She murmurs nervously.</action>
+<action>I slowly start to lay flat on the roof.</action>
-<% print (window.story.tiffany()) %> jumps as the sound of a clap of thunder rings out. The weather is really taking a turn for the worst.
+<speech.sarah>Everything's fine, I'm right here.</speech>
+<speech.sarah>Just hang on tight, it's slippery.</speech>
-What is Lucy doing out there... I haven't heard any shouting in a minute or two.
+<speech.tiffany>Grab me, grab me now!</speech>
-\*Slam\*
+<action>She squeaks.</action>
-This time I jump, as the front door swings open, and Lucy comes crashing through.
+<speech.sarah>Don't worry, I've got you, I got you.</speech>
-"Come on!", she shouts at someone outside.
+<action>I say as I crawl forward and grab her by the wrists.</action>
-She moves to the door, looking ready to close it. Suddenly, a man comes bolting through and crashes into the stairs. Lucy kicks the door closed behind him.
+<speech.sarah>Alright, you need to let go of the roof, I've got you now.</speech>
-[[[Look at the stranger]|C1P54V11]]I look at the stranger slumped on the stairs, panting. He looks pretty tall but kinda skinny, he's wearing a trench coat or something, got light green eyes, and long black hair in a ponytail; he's soaking wet. I also notice a bat lying next to him, it's covered in walker bits.
+<action>She doesn't move.</action>
-"Thanks...", he manages to say, between breaths.
+<speech.sarah>Trust me %Tiffany%.</speech>
-"Your welcome", Lucy replies.
+<action>She looks up at me, and we lock eyes for a moment.</action>
+<action>I stare, unblinking, trying to convey confidence.</action>
+<action>She must be buying it because without looking back down, she lets go.</action>
-"My name's Charles", he says between puffs.
+<speech.sarah>Oof</speech>
-"I'm Lucy, and that's Sarah and Tiffany", she says, gesturing back down the hallway towards us.
+<action>I let out, as I take her whole body weight.</action>
-Charles jumps a little, he must not have seen me; but he quickly recovers and gives me a little slow-wave.
+<% if (!window.story.getChoice("Chapter1", "StrangerDied")) { %>
-[[We need to hide|C1P54V111]]<br>
-[[We need to get out of here|C1P54V112]]<br>
-[[We need to fortify this place|C1P54V113]]"We need to hide, and quickly. Those walkers will be on us any minute.", I say.
+<character.two>Charles</character>
-<%= window.story.customRender("F: Smash") %>I don't know how to explain to her Lucy isn't helping whoever's outside...
+ <% if (!window.story.getChoice("Chapter1", "CharlesName")) { %>
+
+ <characteroverride.two>???</characteroverride>
+
+ <% } %>
-<%= window.story.customRender("F: Let me in!") %>"She's making sure we stay safe, OK?", I reply, trying to sound reassuring.
+<speech.charles>Careful not to drop her!</speech>
-She slowly nods her head, but I think she's convinced.
+<character.one.angry.neutral.neutral-backpack>Sarah</character>
-<%= window.story.customRender("F: Let me in!") %>"She's just, um, helping someone outside, OK"?, I say.
+<action>I shoot him a dirty look, then turn my focus back to %Tiffany%.</action>
-I look back down the hallway, Lucy's looking at me, an uneasy expression on her face, but she quickly gets back to the door.
+<% } %>
-<%= window.story.customRender("F: Let me in!") %>\*Bang, bang, bang\*
+<choices>[[[Lower %Tiffany% down]|C1P60]]</choices><ui>standard</ui>
+<character.one.pain.neutral.neutral-backpack>Sarah</character>
+<character.two.confused.sad.neutral-backpack>Tiffany</character>
-That sounded like the front door.
+<action>I start to lower %Tiffany% down, crawling closer to the edge to get her further down.</action>
+<action>I stop when most of my upper body is hanging off the edge, scared I'll lose my balance.</action>
-"Hey! Anyone in here?", a man's voice shouts from the other side of the door.
+<speech.sarah>That's as far as I can go %Tiffany%.</speech>
-Shit, whoever's out there, is about to come in here!
+<action>She looks back up at me, hanging over the stairs.</action>
-Lucy takes a step back from the door and pulls her knife out.
+<speech.tiffany>I can swing myself to the top of the stairs.</speech>
-Oh fuck, what is she going to do?
+<speech.sarah>Yeah, good idea %Tiffany%.</speech>
-[[<% print (window.story.tiffany()) %> run!|C1P54V12]]<br>
-[[Lucy, be careful!|C1P54V12]]<br>
-[[Lucy, don't do it!|C1P54V12]]I take a breath to speak-
+<% if (!window.story.getChoice("Chapter1", "StrangerDied")) { %>
-\*Crash\*
+<character.two>Charles</character>
-Suddenly, the door swings open, and a man comes crashing through. Lucy gets knocked out of the way and nearly falls to the ground. The man lands on the stairs.
+ <% if (!window.story.getChoice("Chapter1", "CharlesName")) { %>
+
+ <characteroverride.two>???</characteroverride>
+
+ <% } %>
-He's pretty tall, but skinny, wearing a trench coat or something, got light green eyes, long black hair in a ponytail and he's soaking wet. He is also holding a bat.
+<speech.charles>Are you sure that's a good idea?</speech>
-He props himself up, a look of shock on his face. I don't think he knew we were in here.
+<action>I ignore him.</action>
-There's a moment of silence. His expression turns to one of anger.
+<% } %>
-"Oi, why didn't you-", the stranger starts to say angrily, but before he can finish, Lucy is back on her feet, and lunging towards him with her knife.
+<character.two.confused.sad.neutral-backpack>Tiffany</character>
-[[...|C1P54V1212]]<br>
-[[Lucy stop!|C1P54V1211]]<br>
-[[Watch out for the bat!|C1P54V1213]]"Lucy stop!", I shout at her. What the hell is she doing?!
+<action>I brace myself as best I can, then nod.</action>
+<action>She starts to swing, I slide a little but manage to otherwise stay still.</action>
-<%= window.story.customRender("F: wtf") %>I don't know what the hell she's doing, but now is not the time to interrupt.
+<speech.tiffany>Let go!</speech>
-<%= window.story.customRender("F: wtf") %>"Watch out for the bat!", I shout.
+<resetcharacter.two/>
-<%= window.story.customRender("F: wtf") %>"What the- argh, FUCK, are you doing?!", the man shouts, while tumbling around with Lucy.
+<action>I release my grip and she disappears out of view onto the patio.</action>
+<action>I wait a moment for her to say something.</action>
-Lucy has the knife right near his throat, but the man has his arms up in front of him, she can't push it close enough to get him- Suddenly the man cries out in pain: Lucy dropped the knife from one hand, caught it with the other, and took a swipe the guy's arm. Where did she learn to do that...
+<speech.sarah>You alright %Tiffany%?</speech>
-Lucy backs off, the stranger, still on the floor, crawling back down the hallway towards the living room, holding the now bleeding arm across his chest.
+<% if (!window.story.getChoice("Chapter1", "StrangerDied")) { %>
-"What the hell is wrong with you people?!", he cries out, pain in his voice.
+<character.two>Charles</character>
-Lucy takes a defensive stance, staying between us and the man.
+ <% if (!window.story.getChoice("Chapter1", "CharlesName")) { %>
+
+ <characteroverride.two>???</characteroverride>
+
+ <% } %>
-[[[Look at %Tiffany%]|C1P54V12111]]<% window.story.setChoice("Chapter1", "StrangerDied", false) %>
+<speech.charles>Yeah you good down there?</speech>
-I look over at %Tiffany%, she's got her feet up on the seat, and she's buried her head in her knees. She must be terrified. I take a step towards her-
+<% } %>
-\*Crash\*
+<character.one.pain.neutral.neutral-backpack>Sarah</character>
-Oh god is Lucy alright? I quickly look back down the hallway.
+<action>There's a moment's pause.</action>
-A hand has appeared through one of the boarded-up windows in the hallway and grabbed the stranger by his injured arm.
+<clearwait>3000</clearwait>
-"Oh god, no!", he cries out, as he gets pulled to the window, and a walker forces its head through the glass.
+<character.two.confused.sad.neutral-backpack>Tiffany</character>
-"Walkers!", Lucy shouts, as the sound of glass and wood breaking around the house starts to be heard.
+<speech.tiffany>I'm alright.</speech>
-"AAAHHH!", the man screams, as the walker takes a bite out of his arm.
+<character.one.happy.neutral.neutral-backpack>Sarah</character>
-Lucy starts running down the hallway towards us.
+<action>I let out a breath.</action>
+<action>Alright, now to figure out how to get me down there.</action>
-<%= window.story.customRender("F: You're heavy") %>"Come on %Tiffany%, we need to move", I say as I get up to her.
+<% if (!window.story.getChoice("Chapter1", "StrangerDied")) { %>
-She looks up at me, scared, but doesn't move.
+<character.two>Charles</character>
+
+ <% if (!window.story.getChoice("Chapter1", "CharlesName")) { %>
+
+ <characteroverride.two>???</characteroverride>
+
+ <% } %>
+
+<speech.charles>Can you lower me down?</speech>
-"Come on!", I repeat, but she just stares back at me.
+<character.one.angry.neutral.neutral-backpack>Sarah</character>
-We don't have time for this, I stretch my arms out toward her and beckon. She turns and puts her hands up, I grab her and pick her up. My goodness, she's heavier than she looks.
+<speech.sarah>What? No!</speech>
-I balance her properly so she's sitting on my hips, as she wraps her hands around my neck to hold herself. I take a step towards the door- oof, I forgot about my leg, this could be interesting.
+<action>I snap back.</action>
-[[[Head down the hallway]|C1P54V11111]]I get to the doorway and start down the hallway, %Tiffany% in tow. Lucy and I exchange brief glances: she looks grateful.
+<% } %>
-I'm halfway down the hallway, Lucy right behind me-
+<choices>[[[Stand up]|C1P61]]</choices><ui>standard</ui>
+<character.one.neutral.neutral.neutral-backpack>Sarah</character>
-"AAAAAHHHH!", %Tiffany% screams from behind me. Before I have a chance to stop, her arms around my neck pull back, tight. I choke and fall backward.
+<action>I get back up and step away from the edge.</action>
+<action>Alright, maybe if-</action>
-\*Smack\*
+<% if (!window.story.getChoice("Chapter1", "StrangerDied")) { %>
-I hit the ground. Argh, my leg, again! Can't catch a break... I've landed on my bad leg, and bumped my head. I quickly refocus my vision, and look around for %Tiffany%.
+<character.two>Charles</character>
-A hand has come through one of the windows and grabbed her leg, that must be why she screamed and fell. I gotta get up and-
+ <% if (!window.story.getChoice("Chapter1", "CharlesName")) { %>
+
+ <characteroverride.two>???</characteroverride>
+
+ <% } %>
-Lucy appears with her knife, takes one swipe at the hand, and detaches it from the arm it was connected to. Impressive.
+<speech.charles>Shit, watch out!</speech>
-"No time for a nap Sarah", Lucy says to me, as she helps %Tiffany% up.
+<% } %>
-"Move!", she shouts.
+<character.one.happy.angry.neutral-backpack>Sarah</character>
-She's right, this is not a good spot to be in. I manage to get on my knees, pain shooting up my leg, but I push through it and manage to stand.
+<speech.sarah>Argh!</speech>
-[[[Head for the stairs]|C1P55]]"We need to get out of, fast. Those walkers won't take long to get in here.", I say.
+<action>I instinctively cry out.</action>
-<%= window.story.customRender("F: Smash") %>"We need to fortify this place, ASAP. Those walkers will make quick work of those shitty windows.", I say.
+<% if (window.story.getChoice("Chapter1", "Haircut")) { %>
-<%= window.story.customRender("F: Smash") %>I look over at %Tiffany%, she's got her feet up on the seat, and she's buried her head in her knees. She must be terrified.
+<action>Something is grabbing my jacket!</action>
+<action>I spin around to see a walker hand flailing through the window, I instinctively take a few steps back-</action>
-"I'm coming", I hear Lucy shout from the hallway.
+<character.one.pain.angry.neutral-backpack>Sarah</character>
-<%= window.story.customRender("F: You're heavy") %>Charles looks up.
+<action>SHIT, too many steps!</action>
+<action>I step backward right off the patio roof.</action>
-"She's right", he says.
+<% } else { %>
-\*Smash\*
+<action>Something is grabbing my hair!</action>
+<action>I get pulled backward, pain shooting over my scalp.</action>
+<action>I fall down and the grip releases, looking up, I see a walker hand through the window.</action>
+<action>I roll out of the way and start to get up-</action>
+<action>Uh oh.</action>
+<action>CREEEEEEEEEEEEK-</action>
+<action>CRACK</action>
+<action>My hand, then my arm, then my whole body goes through the patio roof as it collapses inwards.</action>
+<% } %>
-A hand suddenly appears through one of the boarded-up windows in the hallway, near Charles.
+<resetcharacter.two/>
-"Walkers!", Lucy shouts, as the sound of glass and wood breaking around the house starts to be heard.
+<character.one.neutral.neutral.neutral-backpack>Sarah</character>
-"Shit!", Charles shouts.
+<clearwait>3500</clearwait>
-Lucy moves towards him to help.
+<action>I feel the strangest sense of relaxation...</action>
+<action>The air and rain rushing over me as I rapidly approach the ground.</action>
-"Head upstairs", Lucy shouts over her shoulder.
+<clearwait>1500</clearwait>
-We need to get going, now.
+<action>But it only lasts a moment.</action>
+
+<choices>[[[Hit the ground]|C1P61R1]] </choices><% window.story.redirect("C1P62", 5) %><flashback/>
+<ui>standard</ui>
+<character.one.neutral.neutral.neutral-backpack>Sarah</character>
-[[[Get %Tiffany%]|C1P54V1111]]<img.title-image>
+<speech.unknown>"Sarah? Sarah!"</speech>
-<%= window.story.customRender("Settings") %>
+<action>I groan and start to stir.</action>
+<action>I'm laying on my side, and there's someone near my face, again...</action>
+<action>Hopefully it's %Tiffany% here to offer me breakfast again...</action>
+<action>that would be nice...</action></action>
-[[Back|Title Screen]]<img.title-image>
+<action>I squint, my vision is blurry. There's a face, but... it has no eyes?</action>
-<div#title-button>
-[[Artwork|Artwork]]
-<a href="https://purpose-game.com" target="_blank">Website</a>
-<a href="https://discord.gg/jNgAEjW7gd" target="_blank">Discord</a>
-<a href="https://github.com/cm8263/Purpose" target="_blank">GitHub</a>
-</div>
+<choices>[[[Rub own eyes]|C1P63]]</choices><ui>standard</ui>
-[[Back|Title Screen]]<img.title-image>
+<character.one.neutral.neutral.neutral-backpack>Sarah</character>
-<div#title-button>
-[[Sarah|Sarah]]
-[[Tiffany|Tiffany]]
-</div>
+<action>I move my arm to my face-</action>
-[[Back|Extras]]<img.sarah-image>
+<character.one.pain.pain.neutral-backpack>Sarah</character>
-Daniel "DanDarkDesigns" Ayala<br>
-<a href="https://www.artstation.com/darkcan" target="_blank">https://www.artstation.com/darkcan</a>
+<action>AH, oh the pain!</action>
-[[Back|Artwork]]<img.tiffany-image>
+<character.one.pain.neutral.neutral-backpack>Sarah</character>
-Daniel "DanDarkDesigns" Ayala<br>
-<a href="https://www.artstation.com/darkcan" target="_blank">https://www.artstation.com/darkcan</a>
+<action>That was enough to jolt me properly awake.</action>
+<action>I'm on the ground, laying in large puddle, face to face with a walker who's crawling right towards me.</action>
+<action>I need to get up.</action>
+<action>I roll onto my back, pain shoots up my neck, holy crap does it hurt.</action>
+<action>I try to push myself up, but the pain in my arms is too great, I collapse back down again.</action>
+<action>I turn my head towards the walker-</action>
+<action>It's lunging at me!</action>
+<action>I grab its arms and hold it off, its mangled face snapping its teeth, trying to take a bite out of me.</action>
+<action>I manage to brace the walker on one arm, pain like I've never felt before radiating from it</action>
+<action>I reach down for Sarah's knife with the other arm-</action>
+<action>Oh come on, it's not there!</action>
+<action>I frantically look around for it.</action>
-[[Back|Artwork]]"%Tiffany%, listen to me: I know you don't want to accept this right now, but Sarah is gone, and unless you want...", I start to say; I was going to say unless you want to join her, but I don't want to give her any ideas.
+<% if (window.story.getChoice("Chapter1", "TiffBackstory") == "Killing") { %>
-"...unless you want to waste the sacrifice she made, <i>for you</i>, we need to go, now.", I finish.
+<action>SPLAT!</action>
-<%= window.story.customRender("F: Softening the blow") %>"Keep your voice down %Tiffany%! Those walkers are going to find their way up here soon enough, no need to encourage them.", I remark.
+<action>I splutter, the walker just vomited blood or something all over my face!</action>
+<action>The weight of the walker lifts, I push it off and wipe my face so I can see again.</action>
+<action>I look at the walker...</action>
+<action>A knife is stuck square through the middle of its head, with the end poking out of its face just next to one of its eye sockets.</action>
+<action>I look to my right, %Tiffany% is stood there, hands to her chest, a blood splatter across her face quickly being washed away by the rain.</action>
-<%= window.story.customRender("F: Softening the blow") %>"%Tiffany%, that's... that's not your mom anymore", I say, looking at her.
+<speech.sarah>%Tiffany%...</speech>
+<!-- TODO: Special of Tiffany w/ knife & blood -->
+<character.two.confused.sad.neutral-backpack>Tiffany</character>
-<%= window.story.customRender("F: Softening the blow") %>Tears run down her small face, she doesn't reply.
+<action>THUNK!</action>
-"We will mourn her later, I promise", I add, trying to soften the blow.
+<action>I look over just in time to see a walker fall off the patio roof down onto the ground, with another close behind it.</action>
-\*Creak, creak, creak\*
+<speech.sarah>We need to go.</speech>
-I look behind me to the stairs, I can hear the walkers making their way up.
+<choices>[[[Get up]|C1P64]]</choices>
-Time to move.
+<% } else { %>
-[[[Look around the hallway]|C1P57]]Pulling %Tiffany% along behind me, I start down the hallway. I stick my head through the first doorway: it looks like an office, it has a desk, a computer, some books, nothing else, and nothing useful.
+<action>There, it's just behind me, but out of reach.</action>
+<action>%Tiffany%, I need %Tiffany%'s help! </action>
+<action>Where is she?</action>
+<action>I look for her...</action>
+<action>There!</action>
+<action>She's hiding behind a tree near the edge of the garden.</action>
-I hobble down to the next door, this one is a bedroom; it has a bed frame but no mattress, a wardrobe, and a cupboard. The cupboard door is open, I can see a few clothes hanging, but no weapons or tools to help get us out of here.
+<speech.sarah>%Tiffany%- help me!</speech>
-I head for the final door, it's closed. I open the door, another bedroom; two mattresses on the floor, backpacks in the corner of the room, a pair of clothes sitting on top of a dresser... this must be where %Tiffany% and Sarah were sleeping.
+<action>Reluctantly she steps out from behind the tree and approaches.</action>
-I look down at %Tiffany%, she still has tears running down her face, but she looks otherwise emotionless. I don't know if that's good or bad considering the circumstances.
+<choices>
+ [[Push it off!|C1P63V1]]
+ [[Use the knife!|C1P63V2]]
+ [[Get me the knife!|C1P63V3]]
+</choices>
+<% } %><ui>standard</ui>
+<character.one.neutral.neutral.neutral-backpack>Sarah</character>
-[[[Look at the backpacks]|C1P58]]I step into the room and go over to the backpacks.
+<action>I go over to the table and rip the net off one of the clamps.</action>
+<action>Then I remove the clamp from the table; it's got some weight to it...</action>
+<action>Perfect.</action>
+<action>I walk back over to the window.</action>
-One is a black sling backpack, with a single strap that connects with a clip in the middle; must have been Sarah's.
+<%= window.story.render("F: The window shatters") %><character.two.sad.neutral.neutral-backpack>Tiffany</character>
-I look at the other one, it's a smaller white backpack, with a teddy bear strapped to the side... %Tiffany%'s...
+<speech.sarah>Step back %Tiffany%.</speech>
-I pick up the sling backpack and strap it on, then pick up the white one.
+<action>She shuffles back a few steps, not far enough for my liking.</action>
+<action>I step in front of her.</action>
+<action>Then take aim, and swing; throwing it at the window.</action>
+<action>The window shatters, then falls apart, leaving only the frame remaining.</action>
+<action>A strong gust of wind blows through, and rain starts dripping in.</action>
-"Put this on %Tiffany%", I say. She just stares back at me, blank.
+<% if (!window.story.getChoice("Chapter1", "StrangerDied")) { %>
-We don't have time for this.
+<character.two>Charles</character>
-I spin her around, as gently as I can, and put the backpack on her. %Tiffany% acting limp as I put her arms through the small straps.
+ <% if (!window.story.getChoice("Chapter1", "CharlesName")) { %>
+
+ <characteroverride.two>???</characteroverride>
+
+ <% } %>
-I quickly look around for anything else useful: there's nothing.
+<speech.charles>Nicely done.</speech>
-[[[Leave the room]|C1P58A1]]Hello!
+<% } %>
-Thanks for poking around the source code. For starters, if you're looking at this in your browser, or you've downloaded the HTML file from itch.io, the source code is freely available on GitHub, so go get it from there instead: https://github.com/cm8263/Purpose
+<action>THUD, THUD, THUD</action>
+<action>I look over my shoulder-</action>
-It goes without saying that there may be spoilers in here, either in passages you might not have seen or in the developer reference passages. Also, taking a look under the hood can ruin the magic, so, fair warning.
+<character.one.angry.neutral.neutral-backpack>Sarah</character>
-All that out of the way, have fun, and feel free to leave PRs on GitHub with improvements!
+<action>Walkers!</action>
+<action>They've made it up the stairs, and they're headed down the hallway towards us.</action>
-- ChristopherThat stupid soap bar, perfect! I take it out of my pocket, still hard as a rock: just what I need.
+<% if (!window.story.getChoice("Chapter1", "StrangerDied")) { %>
-<%= window.story.customRender("F: The window shatters") %>I step out onto the patio roof behind %Tiffany%, it's bucketing rain out here, I can barely see, and it's pretty windy too. I shield my eyes from the rain and look down at the garden, it's clear of walkers, good.
+<action>The stranger sees them too.</action>
-<% if (!window.story.getChoice("Chapter1", "StrangerDied")) { %>
+<speech.charles>Shit...</speech>
-"Well now what?", the stranger shouts over the rain. Gee, give us a second, will you?
+<action>He goes to the remnants of the window and steps through.</action>
+<action>Nice of him to wait for us...</action>
<% } %>
-I look around for a good way to get down off the roof... I don't see anything that would help us get down. I could lower %Tiffany% down alright, but how would I get down? Shit, one problem at a time.
+<character.two.sad.neutral.neutral-backpack>Tiffany</character>
-"%Tiffany%, come over here, I'm going to lower you down", I shout over the rain.
+<speech.sarah>Time to go %Tiffany%.</speech>
-We step over towards the edge of the roof, the stairs leading up to the patio directly below us.
+<action>I say, turning to face her.</action>
+<action>She looks absolutely miserable, but I can't do anything about that right now.</action>
+<action>I take her hand again and go back to the window.</action>
-"How are you going to get me down there?", she whimpers in response, I can barely hear her, but at least she's speaking again.
+<speech.sarah>Step through, watch your head.</speech>
-"You're going to start to climb down, then I'm going to hold your hands and lower you the rest of the way", I reply.
+<action>%Tiffany% complies, without saying a word.</action>
-"I can't do that", she says, looking at me with her piercing blue eyes wide open.
+<resetcharacter.two/>
-[[You need to|C1P59V11]]<br>
-[[Yes you can, it's not so bad|C1P59V12]]<br>
-[[%Tiffany%, less talking, more doing|C1P59V13]]"I know this is scary %Tiffany%, but you need to, or else the walkers are going to get us", I state.
+<action>I take one last look over my shoulder...</action>
-<%= window.story.customRender("F: Lowering") %>"Yes you can %Tiffany%, it's not as bad as it looks, I promise", I say reassuringly.
+<choices>[[[Step through the window]|C1P59]]</choices><ui>standard</ui>
-<%= window.story.customRender("F: Lowering") %>"Less talking, more doing %Tiffany%. The sooner you start, the sooner you finish" I state.
+<character.one.neutral.neutral.neutral-backpack>Sarah</character>
+<character.two.confused.sad.neutral-backpack>Tiffany</character>
-<%= window.story.customRender("F: Lowering") %>She looks away from me and down at the edge of the roof, then slowly nods her head.
+<% if (!window.story.getChoice("Chapter1", "TiffBackstory") == "Killing") { %>
-"Ok, good. <i>Carefully</i> climb off the edge, then hang onto it, and I'll grab you, OK?", I say. %Tiffany% precariously lowers herself off the roof.
+<speech.sarah>Well done %Tiffany%</speech>
-"Mmmmm", she murmurs nervously.
+<action>I say, breathless.</action>
+<action>She looks a bit shaken.</action>
-I slowly start to lay flat on the roof.
+<% } %>
-"It's alright, I'm right here. Just hang on tight, it's slippery", I remark.
+<character.one.pain.pain.neutral-backpack>Sarah</character>
-"Ok, grab me, grab me now!", she squeaks.
+<action>I force myself up off the ground, pain screaming from every part of my body.</action>
-"I got you, I got you", I say, as I crawl forward and grab her by the wrists.
+<% if (window.story.getChoice("Chapter1", "TiffBackstory") == "Killing") { %>
-"Alright, you need to let go, I've got you. Trust me", I state.
+<action>I pull the knife out of the walker's head.</action>
-She looks up at me, we lock eyes for a moment. I stare, unblinking, trying to convey confidence. She must be buying it because without looking back down, she lets go.
+<% } else { %>
-"Oof", I let out, as I take her whole body weight.
+<action>I take %Tiffany%'s hand.</action>
-<% if (!window.story.getChoice("Chapter1", "StrangerDied")) { %>
+<% } %>
-"Careful not to drop her!", the stranger remarks.
+<character.one.neutral.neutral.neutral-backpack>Sarah</character>
-I shoot him a dirty look, then turn my focus back to %Tiffany%.
+<action>Looking around, the house is a no-go, which only leaves the way I came in originally, the back wall.</action>
-<% } %>
+<% if (!window.story.getChoice("Chapter1", "StrangerDied")) { %>
-[[[Lower %Tiffany% down]|C1P60]]I start to lower %Tiffany% down, crawling closer to the edge to get her further down. I stop when most of my upper body is hanging off the edge, scared I'll lose my balance.
+<character.two>Charles</character>
-"That's as far as I can go %Tiffany%", I say, as she looks back up at me, hanging over the stairs.
+ <% if (!window.story.getChoice("Chapter1", "CharlesName")) { %>
+
+ <characteroverride.two>???</characteroverride>
+
+ <% } %>
-"I can swing myself to the top of the stairs", %Tiffany% says.
+<speech.charles>Hey, you alright?</speech>
-"Yeah, good idea %Tiffany%", I reply.
+<action>He says coming up from behind us.</action>
-<% if (!window.story.getChoice("Chapter1", "StrangerDied")) { %>
+<speech.sarah>Where the hell were you?</speech>
-"Are you sure that's a good idea?", the stranger asks.
+<speech.charles>I had to climb down a drainpipe to get off the roof.</speech>
+<speech.charles>I wasn't so keen on your rapid decent option.</speech>
-I ignore him.
+<action>I roll my eyes.</action>
-<% } %>
+<speech.sarah>We're going over the back wall.</speech>
-I brace myself as best I can, then nod. She starts to swing, I slide a little but manage to otherwise stay still.
+<speech.charles>Yeah, alright, good idea.</speech>
-"Let go!", she says, I release my grip and she disappears out of view onto the patio. I wait a moment for her to say something.
+<action>He replies as he starts heading towards it.</action>
-"You alright %Tiffany%?", I ask.
+<% } %>
-<% if (!window.story.getChoice("Chapter1", "StrangerDied")) { %>
+<character.two.confused.sad.neutral-backpack>Tiffany</character>
-"Yeah you good down there?", the stranger adds.
+<% if (window.story.getChoice("Chapter1", "Kicked")) { %>
+
+<action>I look back at the house.</action>
+<action>The back door is wide open, and walkers are making their way down the patio steps.</action>
+<action>Guess that doorstop didn't pose much of an obstacle to them.</action>
<% } %>
-There's a moment's pause.
+<action>I start towards the back wall, pulling %Tiffany% along behind me.</action>
+<action>As we get towards it, I feel more resistance on my arm from %Tiffany%...</action>
+<action>...she's trying to get me to stop.</action>
+<action>I comply and face her.</action>
-"I'm alright", she replies.
+<character.two.sad.sad.neutral-backpack>Tiffany</character>
-I let out a breath, alright, now to figure out how to get me down there.
+<speech.sarah>What, what's wrong?</speech>
-<% if (!window.story.getChoice("Chapter1", "StrangerDied")) { %>
+<action>I say quickly, wary of the walkers slowly approaching from our rear.</action>
-"Can you lower me down?", the stranger asks.
+<speech.tiffany>We have to go back for mom.</speech>
+<speech.tiffany>We can't leave her there with all the monsters!</speech>
-"What? No!", I snap back.
+<action>Tears again budding in the corners of her big blue eyes.</action>
-<% } %>
+<choices>
+ [[I know how you feel|C1P64V1]]
+ [[We will end up dead too|C1P64V2]]
+ [[Now is not the time %Tiffany%!|C1P64V3]]
+</choices><ui>standard</ui>
-[[[Stand up]|C1P61]]<% window.story.delayedText(15 * 1000) %>
+<character.one.neutral.neutral.neutral-backpack>Sarah</character>
+<character.two.sad.sad.neutral-backpack>Tiffany</character>
-I get back up and step away from the edge.
+<action>I painfully drop down on one knee to be at eye level with her.</action>
-Alright, maybe if-
+<speech.sarah>%Tiffany%, believe me, I know exactly how you are feeling right now.</speech>
+<speech.sarah>But I need you to be brave like your mom was, can you do that for me?</speech>
-<% if (!window.story.getChoice("Chapter1", "StrangerDied")) { %>
+<%= window.story.render("F: Look behind") %><ui>standard</ui>
-"Shit, watch out!", the stranger shouts.
+<character.one.neutral.neutral.neutral-backpack>Sarah</character>
+<character.two.sad.sad.neutral-backpack>Tiffany</character>
-<% } %>
+<action>I painfully drop down on one knee to be at eye level with her.</action>
+<action>Gently, I grab both her shoulders and look her directly in the eyes. </action>
-"Argh!", I let out.
+<speech.sarah>%Tiffany%, I understand you are processing a lot of emotions right now...</speech>
+<speech.sarah>...but unless you and I get over that wall, you're not going to be alive to process them.</speech>
-<% if (window.story.getChoice("Chapter1", "Haircut")) { %>
+<%= window.story.render("F: Look behind") %><ui>standard</ui>
-Something is grabbing my jacket! I spin around to see a walker hand flailing through the window, I instinctively take a few steps back- SHIT, too many steps! I step backward right off the patio roof.
+<character.one.angry.neutral.neutral-backpack>Sarah</character>
+<character.two.sad.sad.neutral-backpack>Tiffany</character>
-<% } else { %>
+<speech.sarah>%Tiffany%, now is not the time!</speech>
+<speech.sarah>I'm so, so sorry that your mom is dead...</speech>
+<speech.sarah>...but unless you want to end up just like her, we need to get over this wall.</speech>
-Something is grabbing my hair! I get pulled backward, pain shooting over my scalp. I fall down and the grip releases, looking up, I see a walker hand through the window. I roll out of the way and start to get up- uh oh.
+<character.two.confused.sad.neutral-backpack>Tiffany</character>
-\* Creeeeeeak, crack \*
+<action>She stares back at me, a lick of anger visible across her face.</action>
-My hand, then my arm, then my whole body goes through the patio roof as it collapses inwards.
+<character.one.sad.neutral.neutral-backpack>Sarah</character>
-<% } %>
+<action>Shit, this isn't working...</action>
+<action>I painfully drop down on one knee to be level with her. </action>
-<div-#delayed>
+<%= window.story.render("F: Look behind") %><action>I look behind her, walkers are fast approaching.</action>
+<action>We really need to get moving.</action>
-I feel the strangest sense of relaxation... the air and rain rushing over me as I rapidly approach the ground. But it only lasts a moment.
-
-[[[Hit the ground]|C1P61R1]]
+<character.one.sad.neutral.neutral-backpack>Sarah</character>
+<character.two.sad.sad.neutral-backpack>Tiffany</character>
-</div><% window.story.redirect("C1P62", 5) %><i>"Sarah? Sarah!"</i>, a voice yells, somewhere far away. I groan and start to stir.
+<speech.sarah>Look, %Tiffany%, when my sister died... I was a wreck.</speech>
+<speech.sarah>I didn't know what to do, and it took a long time for me to come to terms with what happened.</speech>
+<speech.sarah>Honestly, I'm still processing it to this day.</speech>
+<speech.sarah>I know you don't care about anything else at the moment but your mom, but try to understand that your mom died so you could live.</speech>
+<speech.sarah>Don't let her death be for nothing, please.</speech>
-I'm laying on my side, and there's someone near my face, again... Hopefully it's %Tiffany% here to offer me breakfast again... that would be nice...
+<action>We continue to stare at each other.</action>
+<action>The walkers nearly on us now.</action>
+<action>Rain soaking us both.</action>
-I squint, my vision is blurry. There's a face, but... it has no eyes?
+<clearwait>2000</clearwait>
-[[[Rub own eyes]|C1P63]]I move my arm to my face- AH, oh the pain! That was enough to jolt me properly awake. I'm on the ground, laying in large puddle, face to face with a walker who's crawling right towards me.
+<action>I can't leave her here, I just can't, I wouldn't be able to live with myself.</action>
-I need to get up. I roll onto my back, pain shoots up my neck, holy crap does it hurt. I try to push myself up, but the pain in my arms is too great, I collapse back down again. I turn my head towards the walker- it's lunging at me!
+<choices>[[[Pled with %Tiffany%]|C1P65]]</choices><ui>standard</ui>
-I grab its arms and hold it off, its mangled face snapping its teeth, trying to take a bite out of me. I manage to brace the walker on one arm, pain like I've never felt before radiating from it; I reach down for Sarah's knife with the other arm- oh come on, it's not there! I quickly look around for it-
+<character.one.sad.neutral.neutral-backpack>Sarah</character>
+<character.two.sad.sad.neutral-backpack>Tiffany</character>
-<% if (window.story.getChoice("Chapter1", "TiffBackstory") == "Killing") { %>
+<speech.sarah>Please, %Tiffany%...</speech>
-\* Splat \*
+<action>I say, exhausted.</action>
+<action>I look behind her again, scores of walkers are approaching.</action>
+<action>I'm chilled to the bone thanks to this rain, and barely have the strength to walk.</action>
+<action>I can't take on those walkers, even with Lucy's knife, nor can I force %Tiffany% to go anywhere.</action>
-I splutter, the walker just vomited blood or something all over my face! The weight of the walker lifts, I push it off and wipe my face so I can see again. I look at the walker... a knife is stuck square through the middle of its head, with the end poking out of its face just next to one of its eye sockets. I look to my right, %Tiffany% is stood there, hands to her chest, a blood splatter across her face quickly being washed away by the rain.
+<clearwait>1000</clearwait>
-"%Tiffany%...", I start.
+<action>I can't leave her, and she won't leave...</action>
+<action>...so I guess we're both dying here today.</action>
-\* Thunk \*
+<resetcharacter.one/>
+<resetcharacter.two/>
-I look over just in time to see a walker fall off the patio roof down onto the ground, with another close behind it.
+<action>I sigh, close my eyes, and lower my head.</action>
-"We need to go", I say back to %Tiffany%.
+<clearwait>1000</clearwait>
-[[[Get up]|C1P64]]
+<action>I can hear the walkers all around us now.</action>
+<action>Their collective drones making an almost musical sound when paired with the sound of the rain.</action>
-<% } else { %>
-There, it's just behind me, but out of reach. %Tiffany%, I need %Tiffany%'s help! Where is she?
+<clearwait>3000</clearwait>
-I look for her... there! She's hiding behind a tree near the edge of the garden.
+<action>Oof.</action>
+<action>One of the walkers has grabbed me.</action>
+<action>Their firm arms wrapped around me...</action>
+<action>...head on my neck, preparing to take a bite...</action>
-"%Tiffany%- help!", I manage to shout.
+<clearwait>2000</clearwait>
-Reluctantly she steps out from behind the tree and approaches.
+<!-- TODO: SFX here -->
+<action>SNIFFLE</action>
+<action>Huh?</action>
+<action>I open my eyes-</action>
-[[Push it off!|C1P63V1]]<br>
-[[Use the knife!|C1P63V2]]<br>
-[[Get me the knife!|C1P63V3]]
-<% } %>I go over to the table, rip the net off one of the clamps, then remove the clamp from the table; it's got some weight to it: perfect. I walk back over to the window.
+<character.one.happy.neutral.neutral-backpack>Sarah</character>
+<character.two.sad.sad.neutral-backpack>Tiffany</character>
-<%= window.story.customRender("F: The window shatters") %>"Step back %Tiffany%", I say. She shuffles back a few steps, not far enough for my liking; I step in front of her. I take aim, and swing, throwing it at the window.
+<action>It's not a walker, it's %Tiffany%!</action>
+<action>And she's crying.</action>
-The window shatters, then falls apart, leaving only the frame remaining. A strong gust of wind blows through, and rain starts dripping in.
+<speech.tiffany>I'm sorry...</speech>
-<% if (!window.story.getChoice("Chapter1", "StrangerDied")) { %>
+<action>She whispers into my ear.</action>
-"Nicely done", the stranger remarks.
+<character.one.happy.happy.neutral-backpack>Sarah</character>
-<% } %>
+<action>I can't help but smile.</action>
-\*Thud, thud, thud\*
+<speech.sarah>Don't worry, everything will be alright.</speech>
-I look over my shoulder- walkers! They've made it up the stairs, and they're headed down the hallway towards us.
+<choices>[[[Pick %Tiffany% up]|C1P66]]</choices><ui>standard</ui>
-<% if (!window.story.getChoice("Chapter1", "StrangerDied")) { %>
+<character.one.neutral.neutral.neutral-backpack>Sarah</character>
+<character.two.confused.sad.neutral-backpack>Tiffany</character>
-The stranger sees them too.
+<action>With a new found strength, I hold %Tiffany% and push myself up off my knee.</action>
-"Shit", he mutters. He goes to the window and steps through. Nice of him to wait for us...
+<character.one.pain.neutral.neutral-backpack>Sarah</character>
-<% } %>
+<action>I topple and nearly fall, but manage to recover.</action>
+<action>Walkers have us mostly surrounded now, leaving the back wall as the only escape route.</action>
+<action>I hastily carry %Tiffany% the last few meters to the wall, then stop.</action>
-"Time to go %Tiffany%", I say, turning to face her. She looks absolutely miserable, but I can't do anything about that right now. I take her hand again and go back to the window.
+<speech.sarah>%Tiffany%, I need you to climb to the top of the wall, okay?</speech>
-"Step through, watch your head", I say. %Tiffany% complies, without saying a word. I take one last look over my shoulder...
+<speech.tiffany>But I'm too small.</speech>
-[[[Step through the window]|C1P59V1]]<% if (!window.story.getChoice("Chapter1", "TiffBackstory") == "Killing") { %>
+<speech.sarah>Don't worry, I'm going to give you a boost up, but you need to do the rest.</speech>
-"Well done %Tiffany%", I say, breathless. She looks a bit shaken.
+<action>I look over my shoulder, we only have seconds.</action>
-<% } %>
+<speech.sarah>We're only going to get one shot at this, are you ready?</speech>
-I force myself up off the ground, pain screaming from every part of my body. <% if (window.story.getChoice("Chapter1", "TiffBackstory") == "Killing") { print(`I pull the knife out of the walker's head, and`) } else { print(`I take %Tiffany%'s hand and`) } %> look around: the house is a no-go, which only leaves the way I came in originally, the back wall.
+<action>She takes a deep breath.</action>
-<% if (!window.story.getChoice("Chapter1", "StrangerDied")) { %>
+<speech.tiffany>Ready</speech>
-"Hey, you alright?", the stranger says, coming up from behind us.
+<choices>[[[Boost %Tiffany% up]|C1P67]]</choices><ui>standard</ui>
-"Where the hell were you?", I ask.
+<character.one.pain.neutral.neutral-backpack>Sarah</character>
+<character.two.confused.sad.neutral-backpack>Tiffany</character>
-"I had to climb down a drainpipe to get off the roof, I wasn't so keen on your rapid decent option", he replies.
+<action>I bend my knees, then shove %Tiffany% as high as I can manage.</action>
-I roll my eyes.
+<character.one.pain.pain.neutral-backpack>Sarah</character>
-"We're going over the back wall", I say.
+<action>A crippling pain shoots up my back-</action>
+<action>I don't get her up as far as I thought I could.</action>
+<action>But she manages to grab the top of the wall with her little hands.</action>
-"Yeah, alright, good idea", he replies as he starts heading towards it.
+<speech.sarah>Good girl %Tiffany%!</speech>
+<speech.sarah>Now climb, climb!</speech>
-<% } %>
+<action>I grab her dangling legs and push her up.</action>
+<action>Between my pushing and her climbing, she is able to lay flat on top of the wall.</action>
+<action>She spins around and looks back down at me.</action>
-<% if (window.story.getChoice("Chapter1", "Kicked")) { %>
+<speech.tiffany>Look out!</speech>
-I look back at the house. The back door is wide open, and walkers are making their way down the patio steps. Guess that doorstop didn't pose much of an obstacle to them.
+<character.two.scared.scared.scared-backpack>Tiffany</character>
-<% } %>
+<resetcharacter.two/>
-I start towards the back wall, pulling %Tiffany% along behind me. As we get to it, I feel more resistance on my arm from %Tiffany%: she's trying to get me to stop. I comply and face her.
+<action>I swing around: a walker is reaching out of me, only a meter away.</action>
-"What, what's wrong?", I say quickly, wary of the walkers slowly approaching from our rear.
+<character.one.fighting.fighting.fighting-backpack>Sarah</character>
-"We have to go back for mom, we can't leave her here with the monsters!", she says, tears again budding in the corners of her big blue eyes.
+<action>I pull out Lucy's knife and take a swing at the arm.</action>
+<action>The knife connects, and I manage to take part of the rotting arm off from the rest of the body.</action>
+<action>The walker is up in my face now.</action>
+<action>Instinctively, I contract my arm and then swing hard at the walker.</action>
+<action>My hand hits the side of the walker's head.</action>
+<action>I would imagine that should have hurt, but I'm in so much pain right now, I don't even feel it.</action>
+<action>The force is enough to knock the walker's jaw off its head and cause it to stumble into another walker next to it.</action>
-[[I know how you feel|C1P64V1]]<br>
-[[We will end up dead too|C1P64V2]]<br>
-[[Now is not the time %Tiffany%!|C1P64V3]]I painfully drop down on one knee to be level with her.
+<character.two.scared.scared.scared-backpack>Tiffany</character>
-"%Tiffany%, believe me, I know exactly how you are feeling right now, but I need you to be brave like your mom was", I say to her.
+<speech.tiffany>Come on!</speech>
-<%= window.story.customRender("F: Look behind") %>I painfully drop down on one knee to be level with her, then gentle grab both of her shoulders and look her directly in the eyes.
+<action>Walkers are approaching me from all angles: it's now or never.</action>
-"%Tiffany%, I understand you are processing a lot of emotions right now, but unless you and I get over that wall, you're not going to be alive to process them", I say to her.
+<choices>[[[Climb the wall]|C1P68]]</choices><ui>standard</ui>
-<%= window.story.customRender("F: Look behind") %>"%Tiffany%, now is not the time! I'm so, so sorry that your mom is dead, but unless you want to end up just like her, we need to get over this wall.", I say to her.
+<character.one.pain.pain.neutral-backpack>Sarah</character>
+<character.two.scared.scared.scared-backpack>Tiffany</character>
-She stares back at me, a lick of anger visible across her face. Shit, this isn't working...
+<action>I spin around, and with the last of my strength, jump.</action>
+<action>I grab the top of the wall and begin to worm my way up, but it's slippery from the rain.</action>
-I painfully drop down on one knee to be level with her.
+<character.two.confused.sad.neutral-backpack>Tiffany</character>
-<%= window.story.customRender("F: Look behind") %>I look behind her, walkers fast approaching. We really need to get moving.
+<action>I feel %Tiffany% grabbing my hoodie trying to help pull me up, but I'm far too heavy for her.</action>
+<action>Halfway up I feel hands grabbing at my feet.</action>
+<action>Without looking, I kick out and try to use my feet to get a better grip on the wall.</action>
+<action>Shit- one of the walkers has grabbed my leg!</action>
-"Look, %Tiffany%, when my sister died, I was a wreck: I didn't know what to do, and it took a long time for me to come to terms with what happened; I'm still processing it to this day", I explain to her.
+<choices>[[[Push against walker]|C1P69]]</choices><ui>standard</ui>
-"I know you don't care about anything else in the world at the moment except your mom, but try to understand that your mom died so you could live. Don't let her death be in vain", I say, trying to reason her.
+<character.one.pain.pain.neutral-backpack>Sarah</character>
+<character.two.confused.sad.neutral-backpack>Tiffany</character>
-We continue to stare at each other, the walkers nearly on us now, rain soaking us both. I can't leave her here, I just can't, I wouldn't be able to live with myself.
-[[[Pled with %Tiffany%]|C1P65]]<%
-window.story.delayedText(27 * 1000, "one");
-window.story.delayedText(35 * 1000, "two");
-%>
+<action>I lean back slightly and push myself up using the walker as a stepping stone.</action>
+<action>I swing myself up, past %Tiffany%, and over onto the other side.</action>
-"Please, %Tiffany%", I say, exhausted.
+<resetcharacter.two/>
-I look behind her again, scores of walkers are approaching. I'm chilled to the bone thanks to this rain, and barely have the strength to walk; I can't take on those walkers, even with Lucy's knife, nor can I force %Tiffany%. I can't leave her, and she won't leave: so I guess we're both dying here today. I sigh, close my eyes, and lower my head.
+<action>I land awkwardly and fall to the ground.</action>
-I can hear the walkers all around us now, their collective drones making an almost musical sound when paired with the sound of the rain...
+<character.two.neutral.neutral.neutral-backpack>Tiffany</character>
-<div-#one>
+<action>%Tiffany% jumps down and lands gracefully beside me.</action>
+<action>I lay for a moment...</action>
-Oof, one of the walkers has grabbed me. Their firm arms wrapped around me, their head on my neck, likely preparing to take a bite...
+<character.one.pain.happy.neutral-backpack>Sarah</character>
-</div>
+<action>Even though every inch of my body is screaming in pain, I manage to let a little chuckle out.</action>
-<div-#two>
+<speech.sarah>Holy shit...</speech>
-\* Sniffle \*
+<character.two.happy.happy.neutral-backpack>Tiffany</character>
-Huh? I open my eyes- it's not a walker, it's %Tiffany%... and she's crying.
+<speech.tiffany>Swear!</speech>
-"I'm sorry", %Tiffany% whispers.
+<action>I can hear the grin in her voice.</action>
-I smile.
+<% if (!window.story.getChoice("Chapter1", "StrangerDied")) { %>
-"Don't worry, everything will be alright", I reply softly.
+<character.two>Charles</character>
-[[[Pick %Tiffany% up]|C1P66]]
+ <% if (!window.story.getChoice("Chapter1", "CharlesName")) { %>
+
+ <characteroverride.two>???</characteroverride>
+
+ <% } %>
-<div-#two>
-I muster all my strength and push myself up off my knee. I topple and nearly fall, but manage to recover. Walkers have us mostly surrounded now, the only option is the back wall.
+<speech.charles>Hey, what took you guys so long?</speech>
-I hastily carry %Tiffany% the last few meters to the wall, then stop.
+<% } %>
-"%Tiffany%, I need you to climb to the top of the wall, okay?", I say.
+<clearwait>3000</clearwait>
-"But I'm too small", she replies.
+<character.two.happy.neutral.neutral-backpack>Tiffany</character>
-"I'm going to give you a boost up, but you need to do the rest", I reply.
+<speech.tiffany>So, what do we do now?</speech>
-I look over my shoulder, we only have seconds.
+<choices>[[Continue|C1 End]]</choices><ui>minimal</ui>
-"We're only going to get one shot at this, are you ready?", I ask.
+<action>Chapter One</action>
+<action>Poor Choices</action>
-She takes a deep breath.
+<!-- <choices>[[Continue|C1 Achievements]]</choices> -->
+<choices>[[Continue|C1 Credits]]</choices><% window.story.loadStats() %>
-"Ready", %Tiffany% says.
+<span#statsLoading>Loading...</span>
-[[[Boost %Tiffany% up]|C1P67]]I bend my knees, then shove %Tiffany% as high as I can manage. A crippling pain shoots up my back, I don't get her as far as I thought I could. She manages to grab the top of the wall with her little hands.
+<div-#statsContainer></div>
-"Good girl %Tiffany%! Now climb!", I exclaim, as I grab her dangling legs and push her up.
+[[Continue|C1 Credits]]<img.title-image>
-Between my pushing and her climbing, she is able to lay flat on top of the wall. She spins around and looks back down at me.
+<span>Loading Save...</span><span#achievementsLoading>Loading...</span>
-"Look out!", she screams.
+<div-#achievementsContainer>
+ <span#achievementsCounter></span>
+ <hr>
+</div>
-I swing around: a walker is reaching out of me, only a meter away. I pull out Lucy's knife and take a swing at the arm. The knife connects, and I manage to take part of the rotting arm off from the rest of the body.
+[[Continue|C1 Statistics]]
-The walker is up in my face now. Instinctively, I contract my arm and then swing hard at the walker's head. My hand hits the side of the walker's head; I would imagine that should have hurt, but I'm in so much pain right now, I don't even feel it. The force is enough to knock the walker's jaw away from its head and cause it to stumble into another walker behind it.
+<% window.story.loadAchievements() %><%= window.story.render("Credits") %>
-"Come on!", %Tiffany% shouts from behind me.
+[[Continue|C2 Intro]]<ui>standard</ui>
+<character.one.pain.neutral.neutral-backpack>Sarah</character>
+<character.two.sad.neutral.neutral-backpack>Tiffany</character>
-Walkers are approaching me from all angles: it's now or never.
+<action>We exit the room and go to the end of the hallway, there's a games room of sorts.</action>
+<action>There's a table tennis table in the middle of the open space, a sofa and TV in the corner, and also a large circular window: that's where the light was coming from.</action><character.one.pain.neutral.neutral-backpack>Sarah</character>
+<resetcharacter.two/>
-[[[Climb the wall]|C1P68]]I spin around, and with the last of my strength, jump. I grab the top of the wall and begin to worm my way up. It's slippery from the rain, I feel %Tiffany% grabbing my hoodie trying to help pull me up, but I'm far too heavy for her.
+<action>I go over to the window and take a closer look.</action>
+<action>The rain outside is really heavy now, it's hard to see more than a few meters.</action>
+<action>On the other side of the window is the patio roof, that might be our ticket out of here, if I can find a way to get this window open...</action>
+<action>CREAK CREAK, CREAK, CREAK CREAK</action>
+<action>Crap, the stairs behind us, no time to waste.</action>
+<action>I look at the window frame, it doesn't look like it was designed to be opened.</action>
-Halfway up I feel hands grabbing at my feet. Without looking, I kick out and try to use my feet to get a better grip on the wall. Shit- one of the walkers has grabbed my leg!
+<% if (!window.story.getChoice("Chapter1", "Kicked")) { %>
-[[[Push against walker]|C1P69]]<% window.story.delayedText(25 * 1000) %>
+<action>That's alright though, I'm already a window opening expert.</action>
-I lean back slightly and push myself up using the walker as a stepping stone. I swing myself up, past %Tiffany%, and over onto the other side. I land awkwardly and fall to the ground. %Tiffany% jumps down and lands gracefully beside me.
+<% } %>
-I lay for a moment; even though every inch of my body is screaming in pain, I manage to let a little chuckle out.
+<% if (window.story.getChoice("Chapter1", "Soap")) { %>
-"Holy shit", I say.
+<action>I feel around in my pockets for anything useful...</action>
-"Swear", %Tiffany% replies; I can hear the grin in her voice.
+<choices>[[[Feel hard object]|C1P58V11]]</choices>
-<% if (!window.story.getChoice("Chapter1", "StrangerDied")) { %>
+<% } else { %>
-"Hey, what took you guys so long?", the stranger says, walking over.
+<action>I look around for something to break the glass with...</action>
+<action>The table tennis table has a clamp on either side holding the net up, they look pretty solid.</action>
-<% } %>
+<choices>[[[Use Clamp]|C1P58V12]]</choices>
-<div-#delayed>
+<% } %><%= window.story.render("F: Games Room") %>
-"So, what do we do now?", she asks.
+<% if (!window.story.getChoice("Chapter1", "StrangerDied")) { %>
-[[Continue|C1 End]]
+<%= window.story.render("F: Stranger Alive") %>
-</div><%
-window.story.delayedText(2000, "one", 500);
-window.story.delayedText(5000, "two", 500);
-window.story.delayedText(8000, "three", 500);
-%>
+<% } %>
-<div-#one>
-<h1>Chapter One</h1>
+<%= window.story.render("F: The window") %><character.two>Charles</character>
-</div>
+<% if (window.story.getChoice("Chapter1", "LucySavesStranger")) { %>
-<div-#two>
-<h3>Poor Choices</h3>
-</div>
+<action>Charles is standing at the window.</action>
+<action>He turns around and faces us.</action>
-<div-#three>
-[[Continue|C1 Achievements]]
-</div><% window.story.loadStats() %>
+<speech.charles>Hey, are you guys okay?</speech>
-<span#statsLoading>Loading...</span>
+<action>He looks past us.</action>
-<div-#statsContainer></div>
+<speech>Where's the other lady?</speech>
-[[Continue|C1 Credits]]<img.title-image>
+<action>I shake my head slowly.</action>
-<span>Loading Save...</span><% window.story.loadAchievements() %>
+<speech.charles>Shit...</speech>
+<speech.charles>Sorry for uh, your loss.</speech>
-<span#achievementsLoading>Loading...</span>
+<speech.sarah>Thanks...</speech>
+<speech.sarah>We need to get out of here, any ideas?</speech>
-<div-#achievementsContainer>
- <span#achievementsCounter></span>
- <hr>
-</div>
+<speech.charles>I'm with you on that.</speech>
-[[Continue|C1 Statistics]]<%= window.story.customRender("Credits") %>
-[[Continue|C2 Intro]]We exit the room and go to the end of the hallway, there's a games room of sorts. There's a table tennis table in the middle of the open space, a sofa and TV in the corner, and there's also a large circular window: that's where the light was coming from.I go over to the window and take a closer look; the rain outside is really heavy now, it's hard to see more than a few meters. On the other side of the window is the patio roof, that might be our ticket out of here, if I can find a way to get this window open...
+<% } else if (!window.story.getChoice("Chapter1", "SaveStranger")) { %>
-\*Creak creak, creak, creak creak\*
+<action>The stranger is standing next to the window.</action>
-The stairs behind us, no time to waste. I look at the window frame, it doesn't look like it was designed to be opened<% if (!window.story.getChoice("Chapter1", "Kicked")) { print(", but that's alright, I'm already a window opening expert") } %>...
+<character.one.angry.angry.neutral-backpack>Sarah</character>
-<% if (window.story.getChoice("Chapter1", "Soap")) { %>
-I feel around in my pockets for anything useful...
+<action>Oh boy, am I going to give this shithead a piece of my mind.</action>
-[[[Use Soap Bar]|C1P58V11]]
-<% } else { %>
-I look around for something to break the glass with... The table tennis table has a clamp on either side holding the net up, they look pretty solid.
+<speech.sarah>Are you proud of yourself, huh?!</speech>
+<speech.sarah>Your little performance out there, got Lucy killed!</speech>
-[[[Use Clamp]|C1P58V12]]
-<% } %><%= window.story.customRender("F: Games Room") %>
+<character.two.angry>Charles</character>
+<characteroverride.two>???</characteroverride>
-<div#strangerAlive></div>
+<action>He spins around to face me, his face already red with anger.</action>
+<action>Clearly he's ready for round two as well.</action>
-<script>
-// Using script tags here instead of Underscore templates because you can't use if statements and a render in Interpolation tags
-if (!window.story.getChoice("Chapter1", "StrangerDied")) {
- $("#strangerAlive").replaceWith(window.story.customRender("F: Stranger Alive"));
-}
-</script>
+<speech.charles>If you had the balls to come outside and help, maybe things would have been different!</speech>
+<speech.charles>Had you considered that, bitch!?</speech>
-<%= window.story.customRender("F: The window") %><%
-if (window.story.getChoice("Chapter1", "LucySavesStranger")) { %>
+<speech.sarah>What fuckin' fantasy land do you live in where you expect strangers to risk their lives for you?</speech>
+<speech.sarah>Strangers with children to look after, no less!</speech>
-Charles is standing next to the window. He turns around and faces us.
+<speech.charles>Children?!</speech>
-"Hey, are you guys OK? Where's that lady?", he asks.
+<action>He pauses briefly.</action>
-I shake my head slowly.
+<character.two>Charles</character>
+<characteroverride.two>???</characteroverride>
-"Oh shit, for real? But she was like, totally badass five seconds ago!", he says.
+<speech.charles>What children?</speech>
-"I'm like, really sorry for your loss, she seemed really chill", he adds.
+<action>He adds, quieter than before.</action>
+<action>We stand for a moment, then he bends his head and takes a step to his side to see around me.</action>
-Who speaks like that anymore?
+<character.one.sad.neutral.neutral-backpack>Tiffany</character>
-"Thanks... we need to get out of here, any ideas?", I ask.
+<action>%Tiffany% had been hiding behind me for the duration of the pissing match.</action>
+<action>He leans back again.</action>
-"Yeah totally; I had a look around up here, but there's no way out. The only thing is this window, but I can't find a way to open it", he replies.
+<character.one.angry.angry.neutral-backpack>Sarah</character>
-<% } else if (!window.story.getChoice("Chapter1", "SaveStranger")) { %>
+<speech.charles>That lady... was she her-</speech>
-The stranger is standing next to the window. Oh boy, am I going to give this shithead a piece of my mind.
+<speech.sarah>Yes, and now thanks to you, she's dead.</speech>
-"Are you proud of yourself, huh? Your little performance out there, got Lucy killed!", I shout angrily.
+<action>I deliberately cut him off.</action>
-He spins around to face me, his face already red with anger; clearly, he's ready for round two as well.
+<speech.charles>I- I didn't know...</speech>
-"If you had the balls to come outside and help, maybe things would have been different, had you considered that bitch?", he retorts.
+<speech.sarah>Save it.</speech>
+<speech.sarah>We need to get out of here.</speech>
-"What fuckin' fantasy land do you live in where you expect strangers to risk their lives for you? Strangers with children to look after, no less?!"
+<speech.charles>Yeah... right, okay.</speech>
-"Children?! What children?", he replies, sounding like I've caught him off guard.
+<% } %>
-We stand for a moment, then he bends his head and takes a step to his side to see around me. %Tiffany% has been hiding behind me this whole time.
+<speech.charles>I had a look around up here, but there's no way out.</speech>
+<speech.charles>Only thing is this window, but it doesn't seem like it opens.</speech><ui>standard</ui>
+<character.one.pain.neutral.neutral-backpack>Sarah</character>
+<character.two.sad.sad.neutral-backpack>Tiffany</character>
-He leans back again.
+<speech.sarah>Push this thing off me %Tiffany%!</speech>
-"That lady... was she her-", he starts.
+<action>She slowly approaches from the side, then takes a bit of a run-up.</action>
+<action>With both hands outstretched, she pushes the walker off me.</action>
+<action>It rolls, landing on its back; immediately starting to get up again.</action>
+<action>I crawl towards the knife, then pick it up.</action>
+<action>The walker is nearly on my again-</action>
+<action>It lunge-</action>
+<action>SPLOSH</action>
+<action>I was ready for it this time.</action>
+<action>I put the knife clean between its eyes, or rather, where its eyes should have been.</action>
+<action>The walker goes limp and flops to the ground.</action>
-"Yes, and now she's dead, no thanks to you", I grumble, cutting him off.
+<choices>[[[Get up]|C1P64]]</choices><ui>standard</ui>
+<character.one.pain.neutral.neutral-backpack>Sarah</character>
+<character.two.sad.sad.neutral-backpack>Tiffany</character>
-"I- I didn't know", he stumbles.
+<speech.sarah>Use the knife %Tiffany%!</speech>
-"Save it. We need to get out of here", I reply.
+<action>Pointing to it with my free hand.</action>
-"Yeah... right. I had a look around up here, but there's no way out. The only thing is this window, but I can't find a way to open it", he says.
+<resetcharacter.two/>
-<% } %>"Push this thing off me %Tiffany%!", I shout.
+<action>She goes around behind me out of sight...</action>
-She slowly approaches from the side, then takes a bit of a run-up and with both hands stretched outwards, pushes the walker off me.
+<character.two.sad.sad.neutral-backpack>Tiffany</character>
-It rolls one and lands on its back, it immediately starts to get up again. I crawl back towards the knife, then pick it up. The walker is nearly on my again, it lunges, I put the knife clean between its eyes, or rather, where its eyes should have been.
+<action>...then comes back over and stands off to my side.</action>
-The walker goes limp and flops to the ground.
+<speech.tiffany>Wha- what do I do with it?</speech>
-[[[Get up]|C1P64]]"Use the knife %Tiffany%!", I shout, pointing to it with my free hand.
+<speech.sarah>Stab it %Tiffany%!</speech>
+<speech.sarah>In the head! The head!</speech>
-She goes around behind me out of sight, then comes back over and stands off to my side.
+<action>I reply frantically.</action>
+<action>I can't hold this thing for much longer.</action>
+<action>%Tiffany% comes right up next to the walker...</action>
+<action>Raises the knife almost comically high above her head, then...</action>
+<!-- TODO: SFX here -->
+<action>SPLAT</action>
-"What do I do with it?", she shouts.
+<character.one.neutral.neutral.neutral-backpack>Sarah</character>
-"Stab it %Tiffany%, in the head! The head!", I reply frantically; I can't hold this thing for much longer.
+<action>Walker bits get all over my face.</action>
+<action>%Tiffany% steps back, the walker goes limp and I push it off.</action>
+<action>I reach over and pull the knife out of the back of its head.</action>
-%Tiffany% comes right up next to the walker and I, raises the knife almost comically high above her head, then brings it down.
+<choices>[[[Get up]|C1P64]]</choices><ui>standard</ui>
+<character.one.pain.neutral.neutral-backpack>Sarah</character>
+<character.two.sad.sad.neutral-backpack>Tiffany</character>
-\* Splat \*
+<speech.sarah>Get me the knife %Tiffany%!</speech>
-Walker bits get all over my face, %Tiffany% steps back, the walker goes limp and I push it off. I reach over and pull the knife out of the back of its head.
+<action>Pointing to it with my free hand.</action>
-[[[Get up]|C1P64]]"Get me the knife %Tiffany%!", I shout, pointing to it with my free hand.
+<resetcharacter.two/>
-She goes around behind me out of sight, then comes back over and stands over me, nerviosuly holding out the knife. If I grab it like that I'm going to cut myself, no time to muck around. I grab %Tiffany%'s hand with my free hand and pull the knife and her along with it the last few inches to the walker's head.
+<action>She goes around behind me out of sight...</action>
-\* Splat \*
+<character.two.sad.sad.neutral-backpack>Tiffany</character>
-Walker bits get all over my face, I let go of %Tiffany%'s hand and she steps back out of the way, the walker, knife still in it’s head, goes limp, and I push it off. I reach over and pull the knife out of its face.
+<action>...then comes back over and stands over me, nervously holding out the knife blade first.</action>
+<action>If I grab it like that I'm going to cut myself, no time to muck around.</action>
+<character.two.happy.sad.neutral-backpack>Tiffany</character>
+<action>I grab %Tiffany%'s wrist with my free hand and pull the knife and her along with it the last few inches to the walker's head.</action>
+<!-- TODO: SFX here -->
+<action>SPLAT</action>
+<action>Walker bits get all over my face.</action>
-[[[Get up]|C1P64]]### Chapter Two
+<character.two.sad.sad.neutral-backpack>Tiffany</character>
-<%
-window.story.delayedText(4000, "one", 0);
-window.story.delayedText(6000, "two");
-%>
+<action>I let go of %Tiffany% and she steps backwards.</action>
+<action>The walker, knife still in it's head, goes limp: I push it off.</action>
+<action>I reach over and pull the knife out of its face.</action>
-<div-#one><h1>Coming Soon</h1></div>
+<choices>[[[Get up]|C1P64]]</choices>### Chapter Two
-<div-#two>
+<h1>Coming Soon</h1>
Enjoyed the story? Be sure to leave a rating and comment! <a class="normal-link" href="https://discord.gg/jNgAEjW7gd" target="_blank">Join our Discord</a> to be informed when Chapter Two is released.
@@ -3178,19 +6447,99 @@
[[Return the Main Menu|Title Screen]]
-</div><img.title-image>
+</div><img.title-image>
-<%= window.story.customRender("Settings") %>
+<%= window.story.render("Settings") %>
-<a0 onclick="window.story.pauseMenu()">Resume</a><div#title-button>
+<a0.sound-confirm onclick="window.story.pauseMenu()">Resume</a><div#title-button>
<p>Game Version: v<% print(window.story.version) %></p>
- <a onclick="window.story.toggleDebug()">Toggle Debug Mode<br><span.smaller>(Recommended for Mobile Users)</span></a>
<a onclick="window.story.toggleFont()">Toggle Font</a>
<a onclick="window.story.toggleAchievements()">Toggle Achievements</a>
-</div><div#title-button>
- [[Launch Game|Network Check]]
-</div>
+ <a onclick="window.story.toggleFullscreen()">Toggle Fullscreen</a>
+</div><div#title-button>
+ <!--[[Launch Game|Network Check]]-->
+ [[Launch Game|Alpha]]
+ [[Debug Menu|Debug]]
+</div>This game has a lot of images: UI, characters, etc.
+We're loading those images right now.
+Please sit tight!
+
+<progress#loading-bar max="100"></progress>
+<label#loading-bar-label for="loading-bar">0%</label><input#debugSelector type="text" placeholder="Type Passage Here" autocomplete="off" value="C1P"></input>
+<button#debugGo>Go</button>
+
+<br><hr>
+
+C<input#debugSelectorC type="text" placeholder="Type Chapter Here" autocomplete="off" value="1"></input>
+P<input#debugSelectorP type="text" placeholder="Type Passage Here" autocomplete="off" autofocus></input>
+V<input#debugSelectorV type="text" placeholder="Type Variation Here" autocomplete="off"></input>
+<button#debugGo2>Go</button>
+
+<script>
+ $("#debugGo").click(function() {
+ const passage = $("#debugSelector").val();
+
+ window.story.show(passage);
+ });
+
+ $("#debugGo2").click(function() {
+ let chapter = $("#debugSelectorC").val();
+ let passage = $("#debugSelectorP").val();
+ let variation = $("#debugSelectorV").val();
+
+ if (chapter) chapter = `C${chapter}`;
+ if (passage) passage = `P${passage}`;
+ if (variation) variation = `V${variation}`;
+
+ window.story.show(chapter + passage + variation);
+ });
+</script><choices>[[[Rollover]|C1P12]]</choices><action>%Tiffany% sounds scared.</action>
+
+<character.two>Unknown</character>
+
+<speech.unknown>Get off me you sons of bitches!</speech>
+
+<action>The voice from outside again.</action>
+<action>It sounds like a guy.</action><ui>standard</ui>
+<character.one.angry.eyes>Sarah</character>
+<character.two.scared.ditto>Tiffany</character>
+
+<action>I look at %Tiffany%.</action>
+<action>She's got her feet up on the seat, and buried her head in her knees.</action>
+<action>She must be terrified.</action><div#gallery-container.gallery>
+ <img#gallery-image-1>
+ <img#gallery-image-2>
+ <img#gallery-image-3>
+ <img#gallery-image-4>
+ <img#gallery-image-5>
+ <img#gallery-image-6>
+ <img#gallery-image-7>
+ <img#gallery-image-8>
+</div>
+
+Character Artwork - Despoina "DesDarkDesigns"<br>
+<a href="https://linktr.ee/despoinanyx" target="_blank">https://linktr.ee/despoinanyx</a>
+
+[[Back|Artwork]]<%= window.story.render("F: Artwork") %>
+
+<% window.story.createGalleryItem(1, "Lucy", "neutral"); %>
+<% window.story.createGalleryItem(2, "Lucy", "neutral", "neutral-mask", "neutral-mask"); %>
+<% window.story.createGalleryItem(3, "Lucy", "fighting"); %>
+<% window.story.createGalleryItem(4, "Lucy", "concern", "concern", "neutral"); %>
+<% window.story.createGalleryItem(5, "Lucy", "happy", "happy", "neutral"); %>
+<% window.story.createGalleryItem(6, "Lucy", "sad", "sad", "neutral"); %><%= window.story.render("F: Artwork") %>
+
+<% window.story.createGalleryItem(1, "Charles", "neutral"); %>
+<% window.story.createGalleryItem(2, "Charles", "fighting"); %>
+<% window.story.createGalleryItem(3, "Charles", "angry", "angry", "neutral"); %>
+<% window.story.createGalleryItem(4, "Charles", "sad", "sad", "neutral"); %>
+<% window.story.createGalleryItem(5, "Charles", "scared", "scared", "neutral"); %><%= window.story.render("F: Artwork") %>
+
+<% window.story.createGalleryItem(1, "Sophia", "neutral"); %>
+<% window.story.createGalleryItem(2, "Sophia", "close-up", "neutral-close-up", "close-up"); %>
+<% window.story.createGalleryItem(3, "Sophia", "demonic", "demonic", "neutral"); %>
+<% window.story.createGalleryItem(4, "Sophia", "excited", "excited", "neutral"); %>