import%20marimo%0A%0A__generated_with%20%3D%20%220.20.3%22%0Aapp%20%3D%20marimo.App(width%3D%22full%22)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_imports()%3A%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20import%20pandas%20as%20pd%0A%20%20%20%20import%20altair%20as%20alt%0A%20%20%20%20import%20numpy%20as%20np%0A%0A%20%20%20%20MODEL_HORIZON_MONTHS%20%3D%2060%0A%20%20%20%20MONTHS%20%3D%20list(range(1%2C%20MODEL_HORIZON_MONTHS%20%2B%201))%0A%20%20%20%20return%20MONTHS%2C%20alt%2C%20mo%2C%20pd%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_ui_upfront(mo)%3A%0A%20%20%20%20ui_design_cost%20%3D%20mo.ui.number(start%3D0%2C%20stop%3D500_000%2C%20%20%20step%3D1_000%2C%20%20value%3D40_000%2C%20%20label%3D%22Product%20Design%20(%24)%22)%0A%20%20%20%20ui_brand_cost%20%20%3D%20mo.ui.number(start%3D0%2C%20stop%3D500_000%2C%20%20%20step%3D1_000%2C%20%20value%3D20_000%2C%20%20label%3D%22Brand%20%2F%20Name%20%2F%20VI%20(%24)%22)%0A%20%20%20%20ui_gtm_cost%20%20%20%20%3D%20mo.ui.number(start%3D0%2C%20stop%3D2_000_000%2C%20step%3D10_000%2C%20value%3D300_000%2C%20label%3D%22Go-To-Market%20Launch%20(%24)%22)%0A%20%20%20%20return%20ui_brand_cost%2C%20ui_design_cost%2C%20ui_gtm_cost%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_ui_pricing(mo)%3A%0A%20%20%20%20ui_base_price%20%3D%20mo.ui.number(start%3D1%2C%20stop%3D500%2C%20%20step%3D1%2C%20%20value%3D25%2C%20%20label%3D%22Base%20Unit%20%E2%80%94%20MSRP%20(%24)%22)%0A%20%20%20%20ui_base_cogs%20%20%3D%20mo.ui.number(start%3D1%2C%20stop%3D500%2C%20%20step%3D1%2C%20%20value%3D8%2C%20%20%20label%3D%22Base%20Unit%20%E2%80%94%20COGS%20(%24)%22)%0A%20%20%20%20ui_sp_price%20%20%20%3D%20mo.ui.number(start%3D1%2C%20stop%3D500%2C%20%20step%3D1%2C%20%20value%3D60%2C%20%20label%3D%22Starter%20Pack%20%E2%80%94%20MSRP%20(%24)%22)%0A%20%20%20%20ui_sp_cogs%20%20%20%20%3D%20mo.ui.number(start%3D1%2C%20stop%3D500%2C%20%20step%3D1%2C%20%20value%3D24%2C%20%20label%3D%22Starter%20Pack%20%E2%80%94%20COGS%20(%24)%22)%0A%20%20%20%20ui_bb_price%20%20%20%3D%20mo.ui.number(start%3D1%2C%20stop%3D200%2C%20%20step%3D1%2C%20%20value%3D15%2C%20%20label%3D%22Blind%20Box%20%E2%80%94%20MSRP%20(%24)%22)%0A%20%20%20%20ui_bb_cogs%20%20%20%20%3D%20mo.ui.number(start%3D1%2C%20stop%3D200%2C%20%20step%3D1%2C%20%20value%3D2%2C%20%20%20label%3D%22Blind%20Box%20%E2%80%94%20COGS%20(%24)%22)%0A%20%20%20%20ui_exp_sm_price%20%3D%20mo.ui.number(start%3D1%2C%20stop%3D200%2C%20%20step%3D5%2C%20%20value%3D25%2C%20%20label%3D%22Expansion%20S%20%E2%80%94%20MSRP%20(%24)%22)%0A%20%20%20%20ui_exp_md_price%20%3D%20mo.ui.number(start%3D1%2C%20stop%3D500%2C%20%20step%3D10%2C%20value%3D75%2C%20%20label%3D%22Expansion%20M%20%E2%80%94%20MSRP%20(%24)%22)%0A%20%20%20%20ui_exp_lg_price%20%3D%20mo.ui.number(start%3D1%2C%20stop%3D1000%2C%20step%3D25%2C%20value%3D200%2C%20label%3D%22Expansion%20L%20%E2%80%94%20MSRP%20(%24)%22)%0A%20%20%20%20ui_exp_xl_price%20%3D%20mo.ui.number(start%3D1%2C%20stop%3D1000%2C%20step%3D25%2C%20value%3D500%2C%20label%3D%22Expansion%20XL%20%E2%80%94%20MSRP%20(%24)%22)%0A%20%20%20%20ui_exp_cogs%20%20%20%20%20%3D%20mo.ui.number(start%3D1%2C%20stop%3D200%2C%20%20step%3D5%2C%20%20value%3D10%2C%20%20label%3D%22Expansion%20COGS%20all%20tiers%20(%24)%22)%0A%20%20%20%20ui_exp_sm_pct%20%3D%20mo.ui.number(start%3D0%2C%20stop%3D100%2C%20step%3D1%2C%20value%3D90%2C%20label%3D%22Exp%20S%20mix%20%25%22)%0A%20%20%20%20ui_exp_md_pct%20%3D%20mo.ui.number(start%3D0%2C%20stop%3D100%2C%20step%3D1%2C%20value%3D10%2C%20label%3D%22Exp%20M%20mix%20%25%22)%0A%20%20%20%20ui_exp_lg_pct%20%3D%20mo.ui.number(start%3D0%2C%20stop%3D100%2C%20step%3D1%2C%20value%3D0%2C%20%20label%3D%22Exp%20L%20mix%20%25%22)%0A%20%20%20%20ui_exp_xl_pct%20%3D%20mo.ui.number(start%3D0%2C%20stop%3D100%2C%20step%3D1%2C%20value%3D0%2C%20%20label%3D%22Exp%20XL%20mix%20%25%22)%0A%20%20%20%20ui_retail_pct%20%20%20%20%20%20%3D%20mo.ui.number(start%3D0%2C%20stop%3D100%2C%20step%3D5%2C%20value%3D40%2C%20label%3D%22Retail%20channel%20%25%22)%0A%20%20%20%20ui_retailer_margin%20%3D%20mo.ui.number(start%3D0%2C%20stop%3D60%2C%20%20step%3D5%2C%20value%3D45%2C%20label%3D%22Retailer%20margin%20%25%22)%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20ui_base_cogs%2C%0A%20%20%20%20%20%20%20%20ui_base_price%2C%0A%20%20%20%20%20%20%20%20ui_bb_cogs%2C%0A%20%20%20%20%20%20%20%20ui_bb_price%2C%0A%20%20%20%20%20%20%20%20ui_exp_cogs%2C%0A%20%20%20%20%20%20%20%20ui_exp_lg_pct%2C%0A%20%20%20%20%20%20%20%20ui_exp_lg_price%2C%0A%20%20%20%20%20%20%20%20ui_exp_md_pct%2C%0A%20%20%20%20%20%20%20%20ui_exp_md_price%2C%0A%20%20%20%20%20%20%20%20ui_exp_sm_pct%2C%0A%20%20%20%20%20%20%20%20ui_exp_sm_price%2C%0A%20%20%20%20%20%20%20%20ui_exp_xl_pct%2C%0A%20%20%20%20%20%20%20%20ui_exp_xl_price%2C%0A%20%20%20%20%20%20%20%20ui_retail_pct%2C%0A%20%20%20%20%20%20%20%20ui_retailer_margin%2C%0A%20%20%20%20%20%20%20%20ui_sp_cogs%2C%0A%20%20%20%20%20%20%20%20ui_sp_price%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_ui_market(mo)%3A%0A%20%20%20%20ui_tam_us%20%20%20%3D%20mo.ui.number(start%3D1_000_000%2C%20%20stop%3D100_000_000%2C%20step%3D500_000%2C%20%20%20value%3D24_750_000%2C%20label%3D%22TAM%20pop%20(11-16)%22)%0A%20%20%20%20ui_tam_cn%20%20%20%3D%20mo.ui.number(start%3D1_000_000%2C%20%20stop%3D200_000_000%2C%20step%3D1_000_000%2C%20value%3D84_000_000%2C%20%20label%3D%22TAM%20pop%20(11-16)%22)%0A%20%20%20%20ui_tam_kr%20%20%20%3D%20mo.ui.number(start%3D100_000%2C%20%20%20%20stop%3D10_000_000%2C%20%20step%3D100_000%2C%20%20%20value%3D3_150_000%2C%20%20%20label%3D%22TAM%20pop%20(11-16)%22)%0A%20%20%20%20ui_sam_us%20%20%20%3D%20mo.ui.number(start%3D1%2C%20stop%3D50%2C%20step%3D1%2C%20value%3D10%2C%20label%3D%22SAM%20%25%20of%20TAM%22)%0A%20%20%20%20ui_sam_cn%20%20%20%3D%20mo.ui.number(start%3D1%2C%20stop%3D50%2C%20step%3D1%2C%20value%3D6%2C%20%20label%3D%22SAM%20%25%20of%20TAM%22)%0A%20%20%20%20ui_sam_kr%20%20%20%3D%20mo.ui.number(start%3D1%2C%20stop%3D50%2C%20step%3D1%2C%20value%3D20%2C%20label%3D%22SAM%20%25%20of%20TAM%22)%0A%20%20%20%20ui_som_yr1_us%20%3D%20mo.ui.number(start%3D0.01%2C%20stop%3D5.0%2C%20step%3D0.05%2C%20value%3D0.30%2C%20label%3D%22Launch%20SOM%20%25%20of%20SAM%22)%0A%20%20%20%20ui_som_yr1_cn%20%3D%20mo.ui.number(start%3D0.01%2C%20stop%3D5.0%2C%20step%3D0.05%2C%20value%3D0.10%2C%20label%3D%22Launch%20SOM%20%25%20of%20SAM%22)%0A%20%20%20%20ui_som_yr1_kr%20%3D%20mo.ui.number(start%3D0.01%2C%20stop%3D5.0%2C%20step%3D0.05%2C%20value%3D1.00%2C%20label%3D%22Launch%20SOM%20%25%20of%20SAM%22)%0A%20%20%20%20ui_launch_us%20%20%3D%20mo.ui.number(start%3D0%2C%20stop%3D24%2C%20step%3D1%2C%20value%3D0%2C%20label%3D%22Launch%20offset%20(months)%22)%0A%20%20%20%20ui_launch_cn%20%20%3D%20mo.ui.number(start%3D0%2C%20stop%3D24%2C%20step%3D1%2C%20value%3D6%2C%20label%3D%22Launch%20offset%20(months)%22)%0A%20%20%20%20ui_launch_kr%20%20%3D%20mo.ui.number(start%3D0%2C%20stop%3D24%2C%20step%3D1%2C%20value%3D3%2C%20label%3D%22Launch%20offset%20(months)%22)%0A%20%20%20%20ui_pre_peak_mom_us%20%3D%20mo.ui.number(start%3D0%2C%20stop%3D50%2C%20step%3D1%2C%20value%3D20%2C%20label%3D%22Pre-peak%20MoM%20growth%20%25%22)%0A%20%20%20%20ui_pre_peak_mom_cn%20%3D%20mo.ui.number(start%3D0%2C%20stop%3D50%2C%20step%3D1%2C%20value%3D25%2C%20label%3D%22Pre-peak%20MoM%20growth%20%25%22)%0A%20%20%20%20ui_pre_peak_mom_kr%20%3D%20mo.ui.number(start%3D0%2C%20stop%3D50%2C%20step%3D1%2C%20value%3D22%2C%20label%3D%22Pre-peak%20MoM%20growth%20%25%22)%0A%20%20%20%20ui_peak_month_us%20%3D%20mo.ui.number(start%3D6%2C%20stop%3D60%2C%20step%3D1%2C%20value%3D30%2C%20label%3D%22Peak%20month%20(after%20launch)%22)%0A%20%20%20%20ui_peak_month_cn%20%3D%20mo.ui.number(start%3D6%2C%20stop%3D60%2C%20step%3D1%2C%20value%3D36%2C%20label%3D%22Peak%20month%20(after%20launch)%22)%0A%20%20%20%20ui_peak_month_kr%20%3D%20mo.ui.number(start%3D6%2C%20stop%3D60%2C%20step%3D1%2C%20value%3D28%2C%20label%3D%22Peak%20month%20(after%20launch)%22)%0A%20%20%20%20ui_post_decay_us%20%3D%20mo.ui.number(start%3D0%2C%20stop%3D25%2C%20step%3D1%2C%20value%3D6%2C%20label%3D%22Post-peak%20decay%20%25%2Fmonth%22)%0A%20%20%20%20ui_post_decay_cn%20%3D%20mo.ui.number(start%3D0%2C%20stop%3D25%2C%20step%3D1%2C%20value%3D5%2C%20label%3D%22Post-peak%20decay%20%25%2Fmonth%22)%0A%20%20%20%20ui_post_decay_kr%20%3D%20mo.ui.number(start%3D0%2C%20stop%3D25%2C%20step%3D1%2C%20value%3D7%2C%20label%3D%22Post-peak%20decay%20%25%2Fmonth%22)%0A%20%20%20%20ui_peak_som_us%20%3D%20mo.ui.number(start%3D1%2C%20stop%3D50%2C%20step%3D1%2C%20value%3D10%2C%20label%3D%22Peak%20SOM%20%25%20of%20SAM%22)%0A%20%20%20%20ui_peak_som_cn%20%3D%20mo.ui.number(start%3D1%2C%20stop%3D50%2C%20step%3D1%2C%20value%3D10%2C%20label%3D%22Peak%20SOM%20%25%20of%20SAM%22)%0A%20%20%20%20ui_peak_som_kr%20%3D%20mo.ui.number(start%3D1%2C%20stop%3D50%2C%20step%3D1%2C%20value%3D10%2C%20label%3D%22Peak%20SOM%20%25%20of%20SAM%22)%0A%20%20%20%20ui_ltv_cap_us%20%3D%20mo.ui.number(start%3D0%2C%20stop%3D2000%2C%20step%3D10%2C%20value%3D100%2C%20label%3D%22Lifetime%20spend%20cap%20(net%20%24)%22)%0A%20%20%20%20ui_ltv_cap_cn%20%3D%20mo.ui.number(start%3D0%2C%20stop%3D2000%2C%20step%3D10%2C%20value%3D100%2C%20label%3D%22Lifetime%20spend%20cap%20(net%20%24)%22)%0A%20%20%20%20ui_ltv_cap_kr%20%3D%20mo.ui.number(start%3D0%2C%20stop%3D2000%2C%20step%3D10%2C%20value%3D100%2C%20label%3D%22Lifetime%20spend%20cap%20(net%20%24)%22)%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20ui_launch_cn%2C%0A%20%20%20%20%20%20%20%20ui_launch_kr%2C%0A%20%20%20%20%20%20%20%20ui_launch_us%2C%0A%20%20%20%20%20%20%20%20ui_ltv_cap_cn%2C%0A%20%20%20%20%20%20%20%20ui_ltv_cap_kr%2C%0A%20%20%20%20%20%20%20%20ui_ltv_cap_us%2C%0A%20%20%20%20%20%20%20%20ui_peak_month_cn%2C%0A%20%20%20%20%20%20%20%20ui_peak_month_kr%2C%0A%20%20%20%20%20%20%20%20ui_peak_month_us%2C%0A%20%20%20%20%20%20%20%20ui_peak_som_cn%2C%0A%20%20%20%20%20%20%20%20ui_peak_som_kr%2C%0A%20%20%20%20%20%20%20%20ui_peak_som_us%2C%0A%20%20%20%20%20%20%20%20ui_post_decay_cn%2C%0A%20%20%20%20%20%20%20%20ui_post_decay_kr%2C%0A%20%20%20%20%20%20%20%20ui_post_decay_us%2C%0A%20%20%20%20%20%20%20%20ui_pre_peak_mom_cn%2C%0A%20%20%20%20%20%20%20%20ui_pre_peak_mom_kr%2C%0A%20%20%20%20%20%20%20%20ui_pre_peak_mom_us%2C%0A%20%20%20%20%20%20%20%20ui_sam_cn%2C%0A%20%20%20%20%20%20%20%20ui_sam_kr%2C%0A%20%20%20%20%20%20%20%20ui_sam_us%2C%0A%20%20%20%20%20%20%20%20ui_som_yr1_cn%2C%0A%20%20%20%20%20%20%20%20ui_som_yr1_kr%2C%0A%20%20%20%20%20%20%20%20ui_som_yr1_us%2C%0A%20%20%20%20%20%20%20%20ui_tam_cn%2C%0A%20%20%20%20%20%20%20%20ui_tam_kr%2C%0A%20%20%20%20%20%20%20%20ui_tam_us%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_ui_customer_behaviour(mo)%3A%0A%20%20%20%20ui_base_unit_pct%20%3D%20mo.ui.number(start%3D0%2C%20stop%3D100%2C%20step%3D5%2C%20%20%20value%3D70%2C%20%20label%3D%22Acquire%20via%20Base%20Unit%20%25%22)%0A%20%20%20%20ui_starter_pct%20%20%20%3D%20mo.ui.number(start%3D0%2C%20stop%3D100%2C%20step%3D5%2C%20%20%20value%3D30%2C%20%20label%3D%22Acquire%20via%20Starter%20Pack%20%25%22)%0A%20%20%20%20ui_bb_per_qtr%20%20%20%20%3D%20mo.ui.number(start%3D0%2C%20stop%3D12%2C%20%20step%3D0.5%2C%20value%3D1.0%2C%20label%3D%22Blind%20boxes%20%2F%20customer%20%2F%20quarter%22)%0A%20%20%20%20ui_exp_per_qtr%20%20%20%3D%20mo.ui.number(start%3D0%2C%20stop%3D6%2C%20%20%20step%3D0.5%2C%20value%3D1.0%2C%20label%3D%22Expansion%20sets%20%2F%20customer%20%2F%20quarter%22)%0A%20%20%20%20ui_churn_rate%20%3D%20mo.ui.number(start%3D0%2C%20stop%3D80%2C%20step%3D1%2C%20value%3D50%2C%20label%3D%22Annual%20churn%20%25%22)%0A%20%20%20%20ui_wom_rate%20%20%20%3D%20mo.ui.number(start%3D0%2C%20stop%3D50%2C%20step%3D1%2C%20value%3D10%2C%20label%3D%22WoM%20organic%20growth%20%25%22)%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20ui_base_unit_pct%2C%0A%20%20%20%20%20%20%20%20ui_bb_per_qtr%2C%0A%20%20%20%20%20%20%20%20ui_churn_rate%2C%0A%20%20%20%20%20%20%20%20ui_exp_per_qtr%2C%0A%20%20%20%20%20%20%20%20ui_starter_pct%2C%0A%20%20%20%20%20%20%20%20ui_wom_rate%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_ui_opex(mo)%3A%0A%20%20%20%20ui_monthly_marketing%20%3D%20mo.ui.number(start%3D0%2C%20stop%3D500_000%2C%20step%3D5_000%2C%20value%3D20_000%2C%20label%3D%22Monthly%20marketing%20(%24)%22)%0A%20%20%20%20ui_monthly_ops%20%20%20%20%20%20%20%3D%20mo.ui.number(start%3D0%2C%20stop%3D200_000%2C%20step%3D1_000%2C%20value%3D15_000%2C%20label%3D%22Monthly%20operations%20%2F%20staff%20(%24)%22)%0A%20%20%20%20ui_fulfill_dtc_pct%20%20%20%20%3D%20mo.ui.number(start%3D0%2C%20stop%3D50%2C%20step%3D1%2C%20value%3D15%2C%20label%3D%22Fulfillment%20D2C%20%25%20of%20net%20rev%22)%0A%20%20%20%20ui_fulfill_retail_pct%20%3D%20mo.ui.number(start%3D0%2C%20stop%3D20%2C%20step%3D1%2C%20value%3D3%2C%20%20label%3D%22Fulfillment%20retail%20%25%20of%20net%20rev%22)%0A%20%20%20%20ui_opex_growth%20%20%20%20%20%20%20%20%3D%20mo.ui.number(start%3D0%2C%20stop%3D30%2C%20step%3D1%2C%20value%3D10%2C%20label%3D%22Annual%20OPEX%20growth%20%25%22)%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20ui_fulfill_dtc_pct%2C%0A%20%20%20%20%20%20%20%20ui_fulfill_retail_pct%2C%0A%20%20%20%20%20%20%20%20ui_monthly_marketing%2C%0A%20%20%20%20%20%20%20%20ui_monthly_ops%2C%0A%20%20%20%20%20%20%20%20ui_opex_growth%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_assumptions_panel(%0A%20%20%20%20mo%2C%0A%20%20%20%20ui_base_cogs%2C%0A%20%20%20%20ui_base_price%2C%0A%20%20%20%20ui_base_unit_pct%2C%0A%20%20%20%20ui_bb_cogs%2C%0A%20%20%20%20ui_bb_per_qtr%2C%0A%20%20%20%20ui_bb_price%2C%0A%20%20%20%20ui_brand_cost%2C%0A%20%20%20%20ui_churn_rate%2C%0A%20%20%20%20ui_design_cost%2C%0A%20%20%20%20ui_exp_cogs%2C%0A%20%20%20%20ui_exp_lg_pct%2C%0A%20%20%20%20ui_exp_lg_price%2C%0A%20%20%20%20ui_exp_md_pct%2C%0A%20%20%20%20ui_exp_md_price%2C%0A%20%20%20%20ui_exp_per_qtr%2C%0A%20%20%20%20ui_exp_sm_pct%2C%0A%20%20%20%20ui_exp_sm_price%2C%0A%20%20%20%20ui_exp_xl_pct%2C%0A%20%20%20%20ui_exp_xl_price%2C%0A%20%20%20%20ui_fulfill_dtc_pct%2C%0A%20%20%20%20ui_fulfill_retail_pct%2C%0A%20%20%20%20ui_gtm_cost%2C%0A%20%20%20%20ui_launch_cn%2C%0A%20%20%20%20ui_launch_kr%2C%0A%20%20%20%20ui_launch_us%2C%0A%20%20%20%20ui_ltv_cap_cn%2C%0A%20%20%20%20ui_ltv_cap_kr%2C%0A%20%20%20%20ui_ltv_cap_us%2C%0A%20%20%20%20ui_monthly_marketing%2C%0A%20%20%20%20ui_monthly_ops%2C%0A%20%20%20%20ui_opex_growth%2C%0A%20%20%20%20ui_peak_month_cn%2C%0A%20%20%20%20ui_peak_month_kr%2C%0A%20%20%20%20ui_peak_month_us%2C%0A%20%20%20%20ui_peak_som_cn%2C%0A%20%20%20%20ui_peak_som_kr%2C%0A%20%20%20%20ui_peak_som_us%2C%0A%20%20%20%20ui_post_decay_cn%2C%0A%20%20%20%20ui_post_decay_kr%2C%0A%20%20%20%20ui_post_decay_us%2C%0A%20%20%20%20ui_pre_peak_mom_cn%2C%0A%20%20%20%20ui_pre_peak_mom_kr%2C%0A%20%20%20%20ui_pre_peak_mom_us%2C%0A%20%20%20%20ui_retail_pct%2C%0A%20%20%20%20ui_retailer_margin%2C%0A%20%20%20%20ui_sam_cn%2C%0A%20%20%20%20ui_sam_kr%2C%0A%20%20%20%20ui_sam_us%2C%0A%20%20%20%20ui_som_yr1_cn%2C%0A%20%20%20%20ui_som_yr1_kr%2C%0A%20%20%20%20ui_som_yr1_us%2C%0A%20%20%20%20ui_sp_cogs%2C%0A%20%20%20%20ui_sp_price%2C%0A%20%20%20%20ui_starter_pct%2C%0A%20%20%20%20ui_tam_cn%2C%0A%20%20%20%20ui_tam_kr%2C%0A%20%20%20%20ui_tam_us%2C%0A%20%20%20%20ui_wom_rate%2C%0A)%3A%0A%20%20%20%20def%20_som_note(tam%2C%20sam_pct%2C%20som_pct%2C%20pre_mom%2C%20peak_mo%2C%20post_decay%2C%20peak_som_cap%2C%20ltv_cap)%3A%0A%20%20%20%20%20%20%20%20sam_pop%20%20%20%20%20%20%3D%20tam%20*%20sam_pct%20%2F%20100%0A%20%20%20%20%20%20%20%20som_pop%20%20%20%20%20%20%3D%20sam_pop%20*%20som_pct%20%2F%20100%0A%20%20%20%20%20%20%20%20init_mo%20%20%20%20%20%20%3D%20som_pop%20%2F%2012%0A%20%20%20%20%20%20%20%20peak_players%20%3D%20int(sam_pop%20*%20peak_som_cap%20%2F%20100)%0A%20%20%20%20%20%20%20%20return%20mo.callout(%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22Month%201%3A%20**%7Bint(init_mo)%3A%2C%7D%20acq%2Fmonth**%20%26nbsp%3B%C2%B7%26nbsp%3B%20%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22%2B%7Bpre_mom%7D%25%2Fmonth%20growth%20%26nbsp%3B%E2%86%92%26nbsp%3B%20%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22Peak%20SOM%3A%20**%7Bpeak_players%3A%2C%7D%20players**%20(%7Bpeak_som_cap%7D%25%20of%20SAM%2C%20month%20%7Bpeak_mo%7D)%20%26nbsp%3B%C2%B7%26nbsp%3B%20%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22then%20%E2%88%92%7Bpost_decay%7D%25%2Fmonth%20%26nbsp%3B%C2%B7%26nbsp%3B%20%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22lifetime%20spend%20cap%20**%24%7Bltv_cap%3A%2C.0f%7D%2Fplayer**%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20kind%3D%22success%22%2C%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%23%20%E2%94%80%E2%94%80%20Row%201%3A%20Upfront%20%2B%20OPEX%20%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%0A%20%20%20%20sec_upfront%20%3D%20mo.vstack(%5B%0A%20%20%20%20%20%20%20%20mo.md(%22%23%23%23%23%20%F0%9F%92%B0%20Upfront%20Investments%22)%2C%0A%20%20%20%20%20%20%20%20mo.hstack(%5Bui_design_cost%2C%20ui_brand_cost%2C%20ui_gtm_cost%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20justify%3D%22start%22%2C%20gap%3D%222rem%22)%2C%0A%20%20%20%20%5D%2C%20gap%3D%220.5rem%22)%0A%0A%20%20%20%20sec_opex%20%3D%20mo.vstack(%5B%0A%20%20%20%20%20%20%20%20mo.md(%22%23%23%23%23%20%F0%9F%93%8B%20Operating%20Costs%22)%2C%0A%20%20%20%20%20%20%20%20mo.hstack(%5Bui_monthly_marketing%2C%20ui_monthly_ops%2C%20ui_opex_growth%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20justify%3D%22start%22%2C%20gap%3D%222rem%22)%2C%0A%20%20%20%20%20%20%20%20mo.hstack(%5Bui_fulfill_dtc_pct%2C%20ui_fulfill_retail_pct%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20justify%3D%22start%22%2C%20gap%3D%222rem%22)%2C%0A%20%20%20%20%5D%2C%20gap%3D%220.5rem%22)%0A%0A%20%20%20%20row1%20%3D%20mo.hstack(%5Bsec_upfront%2C%20sec_opex%5D%2C%20gap%3D%224rem%22%2C%20justify%3D%22start%22)%0A%0A%20%20%20%20%23%20%E2%94%80%E2%94%80%20Row%202%3A%20Markets%20(3%20columns)%20%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%0A%20%20%20%20sec_markets%20%3D%20mo.vstack(%5B%0A%20%20%20%20%20%20%20%20mo.md(%22%23%23%23%23%20%F0%9F%8C%8F%20Markets%22)%2C%0A%20%20%20%20%20%20%20%20mo.hstack(%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.vstack(%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.md(%22**%F0%9F%87%BA%F0%9F%87%B8%20USA**%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ui_tam_us%2C%20ui_sam_us%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.hstack(%5Bui_peak_som_us%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.md(f%22%3D%20**%7Bint(ui_tam_us.value%20*%20ui_sam_us.value%20%2F%20100%20*%20ui_peak_som_us.value%20%2F%20100)%3A%2C%7D**%20players%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%20gap%3D%220.75rem%22%2C%20align%3D%22center%22%2C%20justify%3D%22start%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ui_som_yr1_us%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20_som_note(ui_tam_us.value%2C%20ui_sam_us.value%2C%20ui_som_yr1_us.value%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ui_pre_peak_mom_us.value%2C%20ui_peak_month_us.value%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ui_post_decay_us.value%2C%20ui_peak_som_us.value%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ui_ltv_cap_us.value)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.md(%22*Viral%20curve*%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ui_pre_peak_mom_us%2C%20ui_peak_month_us%2C%20ui_post_decay_us%2C%20ui_launch_us%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ui_ltv_cap_us%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%20gap%3D%220.4rem%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.vstack(%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.md(%22**%F0%9F%87%A8%F0%9F%87%B3%20China**%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ui_tam_cn%2C%20ui_sam_cn%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.hstack(%5Bui_peak_som_cn%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.md(f%22%3D%20**%7Bint(ui_tam_cn.value%20*%20ui_sam_cn.value%20%2F%20100%20*%20ui_peak_som_cn.value%20%2F%20100)%3A%2C%7D**%20players%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%20gap%3D%220.75rem%22%2C%20align%3D%22center%22%2C%20justify%3D%22start%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ui_som_yr1_cn%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20_som_note(ui_tam_cn.value%2C%20ui_sam_cn.value%2C%20ui_som_yr1_cn.value%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ui_pre_peak_mom_cn.value%2C%20ui_peak_month_cn.value%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ui_post_decay_cn.value%2C%20ui_peak_som_cn.value%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ui_ltv_cap_cn.value)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.md(%22*Viral%20curve*%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ui_pre_peak_mom_cn%2C%20ui_peak_month_cn%2C%20ui_post_decay_cn%2C%20ui_launch_cn%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ui_ltv_cap_cn%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%20gap%3D%220.4rem%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.vstack(%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.md(%22**%F0%9F%87%B0%F0%9F%87%B7%20Korea**%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ui_tam_kr%2C%20ui_sam_kr%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.hstack(%5Bui_peak_som_kr%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.md(f%22%3D%20**%7Bint(ui_tam_kr.value%20*%20ui_sam_kr.value%20%2F%20100%20*%20ui_peak_som_kr.value%20%2F%20100)%3A%2C%7D**%20players%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%20gap%3D%220.75rem%22%2C%20align%3D%22center%22%2C%20justify%3D%22start%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ui_som_yr1_kr%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20_som_note(ui_tam_kr.value%2C%20ui_sam_kr.value%2C%20ui_som_yr1_kr.value%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ui_pre_peak_mom_kr.value%2C%20ui_peak_month_kr.value%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ui_post_decay_kr.value%2C%20ui_peak_som_kr.value%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ui_ltv_cap_kr.value)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.md(%22*Viral%20curve*%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ui_pre_peak_mom_kr%2C%20ui_peak_month_kr%2C%20ui_post_decay_kr%2C%20ui_launch_kr%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ui_ltv_cap_kr%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%20gap%3D%220.4rem%22)%2C%0A%20%20%20%20%20%20%20%20%5D%2C%20gap%3D%223rem%22%2C%20justify%3D%22start%22)%2C%0A%20%20%20%20%5D%2C%20gap%3D%220.5rem%22)%0A%0A%20%20%20%20%23%20%E2%94%80%E2%94%80%20Row%203%3A%20Pricing%20%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%0A%20%20%20%20sec_pricing%20%3D%20mo.vstack(%5B%0A%20%20%20%20%20%20%20%20mo.md(%22%23%23%23%23%20%F0%9F%8E%AE%20Pricing%20%26%20COGS%22)%2C%0A%20%20%20%20%20%20%20%20mo.hstack(%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.vstack(%5Bmo.md(%22**Base%20Unit**%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.hstack(%5Bui_base_price%2C%20ui_base_cogs%5D%2C%20gap%3D%221rem%22)%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.vstack(%5Bmo.md(%22**Starter%20Pack**%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.hstack(%5Bui_sp_price%2C%20ui_sp_cogs%5D%2C%20gap%3D%221rem%22)%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.vstack(%5Bmo.md(%22**Blind%20Box**%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.hstack(%5Bui_bb_price%2C%20ui_bb_cogs%5D%2C%20gap%3D%221rem%22)%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.vstack(%5Bmo.md(%22**Expansion%20COGS%20(all%20tiers)**%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ui_exp_cogs%5D)%2C%0A%20%20%20%20%20%20%20%20%5D%2C%20gap%3D%222.5rem%22%2C%20justify%3D%22start%22)%2C%0A%20%20%20%20%20%20%20%20mo.hstack(%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.vstack(%5Bmo.md(%22**Expansion%20S**%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.hstack(%5Bui_exp_sm_price%2C%20ui_exp_sm_pct%5D%2C%20gap%3D%220.75rem%22)%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.vstack(%5Bmo.md(%22**Expansion%20M**%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.hstack(%5Bui_exp_md_price%2C%20ui_exp_md_pct%5D%2C%20gap%3D%220.75rem%22)%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.vstack(%5Bmo.md(%22**Expansion%20L**%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.hstack(%5Bui_exp_lg_price%2C%20ui_exp_lg_pct%5D%2C%20gap%3D%220.75rem%22)%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.vstack(%5Bmo.md(%22**Expansion%20XL**%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.hstack(%5Bui_exp_xl_price%2C%20ui_exp_xl_pct%5D%2C%20gap%3D%220.75rem%22)%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.vstack(%5Bmo.md(%22**Channel**%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.hstack(%5Bui_retail_pct%2C%20ui_retailer_margin%5D%2C%20gap%3D%220.75rem%22)%5D)%2C%0A%20%20%20%20%20%20%20%20%5D%2C%20gap%3D%222rem%22%2C%20justify%3D%22start%22)%2C%0A%20%20%20%20%5D%2C%20gap%3D%220.6rem%22)%0A%0A%20%20%20%20%23%20%E2%94%80%E2%94%80%20Row%204%3A%20Customers%20%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%0A%20%20%20%20sec_customers%20%3D%20mo.vstack(%5B%0A%20%20%20%20%20%20%20%20mo.md(%22%23%23%23%23%20%F0%9F%91%A4%20Customer%20Behaviour%22)%2C%0A%20%20%20%20%20%20%20%20mo.hstack(%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.vstack(%5Bmo.md(%22**Acquisition%20mix**%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ui_base_unit_pct%2C%20ui_starter_pct%5D%2C%20gap%3D%220.4rem%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.vstack(%5Bmo.md(%22**Recurring%20purchases%20%2F%20quarter**%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ui_bb_per_qtr%2C%20ui_exp_per_qtr%5D%2C%20gap%3D%220.4rem%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.vstack(%5Bmo.md(%22**Retention%20%26%20organic**%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ui_churn_rate%2C%20ui_wom_rate%5D%2C%20gap%3D%220.4rem%22)%2C%0A%20%20%20%20%20%20%20%20%5D%2C%20gap%3D%223rem%22%2C%20justify%3D%22start%22)%2C%0A%20%20%20%20%5D%2C%20gap%3D%220.5rem%22)%0A%0A%20%20%20%20assumptions%20%3D%20mo.vstack(%5B%0A%20%20%20%20%20%20%20%20row1%2C%0A%20%20%20%20%20%20%20%20mo.md(%22---%22)%2C%0A%20%20%20%20%20%20%20%20sec_markets%2C%0A%20%20%20%20%20%20%20%20mo.md(%22---%22)%2C%0A%20%20%20%20%20%20%20%20sec_pricing%2C%0A%20%20%20%20%20%20%20%20mo.md(%22---%22)%2C%0A%20%20%20%20%20%20%20%20sec_customers%2C%0A%20%20%20%20%5D%2C%20gap%3D%221rem%22)%0A%20%20%20%20return%20(assumptions%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_tam_sam_som(%0A%20%20%20%20mo%2C%0A%20%20%20%20ui_sam_cn%2C%0A%20%20%20%20ui_sam_kr%2C%0A%20%20%20%20ui_sam_us%2C%0A%20%20%20%20ui_som_yr1_cn%2C%0A%20%20%20%20ui_som_yr1_kr%2C%0A%20%20%20%20ui_som_yr1_us%2C%0A%20%20%20%20ui_tam_cn%2C%0A%20%20%20%20ui_tam_kr%2C%0A%20%20%20%20ui_tam_us%2C%0A)%3A%0A%20%20%20%20def%20_mkt(pop%2C%20sam_pct%2C%20som_pct)%3A%0A%20%20%20%20%20%20%20%20sam_pop%20%3D%20pop%20*%20sam_pct%20%2F%20100%0A%20%20%20%20%20%20%20%20som_pop%20%3D%20sam_pop%20*%20som_pct%20%2F%20100%0A%20%20%20%20%20%20%20%20return%20dict(%0A%20%20%20%20%20%20%20%20%20%20%20%20tam_pop%3Dpop%2C%20sam_pop%3Dsam_pop%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20som_pop%3Dsom_pop%2C%20init_mo_acq%3Dsom_pop%20%2F%2012%2C%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20mkts%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%22USA%22%3A%20%20%20_mkt(ui_tam_us.value%2C%20ui_sam_us.value%2C%20ui_som_yr1_us.value)%2C%0A%20%20%20%20%20%20%20%20%22China%22%3A%20_mkt(ui_tam_cn.value%2C%20ui_sam_cn.value%2C%20ui_som_yr1_cn.value)%2C%0A%20%20%20%20%20%20%20%20%22Korea%22%3A%20_mkt(ui_tam_kr.value%2C%20ui_sam_kr.value%2C%20ui_som_yr1_kr.value)%2C%0A%20%20%20%20%7D%0A%0A%20%20%20%20def%20_fp(v)%3A%20return%20f%22%7Bv%3A%2C.0f%7D%22%0A%0A%20%20%20%20tam_table%20%3D%20mo.ui.table(%0A%20%20%20%20%20%20%20%20%5B%7B%22Market%22%3A%20k%2C%0A%20%20%20%20%20%20%20%20%20%20%22TAM%20(people)%22%3A%20%20%20%20%20%20%20%20_fp(d%5B%22tam_pop%22%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%22SAM%20(people)%22%3A%20%20%20%20%20%20%20%20_fp(d%5B%22sam_pop%22%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%22SOM%20Yr1%20(people)%22%3A%20%20%20%20_fp(d%5B%22som_pop%22%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%22Launch-month%20acq.%22%3A%20%20%20_fp(d%5B%22init_mo_acq%22%5D)%7D%0A%20%20%20%20%20%20%20%20%20for%20k%2C%20d%20in%20mkts.items()%5D%2C%0A%20%20%20%20%20%20%20%20selection%3DNone%2C%0A%20%20%20%20)%0A%0A%20%20%20%20total_tam_pop%20%3D%20sum(d%5B%22tam_pop%22%5D%20for%20d%20in%20mkts.values())%0A%20%20%20%20total_sam_pop%20%3D%20sum(d%5B%22sam_pop%22%5D%20for%20d%20in%20mkts.values())%0A%20%20%20%20total_som_pop%20%3D%20sum(d%5B%22som_pop%22%5D%20for%20d%20in%20mkts.values())%0A%0A%20%20%20%20tam_callout%20%3D%20mo.callout(%0A%20%20%20%20%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20%20%20%20%20f%22**TAM**%20%7B_fp(total_tam_pop)%7D%20people%20%26nbsp%3B%C2%B7%26nbsp%3B%20%22%0A%20%20%20%20%20%20%20%20%20%20%20%20f%22**SAM**%20%7B_fp(total_sam_pop)%7D%20people%20%26nbsp%3B%C2%B7%26nbsp%3B%20%22%0A%20%20%20%20%20%20%20%20%20%20%20%20f%22**SOM%20Yr1**%20%7B_fp(total_som_pop)%7D%20players%22%0A%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20kind%3D%22info%22%2C%0A%20%20%20%20)%0A%20%20%20%20return%20tam_callout%2C%20tam_table%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_net_prices(%0A%20%20%20%20ui_base_cogs%2C%0A%20%20%20%20ui_base_price%2C%0A%20%20%20%20ui_bb_cogs%2C%0A%20%20%20%20ui_bb_price%2C%0A%20%20%20%20ui_exp_cogs%2C%0A%20%20%20%20ui_exp_lg_pct%2C%0A%20%20%20%20ui_exp_lg_price%2C%0A%20%20%20%20ui_exp_md_pct%2C%0A%20%20%20%20ui_exp_md_price%2C%0A%20%20%20%20ui_exp_sm_pct%2C%0A%20%20%20%20ui_exp_sm_price%2C%0A%20%20%20%20ui_exp_xl_pct%2C%0A%20%20%20%20ui_exp_xl_price%2C%0A%20%20%20%20ui_retail_pct%2C%0A%20%20%20%20ui_retailer_margin%2C%0A%20%20%20%20ui_sp_cogs%2C%0A%20%20%20%20ui_sp_price%2C%0A)%3A%0A%20%20%20%20_r%20%20%3D%20ui_retail_pct.value%20%2F%20100%0A%20%20%20%20_rm%20%3D%20ui_retailer_margin.value%20%2F%20100%0A%0A%20%20%20%20def%20net(msrp)%3A%0A%20%20%20%20%20%20%20%20return%20msrp%20*%20_r%20*%20(1%20-%20_rm)%20%2B%20msrp%20*%20(1%20-%20_r)%0A%0A%20%20%20%20np_base%20%3D%20net(ui_base_price.value)%0A%20%20%20%20np_sp%20%20%20%3D%20net(ui_sp_price.value)%0A%20%20%20%20np_bb%20%20%20%3D%20net(ui_bb_price.value)%0A%0A%20%20%20%20total_pct%20%3D%20(ui_exp_sm_pct.value%20%2B%20ui_exp_md_pct.value%20%2B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ui_exp_lg_pct.value%20%2B%20ui_exp_xl_pct.value)%20or%20100%0A%20%20%20%20exp_avg_msrp%20%3D%20(%0A%20%20%20%20%20%20%20%20ui_exp_sm_pct.value%20*%20ui_exp_sm_price.value%20%2B%0A%20%20%20%20%20%20%20%20ui_exp_md_pct.value%20*%20ui_exp_md_price.value%20%2B%0A%20%20%20%20%20%20%20%20ui_exp_lg_pct.value%20*%20ui_exp_lg_price.value%20%2B%0A%20%20%20%20%20%20%20%20ui_exp_xl_pct.value%20*%20ui_exp_xl_price.value%0A%20%20%20%20)%20%2F%20total_pct%0A%20%20%20%20np_exp%20%3D%20net(exp_avg_msrp)%0A%0A%20%20%20%20gm_base%20%3D%20np_base%20-%20ui_base_cogs.value%0A%20%20%20%20gm_sp%20%20%20%3D%20np_sp%20%20%20-%20ui_sp_cogs.value%0A%20%20%20%20gm_bb%20%20%20%3D%20np_bb%20%20%20-%20ui_bb_cogs.value%0A%20%20%20%20gm_exp%20%20%3D%20np_exp%20%20-%20ui_exp_cogs.value%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20exp_avg_msrp%2C%0A%20%20%20%20%20%20%20%20gm_base%2C%0A%20%20%20%20%20%20%20%20gm_bb%2C%0A%20%20%20%20%20%20%20%20gm_exp%2C%0A%20%20%20%20%20%20%20%20gm_sp%2C%0A%20%20%20%20%20%20%20%20np_base%2C%0A%20%20%20%20%20%20%20%20np_bb%2C%0A%20%20%20%20%20%20%20%20np_exp%2C%0A%20%20%20%20%20%20%20%20np_sp%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_projection(%0A%20%20%20%20MONTHS%2C%0A%20%20%20%20gm_base%2C%0A%20%20%20%20gm_bb%2C%0A%20%20%20%20gm_exp%2C%0A%20%20%20%20gm_sp%2C%0A%20%20%20%20np_base%2C%0A%20%20%20%20np_bb%2C%0A%20%20%20%20np_exp%2C%0A%20%20%20%20np_sp%2C%0A%20%20%20%20pd%2C%0A%20%20%20%20ui_base_unit_pct%2C%0A%20%20%20%20ui_bb_per_qtr%2C%0A%20%20%20%20ui_brand_cost%2C%0A%20%20%20%20ui_churn_rate%2C%0A%20%20%20%20ui_design_cost%2C%0A%20%20%20%20ui_exp_per_qtr%2C%0A%20%20%20%20ui_fulfill_dtc_pct%2C%0A%20%20%20%20ui_fulfill_retail_pct%2C%0A%20%20%20%20ui_gtm_cost%2C%0A%20%20%20%20ui_launch_cn%2C%0A%20%20%20%20ui_launch_kr%2C%0A%20%20%20%20ui_launch_us%2C%0A%20%20%20%20ui_ltv_cap_cn%2C%0A%20%20%20%20ui_ltv_cap_kr%2C%0A%20%20%20%20ui_ltv_cap_us%2C%0A%20%20%20%20ui_monthly_marketing%2C%0A%20%20%20%20ui_monthly_ops%2C%0A%20%20%20%20ui_opex_growth%2C%0A%20%20%20%20ui_peak_month_cn%2C%0A%20%20%20%20ui_peak_month_kr%2C%0A%20%20%20%20ui_peak_month_us%2C%0A%20%20%20%20ui_peak_som_cn%2C%0A%20%20%20%20ui_peak_som_kr%2C%0A%20%20%20%20ui_peak_som_us%2C%0A%20%20%20%20ui_post_decay_cn%2C%0A%20%20%20%20ui_post_decay_kr%2C%0A%20%20%20%20ui_post_decay_us%2C%0A%20%20%20%20ui_pre_peak_mom_cn%2C%0A%20%20%20%20ui_pre_peak_mom_kr%2C%0A%20%20%20%20ui_pre_peak_mom_us%2C%0A%20%20%20%20ui_retail_pct%2C%0A%20%20%20%20ui_sam_cn%2C%0A%20%20%20%20ui_sam_kr%2C%0A%20%20%20%20ui_sam_us%2C%0A%20%20%20%20ui_som_yr1_cn%2C%0A%20%20%20%20ui_som_yr1_kr%2C%0A%20%20%20%20ui_som_yr1_us%2C%0A%20%20%20%20ui_starter_pct%2C%0A%20%20%20%20ui_tam_cn%2C%0A%20%20%20%20ui_tam_kr%2C%0A%20%20%20%20ui_tam_us%2C%0A%20%20%20%20ui_wom_rate%2C%0A)%3A%0A%20%20%20%20markets%20%3D%20%5B%0A%20%20%20%20%20%20%20%20dict(name%3D%22USA%22%2C%20%20%20tam%3Dui_tam_us.value%2C%20sam_pct%3Dui_sam_us.value%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20som_yr1_pct%3Dui_som_yr1_us.value%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20pre_peak_mom%3Dui_pre_peak_mom_us.value%20%2F%20100%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20peak_month%3Dint(ui_peak_month_us.value)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20post_decay%3Dui_post_decay_us.value%20%2F%20100%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20peak_som_cap%3Dui_peak_som_us.value%20%2F%20100%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20launch%3Dint(ui_launch_us.value)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20ltv_cap%3Dui_ltv_cap_us.value)%2C%0A%20%20%20%20%20%20%20%20dict(name%3D%22China%22%2C%20tam%3Dui_tam_cn.value%2C%20sam_pct%3Dui_sam_cn.value%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20som_yr1_pct%3Dui_som_yr1_cn.value%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20pre_peak_mom%3Dui_pre_peak_mom_cn.value%20%2F%20100%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20peak_month%3Dint(ui_peak_month_cn.value)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20post_decay%3Dui_post_decay_cn.value%20%2F%20100%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20peak_som_cap%3Dui_peak_som_cn.value%20%2F%20100%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20launch%3Dint(ui_launch_cn.value)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20ltv_cap%3Dui_ltv_cap_cn.value)%2C%0A%20%20%20%20%20%20%20%20dict(name%3D%22Korea%22%2C%20tam%3Dui_tam_kr.value%2C%20sam_pct%3Dui_sam_kr.value%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20som_yr1_pct%3Dui_som_yr1_kr.value%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20pre_peak_mom%3Dui_pre_peak_mom_kr.value%20%2F%20100%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20peak_month%3Dint(ui_peak_month_kr.value)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20post_decay%3Dui_post_decay_kr.value%20%2F%20100%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20peak_som_cap%3Dui_peak_som_kr.value%20%2F%20100%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20launch%3Dint(ui_launch_kr.value)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20ltv_cap%3Dui_ltv_cap_kr.value)%2C%0A%20%20%20%20%5D%0A%0A%20%20%20%20base_pct%20%20%20%20%3D%20ui_base_unit_pct.value%20%2F%20100%0A%20%20%20%20starter_pct%20%3D%20ui_starter_pct.value%20%2F%20100%0A%20%20%20%20mix_total%20%20%20%3D%20base_pct%20%2B%20starter_pct%20or%201%0A%20%20%20%20base_pct%20%20%20%2F%3D%20mix_total%0A%20%20%20%20starter_pct%20%2F%3D%20mix_total%0A%0A%20%20%20%20monthly_churn%20%3D%201%20-%20(1%20-%20ui_churn_rate.value%20%2F%20100)%20**%20(1%20%2F%2012)%0A%20%20%20%20wom_annual%20%20%20%20%3D%20ui_wom_rate.value%20%2F%20100%0A%20%20%20%20bb_pm%20%20%20%20%20%20%20%20%20%3D%20ui_bb_per_qtr.value%20%2F%203%20%20%20%23%20convert%20quarterly%20to%20monthly%20rate%0A%20%20%20%20exp_pm%20%20%20%20%20%20%20%20%3D%20ui_exp_per_qtr.value%20%2F%203%0A%0A%20%20%20%20_rows%20%3D%20%5B%5D%0A%20%20%20%20for%20m%20in%20markets%3A%0A%20%20%20%20%20%20%20%20sam_pop%20%20%20%20%20%20%20%20%20%3D%20m%5B%22tam%22%5D%20*%20m%5B%22sam_pct%22%5D%20%2F%20100%0A%20%20%20%20%20%20%20%20som_yr1_pop%20%20%20%20%20%3D%20sam_pop%20*%20m%5B%22som_yr1_pct%22%5D%20%2F%20100%0A%20%20%20%20%20%20%20%20monthly_acq_yr1%20%3D%20som_yr1_pop%20%2F%2012%0A%20%20%20%20%20%20%20%20active%20%3D%200.0%0A%20%20%20%20%20%20%20%20%23%20LTV%20cap%3A%20per-market%20%E2%80%94%20scale%20recurring%20revenue%20so%20implied%20LTV%20%E2%89%A4%20ltv_cap%0A%20%20%20%20%20%20%20%20%23%20Implied%20LTV%20%3D%20recurring_net_rev_pm%20%2F%20monthly_churn%0A%20%20%20%20%20%20%20%20_rec_rev_pm%20%3D%20bb_pm%20*%20np_bb%20%2B%20exp_pm%20*%20np_exp%0A%20%20%20%20%20%20%20%20_ltv_scale%20%20%3D%20min(1.0%2C%20m%5B%22ltv_cap%22%5D%20*%20monthly_churn%20%2F%20_rec_rev_pm)%20if%20_rec_rev_pm%20%3E%200%20else%201.0%0A%0A%20%20%20%20%20%20%20%20for%20month%20in%20MONTHS%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20month%20%3C%3D%20m%5B%22launch%22%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20_rows.append(dict(month%3Dmonth%2C%20market%3Dm%5B%22name%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20new_customers%3D0%2C%20active_customers%3D0%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20rev_entry%3D0%2C%20rev_bb%3D0%2C%20rev_exp%3D0%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cogs_entry%3D0%2C%20cogs_bb%3D0%2C%20cogs_exp%3D0%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20units_base%3D0%2C%20units_sp%3D0%2C%20units_bb%3D0%2C%20units_exp%3D0))%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20months_since%20%3D%20month%20-%20m%5B%22launch%22%5D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Viral%20bell-curve%3A%20exponential%20ramp%20%E2%86%92%20peak%20%E2%86%92%20exponential%20decay%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20months_since%20%3C%3D%20m%5B%22peak_month%22%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20acq%20%3D%20monthly_acq_yr1%20*%20((1%20%2B%20m%5B%22pre_peak_mom%22%5D)%20**%20(months_since%20-%201))%0A%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20peak_acq%20%3D%20monthly_acq_yr1%20*%20((1%20%2B%20m%5B%22pre_peak_mom%22%5D)%20**%20(m%5B%22peak_month%22%5D%20-%201))%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20acq%20%3D%20peak_acq%20*%20((1%20-%20m%5B%22post_decay%22%5D)%20**%20(months_since%20-%20m%5B%22peak_month%22%5D))%0A%20%20%20%20%20%20%20%20%20%20%20%20acq%20%2B%3D%20active%20*%20(wom_annual%20%2F%2012)%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20SAM%20cap%3A%20grows%20to%20peak%2C%20then%20shrinks%20at%20post_decay%20rate%20so%20active%20customers%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20follow%20a%20bell-curve%20shape%20rather%20than%20plateauing%20at%20the%20ceiling.%0A%20%20%20%20%20%20%20%20%20%20%20%20sam_cap_players%20%3D%20sam_pop%20*%20m%5B%22peak_som_cap%22%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20months_since%20%3E%20m%5B%22peak_month%22%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20sam_cap_players%20*%3D%20(1%20-%20m%5B%22post_decay%22%5D)%20**%20(months_since%20-%20m%5B%22peak_month%22%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20acq%20%3D%20min(acq%2C%20max(0.0%2C%20sam_cap_players%20-%20active%20*%20(1%20-%20monthly_churn)))%0A%20%20%20%20%20%20%20%20%20%20%20%20active%20%3D%20active%20*%20(1%20-%20monthly_churn)%20%2B%20acq%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20rev_entry%20%20%3D%20acq%20%20%20%20*%20(base_pct%20*%20np_base%20%2B%20starter_pct%20*%20np_sp)%0A%20%20%20%20%20%20%20%20%20%20%20%20cogs_entry%20%3D%20acq%20%20%20%20*%20(base_pct%20*%20(np_base%20-%20gm_base)%20%2B%20starter_pct%20*%20(np_sp%20-%20gm_sp))%0A%20%20%20%20%20%20%20%20%20%20%20%20rev_bb%20%20%20%20%20%3D%20active%20*%20bb_pm%20%20*%20np_bb%20%20*%20_ltv_scale%0A%20%20%20%20%20%20%20%20%20%20%20%20cogs_bb%20%20%20%20%3D%20active%20*%20bb_pm%20%20*%20(np_bb%20%20-%20gm_bb)%20%20*%20_ltv_scale%0A%20%20%20%20%20%20%20%20%20%20%20%20rev_exp%20%20%20%20%3D%20active%20*%20exp_pm%20*%20np_exp%20%20*%20_ltv_scale%0A%20%20%20%20%20%20%20%20%20%20%20%20cogs_exp%20%20%20%3D%20active%20*%20exp_pm%20*%20(np_exp%20-%20gm_exp)%20*%20_ltv_scale%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20_rows.append(dict(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20month%3Dmonth%2C%20market%3Dm%5B%22name%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20new_customers%3Dacq%2C%20active_customers%3Dactive%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20rev_entry%3Drev_entry%2C%20rev_bb%3Drev_bb%2C%20rev_exp%3Drev_exp%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cogs_entry%3Dcogs_entry%2C%20cogs_bb%3Dcogs_bb%2C%20cogs_exp%3Dcogs_exp%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20units_base%3Dacq%20*%20base_pct%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20units_sp%3Dacq%20*%20starter_pct%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20units_bb%3Dactive%20*%20bb_pm%20%20*%20_ltv_scale%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20units_exp%3Dactive%20*%20exp_pm%20*%20_ltv_scale%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20))%0A%0A%20%20%20%20df%20%3D%20pd.DataFrame(_rows)%0A%20%20%20%20df%5B%22revenue%22%5D%20%20%20%20%20%20%3D%20df%5B%22rev_entry%22%5D%20%2B%20df%5B%22rev_bb%22%5D%20%2B%20df%5B%22rev_exp%22%5D%0A%20%20%20%20df%5B%22cogs%22%5D%20%20%20%20%20%20%20%20%20%3D%20df%5B%22cogs_entry%22%5D%20%2B%20df%5B%22cogs_bb%22%5D%20%2B%20df%5B%22cogs_exp%22%5D%0A%20%20%20%20df%5B%22gross_profit%22%5D%20%3D%20df%5B%22revenue%22%5D%20-%20df%5B%22cogs%22%5D%0A%0A%20%20%20%20upfront%20%20%20%3D%20ui_design_cost.value%20%2B%20ui_brand_cost.value%20%2B%20ui_gtm_cost.value%0A%20%20%20%20opex_rows%20%3D%20%5B%5D%0A%20%20%20%20for%20month%20in%20MONTHS%3A%0A%20%20%20%20%20%20%20%20yr%20%20%20%20%20%3D%20(month%20-%201)%20%2F%2F%2012%0A%20%20%20%20%20%20%20%20growth%20%3D%20(1%20%2B%20ui_opex_growth.value%20%2F%20100)%20**%20yr%0A%20%20%20%20%20%20%20%20opex_rows.append(dict(%0A%20%20%20%20%20%20%20%20%20%20%20%20month%3Dmonth%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20marketing%3Dui_monthly_marketing.value%20*%20growth%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20operations%3Dui_monthly_ops.value%20*%20growth%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20upfront%3Dupfront%20if%20month%20%3D%3D%201%20else%200.0%2C%0A%20%20%20%20%20%20%20%20))%0A%20%20%20%20opex_df%20%3D%20pd.DataFrame(opex_rows)%0A%0A%20%20%20%20agg%20%3D%20df.groupby(%22month%22)%5B%5B%22revenue%22%2C%20%22cogs%22%2C%20%22gross_profit%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22rev_entry%22%2C%20%22rev_bb%22%2C%20%22rev_exp%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22new_customers%22%2C%20%22active_customers%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22units_base%22%2C%20%22units_sp%22%2C%20%22units_bb%22%2C%20%22units_exp%22%5D%5D.sum().reset_index()%0A%20%20%20%20agg%20%3D%20agg.merge(opex_df%2C%20on%3D%22month%22)%0A%20%20%20%20agg%5B%22total_opex%22%5D%20%20%3D%20agg%5B%22marketing%22%5D%20%2B%20agg%5B%22operations%22%5D%20%2B%20agg%5B%22upfront%22%5D%0A%20%20%20%20_retail_split%20%3D%20ui_retail_pct.value%20%2F%20100%0A%20%20%20%20_dtc_split%20%20%20%20%3D%201%20-%20_retail_split%0A%20%20%20%20_fulfill_rate%20%3D%20(_retail_split%20*%20ui_fulfill_retail_pct.value%20%2B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20_dtc_split%20%20%20*%20ui_fulfill_dtc_pct.value)%20%2F%20100%0A%20%20%20%20agg%5B%22fulfillment%22%5D%20%3D%20agg%5B%22revenue%22%5D%20*%20_fulfill_rate%0A%20%20%20%20agg%5B%22ebitda%22%5D%20%20%20%20%20%20%3D%20agg%5B%22gross_profit%22%5D%20-%20agg%5B%22total_opex%22%5D%20-%20agg%5B%22fulfillment%22%5D%0A%20%20%20%20agg%5B%22ebitda_cum%22%5D%20%20%3D%20agg%5B%22ebitda%22%5D.cumsum()%0A%20%20%20%20agg%5B%22year%22%5D%20%20%20%20%20%20%20%20%3D%20((agg%5B%22month%22%5D%20-%201)%20%2F%2F%2012%20%2B%201)%0A%20%20%20%20return%20agg%2C%20df%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_annual_summary(agg)%3A%0A%20%20%20%20annual%20%3D%20(%0A%20%20%20%20%20%20%20%20agg.groupby(%22year%22)%0A%20%20%20%20%20%20%20%20.agg(%0A%20%20%20%20%20%20%20%20%20%20%20%20Revenue%3D(%22revenue%22%2C%20%22sum%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20COGS%3D(%22cogs%22%2C%20%22sum%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20Gross_Profit%3D(%22gross_profit%22%2C%20%22sum%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20Marketing%3D(%22marketing%22%2C%20%22sum%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20Operations%3D(%22operations%22%2C%20%22sum%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20Upfront%3D(%22upfront%22%2C%20%22sum%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20Fulfillment%3D(%22fulfillment%22%2C%20%22sum%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20EBITDA%3D(%22ebitda%22%2C%20%22sum%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20New_Customers%3D(%22new_customers%22%2C%20%22sum%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20Units_Base%3D(%22units_base%22%2C%20%22sum%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20Units_SP%3D(%22units_sp%22%2C%20%22sum%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20Units_BB%3D(%22units_bb%22%2C%20%22sum%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20Units_Exp%3D(%22units_exp%22%2C%20%22sum%22)%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20.reset_index()%0A%20%20%20%20)%0A%20%20%20%20annual%5B%22Gross_Margin_%25%22%5D%20%20%3D%20(annual%5B%22Gross_Profit%22%5D%20%2F%20annual%5B%22Revenue%22%5D%20*%20100).round(1)%0A%20%20%20%20annual%5B%22EBITDA_Margin_%25%22%5D%20%3D%20(annual%5B%22EBITDA%22%5D%20%20%20%20%20%20%20%2F%20annual%5B%22Revenue%22%5D%20*%20100).round(1)%0A%20%20%20%20annual%5B%22Cum_EBITDA%22%5D%20%20%20%20%20%20%3D%20annual%5B%22EBITDA%22%5D.cumsum()%0A%20%20%20%20return%20(annual%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_kpi_cards(agg%2C%20annual%2C%20mo)%3A%0A%20%20%20%20def%20_fv(v)%3A%0A%20%20%20%20%20%20%20%20if%20abs(v)%20%3E%3D%201e6%3A%20return%20f%22%24%7Bv%2F1e6%3A%2C.1f%7DM%22%0A%20%20%20%20%20%20%20%20if%20abs(v)%20%3E%3D%201e3%3A%20return%20f%22%24%7Bv%2F1e3%3A%2C.0f%7DK%22%0A%20%20%20%20%20%20%20%20return%20f%22%24%7Bv%3A%2C.0f%7D%22%0A%0A%20%20%20%20total_rev%20%20%20%20%3D%20annual%5B%22Revenue%22%5D.sum()%0A%20%20%20%20total_ebitda%20%3D%20annual%5B%22EBITDA%22%5D.sum()%0A%20%20%20%20peak_cust%20%20%20%20%3D%20agg%5B%22active_customers%22%5D.max()%0A%20%20%20%20yr5_rev%20%20%20%20%20%20%3D%20annual.loc%5Bannual%5B%22year%22%5D%20%3D%3D%205%2C%20%22Revenue%22%5D.values%5B0%5D%0A%0A%20%20%20%20be_df%20%20%20%20%3D%20agg%5Bagg%5B%22ebitda_cum%22%5D%20%3E%3D%200%5D%0A%20%20%20%20be_month%20%3D%20int(be_df%5B%22month%22%5D.min())%20if%20len(be_df)%20%3E%200%20else%20None%0A%20%20%20%20be_str%20%20%20%3D%20f%22Month%20%7Bbe_month%7D%22%20if%20be_month%20else%20%22Not%20in%20model%22%0A%0A%20%20%20%20kpi_row%20%3D%20mo.hstack(%5B%0A%20%20%20%20%20%20%20%20mo.stat(_fv(total_rev)%2C%20%20%20%20%20%20%20%225-Year%20Revenue%22%2C%20%20%20%20%20%20%20%20caption%3D%22all%20markets%20combined%22)%2C%0A%20%20%20%20%20%20%20%20mo.stat(_fv(total_ebitda)%2C%20%20%20%20%225-Year%20EBITDA%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20direction%3D%22increase%22%20if%20total_ebitda%20%3E%3D%200%20else%20%22decrease%22)%2C%0A%20%20%20%20%20%20%20%20mo.stat(f%22%7Bint(peak_cust)%3A%2C%7D%22%2C%20%22Peak%20Active%20Customers%22%2C%20caption%3D%22across%20all%20markets%22)%2C%0A%20%20%20%20%20%20%20%20mo.stat(be_str%2C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Break-Even%22%2C%20%20%20%20%20%20%20%20%20%20%20%20caption%3D%22cumulative%20EBITDA%20%E2%89%A5%200%22)%2C%0A%20%20%20%20%20%20%20%20mo.stat(_fv(yr5_rev)%2C%20%20%20%20%20%20%20%20%20%22Year%205%20Revenue%22%2C%20%20%20%20%20%20%20%20caption%3D%22annual%20run-rate%22)%2C%0A%20%20%20%20%5D%2C%20justify%3D%22space-around%22%2C%20gap%3D%221rem%22)%0A%20%20%20%20return%20(kpi_row%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_sku_table(%0A%20%20%20%20exp_avg_msrp%2C%0A%20%20%20%20gm_base%2C%0A%20%20%20%20gm_bb%2C%0A%20%20%20%20gm_exp%2C%0A%20%20%20%20gm_sp%2C%0A%20%20%20%20mo%2C%0A%20%20%20%20np_base%2C%0A%20%20%20%20np_bb%2C%0A%20%20%20%20np_exp%2C%0A%20%20%20%20np_sp%2C%0A%20%20%20%20ui_base_cogs%2C%0A%20%20%20%20ui_base_price%2C%0A%20%20%20%20ui_bb_cogs%2C%0A%20%20%20%20ui_bb_price%2C%0A%20%20%20%20ui_exp_cogs%2C%0A%20%20%20%20ui_fulfill_dtc_pct%2C%0A%20%20%20%20ui_fulfill_retail_pct%2C%0A%20%20%20%20ui_retail_pct%2C%0A%20%20%20%20ui_retailer_margin%2C%0A%20%20%20%20ui_sp_cogs%2C%0A%20%20%20%20ui_sp_price%2C%0A)%3A%0A%20%20%20%20_r_split%20%20%3D%20ui_retail_pct.value%20%2F%20100%0A%20%20%20%20_fulfill%20%20%3D%20(_r_split%20*%20ui_fulfill_retail_pct.value%20%2B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20(1%20-%20_r_split)%20*%20ui_fulfill_dtc_pct.value)%20%2F%20100%0A%0A%20%20%20%20def%20_np(gm%2C%20np_)%3A%20return%20gm%20-%20_fulfill%20*%20np_%20%20%20%23%20net%20profit%20per%20unit%0A%0A%20%20%20%20np_base_net%20%3D%20_np(gm_base%2C%20np_base)%0A%20%20%20%20np_sp_net%20%20%20%3D%20_np(gm_sp%2C%20%20%20np_sp)%0A%20%20%20%20np_bb_net%20%20%20%3D%20_np(gm_bb%2C%20%20%20np_bb)%0A%20%20%20%20np_exp_net%20%20%3D%20_np(gm_exp%2C%20%20np_exp)%0A%0A%20%20%20%20sku_rows%20%3D%20%5B%0A%20%20%20%20%20%20%20%20%7B%22SKU%22%3A%20%22%F0%9F%83%8F%20Base%20Unit%22%2C%20%20%20%20%20%20%20%20%22MSRP%22%3A%20f%22%24%7Bui_base_price.value%7D%22%2C%0A%20%20%20%20%20%20%20%20%20%22Net%20Revenue%22%3A%20f%22%24%7Bnp_base%3A.2f%7D%22%2C%20%22COGS%22%3A%20f%22%24%7Bui_base_cogs.value%7D%22%2C%0A%20%20%20%20%20%20%20%20%20%22Gross%20Profit%22%3A%20f%22%24%7Bgm_base%3A.2f%7D%22%2C%20%22GM%20%25%22%3A%20f%22%7Bgm_base%2Fnp_base*100%3A.1f%7D%25%22%2C%0A%20%20%20%20%20%20%20%20%20%22Fulfillment%22%3A%20f%22%24%7B_fulfill*np_base%3A.2f%7D%22%2C%0A%20%20%20%20%20%20%20%20%20%22Net%20Profit%22%3A%20f%22%24%7Bnp_base_net%3A.2f%7D%22%2C%20%22Net%20Margin%22%3A%20f%22%7Bnp_base_net%2Fnp_base*100%3A.1f%7D%25%22%7D%2C%0A%20%20%20%20%20%20%20%20%7B%22SKU%22%3A%20%22%F0%9F%93%A6%20Starter%20Pack%22%2C%20%20%20%20%20%22MSRP%22%3A%20f%22%24%7Bui_sp_price.value%7D%22%2C%0A%20%20%20%20%20%20%20%20%20%22Net%20Revenue%22%3A%20f%22%24%7Bnp_sp%3A.2f%7D%22%2C%20%20%20%22COGS%22%3A%20f%22%24%7Bui_sp_cogs.value%7D%22%2C%0A%20%20%20%20%20%20%20%20%20%22Gross%20Profit%22%3A%20f%22%24%7Bgm_sp%3A.2f%7D%22%2C%20%20%22GM%20%25%22%3A%20f%22%7Bgm_sp%2Fnp_sp*100%3A.1f%7D%25%22%2C%0A%20%20%20%20%20%20%20%20%20%22Fulfillment%22%3A%20f%22%24%7B_fulfill*np_sp%3A.2f%7D%22%2C%0A%20%20%20%20%20%20%20%20%20%22Net%20Profit%22%3A%20f%22%24%7Bnp_sp_net%3A.2f%7D%22%2C%20%22Net%20Margin%22%3A%20f%22%7Bnp_sp_net%2Fnp_sp*100%3A.1f%7D%25%22%7D%2C%0A%20%20%20%20%20%20%20%20%7B%22SKU%22%3A%20%22%F0%9F%8E%81%20Blind%20Box%22%2C%20%20%20%20%20%20%20%20%22MSRP%22%3A%20f%22%24%7Bui_bb_price.value%7D%22%2C%0A%20%20%20%20%20%20%20%20%20%22Net%20Revenue%22%3A%20f%22%24%7Bnp_bb%3A.2f%7D%22%2C%20%20%20%22COGS%22%3A%20f%22%24%7Bui_bb_cogs.value%7D%22%2C%0A%20%20%20%20%20%20%20%20%20%22Gross%20Profit%22%3A%20f%22%24%7Bgm_bb%3A.2f%7D%22%2C%20%20%22GM%20%25%22%3A%20f%22%7Bgm_bb%2Fnp_bb*100%3A.1f%7D%25%22%2C%0A%20%20%20%20%20%20%20%20%20%22Fulfillment%22%3A%20f%22%24%7B_fulfill*np_bb%3A.2f%7D%22%2C%0A%20%20%20%20%20%20%20%20%20%22Net%20Profit%22%3A%20f%22%24%7Bnp_bb_net%3A.2f%7D%22%2C%20%22Net%20Margin%22%3A%20f%22%7Bnp_bb_net%2Fnp_bb*100%3A.1f%7D%25%22%7D%2C%0A%20%20%20%20%20%20%20%20%7B%22SKU%22%3A%20%22%F0%9F%97%82%20Expansion%20(avg)%22%2C%20%22MSRP%22%3A%20f%22%24%7Bexp_avg_msrp%3A.2f%7D%22%2C%0A%20%20%20%20%20%20%20%20%20%22Net%20Revenue%22%3A%20f%22%24%7Bnp_exp%3A.2f%7D%22%2C%20%20%22COGS%22%3A%20f%22%24%7Bui_exp_cogs.value%7D%22%2C%0A%20%20%20%20%20%20%20%20%20%22Gross%20Profit%22%3A%20f%22%24%7Bgm_exp%3A.2f%7D%22%2C%20%22GM%20%25%22%3A%20f%22%7Bgm_exp%2Fnp_exp*100%3A.1f%7D%25%22%2C%0A%20%20%20%20%20%20%20%20%20%22Fulfillment%22%3A%20f%22%24%7B_fulfill*np_exp%3A.2f%7D%22%2C%0A%20%20%20%20%20%20%20%20%20%22Net%20Profit%22%3A%20f%22%24%7Bnp_exp_net%3A.2f%7D%22%2C%20%22Net%20Margin%22%3A%20f%22%7Bnp_exp_net%2Fnp_exp*100%3A.1f%7D%25%22%7D%2C%0A%20%20%20%20%5D%0A%20%20%20%20sku_table%20%3D%20mo.ui.table(sku_rows%2C%20selection%3DNone)%0A%20%20%20%20dist_note%20%3D%20mo.callout(%0A%20%20%20%20%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20%20%20%20%20f%22Channel%20split%3A%20**%7Bui_retail_pct.value%7D%25**%20retail%20%22%0A%20%20%20%20%20%20%20%20%20%20%20%20f%22(retailer%20takes%20**%7Bui_retailer_margin.value%7D%25**%20margin)%20%C2%B7%20%22%0A%20%20%20%20%20%20%20%20%20%20%20%20f%22**%7B100%20-%20ui_retail_pct.value%7D%25**%20direct-to-consumer%22%0A%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20kind%3D%22neutral%22%2C%0A%20%20%20%20)%0A%20%20%20%20return%20dist_note%2C%20sku_table%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_charts(agg%2C%20alt%2C%20df%2C%20mo)%3A%0A%20%20%20%20%23%20Revenue%20streams%20stacked%20area%0A%20%20%20%20rev_long%20%3D%20(%0A%20%20%20%20%20%20%20%20agg%5B%5B%22month%22%2C%20%22rev_entry%22%2C%20%22rev_bb%22%2C%20%22rev_exp%22%5D%5D%0A%20%20%20%20%20%20%20%20.rename(columns%3D%7B%22rev_entry%22%3A%20%22Entry%20Sales%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22rev_bb%22%3A%20%20%20%20%22Blind%20Boxes%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22rev_exp%22%3A%20%20%20%22Expansion%20Sets%22%7D)%0A%20%20%20%20%20%20%20%20.melt(%22month%22%2C%20var_name%3D%22Stream%22%2C%20value_name%3D%22Revenue%20(%24)%22)%0A%20%20%20%20)%0A%20%20%20%20chart_rev%20%3D%20(%0A%20%20%20%20%20%20%20%20alt.Chart(rev_long)%0A%20%20%20%20%20%20%20%20.mark_area(opacity%3D0.85)%0A%20%20%20%20%20%20%20%20.encode(%0A%20%20%20%20%20%20%20%20%20%20%20%20x%3Dalt.X(%22month%3AQ%22%2C%20title%3D%22Month%22%2C%20axis%3Dalt.Axis(grid%3DFalse))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20y%3Dalt.Y(%22Revenue%20(%24)%3AQ%22%2C%20title%3D%22Monthly%20Revenue%20(%24)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stack%3D%22zero%22%2C%20axis%3Dalt.Axis(format%3D%22%24%2C.0f%22))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20color%3Dalt.Color(%22Stream%3AN%22%2C%20scale%3Dalt.Scale(scheme%3D%22tableau10%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20legend%3Dalt.Legend(orient%3D%22top%22))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20tooltip%3D%5B%22month%3AQ%22%2C%20%22Stream%3AN%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alt.Tooltip(%22Revenue%20(%24)%3AQ%22%2C%20format%3D%22%24%2C.0f%22)%5D%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20.properties(title%3Dalt.Title(%22Monthly%20Revenue%20by%20Stream%22%2C%20fontSize%3D14)%2C%20height%3D300)%0A%20%20%20%20)%0A%0A%20%20%20%20%23%20Monthly%20EBITDA%20line%20%2B%20zero%20rule%0A%20%20%20%20chart_ebitda%20%3D%20(%0A%20%20%20%20%20%20%20%20alt.Chart(agg)%0A%20%20%20%20%20%20%20%20.mark_line(color%3D%22%236366f1%22%2C%20strokeWidth%3D2.5)%0A%20%20%20%20%20%20%20%20.encode(%0A%20%20%20%20%20%20%20%20%20%20%20%20x%3Dalt.X(%22month%3AQ%22%2C%20title%3D%22Month%22%2C%20axis%3Dalt.Axis(grid%3DFalse))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20y%3Dalt.Y(%22ebitda%3AQ%22%2C%20title%3D%22EBITDA%20(%24)%22%2C%20axis%3Dalt.Axis(format%3D%22%24%2C.0f%22))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20tooltip%3D%5B%22month%3AQ%22%2C%20alt.Tooltip(%22ebitda%3AQ%22%2C%20format%3D%22%24%2C.0f%22%2C%20title%3D%22EBITDA%22)%5D%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20.properties(title%3Dalt.Title(%22Monthly%20EBITDA%22%2C%20fontSize%3D14)%2C%20height%3D280)%0A%20%20%20%20)%20%2B%20alt.Chart(agg).mark_rule(color%3D%22%23ef4444%22%2C%20strokeDash%3D%5B4%2C%203%5D).encode(y%3Dalt.datum(0))%0A%0A%20%20%20%20%23%20Cumulative%20EBITDA%20payback%20curve%0A%20%20%20%20base_cum%20%3D%20alt.Chart(agg)%0A%20%20%20%20chart_cum%20%3D%20(%0A%20%20%20%20%20%20%20%20base_cum.mark_area(color%3D%22%236366f1%22%2C%20opacity%3D0.2)%0A%20%20%20%20%20%20%20%20.encode(x%3D%22month%3AQ%22%2C%20y%3D%22ebitda_cum%3AQ%22)%0A%20%20%20%20)%20%2B%20(%0A%20%20%20%20%20%20%20%20base_cum.mark_line(color%3D%22%236366f1%22%2C%20strokeWidth%3D2.5)%0A%20%20%20%20%20%20%20%20.encode(%0A%20%20%20%20%20%20%20%20%20%20%20%20x%3Dalt.X(%22month%3AQ%22%2C%20title%3D%22Month%22%2C%20axis%3Dalt.Axis(grid%3DFalse))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20y%3Dalt.Y(%22ebitda_cum%3AQ%22%2C%20title%3D%22Cumulative%20EBITDA%20(%24)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20axis%3Dalt.Axis(format%3D%22%24%2C.0f%22))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20tooltip%3D%5B%22month%3AQ%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alt.Tooltip(%22ebitda_cum%3AQ%22%2C%20format%3D%22%24%2C.0f%22%2C%20title%3D%22Cumul.%20EBITDA%22)%5D%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20)%20%2B%20base_cum.mark_rule(color%3D%22%23ef4444%22%2C%20strokeDash%3D%5B4%2C%203%5D).encode(y%3Dalt.datum(0))%0A%20%20%20%20chart_cum%20%3D%20chart_cum.properties(%0A%20%20%20%20%20%20%20%20title%3Dalt.Title(%22Cumulative%20EBITDA%20%E2%80%94%20Payback%20Curve%22%2C%20fontSize%3D14)%2C%20height%3D280%0A%20%20%20%20)%0A%0A%20%20%20%20%23%20Active%20customers%20by%20market%0A%20%20%20%20chart_cust%20%3D%20(%0A%20%20%20%20%20%20%20%20alt.Chart(df)%0A%20%20%20%20%20%20%20%20.mark_area(opacity%3D0.75)%0A%20%20%20%20%20%20%20%20.encode(%0A%20%20%20%20%20%20%20%20%20%20%20%20x%3Dalt.X(%22month%3AQ%22%2C%20title%3D%22Month%22%2C%20axis%3Dalt.Axis(grid%3DFalse))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20y%3Dalt.Y(%22active_customers%3AQ%22%2C%20title%3D%22Active%20Customers%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stack%3D%22zero%22%2C%20axis%3Dalt.Axis(format%3D%22%2C.0f%22))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20color%3Dalt.Color(%22market%3AN%22%2C%20scale%3Dalt.Scale(scheme%3D%22set2%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20legend%3Dalt.Legend(orient%3D%22top%22))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20tooltip%3D%5B%22month%3AQ%22%2C%20%22market%3AN%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alt.Tooltip(%22active_customers%3AQ%22%2C%20format%3D%22%2C.0f%22)%5D%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20.properties(title%3Dalt.Title(%22Active%20Customers%20by%20Market%22%2C%20fontSize%3D14)%2C%20height%3D280)%0A%20%20%20%20)%0A%0A%20%20%20%20%23%20Revenue%20by%20market%0A%20%20%20%20mkt_rev%20%3D%20df.groupby(%5B%22month%22%2C%20%22market%22%5D)%5B%22revenue%22%5D.sum().reset_index()%0A%20%20%20%20chart_mkt%20%3D%20(%0A%20%20%20%20%20%20%20%20alt.Chart(mkt_rev)%0A%20%20%20%20%20%20%20%20.mark_area(opacity%3D0.75)%0A%20%20%20%20%20%20%20%20.encode(%0A%20%20%20%20%20%20%20%20%20%20%20%20x%3Dalt.X(%22month%3AQ%22%2C%20title%3D%22Month%22%2C%20axis%3Dalt.Axis(grid%3DFalse))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20y%3Dalt.Y(%22revenue%3AQ%22%2C%20title%3D%22Revenue%20(%24)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stack%3D%22zero%22%2C%20axis%3Dalt.Axis(format%3D%22%24%2C.0f%22))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20color%3Dalt.Color(%22market%3AN%22%2C%20scale%3Dalt.Scale(scheme%3D%22set2%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20legend%3Dalt.Legend(orient%3D%22top%22))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20tooltip%3D%5B%22month%3AQ%22%2C%20%22market%3AN%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alt.Tooltip(%22revenue%3AQ%22%2C%20format%3D%22%24%2C.0f%22)%5D%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20.properties(title%3Dalt.Title(%22Revenue%20by%20Market%22%2C%20fontSize%3D14)%2C%20height%3D280)%0A%20%20%20%20)%0A%0A%20%20%20%20%23%20Annual%20P%26L%20grouped%20bar%0A%20%20%20%20pnl_long%20%3D%20(%0A%20%20%20%20%20%20%20%20agg.groupby(%22year%22)%0A%20%20%20%20%20%20%20%20.agg(Revenue%3D(%22revenue%22%2C%20%22sum%22)%2C%20COGS%3D(%22cogs%22%2C%20%22sum%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20Marketing%3D(%22marketing%22%2C%20%22sum%22)%2C%20Operations%3D(%22operations%22%2C%20%22sum%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20Fulfillment%3D(%22fulfillment%22%2C%20%22sum%22))%0A%20%20%20%20%20%20%20%20.reset_index()%0A%20%20%20%20%20%20%20%20.melt(%22year%22%2C%20var_name%3D%22Line%22%2C%20value_name%3D%22Amount%20(%24)%22)%0A%20%20%20%20)%0A%20%20%20%20chart_pnl%20%3D%20(%0A%20%20%20%20%20%20%20%20alt.Chart(pnl_long)%0A%20%20%20%20%20%20%20%20.mark_bar()%0A%20%20%20%20%20%20%20%20.encode(%0A%20%20%20%20%20%20%20%20%20%20%20%20x%3Dalt.X(%22year%3AO%22%2C%20title%3D%22Year%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20y%3Dalt.Y(%22Amount%20(%24)%3AQ%22%2C%20stack%3D%22zero%22%2C%20axis%3Dalt.Axis(format%3D%22%24%2C.0f%22))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20color%3Dalt.Color(%22Line%3AN%22%2C%20scale%3Dalt.Scale(scheme%3D%22tableau10%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20legend%3Dalt.Legend(orient%3D%22top%22))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20tooltip%3D%5B%22year%3AO%22%2C%20%22Line%3AN%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alt.Tooltip(%22Amount%20(%24)%3AQ%22%2C%20format%3D%22%24%2C.0f%22)%5D%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20.properties(title%3Dalt.Title(%22Annual%20P%26L%20Breakdown%22%2C%20fontSize%3D14)%2C%20height%3D280)%0A%20%20%20%20)%0A%0A%20%20%20%20charts_tab%20%3D%20mo.ui.tabs(%7B%0A%20%20%20%20%20%20%20%20%22%F0%9F%93%88%20Revenue%20Streams%22%3A%20%20%20mo.ui.altair_chart(chart_rev)%2C%0A%20%20%20%20%20%20%20%20%22%F0%9F%92%B9%20EBITDA%22%3A%20%20%20%20%20%20%20%20%20%20%20%20mo.ui.altair_chart(chart_ebitda)%2C%0A%20%20%20%20%20%20%20%20%22%F0%9F%93%89%20Payback%20Curve%22%3A%20%20%20%20%20mo.ui.altair_chart(chart_cum)%2C%0A%20%20%20%20%20%20%20%20%22%F0%9F%91%A5%20Customers%22%3A%20%20%20%20%20%20%20%20%20mo.ui.altair_chart(chart_cust)%2C%0A%20%20%20%20%20%20%20%20%22%F0%9F%8C%8F%20Revenue%20by%20Market%22%3A%20mo.ui.altair_chart(chart_mkt)%2C%0A%20%20%20%20%20%20%20%20%22%F0%9F%93%8A%20Annual%20P%26L%22%3A%20%20%20%20%20%20%20%20mo.ui.altair_chart(chart_pnl)%2C%0A%20%20%20%20%7D)%0A%20%20%20%20return%20(charts_tab%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_annual_table(agg%2C%20annual%2C%20mo)%3A%0A%20%20%20%20def%20_f(v)%3A%0A%20%20%20%20%20%20%20%20neg%20%3D%20v%20%3C%200%0A%20%20%20%20%20%20%20%20a%20%20%20%3D%20abs(v)%0A%20%20%20%20%20%20%20%20if%20a%20%3E%3D%201e6%3A%20%20%20s%20%3D%20f%22%24%7Ba%2F1e6%3A%2C.2f%7DM%22%0A%20%20%20%20%20%20%20%20elif%20a%20%3E%3D%201e3%3A%20s%20%3D%20f%22%24%7Ba%2F1e3%3A%2C.1f%7DK%22%0A%20%20%20%20%20%20%20%20else%3A%20%20%20%20%20%20%20%20%20%20s%20%3D%20f%22%24%7Ba%3A%2C.0f%7D%22%0A%20%20%20%20%20%20%20%20return%20f%22(%7Bs%7D)%22%20if%20neg%20else%20s%0A%0A%20%20%20%20_sections%20%3D%20%7B%7D%0A%20%20%20%20for%20_%2C%20_r%20in%20annual.iterrows()%3A%0A%20%20%20%20%20%20%20%20_yr%20%3D%20int(_r%5B%22year%22%5D)%0A%20%20%20%20%20%20%20%20_gm%20%3D%20f%22%7B_r%5B'Gross_Margin_%25'%5D%3A.1f%7D%25%22%0A%20%20%20%20%20%20%20%20_em%20%3D%20f%22%7B_r%5B'EBITDA_Margin_%25'%5D%3A.1f%7D%25%22%0A%20%20%20%20%20%20%20%20_title%20%3D%20(f%22Year%20%7B_yr%7D%20%20%E2%80%94%20%20Revenue%3A%20%7B_f(_r%5B'Revenue'%5D)%7D%20%20%7C%20%20%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22EBITDA%3A%20%7B_f(_r%5B'EBITDA'%5D)%7D%20(%7B_em%7D)%20%20%7C%20%20%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22GM%3A%20%7B_gm%7D%20%20%7C%20%20New%20Customers%3A%20%7Bint(_r%5B'New_Customers'%5D)%3A%2C%7D%22)%0A%0A%20%20%20%20%20%20%20%20_monthly%20%3D%20agg%5Bagg%5B%22year%22%5D%20%3D%3D%20_yr%5D%0A%20%20%20%20%20%20%20%20_mrows%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20for%20_%2C%20_m%20in%20_monthly.iterrows()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20_rev%20%3D%20_m%5B%22revenue%22%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20_gp%20%20%3D%20_m%5B%22gross_profit%22%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20_ebt%20%3D%20_m%5B%22ebitda%22%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20_gm_pct%20%3D%20(_gp%20%2F%20_rev%20*%20100)%20if%20_rev%20else%200%0A%20%20%20%20%20%20%20%20%20%20%20%20_em_pct%20%3D%20(_ebt%20%2F%20_rev%20*%20100)%20if%20_rev%20else%200%0A%20%20%20%20%20%20%20%20%20%20%20%20_mrows.append(%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Month%22%3A%20%20%20%20%20%20%20%20%20int(_m%5B%22month%22%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Revenue%22%3A%20%20%20%20%20%20%20_f(_rev)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22COGS%22%3A%20%20%20%20%20%20%20%20%20%20_f(_m%5B%22cogs%22%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Gross%20Profit%22%3A%20%20_f(_gp)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22GM%20%25%22%3A%20%20%20%20%20%20%20%20%20%20f%22%7B_gm_pct%3A.1f%7D%25%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Marketing%22%3A%20%20%20%20%20_f(_m%5B%22marketing%22%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Operations%22%3A%20%20%20%20_f(_m%5B%22operations%22%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Upfront%22%3A%20%20%20%20%20%20%20_f(_m%5B%22upfront%22%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Fulfillment%22%3A%20%20%20_f(_m%5B%22fulfillment%22%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22EBITDA%22%3A%20%20%20%20%20%20%20%20_f(_ebt)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22EBITDA%20%25%22%3A%20%20%20%20%20%20f%22%7B_em_pct%3A.1f%7D%25%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Cumul.%20EBITDA%22%3A%20_f(_m%5B%22ebitda_cum%22%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22New%20Customers%22%3A%20f%22%7Bint(_m%5B'new_customers'%5D)%3A%2C%7D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D)%0A%20%20%20%20%20%20%20%20_sections%5B_title%5D%20%3D%20mo.ui.table(_mrows%2C%20selection%3DNone)%0A%0A%20%20%20%20annual_table%20%3D%20mo.accordion(_sections)%0A%20%20%20%20return%20(annual_table%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_units_table(annual%2C%20mo)%3A%0A%20%20%20%20def%20_u(v)%3A%20return%20f%22%7Bint(v)%3A%2C%7D%22%0A%0A%20%20%20%20_rows%20%3D%20%5B%5D%0A%20%20%20%20for%20_%2C%20_r%20in%20annual.iterrows()%3A%0A%20%20%20%20%20%20%20%20_rows.append(%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Year%22%3A%20%20%20%20%20%20%20%20%20%20int(_r%5B%22year%22%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Base%20Units%22%3A%20%20%20%20_u(_r%5B%22Units_Base%22%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Starter%20Packs%22%3A%20_u(_r%5B%22Units_SP%22%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Blind%20Boxes%22%3A%20%20%20_u(_r%5B%22Units_BB%22%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Expansion%20Sets%22%3A_u(_r%5B%22Units_Exp%22%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Total%20Units%22%3A%20%20%20_u(_r%5B%22Units_Base%22%5D%20%2B%20_r%5B%22Units_SP%22%5D%20%2B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20_r%5B%22Units_BB%22%5D%20%20%20%2B%20_r%5B%22Units_Exp%22%5D)%2C%0A%20%20%20%20%20%20%20%20%7D)%0A%20%20%20%20_rows.append(%7B%0A%20%20%20%20%20%20%20%20%22Year%22%3A%20%20%20%20%20%20%20%20%20%20%22TOTAL%22%2C%0A%20%20%20%20%20%20%20%20%22Base%20Units%22%3A%20%20%20%20_u(annual%5B%22Units_Base%22%5D.sum())%2C%0A%20%20%20%20%20%20%20%20%22Starter%20Packs%22%3A%20_u(annual%5B%22Units_SP%22%5D.sum())%2C%0A%20%20%20%20%20%20%20%20%22Blind%20Boxes%22%3A%20%20%20_u(annual%5B%22Units_BB%22%5D.sum())%2C%0A%20%20%20%20%20%20%20%20%22Expansion%20Sets%22%3A_u(annual%5B%22Units_Exp%22%5D.sum())%2C%0A%20%20%20%20%20%20%20%20%22Total%20Units%22%3A%20%20%20_u(annual%5B%5B%22Units_Base%22%2C%22Units_SP%22%2C%22Units_BB%22%2C%22Units_Exp%22%5D%5D.sum().sum())%2C%0A%20%20%20%20%7D)%0A%20%20%20%20units_table%20%3D%20mo.ui.table(_rows%2C%20selection%3DNone)%0A%20%20%20%20return%20(units_table%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_layout(%0A%20%20%20%20annual_table%2C%0A%20%20%20%20assumptions%2C%0A%20%20%20%20charts_tab%2C%0A%20%20%20%20dist_note%2C%0A%20%20%20%20kpi_row%2C%0A%20%20%20%20mo%2C%0A%20%20%20%20sku_table%2C%0A%20%20%20%20tam_callout%2C%0A%20%20%20%20tam_table%2C%0A%20%20%20%20units_table%2C%0A)%3A%0A%20%20%20%20mo.vstack(%5B%0A%20%20%20%20%20%20%20%20mo.md(%22%23%20%F0%9F%8E%AE%20Stacker%20Game%20%E2%80%94%205-Year%20Financial%20Model%22)%2C%0A%20%20%20%20%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Edit%20any%20field%20below%20%E2%80%94%20every%20table%20and%20chart%20updates%20instantly.%20%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Losses%20shown%20in%20**(parentheses)**.%22%0A%20%20%20%20%20%20%20%20)%2C%0A%0A%20%20%20%20%20%20%20%20assumptions%2C%0A%0A%20%20%20%20%20%20%20%20mo.md(%22---%22)%2C%0A%20%20%20%20%20%20%20%20kpi_row%2C%0A%20%20%20%20%20%20%20%20mo.md(%22---%22)%2C%0A%0A%20%20%20%20%20%20%20%20mo.md(%22%23%23%20Market%20Sizing%20%E2%80%94%20TAM%20%2F%20SAM%20%2F%20SOM%22)%2C%0A%20%20%20%20%20%20%20%20tam_callout%2C%0A%20%20%20%20%20%20%20%20tam_table%2C%0A%0A%20%20%20%20%20%20%20%20mo.md(%22%23%23%20SKU%20Economics%22)%2C%0A%20%20%20%20%20%20%20%20dist_note%2C%0A%20%20%20%20%20%20%20%20sku_table%2C%0A%0A%20%20%20%20%20%20%20%20mo.md(%22%23%23%20Projections%22)%2C%0A%20%20%20%20%20%20%20%20charts_tab%2C%0A%0A%20%20%20%20%20%20%20%20mo.md(%22%23%23%20Annual%20P%26L%20Summary%22)%2C%0A%20%20%20%20%20%20%20%20annual_table%2C%0A%0A%20%20%20%20%20%20%20%20mo.md(%22%23%23%20Units%20Sold%20by%20SKU%22)%2C%0A%20%20%20%20%20%20%20%20units_table%2C%0A%20%20%20%20%5D%2C%20gap%3D%221rem%22)%0A%20%20%20%20return%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
ddd6753899b1d62cf5b24724f2cbfce7