clearTargetLevels(bucket_start);
    public void addWithdrawProjection(Task task) {        if (!task.getVerb().equals(Constants.Verb.PROJECTWITHDRAW)) { // assertion/pre-condition            Exception exception = new Exception("Adding non-PROJECTWITHDRAW task to inventory BG");            if (logger.isErrorEnabled()) {              logger.error(".addWithdrawProjection - adding non-PROJECTWITHDRAW task " + task +                           " to inventory BG.", exception);            }        }        long start = taskUtils.getStartTime(task);        long end = taskUtils.getEndTime(task);        // THIS ONE        int bucket_start = convertTimeToBucket(start, false);        int bucket_end = convertTimeToBucket(end, true);//         targetLevelsList.clear();        clearTargetLevels(bucket_start);        // Adding projections mean changed critical levels and        // target levels.  Set boolean to recompute critical        // levels and clear targetLevelsList for CSV logging        compute_critical_levels = true;        // StartBucket for the inventory is the first bucket which has not seen any deletions        // It is possible to have a case where a projection is added to buckets in the past        // because the allocation results on a projection can change until the end of the        // task which may still be in the future.  Allow projections to be added to buckets        // in the past but not to buckets before the start bucket of the inventory.        if (bucket_start < getStartBucket()) {          if (bucket_end < getStartBucket()) {            if (logger.isErrorEnabled()) {              logger.error("addWithdrawProjection not adding old projection. startBucket is "+                          TimeUtils.dateString(convertBucketToTime(getStartBucket()))+                          ", task "+taskUtils.taskDesc(task));                          }            return;          } else {            if (logger.isWarnEnabled()) {              logger.warn("addWithdrawProjection not adding projection to deleted buckets. "+                          "startBucket is "+TimeUtils.dateString(convertBucketToTime(getStartBucket()))+                          ", task "+taskUtils.taskDesc(task));            }            bucket_start = getStartBucket();          }        }        //If this new projection effects the initial level demand then recalc.        if((bucket_start <= getInitialLevelDemandEndBucket()) &&	   (bucket_end >= convertTimeToBucket(arrivalTime,false))) {             recalculate_initial_level = true;        }        if (bucket_end >= projectedDemandArray.length) {            projectedDemandArray = expandArray(projectedDemandArray, bucket_end);        }        while (bucket_end >= dueOutList.size()) {            dueOutList.add(new ArrayList());        }//      System.out.println("Task start: "+TimeUtils.dateString(start)+" end  : "+TimeUtils.dateString(end));//      System.out.println("bucket start "+bucket_start+", bucket end "+bucket_end);        for (int i = bucket_start; i < bucket_end; i++) {            ArrayList list = (ArrayList) dueOutList.get(i);            list.add(task);            updateProjectedDemandList(task, i, start, end, true);        }    }