code: private ArrayStorage<TP> mergeTransProperties(ArrayStorage<TP> tps1, ArrayStorage<TP> tps2) {
          int len = tps1.size();
          int i;
  
          ArrayStorage<TP> tps1OrCopy = tps1;
  
          for (i = 0; i < len; i++) {
              TP tp1 = tps1OrCopy.get(i);
              TP tp2 = tps2.get(i);
              if (tp2 != null) {
                  if (tp1 != null) {
                      if (!Objects.equals(tp1, tp2)) {
                          return null;
                      }
                  } else {
                      tps1OrCopy = tps1.clone();
                      tps1OrCopy.set(i++, tp2);
                      break;
                  }
              }
          }
  
          for (; i < len; i++) {
              TP tp1 = tps1OrCopy.get(i);
              TP tp2 = tps2.get(i);
              if (tp2 != null) {
                  if (tp1 != null) {
                      if (!Objects.equals(tp1, tp2)) {
                          return null;
                      }
                  } else {
                      tps1OrCopy.set(i, tp2);
                  }
              }
          }
  
          return tps1OrCopy;
      }
docs: Merges two non-null transition property arrays. The behavior of this method is as follows: <ul> <li>if {@code
  tps1} subsumes {@code tps2}, then {@code tps1} is returned.</li> <li>otherwise, if {@code tps1} and {@code tps2}
  can be merged, a new {@link ArrayStorage} containing the result of the merge is returned. <li>otherwise
  (i.e., if no merge is possible), {@code null} is returned. </ul>