code: def validate_supported_quil(program: Program) -> None:
      
      gates_seen = False
      measured_qubits: Set[int] = set()
      for i, instr in enumerate(program.instructions):
          if isinstance(instr, Pragma) or isinstance(instr, Declare):
              continue
          elif isinstance(instr, Halt):
              if i != len(program.instructions) - 1:
                  raise ValueError(f"Cannot have instructions after HALT")
          elif isinstance(instr, Gate):
              gates_seen = True
              if any(q.index in measured_qubits for q in instr.qubits):
                  raise ValueError("Cannot apply gates to qubits that were already measured.")
          elif isinstance(instr, Reset):
              if gates_seen:
                  raise ValueError("RESET can only be applied before any gate applications.")
          elif isinstance(instr, ResetQubit):
              raise ValueError("Only global RESETs are currently supported.")
          elif isinstance(instr, Measurement):
              if instr.qubit.index in measured_qubits:
                  raise ValueError("Multiple measurements per qubit is not supported.")
              measured_qubits.add(instr.qubit.index)
          else:
              raise ValueError(f"Unhandled instruction type in supported Quil validation: {instr}")
docs: Ensure that a program is supported Quil which can run on any QPU, otherwise raise a ValueError.
      We support a global RESET before any gates, and MEASUREs on each qubit after any gates
      on that qubit. PRAGMAs and DECLAREs are always allowed, and a final HALT instruction is allowed.
  
      :param program: The Quil program to validate.