text: """
      SleekXMPP: The Sleek XMPP Library
      Copyright (C) 2011 Nathanael C. Fritz, Lance J.T. Stout
      This file is part of SleekXMPP.
  
      See the file LICENSE for copying permission.
  """
  
  from sleekxmpp import Iq
  from sleekxmpp.xmlstream import register_stanza_plugin
  from sleekxmpp.plugins import BasePlugin
  from sleekxmpp.plugins.xep_0016 import stanza
  from sleekxmpp.plugins.xep_0016.stanza import Privacy, Item
  
  
  class XEP_0016(BasePlugin):
  
      name = 'xep_0016'
      description = 'XEP-0016: Privacy Lists'
      dependencies = set(['xep_0030'])
      stanza = stanza
  
      def plugin_init(self):
          register_stanza_plugin(Iq, Privacy)
  
      def plugin_end(self):
          self.xmpp['xep_0030'].del_feature(feature=Privacy.namespace)
  
      def session_bind(self, jid):
          self.xmpp['xep_0030'].add_feature(Privacy.namespace)
  
      def get_privacy_lists(self, block=True, timeout=None, callback=None):
          iq = self.xmpp.Iq()
          iq['type'] = 'get'
          iq.enable('privacy')
          return iq.send(block=block, timeout=timeout, callback=callback)
  
      def get_list(self, name, block=True, timeout=None, callback=None):
          iq = self.xmpp.Iq()
          iq['type'] = 'get'
          iq['privacy']['list']['name'] = name
          return iq.send(block=block, timeout=timeout, callback=callback)
  
      def get_active(self, block=True, timeout=None, callback=None):
          iq = self.xmpp.Iq()
          iq['type'] = 'get'
          iq['privacy'].enable('active')
          return iq.send(block=block, timeout=timeout, callback=callback)
  
      def get_default(self, block=True, timeout=None, callback=None):
          iq = self.xmpp.Iq()
          iq['type'] = 'get'
          iq['privacy'].enable('default')
          return iq.send(block=block, timeout=timeout, callback=callback)
  
      def activate(self, name, block=True, timeout=None, callback=None):
          iq = self.xmpp.Iq()
          iq['type'] = 'set'
          iq['privacy']['active']['name'] = name
          return iq.send(block=block, timeout=timeout, callback=callback)
  
      def deactivate(self, block=True, timeout=None, callback=None):
          iq = self.xmpp.Iq()
          iq['type'] = 'set'
          iq['privacy'].enable('active')
          return iq.send(block=block, timeout=timeout, callback=callback)
  
      def make_default(self, name, block=True, timeout=None, callback=None):
          iq = self.xmpp.Iq()
          iq['type'] = 'set'
          iq['privacy']['default']['name'] = name
          return iq.send(block=block, timeout=timeout, callback=callback)
  
      def remove_default(self, block=True, timeout=None, callback=None):
          iq = self.xmpp.Iq()
          iq['type'] = 'set'
          iq['privacy'].enable('default')
          return iq.send(block=block, timeout=timeout, callback=callback)
  
      def edit_list(self, name, rules, block=True, timeout=None, callback=None):
          iq = self.xmpp.Iq()
          iq['type'] = 'set'
          iq['privacy']['list']['name'] = name
          priv_list = iq['privacy']['list']
  
          if not rules:
              rules = []
  
          for rule in rules:
              if isinstance(rule, Item):
                  priv_list.append(rule)
                  continue
  
              priv_list.add_item(
                  rule['value'],
                  rule['action'],
                  rule['order'],
                  itype=rule.get('type', None),
                  iq=rule.get('iq', None),
                  message=rule.get('message', None),
                  presence_in=rule.get('presence_in', None),
                  presence_out=rule.get('presence_out', None))
          return iq.send(block=block, timeout=timeout, callback=callback)
  
      def remove_list(self, name, block=True, timeout=None, callback=None):
          iq = self.xmpp.Iq()
          iq['type'] = 'set'
          iq['privacy']['list']['name'] = name
          return iq.send(block=block, timeout=timeout, callback=callback)
  