function TokenTranchePricing(uint[] init_tranches) public {
    
    require(init_tranches.length % tranche_size == 0);
    
    
    require(init_tranches[amount_offset] > 0);

    tranches.length = init_tranches.length.div(tranche_size);
    Tranche memory last_tranche;
    for (uint i = 0; i < tranches.length; i++) {
      uint tranche_offset = i.mul(tranche_size);
      uint amount = init_tranches[tranche_offset.add(amount_offset)];
      uint start = init_tranches[tranche_offset.add(start_offset)];
      uint end = init_tranches[tranche_offset.add(end_offset)];
      uint price = init_tranches[tranche_offset.add(price_offset)];
      
      require(block.timestamp < start && start < end);
      
      
      require(i == 0 || (end >= last_tranche.end && amount > last_tranche.amount) ||
              (end > last_tranche.end && amount >= last_tranche.amount));

      last_tranche = Tranche(amount, start, end, price);
      tranches[i] = last_tranche;
    }
  }