From 756e4f86d9650b054fd538c2f1ccbb039511d778 Mon Sep 17 00:00:00 2001 From: Dominic Ferrando Date: Mon, 6 Jul 2026 11:42:12 -0400 Subject: [PATCH] Remove standards config fallback and implement caching --- .gitignore | 1 + .zed/settings.json | 8 - apps/api/src/scripts/analyze.ts | 6 +- apps/api/src/server.ts | 14 +- apps/api/src/services/calculator.ts | 129 +- .../src/data/standards/fallback-data.json | 5316 ----------------- .../src/data/standards/fallback-params.json | 79 - packages/calculator/src/index.ts | 12 +- packages/commerce/src/printful.ts | 3 +- packages/commerce/src/webflow.ts | 3 +- 10 files changed, 95 insertions(+), 5476 deletions(-) delete mode 100644 .zed/settings.json delete mode 100644 packages/calculator/src/data/standards/fallback-data.json delete mode 100644 packages/calculator/src/data/standards/fallback-params.json diff --git a/.gitignore b/.gitignore index 57be201..b84c70e 100644 --- a/.gitignore +++ b/.gitignore @@ -31,6 +31,7 @@ report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json # IntelliJ based IDEs .idea +.zed # Finder (MacOS) folder config .DS_Store diff --git a/.zed/settings.json b/.zed/settings.json deleted file mode 100644 index 10de89b..0000000 --- a/.zed/settings.json +++ /dev/null @@ -1,8 +0,0 @@ -// Folder-specific settings -// -// For a full list of overridable settings, and general information on folder-specific settings, -// see the documentation: https://zed.dev/docs/configuring-zed#settings-files -{ - "tab_size": 4, - "hard_tabs": false -} diff --git a/apps/api/src/scripts/analyze.ts b/apps/api/src/scripts/analyze.ts index d7386b6..dfeae78 100644 --- a/apps/api/src/scripts/analyze.ts +++ b/apps/api/src/scripts/analyze.ts @@ -1,10 +1,12 @@ import { type Levels, - FALLBACK_STANDARDS_CONFIG, } from "@blade-and-brawn/calculator"; import { Activity, clamp, Gender, range } from "@blade-and-brawn/domain"; import { levenbergMarquardt as LM } from "ml-levenberg-marquardt"; +import { CalculatorService } from "../services/calculator"; +const calculator = new CalculatorService(); +const standardsConfig = await calculator.Standards.Config.get(); for (const activity of Object.values(Activity)) { const DATASET_MAX_LEVEL = 5; const NEW_LEVEL_COUNT = 2; @@ -15,7 +17,7 @@ for (const activity of Object.values(Activity)) { } for (const gender of Object.values(Gender)) { - const standardsByGender = FALLBACK_STANDARDS_CONFIG.data[ + const standardsByGender = standardsConfig.data[ activity ].standards.filter((s) => s["metrics"].gender === gender); const ages = [...new Set(standardsByGender.map((s) => s.metrics.age))]; diff --git a/apps/api/src/server.ts b/apps/api/src/server.ts index f554e00..87e83c7 100644 --- a/apps/api/src/server.ts +++ b/apps/api/src/server.ts @@ -17,7 +17,7 @@ import jwt from "@elysia/jwt"; import { CommerceService } from "./services/commerce"; import cluster from "node:cluster"; import { randomUUIDv7 } from "bun"; -import { CalculatorService } from "./services/calculator"; +import { CalculatorService, CalculatorUnavailableError } from "./services/calculator"; import { StandardsParamsSchema } from "@blade-and-brawn/calculator"; // SERVICES @@ -47,6 +47,7 @@ export const app = new Elysia() .error({ PrintfulError, WebflowError, + CalculatorUnavailableError, }) .onError(({ code, error }) => { @@ -54,14 +55,17 @@ export const app = new Elysia() case "PrintfulError": case "WebflowError": log.error( - { upstreamStatus: error.status, payload: error.payload }, + { upstreamStatus: error.upstreamStatus, payload: error.payload }, error.message, ); - return status(502, { error: error.message }); + return status(error.status, { error: error.message }); + case "CalculatorUnavailableError": + log.error({ err: error.cause }, error.message); + return status(error.status, { error: error.message }); case "NOT_FOUND": - return status(404, { error: "Not found" }); + return status(error.status, { error: error.message }); case "VALIDATION": - return status(400, { error: error.message }); + return status(error.status, { error: error.message }); default: log.error({ err: error }, "unhandled error"); } diff --git a/apps/api/src/services/calculator.ts b/apps/api/src/services/calculator.ts index bfba18e..97119bf 100644 --- a/apps/api/src/services/calculator.ts +++ b/apps/api/src/services/calculator.ts @@ -1,45 +1,69 @@ -import { LevelCalculator, Standards, FALLBACK_STANDARDS_CONFIG, type StandardsParams, StandardsParamsSchema, StandardsDataSchema, type StandardsConfig } from "@blade-and-brawn/calculator"; +import { LevelCalculator, Standards, type StandardsParams, StandardsParamsSchema, StandardsDataSchema, type StandardsConfig, type LevelCalculatorOutput } from "@blade-and-brawn/calculator"; import type { ActivityPerformance, Player } from "@blade-and-brawn/domain"; import { db } from "../database/db"; import { Value } from "@sinclair/typebox/value"; import { log } from "../util"; +export class CalculatorUnavailableError extends Error { + status: number = 503 +} + export class CalculatorService { - private Calculator = new LevelCalculator(new Standards(FALLBACK_STANDARDS_CONFIG)); - Standards: StandardsService = new StandardsService(this.Calculator); - private ready: Promise; + private calculator: LevelCalculator | null = null; + private appliedConfigStringified: string | null = null; + Standards: StandardsService = new StandardsService(); constructor() { - // Load the selected config on startup instead of waiting for the - // first `calculate()` call. If it fails (e.g. no config selected - // yet, DB unreachable at boot), fall back to DEFAULT_STANDARDS_CONFIG - // and keep serving — it'll retry on the next refresh. - this.ready = this.Standards.Config.refresh() - .catch((err) => log.error({ err }, "failed to load initial standards config, falling back to defaults")); + // eagerly load + this.refresh().catch((err) => log.error({ err }, "failed to load initial standards config")); } - async calculate(player: Player, activityPerformances: ActivityPerformance[]) { - await this.ready; - this.Standards.Config.refresh({ onlyIfStale: true }).catch((err) => log.error({ err }, "failed to refresh standards config")); - return this.Calculator.calculate(player, activityPerformances); + async calculate(player: Player, activityPerformances: ActivityPerformance[]): Promise { + await this.refresh(); + if (!this.calculator) throw new CalculatorUnavailableError("Level calculator is not ready"); + return this.calculator.calculate(player, activityPerformances); + } + + private async refresh(): Promise { + const standardsConfig = await this.Standards.Config.get(); + const standardsConfigStringified = JSON.stringify(standardsConfig); + + if (this.calculator) { + // avoid instatiating a new Standards object if nothing changed + if (standardsConfigStringified === this.appliedConfigStringified) return; + + this.calculator.Standards = new Standards(standardsConfig); + } + else { + this.calculator = new LevelCalculator(new Standards(standardsConfig)); + } + this.appliedConfigStringified = standardsConfigStringified; } } class StandardsService { Config: StandardsConfigService; - constructor(private Calculator: LevelCalculator) { - this.Config = new StandardsConfigService(this.Calculator); + constructor() { + this.Config = new StandardsConfigService(); } } class StandardsConfigService { - private static readonly REFRESH_INTERVAL_MS = 30_000; - private cachedParametersStringified: string | null = null; - private cachedDatasetId: string | null = null; - private lastRefreshedAt = 0; - - constructor(private Calculator: LevelCalculator) { } + private cache = { + refreshInterval: 30_000, + lastRefreshedAt: 0, + isStale: function () { + return Date.now() - this.lastRefreshedAt >= this.refreshInterval; + }, + isIncomplete: function () { + return !this.data.datasetId || !this.data.config + }, + data: { + datasetId: null as string | null, + config: null as StandardsConfig | null + }, + } async create(datasetId: string, params: StandardsParams) { await db.insertInto("standards_configs") @@ -48,11 +72,10 @@ class StandardsConfigService { } /** Retrieves the currently selected configuration */ - async get(opt: { skipCache?: boolean } = {}): Promise { - if (!opt.skipCache) return this.Calculator.Standards.cfg; - - await this.refresh(); - return this.Calculator.Standards.cfg; + async get(): Promise { + await this.refresh({ onlyIfStale: true }); + if (!this.cache.data.config) throw new CalculatorUnavailableError("Unable to determine the selected standards configuration"); + return this.cache.data.config; } async update(id: string, datasetId: string, params: StandardsParams) { @@ -63,34 +86,34 @@ class StandardsConfigService { if (result[0]?.numUpdatedRows === 0n) throw new Error(`No config with id "${id}"`); } - async refresh(opt: { onlyIfStale?: boolean } = {}) { - if (opt.onlyIfStale) - if (Date.now() - this.lastRefreshedAt < StandardsConfigService.REFRESH_INTERVAL_MS) return; + async refresh(opt: { onlyIfStale?: boolean } = {}): Promise { + if (!this.cache.isIncomplete() && (opt.onlyIfStale && !this.cache.isStale())) return; - this.lastRefreshedAt = Date.now(); + try { + const result = await db.selectFrom("standards_configs") + .innerJoin("standards_datasets", "standards_datasets.id", "standards_configs.dataset_id") + .select([ + "standards_configs.dataset_id as datasetId", + "standards_configs.params as params", + "standards_datasets.data as data", + ]) + .where("standards_configs.is_selected", "=", true) + .limit(1) + .executeTakeFirstOrThrow({ errorConstructor: () => new Error("No standards config selected") }); + Value.Assert(StandardsParamsSchema, result.params); + Value.Assert(StandardsDataSchema, result.data); - const result = await db.selectFrom("standards_configs") - .innerJoin("standards_datasets", "standards_datasets.id", "standards_configs.dataset_id") - .select([ - "standards_configs.dataset_id as datasetId", - "standards_configs.params as params", - "standards_datasets.data as data", - ]) - .where("standards_configs.is_selected", "=", true) - .limit(1) - .executeTakeFirstOrThrow({ errorConstructor: () => new Error("No standards config selected") }); - Value.Assert(StandardsParamsSchema, result.params); - Value.Assert(StandardsDataSchema, result.data); - - const parametersStringified = JSON.stringify(result.params); - if (parametersStringified === this.cachedParametersStringified && result.datasetId === this.cachedDatasetId) return; - - this.Calculator.Standards = new Standards({ - data: result.data, - params: result.params - }); - this.cachedParametersStringified = parametersStringified; - this.cachedDatasetId = result.datasetId; + this.cache.data.datasetId = result.datasetId; + this.cache.data.config = { + data: result.data, + params: result.params + }; + // only mark as refreshed once we've actually confirmed the selected + // config; a failed attempt must not make stale data look fresh + this.cache.lastRefreshedAt = Date.now(); + } catch (err) { + throw new CalculatorUnavailableError("Unable to determine the selected standards configuration", { cause: err }); + } } async switch(id: string) { diff --git a/packages/calculator/src/data/standards/fallback-data.json b/packages/calculator/src/data/standards/fallback-data.json deleted file mode 100644 index 4383735..0000000 --- a/packages/calculator/src/data/standards/fallback-data.json +++ /dev/null @@ -1,5316 +0,0 @@ -{ - "BackSquat": { - "metadata": { - "attribute": "Strength", - "generators": [], - "unit": "kg", - "name": "Squat" - }, - "standards": [ - { - "metrics": { - "age": 17, - "weight": 57, - "gender": "Male" - }, - "levels": { - "1": 34, - "2": 59, - "3": 78, - "4": 107, - "5": 136 - } - }, - { - "metrics": { - "age": 17, - "weight": 68, - "gender": "Male" - }, - "levels": { - "1": 38, - "2": 65, - "3": 87, - "4": 120, - "5": 158 - } - }, - { - "metrics": { - "age": 17, - "weight": 79, - "gender": "Male" - }, - "levels": { - "1": 46, - "2": 80, - "3": 106, - "4": 146, - "5": 192 - } - }, - { - "metrics": { - "age": 17, - "weight": 91, - "gender": "Male" - }, - "levels": { - "1": 49, - "2": 85, - "3": 113, - "4": 155, - "5": 205 - } - }, - { - "metrics": { - "age": 17, - "weight": 102, - "gender": "Male" - }, - "levels": { - "1": 52, - "2": 89, - "3": 118, - "4": 162, - "5": 209 - } - }, - { - "metrics": { - "age": 17, - "weight": 113, - "gender": "Male" - }, - "levels": { - "1": 53, - "2": 90, - "3": 120, - "4": 165, - "5": 213 - } - }, - { - "metrics": { - "age": 17, - "weight": 136, - "gender": "Male" - }, - "levels": { - "1": 56, - "2": 97, - "3": 129, - "4": 177, - "5": 219 - } - }, - { - "metrics": { - "age": 25, - "weight": 57, - "gender": "Male" - }, - "levels": { - "1": 38, - "2": 65, - "3": 87, - "4": 120, - "5": 153 - } - }, - { - "metrics": { - "age": 25, - "weight": 68, - "gender": "Male" - }, - "levels": { - "1": 46, - "2": 78, - "3": 104, - "4": 143, - "5": 189 - } - }, - { - "metrics": { - "age": 25, - "weight": 79, - "gender": "Male" - }, - "levels": { - "1": 51, - "2": 87, - "3": 116, - "4": 160, - "5": 210 - } - }, - { - "metrics": { - "age": 25, - "weight": 91, - "gender": "Male" - }, - "levels": { - "1": 58, - "2": 98, - "3": 130, - "4": 179, - "5": 236 - } - }, - { - "metrics": { - "age": 25, - "weight": 102, - "gender": "Male" - }, - "levels": { - "1": 57, - "2": 98, - "3": 131, - "4": 180, - "5": 232 - } - }, - { - "metrics": { - "age": 25, - "weight": 113, - "gender": "Male" - }, - "levels": { - "1": 70, - "2": 120, - "3": 160, - "4": 220, - "5": 285 - } - }, - { - "metrics": { - "age": 25, - "weight": 136, - "gender": "Male" - }, - "levels": { - "1": 68, - "2": 116, - "3": 164, - "4": 226, - "5": 282 - } - }, - { - "metrics": { - "age": 35, - "weight": 57, - "gender": "Male" - }, - "levels": { - "1": 40, - "2": 68, - "3": 91, - "4": 125, - "5": 159 - } - }, - { - "metrics": { - "age": 35, - "weight": 68, - "gender": "Male" - }, - "levels": { - "1": 48, - "2": 82, - "3": 110, - "4": 151, - "5": 199 - } - }, - { - "metrics": { - "age": 35, - "weight": 79, - "gender": "Male" - }, - "levels": { - "1": 53, - "2": 91, - "3": 122, - "4": 167, - "5": 220 - } - }, - { - "metrics": { - "age": 35, - "weight": 91, - "gender": "Male" - }, - "levels": { - "1": 58, - "2": 99, - "3": 132, - "4": 181, - "5": 238 - } - }, - { - "metrics": { - "age": 35, - "weight": 102, - "gender": "Male" - }, - "levels": { - "1": 62, - "2": 106, - "3": 142, - "4": 195, - "5": 252 - } - }, - { - "metrics": { - "age": 35, - "weight": 113, - "gender": "Male" - }, - "levels": { - "1": 66, - "2": 113, - "3": 150, - "4": 206, - "5": 267 - } - }, - { - "metrics": { - "age": 35, - "weight": 136, - "gender": "Male" - }, - "levels": { - "1": 74, - "2": 127, - "3": 169, - "4": 232, - "5": 291 - } - }, - { - "metrics": { - "age": 45, - "weight": 57, - "gender": "Male" - }, - "levels": { - "1": 38, - "2": 65, - "3": 86, - "4": 118, - "5": 142 - } - }, - { - "metrics": { - "age": 45, - "weight": 68, - "gender": "Male" - }, - "levels": { - "1": 43, - "2": 73, - "3": 98, - "4": 134, - "5": 161 - } - }, - { - "metrics": { - "age": 45, - "weight": 79, - "gender": "Male" - }, - "levels": { - "1": 46, - "2": 79, - "3": 105, - "4": 144, - "5": 173 - } - }, - { - "metrics": { - "age": 45, - "weight": 91, - "gender": "Male" - }, - "levels": { - "1": 54, - "2": 92, - "3": 123, - "4": 169, - "5": 203 - } - }, - { - "metrics": { - "age": 45, - "weight": 102, - "gender": "Male" - }, - "levels": { - "1": 56, - "2": 97, - "3": 129, - "4": 177, - "5": 213 - } - }, - { - "metrics": { - "age": 45, - "weight": 113, - "gender": "Male" - }, - "levels": { - "1": 61, - "2": 104, - "3": 139, - "4": 191, - "5": 229 - } - }, - { - "metrics": { - "age": 45, - "weight": 136, - "gender": "Male" - }, - "levels": { - "1": 66, - "2": 113, - "3": 150, - "4": 206, - "5": 248 - } - }, - { - "metrics": { - "age": 55, - "weight": 57, - "gender": "Male" - }, - "levels": { - "1": 32, - "2": 55, - "3": 73, - "4": 100, - "5": 132 - } - }, - { - "metrics": { - "age": 55, - "weight": 68, - "gender": "Male" - }, - "levels": { - "1": 37, - "2": 64, - "3": 85, - "4": 117, - "5": 154 - } - }, - { - "metrics": { - "age": 55, - "weight": 79, - "gender": "Male" - }, - "levels": { - "1": 42, - "2": 71, - "3": 95, - "4": 131, - "5": 172 - } - }, - { - "metrics": { - "age": 55, - "weight": 91, - "gender": "Male" - }, - "levels": { - "1": 46, - "2": 80, - "3": 106, - "4": 146, - "5": 192 - } - }, - { - "metrics": { - "age": 55, - "weight": 102, - "gender": "Male" - }, - "levels": { - "1": 50, - "2": 86, - "3": 114, - "4": 157, - "5": 207 - } - }, - { - "metrics": { - "age": 55, - "weight": 113, - "gender": "Male" - }, - "levels": { - "1": 53, - "2": 90, - "3": 120, - "4": 165, - "5": 218 - } - }, - { - "metrics": { - "age": 55, - "weight": 136, - "gender": "Male" - }, - "levels": { - "1": 54, - "2": 93, - "3": 124, - "4": 171, - "5": 225 - } - }, - { - "metrics": { - "age": 65, - "weight": 57, - "gender": "Male" - }, - "levels": { - "1": 23, - "2": 40, - "3": 53, - "4": 73, - "5": 96 - } - }, - { - "metrics": { - "age": 65, - "weight": 68, - "gender": "Male" - }, - "levels": { - "1": 33, - "2": 57, - "3": 76, - "4": 105, - "5": 138 - } - }, - { - "metrics": { - "age": 65, - "weight": 79, - "gender": "Male" - }, - "levels": { - "1": 40, - "2": 68, - "3": 91, - "4": 125, - "5": 165 - } - }, - { - "metrics": { - "age": 65, - "weight": 91, - "gender": "Male" - }, - "levels": { - "1": 43, - "2": 74, - "3": 98, - "4": 135, - "5": 178 - } - }, - { - "metrics": { - "age": 65, - "weight": 102, - "gender": "Male" - }, - "levels": { - "1": 47, - "2": 80, - "3": 107, - "4": 147, - "5": 194 - } - }, - { - "metrics": { - "age": 65, - "weight": 113, - "gender": "Male" - }, - "levels": { - "1": 48, - "2": 83, - "3": 110, - "4": 151, - "5": 199 - } - }, - { - "metrics": { - "age": 65, - "weight": 136, - "gender": "Male" - }, - "levels": { - "1": 50, - "2": 86, - "3": 115, - "4": 158, - "5": 208 - } - }, - { - "metrics": { - "age": 75, - "weight": 57, - "gender": "Male" - }, - "levels": { - "1": 22, - "2": 38, - "3": 51, - "4": 70, - "5": 92 - } - }, - { - "metrics": { - "age": 75, - "weight": 68, - "gender": "Male" - }, - "levels": { - "1": 30, - "2": 51, - "3": 68, - "4": 94, - "5": 123 - } - }, - { - "metrics": { - "age": 75, - "weight": 79, - "gender": "Male" - }, - "levels": { - "1": 33, - "2": 56, - "3": 75, - "4": 103, - "5": 136 - } - }, - { - "metrics": { - "age": 75, - "weight": 91, - "gender": "Male" - }, - "levels": { - "1": 34, - "2": 59, - "3": 78, - "4": 107, - "5": 141 - } - }, - { - "metrics": { - "age": 75, - "weight": 102, - "gender": "Male" - }, - "levels": { - "1": 35, - "2": 59, - "3": 79, - "4": 109, - "5": 143 - } - }, - { - "metrics": { - "age": 75, - "weight": 113, - "gender": "Male" - }, - "levels": { - "1": 35, - "2": 60, - "3": 80, - "4": 110, - "5": 145 - } - }, - { - "metrics": { - "age": 75, - "weight": 136, - "gender": "Male" - }, - "levels": { - "1": 36, - "2": 62, - "3": 82, - "4": 113, - "5": 149 - } - }, - { - "metrics": { - "age": 85, - "weight": 57, - "gender": "Male" - }, - "levels": { - "1": 18, - "2": 30, - "3": 40, - "4": 55, - "5": 73 - } - }, - { - "metrics": { - "age": 85, - "weight": 68, - "gender": "Male" - }, - "levels": { - "1": 24, - "2": 40, - "3": 54, - "4": 74, - "5": 97 - } - }, - { - "metrics": { - "age": 85, - "weight": 79, - "gender": "Male" - }, - "levels": { - "1": 26, - "2": 44, - "3": 59, - "4": 81, - "5": 107 - } - }, - { - "metrics": { - "age": 85, - "weight": 91, - "gender": "Male" - }, - "levels": { - "1": 27, - "2": 46, - "3": 62, - "4": 85, - "5": 112 - } - }, - { - "metrics": { - "age": 85, - "weight": 102, - "gender": "Male" - }, - "levels": { - "1": 28, - "2": 46, - "3": 62, - "4": 86, - "5": 113 - } - }, - { - "metrics": { - "age": 85, - "weight": 113, - "gender": "Male" - }, - "levels": { - "1": 28, - "2": 47, - "3": 63, - "4": 87, - "5": 115 - } - }, - { - "metrics": { - "age": 85, - "weight": 136, - "gender": "Male" - }, - "levels": { - "1": 28, - "2": 49, - "3": 65, - "4": 89, - "5": 117 - } - }, - { - "metrics": { - "age": 17, - "weight": 57, - "gender": "Female" - }, - "levels": { - "1": 23, - "2": 32, - "3": 44, - "4": 61, - "5": 84 - } - }, - { - "metrics": { - "age": 17, - "weight": 68, - "gender": "Female" - }, - "levels": { - "1": 29, - "2": 41, - "3": 56, - "4": 77, - "5": 106 - } - }, - { - "metrics": { - "age": 17, - "weight": 79, - "gender": "Female" - }, - "levels": { - "1": 32, - "2": 44, - "3": 61, - "4": 84, - "5": 116 - } - }, - { - "metrics": { - "age": 17, - "weight": 91, - "gender": "Female" - }, - "levels": { - "1": 35, - "2": 48, - "3": 66, - "4": 91, - "5": 126 - } - }, - { - "metrics": { - "age": 17, - "weight": 102, - "gender": "Female" - }, - "levels": { - "1": 35, - "2": 48, - "3": 66, - "4": 91, - "5": 125 - } - }, - { - "metrics": { - "age": 17, - "weight": 113, - "gender": "Female" - }, - "levels": { - "1": 36, - "2": 50, - "3": 68, - "4": 94, - "5": 130 - } - }, - { - "metrics": { - "age": 17, - "weight": 136, - "gender": "Female" - }, - "levels": { - "1": 53, - "2": 73, - "3": 100, - "4": 138, - "5": 190 - } - }, - { - "metrics": { - "age": 25, - "weight": 57, - "gender": "Female" - }, - "levels": { - "1": 27, - "2": 37, - "3": 51, - "4": 70, - "5": 97 - } - }, - { - "metrics": { - "age": 25, - "weight": 68, - "gender": "Female" - }, - "levels": { - "1": 32, - "2": 45, - "3": 61, - "4": 85, - "5": 118 - } - }, - { - "metrics": { - "age": 25, - "weight": 79, - "gender": "Female" - }, - "levels": { - "1": 35, - "2": 49, - "3": 67, - "4": 93, - "5": 128 - } - }, - { - "metrics": { - "age": 25, - "weight": 91, - "gender": "Female" - }, - "levels": { - "1": 36, - "2": 50, - "3": 69, - "4": 95, - "5": 132 - } - }, - { - "metrics": { - "age": 25, - "weight": 102, - "gender": "Female" - }, - "levels": { - "1": 40, - "2": 55, - "3": 76, - "4": 105, - "5": 145 - } - }, - { - "metrics": { - "age": 25, - "weight": 113, - "gender": "Female" - }, - "levels": { - "1": 46, - "2": 63, - "3": 87, - "4": 120, - "5": 165 - } - }, - { - "metrics": { - "age": 25, - "weight": 136, - "gender": "Female" - }, - "levels": { - "1": 57, - "2": 75, - "3": 105, - "4": 140, - "5": 195 - } - }, - { - "metrics": { - "age": 35, - "weight": 57, - "gender": "Female" - }, - "levels": { - "1": 28, - "2": 43, - "3": 65, - "4": 89, - "5": 112 - } - }, - { - "metrics": { - "age": 35, - "weight": 68, - "gender": "Female" - }, - "levels": { - "1": 34, - "2": 48, - "3": 71, - "4": 97, - "5": 128 - } - }, - { - "metrics": { - "age": 35, - "weight": 79, - "gender": "Female" - }, - "levels": { - "1": 36, - "2": 55, - "3": 80, - "4": 110, - "5": 144 - } - }, - { - "metrics": { - "age": 35, - "weight": 91, - "gender": "Female" - }, - "levels": { - "1": 38, - "2": 59, - "3": 85, - "4": 117, - "5": 154 - } - }, - { - "metrics": { - "age": 35, - "weight": 102, - "gender": "Female" - }, - "levels": { - "1": 44, - "2": 62, - "3": 89, - "4": 123, - "5": 157 - } - }, - { - "metrics": { - "age": 35, - "weight": 113, - "gender": "Female" - }, - "levels": { - "1": 51, - "2": 68, - "3": 97, - "4": 134, - "5": 171 - } - }, - { - "metrics": { - "age": 35, - "weight": 136, - "gender": "Female" - }, - "levels": { - "1": 60, - "2": 81, - "3": 114, - "4": 157, - "5": 192 - } - }, - { - "metrics": { - "age": 45, - "weight": 57, - "gender": "Female" - }, - "levels": { - "1": 23, - "2": 38, - "3": 41, - "4": 69, - "5": 78 - } - }, - { - "metrics": { - "age": 45, - "weight": 68, - "gender": "Female" - }, - "levels": { - "1": 30, - "2": 49, - "3": 55, - "4": 90, - "5": 100 - } - }, - { - "metrics": { - "age": 45, - "weight": 79, - "gender": "Female" - }, - "levels": { - "1": 33, - "2": 53, - "3": 59, - "4": 96, - "5": 108 - } - }, - { - "metrics": { - "age": 45, - "weight": 91, - "gender": "Female" - }, - "levels": { - "1": 34, - "2": 55, - "3": 62, - "4": 101, - "5": 114 - } - }, - { - "metrics": { - "age": 45, - "weight": 102, - "gender": "Female" - }, - "levels": { - "1": 36, - "2": 58, - "3": 65, - "4": 105, - "5": 119 - } - }, - { - "metrics": { - "age": 45, - "weight": 113, - "gender": "Female" - }, - "levels": { - "1": 38, - "2": 61, - "3": 69, - "4": 111, - "5": 126 - } - }, - { - "metrics": { - "age": 45, - "weight": 136, - "gender": "Female" - }, - "levels": { - "1": 40, - "2": 64, - "3": 73, - "4": 117, - "5": 133 - } - }, - { - "metrics": { - "age": 55, - "weight": 57, - "gender": "Female" - }, - "levels": { - "1": 19, - "2": 33, - "3": 40, - "4": 60, - "5": 76 - } - }, - { - "metrics": { - "age": 55, - "weight": 68, - "gender": "Female" - }, - "levels": { - "1": 24, - "2": 41, - "3": 54, - "4": 74, - "5": 97 - } - }, - { - "metrics": { - "age": 55, - "weight": 79, - "gender": "Female" - }, - "levels": { - "1": 25, - "2": 42, - "3": 56, - "4": 76, - "5": 102 - } - }, - { - "metrics": { - "age": 55, - "weight": 91, - "gender": "Female" - }, - "levels": { - "1": 26, - "2": 44, - "3": 59, - "4": 81, - "5": 107 - } - }, - { - "metrics": { - "age": 55, - "weight": 102, - "gender": "Female" - }, - "levels": { - "1": 29, - "2": 49, - "3": 64, - "4": 90, - "5": 118 - } - }, - { - "metrics": { - "age": 55, - "weight": 113, - "gender": "Female" - }, - "levels": { - "1": 29, - "2": 50, - "3": 67, - "4": 92, - "5": 121 - } - }, - { - "metrics": { - "age": 55, - "weight": 136, - "gender": "Female" - }, - "levels": { - "1": 35, - "2": 59, - "3": 70, - "4": 111, - "5": 130 - } - }, - { - "metrics": { - "age": 65, - "weight": 57, - "gender": "Female" - }, - "levels": { - "1": 15, - "2": 26, - "3": 35, - "4": 48, - "5": 63 - } - }, - { - "metrics": { - "age": 65, - "weight": 68, - "gender": "Female" - }, - "levels": { - "1": 18, - "2": 33, - "3": 44, - "4": 62, - "5": 81 - } - }, - { - "metrics": { - "age": 65, - "weight": 79, - "gender": "Female" - }, - "levels": { - "1": 20, - "2": 35, - "3": 47, - "4": 65, - "5": 83 - } - }, - { - "metrics": { - "age": 65, - "weight": 91, - "gender": "Female" - }, - "levels": { - "1": 22, - "2": 37, - "3": 48, - "4": 66, - "5": 85 - } - }, - { - "metrics": { - "age": 65, - "weight": 102, - "gender": "Female" - }, - "levels": { - "1": 24, - "2": 40, - "3": 54, - "4": 74, - "5": 93 - } - }, - { - "metrics": { - "age": 65, - "weight": 113, - "gender": "Female" - }, - "levels": { - "1": 25, - "2": 42, - "3": 56, - "4": 78, - "5": 99 - } - }, - { - "metrics": { - "age": 65, - "weight": 136, - "gender": "Female" - }, - "levels": { - "1": 26, - "2": 45, - "3": 58, - "4": 79, - "5": 102 - } - }, - { - "metrics": { - "age": 75, - "weight": 57, - "gender": "Female" - }, - "levels": { - "1": 14, - "2": 24, - "3": 32, - "4": 44, - "5": 58 - } - }, - { - "metrics": { - "age": 75, - "weight": 68, - "gender": "Female" - }, - "levels": { - "1": 15, - "2": 25, - "3": 33, - "4": 46, - "5": 60 - } - }, - { - "metrics": { - "age": 75, - "weight": 79, - "gender": "Female" - }, - "levels": { - "1": 16, - "2": 27, - "3": 36, - "4": 50, - "5": 65 - } - }, - { - "metrics": { - "age": 75, - "weight": 91, - "gender": "Female" - }, - "levels": { - "1": 17, - "2": 28, - "3": 37, - "4": 52, - "5": 69 - } - }, - { - "metrics": { - "age": 75, - "weight": 102, - "gender": "Female" - }, - "levels": { - "1": 17, - "2": 29, - "3": 39, - "4": 54, - "5": 71 - } - }, - { - "metrics": { - "age": 75, - "weight": 113, - "gender": "Female" - }, - "levels": { - "1": 18, - "2": 30, - "3": 40, - "4": 55, - "5": 73 - } - }, - { - "metrics": { - "age": 75, - "weight": 136, - "gender": "Female" - }, - "levels": { - "1": 18, - "2": 30, - "3": 40, - "4": 55, - "5": 73 - } - }, - { - "metrics": { - "age": 85, - "weight": 57, - "gender": "Female" - }, - "levels": { - "1": 11, - "2": 19, - "3": 25, - "4": 35, - "5": 46 - } - }, - { - "metrics": { - "age": 85, - "weight": 68, - "gender": "Female" - }, - "levels": { - "1": 11, - "2": 20, - "3": 26, - "4": 36, - "5": 48 - } - }, - { - "metrics": { - "age": 85, - "weight": 79, - "gender": "Female" - }, - "levels": { - "1": 12, - "2": 21, - "3": 28, - "4": 39, - "5": 52 - } - }, - { - "metrics": { - "age": 85, - "weight": 91, - "gender": "Female" - }, - "levels": { - "1": 13, - "2": 23, - "3": 30, - "4": 41, - "5": 54 - } - }, - { - "metrics": { - "age": 85, - "weight": 102, - "gender": "Female" - }, - "levels": { - "1": 13, - "2": 23, - "3": 31, - "4": 42, - "5": 56 - } - }, - { - "metrics": { - "age": 85, - "weight": 113, - "gender": "Female" - }, - "levels": { - "1": 14, - "2": 24, - "3": 32, - "4": 43, - "5": 57 - } - }, - { - "metrics": { - "age": 85, - "weight": 136, - "gender": "Female" - }, - "levels": { - "1": 14, - "2": 24, - "3": 32, - "4": 43, - "5": 57 - } - } - ] - }, - "Deadlift": { - "metadata": { - "attribute": "Strength", - "generators": [], - "unit": "kg", - "name": "Deadlift" - }, - "standards": [ - { - "metrics": { - "age": 17, - "weight": 57, - "gender": "Male" - }, - "levels": { - "1": 45, - "2": 74, - "3": 93, - "4": 103, - "5": 115 - } - }, - { - "metrics": { - "age": 17, - "weight": 68, - "gender": "Male" - }, - "levels": { - "1": 58, - "2": 97, - "3": 121, - "4": 134, - "5": 149 - } - }, - { - "metrics": { - "age": 17, - "weight": 79, - "gender": "Male" - }, - "levels": { - "1": 73, - "2": 122, - "3": 152, - "4": 169, - "5": 188 - } - }, - { - "metrics": { - "age": 17, - "weight": 91, - "gender": "Male" - }, - "levels": { - "1": 77, - "2": 129, - "3": 161, - "4": 179, - "5": 199 - } - }, - { - "metrics": { - "age": 17, - "weight": 102, - "gender": "Male" - }, - "levels": { - "1": 81, - "2": 135, - "3": 169, - "4": 188, - "5": 209 - } - }, - { - "metrics": { - "age": 17, - "weight": 113, - "gender": "Male" - }, - "levels": { - "1": 82, - "2": 137, - "3": 172, - "4": 191, - "5": 212 - } - }, - { - "metrics": { - "age": 17, - "weight": 136, - "gender": "Male" - }, - "levels": { - "1": 84, - "2": 139, - "3": 174, - "4": 194, - "5": 215 - } - }, - { - "metrics": { - "age": 25, - "weight": 57, - "gender": "Male" - }, - "levels": { - "1": 47, - "2": 81, - "3": 101, - "4": 127, - "5": 141 - } - }, - { - "metrics": { - "age": 25, - "weight": 68, - "gender": "Male" - }, - "levels": { - "1": 64, - "2": 112, - "3": 139, - "4": 186, - "5": 207 - } - }, - { - "metrics": { - "age": 25, - "weight": 79, - "gender": "Male" - }, - "levels": { - "1": 76, - "2": 131, - "3": 164, - "4": 219, - "5": 243 - } - }, - { - "metrics": { - "age": 25, - "weight": 91, - "gender": "Male" - }, - "levels": { - "1": 83, - "2": 144, - "3": 180, - "4": 240, - "5": 266 - } - }, - { - "metrics": { - "age": 25, - "weight": 102, - "gender": "Male" - }, - "levels": { - "1": 84, - "2": 146, - "3": 182, - "4": 243, - "5": 270 - } - }, - { - "metrics": { - "age": 25, - "weight": 113, - "gender": "Male" - }, - "levels": { - "1": 85, - "2": 147, - "3": 184, - "4": 245, - "5": 273 - } - }, - { - "metrics": { - "age": 25, - "weight": 136, - "gender": "Male" - }, - "levels": { - "1": 86, - "2": 149, - "3": 187, - "4": 249, - "5": 276 - } - }, - { - "metrics": { - "age": 35, - "weight": 57, - "gender": "Male" - }, - "levels": { - "1": 51, - "2": 89, - "3": 112, - "4": 149, - "5": 175 - } - }, - { - "metrics": { - "age": 35, - "weight": 68, - "gender": "Male" - }, - "levels": { - "1": 64, - "2": 112, - "3": 140, - "4": 186, - "5": 219 - } - }, - { - "metrics": { - "age": 35, - "weight": 79, - "gender": "Male" - }, - "levels": { - "1": 76, - "2": 132, - "3": 165, - "4": 220, - "5": 259 - } - }, - { - "metrics": { - "age": 35, - "weight": 91, - "gender": "Male" - }, - "levels": { - "1": 81, - "2": 142, - "3": 177, - "4": 236, - "5": 278 - } - }, - { - "metrics": { - "age": 35, - "weight": 102, - "gender": "Male" - }, - "levels": { - "1": 83, - "2": 145, - "3": 181, - "4": 242, - "5": 284 - } - }, - { - "metrics": { - "age": 35, - "weight": 113, - "gender": "Male" - }, - "levels": { - "1": 84, - "2": 146, - "3": 183, - "4": 244, - "5": 287 - } - }, - { - "metrics": { - "age": 35, - "weight": 136, - "gender": "Male" - }, - "levels": { - "1": 89, - "2": 154, - "3": 192, - "4": 257, - "5": 302 - } - }, - { - "metrics": { - "age": 45, - "weight": 57, - "gender": "Male" - }, - "levels": { - "1": 46, - "2": 80, - "3": 100, - "4": 118, - "5": 131 - } - }, - { - "metrics": { - "age": 45, - "weight": 68, - "gender": "Male" - }, - "levels": { - "1": 53, - "2": 92, - "3": 115, - "4": 154, - "5": 181 - } - }, - { - "metrics": { - "age": 45, - "weight": 79, - "gender": "Male" - }, - "levels": { - "1": 63, - "2": 109, - "3": 137, - "4": 182, - "5": 214 - } - }, - { - "metrics": { - "age": 45, - "weight": 91, - "gender": "Male" - }, - "levels": { - "1": 65, - "2": 113, - "3": 141, - "4": 188, - "5": 222 - } - }, - { - "metrics": { - "age": 45, - "weight": 102, - "gender": "Male" - }, - "levels": { - "1": 71, - "2": 124, - "3": 154, - "4": 206, - "5": 242 - } - }, - { - "metrics": { - "age": 45, - "weight": 113, - "gender": "Male" - }, - "levels": { - "1": 75, - "2": 130, - "3": 162, - "4": 217, - "5": 255 - } - }, - { - "metrics": { - "age": 45, - "weight": 136, - "gender": "Male" - }, - "levels": { - "1": 76, - "2": 133, - "3": 166, - "4": 221, - "5": 260 - } - }, - { - "metrics": { - "age": 55, - "weight": 57, - "gender": "Male" - }, - "levels": { - "1": 40, - "2": 69, - "3": 86, - "4": 102, - "5": 113 - } - }, - { - "metrics": { - "age": 55, - "weight": 68, - "gender": "Male" - }, - "levels": { - "1": 48, - "2": 84, - "3": 105, - "4": 140, - "5": 164 - } - }, - { - "metrics": { - "age": 55, - "weight": 79, - "gender": "Male" - }, - "levels": { - "1": 56, - "2": 97, - "3": 121, - "4": 161, - "5": 190 - } - }, - { - "metrics": { - "age": 55, - "weight": 91, - "gender": "Male" - }, - "levels": { - "1": 60, - "2": 104, - "3": 130, - "4": 173, - "5": 204 - } - }, - { - "metrics": { - "age": 55, - "weight": 102, - "gender": "Male" - }, - "levels": { - "1": 63, - "2": 110, - "3": 138, - "4": 183, - "5": 216 - } - }, - { - "metrics": { - "age": 55, - "weight": 113, - "gender": "Male" - }, - "levels": { - "1": 64, - "2": 111, - "3": 139, - "4": 185, - "5": 218 - } - }, - { - "metrics": { - "age": 55, - "weight": 136, - "gender": "Male" - }, - "levels": { - "1": 65, - "2": 114, - "3": 142, - "4": 190, - "5": 223 - } - }, - { - "metrics": { - "age": 65, - "weight": 57, - "gender": "Male" - }, - "levels": { - "1": 35, - "2": 61, - "3": 79, - "4": 95, - "5": 109 - } - }, - { - "metrics": { - "age": 65, - "weight": 68, - "gender": "Male" - }, - "levels": { - "1": 46, - "2": 79, - "3": 103, - "4": 124, - "5": 142 - } - }, - { - "metrics": { - "age": 65, - "weight": 79, - "gender": "Male" - }, - "levels": { - "1": 52, - "2": 90, - "3": 117, - "4": 141, - "5": 162 - } - }, - { - "metrics": { - "age": 65, - "weight": 91, - "gender": "Male" - }, - "levels": { - "1": 57, - "2": 98, - "3": 128, - "4": 155, - "5": 177 - } - }, - { - "metrics": { - "age": 65, - "weight": 102, - "gender": "Male" - }, - "levels": { - "1": 61, - "2": 107, - "3": 138, - "4": 167, - "5": 191 - } - }, - { - "metrics": { - "age": 65, - "weight": 113, - "gender": "Male" - }, - "levels": { - "1": 62, - "2": 109, - "3": 140, - "4": 170, - "5": 194 - } - }, - { - "metrics": { - "age": 65, - "weight": 136, - "gender": "Male" - }, - "levels": { - "1": 64, - "2": 112, - "3": 144, - "4": 175, - "5": 200 - } - }, - { - "metrics": { - "age": 75, - "weight": 57, - "gender": "Male" - }, - "levels": { - "1": 29, - "2": 51, - "3": 68, - "4": 85, - "5": 98 - } - }, - { - "metrics": { - "age": 75, - "weight": 68, - "gender": "Male" - }, - "levels": { - "1": 36, - "2": 62, - "3": 82, - "4": 103, - "5": 121 - } - }, - { - "metrics": { - "age": 75, - "weight": 79, - "gender": "Male" - }, - "levels": { - "1": 42, - "2": 74, - "3": 98, - "4": 123, - "5": 144 - } - }, - { - "metrics": { - "age": 75, - "weight": 91, - "gender": "Male" - }, - "levels": { - "1": 45, - "2": 79, - "3": 105, - "4": 131, - "5": 155 - } - }, - { - "metrics": { - "age": 75, - "weight": 102, - "gender": "Male" - }, - "levels": { - "1": 49, - "2": 86, - "3": 114, - "4": 143, - "5": 168 - } - }, - { - "metrics": { - "age": 75, - "weight": 113, - "gender": "Male" - }, - "levels": { - "1": 50, - "2": 87, - "3": 116, - "4": 145, - "5": 170 - } - }, - { - "metrics": { - "age": 75, - "weight": 136, - "gender": "Male" - }, - "levels": { - "1": 52, - "2": 90, - "3": 120, - "4": 150, - "5": 176 - } - }, - { - "metrics": { - "age": 85, - "weight": 57, - "gender": "Male" - }, - "levels": { - "1": 21, - "2": 36, - "3": 48, - "4": 60, - "5": 68 - } - }, - { - "metrics": { - "age": 85, - "weight": 68, - "gender": "Male" - }, - "levels": { - "1": 25, - "2": 43, - "3": 58, - "4": 72, - "5": 85 - } - }, - { - "metrics": { - "age": 85, - "weight": 79, - "gender": "Male" - }, - "levels": { - "1": 30, - "2": 51, - "3": 69, - "4": 86, - "5": 101 - } - }, - { - "metrics": { - "age": 85, - "weight": 91, - "gender": "Male" - }, - "levels": { - "1": 32, - "2": 55, - "3": 74, - "4": 92, - "5": 108 - } - }, - { - "metrics": { - "age": 85, - "weight": 102, - "gender": "Male" - }, - "levels": { - "1": 35, - "2": 60, - "3": 80, - "4": 100, - "5": 118 - } - }, - { - "metrics": { - "age": 85, - "weight": 113, - "gender": "Male" - }, - "levels": { - "1": 35, - "2": 61, - "3": 81, - "4": 101, - "5": 119 - } - }, - { - "metrics": { - "age": 85, - "weight": 136, - "gender": "Male" - }, - "levels": { - "1": 36, - "2": 63, - "3": 84, - "4": 105, - "5": 123 - } - }, - { - "metrics": { - "age": 17, - "weight": 57, - "gender": "Female" - }, - "levels": { - "1": 17, - "2": 39, - "3": 51, - "4": 62, - "5": 82 - } - }, - { - "metrics": { - "age": 17, - "weight": 68, - "gender": "Female" - }, - "levels": { - "1": 22, - "2": 51, - "3": 65, - "4": 80, - "5": 102 - } - }, - { - "metrics": { - "age": 17, - "weight": 79, - "gender": "Female" - }, - "levels": { - "1": 24, - "2": 56, - "3": 72, - "4": 88, - "5": 108 - } - }, - { - "metrics": { - "age": 17, - "weight": 91, - "gender": "Female" - }, - "levels": { - "1": 25, - "2": 59, - "3": 75, - "4": 92, - "5": 113 - } - }, - { - "metrics": { - "age": 17, - "weight": 102, - "gender": "Female" - }, - "levels": { - "1": 26, - "2": 61, - "3": 79, - "4": 99, - "5": 118 - } - }, - { - "metrics": { - "age": 17, - "weight": 113, - "gender": "Female" - }, - "levels": { - "1": 27, - "2": 62, - "3": 80, - "4": 103, - "5": 123 - } - }, - { - "metrics": { - "age": 17, - "weight": 136, - "gender": "Female" - }, - "levels": { - "1": 29, - "2": 69, - "3": 89, - "4": 109, - "5": 129 - } - }, - { - "metrics": { - "age": 25, - "weight": 57, - "gender": "Female" - }, - "levels": { - "1": 25, - "2": 58, - "3": 74, - "4": 91, - "5": 120 - } - }, - { - "metrics": { - "age": 25, - "weight": 68, - "gender": "Female" - }, - "levels": { - "1": 30, - "2": 70, - "3": 90, - "4": 110, - "5": 140 - } - }, - { - "metrics": { - "age": 25, - "weight": 79, - "gender": "Female" - }, - "levels": { - "1": 33, - "2": 77, - "3": 99, - "4": 121, - "5": 150 - } - }, - { - "metrics": { - "age": 25, - "weight": 91, - "gender": "Female" - }, - "levels": { - "1": 34, - "2": 79, - "3": 101, - "4": 124, - "5": 154 - } - }, - { - "metrics": { - "age": 25, - "weight": 102, - "gender": "Female" - }, - "levels": { - "1": 35, - "2": 82, - "3": 107, - "4": 133, - "5": 162 - } - }, - { - "metrics": { - "age": 25, - "weight": 113, - "gender": "Female" - }, - "levels": { - "1": 35, - "2": 82, - "3": 106, - "4": 134, - "5": 164 - } - }, - { - "metrics": { - "age": 25, - "weight": 136, - "gender": "Female" - }, - "levels": { - "1": 36, - "2": 84, - "3": 108, - "4": 132, - "5": 159 - } - }, - { - "metrics": { - "age": 35, - "weight": 57, - "gender": "Female" - }, - "levels": { - "1": 30, - "2": 70, - "3": 90, - "4": 110, - "5": 145 - } - }, - { - "metrics": { - "age": 35, - "weight": 68, - "gender": "Female" - }, - "levels": { - "1": 32, - "2": 74, - "3": 96, - "4": 117, - "5": 149 - } - }, - { - "metrics": { - "age": 35, - "weight": 79, - "gender": "Female" - }, - "levels": { - "1": 35, - "2": 81, - "3": 104, - "4": 127, - "5": 157 - } - }, - { - "metrics": { - "age": 35, - "weight": 91, - "gender": "Female" - }, - "levels": { - "1": 36, - "2": 83, - "3": 107, - "4": 131, - "5": 162 - } - }, - { - "metrics": { - "age": 35, - "weight": 102, - "gender": "Female" - }, - "levels": { - "1": 39, - "2": 91, - "3": 118, - "4": 147, - "5": 179 - } - }, - { - "metrics": { - "age": 35, - "weight": 113, - "gender": "Female" - }, - "levels": { - "1": 40, - "2": 93, - "3": 119, - "4": 151, - "5": 185 - } - }, - { - "metrics": { - "age": 35, - "weight": 136, - "gender": "Female" - }, - "levels": { - "1": 40, - "2": 94, - "3": 120, - "4": 147, - "5": 178 - } - }, - { - "metrics": { - "age": 45, - "weight": 57, - "gender": "Female" - }, - "levels": { - "1": 23, - "2": 54, - "3": 70, - "4": 85, - "5": 112 - } - }, - { - "metrics": { - "age": 45, - "weight": 68, - "gender": "Female" - }, - "levels": { - "1": 29, - "2": 67, - "3": 86, - "4": 105, - "5": 133 - } - }, - { - "metrics": { - "age": 45, - "weight": 79, - "gender": "Female" - }, - "levels": { - "1": 30, - "2": 69, - "3": 89, - "4": 109, - "5": 134 - } - }, - { - "metrics": { - "age": 45, - "weight": 91, - "gender": "Female" - }, - "levels": { - "1": 32, - "2": 74, - "3": 95, - "4": 116, - "5": 143 - } - }, - { - "metrics": { - "age": 45, - "weight": 102, - "gender": "Female" - }, - "levels": { - "1": 33, - "2": 78, - "3": 101, - "4": 126, - "5": 153 - } - }, - { - "metrics": { - "age": 45, - "weight": 113, - "gender": "Female" - }, - "levels": { - "1": 35, - "2": 81, - "3": 104, - "4": 132, - "5": 160 - } - }, - { - "metrics": { - "age": 45, - "weight": 136, - "gender": "Female" - }, - "levels": { - "1": 35, - "2": 82, - "3": 106, - "4": 129, - "5": 156 - } - }, - { - "metrics": { - "age": 55, - "weight": 57, - "gender": "Female" - }, - "levels": { - "1": 22, - "2": 51, - "3": 65, - "4": 80, - "5": 105 - } - }, - { - "metrics": { - "age": 55, - "weight": 68, - "gender": "Female" - }, - "levels": { - "1": 24, - "2": 57, - "3": 73, - "4": 89, - "5": 114 - } - }, - { - "metrics": { - "age": 55, - "weight": 79, - "gender": "Female" - }, - "levels": { - "1": 26, - "2": 60, - "3": 78, - "4": 95, - "5": 117 - } - }, - { - "metrics": { - "age": 55, - "weight": 91, - "gender": "Female" - }, - "levels": { - "1": 28, - "2": 65, - "3": 83, - "4": 102, - "5": 126 - } - }, - { - "metrics": { - "age": 55, - "weight": 102, - "gender": "Female" - }, - "levels": { - "1": 29, - "2": 69, - "3": 90, - "4": 112, - "5": 136 - } - }, - { - "metrics": { - "age": 55, - "weight": 113, - "gender": "Female" - }, - "levels": { - "1": 30, - "2": 69, - "3": 89, - "4": 114, - "5": 137 - } - }, - { - "metrics": { - "age": 55, - "weight": 136, - "gender": "Female" - }, - "levels": { - "1": 31, - "2": 72, - "3": 92, - "4": 113, - "5": 135 - } - }, - { - "metrics": { - "age": 65, - "weight": 57, - "gender": "Female" - }, - "levels": { - "1": 18, - "2": 43, - "3": 55, - "4": 67, - "5": 89 - } - }, - { - "metrics": { - "age": 65, - "weight": 68, - "gender": "Female" - }, - "levels": { - "1": 23, - "2": 53, - "3": 69, - "4": 84, - "5": 107 - } - }, - { - "metrics": { - "age": 65, - "weight": 79, - "gender": "Female" - }, - "levels": { - "1": 24, - "2": 56, - "3": 72, - "4": 89, - "5": 109 - } - }, - { - "metrics": { - "age": 65, - "weight": 91, - "gender": "Female" - }, - "levels": { - "1": 25, - "2": 58, - "3": 74, - "4": 91, - "5": 112 - } - }, - { - "metrics": { - "age": 65, - "weight": 102, - "gender": "Female" - }, - "levels": { - "1": 25, - "2": 60, - "3": 77, - "4": 97, - "5": 116 - } - }, - { - "metrics": { - "age": 65, - "weight": 113, - "gender": "Female" - }, - "levels": { - "1": 26, - "2": 60, - "3": 77, - "4": 99, - "5": 118 - } - }, - { - "metrics": { - "age": 65, - "weight": 136, - "gender": "Female" - }, - "levels": { - "1": 26, - "2": 60, - "3": 78, - "4": 95, - "5": 112 - } - }, - { - "metrics": { - "age": 75, - "weight": 57, - "gender": "Female" - }, - "levels": { - "1": 18, - "2": 42, - "3": 53, - "4": 66, - "5": 84 - } - }, - { - "metrics": { - "age": 75, - "weight": 68, - "gender": "Female" - }, - "levels": { - "1": 18, - "2": 43, - "3": 55, - "4": 67, - "5": 86 - } - }, - { - "metrics": { - "age": 75, - "weight": 79, - "gender": "Female" - }, - "levels": { - "1": 20, - "2": 46, - "3": 59, - "4": 72, - "5": 92 - } - }, - { - "metrics": { - "age": 75, - "weight": 91, - "gender": "Female" - }, - "levels": { - "1": 20, - "2": 47, - "3": 60, - "4": 73, - "5": 93 - } - }, - { - "metrics": { - "age": 75, - "weight": 102, - "gender": "Female" - }, - "levels": { - "1": 20, - "2": 47, - "3": 61, - "4": 79, - "5": 94 - } - }, - { - "metrics": { - "age": 75, - "weight": 113, - "gender": "Female" - }, - "levels": { - "1": 20, - "2": 47, - "3": 61, - "4": 79, - "5": 95 - } - }, - { - "metrics": { - "age": 75, - "weight": 136, - "gender": "Female" - }, - "levels": { - "1": 20, - "2": 48, - "3": 61, - "4": 79, - "5": 95 - } - }, - { - "metrics": { - "age": 85, - "weight": 57, - "gender": "Female" - }, - "levels": { - "1": 15, - "2": 34, - "3": 44, - "4": 53, - "5": 68 - } - }, - { - "metrics": { - "age": 85, - "weight": 68, - "gender": "Female" - }, - "levels": { - "1": 15, - "2": 35, - "3": 45, - "4": 55, - "5": 69 - } - }, - { - "metrics": { - "age": 85, - "weight": 79, - "gender": "Female" - }, - "levels": { - "1": 16, - "2": 37, - "3": 48, - "4": 58, - "5": 74 - } - }, - { - "metrics": { - "age": 85, - "weight": 91, - "gender": "Female" - }, - "levels": { - "1": 16, - "2": 38, - "3": 48, - "4": 59, - "5": 75 - } - }, - { - "metrics": { - "age": 85, - "weight": 102, - "gender": "Female" - }, - "levels": { - "1": 16, - "2": 38, - "3": 50, - "4": 65, - "5": 76 - } - }, - { - "metrics": { - "age": 85, - "weight": 113, - "gender": "Female" - }, - "levels": { - "1": 16, - "2": 38, - "3": 49, - "4": 65, - "5": 77 - } - }, - { - "metrics": { - "age": 85, - "weight": 136, - "gender": "Female" - }, - "levels": { - "1": 17, - "2": 39, - "3": 50, - "4": 65, - "5": 77 - } - } - ] - }, - "BenchPress": { - "metadata": { - "attribute": "Strength", - "generators": [], - "unit": "kg", - "name": "Bench Press" - }, - "standards": [ - { - "metrics": { - "age": 17, - "weight": 57, - "gender": "Male" - }, - "levels": { - "1": 34, - "2": 47, - "3": 61, - "4": 74, - "5": 85 - } - }, - { - "metrics": { - "age": 17, - "weight": 68, - "gender": "Male" - }, - "levels": { - "1": 42, - "2": 59, - "3": 76, - "4": 92, - "5": 107 - } - }, - { - "metrics": { - "age": 17, - "weight": 79, - "gender": "Male" - }, - "levels": { - "1": 43, - "2": 60, - "3": 77, - "4": 94, - "5": 110 - } - }, - { - "metrics": { - "age": 17, - "weight": 91, - "gender": "Male" - }, - "levels": { - "1": 51, - "2": 71, - "3": 91, - "4": 111, - "5": 132 - } - }, - { - "metrics": { - "age": 17, - "weight": 102, - "gender": "Male" - }, - "levels": { - "1": 53, - "2": 74, - "3": 95, - "4": 116, - "5": 134 - } - }, - { - "metrics": { - "age": 17, - "weight": 113, - "gender": "Male" - }, - "levels": { - "1": 53, - "2": 74, - "3": 96, - "4": 117, - "5": 137 - } - }, - { - "metrics": { - "age": 17, - "weight": 136, - "gender": "Male" - }, - "levels": { - "1": 53, - "2": 74, - "3": 95, - "4": 116, - "5": 138 - } - }, - { - "metrics": { - "age": 25, - "weight": 57, - "gender": "Male" - }, - "levels": { - "1": 36, - "2": 51, - "3": 65, - "4": 80, - "5": 92 - } - }, - { - "metrics": { - "age": 25, - "weight": 68, - "gender": "Male" - }, - "levels": { - "1": 50, - "2": 70, - "3": 90, - "4": 110, - "5": 130 - } - }, - { - "metrics": { - "age": 25, - "weight": 79, - "gender": "Male" - }, - "levels": { - "1": 50, - "2": 70, - "3": 90, - "4": 110, - "5": 150 - } - }, - { - "metrics": { - "age": 25, - "weight": 91, - "gender": "Male" - }, - "levels": { - "1": 52, - "2": 73, - "3": 93, - "4": 114, - "5": 161 - } - }, - { - "metrics": { - "age": 25, - "weight": 102, - "gender": "Male" - }, - "levels": { - "1": 55, - "2": 77, - "3": 99, - "4": 121, - "5": 170 - } - }, - { - "metrics": { - "age": 25, - "weight": 113, - "gender": "Male" - }, - "levels": { - "1": 59, - "2": 82, - "3": 106, - "4": 129, - "5": 181 - } - }, - { - "metrics": { - "age": 25, - "weight": 136, - "gender": "Male" - }, - "levels": { - "1": 61, - "2": 85, - "3": 109, - "4": 133, - "5": 182 - } - }, - { - "metrics": { - "age": 35, - "weight": 57, - "gender": "Male" - }, - "levels": { - "1": 39, - "2": 55, - "3": 71, - "4": 87, - "5": 114 - } - }, - { - "metrics": { - "age": 35, - "weight": 68, - "gender": "Male" - }, - "levels": { - "1": 53, - "2": 75, - "3": 96, - "4": 117, - "5": 155 - } - }, - { - "metrics": { - "age": 35, - "weight": 79, - "gender": "Male" - }, - "levels": { - "1": 54, - "2": 75, - "3": 97, - "4": 119, - "5": 156 - } - }, - { - "metrics": { - "age": 35, - "weight": 91, - "gender": "Male" - }, - "levels": { - "1": 59, - "2": 83, - "3": 107, - "4": 131, - "5": 173 - } - }, - { - "metrics": { - "age": 35, - "weight": 102, - "gender": "Male" - }, - "levels": { - "1": 61, - "2": 84, - "3": 108, - "4": 135, - "5": 176 - } - }, - { - "metrics": { - "age": 35, - "weight": 113, - "gender": "Male" - }, - "levels": { - "1": 62, - "2": 85, - "3": 110, - "4": 139, - "5": 177 - } - }, - { - "metrics": { - "age": 35, - "weight": 136, - "gender": "Male" - }, - "levels": { - "1": 67, - "2": 94, - "3": 121, - "4": 148, - "5": 195 - } - }, - { - "metrics": { - "age": 45, - "weight": 57, - "gender": "Male" - }, - "levels": { - "1": 37, - "2": 52, - "3": 66, - "4": 81, - "5": 105 - } - }, - { - "metrics": { - "age": 45, - "weight": 68, - "gender": "Male" - }, - "levels": { - "1": 41, - "2": 57, - "3": 73, - "4": 89, - "5": 116 - } - }, - { - "metrics": { - "age": 45, - "weight": 79, - "gender": "Male" - }, - "levels": { - "1": 48, - "2": 67, - "3": 86, - "4": 105, - "5": 135 - } - }, - { - "metrics": { - "age": 45, - "weight": 91, - "gender": "Male" - }, - "levels": { - "1": 54, - "2": 75, - "3": 97, - "4": 118, - "5": 143 - } - }, - { - "metrics": { - "age": 45, - "weight": 102, - "gender": "Male" - }, - "levels": { - "1": 56, - "2": 78, - "3": 100, - "4": 122, - "5": 154 - } - }, - { - "metrics": { - "age": 45, - "weight": 113, - "gender": "Male" - }, - "levels": { - "1": 58, - "2": 81, - "3": 104, - "4": 127, - "5": 164 - } - }, - { - "metrics": { - "age": 45, - "weight": 136, - "gender": "Male" - }, - "levels": { - "1": 62, - "2": 87, - "3": 111, - "4": 136, - "5": 166 - } - }, - { - "metrics": { - "age": 55, - "weight": 57, - "gender": "Male" - }, - "levels": { - "1": 29, - "2": 41, - "3": 53, - "4": 65, - "5": 74 - } - }, - { - "metrics": { - "age": 55, - "weight": 68, - "gender": "Male" - }, - "levels": { - "1": 40, - "2": 56, - "3": 72, - "4": 88, - "5": 104 - } - }, - { - "metrics": { - "age": 55, - "weight": 79, - "gender": "Male" - }, - "levels": { - "1": 43, - "2": 60, - "3": 77, - "4": 94, - "5": 111 - } - }, - { - "metrics": { - "age": 55, - "weight": 91, - "gender": "Male" - }, - "levels": { - "1": 49, - "2": 68, - "3": 88, - "4": 107, - "5": 129 - } - }, - { - "metrics": { - "age": 55, - "weight": 102, - "gender": "Male" - }, - "levels": { - "1": 53, - "2": 74, - "3": 95, - "4": 116, - "5": 140 - } - }, - { - "metrics": { - "age": 55, - "weight": 113, - "gender": "Male" - }, - "levels": { - "1": 54, - "2": 75, - "3": 97, - "4": 118, - "5": 143 - } - }, - { - "metrics": { - "age": 55, - "weight": 136, - "gender": "Male" - }, - "levels": { - "1": 54, - "2": 76, - "3": 98, - "4": 120, - "5": 145 - } - }, - { - "metrics": { - "age": 65, - "weight": 57, - "gender": "Male" - }, - "levels": { - "1": 25, - "2": 35, - "3": 45, - "4": 55, - "5": 68 - } - }, - { - "metrics": { - "age": 65, - "weight": 68, - "gender": "Male" - }, - "levels": { - "1": 32, - "2": 45, - "3": 57, - "4": 70, - "5": 88 - } - }, - { - "metrics": { - "age": 65, - "weight": 79, - "gender": "Male" - }, - "levels": { - "1": 36, - "2": 50, - "3": 64, - "4": 78, - "5": 99 - } - }, - { - "metrics": { - "age": 65, - "weight": 91, - "gender": "Male" - }, - "levels": { - "1": 47, - "2": 66, - "3": 84, - "4": 103, - "5": 131 - } - }, - { - "metrics": { - "age": 65, - "weight": 102, - "gender": "Male" - }, - "levels": { - "1": 48, - "2": 67, - "3": 87, - "4": 106, - "5": 134 - } - }, - { - "metrics": { - "age": 65, - "weight": 113, - "gender": "Male" - }, - "levels": { - "1": 49, - "2": 68, - "3": 88, - "4": 107, - "5": 136 - } - }, - { - "metrics": { - "age": 65, - "weight": 136, - "gender": "Male" - }, - "levels": { - "1": 50, - "2": 69, - "3": 89, - "4": 109, - "5": 138 - } - }, - { - "metrics": { - "age": 75, - "weight": 57, - "gender": "Male" - }, - "levels": { - "1": 23, - "2": 32, - "3": 41, - "4": 50, - "5": 60 - } - }, - { - "metrics": { - "age": 75, - "weight": 68, - "gender": "Male" - }, - "levels": { - "1": 29, - "2": 40, - "3": 52, - "4": 63, - "5": 78 - } - }, - { - "metrics": { - "age": 75, - "weight": 79, - "gender": "Male" - }, - "levels": { - "1": 33, - "2": 46, - "3": 59, - "4": 72, - "5": 89 - } - }, - { - "metrics": { - "age": 75, - "weight": 91, - "gender": "Male" - }, - "levels": { - "1": 34, - "2": 48, - "3": 62, - "4": 76, - "5": 94 - } - }, - { - "metrics": { - "age": 75, - "weight": 102, - "gender": "Male" - }, - "levels": { - "1": 36, - "2": 51, - "3": 65, - "4": 80, - "5": 99 - } - }, - { - "metrics": { - "age": 75, - "weight": 113, - "gender": "Male" - }, - "levels": { - "1": 44, - "2": 61, - "3": 79, - "4": 96, - "5": 121 - } - }, - { - "metrics": { - "age": 75, - "weight": 136, - "gender": "Male" - }, - "levels": { - "1": 48, - "2": 67, - "3": 86, - "4": 105, - "5": 131 - } - }, - { - "metrics": { - "age": 85, - "weight": 57, - "gender": "Male" - }, - "levels": { - "1": 16, - "2": 22, - "3": 28, - "4": 34, - "5": 41 - } - }, - { - "metrics": { - "age": 85, - "weight": 68, - "gender": "Male" - }, - "levels": { - "1": 20, - "2": 28, - "3": 36, - "4": 44, - "5": 54 - } - }, - { - "metrics": { - "age": 85, - "weight": 79, - "gender": "Male" - }, - "levels": { - "1": 22, - "2": 31, - "3": 40, - "4": 49, - "5": 61 - } - }, - { - "metrics": { - "age": 85, - "weight": 91, - "gender": "Male" - }, - "levels": { - "1": 24, - "2": 33, - "3": 43, - "4": 52, - "5": 65 - } - }, - { - "metrics": { - "age": 85, - "weight": 102, - "gender": "Male" - }, - "levels": { - "1": 25, - "2": 35, - "3": 45, - "4": 55, - "5": 69 - } - }, - { - "metrics": { - "age": 85, - "weight": 113, - "gender": "Male" - }, - "levels": { - "1": 30, - "2": 42, - "3": 54, - "4": 66, - "5": 83 - } - }, - { - "metrics": { - "age": 85, - "weight": 136, - "gender": "Male" - }, - "levels": { - "1": 33, - "2": 46, - "3": 59, - "4": 72, - "5": 91 - } - }, - { - "metrics": { - "age": 17, - "weight": 57, - "gender": "Female" - }, - "levels": { - "1": 14, - "2": 19, - "3": 27, - "4": 37, - "5": 51 - } - }, - { - "metrics": { - "age": 17, - "weight": 68, - "gender": "Female" - }, - "levels": { - "1": 17, - "2": 23, - "3": 32, - "4": 44, - "5": 61 - } - }, - { - "metrics": { - "age": 17, - "weight": 79, - "gender": "Female" - }, - "levels": { - "1": 19, - "2": 27, - "3": 37, - "4": 51, - "5": 70 - } - }, - { - "metrics": { - "age": 17, - "weight": 91, - "gender": "Female" - }, - "levels": { - "1": 21, - "2": 28, - "3": 39, - "4": 54, - "5": 75 - } - }, - { - "metrics": { - "age": 17, - "weight": 102, - "gender": "Female" - }, - "levels": { - "1": 22, - "2": 30, - "3": 41, - "4": 57, - "5": 78 - } - }, - { - "metrics": { - "age": 17, - "weight": 113, - "gender": "Female" - }, - "levels": { - "1": 22, - "2": 31, - "3": 42, - "4": 58, - "5": 81 - } - }, - { - "metrics": { - "age": 17, - "weight": 136, - "gender": "Female" - }, - "levels": { - "1": 23, - "2": 32, - "3": 44, - "4": 61, - "5": 84 - } - }, - { - "metrics": { - "age": 25, - "weight": 57, - "gender": "Female" - }, - "levels": { - "1": 14, - "2": 19, - "3": 26, - "4": 36, - "5": 49 - } - }, - { - "metrics": { - "age": 25, - "weight": 68, - "gender": "Female" - }, - "levels": { - "1": 19, - "2": 27, - "3": 37, - "4": 51, - "5": 70 - } - }, - { - "metrics": { - "age": 25, - "weight": 79, - "gender": "Female" - }, - "levels": { - "1": 21, - "2": 29, - "3": 40, - "4": 56, - "5": 77 - } - }, - { - "metrics": { - "age": 25, - "weight": 91, - "gender": "Female" - }, - "levels": { - "1": 22, - "2": 30, - "3": 42, - "4": 57, - "5": 79 - } - }, - { - "metrics": { - "age": 25, - "weight": 102, - "gender": "Female" - }, - "levels": { - "1": 25, - "2": 34, - "3": 47, - "4": 64, - "5": 89 - } - }, - { - "metrics": { - "age": 25, - "weight": 113, - "gender": "Female" - }, - "levels": { - "1": 25, - "2": 35, - "3": 48, - "4": 66, - "5": 91 - } - }, - { - "metrics": { - "age": 25, - "weight": 136, - "gender": "Female" - }, - "levels": { - "1": 28, - "2": 39, - "3": 54, - "4": 75, - "5": 103 - } - }, - { - "metrics": { - "age": 35, - "weight": 57, - "gender": "Female" - }, - "levels": { - "1": 12, - "2": 17, - "3": 22, - "4": 27, - "5": 57 - } - }, - { - "metrics": { - "age": 35, - "weight": 68, - "gender": "Female" - }, - "levels": { - "1": 30, - "2": 41, - "3": 53, - "4": 65, - "5": 83 - } - }, - { - "metrics": { - "age": 35, - "weight": 79, - "gender": "Female" - }, - "levels": { - "1": 33, - "2": 45, - "3": 60, - "4": 73, - "5": 89 - } - }, - { - "metrics": { - "age": 35, - "weight": 91, - "gender": "Female" - }, - "levels": { - "1": 35, - "2": 51, - "3": 66, - "4": 80, - "5": 98 - } - }, - { - "metrics": { - "age": 35, - "weight": 102, - "gender": "Female" - }, - "levels": { - "1": 38, - "2": 51, - "3": 67, - "4": 84, - "5": 100 - } - }, - { - "metrics": { - "age": 35, - "weight": 113, - "gender": "Female" - }, - "levels": { - "1": 39, - "2": 52, - "3": 66, - "4": 86, - "5": 102 - } - }, - { - "metrics": { - "age": 35, - "weight": 136, - "gender": "Female" - }, - "levels": { - "1": 41, - "2": 58, - "3": 74, - "4": 90, - "5": 106 - } - }, - { - "metrics": { - "age": 45, - "weight": 57, - "gender": "Female" - }, - "levels": { - "1": 14, - "2": 14, - "3": 25, - "4": 25, - "5": 46 - } - }, - { - "metrics": { - "age": 45, - "weight": 68, - "gender": "Female" - }, - "levels": { - "1": 20, - "2": 31, - "3": 36, - "4": 56, - "5": 66 - } - }, - { - "metrics": { - "age": 45, - "weight": 79, - "gender": "Female" - }, - "levels": { - "1": 23, - "2": 37, - "3": 41, - "4": 67, - "5": 75 - } - }, - { - "metrics": { - "age": 45, - "weight": 91, - "gender": "Female" - }, - "levels": { - "1": 24, - "2": 44, - "3": 44, - "4": 80, - "5": 81 - } - }, - { - "metrics": { - "age": 45, - "weight": 102, - "gender": "Female" - }, - "levels": { - "1": 26, - "2": 32, - "3": 44, - "4": 59, - "5": 85 - } - }, - { - "metrics": { - "age": 45, - "weight": 113, - "gender": "Female" - }, - "levels": { - "1": 26, - "2": 41, - "3": 48, - "4": 75, - "5": 87 - } - }, - { - "metrics": { - "age": 45, - "weight": 136, - "gender": "Female" - }, - "levels": { - "1": 28, - "2": 44, - "3": 51, - "4": 79, - "5": 93 - } - }, - { - "metrics": { - "age": 55, - "weight": 57, - "gender": "Female" - }, - "levels": { - "1": 7, - "2": 13, - "3": 17, - "4": 23, - "5": 43 - } - }, - { - "metrics": { - "age": 55, - "weight": 68, - "gender": "Female" - }, - "levels": { - "1": 16, - "2": 22, - "3": 32, - "4": 37, - "5": 61 - } - }, - { - "metrics": { - "age": 55, - "weight": 79, - "gender": "Female" - }, - "levels": { - "1": 18, - "2": 30, - "3": 40, - "4": 55, - "5": 68 - } - }, - { - "metrics": { - "age": 55, - "weight": 91, - "gender": "Female" - }, - "levels": { - "1": 18, - "2": 31, - "3": 41, - "4": 56, - "5": 69 - } - }, - { - "metrics": { - "age": 55, - "weight": 102, - "gender": "Female" - }, - "levels": { - "1": 15, - "2": 27, - "3": 35, - "4": 49, - "5": 72 - } - }, - { - "metrics": { - "age": 55, - "weight": 113, - "gender": "Female" - }, - "levels": { - "1": 18, - "2": 32, - "3": 42, - "4": 58, - "5": 75 - } - }, - { - "metrics": { - "age": 55, - "weight": 136, - "gender": "Female" - }, - "levels": { - "1": 21, - "2": 36, - "3": 48, - "4": 66, - "5": 82 - } - }, - { - "metrics": { - "age": 65, - "weight": 57, - "gender": "Female" - }, - "levels": { - "1": 9, - "2": 13, - "3": 17, - "4": 38, - "5": 38 - } - }, - { - "metrics": { - "age": 65, - "weight": 68, - "gender": "Female" - }, - "levels": { - "1": 18, - "2": 33, - "3": 44, - "4": 40, - "5": 53 - } - }, - { - "metrics": { - "age": 65, - "weight": 79, - "gender": "Female" - }, - "levels": { - "1": 20, - "2": 25, - "3": 34, - "4": 46, - "5": 61 - } - }, - { - "metrics": { - "age": 65, - "weight": 91, - "gender": "Female" - }, - "levels": { - "1": 22, - "2": 33, - "3": 48, - "4": 66, - "5": 62 - } - }, - { - "metrics": { - "age": 65, - "weight": 102, - "gender": "Female" - }, - "levels": { - "1": 12, - "2": 20, - "3": 27, - "4": 37, - "5": 65 - } - }, - { - "metrics": { - "age": 65, - "weight": 113, - "gender": "Female" - }, - "levels": { - "1": 18, - "2": 31, - "3": 41, - "4": 56, - "5": 69 - } - }, - { - "metrics": { - "age": 65, - "weight": 136, - "gender": "Female" - }, - "levels": { - "1": 20, - "2": 45, - "3": 58, - "4": 65, - "5": 70 - } - }, - { - "metrics": { - "age": 75, - "weight": 57, - "gender": "Female" - }, - "levels": { - "1": 9, - "2": 12, - "3": 16, - "4": 21, - "5": 28 - } - }, - { - "metrics": { - "age": 75, - "weight": 68, - "gender": "Female" - }, - "levels": { - "1": 14, - "2": 18, - "3": 24, - "4": 32, - "5": 43 - } - }, - { - "metrics": { - "age": 75, - "weight": 79, - "gender": "Female" - }, - "levels": { - "1": 16, - "2": 21, - "3": 28, - "4": 37, - "5": 49 - } - }, - { - "metrics": { - "age": 75, - "weight": 91, - "gender": "Female" - }, - "levels": { - "1": 17, - "2": 23, - "3": 30, - "4": 40, - "5": 54 - } - }, - { - "metrics": { - "age": 75, - "weight": 102, - "gender": "Female" - }, - "levels": { - "1": 17, - "2": 23, - "3": 31, - "4": 41, - "5": 55 - } - }, - { - "metrics": { - "age": 75, - "weight": 113, - "gender": "Female" - }, - "levels": { - "1": 18, - "2": 24, - "3": 32, - "4": 42, - "5": 56 - } - }, - { - "metrics": { - "age": 75, - "weight": 136, - "gender": "Female" - }, - "levels": { - "1": 19, - "2": 25, - "3": 33, - "4": 44, - "5": 59 - } - }, - { - "metrics": { - "age": 85, - "weight": 57, - "gender": "Female" - }, - "levels": { - "1": 8, - "2": 10, - "3": 14, - "4": 18, - "5": 24 - } - }, - { - "metrics": { - "age": 85, - "weight": 68, - "gender": "Female" - }, - "levels": { - "1": 9, - "2": 14, - "3": 19, - "4": 25, - "5": 34 - } - }, - { - "metrics": { - "age": 85, - "weight": 79, - "gender": "Female" - }, - "levels": { - "1": 12, - "2": 16, - "3": 22, - "4": 29, - "5": 39 - } - }, - { - "metrics": { - "age": 85, - "weight": 91, - "gender": "Female" - }, - "levels": { - "1": 13, - "2": 18, - "3": 24, - "4": 32, - "5": 43 - } - }, - { - "metrics": { - "age": 85, - "weight": 102, - "gender": "Female" - }, - "levels": { - "1": 14, - "2": 19, - "3": 25, - "4": 33, - "5": 44 - } - }, - { - "metrics": { - "age": 85, - "weight": 113, - "gender": "Female" - }, - "levels": { - "1": 15, - "2": 19, - "3": 26, - "4": 34, - "5": 46 - } - }, - { - "metrics": { - "age": 85, - "weight": 136, - "gender": "Female" - }, - "levels": { - "1": 15, - "2": 20, - "3": 27, - "4": 36, - "5": 48 - } - } - ] - }, - "Run": { - "metadata": { - "attribute": "Endurance", - "generators": [ - { - "metric": "weight" - } - ], - "unit": "ms", - "name": "Mile Run" - }, - "standards": [ - { - "metrics": { - "age": 10, - "weight": 0, - "gender": "Male" - }, - "levels": { - "1": 676000, - "2": 560000, - "3": 475000, - "4": 414000, - "5": 369000 - } - }, - { - "metrics": { - "age": 15, - "weight": 0, - "gender": "Male" - }, - "levels": { - "1": 585000, - "2": 485000, - "3": 411000, - "4": 358000, - "5": 319000 - } - }, - { - "metrics": { - "age": 20, - "weight": 0, - "gender": "Male" - }, - "levels": { - "1": 565000, - "2": 468000, - "3": 398000, - "4": 346000, - "5": 308000 - } - }, - { - "metrics": { - "age": 25, - "weight": 0, - "gender": "Male" - }, - "levels": { - "1": 565000, - "2": 468000, - "3": 398000, - "4": 346000, - "5": 308000 - } - }, - { - "metrics": { - "age": 30, - "weight": 0, - "gender": "Male" - }, - "levels": { - "1": 566000, - "2": 469000, - "3": 398000, - "4": 346000, - "5": 309000 - } - }, - { - "metrics": { - "age": 35, - "weight": 0, - "gender": "Male" - }, - "levels": { - "1": 575000, - "2": 476000, - "3": 404000, - "4": 352000, - "5": 314000 - } - }, - { - "metrics": { - "age": 40, - "weight": 0, - "gender": "Male" - }, - "levels": { - "1": 595000, - "2": 493000, - "3": 418000, - "4": 364000, - "5": 325000 - } - }, - { - "metrics": { - "age": 45, - "weight": 0, - "gender": "Male" - }, - "levels": { - "1": 617000, - "2": 511000, - "3": 434000, - "4": 378000, - "5": 337000 - } - }, - { - "metrics": { - "age": 50, - "weight": 0, - "gender": "Male" - }, - "levels": { - "1": 642000, - "2": 531000, - "3": 451000, - "4": 393000, - "5": 350000 - } - }, - { - "metrics": { - "age": 55, - "weight": 0, - "gender": "Male" - }, - "levels": { - "1": 668000, - "2": 553000, - "3": 469000, - "4": 409000, - "5": 364000 - } - }, - { - "metrics": { - "age": 60, - "weight": 0, - "gender": "Male" - }, - "levels": { - "1": 696000, - "2": 577000, - "3": 489000, - "4": 426000, - "5": 380000 - } - }, - { - "metrics": { - "age": 65, - "weight": 0, - "gender": "Male" - }, - "levels": { - "1": 727000, - "2": 602000, - "3": 511000, - "4": 445000, - "5": 397000 - } - }, - { - "metrics": { - "age": 70, - "weight": 0, - "gender": "Male" - }, - "levels": { - "1": 763000, - "2": 632000, - "3": 537000, - "4": 467000, - "5": 417000 - } - }, - { - "metrics": { - "age": 75, - "weight": 0, - "gender": "Male" - }, - "levels": { - "1": 820000, - "2": 680000, - "3": 577000, - "4": 502000, - "5": 448000 - } - }, - { - "metrics": { - "age": 80, - "weight": 0, - "gender": "Male" - }, - "levels": { - "1": 908000, - "2": 752000, - "3": 638000, - "4": 556000, - "5": 495000 - } - }, - { - "metrics": { - "age": 85, - "weight": 0, - "gender": "Male" - }, - "levels": { - "1": 1045000, - "2": 866000, - "3": 735000, - "4": 640000, - "5": 570000 - } - }, - { - "metrics": { - "age": 90, - "weight": 0, - "gender": "Male" - }, - "levels": { - "1": 1273000, - "2": 1055000, - "3": 895000, - "4": 779000, - "5": 695000 - } - }, - { - "metrics": { - "age": 10, - "weight": 0, - "gender": "Female" - }, - "levels": { - "1": 749000, - "2": 632000, - "3": 543000, - "4": 477000, - "5": 428000 - } - }, - { - "metrics": { - "age": 15, - "weight": 0, - "gender": "Female" - }, - "levels": { - "1": 672000, - "2": 567000, - "3": 488000, - "4": 428000, - "5": 384000 - } - }, - { - "metrics": { - "age": 20, - "weight": 0, - "gender": "Female" - }, - "levels": { - "1": 640000, - "2": 540000, - "3": 464000, - "4": 408000, - "5": 366000 - } - }, - { - "metrics": { - "age": 25, - "weight": 0, - "gender": "Female" - }, - "levels": { - "1": 640000, - "2": 540000, - "3": 464000, - "4": 408000, - "5": 366000 - } - }, - { - "metrics": { - "age": 30, - "weight": 0, - "gender": "Female" - }, - "levels": { - "1": 640000, - "2": 540000, - "3": 464000, - "4": 408000, - "5": 366000 - } - }, - { - "metrics": { - "age": 35, - "weight": 0, - "gender": "Female" - }, - "levels": { - "1": 644000, - "2": 544000, - "3": 467000, - "4": 410000, - "5": 368000 - } - }, - { - "metrics": { - "age": 40, - "weight": 0, - "gender": "Female" - }, - "levels": { - "1": 658000, - "2": 555000, - "3": 477000, - "4": 419000, - "5": 376000 - } - }, - { - "metrics": { - "age": 45, - "weight": 0, - "gender": "Female" - }, - "levels": { - "1": 681000, - "2": 575000, - "3": 494000, - "4": 434000, - "5": 389000 - } - }, - { - "metrics": { - "age": 50, - "weight": 0, - "gender": "Female" - }, - "levels": { - "1": 716000, - "2": 604000, - "3": 520000, - "4": 456000, - "5": 409000 - } - }, - { - "metrics": { - "age": 55, - "weight": 0, - "gender": "Female" - }, - "levels": { - "1": 757000, - "2": 639000, - "3": 550000, - "4": 482000, - "5": 433000 - } - }, - { - "metrics": { - "age": 60, - "weight": 0, - "gender": "Female" - }, - "levels": { - "1": 804000, - "2": 678000, - "3": 583000, - "4": 512000, - "5": 459000 - } - }, - { - "metrics": { - "age": 65, - "weight": 0, - "gender": "Female" - }, - "levels": { - "1": 856000, - "2": 722000, - "3": 621000, - "4": 545000, - "5": 489000 - } - }, - { - "metrics": { - "age": 70, - "weight": 0, - "gender": "Female" - }, - "levels": { - "1": 915000, - "2": 772000, - "3": 664000, - "4": 583000, - "5": 523000 - } - }, - { - "metrics": { - "age": 75, - "weight": 0, - "gender": "Female" - }, - "levels": { - "1": 983000, - "2": 830000, - "3": 713000, - "4": 626000, - "5": 562000 - } - }, - { - "metrics": { - "age": 80, - "weight": 0, - "gender": "Female" - }, - "levels": { - "1": 1065000, - "2": 898000, - "3": 772000, - "4": 678000, - "5": 608000 - } - }, - { - "metrics": { - "age": 85, - "weight": 0, - "gender": "Female" - }, - "levels": { - "1": 1199000, - "2": 1012000, - "3": 870000, - "4": 763000, - "5": 685000 - } - }, - { - "metrics": { - "age": 90, - "weight": 0, - "gender": "Female" - }, - "levels": { - "1": 1445000, - "2": 1219000, - "3": 1048000, - "4": 920000, - "5": 825000 - } - } - ] - }, - "BroadJump": { - "metadata": { - "attribute": "Power", - "generators": [ - { - "metric": "age" - }, - { - "metric": "weight" - } - ], - "unit": "cm", - "name": "Broad Jump" - }, - "standards": [ - { - "metrics": { - "age": 27, - "weight": 0, - "gender": "Male" - }, - "levels": { - "1": 200, - "2": 230, - "3": 250, - "4": 270, - "5": 300 - } - }, - { - "metrics": { - "age": 27, - "weight": 0, - "gender": "Female" - }, - "levels": { - "1": 170, - "2": 190, - "3": 220, - "4": 250, - "5": 280 - } - } - ] - }, - "ConeDrill": { - "metadata": { - "attribute": "Agility", - "generators": [ - { - "metric": "weight" - }, - { - "metric": "age" - } - ], - "unit": "ms", - "name": "3 Cone Drill" - }, - "standards": [ - { - "metrics": { - "age": 27, - "weight": 0, - "gender": "Male" - }, - "levels": { - "1": 9500, - "2": 8700, - "3": 7800, - "4": 7000, - "5": 6000 - } - }, - { - "metrics": { - "age": 27, - "weight": 0, - "gender": "Female" - }, - "levels": { - "1": 10500, - "2": 9600, - "3": 8700, - "4": 7800, - "5": 6700 - } - } - ] - } -} diff --git a/packages/calculator/src/data/standards/fallback-params.json b/packages/calculator/src/data/standards/fallback-params.json deleted file mode 100644 index a71140c..0000000 --- a/packages/calculator/src/data/standards/fallback-params.json +++ /dev/null @@ -1,79 +0,0 @@ -{ - "global": { - "maxLevel": 100 - }, - "activity": { - "BackSquat": { - "enableGeneration": true, - "weightModifier": 0, - "weightSkew": 0, - "ageModifier": 0, - "difficultyModifier": 0.3, - "peakAge": 0, - "stretch": { - "upper": 0, - "lower": 1 - } - }, - "BenchPress": { - "enableGeneration": true, - "weightModifier": 0, - "weightSkew": 0, - "ageModifier": 0, - "difficultyModifier": 0.05, - "peakAge": 0, - "stretch": { - "upper": 1, - "lower": 0 - } - }, - "Deadlift": { - "enableGeneration": true, - "weightModifier": 0, - "weightSkew": 0, - "ageModifier": 0, - "difficultyModifier": -0.05, - "peakAge": 0, - "stretch": { - "upper": 1, - "lower": 0 - } - }, - "Run": { - "enableGeneration": true, - "weightModifier": 0.1, - "weightSkew": 0, - "ageModifier": 0, - "difficultyModifier": 0.35, - "peakAge": 0, - "stretch": { - "upper": 1, - "lower": 1 - } - }, - "BroadJump": { - "enableGeneration": true, - "weightModifier": -0.1, - "weightSkew": 0, - "ageModifier": -0.25, - "difficultyModifier": -0.15, - "peakAge": 23, - "stretch": { - "upper": 3, - "lower": 1 - } - }, - "ConeDrill": { - "enableGeneration": true, - "weightModifier": -0.1, - "weightSkew": 0, - "ageModifier": -0.25, - "difficultyModifier": 0.15, - "peakAge": 23, - "stretch": { - "upper": 0, - "lower": 2 - } - } - } -} diff --git a/packages/calculator/src/index.ts b/packages/calculator/src/index.ts index d394e41..b1db0e2 100644 --- a/packages/calculator/src/index.ts +++ b/packages/calculator/src/index.ts @@ -10,11 +10,8 @@ import { type Player, } from "@blade-and-brawn/domain"; import { levenbergMarquardt as LM } from "ml-levenberg-marquardt"; -import defaultStandardsParamsJson from "./data/standards/fallback-params.json" with { type: "json" }; -import defaultStandardsDataJson from "./data/standards/fallback-data.json" with { type: "json" }; import { getAvgWeight } from "./avg-weights"; -import { StandardsDataSchema, StandardsParamsSchema, type LevelCalculatorOutput, type Levels, type NumberMetric, type Standard, type StandardsConfig, type StandardsData } from "./models"; -import { Value } from "@sinclair/typebox/value"; +import { type LevelCalculatorOutput, type Levels, type NumberMetric, type Standard, type StandardsConfig, type StandardsData } from "./models"; // SOURCES // Squat, Bench, Dead Lift: @@ -34,13 +31,6 @@ const metricPriority = (m: NumberMetric) => { return 2; }; -Value.Assert(StandardsDataSchema, defaultStandardsDataJson); -Value.Assert(StandardsParamsSchema, defaultStandardsParamsJson); -export const FALLBACK_STANDARDS_CONFIG: StandardsConfig = { - data: defaultStandardsDataJson, - params: defaultStandardsParamsJson -}; - export class LevelCalculator { Standards: Standards; diff --git a/packages/commerce/src/printful.ts b/packages/commerce/src/printful.ts index b449ec0..1e3f8d6 100644 --- a/packages/commerce/src/printful.ts +++ b/packages/commerce/src/printful.ts @@ -17,8 +17,9 @@ type Credentials = { export class PrintfulError extends Error { constructor( message: string, - public status: number, + public upstreamStatus: number, public payload: unknown, + public status: number = 502 ) { super(message); this.name = "PrintfulError"; diff --git a/packages/commerce/src/webflow.ts b/packages/commerce/src/webflow.ts index f4fdd88..1d9e134 100644 --- a/packages/commerce/src/webflow.ts +++ b/packages/commerce/src/webflow.ts @@ -22,8 +22,9 @@ type Credentials = { export class WebflowError extends Error { constructor( message: string, - public status: number, + public upstreamStatus: number, public payload: unknown, + public status: number = 502 ) { super(message); this.name = "WebflowError";