{
  "endpoint": "https://otherworldlabs.com/wedding-budget-shares-and-remaining/api.json",
  "page": "https://otherworldlabs.com/wedding-budget-shares-and-remaining/",
  "what_it_answers": "For one total and a list of categories the reader names, with a share in percent and an amount already committed typed against each one, what each share comes to in money, what the shares foot to, what the committed amounts foot to, how much of the total each of those two readings leaves, and where every category stands against its own share.",
  "shape": "A static document, not a service. There is no request to make and nothing is posted anywhere: this file is the engine written out, so an agent can answer the question without the page and get the same figures the page prints. The engine itself is the script with the id core in the page above, and its flat outputs function is apiOutputs(state).",
  "units": "Dollars and cents, percent, and a whole count of categories. A share is a percentage of the one typed total and never a second currency; an amount committed is money as typed.",
  "the_page_supplies_no_figure": "Every figure in this arithmetic is typed by the reader: the total, every category name, every share and every amount committed. This engine ships every one of them blank, it names no category, it proposes no split and no share for any category, and it holds no typical cost, average, regional figure or per-guest figure of any kind. It recommends no venue, caterer, photographer, florist, planner, registry, marketplace or supplier, names no category of supplier, and carries no affiliate link, fee or commission. Nothing it returns is advice about a wedding or about money.",
  "two_sided_waiting": "The answer has two halves and each one waits on its own column. The plan half (sharesFootedPct, shareUnassignedPct, shareAmountTotal, unassignedAmount) is returned once the total is typed above zero and every live category carries a readable share. The committed half (allocatedTotal, allocatedPctOfTotal, remaining, leftOfTotal, overTotalBy) is returned once the total is typed above zero and every live category carries a readable amount. Neither half waits on the other, and neither waits on the table: a reader who holds the total and every amount already committed and has decided no split gets the committed half in full, which is the whole point of the split. A blank is never read as a zero; a typed zero is a figure.",
  "a_figure_outside_the_offered_range_is_no_reading": "A share outside 0 to 100, or an amount outside 0 to 1,000,000, is read as nothing typed at all: the cell returns null, that side of the answer waits, and the page says which categories and which column. This is not a separate state - it is the same waiting the blank boxes carry - and it exists because the engine will not print a negative share of a total or a share larger than the total for one category.",
  "inputs": [
    {
      "name": "total",
      "label": "Your wedding total, in dollars",
      "type": "number",
      "control_ids": ["total"],
      "offered": { "min": 0, "max": 1000000, "step": 0.01 },
      "blank_means": "nothing typed yet, which leaves both halves of the answer waiting",
      "note": "The one figure the reader has been handed or has settled on. A total of zero leaves both halves of the foot waiting exactly as an untyped total does, because a budget of nothing has nothing to divide - though the zero is still a reading of the box and comes back in the total output as 0, which the total output and the no total typed state both say; the upper bound is a form limit and is not a figure about weddings. The range and the step here are the range and the step the page's own control offers."
    },
    {
      "name": "rowCount",
      "label": "How many categories you have written down",
      "type": "number",
      "control_ids": ["rowCount"],
      "offered": { "min": 1, "max": 12, "step": 1 },
      "blank_means": "one category, which is the fewest the page holds",
      "note": "The count of live categories. Rows past this count are on the page but out of the way, and nothing typed in them is read. A count outside 1 to 12 is brought back to the nearest end, because a count is the shape of the form rather than a figure the arithmetic is about; the page's control offers whole steps from 1 to 12 and ships at 3."
    },
    {
      "name": "categoryName",
      "label": "What you call it",
      "type": "text",
      "group": "rows",
      "field": "name",
      "control_ids": ["name0", "name1", "name2", "name3", "name4", "name5", "name6", "name7", "name8", "name9", "name10", "name11"],
      "offered": { "max_characters": 40 },
      "blank_means": "no name yet, and the row is then printed by its number alone",
      "note": "The reader's own words. Runs of whitespace are collapsed, the ends are trimmed, and anything past forty characters is cut, which is what the control's own maxlength offers. The page ships every one of these boxes empty and never writes a name into one: the categories are the reader's, and a plausible list printed here would be a suggested split one step removed."
    },
    {
      "name": "sharePct",
      "label": "Its share of the total, in percent",
      "type": "number",
      "group": "rows",
      "field": "sharePct",
      "control_ids": ["share0", "share1", "share2", "share3", "share4", "share5", "share6", "share7", "share8", "share9", "share10", "share11"],
      "offered": { "min": 0, "max": 100, "step": 0.1 },
      "blank_means": "no share decided for this category, which leaves the plan half of the answer waiting and is NOT read as a share of nothing",
      "note": "Typed, every one of them, and defaulted by nothing: the engine supplies no split and no suggested share for any category. One row's share is bounded by the form at 0 to 100 and is READ AT FOUR DECIMALS: the control offers a step of 0.1 and a reader can still type 33.33 or paste a repeating third into it, so the engine rounds the reading to four decimals once, at the box, and every figure it prints beside that share - the share itself, the sum of the shares, a whole total less that sum - is printed at the decimals it has, between one and four. That is why the arithmetic the page prints foots from its own characters: the shares a reader adds up on the screen are the shares the engine added. A share read at one decimal instead would have printed a figure nobody typed (33.3 for a typed 33.33) and left the working row reading 33.3 + 33.3 + 33.3 = 100.0, which is false on the screen. The SUM of the shares is deliberately unbounded and is returned as typed: it may foot beneath a whole total, on it, or past it, and it is never rescaled."
    },
    {
      "name": "allocated",
      "label": "Committed to it so far, in dollars",
      "type": "number",
      "group": "rows",
      "field": "allocated",
      "control_ids": ["alloc0", "alloc1", "alloc2", "alloc3", "alloc4", "alloc5", "alloc6", "alloc7", "alloc8", "alloc9", "alloc10", "alloc11"],
      "offered": { "min": 0, "max": 1000000, "step": 0.01 },
      "blank_means": "nothing committed to this category that the reader has told the page about, which leaves the committed half of the answer waiting and is NOT read as an amount of nothing",
      "note": "What the quotes, deposits and invoices in hand come to for this category. It may exceed the category's share of the total, and the answer then says over its share by that amount rather than clipping it."
    }
  ],
  "rounding": {
    "function": "rN(v, n) = Math.round(v * 10^n) / 10^n, on the double, with no epsilon and no decimal library.",
    "at_the_half": "JavaScript Math.round takes the half toward positive infinity. On the positive side that is half away from zero: 0.125 at two decimals is 0.13 and 30.85 at one decimal is 30.9. On the negative side it is half toward zero: -0.125 at two decimals is -0.12, not -0.13, and -0.45 at one decimal is -0.4, not -0.5. The negative half is reachable on this page and is stated rather than left to a reader to discover: shareUnassignedPct, unassignedAmount, remaining and every category's againstShare go negative - shareUnassignedPct whenever sharesFootedPct is above 100, unassignedAmount whenever the share amounts as they print come to more than the total, and the last two whenever the commitments pass what they are measured against. The first two are two readings of one plan and the rounding is why they can carry different signs at a tiny total; the formulas block says so under unassignedAmount.",
    "what_is_rounded": "Money to the cent, percentages to one decimal, and each figure once. Every share amount is rounded to the cent before it is added, so shareAmountTotal is the sum of the cents the page prints rather than a second unrounded product; unassignedAmount is then the total less that sum. allocatedTotal is the sum of the amounts as typed, which are already at the cent. againstShare is the typed amount less the rounded share amount, at the cent. The percent column is NOT rounded for display at all: a share is read at four decimals, sharesFootedPct is the sum of those readings at four decimals and shareUnassignedPct is 100 less that sum at four decimals, and each is printed at the decimals it has, between one and four, so the figures a reader adds up on the screen foot to the figure printed beneath them. allocatedPctOfTotal is a computed ratio rather than a sum of typed figures and IS rounded, to one decimal, with the division it came from printed beside it; sharesFootedPctExact and allocatedPctOfTotalExact are the same two figures with no rounding at all, returned for an agent that would rather round once itself.",
    "the_two_readings_of_one_plan": "shareUnassignedPct is 100 less the footed shares and unassignedAmount is the total less the share amounts as they print. They are two readings of one plan - one down the percent column, one down the dollar column - and a cent of rounding can separate them. Neither is derived from the other and the page prints both."
  },
  "formulas": {
    "shareAmount_i": "round(total * sharePct_i / 100, 2), for a live category whose share is readable and whose total is typed above zero. null otherwise.",
    "againstShare_i": "round(allocated_i - shareAmount_i, 2), for a live category that carries both. null otherwise, so a blank is never read as a zero. Positive is over the category's own share, negative is beneath it.",
    "sharePct_i": "the typed share, read at four decimals: round(the figure in the box, 4), for a figure inside 0 to 100. null outside that range, which is the same as a blank box.",
    "sharesFootedPctExact": "the sum of the live categories' readable shares, unrounded. null while the plan half waits.",
    "sharesFootedPct": "round(sharesFootedPctExact, 4). Four, not one: every addend is itself a four-decimal figure, so the sum is exact at four decimals and the percent column never prints a figure its own addends do not foot to.",
    "shareUnassignedPct": "round(100 - sharesFootedPct, 4). Negative exactly when sharesFootedPct is above 100, which is the percent reading of the shares footing past a whole total.",
    "shareAmountTotal": "round(the sum of every live category's shareAmount_i, 2).",
    "unassignedAmount": "round(total - shareAmountTotal, 2). Negative exactly when the share amounts as they print come to more than the total. That is the DOLLAR reading of the shares footing past a whole total, and it is not the same test as shareUnassignedPct being negative: every share amount is rounded to the cent before it is added, so up to twelve roundings of half a cent each can move this figure by up to six cents, while the percent reading can be off a whole total by as little as total x 0.00001. At a total small enough for six cents to outweigh that - 0.03 against four shares of 20, or 3.00 against twelve shares near 8.3 - the two readings carry different signs, which is why the page's glance sentence takes its branch and every figure in it from this reading alone and the percent reading keeps its own row in the plan foot.",
    "allocatedTotal": "round(the sum of every live category's allocated_i, 2). null while the committed half waits.",
    "allocatedPctOfTotalExact": "allocatedTotal / total * 100, unrounded.",
    "allocatedPctOfTotal": "round(allocatedPctOfTotalExact, 1). It has no upper bound: commitments past the total print past 100 rather than being capped.",
    "remaining": "round(total - allocatedTotal, 2). Positive is left of the total, negative is past it.",
    "leftOfTotal": "remaining when remaining is above zero, and 0 otherwise. The magnitude the page prints beside the words left of the total.",
    "overTotalBy": "minus remaining when remaining is below zero, and 0 otherwise. The magnitude the page prints beside the words over the total by.",
    "allocatedMinusShareTotal": "round(allocatedTotal - shareAmountTotal, 2), returned only when both halves are in: what the whole list is committed over or beneath its own plan.",
    "rowsCounted": "the count of live categories, 1 to 12.",
    "planComplete": "total is typed and above zero, and every live category carries a readable share.",
    "committedComplete": "total is typed and above zero, and every live category carries a readable amount."
  },
  "states": [
    {
      "name": "no total typed",
      "when": "total is blank, zero, unreadable or outside 0 to 1,000,000",
      "returns": "planComplete and committedComplete both false and every footed figure null; total itself is echoed as typed, so a typed 0 returns total 0 and a blank or out-of-range box returns total null",
      "note": "This is the state the page ships in, and it is the twelfth entry the lede counts. No foot figure prints at all on either side, and the sentence saying so prints in the glance at the top of the page. Reachable from the page's own controls: it is what the page is on arrival. The one thing this state does not null out is the total output itself: a typed zero is a reading of the box (it is inside the offered range) and comes back as 0, while what makes the two halves wait is that the total is not above zero. An agent reproducing the page from this endpoint returns 0 for total at a typed zero and null only where the box is blank or unreadable."
    },
    {
      "name": "the share column part-typed while the committed column is whole",
      "when": "the total is typed above zero, every live category carries a readable amount, and at least one carries no readable share",
      "returns": "the committed half in full and every plan figure null",
      "note": "The reader who holds the total and every amount already committed and has decided no split. This state is the reason the two halves wait separately: a foot gated on a column it does not consume withheld the remainder from the reader who held every figure the remainder needs. Reachable: leave the share boxes empty and type the amounts."
    },
    {
      "name": "the committed column part-typed while the share column is whole",
      "when": "the total is typed above zero, every live category carries a readable share, and at least one carries no readable amount",
      "returns": "the plan half in full and every committed figure null",
      "note": "A split typed and no quotes in hand yet. Reachable: type the shares and leave the dollar boxes empty."
    },
    {
      "name": "shares footing beneath a whole total",
      "when": "the plan half is in and sharesFootedPct is below 100",
      "returns": "shareUnassignedPct above zero",
      "note": "Part of the total carries no share. Reachable: two categories at 40 and 25 percent of a 12,000 total. unassignedAmount is the dollar reading of the same plan and is above zero at every total a reader would type, but it is NOT returned as above zero by this state: each share amount is rounded to the cent before it is added, so at a total of 0.03 with four shares of 20 percent this state returns shareUnassignedPct 20 and unassignedAmount -0.01. The two readings and the rounding that separates them are in the rounding block, and the page's glance sentence takes its branch from unassignedAmount so that no sentence asserts one reading's direction while printing the other's figure."
    },
    {
      "name": "shares footing on a whole total",
      "when": "the plan half is in and sharesFootedPct is exactly 100",
      "returns": "shareUnassignedPct 0",
      "note": "Reachable: 50, 30 and 20 percent. unassignedAmount may still be a cent either way when the share amounts round, and it is returned as it comes out rather than forced to zero; the glance sentence for shares footing to a whole total is therefore chosen on unassignedAmount being exactly zero and not on this percent reading, so a plan whose percents round to 100.0 while a cent of the total carries no share is read in the glance as the dollar column reads it."
    },
    {
      "name": "shares footing past a whole total",
      "when": "the plan half is in and sharesFootedPct is above 100",
      "returns": "shareUnassignedPct below zero",
      "note": "The shares are returned as typed and are never rescaled: two categories at 80 and 45 percent foot to 125 percent and the answer says so. This is the state a printed template cannot compute. unassignedAmount is the dollar reading of the same plan and is below zero at every total a reader would type, but it is NOT returned as below zero by this state: at a total of 0.01 with six shares of 16.7 percent this state returns shareUnassignedPct -0.2 and unassignedAmount 0.01, for the rounding the rounding block names."
    },
    {
      "name": "a category committed beneath its own share",
      "when": "a live category carries both a readable share and a readable amount, and againstShare_i is below zero",
      "returns": "againstShare_i negative, by that amount",
      "note": "Per category, so a category whose two figures are in is readable whether or not another category's are."
    },
    {
      "name": "a category committed on its own share",
      "when": "againstShare_i is exactly zero",
      "returns": "againstShare_i 0",
      "note": "Reachable: a 50 percent share of a 20,000 total with 10,000 committed."
    },
    {
      "name": "a category committed past its own share",
      "when": "againstShare_i is above zero",
      "returns": "againstShare_i positive, by that amount, and never clipped",
      "note": "Reachable: a 30 percent share of a 20,000 total with 7,000 committed."
    },
    {
      "name": "a total part-committed",
      "when": "the committed half is in and remaining is above zero",
      "returns": "leftOfTotal equal to remaining and overTotalBy 0",
      "note": "Some of the total is not committed yet."
    },
    {
      "name": "a total committed to the cent",
      "when": "the committed half is in, remaining is exactly zero and allocatedTotal is above zero",
      "returns": "leftOfTotal 0 and overTotalBy 0",
      "note": "Reachable: 10,000 and 7,000 and 3,000 against a 20,000 total."
    },
    {
      "name": "a total committed past",
      "when": "the committed half is in and remaining is below zero",
      "returns": "overTotalBy equal to minus remaining, and allocatedPctOfTotal above 100",
      "note": "Reachable: 13,000 and 4,000 against a 15,000 total. The percentage is not capped and the remainder is not clipped."
    }
  ],
  "outputs": [
    { "name": "planComplete", "type": "boolean", "of": "the state above" },
    { "name": "committedComplete", "type": "boolean", "of": "the state above" },
    { "name": "total", "type": "number or null", "of": "dollars, exactly as typed, INCLUDING a typed zero; null only when the box is blank or holds something this page cannot read, which is anything outside 0 to 1,000,000. A typed zero is echoed here while planComplete and committedComplete stay false and every footed figure stays null, because a total of nothing has nothing to divide: the typed-ness of the total is a separate condition from its value, and this field is the value" },
    { "name": "rowsCounted", "type": "number", "of": "live categories, 1 to 12" },
    { "name": "sharesFootedPct", "type": "number or null", "of": "percent, at four decimals: the sum of the shares as this page READ them, which is exact because a share is read at four decimals, so this field and sharesFootedPctExact differ only by the floating-point noise of the sum itself" },
    { "name": "sharesFootedPctExact", "type": "number or null", "of": "percent, unrounded" },
    { "name": "shareUnassignedPct", "type": "number or null", "of": "percent, at four decimals, signed: a whole total less sharesFootedPct, exact for the same reason" },
    { "name": "shareAmountTotal", "type": "number or null", "of": "dollars and cents" },
    { "name": "unassignedAmount", "type": "number or null", "of": "dollars and cents, signed" },
    { "name": "allocatedTotal", "type": "number or null", "of": "dollars and cents" },
    { "name": "allocatedPctOfTotal", "type": "number or null", "of": "percent, one decimal, unbounded above" },
    { "name": "allocatedPctOfTotalExact", "type": "number or null", "of": "percent, unrounded" },
    { "name": "remaining", "type": "number or null", "of": "dollars and cents, signed" },
    { "name": "leftOfTotal", "type": "number or null", "of": "dollars and cents, zero when the total is passed" },
    { "name": "overTotalBy", "type": "number or null", "of": "dollars and cents, zero when the total is not passed" },
    { "name": "allocatedMinusShareTotal", "type": "number or null", "of": "dollars and cents, signed; null unless both halves are in" },
    { "name": "share1", "type": "number or null", "of": "percent, as typed, for category 1" },
    { "name": "shareAmount1", "type": "number or null", "of": "dollars and cents, for category 1" },
    { "name": "allocated1", "type": "number or null", "of": "dollars and cents, for category 1" },
    { "name": "againstShare1", "type": "number or null", "of": "dollars and cents, signed, for category 1" },
    { "name": "share2", "type": "number or null", "of": "percent, as typed, for category 2" },
    { "name": "shareAmount2", "type": "number or null", "of": "dollars and cents, for category 2" },
    { "name": "allocated2", "type": "number or null", "of": "dollars and cents, for category 2" },
    { "name": "againstShare2", "type": "number or null", "of": "dollars and cents, signed, for category 2" },
    { "name": "share3", "type": "number or null", "of": "percent, as typed, for category 3" },
    { "name": "shareAmount3", "type": "number or null", "of": "dollars and cents, for category 3" },
    { "name": "allocated3", "type": "number or null", "of": "dollars and cents, for category 3" },
    { "name": "againstShare3", "type": "number or null", "of": "dollars and cents, signed, for category 3" },
    { "name": "share4", "type": "number or null", "of": "percent, as typed, for category 4" },
    { "name": "shareAmount4", "type": "number or null", "of": "dollars and cents, for category 4" },
    { "name": "allocated4", "type": "number or null", "of": "dollars and cents, for category 4" },
    { "name": "againstShare4", "type": "number or null", "of": "dollars and cents, signed, for category 4" },
    { "name": "share5", "type": "number or null", "of": "percent, as typed, for category 5" },
    { "name": "shareAmount5", "type": "number or null", "of": "dollars and cents, for category 5" },
    { "name": "allocated5", "type": "number or null", "of": "dollars and cents, for category 5" },
    { "name": "againstShare5", "type": "number or null", "of": "dollars and cents, signed, for category 5" },
    { "name": "share6", "type": "number or null", "of": "percent, as typed, for category 6" },
    { "name": "shareAmount6", "type": "number or null", "of": "dollars and cents, for category 6" },
    { "name": "allocated6", "type": "number or null", "of": "dollars and cents, for category 6" },
    { "name": "againstShare6", "type": "number or null", "of": "dollars and cents, signed, for category 6" },
    { "name": "share7", "type": "number or null", "of": "percent, as typed, for category 7" },
    { "name": "shareAmount7", "type": "number or null", "of": "dollars and cents, for category 7" },
    { "name": "allocated7", "type": "number or null", "of": "dollars and cents, for category 7" },
    { "name": "againstShare7", "type": "number or null", "of": "dollars and cents, signed, for category 7" },
    { "name": "share8", "type": "number or null", "of": "percent, as typed, for category 8" },
    { "name": "shareAmount8", "type": "number or null", "of": "dollars and cents, for category 8" },
    { "name": "allocated8", "type": "number or null", "of": "dollars and cents, for category 8" },
    { "name": "againstShare8", "type": "number or null", "of": "dollars and cents, signed, for category 8" },
    { "name": "share9", "type": "number or null", "of": "percent, as typed, for category 9" },
    { "name": "shareAmount9", "type": "number or null", "of": "dollars and cents, for category 9" },
    { "name": "allocated9", "type": "number or null", "of": "dollars and cents, for category 9" },
    { "name": "againstShare9", "type": "number or null", "of": "dollars and cents, signed, for category 9" },
    { "name": "share10", "type": "number or null", "of": "percent, as typed, for category 10" },
    { "name": "shareAmount10", "type": "number or null", "of": "dollars and cents, for category 10" },
    { "name": "allocated10", "type": "number or null", "of": "dollars and cents, for category 10" },
    { "name": "againstShare10", "type": "number or null", "of": "dollars and cents, signed, for category 10" },
    { "name": "share11", "type": "number or null", "of": "percent, as typed, for category 11" },
    { "name": "shareAmount11", "type": "number or null", "of": "dollars and cents, for category 11" },
    { "name": "allocated11", "type": "number or null", "of": "dollars and cents, for category 11" },
    { "name": "againstShare11", "type": "number or null", "of": "dollars and cents, signed, for category 11" },
    { "name": "share12", "type": "number or null", "of": "percent, as typed, for category 12" },
    { "name": "shareAmount12", "type": "number or null", "of": "dollars and cents, for category 12" },
    { "name": "allocated12", "type": "number or null", "of": "dollars and cents, for category 12" },
    { "name": "againstShare12", "type": "number or null", "of": "dollars and cents, signed, for category 12" }
  ],
  "worked_example": {
    "state": {
      "total": 20000,
      "rowCount": 3,
      "rows": [
        { "name": "the one we wrote first", "sharePct": 50, "allocated": 10000 },
        { "name": "", "sharePct": 30, "allocated": 7000 },
        { "name": "A", "sharePct": 20, "allocated": 3000 }
      ]
    },
    "returns": {
      "planComplete": true,
      "committedComplete": true,
      "total": 20000,
      "rowsCounted": 3,
      "sharesFootedPct": 100,
      "sharesFootedPctExact": 100,
      "shareUnassignedPct": 0,
      "shareAmountTotal": 20000,
      "unassignedAmount": 0,
      "allocatedTotal": 20000,
      "allocatedPctOfTotal": 100,
      "allocatedPctOfTotalExact": 100,
      "remaining": 0,
      "leftOfTotal": 0,
      "overTotalBy": 0,
      "allocatedMinusShareTotal": 0,
      "share1": 50,
      "shareAmount1": 10000,
      "allocated1": 10000,
      "againstShare1": 0,
      "share2": 30,
      "shareAmount2": 6000,
      "allocated2": 7000,
      "againstShare2": 1000,
      "share3": 20,
      "shareAmount3": 4000,
      "allocated3": 3000,
      "againstShare3": -1000
    },
    "note": "Both halves in: the shares foot on a whole total, the money foots to the total exactly, and the three categories sit on, past and beneath their own shares. Categories 4 to 12 are not live, so every figure for them is null."
  },
  "second_worked_example": {
    "state": {
      "total": 18500,
      "rowCount": 2,
      "rows": [
        { "name": "", "sharePct": null, "allocated": 4200 },
        { "name": "", "sharePct": null, "allocated": 1500 }
      ]
    },
    "returns": {
      "planComplete": false,
      "committedComplete": true,
      "total": 18500,
      "rowsCounted": 2,
      "sharesFootedPct": null,
      "sharesFootedPctExact": null,
      "shareUnassignedPct": null,
      "shareAmountTotal": null,
      "unassignedAmount": null,
      "allocatedTotal": 5700,
      "allocatedPctOfTotal": 30.8,
      "allocatedPctOfTotalExact": 30.810810810810814,
      "remaining": 12800,
      "leftOfTotal": 12800,
      "overTotalBy": 0,
      "allocatedMinusShareTotal": null,
      "share1": null,
      "shareAmount1": null,
      "allocated1": 4200,
      "againstShare1": null,
      "share2": null,
      "shareAmount2": null,
      "allocated2": 1500,
      "againstShare2": null
    },
    "note": "The reader who holds the total and every amount already committed and has decided no split. The committed half is returned in full and every plan figure is null: a blank share is not a share of nothing, and the half of the answer that does not consume the share column does not wait on it."
  },
  "limits": [
    "Nothing here is advice. The engine recommends no supplier and no category of supplier, prints no typical, average, regional or per-guest cost, proposes no split and no share for any category, and says nothing about credit, loans, savings or payment plans, about what to cut or book first, or about guests or dates.",
    "It is arithmetic over figures the reader parameterises in full. Every input is typed; the engine has no constant of its own except a whole total being 100 percent and the form's own range ends.",
    "A category name is the reader's text, collapsed, trimmed and cut at forty characters. It is never interpreted and never matched against anything.",
    "No figure is stored. The page keeps nothing between visits, no figure typed into it leaves the browser, and this document records no reader and no budget. The page does report up to four counts of its own use to events.otherworldlabs.com - one when it opens, one when either half of the foot first prints a figure, one when the offer block is reached and one when the buy link is clicked - each carrying the page path and a one-visit id, the first also the host the reader came from where there is one, and never a figure or a word the reader typed.",
    "The two readings of one plan - 100 less the footed shares, and the total less the share amounts - can differ by a cent when the share amounts round. Both are returned and neither is derived from the other.",
    "Twelve categories is the page's own limit and it is a limit of the form rather than of the arithmetic. The workbook sold beside the page holds forty lines; this endpoint answers the twelve the page holds."
  ]
}
