text: export class AggregateInput {
  
      /**
       * An AggregateInput is an input device that combines multiple other inputs together.
       *
       * @constructor
       * @implements {Input}
       *
       * @param {Input[]} [sources] - The initial sources used for the aggregate.
       */
  
      constructor(sources = []) {
  
          this.inputs = [];
  
          for (let source of sources) {
              this.addSource(source);
          }
  
      }
  
      /**
       * Add a new input source inside the aggregate.
       *
       * @param {Input} input - The input to aggregate.
       */
  
      addSource(input) {
  
          if (this.inputs.includes(input))
              return;
  
          this.inputs.push(input);
  
      }
  
      /**
       * Remove an input source from the aggregate.
       *
       * @param {Input} input - The input to remove.
       */
  
      removeSource(input) {
  
          let index = this.inputs.indexOf(input);
          this.inputs.splice(index, 1);
  
      }
  
      /**
       * Simultaneously poll each aggregated input.
       */
  
      pollInputs() {
  
          for (let input of this.inputs) {
              input.pollInputs();
          }
  
      }
  
      /**
       * Returns true if any of the aggregated input should return true.
       *
       * @param {number} port - The input slot controller.
       * @param {number} code - The input slot code.
       */
  
      getState(port, code) {
  
          for (let input of this.inputs)
              if (input.getState(port, code))
                  return true;
  
          return false;
  
      }
  
  }
  