import java.util.LinkedList;
import java.util.List;
import org.checkerframework.framework.testchecker.util.Encrypted;

abstract class BasicFunctionality {

  @Encrypted String encrypt(String s) {
    byte[] b = s.getBytes();
    for (int i = 0; i < b.length; b[i++]++) {}
    // :: warning: (cast.unsafe)
    return (@Encrypted String) new String(b);
  }

  abstract void sendOverTheInternet(@Encrypted String s);

  void test() {
    @Encrypted String s = encrypt("foo"); // valid
    sendOverTheInternet(s); // valid

    String t = encrypt("bar"); // valid (subtype)
    sendOverTheInternet(t); // valid (flow)

    List<@Encrypted String> lst = new LinkedList<>();
    lst.add(s);
    lst.add(t);

    for (@Encrypted String str : lst) {
      sendOverTheInternet(str);
    }

    //        for (String str : lst)
    //            sendOverTheInternet(str);           // should be valid!
  }
}
