code: private int findCodePoint(int c, int lo, int hi) {
          /* Examples:
                                             findCodePoint(c)
             set              list[]         c=0 1 3 4 7 8
             ===              ==============   ===========
             []               [110000]         0 0 0 0 0 0
             [\u0000-\u0003]  [0, 4, 110000]   1 1 1 2 2 2
             [\u0004-\u0007]  [4, 8, 110000]   0 0 0 1 1 2
             [:Any:]          [0, 110000]      1 1 1 1 1 1
           */
  
          // Return the smallest i such that c < list[i]. Assume
          // list[len - 1] == HIGH and that c is legal (0..HIGH-1).
          if (c < list[lo])
              return lo;
          // High runner test. c is often after the last range, so an
          // initial check for this condition pays off.
          if (lo >= hi || c >= list[hi - 1])
              return hi;
          // invariant: c >= list[lo]
          // invariant: c < list[hi]
          for (;;) {
              int i = (lo + hi) >>> 1;
              if (i == lo) {
                  break; // Found!
              } else if (c < list[i]) {
                  hi = i;
              } else {
                  lo = i;
              }
          }
          return hi;
      }
docs: Same as UnicodeSet.findCodePoint(int c) except that the binary search is restricted for finding code
  points in a certain range.
  
  For restricting the search for finding in the range start..end, pass in lo=findCodePoint(start) and
  hi=findCodePoint(end) with 0<=lo<=hi<len. findCodePoint(c) defaults to lo=0 and hi=len-1.
  
  @param c
  a character in a subrange of MIN_VALUE..MAX_VALUE
  @param lo
  The lowest index to be returned.
  @param hi
  The highest index to be returned.
  @return the smallest integer i in the range lo..hi, inclusive, such that c < list[i]