code: def run(self):
          while not self.stopped.isSet():
              try:
                  timeout = (self._state != 'idle') and 0.2 or None
                  rdlist, _, _ = select.select([self._socket.fileno()], [], [], timeout)
                  if not rdlist:
                      if self._state != 'idle':
                          self._state = 'idle'
                      continue
                  data = self._socket.recv(1024)
                  if not data:
                      try:
                          os.fstat(recv._socket.fileno())
                      except socket.error:
                          break
                      continue
                  code = utils.mangleIR(data, ignore_errors=True)
                  codeName = self.codeMap.get(code)
                  if codeName and (self._state != codeName):
                      self._state = codeName
                      for callback in self._callbacks:
                          callback(codeName)
              except:
                  time.sleep(0.1)