protected Op.Pair<Boolean, Boolean> extractLocksOutputAndRange(String line) {
        int index = line.indexOf(':');
        if (index < 0) {
            throw new RuntimeException("[syntax error] expected property of type "
                    + "'key : value' in line: " + line);
        }
        boolean output, range;
        String value = line.substring(index + 1);
        List<String> flags = Op.split(value, "|");
        if (flags.size() == 1) {
            String flag = flags.get(0).trim();
            output = "VALID".equals(flag);
            range = ("RANGE".equals(flag));
            if (!(output || range)) {
                throw new RuntimeException(String.format(
                        "[syntax error] expected locking flags "
                        + "<VALID|RANGE>, but found <%s> in line: %s", flag, line));
            }
        } else if (flags.size() == 2) {
            String flagA = flags.get(0).trim();
            String flagB = flags.get(1).trim();
            output = ("VALID".equals(flagA) || "VALID".equals(flagB));
            range = ("RANGE".equals(flagA) || "RANGE".equals(flagB));
            if (!(output && range)) {
                throw new RuntimeException(String.format(
                        "[syntax error] expected locking flags <VALID|RANGE>, "
                        + "but found <%s|%s> in line %s", flags.get(0), flags.get(1), line));
            }
        } else {
            throw new RuntimeException(String.format(
                    "[syntax error] expected locking flags <VALID|RANGE>, "
                    + "but found <%s> in line: ", value, line));
        }

        return new Op.Pair<>(output, range);
    }