claude-coach 0.0.2 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/cli.js +239 -15
- package/dist/db/client.d.ts +4 -0
- package/dist/db/client.js +96 -30
- package/package.json +3 -2
- package/templates/plan-viewer.html +1 -1
package/README.md
CHANGED
|
@@ -16,7 +16,7 @@ I happen to work at Anthropic, so this tool is optimized for Claude. To use this
|
|
|
16
16
|
|
|
17
17
|
First, [download the latest skill from GitHub Releases](https://github.com/felixrieseberg/claude-coach/releases/latest/download/coach-skill.zip).
|
|
18
18
|
|
|
19
|
-
- If you're using Claude.ai, open the Settings, navigate to Capabilities, then click the `+ Add` button. Upload the `coach-skill.zip` file you just downloaded.
|
|
19
|
+
- If you're using Claude.ai, open the Settings, navigate to Capabilities, then click the `+ Add` button. Upload the `coach-skill.zip` file you just downloaded. There, also give Claude.ai access to Strava by adding `*.strava.com` to your allowed domains list.
|
|
20
20
|
- If you're using Claude Code, run `/install-skill` and provide the path to the `coach-skill.zip` file you downloaded.
|
|
21
21
|
|
|
22
22
|
### Creating a plan
|
package/dist/cli.js
CHANGED
|
@@ -1,13 +1,25 @@
|
|
|
1
|
-
import { configExists, loadConfig, promptForConfig, saveConfig, getDbPath, createConfig, } from "./lib/config.js";
|
|
1
|
+
import { configExists, loadConfig, promptForConfig, saveConfig, saveTokens, getDbPath, createConfig, } from "./lib/config.js";
|
|
2
2
|
import { log } from "./lib/logging.js";
|
|
3
3
|
import { migrate } from "./db/migrate.js";
|
|
4
|
-
import { execute } from "./db/client.js";
|
|
4
|
+
import { execute, initDatabase, query, queryJson } from "./db/client.js";
|
|
5
5
|
import { getValidTokens } from "./strava/oauth.js";
|
|
6
6
|
import { getAllActivities, getAthlete } from "./strava/api.js";
|
|
7
7
|
import { readFileSync, writeFileSync } from "fs";
|
|
8
8
|
import { dirname, join } from "path";
|
|
9
9
|
import { fileURLToPath } from "url";
|
|
10
|
+
import { ProxyAgent, setGlobalDispatcher } from "undici";
|
|
10
11
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
12
|
+
// ============================================================================
|
|
13
|
+
// Proxy Configuration
|
|
14
|
+
// ============================================================================
|
|
15
|
+
// Configure proxy for fetch() if HTTP_PROXY or HTTPS_PROXY is set
|
|
16
|
+
const proxyUrl = process.env.HTTPS_PROXY ||
|
|
17
|
+
process.env.https_proxy ||
|
|
18
|
+
process.env.HTTP_PROXY ||
|
|
19
|
+
process.env.http_proxy;
|
|
20
|
+
if (proxyUrl) {
|
|
21
|
+
setGlobalDispatcher(new ProxyAgent(proxyUrl));
|
|
22
|
+
}
|
|
11
23
|
function parseArgs() {
|
|
12
24
|
const args = process.argv.slice(2);
|
|
13
25
|
if (args.length === 0 || args[0] === "sync") {
|
|
@@ -20,6 +32,12 @@ function parseArgs() {
|
|
|
20
32
|
else if (arg.startsWith("--client-secret=")) {
|
|
21
33
|
syncArgs.clientSecret = arg.split("=")[1];
|
|
22
34
|
}
|
|
35
|
+
else if (arg.startsWith("--access-token=")) {
|
|
36
|
+
syncArgs.accessToken = arg.split("=")[1];
|
|
37
|
+
}
|
|
38
|
+
else if (arg.startsWith("--refresh-token=")) {
|
|
39
|
+
syncArgs.refreshToken = arg.split("=")[1];
|
|
40
|
+
}
|
|
23
41
|
else if (arg.startsWith("--days=")) {
|
|
24
42
|
syncArgs.days = parseInt(arg.split("=")[1]);
|
|
25
43
|
}
|
|
@@ -46,6 +64,33 @@ function parseArgs() {
|
|
|
46
64
|
}
|
|
47
65
|
return renderArgs;
|
|
48
66
|
}
|
|
67
|
+
if (args[0] === "query") {
|
|
68
|
+
if (!args[1]) {
|
|
69
|
+
log.error("query command requires a SQL statement");
|
|
70
|
+
process.exit(1);
|
|
71
|
+
}
|
|
72
|
+
const queryArgs = {
|
|
73
|
+
command: "query",
|
|
74
|
+
sql: args[1],
|
|
75
|
+
json: args.includes("--json"),
|
|
76
|
+
};
|
|
77
|
+
return queryArgs;
|
|
78
|
+
}
|
|
79
|
+
if (args[0] === "auth") {
|
|
80
|
+
const authArgs = { command: "auth" };
|
|
81
|
+
for (const arg of args) {
|
|
82
|
+
if (arg.startsWith("--client-id=")) {
|
|
83
|
+
authArgs.clientId = arg.split("=")[1];
|
|
84
|
+
}
|
|
85
|
+
else if (arg.startsWith("--client-secret=")) {
|
|
86
|
+
authArgs.clientSecret = arg.split("=")[1];
|
|
87
|
+
}
|
|
88
|
+
else if (arg.startsWith("--code=")) {
|
|
89
|
+
authArgs.code = arg.split("=")[1];
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return authArgs;
|
|
93
|
+
}
|
|
49
94
|
if (args[0] === "--help" || args[0] === "-h" || args[0] === "help") {
|
|
50
95
|
return { command: "help" };
|
|
51
96
|
}
|
|
@@ -59,33 +104,136 @@ Claude Coach - Training Plan Tools
|
|
|
59
104
|
Usage: npx claude-coach <command> [options]
|
|
60
105
|
|
|
61
106
|
Commands:
|
|
62
|
-
sync Sync activities from Strava
|
|
107
|
+
sync Sync activities from Strava
|
|
108
|
+
auth Get Strava authorization URL or exchange code for tokens
|
|
63
109
|
render <file> Render a training plan JSON to HTML
|
|
110
|
+
query <sql> Run a SQL query against the database
|
|
64
111
|
help Show this help message
|
|
65
112
|
|
|
66
|
-
|
|
113
|
+
Auth Options (for headless/Claude environments):
|
|
67
114
|
--client-id=ID Strava API client ID
|
|
68
115
|
--client-secret=SEC Strava API client secret
|
|
116
|
+
--code=URL_OR_CODE Full redirect URL or just the authorization code
|
|
117
|
+
|
|
118
|
+
Step 1: Run 'auth' with credentials to get authorization URL
|
|
119
|
+
Step 2: User clicks URL, authorizes, copies entire redirect URL
|
|
120
|
+
Step 3: Run 'auth --code=URL' to exchange for tokens
|
|
121
|
+
Step 4: Run 'sync' to fetch activities
|
|
122
|
+
|
|
123
|
+
Sync Options:
|
|
124
|
+
--client-id=ID Strava API client ID (for OAuth flow)
|
|
125
|
+
--client-secret=SEC Strava API client secret (for OAuth flow)
|
|
69
126
|
--days=N Days of history to sync (default: 730)
|
|
70
127
|
|
|
71
128
|
Render Options:
|
|
72
129
|
--output, -o FILE Output HTML file (default: <input>.html)
|
|
73
130
|
|
|
131
|
+
Query Options:
|
|
132
|
+
--json Output as JSON (default: plain text)
|
|
133
|
+
|
|
74
134
|
Examples:
|
|
75
|
-
#
|
|
76
|
-
npx claude-coach
|
|
135
|
+
# Headless auth flow (for Claude/automated environments)
|
|
136
|
+
npx claude-coach auth --client-id=12345 --client-secret=abc123
|
|
137
|
+
# User clicks URL, copies code from failed redirect
|
|
138
|
+
npx claude-coach auth --code=AUTHORIZATION_CODE
|
|
139
|
+
npx claude-coach sync
|
|
77
140
|
|
|
78
|
-
#
|
|
141
|
+
# Interactive auth flow (opens browser)
|
|
79
142
|
npx claude-coach sync --client-id=12345 --client-secret=abc123
|
|
80
143
|
|
|
81
144
|
# Render a training plan to HTML
|
|
82
145
|
npx claude-coach render plan.json --output my-plan.html
|
|
83
146
|
|
|
84
|
-
#
|
|
85
|
-
npx claude-coach
|
|
147
|
+
# Query the database
|
|
148
|
+
npx claude-coach query "SELECT * FROM weekly_volume LIMIT 5"
|
|
86
149
|
`);
|
|
87
150
|
}
|
|
88
151
|
// ============================================================================
|
|
152
|
+
// Auth Command (for headless/Claude environments)
|
|
153
|
+
// ============================================================================
|
|
154
|
+
const REDIRECT_PORT = 8765;
|
|
155
|
+
const REDIRECT_URI = `http://localhost:${REDIRECT_PORT}/callback`;
|
|
156
|
+
const AUTHORIZE_URL = "https://www.strava.com/oauth/authorize";
|
|
157
|
+
const TOKEN_URL = "https://www.strava.com/oauth/token";
|
|
158
|
+
async function runAuth(args) {
|
|
159
|
+
// If code is provided, exchange it for tokens
|
|
160
|
+
if (args.code) {
|
|
161
|
+
if (!configExists()) {
|
|
162
|
+
log.error("No configuration found. Run 'auth' with --client-id and --client-secret first.");
|
|
163
|
+
process.exit(1);
|
|
164
|
+
}
|
|
165
|
+
// Extract code from full URL if user pasted the entire redirect URL
|
|
166
|
+
let code = args.code;
|
|
167
|
+
if (code.includes("localhost") || code.startsWith("http")) {
|
|
168
|
+
try {
|
|
169
|
+
const url = new URL(code);
|
|
170
|
+
const extractedCode = url.searchParams.get("code");
|
|
171
|
+
if (extractedCode) {
|
|
172
|
+
code = extractedCode;
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
log.error("Could not find 'code' parameter in URL");
|
|
176
|
+
process.exit(1);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
catch {
|
|
180
|
+
// Not a valid URL, use as-is
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
const config = loadConfig();
|
|
184
|
+
log.start("Exchanging authorization code for tokens...");
|
|
185
|
+
const tokenResponse = await fetch(TOKEN_URL, {
|
|
186
|
+
method: "POST",
|
|
187
|
+
headers: { "Content-Type": "application/json" },
|
|
188
|
+
body: JSON.stringify({
|
|
189
|
+
client_id: config.strava.client_id,
|
|
190
|
+
client_secret: config.strava.client_secret,
|
|
191
|
+
code: code,
|
|
192
|
+
grant_type: "authorization_code",
|
|
193
|
+
}),
|
|
194
|
+
});
|
|
195
|
+
if (!tokenResponse.ok) {
|
|
196
|
+
const error = await tokenResponse.text();
|
|
197
|
+
log.error(`Token exchange failed: ${error}`);
|
|
198
|
+
process.exit(1);
|
|
199
|
+
}
|
|
200
|
+
const data = await tokenResponse.json();
|
|
201
|
+
const tokens = {
|
|
202
|
+
access_token: data.access_token,
|
|
203
|
+
refresh_token: data.refresh_token,
|
|
204
|
+
expires_at: data.expires_at,
|
|
205
|
+
athlete_id: data.athlete.id,
|
|
206
|
+
};
|
|
207
|
+
saveTokens(tokens);
|
|
208
|
+
log.success(`Authenticated as ${data.athlete.firstname} ${data.athlete.lastname}`);
|
|
209
|
+
log.ready("Now run: npx claude-coach sync");
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
// Otherwise, generate and print the authorization URL
|
|
213
|
+
if (!args.clientId || !args.clientSecret) {
|
|
214
|
+
log.error("Required: --client-id and --client-secret");
|
|
215
|
+
log.info("Get these from: https://www.strava.com/settings/api");
|
|
216
|
+
process.exit(1);
|
|
217
|
+
}
|
|
218
|
+
// Save config for later use
|
|
219
|
+
const config = createConfig(args.clientId, args.clientSecret, 730);
|
|
220
|
+
saveConfig(config);
|
|
221
|
+
const authUrl = new URL(AUTHORIZE_URL);
|
|
222
|
+
authUrl.searchParams.set("client_id", args.clientId);
|
|
223
|
+
authUrl.searchParams.set("response_type", "code");
|
|
224
|
+
authUrl.searchParams.set("redirect_uri", REDIRECT_URI);
|
|
225
|
+
authUrl.searchParams.set("scope", "activity:read_all");
|
|
226
|
+
authUrl.searchParams.set("approval_prompt", "auto");
|
|
227
|
+
console.log("\n📋 AUTHORIZATION URL:\n");
|
|
228
|
+
console.log(authUrl.toString());
|
|
229
|
+
console.log("\n📝 INSTRUCTIONS:");
|
|
230
|
+
console.log("1. Open the URL above in a browser");
|
|
231
|
+
console.log("2. Click 'Authorize' on Strava");
|
|
232
|
+
console.log("3. You'll be redirected to a page that won't load (that's OK!)");
|
|
233
|
+
console.log("4. Copy the ENTIRE URL from your browser's address bar");
|
|
234
|
+
console.log("5. Paste it back to Claude\n");
|
|
235
|
+
}
|
|
236
|
+
// ============================================================================
|
|
89
237
|
// Sync Command
|
|
90
238
|
// ============================================================================
|
|
91
239
|
function escapeString(str) {
|
|
@@ -147,11 +295,67 @@ function insertAthlete(athlete) {
|
|
|
147
295
|
}
|
|
148
296
|
async function runSync(args) {
|
|
149
297
|
log.box("Claude Coach - Strava Sync");
|
|
150
|
-
// Step
|
|
298
|
+
// Step 0: Initialize SQLite backend
|
|
299
|
+
await initDatabase();
|
|
300
|
+
const syncDays = args.days || 730;
|
|
301
|
+
// Step 1: Handle token-based auth (no browser needed)
|
|
302
|
+
if (args.accessToken && args.refreshToken) {
|
|
303
|
+
log.info("Using provided access tokens...");
|
|
304
|
+
// Save tokens - we'll get athlete_id after fetching profile
|
|
305
|
+
// Set expiry to 1 hour from now (we have refresh token for renewal)
|
|
306
|
+
const tempTokens = {
|
|
307
|
+
access_token: args.accessToken,
|
|
308
|
+
refresh_token: args.refreshToken,
|
|
309
|
+
expires_at: Math.floor(Date.now() / 1000) + 3600,
|
|
310
|
+
athlete_id: 0, // Will be updated after fetching athlete
|
|
311
|
+
};
|
|
312
|
+
saveTokens(tempTokens);
|
|
313
|
+
// Create minimal config if needed
|
|
314
|
+
if (!configExists()) {
|
|
315
|
+
// Token-based auth doesn't need client credentials for initial sync
|
|
316
|
+
// but we need them for token refresh - use placeholders
|
|
317
|
+
const config = createConfig("token-auth", "token-auth", syncDays);
|
|
318
|
+
saveConfig(config);
|
|
319
|
+
}
|
|
320
|
+
// Initialize database
|
|
321
|
+
migrate();
|
|
322
|
+
// Fetch athlete to get ID and validate tokens
|
|
323
|
+
log.start("Validating tokens and fetching athlete profile...");
|
|
324
|
+
const athlete = await getAthlete(tempTokens);
|
|
325
|
+
// Update tokens with real athlete ID
|
|
326
|
+
const tokens = { ...tempTokens, athlete_id: athlete.id };
|
|
327
|
+
saveTokens(tokens);
|
|
328
|
+
insertAthlete(athlete);
|
|
329
|
+
log.success(`Authenticated as ${athlete.firstname} ${athlete.lastname}`);
|
|
330
|
+
// Fetch activities
|
|
331
|
+
const afterDate = new Date();
|
|
332
|
+
afterDate.setDate(afterDate.getDate() - syncDays);
|
|
333
|
+
const activities = await getAllActivities(tokens, afterDate);
|
|
334
|
+
// Store activities
|
|
335
|
+
log.start("Storing activities in database...");
|
|
336
|
+
let count = 0;
|
|
337
|
+
for (const activity of activities) {
|
|
338
|
+
insertActivity(activity);
|
|
339
|
+
count++;
|
|
340
|
+
if (count % 50 === 0) {
|
|
341
|
+
log.progress(` Stored ${count}/${activities.length}...`);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
log.progressEnd();
|
|
345
|
+
log.success(`Stored ${activities.length} activities`);
|
|
346
|
+
execute(`
|
|
347
|
+
INSERT INTO sync_log (started_at, completed_at, activities_synced, status)
|
|
348
|
+
VALUES (datetime('now'), datetime('now'), ${activities.length}, 'success');
|
|
349
|
+
`);
|
|
350
|
+
log.info(`Database: ${getDbPath()}`);
|
|
351
|
+
log.ready("Sync complete! You can now create training plans.");
|
|
352
|
+
return;
|
|
353
|
+
}
|
|
354
|
+
// Step 2: OAuth-based auth (requires browser)
|
|
151
355
|
if (!configExists()) {
|
|
152
356
|
if (args.clientId && args.clientSecret) {
|
|
153
357
|
log.info("Creating configuration from command line arguments...");
|
|
154
|
-
const config = createConfig(args.clientId, args.clientSecret,
|
|
358
|
+
const config = createConfig(args.clientId, args.clientSecret, syncDays);
|
|
155
359
|
saveConfig(config);
|
|
156
360
|
log.success("Configuration saved");
|
|
157
361
|
}
|
|
@@ -163,10 +367,10 @@ async function runSync(args) {
|
|
|
163
367
|
}
|
|
164
368
|
}
|
|
165
369
|
const config = loadConfig();
|
|
166
|
-
const
|
|
167
|
-
//
|
|
370
|
+
const configSyncDays = args.days || config.sync_days || 730;
|
|
371
|
+
// Initialize database
|
|
168
372
|
migrate();
|
|
169
|
-
//
|
|
373
|
+
// Authenticate with Strava (opens browser)
|
|
170
374
|
const tokens = await getValidTokens();
|
|
171
375
|
// Step 4: Fetch and store athlete profile
|
|
172
376
|
log.start("Fetching athlete profile...");
|
|
@@ -175,7 +379,7 @@ async function runSync(args) {
|
|
|
175
379
|
log.success(`Athlete: ${athlete.firstname} ${athlete.lastname}`);
|
|
176
380
|
// Step 5: Fetch activities
|
|
177
381
|
const afterDate = new Date();
|
|
178
|
-
afterDate.setDate(afterDate.getDate() -
|
|
382
|
+
afterDate.setDate(afterDate.getDate() - configSyncDays);
|
|
179
383
|
const activities = await getAllActivities(tokens, afterDate);
|
|
180
384
|
// Step 6: Store activities
|
|
181
385
|
log.start("Storing activities in database...");
|
|
@@ -255,6 +459,20 @@ function runRender(args) {
|
|
|
255
459
|
}
|
|
256
460
|
}
|
|
257
461
|
// ============================================================================
|
|
462
|
+
// Query Command
|
|
463
|
+
// ============================================================================
|
|
464
|
+
async function runQuery(args) {
|
|
465
|
+
await initDatabase();
|
|
466
|
+
if (args.json) {
|
|
467
|
+
const results = queryJson(args.sql);
|
|
468
|
+
console.log(JSON.stringify(results, null, 2));
|
|
469
|
+
}
|
|
470
|
+
else {
|
|
471
|
+
const result = query(args.sql);
|
|
472
|
+
console.log(result);
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
// ============================================================================
|
|
258
476
|
// Main
|
|
259
477
|
// ============================================================================
|
|
260
478
|
async function main() {
|
|
@@ -263,12 +481,18 @@ async function main() {
|
|
|
263
481
|
case "help":
|
|
264
482
|
printHelp();
|
|
265
483
|
break;
|
|
484
|
+
case "auth":
|
|
485
|
+
await runAuth(args);
|
|
486
|
+
break;
|
|
266
487
|
case "sync":
|
|
267
488
|
await runSync(args);
|
|
268
489
|
break;
|
|
269
490
|
case "render":
|
|
270
491
|
runRender(args);
|
|
271
492
|
break;
|
|
493
|
+
case "query":
|
|
494
|
+
await runQuery(args);
|
|
495
|
+
break;
|
|
272
496
|
}
|
|
273
497
|
}
|
|
274
498
|
main().catch((err) => {
|
package/dist/db/client.d.ts
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Initialize the SQLite backend. Must be called before using other functions.
|
|
3
|
+
*/
|
|
4
|
+
export declare function initDatabase(): Promise<void>;
|
|
1
5
|
export declare function query(sql: string): string;
|
|
2
6
|
export declare function queryJson<T>(sql: string): T[];
|
|
3
7
|
export declare function execute(sql: string): void;
|
package/dist/db/client.js
CHANGED
|
@@ -1,44 +1,110 @@
|
|
|
1
1
|
import { execSync, spawnSync } from "child_process";
|
|
2
2
|
import { getDbPath } from "../lib/config.js";
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
let cachedBackend = null;
|
|
4
|
+
/**
|
|
5
|
+
* Try to use Node's built-in SQLite module (Node 22.5+).
|
|
6
|
+
* Falls back to shelling out to sqlite3 CLI if not available.
|
|
7
|
+
*/
|
|
8
|
+
async function detectBackend() {
|
|
9
|
+
// Try Node.js built-in SQLite first (Node 22.5+)
|
|
5
10
|
try {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
11
|
+
// Dynamic import to avoid syntax errors on older Node versions
|
|
12
|
+
const sqlite = await import("node:sqlite");
|
|
13
|
+
const dbPath = getDbPath();
|
|
14
|
+
const db = new sqlite.DatabaseSync(dbPath);
|
|
15
|
+
return {
|
|
16
|
+
query(sql) {
|
|
17
|
+
const stmt = db.prepare(sql);
|
|
18
|
+
const rows = stmt.all();
|
|
19
|
+
if (rows.length === 0)
|
|
20
|
+
return "";
|
|
21
|
+
// Format as simple text output (column values separated by |)
|
|
22
|
+
return rows
|
|
23
|
+
.map((row) => Object.values(row)
|
|
24
|
+
.map((v) => (v === null ? "" : String(v)))
|
|
25
|
+
.join("|"))
|
|
26
|
+
.join("\n");
|
|
27
|
+
},
|
|
28
|
+
queryJson(sql) {
|
|
29
|
+
const stmt = db.prepare(sql);
|
|
30
|
+
return stmt.all();
|
|
31
|
+
},
|
|
32
|
+
execute(sql) {
|
|
33
|
+
db.exec(sql);
|
|
34
|
+
},
|
|
35
|
+
};
|
|
9
36
|
}
|
|
10
|
-
catch
|
|
11
|
-
|
|
12
|
-
throw new Error(`SQLite error: ${err.stderr || err.message}`);
|
|
37
|
+
catch {
|
|
38
|
+
// Node.js built-in SQLite not available, try CLI
|
|
13
39
|
}
|
|
14
|
-
|
|
15
|
-
export function queryJson(sql) {
|
|
16
|
-
const dbPath = getDbPath();
|
|
40
|
+
// Fallback: Use sqlite3 CLI
|
|
17
41
|
try {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
42
|
+
// Check if sqlite3 is available
|
|
43
|
+
execSync("sqlite3 --version", { stdio: "ignore" });
|
|
44
|
+
return {
|
|
45
|
+
query(sql) {
|
|
46
|
+
const dbPath = getDbPath();
|
|
47
|
+
return execSync(`sqlite3 "${dbPath}" "${sql.replace(/"/g, '\\"')}"`, {
|
|
48
|
+
encoding: "utf-8",
|
|
49
|
+
});
|
|
50
|
+
},
|
|
51
|
+
queryJson(sql) {
|
|
52
|
+
const dbPath = getDbPath();
|
|
53
|
+
const result = execSync(`sqlite3 -json "${dbPath}" "${sql.replace(/"/g, '\\"')}"`, {
|
|
54
|
+
encoding: "utf-8",
|
|
55
|
+
});
|
|
56
|
+
if (!result.trim())
|
|
57
|
+
return [];
|
|
58
|
+
return JSON.parse(result);
|
|
59
|
+
},
|
|
60
|
+
execute(sql) {
|
|
61
|
+
const dbPath = getDbPath();
|
|
62
|
+
const result = spawnSync("sqlite3", [dbPath], {
|
|
63
|
+
input: sql,
|
|
64
|
+
encoding: "utf-8",
|
|
65
|
+
});
|
|
66
|
+
if (result.error)
|
|
67
|
+
throw result.error;
|
|
68
|
+
if (result.status !== 0) {
|
|
69
|
+
throw new Error(`SQLite error: ${result.stderr}`);
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
};
|
|
24
73
|
}
|
|
25
|
-
catch
|
|
26
|
-
|
|
27
|
-
|
|
74
|
+
catch {
|
|
75
|
+
throw new Error("SQLite is not available. Please either:\n" +
|
|
76
|
+
" 1. Use Node.js 22.5+ (has built-in SQLite)\n" +
|
|
77
|
+
" 2. Install sqlite3 CLI (brew install sqlite3 / apt install sqlite3)");
|
|
28
78
|
}
|
|
29
79
|
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
if (result.error) {
|
|
37
|
-
throw result.error;
|
|
80
|
+
/**
|
|
81
|
+
* Initialize the SQLite backend. Must be called before using other functions.
|
|
82
|
+
*/
|
|
83
|
+
export async function initDatabase() {
|
|
84
|
+
if (!cachedBackend) {
|
|
85
|
+
cachedBackend = await detectBackend();
|
|
38
86
|
}
|
|
39
|
-
|
|
40
|
-
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Get the backend, throwing if not initialized.
|
|
90
|
+
*/
|
|
91
|
+
function getBackend() {
|
|
92
|
+
if (!cachedBackend) {
|
|
93
|
+
throw new Error("Database not initialized. Call initDatabase() first.");
|
|
41
94
|
}
|
|
95
|
+
return cachedBackend;
|
|
96
|
+
}
|
|
97
|
+
// ============================================================================
|
|
98
|
+
// Public API (synchronous after initialization)
|
|
99
|
+
// ============================================================================
|
|
100
|
+
export function query(sql) {
|
|
101
|
+
return getBackend().query(sql);
|
|
102
|
+
}
|
|
103
|
+
export function queryJson(sql) {
|
|
104
|
+
return getBackend().queryJson(sql);
|
|
105
|
+
}
|
|
106
|
+
export function execute(sql) {
|
|
107
|
+
getBackend().execute(sql);
|
|
42
108
|
}
|
|
43
109
|
export function runScript(script) {
|
|
44
110
|
execute(script);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "claude-coach",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.5",
|
|
4
4
|
"author": "Felix Rieseberg <felix@felixrieseberg.com> (https://felixrieseberg.com)",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -37,7 +37,8 @@
|
|
|
37
37
|
"@garmin/fitsdk": "^21.178.0",
|
|
38
38
|
"consola": "^3.2.3",
|
|
39
39
|
"jszip": "^3.10.1",
|
|
40
|
-
"open": "^10.1.0"
|
|
40
|
+
"open": "^10.1.0",
|
|
41
|
+
"undici": "^7.16.0"
|
|
41
42
|
},
|
|
42
43
|
"devDependencies": {
|
|
43
44
|
"@sveltejs/vite-plugin-svelte": "^6.2.1",
|
|
@@ -35,7 +35,7 @@ ${a.join(`
|
|
|
35
35
|
`)+`\r
|
|
36
36
|
`+"END:VCALENDAR"}var vt=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function Hl(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function Tt(e){throw new Error('Could not dynamically require "'+e+'". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.')}var Mt={exports:{}};var Aa;function jl(){return Aa||(Aa=1,(function(e,s){(function(t){e.exports=t()})(function(){return(function t(a,i,n){function l(c,v){if(!i[c]){if(!a[c]){var y=typeof Tt=="function"&&Tt;if(!v&&y)return y(c,!0);if(o)return o(c,!0);var b=new Error("Cannot find module '"+c+"'");throw b.code="MODULE_NOT_FOUND",b}var m=i[c]={exports:{}};a[c][0].call(m.exports,function(C){var p=a[c][1][C];return l(p||C)},m,m.exports,t,a,i,n)}return i[c].exports}for(var o=typeof Tt=="function"&&Tt,u=0;u<n.length;u++)l(n[u]);return l})({1:[function(t,a,i){var n=t("./utils"),l=t("./support"),o="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";i.encode=function(u){for(var c,v,y,b,m,C,p,d=[],h=0,w=u.length,k=w,x=n.getTypeOf(u)!=="string";h<u.length;)k=w-h,y=x?(c=u[h++],v=h<w?u[h++]:0,h<w?u[h++]:0):(c=u.charCodeAt(h++),v=h<w?u.charCodeAt(h++):0,h<w?u.charCodeAt(h++):0),b=c>>2,m=(3&c)<<4|v>>4,C=1<k?(15&v)<<2|y>>6:64,p=2<k?63&y:64,d.push(o.charAt(b)+o.charAt(m)+o.charAt(C)+o.charAt(p));return d.join("")},i.decode=function(u){var c,v,y,b,m,C,p=0,d=0,h="data:";if(u.substr(0,h.length)===h)throw new Error("Invalid base64 input, it looks like a data url.");var w,k=3*(u=u.replace(/[^A-Za-z0-9+/=]/g,"")).length/4;if(u.charAt(u.length-1)===o.charAt(64)&&k--,u.charAt(u.length-2)===o.charAt(64)&&k--,k%1!=0)throw new Error("Invalid base64 input, bad content length.");for(w=l.uint8array?new Uint8Array(0|k):new Array(0|k);p<u.length;)c=o.indexOf(u.charAt(p++))<<2|(b=o.indexOf(u.charAt(p++)))>>4,v=(15&b)<<4|(m=o.indexOf(u.charAt(p++)))>>2,y=(3&m)<<6|(C=o.indexOf(u.charAt(p++))),w[d++]=c,m!==64&&(w[d++]=v),C!==64&&(w[d++]=y);return w}},{"./support":30,"./utils":32}],2:[function(t,a,i){var n=t("./external"),l=t("./stream/DataWorker"),o=t("./stream/Crc32Probe"),u=t("./stream/DataLengthProbe");function c(v,y,b,m,C){this.compressedSize=v,this.uncompressedSize=y,this.crc32=b,this.compression=m,this.compressedContent=C}c.prototype={getContentWorker:function(){var v=new l(n.Promise.resolve(this.compressedContent)).pipe(this.compression.uncompressWorker()).pipe(new u("data_length")),y=this;return v.on("end",function(){if(this.streamInfo.data_length!==y.uncompressedSize)throw new Error("Bug : uncompressed data size mismatch")}),v},getCompressedWorker:function(){return new l(n.Promise.resolve(this.compressedContent)).withStreamInfo("compressedSize",this.compressedSize).withStreamInfo("uncompressedSize",this.uncompressedSize).withStreamInfo("crc32",this.crc32).withStreamInfo("compression",this.compression)}},c.createWorkerFrom=function(v,y,b){return v.pipe(new o).pipe(new u("uncompressedSize")).pipe(y.compressWorker(b)).pipe(new u("compressedSize")).withStreamInfo("compression",y)},a.exports=c},{"./external":6,"./stream/Crc32Probe":25,"./stream/DataLengthProbe":26,"./stream/DataWorker":27}],3:[function(t,a,i){var n=t("./stream/GenericWorker");i.STORE={magic:"\0\0",compressWorker:function(){return new n("STORE compression")},uncompressWorker:function(){return new n("STORE decompression")}},i.DEFLATE=t("./flate")},{"./flate":7,"./stream/GenericWorker":28}],4:[function(t,a,i){var n=t("./utils"),l=(function(){for(var o,u=[],c=0;c<256;c++){o=c;for(var v=0;v<8;v++)o=1&o?3988292384^o>>>1:o>>>1;u[c]=o}return u})();a.exports=function(o,u){return o!==void 0&&o.length?n.getTypeOf(o)!=="string"?(function(c,v,y,b){var m=l,C=b+y;c^=-1;for(var p=b;p<C;p++)c=c>>>8^m[255&(c^v[p])];return-1^c})(0|u,o,o.length,0):(function(c,v,y,b){var m=l,C=b+y;c^=-1;for(var p=b;p<C;p++)c=c>>>8^m[255&(c^v.charCodeAt(p))];return-1^c})(0|u,o,o.length,0):0}},{"./utils":32}],5:[function(t,a,i){i.base64=!1,i.binary=!1,i.dir=!1,i.createFolders=!0,i.date=null,i.compression=null,i.compressionOptions=null,i.comment=null,i.unixPermissions=null,i.dosPermissions=null},{}],6:[function(t,a,i){var n=null;n=typeof Promise<"u"?Promise:t("lie"),a.exports={Promise:n}},{lie:37}],7:[function(t,a,i){var n=typeof Uint8Array<"u"&&typeof Uint16Array<"u"&&typeof Uint32Array<"u",l=t("pako"),o=t("./utils"),u=t("./stream/GenericWorker"),c=n?"uint8array":"array";function v(y,b){u.call(this,"FlateWorker/"+y),this._pako=null,this._pakoAction=y,this._pakoOptions=b,this.meta={}}i.magic="\b\0",o.inherits(v,u),v.prototype.processChunk=function(y){this.meta=y.meta,this._pako===null&&this._createPako(),this._pako.push(o.transformTo(c,y.data),!1)},v.prototype.flush=function(){u.prototype.flush.call(this),this._pako===null&&this._createPako(),this._pako.push([],!0)},v.prototype.cleanUp=function(){u.prototype.cleanUp.call(this),this._pako=null},v.prototype._createPako=function(){this._pako=new l[this._pakoAction]({raw:!0,level:this._pakoOptions.level||-1});var y=this;this._pako.onData=function(b){y.push({data:b,meta:y.meta})}},i.compressWorker=function(y){return new v("Deflate",y)},i.uncompressWorker=function(){return new v("Inflate",{})}},{"./stream/GenericWorker":28,"./utils":32,pako:38}],8:[function(t,a,i){function n(m,C){var p,d="";for(p=0;p<C;p++)d+=String.fromCharCode(255&m),m>>>=8;return d}function l(m,C,p,d,h,w){var k,x,_=m.file,W=m.compression,P=w!==c.utf8encode,H=o.transformTo("string",w(_.name)),z=o.transformTo("string",c.utf8encode(_.name)),Z=_.comment,ne=o.transformTo("string",w(Z)),F=o.transformTo("string",c.utf8encode(Z)),G=z.length!==_.name.length,f=F.length!==Z.length,q="",pe="",O="",le=_.dir,Y=_.date,ie={crc32:0,compressedSize:0,uncompressedSize:0};C&&!p||(ie.crc32=m.crc32,ie.compressedSize=m.compressedSize,ie.uncompressedSize=m.uncompressedSize);var E=0;C&&(E|=8),P||!G&&!f||(E|=2048);var I=0,$=0;le&&(I|=16),h==="UNIX"?($=798,I|=(function(V,be){var ge=V;return V||(ge=be?16893:33204),(65535&ge)<<16})(_.unixPermissions,le)):($=20,I|=(function(V){return 63&(V||0)})(_.dosPermissions)),k=Y.getUTCHours(),k<<=6,k|=Y.getUTCMinutes(),k<<=5,k|=Y.getUTCSeconds()/2,x=Y.getUTCFullYear()-1980,x<<=4,x|=Y.getUTCMonth()+1,x<<=5,x|=Y.getUTCDate(),G&&(pe=n(1,1)+n(v(H),4)+z,q+="up"+n(pe.length,2)+pe),f&&(O=n(1,1)+n(v(ne),4)+F,q+="uc"+n(O.length,2)+O);var X="";return X+=`
|
|
37
37
|
\0`,X+=n(E,2),X+=W.magic,X+=n(k,2),X+=n(x,2),X+=n(ie.crc32,4),X+=n(ie.compressedSize,4),X+=n(ie.uncompressedSize,4),X+=n(H.length,2),X+=n(q.length,2),{fileRecord:y.LOCAL_FILE_HEADER+X+H+q,dirRecord:y.CENTRAL_FILE_HEADER+n($,2)+X+n(ne.length,2)+"\0\0\0\0"+n(I,4)+n(d,4)+H+q+ne}}var o=t("../utils"),u=t("../stream/GenericWorker"),c=t("../utf8"),v=t("../crc32"),y=t("../signature");function b(m,C,p,d){u.call(this,"ZipFileWorker"),this.bytesWritten=0,this.zipComment=C,this.zipPlatform=p,this.encodeFileName=d,this.streamFiles=m,this.accumulate=!1,this.contentBuffer=[],this.dirRecords=[],this.currentSourceOffset=0,this.entriesCount=0,this.currentFile=null,this._sources=[]}o.inherits(b,u),b.prototype.push=function(m){var C=m.meta.percent||0,p=this.entriesCount,d=this._sources.length;this.accumulate?this.contentBuffer.push(m):(this.bytesWritten+=m.data.length,u.prototype.push.call(this,{data:m.data,meta:{currentFile:this.currentFile,percent:p?(C+100*(p-d-1))/p:100}}))},b.prototype.openedSource=function(m){this.currentSourceOffset=this.bytesWritten,this.currentFile=m.file.name;var C=this.streamFiles&&!m.file.dir;if(C){var p=l(m,C,!1,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);this.push({data:p.fileRecord,meta:{percent:0}})}else this.accumulate=!0},b.prototype.closedSource=function(m){this.accumulate=!1;var C=this.streamFiles&&!m.file.dir,p=l(m,C,!0,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);if(this.dirRecords.push(p.dirRecord),C)this.push({data:(function(d){return y.DATA_DESCRIPTOR+n(d.crc32,4)+n(d.compressedSize,4)+n(d.uncompressedSize,4)})(m),meta:{percent:100}});else for(this.push({data:p.fileRecord,meta:{percent:0}});this.contentBuffer.length;)this.push(this.contentBuffer.shift());this.currentFile=null},b.prototype.flush=function(){for(var m=this.bytesWritten,C=0;C<this.dirRecords.length;C++)this.push({data:this.dirRecords[C],meta:{percent:100}});var p=this.bytesWritten-m,d=(function(h,w,k,x,_){var W=o.transformTo("string",_(x));return y.CENTRAL_DIRECTORY_END+"\0\0\0\0"+n(h,2)+n(h,2)+n(w,4)+n(k,4)+n(W.length,2)+W})(this.dirRecords.length,p,m,this.zipComment,this.encodeFileName);this.push({data:d,meta:{percent:100}})},b.prototype.prepareNextSource=function(){this.previous=this._sources.shift(),this.openedSource(this.previous.streamInfo),this.isPaused?this.previous.pause():this.previous.resume()},b.prototype.registerPrevious=function(m){this._sources.push(m);var C=this;return m.on("data",function(p){C.processChunk(p)}),m.on("end",function(){C.closedSource(C.previous.streamInfo),C._sources.length?C.prepareNextSource():C.end()}),m.on("error",function(p){C.error(p)}),this},b.prototype.resume=function(){return!!u.prototype.resume.call(this)&&(!this.previous&&this._sources.length?(this.prepareNextSource(),!0):this.previous||this._sources.length||this.generatedError?void 0:(this.end(),!0))},b.prototype.error=function(m){var C=this._sources;if(!u.prototype.error.call(this,m))return!1;for(var p=0;p<C.length;p++)try{C[p].error(m)}catch{}return!0},b.prototype.lock=function(){u.prototype.lock.call(this);for(var m=this._sources,C=0;C<m.length;C++)m[C].lock()},a.exports=b},{"../crc32":4,"../signature":23,"../stream/GenericWorker":28,"../utf8":31,"../utils":32}],9:[function(t,a,i){var n=t("../compressions"),l=t("./ZipFileWorker");i.generateWorker=function(o,u,c){var v=new l(u.streamFiles,c,u.platform,u.encodeFileName),y=0;try{o.forEach(function(b,m){y++;var C=(function(w,k){var x=w||k,_=n[x];if(!_)throw new Error(x+" is not a valid compression method !");return _})(m.options.compression,u.compression),p=m.options.compressionOptions||u.compressionOptions||{},d=m.dir,h=m.date;m._compressWorker(C,p).withStreamInfo("file",{name:b,dir:d,date:h,comment:m.comment||"",unixPermissions:m.unixPermissions,dosPermissions:m.dosPermissions}).pipe(v)}),v.entriesCount=y}catch(b){v.error(b)}return v}},{"../compressions":3,"./ZipFileWorker":8}],10:[function(t,a,i){function n(){if(!(this instanceof n))return new n;if(arguments.length)throw new Error("The constructor with parameters has been removed in JSZip 3.0, please check the upgrade guide.");this.files=Object.create(null),this.comment=null,this.root="",this.clone=function(){var l=new n;for(var o in this)typeof this[o]!="function"&&(l[o]=this[o]);return l}}(n.prototype=t("./object")).loadAsync=t("./load"),n.support=t("./support"),n.defaults=t("./defaults"),n.version="3.10.1",n.loadAsync=function(l,o){return new n().loadAsync(l,o)},n.external=t("./external"),a.exports=n},{"./defaults":5,"./external":6,"./load":11,"./object":15,"./support":30}],11:[function(t,a,i){var n=t("./utils"),l=t("./external"),o=t("./utf8"),u=t("./zipEntries"),c=t("./stream/Crc32Probe"),v=t("./nodejsUtils");function y(b){return new l.Promise(function(m,C){var p=b.decompressed.getContentWorker().pipe(new c);p.on("error",function(d){C(d)}).on("end",function(){p.streamInfo.crc32!==b.decompressed.crc32?C(new Error("Corrupted zip : CRC32 mismatch")):m()}).resume()})}a.exports=function(b,m){var C=this;return m=n.extend(m||{},{base64:!1,checkCRC32:!1,optimizedBinaryString:!1,createFolders:!1,decodeFileName:o.utf8decode}),v.isNode&&v.isStream(b)?l.Promise.reject(new Error("JSZip can't accept a stream when loading a zip file.")):n.prepareContent("the loaded zip file",b,!0,m.optimizedBinaryString,m.base64).then(function(p){var d=new u(m);return d.load(p),d}).then(function(p){var d=[l.Promise.resolve(p)],h=p.files;if(m.checkCRC32)for(var w=0;w<h.length;w++)d.push(y(h[w]));return l.Promise.all(d)}).then(function(p){for(var d=p.shift(),h=d.files,w=0;w<h.length;w++){var k=h[w],x=k.fileNameStr,_=n.resolve(k.fileNameStr);C.file(_,k.decompressed,{binary:!0,optimizedBinaryString:!0,date:k.date,dir:k.dir,comment:k.fileCommentStr.length?k.fileCommentStr:null,unixPermissions:k.unixPermissions,dosPermissions:k.dosPermissions,createFolders:m.createFolders}),k.dir||(C.file(_).unsafeOriginalName=x)}return d.zipComment.length&&(C.comment=d.zipComment),C})}},{"./external":6,"./nodejsUtils":14,"./stream/Crc32Probe":25,"./utf8":31,"./utils":32,"./zipEntries":33}],12:[function(t,a,i){var n=t("../utils"),l=t("../stream/GenericWorker");function o(u,c){l.call(this,"Nodejs stream input adapter for "+u),this._upstreamEnded=!1,this._bindStream(c)}n.inherits(o,l),o.prototype._bindStream=function(u){var c=this;(this._stream=u).pause(),u.on("data",function(v){c.push({data:v,meta:{percent:0}})}).on("error",function(v){c.isPaused?this.generatedError=v:c.error(v)}).on("end",function(){c.isPaused?c._upstreamEnded=!0:c.end()})},o.prototype.pause=function(){return!!l.prototype.pause.call(this)&&(this._stream.pause(),!0)},o.prototype.resume=function(){return!!l.prototype.resume.call(this)&&(this._upstreamEnded?this.end():this._stream.resume(),!0)},a.exports=o},{"../stream/GenericWorker":28,"../utils":32}],13:[function(t,a,i){var n=t("readable-stream").Readable;function l(o,u,c){n.call(this,u),this._helper=o;var v=this;o.on("data",function(y,b){v.push(y)||v._helper.pause(),c&&c(b)}).on("error",function(y){v.emit("error",y)}).on("end",function(){v.push(null)})}t("../utils").inherits(l,n),l.prototype._read=function(){this._helper.resume()},a.exports=l},{"../utils":32,"readable-stream":16}],14:[function(t,a,i){a.exports={isNode:typeof Buffer<"u",newBufferFrom:function(n,l){if(Buffer.from&&Buffer.from!==Uint8Array.from)return Buffer.from(n,l);if(typeof n=="number")throw new Error('The "data" argument must not be a number');return new Buffer(n,l)},allocBuffer:function(n){if(Buffer.alloc)return Buffer.alloc(n);var l=new Buffer(n);return l.fill(0),l},isBuffer:function(n){return Buffer.isBuffer(n)},isStream:function(n){return n&&typeof n.on=="function"&&typeof n.pause=="function"&&typeof n.resume=="function"}}},{}],15:[function(t,a,i){function n(_,W,P){var H,z=o.getTypeOf(W),Z=o.extend(P||{},v);Z.date=Z.date||new Date,Z.compression!==null&&(Z.compression=Z.compression.toUpperCase()),typeof Z.unixPermissions=="string"&&(Z.unixPermissions=parseInt(Z.unixPermissions,8)),Z.unixPermissions&&16384&Z.unixPermissions&&(Z.dir=!0),Z.dosPermissions&&16&Z.dosPermissions&&(Z.dir=!0),Z.dir&&(_=h(_)),Z.createFolders&&(H=d(_))&&w.call(this,H,!0);var ne=z==="string"&&Z.binary===!1&&Z.base64===!1;P&&P.binary!==void 0||(Z.binary=!ne),(W instanceof y&&W.uncompressedSize===0||Z.dir||!W||W.length===0)&&(Z.base64=!1,Z.binary=!0,W="",Z.compression="STORE",z="string");var F=null;F=W instanceof y||W instanceof u?W:C.isNode&&C.isStream(W)?new p(_,W):o.prepareContent(_,W,Z.binary,Z.optimizedBinaryString,Z.base64);var G=new b(_,F,Z);this.files[_]=G}var l=t("./utf8"),o=t("./utils"),u=t("./stream/GenericWorker"),c=t("./stream/StreamHelper"),v=t("./defaults"),y=t("./compressedObject"),b=t("./zipObject"),m=t("./generate"),C=t("./nodejsUtils"),p=t("./nodejs/NodejsStreamInputAdapter"),d=function(_){_.slice(-1)==="/"&&(_=_.substring(0,_.length-1));var W=_.lastIndexOf("/");return 0<W?_.substring(0,W):""},h=function(_){return _.slice(-1)!=="/"&&(_+="/"),_},w=function(_,W){return W=W!==void 0?W:v.createFolders,_=h(_),this.files[_]||n.call(this,_,null,{dir:!0,createFolders:W}),this.files[_]};function k(_){return Object.prototype.toString.call(_)==="[object RegExp]"}var x={load:function(){throw new Error("This method has been removed in JSZip 3.0, please check the upgrade guide.")},forEach:function(_){var W,P,H;for(W in this.files)H=this.files[W],(P=W.slice(this.root.length,W.length))&&W.slice(0,this.root.length)===this.root&&_(P,H)},filter:function(_){var W=[];return this.forEach(function(P,H){_(P,H)&&W.push(H)}),W},file:function(_,W,P){if(arguments.length!==1)return _=this.root+_,n.call(this,_,W,P),this;if(k(_)){var H=_;return this.filter(function(Z,ne){return!ne.dir&&H.test(Z)})}var z=this.files[this.root+_];return z&&!z.dir?z:null},folder:function(_){if(!_)return this;if(k(_))return this.filter(function(z,Z){return Z.dir&&_.test(z)});var W=this.root+_,P=w.call(this,W),H=this.clone();return H.root=P.name,H},remove:function(_){_=this.root+_;var W=this.files[_];if(W||(_.slice(-1)!=="/"&&(_+="/"),W=this.files[_]),W&&!W.dir)delete this.files[_];else for(var P=this.filter(function(z,Z){return Z.name.slice(0,_.length)===_}),H=0;H<P.length;H++)delete this.files[P[H].name];return this},generate:function(){throw new Error("This method has been removed in JSZip 3.0, please check the upgrade guide.")},generateInternalStream:function(_){var W,P={};try{if((P=o.extend(_||{},{streamFiles:!1,compression:"STORE",compressionOptions:null,type:"",platform:"DOS",comment:null,mimeType:"application/zip",encodeFileName:l.utf8encode})).type=P.type.toLowerCase(),P.compression=P.compression.toUpperCase(),P.type==="binarystring"&&(P.type="string"),!P.type)throw new Error("No output type specified.");o.checkSupport(P.type),P.platform!=="darwin"&&P.platform!=="freebsd"&&P.platform!=="linux"&&P.platform!=="sunos"||(P.platform="UNIX"),P.platform==="win32"&&(P.platform="DOS");var H=P.comment||this.comment||"";W=m.generateWorker(this,P,H)}catch(z){(W=new u("error")).error(z)}return new c(W,P.type||"string",P.mimeType)},generateAsync:function(_,W){return this.generateInternalStream(_).accumulate(W)},generateNodeStream:function(_,W){return(_=_||{}).type||(_.type="nodebuffer"),this.generateInternalStream(_).toNodejsStream(W)}};a.exports=x},{"./compressedObject":2,"./defaults":5,"./generate":9,"./nodejs/NodejsStreamInputAdapter":12,"./nodejsUtils":14,"./stream/GenericWorker":28,"./stream/StreamHelper":29,"./utf8":31,"./utils":32,"./zipObject":35}],16:[function(t,a,i){a.exports=t("stream")},{stream:void 0}],17:[function(t,a,i){var n=t("./DataReader");function l(o){n.call(this,o);for(var u=0;u<this.data.length;u++)o[u]=255&o[u]}t("../utils").inherits(l,n),l.prototype.byteAt=function(o){return this.data[this.zero+o]},l.prototype.lastIndexOfSignature=function(o){for(var u=o.charCodeAt(0),c=o.charCodeAt(1),v=o.charCodeAt(2),y=o.charCodeAt(3),b=this.length-4;0<=b;--b)if(this.data[b]===u&&this.data[b+1]===c&&this.data[b+2]===v&&this.data[b+3]===y)return b-this.zero;return-1},l.prototype.readAndCheckSignature=function(o){var u=o.charCodeAt(0),c=o.charCodeAt(1),v=o.charCodeAt(2),y=o.charCodeAt(3),b=this.readData(4);return u===b[0]&&c===b[1]&&v===b[2]&&y===b[3]},l.prototype.readData=function(o){if(this.checkOffset(o),o===0)return[];var u=this.data.slice(this.zero+this.index,this.zero+this.index+o);return this.index+=o,u},a.exports=l},{"../utils":32,"./DataReader":18}],18:[function(t,a,i){var n=t("../utils");function l(o){this.data=o,this.length=o.length,this.index=0,this.zero=0}l.prototype={checkOffset:function(o){this.checkIndex(this.index+o)},checkIndex:function(o){if(this.length<this.zero+o||o<0)throw new Error("End of data reached (data length = "+this.length+", asked index = "+o+"). Corrupted zip ?")},setIndex:function(o){this.checkIndex(o),this.index=o},skip:function(o){this.setIndex(this.index+o)},byteAt:function(){},readInt:function(o){var u,c=0;for(this.checkOffset(o),u=this.index+o-1;u>=this.index;u--)c=(c<<8)+this.byteAt(u);return this.index+=o,c},readString:function(o){return n.transformTo("string",this.readData(o))},readData:function(){},lastIndexOfSignature:function(){},readAndCheckSignature:function(){},readDate:function(){var o=this.readInt(4);return new Date(Date.UTC(1980+(o>>25&127),(o>>21&15)-1,o>>16&31,o>>11&31,o>>5&63,(31&o)<<1))}},a.exports=l},{"../utils":32}],19:[function(t,a,i){var n=t("./Uint8ArrayReader");function l(o){n.call(this,o)}t("../utils").inherits(l,n),l.prototype.readData=function(o){this.checkOffset(o);var u=this.data.slice(this.zero+this.index,this.zero+this.index+o);return this.index+=o,u},a.exports=l},{"../utils":32,"./Uint8ArrayReader":21}],20:[function(t,a,i){var n=t("./DataReader");function l(o){n.call(this,o)}t("../utils").inherits(l,n),l.prototype.byteAt=function(o){return this.data.charCodeAt(this.zero+o)},l.prototype.lastIndexOfSignature=function(o){return this.data.lastIndexOf(o)-this.zero},l.prototype.readAndCheckSignature=function(o){return o===this.readData(4)},l.prototype.readData=function(o){this.checkOffset(o);var u=this.data.slice(this.zero+this.index,this.zero+this.index+o);return this.index+=o,u},a.exports=l},{"../utils":32,"./DataReader":18}],21:[function(t,a,i){var n=t("./ArrayReader");function l(o){n.call(this,o)}t("../utils").inherits(l,n),l.prototype.readData=function(o){if(this.checkOffset(o),o===0)return new Uint8Array(0);var u=this.data.subarray(this.zero+this.index,this.zero+this.index+o);return this.index+=o,u},a.exports=l},{"../utils":32,"./ArrayReader":17}],22:[function(t,a,i){var n=t("../utils"),l=t("../support"),o=t("./ArrayReader"),u=t("./StringReader"),c=t("./NodeBufferReader"),v=t("./Uint8ArrayReader");a.exports=function(y){var b=n.getTypeOf(y);return n.checkSupport(b),b!=="string"||l.uint8array?b==="nodebuffer"?new c(y):l.uint8array?new v(n.transformTo("uint8array",y)):new o(n.transformTo("array",y)):new u(y)}},{"../support":30,"../utils":32,"./ArrayReader":17,"./NodeBufferReader":19,"./StringReader":20,"./Uint8ArrayReader":21}],23:[function(t,a,i){i.LOCAL_FILE_HEADER="PK",i.CENTRAL_FILE_HEADER="PK",i.CENTRAL_DIRECTORY_END="PK",i.ZIP64_CENTRAL_DIRECTORY_LOCATOR="PK\x07",i.ZIP64_CENTRAL_DIRECTORY_END="PK",i.DATA_DESCRIPTOR="PK\x07\b"},{}],24:[function(t,a,i){var n=t("./GenericWorker"),l=t("../utils");function o(u){n.call(this,"ConvertWorker to "+u),this.destType=u}l.inherits(o,n),o.prototype.processChunk=function(u){this.push({data:l.transformTo(this.destType,u.data),meta:u.meta})},a.exports=o},{"../utils":32,"./GenericWorker":28}],25:[function(t,a,i){var n=t("./GenericWorker"),l=t("../crc32");function o(){n.call(this,"Crc32Probe"),this.withStreamInfo("crc32",0)}t("../utils").inherits(o,n),o.prototype.processChunk=function(u){this.streamInfo.crc32=l(u.data,this.streamInfo.crc32||0),this.push(u)},a.exports=o},{"../crc32":4,"../utils":32,"./GenericWorker":28}],26:[function(t,a,i){var n=t("../utils"),l=t("./GenericWorker");function o(u){l.call(this,"DataLengthProbe for "+u),this.propName=u,this.withStreamInfo(u,0)}n.inherits(o,l),o.prototype.processChunk=function(u){if(u){var c=this.streamInfo[this.propName]||0;this.streamInfo[this.propName]=c+u.data.length}l.prototype.processChunk.call(this,u)},a.exports=o},{"../utils":32,"./GenericWorker":28}],27:[function(t,a,i){var n=t("../utils"),l=t("./GenericWorker");function o(u){l.call(this,"DataWorker");var c=this;this.dataIsReady=!1,this.index=0,this.max=0,this.data=null,this.type="",this._tickScheduled=!1,u.then(function(v){c.dataIsReady=!0,c.data=v,c.max=v&&v.length||0,c.type=n.getTypeOf(v),c.isPaused||c._tickAndRepeat()},function(v){c.error(v)})}n.inherits(o,l),o.prototype.cleanUp=function(){l.prototype.cleanUp.call(this),this.data=null},o.prototype.resume=function(){return!!l.prototype.resume.call(this)&&(!this._tickScheduled&&this.dataIsReady&&(this._tickScheduled=!0,n.delay(this._tickAndRepeat,[],this)),!0)},o.prototype._tickAndRepeat=function(){this._tickScheduled=!1,this.isPaused||this.isFinished||(this._tick(),this.isFinished||(n.delay(this._tickAndRepeat,[],this),this._tickScheduled=!0))},o.prototype._tick=function(){if(this.isPaused||this.isFinished)return!1;var u=null,c=Math.min(this.max,this.index+16384);if(this.index>=this.max)return this.end();switch(this.type){case"string":u=this.data.substring(this.index,c);break;case"uint8array":u=this.data.subarray(this.index,c);break;case"array":case"nodebuffer":u=this.data.slice(this.index,c)}return this.index=c,this.push({data:u,meta:{percent:this.max?this.index/this.max*100:0}})},a.exports=o},{"../utils":32,"./GenericWorker":28}],28:[function(t,a,i){function n(l){this.name=l||"default",this.streamInfo={},this.generatedError=null,this.extraStreamInfo={},this.isPaused=!0,this.isFinished=!1,this.isLocked=!1,this._listeners={data:[],end:[],error:[]},this.previous=null}n.prototype={push:function(l){this.emit("data",l)},end:function(){if(this.isFinished)return!1;this.flush();try{this.emit("end"),this.cleanUp(),this.isFinished=!0}catch(l){this.emit("error",l)}return!0},error:function(l){return!this.isFinished&&(this.isPaused?this.generatedError=l:(this.isFinished=!0,this.emit("error",l),this.previous&&this.previous.error(l),this.cleanUp()),!0)},on:function(l,o){return this._listeners[l].push(o),this},cleanUp:function(){this.streamInfo=this.generatedError=this.extraStreamInfo=null,this._listeners=[]},emit:function(l,o){if(this._listeners[l])for(var u=0;u<this._listeners[l].length;u++)this._listeners[l][u].call(this,o)},pipe:function(l){return l.registerPrevious(this)},registerPrevious:function(l){if(this.isLocked)throw new Error("The stream '"+this+"' has already been used.");this.streamInfo=l.streamInfo,this.mergeStreamInfo(),this.previous=l;var o=this;return l.on("data",function(u){o.processChunk(u)}),l.on("end",function(){o.end()}),l.on("error",function(u){o.error(u)}),this},pause:function(){return!this.isPaused&&!this.isFinished&&(this.isPaused=!0,this.previous&&this.previous.pause(),!0)},resume:function(){if(!this.isPaused||this.isFinished)return!1;var l=this.isPaused=!1;return this.generatedError&&(this.error(this.generatedError),l=!0),this.previous&&this.previous.resume(),!l},flush:function(){},processChunk:function(l){this.push(l)},withStreamInfo:function(l,o){return this.extraStreamInfo[l]=o,this.mergeStreamInfo(),this},mergeStreamInfo:function(){for(var l in this.extraStreamInfo)Object.prototype.hasOwnProperty.call(this.extraStreamInfo,l)&&(this.streamInfo[l]=this.extraStreamInfo[l])},lock:function(){if(this.isLocked)throw new Error("The stream '"+this+"' has already been used.");this.isLocked=!0,this.previous&&this.previous.lock()},toString:function(){var l="Worker "+this.name;return this.previous?this.previous+" -> "+l:l}},a.exports=n},{}],29:[function(t,a,i){var n=t("../utils"),l=t("./ConvertWorker"),o=t("./GenericWorker"),u=t("../base64"),c=t("../support"),v=t("../external"),y=null;if(c.nodestream)try{y=t("../nodejs/NodejsStreamOutputAdapter")}catch{}function b(C,p){return new v.Promise(function(d,h){var w=[],k=C._internalType,x=C._outputType,_=C._mimeType;C.on("data",function(W,P){w.push(W),p&&p(P)}).on("error",function(W){w=[],h(W)}).on("end",function(){try{var W=(function(P,H,z){switch(P){case"blob":return n.newBlob(n.transformTo("arraybuffer",H),z);case"base64":return u.encode(H);default:return n.transformTo(P,H)}})(x,(function(P,H){var z,Z=0,ne=null,F=0;for(z=0;z<H.length;z++)F+=H[z].length;switch(P){case"string":return H.join("");case"array":return Array.prototype.concat.apply([],H);case"uint8array":for(ne=new Uint8Array(F),z=0;z<H.length;z++)ne.set(H[z],Z),Z+=H[z].length;return ne;case"nodebuffer":return Buffer.concat(H);default:throw new Error("concat : unsupported type '"+P+"'")}})(k,w),_);d(W)}catch(P){h(P)}w=[]}).resume()})}function m(C,p,d){var h=p;switch(p){case"blob":case"arraybuffer":h="uint8array";break;case"base64":h="string"}try{this._internalType=h,this._outputType=p,this._mimeType=d,n.checkSupport(h),this._worker=C.pipe(new l(h)),C.lock()}catch(w){this._worker=new o("error"),this._worker.error(w)}}m.prototype={accumulate:function(C){return b(this,C)},on:function(C,p){var d=this;return C==="data"?this._worker.on(C,function(h){p.call(d,h.data,h.meta)}):this._worker.on(C,function(){n.delay(p,arguments,d)}),this},resume:function(){return n.delay(this._worker.resume,[],this._worker),this},pause:function(){return this._worker.pause(),this},toNodejsStream:function(C){if(n.checkSupport("nodestream"),this._outputType!=="nodebuffer")throw new Error(this._outputType+" is not supported by this method");return new y(this,{objectMode:this._outputType!=="nodebuffer"},C)}},a.exports=m},{"../base64":1,"../external":6,"../nodejs/NodejsStreamOutputAdapter":13,"../support":30,"../utils":32,"./ConvertWorker":24,"./GenericWorker":28}],30:[function(t,a,i){if(i.base64=!0,i.array=!0,i.string=!0,i.arraybuffer=typeof ArrayBuffer<"u"&&typeof Uint8Array<"u",i.nodebuffer=typeof Buffer<"u",i.uint8array=typeof Uint8Array<"u",typeof ArrayBuffer>"u")i.blob=!1;else{var n=new ArrayBuffer(0);try{i.blob=new Blob([n],{type:"application/zip"}).size===0}catch{try{var l=new(self.BlobBuilder||self.WebKitBlobBuilder||self.MozBlobBuilder||self.MSBlobBuilder);l.append(n),i.blob=l.getBlob("application/zip").size===0}catch{i.blob=!1}}}try{i.nodestream=!!t("readable-stream").Readable}catch{i.nodestream=!1}},{"readable-stream":16}],31:[function(t,a,i){for(var n=t("./utils"),l=t("./support"),o=t("./nodejsUtils"),u=t("./stream/GenericWorker"),c=new Array(256),v=0;v<256;v++)c[v]=252<=v?6:248<=v?5:240<=v?4:224<=v?3:192<=v?2:1;c[254]=c[254]=1;function y(){u.call(this,"utf-8 decode"),this.leftOver=null}function b(){u.call(this,"utf-8 encode")}i.utf8encode=function(m){return l.nodebuffer?o.newBufferFrom(m,"utf-8"):(function(C){var p,d,h,w,k,x=C.length,_=0;for(w=0;w<x;w++)(64512&(d=C.charCodeAt(w)))==55296&&w+1<x&&(64512&(h=C.charCodeAt(w+1)))==56320&&(d=65536+(d-55296<<10)+(h-56320),w++),_+=d<128?1:d<2048?2:d<65536?3:4;for(p=l.uint8array?new Uint8Array(_):new Array(_),w=k=0;k<_;w++)(64512&(d=C.charCodeAt(w)))==55296&&w+1<x&&(64512&(h=C.charCodeAt(w+1)))==56320&&(d=65536+(d-55296<<10)+(h-56320),w++),d<128?p[k++]=d:(d<2048?p[k++]=192|d>>>6:(d<65536?p[k++]=224|d>>>12:(p[k++]=240|d>>>18,p[k++]=128|d>>>12&63),p[k++]=128|d>>>6&63),p[k++]=128|63&d);return p})(m)},i.utf8decode=function(m){return l.nodebuffer?n.transformTo("nodebuffer",m).toString("utf-8"):(function(C){var p,d,h,w,k=C.length,x=new Array(2*k);for(p=d=0;p<k;)if((h=C[p++])<128)x[d++]=h;else if(4<(w=c[h]))x[d++]=65533,p+=w-1;else{for(h&=w===2?31:w===3?15:7;1<w&&p<k;)h=h<<6|63&C[p++],w--;1<w?x[d++]=65533:h<65536?x[d++]=h:(h-=65536,x[d++]=55296|h>>10&1023,x[d++]=56320|1023&h)}return x.length!==d&&(x.subarray?x=x.subarray(0,d):x.length=d),n.applyFromCharCode(x)})(m=n.transformTo(l.uint8array?"uint8array":"array",m))},n.inherits(y,u),y.prototype.processChunk=function(m){var C=n.transformTo(l.uint8array?"uint8array":"array",m.data);if(this.leftOver&&this.leftOver.length){if(l.uint8array){var p=C;(C=new Uint8Array(p.length+this.leftOver.length)).set(this.leftOver,0),C.set(p,this.leftOver.length)}else C=this.leftOver.concat(C);this.leftOver=null}var d=(function(w,k){var x;for((k=k||w.length)>w.length&&(k=w.length),x=k-1;0<=x&&(192&w[x])==128;)x--;return x<0||x===0?k:x+c[w[x]]>k?x:k})(C),h=C;d!==C.length&&(l.uint8array?(h=C.subarray(0,d),this.leftOver=C.subarray(d,C.length)):(h=C.slice(0,d),this.leftOver=C.slice(d,C.length))),this.push({data:i.utf8decode(h),meta:m.meta})},y.prototype.flush=function(){this.leftOver&&this.leftOver.length&&(this.push({data:i.utf8decode(this.leftOver),meta:{}}),this.leftOver=null)},i.Utf8DecodeWorker=y,n.inherits(b,u),b.prototype.processChunk=function(m){this.push({data:i.utf8encode(m.data),meta:m.meta})},i.Utf8EncodeWorker=b},{"./nodejsUtils":14,"./stream/GenericWorker":28,"./support":30,"./utils":32}],32:[function(t,a,i){var n=t("./support"),l=t("./base64"),o=t("./nodejsUtils"),u=t("./external");function c(p){return p}function v(p,d){for(var h=0;h<p.length;++h)d[h]=255&p.charCodeAt(h);return d}t("setimmediate"),i.newBlob=function(p,d){i.checkSupport("blob");try{return new Blob([p],{type:d})}catch{try{var h=new(self.BlobBuilder||self.WebKitBlobBuilder||self.MozBlobBuilder||self.MSBlobBuilder);return h.append(p),h.getBlob(d)}catch{throw new Error("Bug : can't construct the Blob.")}}};var y={stringifyByChunk:function(p,d,h){var w=[],k=0,x=p.length;if(x<=h)return String.fromCharCode.apply(null,p);for(;k<x;)d==="array"||d==="nodebuffer"?w.push(String.fromCharCode.apply(null,p.slice(k,Math.min(k+h,x)))):w.push(String.fromCharCode.apply(null,p.subarray(k,Math.min(k+h,x)))),k+=h;return w.join("")},stringifyByChar:function(p){for(var d="",h=0;h<p.length;h++)d+=String.fromCharCode(p[h]);return d},applyCanBeUsed:{uint8array:(function(){try{return n.uint8array&&String.fromCharCode.apply(null,new Uint8Array(1)).length===1}catch{return!1}})(),nodebuffer:(function(){try{return n.nodebuffer&&String.fromCharCode.apply(null,o.allocBuffer(1)).length===1}catch{return!1}})()}};function b(p){var d=65536,h=i.getTypeOf(p),w=!0;if(h==="uint8array"?w=y.applyCanBeUsed.uint8array:h==="nodebuffer"&&(w=y.applyCanBeUsed.nodebuffer),w)for(;1<d;)try{return y.stringifyByChunk(p,h,d)}catch{d=Math.floor(d/2)}return y.stringifyByChar(p)}function m(p,d){for(var h=0;h<p.length;h++)d[h]=p[h];return d}i.applyFromCharCode=b;var C={};C.string={string:c,array:function(p){return v(p,new Array(p.length))},arraybuffer:function(p){return C.string.uint8array(p).buffer},uint8array:function(p){return v(p,new Uint8Array(p.length))},nodebuffer:function(p){return v(p,o.allocBuffer(p.length))}},C.array={string:b,array:c,arraybuffer:function(p){return new Uint8Array(p).buffer},uint8array:function(p){return new Uint8Array(p)},nodebuffer:function(p){return o.newBufferFrom(p)}},C.arraybuffer={string:function(p){return b(new Uint8Array(p))},array:function(p){return m(new Uint8Array(p),new Array(p.byteLength))},arraybuffer:c,uint8array:function(p){return new Uint8Array(p)},nodebuffer:function(p){return o.newBufferFrom(new Uint8Array(p))}},C.uint8array={string:b,array:function(p){return m(p,new Array(p.length))},arraybuffer:function(p){return p.buffer},uint8array:c,nodebuffer:function(p){return o.newBufferFrom(p)}},C.nodebuffer={string:b,array:function(p){return m(p,new Array(p.length))},arraybuffer:function(p){return C.nodebuffer.uint8array(p).buffer},uint8array:function(p){return m(p,new Uint8Array(p.length))},nodebuffer:c},i.transformTo=function(p,d){if(d=d||"",!p)return d;i.checkSupport(p);var h=i.getTypeOf(d);return C[h][p](d)},i.resolve=function(p){for(var d=p.split("/"),h=[],w=0;w<d.length;w++){var k=d[w];k==="."||k===""&&w!==0&&w!==d.length-1||(k===".."?h.pop():h.push(k))}return h.join("/")},i.getTypeOf=function(p){return typeof p=="string"?"string":Object.prototype.toString.call(p)==="[object Array]"?"array":n.nodebuffer&&o.isBuffer(p)?"nodebuffer":n.uint8array&&p instanceof Uint8Array?"uint8array":n.arraybuffer&&p instanceof ArrayBuffer?"arraybuffer":void 0},i.checkSupport=function(p){if(!n[p.toLowerCase()])throw new Error(p+" is not supported by this platform")},i.MAX_VALUE_16BITS=65535,i.MAX_VALUE_32BITS=-1,i.pretty=function(p){var d,h,w="";for(h=0;h<(p||"").length;h++)w+="\\x"+((d=p.charCodeAt(h))<16?"0":"")+d.toString(16).toUpperCase();return w},i.delay=function(p,d,h){setImmediate(function(){p.apply(h||null,d||[])})},i.inherits=function(p,d){function h(){}h.prototype=d.prototype,p.prototype=new h},i.extend=function(){var p,d,h={};for(p=0;p<arguments.length;p++)for(d in arguments[p])Object.prototype.hasOwnProperty.call(arguments[p],d)&&h[d]===void 0&&(h[d]=arguments[p][d]);return h},i.prepareContent=function(p,d,h,w,k){return u.Promise.resolve(d).then(function(x){return n.blob&&(x instanceof Blob||["[object File]","[object Blob]"].indexOf(Object.prototype.toString.call(x))!==-1)&&typeof FileReader<"u"?new u.Promise(function(_,W){var P=new FileReader;P.onload=function(H){_(H.target.result)},P.onerror=function(H){W(H.target.error)},P.readAsArrayBuffer(x)}):x}).then(function(x){var _=i.getTypeOf(x);return _?(_==="arraybuffer"?x=i.transformTo("uint8array",x):_==="string"&&(k?x=l.decode(x):h&&w!==!0&&(x=(function(W){return v(W,n.uint8array?new Uint8Array(W.length):new Array(W.length))})(x))),x):u.Promise.reject(new Error("Can't read the data of '"+p+"'. Is it in a supported JavaScript type (String, Blob, ArrayBuffer, etc) ?"))})}},{"./base64":1,"./external":6,"./nodejsUtils":14,"./support":30,setimmediate:54}],33:[function(t,a,i){var n=t("./reader/readerFor"),l=t("./utils"),o=t("./signature"),u=t("./zipEntry"),c=t("./support");function v(y){this.files=[],this.loadOptions=y}v.prototype={checkSignature:function(y){if(!this.reader.readAndCheckSignature(y)){this.reader.index-=4;var b=this.reader.readString(4);throw new Error("Corrupted zip or bug: unexpected signature ("+l.pretty(b)+", expected "+l.pretty(y)+")")}},isSignature:function(y,b){var m=this.reader.index;this.reader.setIndex(y);var C=this.reader.readString(4)===b;return this.reader.setIndex(m),C},readBlockEndOfCentral:function(){this.diskNumber=this.reader.readInt(2),this.diskWithCentralDirStart=this.reader.readInt(2),this.centralDirRecordsOnThisDisk=this.reader.readInt(2),this.centralDirRecords=this.reader.readInt(2),this.centralDirSize=this.reader.readInt(4),this.centralDirOffset=this.reader.readInt(4),this.zipCommentLength=this.reader.readInt(2);var y=this.reader.readData(this.zipCommentLength),b=c.uint8array?"uint8array":"array",m=l.transformTo(b,y);this.zipComment=this.loadOptions.decodeFileName(m)},readBlockZip64EndOfCentral:function(){this.zip64EndOfCentralSize=this.reader.readInt(8),this.reader.skip(4),this.diskNumber=this.reader.readInt(4),this.diskWithCentralDirStart=this.reader.readInt(4),this.centralDirRecordsOnThisDisk=this.reader.readInt(8),this.centralDirRecords=this.reader.readInt(8),this.centralDirSize=this.reader.readInt(8),this.centralDirOffset=this.reader.readInt(8),this.zip64ExtensibleData={};for(var y,b,m,C=this.zip64EndOfCentralSize-44;0<C;)y=this.reader.readInt(2),b=this.reader.readInt(4),m=this.reader.readData(b),this.zip64ExtensibleData[y]={id:y,length:b,value:m}},readBlockZip64EndOfCentralLocator:function(){if(this.diskWithZip64CentralDirStart=this.reader.readInt(4),this.relativeOffsetEndOfZip64CentralDir=this.reader.readInt(8),this.disksCount=this.reader.readInt(4),1<this.disksCount)throw new Error("Multi-volumes zip are not supported")},readLocalFiles:function(){var y,b;for(y=0;y<this.files.length;y++)b=this.files[y],this.reader.setIndex(b.localHeaderOffset),this.checkSignature(o.LOCAL_FILE_HEADER),b.readLocalPart(this.reader),b.handleUTF8(),b.processAttributes()},readCentralDir:function(){var y;for(this.reader.setIndex(this.centralDirOffset);this.reader.readAndCheckSignature(o.CENTRAL_FILE_HEADER);)(y=new u({zip64:this.zip64},this.loadOptions)).readCentralPart(this.reader),this.files.push(y);if(this.centralDirRecords!==this.files.length&&this.centralDirRecords!==0&&this.files.length===0)throw new Error("Corrupted zip or bug: expected "+this.centralDirRecords+" records in central dir, got "+this.files.length)},readEndOfCentral:function(){var y=this.reader.lastIndexOfSignature(o.CENTRAL_DIRECTORY_END);if(y<0)throw this.isSignature(0,o.LOCAL_FILE_HEADER)?new Error("Corrupted zip: can't find end of central directory"):new Error("Can't find end of central directory : is this a zip file ? If it is, see https://stuk.github.io/jszip/documentation/howto/read_zip.html");this.reader.setIndex(y);var b=y;if(this.checkSignature(o.CENTRAL_DIRECTORY_END),this.readBlockEndOfCentral(),this.diskNumber===l.MAX_VALUE_16BITS||this.diskWithCentralDirStart===l.MAX_VALUE_16BITS||this.centralDirRecordsOnThisDisk===l.MAX_VALUE_16BITS||this.centralDirRecords===l.MAX_VALUE_16BITS||this.centralDirSize===l.MAX_VALUE_32BITS||this.centralDirOffset===l.MAX_VALUE_32BITS){if(this.zip64=!0,(y=this.reader.lastIndexOfSignature(o.ZIP64_CENTRAL_DIRECTORY_LOCATOR))<0)throw new Error("Corrupted zip: can't find the ZIP64 end of central directory locator");if(this.reader.setIndex(y),this.checkSignature(o.ZIP64_CENTRAL_DIRECTORY_LOCATOR),this.readBlockZip64EndOfCentralLocator(),!this.isSignature(this.relativeOffsetEndOfZip64CentralDir,o.ZIP64_CENTRAL_DIRECTORY_END)&&(this.relativeOffsetEndOfZip64CentralDir=this.reader.lastIndexOfSignature(o.ZIP64_CENTRAL_DIRECTORY_END),this.relativeOffsetEndOfZip64CentralDir<0))throw new Error("Corrupted zip: can't find the ZIP64 end of central directory");this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir),this.checkSignature(o.ZIP64_CENTRAL_DIRECTORY_END),this.readBlockZip64EndOfCentral()}var m=this.centralDirOffset+this.centralDirSize;this.zip64&&(m+=20,m+=12+this.zip64EndOfCentralSize);var C=b-m;if(0<C)this.isSignature(b,o.CENTRAL_FILE_HEADER)||(this.reader.zero=C);else if(C<0)throw new Error("Corrupted zip: missing "+Math.abs(C)+" bytes.")},prepareReader:function(y){this.reader=n(y)},load:function(y){this.prepareReader(y),this.readEndOfCentral(),this.readCentralDir(),this.readLocalFiles()}},a.exports=v},{"./reader/readerFor":22,"./signature":23,"./support":30,"./utils":32,"./zipEntry":34}],34:[function(t,a,i){var n=t("./reader/readerFor"),l=t("./utils"),o=t("./compressedObject"),u=t("./crc32"),c=t("./utf8"),v=t("./compressions"),y=t("./support");function b(m,C){this.options=m,this.loadOptions=C}b.prototype={isEncrypted:function(){return(1&this.bitFlag)==1},useUTF8:function(){return(2048&this.bitFlag)==2048},readLocalPart:function(m){var C,p;if(m.skip(22),this.fileNameLength=m.readInt(2),p=m.readInt(2),this.fileName=m.readData(this.fileNameLength),m.skip(p),this.compressedSize===-1||this.uncompressedSize===-1)throw new Error("Bug or corrupted zip : didn't get enough information from the central directory (compressedSize === -1 || uncompressedSize === -1)");if((C=(function(d){for(var h in v)if(Object.prototype.hasOwnProperty.call(v,h)&&v[h].magic===d)return v[h];return null})(this.compressionMethod))===null)throw new Error("Corrupted zip : compression "+l.pretty(this.compressionMethod)+" unknown (inner file : "+l.transformTo("string",this.fileName)+")");this.decompressed=new o(this.compressedSize,this.uncompressedSize,this.crc32,C,m.readData(this.compressedSize))},readCentralPart:function(m){this.versionMadeBy=m.readInt(2),m.skip(2),this.bitFlag=m.readInt(2),this.compressionMethod=m.readString(2),this.date=m.readDate(),this.crc32=m.readInt(4),this.compressedSize=m.readInt(4),this.uncompressedSize=m.readInt(4);var C=m.readInt(2);if(this.extraFieldsLength=m.readInt(2),this.fileCommentLength=m.readInt(2),this.diskNumberStart=m.readInt(2),this.internalFileAttributes=m.readInt(2),this.externalFileAttributes=m.readInt(4),this.localHeaderOffset=m.readInt(4),this.isEncrypted())throw new Error("Encrypted zip are not supported");m.skip(C),this.readExtraFields(m),this.parseZIP64ExtraField(m),this.fileComment=m.readData(this.fileCommentLength)},processAttributes:function(){this.unixPermissions=null,this.dosPermissions=null;var m=this.versionMadeBy>>8;this.dir=!!(16&this.externalFileAttributes),m==0&&(this.dosPermissions=63&this.externalFileAttributes),m==3&&(this.unixPermissions=this.externalFileAttributes>>16&65535),this.dir||this.fileNameStr.slice(-1)!=="/"||(this.dir=!0)},parseZIP64ExtraField:function(){if(this.extraFields[1]){var m=n(this.extraFields[1].value);this.uncompressedSize===l.MAX_VALUE_32BITS&&(this.uncompressedSize=m.readInt(8)),this.compressedSize===l.MAX_VALUE_32BITS&&(this.compressedSize=m.readInt(8)),this.localHeaderOffset===l.MAX_VALUE_32BITS&&(this.localHeaderOffset=m.readInt(8)),this.diskNumberStart===l.MAX_VALUE_32BITS&&(this.diskNumberStart=m.readInt(4))}},readExtraFields:function(m){var C,p,d,h=m.index+this.extraFieldsLength;for(this.extraFields||(this.extraFields={});m.index+4<h;)C=m.readInt(2),p=m.readInt(2),d=m.readData(p),this.extraFields[C]={id:C,length:p,value:d};m.setIndex(h)},handleUTF8:function(){var m=y.uint8array?"uint8array":"array";if(this.useUTF8())this.fileNameStr=c.utf8decode(this.fileName),this.fileCommentStr=c.utf8decode(this.fileComment);else{var C=this.findExtraFieldUnicodePath();if(C!==null)this.fileNameStr=C;else{var p=l.transformTo(m,this.fileName);this.fileNameStr=this.loadOptions.decodeFileName(p)}var d=this.findExtraFieldUnicodeComment();if(d!==null)this.fileCommentStr=d;else{var h=l.transformTo(m,this.fileComment);this.fileCommentStr=this.loadOptions.decodeFileName(h)}}},findExtraFieldUnicodePath:function(){var m=this.extraFields[28789];if(m){var C=n(m.value);return C.readInt(1)!==1||u(this.fileName)!==C.readInt(4)?null:c.utf8decode(C.readData(m.length-5))}return null},findExtraFieldUnicodeComment:function(){var m=this.extraFields[25461];if(m){var C=n(m.value);return C.readInt(1)!==1||u(this.fileComment)!==C.readInt(4)?null:c.utf8decode(C.readData(m.length-5))}return null}},a.exports=b},{"./compressedObject":2,"./compressions":3,"./crc32":4,"./reader/readerFor":22,"./support":30,"./utf8":31,"./utils":32}],35:[function(t,a,i){function n(C,p,d){this.name=C,this.dir=d.dir,this.date=d.date,this.comment=d.comment,this.unixPermissions=d.unixPermissions,this.dosPermissions=d.dosPermissions,this._data=p,this._dataBinary=d.binary,this.options={compression:d.compression,compressionOptions:d.compressionOptions}}var l=t("./stream/StreamHelper"),o=t("./stream/DataWorker"),u=t("./utf8"),c=t("./compressedObject"),v=t("./stream/GenericWorker");n.prototype={internalStream:function(C){var p=null,d="string";try{if(!C)throw new Error("No output type specified.");var h=(d=C.toLowerCase())==="string"||d==="text";d!=="binarystring"&&d!=="text"||(d="string"),p=this._decompressWorker();var w=!this._dataBinary;w&&!h&&(p=p.pipe(new u.Utf8EncodeWorker)),!w&&h&&(p=p.pipe(new u.Utf8DecodeWorker))}catch(k){(p=new v("error")).error(k)}return new l(p,d,"")},async:function(C,p){return this.internalStream(C).accumulate(p)},nodeStream:function(C,p){return this.internalStream(C||"nodebuffer").toNodejsStream(p)},_compressWorker:function(C,p){if(this._data instanceof c&&this._data.compression.magic===C.magic)return this._data.getCompressedWorker();var d=this._decompressWorker();return this._dataBinary||(d=d.pipe(new u.Utf8EncodeWorker)),c.createWorkerFrom(d,C,p)},_decompressWorker:function(){return this._data instanceof c?this._data.getContentWorker():this._data instanceof v?this._data:new o(this._data)}};for(var y=["asText","asBinary","asNodeBuffer","asUint8Array","asArrayBuffer"],b=function(){throw new Error("This method has been removed in JSZip 3.0, please check the upgrade guide.")},m=0;m<y.length;m++)n.prototype[y[m]]=b;a.exports=n},{"./compressedObject":2,"./stream/DataWorker":27,"./stream/GenericWorker":28,"./stream/StreamHelper":29,"./utf8":31}],36:[function(t,a,i){(function(n){var l,o,u=n.MutationObserver||n.WebKitMutationObserver;if(u){var c=0,v=new u(C),y=n.document.createTextNode("");v.observe(y,{characterData:!0}),l=function(){y.data=c=++c%2}}else if(n.setImmediate||n.MessageChannel===void 0)l="document"in n&&"onreadystatechange"in n.document.createElement("script")?function(){var p=n.document.createElement("script");p.onreadystatechange=function(){C(),p.onreadystatechange=null,p.parentNode.removeChild(p),p=null},n.document.documentElement.appendChild(p)}:function(){setTimeout(C,0)};else{var b=new n.MessageChannel;b.port1.onmessage=C,l=function(){b.port2.postMessage(0)}}var m=[];function C(){var p,d;o=!0;for(var h=m.length;h;){for(d=m,m=[],p=-1;++p<h;)d[p]();h=m.length}o=!1}a.exports=function(p){m.push(p)!==1||o||l()}}).call(this,typeof vt<"u"?vt:typeof self<"u"?self:typeof window<"u"?window:{})},{}],37:[function(t,a,i){var n=t("immediate");function l(){}var o={},u=["REJECTED"],c=["FULFILLED"],v=["PENDING"];function y(h){if(typeof h!="function")throw new TypeError("resolver must be a function");this.state=v,this.queue=[],this.outcome=void 0,h!==l&&p(this,h)}function b(h,w,k){this.promise=h,typeof w=="function"&&(this.onFulfilled=w,this.callFulfilled=this.otherCallFulfilled),typeof k=="function"&&(this.onRejected=k,this.callRejected=this.otherCallRejected)}function m(h,w,k){n(function(){var x;try{x=w(k)}catch(_){return o.reject(h,_)}x===h?o.reject(h,new TypeError("Cannot resolve promise with itself")):o.resolve(h,x)})}function C(h){var w=h&&h.then;if(h&&(typeof h=="object"||typeof h=="function")&&typeof w=="function")return function(){w.apply(h,arguments)}}function p(h,w){var k=!1;function x(P){k||(k=!0,o.reject(h,P))}function _(P){k||(k=!0,o.resolve(h,P))}var W=d(function(){w(_,x)});W.status==="error"&&x(W.value)}function d(h,w){var k={};try{k.value=h(w),k.status="success"}catch(x){k.status="error",k.value=x}return k}(a.exports=y).prototype.finally=function(h){if(typeof h!="function")return this;var w=this.constructor;return this.then(function(k){return w.resolve(h()).then(function(){return k})},function(k){return w.resolve(h()).then(function(){throw k})})},y.prototype.catch=function(h){return this.then(null,h)},y.prototype.then=function(h,w){if(typeof h!="function"&&this.state===c||typeof w!="function"&&this.state===u)return this;var k=new this.constructor(l);return this.state!==v?m(k,this.state===c?h:w,this.outcome):this.queue.push(new b(k,h,w)),k},b.prototype.callFulfilled=function(h){o.resolve(this.promise,h)},b.prototype.otherCallFulfilled=function(h){m(this.promise,this.onFulfilled,h)},b.prototype.callRejected=function(h){o.reject(this.promise,h)},b.prototype.otherCallRejected=function(h){m(this.promise,this.onRejected,h)},o.resolve=function(h,w){var k=d(C,w);if(k.status==="error")return o.reject(h,k.value);var x=k.value;if(x)p(h,x);else{h.state=c,h.outcome=w;for(var _=-1,W=h.queue.length;++_<W;)h.queue[_].callFulfilled(w)}return h},o.reject=function(h,w){h.state=u,h.outcome=w;for(var k=-1,x=h.queue.length;++k<x;)h.queue[k].callRejected(w);return h},y.resolve=function(h){return h instanceof this?h:o.resolve(new this(l),h)},y.reject=function(h){var w=new this(l);return o.reject(w,h)},y.all=function(h){var w=this;if(Object.prototype.toString.call(h)!=="[object Array]")return this.reject(new TypeError("must be an array"));var k=h.length,x=!1;if(!k)return this.resolve([]);for(var _=new Array(k),W=0,P=-1,H=new this(l);++P<k;)z(h[P],P);return H;function z(Z,ne){w.resolve(Z).then(function(F){_[ne]=F,++W!==k||x||(x=!0,o.resolve(H,_))},function(F){x||(x=!0,o.reject(H,F))})}},y.race=function(h){var w=this;if(Object.prototype.toString.call(h)!=="[object Array]")return this.reject(new TypeError("must be an array"));var k=h.length,x=!1;if(!k)return this.resolve([]);for(var _=-1,W=new this(l);++_<k;)P=h[_],w.resolve(P).then(function(H){x||(x=!0,o.resolve(W,H))},function(H){x||(x=!0,o.reject(W,H))});var P;return W}},{immediate:36}],38:[function(t,a,i){var n={};(0,t("./lib/utils/common").assign)(n,t("./lib/deflate"),t("./lib/inflate"),t("./lib/zlib/constants")),a.exports=n},{"./lib/deflate":39,"./lib/inflate":40,"./lib/utils/common":41,"./lib/zlib/constants":44}],39:[function(t,a,i){var n=t("./zlib/deflate"),l=t("./utils/common"),o=t("./utils/strings"),u=t("./zlib/messages"),c=t("./zlib/zstream"),v=Object.prototype.toString,y=0,b=-1,m=0,C=8;function p(h){if(!(this instanceof p))return new p(h);this.options=l.assign({level:b,method:C,chunkSize:16384,windowBits:15,memLevel:8,strategy:m,to:""},h||{});var w=this.options;w.raw&&0<w.windowBits?w.windowBits=-w.windowBits:w.gzip&&0<w.windowBits&&w.windowBits<16&&(w.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new c,this.strm.avail_out=0;var k=n.deflateInit2(this.strm,w.level,w.method,w.windowBits,w.memLevel,w.strategy);if(k!==y)throw new Error(u[k]);if(w.header&&n.deflateSetHeader(this.strm,w.header),w.dictionary){var x;if(x=typeof w.dictionary=="string"?o.string2buf(w.dictionary):v.call(w.dictionary)==="[object ArrayBuffer]"?new Uint8Array(w.dictionary):w.dictionary,(k=n.deflateSetDictionary(this.strm,x))!==y)throw new Error(u[k]);this._dict_set=!0}}function d(h,w){var k=new p(w);if(k.push(h,!0),k.err)throw k.msg||u[k.err];return k.result}p.prototype.push=function(h,w){var k,x,_=this.strm,W=this.options.chunkSize;if(this.ended)return!1;x=w===~~w?w:w===!0?4:0,typeof h=="string"?_.input=o.string2buf(h):v.call(h)==="[object ArrayBuffer]"?_.input=new Uint8Array(h):_.input=h,_.next_in=0,_.avail_in=_.input.length;do{if(_.avail_out===0&&(_.output=new l.Buf8(W),_.next_out=0,_.avail_out=W),(k=n.deflate(_,x))!==1&&k!==y)return this.onEnd(k),!(this.ended=!0);_.avail_out!==0&&(_.avail_in!==0||x!==4&&x!==2)||(this.options.to==="string"?this.onData(o.buf2binstring(l.shrinkBuf(_.output,_.next_out))):this.onData(l.shrinkBuf(_.output,_.next_out)))}while((0<_.avail_in||_.avail_out===0)&&k!==1);return x===4?(k=n.deflateEnd(this.strm),this.onEnd(k),this.ended=!0,k===y):x!==2||(this.onEnd(y),!(_.avail_out=0))},p.prototype.onData=function(h){this.chunks.push(h)},p.prototype.onEnd=function(h){h===y&&(this.options.to==="string"?this.result=this.chunks.join(""):this.result=l.flattenChunks(this.chunks)),this.chunks=[],this.err=h,this.msg=this.strm.msg},i.Deflate=p,i.deflate=d,i.deflateRaw=function(h,w){return(w=w||{}).raw=!0,d(h,w)},i.gzip=function(h,w){return(w=w||{}).gzip=!0,d(h,w)}},{"./utils/common":41,"./utils/strings":42,"./zlib/deflate":46,"./zlib/messages":51,"./zlib/zstream":53}],40:[function(t,a,i){var n=t("./zlib/inflate"),l=t("./utils/common"),o=t("./utils/strings"),u=t("./zlib/constants"),c=t("./zlib/messages"),v=t("./zlib/zstream"),y=t("./zlib/gzheader"),b=Object.prototype.toString;function m(p){if(!(this instanceof m))return new m(p);this.options=l.assign({chunkSize:16384,windowBits:0,to:""},p||{});var d=this.options;d.raw&&0<=d.windowBits&&d.windowBits<16&&(d.windowBits=-d.windowBits,d.windowBits===0&&(d.windowBits=-15)),!(0<=d.windowBits&&d.windowBits<16)||p&&p.windowBits||(d.windowBits+=32),15<d.windowBits&&d.windowBits<48&&(15&d.windowBits)==0&&(d.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new v,this.strm.avail_out=0;var h=n.inflateInit2(this.strm,d.windowBits);if(h!==u.Z_OK)throw new Error(c[h]);this.header=new y,n.inflateGetHeader(this.strm,this.header)}function C(p,d){var h=new m(d);if(h.push(p,!0),h.err)throw h.msg||c[h.err];return h.result}m.prototype.push=function(p,d){var h,w,k,x,_,W,P=this.strm,H=this.options.chunkSize,z=this.options.dictionary,Z=!1;if(this.ended)return!1;w=d===~~d?d:d===!0?u.Z_FINISH:u.Z_NO_FLUSH,typeof p=="string"?P.input=o.binstring2buf(p):b.call(p)==="[object ArrayBuffer]"?P.input=new Uint8Array(p):P.input=p,P.next_in=0,P.avail_in=P.input.length;do{if(P.avail_out===0&&(P.output=new l.Buf8(H),P.next_out=0,P.avail_out=H),(h=n.inflate(P,u.Z_NO_FLUSH))===u.Z_NEED_DICT&&z&&(W=typeof z=="string"?o.string2buf(z):b.call(z)==="[object ArrayBuffer]"?new Uint8Array(z):z,h=n.inflateSetDictionary(this.strm,W)),h===u.Z_BUF_ERROR&&Z===!0&&(h=u.Z_OK,Z=!1),h!==u.Z_STREAM_END&&h!==u.Z_OK)return this.onEnd(h),!(this.ended=!0);P.next_out&&(P.avail_out!==0&&h!==u.Z_STREAM_END&&(P.avail_in!==0||w!==u.Z_FINISH&&w!==u.Z_SYNC_FLUSH)||(this.options.to==="string"?(k=o.utf8border(P.output,P.next_out),x=P.next_out-k,_=o.buf2string(P.output,k),P.next_out=x,P.avail_out=H-x,x&&l.arraySet(P.output,P.output,k,x,0),this.onData(_)):this.onData(l.shrinkBuf(P.output,P.next_out)))),P.avail_in===0&&P.avail_out===0&&(Z=!0)}while((0<P.avail_in||P.avail_out===0)&&h!==u.Z_STREAM_END);return h===u.Z_STREAM_END&&(w=u.Z_FINISH),w===u.Z_FINISH?(h=n.inflateEnd(this.strm),this.onEnd(h),this.ended=!0,h===u.Z_OK):w!==u.Z_SYNC_FLUSH||(this.onEnd(u.Z_OK),!(P.avail_out=0))},m.prototype.onData=function(p){this.chunks.push(p)},m.prototype.onEnd=function(p){p===u.Z_OK&&(this.options.to==="string"?this.result=this.chunks.join(""):this.result=l.flattenChunks(this.chunks)),this.chunks=[],this.err=p,this.msg=this.strm.msg},i.Inflate=m,i.inflate=C,i.inflateRaw=function(p,d){return(d=d||{}).raw=!0,C(p,d)},i.ungzip=C},{"./utils/common":41,"./utils/strings":42,"./zlib/constants":44,"./zlib/gzheader":47,"./zlib/inflate":49,"./zlib/messages":51,"./zlib/zstream":53}],41:[function(t,a,i){var n=typeof Uint8Array<"u"&&typeof Uint16Array<"u"&&typeof Int32Array<"u";i.assign=function(u){for(var c=Array.prototype.slice.call(arguments,1);c.length;){var v=c.shift();if(v){if(typeof v!="object")throw new TypeError(v+"must be non-object");for(var y in v)v.hasOwnProperty(y)&&(u[y]=v[y])}}return u},i.shrinkBuf=function(u,c){return u.length===c?u:u.subarray?u.subarray(0,c):(u.length=c,u)};var l={arraySet:function(u,c,v,y,b){if(c.subarray&&u.subarray)u.set(c.subarray(v,v+y),b);else for(var m=0;m<y;m++)u[b+m]=c[v+m]},flattenChunks:function(u){var c,v,y,b,m,C;for(c=y=0,v=u.length;c<v;c++)y+=u[c].length;for(C=new Uint8Array(y),c=b=0,v=u.length;c<v;c++)m=u[c],C.set(m,b),b+=m.length;return C}},o={arraySet:function(u,c,v,y,b){for(var m=0;m<y;m++)u[b+m]=c[v+m]},flattenChunks:function(u){return[].concat.apply([],u)}};i.setTyped=function(u){u?(i.Buf8=Uint8Array,i.Buf16=Uint16Array,i.Buf32=Int32Array,i.assign(i,l)):(i.Buf8=Array,i.Buf16=Array,i.Buf32=Array,i.assign(i,o))},i.setTyped(n)},{}],42:[function(t,a,i){var n=t("./common"),l=!0,o=!0;try{String.fromCharCode.apply(null,[0])}catch{l=!1}try{String.fromCharCode.apply(null,new Uint8Array(1))}catch{o=!1}for(var u=new n.Buf8(256),c=0;c<256;c++)u[c]=252<=c?6:248<=c?5:240<=c?4:224<=c?3:192<=c?2:1;function v(y,b){if(b<65537&&(y.subarray&&o||!y.subarray&&l))return String.fromCharCode.apply(null,n.shrinkBuf(y,b));for(var m="",C=0;C<b;C++)m+=String.fromCharCode(y[C]);return m}u[254]=u[254]=1,i.string2buf=function(y){var b,m,C,p,d,h=y.length,w=0;for(p=0;p<h;p++)(64512&(m=y.charCodeAt(p)))==55296&&p+1<h&&(64512&(C=y.charCodeAt(p+1)))==56320&&(m=65536+(m-55296<<10)+(C-56320),p++),w+=m<128?1:m<2048?2:m<65536?3:4;for(b=new n.Buf8(w),p=d=0;d<w;p++)(64512&(m=y.charCodeAt(p)))==55296&&p+1<h&&(64512&(C=y.charCodeAt(p+1)))==56320&&(m=65536+(m-55296<<10)+(C-56320),p++),m<128?b[d++]=m:(m<2048?b[d++]=192|m>>>6:(m<65536?b[d++]=224|m>>>12:(b[d++]=240|m>>>18,b[d++]=128|m>>>12&63),b[d++]=128|m>>>6&63),b[d++]=128|63&m);return b},i.buf2binstring=function(y){return v(y,y.length)},i.binstring2buf=function(y){for(var b=new n.Buf8(y.length),m=0,C=b.length;m<C;m++)b[m]=y.charCodeAt(m);return b},i.buf2string=function(y,b){var m,C,p,d,h=b||y.length,w=new Array(2*h);for(m=C=0;m<h;)if((p=y[m++])<128)w[C++]=p;else if(4<(d=u[p]))w[C++]=65533,m+=d-1;else{for(p&=d===2?31:d===3?15:7;1<d&&m<h;)p=p<<6|63&y[m++],d--;1<d?w[C++]=65533:p<65536?w[C++]=p:(p-=65536,w[C++]=55296|p>>10&1023,w[C++]=56320|1023&p)}return v(w,C)},i.utf8border=function(y,b){var m;for((b=b||y.length)>y.length&&(b=y.length),m=b-1;0<=m&&(192&y[m])==128;)m--;return m<0||m===0?b:m+u[y[m]]>b?m:b}},{"./common":41}],43:[function(t,a,i){a.exports=function(n,l,o,u){for(var c=65535&n|0,v=n>>>16&65535|0,y=0;o!==0;){for(o-=y=2e3<o?2e3:o;v=v+(c=c+l[u++]|0)|0,--y;);c%=65521,v%=65521}return c|v<<16|0}},{}],44:[function(t,a,i){a.exports={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8}},{}],45:[function(t,a,i){var n=(function(){for(var l,o=[],u=0;u<256;u++){l=u;for(var c=0;c<8;c++)l=1&l?3988292384^l>>>1:l>>>1;o[u]=l}return o})();a.exports=function(l,o,u,c){var v=n,y=c+u;l^=-1;for(var b=c;b<y;b++)l=l>>>8^v[255&(l^o[b])];return-1^l}},{}],46:[function(t,a,i){var n,l=t("../utils/common"),o=t("./trees"),u=t("./adler32"),c=t("./crc32"),v=t("./messages"),y=0,b=4,m=0,C=-2,p=-1,d=4,h=2,w=8,k=9,x=286,_=30,W=19,P=2*x+1,H=15,z=3,Z=258,ne=Z+z+1,F=42,G=113,f=1,q=2,pe=3,O=4;function le(r,N){return r.msg=v[N],N}function Y(r){return(r<<1)-(4<r?9:0)}function ie(r){for(var N=r.length;0<=--N;)r[N]=0}function E(r){var N=r.state,B=N.pending;B>r.avail_out&&(B=r.avail_out),B!==0&&(l.arraySet(r.output,N.pending_buf,N.pending_out,B,r.next_out),r.next_out+=B,N.pending_out+=B,r.total_out+=B,r.avail_out-=B,N.pending-=B,N.pending===0&&(N.pending_out=0))}function I(r,N){o._tr_flush_block(r,0<=r.block_start?r.block_start:-1,r.strstart-r.block_start,N),r.block_start=r.strstart,E(r.strm)}function $(r,N){r.pending_buf[r.pending++]=N}function X(r,N){r.pending_buf[r.pending++]=N>>>8&255,r.pending_buf[r.pending++]=255&N}function V(r,N){var B,T,g=r.max_chain_length,S=r.strstart,K=r.prev_length,U=r.nice_match,R=r.strstart>r.w_size-ne?r.strstart-(r.w_size-ne):0,j=r.window,J=r.w_mask,M=r.prev,Q=r.strstart+Z,fe=j[S+K-1],te=j[S+K];r.prev_length>=r.good_match&&(g>>=2),U>r.lookahead&&(U=r.lookahead);do if(j[(B=N)+K]===te&&j[B+K-1]===fe&&j[B]===j[S]&&j[++B]===j[S+1]){S+=2,B++;do;while(j[++S]===j[++B]&&j[++S]===j[++B]&&j[++S]===j[++B]&&j[++S]===j[++B]&&j[++S]===j[++B]&&j[++S]===j[++B]&&j[++S]===j[++B]&&j[++S]===j[++B]&&S<Q);if(T=Z-(Q-S),S=Q-Z,K<T){if(r.match_start=N,U<=(K=T))break;fe=j[S+K-1],te=j[S+K]}}while((N=M[N&J])>R&&--g!=0);return K<=r.lookahead?K:r.lookahead}function be(r){var N,B,T,g,S,K,U,R,j,J,M=r.w_size;do{if(g=r.window_size-r.lookahead-r.strstart,r.strstart>=M+(M-ne)){for(l.arraySet(r.window,r.window,M,M,0),r.match_start-=M,r.strstart-=M,r.block_start-=M,N=B=r.hash_size;T=r.head[--N],r.head[N]=M<=T?T-M:0,--B;);for(N=B=M;T=r.prev[--N],r.prev[N]=M<=T?T-M:0,--B;);g+=M}if(r.strm.avail_in===0)break;if(K=r.strm,U=r.window,R=r.strstart+r.lookahead,j=g,J=void 0,J=K.avail_in,j<J&&(J=j),B=J===0?0:(K.avail_in-=J,l.arraySet(U,K.input,K.next_in,J,R),K.state.wrap===1?K.adler=u(K.adler,U,J,R):K.state.wrap===2&&(K.adler=c(K.adler,U,J,R)),K.next_in+=J,K.total_in+=J,J),r.lookahead+=B,r.lookahead+r.insert>=z)for(S=r.strstart-r.insert,r.ins_h=r.window[S],r.ins_h=(r.ins_h<<r.hash_shift^r.window[S+1])&r.hash_mask;r.insert&&(r.ins_h=(r.ins_h<<r.hash_shift^r.window[S+z-1])&r.hash_mask,r.prev[S&r.w_mask]=r.head[r.ins_h],r.head[r.ins_h]=S,S++,r.insert--,!(r.lookahead+r.insert<z)););}while(r.lookahead<ne&&r.strm.avail_in!==0)}function ge(r,N){for(var B,T;;){if(r.lookahead<ne){if(be(r),r.lookahead<ne&&N===y)return f;if(r.lookahead===0)break}if(B=0,r.lookahead>=z&&(r.ins_h=(r.ins_h<<r.hash_shift^r.window[r.strstart+z-1])&r.hash_mask,B=r.prev[r.strstart&r.w_mask]=r.head[r.ins_h],r.head[r.ins_h]=r.strstart),B!==0&&r.strstart-B<=r.w_size-ne&&(r.match_length=V(r,B)),r.match_length>=z)if(T=o._tr_tally(r,r.strstart-r.match_start,r.match_length-z),r.lookahead-=r.match_length,r.match_length<=r.max_lazy_match&&r.lookahead>=z){for(r.match_length--;r.strstart++,r.ins_h=(r.ins_h<<r.hash_shift^r.window[r.strstart+z-1])&r.hash_mask,B=r.prev[r.strstart&r.w_mask]=r.head[r.ins_h],r.head[r.ins_h]=r.strstart,--r.match_length!=0;);r.strstart++}else r.strstart+=r.match_length,r.match_length=0,r.ins_h=r.window[r.strstart],r.ins_h=(r.ins_h<<r.hash_shift^r.window[r.strstart+1])&r.hash_mask;else T=o._tr_tally(r,0,r.window[r.strstart]),r.lookahead--,r.strstart++;if(T&&(I(r,!1),r.strm.avail_out===0))return f}return r.insert=r.strstart<z-1?r.strstart:z-1,N===b?(I(r,!0),r.strm.avail_out===0?pe:O):r.last_lit&&(I(r,!1),r.strm.avail_out===0)?f:q}function ee(r,N){for(var B,T,g;;){if(r.lookahead<ne){if(be(r),r.lookahead<ne&&N===y)return f;if(r.lookahead===0)break}if(B=0,r.lookahead>=z&&(r.ins_h=(r.ins_h<<r.hash_shift^r.window[r.strstart+z-1])&r.hash_mask,B=r.prev[r.strstart&r.w_mask]=r.head[r.ins_h],r.head[r.ins_h]=r.strstart),r.prev_length=r.match_length,r.prev_match=r.match_start,r.match_length=z-1,B!==0&&r.prev_length<r.max_lazy_match&&r.strstart-B<=r.w_size-ne&&(r.match_length=V(r,B),r.match_length<=5&&(r.strategy===1||r.match_length===z&&4096<r.strstart-r.match_start)&&(r.match_length=z-1)),r.prev_length>=z&&r.match_length<=r.prev_length){for(g=r.strstart+r.lookahead-z,T=o._tr_tally(r,r.strstart-1-r.prev_match,r.prev_length-z),r.lookahead-=r.prev_length-1,r.prev_length-=2;++r.strstart<=g&&(r.ins_h=(r.ins_h<<r.hash_shift^r.window[r.strstart+z-1])&r.hash_mask,B=r.prev[r.strstart&r.w_mask]=r.head[r.ins_h],r.head[r.ins_h]=r.strstart),--r.prev_length!=0;);if(r.match_available=0,r.match_length=z-1,r.strstart++,T&&(I(r,!1),r.strm.avail_out===0))return f}else if(r.match_available){if((T=o._tr_tally(r,0,r.window[r.strstart-1]))&&I(r,!1),r.strstart++,r.lookahead--,r.strm.avail_out===0)return f}else r.match_available=1,r.strstart++,r.lookahead--}return r.match_available&&(T=o._tr_tally(r,0,r.window[r.strstart-1]),r.match_available=0),r.insert=r.strstart<z-1?r.strstart:z-1,N===b?(I(r,!0),r.strm.avail_out===0?pe:O):r.last_lit&&(I(r,!1),r.strm.avail_out===0)?f:q}function ae(r,N,B,T,g){this.good_length=r,this.max_lazy=N,this.nice_length=B,this.max_chain=T,this.func=g}function me(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=w,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new l.Buf16(2*P),this.dyn_dtree=new l.Buf16(2*(2*_+1)),this.bl_tree=new l.Buf16(2*(2*W+1)),ie(this.dyn_ltree),ie(this.dyn_dtree),ie(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new l.Buf16(H+1),this.heap=new l.Buf16(2*x+1),ie(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new l.Buf16(2*x+1),ie(this.depth),this.l_buf=0,this.lit_bufsize=0,this.last_lit=0,this.d_buf=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}function ce(r){var N;return r&&r.state?(r.total_in=r.total_out=0,r.data_type=h,(N=r.state).pending=0,N.pending_out=0,N.wrap<0&&(N.wrap=-N.wrap),N.status=N.wrap?F:G,r.adler=N.wrap===2?0:1,N.last_flush=y,o._tr_init(N),m):le(r,C)}function ye(r){var N=ce(r);return N===m&&(function(B){B.window_size=2*B.w_size,ie(B.head),B.max_lazy_match=n[B.level].max_lazy,B.good_match=n[B.level].good_length,B.nice_match=n[B.level].nice_length,B.max_chain_length=n[B.level].max_chain,B.strstart=0,B.block_start=0,B.lookahead=0,B.insert=0,B.match_length=B.prev_length=z-1,B.match_available=0,B.ins_h=0})(r.state),N}function Te(r,N,B,T,g,S){if(!r)return C;var K=1;if(N===p&&(N=6),T<0?(K=0,T=-T):15<T&&(K=2,T-=16),g<1||k<g||B!==w||T<8||15<T||N<0||9<N||S<0||d<S)return le(r,C);T===8&&(T=9);var U=new me;return(r.state=U).strm=r,U.wrap=K,U.gzhead=null,U.w_bits=T,U.w_size=1<<U.w_bits,U.w_mask=U.w_size-1,U.hash_bits=g+7,U.hash_size=1<<U.hash_bits,U.hash_mask=U.hash_size-1,U.hash_shift=~~((U.hash_bits+z-1)/z),U.window=new l.Buf8(2*U.w_size),U.head=new l.Buf16(U.hash_size),U.prev=new l.Buf16(U.w_size),U.lit_bufsize=1<<g+6,U.pending_buf_size=4*U.lit_bufsize,U.pending_buf=new l.Buf8(U.pending_buf_size),U.d_buf=1*U.lit_bufsize,U.l_buf=3*U.lit_bufsize,U.level=N,U.strategy=S,U.method=B,ye(r)}n=[new ae(0,0,0,0,function(r,N){var B=65535;for(B>r.pending_buf_size-5&&(B=r.pending_buf_size-5);;){if(r.lookahead<=1){if(be(r),r.lookahead===0&&N===y)return f;if(r.lookahead===0)break}r.strstart+=r.lookahead,r.lookahead=0;var T=r.block_start+B;if((r.strstart===0||r.strstart>=T)&&(r.lookahead=r.strstart-T,r.strstart=T,I(r,!1),r.strm.avail_out===0)||r.strstart-r.block_start>=r.w_size-ne&&(I(r,!1),r.strm.avail_out===0))return f}return r.insert=0,N===b?(I(r,!0),r.strm.avail_out===0?pe:O):(r.strstart>r.block_start&&(I(r,!1),r.strm.avail_out),f)}),new ae(4,4,8,4,ge),new ae(4,5,16,8,ge),new ae(4,6,32,32,ge),new ae(4,4,16,16,ee),new ae(8,16,32,32,ee),new ae(8,16,128,128,ee),new ae(8,32,128,256,ee),new ae(32,128,258,1024,ee),new ae(32,258,258,4096,ee)],i.deflateInit=function(r,N){return Te(r,N,w,15,8,0)},i.deflateInit2=Te,i.deflateReset=ye,i.deflateResetKeep=ce,i.deflateSetHeader=function(r,N){return r&&r.state?r.state.wrap!==2?C:(r.state.gzhead=N,m):C},i.deflate=function(r,N){var B,T,g,S;if(!r||!r.state||5<N||N<0)return r?le(r,C):C;if(T=r.state,!r.output||!r.input&&r.avail_in!==0||T.status===666&&N!==b)return le(r,r.avail_out===0?-5:C);if(T.strm=r,B=T.last_flush,T.last_flush=N,T.status===F)if(T.wrap===2)r.adler=0,$(T,31),$(T,139),$(T,8),T.gzhead?($(T,(T.gzhead.text?1:0)+(T.gzhead.hcrc?2:0)+(T.gzhead.extra?4:0)+(T.gzhead.name?8:0)+(T.gzhead.comment?16:0)),$(T,255&T.gzhead.time),$(T,T.gzhead.time>>8&255),$(T,T.gzhead.time>>16&255),$(T,T.gzhead.time>>24&255),$(T,T.level===9?2:2<=T.strategy||T.level<2?4:0),$(T,255&T.gzhead.os),T.gzhead.extra&&T.gzhead.extra.length&&($(T,255&T.gzhead.extra.length),$(T,T.gzhead.extra.length>>8&255)),T.gzhead.hcrc&&(r.adler=c(r.adler,T.pending_buf,T.pending,0)),T.gzindex=0,T.status=69):($(T,0),$(T,0),$(T,0),$(T,0),$(T,0),$(T,T.level===9?2:2<=T.strategy||T.level<2?4:0),$(T,3),T.status=G);else{var K=w+(T.w_bits-8<<4)<<8;K|=(2<=T.strategy||T.level<2?0:T.level<6?1:T.level===6?2:3)<<6,T.strstart!==0&&(K|=32),K+=31-K%31,T.status=G,X(T,K),T.strstart!==0&&(X(T,r.adler>>>16),X(T,65535&r.adler)),r.adler=1}if(T.status===69)if(T.gzhead.extra){for(g=T.pending;T.gzindex<(65535&T.gzhead.extra.length)&&(T.pending!==T.pending_buf_size||(T.gzhead.hcrc&&T.pending>g&&(r.adler=c(r.adler,T.pending_buf,T.pending-g,g)),E(r),g=T.pending,T.pending!==T.pending_buf_size));)$(T,255&T.gzhead.extra[T.gzindex]),T.gzindex++;T.gzhead.hcrc&&T.pending>g&&(r.adler=c(r.adler,T.pending_buf,T.pending-g,g)),T.gzindex===T.gzhead.extra.length&&(T.gzindex=0,T.status=73)}else T.status=73;if(T.status===73)if(T.gzhead.name){g=T.pending;do{if(T.pending===T.pending_buf_size&&(T.gzhead.hcrc&&T.pending>g&&(r.adler=c(r.adler,T.pending_buf,T.pending-g,g)),E(r),g=T.pending,T.pending===T.pending_buf_size)){S=1;break}S=T.gzindex<T.gzhead.name.length?255&T.gzhead.name.charCodeAt(T.gzindex++):0,$(T,S)}while(S!==0);T.gzhead.hcrc&&T.pending>g&&(r.adler=c(r.adler,T.pending_buf,T.pending-g,g)),S===0&&(T.gzindex=0,T.status=91)}else T.status=91;if(T.status===91)if(T.gzhead.comment){g=T.pending;do{if(T.pending===T.pending_buf_size&&(T.gzhead.hcrc&&T.pending>g&&(r.adler=c(r.adler,T.pending_buf,T.pending-g,g)),E(r),g=T.pending,T.pending===T.pending_buf_size)){S=1;break}S=T.gzindex<T.gzhead.comment.length?255&T.gzhead.comment.charCodeAt(T.gzindex++):0,$(T,S)}while(S!==0);T.gzhead.hcrc&&T.pending>g&&(r.adler=c(r.adler,T.pending_buf,T.pending-g,g)),S===0&&(T.status=103)}else T.status=103;if(T.status===103&&(T.gzhead.hcrc?(T.pending+2>T.pending_buf_size&&E(r),T.pending+2<=T.pending_buf_size&&($(T,255&r.adler),$(T,r.adler>>8&255),r.adler=0,T.status=G)):T.status=G),T.pending!==0){if(E(r),r.avail_out===0)return T.last_flush=-1,m}else if(r.avail_in===0&&Y(N)<=Y(B)&&N!==b)return le(r,-5);if(T.status===666&&r.avail_in!==0)return le(r,-5);if(r.avail_in!==0||T.lookahead!==0||N!==y&&T.status!==666){var U=T.strategy===2?(function(R,j){for(var J;;){if(R.lookahead===0&&(be(R),R.lookahead===0)){if(j===y)return f;break}if(R.match_length=0,J=o._tr_tally(R,0,R.window[R.strstart]),R.lookahead--,R.strstart++,J&&(I(R,!1),R.strm.avail_out===0))return f}return R.insert=0,j===b?(I(R,!0),R.strm.avail_out===0?pe:O):R.last_lit&&(I(R,!1),R.strm.avail_out===0)?f:q})(T,N):T.strategy===3?(function(R,j){for(var J,M,Q,fe,te=R.window;;){if(R.lookahead<=Z){if(be(R),R.lookahead<=Z&&j===y)return f;if(R.lookahead===0)break}if(R.match_length=0,R.lookahead>=z&&0<R.strstart&&(M=te[Q=R.strstart-1])===te[++Q]&&M===te[++Q]&&M===te[++Q]){fe=R.strstart+Z;do;while(M===te[++Q]&&M===te[++Q]&&M===te[++Q]&&M===te[++Q]&&M===te[++Q]&&M===te[++Q]&&M===te[++Q]&&M===te[++Q]&&Q<fe);R.match_length=Z-(fe-Q),R.match_length>R.lookahead&&(R.match_length=R.lookahead)}if(R.match_length>=z?(J=o._tr_tally(R,1,R.match_length-z),R.lookahead-=R.match_length,R.strstart+=R.match_length,R.match_length=0):(J=o._tr_tally(R,0,R.window[R.strstart]),R.lookahead--,R.strstart++),J&&(I(R,!1),R.strm.avail_out===0))return f}return R.insert=0,j===b?(I(R,!0),R.strm.avail_out===0?pe:O):R.last_lit&&(I(R,!1),R.strm.avail_out===0)?f:q})(T,N):n[T.level].func(T,N);if(U!==pe&&U!==O||(T.status=666),U===f||U===pe)return r.avail_out===0&&(T.last_flush=-1),m;if(U===q&&(N===1?o._tr_align(T):N!==5&&(o._tr_stored_block(T,0,0,!1),N===3&&(ie(T.head),T.lookahead===0&&(T.strstart=0,T.block_start=0,T.insert=0))),E(r),r.avail_out===0))return T.last_flush=-1,m}return N!==b?m:T.wrap<=0?1:(T.wrap===2?($(T,255&r.adler),$(T,r.adler>>8&255),$(T,r.adler>>16&255),$(T,r.adler>>24&255),$(T,255&r.total_in),$(T,r.total_in>>8&255),$(T,r.total_in>>16&255),$(T,r.total_in>>24&255)):(X(T,r.adler>>>16),X(T,65535&r.adler)),E(r),0<T.wrap&&(T.wrap=-T.wrap),T.pending!==0?m:1)},i.deflateEnd=function(r){var N;return r&&r.state?(N=r.state.status)!==F&&N!==69&&N!==73&&N!==91&&N!==103&&N!==G&&N!==666?le(r,C):(r.state=null,N===G?le(r,-3):m):C},i.deflateSetDictionary=function(r,N){var B,T,g,S,K,U,R,j,J=N.length;if(!r||!r.state||(S=(B=r.state).wrap)===2||S===1&&B.status!==F||B.lookahead)return C;for(S===1&&(r.adler=u(r.adler,N,J,0)),B.wrap=0,J>=B.w_size&&(S===0&&(ie(B.head),B.strstart=0,B.block_start=0,B.insert=0),j=new l.Buf8(B.w_size),l.arraySet(j,N,J-B.w_size,B.w_size,0),N=j,J=B.w_size),K=r.avail_in,U=r.next_in,R=r.input,r.avail_in=J,r.next_in=0,r.input=N,be(B);B.lookahead>=z;){for(T=B.strstart,g=B.lookahead-(z-1);B.ins_h=(B.ins_h<<B.hash_shift^B.window[T+z-1])&B.hash_mask,B.prev[T&B.w_mask]=B.head[B.ins_h],B.head[B.ins_h]=T,T++,--g;);B.strstart=T,B.lookahead=z-1,be(B)}return B.strstart+=B.lookahead,B.block_start=B.strstart,B.insert=B.lookahead,B.lookahead=0,B.match_length=B.prev_length=z-1,B.match_available=0,r.next_in=U,r.input=R,r.avail_in=K,B.wrap=S,m},i.deflateInfo="pako deflate (from Nodeca project)"},{"../utils/common":41,"./adler32":43,"./crc32":45,"./messages":51,"./trees":52}],47:[function(t,a,i){a.exports=function(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name="",this.comment="",this.hcrc=0,this.done=!1}},{}],48:[function(t,a,i){a.exports=function(n,l){var o,u,c,v,y,b,m,C,p,d,h,w,k,x,_,W,P,H,z,Z,ne,F,G,f,q;o=n.state,u=n.next_in,f=n.input,c=u+(n.avail_in-5),v=n.next_out,q=n.output,y=v-(l-n.avail_out),b=v+(n.avail_out-257),m=o.dmax,C=o.wsize,p=o.whave,d=o.wnext,h=o.window,w=o.hold,k=o.bits,x=o.lencode,_=o.distcode,W=(1<<o.lenbits)-1,P=(1<<o.distbits)-1;e:do{k<15&&(w+=f[u++]<<k,k+=8,w+=f[u++]<<k,k+=8),H=x[w&W];s:for(;;){if(w>>>=z=H>>>24,k-=z,(z=H>>>16&255)===0)q[v++]=65535&H;else{if(!(16&z)){if((64&z)==0){H=x[(65535&H)+(w&(1<<z)-1)];continue s}if(32&z){o.mode=12;break e}n.msg="invalid literal/length code",o.mode=30;break e}Z=65535&H,(z&=15)&&(k<z&&(w+=f[u++]<<k,k+=8),Z+=w&(1<<z)-1,w>>>=z,k-=z),k<15&&(w+=f[u++]<<k,k+=8,w+=f[u++]<<k,k+=8),H=_[w&P];t:for(;;){if(w>>>=z=H>>>24,k-=z,!(16&(z=H>>>16&255))){if((64&z)==0){H=_[(65535&H)+(w&(1<<z)-1)];continue t}n.msg="invalid distance code",o.mode=30;break e}if(ne=65535&H,k<(z&=15)&&(w+=f[u++]<<k,(k+=8)<z&&(w+=f[u++]<<k,k+=8)),m<(ne+=w&(1<<z)-1)){n.msg="invalid distance too far back",o.mode=30;break e}if(w>>>=z,k-=z,(z=v-y)<ne){if(p<(z=ne-z)&&o.sane){n.msg="invalid distance too far back",o.mode=30;break e}if(G=h,(F=0)===d){if(F+=C-z,z<Z){for(Z-=z;q[v++]=h[F++],--z;);F=v-ne,G=q}}else if(d<z){if(F+=C+d-z,(z-=d)<Z){for(Z-=z;q[v++]=h[F++],--z;);if(F=0,d<Z){for(Z-=z=d;q[v++]=h[F++],--z;);F=v-ne,G=q}}}else if(F+=d-z,z<Z){for(Z-=z;q[v++]=h[F++],--z;);F=v-ne,G=q}for(;2<Z;)q[v++]=G[F++],q[v++]=G[F++],q[v++]=G[F++],Z-=3;Z&&(q[v++]=G[F++],1<Z&&(q[v++]=G[F++]))}else{for(F=v-ne;q[v++]=q[F++],q[v++]=q[F++],q[v++]=q[F++],2<(Z-=3););Z&&(q[v++]=q[F++],1<Z&&(q[v++]=q[F++]))}break}}break}}while(u<c&&v<b);u-=Z=k>>3,w&=(1<<(k-=Z<<3))-1,n.next_in=u,n.next_out=v,n.avail_in=u<c?c-u+5:5-(u-c),n.avail_out=v<b?b-v+257:257-(v-b),o.hold=w,o.bits=k}},{}],49:[function(t,a,i){var n=t("../utils/common"),l=t("./adler32"),o=t("./crc32"),u=t("./inffast"),c=t("./inftrees"),v=1,y=2,b=0,m=-2,C=1,p=852,d=592;function h(F){return(F>>>24&255)+(F>>>8&65280)+((65280&F)<<8)+((255&F)<<24)}function w(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new n.Buf16(320),this.work=new n.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function k(F){var G;return F&&F.state?(G=F.state,F.total_in=F.total_out=G.total=0,F.msg="",G.wrap&&(F.adler=1&G.wrap),G.mode=C,G.last=0,G.havedict=0,G.dmax=32768,G.head=null,G.hold=0,G.bits=0,G.lencode=G.lendyn=new n.Buf32(p),G.distcode=G.distdyn=new n.Buf32(d),G.sane=1,G.back=-1,b):m}function x(F){var G;return F&&F.state?((G=F.state).wsize=0,G.whave=0,G.wnext=0,k(F)):m}function _(F,G){var f,q;return F&&F.state?(q=F.state,G<0?(f=0,G=-G):(f=1+(G>>4),G<48&&(G&=15)),G&&(G<8||15<G)?m:(q.window!==null&&q.wbits!==G&&(q.window=null),q.wrap=f,q.wbits=G,x(F))):m}function W(F,G){var f,q;return F?(q=new w,(F.state=q).window=null,(f=_(F,G))!==b&&(F.state=null),f):m}var P,H,z=!0;function Z(F){if(z){var G;for(P=new n.Buf32(512),H=new n.Buf32(32),G=0;G<144;)F.lens[G++]=8;for(;G<256;)F.lens[G++]=9;for(;G<280;)F.lens[G++]=7;for(;G<288;)F.lens[G++]=8;for(c(v,F.lens,0,288,P,0,F.work,{bits:9}),G=0;G<32;)F.lens[G++]=5;c(y,F.lens,0,32,H,0,F.work,{bits:5}),z=!1}F.lencode=P,F.lenbits=9,F.distcode=H,F.distbits=5}function ne(F,G,f,q){var pe,O=F.state;return O.window===null&&(O.wsize=1<<O.wbits,O.wnext=0,O.whave=0,O.window=new n.Buf8(O.wsize)),q>=O.wsize?(n.arraySet(O.window,G,f-O.wsize,O.wsize,0),O.wnext=0,O.whave=O.wsize):(q<(pe=O.wsize-O.wnext)&&(pe=q),n.arraySet(O.window,G,f-q,pe,O.wnext),(q-=pe)?(n.arraySet(O.window,G,f-q,q,0),O.wnext=q,O.whave=O.wsize):(O.wnext+=pe,O.wnext===O.wsize&&(O.wnext=0),O.whave<O.wsize&&(O.whave+=pe))),0}i.inflateReset=x,i.inflateReset2=_,i.inflateResetKeep=k,i.inflateInit=function(F){return W(F,15)},i.inflateInit2=W,i.inflate=function(F,G){var f,q,pe,O,le,Y,ie,E,I,$,X,V,be,ge,ee,ae,me,ce,ye,Te,r,N,B,T,g=0,S=new n.Buf8(4),K=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];if(!F||!F.state||!F.output||!F.input&&F.avail_in!==0)return m;(f=F.state).mode===12&&(f.mode=13),le=F.next_out,pe=F.output,ie=F.avail_out,O=F.next_in,q=F.input,Y=F.avail_in,E=f.hold,I=f.bits,$=Y,X=ie,N=b;e:for(;;)switch(f.mode){case C:if(f.wrap===0){f.mode=13;break}for(;I<16;){if(Y===0)break e;Y--,E+=q[O++]<<I,I+=8}if(2&f.wrap&&E===35615){S[f.check=0]=255&E,S[1]=E>>>8&255,f.check=o(f.check,S,2,0),I=E=0,f.mode=2;break}if(f.flags=0,f.head&&(f.head.done=!1),!(1&f.wrap)||(((255&E)<<8)+(E>>8))%31){F.msg="incorrect header check",f.mode=30;break}if((15&E)!=8){F.msg="unknown compression method",f.mode=30;break}if(I-=4,r=8+(15&(E>>>=4)),f.wbits===0)f.wbits=r;else if(r>f.wbits){F.msg="invalid window size",f.mode=30;break}f.dmax=1<<r,F.adler=f.check=1,f.mode=512&E?10:12,I=E=0;break;case 2:for(;I<16;){if(Y===0)break e;Y--,E+=q[O++]<<I,I+=8}if(f.flags=E,(255&f.flags)!=8){F.msg="unknown compression method",f.mode=30;break}if(57344&f.flags){F.msg="unknown header flags set",f.mode=30;break}f.head&&(f.head.text=E>>8&1),512&f.flags&&(S[0]=255&E,S[1]=E>>>8&255,f.check=o(f.check,S,2,0)),I=E=0,f.mode=3;case 3:for(;I<32;){if(Y===0)break e;Y--,E+=q[O++]<<I,I+=8}f.head&&(f.head.time=E),512&f.flags&&(S[0]=255&E,S[1]=E>>>8&255,S[2]=E>>>16&255,S[3]=E>>>24&255,f.check=o(f.check,S,4,0)),I=E=0,f.mode=4;case 4:for(;I<16;){if(Y===0)break e;Y--,E+=q[O++]<<I,I+=8}f.head&&(f.head.xflags=255&E,f.head.os=E>>8),512&f.flags&&(S[0]=255&E,S[1]=E>>>8&255,f.check=o(f.check,S,2,0)),I=E=0,f.mode=5;case 5:if(1024&f.flags){for(;I<16;){if(Y===0)break e;Y--,E+=q[O++]<<I,I+=8}f.length=E,f.head&&(f.head.extra_len=E),512&f.flags&&(S[0]=255&E,S[1]=E>>>8&255,f.check=o(f.check,S,2,0)),I=E=0}else f.head&&(f.head.extra=null);f.mode=6;case 6:if(1024&f.flags&&(Y<(V=f.length)&&(V=Y),V&&(f.head&&(r=f.head.extra_len-f.length,f.head.extra||(f.head.extra=new Array(f.head.extra_len)),n.arraySet(f.head.extra,q,O,V,r)),512&f.flags&&(f.check=o(f.check,q,V,O)),Y-=V,O+=V,f.length-=V),f.length))break e;f.length=0,f.mode=7;case 7:if(2048&f.flags){if(Y===0)break e;for(V=0;r=q[O+V++],f.head&&r&&f.length<65536&&(f.head.name+=String.fromCharCode(r)),r&&V<Y;);if(512&f.flags&&(f.check=o(f.check,q,V,O)),Y-=V,O+=V,r)break e}else f.head&&(f.head.name=null);f.length=0,f.mode=8;case 8:if(4096&f.flags){if(Y===0)break e;for(V=0;r=q[O+V++],f.head&&r&&f.length<65536&&(f.head.comment+=String.fromCharCode(r)),r&&V<Y;);if(512&f.flags&&(f.check=o(f.check,q,V,O)),Y-=V,O+=V,r)break e}else f.head&&(f.head.comment=null);f.mode=9;case 9:if(512&f.flags){for(;I<16;){if(Y===0)break e;Y--,E+=q[O++]<<I,I+=8}if(E!==(65535&f.check)){F.msg="header crc mismatch",f.mode=30;break}I=E=0}f.head&&(f.head.hcrc=f.flags>>9&1,f.head.done=!0),F.adler=f.check=0,f.mode=12;break;case 10:for(;I<32;){if(Y===0)break e;Y--,E+=q[O++]<<I,I+=8}F.adler=f.check=h(E),I=E=0,f.mode=11;case 11:if(f.havedict===0)return F.next_out=le,F.avail_out=ie,F.next_in=O,F.avail_in=Y,f.hold=E,f.bits=I,2;F.adler=f.check=1,f.mode=12;case 12:if(G===5||G===6)break e;case 13:if(f.last){E>>>=7&I,I-=7&I,f.mode=27;break}for(;I<3;){if(Y===0)break e;Y--,E+=q[O++]<<I,I+=8}switch(f.last=1&E,I-=1,3&(E>>>=1)){case 0:f.mode=14;break;case 1:if(Z(f),f.mode=20,G!==6)break;E>>>=2,I-=2;break e;case 2:f.mode=17;break;case 3:F.msg="invalid block type",f.mode=30}E>>>=2,I-=2;break;case 14:for(E>>>=7&I,I-=7&I;I<32;){if(Y===0)break e;Y--,E+=q[O++]<<I,I+=8}if((65535&E)!=(E>>>16^65535)){F.msg="invalid stored block lengths",f.mode=30;break}if(f.length=65535&E,I=E=0,f.mode=15,G===6)break e;case 15:f.mode=16;case 16:if(V=f.length){if(Y<V&&(V=Y),ie<V&&(V=ie),V===0)break e;n.arraySet(pe,q,O,V,le),Y-=V,O+=V,ie-=V,le+=V,f.length-=V;break}f.mode=12;break;case 17:for(;I<14;){if(Y===0)break e;Y--,E+=q[O++]<<I,I+=8}if(f.nlen=257+(31&E),E>>>=5,I-=5,f.ndist=1+(31&E),E>>>=5,I-=5,f.ncode=4+(15&E),E>>>=4,I-=4,286<f.nlen||30<f.ndist){F.msg="too many length or distance symbols",f.mode=30;break}f.have=0,f.mode=18;case 18:for(;f.have<f.ncode;){for(;I<3;){if(Y===0)break e;Y--,E+=q[O++]<<I,I+=8}f.lens[K[f.have++]]=7&E,E>>>=3,I-=3}for(;f.have<19;)f.lens[K[f.have++]]=0;if(f.lencode=f.lendyn,f.lenbits=7,B={bits:f.lenbits},N=c(0,f.lens,0,19,f.lencode,0,f.work,B),f.lenbits=B.bits,N){F.msg="invalid code lengths set",f.mode=30;break}f.have=0,f.mode=19;case 19:for(;f.have<f.nlen+f.ndist;){for(;ae=(g=f.lencode[E&(1<<f.lenbits)-1])>>>16&255,me=65535&g,!((ee=g>>>24)<=I);){if(Y===0)break e;Y--,E+=q[O++]<<I,I+=8}if(me<16)E>>>=ee,I-=ee,f.lens[f.have++]=me;else{if(me===16){for(T=ee+2;I<T;){if(Y===0)break e;Y--,E+=q[O++]<<I,I+=8}if(E>>>=ee,I-=ee,f.have===0){F.msg="invalid bit length repeat",f.mode=30;break}r=f.lens[f.have-1],V=3+(3&E),E>>>=2,I-=2}else if(me===17){for(T=ee+3;I<T;){if(Y===0)break e;Y--,E+=q[O++]<<I,I+=8}I-=ee,r=0,V=3+(7&(E>>>=ee)),E>>>=3,I-=3}else{for(T=ee+7;I<T;){if(Y===0)break e;Y--,E+=q[O++]<<I,I+=8}I-=ee,r=0,V=11+(127&(E>>>=ee)),E>>>=7,I-=7}if(f.have+V>f.nlen+f.ndist){F.msg="invalid bit length repeat",f.mode=30;break}for(;V--;)f.lens[f.have++]=r}}if(f.mode===30)break;if(f.lens[256]===0){F.msg="invalid code -- missing end-of-block",f.mode=30;break}if(f.lenbits=9,B={bits:f.lenbits},N=c(v,f.lens,0,f.nlen,f.lencode,0,f.work,B),f.lenbits=B.bits,N){F.msg="invalid literal/lengths set",f.mode=30;break}if(f.distbits=6,f.distcode=f.distdyn,B={bits:f.distbits},N=c(y,f.lens,f.nlen,f.ndist,f.distcode,0,f.work,B),f.distbits=B.bits,N){F.msg="invalid distances set",f.mode=30;break}if(f.mode=20,G===6)break e;case 20:f.mode=21;case 21:if(6<=Y&&258<=ie){F.next_out=le,F.avail_out=ie,F.next_in=O,F.avail_in=Y,f.hold=E,f.bits=I,u(F,X),le=F.next_out,pe=F.output,ie=F.avail_out,O=F.next_in,q=F.input,Y=F.avail_in,E=f.hold,I=f.bits,f.mode===12&&(f.back=-1);break}for(f.back=0;ae=(g=f.lencode[E&(1<<f.lenbits)-1])>>>16&255,me=65535&g,!((ee=g>>>24)<=I);){if(Y===0)break e;Y--,E+=q[O++]<<I,I+=8}if(ae&&(240&ae)==0){for(ce=ee,ye=ae,Te=me;ae=(g=f.lencode[Te+((E&(1<<ce+ye)-1)>>ce)])>>>16&255,me=65535&g,!(ce+(ee=g>>>24)<=I);){if(Y===0)break e;Y--,E+=q[O++]<<I,I+=8}E>>>=ce,I-=ce,f.back+=ce}if(E>>>=ee,I-=ee,f.back+=ee,f.length=me,ae===0){f.mode=26;break}if(32&ae){f.back=-1,f.mode=12;break}if(64&ae){F.msg="invalid literal/length code",f.mode=30;break}f.extra=15&ae,f.mode=22;case 22:if(f.extra){for(T=f.extra;I<T;){if(Y===0)break e;Y--,E+=q[O++]<<I,I+=8}f.length+=E&(1<<f.extra)-1,E>>>=f.extra,I-=f.extra,f.back+=f.extra}f.was=f.length,f.mode=23;case 23:for(;ae=(g=f.distcode[E&(1<<f.distbits)-1])>>>16&255,me=65535&g,!((ee=g>>>24)<=I);){if(Y===0)break e;Y--,E+=q[O++]<<I,I+=8}if((240&ae)==0){for(ce=ee,ye=ae,Te=me;ae=(g=f.distcode[Te+((E&(1<<ce+ye)-1)>>ce)])>>>16&255,me=65535&g,!(ce+(ee=g>>>24)<=I);){if(Y===0)break e;Y--,E+=q[O++]<<I,I+=8}E>>>=ce,I-=ce,f.back+=ce}if(E>>>=ee,I-=ee,f.back+=ee,64&ae){F.msg="invalid distance code",f.mode=30;break}f.offset=me,f.extra=15&ae,f.mode=24;case 24:if(f.extra){for(T=f.extra;I<T;){if(Y===0)break e;Y--,E+=q[O++]<<I,I+=8}f.offset+=E&(1<<f.extra)-1,E>>>=f.extra,I-=f.extra,f.back+=f.extra}if(f.offset>f.dmax){F.msg="invalid distance too far back",f.mode=30;break}f.mode=25;case 25:if(ie===0)break e;if(V=X-ie,f.offset>V){if((V=f.offset-V)>f.whave&&f.sane){F.msg="invalid distance too far back",f.mode=30;break}be=V>f.wnext?(V-=f.wnext,f.wsize-V):f.wnext-V,V>f.length&&(V=f.length),ge=f.window}else ge=pe,be=le-f.offset,V=f.length;for(ie<V&&(V=ie),ie-=V,f.length-=V;pe[le++]=ge[be++],--V;);f.length===0&&(f.mode=21);break;case 26:if(ie===0)break e;pe[le++]=f.length,ie--,f.mode=21;break;case 27:if(f.wrap){for(;I<32;){if(Y===0)break e;Y--,E|=q[O++]<<I,I+=8}if(X-=ie,F.total_out+=X,f.total+=X,X&&(F.adler=f.check=f.flags?o(f.check,pe,X,le-X):l(f.check,pe,X,le-X)),X=ie,(f.flags?E:h(E))!==f.check){F.msg="incorrect data check",f.mode=30;break}I=E=0}f.mode=28;case 28:if(f.wrap&&f.flags){for(;I<32;){if(Y===0)break e;Y--,E+=q[O++]<<I,I+=8}if(E!==(4294967295&f.total)){F.msg="incorrect length check",f.mode=30;break}I=E=0}f.mode=29;case 29:N=1;break e;case 30:N=-3;break e;case 31:return-4;default:return m}return F.next_out=le,F.avail_out=ie,F.next_in=O,F.avail_in=Y,f.hold=E,f.bits=I,(f.wsize||X!==F.avail_out&&f.mode<30&&(f.mode<27||G!==4))&&ne(F,F.output,F.next_out,X-F.avail_out)?(f.mode=31,-4):($-=F.avail_in,X-=F.avail_out,F.total_in+=$,F.total_out+=X,f.total+=X,f.wrap&&X&&(F.adler=f.check=f.flags?o(f.check,pe,X,F.next_out-X):l(f.check,pe,X,F.next_out-X)),F.data_type=f.bits+(f.last?64:0)+(f.mode===12?128:0)+(f.mode===20||f.mode===15?256:0),($==0&&X===0||G===4)&&N===b&&(N=-5),N)},i.inflateEnd=function(F){if(!F||!F.state)return m;var G=F.state;return G.window&&(G.window=null),F.state=null,b},i.inflateGetHeader=function(F,G){var f;return F&&F.state?(2&(f=F.state).wrap)==0?m:((f.head=G).done=!1,b):m},i.inflateSetDictionary=function(F,G){var f,q=G.length;return F&&F.state?(f=F.state).wrap!==0&&f.mode!==11?m:f.mode===11&&l(1,G,q,0)!==f.check?-3:ne(F,G,q,q)?(f.mode=31,-4):(f.havedict=1,b):m},i.inflateInfo="pako inflate (from Nodeca project)"},{"../utils/common":41,"./adler32":43,"./crc32":45,"./inffast":48,"./inftrees":50}],50:[function(t,a,i){var n=t("../utils/common"),l=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,0,0],o=[16,16,16,16,16,16,16,16,17,17,17,17,18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,16,72,78],u=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0],c=[16,16,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,64,64];a.exports=function(v,y,b,m,C,p,d,h){var w,k,x,_,W,P,H,z,Z,ne=h.bits,F=0,G=0,f=0,q=0,pe=0,O=0,le=0,Y=0,ie=0,E=0,I=null,$=0,X=new n.Buf16(16),V=new n.Buf16(16),be=null,ge=0;for(F=0;F<=15;F++)X[F]=0;for(G=0;G<m;G++)X[y[b+G]]++;for(pe=ne,q=15;1<=q&&X[q]===0;q--);if(q<pe&&(pe=q),q===0)return C[p++]=20971520,C[p++]=20971520,h.bits=1,0;for(f=1;f<q&&X[f]===0;f++);for(pe<f&&(pe=f),F=Y=1;F<=15;F++)if(Y<<=1,(Y-=X[F])<0)return-1;if(0<Y&&(v===0||q!==1))return-1;for(V[1]=0,F=1;F<15;F++)V[F+1]=V[F]+X[F];for(G=0;G<m;G++)y[b+G]!==0&&(d[V[y[b+G]]++]=G);if(P=v===0?(I=be=d,19):v===1?(I=l,$-=257,be=o,ge-=257,256):(I=u,be=c,-1),F=f,W=p,le=G=E=0,x=-1,_=(ie=1<<(O=pe))-1,v===1&&852<ie||v===2&&592<ie)return 1;for(;;){for(H=F-le,Z=d[G]<P?(z=0,d[G]):d[G]>P?(z=be[ge+d[G]],I[$+d[G]]):(z=96,0),w=1<<F-le,f=k=1<<O;C[W+(E>>le)+(k-=w)]=H<<24|z<<16|Z|0,k!==0;);for(w=1<<F-1;E&w;)w>>=1;if(w!==0?(E&=w-1,E+=w):E=0,G++,--X[F]==0){if(F===q)break;F=y[b+d[G]]}if(pe<F&&(E&_)!==x){for(le===0&&(le=pe),W+=f,Y=1<<(O=F-le);O+le<q&&!((Y-=X[O+le])<=0);)O++,Y<<=1;if(ie+=1<<O,v===1&&852<ie||v===2&&592<ie)return 1;C[x=E&_]=pe<<24|O<<16|W-p|0}}return E!==0&&(C[W+E]=F-le<<24|64<<16|0),h.bits=pe,0}},{"../utils/common":41}],51:[function(t,a,i){a.exports={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"}},{}],52:[function(t,a,i){var n=t("../utils/common"),l=0,o=1;function u(g){for(var S=g.length;0<=--S;)g[S]=0}var c=0,v=29,y=256,b=y+1+v,m=30,C=19,p=2*b+1,d=15,h=16,w=7,k=256,x=16,_=17,W=18,P=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],H=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],z=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],Z=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],ne=new Array(2*(b+2));u(ne);var F=new Array(2*m);u(F);var G=new Array(512);u(G);var f=new Array(256);u(f);var q=new Array(v);u(q);var pe,O,le,Y=new Array(m);function ie(g,S,K,U,R){this.static_tree=g,this.extra_bits=S,this.extra_base=K,this.elems=U,this.max_length=R,this.has_stree=g&&g.length}function E(g,S){this.dyn_tree=g,this.max_code=0,this.stat_desc=S}function I(g){return g<256?G[g]:G[256+(g>>>7)]}function $(g,S){g.pending_buf[g.pending++]=255&S,g.pending_buf[g.pending++]=S>>>8&255}function X(g,S,K){g.bi_valid>h-K?(g.bi_buf|=S<<g.bi_valid&65535,$(g,g.bi_buf),g.bi_buf=S>>h-g.bi_valid,g.bi_valid+=K-h):(g.bi_buf|=S<<g.bi_valid&65535,g.bi_valid+=K)}function V(g,S,K){X(g,K[2*S],K[2*S+1])}function be(g,S){for(var K=0;K|=1&g,g>>>=1,K<<=1,0<--S;);return K>>>1}function ge(g,S,K){var U,R,j=new Array(d+1),J=0;for(U=1;U<=d;U++)j[U]=J=J+K[U-1]<<1;for(R=0;R<=S;R++){var M=g[2*R+1];M!==0&&(g[2*R]=be(j[M]++,M))}}function ee(g){var S;for(S=0;S<b;S++)g.dyn_ltree[2*S]=0;for(S=0;S<m;S++)g.dyn_dtree[2*S]=0;for(S=0;S<C;S++)g.bl_tree[2*S]=0;g.dyn_ltree[2*k]=1,g.opt_len=g.static_len=0,g.last_lit=g.matches=0}function ae(g){8<g.bi_valid?$(g,g.bi_buf):0<g.bi_valid&&(g.pending_buf[g.pending++]=g.bi_buf),g.bi_buf=0,g.bi_valid=0}function me(g,S,K,U){var R=2*S,j=2*K;return g[R]<g[j]||g[R]===g[j]&&U[S]<=U[K]}function ce(g,S,K){for(var U=g.heap[K],R=K<<1;R<=g.heap_len&&(R<g.heap_len&&me(S,g.heap[R+1],g.heap[R],g.depth)&&R++,!me(S,U,g.heap[R],g.depth));)g.heap[K]=g.heap[R],K=R,R<<=1;g.heap[K]=U}function ye(g,S,K){var U,R,j,J,M=0;if(g.last_lit!==0)for(;U=g.pending_buf[g.d_buf+2*M]<<8|g.pending_buf[g.d_buf+2*M+1],R=g.pending_buf[g.l_buf+M],M++,U===0?V(g,R,S):(V(g,(j=f[R])+y+1,S),(J=P[j])!==0&&X(g,R-=q[j],J),V(g,j=I(--U),K),(J=H[j])!==0&&X(g,U-=Y[j],J)),M<g.last_lit;);V(g,k,S)}function Te(g,S){var K,U,R,j=S.dyn_tree,J=S.stat_desc.static_tree,M=S.stat_desc.has_stree,Q=S.stat_desc.elems,fe=-1;for(g.heap_len=0,g.heap_max=p,K=0;K<Q;K++)j[2*K]!==0?(g.heap[++g.heap_len]=fe=K,g.depth[K]=0):j[2*K+1]=0;for(;g.heap_len<2;)j[2*(R=g.heap[++g.heap_len]=fe<2?++fe:0)]=1,g.depth[R]=0,g.opt_len--,M&&(g.static_len-=J[2*R+1]);for(S.max_code=fe,K=g.heap_len>>1;1<=K;K--)ce(g,j,K);for(R=Q;K=g.heap[1],g.heap[1]=g.heap[g.heap_len--],ce(g,j,1),U=g.heap[1],g.heap[--g.heap_max]=K,g.heap[--g.heap_max]=U,j[2*R]=j[2*K]+j[2*U],g.depth[R]=(g.depth[K]>=g.depth[U]?g.depth[K]:g.depth[U])+1,j[2*K+1]=j[2*U+1]=R,g.heap[1]=R++,ce(g,j,1),2<=g.heap_len;);g.heap[--g.heap_max]=g.heap[1],(function(te,we){var Ee,ke,Re,Se,us,Ss,Ke=we.dyn_tree,Be=we.max_code,Oe=we.stat_desc.static_tree,Qs=we.stat_desc.has_stree,Dt=we.stat_desc.extra_bits,ia=we.stat_desc.extra_base,$s=we.stat_desc.max_length,ht=0;for(Se=0;Se<=d;Se++)te.bl_count[Se]=0;for(Ke[2*te.heap[te.heap_max]+1]=0,Ee=te.heap_max+1;Ee<p;Ee++)$s<(Se=Ke[2*Ke[2*(ke=te.heap[Ee])+1]+1]+1)&&(Se=$s,ht++),Ke[2*ke+1]=Se,Be<ke||(te.bl_count[Se]++,us=0,ia<=ke&&(us=Dt[ke-ia]),Ss=Ke[2*ke],te.opt_len+=Ss*(Se+us),Qs&&(te.static_len+=Ss*(Oe[2*ke+1]+us)));if(ht!==0){do{for(Se=$s-1;te.bl_count[Se]===0;)Se--;te.bl_count[Se]--,te.bl_count[Se+1]+=2,te.bl_count[$s]--,ht-=2}while(0<ht);for(Se=$s;Se!==0;Se--)for(ke=te.bl_count[Se];ke!==0;)Be<(Re=te.heap[--Ee])||(Ke[2*Re+1]!==Se&&(te.opt_len+=(Se-Ke[2*Re+1])*Ke[2*Re],Ke[2*Re+1]=Se),ke--)}})(g,S),ge(j,fe,g.bl_count)}function r(g,S,K){var U,R,j=-1,J=S[1],M=0,Q=7,fe=4;for(J===0&&(Q=138,fe=3),S[2*(K+1)+1]=65535,U=0;U<=K;U++)R=J,J=S[2*(U+1)+1],++M<Q&&R===J||(M<fe?g.bl_tree[2*R]+=M:R!==0?(R!==j&&g.bl_tree[2*R]++,g.bl_tree[2*x]++):M<=10?g.bl_tree[2*_]++:g.bl_tree[2*W]++,j=R,fe=(M=0)===J?(Q=138,3):R===J?(Q=6,3):(Q=7,4))}function N(g,S,K){var U,R,j=-1,J=S[1],M=0,Q=7,fe=4;for(J===0&&(Q=138,fe=3),U=0;U<=K;U++)if(R=J,J=S[2*(U+1)+1],!(++M<Q&&R===J)){if(M<fe)for(;V(g,R,g.bl_tree),--M!=0;);else R!==0?(R!==j&&(V(g,R,g.bl_tree),M--),V(g,x,g.bl_tree),X(g,M-3,2)):M<=10?(V(g,_,g.bl_tree),X(g,M-3,3)):(V(g,W,g.bl_tree),X(g,M-11,7));j=R,fe=(M=0)===J?(Q=138,3):R===J?(Q=6,3):(Q=7,4)}}u(Y);var B=!1;function T(g,S,K,U){X(g,(c<<1)+(U?1:0),3),(function(R,j,J,M){ae(R),$(R,J),$(R,~J),n.arraySet(R.pending_buf,R.window,j,J,R.pending),R.pending+=J})(g,S,K)}i._tr_init=function(g){B||((function(){var S,K,U,R,j,J=new Array(d+1);for(R=U=0;R<v-1;R++)for(q[R]=U,S=0;S<1<<P[R];S++)f[U++]=R;for(f[U-1]=R,R=j=0;R<16;R++)for(Y[R]=j,S=0;S<1<<H[R];S++)G[j++]=R;for(j>>=7;R<m;R++)for(Y[R]=j<<7,S=0;S<1<<H[R]-7;S++)G[256+j++]=R;for(K=0;K<=d;K++)J[K]=0;for(S=0;S<=143;)ne[2*S+1]=8,S++,J[8]++;for(;S<=255;)ne[2*S+1]=9,S++,J[9]++;for(;S<=279;)ne[2*S+1]=7,S++,J[7]++;for(;S<=287;)ne[2*S+1]=8,S++,J[8]++;for(ge(ne,b+1,J),S=0;S<m;S++)F[2*S+1]=5,F[2*S]=be(S,5);pe=new ie(ne,P,y+1,b,d),O=new ie(F,H,0,m,d),le=new ie(new Array(0),z,0,C,w)})(),B=!0),g.l_desc=new E(g.dyn_ltree,pe),g.d_desc=new E(g.dyn_dtree,O),g.bl_desc=new E(g.bl_tree,le),g.bi_buf=0,g.bi_valid=0,ee(g)},i._tr_stored_block=T,i._tr_flush_block=function(g,S,K,U){var R,j,J=0;0<g.level?(g.strm.data_type===2&&(g.strm.data_type=(function(M){var Q,fe=4093624447;for(Q=0;Q<=31;Q++,fe>>>=1)if(1&fe&&M.dyn_ltree[2*Q]!==0)return l;if(M.dyn_ltree[18]!==0||M.dyn_ltree[20]!==0||M.dyn_ltree[26]!==0)return o;for(Q=32;Q<y;Q++)if(M.dyn_ltree[2*Q]!==0)return o;return l})(g)),Te(g,g.l_desc),Te(g,g.d_desc),J=(function(M){var Q;for(r(M,M.dyn_ltree,M.l_desc.max_code),r(M,M.dyn_dtree,M.d_desc.max_code),Te(M,M.bl_desc),Q=C-1;3<=Q&&M.bl_tree[2*Z[Q]+1]===0;Q--);return M.opt_len+=3*(Q+1)+5+5+4,Q})(g),R=g.opt_len+3+7>>>3,(j=g.static_len+3+7>>>3)<=R&&(R=j)):R=j=K+5,K+4<=R&&S!==-1?T(g,S,K,U):g.strategy===4||j===R?(X(g,2+(U?1:0),3),ye(g,ne,F)):(X(g,4+(U?1:0),3),(function(M,Q,fe,te){var we;for(X(M,Q-257,5),X(M,fe-1,5),X(M,te-4,4),we=0;we<te;we++)X(M,M.bl_tree[2*Z[we]+1],3);N(M,M.dyn_ltree,Q-1),N(M,M.dyn_dtree,fe-1)})(g,g.l_desc.max_code+1,g.d_desc.max_code+1,J+1),ye(g,g.dyn_ltree,g.dyn_dtree)),ee(g),U&&ae(g)},i._tr_tally=function(g,S,K){return g.pending_buf[g.d_buf+2*g.last_lit]=S>>>8&255,g.pending_buf[g.d_buf+2*g.last_lit+1]=255&S,g.pending_buf[g.l_buf+g.last_lit]=255&K,g.last_lit++,S===0?g.dyn_ltree[2*K]++:(g.matches++,S--,g.dyn_ltree[2*(f[K]+y+1)]++,g.dyn_dtree[2*I(S)]++),g.last_lit===g.lit_bufsize-1},i._tr_align=function(g){X(g,2,3),V(g,k,ne),(function(S){S.bi_valid===16?($(S,S.bi_buf),S.bi_buf=0,S.bi_valid=0):8<=S.bi_valid&&(S.pending_buf[S.pending++]=255&S.bi_buf,S.bi_buf>>=8,S.bi_valid-=8)})(g)}},{"../utils/common":41}],53:[function(t,a,i){a.exports=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}},{}],54:[function(t,a,i){(function(n){(function(l,o){if(!l.setImmediate){var u,c,v,y,b=1,m={},C=!1,p=l.document,d=Object.getPrototypeOf&&Object.getPrototypeOf(l);d=d&&d.setTimeout?d:l,u={}.toString.call(l.process)==="[object process]"?function(x){process.nextTick(function(){w(x)})}:(function(){if(l.postMessage&&!l.importScripts){var x=!0,_=l.onmessage;return l.onmessage=function(){x=!1},l.postMessage("","*"),l.onmessage=_,x}})()?(y="setImmediate$"+Math.random()+"$",l.addEventListener?l.addEventListener("message",k,!1):l.attachEvent("onmessage",k),function(x){l.postMessage(y+x,"*")}):l.MessageChannel?((v=new MessageChannel).port1.onmessage=function(x){w(x.data)},function(x){v.port2.postMessage(x)}):p&&"onreadystatechange"in p.createElement("script")?(c=p.documentElement,function(x){var _=p.createElement("script");_.onreadystatechange=function(){w(x),_.onreadystatechange=null,c.removeChild(_),_=null},c.appendChild(_)}):function(x){setTimeout(w,0,x)},d.setImmediate=function(x){typeof x!="function"&&(x=new Function(""+x));for(var _=new Array(arguments.length-1),W=0;W<_.length;W++)_[W]=arguments[W+1];var P={callback:x,args:_};return m[b]=P,u(b),b++},d.clearImmediate=h}function h(x){delete m[x]}function w(x){if(C)setTimeout(w,0,x);else{var _=m[x];if(_){C=!0;try{(function(W){var P=W.callback,H=W.args;switch(H.length){case 0:P();break;case 1:P(H[0]);break;case 2:P(H[0],H[1]);break;case 3:P(H[0],H[1],H[2]);break;default:P.apply(o,H)}})(_)}finally{h(x),C=!1}}}}function k(x){x.source===l&&typeof x.data=="string"&&x.data.indexOf(y)===0&&w(+x.data.slice(y.length))}})(typeof self>"u"?n===void 0?this:n:self)}).call(this,typeof vt<"u"?vt:typeof self<"u"?self:typeof window<"u"?window:{})},{}]},{},[10])(10)})})(Mt)),Mt.exports}var Gl=jl();const Zl=Hl(Gl);function ot(e,s,t){const a=e instanceof Uint8Array?new Blob([new Uint8Array(e)],{type:t}):new Blob([e],{type:t}),i=URL.createObjectURL(a),n=document.createElement("a");n.href=i,n.download=s,document.body.appendChild(n),n.click(),document.body.removeChild(n),URL.revokeObjectURL(i)}function It(e){return e.replace(/[<>:"/\\|?*]/g,"").replace(/\s+/g,"_").substring(0,100)}function Kl(e){const s=[];return Js(e)&&s.push("zwo"),Ys(e)&&s.push("fit"),Xs(e)&&s.push("mrc"),s}async function ql(e,s,t){const a=It(e.name);try{switch(s){case"zwo":{if(!Js(e.sport))return{success:!1,filename:"",error:"Zwift export only supports bike and run workouts"};const i=hn(e,t),n=`${a}.zwo`;return ot(i,n,"application/xml"),{success:!0,filename:n}}case"fit":{if(!Ys(e.sport))return{success:!1,filename:"",error:`FIT export not supported for ${e.sport} workouts`};const i=await An(e,t),n=`${a}.fit`;return ot(i,n,"application/vnd.ant.fit"),{success:!0,filename:n}}case"mrc":{if(!Xs(e.sport))return{success:!1,filename:"",error:"MRC export only supports bike workouts"};const i=Fn(e,t),n=`${a}.mrc`;return ot(i,n,"text/plain"),{success:!0,filename:n}}default:return{success:!1,filename:"",error:`Unknown format: ${s}`}}}catch(i){return{success:!1,filename:"",error:i instanceof Error?i.message:"Unknown error"}}}function Vl(e){try{const s=Ul(e),a=`${It(e.meta.event)}_training_plan.ics`;return ot(s,a,"text/calendar"),{success:!0,filename:a}}catch(s){return{success:!1,filename:"",error:s instanceof Error?s.message:"Unknown error"}}}async function Jl(e,s,t){const a=It(e.name);try{switch(s){case"zwo":return Js(e.sport)?{content:hn(e,t),filename:`${a}.zwo`}:null;case"fit":return Ys(e.sport)?{content:await An(e,t),filename:`${a}.fit`}:null;case"mrc":return Xs(e.sport)?{content:Fn(e,t),filename:`${a}.mrc`}:null;default:return null}}catch{return null}}async function Yl(e,s,t){const a=[];let i=0,n=0;const l=new Zl;for(const o of e.weeks)for(const u of o.days)for(const c of u.workouts){if(c.sport==="rest"){n++;continue}if(s==="zwo"&&!Js(c.sport)){n++;continue}if(s==="fit"&&!Ys(c.sport)){n++;continue}if(s==="mrc"&&!Xs(c.sport)){n++;continue}try{const v=await Jl(c,s,t);v?(l.file(v.filename,v.content),i++):n++}catch(v){a.push(`${c.name}: ${v instanceof Error?v.message:"Unknown error"}`)}}if(i>0){const o=await l.generateAsync({type:"uint8array"}),c=`${It(e.meta.event)}_workouts_${s}.zip`;ot(o,c,"application/zip")}return{exported:i,skipped:n,errors:a}}var Xl=ue("<div> </div>"),Ql=ue('<div class="export-menu svelte-dkgmtr"><button class="export-option svelte-dkgmtr"><span class="export-icon svelte-dkgmtr">Z</span> <div><div class="export-name svelte-dkgmtr">Zwift (.zwo)</div> <div class="export-desc svelte-dkgmtr">Bike & run workouts</div></div></button> <button class="export-option svelte-dkgmtr"><span class="export-icon svelte-dkgmtr">G</span> <div><div class="export-name svelte-dkgmtr">Garmin (.fit)</div> <div class="export-desc svelte-dkgmtr">All workout types</div></div></button> <button class="export-option svelte-dkgmtr"><span class="export-icon svelte-dkgmtr">E</span> <div><div class="export-name svelte-dkgmtr">ERG/MRC (.mrc)</div> <div class="export-desc svelte-dkgmtr">Bike workouts only</div></div></button></div>'),$l=ue('<button class="clear-filter svelte-dkgmtr">Clear</button>'),eo=ue('<div class="check-icon svelte-dkgmtr">✓</div>'),so=ue('<button><div> </div> <div class="sport-info svelte-dkgmtr"><div class="sport-name svelte-dkgmtr"> </div> <div class="sport-hours svelte-dkgmtr"> </div></div> <!></button>'),to=ue("<button> </button>"),ao=ue('<aside><div class="event-header svelte-dkgmtr"><h1 class="event-name svelte-dkgmtr"> </h1> <div class="event-date svelte-dkgmtr"> </div> <div class="athlete-name svelte-dkgmtr"> </div></div> <div class="progress-section svelte-dkgmtr"><div class="progress-ring-container svelte-dkgmtr"><svg class="progress-ring svelte-dkgmtr" width="140" height="140"><defs><linearGradient id="progressGradient" x1="0%" y1="0%" x2="100%" y2="0%"><stop offset="0%" style="stop-color: var(--accent)"></stop><stop offset="100%" style="stop-color: var(--run)"></stop></linearGradient></defs><circle class="progress-ring-bg svelte-dkgmtr" cx="70" cy="70" r="60"></circle><circle class="progress-ring-fill svelte-dkgmtr" cx="70" cy="70" r="60"></circle></svg> <div class="progress-text svelte-dkgmtr"><div class="progress-percent svelte-dkgmtr"> </div> <div class="progress-label svelte-dkgmtr">Complete</div></div></div></div> <div class="stats-grid svelte-dkgmtr"><div class="stat-card svelte-dkgmtr"><div class="stat-value svelte-dkgmtr"> </div> <div class="stat-label svelte-dkgmtr">Weeks</div></div> <div class="stat-card svelte-dkgmtr"><div class="stat-value svelte-dkgmtr"> </div> <div class="stat-label svelte-dkgmtr">Hours</div></div> <div class="stat-card svelte-dkgmtr"><div class="stat-value svelte-dkgmtr"> </div> <div class="stat-label svelte-dkgmtr">Workouts</div></div> <div class="stat-card svelte-dkgmtr"><div class="stat-value svelte-dkgmtr"> </div> <div class="stat-label svelte-dkgmtr">Days Left</div></div></div> <button class="settings-btn svelte-dkgmtr"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" class="svelte-dkgmtr"><path d="M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z"></path><circle cx="12" cy="12" r="3"></circle></svg> Settings</button> <div class="export-section svelte-dkgmtr"><!> <button class="calendar-export-btn svelte-dkgmtr"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" class="svelte-dkgmtr"><rect x="3" y="4" width="18" height="18" rx="2" ry="2"></rect><line x1="16" y1="2" x2="16" y2="6"></line><line x1="8" y1="2" x2="8" y2="6"></line><line x1="3" y1="10" x2="21" y2="10"></line></svg> <div class="calendar-export-text svelte-dkgmtr"><span class="calendar-export-title svelte-dkgmtr">Export to Calendar</span> <span class="calendar-export-desc svelte-dkgmtr">Download .ics file for Apple, Google, Outlook</span></div></button> <div class="export-workouts svelte-dkgmtr"><div class="export-header svelte-dkgmtr"><h3 class="svelte-dkgmtr">Export Workouts</h3></div> <div class="export-dropdown svelte-dkgmtr"><button class="export-btn svelte-dkgmtr"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" class="svelte-dkgmtr"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path><polyline points="7 10 12 15 17 10"></polyline><line x1="12" y1="15" x2="12" y2="3"></line></svg> All Workouts <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="6 9 12 15 18 9"></polyline></svg></button> <!></div></div> <button class="import-help-link svelte-dkgmtr"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" class="svelte-dkgmtr"><circle cx="12" cy="12" r="10"></circle><path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path><line x1="12" y1="17" x2="12.01" y2="17"></line></svg> How to import to other apps</button></div> <div class="sport-stats svelte-dkgmtr"><div class="sport-stats-header svelte-dkgmtr"><h3 class="svelte-dkgmtr">Filter by Sport</h3> <!></div> <!></div> <div class="filters-section svelte-dkgmtr"><h3 class="svelte-dkgmtr">Filter by Status</h3> <div class="filter-group svelte-dkgmtr"></div></div></aside>');function no(e,s){bs(s,!0);const t=Le(()=>()=>{let M=0,Q=0,fe=0;const te={swim:0,bike:0,run:0,strength:0,brick:0,race:0};return s.plan.weeks.forEach(we=>{we.days.forEach(Ee=>{Ee.workouts.forEach(ke=>{ke.sport!=="rest"&&(M++,s.completed[ke.id]&&Q++,ke.durationMinutes&&(fe+=ke.durationMinutes,te[ke.sport]!==void 0&&(te[ke.sport]+=ke.durationMinutes/60)))})})}),{totalWorkouts:M,completedCount:Q,totalHours:Math.round(fe/60),sportHours:te,progress:M>0?Math.round(Q/M*100):0}}),a=Le(()=>377-A(t)().progress/100*377),i=Le(()=>il(s.plan.meta.eventDate)),n=Le(()=>Object.entries(A(t)().sportHours).filter(([M,Q])=>Q>0).map(([M])=>M));function l(M){s.filters.sport===M?s.onFilterChange({...s.filters,sport:"all"}):s.onFilterChange({...s.filters,sport:M})}function o(M){s.onFilterChange({...s.filters,status:M})}let u=Ce(!1),c=Ce(null);function v(){se(u,!1),se(c,{message:"Exporting calendar...",isError:!1},!0);const M=Vl(s.plan);M.success?se(c,{message:`Downloaded ${M.filename}`,isError:!1},!0):se(c,{message:M.error||"Export failed",isError:!0},!0),setTimeout(()=>{se(c,null)},3e3)}async function y(M){se(u,!1),se(c,{message:`Exporting ${M.toUpperCase()} files...`,isError:!1},!0);const Q=await Yl(s.plan,M,s.settings);Q.errors.length===0?se(c,{message:`Exported ${Q.exported} workouts (${Q.skipped} skipped)`,isError:!1},!0):se(c,{message:`Exported ${Q.exported}, ${Q.errors.length} errors`,isError:!0},!0),setTimeout(()=>{se(c,null)},4e3)}var b=ao();let m;var C=L(b),p=L(C),d=L(p),h=D(p,2),w=L(h),k=D(h,2),x=L(k),_=D(C,2),W=L(_),P=L(W),H=D(L(P),2),z=D(P,2),Z=L(z),ne=L(Z),F=D(_,2),G=L(F),f=L(G),q=L(f),pe=D(G,2),O=L(pe),le=L(O),Y=D(pe,2),ie=L(Y),E=L(ie),I=D(Y,2),$=L(I),X=L($),V=D(F,2);V.__click=function(...M){s.onSettingsClick?.apply(this,M)};var be=D(V,2),ge=L(be);{var ee=M=>{var Q=Xl();let fe;var te=L(Q);Ae(()=>{fe=Pe(Q,1,"export-status svelte-dkgmtr",null,fe,{error:A(c).isError}),de(te,A(c).message)}),re(M,Q)};ve(ge,M=>{A(c)&&M(ee)})}var ae=D(ge,2);ae.__click=v;var me=D(ae,2),ce=D(L(me),2),ye=L(ce);ye.__click=()=>se(u,!A(u));var Te=D(L(ye),2);let r;var N=D(ye,2);{var B=M=>{var Q=Ql(),fe=L(Q);fe.__click=()=>y("zwo");var te=D(fe,2);te.__click=()=>y("fit");var we=D(te,2);we.__click=()=>y("mrc"),re(M,Q)};ve(N,M=>{A(u)&&M(B)})}var T=D(me,2);T.__click=function(...M){s.onImportHelpClick?.apply(this,M)};var g=D(be,2),S=L(g),K=D(L(S),2);{var U=M=>{var Q=$l();Q.__click=()=>s.onFilterChange({...s.filters,sport:"all"}),re(M,Q)};ve(K,M=>{s.filters.sport!=="all"&&M(U)})}var R=D(S,2);He(R,17,()=>A(n),ss,(M,Q)=>{var fe=so();let te;fe.__click=()=>l(A(Q));var we=L(fe),Ee=L(we),ke=D(we,2),Re=L(ke),Se=L(Re),us=D(Re,2),Ss=L(us),Ke=D(ke,2);{var Be=Oe=>{var Qs=eo();re(Oe,Qs)};ve(Ke,Oe=>{s.filters.sport===A(Q)&&Oe(Be)})}Ae((Oe,Qs,Dt)=>{te=Pe(fe,1,`sport-stat ${A(Q)??""}`,"svelte-dkgmtr",te,{active:s.filters.sport===A(Q)}),Pe(we,1,`sport-icon ${A(Q)??""}`,"svelte-dkgmtr"),de(Ee,Oe),de(Se,Qs),de(Ss,`${Dt??""} hours`)},[()=>dn(A(Q)),()=>A(Q).charAt(0).toUpperCase()+A(Q).slice(1),()=>A(t)().sportHours[A(Q)].toFixed(1)]),re(M,fe)});var j=D(g,2),J=D(L(j),2);He(J,20,()=>[["all","All"],["pending","Pending"],["completed","Completed"]],ss,(M,Q)=>{var fe=Le(()=>Ea(Q,2));let te=()=>A(fe)[0],we=()=>A(fe)[1];var Ee=to();let ke;Ee.__click=()=>o(te());var Re=L(Ee);Ae(()=>{ke=Pe(Ee,1,"filter-chip svelte-dkgmtr",null,ke,{active:s.filters.status===te()}),de(Re,we())}),re(M,Ee)}),Ae((M,Q,fe,te)=>{m=Pe(b,1,"sidebar svelte-dkgmtr",null,m,{open:s.open}),de(d,s.plan.meta.event),de(w,M),de(x,s.plan.meta.athlete),ta(H,`stroke-dashoffset: ${A(a)??""}`),de(ne,`${Q??""}%`),de(q,s.plan.meta.totalWeeks),de(le,fe),de(E,te),de(X,A(i)),r=Pe(Te,0,"dropdown-arrow svelte-dkgmtr",null,r,{open:A(u)})},[()=>al(s.plan.meta.eventDate),()=>A(t)().progress,()=>A(t)().totalHours,()=>A(t)().totalWorkouts]),re(e,b),ys()}ks(["click"]);function io(){const e=document.getElementById("plan-data");if(!e)throw new Error("Plan data not found");return JSON.parse(e.textContent||"{}")}const Je=io(),_n=`plan-${Je.meta.id}-completed`;function lo(){const e=localStorage.getItem(_n);return e?JSON.parse(e):{}}function oo(e){localStorage.setItem(_n,JSON.stringify(e))}const kn=`plan-${Je.meta.id}-changes`;function Fa(){return{moved:{},edited:{},deleted:[],added:{}}}function ro(){const e=localStorage.getItem(kn);if(!e)return Fa();try{const s=JSON.parse(e);return{moved:s.moved||{},edited:s.edited||{},deleted:s.deleted||[],added:s.added||{}}}catch{return Fa()}}function Ct(e){localStorage.setItem(kn,JSON.stringify(e))}function uo(){return`user-${Date.now()}-${Math.random().toString(36).slice(2,8)}`}function co(e,s){const t=s.edited[e.id];return t?{...e,...t}:e}function _a(e,s){return s.deleted.includes(e)}var mo=ue('<div class="workout-duration svelte-ynjai0"> </div>'),fo=ue('<button draggable="true"><div class="workout-sport svelte-ynjai0"> </div> <div class="workout-name svelte-ynjai0"> </div> <!></button>');function po(e,s){bs(s,!0);let t=Ce(!1);function a(m){se(t,!0),m.dataTransfer.setData("text/plain",s.workout.id),m.dataTransfer.effectAllowed="move"}function i(){se(t,!1)}var n=fo();let l;n.__click=function(...m){s.onClick?.apply(this,m)};var o=L(n),u=L(o),c=D(o,2),v=L(c),y=D(c,2);{var b=m=>{var C=mo(),p=L(C);Ae(d=>de(p,d),[()=>aa(s.workout.durationMinutes)]),re(m,C)};ve(y,m=>{s.workout.durationMinutes&&m(b)})}Ae(()=>{l=Pe(n,1,`workout-card ${s.workout.sport??""}`,"svelte-ynjai0",l,{completed:s.isCompleted,dragging:A(t)}),de(u,s.workout.sport),de(v,s.workout.name)}),_s("dragstart",n,a),_s("dragend",n,i),re(e,n),ys()}ks(["click"]);var ho=ue('<div class="empty-day svelte-ldqnzx">Rest</div>'),bo=ue('<div role="listbox" tabindex="0"><div class="day-header svelte-ldqnzx"><span class="day-name svelte-ldqnzx"> </span> <span class="day-date svelte-ldqnzx"> </span></div> <!> <button class="add-workout-btn svelte-ldqnzx" title="Add workout"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" class="svelte-ldqnzx"><path d="M12 5v14M5 12h14"></path></svg></button></div>'),yo=ue('<div class="week-card svelte-ldqnzx"><div class="week-header svelte-ldqnzx"><div class="week-title svelte-ldqnzx"><span class="week-number svelte-ldqnzx"> </span> <span> </span> <span class="week-focus svelte-ldqnzx"> </span></div> <div class="week-hours svelte-ldqnzx"><span class="svelte-ldqnzx"> </span> hrs</div></div> <div class="days-grid svelte-ldqnzx"></div></div>');function go(e,s){bs(s,!0);let t=Ce(null);const a=Le(()=>s.week.phase.toLowerCase());function i(x,_){x.preventDefault(),se(t,_,!0)}function n(){se(t,null)}function l(x,_){x.preventDefault(),se(t,null);const W=x.dataTransfer?.getData("text/plain");W&&s.onDrop(W,_)}var o=yo(),u=L(o),c=L(u),v=L(c),y=L(v),b=D(v,2),m=L(b),C=D(b,2),p=L(C),d=D(c,2),h=L(d),w=L(h),k=D(u,2);He(k,21,()=>s.fullWeek,x=>x.date,(x,_)=>{const W=Le(()=>A(_).date===s.today),P=Le(()=>A(_).workouts.filter(s.filterWorkout)),H=Le(()=>A(t)===A(_).date);var z=bo();let Z;var ne=L(z),F=L(ne),G=L(F),f=D(F,2),q=L(f),pe=D(ne,2);{var O=ie=>{var E=ha(),I=Ye(E);He(I,17,()=>A(P),$=>$.id,($,X)=>{{let V=Le(()=>!!s.completed[A(X).id]);po($,{get workout(){return A(X)},get day(){return A(_)},get settings(){return s.settings},get isCompleted(){return A(V)},onClick:()=>s.onWorkoutClick(A(X),A(_))})}}),re(ie,E)},le=ie=>{var E=ha(),I=Ye(E);{var $=X=>{var V=ho();re(X,V)};ve(I,X=>{A(_).workouts.length===0&&X($)},!0)}re(ie,E)};ve(pe,ie=>{A(P).length>0?ie(O):ie(le,!1)})}var Y=D(pe,2);Y.__click=()=>s.onAddWorkout(A(_)),Ae((ie,E)=>{Z=Pe(z,1,"day-column svelte-ldqnzx",null,Z,{today:A(W),"drag-over":A(H)}),de(G,ie),de(q,E)},[()=>A(_).dayOfWeek.slice(0,3),()=>pn(A(_).date).getDate()]),_s("dragover",z,ie=>i(ie,A(_).date)),_s("dragleave",z,n),_s("drop",z,ie=>l(ie,A(_).date)),re(x,z)}),Ae(()=>{ta(o,`animation-delay: ${s.animationDelay??""}s`),de(y,`W${s.week.weekNumber??""}`),Pe(b,1,`week-phase ${A(a)??""}`,"svelte-ldqnzx"),de(m,s.week.phase),de(p,s.week.focus),de(w,s.week.targetHours)}),re(e,o),ys()}ks(["click"]);var vo=ue('<button><span class="phase-label svelte-aq400f"> </span></button>'),To=ue("<div><!></div>"),Co=ue('<div class="phase-timeline svelte-aq400f"></div> <div class="weeks-container svelte-aq400f"></div>',1);function wo(e,s){bs(s,!0);const t=ol();function a(y,b){return s.changes.moved[y]||b}function i(y){const b=ll(s.settings.firstDayOfWeek),m=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],C={};y.days.forEach(_=>{C[_.dayOfWeek]=_});const p=y.days[0],d=pn(p.date),h=m.indexOf(p.dayOfWeek);function w(_){let P=m.indexOf(_)-h;P<-3&&(P+=7),P>3&&(P-=7);const H=new Date(d);return H.setDate(H.getDate()+P),fn(H)}const k=b.map(_=>{const W=C[_];return W?W.date:w(_)}),x={};return k.forEach(_=>x[_]=[]),s.plan.weeks.forEach(_=>{_.days.forEach(W=>{W.workouts.forEach(P=>{if(_a(P.id,s.changes))return;const H=a(P.id,W.date);if(k.includes(H)){const z=co(P,s.changes);x[H].push(z)}})})}),Object.entries(s.changes.added).forEach(([_,{date:W,workout:P}])=>{k.includes(W)&&!_a(_,s.changes)&&x[W].push(P)}),b.map((_,W)=>{const P=k[W];return{date:P,dayOfWeek:_,workouts:x[P]||[]}})}function n(y){return!(s.filters.sport!=="all"&&y.sport!==s.filters.sport||s.filters.status==="completed"&&!s.completed[y.id]||s.filters.status==="pending"&&s.completed[y.id])}function l(y){if(s.changes.added[y])return s.changes.added[y].date;for(const b of s.plan.weeks)for(const m of b.days)for(const C of m.workouts)if(C.id===y)return m.date;return""}function o(y,b){const m=l(y);s.onWorkoutMove(y,m,b)}var u=Co(),c=Ye(u);He(c,21,()=>s.plan.phases,ss,(y,b)=>{const m=Le(()=>A(b).endWeek-A(b).startWeek+1),C=Le(()=>A(b).name.toLowerCase());var p=vo();p.__click=()=>{document.querySelector(`[data-week="${A(b).startWeek}"]`)?.scrollIntoView({behavior:"smooth",block:"start"})};var d=L(p),h=L(d);Ae(()=>{Pe(p,1,`phase-segment ${A(C)??""}`,"svelte-aq400f"),ta(p,`flex: ${A(m)??""}`),de(h,A(b).name)}),re(y,p)});var v=D(c,2);He(v,23,()=>s.plan.weeks,y=>y.weekNumber,(y,b,m)=>{var C=To(),p=L(C);{let d=Le(()=>i(A(b))),h=Le(()=>A(m)*.05);go(p,{get week(){return A(b)},get fullWeek(){return A(d)},get settings(){return s.settings},get today(){return t},get completed(){return s.completed},filterWorkout:n,get onWorkoutClick(){return s.onWorkoutClick},onDrop:o,get onAddWorkout(){return s.onAddWorkout},get animationDelay(){return A(h)}})}Ae(()=>Ji(C,"data-week",A(b).weekNumber)),re(y,C)}),re(e,u),ys()}ks(["click"]);var Ao=ue('<div><div> </div> <h2 class="modal-title svelte-12rtkin"> </h2> <div class="modal-date svelte-12rtkin"> </div></div>'),Fo=ue('<div><h2 class="modal-title svelte-12rtkin"> </h2> <div class="modal-date svelte-12rtkin"> </div></div>'),_o=ue('<div class="modal-stat svelte-12rtkin"><div class="modal-stat-value svelte-12rtkin"> </div> <div class="modal-stat-label svelte-12rtkin">Duration</div></div>'),ko=ue('<div class="modal-stat svelte-12rtkin"><div class="modal-stat-value svelte-12rtkin"> </div> <div class="modal-stat-label svelte-12rtkin">Distance</div></div>'),So=ue('<div class="modal-stat svelte-12rtkin"><div class="modal-stat-value svelte-12rtkin"> </div> <div class="modal-stat-label svelte-12rtkin">Target Zone</div></div>'),xo=ue('<div class="modal-section svelte-12rtkin"><h4 class="modal-section-title svelte-12rtkin">Description</h4> <p class="modal-description svelte-12rtkin"> </p></div>'),Eo=ue('<div class="modal-section svelte-12rtkin"><h4 class="modal-section-title svelte-12rtkin">Workout Structure</h4> <pre class="workout-structure svelte-12rtkin"> </pre></div>'),Po=ue('<div class="modal-stats svelte-12rtkin"><!> <!> <!></div> <!> <!>',1),Ro=ue("<option> </option>"),Io=ue("<option> </option>"),Do=ue('<div class="form-grid svelte-12rtkin"><div class="form-row svelte-12rtkin"><label class="form-label svelte-12rtkin" for="edit-sport">Sport</label> <select id="edit-sport" class="form-select svelte-12rtkin"></select></div> <div class="form-row svelte-12rtkin"><label class="form-label svelte-12rtkin" for="edit-type">Type</label> <select id="edit-type" class="form-select svelte-12rtkin"></select></div></div> <div class="form-row full svelte-12rtkin"><label class="form-label svelte-12rtkin" for="edit-name">Name</label> <input id="edit-name" type="text" class="form-input svelte-12rtkin" placeholder="Easy Run"/></div> <div class="form-row full svelte-12rtkin"><label class="form-label svelte-12rtkin" for="edit-description">Description</label> <textarea id="edit-description" class="form-textarea svelte-12rtkin" placeholder="Conversational pace, focus on form" rows="2"></textarea></div> <div class="form-grid svelte-12rtkin"><div class="form-row svelte-12rtkin"><label class="form-label svelte-12rtkin" for="edit-duration">Duration (minutes)</label> <input id="edit-duration" type="number" class="form-input svelte-12rtkin" placeholder="60"/></div> <div class="form-row svelte-12rtkin"><label class="form-label svelte-12rtkin" for="edit-distance">Distance (meters)</label> <input id="edit-distance" type="number" class="form-input svelte-12rtkin" placeholder="10000"/></div></div> <div class="form-row full svelte-12rtkin"><label class="form-label svelte-12rtkin" for="edit-zone">Target Zone</label> <input id="edit-zone" type="text" class="form-input svelte-12rtkin" placeholder="Zone 2"/></div> <div class="form-row full svelte-12rtkin"><label class="form-label svelte-12rtkin" for="edit-structure">Workout Structure</label> <textarea id="edit-structure" class="form-textarea mono svelte-12rtkin" placeholder="Warm-up: 10min easy Main: 4x1km @ threshold Cool-down: 10min easy" rows="5"></textarea></div>',1),Lo=ue('<button class="export-option svelte-12rtkin"><span class="export-icon svelte-12rtkin">Z</span> <div class="export-info svelte-12rtkin"><div class="export-name svelte-12rtkin">Zwift (.zwo)</div> <div class="export-desc svelte-12rtkin">For Zwift indoor training</div></div></button>'),Bo=ue('<button class="export-option svelte-12rtkin"><span class="export-icon svelte-12rtkin">G</span> <div class="export-info svelte-12rtkin"><div class="export-name svelte-12rtkin">Garmin (.fit)</div> <div class="export-desc svelte-12rtkin">For Garmin Connect</div></div></button>'),Mo=ue('<button class="export-option svelte-12rtkin"><span class="export-icon svelte-12rtkin">E</span> <div class="export-info svelte-12rtkin"><div class="export-name svelte-12rtkin">ERG/MRC (.mrc)</div> <div class="export-desc svelte-12rtkin">For TrainerRoad, etc.</div></div></button>'),Oo=ue('<div class="export-menu svelte-12rtkin"><!> <!> <!> <div class="export-divider svelte-12rtkin"></div> <button class="export-help-link svelte-12rtkin"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" class="svelte-12rtkin"><circle cx="12" cy="12" r="10"></circle><path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path><line x1="12" y1="17" x2="12.01" y2="17"></line></svg> How to import files</button></div>'),zo=ue('<div class="export-dropdown svelte-12rtkin"><button class="icon-btn export svelte-12rtkin" title="Export"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" class="svelte-12rtkin"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path><polyline points="7 10 12 15 17 10"></polyline><line x1="12" y1="15" x2="12" y2="3"></line></svg></button> <!></div>'),No=ue("<div> </div>"),Wo=ue("<span>↩</span> Mark Incomplete",1),Uo=ue("<span>✓</span> Mark Complete",1),Ho=ue('<div class="footer-left svelte-12rtkin"><button class="icon-btn edit svelte-12rtkin" title="Edit"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" class="svelte-12rtkin"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"></path></svg></button> <button class="icon-btn delete svelte-12rtkin" title="Delete"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" class="svelte-12rtkin"><path d="M3 6h18M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"></path></svg></button> <!></div> <div class="footer-right svelte-12rtkin"><!> <button><!></button></div>',1),jo=ue('<button class="cancel-btn svelte-12rtkin">Cancel</button> <button class="save-btn svelte-12rtkin"> </button>',1),Go=ue('<div class="confirm-overlay svelte-12rtkin"><div class="confirm-dialog svelte-12rtkin"><p class="svelte-12rtkin">Delete this workout?</p> <div class="confirm-actions svelte-12rtkin"><button class="cancel-btn svelte-12rtkin">Cancel</button> <button class="delete-btn svelte-12rtkin">Delete</button></div></div></div>'),Zo=ue('<div class="modal-overlay active svelte-12rtkin" role="dialog" aria-modal="true" tabindex="-1"><div class="modal svelte-12rtkin"><div class="modal-header svelte-12rtkin"><!> <button class="modal-close svelte-12rtkin">×</button></div> <div class="modal-body svelte-12rtkin"><!></div> <div class="modal-footer svelte-12rtkin"><!></div> <!></div></div>');function Ko(e,s){bs(s,!0);let t=$i(s,"mode",3,"view"),a=Ce(De(Ve(()=>t()))),i=Ce(!1),n=Ce(!1),l=Ce(null),o=Ce(De(Ve(()=>s.workout?.sport||"run"))),u=Ce(De(Ve(()=>s.workout?.type||"endurance"))),c=Ce(De(Ve(()=>s.workout?.name||""))),v=Ce(De(Ve(()=>s.workout?.description||""))),y=Ce(De(Ve(()=>s.workout?.durationMinutes?.toString()||""))),b=Ce(De(Ve(()=>s.workout?.distanceMeters?.toString()||""))),m=Ce(De(Ve(()=>s.workout?.primaryZone||""))),C=Ce(De(Ve(()=>s.workout?.humanReadable||"")));const p=["swim","bike","run","strength","brick","race","rest"],d=["rest","recovery","endurance","tempo","threshold","intervals","vo2max","sprint","race","brick","technique","openwater","hills","long"];function h(ee){ee.key==="Escape"&&(A(i)?se(i,!1):A(a)!=="view"?(se(a,(s.workout,"view"),!0),s.workout||s.onClose()):s.onClose())}function w(ee){ee.target.classList.contains("modal-overlay")&&s.onClose()}function k(){se(o,s.workout?.sport||"run",!0),se(u,s.workout?.type||"endurance",!0),se(c,s.workout?.name||"",!0),se(v,s.workout?.description||"",!0),se(y,s.workout?.durationMinutes?.toString()||"",!0),se(b,s.workout?.distanceMeters?.toString()||"",!0),se(m,s.workout?.primaryZone||"",!0),se(C,s.workout?.humanReadable||"",!0),se(a,"edit")}function x(){t()==="create"?s.onClose():se(a,"view")}function _(){const ee={sport:A(o),type:A(u),name:A(c),description:A(v),durationMinutes:A(y)?parseInt(A(y)):void 0,distanceMeters:A(b)?parseInt(A(b)):void 0,primaryZone:A(m)||void 0,humanReadable:A(C)||void 0};s.onSave(ee),t()!=="create"&&se(a,"view")}function W(){s.workout&&s.onDelete(s.workout.id)}async function P(ee){if(!s.workout)return;se(n,!1),se(l,{message:"Exporting...",isError:!1},!0);const ae=await ql(s.workout,ee,s.settings);ae.success?se(l,{message:`Downloaded ${ae.filename}`,isError:!1},!0):se(l,{message:ae.error||"Export failed",isError:!0},!0),setTimeout(()=>{se(l,null)},3e3)}const H=Le(()=>s.workout?Kl(s.workout.sport):[]),z=Le(()=>A(H).length>0),Z=Le(()=>s.workout||{id:"",sport:A(o),type:A(u),name:A(c),description:A(v),durationMinutes:A(y)?parseInt(A(y)):void 0,distanceMeters:A(b)?parseInt(A(b)):void 0,primaryZone:A(m),humanReadable:A(C),completed:!1});var ne=Zo();_s("keydown",rt,h),ne.__click=w,ne.__keydown=h;var F=L(ne),G=L(F),f=L(G);{var q=ee=>{var ae=Ao(),me=L(ae),ce=L(me),ye=D(me,2),Te=L(ye),r=D(ye,2),N=L(r);Ae((B,T)=>{Pe(me,1,`modal-sport-badge ${A(Z).sport??""}`,"svelte-12rtkin"),de(ce,B),de(Te,A(Z).name),de(N,T)},[()=>A(Z).sport.toUpperCase(),()=>Ta(s.day.date)]),re(ee,ae)},pe=ee=>{var ae=Fo(),me=L(ae),ce=L(me),ye=D(me,2),Te=L(ye);Ae(r=>{de(ce,A(a)==="create"?"New Workout":"Edit Workout"),de(Te,r)},[()=>Ta(s.day.date)]),re(ee,ae)};ve(f,ee=>{A(a)==="view"?ee(q):ee(pe,!1)})}var O=D(f,2);O.__click=function(...ee){s.onClose?.apply(this,ee)};var le=D(G,2),Y=L(le);{var ie=ee=>{var ae=Po(),me=Ye(ae),ce=L(me);{var ye=U=>{var R=_o(),j=L(R),J=L(j);Ae(M=>de(J,M),[()=>aa(A(Z).durationMinutes)]),re(U,R)};ve(ce,U=>{A(Z).durationMinutes&&U(ye)})}var Te=D(ce,2);{var r=U=>{var R=ko(),j=L(R),J=L(j);Ae(M=>de(J,M),[()=>tl(A(Z).distanceMeters,A(Z).sport,s.settings)]),re(U,R)};ve(Te,U=>{A(Z).distanceMeters&&U(r)})}var N=D(Te,2);{var B=U=>{var R=So(),j=L(R),J=L(j);Ae(M=>de(J,M),[()=>nl(A(Z).sport,A(Z).primaryZone,s.settings)]),re(U,R)};ve(N,U=>{A(Z).primaryZone&&U(B)})}var T=D(me,2);{var g=U=>{var R=xo(),j=D(L(R),2),J=L(j);Ae(()=>de(J,A(Z).description)),re(U,R)};ve(T,U=>{A(Z).description&&U(g)})}var S=D(T,2);{var K=U=>{var R=Eo(),j=D(L(R),2),J=L(j);Ae(M=>de(J,M),[()=>A(Z).humanReadable.replace(/\\n/g,`
|
|
38
|
-
`)]),re(U,R)};ve(S,U=>{A(Z).humanReadable&&U(K)})}re(ee,ae)},E=ee=>{var ae=Do(),me=Ye(ae),ce=L(me),ye=D(L(ce),2);He(ye,21,()=>p,ss,(te,we)=>{var Ee=Ro(),ke=L(Ee),Re={};Ae(Se=>{de(ke,Se),Re!==(Re=A(we))&&(Ee.value=(Ee.__value=A(we))??"")},[()=>A(we).charAt(0).toUpperCase()+A(we).slice(1)]),re(te,Ee)});var Te=D(ce,2),r=D(L(Te),2);He(r,21,()=>d,ss,(te,we)=>{var Ee=Io(),ke=L(Ee),Re={};Ae(Se=>{de(ke,Se),Re!==(Re=A(we))&&(Ee.value=(Ee.__value=A(we))??"")},[()=>A(we).charAt(0).toUpperCase()+A(we).slice(1)]),re(te,Ee)});var N=D(me,2),B=D(L(N),2),T=D(N,2),g=D(L(T),2),S=D(T,2),K=L(S),U=D(L(K),2),R=D(K,2),j=D(L(R),2),J=D(S,2),M=D(L(J),2),Q=D(J,2),fe=D(L(Q),2);Ns(ye,()=>A(o),te=>se(o,te)),Ns(r,()=>A(u),te=>se(u,te)),Ie(B,()=>A(c),te=>se(c,te)),Ie(g,()=>A(v),te=>se(v,te)),Ie(U,()=>A(y),te=>se(y,te)),Ie(j,()=>A(b),te=>se(b,te)),Ie(M,()=>A(m),te=>se(m,te)),Ie(fe,()=>A(C),te=>se(C,te)),re(ee,ae)};ve(Y,ee=>{A(a)==="view"?ee(ie):ee(E,!1)})}var I=D(le,2),$=L(I);{var X=ee=>{var ae=Ho(),me=Ye(ae),ce=L(me);ce.__click=k;var ye=D(ce,2);ye.__click=()=>se(i,!0);var Te=D(ye,2);{var r=j=>{var J=zo(),M=L(J);M.__click=()=>se(n,!A(n));var Q=D(M,2);{var fe=te=>{var we=Oo(),Ee=L(we);{var ke=Be=>{var Oe=Lo();Oe.__click=()=>P("zwo"),re(Be,Oe)};ve(Ee,Be=>{Js(A(Z).sport)&&Be(ke)})}var Re=D(Ee,2);{var Se=Be=>{var Oe=Bo();Oe.__click=()=>P("fit"),re(Be,Oe)};ve(Re,Be=>{Ys(A(Z).sport)&&Be(Se)})}var us=D(Re,2);{var Ss=Be=>{var Oe=Mo();Oe.__click=()=>P("mrc"),re(Be,Oe)};ve(us,Be=>{Xs(A(Z).sport)&&Be(Ss)})}var Ke=D(us,4);Ke.__click=function(...Be){s.onImportHelpClick?.apply(this,Be)},re(te,we)};ve(Q,te=>{A(n)&&te(fe)})}re(j,J)};ve(Te,j=>{A(z)&&j(r)})}var N=D(me,2),B=L(N);{var T=j=>{var J=No();let M;var Q=L(J);Ae(()=>{M=Pe(J,1,"export-status svelte-12rtkin",null,M,{error:A(l).isError}),de(Q,A(l).message)}),re(j,J)};ve(B,j=>{A(l)&&j(T)})}var g=D(B,2);let S;g.__click=()=>s.onToggleComplete(A(Z).id);var K=L(g);{var U=j=>{var J=Wo();re(j,J)},R=j=>{var J=Uo();re(j,J)};ve(K,j=>{A(Z).completed?j(U):j(R,!1)})}Ae(()=>S=Pe(g,1,"complete-btn svelte-12rtkin",null,S,{mark:!A(Z).completed,unmark:A(Z).completed})),re(ee,ae)},V=ee=>{var ae=jo(),me=Ye(ae);me.__click=x;var ce=D(me,2);ce.__click=_;var ye=L(ce);Ae(()=>{ce.disabled=!A(c),de(ye,A(a)==="create"?"Add Workout":"Save Changes")}),re(ee,ae)};ve($,ee=>{A(a)==="view"?ee(X):ee(V,!1)})}var be=D(I,2);{var ge=ee=>{var ae=Go(),me=L(ae),ce=D(L(me),2),ye=L(ce);ye.__click=()=>se(i,!1);var Te=D(ye,2);Te.__click=W,re(ee,ae)};ve(be,ee=>{A(i)&&ee(ge)})}re(e,ne),ys()}ks(["click","keydown"]);const qo={theme:"dark",units:{swim:"meters",bike:"kilometers",run:"kilometers"},firstDayOfWeek:"monday",run:{lthr:165,hrZones:[{zone:1,name:"Recovery",low:0,high:134},{zone:2,name:"Aerobic",low:134,high:147},{zone:3,name:"Tempo",low:147,high:156},{zone:4,name:"Threshold",low:156,high:165},{zone:5,name:"VO2max",low:165,high:180}],thresholdPace:"4:30",paceZones:[{zone:"E",name:"Easy",pace:"5:20"},{zone:"M",name:"Marathon",pace:"4:50"},{zone:"T",name:"Threshold",pace:"4:30"},{zone:"I",name:"Interval",pace:"4:00"},{zone:"R",name:"Repetition",pace:"3:40"}]},bike:{lthr:160,hrZones:[{zone:1,name:"Recovery",low:0,high:130},{zone:2,name:"Aerobic",low:130,high:142},{zone:3,name:"Tempo",low:142,high:151},{zone:4,name:"Threshold",low:151,high:160},{zone:5,name:"VO2max",low:160,high:175}],ftp:200,powerZones:[{zone:1,name:"Active Recovery",low:0,high:110},{zone:2,name:"Endurance",low:110,high:150},{zone:3,name:"Tempo",low:150,high:180},{zone:4,name:"Threshold",low:180,high:210},{zone:5,name:"VO2max",low:210,high:240}]},swim:{css:"1:50",cssSeconds:110,paceZones:[{zone:1,name:"Recovery",offset:20,pace:"2:10"},{zone:2,name:"Aerobic",offset:10,pace:"2:00"},{zone:3,name:"Tempo",offset:5,pace:"1:55"},{zone:4,name:"Threshold",offset:0,pace:"1:50"},{zone:5,name:"VO2max",offset:-5,pace:"1:45"}]}},Sn=`plan-${Je.meta.id}-settings`;function Vo(){const e=JSON.parse(JSON.stringify(qo));Je.preferences&&(e.units.swim=Je.preferences.swim||e.units.swim,e.units.bike=Je.preferences.bike||e.units.bike,e.units.run=Je.preferences.run||e.units.run,e.firstDayOfWeek=Je.preferences.firstDayOfWeek||e.firstDayOfWeek);const s=Je.zones;s?.run?.hr&&(e.run.lthr=s.run.hr.lthr,e.run.hrZones=s.run.hr.zones.map(a=>({zone:a.zone,name:a.name,low:a.hrLow,high:a.hrHigh}))),s?.run?.pace&&(e.run.thresholdPace=s.run.pace.thresholdPace||e.run.thresholdPace,s.run.pace.zones&&(e.run.paceZones=s.run.pace.zones.map(a=>({zone:a.zone,name:a.name,pace:a.pace})))),s?.bike?.hr&&(e.bike.lthr=s.bike.hr.lthr,e.bike.hrZones=s.bike.hr.zones.map(a=>({zone:a.zone,name:a.name,low:a.hrLow,high:a.hrHigh}))),s?.bike?.power&&(e.bike.ftp=s.bike.power.ftp,e.bike.powerZones=s.bike.power.zones.map(a=>({zone:a.zone,name:a.name,low:a.wattsLow,high:a.wattsHigh}))),s?.swim&&(e.swim.css=s.swim.css||e.swim.css,e.swim.cssSeconds=s.swim.cssSeconds||e.swim.cssSeconds,s.swim.zones&&(e.swim.paceZones=s.swim.zones.map(a=>({zone:a.zone,name:a.name,offset:a.paceOffset,pace:a.pace}))));const t=localStorage.getItem(Sn);if(t){const a=JSON.parse(t);a.theme&&(e.theme=a.theme),a.units&&(e.units={...e.units,...a.units}),a.firstDayOfWeek&&(e.firstDayOfWeek=a.firstDayOfWeek),a.run&&(e.run={...e.run,...a.run}),a.bike&&(e.bike={...e.bike,...a.bike}),a.swim&&(e.swim={...e.swim,...a.swim})}return e}function Jo(e){localStorage.setItem(Sn,JSON.stringify(e))}function xn(e){const s=e.split(":");return parseInt(s[0])*60+parseInt(s[1]||"0")}function En(e){const s=Math.floor(e/60),t=Math.round(e%60);return`${s}:${t.toString().padStart(2,"0")}`}function Yo(e){return[{zone:1,name:"Recovery",lowPct:0,highPct:81},{zone:2,name:"Aerobic",lowPct:81,highPct:89},{zone:3,name:"Tempo",lowPct:89,highPct:94},{zone:4,name:"Threshold",lowPct:94,highPct:100},{zone:5,name:"VO2max",lowPct:100,highPct:106}].map(t=>({zone:t.zone,name:t.name,low:Math.round(e*t.lowPct/100),high:Math.round(e*t.highPct/100)}))}function Xo(e){return[{zone:1,name:"Active Recovery",lowPct:0,highPct:55},{zone:2,name:"Endurance",lowPct:55,highPct:75},{zone:3,name:"Tempo",lowPct:75,highPct:90},{zone:4,name:"Threshold",lowPct:90,highPct:105},{zone:5,name:"VO2max",lowPct:105,highPct:120}].map(t=>({zone:t.zone,name:t.name,low:Math.round(e*t.lowPct/100),high:Math.round(e*t.highPct/100)}))}function Qo(e){const s=xn(e);return[{zone:"E",name:"Easy",factor:1.18},{zone:"M",name:"Marathon",factor:1.07},{zone:"T",name:"Threshold",factor:1},{zone:"I",name:"Interval",factor:.89},{zone:"R",name:"Repetition",factor:.82}].map(a=>({zone:a.zone,name:a.name,pace:En(Math.round(s*a.factor))}))}function $o(e){const s=xn(e);return[{zone:1,name:"Recovery",offset:20},{zone:2,name:"Aerobic",offset:10},{zone:3,name:"Tempo",offset:5},{zone:4,name:"Threshold",offset:0},{zone:5,name:"VO2max",offset:-5}].map(a=>({zone:a.zone,name:a.name,offset:a.offset,pace:En(s+a.offset)}))}const er="0.0.2";var sr=ue("<button> </button>"),tr=ue('<div class="settings-section svelte-1uhipit"><h4 class="settings-section-title svelte-1uhipit">Appearance</h4> <div class="theme-toggle svelte-1uhipit"><button><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" class="svelte-1uhipit"><circle cx="12" cy="12" r="5"></circle><path d="M12 1v2M12 21v2M4.22 4.22l1.42 1.42M18.36 18.36l1.42 1.42M1 12h2M21 12h2M4.22 19.78l1.42-1.42M18.36 5.64l1.42-1.42"></path></svg> Light</button> <button><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" class="svelte-1uhipit"><path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"></path></svg> Dark</button></div></div> <div class="settings-section svelte-1uhipit"><h4 class="settings-section-title svelte-1uhipit">Distance Units</h4> <div class="settings-row svelte-1uhipit"><span class="settings-label svelte-1uhipit">Swim</span> <select class="settings-select svelte-1uhipit"><option>Meters</option><option>Yards</option></select></div> <div class="settings-row svelte-1uhipit"><span class="settings-label svelte-1uhipit">Bike</span> <select class="settings-select svelte-1uhipit"><option>Kilometers</option><option>Miles</option></select></div> <div class="settings-row svelte-1uhipit"><span class="settings-label svelte-1uhipit">Run</span> <select class="settings-select svelte-1uhipit"><option>Kilometers</option><option>Miles</option></select></div></div> <div class="settings-section svelte-1uhipit"><h4 class="settings-section-title svelte-1uhipit">Calendar</h4> <div class="settings-row svelte-1uhipit"><span class="settings-label svelte-1uhipit">First day of week</span> <select class="settings-select svelte-1uhipit"><option>Monday</option><option>Sunday</option></select></div></div>',1),ar=ue('<div class="zone-row svelte-1uhipit"><span> </span> <span class="zone-name svelte-1uhipit"> </span> <input type="number" class="zone-input svelte-1uhipit"/> <input type="number" class="zone-input svelte-1uhipit"/></div>'),nr=ue('<div class="zone-row svelte-1uhipit"><span> </span> <span class="zone-name svelte-1uhipit"> </span> <input type="text" class="pace-input svelte-1uhipit"/></div>'),ir=ue('<div class="settings-section svelte-1uhipit"><h4 class="settings-section-title svelte-1uhipit">Heart Rate Zones</h4> <div class="threshold-row svelte-1uhipit"><span class="threshold-label svelte-1uhipit">Run LTHR</span> <input type="number" class="threshold-input svelte-1uhipit" min="100" max="220"/> <button class="recalc-btn svelte-1uhipit">Recalculate</button></div> <div class="zones-grid svelte-1uhipit"><div class="zone-row header svelte-1uhipit"><span>Zone</span><span>Name</span><span>Low</span><span>High</span></div> <!></div> <details class="help-details svelte-1uhipit"><summary class="svelte-1uhipit">How to find your LTHR</summary> <div class="help-content svelte-1uhipit"><p class="svelte-1uhipit"><strong>30-Minute Test:</strong></p> <ol class="svelte-1uhipit"><li class="svelte-1uhipit">Warm up for 15 minutes</li> <li class="svelte-1uhipit">Run as hard as you can sustain for 30 minutes</li> <li class="svelte-1uhipit">Your average HR for the last 20 minutes is your LTHR</li></ol></div></details></div> <div class="settings-section svelte-1uhipit"><h4 class="settings-section-title svelte-1uhipit">Pace Zones</h4> <div class="threshold-row svelte-1uhipit"><span class="threshold-label svelte-1uhipit">Threshold Pace</span> <input type="text" class="threshold-input svelte-1uhipit" placeholder="4:30"/> <button class="recalc-btn svelte-1uhipit">Recalculate</button></div> <div class="zones-grid svelte-1uhipit"><div class="zone-row header svelte-1uhipit"><span>Zone</span><span>Name</span><span colspan="2">Pace/km</span></div> <!></div> <details class="help-details svelte-1uhipit"><summary class="svelte-1uhipit">How to find your Threshold Pace</summary> <div class="help-content svelte-1uhipit"><p class="svelte-1uhipit"><strong>Option 1: Race-Based</strong></p> <ul class="svelte-1uhipit"><li class="svelte-1uhipit">Recent 5K race pace + 15-20 sec/km</li> <li class="svelte-1uhipit">Recent 10K race pace + 5-10 sec/km</li></ul> <p class="svelte-1uhipit"><strong>Option 2: 30-Minute Test</strong></p> <p class="svelte-1uhipit">Run 30 minutes at max sustainable effort. Average pace = threshold.</p></div></details></div>',1),lr=ue('<div class="zone-row svelte-1uhipit"><span> </span> <span class="zone-name svelte-1uhipit"> </span> <input type="number" class="zone-input svelte-1uhipit"/> <input type="number" class="zone-input svelte-1uhipit"/></div>'),or=ue('<div class="zone-row svelte-1uhipit"><span> </span> <span class="zone-name svelte-1uhipit"> </span> <input type="number" class="zone-input svelte-1uhipit"/> <input type="number" class="zone-input svelte-1uhipit"/></div>'),rr=ue('<div class="settings-section svelte-1uhipit"><h4 class="settings-section-title svelte-1uhipit">Heart Rate Zones</h4> <div class="threshold-row svelte-1uhipit"><span class="threshold-label svelte-1uhipit">Bike LTHR</span> <input type="number" class="threshold-input svelte-1uhipit" min="100" max="220"/> <button class="recalc-btn svelte-1uhipit">Recalculate</button></div> <div class="zones-grid svelte-1uhipit"><div class="zone-row header svelte-1uhipit"><span>Zone</span><span>Name</span><span>Low</span><span>High</span></div> <!></div> <details class="help-details svelte-1uhipit"><summary class="svelte-1uhipit">How to find your LTHR</summary> <div class="help-content svelte-1uhipit"><p class="svelte-1uhipit"><strong>30-Minute Test:</strong></p> <ol class="svelte-1uhipit"><li class="svelte-1uhipit">Warm up for 15 minutes</li> <li class="svelte-1uhipit">Bike as hard as you can sustain for 30 minutes</li> <li class="svelte-1uhipit">Your average HR for the last 20 minutes is your LTHR</li></ol> <p class="help-note svelte-1uhipit">Bike LTHR is typically 5-10 bpm lower than run.</p></div></details></div> <div class="settings-section svelte-1uhipit"><h4 class="settings-section-title svelte-1uhipit">Power Zones</h4> <div class="threshold-row svelte-1uhipit"><span class="threshold-label svelte-1uhipit">FTP (watts)</span> <input type="number" class="threshold-input svelte-1uhipit" min="50" max="500"/> <button class="recalc-btn svelte-1uhipit">Recalculate</button></div> <div class="zones-grid svelte-1uhipit"><div class="zone-row header svelte-1uhipit"><span>Zone</span><span>Name</span><span>Low W</span><span>High W</span></div> <!></div> <details class="help-details svelte-1uhipit"><summary class="svelte-1uhipit">How to find your FTP</summary> <div class="help-content svelte-1uhipit"><p class="svelte-1uhipit"><strong>20-Minute Test:</strong></p> <ol class="svelte-1uhipit"><li class="svelte-1uhipit">Warm up for 20 minutes including a few hard efforts</li> <li class="svelte-1uhipit">Ride as hard as you can sustain for 20 minutes</li> <li class="svelte-1uhipit">FTP = Average power × 0.95</li></ol> <p class="svelte-1uhipit"><strong>Ramp Test:</strong> Most trainer apps (Zwift, TrainerRoad) have built-in FTP tests.</p></div></details></div>',1),ur=ue('<div class="zone-row svelte-1uhipit"><span> </span> <span class="zone-name svelte-1uhipit"> </span> <span class="zone-name svelte-1uhipit"> </span> <input type="text" class="pace-input svelte-1uhipit"/></div>'),cr=ue('<div class="settings-section svelte-1uhipit"><h4 class="settings-section-title svelte-1uhipit">Pace Zones</h4> <div class="threshold-row svelte-1uhipit"><span class="threshold-label svelte-1uhipit">CSS (per 100m)</span> <input type="text" class="threshold-input svelte-1uhipit" placeholder="1:45"/> <button class="recalc-btn svelte-1uhipit">Recalculate</button></div> <div class="zones-grid svelte-1uhipit"><div class="zone-row header svelte-1uhipit"><span>Zone</span><span>Name</span><span>Offset</span><span>Pace/100</span></div> <!></div> <details class="help-details svelte-1uhipit"><summary class="svelte-1uhipit">How to find your CSS</summary> <div class="help-content svelte-1uhipit"><p class="svelte-1uhipit"><strong>CSS Test (Critical Swim Speed):</strong></p> <ol class="svelte-1uhipit"><li class="svelte-1uhipit">Warm up for 10 minutes</li> <li class="svelte-1uhipit">Swim 400m all-out, record time (T400)</li> <li class="svelte-1uhipit">Rest 5-10 minutes</li> <li class="svelte-1uhipit">Swim 200m all-out, record time (T200)</li> <li class="svelte-1uhipit">CSS = (T400 - T200) ÷ 2 = pace per 100m</li></ol> <p class="svelte-1uhipit"><strong>Example:</strong> 400m in 6:40 (400s), 200m in 3:00 (180s)<br/> CSS = (400 - 180) ÷ 2 = 110 sec/100m = 1:50/100m</p></div></details></div>'),mr=ue("<div> </div>"),fr=ue(`<div class="settings-section svelte-1uhipit"><h4 class="settings-section-title svelte-1uhipit">Your Data</h4> <div class="data-explainer svelte-1uhipit"><p class="svelte-1uhipit">Your training data is stored <strong>only on this device</strong>, in your browser's
|
|
38
|
+
`)]),re(U,R)};ve(S,U=>{A(Z).humanReadable&&U(K)})}re(ee,ae)},E=ee=>{var ae=Do(),me=Ye(ae),ce=L(me),ye=D(L(ce),2);He(ye,21,()=>p,ss,(te,we)=>{var Ee=Ro(),ke=L(Ee),Re={};Ae(Se=>{de(ke,Se),Re!==(Re=A(we))&&(Ee.value=(Ee.__value=A(we))??"")},[()=>A(we).charAt(0).toUpperCase()+A(we).slice(1)]),re(te,Ee)});var Te=D(ce,2),r=D(L(Te),2);He(r,21,()=>d,ss,(te,we)=>{var Ee=Io(),ke=L(Ee),Re={};Ae(Se=>{de(ke,Se),Re!==(Re=A(we))&&(Ee.value=(Ee.__value=A(we))??"")},[()=>A(we).charAt(0).toUpperCase()+A(we).slice(1)]),re(te,Ee)});var N=D(me,2),B=D(L(N),2),T=D(N,2),g=D(L(T),2),S=D(T,2),K=L(S),U=D(L(K),2),R=D(K,2),j=D(L(R),2),J=D(S,2),M=D(L(J),2),Q=D(J,2),fe=D(L(Q),2);Ns(ye,()=>A(o),te=>se(o,te)),Ns(r,()=>A(u),te=>se(u,te)),Ie(B,()=>A(c),te=>se(c,te)),Ie(g,()=>A(v),te=>se(v,te)),Ie(U,()=>A(y),te=>se(y,te)),Ie(j,()=>A(b),te=>se(b,te)),Ie(M,()=>A(m),te=>se(m,te)),Ie(fe,()=>A(C),te=>se(C,te)),re(ee,ae)};ve(Y,ee=>{A(a)==="view"?ee(ie):ee(E,!1)})}var I=D(le,2),$=L(I);{var X=ee=>{var ae=Ho(),me=Ye(ae),ce=L(me);ce.__click=k;var ye=D(ce,2);ye.__click=()=>se(i,!0);var Te=D(ye,2);{var r=j=>{var J=zo(),M=L(J);M.__click=()=>se(n,!A(n));var Q=D(M,2);{var fe=te=>{var we=Oo(),Ee=L(we);{var ke=Be=>{var Oe=Lo();Oe.__click=()=>P("zwo"),re(Be,Oe)};ve(Ee,Be=>{Js(A(Z).sport)&&Be(ke)})}var Re=D(Ee,2);{var Se=Be=>{var Oe=Bo();Oe.__click=()=>P("fit"),re(Be,Oe)};ve(Re,Be=>{Ys(A(Z).sport)&&Be(Se)})}var us=D(Re,2);{var Ss=Be=>{var Oe=Mo();Oe.__click=()=>P("mrc"),re(Be,Oe)};ve(us,Be=>{Xs(A(Z).sport)&&Be(Ss)})}var Ke=D(us,4);Ke.__click=function(...Be){s.onImportHelpClick?.apply(this,Be)},re(te,we)};ve(Q,te=>{A(n)&&te(fe)})}re(j,J)};ve(Te,j=>{A(z)&&j(r)})}var N=D(me,2),B=L(N);{var T=j=>{var J=No();let M;var Q=L(J);Ae(()=>{M=Pe(J,1,"export-status svelte-12rtkin",null,M,{error:A(l).isError}),de(Q,A(l).message)}),re(j,J)};ve(B,j=>{A(l)&&j(T)})}var g=D(B,2);let S;g.__click=()=>s.onToggleComplete(A(Z).id);var K=L(g);{var U=j=>{var J=Wo();re(j,J)},R=j=>{var J=Uo();re(j,J)};ve(K,j=>{A(Z).completed?j(U):j(R,!1)})}Ae(()=>S=Pe(g,1,"complete-btn svelte-12rtkin",null,S,{mark:!A(Z).completed,unmark:A(Z).completed})),re(ee,ae)},V=ee=>{var ae=jo(),me=Ye(ae);me.__click=x;var ce=D(me,2);ce.__click=_;var ye=L(ce);Ae(()=>{ce.disabled=!A(c),de(ye,A(a)==="create"?"Add Workout":"Save Changes")}),re(ee,ae)};ve($,ee=>{A(a)==="view"?ee(X):ee(V,!1)})}var be=D(I,2);{var ge=ee=>{var ae=Go(),me=L(ae),ce=D(L(me),2),ye=L(ce);ye.__click=()=>se(i,!1);var Te=D(ye,2);Te.__click=W,re(ee,ae)};ve(be,ee=>{A(i)&&ee(ge)})}re(e,ne),ys()}ks(["click","keydown"]);const qo={theme:"dark",units:{swim:"meters",bike:"kilometers",run:"kilometers"},firstDayOfWeek:"monday",run:{lthr:165,hrZones:[{zone:1,name:"Recovery",low:0,high:134},{zone:2,name:"Aerobic",low:134,high:147},{zone:3,name:"Tempo",low:147,high:156},{zone:4,name:"Threshold",low:156,high:165},{zone:5,name:"VO2max",low:165,high:180}],thresholdPace:"4:30",paceZones:[{zone:"E",name:"Easy",pace:"5:20"},{zone:"M",name:"Marathon",pace:"4:50"},{zone:"T",name:"Threshold",pace:"4:30"},{zone:"I",name:"Interval",pace:"4:00"},{zone:"R",name:"Repetition",pace:"3:40"}]},bike:{lthr:160,hrZones:[{zone:1,name:"Recovery",low:0,high:130},{zone:2,name:"Aerobic",low:130,high:142},{zone:3,name:"Tempo",low:142,high:151},{zone:4,name:"Threshold",low:151,high:160},{zone:5,name:"VO2max",low:160,high:175}],ftp:200,powerZones:[{zone:1,name:"Active Recovery",low:0,high:110},{zone:2,name:"Endurance",low:110,high:150},{zone:3,name:"Tempo",low:150,high:180},{zone:4,name:"Threshold",low:180,high:210},{zone:5,name:"VO2max",low:210,high:240}]},swim:{css:"1:50",cssSeconds:110,paceZones:[{zone:1,name:"Recovery",offset:20,pace:"2:10"},{zone:2,name:"Aerobic",offset:10,pace:"2:00"},{zone:3,name:"Tempo",offset:5,pace:"1:55"},{zone:4,name:"Threshold",offset:0,pace:"1:50"},{zone:5,name:"VO2max",offset:-5,pace:"1:45"}]}},Sn=`plan-${Je.meta.id}-settings`;function Vo(){const e=JSON.parse(JSON.stringify(qo));Je.preferences&&(e.units.swim=Je.preferences.swim||e.units.swim,e.units.bike=Je.preferences.bike||e.units.bike,e.units.run=Je.preferences.run||e.units.run,e.firstDayOfWeek=Je.preferences.firstDayOfWeek||e.firstDayOfWeek);const s=Je.zones;s?.run?.hr&&(e.run.lthr=s.run.hr.lthr,e.run.hrZones=s.run.hr.zones.map(a=>({zone:a.zone,name:a.name,low:a.hrLow,high:a.hrHigh}))),s?.run?.pace&&(e.run.thresholdPace=s.run.pace.thresholdPace||e.run.thresholdPace,s.run.pace.zones&&(e.run.paceZones=s.run.pace.zones.map(a=>({zone:a.zone,name:a.name,pace:a.pace})))),s?.bike?.hr&&(e.bike.lthr=s.bike.hr.lthr,e.bike.hrZones=s.bike.hr.zones.map(a=>({zone:a.zone,name:a.name,low:a.hrLow,high:a.hrHigh}))),s?.bike?.power&&(e.bike.ftp=s.bike.power.ftp,e.bike.powerZones=s.bike.power.zones.map(a=>({zone:a.zone,name:a.name,low:a.wattsLow,high:a.wattsHigh}))),s?.swim&&(e.swim.css=s.swim.css||e.swim.css,e.swim.cssSeconds=s.swim.cssSeconds||e.swim.cssSeconds,s.swim.zones&&(e.swim.paceZones=s.swim.zones.map(a=>({zone:a.zone,name:a.name,offset:a.paceOffset,pace:a.pace}))));const t=localStorage.getItem(Sn);if(t){const a=JSON.parse(t);a.theme&&(e.theme=a.theme),a.units&&(e.units={...e.units,...a.units}),a.firstDayOfWeek&&(e.firstDayOfWeek=a.firstDayOfWeek),a.run&&(e.run={...e.run,...a.run}),a.bike&&(e.bike={...e.bike,...a.bike}),a.swim&&(e.swim={...e.swim,...a.swim})}return e}function Jo(e){localStorage.setItem(Sn,JSON.stringify(e))}function xn(e){const s=e.split(":");return parseInt(s[0])*60+parseInt(s[1]||"0")}function En(e){const s=Math.floor(e/60),t=Math.round(e%60);return`${s}:${t.toString().padStart(2,"0")}`}function Yo(e){return[{zone:1,name:"Recovery",lowPct:0,highPct:81},{zone:2,name:"Aerobic",lowPct:81,highPct:89},{zone:3,name:"Tempo",lowPct:89,highPct:94},{zone:4,name:"Threshold",lowPct:94,highPct:100},{zone:5,name:"VO2max",lowPct:100,highPct:106}].map(t=>({zone:t.zone,name:t.name,low:Math.round(e*t.lowPct/100),high:Math.round(e*t.highPct/100)}))}function Xo(e){return[{zone:1,name:"Active Recovery",lowPct:0,highPct:55},{zone:2,name:"Endurance",lowPct:55,highPct:75},{zone:3,name:"Tempo",lowPct:75,highPct:90},{zone:4,name:"Threshold",lowPct:90,highPct:105},{zone:5,name:"VO2max",lowPct:105,highPct:120}].map(t=>({zone:t.zone,name:t.name,low:Math.round(e*t.lowPct/100),high:Math.round(e*t.highPct/100)}))}function Qo(e){const s=xn(e);return[{zone:"E",name:"Easy",factor:1.18},{zone:"M",name:"Marathon",factor:1.07},{zone:"T",name:"Threshold",factor:1},{zone:"I",name:"Interval",factor:.89},{zone:"R",name:"Repetition",factor:.82}].map(a=>({zone:a.zone,name:a.name,pace:En(Math.round(s*a.factor))}))}function $o(e){const s=xn(e);return[{zone:1,name:"Recovery",offset:20},{zone:2,name:"Aerobic",offset:10},{zone:3,name:"Tempo",offset:5},{zone:4,name:"Threshold",offset:0},{zone:5,name:"VO2max",offset:-5}].map(a=>({zone:a.zone,name:a.name,offset:a.offset,pace:En(s+a.offset)}))}const er="0.0.5";var sr=ue("<button> </button>"),tr=ue('<div class="settings-section svelte-1uhipit"><h4 class="settings-section-title svelte-1uhipit">Appearance</h4> <div class="theme-toggle svelte-1uhipit"><button><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" class="svelte-1uhipit"><circle cx="12" cy="12" r="5"></circle><path d="M12 1v2M12 21v2M4.22 4.22l1.42 1.42M18.36 18.36l1.42 1.42M1 12h2M21 12h2M4.22 19.78l1.42-1.42M18.36 5.64l1.42-1.42"></path></svg> Light</button> <button><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" class="svelte-1uhipit"><path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"></path></svg> Dark</button></div></div> <div class="settings-section svelte-1uhipit"><h4 class="settings-section-title svelte-1uhipit">Distance Units</h4> <div class="settings-row svelte-1uhipit"><span class="settings-label svelte-1uhipit">Swim</span> <select class="settings-select svelte-1uhipit"><option>Meters</option><option>Yards</option></select></div> <div class="settings-row svelte-1uhipit"><span class="settings-label svelte-1uhipit">Bike</span> <select class="settings-select svelte-1uhipit"><option>Kilometers</option><option>Miles</option></select></div> <div class="settings-row svelte-1uhipit"><span class="settings-label svelte-1uhipit">Run</span> <select class="settings-select svelte-1uhipit"><option>Kilometers</option><option>Miles</option></select></div></div> <div class="settings-section svelte-1uhipit"><h4 class="settings-section-title svelte-1uhipit">Calendar</h4> <div class="settings-row svelte-1uhipit"><span class="settings-label svelte-1uhipit">First day of week</span> <select class="settings-select svelte-1uhipit"><option>Monday</option><option>Sunday</option></select></div></div>',1),ar=ue('<div class="zone-row svelte-1uhipit"><span> </span> <span class="zone-name svelte-1uhipit"> </span> <input type="number" class="zone-input svelte-1uhipit"/> <input type="number" class="zone-input svelte-1uhipit"/></div>'),nr=ue('<div class="zone-row svelte-1uhipit"><span> </span> <span class="zone-name svelte-1uhipit"> </span> <input type="text" class="pace-input svelte-1uhipit"/></div>'),ir=ue('<div class="settings-section svelte-1uhipit"><h4 class="settings-section-title svelte-1uhipit">Heart Rate Zones</h4> <div class="threshold-row svelte-1uhipit"><span class="threshold-label svelte-1uhipit">Run LTHR</span> <input type="number" class="threshold-input svelte-1uhipit" min="100" max="220"/> <button class="recalc-btn svelte-1uhipit">Recalculate</button></div> <div class="zones-grid svelte-1uhipit"><div class="zone-row header svelte-1uhipit"><span>Zone</span><span>Name</span><span>Low</span><span>High</span></div> <!></div> <details class="help-details svelte-1uhipit"><summary class="svelte-1uhipit">How to find your LTHR</summary> <div class="help-content svelte-1uhipit"><p class="svelte-1uhipit"><strong>30-Minute Test:</strong></p> <ol class="svelte-1uhipit"><li class="svelte-1uhipit">Warm up for 15 minutes</li> <li class="svelte-1uhipit">Run as hard as you can sustain for 30 minutes</li> <li class="svelte-1uhipit">Your average HR for the last 20 minutes is your LTHR</li></ol></div></details></div> <div class="settings-section svelte-1uhipit"><h4 class="settings-section-title svelte-1uhipit">Pace Zones</h4> <div class="threshold-row svelte-1uhipit"><span class="threshold-label svelte-1uhipit">Threshold Pace</span> <input type="text" class="threshold-input svelte-1uhipit" placeholder="4:30"/> <button class="recalc-btn svelte-1uhipit">Recalculate</button></div> <div class="zones-grid svelte-1uhipit"><div class="zone-row header svelte-1uhipit"><span>Zone</span><span>Name</span><span colspan="2">Pace/km</span></div> <!></div> <details class="help-details svelte-1uhipit"><summary class="svelte-1uhipit">How to find your Threshold Pace</summary> <div class="help-content svelte-1uhipit"><p class="svelte-1uhipit"><strong>Option 1: Race-Based</strong></p> <ul class="svelte-1uhipit"><li class="svelte-1uhipit">Recent 5K race pace + 15-20 sec/km</li> <li class="svelte-1uhipit">Recent 10K race pace + 5-10 sec/km</li></ul> <p class="svelte-1uhipit"><strong>Option 2: 30-Minute Test</strong></p> <p class="svelte-1uhipit">Run 30 minutes at max sustainable effort. Average pace = threshold.</p></div></details></div>',1),lr=ue('<div class="zone-row svelte-1uhipit"><span> </span> <span class="zone-name svelte-1uhipit"> </span> <input type="number" class="zone-input svelte-1uhipit"/> <input type="number" class="zone-input svelte-1uhipit"/></div>'),or=ue('<div class="zone-row svelte-1uhipit"><span> </span> <span class="zone-name svelte-1uhipit"> </span> <input type="number" class="zone-input svelte-1uhipit"/> <input type="number" class="zone-input svelte-1uhipit"/></div>'),rr=ue('<div class="settings-section svelte-1uhipit"><h4 class="settings-section-title svelte-1uhipit">Heart Rate Zones</h4> <div class="threshold-row svelte-1uhipit"><span class="threshold-label svelte-1uhipit">Bike LTHR</span> <input type="number" class="threshold-input svelte-1uhipit" min="100" max="220"/> <button class="recalc-btn svelte-1uhipit">Recalculate</button></div> <div class="zones-grid svelte-1uhipit"><div class="zone-row header svelte-1uhipit"><span>Zone</span><span>Name</span><span>Low</span><span>High</span></div> <!></div> <details class="help-details svelte-1uhipit"><summary class="svelte-1uhipit">How to find your LTHR</summary> <div class="help-content svelte-1uhipit"><p class="svelte-1uhipit"><strong>30-Minute Test:</strong></p> <ol class="svelte-1uhipit"><li class="svelte-1uhipit">Warm up for 15 minutes</li> <li class="svelte-1uhipit">Bike as hard as you can sustain for 30 minutes</li> <li class="svelte-1uhipit">Your average HR for the last 20 minutes is your LTHR</li></ol> <p class="help-note svelte-1uhipit">Bike LTHR is typically 5-10 bpm lower than run.</p></div></details></div> <div class="settings-section svelte-1uhipit"><h4 class="settings-section-title svelte-1uhipit">Power Zones</h4> <div class="threshold-row svelte-1uhipit"><span class="threshold-label svelte-1uhipit">FTP (watts)</span> <input type="number" class="threshold-input svelte-1uhipit" min="50" max="500"/> <button class="recalc-btn svelte-1uhipit">Recalculate</button></div> <div class="zones-grid svelte-1uhipit"><div class="zone-row header svelte-1uhipit"><span>Zone</span><span>Name</span><span>Low W</span><span>High W</span></div> <!></div> <details class="help-details svelte-1uhipit"><summary class="svelte-1uhipit">How to find your FTP</summary> <div class="help-content svelte-1uhipit"><p class="svelte-1uhipit"><strong>20-Minute Test:</strong></p> <ol class="svelte-1uhipit"><li class="svelte-1uhipit">Warm up for 20 minutes including a few hard efforts</li> <li class="svelte-1uhipit">Ride as hard as you can sustain for 20 minutes</li> <li class="svelte-1uhipit">FTP = Average power × 0.95</li></ol> <p class="svelte-1uhipit"><strong>Ramp Test:</strong> Most trainer apps (Zwift, TrainerRoad) have built-in FTP tests.</p></div></details></div>',1),ur=ue('<div class="zone-row svelte-1uhipit"><span> </span> <span class="zone-name svelte-1uhipit"> </span> <span class="zone-name svelte-1uhipit"> </span> <input type="text" class="pace-input svelte-1uhipit"/></div>'),cr=ue('<div class="settings-section svelte-1uhipit"><h4 class="settings-section-title svelte-1uhipit">Pace Zones</h4> <div class="threshold-row svelte-1uhipit"><span class="threshold-label svelte-1uhipit">CSS (per 100m)</span> <input type="text" class="threshold-input svelte-1uhipit" placeholder="1:45"/> <button class="recalc-btn svelte-1uhipit">Recalculate</button></div> <div class="zones-grid svelte-1uhipit"><div class="zone-row header svelte-1uhipit"><span>Zone</span><span>Name</span><span>Offset</span><span>Pace/100</span></div> <!></div> <details class="help-details svelte-1uhipit"><summary class="svelte-1uhipit">How to find your CSS</summary> <div class="help-content svelte-1uhipit"><p class="svelte-1uhipit"><strong>CSS Test (Critical Swim Speed):</strong></p> <ol class="svelte-1uhipit"><li class="svelte-1uhipit">Warm up for 10 minutes</li> <li class="svelte-1uhipit">Swim 400m all-out, record time (T400)</li> <li class="svelte-1uhipit">Rest 5-10 minutes</li> <li class="svelte-1uhipit">Swim 200m all-out, record time (T200)</li> <li class="svelte-1uhipit">CSS = (T400 - T200) ÷ 2 = pace per 100m</li></ol> <p class="svelte-1uhipit"><strong>Example:</strong> 400m in 6:40 (400s), 200m in 3:00 (180s)<br/> CSS = (400 - 180) ÷ 2 = 110 sec/100m = 1:50/100m</p></div></details></div>'),mr=ue("<div> </div>"),fr=ue(`<div class="settings-section svelte-1uhipit"><h4 class="settings-section-title svelte-1uhipit">Your Data</h4> <div class="data-explainer svelte-1uhipit"><p class="svelte-1uhipit">Your training data is stored <strong>only on this device</strong>, in your browser's
|
|
39
39
|
local storage. This includes your settings, completed workouts, and any changes you've
|
|
40
40
|
made to your plan.</p> <p class="svelte-1uhipit">If you clear your browser data, switch browsers, or use a different device, your
|
|
41
41
|
progress won't be there. Use the backup feature below to save your data and restore it
|