anchor.diff:  	Now = erlang:system_time(millisecond),
   	get_final(Buckets, ServiceId, ChargingKey, SessionId, Now, #{}, []).
   %% @hidden
  -get_final([#bucket{remain_amount = 0, attributes = []} | T], ServiceId,
  +get_final([#bucket{remain_amount = 0,
  +		attributes = #{bucket_type := normal}} | T], ServiceId,
   		ChargingKey, SessionId, Now, Debits, Acc) ->
   	get_final(T, ServiceId, ChargingKey, SessionId, Now, Debits, Acc);
  -get_final([#bucket{remain_amount = R, attributes = [], end_date = Expires} | T], ServiceId,
  +get_final([#bucket{remain_amount = R, attributes = #{bucket_type := normal},
  +		end_date = Expires} | T], ServiceId,
   		ChargingKey, SessionId, Now, Debits, Acc)
   		when R >= 0, Expires /= undefined, Expires < Now ->
   	get_final(T, ServiceId, ChargingKey, SessionId, Now, Debits, Acc);
  -get_final([#bucket{attributes = []} = B | T],
  +get_final([#bucket{attributes = #{bucket_type := normal}} = B | T],
   		ServiceId, ChargingKey, SessionId, Now, Debits, Acc) ->
   	get_final(T, ServiceId, ChargingKey, SessionId, Now, Debits, [B | Acc]);
   get_final([#bucket{units = Units, attributes = Attributes,
  
positive.code: 			ServiceId, ChargingKey, SessionId, sort(Buckets), 0, []).
  %% @hidden
  charge_session(Type, Charge, Now, ServiceId, ChargingKey, SessionId,
  		[#bucket{remain_amount = Remain, attributes = [],
  		start_date = Start, end_date = Expires} | T], Charged, Acc)
  		when Remain >= 0, Expires /= undefined, Expires =/= Start,
  		Expires =< Now ->
  
negative.code: 
  %% @hidden
  update(Type, Charge, Reserve, Now, ServiceId, ChargingKey, SessionId,
  		[#bucket{end_date = Expires, attributes = #{bucket_type := normal},
  		remain_amount = Remain} | T], Acc, Charged, Reserved)
  		when Expires /= undefined, Expires =< Now, Remain >= 0 ->
  	update(Type, Charge, Reserve, Now,
  