FAILURE MAP
← Case archive

FA-59181 / Payroll withholding rules / Open access

Cumulative wages withholding method: annualization base · case 01

Employees on the cumulative method are withheld as if on the ordinary per-period method.

Verified by executionVariant 1 · 8 checks per implementationDownload source bundle ↓JSON ↗

ROOT CAUSE

Only the current paycheck is annualized, ignoring year-to-date wages and elapsed periods.

VERIFIED REPAIR

Restore the contract rule at the annualization base step: use `annual = Fraction(total * x['periods'], k)`.

Unsuccessful approach: The attempt includes year-to-date wages but treats their sum as the annual figure without annualizing.

Case contract

Input {ytd_wages, ytd_wh, wage, period_index k (1-based, includes this period), periods}. Annualized = (ytd_wages + wage)*periods/k exactly. Annual tax: 0% to 10,000.00, 12% to 40,000.00, 24% above. Tax to date = annual tax * k/periods. Withholding = max(0, tax_to_date - ytd_wh) rounded half-up at the end.

Why this case matters

The cumulative method spreads irregular pay across elapsed periods and trues up against prior withholding.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
from fractions import Fraction
import math
N = 1
observations = []
def solve(x):
    k = x['period_index']
    total = x['ytd_wages'] + x['wage']
    annual = Fraction(x['wage'] * x['periods'], 1)
    def tax(a):
        t = Fraction(0)
        if a > 1000000:
            t += (min(a, 4000000) - 1000000) * Fraction(12, 100)
        if a > 4000000:
            t += (a - 4000000) * Fraction(24, 100)
        return t
    due = tax(annual) * k / x['periods']
    wh = max(0, due - x['ytd_wh'])
    return math.floor(wh + Fraction(1, 2))
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression', {'ytd_wages': 7060061, 'ytd_wh': 424656, 'wage': 491569, 'period_index': 24, 'periods': 52}, 1110812), ('regression', {'ytd_wages': 2182615, 'ytd_wh': 379871, 'wage': 414670, 'period_index': 20, 'periods': 26}, 0), ('partial-repair probe', {'ytd_wages': 9590400, 'ytd_wh': 237513, 'wage': 534789, 'period_index': 22, 'periods': 26}, 1684840), ('partial-repair probe', {'ytd_wages': 8775450, 'ytd_wh': 1616919, 'wage': 334681, 'period_index': 24, 'periods': 26}, 15666), ('normal control', {'ytd_wages': 185427, 'ytd_wh': 36091, 'wage': 108159, 'period_index': 2, 'periods': 12}, 0), ('normal control', {'ytd_wages': 141603, 'ytd_wh': 11497, 'wage': 15563, 'period_index': 7, 'periods': 12}, 0), ('normal control', {'ytd_wages': 29165, 'ytd_wh': 3348, 'wage': 5167, 'period_index': 8, 'periods': 52}, 0), ('normal control', {'ytd_wages': 2675147, 'ytd_wh': 522064, 'wage': 171429, 'period_index': 26, 'periods': 26}, 0)], [('regression', {'ytd_wages': 9590400, 'ytd_wh': 237513, 'wage': 534789, 'period_index': 22, 'periods': 26}, 1684840), ('regression', {'ytd_wages': 3504142, 'ytd_wh': 423680, 'wage': 219362, 'period_index': 26, 'periods': 26}, 0), ('partial-repair probe', {'ytd_wages': 8775450, 'ytd_wh': 1616919, 'wage': 334681, 'period_index': 24, 'periods': 26}, 15666), ('partial-repair probe', {'ytd_wages': 6145936, 'ytd_wh': 219937, 'wage': 315568, 'period_index': 15, 'periods': 52}, 1157747), ('normal control', {'ytd_wages': 78474, 'ytd_wh': 12616, 'wage': 2681, 'period_index': 35, 'periods': 52}, 0), ('normal control', {'ytd_wages': 780083, 'ytd_wh': 115357, 'wage': 60520, 'period_index': 12, 'periods': 26}, 0), ('normal control', {'ytd_wages': 30504, 'ytd_wh': 1425, 'wage': 14017, 'period_index': 11, 'periods': 12}, 0), ('normal control', {'ytd_wages': 255421, 'ytd_wh': 47741, 'wage': 37513, 'period_index': 11, 'periods': 12}, 0)], [('regression', {'ytd_wages': 8775450, 'ytd_wh': 1616919, 'wage': 334681, 'period_index': 24, 'periods': 26}, 15666), ('regression', {'ytd_wages': 7060061, 'ytd_wh': 424656, 'wage': 491569, 'period_index': 24, 'periods': 52}, 1110812), ('partial-repair probe', {'ytd_wages': 0, 'ytd_wh': 1, 'wage': 366567, 'period_index': 1, 'periods': 12}, 37975), ('partial-repair probe', {'ytd_wages': 4585857, 'ytd_wh': 265867, 'wage': 360821, 'period_index': 12, 'periods': 26}, 644413), ('normal control', {'ytd_wages': 4101816, 'ytd_wh': 781382, 'wage': 93819, 'period_index': 46, 'periods': 52}, 0), ('normal control', {'ytd_wages': 1734664, 'ytd_wh': 216863, 'wage': 75980, 'period_index': 15, 'periods': 26}, 0), ('normal control', {'ytd_wages': 2864664, 'ytd_wh': 419863, 'wage': 94961, 'period_index': 20, 'periods': 26}, 0), ('normal control', {'ytd_wages': 430759, 'ytd_wh': 55675, 'wage': 54560, 'period_index': 5, 'periods': 12}, 0)], [('regression', {'ytd_wages': 6145936, 'ytd_wh': 219937, 'wage': 315568, 'period_index': 15, 'periods': 52}, 1157747), ('regression', {'ytd_wages': 9590400, 'ytd_wh': 237513, 'wage': 534789, 'period_index': 22, 'periods': 26}, 1684840), ('partial-repair probe', {'ytd_wages': 2724662, 'ytd_wh': 86701, 'wage': 332622, 'period_index': 7, 'periods': 52}, 566278), ('partial-repair probe', {'ytd_wages': 1665992, 'ytd_wh': 58323, 'wage': 387492, 'period_index': 4, 'periods': 12}, 234513), ('normal control', {'ytd_wages': 353147, 'ytd_wh': 9536, 'wage': 96030, 'period_index': 6, 'periods': 12}, 0), ('normal control', {'ytd_wages': 659564, 'ytd_wh': 7849, 'wage': 18236, 'period_index': 20, 'periods': 26}, 0), ('normal control', {'ytd_wages': 2446975, 'ytd_wh': 466368, 'wage': 202023, 'period_index': 12, 'periods': 12}, 0), ('normal control', {'ytd_wages': 152088, 'ytd_wh': 11592, 'wage': 17915, 'period_index': 8, 'periods': 26}, 0)], [('regression', {'ytd_wages': 4585857, 'ytd_wh': 265867, 'wage': 360821, 'period_index': 12, 'periods': 26}, 644413), ('regression', {'ytd_wages': 953768, 'ytd_wh': 32122, 'wage': 67782, 'period_index': 21, 'periods': 26}, 0), ('partial-repair probe', {'ytd_wages': 17382079, 'ytd_wh': 703861, 'wage': 564605, 'period_index': 25, 'periods': 52}, 3314882), ('partial-repair probe', {'ytd_wages': 7572146, 'ytd_wh': 1352041, 'wage': 228907, 'period_index': 18, 'periods': 52}, 312519), ('normal control', {'ytd_wages': 2303411, 'ytd_wh': 406780, 'wage': 112030, 'period_index': 23, 'periods': 26}, 0), ('normal control', {'ytd_wages': 288287, 'ytd_wh': 41455, 'wage': 26146, 'period_index': 26, 'periods': 26}, 0), ('normal control', {'ytd_wages': 102743, 'ytd_wh': 20507, 'wage': 5626, 'period_index': 12, 'periods': 12}, 0), ('normal control', {'ytd_wages': 1160977, 'ytd_wh': 199709, 'wage': 91537, 'period_index': 11, 'periods': 26}, 0)]]
for i, (label, args, expected) in enumerate(fixtures[N-1]):
    check("%s %d" % (label, i), solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
regression 021298581110812Failed
regression 111490070Failed
partial-repair probe 220784811684840Failed
partial-repair probe 3015666Failed
normal control 400Passed
normal control 500Passed
normal control 600Passed
normal control 700Passed

SHA-256 / 15d58b90574151d6611b6583614581977923551c4f18d1c7fe7dbd913cbca943

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
from fractions import Fraction
import math
N = 1
observations = []
def solve(x):
    k = x['period_index']
    total = x['ytd_wages'] + x['wage']
    annual = Fraction(total * x['periods'], x['periods'])
    def tax(a):
        t = Fraction(0)
        if a > 1000000:
            t += (min(a, 4000000) - 1000000) * Fraction(12, 100)
        if a > 4000000:
            t += (a - 4000000) * Fraction(24, 100)
        return t
    due = tax(annual) * k / x['periods']
    wh = max(0, due - x['ytd_wh'])
    return math.floor(wh + Fraction(1, 2))
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression', {'ytd_wages': 7060061, 'ytd_wh': 424656, 'wage': 491569, 'period_index': 24, 'periods': 52}, 1110812), ('regression', {'ytd_wages': 2182615, 'ytd_wh': 379871, 'wage': 414670, 'period_index': 20, 'periods': 26}, 0), ('partial-repair probe', {'ytd_wages': 9590400, 'ytd_wh': 237513, 'wage': 534789, 'period_index': 22, 'periods': 26}, 1684840), ('partial-repair probe', {'ytd_wages': 8775450, 'ytd_wh': 1616919, 'wage': 334681, 'period_index': 24, 'periods': 26}, 15666), ('normal control', {'ytd_wages': 185427, 'ytd_wh': 36091, 'wage': 108159, 'period_index': 2, 'periods': 12}, 0), ('normal control', {'ytd_wages': 141603, 'ytd_wh': 11497, 'wage': 15563, 'period_index': 7, 'periods': 12}, 0), ('normal control', {'ytd_wages': 29165, 'ytd_wh': 3348, 'wage': 5167, 'period_index': 8, 'periods': 52}, 0), ('normal control', {'ytd_wages': 2675147, 'ytd_wh': 522064, 'wage': 171429, 'period_index': 26, 'periods': 26}, 0)], [('regression', {'ytd_wages': 9590400, 'ytd_wh': 237513, 'wage': 534789, 'period_index': 22, 'periods': 26}, 1684840), ('regression', {'ytd_wages': 3504142, 'ytd_wh': 423680, 'wage': 219362, 'period_index': 26, 'periods': 26}, 0), ('partial-repair probe', {'ytd_wages': 8775450, 'ytd_wh': 1616919, 'wage': 334681, 'period_index': 24, 'periods': 26}, 15666), ('partial-repair probe', {'ytd_wages': 6145936, 'ytd_wh': 219937, 'wage': 315568, 'period_index': 15, 'periods': 52}, 1157747), ('normal control', {'ytd_wages': 78474, 'ytd_wh': 12616, 'wage': 2681, 'period_index': 35, 'periods': 52}, 0), ('normal control', {'ytd_wages': 780083, 'ytd_wh': 115357, 'wage': 60520, 'period_index': 12, 'periods': 26}, 0), ('normal control', {'ytd_wages': 30504, 'ytd_wh': 1425, 'wage': 14017, 'period_index': 11, 'periods': 12}, 0), ('normal control', {'ytd_wages': 255421, 'ytd_wh': 47741, 'wage': 37513, 'period_index': 11, 'periods': 12}, 0)], [('regression', {'ytd_wages': 8775450, 'ytd_wh': 1616919, 'wage': 334681, 'period_index': 24, 'periods': 26}, 15666), ('regression', {'ytd_wages': 7060061, 'ytd_wh': 424656, 'wage': 491569, 'period_index': 24, 'periods': 52}, 1110812), ('partial-repair probe', {'ytd_wages': 0, 'ytd_wh': 1, 'wage': 366567, 'period_index': 1, 'periods': 12}, 37975), ('partial-repair probe', {'ytd_wages': 4585857, 'ytd_wh': 265867, 'wage': 360821, 'period_index': 12, 'periods': 26}, 644413), ('normal control', {'ytd_wages': 4101816, 'ytd_wh': 781382, 'wage': 93819, 'period_index': 46, 'periods': 52}, 0), ('normal control', {'ytd_wages': 1734664, 'ytd_wh': 216863, 'wage': 75980, 'period_index': 15, 'periods': 26}, 0), ('normal control', {'ytd_wages': 2864664, 'ytd_wh': 419863, 'wage': 94961, 'period_index': 20, 'periods': 26}, 0), ('normal control', {'ytd_wages': 430759, 'ytd_wh': 55675, 'wage': 54560, 'period_index': 5, 'periods': 12}, 0)], [('regression', {'ytd_wages': 6145936, 'ytd_wh': 219937, 'wage': 315568, 'period_index': 15, 'periods': 52}, 1157747), ('regression', {'ytd_wages': 9590400, 'ytd_wh': 237513, 'wage': 534789, 'period_index': 22, 'periods': 26}, 1684840), ('partial-repair probe', {'ytd_wages': 2724662, 'ytd_wh': 86701, 'wage': 332622, 'period_index': 7, 'periods': 52}, 566278), ('partial-repair probe', {'ytd_wages': 1665992, 'ytd_wh': 58323, 'wage': 387492, 'period_index': 4, 'periods': 12}, 234513), ('normal control', {'ytd_wages': 353147, 'ytd_wh': 9536, 'wage': 96030, 'period_index': 6, 'periods': 12}, 0), ('normal control', {'ytd_wages': 659564, 'ytd_wh': 7849, 'wage': 18236, 'period_index': 20, 'periods': 26}, 0), ('normal control', {'ytd_wages': 2446975, 'ytd_wh': 466368, 'wage': 202023, 'period_index': 12, 'periods': 12}, 0), ('normal control', {'ytd_wages': 152088, 'ytd_wh': 11592, 'wage': 17915, 'period_index': 8, 'periods': 26}, 0)], [('regression', {'ytd_wages': 4585857, 'ytd_wh': 265867, 'wage': 360821, 'period_index': 12, 'periods': 26}, 644413), ('regression', {'ytd_wages': 953768, 'ytd_wh': 32122, 'wage': 67782, 'period_index': 21, 'periods': 26}, 0), ('partial-repair probe', {'ytd_wages': 17382079, 'ytd_wh': 703861, 'wage': 564605, 'period_index': 25, 'periods': 52}, 3314882), ('partial-repair probe', {'ytd_wages': 7572146, 'ytd_wh': 1352041, 'wage': 228907, 'period_index': 18, 'periods': 52}, 312519), ('normal control', {'ytd_wages': 2303411, 'ytd_wh': 406780, 'wage': 112030, 'period_index': 23, 'periods': 26}, 0), ('normal control', {'ytd_wages': 288287, 'ytd_wh': 41455, 'wage': 26146, 'period_index': 26, 'periods': 26}, 0), ('normal control', {'ytd_wages': 102743, 'ytd_wh': 20507, 'wage': 5626, 'period_index': 12, 'periods': 12}, 0), ('normal control', {'ytd_wages': 1160977, 'ytd_wh': 199709, 'wage': 91537, 'period_index': 11, 'periods': 26}, 0)]]
for i, (label, args, expected) in enumerate(fixtures[N-1]):
    check("%s %d" % (label, i), solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
regression 01349091110812Failed
regression 100Passed
partial-repair probe 213109871684840Failed
partial-repair probe 3015666Failed
normal control 400Passed
normal control 500Passed
normal control 600Passed
normal control 700Passed

SHA-256 / 24b976c9fb617c992b292736ea31387dba640aaff4acb09c828b7c0a3d3ceb0e

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json
from fractions import Fraction
import math
N = 1
observations = []
def solve(x):
    k = x['period_index']
    total = x['ytd_wages'] + x['wage']
    annual = Fraction(total * x['periods'], k)
    def tax(a):
        t = Fraction(0)
        if a > 1000000:
            t += (min(a, 4000000) - 1000000) * Fraction(12, 100)
        if a > 4000000:
            t += (a - 4000000) * Fraction(24, 100)
        return t
    due = tax(annual) * k / x['periods']
    wh = max(0, due - x['ytd_wh'])
    return math.floor(wh + Fraction(1, 2))
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression', {'ytd_wages': 7060061, 'ytd_wh': 424656, 'wage': 491569, 'period_index': 24, 'periods': 52}, 1110812), ('regression', {'ytd_wages': 2182615, 'ytd_wh': 379871, 'wage': 414670, 'period_index': 20, 'periods': 26}, 0), ('partial-repair probe', {'ytd_wages': 9590400, 'ytd_wh': 237513, 'wage': 534789, 'period_index': 22, 'periods': 26}, 1684840), ('partial-repair probe', {'ytd_wages': 8775450, 'ytd_wh': 1616919, 'wage': 334681, 'period_index': 24, 'periods': 26}, 15666), ('normal control', {'ytd_wages': 185427, 'ytd_wh': 36091, 'wage': 108159, 'period_index': 2, 'periods': 12}, 0), ('normal control', {'ytd_wages': 141603, 'ytd_wh': 11497, 'wage': 15563, 'period_index': 7, 'periods': 12}, 0), ('normal control', {'ytd_wages': 29165, 'ytd_wh': 3348, 'wage': 5167, 'period_index': 8, 'periods': 52}, 0), ('normal control', {'ytd_wages': 2675147, 'ytd_wh': 522064, 'wage': 171429, 'period_index': 26, 'periods': 26}, 0)], [('regression', {'ytd_wages': 9590400, 'ytd_wh': 237513, 'wage': 534789, 'period_index': 22, 'periods': 26}, 1684840), ('regression', {'ytd_wages': 3504142, 'ytd_wh': 423680, 'wage': 219362, 'period_index': 26, 'periods': 26}, 0), ('partial-repair probe', {'ytd_wages': 8775450, 'ytd_wh': 1616919, 'wage': 334681, 'period_index': 24, 'periods': 26}, 15666), ('partial-repair probe', {'ytd_wages': 6145936, 'ytd_wh': 219937, 'wage': 315568, 'period_index': 15, 'periods': 52}, 1157747), ('normal control', {'ytd_wages': 78474, 'ytd_wh': 12616, 'wage': 2681, 'period_index': 35, 'periods': 52}, 0), ('normal control', {'ytd_wages': 780083, 'ytd_wh': 115357, 'wage': 60520, 'period_index': 12, 'periods': 26}, 0), ('normal control', {'ytd_wages': 30504, 'ytd_wh': 1425, 'wage': 14017, 'period_index': 11, 'periods': 12}, 0), ('normal control', {'ytd_wages': 255421, 'ytd_wh': 47741, 'wage': 37513, 'period_index': 11, 'periods': 12}, 0)], [('regression', {'ytd_wages': 8775450, 'ytd_wh': 1616919, 'wage': 334681, 'period_index': 24, 'periods': 26}, 15666), ('regression', {'ytd_wages': 7060061, 'ytd_wh': 424656, 'wage': 491569, 'period_index': 24, 'periods': 52}, 1110812), ('partial-repair probe', {'ytd_wages': 0, 'ytd_wh': 1, 'wage': 366567, 'period_index': 1, 'periods': 12}, 37975), ('partial-repair probe', {'ytd_wages': 4585857, 'ytd_wh': 265867, 'wage': 360821, 'period_index': 12, 'periods': 26}, 644413), ('normal control', {'ytd_wages': 4101816, 'ytd_wh': 781382, 'wage': 93819, 'period_index': 46, 'periods': 52}, 0), ('normal control', {'ytd_wages': 1734664, 'ytd_wh': 216863, 'wage': 75980, 'period_index': 15, 'periods': 26}, 0), ('normal control', {'ytd_wages': 2864664, 'ytd_wh': 419863, 'wage': 94961, 'period_index': 20, 'periods': 26}, 0), ('normal control', {'ytd_wages': 430759, 'ytd_wh': 55675, 'wage': 54560, 'period_index': 5, 'periods': 12}, 0)], [('regression', {'ytd_wages': 6145936, 'ytd_wh': 219937, 'wage': 315568, 'period_index': 15, 'periods': 52}, 1157747), ('regression', {'ytd_wages': 9590400, 'ytd_wh': 237513, 'wage': 534789, 'period_index': 22, 'periods': 26}, 1684840), ('partial-repair probe', {'ytd_wages': 2724662, 'ytd_wh': 86701, 'wage': 332622, 'period_index': 7, 'periods': 52}, 566278), ('partial-repair probe', {'ytd_wages': 1665992, 'ytd_wh': 58323, 'wage': 387492, 'period_index': 4, 'periods': 12}, 234513), ('normal control', {'ytd_wages': 353147, 'ytd_wh': 9536, 'wage': 96030, 'period_index': 6, 'periods': 12}, 0), ('normal control', {'ytd_wages': 659564, 'ytd_wh': 7849, 'wage': 18236, 'period_index': 20, 'periods': 26}, 0), ('normal control', {'ytd_wages': 2446975, 'ytd_wh': 466368, 'wage': 202023, 'period_index': 12, 'periods': 12}, 0), ('normal control', {'ytd_wages': 152088, 'ytd_wh': 11592, 'wage': 17915, 'period_index': 8, 'periods': 26}, 0)], [('regression', {'ytd_wages': 4585857, 'ytd_wh': 265867, 'wage': 360821, 'period_index': 12, 'periods': 26}, 644413), ('regression', {'ytd_wages': 953768, 'ytd_wh': 32122, 'wage': 67782, 'period_index': 21, 'periods': 26}, 0), ('partial-repair probe', {'ytd_wages': 17382079, 'ytd_wh': 703861, 'wage': 564605, 'period_index': 25, 'periods': 52}, 3314882), ('partial-repair probe', {'ytd_wages': 7572146, 'ytd_wh': 1352041, 'wage': 228907, 'period_index': 18, 'periods': 52}, 312519), ('normal control', {'ytd_wages': 2303411, 'ytd_wh': 406780, 'wage': 112030, 'period_index': 23, 'periods': 26}, 0), ('normal control', {'ytd_wages': 288287, 'ytd_wh': 41455, 'wage': 26146, 'period_index': 26, 'periods': 26}, 0), ('normal control', {'ytd_wages': 102743, 'ytd_wh': 20507, 'wage': 5626, 'period_index': 12, 'periods': 12}, 0), ('normal control', {'ytd_wages': 1160977, 'ytd_wh': 199709, 'wage': 91537, 'period_index': 11, 'periods': 26}, 0)]]
for i, (label, args, expected) in enumerate(fixtures[N-1]):
    check("%s %d" % (label, i), solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
regression 011108121110812Passed
regression 100Passed
partial-repair probe 216848401684840Passed
partial-repair probe 31566615666Passed
normal control 400Passed
normal control 500Passed
normal control 600Passed
normal control 700Passed

SHA-256 / d96854553043601d4c7932e5b7206b9ff7b6231d0d6b331bf1c789d65ce7ffb5

Verification & scope

A deterministic teaching model of a stipulated payroll rule with toy thresholds and rates. It makes no claim of conformance to any tax authority, statute or jurisdiction and is not payroll software. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.

Observations recorded using Python 3.12.14 at 2026-09-29T14:46:33.814756+00:00.

Case digest / aea40d9a756868f3042e7c1dcb5225076c7b5060d059149636a9ed109020395c