text: import sys
  import cStringIO
  import gluon.contrib.shell
  import code, thread
  from gluon.shell import env
  
  if DEMO_MODE or MULTI_USER_MODE:
      session.flash = T('disabled in demo mode')
      redirect(URL('default','site'))
  
  FE=10**9
  
  def index():
      app = request.args(0) or 'admin'
      reset()
      return dict(app=app)
  
  def callback():
      app = request.args[0]
      command = request.vars.statement
      escape = command[:1]!='!'
      history = session['history:'+app] = session.get('history:'+app,gluon.contrib.shell.History())
      if not escape:
          command = command[1:]
      if command == '%reset':
          reset()
          return '*** reset ***'
      elif command[0] == '%':
          try:
              command=session['commands:'+app][int(command[1:])]
          except ValueError:
              return ''
      session['commands:'+app].append(command)
      environ=env(app,True)
      output = gluon.contrib.shell.run(history,command,environ)
      k = len(session['commands:'+app]) - 1
      #output = PRE(output)
      #return TABLE(TR('In[%i]:'%k,PRE(command)),TR('Out[%i]:'%k,output))
      return 'In [%i] : %s%s\n' % (k + 1, command, output)
  
  def reset():
      app = request.args(0) or 'admin'
      session['commands:'+app] = []
      session['history:'+app] = gluon.contrib.shell.History()
      return 'done'
  