'Display a checklist.
:param str message: Message to display to user
:param list tags: `str` tags to select, len(tags) > 0
:param default: default value to return (if one exists)
:param str cli_flag: option used to set this value with the CLI
:param bool force_interactive: True if it\'s safe to prompt the user
because it won\'t cause any workflow regressions
:returns: tuple of (`code`, `tags`) where
`code` - str display exit code
`tags` - list of selected tags
:rtype: tuple'

def checklist(self, message, tags, default=None, cli_flag=None, force_interactive=False, **unused_kwargs):

    if self._return_default(message, default, cli_flag, force_interactive):
        return (OK, default)
    while True:
        self._print_menu(message, tags)
        (code, ans) = self.input('Select    the    appropriate    numbers    separated    by    commas    and/or    spaces,    or    leave    input    blank    to    select    all    options    shown', force_interactive=True)
        if (code == OK):
            if (len(ans.strip()) == 0):
                ans = '    '.join((str(x) for x in range(1, (len(tags) + 1))))
            indices = separate_list_input(ans)
            selected_tags = self._scrub_checklist_input(indices, tags)
            if selected_tags:
                return (code, selected_tags)
            else:
                self.outfile.write(('**    Error    -    Invalid    selection    **%s' % os.linesep))
        else:
            return (code, [])
