def intron_context(intron, start, stop):
    """
    Given an intron, a start codon, and a stop codon (GFF3 entries),
    determine the context of the exon:
      - cds (entirely coding)
      - 5putr (entirely 5' UTR)
      - 3putr (entirely 3' UTR)
      - start (includes start codon)
      - stop (includes stop codon)
      - complete (includes both start and stop codon)
    """
    assert start and stop
    intron = intron.split('\t')
    start = start.split('\t')
    stop = stop.split('\t')
    assert len(intron) == 9 and len(start) == 9 and len(stop) == 9

    intronstart = int(intron[3])
    intronend = int(intron[4])
    codonnucs = [start[3], start[4], stop[3], stop[4]]
    codonnucs = [int(x) for x in codonnucs]
    leftmostnuc = min(codonnucs)
    rightmostnuc = max(codonnucs)
    if intronend < leftmostnuc:
        if intron[6] == '-':
            return '3putr'
        else:
            return '5putr'
    elif intronstart > rightmostnuc:
        if intron[6] == '-':
            return '5putr'
        else:
            return '3putr'
    else:
        assert intronstart > leftmostnuc and intronend < rightmostnuc
        return 'cds'