"""Original strict single token bucket, injected exact time, no networking."""
from fractions import Fraction as F
import json,math
def number(x,positive=False):
 if type(x) not in [int,float,F] or abs(x)>1000 or not math.isfinite(x) or x<0 or (positive and x==0):raise ValueError('bounded nonnegative number, no bool')
 return F(x)
class Bucket:
 def __init__(self,rate=2,capacity=3):self.rate=number(rate,True);self.cap=number(capacity,True);self.tokens=self.cap;self.last=F(0)
 def admit(self,time,cost=1):
  t=number(time);c=number(cost,True)
  if t<self.last or c>self.cap:raise ValueError('nondecreasing time; cost <=capacity')
  before=self.tokens;dt=t-self.last;available=min(self.cap,before+self.rate*dt);ok=c<=available
  self.tokens=available-c if ok else available;self.last=t
  return {'time':str(t),'cost':str(c),'before':str(before),'elapsed':str(dt),'available':str(available),'accepted':ok,'after':str(self.tokens)}
def demo():
 requests=[(0,1),(0,1),(0,1),(0,1),(F(1,4),1),(F(1,2),1),(F(1,2),1),(10,3),(10,1)]
 b=Bucket();trace=[b.admit(t,c) for t,c in requests];assert [x['accepted'] for x in trace]==[True,True,True,False,False,True,False,True,False]
 assert trace[4]['after']=='1/2' and trace[5]['available']=='1' and trace[7]['available']=='3'
 # Independent conservation oracle: simulate refill as available credit accumulated
 # between adjacent events, then verify every contiguous event interval envelope.
 accepted=[(i,F(r['time']),F(r['cost'])) for i,r in enumerate(trace) if r['accepted']];bounds=[]
 for i in range(len(trace)):
  for j in range(i,len(trace)):
   amount=sum((c for q,t,c in accepted if i<=q<=j),F(0));bound=F(3)+F(2)*(F(trace[j]['time'])-F(trace[i]['time']));assert amount<=bound
   bounds.append({'first_event':i,'last_event':j,'admitted':str(amount),'envelope':str(bound)})
 errors=[]
 for label,fn in [('cost_gt_B',lambda:Bucket().admit(0,4)),('backwards',lambda:b.admit(9)),('zero_rate',lambda:Bucket(0)),('negative_rate',lambda:Bucket(-1)),('bool_time',lambda:Bucket().admit(True)),('NaN_time',lambda:Bucket().admit(float('nan'))),('zero_cost',lambda:Bucket().admit(0,0))]:
  try:fn()
  except ValueError:errors.append(label)
  else:raise AssertionError('expected rejection')
 return {'rate_work_units_per_second':2,'capacity_work_units':3,'initial_tokens':3,'trace':trace,'independent_interval_envelope_checks':len(bounds),'interval_bounds':bounds,'invalid_cases_rejected':errors,'time_source':'injected Fraction elapsed seconds; no sleep or clock change','scope':'strict atomic-in-one-function teaching example; no distributed concurrency, live API quotas, LLM tokens or scheduler'}
if __name__=='__main__':print(json.dumps(demo(),ensure_ascii=True,indent=2))
