diff --git a/.gitignore b/.gitignore
index 587791b56..8612f5e05 100644
--- a/.gitignore
+++ b/.gitignore
@@ -25,3 +25,4 @@ test/demo.hforge.org/
*.xhtml.ca
*.xhtml.nl_BE
ikaaro/ui_dev/aruni/node_modules/
+.idea
diff --git a/CREDITS.txt b/ikaaro/CREDITS.txt
similarity index 100%
rename from CREDITS.txt
rename to ikaaro/CREDITS.txt
diff --git a/ikaaro/__init__.py b/ikaaro/__init__.py
index dcbb6ee34..d1f4350ef 100644
--- a/ikaaro/__init__.py
+++ b/ikaaro/__init__.py
@@ -26,11 +26,14 @@
from itools.gettext import register_domain
# Import from ikaaro
-from file import File
-from folder import Folder
-from registry import register_document_type
-import text
-from webpage import WebPage
+# Add class to register
+from .root import Root
+from .file import File
+from .folder import Folder
+from .registry import register_document_type
+from . import text
+from .webpage import WebPage
+
getLogger("ikaaro").addHandler(NullHandler())
getLogger("ikaaro.web").addHandler(NullHandler())
@@ -56,7 +59,7 @@
# Import required modules
-import users
+from . import users
# Register the itools domain
path = get_abspath('locale')
diff --git a/ikaaro/api/urls.py b/ikaaro/api/urls.py
index 8df338ba1..8317d9236 100644
--- a/ikaaro/api/urls.py
+++ b/ikaaro/api/urls.py
@@ -18,13 +18,13 @@
from ikaaro.urls import urlpattern
# Import from here
-from views import Api_DocView, ApiStatus_View
-from views import Api_LoginView
-from views import ApiDevPanel_ResourceJSON, ApiDevPanel_ResourceRaw, ApiDevPanel_ResourceHistory
-from views import ApiDevPanel_ClassidViewDetails, ApiDevPanel_ClassidViewList
-from views import ApiDevPanel_Config, ApiDevPanel_Log
-from views import ApiDevPanel_CatalogReindex, UUIDView
-from views import ApiDevPanel_ServerView, ApiDevPanel_ServerStop
+from .views import Api_DocView, ApiStatus_View
+from .views import Api_LoginView
+from .views import ApiDevPanel_ResourceJSON, ApiDevPanel_ResourceRaw, ApiDevPanel_ResourceHistory
+from .views import ApiDevPanel_ClassidViewDetails, ApiDevPanel_ClassidViewList
+from .views import ApiDevPanel_Config, ApiDevPanel_Log
+from .views import ApiDevPanel_CatalogReindex, UUIDView
+from .views import ApiDevPanel_ServerView, ApiDevPanel_ServerStop
urlpatterns = [
diff --git a/ikaaro/api/views.py b/ikaaro/api/views.py
index 2e372339c..4d390e76e 100644
--- a/ikaaro/api/views.py
+++ b/ikaaro/api/views.py
@@ -59,10 +59,9 @@ def get_namespace(self, resource, context):
'methods': view.known_methods,
'description': view.__doc__}
namespace['endpoints'].append(kw)
- i +=1
+ i += 1
return namespace
-
def get_view_query_as_list(self, view, schema):
l = []
for key, field in schema.items():
@@ -74,15 +73,12 @@ def get_view_query_as_list(self, view, schema):
return l
-
-
class Api_View(ItoolsView):
response_schema = {}
route = None
use_cookies = False
-
@classmethod
def get_route(cls):
"""
@@ -90,7 +86,6 @@ def get_route(cls):
"""
return cls.route
-
def get_resource(self, context):
return context.resource
@@ -126,7 +121,7 @@ class UUIDView(Api_View):
access = True
known_methods = ['DELETE']
- path_query_schema = {'uuid': Char_Field(title=MSG(u'The uuid of a resource in DB'))}
+ path_query_schema = {'uuid': Char_Field(title=MSG('The uuid of a resource in DB'))}
def get_resource(self, context):
query = get_resource_by_uuid_query(
@@ -143,7 +138,7 @@ def get_resource(self, context):
# Forbidden (403)
raise Forbidden
raise NotFound
- return search.get_resources(size=1).next()
+ return next(search.get_resources(size=1))
access_DELETE = 'is_allowed_to_remove'
@@ -160,7 +155,7 @@ class ApiDevPanel_ResourceJSON(UUIDView):
access = 'is_admin'
known_methods = ['GET', 'DELETE']
- query_schema = {'pretty': Boolean_Field(title=MSG(u'Pretty ?'))}
+ query_schema = {'pretty': Boolean_Field(title=MSG('Pretty ?'))}
def GET(self, root, context):
resource = self.get_resource(context)
@@ -195,10 +190,10 @@ class ApiDevPanel_ResourceHistory(UUIDView):
access = 'is_admin'
known_methods = ['GET', 'DELETE']
response_schema = {
- 'sha': Char_Field(title=MSG(u'SHA of the commit')),
+ 'sha': Char_Field(title=MSG('SHA of the commit')),
'author_date': Datetime_Field(title=MSG("Datetime of commit")),
- 'author_name': Char_Field(title=MSG(u"Commit's author name")),
- 'message_short': Char_Field(title=MSG(u"Commit's title"))
+ 'author_name': Char_Field(title=MSG("Commit's author name")),
+ 'message_short': Char_Field(title=MSG("Commit's title"))
}
def GET(self, root, context):
resource = self.get_resource(context)
@@ -230,11 +225,11 @@ class ApiDevPanel_ClassidViewDetails(Api_View):
access = 'is_admin'
path_query_schema = {
- 'class_id': Char_Field(title=MSG(u'A class_id registered in DB'))
+ 'class_id': Char_Field(title=MSG('A class_id registered in DB'))
}
response_schema = {
- 'class_title': Char_Field(title=MSG(u'The class_title of the resource cls')),
- 'class_id': Char_Field(title=MSG(u'The class_id of the resource cls'))
+ 'class_title': Char_Field(title=MSG('The class_title of the resource cls')),
+ 'class_id': Char_Field(title=MSG('The class_id of the resource cls'))
}
@@ -265,8 +260,8 @@ class Api_LoginView(Api_View):
access = True
known_methods = ['POST']
- schema = {'email': Email_Field(title=MSG(u'Username'), required=True),
- 'password': Password_Field(title=MSG(u'Password'), required=True)}
+ schema = {'email': Email_Field(title=MSG('Username'), required=True),
+ 'password': Password_Field(title=MSG('Password'), required=True)}
def POST(self, root, context):
raise NotImplementedError
@@ -317,9 +312,9 @@ class ApiDevPanel_ServerView(Api_View):
access = 'is_admin'
known_methods = ['GET']
response_schema = {
- 'timestamp': Char_Field(title=MSG(u"Server's start timestamp")),
- 'pid': Integer_Field(title=MSG(u"Server's PID")),
- 'port': Integer_Field(title=MSG(u"Server's port"))
+ 'timestamp': Char_Field(title=MSG("Server's start timestamp")),
+ 'pid': Integer_Field(title=MSG("Server's PID")),
+ 'port': Integer_Field(title=MSG("Server's port"))
}
def GET(self, root, context):
diff --git a/ikaaro/autoadd.py b/ikaaro/autoadd.py
index 0b1c8d526..0e47d1726 100644
--- a/ikaaro/autoadd.py
+++ b/ikaaro/autoadd.py
@@ -22,13 +22,13 @@
from itools.web import get_context, ERROR, FormError
# Import from ikaaro
-from autoform import AutoForm
-from datatypes import BirthDate
-from datatypes import Days, Months, Years
-from buttons import Button
-from fields import Field
-import messages
-from widgets import HiddenWidget, ReadOnlyWidget
+from .autoform import AutoForm
+from .datatypes import BirthDate
+from .datatypes import Days, Months, Years
+from .buttons import Button
+from .fields import Field
+from . import messages
+from .widgets import HiddenWidget, ReadOnlyWidget
@@ -37,7 +37,7 @@ class AutoAdd(AutoForm):
access = 'is_allowed_to_add'
- actions = [Button(access=True, css='btn btn-primary', title=MSG(u'Add'))]
+ actions = [Button(access=True, css='btn btn-primary', title=MSG('Add'))]
action_goto = None
goto_view = None
goto_parent_view = None # DEPRECATED -> use action_goto
@@ -90,10 +90,10 @@ def get_title(self, context):
cls = self._resource_class
if cls:
class_title = cls.class_title.gettext()
- title = MSG(u'Add {class_title}')
+ title = MSG('Add {class_title}')
return title.gettext(class_title=class_title)
- return MSG(u'Add resource').gettext()
+ return MSG('Add resource').gettext()
def _get_datatype(self, resource, context, name):
@@ -162,11 +162,11 @@ def get_value(self, resource, context, name, datatype):
# View cls_description
value = getattr(self, name, None)
if value is not None:
- return value.gettext() if value else u''
+ return value.gettext() if value else ''
# Resource cls_description
cls = self._resource_class
value = cls.class_description
- return value.gettext() if value else u''
+ return value.gettext() if value else ''
elif name == 'referrer':
referrer = context.query.get('referrer')
return referrer or context.get_referrer()
@@ -177,7 +177,7 @@ def get_value(self, resource, context, name, datatype):
if getattr(datatype, 'multilingual', False):
for language in resource.get_edit_languages(context):
- value.setdefault(language, u'')
+ value.setdefault(language, '')
return value
@@ -196,7 +196,7 @@ def get_container(self, resource, context, form):
root = context.root
if not root.has_permission(context.user, 'add', container, class_id):
path = '/' if path == '.' else '/%s/' % path
- msg = ERROR(u'Adding resources to {path} is not allowed.')
+ msg = ERROR('Adding resources to {path} is not allowed.')
raise FormError(msg.gettext(path=path))
# Ok
diff --git a/ikaaro/autoedit.py b/ikaaro/autoedit.py
index 39adc2faa..a8b2e1433 100644
--- a/ikaaro/autoedit.py
+++ b/ikaaro/autoedit.py
@@ -29,18 +29,18 @@
from itools.web import get_context
# Import from ikaaro
-from autoform import AutoForm
-from widgets import HiddenWidget, timestamp_widget
-from datatypes import BirthDate
-from datatypes import Days, Months, Years
-from fields import Field
-import messages
-from views import ContextMenu
+from .autoform import AutoForm
+from .widgets import HiddenWidget, timestamp_widget
+from .datatypes import BirthDate
+from .datatypes import Days, Months, Years
+from .fields import Field
+from . import messages
+from .views import ContextMenu
class EditLanguageMenu(ContextMenu):
- title = MSG(u'Configuration')
+ title = MSG('Configuration')
template = '/ui/ikaaro/generic/edit_language_menu.xml'
view = None
@@ -87,7 +87,7 @@ def display(self):
class AutoEdit(AutoForm):
access = 'is_allowed_to_edit'
- title = MSG(u'Edit')
+ title = MSG('Edit')
fields = ['title', 'description', 'subject']
def get_fields(self):
diff --git a/ikaaro/autoform.py b/ikaaro/autoform.py
index ec6e60778..2f25f3854 100644
--- a/ikaaro/autoform.py
+++ b/ikaaro/autoform.py
@@ -30,9 +30,9 @@
from itools.web import STLView
# Import from ikaaro
-from buttons import Button
-from datatypes import BirthDate
-from datatypes import Days, Months, Years
+from .buttons import Button
+from .datatypes import BirthDate
+from .datatypes import Days, Months, Years
###########################################################################
@@ -46,8 +46,8 @@ class AutoForm(STLView):
Widgets is a list:
- [TextWidget('firstname', title=MSG(u'Firstname')),
- TextWidget('lastname', title=MSG(u'Lastname'))]
+ [TextWidget('firstname', title=MSG('Firstname')),
+ TextWidget('lastname', title=MSG('Lastname'))]
"""
template = '/ui/ikaaro/auto_form.xml'
@@ -58,7 +58,7 @@ class AutoForm(STLView):
widgets = []
description = None
method = 'post'
- actions = [Button(access=True, css='btn btn-success', title=MSG(u'Save'))]
+ actions = [Button(access=True, css='btn btn-success', title=MSG('Save'))]
def get_widgets(self, resource, context):
return self.widgets
diff --git a/ikaaro/buttons.py b/ikaaro/buttons.py
index 550e6ecfe..0d5800911 100644
--- a/ikaaro/buttons.py
+++ b/ikaaro/buttons.py
@@ -20,8 +20,8 @@
from itools.stl import STLTemplate
# Import from ikaaro
-from datatypes import CopyCookie
-from utils import make_stl_template
+from .datatypes import CopyCookie
+from .utils import make_stl_template
class Button(STLTemplate):
@@ -51,7 +51,7 @@ def onclick(cls):
confirm = cls.confirm
if not confirm:
return None
- return u'return confirm("%s");' % confirm.gettext()
+ return 'return confirm("%s");' % confirm.gettext()
@proto_lazy_property
@@ -66,10 +66,10 @@ def show(self):
class Remove_Button(Button):
access = 'is_allowed_to_remove'
- confirm = MSG(u'Are you sure you want to delete this?')
+ confirm = MSG('Are you sure you want to delete this?')
css = 'btn btn-danger'
name = 'remove'
- title = MSG(u'Remove')
+ title = MSG('Remove')
###########################################################################
@@ -89,7 +89,7 @@ def show(self):
class Remove_BrowseButton(Remove_Button, BrowseButton):
- confirm = MSG(u'Are you sure you want to delete the selection?')
+ confirm = MSG('Are you sure you want to delete the selection?')
@@ -98,7 +98,7 @@ class RenameButton(BrowseButton):
access = 'is_allowed_to_move'
css = 'btn btn-success'
name = 'rename'
- title = MSG(u'Rename')
+ title = MSG('Rename')
@@ -107,7 +107,7 @@ class CopyButton(BrowseButton):
access = 'is_allowed_to_copy'
css = 'btn btn-primary'
name = 'copy'
- title = MSG(u'Copy')
+ title = MSG('Copy')
@@ -116,7 +116,7 @@ class CutButton(BrowseButton):
access = 'is_allowed_to_move'
css = 'btn btn-primary'
name = 'cut'
- title = MSG(u'Cut')
+ title = MSG('Cut')
@@ -125,7 +125,7 @@ class PasteButton(BrowseButton):
access = 'is_allowed_to_move'
css = 'btn btn-primary'
name = 'paste'
- title = MSG(u'Paste')
+ title = MSG('Paste')
@proto_lazy_property
@@ -141,7 +141,7 @@ class AddButton(BrowseButton):
access = 'is_allowed_to_edit'
name = 'add'
- title = MSG(u'Add')
+ title = MSG('Add')
css = 'btn btn-primary'
@@ -150,19 +150,19 @@ class ZipButton(BrowseButton):
access = 'is_allowed_to_edit'
name = 'zip'
- title = MSG(u'Zip')
+ title = MSG('Zip')
class SearchButton(BrowseButton):
access = 'is_allowed_to_view'
name = 'search'
- title = MSG(u'Search')
+ title = MSG('Search')
class ExportAsJSONButton(BrowseButton):
- title = MSG(u"Exporter les ressources (JSON)")
+ title = MSG("Exporter les ressources (JSON)")
css = "btn btn-primary"
access = "is_admin"
name = "export_as_json"
diff --git a/ikaaro/config.py b/ikaaro/config.py
index 2de22f648..dbc980fb1 100644
--- a/ikaaro/config.py
+++ b/ikaaro/config.py
@@ -17,41 +17,34 @@
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
-
# Import from itools
-from itools.database import OrQuery
from itools.datatypes import String
from itools.gettext import MSG
from itools.i18n import get_language_name, get_languages
-from itools.uri import Path
from itools.web import STLView, INFO, ERROR
-from itools.database import PhraseQuery
-# Import from ikaaro
-from ikaaro.views.folder_views import Folder_BrowseContent
# Import from here
-from folder import Folder
-from messages import MSG_CHANGES_SAVED
-from utils import get_base_path_query
-from views import IconsView
+from .folder import Folder
+from .messages import MSG_CHANGES_SAVED
+from .views import IconsView
###########################################################################
# Views
###########################################################################
GROUPS = [
- ('access', MSG(u'Users, Access Control & Security')),
- ('webmaster', MSG(u'Webmaster tools')),
- ('content', MSG(u'Content')),
- ('other', MSG(u'Other')),
+ ('access', MSG('Users, Access Control & Security')),
+ ('webmaster', MSG('Webmaster tools')),
+ ('content', MSG('Content')),
+ ('other', MSG('Other')),
]
class Configuration_View(STLView):
access = 'is_allowed_to_edit'
- title = MSG(u'Configuration')
+ title = MSG('Configuration')
template = '/ui/ikaaro/website/config.xml'
def get_namespace(self, resource, context):
@@ -98,15 +91,15 @@ def action(self, resource, context, form):
if resource.get_resource(name, soft=True) is None:
resource.make_resource(name, module)
- context.message = MSG(u'New modules initialized.')
+ context.message = MSG('New modules initialized.')
class Config_EditLanguages(STLView):
access = 'is_admin'
- title = MSG(u'Languages')
- description = MSG(u'Define the Web Site languages.')
+ title = MSG('Languages')
+ description = MSG('Define the Web Site languages.')
icon = 'languages.png'
template = '/ui/ikaaro/website/edit_languages.xml'
schema = {'codes': String(multiple=True, mandatory=True)}
@@ -129,8 +122,8 @@ def get_namespace(self, resource, context):
# Not active languages
not_active = [
- x for x in get_languages() if x['code'] not in ws_languages ]
- not_active.sort(lambda x, y: cmp(x['name'], y['name']))
+ x for x in get_languages() if x['code'] not in ws_languages]
+ not_active = sorted(not_active, key=lambda x: x["name"])
# Ok
return {
@@ -146,7 +139,7 @@ def action_change_default_language(self, resource, context, form):
# This action requires only one language to be selected
codes = form['codes']
if len(codes) != 1:
- message = ERROR(u'You must select one and only one language.')
+ message = ERROR('You must select one and only one language.')
context.message = message
return
default = codes[0]
@@ -168,7 +161,7 @@ def action_remove_languages(self, resource, context, form):
languages = resource.get_value('website_languages')
default = languages[0]
if default in codes:
- message = ERROR(u'You can not remove the default language.')
+ message = ERROR('You can not remove the default language.')
context.message = message
return
@@ -176,7 +169,7 @@ def action_remove_languages(self, resource, context, form):
languages = [ x for x in languages if x not in codes ]
resource.set_property('website_languages', languages)
# Ok
- context.message = INFO(u'Languages removed.')
+ context.message = INFO('Languages removed.')
#######################################################################
@@ -192,7 +185,7 @@ def action_add_language(self, resource, context, form):
ws_languages.append(form['code'])
resource.set_property('website_languages', ws_languages)
# Ok
- context.message = INFO(u'Language added.')
+ context.message = INFO('Language added.')
@@ -202,7 +195,7 @@ def action_add_language(self, resource, context, form):
class Configuration(Folder):
class_id = 'configuration'
- class_title = MSG(u'Configuration')
+ class_title = MSG('Configuration')
class_views = ['view', 'edit_languages']
class_icon_css = 'fa-cogs'
@@ -232,13 +225,13 @@ def unregister_module(cls, name):
# Import core config modules
-import config_access
-import config_captcha
-import config_footer
-import config_groups
-import config_mail
-import config_menu
-import config_models
-import config_register
-import config_seo
-import config_theme
+from . import config_access
+from . import config_captcha
+from . import config_footer
+from . import config_groups
+from . import config_mail
+from . import config_menu
+from . import config_models
+from . import config_register
+from . import config_seo
+from . import config_theme
diff --git a/ikaaro/config_access.py b/ikaaro/config_access.py
index a4e61cd41..aa3b38a72 100644
--- a/ikaaro/config_access.py
+++ b/ikaaro/config_access.py
@@ -26,16 +26,16 @@
from ikaaro.views.folder_views import Folder_BrowseContent
# Import from here
-from autoadd import AutoAdd
-from autoedit import AutoEdit
-from buttons import Remove_BrowseButton
-from config import Configuration
-from config_common import NewResource_Local
-from enumerates import Groups_Datatype
-from fields import Select_Field
-from folder import Folder
-from resource_ import DBResource
-from utils import get_base_path_query
+from .autoadd import AutoAdd
+from .autoedit import AutoEdit
+from .buttons import Remove_BrowseButton
+from .config import Configuration
+from .config_common import NewResource_Local
+from .enumerates import Groups_Datatype
+from .fields import Select_Field
+from .folder import Folder
+from .resource_ import DBResource
+from .utils import get_base_path_query
###########################################################################
@@ -52,7 +52,7 @@ def get_options(self):
title = '/' if not path else ('%s/' % path)
items.append({'name': path, 'value': title, 'selected': False})
- items.sort(key=lambda x: x['value'])
+ items = sorted(items, key=lambda x: x['value'])
return items
@@ -60,41 +60,41 @@ class Path_Field(Select_Field):
datatype = Path_Datatype()
has_empty_option = False
- title = MSG(u'Path')
+ title = MSG('Path')
class PathDepth_Field(Select_Field):
- title = MSG(u'Depth')
+ title = MSG('Depth')
default = '0'
multiple = False
has_empty_option = False
endline = True
options = [
- {'name': '0', 'value': u'0'},
- {'name': '1', 'value': u'1'},
- {'name': '2', 'value': u'2'},
- {'name': '3', 'value': u'3'},
- {'name': '4', 'value': u'4'},
- {'name': '5', 'value': u'5'},
- {'name': '*', 'value': MSG(u'No limit')}]
+ {'name': '0', 'value': '0'},
+ {'name': '1', 'value': '1'},
+ {'name': '2', 'value': '2'},
+ {'name': '3', 'value': '3'},
+ {'name': '4', 'value': '4'},
+ {'name': '5', 'value': '5'},
+ {'name': '*', 'value': MSG('No limit')}]
class Permission_Datatype(Enumerate):
options = [
- {'name': 'view', 'value': MSG(u'View')},
- {'name': 'edit', 'value': MSG(u'Remove and modify')},
- {'name': 'share', 'value': MSG(u'Share')},
- {'name': 'add', 'value': MSG(u'Add')}]
+ {'name': 'view', 'value': MSG('View')},
+ {'name': 'edit', 'value': MSG('Remove and modify')},
+ {'name': 'share', 'value': MSG('Share')},
+ {'name': 'add', 'value': MSG('Add')}]
class Permissions_Field(Select_Field):
- title = MSG(u'Permission')
+ title = MSG('Permission')
datatype = Permission_Datatype()
@@ -110,14 +110,13 @@ def get_options(self):
options = [ {'name': class_id, 'value': cls.class_title.gettext()}
for class_id, cls in options.items() ]
-
- options.sort(key=lambda x: x['value'])
+ options = sorted(options, key=lambda x: x['value'])
return options
class SearchFormat_Field(Select_Field):
- title = MSG(u'Resource type')
+ title = MSG('Resource type')
datatype = SearchFormat_Datatype()
@@ -127,7 +126,7 @@ class SearchFormat_Field(Select_Field):
###########################################################################
class AccessRule_Results(Folder_BrowseContent):
- title = MSG(u'View results')
+ title = MSG('View results')
search_schema = {}
search_widgets = []
@@ -138,10 +137,10 @@ def get_items_query(self, resource, context):
class AccessRule(DBResource):
class_id = 'config-access-rule'
- class_title = MSG(u'Access rule')
+ class_title = MSG('Access rule')
# Fields
- group = Select_Field(required=True, title=MSG(u'User group'),
+ group = Select_Field(required=True, title=MSG('User group'),
datatype=Groups_Datatype(), indexed=True, stored=True)
permission = Permissions_Field(required=True, indexed=True, stored=True)
search_path = Path_Field(indexed=True, stored=True)
@@ -234,7 +233,7 @@ def search_schema(self):
def table_columns(self):
columns = [
('checkbox', None),
- ('abspath', MSG(u'Num.'))]
+ ('abspath', MSG('Num.'))]
for name, field in self._search_fields:
columns.append((name, field.title))
@@ -288,8 +287,8 @@ class ConfigAccess(Folder):
class_id = 'config-access'
class_version = '20110606'
- class_title = MSG(u'Access Control')
- class_description = MSG(u'Choose the security policy.')
+ class_title = MSG('Access Control')
+ class_description = MSG('Choose the security policy.')
class_icon_css = 'fa-user-plus'
# Configuration
@@ -388,7 +387,7 @@ def get_document_types(self):
# Views
class_views = ['browse_content', 'add_rule', 'edit']
browse_content = ConfigAccess_Browse()
- add_rule = NewResource_Local(title=MSG(u'Add rule'))
+ add_rule = NewResource_Local(title=MSG('Add rule'))
diff --git a/ikaaro/config_captcha.py b/ikaaro/config_captcha.py
index 49d94b08f..6961b6a4f 100644
--- a/ikaaro/config_captcha.py
+++ b/ikaaro/config_captcha.py
@@ -15,7 +15,7 @@
# along with this program. If not, see .
# Import from standard library
-import urllib, urllib2
+import urllib.request, urllib.parse, urllib.error, urllib.request, urllib.error, urllib.parse
# Import from itools
from itools.core import proto_lazy_property
@@ -24,13 +24,13 @@
from itools.web import get_context
# Import from ikaaro
-from autoedit import AutoEdit
-from config import Configuration
-from fields import Field, Select_Field, Text_Field
-from folder import Folder
-from resource_ import DBResource
-from utils import make_stl_template
-from widgets import TextWidget, RadioWidget, Widget
+from .autoedit import AutoEdit
+from .config import Configuration
+from .fields import Field, Select_Field, Text_Field
+from .folder import Folder
+from .resource_ import DBResource
+from .utils import make_stl_template
+from .widgets import TextWidget, RadioWidget, Widget
class CaptchaFieldML(Text_Field):
@@ -43,7 +43,7 @@ class CaptchaFieldML(Text_Field):
class RecaptchaWidget(Widget):
- title = MSG(u"Please enter the words below")
+ title = MSG("Please enter the words below")
public_key = None
template = make_stl_template(
@@ -85,23 +85,23 @@ def is_valid(cls, value):
recaptcha_response_field = context.get_form_value(
'recaptcha_response_field', type=String)
# Test if captcha value is valid
- params = urllib.urlencode ({
+ params = urllib.parse.urlencode({
'privatekey': cls.private_key,
- 'remoteip' : remote_ip,
+ 'remoteip': remote_ip,
'challenge': recaptcha_challenge_field,
- 'response' : recaptcha_response_field,
+ 'response': recaptcha_response_field,
})
- request = urllib2.Request (
- url = "http://api-verify.recaptcha.net/verify",
- data = params,
- headers = {
+ request = urllib.request.Request(
+ url="http://api-verify.recaptcha.net/verify",
+ data=params,
+ headers={
"Content-type": "application/x-www-form-urlencoded",
"User-agent": "reCAPTCHA Python"
}
)
- httpresp = urllib2.urlopen (request)
- return_values = httpresp.read ().splitlines ();
- httpresp.close();
+ httpresp = urllib.request.urlopen(request)
+ return_values = httpresp.read().splitlines()
+ httpresp.close()
context.recaptcha_return_code = return_code = return_values[0]
return return_code == 'true'
@@ -110,12 +110,12 @@ def is_valid(cls, value):
class Captcha_Recaptcha(DBResource):
class_id = 'config-captcha-recaptcha'
- class_title = MSG(u'Recaptcha')
+ class_title = MSG('Recaptcha')
class_views = ['edit']
# Fields
- public_key = CaptchaFieldML(title=MSG(u"Recaptcha public key"))
- private_key = CaptchaFieldML(title=MSG(u"Recaptcha private key"))
+ public_key = CaptchaFieldML(title=MSG("Recaptcha public key"))
+ private_key = CaptchaFieldML(title=MSG("Recaptcha private key"))
# Views
edit = AutoEdit(fields=['public_key', 'private_key'])
@@ -145,7 +145,7 @@ def is_valid(cls, value):
class QuestionCaptchaWidget(TextWidget):
- title = MSG(u"Please answer the question below:")
+ title = MSG("Please answer the question below:")
question = None
template = make_stl_template("""
@@ -159,12 +159,12 @@ class QuestionCaptchaWidget(TextWidget):
class Captcha_Question(DBResource):
class_id = 'config-captcha-question'
- class_title = MSG(u'Captcha question')
+ class_title = MSG('Captcha question')
class_views = ['edit']
# Fields
- question = CaptchaFieldML(default=u'2 + 3', title=MSG(u"Question"))
- answer = CaptchaFieldML(default=u'5', title=MSG(u"Answer"))
+ question = CaptchaFieldML(default='2 + 3', title=MSG("Question"))
+ answer = CaptchaFieldML(default='5', title=MSG("Answer"))
# Views
edit = AutoEdit(fields=['question', 'answer'])
@@ -248,27 +248,27 @@ class CaptchaType(Enumerate):
default = 'question'
options = [
- {'name': 'question', 'value': MSG(u'Question captcha')},
- {'name': 'recaptcha', 'value': MSG(u'Recaptcha')}]
+ {'name': 'question', 'value': MSG('Question captcha')},
+ {'name': 'recaptcha', 'value': MSG('Recaptcha')}]
class Captcha(Folder):
class_id = 'config-captcha'
- class_title = MSG(u'Captcha')
- class_description = MSG(u'Feature to protect from spammers')
+ class_title = MSG('Captcha')
+ class_description = MSG('Feature to protect from spammers')
class_icon48 = '/ui/ikaaro/icons/48x48/captcha.png'
class_icon_css = 'fa-user-secret'
# Fields
captcha_type = Select_Field(
- required=True, title=MSG(u"Captcha type"), datatype=CaptchaType,
+ required=True, title=MSG("Captcha type"), datatype=CaptchaType,
widget = Select_CaptchaWidget(has_empty_option=False))
# Views
class_views = ['edit']
- edit = AutoEdit(title=MSG(u'Edit captcha'), fields=['captcha_type'])
+ edit = AutoEdit(title=MSG('Edit captcha'), fields=['captcha_type'])
# Configuration
config_name = 'captcha'
diff --git a/ikaaro/config_common.py b/ikaaro/config_common.py
index f6d86a4ec..1c6fc5c3e 100644
--- a/ikaaro/config_common.py
+++ b/ikaaro/config_common.py
@@ -15,7 +15,7 @@
# along with this program. If not, see .
# Import from ikaaro
-from views.folder_views import Folder_NewResource
+from .views.folder_views import Folder_NewResource
print('[OBSOLETE] NewResource_Local has been renamed Folder_NewResource')
diff --git a/ikaaro/config_footer.py b/ikaaro/config_footer.py
index 1eac61d93..88d9a02df 100644
--- a/ikaaro/config_footer.py
+++ b/ikaaro/config_footer.py
@@ -18,16 +18,16 @@
from itools.gettext import MSG
# Import from ikaaro
-from config import Configuration
-from file_views import File_Edit
-from webpage import WebPage
+from .config import Configuration
+from .file_views import File_Edit
+from .webpage import WebPage
class Footer(WebPage):
class_id = 'config-footer'
- class_title = MSG(u'Footer')
- class_description = MSG(u'Define the site footer.')
+ class_title = MSG('Footer')
+ class_description = MSG('Define the site footer.')
class_icon_css = 'fa-sort-down'
class_views = ['edit', 'externaledit']
diff --git a/ikaaro/config_groups.py b/ikaaro/config_groups.py
index 8e10685db..1d75da6b4 100644
--- a/ikaaro/config_groups.py
+++ b/ikaaro/config_groups.py
@@ -20,14 +20,14 @@
from itools.gettext import MSG
# Import from ikaaro
-from autoadd import AutoAdd
-from buttons import BrowseButton, Remove_BrowseButton, RenameButton
-from config import Configuration
-from config_common import NewResource_Local
-from messages import MSG_CHANGES_SAVED
-from order import OrderedFolder, OrderedFolder_BrowseContent
-from resource_ import DBResource
-from users_views import BrowseUsers
+from .autoadd import AutoAdd
+from .buttons import BrowseButton, Remove_BrowseButton, RenameButton
+from .config import Configuration
+from .config_common import NewResource_Local
+from .messages import MSG_CHANGES_SAVED
+from .order import OrderedFolder, OrderedFolder_BrowseContent
+from .resource_ import DBResource
+from .users_views import BrowseUsers
@@ -36,7 +36,7 @@ class Group_BrowseUsers(BrowseUsers):
schema = {'ids': String(multiple=True)}
table_actions = [
- BrowseButton(access='is_admin', title=MSG(u'Update'))]
+ BrowseButton(access='is_admin', title=MSG('Update'))]
@proto_lazy_property
@@ -72,8 +72,8 @@ def action(self, resource, context, form):
class Group(DBResource):
class_id = 'config-group'
- class_title = MSG(u'User Group')
- class_description = MSG(u'...')
+ class_title = MSG('User Group')
+ class_description = MSG('...')
# Views
class_views = ['browse_users', 'edit']
@@ -85,19 +85,19 @@ class Group(DBResource):
class BrowseGroups(OrderedFolder_BrowseContent):
access = 'is_admin'
- title = MSG(u'Browse groups')
+ title = MSG('Browse groups')
search_schema = {}
search_widgets = []
table_columns = [
('checkbox', None),
- ('abspath', MSG(u'Name')),
- ('title', MSG(u'Title')),
- ('members', MSG(u'Members')),
- ('mtime', MSG(u'Last Modified')),
- ('last_author', MSG(u'Last Author')),
- ('order', MSG(u'Order'))]
+ ('abspath', MSG('Name')),
+ ('title', MSG('Title')),
+ ('members', MSG('Members')),
+ ('mtime', MSG('Last Modified')),
+ ('last_author', MSG('Last Author')),
+ ('order', MSG('Order'))]
table_actions = [Remove_BrowseButton, RenameButton]
@proto_lazy_property
@@ -119,8 +119,8 @@ def get_item_value(self, resource, context, item, column):
class ConfigGroups(OrderedFolder):
class_id = 'config-groups'
- class_title = MSG(u'User Groups')
- class_description = MSG(u'Manage user groups.')
+ class_title = MSG('User Groups')
+ class_description = MSG('Manage user groups.')
class_icon_css = 'fa-users'
class_views = ['browse_content', 'add_group', 'edit']
@@ -130,9 +130,9 @@ class ConfigGroups(OrderedFolder):
property_name = 'groups'
default_groups = [
- ('admins', {'en': u'Admins'}),
- ('reviewers', {'en': u'Reviewers'}),
- ('members', {'en': u'Members'})]
+ ('admins', {'en': 'Admins'}),
+ ('reviewers', {'en': 'Reviewers'}),
+ ('members', {'en': 'Members'})]
def init_resource(self, **kw):
@@ -148,7 +148,7 @@ def get_document_types(self):
# Views
browse_content = BrowseGroups()
- add_group = NewResource_Local(title=MSG(u'Add group'))
+ add_group = NewResource_Local(title=MSG('Add group'))
Configuration.register_module(ConfigGroups)
diff --git a/ikaaro/config_mail.py b/ikaaro/config_mail.py
index 880a989dd..d4a87041f 100644
--- a/ikaaro/config_mail.py
+++ b/ikaaro/config_mail.py
@@ -23,10 +23,10 @@
from itools.web import get_context
# Import from ikaaro
-from autoedit import AutoEdit
-from config import Configuration
-from fields import Boolean_Field, Select_Field, Text_Field, Textarea_Field
-from resource_ import DBResource
+from .autoedit import AutoEdit
+from .config import Configuration
+from .fields import Boolean_Field, Select_Field, Text_Field, Textarea_Field
+from .resource_ import DBResource
@@ -46,17 +46,17 @@ def get_options(cls):
user_title = user_email
options.append({'name': user.name, 'value': user_title,
'sort_value': user_title.lower()})
- options.sort(key=itemgetter('sort_value'))
+ options = sorted(options, key=itemgetter('sort_value'))
return options
-mail_description = MSG(u'Configure the website email options')
+mail_description = MSG('Configure the website email options')
class ConfigMail_Edit(AutoEdit):
- title = MSG(u'Email options')
+ title = MSG('Email options')
description = mail_description
fields = ['emails_from_addr', 'emails_reply_to', 'emails_signature',
'contacts']
@@ -66,18 +66,18 @@ class ConfigMail_Edit(AutoEdit):
class ConfigMail(DBResource):
class_id = 'config-mail'
- class_title = MSG(u'Email options')
+ class_title = MSG('Email options')
class_description = mail_description
class_icon_css = 'fa-envelope'
class_views = ['edit']
# Fields
contacts = Select_Field(multiple=True, datatype=ContactsOptions,
- title=MSG(u'Select the contact accounts'),
+ title=MSG('Select the contact accounts'),
has_empty_option=False)
- emails_from_addr = Text_Field(title=MSG(u'From header'))
- emails_reply_to = Boolean_Field(title=MSG(u'Reply to'), default=True)
- emails_signature = Textarea_Field(title=MSG(u'Signature'))
+ emails_from_addr = Text_Field(title=MSG('From header'))
+ emails_reply_to = Boolean_Field(title=MSG('Reply to'), default=True)
+ emails_signature = Textarea_Field(title=MSG('Signature'))
# Views
edit = ConfigMail_Edit()
diff --git a/ikaaro/config_menu.py b/ikaaro/config_menu.py
index 27d2433af..06bf37fdd 100644
--- a/ikaaro/config_menu.py
+++ b/ikaaro/config_menu.py
@@ -24,26 +24,26 @@
from itools.uri import Path
# Import from ikaaro
-from autoadd import AutoAdd
-from autoedit import AutoEdit
-from config import Configuration
-from config_common import NewResource_Local
-from buttons import Remove_BrowseButton
-from fields import Select_Field, URI_Field
-from order import OrderedFolder, OrderedFolder_BrowseContent
-from utils import split_reference
-from widgets import PathSelectorWidget
+from .autoadd import AutoAdd
+from .autoedit import AutoEdit
+from .config import Configuration
+from .config_common import NewResource_Local
+from .buttons import Remove_BrowseButton
+from .fields import Select_Field, URI_Field
+from .order import OrderedFolder, OrderedFolder_BrowseContent
+from .utils import split_reference
+from .widgets import PathSelectorWidget
class Target_Field(Select_Field):
default = '_top'
- options = [{'name': '_top', 'value': MSG(u'Current page')},
- {'name': '_blank', 'value': MSG(u'New page')}]
+ options = [{'name': '_top', 'value': MSG('Current page')},
+ {'name': '_blank', 'value': MSG('New page')}]
required = True
- title = MSG(u'Target')
+ title = MSG('Target')
has_empty_option = False
@@ -53,12 +53,12 @@ class MenuItem_Browse(OrderedFolder_BrowseContent):
search_widgets = None
table_columns = [
('checkbox', None),
- ('abspath', MSG(u'Path')),
- ('title', MSG(u'Title')),
- ('target', MSG(u'Target')),
- ('mtime', MSG(u'Last Modified')),
- ('last_author', MSG(u'Last Author')),
- ('order', MSG(u'Order'))]
+ ('abspath', MSG('Path')),
+ ('title', MSG('Title')),
+ ('target', MSG('Target')),
+ ('mtime', MSG('Last Modified')),
+ ('last_author', MSG('Last Author')),
+ ('order', MSG('Order'))]
table_actions = [Remove_BrowseButton]
def get_item_value(self, resource, context, item, column):
@@ -71,7 +71,7 @@ def get_item_value(self, resource, context, item, column):
class AddMenu(NewResource_Local):
- title = MSG(u'Add item')
+ title = MSG('Add item')
def get_items(self, resource, context):
return tuple(resource.get_document_types())
@@ -81,10 +81,10 @@ def get_items(self, resource, context):
class MenuItem(OrderedFolder):
class_id = 'config-menu-item'
- class_title = MSG(u'Menu')
+ class_title = MSG('Menu')
# Fields
- path = URI_Field(required=True, title=MSG(u'Path'),
+ path = URI_Field(required=True, title=MSG('Path'),
widget=PathSelectorWidget)
target = Target_Field()
@@ -255,8 +255,8 @@ def get_menu_namespace_level(self, context, url, use_first_child=False):
class ConfigMenu(MenuItem):
class_id = 'config-menu'
- class_title = MSG(u'Configuration Menu')
- class_description = MSG(u'Edit the global menu.')
+ class_title = MSG('Configuration Menu')
+ class_description = MSG('Edit the global menu.')
class_icon_css = 'fa-sitemap'
class_views = ['browse_content', 'add_menu', 'edit']
@@ -268,7 +268,7 @@ def init_resource(self, **kw):
super(ConfigMenu, self).init_resource(**kw)
# Menu
order = []
- menus = [('/', u'Home'), ('/;contact', u'Contact')]
+ menus = [('/', 'Home'), ('/;contact', 'Contact')]
for path, title in menus:
name = checkid(title)
order.append(name)
@@ -286,14 +286,14 @@ def get_menu_namespace(self, context, show_first_child=False, src=None):
Where the list of items is the first level
and item_dic = {'active': True or False,
'class': 'active' or 'in_path' or None,
- 'description': MSG(u'About Python'),
+ 'description': MSG('About Python'),
'id': 'tab_python',
'in_path': True or False,
'items': [item_dic11, ..., item_dic1N] or None,
'name': 'python',
'path': '../python',
'target': '_top' or '_blank' or None,
- 'title': MSG(u'Python')}
+ 'title': MSG('Python')}
"items" contains the first level. Each item_dic contains in turn an
'items' with its children.
diff --git a/ikaaro/config_models.py b/ikaaro/config_models.py
index df3e306ac..9a59ab406 100644
--- a/ikaaro/config_models.py
+++ b/ikaaro/config_models.py
@@ -18,31 +18,31 @@
from itools.gettext import MSG
# Import from ikaaro
-from views.folder_views import Folder_BrowseContent
+from .views.folder_views import Folder_BrowseContent
# Import from ikaaro
-from autoadd import AutoAdd
-from autoedit import AutoEdit
-from buttons import Remove_BrowseButton
-from config import Configuration
-from config_common import NewResource_Local
-from fields import Boolean_Field, Date_Field, Email_Field, Integer_Field
-from fields import Select_Field, Text_Field, Textarea_Field
-from folder import Folder
-from order import OrderedFolder, OrderedFolder_BrowseContent
-from resource_ import DBResource
-from widgets import CheckboxWidget, RadioWidget, SelectWidget
+from .autoadd import AutoAdd
+from .autoedit import AutoEdit
+from .buttons import Remove_BrowseButton
+from .config import Configuration
+from .config_common import NewResource_Local
+from .fields import Boolean_Field, Date_Field, Email_Field, Integer_Field
+from .fields import Select_Field, Text_Field, Textarea_Field
+from .folder import Folder
+from .order import OrderedFolder, OrderedFolder_BrowseContent
+from .resource_ import DBResource
+from .widgets import CheckboxWidget, RadioWidget, SelectWidget
class FieldType_Field(Select_Field):
options = [
- {'name': 'boolean', 'value': MSG(u'Boolean')},
- {'name': 'date', 'value': MSG(u'Date')},
- {'name': 'email', 'value': MSG(u'Email')},
- {'name': 'integer', 'value': MSG(u'Integer')},
- {'name': 'text', 'value': MSG(u'Text')},
- {'name': 'textarea', 'value': MSG(u'Textarea')}]
+ {'name': 'boolean', 'value': MSG('Boolean')},
+ {'name': 'date', 'value': MSG('Date')},
+ {'name': 'email', 'value': MSG('Email')},
+ {'name': 'integer', 'value': MSG('Integer')},
+ {'name': 'text', 'value': MSG('Text')},
+ {'name': 'textarea', 'value': MSG('Textarea')}]
fields_map = {
'boolean': Boolean_Field,
@@ -57,9 +57,9 @@ class FieldType_Field(Select_Field):
class ModelField_Base(DBResource):
# Fields
- required = Boolean_Field(title=MSG(u'Required'))
- multiple = Boolean_Field(title=MSG(u'Multiple'))
- tip = Text_Field(title=MSG(u'Tip'))
+ required = Boolean_Field(title=MSG('Required'))
+ multiple = Boolean_Field(title=MSG('Multiple'))
+ tip = Text_Field(title=MSG('Tip'))
def get_owner(self):
@@ -93,7 +93,7 @@ def get_field_kw(self, field):
class ModelField_Inherited(ModelField_Base):
class_id = 'model-field-inherited'
- class_title = MSG(u'Inherited field')
+ class_title = MSG('Inherited field')
class_views = ['edit']
@@ -101,10 +101,10 @@ class ModelField_Inherited(ModelField_Base):
class ModelField_Standard(ModelField_Base):
class_id = 'model-field-standard'
- class_title = MSG(u'Standard field')
+ class_title = MSG('Standard field')
# Fields
- field_type = FieldType_Field(required=True, title=MSG(u'Field type'))
+ field_type = FieldType_Field(required=True, title=MSG('Field type'))
# API
def build_field(self):
@@ -124,7 +124,7 @@ def build_field(self):
class Choice(DBResource):
class_id = 'model-field-choice'
- class_title = MSG(u'Choice')
+ class_title = MSG('Choice')
# Views
class_views = ['edit']
@@ -140,28 +140,28 @@ class ModelField_Choices_Browse(OrderedFolder_BrowseContent):
table_columns = [
('checkbox', None),
('icon', None),
- ('abspath', MSG(u'Path')),
- ('title', MSG(u'Title')),
- ('format', MSG(u'Type')),
- ('mtime', MSG(u'Last Modified')),
- ('last_author', MSG(u'Last Author')),
- ('order', MSG(u'Order'))]
+ ('abspath', MSG('Path')),
+ ('title', MSG('Title')),
+ ('format', MSG('Type')),
+ ('mtime', MSG('Last Modified')),
+ ('last_author', MSG('Last Author')),
+ ('order', MSG('Order'))]
table_actions = [Remove_BrowseButton]
class ChoicesWidget_Field(Select_Field):
- options = [{'name': 'radio-checkbox', 'value': u'Radio/Checkbox'},
- {'name': 'select', 'value': u'Select'}]
+ options = [{'name': 'radio-checkbox', 'value': 'Radio/Checkbox'},
+ {'name': 'select', 'value': 'Select'}]
class ModelField_Choices(OrderedFolder, ModelField_Base):
class_id = 'model-field-choices'
- class_title = MSG(u'Choices field')
+ class_title = MSG('Choices field')
# Fields
- choices_widget = ChoicesWidget_Field(title=MSG(u'Widget to use'),
+ choices_widget = ChoicesWidget_Field(title=MSG('Widget to use'),
required=True)
def get_document_types(self):
@@ -186,7 +186,7 @@ def get_widget(self):
# Views
class_views = ['browse_content', 'add_choice', 'edit']
browse_content = ModelField_Choices_Browse()
- add_choice = NewResource_Local(title=MSG(u'Add choice'))
+ add_choice = NewResource_Local(title=MSG('Add choice'))
_fields = ModelField_Base._fields + ['choices_widget']
new_instance = AutoAdd(fields=_fields, automatic_resource_name=True)
@@ -225,12 +225,12 @@ class Model_Browse(OrderedFolder_BrowseContent):
table_columns = [
('checkbox', None),
('icon', None),
- ('abspath', MSG(u'Path')),
- ('title', MSG(u'Title')),
- ('format', MSG(u'Type')),
- ('mtime', MSG(u'Last Modified')),
- ('last_author', MSG(u'Last Author')),
- ('order', MSG(u'Order'))]
+ ('abspath', MSG('Path')),
+ ('title', MSG('Title')),
+ ('format', MSG('Type')),
+ ('mtime', MSG('Last Modified')),
+ ('last_author', MSG('Last Author')),
+ ('order', MSG('Order'))]
table_actions = [Remove_BrowseButton]
@@ -238,17 +238,17 @@ class Model_Browse(OrderedFolder_BrowseContent):
class Model(OrderedFolder):
class_id = '-model'
- class_title = MSG(u'Base model')
- class_description = MSG(u'...')
+ class_title = MSG('Base model')
+ class_description = MSG('...')
# Fields
- title = Text_Field(indexed=True, stored=True, title=MSG(u'Title'), required=True)
+ title = Text_Field(indexed=True, stored=True, title=MSG('Title'), required=True)
# Views
class_views = ['browse_content', 'add_field', 'edit']
browse_content = Model_Browse()
new_instance = Model_NewInstance()
- add_field = NewResource_Local(title=MSG(u'Add field'))
+ add_field = NewResource_Local(title=MSG('Add field'))
# Order configuration
allow_to_unorder_items = True
@@ -319,11 +319,11 @@ class ConfigModels_Browse(Folder_BrowseContent):
table_columns = [
('checkbox', None),
- ('abspath', MSG(u'Path')),
- ('title', MSG(u'Title')),
- ('base_class', MSG(u'Base class')),
- ('mtime', MSG(u'Last Modified')),
- ('last_author', MSG(u'Last Author'))]
+ ('abspath', MSG('Path')),
+ ('title', MSG('Title')),
+ ('base_class', MSG('Base class')),
+ ('mtime', MSG('Last Modified')),
+ ('last_author', MSG('Last Author'))]
table_actions = [Remove_BrowseButton]
@@ -331,8 +331,8 @@ class ConfigModels_Browse(Folder_BrowseContent):
class ConfigModels(Folder):
class_id = 'config-models'
- class_title = MSG(u'Content models')
- class_description = MSG(u'Define new types of content resources.')
+ class_title = MSG('Content models')
+ class_description = MSG('Define new types of content resources.')
# Configuration
config_name = 'models'
@@ -341,7 +341,7 @@ class ConfigModels(Folder):
# Views
class_views = ['browse_content', 'add_model', 'edit']
browse_content = ConfigModels_Browse()
- add_model = NewResource_Local(title=MSG(u'Add model'))
+ add_model = NewResource_Local(title=MSG('Add model'))
def get_document_types(self):
return [Model]
diff --git a/ikaaro/config_register.py b/ikaaro/config_register.py
index 4b134d3a3..52c511037 100644
--- a/ikaaro/config_register.py
+++ b/ikaaro/config_register.py
@@ -22,16 +22,16 @@
from itools.web import STLView
# Import from ikaaro
-from autoedit import AutoEdit
-from autoform import AutoForm
-from config import Configuration
-from config_captcha import Captcha_Field
-from datatypes import BirthDate
-from datatypes import Days, Months, Years
-from emails import send_email
-from fields import Boolean_Field, HTMLFile_Field
-from resource_ import DBResource
-from widgets import Widget
+from .autoedit import AutoEdit
+from .autoform import AutoForm
+from .config import Configuration
+from .config_captcha import Captcha_Field
+from .datatypes import BirthDate
+from .datatypes import Days, Months, Years
+from .emails import send_email
+from .fields import Boolean_Field, HTMLFile_Field
+from .resource_ import DBResource
+from .widgets import Widget
class TermsOfService_View(STLView):
@@ -48,7 +48,7 @@ def GET(self, resource, context):
class TermsOfService_Widget(Widget):
template = '/ui/ikaaro/register_terms_of_service.xml'
- title = MSG(u'Terms of Service')
+ title = MSG('Terms of Service')
inline = True
@@ -56,7 +56,7 @@ class TermsOfService_Widget(Widget):
class RegisterForm(AutoForm):
access = 'is_allowed_to_register'
- title = MSG(u'Create an account')
+ title = MSG('Create an account')
form_id = 'register-form'
fields = ['firstname', 'lastname', 'email', 'captcha', 'tos']
@@ -154,7 +154,7 @@ def action(self, resource, context, form):
email_id = 'user-ask-for-confirmation'
else:
# User already registered
- user = results.get_resources().next()
+ user = next(results.get_resources())
email_id = 'register-already-registered'
# 2. Send email
@@ -162,9 +162,9 @@ def action(self, resource, context, form):
# 3. Show message
message = MSG(
- u'
'
- u'An email has been sent to you, to finish the registration '
- u'process follow the instructions detailed in it.
')
+ ''
+ 'An email has been sent to you, to finish the registration '
+ 'process follow the instructions detailed in it.
')
return message.gettext().encode('utf-8')
@@ -172,8 +172,8 @@ def action(self, resource, context, form):
class ConfigRegister(DBResource):
class_id = 'config-register'
- class_title = MSG(u'User registration')
- class_description = MSG(u'Configuration of the user registration process.')
+ class_title = MSG('User registration')
+ class_description = MSG('Configuration of the user registration process.')
class_icon_css = 'fa-user-plus'
class_views = ['edit']
@@ -183,7 +183,7 @@ class ConfigRegister(DBResource):
# Fields
is_open = Boolean_Field(default=False,
- title=MSG(u'Users can register by themselves'))
+ title=MSG('Users can register by themselves'))
tos = HTMLFile_Field(title=MSG(u"Terms of service"))
# Views
diff --git a/ikaaro/config_seo.py b/ikaaro/config_seo.py
index bf8faf836..94b8f6c5b 100644
--- a/ikaaro/config_seo.py
+++ b/ikaaro/config_seo.py
@@ -18,20 +18,20 @@
from itools.gettext import MSG
# Import from ikaaro
-from autoedit import AutoEdit
-from config import Configuration
-from fields import Char_Field
-from resource_ import DBResource
+from .autoedit import AutoEdit
+from .config import Configuration
+from .fields import Char_Field
+from .resource_ import DBResource
seo_description = MSG(
- u'Optimize your website for better ranking in search engine results.')
+ 'Optimize your website for better ranking in search engine results.')
class SEO(DBResource):
class_id = 'config-seo'
- class_title = MSG(u'Search Engine Optimization')
+ class_title = MSG('Search Engine Optimization')
class_description = seo_description
class_icon16 = '/ui/ikaaro/icons/16x16/search.png'
class_icon48 = '/ui/ikaaro/icons/48x48/search.png'
@@ -39,16 +39,16 @@ class SEO(DBResource):
# Fields
google_site_verification = Char_Field(
- title=MSG(u'Google site verification key'))
+ title=MSG('Google site verification key'))
yahoo_site_verification = Char_Field(
- title=MSG(u'Yahoo site verification key'))
+ title=MSG('Yahoo site verification key'))
bing_site_verification = Char_Field(
- title=MSG(u'Bing site verification key'))
+ title=MSG('Bing site verification key'))
# Views
class_views = ['edit']
- edit = AutoEdit(title=MSG(u'Search engine optimization'),
+ edit = AutoEdit(title=MSG('Search engine optimization'),
description=seo_description,
fields=['google_site_verification',
'yahoo_site_verification',
diff --git a/ikaaro/config_theme.py b/ikaaro/config_theme.py
old mode 100644
new mode 100755
index 1538a28a0..257432660
--- a/ikaaro/config_theme.py
+++ b/ikaaro/config_theme.py
@@ -21,24 +21,24 @@
from itools.handlers import TextFile
# Import from ikaaro
-from autoedit import AutoEdit
-from config import Configuration
-from fields import File_Field, TextFile_Field
-from folder import Folder
+from .autoedit import AutoEdit
+from .config import Configuration
+from .fields import File_Field, TextFile_Field
+from .folder import Folder
class Theme(Folder):
class_id = 'config-theme'
- class_title = MSG(u'Theme')
- class_description = MSG(u'Allow to customize ikaaro skin')
+ class_title = MSG('Theme')
+ class_description = MSG('Allow to customize ikaaro skin')
class_icon_css = 'fa-star'
# Fields
- logo = File_Field(title=MSG(u'Logo'))
- favicon = File_Field(title=MSG(u'Favicon'))
- banner = File_Field(title=MSG(u'Banner'))
- style = TextFile_Field(title=MSG(u'CSS Style'), class_handler=TextFile)
+ logo = File_Field(title=MSG('Logo'))
+ favicon = File_Field(title=MSG('Favicon'))
+ banner = File_Field(title=MSG('Banner'))
+ style = TextFile_Field(title=MSG('CSS Style'), class_handler=TextFile)
def init_resource(self, **kw):
@@ -51,11 +51,11 @@ def init_resource(self, **kw):
self.set_value('style', data)
# Logo
path = get_abspath('ui/ikaaro/themes/logo.png')
- data = open(path).read()
+ data = open(path, "rb").read()
self.set_value('logo', data)
# Banner
path = get_abspath('ui/ikaaro/themes/banner.jpg')
- data = open(path).read()
+ data = open(path, "rb").read()
self.set_value('banner', data)
# Views
diff --git a/ikaaro/context.py b/ikaaro/context.py
index 4324ce5cf..dfa90b91f 100644
--- a/ikaaro/context.py
+++ b/ikaaro/context.py
@@ -18,11 +18,15 @@
from datetime import datetime
import json
from logging import getLogger
-from pytz import timezone
import time
+#Import from packages
+from pytz import timezone
from jwcrypto.jwt import JWT, JWTExpired
from jwcrypto.jws import InvalidJWSSignature, InvalidJWSObject
+from requests_toolbelt import MultipartDecoder
+import cgi
+
# Import from itools
from itools.core import freeze, proto_lazy_property
from itools.core import fixed_offset, is_prototype, local_tz
@@ -44,10 +48,11 @@
from itools.web.exceptions import JWTExpiredException
# Import from ikaaro
-from skins import skin_registry
-from constants import JWT_EXPIRE, JWT_ISSUER
-from constants import SESSION_KEY
-from server import get_server
+from .skins import skin_registry
+from .constants import JWT_EXPIRE, JWT_ISSUER
+from .constants import SESSION_KEY
+from .server import get_server
+from .utils import dict_of_bytes_to_string
log = getLogger("ikaaro.web")
@@ -325,7 +330,8 @@ def get_form(self):
if self.method in ('GET', 'HEAD'):
return self.uri.query
# XXX What parameters with the fields defined in the query?
- return self.body
+ new_data = dict_of_bytes_to_string(self.body)
+ return new_data
def accept_cors(self):
@@ -464,7 +470,7 @@ def get_form_value(self, name, type=String, default=None):
def get_form_keys(self):
- return self.get_form().keys()
+ return list(self.get_form().keys())
def get_form_body(self, body):
@@ -497,7 +503,7 @@ def get_body_from_environ(self):
return self.get_json_body(body)
elif content_type.startswith('multipart/'):
# Case 3: multipart
- return self.get_multipart_body(body)
+ return self.get_multipart_body_v2(body)
elif content_type.startswith('application/'):
return {'body': body}
# Case 4: Not managed content type
@@ -542,6 +548,50 @@ def get_multipart_body(self, body):
form[name] = [form[name], body]
return form
+ def get_multipart_body_v2(self, body):
+ """
+ FORM return example :
+ {'cls_description': 'Importer des documents bureautiques, des images, des fichiers de média, etc.', 'referrer': 'http://127.0.0.1:8081/', 'data': ('test.txt', 'text/plain', 'test fichier\n\n'), 'title:fr': ''}
+ """
+
+ content_type = self.environ.get('CONTENT_TYPE')
+ decoder = MultipartDecoder(body, content_type)
+ form = {}
+ for part in decoder.parts:
+ content_disposition = part.headers[b"Content-Disposition"]
+ if type(content_disposition) is bytes:
+ content_disposition = content_disposition.decode()
+ value, header_parameters = cgi.parse_header(content_disposition)
+ try:
+ body = part.text
+ except:
+ # Image encoding
+ body = part.content
+ pass
+ name = header_parameters['name']
+ if 'filename' in header_parameters:
+ filename = header_parameters['filename']
+ if filename:
+ if b'content-type' in part.headers:
+ mimetype = part.headers[b'content-type']
+ if type(mimetype) is bytes:
+ mimetype = mimetype.decode()
+ else:
+ mimetype = 'text/plain'
+ form[name] = filename, mimetype, body
+ else:
+ form[name] = None
+ else:
+ if name not in form:
+ form[name] = body
+ else:
+ if isinstance(form[name], list):
+ form[name].append(body)
+ else:
+ form[name] = [form[name], body]
+ return form
+
+
#######################################################################
# ACL API
#######################################################################
@@ -592,9 +642,13 @@ def search(self, query=None, user=None, **kw):
# If the search is done by a CRON we don't
# care about the default ACLs rules
return self.database.search(query)
+
if user is None:
- return self._context_user_search.search(query, **kw)
- return self._user_search(user).search(query, **kw)
+ _user_search = self._context_user_search
+ else:
+ _user_search = self._user_search(user)
+
+ return _user_search.search(query, **kw)
#######################################################################
# Login API
@@ -695,7 +749,7 @@ def decode_bearer(self, bearer):
if jwt:
jwt_payload = json.loads(jwt.token.objects['payload'])
user = jwt_payload.get('id')
- return user.encode("utf-8")
+ return user
def get_authentication_credentials(self):
@@ -824,7 +878,7 @@ def format_time(self, time):
return format_time(time, accept=self.accept_language)
- def format_number(self, number, places=2, curr='', pos=u'', neg=u'-',
+ def format_number(self, number, places=2, curr='', pos='', neg='-',
trailneg=u""):
return format_number(number, places=places, curr=curr, pos=pos,
neg=neg, trailneg=trailneg, accept=self.accept_language)
diff --git a/ikaaro/database.py b/ikaaro/database.py
index 931b71513..a065c2ada 100644
--- a/ikaaro/database.py
+++ b/ikaaro/database.py
@@ -69,7 +69,7 @@ def __init__(
ROSEM.acquire()
else:
DBSEM.acquire()
- from server import get_server
+ from .server import get_server
self.context = cls()
self.context.database = database
self.context.server = get_server()
@@ -84,7 +84,7 @@ def __init__(
)
search = database.search(query)
if search:
- user = search.get_resources(size=1).next()
+ user = next(search.get_resources(size=1))
# Get user by username
if username:
user = self.context.root.get_user(username)
@@ -167,7 +167,7 @@ def _before_commit(self):
# should this be done?
old2new = [ (s, t) for s, t in self.resources_old2new.items()
if t and s != t ]
- old2new.sort(key=lambda x: x[1]) # Sort by target
+ old2new = sorted(old2new, key=lambda x: x[1]) # Sort by target
for source, target in old2new:
target = Path(target)
resource = root.get_resource(target)
@@ -194,7 +194,7 @@ def _before_commit(self):
# 3. Documents to unindex (the update_links methods calls
# 'change_resource' which may modify the resources_old2new dictionary)
- docs_to_unindex = self.resources_old2new.keys()
+ docs_to_unindex = list(self.resources_old2new.keys())
self.resources_old2new.clear()
# 4. Update mtime/last_author
@@ -212,7 +212,7 @@ def _before_commit(self):
# Remove from to_reindex if resource has been deleted
to_reindex = to_reindex - set(docs_to_unindex)
# 5. Index
- docs_to_index = self.resources_new2old.keys()
+ docs_to_index = list(self.resources_new2old.keys())
docs_to_index = set(docs_to_index) | to_reindex
docs_to_unindex = list(set(docs_to_unindex) - docs_to_index)
docs_to_index = list(docs_to_index)
diff --git a/ikaaro/datatypes.py b/ikaaro/datatypes.py
index f0e051edb..0da541724 100644
--- a/ikaaro/datatypes.py
+++ b/ikaaro/datatypes.py
@@ -18,10 +18,10 @@
from datetime import date
# Import from the Standard Library
-from base64 import decodestring, encodestring
+from base64 import decodebytes, encodebytes
from datetime import timedelta
from marshal import dumps, loads
-from urllib import quote, unquote
+from urllib.parse import quote, unquote
from zlib import compress, decompress
# Import from itools
@@ -80,12 +80,16 @@ class Password_Datatype(DataType):
@staticmethod
def decode(data):
- return decodestring(unquote(data))
+ data = unquote(data)
+ data = data.encode()
+ return decodebytes(data)
@staticmethod
def encode(value):
- return quote(encodestring(value))
+ if type(value) is str:
+ value = value.encode("utf-8")
+ return quote(encodebytes(value))
class ChoosePassword_Datatype(String):
@@ -175,7 +179,7 @@ class HTMLBody(XHTMLBody):
def encode(value):
if value is None:
return ''
- if type(value) is unicode:
+ if type(value) is str:
return value.encode('utf-8')
if not is_xml_stream(value):
value = value.get_body().get_content_elements()
@@ -187,25 +191,25 @@ def encode(value):
# Enumerates
###########################################################################
days = {
- 0: MSG(u'Monday'),
- 1: MSG(u'Tuesday'),
- 2: MSG(u'Wednesday'),
- 3: MSG(u'Thursday'),
- 4: MSG(u'Friday'),
- 5: MSG(u'Saturday'),
- 6: MSG(u'Sunday')}
+ 0: MSG('Monday'),
+ 1: MSG('Tuesday'),
+ 2: MSG('Wednesday'),
+ 3: MSG('Thursday'),
+ 4: MSG('Friday'),
+ 5: MSG('Saturday'),
+ 6: MSG('Sunday')}
class DaysOfWeek(Enumerate):
options = [
- {'name':'1', 'value': MSG(u'Monday'), 'shortname': 'MO'},
- {'name':'2', 'value': MSG(u'Tuesday'), 'shortname': 'TU'},
- {'name':'3', 'value': MSG(u'Wednesday'), 'shortname': 'WE'},
- {'name':'4', 'value': MSG(u'Thursday'), 'shortname': 'TH'},
- {'name':'5', 'value': MSG(u'Friday'), 'shortname': 'FR'},
- {'name':'6', 'value': MSG(u'Saturday'), 'shortname': 'SA'},
- {'name':'7', 'value': MSG(u'Sunday'), 'shortname': 'SU'}]
+ {'name': '1', 'value': MSG('Monday'), 'shortname': 'MO'},
+ {'name': '2', 'value': MSG('Tuesday'), 'shortname': 'TU'},
+ {'name': '3', 'value': MSG('Wednesday'), 'shortname': 'WE'},
+ {'name': '4', 'value': MSG('Thursday'), 'shortname': 'TH'},
+ {'name': '5', 'value': MSG('Friday'), 'shortname': 'FR'},
+ {'name': '6', 'value': MSG('Saturday'), 'shortname': 'SA'},
+ {'name': '7', 'value': MSG('Sunday'), 'shortname': 'SU'}]
@classmethod
def get_shortname(cls, name):
@@ -226,13 +230,13 @@ class Boolean3(Enumerate):
""" Boolean 3 states : Yes/No/Any useful on search form."""
default = ''
options = [
- #{'name': '', 'value': u''},
- {'name': '1', 'value': MSG(u'Yes')},
- {'name': '0', 'value': MSG(u'No')}]
+ #{'name': '', 'value': ''},
+ {'name': '1', 'value': MSG('Yes')},
+ {'name': '0', 'value': MSG('No')}]
@staticmethod
def decode(value):
- if value is '':
+ if value == '':
return None
return bool(int(value))
@@ -276,18 +280,18 @@ class Days(IntegerRange):
class Months(Enumerate):
options = [
- {'name': '1', 'value': MSG(u'January')},
- {'name': '2', 'value': MSG(u'February')},
- {'name': '3', 'value': MSG(u'March')},
- {'name': '4', 'value': MSG(u'April')},
- {'name': '5', 'value': MSG(u'May')},
- {'name': '6', 'value': MSG(u'June')},
- {'name': '7', 'value': MSG(u'July')},
- {'name': '8', 'value': MSG(u'August')},
- {'name': '9', 'value': MSG(u'September')},
- {'name': '10', 'value': MSG(u'October')},
- {'name': '11', 'value': MSG(u'November')},
- {'name': '12', 'value': MSG(u'December')}]
+ {'name': '1', 'value': MSG('January')},
+ {'name': '2', 'value': MSG('February')},
+ {'name': '3', 'value': MSG('March')},
+ {'name': '4', 'value': MSG('April')},
+ {'name': '5', 'value': MSG('May')},
+ {'name': '6', 'value': MSG('June')},
+ {'name': '7', 'value': MSG('July')},
+ {'name': '8', 'value': MSG('August')},
+ {'name': '9', 'value': MSG('September')},
+ {'name': '10', 'value': MSG('October')},
+ {'name': '11', 'value': MSG('November')},
+ {'name': '12', 'value': MSG('December')}]
@@ -297,5 +301,5 @@ class Years(Enumerate):
@classmethod
def get_options(cls):
- return [ {'name': str(d), 'value': str(d)}
- for d in range(cls.start, date.today().year) ]
+ return [{'name': str(d), 'value': str(d)}
+ for d in range(cls.start, date.today().year)]
diff --git a/ikaaro/emails/__init__.py b/ikaaro/emails/__init__.py
index 481d8a0de..935cceae0 100644
--- a/ikaaro/emails/__init__.py
+++ b/ikaaro/emails/__init__.py
@@ -15,4 +15,4 @@
# along with this program. If not, see .
# Import from here
-from emails import register_email, send_email, emails_registry, Email
+from .emails import register_email, send_email, emails_registry, Email
diff --git a/ikaaro/emails/emails.py b/ikaaro/emails/emails.py
index 5b0f1fe5e..e8c914734 100644
--- a/ikaaro/emails/emails.py
+++ b/ikaaro/emails/emails.py
@@ -90,69 +90,69 @@ class User_AskForConfirmation(User_Email):
"""
class_id = 'user-ask-for-confirmation'
- subject = MSG(u'Registration confirmation')
+ subject = MSG('Registration confirmation')
text = MSG(
- u'To confirm your identity, follow this link:\n'
- u'\n'
- u' {user}/;confirm_registration?username={userid}&key={userkey}')
+ 'To confirm your identity, follow this link:\n'
+ '\n'
+ ' {user}/;confirm_registration?username={userid}&key={userkey}')
class AddUser_SendNotification(User_Email):
class_id = 'add-user-send-notification'
- subject = MSG(u'Registration notification')
+ subject = MSG('Registration notification')
text = MSG(
- u'You have been registered to the "{host_title}" site:\n'
- u'\n'
- u' {host}/')
+ 'You have been registered to the "{host_title}" site:\n'
+ '\n'
+ ' {host}/')
class Register_AlreadyRegistered(User_Email):
class_id = 'register-already-registered'
- subject = MSG(u"Already registered")
+ subject = MSG("Already registered")
text = MSG(
- u'You already have an account:\n'
- u'\n'
- u' {host}/;login?loginname={userid}')
+ 'You already have an account:\n'
+ '\n'
+ ' {host}/;login?loginname={userid}')
class Register_SendConfirmation(User_Email):
class_id = 'register-send-confirmation'
- subject = MSG(u"Registration confirmed")
+ subject = MSG("Registration confirmed")
text = MSG(
- u'You have been registered to the "{host_title}" site:\n'
- u'\n'
- u' {host}/')
+ 'You have been registered to the "{host_title}" site:\n'
+ '\n'
+ ' {host}/')
class ForgottenPassword_AskForConfirmation(User_Email):
class_id = 'forgotten-password-ask-for-confirmation'
- subject = MSG(u"Choose a new password")
+ subject = MSG("Choose a new password")
text = MSG(
- u'To choose a new password, click the link:\n'
- u'\n'
- u' {user}/;change_password_forgotten?username={userid}&key={userkey}')
+ 'To choose a new password, click the link:\n'
+ '\n'
+ ' {user}/;change_password_forgotten?username={userid}&key={userkey}')
class SwitchState_Activate(User_Email):
class_id = 'switch-state-activate'
- subject = MSG(u'Your account has been re-activated')
- text = MSG(u'Your account has been re-activated')
+ subject = MSG('Your account has been re-activated')
+ text = MSG('Your account has been re-activated')
class SwitchState_Deactivate(User_Email):
class_id = 'switch-state-deactivate'
- subject = MSG(u'Your account has been canceled')
- text = MSG(u'Your account has been canceled')
+ subject = MSG('Your account has been canceled')
+ text = MSG('Your account has been canceled')
# Registry
diff --git a/ikaaro/enumerates.py b/ikaaro/enumerates.py
index b02c1c5ea..2e2e98cb2 100644
--- a/ikaaro/enumerates.py
+++ b/ikaaro/enumerates.py
@@ -20,7 +20,7 @@
from itools.web import get_context
# Import from ikaaro
-from fields import Abspath_Field
+from .fields import Abspath_Field
###########################################################################
@@ -70,8 +70,8 @@ class UserGroups_Datatype(DynamicEnumerate_Datatype):
class Groups_Datatype(UserGroups_Datatype):
special_groups = [
- {'name': 'everybody', 'value': MSG(u'Everybody')},
- {'name': 'authenticated', 'value': MSG(u'Authenticated')}]
+ {'name': 'everybody', 'value': MSG('Everybody')},
+ {'name': 'authenticated', 'value': MSG('Authenticated')}]
def get_options(self):
diff --git a/ikaaro/exceptions.py b/ikaaro/exceptions.py
index 4243f221b..4336447a7 100644
--- a/ikaaro/exceptions.py
+++ b/ikaaro/exceptions.py
@@ -16,10 +16,10 @@
# TODO Move this exception to itools
-class ParserError(StandardError):
+class ParserError(Exception):
pass
# TODO Move this exception to itools
-class ConsistencyError(StandardError):
+class ConsistencyError(Exception):
pass
diff --git a/ikaaro/fields.py b/ikaaro/fields.py
old mode 100644
new mode 100755
index 5bab5a9b0..0e5b2db31
--- a/ikaaro/fields.py
+++ b/ikaaro/fields.py
@@ -34,16 +34,16 @@
from itools.xml import START_ELEMENT
# Import from ikaaro
-from datatypes import Boolean3, BirthDate, HexadecimalColor, HTMLBody
-from datatypes import Password_Datatype, ChoosePassword_Datatype
-from datatypes import DaysOfWeek
-from links import get_abspath_links, update_abspath_links
-from utils import split_reference, get_secure_hash
-from widgets import Widget, FileWidget, MultilineWidget, TextWidget
-from widgets import CheckboxWidget, RadioWidget, SelectWidget
-from widgets import BirthDateWidget, DateWidget, DatetimeWidget
-from widgets import PasswordWidget, ChoosePassword_Widget
-from widgets import ColorPickerWidget, ProgressBarWidget, RTEWidget
+from .datatypes import Boolean3, BirthDate, HexadecimalColor, HTMLBody
+from .datatypes import Password_Datatype, ChoosePassword_Datatype
+from .datatypes import DaysOfWeek
+from .links import get_abspath_links, update_abspath_links
+from .utils import split_reference, get_secure_hash
+from .widgets import Widget, FileWidget, MultilineWidget, TextWidget
+from .widgets import CheckboxWidget, RadioWidget, SelectWidget
+from .widgets import BirthDateWidget, DateWidget, DatetimeWidget
+from .widgets import PasswordWidget, ChoosePassword_Widget
+from .widgets import ColorPickerWidget, ProgressBarWidget, RTEWidget
class Field(BaseField):
@@ -198,7 +198,7 @@ def _set_value(self, resource, name, value, language=None, **kw):
def rest(self):
rest = super(Metadata_Field, self).rest()
- rest['parameters'] = self.parameters_schema.keys()
+ rest['parameters'] = list(self.parameters_schema.keys())
return rest
@@ -232,9 +232,9 @@ def get_value(self, resource, name, language=None):
class Char_Field(Metadata_Field):
- datatype = String()
+ datatype = Unicode()
widget = TextWidget()
- rest_type = 'bytes'
+ rest_type = 'bytes' # XXX
class Color_Field(Metadata_Field):
@@ -655,7 +655,7 @@ def _get_handler_from_value(self, value):
if type(value) is tuple:
filename, mimetype, value = value
- if type(value) is str:
+ if type(value) in [bytes, str]:
cls = self.class_handler
if cls is None:
mimetype = magic_from_buffer(value)
@@ -860,7 +860,7 @@ class SelectDays_Field(Select_Field):
class UUID_Field(Char_Field):
- title = MSG(u'UUID')
+ title = MSG('UUID')
indexed = True
stored = True
readonly = True
@@ -869,7 +869,7 @@ class UUID_Field(Char_Field):
class CTime_Field(Datetime_Field):
- title = MSG(u'Creation date')
+ title = MSG('Creation date')
indexed = True
stored = True
readonly = True
@@ -878,7 +878,7 @@ class CTime_Field(Datetime_Field):
class MTime_Field(Datetime_Field):
- title = MSG(u'Modification date')
+ title = MSG('Modification date')
indexed = True
stored = True
readonly = True
@@ -887,7 +887,7 @@ class MTime_Field(Datetime_Field):
class LastAuthor_Field(Char_Field):
- title = MSG(u'Last author')
+ title = MSG('Last author')
indexed = False
stored = True
readonly = True
@@ -896,7 +896,7 @@ class LastAuthor_Field(Char_Field):
class Title_Field(Text_Field):
- title = MSG(u'Title')
+ title = MSG('Title')
indexed = True
stored = True
@@ -904,12 +904,12 @@ class Title_Field(Text_Field):
class Description_Field(Textarea_Field):
- title = MSG(u'Description')
+ title = MSG('Description')
indexed = True
class Subject_Field(Text_Field):
- title = MSG(u'Keywords')
+ title = MSG('Keywords')
indexde = True
diff --git a/ikaaro/file.py b/ikaaro/file.py
index 425a45e1e..b15e2bfda 100644
--- a/ikaaro/file.py
+++ b/ikaaro/file.py
@@ -34,15 +34,15 @@
from itools.web import get_context
# Import from ikaaro
-from database import Database
-from fields import Char_Field, File_Field, Owner_Field
-from file_views import File_NewInstance, File_View
-from file_views import File_Edit, File_ExternalEdit, File_ExternalEdit_View
-from file_views import File_Download
-from file_views import Image_View, Video_View, Archive_View
-from file_views import Flash_View
-from resource_ import DBResource
-from resource_views import DBResource_GetImage
+from .database import Database
+from .fields import Char_Field, File_Field, Owner_Field
+from .file_views import File_NewInstance, File_View
+from .file_views import File_Edit, File_ExternalEdit, File_ExternalEdit_View
+from .file_views import File_Download
+from .file_views import Image_View, Video_View, Archive_View
+from .file_views import Flash_View
+from .resource_ import DBResource
+from .resource_views import DBResource_GetImage
@@ -53,9 +53,9 @@ class File(DBResource):
class_id = 'file'
class_version = '20090122'
- class_title = MSG(u'File')
+ class_title = MSG('File')
class_description = MSG(
- u'Upload office documents, images, media files, etc.')
+ 'Upload office documents, images, media files, etc.')
class_icon16 = '/ui/ikaaro/icons/16x16/file.png'
class_icon48 = '/ui/ikaaro/icons/48x48/file.png'
class_views = ['view', 'edit', 'externaledit', 'remove', 'subscribe',
@@ -89,7 +89,7 @@ def get_all_extensions(self):
#######################################################################
def to_text(self):
data = self.get_value('data')
- return data and data.to_text() or u''
+ return data and data.to_text() or ''
def get_files_to_archive(self, content=False):
@@ -123,7 +123,7 @@ def get_content_type(self):
class Image(File):
class_id = 'image'
- class_title = MSG(u'Image')
+ class_title = MSG('Image')
class_icon16 = '/ui/ikaaro/icons/16x16/image.png'
class_icon48 = '/ui/ikaaro/icons/48x48/image.png'
class_views = ['view', 'download', 'edit', 'externaledit', 'remove',
@@ -169,7 +169,7 @@ def init_resource(self, **kw):
class SVG(Image):
class_id = 'image/svg+xml'
- class_title = MSG(u'Image SVG')
+ class_title = MSG('Image SVG')
# Fields
data = File_Field(required=True, class_handler=SVGFile)
@@ -179,8 +179,8 @@ class SVG(Image):
class Video(File):
class_id = 'video'
- class_title = MSG(u'Video')
- class_description = MSG(u'Video')
+ class_title = MSG('Video')
+ class_description = MSG('Video')
class_icon16 = '/ui/ikaaro/icons/16x16/flash.png'
class_icon48 = '/ui/ikaaro/icons/48x48/flash.png'
@@ -192,8 +192,8 @@ class Video(File):
class Flash(File):
class_id = 'application/x-shockwave-flash'
- class_title = MSG(u'Flash')
- class_description = MSG(u'Flash Document')
+ class_title = MSG('Flash')
+ class_description = MSG('Flash Document')
class_icon16 = '/ui/ikaaro/icons/16x16/flash.png'
class_icon48 = '/ui/ikaaro/icons/48x48/flash.png'
@@ -208,8 +208,8 @@ class Flash(File):
class MSWord(File):
class_id = 'application/msword'
- class_title = MSG(u'Word')
- class_description = MSG(u'Word Text')
+ class_title = MSG('Word')
+ class_description = MSG('Word Text')
class_icon16 = '/ui/ikaaro/icons/16x16/word.png'
class_icon48 = '/ui/ikaaro/icons/48x48/word.png'
@@ -221,8 +221,8 @@ class MSWord(File):
class MSExcel(File):
class_id = 'application/vnd.ms-excel'
- class_title = MSG(u'Excel')
- class_description = MSG(u'Excel Spreadsheet')
+ class_title = MSG('Excel')
+ class_description = MSG('Excel Spreadsheet')
class_icon16 = '/ui/ikaaro/icons/16x16/excel.png'
class_icon48 = '/ui/ikaaro/icons/48x48/excel.png'
@@ -234,8 +234,8 @@ class MSExcel(File):
class MSPowerPoint(File):
class_id = 'application/vnd.ms-powerpoint'
- class_title = MSG(u'PowerPoint')
- class_description = MSG(u'PowerPoint Presentation')
+ class_title = MSG('PowerPoint')
+ class_description = MSG('PowerPoint Presentation')
class_icon16 = '/ui/ikaaro/icons/16x16/powerpoint.png'
class_icon48 = '/ui/ikaaro/icons/48x48/powerpoint.png'
@@ -247,8 +247,8 @@ class MSPowerPoint(File):
class MSWordX(File):
class_id = MSWordXFile.class_mimetypes[0]
- class_title = MSG(u'Word')
- class_description = MSG(u'Word Text')
+ class_title = MSG('Word')
+ class_description = MSG('Word Text')
class_icon16 = '/ui/ikaaro/icons/16x16/word.png'
class_icon48 = '/ui/ikaaro/icons/48x48/word.png'
@@ -260,8 +260,8 @@ class MSWordX(File):
class MSExcelX(File):
class_id = MSExcelXFile.class_mimetypes[0]
- class_title = MSG(u'Excel')
- class_description = MSG(u'Excel Spreadsheet')
+ class_title = MSG('Excel')
+ class_description = MSG('Excel Spreadsheet')
class_icon16 = '/ui/ikaaro/icons/16x16/excel.png'
class_icon48 = '/ui/ikaaro/icons/48x48/excel.png'
@@ -273,8 +273,8 @@ class MSExcelX(File):
class MSPowerPointX(File):
class_id = MSPowerPointXFile.class_mimetypes[0]
- class_title = MSG(u'PowerPoint')
- class_description = MSG(u'PowerPoint Presentation')
+ class_title = MSG('PowerPoint')
+ class_description = MSG('PowerPoint Presentation')
class_icon16 = '/ui/ikaaro/icons/16x16/powerpoint.png'
class_icon48 = '/ui/ikaaro/icons/48x48/powerpoint.png'
@@ -286,8 +286,8 @@ class MSPowerPointX(File):
class OOWriter(File):
class_id = 'application/vnd.sun.xml.writer'
- class_title = MSG(u'OOo Writer')
- class_description = MSG(u'OpenOffice.org Text')
+ class_title = MSG('OOo Writer')
+ class_description = MSG('OpenOffice.org Text')
class_icon16 = '/ui/ikaaro/icons/16x16/oowriter.png'
class_icon48 = '/ui/ikaaro/icons/48x48/oowriter.png'
@@ -299,8 +299,8 @@ class OOWriter(File):
class OOCalc(File):
class_id = 'application/vnd.sun.xml.calc'
- class_title = MSG(u'OOo Calc')
- class_description = MSG(u'OpenOffice.org Spreadsheet')
+ class_title = MSG('OOo Calc')
+ class_description = MSG('OpenOffice.org Spreadsheet')
class_icon16 = '/ui/ikaaro/icons/16x16/oocalc.png'
class_icon48 = '/ui/ikaaro/icons/48x48/oocalc.png'
# Fields
@@ -310,8 +310,8 @@ class OOCalc(File):
class OOImpress(File):
class_id = 'application/vnd.sun.xml.impress'
- class_title = MSG(u'OOo Impress')
- class_description = MSG(u'OpenOffice.org Presentation')
+ class_title = MSG('OOo Impress')
+ class_description = MSG('OpenOffice.org Presentation')
class_icon16 = '/ui/ikaaro/icons/16x16/ooimpress.png'
class_icon48 = '/ui/ikaaro/icons/48x48/ooimpress.png'
# Fields
@@ -321,8 +321,8 @@ class OOImpress(File):
class PDF(File):
class_id = 'application/pdf'
- class_title = MSG(u'PDF')
- class_description = MSG(u'PDF Document')
+ class_title = MSG('PDF')
+ class_description = MSG('PDF Document')
class_icon16 = '/ui/ikaaro/icons/16x16/pdf.png'
class_icon48 = '/ui/ikaaro/icons/48x48/pdf.png'
# Fields
@@ -333,7 +333,7 @@ class PDF(File):
class RTF(File):
class_id = 'text/rtf'
class_title = MSG(u"RTF")
- class_description = MSG(u'RTF Document')
+ class_description = MSG('RTF Document')
class_icon16 = '/ui/ikaaro/icons/16x16/text.png'
class_icon48 = '/ui/ikaaro/icons/48x48/text.png'
# Fields
@@ -343,8 +343,8 @@ class RTF(File):
class ODT(File):
class_id = 'application/vnd.oasis.opendocument.text'
- class_title = MSG(u'ODT')
- class_description = MSG(u'OpenDocument Text')
+ class_title = MSG('ODT')
+ class_description = MSG('OpenDocument Text')
class_icon16 = '/ui/ikaaro/icons/16x16/odt.png'
class_icon48 = '/ui/ikaaro/icons/48x48/odt.png'
# Fields
@@ -354,8 +354,8 @@ class ODT(File):
class ODS(File):
class_id = 'application/vnd.oasis.opendocument.spreadsheet'
- class_title = MSG(u'ODS')
- class_description = MSG(u'OpenDocument Spreadsheet')
+ class_title = MSG('ODS')
+ class_description = MSG('OpenDocument Spreadsheet')
class_icon16 = '/ui/ikaaro/icons/16x16/ods.png'
class_icon48 = '/ui/ikaaro/icons/48x48/ods.png'
# Fields
@@ -365,8 +365,8 @@ class ODS(File):
class ODP(File):
class_id = 'application/vnd.oasis.opendocument.presentation'
- class_title = MSG(u'ODP')
- class_description = MSG(u'OpenDocument Presentation')
+ class_title = MSG('ODP')
+ class_description = MSG('OpenDocument Presentation')
class_icon16 = '/ui/ikaaro/icons/16x16/odp.png'
class_icon48 = '/ui/ikaaro/icons/48x48/odp.png'
# Fields
@@ -386,7 +386,7 @@ class Archive(File):
class ZipArchive(Archive):
class_id = 'application/zip'
class_title = MSG(u"Zip")
- class_description = MSG(u'Zip Archive')
+ class_description = MSG('Zip Archive')
class_icon16 = '/ui/ikaaro/icons/16x16/zip.png'
class_icon48 = '/ui/ikaaro/icons/48x48/zip.png'
# Fields
@@ -397,7 +397,7 @@ class ZipArchive(Archive):
class TarArchive(Archive):
class_id = 'application/x-tar'
class_title = MSG(u"Tar")
- class_description = MSG(u'Tar Archive')
+ class_description = MSG('Tar Archive')
class_icon16 = '/ui/ikaaro/icons/16x16/tar.png'
class_icon48 = '/ui/ikaaro/icons/48x48/tar.png'
# Fields
@@ -408,7 +408,7 @@ class TarArchive(Archive):
class Gzip(File):
class_id = 'application/x-gzip'
class_title = MSG(u"Gzip")
- class_description = MSG(u'Gzip Compressed')
+ class_description = MSG('Gzip Compressed')
class_icon16 = '/ui/ikaaro/icons/16x16/gzip.png'
class_icon48 = '/ui/ikaaro/icons/48x48/gzip.png'
# Fields
@@ -419,7 +419,7 @@ class Gzip(File):
class Bzip2(File):
class_id = 'application/x-bzip2'
class_title = MSG(u"Bzip2")
- class_description = MSG(u'Bzip2 Compressed')
+ class_description = MSG('Bzip2 Compressed')
class_icon16 = '/ui/ikaaro/icons/16x16/bzip.png'
class_icon48 = '/ui/ikaaro/icons/48x48/bzip.png'
# Fields
diff --git a/ikaaro/file_views.py b/ikaaro/file_views.py
index 8895b8230..1214b1970 100644
--- a/ikaaro/file_views.py
+++ b/ikaaro/file_views.py
@@ -28,18 +28,18 @@
from itools.web import BaseView, STLView, ERROR, FormError
# Import from ikaaro
-from autoadd import AutoAdd
-from autoedit import AutoEdit
-from fields import ProgressBar_Field
-from folder import Folder
-from resource_views import DBResource_GetFile
-from utils import process_name
-from widgets import PathSelectorWidget
+from .autoadd import AutoAdd
+from .autoedit import AutoEdit
+from .fields import ProgressBar_Field
+from .folder import Folder
+from .resource_views import DBResource_GetFile
+from .utils import process_name
+from .widgets import PathSelectorWidget
class File_NewInstance(AutoAdd):
- title = MSG(u'Upload File')
+ title = MSG('Upload File')
fields = ['data', 'title', 'progressbar']
progressbar = ProgressBar_Field
@@ -74,7 +74,7 @@ def make_new_resource(self, resource, context, form):
class File_View(STLView):
access = 'is_allowed_to_view'
- title = MSG(u'Download')
+ title = MSG('Download')
icon = 'view.png'
template = '/ui/ikaaro/file/download_form.xml'
@@ -104,7 +104,7 @@ def get_field(self, resource, name):
class File_Download(DBResource_GetFile):
field_name = 'data'
- title = MSG(u'Download')
+ title = MSG('Download')
def get_filename(self, handler, field_name, resource):
@@ -123,7 +123,7 @@ def get_content_type(self, handler):
class File_ExternalEdit_View(STLView):
access = 'is_allowed_to_edit'
template = '/ui/ikaaro/file/externaledit.xml'
- title = MSG(u'External Editor')
+ title = MSG('External Editor')
icon = 'external.png'
@@ -190,7 +190,7 @@ def GET(self, resource, context):
class Image_View(STLView):
access = 'is_allowed_to_view'
- title = MSG(u'View')
+ title = MSG('View')
template = '/ui/ikaaro/binary/Image_view.xml'
styles = ['/ui/ikaaro/gallery/style.css']
@@ -238,7 +238,7 @@ def get_namespace(self, resource, context):
class Video_View(STLView):
access = 'is_allowed_to_view'
- title = MSG(u'View')
+ title = MSG('View')
template = '/ui/ikaaro/binary/Video_view.xml'
scripts = ['/ui/ikaaro/js/jquery.media.js']
@@ -251,14 +251,14 @@ def get_namespace(self, resource, context):
class Archive_View(STLView):
access = 'is_allowed_to_view'
- title = MSG(u'View')
+ title = MSG('View')
template = '/ui/ikaaro/binary/Archive_view.xml'
schema = {'target': PathDataType, 'update': Boolean}
def get_namespace(self, resource, context):
filename = resource.get_value('filename') or resource.get_title()
- contents = [ process_name(x)[1] + u'\n'
+ contents = [ process_name(x)[1] + '\n'
for x in resource.get_value('data').get_contents() ]
contents = ''.join(contents)
# Extract archive
@@ -279,9 +279,9 @@ def _get_form(self, resource, context):
target = form['target']
target = resource.get_resource(target, soft=True)
if target is None:
- raise FormError(ERROR(u'Target does not exist.'))
+ raise FormError(ERROR('Target does not exist.'))
if isinstance(target, Folder) is False:
- raise FormError(ERROR(u'Target must be a folder.'))
+ raise FormError(ERROR('Target must be a folder.'))
return form
@@ -290,7 +290,7 @@ def action(self, resource, context, form):
# Get the list of paths to extract
handler = resource.get_value('data')
paths = handler.get_contents()
- paths.sort()
+ paths = sorted(paths)
# Get the target resource
target = form['target']
@@ -301,7 +301,7 @@ def action(self, resource, context, form):
target.extract_archive(handler, language, update=form['update'])
# Ok
- message = MSG(u'Files extracted')
+ message = MSG('Files extracted')
goto = context.get_link(target)
return context.come_back(message, goto=goto)
@@ -310,5 +310,5 @@ def action(self, resource, context, form):
class Flash_View(File_View):
access = 'is_allowed_to_view'
- title = MSG(u'View')
+ title = MSG('View')
template = '/ui/ikaaro/binary/Flash_view.xml'
diff --git a/ikaaro/folder.py b/ikaaro/folder.py
index 061692fdf..930170417 100644
--- a/ikaaro/folder.py
+++ b/ikaaro/folder.py
@@ -21,7 +21,8 @@
# Import from the Standard Library
import fnmatch
-from cStringIO import StringIO
+from logging import getLogger
+from io import StringIO
from os.path import basename, dirname
from zipfile import ZipFile
import uuid
@@ -40,26 +41,26 @@
from itools.web.exceptions import FormError
# Import from ikaaro
-from views.folder_views import Folder_BrowseContent, Folder_PreviewContent
-from views.folder_views import Folder_Rename, Folder_NewResource, Folder_Thumbnail
+from .views.folder_views import Folder_BrowseContent, Folder_PreviewContent
+from .views.folder_views import Folder_Rename, Folder_NewResource, Folder_Thumbnail
# Import from ikaaro
-from autoedit import AutoEdit
-from database import Database
-from datatypes import guess_mimetype
-from exceptions import ConsistencyError
-from messages import MSG_NAME_CLASH
-from resource_ import DBResource
-from utils import process_name, tidy_html, get_base_path_query
-
+from .autoedit import AutoEdit
+from .database import Database
+from .datatypes import guess_mimetype
+from .exceptions import ConsistencyError
+from .messages import MSG_NAME_CLASH
+from .resource_ import DBResource
+from .utils import process_name, tidy_html, get_base_path_query
+log = getLogger("ikaaro")
class Folder(DBResource):
class_id = "folder"
class_version = "20071215"
- class_title = MSG(u"Folder")
- class_description = MSG(u"Organize your files and documents with folders.")
+ class_title = MSG("Folder")
+ class_description = MSG("Organize your files and documents with folders.")
class_icon16 = "/ui/ikaaro/icons/16x16/folder.png"
class_icon48 = "/ui/ikaaro/icons/48x48/folder.png"
class_views = [
@@ -99,7 +100,12 @@ def get_document_types(self):
def traverse_resources(self):
yield self
for name in self._get_names():
- resource = self.get_resource(name)
+ try:
+ resource = self.get_resource(name)
+ except StopIteration:
+ # Log the resource abspath
+ log.error("The resource can't be read - {} {}".format(name, self.abspath))
+ continue
for x in resource.traverse_resources():
yield x
@@ -197,7 +203,7 @@ def _get_names(self):
# API
#######################################################################
def _make_file(self, name, filename, mimetype, body, default_language):
- from webpage import WebPage
+ from .webpage import WebPage
if type(name) is not str:
raise TypeError('expected string, got %s' % repr(name))
@@ -279,15 +285,15 @@ def create_imported_child(self, context, item_name, item_cls, item_class_version
document_types = self.get_importable_document_types(context)
if item_cls not in document_types:
raise FormError(
- ERROR(u"L'import d'une ressource de type {resource_type} "
- u"n'est pas autorisé au sein de la resource actuelle").gettext(
+ ERROR("L'import d'une ressource de type {resource_type} "
+ "n'est pas autorisé au sein de la resource actuelle").gettext(
resource_type=item_cls.class_title
)
)
if item_class_version != item_cls.class_version:
raise FormError(
- ERROR(u"La version de la ressource que vous essayez d'importer "
- u"ne correspond pas à la version de la ressource actuelle")
+ ERROR("La version de la ressource que vous essayez d'importer "
+ "ne correspond pas à la version de la ressource actuelle")
)
if not dry_run:
child = self.make_resource(item_name, item_cls)
@@ -391,7 +397,7 @@ def extract_archive(self, handler, default_language, filter=None,
# 4. The body
body = handler.get_file(path_str)
if filter:
- body = filter(path_str, mimetype, body)
+ body = list(filter(path_str, mimetype, body))
if body is None:
continue
@@ -468,7 +474,7 @@ def copy_resource(self, source_path, target_path, exclude_patterns=None, check_i
if (check_if_authorized and
(not target_parent.can_paste(source)
or not source.can_paste_into(target_parent))):
- message = u'resource type "{0}" cannot be copied into type "{1}"'
+ message = 'resource type "{0}" cannot be copied into type "{1}"'
message = message.format(source.class_title.gettext(),
target_parent.class_title.gettext())
raise ConsistencyError(message)
diff --git a/ikaaro/folder_views.py b/ikaaro/folder_views.py
index 78fe9077f..e2ceb70aa 100644
--- a/ikaaro/folder_views.py
+++ b/ikaaro/folder_views.py
@@ -14,8 +14,8 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
-from views.folder_views import Folder_BrowseContent, GoToSpecificDocument
-from views.folder_views import Folder_PreviewContent, SearchTypes_Enumerate
+from .views.folder_views import Folder_BrowseContent, GoToSpecificDocument
+from .views.folder_views import Folder_PreviewContent, SearchTypes_Enumerate
print('[OBSOLETE] Imports from ikaaro.folder_views is obsolete. Use ikaaro.views instead')
diff --git a/ikaaro/links.py b/ikaaro/links.py
index 0a5a9e59d..251f33d5f 100644
--- a/ikaaro/links.py
+++ b/ikaaro/links.py
@@ -15,7 +15,7 @@
# along with this program. If not, see .
# Import from ikaaro
-from utils import split_reference
+from .utils import split_reference
def update_abspath_links(self, resource, field_name, source, target, languages,
diff --git a/ikaaro/messages.py b/ikaaro/messages.py
index ddba75ec8..cc424205b 100644
--- a/ikaaro/messages.py
+++ b/ikaaro/messages.py
@@ -23,47 +23,47 @@
-MSG_BAD_KEY = ERROR(u"Your confirmation key is invalid.")
+MSG_BAD_KEY = ERROR("Your confirmation key is invalid.")
MSG_BAD_NAME = ERROR(
- u'The document name contains illegal characters, choose another one.')
+ 'The document name contains illegal characters, choose another one.')
-MSG_CAPTION = ERROR(u'Caption')
+MSG_CAPTION = ERROR('Caption')
-MSG_CHANGES_SAVED = INFO(u'The changes have been saved.')
+MSG_CHANGES_SAVED = INFO('The changes have been saved.')
-MSG_CHANGES_SAVED2 = INFO(u'The changes have been saved ({time}).')
+MSG_CHANGES_SAVED2 = INFO('The changes have been saved ({time}).')
-MSG_DELETE_RESOURCE = MSG(u'Are you sure you want to delete this resource?')
+MSG_DELETE_RESOURCE = MSG('Are you sure you want to delete this resource?')
MSG_EDIT_CONFLICT = ERROR(
- u'Someone already saved this document, click "Save" again to force.')
+ 'Someone already saved this document, click "Save" again to force.')
MSG_EDIT_CONFLICT2 = ERROR(
- u'User {user} already saved this document, click "Save" again to force.')
+ 'User {user} already saved this document, click "Save" again to force.')
-MSG_EMPTY_FILENAME = ERROR(u'The file must be entered.')
+MSG_EMPTY_FILENAME = ERROR('The file must be entered.')
-MSG_EXISTANT_FILENAME = ERROR(u'A given name already exists.')
+MSG_EXISTANT_FILENAME = ERROR('A given name already exists.')
-MSG_INVALID_EMAIL = ERROR(u'The email address provided is invalid.')
+MSG_INVALID_EMAIL = ERROR('The email address provided is invalid.')
-MSG_NAME_CLASH = ERROR(u'There is already another resource with this name.')
+MSG_NAME_CLASH = ERROR('There is already another resource with this name.')
-MSG_NAME_MISSING = ERROR(u'The name is missing.')
+MSG_NAME_MISSING = ERROR('The name is missing.')
-MSG_NEW_RESOURCE = INFO(u'A new resource has been added.')
+MSG_NEW_RESOURCE = INFO('A new resource has been added.')
-MSG_NONE_REMOVED = ERROR(u'No resource removed.')
+MSG_NONE_REMOVED = ERROR('No resource removed.')
-MSG_RESOURCES_PASTED = INFO(u'Resources pasted: {resources}.')
+MSG_RESOURCES_PASTED = INFO('Resources pasted: {resources}.')
-MSG_RESOURCES_REMOVED = INFO(u'Resources removed: {resources}.')
+MSG_RESOURCES_REMOVED = INFO('Resources removed: {resources}.')
MSG_RESOURCES_REFERENCED = ERROR(
- u'Action impossible (the resources are in use): {resources}.')
+ 'Action impossible (the resources are in use): {resources}.')
-MSG_RESOURCES_REFERENCED_HTML = ERROR(u"""
+MSG_RESOURCES_REFERENCED_HTML = ERROR("""
Action impossible (the resources are in use):
,
""", format='stl')
-MSG_RESOURCES_NOT_PASTED = ERROR(u'Resources not allowed to paste here: '
- u'{resources}.')
+MSG_RESOURCES_NOT_PASTED = ERROR('Resources not allowed to paste here: '
+ '{resources}.')
-MSG_RESOURCES_NOT_REMOVED = ERROR(u'Resources not allowed to remove: '
- u'{resources}.')
+MSG_RESOURCES_NOT_REMOVED = ERROR('Resources not allowed to remove: '
+ '{resources}.')
-MSG_PASSWORD_MISMATCH = ERROR(u'The provided passwords do not match.')
+MSG_PASSWORD_MISMATCH = ERROR('The provided passwords do not match.')
MSG_REGISTERED = ERROR(
- u"You have already confirmed your registration. "
- u"Try to log in or ask for a new password.")
+ "You have already confirmed your registration. "
+ "Try to log in or ask for a new password.")
-MSG_PASSWORD_EQUAL_TO_USERNAME = ERROR(u'Password cannot match the username.')
+MSG_PASSWORD_EQUAL_TO_USERNAME = ERROR('Password cannot match the username.')
-MSG_NONE_SELECTED = ERROR(u'No resource selected.')
+MSG_NONE_SELECTED = ERROR('No resource selected.')
-MSG_NONE_ALLOWED = ERROR(u"No resource allowed.")
+MSG_NONE_ALLOWED = ERROR("No resource allowed.")
-MSG_NO_PASTE = ERROR(u'Nothing to paste.')
+MSG_NO_PASTE = ERROR('Nothing to paste.')
-MSG_RENAMED = INFO(u'Resources renamed.')
+MSG_RENAMED = INFO('Resources renamed.')
-MSG_COPIED = INFO(u'Resources copied.')
+MSG_COPIED = INFO('Resources copied.')
-MSG_CUT = INFO(u'Resources cut.')
+MSG_CUT = INFO('Resources cut.')
-MSG_PUBLISHED = INFO(u'Resources published.')
+MSG_PUBLISHED = INFO('Resources published.')
-MSG_RETIRED = INFO(u'Resources retired.')
+MSG_RETIRED = INFO('Resources retired.')
-MSG_UNEXPECTED_MIMETYPE = ERROR(u'Unexpected file of mimetype {mimetype}.')
+MSG_UNEXPECTED_MIMETYPE = ERROR('Unexpected file of mimetype {mimetype}.')
MSG_LOGIN_WRONG_NAME_OR_PASSWORD = ERROR(
- u'The login name or the password is incorrect.')
+ 'The login name or the password is incorrect.')
diff --git a/ikaaro/order.py b/ikaaro/order.py
index efb2395a5..f355887c6 100644
--- a/ikaaro/order.py
+++ b/ikaaro/order.py
@@ -22,12 +22,12 @@
from itools.web import INFO, get_context
# Import from ikaaro
-from views.folder_views import Folder_BrowseContent
+from .views.folder_views import Folder_BrowseContent
# Import from ikaaro
-from buttons import BrowseButton
-from fields import URI_Field
-from folder import Folder
+from .buttons import BrowseButton
+from .fields import URI_Field
+from .folder import Folder
@@ -35,7 +35,7 @@ class OrderUpButton(BrowseButton):
access = 'is_allowed_to_edit'
name = 'order_up'
- title = MSG(u'Order up')
+ title = MSG('Order up')
@@ -43,7 +43,7 @@ class OrderDownButton(BrowseButton):
access = 'is_allowed_to_edit'
name = 'order_down'
- title = MSG(u'Order down')
+ title = MSG('Order down')
@@ -51,7 +51,7 @@ class OrderTopButton(BrowseButton):
access = 'is_allowed_to_edit'
name = 'order_top'
- title = MSG(u'Order top')
+ title = MSG('Order top')
@@ -59,21 +59,21 @@ class OrderBottomButton(BrowseButton):
access = 'is_allowed_to_edit'
name = 'order_bottom'
- title = MSG(u'Order bottom')
+ title = MSG('Order bottom')
class OrderButton(BrowseButton):
access = 'is_allowed_to_edit'
name = 'add_to_ordered'
- title = MSG(u'Add to ordered list')
+ title = MSG('Add to ordered list')
class UnOrderButton(BrowseButton):
access = 'is_allowed_to_edit'
name = 'remove_from_ordered'
- title = MSG(u'Remove from ordered list')
+ title = MSG('Remove from ordered list')
@@ -86,7 +86,7 @@ class OrderedFolder_BrowseContent(Folder_BrowseContent):
default=Boolean(default=False))
table_columns = (Folder_BrowseContent.table_columns +
- [('order', MSG(u'Order'))])
+ [('order', MSG('Order'))])
def get_table_actions(self, resource, context):
proxy = super(OrderedFolder_BrowseContent, self)
@@ -127,7 +127,7 @@ def get_item_value(self, resource, context, item, column):
ordered_ids = list(resource.get_ordered_values())
if item.name in ordered_ids:
return ordered_ids.index(item.name) + 1
- return MSG(u'Not ordered')
+ return MSG('Not ordered')
proxy = super(OrderedFolder_BrowseContent, self)
return proxy.get_item_value(resource, context, item, column)
@@ -147,37 +147,37 @@ def action_remove(self, resource, context, form):
def action_order_up(self, resource, context, form):
ids = form['ids']
resource.order_up(ids)
- context.message = INFO(u'Resources ordered up.')
+ context.message = INFO('Resources ordered up.')
def action_order_down(self, resource, context, form):
ids = form['ids']
resource.order_down(ids)
- context.message = INFO(u'Resources ordered down.')
+ context.message = INFO('Resources ordered down.')
def action_order_top(self, resource, context, form):
ids = form['ids']
resource.order_top(ids)
- context.message = INFO(u'Resources ordered on top.')
+ context.message = INFO('Resources ordered on top.')
def action_order_bottom(self, resource, context, form):
ids = form['ids']
resource.order_bottom(ids)
- context.message = INFO(u'Resources ordered on bottom.')
+ context.message = INFO('Resources ordered on bottom.')
def action_add_to_ordered(self, resource, context, form):
ids = form['ids']
resource.order_add(ids)
- context.message = INFO(u'Resources ordered on bottom.')
+ context.message = INFO('Resources ordered on bottom.')
def action_remove_from_ordered(self, resource, context, form):
ids = form['ids']
resource.order_remove(ids)
- context.message = INFO(u'Resources unordered.')
+ context.message = INFO('Resources unordered.')
@@ -187,11 +187,11 @@ def action_remove_from_ordered(self, resource, context, form):
class OrderedFolder(Folder):
- class_title = MSG(u'Ordered Folder')
+ class_title = MSG('Ordered Folder')
class_views = ['browse_content']
# Fields
- order = URI_Field(title=MSG(u'Order'), multiple=True)
+ order = URI_Field(title=MSG('Order'), multiple=True)
allow_to_unorder_items = False
diff --git a/ikaaro/popup.py b/ikaaro/popup.py
index 579d13fb2..0c4e076b8 100644
--- a/ikaaro/popup.py
+++ b/ikaaro/popup.py
@@ -34,10 +34,10 @@
from ikaaro.views.folder_views import Folder_BrowseContent
# Import from ikaaro
-from buttons import AddButton
-from datatypes import FileDataType
-import messages
-from utils import reduce_string, make_stl_template
+from .buttons import AddButton
+from .datatypes import FileDataType
+from .import messages
+from .utils import reduce_string, make_stl_template
class SelectElement(AddButton):
@@ -75,9 +75,9 @@ class AddBase_BrowseContent(Folder_BrowseContent):
table_columns = [
('checkbox', None),
('icon', None),
- ('name', MSG(u'Name')),
- ('mtime', MSG(u'Last Modified')),
- ('last_author', MSG(u'Last Author'))]
+ ('name', MSG('Name')),
+ ('mtime', MSG('Last Modified')),
+ ('last_author', MSG('Last Author'))]
table_actions = [SelectElement]
@@ -85,7 +85,7 @@ class AddBase_BrowseContent(Folder_BrowseContent):
def get_folder_classes(self):
if self.folder_classes:
return self.folder_classes
- from folder import Folder
+ from .folder import Folder
return (Folder,)
@@ -112,7 +112,7 @@ def get_item_value(self, resource, context, item, column):
else:
url = None
path = target.abspath.get_pathto(item.abspath)
- return unicode(path), url
+ return str(path), url
else:
proxy = super(AddBase_BrowseContent, self)
return proxy.get_item_value(resource, context, item, column)
@@ -213,7 +213,7 @@ def get_root(self, context):
def get_start(self, resource):
- from file import File
+ from .file import File
if isinstance(resource, File):
return resource.parent
return resource
@@ -232,7 +232,7 @@ def can_upload(self, cls):
def get_namespace(self, resource, context):
- from folder import Folder
+ from .folder import Folder
# For the breadcrumb
start = self.get_start(resource)
@@ -353,7 +353,7 @@ def action_upload(self, resource, context, form):
# Check it is of the expected type
cls = context.database.get_resource_class(mimetype)
if not self.can_upload(cls):
- error = u'The given file is not of the expected type.'
+ error = 'The given file is not of the expected type.'
context.message = ERROR(error)
return
@@ -400,11 +400,11 @@ class DBResource_AddLink(DBResource_AddBase):
action_add_resource_schema = merge_dicts(DBResource_AddBase.schema,
title=Unicode(mandatory=True))
- text_values = {'title': MSG(u'Insert link'),
- 'browse': MSG(u'Browse and link to a File from the workspace'),
- 'extern': MSG(u'Type the URL of an external resource'),
- 'insert': MSG(u'Create a new page and link to it:'),
- 'upload': MSG(u'Upload a file to the current folder and link to it:'),
+ text_values = {'title': MSG('Insert link'),
+ 'browse': MSG('Browse and link to a File from the workspace'),
+ 'extern': MSG('Type the URL of an external resource'),
+ 'insert': MSG('Create a new page and link to it:'),
+ 'upload': MSG('Upload a file to the current folder and link to it:'),
'method': ';add_link'}
@@ -421,7 +421,7 @@ def action_add_resource(self, resource, context, form):
name = checkid(form['title'])
# Check name validity
if name is None:
- context.message = MSG(u"Invalid title.")
+ context.message = MSG("Invalid title.")
return
# Get the container
root = context.root
@@ -443,7 +443,7 @@ def get_page_type(self, mode):
"""Return the type of page to add corresponding to the mode
"""
if mode == 'tiny_mce':
- from webpage import WebPage
+ from .webpage import WebPage
return WebPage
raise ValueError('Incorrect mode %s' % mode)
@@ -454,11 +454,11 @@ class DBResource_AddImage(DBResource_AddBase):
element_to_add = 'image'
browse_content_class = AddImage_BrowseContent
- text_values = {'title': MSG(u'Insert image'),
- 'browse': MSG(u'Browse and insert an Image from the workspace'),
+ text_values = {'title': MSG('Insert image'),
+ 'browse': MSG('Browse and insert an Image from the workspace'),
'extern': None,
'insert': None,
- 'upload': MSG(u'Upload an image to the current folder and insert it:'),
+ 'upload': MSG('Upload an image to the current folder and insert it:'),
'method': ';add_image'}
@@ -484,11 +484,11 @@ class DBResource_AddMedia(DBResource_AddImage):
element_to_add = 'media'
browse_content_class = AddMedia_BrowseContent
- text_values = {'title': MSG(u'Insert media'),
- 'browse': MSG(u'Browse and insert a Media from the workspace'),
- 'extern': MSG(u'Type the URL of an external media'),
+ text_values = {'title': MSG('Insert media'),
+ 'browse': MSG('Browse and insert a Media from the workspace'),
+ 'extern': MSG('Type the URL of an external media'),
'insert': None,
- 'upload': MSG(u'Upload a media to the current folder and insert it:'),
+ 'upload': MSG('Upload a media to the current folder and insert it:'),
'method': ';add_media'}
diff --git a/ikaaro/registry.py b/ikaaro/registry.py
index f11a627d6..f6c324b14 100644
--- a/ikaaro/registry.py
+++ b/ikaaro/registry.py
@@ -16,7 +16,7 @@
# along with this program. If not, see .
# Import from ikaaro
-from database import Database
+from .database import Database
def register_document_type(resource_class, container_cls_id='folder'):
diff --git a/ikaaro/resource_.py b/ikaaro/resource_.py
index d36ade873..c0ac839d3 100644
--- a/ikaaro/resource_.py
+++ b/ikaaro/resource_.py
@@ -39,26 +39,17 @@
from itools.web import ItoolsView, get_context
# Import from ikaaro
-from autoadd import AutoAdd
-from autoedit import AutoEdit
-from enumerates import Groups_Datatype
-from fields import File_Field, HTMLFile_Field
-from fields import SelectAbspath_Field, UUID_Field
-from fields import CTime_Field, MTime_Field, LastAuthor_Field
-from fields import Title_Field, Description_Field, Subject_Field
-from fields import URI_Field
-from popup import DBResource_AddImage, DBResource_AddLink
-from popup import DBResource_AddMedia
-from resource_views import AutoJSONResourceExport
-from resource_views import AutoJSONResourcesImport
-from resource_views import DBResource_Remove
-from resource_views import DBResource_Links, DBResource_Backlinks
-from resource_views import LoginView, LogoutView
-from resource_views import DBResource_GetFile, DBResource_GetImage
-from update import class_version_to_date
-from utils import get_resource_by_uuid_query
-from widgets import CheckboxWidget
-from widgets import RTEWidget
+from .autoadd import AutoAdd
+from .autoedit import AutoEdit
+from .enumerates import Groups_Datatype
+from .fields import File_Field, HTMLFile_Field, SelectAbspath_Field, UUID_Field, CTime_Field, MTime_Field, LastAuthor_Field,\
+ Title_Field, Description_Field, Subject_Field, URI_Field
+from .popup import DBResource_AddImage, DBResource_AddLink, DBResource_AddMedia
+from .resource_views import AutoJSONResourceExport, AutoJSONResourcesImport, DBResource_Remove, DBResource_Links, \
+ DBResource_Backlinks, LoginView, LogoutView, DBResource_GetFile, DBResource_GetImage
+from .update import class_version_to_date
+from .utils import get_resource_by_uuid_query
+from .widgets import CheckboxWidget, RTEWidget
log = getLogger("ikaaro")
@@ -241,7 +232,7 @@ def get_resource_by_uuid(self, uuid, context,
# Return resource
if not search:
return None
- return search.get_resources(size=1).next()
+ return next(search.get_resources(size=1))
def make_resource_name(self):
@@ -767,8 +758,7 @@ def get_next_versions(self):
continue
if version > obj_version and version <= cls_version:
versions.append(version)
-
- versions.sort()
+ versions = sorted(versions)
return versions
@@ -842,7 +832,7 @@ def get_title(self, language=None):
if title:
return title
# Fallback to the resource's name
- return unicode(self.name)
+ return str(self.name)
def get_edit_languages(self, context):
@@ -943,9 +933,10 @@ def update_metadata_from_dict(self, fields_dict, dry_run=False):
if not field_multilingual:
if is_unicode:
if type(field_value) is list:
- field_value = [x.decode("utf-8") for x in field_value]
+ field_value = [x.decode("utf-8") if isinstance(x, bytes) else x for x in field_value]
else:
- field_value = field_value.decode("utf-8")
+ if isinstance(field_value, bytes):
+ field_value = field_value.decode("utf-8")
else:
field_value = datatype.decode(field_value)
self.set_value(field_name, field_value)
@@ -956,7 +947,8 @@ def update_metadata_from_dict(self, fields_dict, dry_run=False):
if is_prototype(datatype, HTMLBody):
lang_value = datatype.decode(lang_value)
if is_unicode:
- lang_value = lang_value.decode("utf-8")
+ if isinstance(lang_value, bytes):
+ lang_value = lang_value.decode("utf-8")
self.set_value(field_name, lang_value, language=lang)
diff --git a/ikaaro/resource_views.py b/ikaaro/resource_views.py
index e8e648201..44cc9bf7b 100644
--- a/ikaaro/resource_views.py
+++ b/ikaaro/resource_views.py
@@ -42,18 +42,18 @@
from ikaaro.datatypes import FileDataType
# Import from ikaaro
-from autoform import AutoForm
-from buttons import Remove_Button
-from emails import send_email
-from exceptions import ConsistencyError
-from messages import MSG_LOGIN_WRONG_NAME_OR_PASSWORD
+from .autoform import AutoForm
+from .buttons import Remove_Button
+from .emails import send_email
+from .exceptions import ConsistencyError
+from .messages import MSG_LOGIN_WRONG_NAME_OR_PASSWORD
class DBResource_Remove(AutoForm):
access = 'is_allowed_to_remove'
- title = MSG(u'Remove')
+ title = MSG('Remove')
actions = [Remove_Button]
@@ -64,13 +64,12 @@ def action_remove(self, resource, context, form):
container.del_resource(resource.name)
except ConsistencyError:
err = (
- u'Referenced resource cannot be removed, check the'
- u' backlinks.')
+ 'Referenced resource cannot be removed, check the backlinks.')
context.message = ERROR(err, format='html')
return
# Ok
- message = MSG(u'Resource removed')
+ message = MSG('Resource removed')
return context.come_back(message, goto=str(container.abspath))
@@ -180,7 +179,7 @@ class DBResource_Links(Folder_BrowseContent):
"""Links are the list of resources used by this resource."""
access = 'is_admin'
- title = MSG(u"Links")
+ title = MSG("Links")
icon = 'rename.png'
query_schema = merge_dicts(Folder_BrowseContent.query_schema,
@@ -211,7 +210,7 @@ class DBResource_Backlinks(DBResource_Links):
consider it is "orphan".
"""
- title = MSG(u"Backlinks")
+ title = MSG("Backlinks")
def get_items(self, resource, context):
return context.search(links=str(resource.abspath))
@@ -224,7 +223,7 @@ def get_items(self, resource, context):
class LoginView(STLView):
access = True
- title = MSG(u'Login')
+ title = MSG('Login')
template = '/ui/ikaaro/base/login.xml'
meta = [('robots', 'noindex, follow', None)]
@@ -238,7 +237,7 @@ class LoginView(STLView):
def GET(self, resource, context):
if context.user:
- msg = MSG(u'You are already connected')
+ msg = MSG('You are already connected')
goto = str(context.user.abspath)
return context.come_back(msg, goto)
return super(LoginView, self).GET(resource, context)
@@ -319,7 +318,7 @@ def get_goto(self, user):
# Check if user account is completed
for name, field in user.get_fields():
if field.required and user.get_value(name) is None:
- msg = MSG(u'You must complete your account informations')
+ msg = MSG('You must complete your account informations')
goto = '/users/%s/;edit_account' % user.name
return context.come_back(msg, goto)
@@ -334,7 +333,7 @@ def get_goto(self, user):
else:
goto = referrer
- return context.come_back(INFO(u"Welcome!"), goto)
+ return context.come_back(INFO("Welcome!"), goto)
@@ -348,7 +347,7 @@ class LogoutView(BaseView):
def GET(self, resource, context):
context.logout()
- message = INFO(u'You Are Now Logged out.')
+ message = INFO('You Are Now Logged out.')
return context.come_back(message, goto='./')
@@ -356,7 +355,7 @@ def GET(self, resource, context):
class AutoJSONResourceExport(AutoForm):
access = "is_admin"
- title = MSG(u"Exporter au format JSON")
+ title = MSG("Exporter au format JSON")
def _get_datatype(self, resource, context, name):
field = self.get_field(resource, name)
@@ -421,7 +420,7 @@ def get_fields(self):
def get_field(self, resource, name):
resource_field = resource.get_field(name)
field = Boolean_Field(
- title=MSG(u"Exporter le champs '{title}' ?").gettext(
+ title=MSG("Exporter le champs '{title}' ?").gettext(
title=resource_field.title
),
default=True
@@ -434,9 +433,9 @@ def action(self, resource, context, form):
json_export = resource.export_as_json(context, only_self=True, exported_fields=fields)
json_export["export_type"] = "self-export"
context.set_content_type("application/json")
- file_name = u"config_export_{title}.json".format(
+ file_name = "config_export_{title}.json".format(
title=resource.get_title()
- ).encode("utf-8")
+ )
context.set_content_disposition("attachment", file_name)
return json.dumps(json_export, cls=NewJSONEncoder)
@@ -444,7 +443,7 @@ def action(self, resource, context, form):
class AutoJSONResourcesImport(AutoForm):
access = "is_admin"
- title = MSG(u"Importer au format JSON")
+ title = MSG("Importer au format JSON")
schema = {
"file": FileDataType(mandatory=True),}
@@ -453,7 +452,7 @@ class AutoJSONResourcesImport(AutoForm):
]
actions = [
- Button(access='is_admin', css='btn btn-primary', title=MSG(u'Upload'))]
+ Button(access='is_admin', css='btn btn-primary', title=MSG('Upload'))]
def _get_form(self, resource, context):
@@ -464,7 +463,6 @@ def _get_form(self, resource, context):
raise FormError()
filename, mimetype, json_raw = form.pop("file")
json_content = json.loads(json_raw)
- json_content = fix_json(json_content)
form["json_import"] = json_content
export_type = json_content["export_type"]
if export_type == "child-export":
@@ -478,13 +476,13 @@ def _get_form(self, resource, context):
# Check that imported json is the right resource
if resource.class_id != json_content["class_id"]:
raise FormError(
- ERROR(u"Le type de ressource que vous essayez d'importer ne "
- u"correspond pas au type de la ressource actuelle")
+ ERROR("Le type de ressource que vous essayez d'importer ne "
+ "correspond pas au type de la ressource actuelle")
)
if resource.class_version != json_content["class_version"]:
raise FormError(
- ERROR(u"La version de la ressource que vous essayez d'importer "
- u"ne correspond pas à la version de la ressource actuelle")
+ ERROR("La version de la ressource que vous essayez d'importer "
+ "ne correspond pas à la version de la ressource actuelle")
)
resource.update_metadata_from_dict(json_content["fields"], dry_run=True)
return form
@@ -500,17 +498,17 @@ def action(self, resource, context, form):
# Check that imported json is the right resource
if resource.class_id != json_content["class_id"]:
raise FormError(
- ERROR(u"Le type de ressource que vous essayez d'importer ne "
- u"correspond pas au type de la ressource actuelle")
+ ERROR("Le type de ressource que vous essayez d'importer ne "
+ "correspond pas au type de la ressource actuelle")
)
if resource.class_version != json_content["class_version"]:
raise FormError(
- ERROR(u"La version de la ressource que vous essayez d'importer "
- u"ne correspond pas à la version de la ressource actuelle")
+ ERROR("La version de la ressource que vous essayez d'importer "
+ "ne correspond pas à la version de la ressource actuelle")
)
resource.update_metadata_from_dict(json_content["fields"])
return context.come_back(
- MSG(u"Les ressources ont bien été importées"),
+ MSG("Les ressources ont bien été importées"),
goto=self.action_goto
)
diff --git a/ikaaro/rest.py b/ikaaro/rest.py
index 549e86dfb..e37d3ca62 100644
--- a/ikaaro/rest.py
+++ b/ikaaro/rest.py
@@ -23,7 +23,8 @@
from itools.web import BaseView
# Import from ikaaro
-from fields import Metadata_Field, File_Field
+from .fields import Metadata_Field, File_Field
+from .utils import dict_of_bytes_to_string
###########################################################################
# Utility functions
@@ -35,7 +36,7 @@ def fix_json(obj):
TODO Use a custom JSONDecoder instead.
"""
obj_type = type(obj)
- if obj_type is unicode:
+ if obj_type is str:
return obj.encode('utf-8')
if obj_type is list:
return [ fix_json(x) for x in obj ]
@@ -101,7 +102,7 @@ def field_to_json(resource, field_name):
if prop is None:
return None
if type(prop) is dict:
- prop = prop.values()
+ prop = list(prop.values())
if type(prop) is list:
return [ property_to_json(field, x) for x in prop ]
return property_to_json(field, prop)
@@ -132,7 +133,8 @@ def json(self):
"""Utility method that loads the json from the request entity. Used
by POST and PUT request methods.
"""
- return self.context.body
+ new_data = dict_of_bytes_to_string(self.context.body)
+ return new_data
def created(self, resource):
diff --git a/ikaaro/root.py b/ikaaro/root.py
index e1bd28e94..c5a17544b 100644
--- a/ikaaro/root.py
+++ b/ikaaro/root.py
@@ -22,10 +22,10 @@
from decimal import Decimal
from email.charset import add_charset, add_codec, QP
from email.mime.application import MIMEApplication
-from email.MIMEText import MIMEText
-from email.MIMEImage import MIMEImage
-from email.MIMEMultipart import MIMEMultipart
-from email.Utils import formatdate
+from email.mime.text import MIMEText
+from email.mime.image import MIMEImage
+from email.mime.multipart import MIMEMultipart
+from email.utils import formatdate
from email.header import Header
from json import dumps
from logging import getLogger
@@ -33,6 +33,7 @@
import traceback
# Import from itools
+from itools import pkg
from itools.core import get_abspath
from itools.database import RWDatabase
from itools.gettext import MSG
@@ -44,18 +45,18 @@
from itools.xml import XMLParser, is_xml_stream
# Import from ikaaro
-from constants import DEBUG
-from config import Configuration
-from config_register import RegisterForm, TermsOfService_View
-from context import CMSContext
-from fields import Char_Field
-from folder import Folder
-from resource_views import LoginView
-from skins import skin_registry
-from root_views import PoweredBy, ContactForm
-from root_views import NotFoundView, ForbiddenView, NotAllowedView
-from root_views import UploadStatsView, UpdateDocs, UnavailableView
-from update import UpdateInstanceView
+from .constants import DEBUG
+from .config import Configuration
+from .config_register import RegisterForm, TermsOfService_View
+from .context import CMSContext
+from .fields import Char_Field
+from .folder import Folder
+from .resource_views import LoginView
+from .skins import skin_registry
+from .root_views import PoweredBy, ContactForm
+from .root_views import NotFoundView, ForbiddenView, NotAllowedView
+from .root_views import UploadStatsView, UpdateDocs, UnavailableView
+from .update import UpdateInstanceView
log = getLogger("ikaaro")
@@ -93,7 +94,7 @@ class Root(Folder):
class_id = 'iKaaro'
class_version = '20180428'
- class_title = MSG(u'iKaaro')
+ class_title = MSG('iKaaro')
class_icon16 = '/ui/ikaaro/icons/16x16/root.png'
class_icon48 = '/ui/ikaaro/icons/48x48/root.png'
class_skin = 'aruni'
@@ -110,7 +111,7 @@ class Root(Folder):
def init_resource(self, email, password):
super(Root, self).init_resource()
# Configuration
- title = {'en': u'Configuration'}
+ title = {'en': 'Configuration'}
self.make_resource('config', Configuration, title=title)
# First user
user = self.make_user(email, password)
@@ -142,7 +143,7 @@ def get_user_title(self, userid):
if user is None:
username = userid.rsplit('/', 1)[-1]
log.warning('unkwnown user {}'.format(username))
- return unicode(username)
+ return str(username)
# Ok
return user.get_title()
@@ -159,7 +160,7 @@ def get_internal_error_template(self, context):
def get_internal_error_namespace(self, context):
namespace = {
- "message": MSG(u"Erreur de l'application"),
+ "message": MSG("Erreur de l'application"),
}
if not DEBUG:
return namespace
@@ -235,10 +236,10 @@ def alert_on_internal_server_error(self, context):
email = context.server.config.get_value('log-email')
# We send an email with the traceback
if email:
- headers = u'\n'.join([u'%s => %s' % (x, y)
+ headers = '\n'.join(['%s => %s' % (x, y)
for x, y in context.get_headers()])
- subject = MSG(u'Internal server error').gettext()
- text = u'%s\n\n%s\n\n%s' % (context.uri,
+ subject = MSG('Internal server error').gettext()
+ text = '%s\n\n%s\n\n%s' % (context.uri,
traceback.format_exc(),
headers)
self.send_email(email, subject, text=text)
@@ -395,7 +396,7 @@ def send_email(self, to_addr, subject, reply_to=None, text=None,
html=None, encoding='utf-8', subject_with_host=True,
return_receipt=False, attachment=None):
# 1. Check input data
- if type(subject) is unicode:
+ if type(subject) is str:
subject = subject.encode(encoding)
elif isinstance(subject, MSG):
subject = subject.gettext()
@@ -404,9 +405,9 @@ def send_email(self, to_addr, subject, reply_to=None, text=None,
if len(subject.splitlines()) > 1:
raise ValueError('the subject cannot have more than one line')
- if text and not isinstance(text, unicode):
+ if text and not isinstance(text, str):
raise TypeError('the text must be a Unicode string')
- if html and not isinstance(html, unicode):
+ if html and not isinstance(html, str):
raise TypeError('the html must be a Unicode string')
# 2. Local variables
@@ -601,7 +602,7 @@ def get_user_from_login(self, username):
return self.get_user(brain.name)
- update_20170106_title = MSG(u'Add uuid to all resources')
+ update_20170106_title = MSG('Add uuid to all resources')
def update_20170106(self):
i = 0
context = get_context()
diff --git a/ikaaro/root_views.py b/ikaaro/root_views.py
index 2ca4ba6eb..3acea15e8 100644
--- a/ikaaro/root_views.py
+++ b/ikaaro/root_views.py
@@ -37,14 +37,14 @@
from itools.xml import get_element, TEXT
# Import from ikaaro
-from autoform import AutoForm
-from buttons import Button
-from config_captcha import CaptchaDatatype, CaptchaWidget
-from datatypes import FileDataType
-from folder import Folder
-from messages import MSG_UNEXPECTED_MIMETYPE
-from widgets import FileWidget
-from widgets import HiddenWidget, SelectWidget, MultilineWidget, TextWidget
+from .autoform import AutoForm
+from .buttons import Button
+from .config_captcha import CaptchaDatatype, CaptchaWidget
+from .datatypes import FileDataType
+from .folder import Folder
+from .messages import MSG_UNEXPECTED_MIMETYPE
+from .widgets import FileWidget
+from .widgets import HiddenWidget, SelectWidget, MultilineWidget, TextWidget
class NotAllowedView(STLView):
@@ -122,7 +122,7 @@ def get_options(cls):
title = user.get_title()
options.append({'name': name, 'value': title,
'sort_value': title.lower()})
- options.sort(key=lambda x: x['sort_value'])
+ options = sorted(options, key=lambda x: x['sort_value'])
return options
@@ -130,8 +130,8 @@ def get_options(cls):
class ContactForm(AutoForm):
access = True
- title = MSG(u'Contact')
- actions = [Button(access=True, css='btn btn-primary', title=MSG(u'Send'))]
+ title = MSG('Contact')
+ actions = [Button(access=True, css='btn btn-primary', title=MSG('Send'))]
query_schema = {'to': String,
'subject': Unicode,
'message_body': Unicode}
@@ -153,13 +153,13 @@ def get_widgets(self, resource, context):
if len(ContactOptions(resource=resource).get_options()) == 1:
to = HiddenWidget('to')
else:
- to = SelectWidget('to', title=MSG(u'Recipient'))
+ to = SelectWidget('to', title=MSG('Recipient'))
return [
to,
- TextWidget('from', title=MSG(u'Your email address'), size=40),
- TextWidget('subject', title=MSG(u'Message subject'), size=40),
- MultilineWidget('message_body', title=MSG(u'Message body'),
+ TextWidget('from', title=MSG('Your email address'), size=40),
+ TextWidget('subject', title=MSG('Message subject'), size=40),
+ MultilineWidget('message_body', title=MSG('Message body'),
rows=8, cols=50),
CaptchaWidget('captcha')]
@@ -200,13 +200,13 @@ def action(self, resource, context, form):
root = resource.get_root()
root.send_email(contact, subject, reply_to=reply_to, text=body)
# Ok
- context.message = INFO(u'Message sent.')
+ context.message = INFO('Message sent.')
class PoweredBy(STLView):
access = True
- title = MSG(u'Powered by')
+ title = MSG('Powered by')
template = '/ui/ikaaro/root/powered-by.xml'
@@ -214,7 +214,7 @@ def get_namespace(self, resource, context):
namespace = {}
# Credits
credits = get_abspath('CREDITS.txt')
- lines = lfs.open(credits).readlines()
+ lines = lfs.open(credits, text=True).readlines()
names = [ x[2:].strip() for x in lines if x.startswith(' ') ]
namespace['hackers'] = names
@@ -225,10 +225,10 @@ def get_namespace(self, resource, context):
if is_admin:
package2title = {
- 'gio': u'pygobject',
- 'lpod': u'lpOD',
- 'sys': u'Python',
- 'os': MSG(u'Operating System')}
+ 'gio': 'pygobject',
+ 'lpod': 'lpOD',
+ 'sys': 'Python',
+ 'os': MSG('Operating System')}
packages = [
{'name': package2title.get(x, x),
'version': y or MSG('no version found')}
@@ -236,7 +236,7 @@ def get_namespace(self, resource, context):
location = (getuser(), gethostname(), context.server.target)
namespace['packages'] = packages
- namespace['location'] = u'%s@%s:%s' % location
+ namespace['location'] = '%s@%s:%s' % location
# Ok
return namespace
@@ -246,18 +246,18 @@ def get_namespace(self, resource, context):
class UpdateDocs(AutoForm):
access = 'is_admin'
- title = MSG(u'Update docs')
+ title = MSG('Update docs')
schema = {
'file': FileDataType(mandatory=True),
'language': String(mandatory=True, default='en')}
widgets = [
FileWidget('file'),
- TextWidget('language', title=MSG(u'Language'),
- tip=MSG(u'"en", "fr", ...'))]
+ TextWidget('language', title=MSG('Language'),
+ tip=MSG('"en", "fr", ...'))]
actions = [
- Button(access='is_admin', css='btn btn-primary', title=MSG(u'Upload'))]
+ Button(access='is_admin', css='btn btn-primary', title=MSG('Upload'))]
def _get_form(self, resource, context):
@@ -296,7 +296,7 @@ def filter(path, mimetype, body):
target = XHTMLFile()
elem = get_element(source.events, 'div', **{'class': 'body'})
if not elem:
- print("E {}".format(path))
+ print(("E {}".format(path)))
return None
elements = elem.get_content_elements()
elements = rewrite_uris(elements, rewrite)
@@ -311,7 +311,7 @@ def filter(path, mimetype, body):
return body
# Unknown
else:
- print('X {} {}'.format(path, mimetype))
+ print(('X {} {}'.format(path, mimetype)))
return body
def postproc(file):
@@ -325,11 +325,11 @@ def postproc(file):
elem = get_element(events, 'h1')
if elem:
title = [
- unicode(x[1], 'utf8')
+ str(x[1], 'utf8')
for x in elem.get_content_elements() if x[0] == TEXT ]
- if title[-1] == u'¶':
+ if title[-1] == '¶':
title.pop()
- title = u''.join(title)
+ title = ''.join(title)
file.set_property('title', title, language)
handler.events = events[:elem.start] + events[elem.end+1:]
@@ -344,5 +344,5 @@ def postproc(file):
docs.extract_archive(handler, language, filter, postproc, True)
# Ok
- message = MSG(u'Documentation updated.')
+ message = MSG('Documentation updated.')
return context.come_back(message, goto='./docs')
diff --git a/ikaaro/server.py b/ikaaro/server.py
old mode 100644
new mode 100755
index 866b4a981..542974422
--- a/ikaaro/server.py
+++ b/ikaaro/server.py
@@ -19,7 +19,7 @@
# along with this program. If not, see .
# Import from the Standard Library
-from cProfile import runctx
+#from cProfile import runctx
from email.parser import HeaderParser
from json import loads
from io import BytesIO
@@ -41,6 +41,7 @@
from tempfile import mkstemp
from importlib import import_module
from wsgiref.util import setup_testing_defaults
+import importlib
# Import from jwcrypto
from jwcrypto.jwk import JWK
@@ -66,11 +67,11 @@
from itools.web.router import RequestMethod
# Import from ikaaro.web
-from database import get_database
-from datatypes import ExpireValue
-from views import CachedStaticView
-from skins import skin_registry
-from views import IkaaroStaticView
+from .database import get_database
+from .datatypes import ExpireValue
+from .views import CachedStaticView
+from .skins import skin_registry
+from .views import IkaaroStaticView
log_ikaaro = getLogger("ikaaro")
log_access = getLogger("ikaaro.access")
@@ -178,7 +179,7 @@ def load_modules(config):
modules = config.get_value('modules')
for name in modules:
name = name.strip()
- exec('import %s' % name)
+ __import__(name)
@@ -215,7 +216,7 @@ def create_server(target, email, password, root,
listen_port='8080', smtp_host='localhost',
log_email=None, website_languages=None,
size_min=19500, size_max=20500):
- from root import Root
+ from .root import Root
modules = modules or []
# Get modules
for module in modules:
@@ -225,8 +226,8 @@ def create_server(target, email, password, root,
root_class = Root
else:
modules.insert(0, root)
- exec('import %s' % root)
- exec('root_class = %s.Root' % root)
+ mod = __import__(root)
+ root_class = getattr(mod, 'Root')
# Make folder
try:
mkdir(target)
@@ -275,10 +276,12 @@ def create_server(target, email, password, root,
+
server = None
def get_server():
return server
+
def set_server(the_server):
global server
if the_server and get_server() is not None:
@@ -307,14 +310,24 @@ def format_request(self):
length,
delta)
+ def dict_bytes_to_str(self, data: dict):
+ new_response_headers = {}
+ for key,value in data.items():
+ if type(key) is bytes:
+ key = key.decode("utf-8")
+ if type(value) is bytes:
+ value = value.decode("utf-8")
+ new_response_headers[key] = value
+ return new_response_headers
+
def log_request(self):
request_log = self.format_request()
status = (self._orig_status or self.status or '000').split()[0]
status = int(status)
- request_headers = self.headers.dict
+ request_headers = dict(self.headers)
request_headers.pop("cookie", None)
request_headers.pop("authorization", None)
- response_headers = dict(self.response_headers)
+ response_headers = self.dict_bytes_to_str(dict(self.response_headers))
response_headers.pop("Set-cookie", None)
method = self.command
response_length = self.response_length
@@ -383,7 +396,9 @@ def __init__(self, target, read_only=False, cache_size=None,
# Set timestamp
self.timestamp = str(int(time() / 2))
# Load the config
+ print("TARGET", target)
config = get_config(target)
+
self.config = config
load_modules(config)
self.modules = config.get_value('modules')
@@ -402,8 +417,9 @@ def __init__(self, target, read_only=False, cache_size=None,
'accept-cors', type=Boolean, default=False)
# Profile Memory
- if profile_space is True:
- import guppy.heapy.RM
+ # Package not compatible with python 3
+ # if profile_space is True:
+ # import guppy.heapy.RM
# The database
if cache_size is None:
@@ -459,9 +475,9 @@ def get_JWT_key_path(self):
def get_JWT_key(self):
key_path = self.get_JWT_key_path()
try:
- with open(key_path, mode="r") as key_file:
+ with open(key_path, mode="rb") as key_file:
lines = key_file.readlines()
- key_pem_string = "".join(lines)
+ key_pem_string = b"".join(lines)
jwk = JWK.from_pem(key_pem_string)
except IOError as e:
# No pem file found generating one
@@ -472,7 +488,7 @@ def get_JWT_key(self):
def save_JWT_key(self, jwk):
key_path = self.get_JWT_key_path()
- with open(key_path, mode="w") as key_file:
+ with open(key_path, mode="wb") as key_file:
key_pem_string = jwk.export_to_pem(private_key=True, password=None)
key_file.write(key_pem_string)
@@ -619,7 +635,10 @@ def get_pid(self):
def is_running(self):
pid = self.get_pid()
- return pid_exists(pid)
+ if pid:
+ return pid_exists(pid)
+ else:
+ return False
def __enter__(self):
@@ -672,7 +691,8 @@ def listen(self, address, port):
gevent_signal(SIGTERM, self.stop_signal)
gevent_signal(SIGINT, self.stop_signal)
if self.profile:
- runctx("self.wsgi_server.serve_forever()", globals(), locals(), self.profile)
+ #runctx("self.wsgi_server.serve_forever()", globals(), locals(), self.profile)
+ raise Exception("Error server.py Ikaaro - Python 3 circular import with CProfile")
else:
self.wsgi_server.serve_forever()
@@ -723,7 +743,8 @@ def save_email(self, message):
tmp_file, tmp_path = mkstemp(dir=spool)
file = fdopen(tmp_file, 'w')
try:
- file.write(message.as_string())
+ message = message.as_string()
+ file.write(message)
finally:
file.close()
@@ -829,9 +850,11 @@ def register_dispatch_routes(self):
def register_urlpatterns_from_package(self, package):
urlpatterns = None
try:
- exec('from {} import urlpatterns'.format(package))
+ module_imported = __import__(f"{package}")
+ urlpatterns = module_imported.urls.urlpatterns
except ImportError:
return
+
# Dispatch base routes from ikaaro
for urlpattern_object in urlpatterns:
for pattern, view in urlpattern_object.get_patterns():
@@ -860,7 +883,7 @@ def cron_manager(self):
# Build fake context
with database.init_context() as context:
context.is_cron = True
- context.git_message = u'[CRON]'
+ context.git_message = '[CRON]'
# Go
t0 = time()
catalog = database.catalog
@@ -958,7 +981,13 @@ def do_request(self, method='GET', path='/', headers=None, body='',
for key, value in headers:
environ['HTTP_%s' % key.upper().replace('-', '_')] = value
# Set wsgi input body
- environ['wsgi.input'] = BytesIO(prepped.body)
+ if prepped.body is not None:
+ if type(prepped.body) is str:
+ environ['wsgi.input'] = BytesIO(prepped.body.encode("utf-8"))
+ else:
+ environ['wsgi.input'] = BytesIO(prepped.body)
+ else:
+ environ['wsgi.input'] = BytesIO()
# Set content length
if prepped.body:
environ['CONTENT_LENGTH'] = len(prepped.body)
@@ -1009,7 +1038,6 @@ def do_request(self, method='GET', path='/', headers=None, body='',
-
class ServerConfig(ConfigFile):
schema = {
diff --git a/ikaaro/skins.py b/ikaaro/skins.py
index 03f451ad5..38d1b55e4 100644
--- a/ikaaro/skins.py
+++ b/ikaaro/skins.py
@@ -31,14 +31,14 @@
from itools.web import get_context, ERROR, INFO
# Import from ikaaro
-from folder import Folder
-from views import get_view_scripts
-from skins_views import LanguagesTemplate, LocationTemplate, TabsTemplate
+from .folder import Folder
+from .views import get_view_scripts
+from .skins_views import LanguagesTemplate, LocationTemplate, TabsTemplate
class Skin(object):
- class_title = MSG(u'Skin')
+ class_title = MSG('Skin')
class_icon16 = '/ui/ikaaro/icons/16x16/skin.png'
class_icon48 = '/ui/ikaaro/icons/48x48/skin.png'
@@ -79,10 +79,10 @@ def get_template_title(self, context):
if not root.is_allowed_to_view(context.user, here):
return ''
elif root is here:
- template = MSG(u"{view_title} - {root_title}")
+ template = MSG("{view_title} - {root_title}")
here_title = None
else:
- template = MSG(u"{here_title} - {view_title} - {root_title}")
+ template = MSG("{here_title} - {view_title} - {root_title}")
here_title = here.get_title()
# The view
diff --git a/ikaaro/skins_views.py b/ikaaro/skins_views.py
index dfb2291c4..4c10d4135 100644
--- a/ikaaro/skins_views.py
+++ b/ikaaro/skins_views.py
@@ -25,7 +25,7 @@
from itools.uri import decode_query
# Import from ikaaro
-from utils import CMSTemplate, reduce_string
+from .utils import CMSTemplate, reduce_string
diff --git a/ikaaro/text.py b/ikaaro/text.py
index a26f8e64e..1a3e7282f 100644
--- a/ikaaro/text.py
+++ b/ikaaro/text.py
@@ -32,14 +32,14 @@
from itools.xmlfile import XMLFile
# Import from ikaaro
-from database import Database
-from fields import File_Field
-from file import File
-from file_views import File_Edit
-from text_views import Text_Edit, Text_View, PO_Edit
-from text_views import CSV_View, CSV_AddRow, CSV_EditRow
-from text_views import CSS_Edit
-from widgets import FileWidget, MultilineWidget
+from .database import Database
+from .fields import File_Field
+from .file import File
+from .file_views import File_Edit
+from .text_views import Text_Edit, Text_View, PO_Edit
+from .text_views import CSV_View, CSV_AddRow, CSV_EditRow
+from .text_views import CSS_Edit
+from .widgets import FileWidget, MultilineWidget
css_uri_expr = compile(r"url\((.*)\)")
def css_get_reference(uri):
@@ -60,7 +60,7 @@ def css_get_reference(uri):
class Text(File):
class_id = 'text'
- class_title = MSG(u'Plain Text')
+ class_title = MSG('Plain Text')
class_icon16 = '/ui/ikaaro/icons/16x16/text.png'
class_icon48 = '/ui/ikaaro/icons/48x48/text.png'
class_views = ['view', 'edit', 'externaledit']
@@ -81,7 +81,7 @@ def get_content_type(self):
class PO(Text):
class_id = 'text/x-gettext-translation'
- class_title = MSG(u'Message Catalog')
+ class_title = MSG('Message Catalog')
class_icon16 = '/ui/ikaaro/icons/16x16/po.png'
class_icon48 = '/ui/ikaaro/icons/48x48/po.png'
@@ -99,7 +99,7 @@ def get_po_handler(self):
class CSS(Text):
class_id = 'text/css'
- class_title = MSG(u'CSS')
+ class_title = MSG('CSS')
class_icon16 = '/ui/ikaaro/icons/16x16/css.png'
class_icon48 = '/ui/ikaaro/icons/48x48/css.png'
@@ -231,7 +231,7 @@ def my_func(matchobj):
class Python(Text):
class_id = 'text/x-python'
- class_title = MSG(u'Python')
+ class_title = MSG('Python')
class_icon16 = '/ui/ikaaro/icons/16x16/python.png'
class_icon48 = '/ui/ikaaro/icons/48x48/python.png'
# Fields
@@ -242,7 +242,7 @@ class Python(Text):
class JS(Text):
class_id = 'application/x-javascript'
- class_title = MSG(u'Javascript')
+ class_title = MSG('Javascript')
class_icon16 = '/ui/ikaaro/icons/16x16/js.png'
class_icon48 = '/ui/ikaaro/icons/48x48/js.png'
@@ -251,7 +251,7 @@ class JS(Text):
class XML(Text):
class_id = 'text/xml'
- class_title = MSG(u'XML File')
+ class_title = MSG('XML File')
# Fields
data = File_Field(required=True, class_handler=XMLFile)
@@ -260,7 +260,7 @@ class XML(Text):
class HTML(Text):
class_id = 'text/html'
- class_title = MSG(u'HTML File')
+ class_title = MSG('HTML File')
# Fields
data = File_Field(required=True, class_handler=HTMLFile)
@@ -269,7 +269,7 @@ class HTML(Text):
class CSV(Text):
class_id = 'text/comma-separated-values'
- class_title = MSG(u'Comma Separated Values')
+ class_title = MSG('Comma Separated Values')
class_views = ['view', 'add_row', 'edit', 'externaledit']
# Fields
diff --git a/ikaaro/text_views.py b/ikaaro/text_views.py
index d215add5b..c5db91644 100644
--- a/ikaaro/text_views.py
+++ b/ikaaro/text_views.py
@@ -27,18 +27,18 @@
from itools.web import STLView, INFO
# Import from ikaaro
-from autoform import AutoForm
-from buttons import Button, Remove_BrowseButton
-from fields import File_Field
-from file_views import File_Edit
-import messages
-from views import BrowseForm
-from widgets import EditAreaWidget, get_default_widget
+from .autoform import AutoForm
+from .buttons import Button, Remove_BrowseButton
+from .fields import File_Field
+from .file_views import File_Edit
+from . import messages
+from .views import BrowseForm
+from .widgets import EditAreaWidget, get_default_widget
class Text_Edit(File_Edit):
- title = MSG(u'Edit')
+ title = MSG('Edit')
icon = 'edit.png'
fields = ['title', 'data', 'file', 'description', 'subject', 'share']
@@ -77,7 +77,7 @@ def set_value(self, resource, context, name, form):
class Text_View(STLView):
access = 'is_allowed_to_view'
- title = MSG(u'View')
+ title = MSG('View')
icon = 'view.png'
template = '/ui/ikaaro/text/view.xml'
@@ -103,7 +103,7 @@ class CSS_Edit(Text_Edit):
class PO_Edit(STLView):
access = 'is_allowed_to_edit'
- title = MSG(u'Edit')
+ title = MSG('Edit')
template = '/ui/ikaaro/PO_edit.xml'
schema = {
'msgctxt': Unicode,
@@ -115,7 +115,7 @@ def get_namespace(self, resource, context):
# Get the translation units (all but the header)
handler = resource.get_po_handler()
units = handler.get_units()
- units.sort(key=lambda x: x.source)
+ units = sorted(units, key=lambda x: x.source)
if units and ''.join(units[0].source) == '':
units = units[1:]
@@ -129,9 +129,9 @@ def get_namespace(self, resource, context):
# Msgid and msgstr
if units:
unit = units[index-1]
- msgctxt = u'' if unit.context is None else ''.join(unit.context)
- msgid = u''.join(unit.source)
- msgstr = u''.join(unit.target)
+ msgctxt = '' if unit.context is None else ''.join(unit.context)
+ msgid = ''.join(unit.source)
+ msgstr = ''.join(unit.target)
else:
msgctxt = None
msgid = None
@@ -169,7 +169,7 @@ class CSV_View(BrowseForm):
# FIXME We need different permissions for GET and POST
access = 'is_allowed_to_edit'
- title = MSG(u'View')
+ title = MSG('View')
schema = {
'ids': Integer(mandatory=True, multiple=True),
}
@@ -193,7 +193,7 @@ def sort_and_batch(self, resource, context, items):
sort_by = int(sort_by)
else:
sort_by = handler.columns.index(sort_by)
- items.sort(key=itemgetter(sort_by), reverse=reverse)
+ items = sorted(items, key=itemgetter(sort_by), reverse=reverse)
# Batch
start = context.query['batch_start']
@@ -238,7 +238,7 @@ def action_remove(self, resource, context, form):
handler = resource.get_csv_handler()
handler.del_rows(ids)
# Ok
- context.message = INFO(u'Row deleted.')
+ context.message = INFO('Row deleted.')
@@ -268,10 +268,10 @@ def get_widgets(self, resource, context):
class CSV_AddRow(RowForm):
- title = MSG(u'Add Row')
+ title = MSG('Add Row')
icon = 'new.png'
actions = [Button(access=True, css='btn btn-primary',
- title=MSG(u'Add'), show=True)]
+ title=MSG('Add'), show=True)]
def action(self, resource, context, form):
@@ -279,7 +279,7 @@ def action(self, resource, context, form):
handler = resource.get_csv_handler()
row = handler.add_row(row)
# Ok
- message = INFO(u'New row added.')
+ message = INFO('New row added.')
goto = ';edit_row?index=%s' % row.number
return context.come_back(message, goto=goto)
@@ -287,7 +287,7 @@ def action(self, resource, context, form):
class CSV_EditRow(RowForm):
- title = MSG(u'Edit row #{id}')
+ title = MSG('Edit row #{id}')
query_schema = {
'index': Integer,
}
diff --git a/ikaaro/ui_dev/aruni/package-lock.json b/ikaaro/ui_dev/aruni/package-lock.json
index 63c8379ca..33d6465c5 100644
--- a/ikaaro/ui_dev/aruni/package-lock.json
+++ b/ikaaro/ui_dev/aruni/package-lock.json
@@ -1,5562 +1,8 @@
{
"name": "aruni",
"version": "1.0.0",
- "lockfileVersion": 2,
+ "lockfileVersion": 1,
"requires": true,
- "packages": {
- "": {
- "name": "aruni",
- "version": "1.0.0",
- "dependencies": {
- "ansi-colors": "~4.1.1",
- "bootstrap": "4.4.1",
- "fancy-log": "~1.3.3",
- "font-awesome": "4.7.0",
- "gulp": "~4.0.2",
- "gulp-append": "~0.3.4",
- "gulp-concat": "~2.6.1",
- "gulp-sass": "~5.0.0",
- "jquery": "~3.6.0",
- "popper.js": "~1.16.1",
- "sass": "~1.45.0"
- }
- },
- "node_modules/@ungap/promise-all-settled": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz",
- "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q=="
- },
- "node_modules/ansi-colors": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
- "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/ansi-gray": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz",
- "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=",
- "dependencies": {
- "ansi-wrap": "0.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ansi-styles": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
- "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ansi-wrap": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz",
- "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/anymatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
- "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
- "dependencies": {
- "normalize-path": "^3.0.0",
- "picomatch": "^2.0.4"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/append-buffer": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz",
- "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=",
- "dependencies": {
- "buffer-equal": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/archy": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz",
- "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA="
- },
- "node_modules/argparse": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
- "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
- },
- "node_modules/arr-diff": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
- "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/arr-filter": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz",
- "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=",
- "dependencies": {
- "make-iterator": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/arr-flatten": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
- "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/arr-map": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz",
- "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=",
- "dependencies": {
- "make-iterator": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/arr-union": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
- "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/array-differ": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz",
- "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/array-each": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz",
- "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/array-initial": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz",
- "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=",
- "dependencies": {
- "array-slice": "^1.0.0",
- "is-number": "^4.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/array-initial/node_modules/is-number": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
- "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/array-last": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz",
- "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==",
- "dependencies": {
- "is-number": "^4.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/array-last/node_modules/is-number": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
- "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/array-slice": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz",
- "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/array-sort": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz",
- "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==",
- "dependencies": {
- "default-compare": "^1.0.0",
- "get-value": "^2.0.6",
- "kind-of": "^5.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/array-sort/node_modules/kind-of": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
- "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/array-uniq": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
- "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/array-unique": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
- "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/assign-symbols": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
- "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/async-done": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz",
- "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==",
- "dependencies": {
- "end-of-stream": "^1.1.0",
- "once": "^1.3.2",
- "process-nextick-args": "^2.0.0",
- "stream-exhaust": "^1.0.1"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/async-each": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz",
- "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ=="
- },
- "node_modules/async-settle": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz",
- "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=",
- "dependencies": {
- "async-done": "^1.2.2"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/atob": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
- "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
- "bin": {
- "atob": "bin/atob.js"
- },
- "engines": {
- "node": ">= 4.5.0"
- }
- },
- "node_modules/bach": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz",
- "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=",
- "dependencies": {
- "arr-filter": "^1.1.1",
- "arr-flatten": "^1.0.1",
- "arr-map": "^2.0.0",
- "array-each": "^1.0.0",
- "array-initial": "^1.0.0",
- "array-last": "^1.1.1",
- "async-done": "^1.2.2",
- "async-settle": "^1.0.0",
- "now-and-later": "^2.0.0"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/balanced-match": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
- "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
- },
- "node_modules/base": {
- "version": "0.11.2",
- "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
- "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
- "dependencies": {
- "cache-base": "^1.0.1",
- "class-utils": "^0.3.5",
- "component-emitter": "^1.2.1",
- "define-property": "^1.0.0",
- "isobject": "^3.0.1",
- "mixin-deep": "^1.2.0",
- "pascalcase": "^0.1.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/base/node_modules/define-property": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
- "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
- "dependencies": {
- "is-descriptor": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/base/node_modules/is-accessor-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
- "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
- "dependencies": {
- "kind-of": "^6.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/base/node_modules/is-data-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
- "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
- "dependencies": {
- "kind-of": "^6.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/base/node_modules/is-descriptor": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
- "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
- "dependencies": {
- "is-accessor-descriptor": "^1.0.0",
- "is-data-descriptor": "^1.0.0",
- "kind-of": "^6.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/beeper": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz",
- "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/binary-extensions": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
- "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/bootstrap": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.4.1.tgz",
- "integrity": "sha512-tbx5cHubwE6e2ZG7nqM3g/FZ5PQEDMWmMGNrCUBVRPHXTJaH7CBDdsLeu3eCh3B1tzAxTnAbtmrzvWEvT2NNEA==",
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/bootstrap"
- },
- "peerDependencies": {
- "jquery": "1.9.1 - 3",
- "popper.js": "^1.16.0"
- }
- },
- "node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "node_modules/braces": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
- "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
- "dependencies": {
- "arr-flatten": "^1.1.0",
- "array-unique": "^0.3.2",
- "extend-shallow": "^2.0.1",
- "fill-range": "^4.0.0",
- "isobject": "^3.0.1",
- "repeat-element": "^1.1.2",
- "snapdragon": "^0.8.1",
- "snapdragon-node": "^2.0.1",
- "split-string": "^3.0.2",
- "to-regex": "^3.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/braces/node_modules/extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dependencies": {
- "is-extendable": "^0.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/browser-stdout": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
- "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw=="
- },
- "node_modules/buffer-equal": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz",
- "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=",
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/buffer-from": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
- "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A=="
- },
- "node_modules/cache-base": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
- "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
- "dependencies": {
- "collection-visit": "^1.0.0",
- "component-emitter": "^1.2.1",
- "get-value": "^2.0.6",
- "has-value": "^1.0.0",
- "isobject": "^3.0.1",
- "set-value": "^2.0.0",
- "to-object-path": "^0.3.0",
- "union-value": "^1.0.0",
- "unset-value": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/camelcase": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.1.tgz",
- "integrity": "sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA==",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/chalk": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
- "dependencies": {
- "ansi-styles": "^2.2.1",
- "escape-string-regexp": "^1.0.2",
- "has-ansi": "^2.0.0",
- "strip-ansi": "^3.0.0",
- "supports-color": "^2.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/chokidar": {
- "version": "3.5.2",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz",
- "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==",
- "dependencies": {
- "anymatch": "~3.1.2",
- "braces": "~3.0.2",
- "glob-parent": "~5.1.2",
- "is-binary-path": "~2.1.0",
- "is-glob": "~4.0.1",
- "normalize-path": "~3.0.0",
- "readdirp": "~3.6.0"
- },
- "engines": {
- "node": ">= 8.10.0"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.2"
- }
- },
- "node_modules/chokidar/node_modules/braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
- "dependencies": {
- "fill-range": "^7.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/chokidar/node_modules/fill-range": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
- "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
- "dependencies": {
- "to-regex-range": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/chokidar/node_modules/is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "engines": {
- "node": ">=0.12.0"
- }
- },
- "node_modules/chokidar/node_modules/to-regex-range": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
- "dependencies": {
- "is-number": "^7.0.0"
- },
- "engines": {
- "node": ">=8.0"
- }
- },
- "node_modules/class-utils": {
- "version": "0.3.6",
- "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
- "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
- "dependencies": {
- "arr-union": "^3.1.0",
- "define-property": "^0.2.5",
- "isobject": "^3.0.0",
- "static-extend": "^0.1.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/class-utils/node_modules/define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "dependencies": {
- "is-descriptor": "^0.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/cliui": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
- "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
- "dependencies": {
- "string-width": "^4.2.0",
- "strip-ansi": "^6.0.0",
- "wrap-ansi": "^7.0.0"
- }
- },
- "node_modules/cliui/node_modules/ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/cliui/node_modules/strip-ansi": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "dependencies": {
- "ansi-regex": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/clone": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
- "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
- "engines": {
- "node": ">=0.8"
- }
- },
- "node_modules/clone-buffer": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz",
- "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=",
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/clone-stats": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz",
- "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE="
- },
- "node_modules/cloneable-readable": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz",
- "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==",
- "dependencies": {
- "inherits": "^2.0.1",
- "process-nextick-args": "^2.0.0",
- "readable-stream": "^2.3.5"
- }
- },
- "node_modules/cloneable-readable/node_modules/isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
- },
- "node_modules/cloneable-readable/node_modules/readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "node_modules/cloneable-readable/node_modules/string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "dependencies": {
- "safe-buffer": "~5.1.0"
- }
- },
- "node_modules/code-point-at": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
- "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/collection-map": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz",
- "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=",
- "dependencies": {
- "arr-map": "^2.0.2",
- "for-own": "^1.0.0",
- "make-iterator": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/collection-visit": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
- "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
- "dependencies": {
- "map-visit": "^1.0.0",
- "object-visit": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
- },
- "node_modules/color-support": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
- "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
- "bin": {
- "color-support": "bin.js"
- }
- },
- "node_modules/component-emitter": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
- "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
- },
- "node_modules/concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
- },
- "node_modules/concat-stream": {
- "version": "1.6.2",
- "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
- "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
- "engines": [
- "node >= 0.8"
- ],
- "dependencies": {
- "buffer-from": "^1.0.0",
- "inherits": "^2.0.3",
- "readable-stream": "^2.2.2",
- "typedarray": "^0.0.6"
- }
- },
- "node_modules/concat-stream/node_modules/isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
- },
- "node_modules/concat-stream/node_modules/readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "node_modules/concat-stream/node_modules/string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "dependencies": {
- "safe-buffer": "~5.1.0"
- }
- },
- "node_modules/concat-with-sourcemaps": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz",
- "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==",
- "dependencies": {
- "source-map": "^0.6.1"
- }
- },
- "node_modules/concat-with-sourcemaps/node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/convert-source-map": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
- "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
- "dependencies": {
- "safe-buffer": "~5.1.1"
- }
- },
- "node_modules/copy-descriptor": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
- "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/copy-props": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.4.tgz",
- "integrity": "sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==",
- "dependencies": {
- "each-props": "^1.3.0",
- "is-plain-object": "^2.0.1"
- }
- },
- "node_modules/core-util-is": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
- "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
- },
- "node_modules/d": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz",
- "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==",
- "dependencies": {
- "es5-ext": "^0.10.50",
- "type": "^1.0.1"
- }
- },
- "node_modules/dateformat": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz",
- "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=",
- "engines": {
- "node": "*"
- }
- },
- "node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/decamelize": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
- "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/decode-uri-component": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
- "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
- "engines": {
- "node": ">=0.10"
- }
- },
- "node_modules/default-compare": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz",
- "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==",
- "dependencies": {
- "kind-of": "^5.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/default-compare/node_modules/kind-of": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
- "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/default-resolution": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz",
- "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=",
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/define-properties": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
- "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
- "dependencies": {
- "object-keys": "^1.0.12"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/define-property": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
- "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
- "dependencies": {
- "is-descriptor": "^1.0.2",
- "isobject": "^3.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/define-property/node_modules/is-accessor-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
- "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
- "dependencies": {
- "kind-of": "^6.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/define-property/node_modules/is-data-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
- "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
- "dependencies": {
- "kind-of": "^6.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/define-property/node_modules/is-descriptor": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
- "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
- "dependencies": {
- "is-accessor-descriptor": "^1.0.0",
- "is-data-descriptor": "^1.0.0",
- "kind-of": "^6.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/detect-file": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz",
- "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/diff": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz",
- "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==",
- "engines": {
- "node": ">=0.3.1"
- }
- },
- "node_modules/duplexer2": {
- "version": "0.0.2",
- "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz",
- "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=",
- "dependencies": {
- "readable-stream": "~1.1.9"
- }
- },
- "node_modules/duplexify": {
- "version": "3.7.1",
- "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz",
- "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==",
- "dependencies": {
- "end-of-stream": "^1.0.0",
- "inherits": "^2.0.1",
- "readable-stream": "^2.0.0",
- "stream-shift": "^1.0.0"
- }
- },
- "node_modules/duplexify/node_modules/isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
- },
- "node_modules/duplexify/node_modules/readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "node_modules/duplexify/node_modules/string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "dependencies": {
- "safe-buffer": "~5.1.0"
- }
- },
- "node_modules/each-props": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz",
- "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==",
- "dependencies": {
- "is-plain-object": "^2.0.1",
- "object.defaults": "^1.1.0"
- }
- },
- "node_modules/emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
- },
- "node_modules/end-of-stream": {
- "version": "1.4.4",
- "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
- "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
- "dependencies": {
- "once": "^1.4.0"
- }
- },
- "node_modules/end-of-stream/node_modules/once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
- "dependencies": {
- "wrappy": "1"
- }
- },
- "node_modules/error-ex": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
- "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
- "dependencies": {
- "is-arrayish": "^0.2.1"
- }
- },
- "node_modules/es5-ext": {
- "version": "0.10.53",
- "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz",
- "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==",
- "dependencies": {
- "es6-iterator": "~2.0.3",
- "es6-symbol": "~3.1.3",
- "next-tick": "~1.0.0"
- }
- },
- "node_modules/es6-iterator": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
- "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
- "dependencies": {
- "d": "1",
- "es5-ext": "^0.10.35",
- "es6-symbol": "^3.1.1"
- }
- },
- "node_modules/es6-symbol": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz",
- "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==",
- "dependencies": {
- "d": "^1.0.1",
- "ext": "^1.1.2"
- }
- },
- "node_modules/es6-weak-map": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz",
- "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==",
- "dependencies": {
- "d": "1",
- "es5-ext": "^0.10.46",
- "es6-iterator": "^2.0.3",
- "es6-symbol": "^3.1.1"
- }
- },
- "node_modules/escalade": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
- "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/expand-brackets": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
- "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
- "dependencies": {
- "debug": "^2.3.3",
- "define-property": "^0.2.5",
- "extend-shallow": "^2.0.1",
- "posix-character-classes": "^0.1.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/expand-brackets/node_modules/define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "dependencies": {
- "is-descriptor": "^0.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/expand-brackets/node_modules/extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dependencies": {
- "is-extendable": "^0.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/expand-tilde": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
- "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=",
- "dependencies": {
- "homedir-polyfill": "^1.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ext": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz",
- "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==",
- "dependencies": {
- "type": "^2.0.0"
- }
- },
- "node_modules/ext/node_modules/type": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz",
- "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow=="
- },
- "node_modules/extend": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
- "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
- },
- "node_modules/extend-shallow": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
- "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
- "dependencies": {
- "assign-symbols": "^1.0.0",
- "is-extendable": "^1.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/extend-shallow/node_modules/is-extendable": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
- "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
- "dependencies": {
- "is-plain-object": "^2.0.4"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/extglob": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
- "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
- "dependencies": {
- "array-unique": "^0.3.2",
- "define-property": "^1.0.0",
- "expand-brackets": "^2.1.4",
- "extend-shallow": "^2.0.1",
- "fragment-cache": "^0.2.1",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/extglob/node_modules/define-property": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
- "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
- "dependencies": {
- "is-descriptor": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/extglob/node_modules/extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dependencies": {
- "is-extendable": "^0.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/extglob/node_modules/is-accessor-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
- "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
- "dependencies": {
- "kind-of": "^6.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/extglob/node_modules/is-data-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
- "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
- "dependencies": {
- "kind-of": "^6.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/extglob/node_modules/is-descriptor": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
- "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
- "dependencies": {
- "is-accessor-descriptor": "^1.0.0",
- "is-data-descriptor": "^1.0.0",
- "kind-of": "^6.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/fancy-log": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz",
- "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==",
- "dependencies": {
- "ansi-gray": "^0.1.1",
- "color-support": "^1.1.3",
- "parse-node-version": "^1.0.0",
- "time-stamp": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/fill-range": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
- "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
- "dependencies": {
- "extend-shallow": "^2.0.1",
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1",
- "to-regex-range": "^2.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/fill-range/node_modules/extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dependencies": {
- "is-extendable": "^0.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/find-up": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
- "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
- "dependencies": {
- "locate-path": "^6.0.0",
- "path-exists": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/findup-sync": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz",
- "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==",
- "dependencies": {
- "detect-file": "^1.0.0",
- "is-glob": "^4.0.0",
- "micromatch": "^3.0.4",
- "resolve-dir": "^1.0.1"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/fined": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz",
- "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==",
- "dependencies": {
- "expand-tilde": "^2.0.2",
- "is-plain-object": "^2.0.3",
- "object.defaults": "^1.1.0",
- "object.pick": "^1.2.0",
- "parse-filepath": "^1.0.1"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/flagged-respawn": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz",
- "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==",
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/flat": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
- "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
- "bin": {
- "flat": "cli.js"
- }
- },
- "node_modules/flush-write-stream": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz",
- "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==",
- "dependencies": {
- "inherits": "^2.0.3",
- "readable-stream": "^2.3.6"
- }
- },
- "node_modules/flush-write-stream/node_modules/isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
- },
- "node_modules/flush-write-stream/node_modules/readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "node_modules/flush-write-stream/node_modules/string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "dependencies": {
- "safe-buffer": "~5.1.0"
- }
- },
- "node_modules/font-awesome": {
- "version": "4.7.0",
- "resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.7.0.tgz",
- "integrity": "sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM=",
- "engines": {
- "node": ">=0.10.3"
- }
- },
- "node_modules/for-in": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
- "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/for-own": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz",
- "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
- "dependencies": {
- "for-in": "^1.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/fragment-cache": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
- "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
- "dependencies": {
- "map-cache": "^0.2.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/fs-mkdirp-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz",
- "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=",
- "dependencies": {
- "graceful-fs": "^4.1.11",
- "through2": "^2.0.3"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
- },
- "node_modules/fsevents": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
- "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
- "hasInstallScript": true,
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
- }
- },
- "node_modules/function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
- },
- "node_modules/get-caller-file": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
- "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
- "engines": {
- "node": "6.* || 8.* || >= 10.*"
- }
- },
- "node_modules/get-value": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
- "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/glob": {
- "version": "7.1.7",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
- "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- },
- "engines": {
- "node": "*"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dependencies": {
- "is-glob": "^4.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/glob-stream": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz",
- "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=",
- "dependencies": {
- "extend": "^3.0.0",
- "glob": "^7.1.1",
- "glob-parent": "^3.1.0",
- "is-negated-glob": "^1.0.0",
- "ordered-read-streams": "^1.0.0",
- "pumpify": "^1.3.5",
- "readable-stream": "^2.1.5",
- "remove-trailing-separator": "^1.0.1",
- "to-absolute-glob": "^2.0.0",
- "unique-stream": "^2.0.2"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/glob-stream/node_modules/glob-parent": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
- "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
- "dependencies": {
- "is-glob": "^3.1.0",
- "path-dirname": "^1.0.0"
- }
- },
- "node_modules/glob-stream/node_modules/is-glob": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
- "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
- "dependencies": {
- "is-extglob": "^2.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/glob-stream/node_modules/isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
- },
- "node_modules/glob-stream/node_modules/readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "node_modules/glob-stream/node_modules/string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "dependencies": {
- "safe-buffer": "~5.1.0"
- }
- },
- "node_modules/glob-watcher": {
- "version": "5.0.5",
- "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.5.tgz",
- "integrity": "sha512-zOZgGGEHPklZNjZQaZ9f41i7F2YwE+tS5ZHrDhbBCk3stwahn5vQxnFmBJZHoYdusR6R1bLSXeGUy/BhctwKzw==",
- "dependencies": {
- "anymatch": "^2.0.0",
- "async-done": "^1.2.0",
- "chokidar": "^2.0.0",
- "is-negated-glob": "^1.0.0",
- "just-debounce": "^1.0.0",
- "normalize-path": "^3.0.0",
- "object.defaults": "^1.1.0"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/glob-watcher/node_modules/anymatch": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
- "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
- "dependencies": {
- "micromatch": "^3.1.4",
- "normalize-path": "^2.1.1"
- }
- },
- "node_modules/glob-watcher/node_modules/binary-extensions": {
- "version": "1.13.1",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
- "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/glob-watcher/node_modules/chokidar": {
- "version": "2.1.8",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",
- "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==",
- "deprecated": "Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.",
- "dependencies": {
- "anymatch": "^2.0.0",
- "async-each": "^1.0.1",
- "braces": "^2.3.2",
- "glob-parent": "^3.1.0",
- "inherits": "^2.0.3",
- "is-binary-path": "^1.0.0",
- "is-glob": "^4.0.0",
- "normalize-path": "^3.0.0",
- "path-is-absolute": "^1.0.0",
- "readdirp": "^2.2.1",
- "upath": "^1.1.1"
- },
- "optionalDependencies": {
- "fsevents": "^1.2.7"
- }
- },
- "node_modules/glob-watcher/node_modules/chokidar/node_modules/normalize-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/glob-watcher/node_modules/fsevents": {
- "version": "1.2.11",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.11.tgz",
- "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==",
- "bundleDependencies": [
- "node-pre-gyp"
- ],
- "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.",
- "hasInstallScript": true,
- "optional": true,
- "os": [
- "darwin"
- ],
- "dependencies": {
- "bindings": "^1.5.0",
- "nan": "^2.12.1",
- "node-pre-gyp": "*"
- },
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/abbrev": {
- "version": "1.1.1",
- "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
- "inBundle": true,
- "optional": true
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/ansi-regex": {
- "version": "2.1.1",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
- "inBundle": true,
- "optional": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/aproba": {
- "version": "1.2.0",
- "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
- "inBundle": true,
- "optional": true
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/are-we-there-yet": {
- "version": "1.1.5",
- "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
- "inBundle": true,
- "optional": true,
- "dependencies": {
- "delegates": "^1.0.0",
- "readable-stream": "^2.0.6"
- }
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/balanced-match": {
- "version": "1.0.0",
- "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
- "inBundle": true,
- "optional": true
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/brace-expansion": {
- "version": "1.1.11",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "inBundle": true,
- "optional": true,
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/chownr": {
- "version": "1.1.3",
- "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==",
- "inBundle": true,
- "optional": true
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/code-point-at": {
- "version": "1.1.0",
- "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
- "inBundle": true,
- "optional": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/concat-map": {
- "version": "0.0.1",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
- "inBundle": true,
- "optional": true
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/console-control-strings": {
- "version": "1.1.0",
- "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
- "inBundle": true,
- "optional": true
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/core-util-is": {
- "version": "1.0.2",
- "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
- "inBundle": true,
- "optional": true
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/debug": {
- "version": "3.2.6",
- "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
- "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)",
- "inBundle": true,
- "optional": true,
- "dependencies": {
- "ms": "^2.1.1"
- }
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/deep-extend": {
- "version": "0.6.0",
- "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
- "inBundle": true,
- "optional": true,
- "engines": {
- "node": ">=4.0.0"
- }
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/delegates": {
- "version": "1.0.0",
- "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
- "inBundle": true,
- "optional": true
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/detect-libc": {
- "version": "1.0.3",
- "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=",
- "inBundle": true,
- "optional": true,
- "bin": {
- "detect-libc": "bin/detect-libc.js"
- },
- "engines": {
- "node": ">=0.10"
- }
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/fs-minipass": {
- "version": "1.2.7",
- "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==",
- "inBundle": true,
- "optional": true,
- "dependencies": {
- "minipass": "^2.6.0"
- }
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/fs.realpath": {
- "version": "1.0.0",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
- "inBundle": true,
- "optional": true
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/gauge": {
- "version": "2.7.4",
- "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
- "inBundle": true,
- "optional": true,
- "dependencies": {
- "aproba": "^1.0.3",
- "console-control-strings": "^1.0.0",
- "has-unicode": "^2.0.0",
- "object-assign": "^4.1.0",
- "signal-exit": "^3.0.0",
- "string-width": "^1.0.1",
- "strip-ansi": "^3.0.1",
- "wide-align": "^1.1.0"
- }
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/glob": {
- "version": "7.1.6",
- "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
- "inBundle": true,
- "optional": true,
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- },
- "engines": {
- "node": "*"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/has-unicode": {
- "version": "2.0.1",
- "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
- "inBundle": true,
- "optional": true
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/iconv-lite": {
- "version": "0.4.24",
- "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
- "inBundle": true,
- "optional": true,
- "dependencies": {
- "safer-buffer": ">= 2.1.2 < 3"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/ignore-walk": {
- "version": "3.0.3",
- "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==",
- "inBundle": true,
- "optional": true,
- "dependencies": {
- "minimatch": "^3.0.4"
- }
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/inflight": {
- "version": "1.0.6",
- "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
- "inBundle": true,
- "optional": true,
- "dependencies": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/inherits": {
- "version": "2.0.4",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
- "inBundle": true,
- "optional": true
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/ini": {
- "version": "1.3.5",
- "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
- "deprecated": "Please update to ini >=1.3.6 to avoid a prototype pollution issue",
- "inBundle": true,
- "optional": true,
- "engines": {
- "node": "*"
- }
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/is-fullwidth-code-point": {
- "version": "1.0.0",
- "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
- "inBundle": true,
- "optional": true,
- "dependencies": {
- "number-is-nan": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/isarray": {
- "version": "1.0.0",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
- "inBundle": true,
- "optional": true
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/minimatch": {
- "version": "3.0.4",
- "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
- "inBundle": true,
- "optional": true,
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/minimist": {
- "version": "0.0.8",
- "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
- "inBundle": true,
- "optional": true
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/minipass": {
- "version": "2.9.0",
- "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==",
- "inBundle": true,
- "optional": true,
- "dependencies": {
- "safe-buffer": "^5.1.2",
- "yallist": "^3.0.0"
- }
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/minizlib": {
- "version": "1.3.3",
- "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==",
- "inBundle": true,
- "optional": true,
- "dependencies": {
- "minipass": "^2.9.0"
- }
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/mkdirp": {
- "version": "0.5.1",
- "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
- "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)",
- "inBundle": true,
- "optional": true,
- "dependencies": {
- "minimist": "0.0.8"
- },
- "bin": {
- "mkdirp": "bin/cmd.js"
- }
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/ms": {
- "version": "2.1.2",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "inBundle": true,
- "optional": true
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/needle": {
- "version": "2.4.0",
- "integrity": "sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==",
- "inBundle": true,
- "optional": true,
- "dependencies": {
- "debug": "^3.2.6",
- "iconv-lite": "^0.4.4",
- "sax": "^1.2.4"
- },
- "bin": {
- "needle": "bin/needle"
- },
- "engines": {
- "node": ">= 4.4.x"
- }
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/node-pre-gyp": {
- "version": "0.14.0",
- "integrity": "sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==",
- "deprecated": "Please upgrade to @mapbox/node-pre-gyp: the non-scoped node-pre-gyp package is deprecated and only the @mapbox scoped package will recieve updates in the future",
- "inBundle": true,
- "optional": true,
- "dependencies": {
- "detect-libc": "^1.0.2",
- "mkdirp": "^0.5.1",
- "needle": "^2.2.1",
- "nopt": "^4.0.1",
- "npm-packlist": "^1.1.6",
- "npmlog": "^4.0.2",
- "rc": "^1.2.7",
- "rimraf": "^2.6.1",
- "semver": "^5.3.0",
- "tar": "^4.4.2"
- },
- "bin": {
- "node-pre-gyp": "bin/node-pre-gyp"
- }
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/nopt": {
- "version": "4.0.1",
- "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=",
- "inBundle": true,
- "optional": true,
- "dependencies": {
- "abbrev": "1",
- "osenv": "^0.1.4"
- },
- "bin": {
- "nopt": "bin/nopt.js"
- }
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/npm-bundled": {
- "version": "1.1.1",
- "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==",
- "inBundle": true,
- "optional": true,
- "dependencies": {
- "npm-normalize-package-bin": "^1.0.1"
- }
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/npm-normalize-package-bin": {
- "version": "1.0.1",
- "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==",
- "inBundle": true,
- "optional": true
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/npm-packlist": {
- "version": "1.4.7",
- "integrity": "sha512-vAj7dIkp5NhieaGZxBJB8fF4R0078rqsmhJcAfXZ6O7JJhjhPK96n5Ry1oZcfLXgfun0GWTZPOxaEyqv8GBykQ==",
- "inBundle": true,
- "optional": true,
- "dependencies": {
- "ignore-walk": "^3.0.1",
- "npm-bundled": "^1.0.1"
- }
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/npmlog": {
- "version": "4.1.2",
- "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
- "inBundle": true,
- "optional": true,
- "dependencies": {
- "are-we-there-yet": "~1.1.2",
- "console-control-strings": "~1.1.0",
- "gauge": "~2.7.3",
- "set-blocking": "~2.0.0"
- }
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/number-is-nan": {
- "version": "1.0.1",
- "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
- "inBundle": true,
- "optional": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/object-assign": {
- "version": "4.1.1",
- "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
- "inBundle": true,
- "optional": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/once": {
- "version": "1.4.0",
- "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
- "inBundle": true,
- "optional": true,
- "dependencies": {
- "wrappy": "1"
- }
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/os-homedir": {
- "version": "1.0.2",
- "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
- "inBundle": true,
- "optional": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/os-tmpdir": {
- "version": "1.0.2",
- "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
- "inBundle": true,
- "optional": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/osenv": {
- "version": "0.1.5",
- "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
- "inBundle": true,
- "optional": true,
- "dependencies": {
- "os-homedir": "^1.0.0",
- "os-tmpdir": "^1.0.0"
- }
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/path-is-absolute": {
- "version": "1.0.1",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
- "inBundle": true,
- "optional": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/process-nextick-args": {
- "version": "2.0.1",
- "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
- "inBundle": true,
- "optional": true
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/rc": {
- "version": "1.2.8",
- "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
- "inBundle": true,
- "optional": true,
- "dependencies": {
- "deep-extend": "^0.6.0",
- "ini": "~1.3.0",
- "minimist": "^1.2.0",
- "strip-json-comments": "~2.0.1"
- },
- "bin": {
- "rc": "cli.js"
- }
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/rc/node_modules/minimist": {
- "version": "1.2.0",
- "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
- "inBundle": true,
- "optional": true
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/readable-stream": {
- "version": "2.3.6",
- "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
- "inBundle": true,
- "optional": true,
- "dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/rimraf": {
- "version": "2.7.1",
- "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
- "inBundle": true,
- "optional": true,
- "dependencies": {
- "glob": "^7.1.3"
- },
- "bin": {
- "rimraf": "bin.js"
- }
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/safe-buffer": {
- "version": "5.1.2",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
- "inBundle": true,
- "optional": true
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/safer-buffer": {
- "version": "2.1.2",
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
- "inBundle": true,
- "optional": true
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/sax": {
- "version": "1.2.4",
- "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
- "inBundle": true,
- "optional": true
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/semver": {
- "version": "5.7.1",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
- "inBundle": true,
- "optional": true,
- "bin": {
- "semver": "bin/semver"
- }
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/set-blocking": {
- "version": "2.0.0",
- "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
- "inBundle": true,
- "optional": true
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/signal-exit": {
- "version": "3.0.2",
- "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
- "inBundle": true,
- "optional": true
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/string_decoder": {
- "version": "1.1.1",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "inBundle": true,
- "optional": true,
- "dependencies": {
- "safe-buffer": "~5.1.0"
- }
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/string-width": {
- "version": "1.0.2",
- "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
- "inBundle": true,
- "optional": true,
- "dependencies": {
- "code-point-at": "^1.0.0",
- "is-fullwidth-code-point": "^1.0.0",
- "strip-ansi": "^3.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/strip-ansi": {
- "version": "3.0.1",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
- "inBundle": true,
- "optional": true,
- "dependencies": {
- "ansi-regex": "^2.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/strip-json-comments": {
- "version": "2.0.1",
- "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
- "inBundle": true,
- "optional": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/tar": {
- "version": "4.4.13",
- "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==",
- "inBundle": true,
- "optional": true,
- "dependencies": {
- "chownr": "^1.1.1",
- "fs-minipass": "^1.2.5",
- "minipass": "^2.8.6",
- "minizlib": "^1.2.1",
- "mkdirp": "^0.5.0",
- "safe-buffer": "^5.1.2",
- "yallist": "^3.0.3"
- },
- "engines": {
- "node": ">=4.5"
- }
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/util-deprecate": {
- "version": "1.0.2",
- "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
- "inBundle": true,
- "optional": true
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/wide-align": {
- "version": "1.1.3",
- "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
- "inBundle": true,
- "optional": true,
- "dependencies": {
- "string-width": "^1.0.2 || 2"
- }
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/wrappy": {
- "version": "1.0.2",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
- "inBundle": true,
- "optional": true
- },
- "node_modules/glob-watcher/node_modules/fsevents/node_modules/yallist": {
- "version": "3.1.1",
- "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
- "inBundle": true,
- "optional": true
- },
- "node_modules/glob-watcher/node_modules/glob-parent": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
- "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
- "dependencies": {
- "is-glob": "^3.1.0",
- "path-dirname": "^1.0.0"
- }
- },
- "node_modules/glob-watcher/node_modules/glob-parent/node_modules/is-glob": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
- "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
- "dependencies": {
- "is-extglob": "^2.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/glob-watcher/node_modules/is-binary-path": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
- "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
- "dependencies": {
- "binary-extensions": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/glob-watcher/node_modules/isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
- },
- "node_modules/glob-watcher/node_modules/normalize-path": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
- "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
- "dependencies": {
- "remove-trailing-separator": "^1.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/glob-watcher/node_modules/readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "node_modules/glob-watcher/node_modules/readdirp": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
- "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
- "dependencies": {
- "graceful-fs": "^4.1.11",
- "micromatch": "^3.1.10",
- "readable-stream": "^2.0.2"
- },
- "engines": {
- "node": ">=0.10"
- }
- },
- "node_modules/glob-watcher/node_modules/string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "dependencies": {
- "safe-buffer": "~5.1.0"
- }
- },
- "node_modules/global-modules": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
- "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
- "dependencies": {
- "global-prefix": "^1.0.1",
- "is-windows": "^1.0.1",
- "resolve-dir": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/global-prefix": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
- "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=",
- "dependencies": {
- "expand-tilde": "^2.0.2",
- "homedir-polyfill": "^1.0.1",
- "ini": "^1.3.4",
- "is-windows": "^1.0.1",
- "which": "^1.2.14"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/glogg": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz",
- "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==",
- "dependencies": {
- "sparkles": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/graceful-fs": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz",
- "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ=="
- },
- "node_modules/growl": {
- "version": "1.10.5",
- "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
- "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==",
- "engines": {
- "node": ">=4.x"
- }
- },
- "node_modules/gulp": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz",
- "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==",
- "dependencies": {
- "glob-watcher": "^5.0.3",
- "gulp-cli": "^2.2.0",
- "undertaker": "^1.2.1",
- "vinyl-fs": "^3.0.0"
- },
- "bin": {
- "gulp": "bin/gulp.js"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/gulp-append": {
- "version": "0.3.4",
- "resolved": "https://registry.npmjs.org/gulp-append/-/gulp-append-0.3.4.tgz",
- "integrity": "sha1-mF0564JnjdYLP+tcA/GB+KyYmlc=",
- "dependencies": {
- "gulp-util": "^3.0.7",
- "mocha": "*",
- "through2": "^2.0.1"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/gulp-concat": {
- "version": "2.6.1",
- "resolved": "https://registry.npmjs.org/gulp-concat/-/gulp-concat-2.6.1.tgz",
- "integrity": "sha1-Yz0WyV2IUEYorQJmVmPO5aR5M1M=",
- "dependencies": {
- "concat-with-sourcemaps": "^1.0.0",
- "through2": "^2.0.0",
- "vinyl": "^2.0.0"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/gulp-concat/node_modules/clone": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
- "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
- "engines": {
- "node": ">=0.8"
- }
- },
- "node_modules/gulp-concat/node_modules/clone-stats": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz",
- "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA="
- },
- "node_modules/gulp-concat/node_modules/replace-ext": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz",
- "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=",
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/gulp-concat/node_modules/vinyl": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz",
- "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==",
- "dependencies": {
- "clone": "^2.1.1",
- "clone-buffer": "^1.0.0",
- "clone-stats": "^1.0.0",
- "cloneable-readable": "^1.0.0",
- "remove-trailing-separator": "^1.0.1",
- "replace-ext": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/gulp-sass": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/gulp-sass/-/gulp-sass-5.0.0.tgz",
- "integrity": "sha512-J0aH0/2N4+2szGCeut0ktGHK0Wg8L9uWivuigrl7xv+nhxozBQRAKLrhnDDaTa3FeUWYtgT8w4RlgdhRy5v16w==",
- "dependencies": {
- "chalk": "^4.1.1",
- "lodash": "^4.17.20",
- "plugin-error": "^1.0.1",
- "replace-ext": "^2.0.0",
- "strip-ansi": "^6.0.0",
- "transfob": "^1.0.0",
- "vinyl-sourcemaps-apply": "^0.2.1"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/gulp-sass/node_modules/ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/gulp-sass/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/gulp-sass/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/gulp-sass/node_modules/replace-ext": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-2.0.0.tgz",
- "integrity": "sha512-UszKE5KVK6JvyD92nzMn9cDapSk6w/CaFZ96CnmDMUqH9oowfxF/ZjRITD25H4DnOQClLA4/j7jLGXXLVKxAug==",
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/gulp-sass/node_modules/strip-ansi": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "dependencies": {
- "ansi-regex": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/gulp-sass/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/gulp-util": {
- "version": "3.0.8",
- "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz",
- "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=",
- "deprecated": "gulp-util is deprecated - replace it, following the guidelines at https://medium.com/gulpjs/gulp-util-ca3b1f9f9ac5",
- "dependencies": {
- "array-differ": "^1.0.0",
- "array-uniq": "^1.0.2",
- "beeper": "^1.0.0",
- "chalk": "^1.0.0",
- "dateformat": "^2.0.0",
- "fancy-log": "^1.1.0",
- "gulplog": "^1.0.0",
- "has-gulplog": "^0.1.0",
- "lodash._reescape": "^3.0.0",
- "lodash._reevaluate": "^3.0.0",
- "lodash._reinterpolate": "^3.0.0",
- "lodash.template": "^3.0.0",
- "minimist": "^1.1.0",
- "multipipe": "^0.1.2",
- "object-assign": "^3.0.0",
- "replace-ext": "0.0.1",
- "through2": "^2.0.0",
- "vinyl": "^0.5.0"
- },
- "engines": {
- "node": ">=0.10"
- }
- },
- "node_modules/gulp/node_modules/ansi-colors": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz",
- "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==",
- "dependencies": {
- "ansi-wrap": "^0.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/gulp/node_modules/camelcase": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
- "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/gulp/node_modules/cliui": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
- "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
- "dependencies": {
- "string-width": "^1.0.1",
- "strip-ansi": "^3.0.1",
- "wrap-ansi": "^2.0.0"
- }
- },
- "node_modules/gulp/node_modules/get-caller-file": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
- "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w=="
- },
- "node_modules/gulp/node_modules/gulp-cli": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.2.0.tgz",
- "integrity": "sha512-rGs3bVYHdyJpLqR0TUBnlcZ1O5O++Zs4bA0ajm+zr3WFCfiSLjGwoCBqFs18wzN+ZxahT9DkOK5nDf26iDsWjA==",
- "dependencies": {
- "ansi-colors": "^1.0.1",
- "archy": "^1.0.0",
- "array-sort": "^1.0.0",
- "color-support": "^1.1.3",
- "concat-stream": "^1.6.0",
- "copy-props": "^2.0.1",
- "fancy-log": "^1.3.2",
- "gulplog": "^1.0.0",
- "interpret": "^1.1.0",
- "isobject": "^3.0.1",
- "liftoff": "^3.1.0",
- "matchdep": "^2.0.0",
- "mute-stdout": "^1.0.0",
- "pretty-hrtime": "^1.0.0",
- "replace-homedir": "^1.0.0",
- "semver-greatest-satisfied-range": "^1.1.0",
- "v8flags": "^3.0.1",
- "yargs": "^7.1.0"
- },
- "bin": {
- "gulp": "bin/gulp.js"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/gulp/node_modules/is-fullwidth-code-point": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
- "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
- "dependencies": {
- "number-is-nan": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/gulp/node_modules/require-main-filename": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
- "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE="
- },
- "node_modules/gulp/node_modules/string-width": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
- "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
- "dependencies": {
- "code-point-at": "^1.0.0",
- "is-fullwidth-code-point": "^1.0.0",
- "strip-ansi": "^3.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/gulp/node_modules/which-module": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz",
- "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8="
- },
- "node_modules/gulp/node_modules/wrap-ansi": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
- "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
- "dependencies": {
- "string-width": "^1.0.1",
- "strip-ansi": "^3.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/gulp/node_modules/y18n": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz",
- "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ=="
- },
- "node_modules/gulp/node_modules/yargs": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz",
- "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=",
- "dependencies": {
- "camelcase": "^3.0.0",
- "cliui": "^3.2.0",
- "decamelize": "^1.1.1",
- "get-caller-file": "^1.0.1",
- "os-locale": "^1.4.0",
- "read-pkg-up": "^1.0.1",
- "require-directory": "^2.1.1",
- "require-main-filename": "^1.0.1",
- "set-blocking": "^2.0.0",
- "string-width": "^1.0.2",
- "which-module": "^1.0.0",
- "y18n": "^3.2.1",
- "yargs-parser": "^5.0.0"
- }
- },
- "node_modules/gulp/node_modules/yargs-parser": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.1.tgz",
- "integrity": "sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==",
- "dependencies": {
- "camelcase": "^3.0.0",
- "object.assign": "^4.1.0"
- }
- },
- "node_modules/gulplog": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz",
- "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=",
- "dependencies": {
- "glogg": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/has-ansi": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
- "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
- "dependencies": {
- "ansi-regex": "^2.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/has-gulplog": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz",
- "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=",
- "dependencies": {
- "sparkles": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/has-symbols": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
- "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-value": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
- "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
- "dependencies": {
- "get-value": "^2.0.6",
- "has-values": "^1.0.0",
- "isobject": "^3.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/has-values": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
- "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
- "dependencies": {
- "is-number": "^3.0.0",
- "kind-of": "^4.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/has-values/node_modules/kind-of": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
- "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
- "dependencies": {
- "is-buffer": "^1.1.5"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/he": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
- "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
- "bin": {
- "he": "bin/he"
- }
- },
- "node_modules/homedir-polyfill": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz",
- "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==",
- "dependencies": {
- "parse-passwd": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/hosted-git-info": {
- "version": "2.8.9",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
- "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw=="
- },
- "node_modules/immutable": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz",
- "integrity": "sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw=="
- },
- "node_modules/inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
- "dependencies": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "node_modules/inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
- },
- "node_modules/ini": {
- "version": "1.3.8",
- "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
- "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="
- },
- "node_modules/interpret": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz",
- "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==",
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/invert-kv": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
- "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-absolute": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz",
- "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==",
- "dependencies": {
- "is-relative": "^1.0.0",
- "is-windows": "^1.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-accessor-descriptor": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
- "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
- "dependencies": {
- "kind-of": "^3.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-accessor-descriptor/node_modules/kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dependencies": {
- "is-buffer": "^1.1.5"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-arrayish": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
- "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
- },
- "node_modules/is-binary-path": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
- "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
- "dependencies": {
- "binary-extensions": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-buffer": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
- "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
- },
- "node_modules/is-data-descriptor": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
- "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
- "dependencies": {
- "kind-of": "^3.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-data-descriptor/node_modules/kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dependencies": {
- "is-buffer": "^1.1.5"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-descriptor": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
- "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
- "dependencies": {
- "is-accessor-descriptor": "^0.1.6",
- "is-data-descriptor": "^0.1.4",
- "kind-of": "^5.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-descriptor/node_modules/kind-of": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
- "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-extendable": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
- "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-glob": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
- "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
- "dependencies": {
- "is-extglob": "^2.1.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-negated-glob": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz",
- "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-number": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
- "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
- "dependencies": {
- "kind-of": "^3.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-number/node_modules/kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dependencies": {
- "is-buffer": "^1.1.5"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-plain-obj": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
- "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-plain-object": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
- "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
- "dependencies": {
- "isobject": "^3.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-relative": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz",
- "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==",
- "dependencies": {
- "is-unc-path": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-unc-path": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz",
- "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==",
- "dependencies": {
- "unc-path-regex": "^0.1.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-unicode-supported": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
- "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/is-utf8": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
- "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI="
- },
- "node_modules/is-valid-glob": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz",
- "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-windows": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
- "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/isarray": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
- "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
- },
- "node_modules/isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
- },
- "node_modules/isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/jquery": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz",
- "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw=="
- },
- "node_modules/js-yaml": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
- "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
- "dependencies": {
- "argparse": "^2.0.1"
- },
- "bin": {
- "js-yaml": "bin/js-yaml.js"
- }
- },
- "node_modules/json-stable-stringify-without-jsonify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
- "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE="
- },
- "node_modules/just-debounce": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz",
- "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo="
- },
- "node_modules/kind-of": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
- "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/last-run": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz",
- "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=",
- "dependencies": {
- "default-resolution": "^2.0.0",
- "es6-weak-map": "^2.0.1"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/lazystream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz",
- "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=",
- "dependencies": {
- "readable-stream": "^2.0.5"
- },
- "engines": {
- "node": ">= 0.6.3"
- }
- },
- "node_modules/lazystream/node_modules/isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
- },
- "node_modules/lazystream/node_modules/readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "node_modules/lazystream/node_modules/string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "dependencies": {
- "safe-buffer": "~5.1.0"
- }
- },
- "node_modules/lcid": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
- "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
- "dependencies": {
- "invert-kv": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/lead": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz",
- "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=",
- "dependencies": {
- "flush-write-stream": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/liftoff": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz",
- "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==",
- "dependencies": {
- "extend": "^3.0.0",
- "findup-sync": "^3.0.0",
- "fined": "^1.0.1",
- "flagged-respawn": "^1.0.0",
- "is-plain-object": "^2.0.4",
- "object.map": "^1.0.0",
- "rechoir": "^0.6.2",
- "resolve": "^1.1.7"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/load-json-file": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
- "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
- "dependencies": {
- "graceful-fs": "^4.1.2",
- "parse-json": "^2.2.0",
- "pify": "^2.0.0",
- "pinkie-promise": "^2.0.0",
- "strip-bom": "^2.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/load-json-file/node_modules/strip-bom": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
- "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
- "dependencies": {
- "is-utf8": "^0.2.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/locate-path": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
- "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
- "dependencies": {
- "p-locate": "^5.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/lodash": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
- "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
- },
- "node_modules/lodash._basecopy": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz",
- "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY="
- },
- "node_modules/lodash._basetostring": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz",
- "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U="
- },
- "node_modules/lodash._basevalues": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz",
- "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc="
- },
- "node_modules/lodash._getnative": {
- "version": "3.9.1",
- "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz",
- "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U="
- },
- "node_modules/lodash._isiterateecall": {
- "version": "3.0.9",
- "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz",
- "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw="
- },
- "node_modules/lodash._reescape": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz",
- "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo="
- },
- "node_modules/lodash._reevaluate": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz",
- "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0="
- },
- "node_modules/lodash._reinterpolate": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz",
- "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0="
- },
- "node_modules/lodash._root": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz",
- "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI="
- },
- "node_modules/lodash.escape": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz",
- "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=",
- "dependencies": {
- "lodash._root": "^3.0.0"
- }
- },
- "node_modules/lodash.isarguments": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz",
- "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo="
- },
- "node_modules/lodash.isarray": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz",
- "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U="
- },
- "node_modules/lodash.keys": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz",
- "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=",
- "dependencies": {
- "lodash._getnative": "^3.0.0",
- "lodash.isarguments": "^3.0.0",
- "lodash.isarray": "^3.0.0"
- }
- },
- "node_modules/lodash.restparam": {
- "version": "3.6.1",
- "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz",
- "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU="
- },
- "node_modules/lodash.template": {
- "version": "3.6.2",
- "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz",
- "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=",
- "dependencies": {
- "lodash._basecopy": "^3.0.0",
- "lodash._basetostring": "^3.0.0",
- "lodash._basevalues": "^3.0.0",
- "lodash._isiterateecall": "^3.0.0",
- "lodash._reinterpolate": "^3.0.0",
- "lodash.escape": "^3.0.0",
- "lodash.keys": "^3.0.0",
- "lodash.restparam": "^3.0.0",
- "lodash.templatesettings": "^3.0.0"
- }
- },
- "node_modules/lodash.templatesettings": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz",
- "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=",
- "dependencies": {
- "lodash._reinterpolate": "^3.0.0",
- "lodash.escape": "^3.0.0"
- }
- },
- "node_modules/log-symbols": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
- "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
- "dependencies": {
- "chalk": "^4.1.0",
- "is-unicode-supported": "^0.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/log-symbols/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/log-symbols/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/log-symbols/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/make-iterator": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz",
- "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==",
- "dependencies": {
- "kind-of": "^6.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/map-cache": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
- "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/map-visit": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
- "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
- "dependencies": {
- "object-visit": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/matchdep": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz",
- "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=",
- "dependencies": {
- "findup-sync": "^2.0.0",
- "micromatch": "^3.0.4",
- "resolve": "^1.4.0",
- "stack-trace": "0.0.10"
- },
- "engines": {
- "node": ">= 0.10.0"
- }
- },
- "node_modules/matchdep/node_modules/findup-sync": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz",
- "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=",
- "dependencies": {
- "detect-file": "^1.0.0",
- "is-glob": "^3.1.0",
- "micromatch": "^3.0.4",
- "resolve-dir": "^1.0.1"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/matchdep/node_modules/is-glob": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
- "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
- "dependencies": {
- "is-extglob": "^2.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/micromatch": {
- "version": "3.1.10",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
- "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
- "dependencies": {
- "arr-diff": "^4.0.0",
- "array-unique": "^0.3.2",
- "braces": "^2.3.1",
- "define-property": "^2.0.2",
- "extend-shallow": "^3.0.2",
- "extglob": "^2.0.4",
- "fragment-cache": "^0.2.1",
- "kind-of": "^6.0.2",
- "nanomatch": "^1.2.9",
- "object.pick": "^1.3.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/minimatch": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
- "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/minimist": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
- "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
- },
- "node_modules/mixin-deep": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
- "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
- "dependencies": {
- "for-in": "^1.0.2",
- "is-extendable": "^1.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/mixin-deep/node_modules/is-extendable": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
- "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
- "dependencies": {
- "is-plain-object": "^2.0.4"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/mocha": {
- "version": "9.1.3",
- "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.1.3.tgz",
- "integrity": "sha512-Xcpl9FqXOAYqI3j79pEtHBBnQgVXIhpULjGQa7DVb0Po+VzmSIK9kanAiWLHoRR/dbZ2qpdPshuXr8l1VaHCzw==",
- "dependencies": {
- "@ungap/promise-all-settled": "1.1.2",
- "ansi-colors": "4.1.1",
- "browser-stdout": "1.3.1",
- "chokidar": "3.5.2",
- "debug": "4.3.2",
- "diff": "5.0.0",
- "escape-string-regexp": "4.0.0",
- "find-up": "5.0.0",
- "glob": "7.1.7",
- "growl": "1.10.5",
- "he": "1.2.0",
- "js-yaml": "4.1.0",
- "log-symbols": "4.1.0",
- "minimatch": "3.0.4",
- "ms": "2.1.3",
- "nanoid": "3.1.25",
- "serialize-javascript": "6.0.0",
- "strip-json-comments": "3.1.1",
- "supports-color": "8.1.1",
- "which": "2.0.2",
- "workerpool": "6.1.5",
- "yargs": "16.2.0",
- "yargs-parser": "20.2.4",
- "yargs-unparser": "2.0.0"
- },
- "bin": {
- "_mocha": "bin/_mocha",
- "mocha": "bin/mocha"
- },
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/mochajs"
- }
- },
- "node_modules/mocha/node_modules/debug": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
- "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
- "dependencies": {
- "ms": "2.1.2"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/mocha/node_modules/debug/node_modules/ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
- },
- "node_modules/mocha/node_modules/escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/mocha/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
- },
- "node_modules/mocha/node_modules/supports-color": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
- "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/supports-color?sponsor=1"
- }
- },
- "node_modules/mocha/node_modules/which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "node-which": "bin/node-which"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- },
- "node_modules/multipipe": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz",
- "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=",
- "dependencies": {
- "duplexer2": "0.0.2"
- }
- },
- "node_modules/mute-stdout": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz",
- "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==",
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/nan": {
- "version": "2.14.0",
- "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz",
- "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==",
- "optional": true
- },
- "node_modules/nanoid": {
- "version": "3.1.25",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz",
- "integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==",
- "bin": {
- "nanoid": "bin/nanoid.cjs"
- },
- "engines": {
- "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
- }
- },
- "node_modules/nanomatch": {
- "version": "1.2.13",
- "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
- "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
- "dependencies": {
- "arr-diff": "^4.0.0",
- "array-unique": "^0.3.2",
- "define-property": "^2.0.2",
- "extend-shallow": "^3.0.2",
- "fragment-cache": "^0.2.1",
- "is-windows": "^1.0.2",
- "kind-of": "^6.0.2",
- "object.pick": "^1.3.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/next-tick": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz",
- "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw="
- },
- "node_modules/normalize-package-data": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
- "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
- "dependencies": {
- "hosted-git-info": "^2.1.4",
- "resolve": "^1.10.0",
- "semver": "2 || 3 || 4 || 5",
- "validate-npm-package-license": "^3.0.1"
- }
- },
- "node_modules/normalize-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/now-and-later": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz",
- "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==",
- "dependencies": {
- "once": "^1.3.2"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/number-is-nan": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
- "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/object-assign": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz",
- "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/object-copy": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
- "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
- "dependencies": {
- "copy-descriptor": "^0.1.0",
- "define-property": "^0.2.5",
- "kind-of": "^3.0.3"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/object-copy/node_modules/define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "dependencies": {
- "is-descriptor": "^0.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/object-copy/node_modules/kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dependencies": {
- "is-buffer": "^1.1.5"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/object-keys": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
- "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/object-visit": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
- "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
- "dependencies": {
- "isobject": "^3.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/object.assign": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
- "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
- "dependencies": {
- "define-properties": "^1.1.2",
- "function-bind": "^1.1.1",
- "has-symbols": "^1.0.0",
- "object-keys": "^1.0.11"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/object.defaults": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz",
- "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=",
- "dependencies": {
- "array-each": "^1.0.1",
- "array-slice": "^1.0.0",
- "for-own": "^1.0.0",
- "isobject": "^3.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/object.map": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz",
- "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=",
- "dependencies": {
- "for-own": "^1.0.0",
- "make-iterator": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/object.pick": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
- "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
- "dependencies": {
- "isobject": "^3.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/object.reduce": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz",
- "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=",
- "dependencies": {
- "for-own": "^1.0.0",
- "make-iterator": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/once": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz",
- "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=",
- "dependencies": {
- "wrappy": "1"
- }
- },
- "node_modules/ordered-read-streams": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz",
- "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=",
- "dependencies": {
- "readable-stream": "^2.0.1"
- }
- },
- "node_modules/ordered-read-streams/node_modules/isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
- },
- "node_modules/ordered-read-streams/node_modules/readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "node_modules/ordered-read-streams/node_modules/string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "dependencies": {
- "safe-buffer": "~5.1.0"
- }
- },
- "node_modules/os-locale": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
- "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
- "dependencies": {
- "lcid": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/p-limit": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
- "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
- "dependencies": {
- "yocto-queue": "^0.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/p-locate": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
- "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
- "dependencies": {
- "p-limit": "^3.0.2"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/parse-filepath": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz",
- "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=",
- "dependencies": {
- "is-absolute": "^1.0.0",
- "map-cache": "^0.2.0",
- "path-root": "^0.1.1"
- },
- "engines": {
- "node": ">=0.8"
- }
- },
- "node_modules/parse-json": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
- "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
- "dependencies": {
- "error-ex": "^1.2.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/parse-node-version": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz",
- "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==",
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/parse-passwd": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
- "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/pascalcase": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
- "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/path-dirname": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
- "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA="
- },
- "node_modules/path-exists": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
- "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/path-parse": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
- "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
- },
- "node_modules/path-root": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz",
- "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=",
- "dependencies": {
- "path-root-regex": "^0.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/path-root-regex": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz",
- "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/path-type": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
- "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
- "dependencies": {
- "graceful-fs": "^4.1.2",
- "pify": "^2.0.0",
- "pinkie-promise": "^2.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/picomatch": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
- "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/pinkie": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
- "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/pinkie-promise": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
- "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
- "dependencies": {
- "pinkie": "^2.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/plugin-error": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz",
- "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==",
- "dependencies": {
- "ansi-colors": "^1.0.1",
- "arr-diff": "^4.0.0",
- "arr-union": "^3.1.0",
- "extend-shallow": "^3.0.2"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/plugin-error/node_modules/ansi-colors": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz",
- "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==",
- "dependencies": {
- "ansi-wrap": "^0.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/popper.js": {
- "version": "1.16.1",
- "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz",
- "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==",
- "deprecated": "You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1",
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/popperjs"
- }
- },
- "node_modules/posix-character-classes": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
- "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/pretty-hrtime": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz",
- "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/process-nextick-args": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
- "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
- },
- "node_modules/pump": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
- "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
- "dependencies": {
- "end-of-stream": "^1.1.0",
- "once": "^1.3.1"
- }
- },
- "node_modules/pumpify": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz",
- "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==",
- "dependencies": {
- "duplexify": "^3.6.0",
- "inherits": "^2.0.3",
- "pump": "^2.0.0"
- }
- },
- "node_modules/randombytes": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
- "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
- "dependencies": {
- "safe-buffer": "^5.1.0"
- }
- },
- "node_modules/read-pkg": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
- "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
- "dependencies": {
- "load-json-file": "^1.0.0",
- "normalize-package-data": "^2.3.2",
- "path-type": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/read-pkg-up": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
- "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
- "dependencies": {
- "find-up": "^1.0.0",
- "read-pkg": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/read-pkg-up/node_modules/find-up": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
- "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
- "dependencies": {
- "path-exists": "^2.0.0",
- "pinkie-promise": "^2.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/read-pkg-up/node_modules/path-exists": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
- "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
- "dependencies": {
- "pinkie-promise": "^2.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/readable-stream": {
- "version": "1.1.14",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
- "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
- "dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.1",
- "isarray": "0.0.1",
- "string_decoder": "~0.10.x"
- }
- },
- "node_modules/readdirp": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
- "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
- "dependencies": {
- "picomatch": "^2.2.1"
- },
- "engines": {
- "node": ">=8.10.0"
- }
- },
- "node_modules/rechoir": {
- "version": "0.6.2",
- "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
- "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
- "dependencies": {
- "resolve": "^1.1.6"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/regex-not": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
- "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
- "dependencies": {
- "extend-shallow": "^3.0.2",
- "safe-regex": "^1.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/remove-bom-buffer": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz",
- "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==",
- "dependencies": {
- "is-buffer": "^1.1.5",
- "is-utf8": "^0.2.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/remove-bom-stream": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz",
- "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=",
- "dependencies": {
- "remove-bom-buffer": "^3.0.0",
- "safe-buffer": "^5.1.0",
- "through2": "^2.0.3"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/remove-trailing-separator": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
- "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8="
- },
- "node_modules/repeat-element": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
- "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/repeat-string": {
- "version": "1.6.1",
- "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
- "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
- "engines": {
- "node": ">=0.10"
- }
- },
- "node_modules/replace-ext": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz",
- "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=",
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/replace-homedir": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz",
- "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=",
- "dependencies": {
- "homedir-polyfill": "^1.0.1",
- "is-absolute": "^1.0.0",
- "remove-trailing-separator": "^1.1.0"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/require-directory": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
- "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/resolve": {
- "version": "1.15.1",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz",
- "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==",
- "dependencies": {
- "path-parse": "^1.0.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/resolve-dir": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz",
- "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=",
- "dependencies": {
- "expand-tilde": "^2.0.0",
- "global-modules": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/resolve-options": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz",
- "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=",
- "dependencies": {
- "value-or-function": "^3.0.0"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/resolve-url": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
- "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
- "deprecated": "https://github.com/lydell/resolve-url#deprecated"
- },
- "node_modules/ret": {
- "version": "0.1.15",
- "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
- "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
- "engines": {
- "node": ">=0.12"
- }
- },
- "node_modules/safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
- },
- "node_modules/safe-regex": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
- "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
- "dependencies": {
- "ret": "~0.1.10"
- }
- },
- "node_modules/sass": {
- "version": "1.45.0",
- "resolved": "https://registry.npmjs.org/sass/-/sass-1.45.0.tgz",
- "integrity": "sha512-ONy5bjppoohtNkFJRqdz1gscXamMzN3wQy1YH9qO2FiNpgjLhpz/IPRGg0PpCjyz/pWfCOaNEaiEGCcjOFAjqw==",
- "dependencies": {
- "chokidar": ">=3.0.0 <4.0.0",
- "immutable": "^4.0.0",
- "source-map-js": ">=0.6.2 <2.0.0"
- },
- "bin": {
- "sass": "sass.js"
- },
- "engines": {
- "node": ">=8.9.0"
- }
- },
- "node_modules/semver": {
- "version": "4.3.6",
- "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz",
- "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=",
- "bin": {
- "semver": "bin/semver"
- }
- },
- "node_modules/semver-greatest-satisfied-range": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz",
- "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=",
- "dependencies": {
- "sver-compat": "^1.5.0"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/serialize-javascript": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
- "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
- "dependencies": {
- "randombytes": "^2.1.0"
- }
- },
- "node_modules/set-blocking": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
- "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
- },
- "node_modules/set-value": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
- "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
- "dependencies": {
- "extend-shallow": "^2.0.1",
- "is-extendable": "^0.1.1",
- "is-plain-object": "^2.0.3",
- "split-string": "^3.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/set-value/node_modules/extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dependencies": {
- "is-extendable": "^0.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/snapdragon": {
- "version": "0.8.2",
- "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
- "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
- "dependencies": {
- "base": "^0.11.1",
- "debug": "^2.2.0",
- "define-property": "^0.2.5",
- "extend-shallow": "^2.0.1",
- "map-cache": "^0.2.2",
- "source-map": "^0.5.6",
- "source-map-resolve": "^0.5.0",
- "use": "^3.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/snapdragon-node": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
- "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
- "dependencies": {
- "define-property": "^1.0.0",
- "isobject": "^3.0.0",
- "snapdragon-util": "^3.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/snapdragon-node/node_modules/define-property": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
- "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
- "dependencies": {
- "is-descriptor": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/snapdragon-node/node_modules/is-accessor-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
- "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
- "dependencies": {
- "kind-of": "^6.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/snapdragon-node/node_modules/is-data-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
- "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
- "dependencies": {
- "kind-of": "^6.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/snapdragon-node/node_modules/is-descriptor": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
- "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
- "dependencies": {
- "is-accessor-descriptor": "^1.0.0",
- "is-data-descriptor": "^1.0.0",
- "kind-of": "^6.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/snapdragon-util": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
- "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
- "dependencies": {
- "kind-of": "^3.2.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/snapdragon-util/node_modules/kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dependencies": {
- "is-buffer": "^1.1.5"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/snapdragon/node_modules/define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "dependencies": {
- "is-descriptor": "^0.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/snapdragon/node_modules/extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dependencies": {
- "is-extendable": "^0.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/source-map": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
- "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/source-map-js": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.1.tgz",
- "integrity": "sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/source-map-resolve": {
- "version": "0.5.3",
- "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
- "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
- "dependencies": {
- "atob": "^2.1.2",
- "decode-uri-component": "^0.2.0",
- "resolve-url": "^0.2.1",
- "source-map-url": "^0.4.0",
- "urix": "^0.1.0"
- }
- },
- "node_modules/source-map-url": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
- "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM="
- },
- "node_modules/sparkles": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz",
- "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==",
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/spdx-correct": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz",
- "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==",
- "dependencies": {
- "spdx-expression-parse": "^3.0.0",
- "spdx-license-ids": "^3.0.0"
- }
- },
- "node_modules/spdx-exceptions": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz",
- "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA=="
- },
- "node_modules/spdx-expression-parse": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
- "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
- "dependencies": {
- "spdx-exceptions": "^2.1.0",
- "spdx-license-ids": "^3.0.0"
- }
- },
- "node_modules/spdx-license-ids": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz",
- "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q=="
- },
- "node_modules/split-string": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
- "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
- "dependencies": {
- "extend-shallow": "^3.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/stack-trace": {
- "version": "0.0.10",
- "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
- "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
- "engines": {
- "node": "*"
- }
- },
- "node_modules/static-extend": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
- "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
- "dependencies": {
- "define-property": "^0.2.5",
- "object-copy": "^0.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/static-extend/node_modules/define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "dependencies": {
- "is-descriptor": "^0.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/stream-exhaust": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz",
- "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw=="
- },
- "node_modules/stream-shift": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz",
- "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ=="
- },
- "node_modules/string_decoder": {
- "version": "0.10.31",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
- "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
- },
- "node_modules/string-width": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "dependencies": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/string-width/node_modules/ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/string-width/node_modules/strip-ansi": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "dependencies": {
- "ansi-regex": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
- "dependencies": {
- "ansi-regex": "^2.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/strip-json-comments": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
- "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/supports-color": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
- "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/sver-compat": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz",
- "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=",
- "dependencies": {
- "es6-iterator": "^2.0.1",
- "es6-symbol": "^3.1.1"
- }
- },
- "node_modules/through2": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
- "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
- "dependencies": {
- "readable-stream": "~2.3.6",
- "xtend": "~4.0.1"
- }
- },
- "node_modules/through2-filter": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz",
- "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==",
- "dependencies": {
- "through2": "~2.0.0",
- "xtend": "~4.0.0"
- }
- },
- "node_modules/through2/node_modules/isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
- },
- "node_modules/through2/node_modules/readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "node_modules/through2/node_modules/string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "dependencies": {
- "safe-buffer": "~5.1.0"
- }
- },
- "node_modules/time-stamp": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz",
- "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/to-absolute-glob": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz",
- "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=",
- "dependencies": {
- "is-absolute": "^1.0.0",
- "is-negated-glob": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/to-object-path": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
- "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
- "dependencies": {
- "kind-of": "^3.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/to-object-path/node_modules/kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dependencies": {
- "is-buffer": "^1.1.5"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/to-regex": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
- "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
- "dependencies": {
- "define-property": "^2.0.2",
- "extend-shallow": "^3.0.2",
- "regex-not": "^1.0.2",
- "safe-regex": "^1.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/to-regex-range": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
- "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
- "dependencies": {
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/to-through": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz",
- "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=",
- "dependencies": {
- "through2": "^2.0.3"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/transfob": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/transfob/-/transfob-1.0.0.tgz",
- "integrity": "sha1-x/wnpbVDCtSGJnrmZtkj90oKsyA="
- },
- "node_modules/type": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz",
- "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg=="
- },
- "node_modules/typedarray": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
- "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
- },
- "node_modules/unc-path-regex": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz",
- "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/undertaker": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.2.1.tgz",
- "integrity": "sha512-71WxIzDkgYk9ZS+spIB8iZXchFhAdEo2YU8xYqBYJ39DIUIqziK78ftm26eecoIY49X0J2MLhG4hr18Yp6/CMA==",
- "dependencies": {
- "arr-flatten": "^1.0.1",
- "arr-map": "^2.0.0",
- "bach": "^1.0.0",
- "collection-map": "^1.0.0",
- "es6-weak-map": "^2.0.1",
- "last-run": "^1.1.0",
- "object.defaults": "^1.0.0",
- "object.reduce": "^1.0.0",
- "undertaker-registry": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/undertaker-registry": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz",
- "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=",
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/union-value": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
- "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
- "dependencies": {
- "arr-union": "^3.1.0",
- "get-value": "^2.0.6",
- "is-extendable": "^0.1.1",
- "set-value": "^2.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/unique-stream": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz",
- "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==",
- "dependencies": {
- "json-stable-stringify-without-jsonify": "^1.0.1",
- "through2-filter": "^3.0.0"
- }
- },
- "node_modules/unset-value": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
- "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
- "dependencies": {
- "has-value": "^0.3.1",
- "isobject": "^3.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/unset-value/node_modules/has-value": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
- "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
- "dependencies": {
- "get-value": "^2.0.3",
- "has-values": "^0.1.4",
- "isobject": "^2.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/unset-value/node_modules/has-value/node_modules/isobject": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
- "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
- "dependencies": {
- "isarray": "1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/unset-value/node_modules/has-values": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
- "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/unset-value/node_modules/isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
- },
- "node_modules/upath": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz",
- "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==",
- "engines": {
- "node": ">=4",
- "yarn": "*"
- }
- },
- "node_modules/urix": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
- "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
- "deprecated": "Please see https://github.com/lydell/urix#deprecated"
- },
- "node_modules/use": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
- "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
- },
- "node_modules/v8flags": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.3.tgz",
- "integrity": "sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==",
- "dependencies": {
- "homedir-polyfill": "^1.0.1"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/validate-npm-package-license": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
- "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
- "dependencies": {
- "spdx-correct": "^3.0.0",
- "spdx-expression-parse": "^3.0.0"
- }
- },
- "node_modules/value-or-function": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz",
- "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=",
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/vinyl": {
- "version": "0.5.3",
- "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz",
- "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=",
- "dependencies": {
- "clone": "^1.0.0",
- "clone-stats": "^0.0.1",
- "replace-ext": "0.0.1"
- },
- "engines": {
- "node": ">= 0.9"
- }
- },
- "node_modules/vinyl-fs": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz",
- "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==",
- "dependencies": {
- "fs-mkdirp-stream": "^1.0.0",
- "glob-stream": "^6.1.0",
- "graceful-fs": "^4.0.0",
- "is-valid-glob": "^1.0.0",
- "lazystream": "^1.0.0",
- "lead": "^1.0.0",
- "object.assign": "^4.0.4",
- "pumpify": "^1.3.5",
- "readable-stream": "^2.3.3",
- "remove-bom-buffer": "^3.0.0",
- "remove-bom-stream": "^1.2.0",
- "resolve-options": "^1.1.0",
- "through2": "^2.0.0",
- "to-through": "^2.0.0",
- "value-or-function": "^3.0.0",
- "vinyl": "^2.0.0",
- "vinyl-sourcemap": "^1.1.0"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/vinyl-fs/node_modules/clone": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
- "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
- "engines": {
- "node": ">=0.8"
- }
- },
- "node_modules/vinyl-fs/node_modules/clone-stats": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz",
- "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA="
- },
- "node_modules/vinyl-fs/node_modules/isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
- },
- "node_modules/vinyl-fs/node_modules/readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "node_modules/vinyl-fs/node_modules/replace-ext": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz",
- "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=",
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/vinyl-fs/node_modules/string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "dependencies": {
- "safe-buffer": "~5.1.0"
- }
- },
- "node_modules/vinyl-fs/node_modules/vinyl": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz",
- "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==",
- "dependencies": {
- "clone": "^2.1.1",
- "clone-buffer": "^1.0.0",
- "clone-stats": "^1.0.0",
- "cloneable-readable": "^1.0.0",
- "remove-trailing-separator": "^1.0.1",
- "replace-ext": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/vinyl-sourcemap": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz",
- "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=",
- "dependencies": {
- "append-buffer": "^1.0.2",
- "convert-source-map": "^1.5.0",
- "graceful-fs": "^4.1.6",
- "normalize-path": "^2.1.1",
- "now-and-later": "^2.0.0",
- "remove-bom-buffer": "^3.0.0",
- "vinyl": "^2.0.0"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/vinyl-sourcemap/node_modules/clone": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
- "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
- "engines": {
- "node": ">=0.8"
- }
- },
- "node_modules/vinyl-sourcemap/node_modules/clone-stats": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz",
- "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA="
- },
- "node_modules/vinyl-sourcemap/node_modules/normalize-path": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
- "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
- "dependencies": {
- "remove-trailing-separator": "^1.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/vinyl-sourcemap/node_modules/replace-ext": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz",
- "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=",
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/vinyl-sourcemap/node_modules/vinyl": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz",
- "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==",
- "dependencies": {
- "clone": "^2.1.1",
- "clone-buffer": "^1.0.0",
- "clone-stats": "^1.0.0",
- "cloneable-readable": "^1.0.0",
- "remove-trailing-separator": "^1.0.1",
- "replace-ext": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/vinyl-sourcemaps-apply": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz",
- "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=",
- "dependencies": {
- "source-map": "^0.5.1"
- }
- },
- "node_modules/which": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
- "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "which": "bin/which"
- }
- },
- "node_modules/workerpool": {
- "version": "6.1.5",
- "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.5.tgz",
- "integrity": "sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw=="
- },
- "node_modules/wrap-ansi": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
- "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
- "dependencies": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
- }
- },
- "node_modules/wrap-ansi/node_modules/ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/wrap-ansi/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/wrap-ansi/node_modules/strip-ansi": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "dependencies": {
- "ansi-regex": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
- },
- "node_modules/xtend": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
- "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
- "engines": {
- "node": ">=0.4"
- }
- },
- "node_modules/y18n": {
- "version": "5.0.8",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
- "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/yargs": {
- "version": "16.2.0",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
- "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
- "dependencies": {
- "cliui": "^7.0.2",
- "escalade": "^3.1.1",
- "get-caller-file": "^2.0.5",
- "require-directory": "^2.1.1",
- "string-width": "^4.2.0",
- "y18n": "^5.0.5",
- "yargs-parser": "^20.2.2"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/yargs-parser": {
- "version": "20.2.4",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz",
- "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==",
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/yargs-unparser": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz",
- "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==",
- "dependencies": {
- "camelcase": "^6.0.0",
- "decamelize": "^4.0.0",
- "flat": "^5.0.2",
- "is-plain-obj": "^2.1.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/yargs-unparser/node_modules/decamelize": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz",
- "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/yocto-queue": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
- "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- }
- },
"dependencies": {
"@ungap/promise-all-settled": {
"version": "1.1.2",
@@ -5837,11 +283,19 @@
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
"integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA=="
},
+ "bindings": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
+ "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
+ "optional": true,
+ "requires": {
+ "file-uri-to-path": "1.0.0"
+ }
+ },
"bootstrap": {
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.4.1.tgz",
- "integrity": "sha512-tbx5cHubwE6e2ZG7nqM3g/FZ5PQEDMWmMGNrCUBVRPHXTJaH7CBDdsLeu3eCh3B1tzAxTnAbtmrzvWEvT2NNEA==",
- "requires": {}
+ "integrity": "sha512-tbx5cHubwE6e2ZG7nqM3g/FZ5PQEDMWmMGNrCUBVRPHXTJaH7CBDdsLeu3eCh3B1tzAxTnAbtmrzvWEvT2NNEA=="
},
"brace-expansion": {
"version": "1.1.11",
@@ -6601,6 +1055,12 @@
"time-stamp": "^1.0.0"
}
},
+ "file-uri-to-path": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
+ "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
+ "optional": true
+ },
"fill-range": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
@@ -6868,6 +1328,16 @@
"requires": {
"micromatch": "^3.1.4",
"normalize-path": "^2.1.1"
+ },
+ "dependencies": {
+ "normalize-path": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
+ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+ "requires": {
+ "remove-trailing-separator": "^1.0.1"
+ }
+ }
}
},
"binary-extensions": {
@@ -6914,25 +1384,21 @@
"dependencies": {
"abbrev": {
"version": "1.1.1",
- "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
"bundled": true,
"optional": true
},
"ansi-regex": {
"version": "2.1.1",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
"bundled": true,
"optional": true
},
"aproba": {
"version": "1.2.0",
- "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
"bundled": true,
"optional": true
},
"are-we-there-yet": {
"version": "1.1.5",
- "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
"bundled": true,
"optional": true,
"requires": {
@@ -6942,13 +1408,11 @@
},
"balanced-match": {
"version": "1.0.0",
- "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
"bundled": true,
"optional": true
},
"brace-expansion": {
"version": "1.1.11",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"bundled": true,
"optional": true,
"requires": {
@@ -6958,37 +1422,31 @@
},
"chownr": {
"version": "1.1.3",
- "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==",
"bundled": true,
"optional": true
},
"code-point-at": {
"version": "1.1.0",
- "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
"bundled": true,
"optional": true
},
"concat-map": {
"version": "0.0.1",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
"bundled": true,
"optional": true
},
"console-control-strings": {
"version": "1.1.0",
- "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
"bundled": true,
"optional": true
},
"core-util-is": {
"version": "1.0.2",
- "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
"bundled": true,
"optional": true
},
"debug": {
"version": "3.2.6",
- "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
"bundled": true,
"optional": true,
"requires": {
@@ -6997,25 +1455,21 @@
},
"deep-extend": {
"version": "0.6.0",
- "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
"bundled": true,
"optional": true
},
"delegates": {
"version": "1.0.0",
- "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
"bundled": true,
"optional": true
},
"detect-libc": {
"version": "1.0.3",
- "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=",
"bundled": true,
"optional": true
},
"fs-minipass": {
"version": "1.2.7",
- "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==",
"bundled": true,
"optional": true,
"requires": {
@@ -7024,13 +1478,11 @@
},
"fs.realpath": {
"version": "1.0.0",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
"bundled": true,
"optional": true
},
"gauge": {
"version": "2.7.4",
- "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
"bundled": true,
"optional": true,
"requires": {
@@ -7046,7 +1498,6 @@
},
"glob": {
"version": "7.1.6",
- "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
"bundled": true,
"optional": true,
"requires": {
@@ -7060,13 +1511,11 @@
},
"has-unicode": {
"version": "2.0.1",
- "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
"bundled": true,
"optional": true
},
"iconv-lite": {
"version": "0.4.24",
- "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
"bundled": true,
"optional": true,
"requires": {
@@ -7075,7 +1524,6 @@
},
"ignore-walk": {
"version": "3.0.3",
- "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==",
"bundled": true,
"optional": true,
"requires": {
@@ -7084,7 +1532,6 @@
},
"inflight": {
"version": "1.0.6",
- "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
"bundled": true,
"optional": true,
"requires": {
@@ -7094,19 +1541,16 @@
},
"inherits": {
"version": "2.0.4",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"bundled": true,
"optional": true
},
"ini": {
"version": "1.3.5",
- "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
"bundled": true,
"optional": true
},
"is-fullwidth-code-point": {
"version": "1.0.0",
- "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
"bundled": true,
"optional": true,
"requires": {
@@ -7115,13 +1559,11 @@
},
"isarray": {
"version": "1.0.0",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
"bundled": true,
"optional": true
},
"minimatch": {
"version": "3.0.4",
- "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
"bundled": true,
"optional": true,
"requires": {
@@ -7130,13 +1572,11 @@
},
"minimist": {
"version": "0.0.8",
- "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
"bundled": true,
"optional": true
},
"minipass": {
"version": "2.9.0",
- "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==",
"bundled": true,
"optional": true,
"requires": {
@@ -7146,7 +1586,6 @@
},
"minizlib": {
"version": "1.3.3",
- "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==",
"bundled": true,
"optional": true,
"requires": {
@@ -7155,7 +1594,6 @@
},
"mkdirp": {
"version": "0.5.1",
- "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
"bundled": true,
"optional": true,
"requires": {
@@ -7164,13 +1602,11 @@
},
"ms": {
"version": "2.1.2",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"bundled": true,
"optional": true
},
"needle": {
"version": "2.4.0",
- "integrity": "sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==",
"bundled": true,
"optional": true,
"requires": {
@@ -7181,7 +1617,6 @@
},
"node-pre-gyp": {
"version": "0.14.0",
- "integrity": "sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==",
"bundled": true,
"optional": true,
"requires": {
@@ -7199,7 +1634,6 @@
},
"nopt": {
"version": "4.0.1",
- "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=",
"bundled": true,
"optional": true,
"requires": {
@@ -7209,7 +1643,6 @@
},
"npm-bundled": {
"version": "1.1.1",
- "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==",
"bundled": true,
"optional": true,
"requires": {
@@ -7218,13 +1651,11 @@
},
"npm-normalize-package-bin": {
"version": "1.0.1",
- "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==",
"bundled": true,
"optional": true
},
"npm-packlist": {
"version": "1.4.7",
- "integrity": "sha512-vAj7dIkp5NhieaGZxBJB8fF4R0078rqsmhJcAfXZ6O7JJhjhPK96n5Ry1oZcfLXgfun0GWTZPOxaEyqv8GBykQ==",
"bundled": true,
"optional": true,
"requires": {
@@ -7234,7 +1665,6 @@
},
"npmlog": {
"version": "4.1.2",
- "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
"bundled": true,
"optional": true,
"requires": {
@@ -7246,19 +1676,16 @@
},
"number-is-nan": {
"version": "1.0.1",
- "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
"bundled": true,
"optional": true
},
"object-assign": {
"version": "4.1.1",
- "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
"bundled": true,
"optional": true
},
"once": {
"version": "1.4.0",
- "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
"bundled": true,
"optional": true,
"requires": {
@@ -7267,19 +1694,16 @@
},
"os-homedir": {
"version": "1.0.2",
- "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
"bundled": true,
"optional": true
},
"os-tmpdir": {
"version": "1.0.2",
- "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
"bundled": true,
"optional": true
},
"osenv": {
"version": "0.1.5",
- "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
"bundled": true,
"optional": true,
"requires": {
@@ -7289,19 +1713,16 @@
},
"path-is-absolute": {
"version": "1.0.1",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
"bundled": true,
"optional": true
},
"process-nextick-args": {
"version": "2.0.1",
- "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
"bundled": true,
"optional": true
},
"rc": {
"version": "1.2.8",
- "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
"bundled": true,
"optional": true,
"requires": {
@@ -7313,7 +1734,6 @@
"dependencies": {
"minimist": {
"version": "1.2.0",
- "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
"bundled": true,
"optional": true
}
@@ -7321,7 +1741,6 @@
},
"readable-stream": {
"version": "2.3.6",
- "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
"bundled": true,
"optional": true,
"requires": {
@@ -7336,7 +1755,6 @@
},
"rimraf": {
"version": "2.7.1",
- "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
"bundled": true,
"optional": true,
"requires": {
@@ -7345,52 +1763,36 @@
},
"safe-buffer": {
"version": "5.1.2",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
"bundled": true,
"optional": true
},
"safer-buffer": {
"version": "2.1.2",
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
"bundled": true,
"optional": true
},
"sax": {
"version": "1.2.4",
- "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
"bundled": true,
"optional": true
},
"semver": {
"version": "5.7.1",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
"bundled": true,
"optional": true
},
"set-blocking": {
"version": "2.0.0",
- "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
"bundled": true,
"optional": true
},
"signal-exit": {
"version": "3.0.2",
- "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
"bundled": true,
"optional": true
},
- "string_decoder": {
- "version": "1.1.1",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "bundled": true,
- "optional": true,
- "requires": {
- "safe-buffer": "~5.1.0"
- }
- },
"string-width": {
"version": "1.0.2",
- "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
"bundled": true,
"optional": true,
"requires": {
@@ -7399,9 +1801,16 @@
"strip-ansi": "^3.0.0"
}
},
+ "string_decoder": {
+ "version": "1.1.1",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
"strip-ansi": {
"version": "3.0.1",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
"bundled": true,
"optional": true,
"requires": {
@@ -7410,13 +1819,11 @@
},
"strip-json-comments": {
"version": "2.0.1",
- "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
"bundled": true,
"optional": true
},
"tar": {
"version": "4.4.13",
- "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==",
"bundled": true,
"optional": true,
"requires": {
@@ -7431,13 +1838,11 @@
},
"util-deprecate": {
"version": "1.0.2",
- "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
"bundled": true,
"optional": true
},
"wide-align": {
"version": "1.1.3",
- "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
"bundled": true,
"optional": true,
"requires": {
@@ -7446,13 +1851,11 @@
},
"wrappy": {
"version": "1.0.2",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
"bundled": true,
"optional": true
},
"yallist": {
"version": "3.1.1",
- "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
"bundled": true,
"optional": true
}
@@ -7491,12 +1894,9 @@
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
},
"normalize-path": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
- "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
- "requires": {
- "remove-trailing-separator": "^1.0.1"
- }
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
},
"readable-stream": {
"version": "2.3.7",
@@ -9449,11 +3849,6 @@
"resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz",
"integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ=="
},
- "string_decoder": {
- "version": "0.10.31",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
- "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
- },
"string-width": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
@@ -9479,6 +3874,11 @@
}
}
},
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
+ },
"strip-ansi": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
diff --git a/ikaaro/update.py b/ikaaro/update.py
index 6a931bd6c..f910eabc8 100644
--- a/ikaaro/update.py
+++ b/ikaaro/update.py
@@ -27,7 +27,7 @@
log = getLogger("ikaaro.update")
-ERROR_MSG = MSG(u'Inconsistent class_id "{class_id}", resource version is {resource_version} but cls_version is {cls_version} ({abspath})')
+ERROR_MSG = MSG('Inconsistent class_id "{class_id}", resource version is {resource_version} but cls_version is {cls_version} ({abspath})')
def class_version_to_date(version):
@@ -49,7 +49,7 @@ def find_versions_to_update(context, force=False):
RangeQuery('class_version', class_version_tomorrow, None))
search = database.search(query)
if search:
- resource = search.get_resources().next()
+ resource = next(search.get_resources())
kw = {'class_id': resource.class_id,
'class_title': resource.class_title,
'abspath': str(resource.abspath),
@@ -88,7 +88,7 @@ def find_versions_to_update(context, force=False):
continue
classes_and_versions.append(class_and_version)
update_title_name = 'update_{0}_title'.format(version)
- update_title = getattr(cls, update_title_name, MSG(u'Unknow'))
+ update_title = getattr(cls, update_title_name, MSG('Unknow'))
if isinstance(update_title, MSG):
update_title = update_title.gettext()
kw = {'class_id': cls.class_id,
@@ -100,7 +100,7 @@ def find_versions_to_update(context, force=False):
'nb_resources': len(search)}
cls_to_update.append(kw)
# Sort
- cls_to_update.sort(key=itemgetter('class_version_date'))
+ cls_to_update = sorted(cls_to_update, key=itemgetter('class_version_date'))
# Ok
return {'cls_to_update': cls_to_update, 'cls_errors': cls_errors}
@@ -124,7 +124,7 @@ def run_next_update_method(context, force=False):
RangeQuery('class_version', None, class_version_yesterday))
search = context.database.search(query)
# Commit message (Do not override the mtime/author)
- git_message = u'Upgrade {0} to version {1}'.format(
+ git_message = 'Upgrade {0} to version {1}'.format(
version['class_id'], version['class_version'])
log.info(git_message)
context.git_message = git_message
@@ -185,17 +185,17 @@ def do_run_next_update_method(context, force=False):
msgs = [MSG(ERROR_MSG.gettext(**error)) for error in versions['cls_errors']]
return msgs
if not versions['cls_to_update']:
- return [MSG(u'Nothing to update')]
+ return [MSG('Nothing to update')]
while versions['cls_to_update']:
messages = run_next_update_method(context, force)
if messages:
# Abort changes
context.database.abort_changes()
- error = ERROR(u'Error during update method. See logs.')
+ error = ERROR('Error during update method. See logs.')
messages.insert(0, error)
return messages
versions = find_versions_to_update(context, force)
- return [MSG(u'Updated method has been launched')]
+ return [MSG('Updated method has been launched')]
@@ -203,7 +203,7 @@ def do_run_next_update_method(context, force=False):
class UpdateInstanceView(STLView):
access = 'is_admin'
- title = MSG(u'Update instance')
+ title = MSG('Update instance')
template = '/ui/ikaaro/update_instance.xml'
def get_namespace(self, resource, context, query=None):
diff --git a/ikaaro/users.py b/ikaaro/users.py
index 187c7a1d7..15ca5b356 100644
--- a/ikaaro/users.py
+++ b/ikaaro/users.py
@@ -24,19 +24,19 @@
from itools.web import ERROR, get_context
# Import from ikaaro
-from autoedit import AutoEdit
-from config import Configuration
-from enumerates import UserGroups_Datatype
-from fields import Char_Field, Datetime_Field, Email_Field, File_Field
-from fields import Password_Field, SelectAbspath_Field, Select_Field, Text_Field
-from folder import Folder
-from messages import MSG_LOGIN_WRONG_NAME_OR_PASSWORD
-from users_views import User_ConfirmRegistration, User_EditAccount
-from users_views import User_EditPassword, User_EditPreferences, User_Profile
-from users_views import User_ResendConfirmation, User_ChangePasswordForgotten
-from users_views import Users_Browse, Users_AddUser
-from utils import get_secure_hash, generate_password
-from widgets import CheckboxWidget
+from .autoedit import AutoEdit
+from .config import Configuration
+from .enumerates import UserGroups_Datatype
+from .fields import Char_Field, Datetime_Field, Email_Field, File_Field
+from .fields import Password_Field, SelectAbspath_Field, Select_Field, Text_Field
+from .folder import Folder
+from .messages import MSG_LOGIN_WRONG_NAME_OR_PASSWORD
+from .users_views import User_ConfirmRegistration, User_EditAccount
+from .users_views import User_EditPassword, User_EditPreferences, User_Profile
+from .users_views import User_ResendConfirmation, User_ChangePasswordForgotten
+from .users_views import Users_Browse, Users_AddUser
+from .utils import get_secure_hash, generate_password
+from .widgets import CheckboxWidget
class Lastlog_Field(Datetime_Field):
@@ -51,7 +51,7 @@ class UserGroups_Field(SelectAbspath_Field):
datatype = UserGroups_Datatype()
indexed = True
multiple = True
- title = MSG(u'Groups')
+ title = MSG('Groups')
widget = CheckboxWidget
@@ -65,7 +65,7 @@ def access(self, mode, resource):
class Firstname_Field(Text_Field):
- title = MSG(u'First Name')
+ title = MSG('First Name')
multilingual = False
indexed = True
stored = True
@@ -73,7 +73,7 @@ class Firstname_Field(Text_Field):
class Lastname_Field(Text_Field):
- title = MSG(u'Last Name')
+ title = MSG('Last Name')
multilingual = False
indexed = True
stored = True
@@ -85,14 +85,14 @@ class UserState_Field(Select_Field):
parameters_schema = {'key': String()}
default = 'active'
options = [
- {'name': 'active', 'value': MSG(u'Active')},
- {'name': 'pending', 'value': MSG(u'Pending confirmation')},
- {'name': 'inactive', 'value': MSG(u'Inactive')}]
+ {'name': 'active', 'value': MSG('Active')},
+ {'name': 'pending', 'value': MSG('Pending confirmation')},
+ {'name': 'inactive', 'value': MSG('Inactive')}]
class UserEmail_Field(Email_Field):
- title = MSG(u'E-mail Address')
+ title = MSG('E-mail Address')
indexed = True
stored = True
required = True
@@ -110,7 +110,7 @@ class User(Folder):
class_id = 'user'
class_version = '20081217'
- class_title = MSG(u'User')
+ class_title = MSG('User')
class_icon_css = 'fa-user'
class_views = ['profile', 'edit_account', 'edit_preferences',
'edit_password', 'edit_groups']
@@ -121,7 +121,7 @@ class User(Folder):
lastname = Lastname_Field()
email = UserEmail_Field()
password = UserPassword_Field()
- avatar = File_Field(title=MSG(u'Avatar'))
+ avatar = File_Field(title=MSG('Avatar'))
user_language = Char_Field()
user_timezone = Char_Field()
user_state = UserState_Field()
@@ -191,8 +191,8 @@ def _login(self, password, context, use_session=True):
error = MSG_LOGIN_WRONG_NAME_OR_PASSWORD
elif self.get_value('user_state') == 'inactive':
error = ERROR(
- u'Your account has been canceled, contact the administrator '
- u' if you want to get access again.')
+ 'Your account has been canceled, contact the administrator '
+ ' if you want to get access again.')
else:
error = None
context.login(self, use_session=use_session)
@@ -234,7 +234,7 @@ def get_title(self, language=None):
return firstname
if lastname:
return lastname
- return self.get_login_name().decode('utf-8')
+ return self.get_login_name()
login_name_property = 'email'
@@ -257,7 +257,7 @@ def get_timezone(self):
edit_preferences = User_EditPreferences()
edit_password = User_EditPassword()
edit_groups = AutoEdit(access='is_admin', fields=['groups'],
- title=MSG(u'Edit groups'))
+ title=MSG('Edit groups'))
@@ -267,8 +267,8 @@ def get_timezone(self):
class Users(Folder):
class_id = 'users'
- class_title = MSG(u'Users')
- class_description = MSG(u'Manage users.')
+ class_title = MSG('Users')
+ class_description = MSG('Manage users.')
class_icon_css = 'fa-user'
class_views = ['browse_users', 'add_user', 'edit']
diff --git a/ikaaro/users_views.py b/ikaaro/users_views.py
index e00fcd000..88fd38690 100644
--- a/ikaaro/users_views.py
+++ b/ikaaro/users_views.py
@@ -30,24 +30,24 @@
from pytz import common_timezones
# Import from ikaaro
-from autoadd import AutoAdd
-from autoedit import AutoEdit
-from autoform import AutoForm
-from buttons import Button, BrowseButton
-from datatypes import ChoosePassword_Datatype
-from emails import send_email
-from fields import Password_Field, ChoosePassword_Field
-import messages
-from views import BrowseForm
-from widgets import HiddenWidget, ReadOnlyWidget, TextWidget
-from widgets import PasswordWidget, ChoosePassword_Widget
+from .autoadd import AutoAdd
+from .autoedit import AutoEdit
+from .autoform import AutoForm
+from .buttons import Button, BrowseButton
+from .datatypes import ChoosePassword_Datatype
+from .emails import send_email
+from .fields import Password_Field, ChoosePassword_Field
+from . import messages
+from .views import BrowseForm
+from .widgets import HiddenWidget, ReadOnlyWidget, TextWidget
+from .widgets import PasswordWidget, ChoosePassword_Widget
class User_ConfirmRegistration(AutoForm):
access = True
- title = MSG(u'Choose your password')
- description = MSG(u'To activate your account, please type a password.')
+ title = MSG('Choose your password')
+ description = MSG('To activate your account, please type a password.')
schema = freeze({
'key': String(mandatory=True),
@@ -56,9 +56,9 @@ class User_ConfirmRegistration(AutoForm):
'newpass2': String(mandatory=True)})
widgets = freeze([
HiddenWidget('key'),
- ReadOnlyWidget('username', title=MSG(u'Username')),
+ ReadOnlyWidget('username', title=MSG('Username')),
ChoosePassword_Widget('newpass', userid='username'),
- PasswordWidget('newpass2', title=MSG(u'Repeat password'))])
+ PasswordWidget('newpass2', title=MSG('Repeat password'))])
def get_value(self, resource, context, name, datatype):
@@ -99,7 +99,7 @@ def action(self, resource, context, form):
# Check register key
key = resource.get_property('user_state').get_parameter('key')
if not key:
- context.message = MSG(u'User is not pending')
+ context.message = MSG('User is not pending')
return
if form['key'] != key:
@@ -125,14 +125,14 @@ def action(self, resource, context, form):
user=resource)
# Ok
- message = INFO(u'Operation successful! Welcome.')
+ message = INFO('Operation successful! Welcome.')
return context.come_back(message, goto='./')
class User_ChangePasswordForgotten(User_ConfirmRegistration):
- description = MSG(u'Please choose a new password for your account')
+ description = MSG('Please choose a new password for your account')
@@ -144,7 +144,7 @@ def GET(self, resource, context):
# Already confirmed
user_state = resource.get_value('user_state')
if user_state != 'pending':
- msg = MSG(u'User has already confirmed his registration!')
+ msg = MSG('User has already confirmed his registration!')
return context.come_back(msg)
# Resend confirmation
@@ -152,7 +152,7 @@ def GET(self, resource, context):
email = resource.get_value('email')
send_email('user-ask-for-confirmation', context, email, user=resource)
# Ok
- msg = MSG(u'Confirmation sent!')
+ msg = MSG('Confirmation sent!')
return context.come_back(msg)
@@ -160,8 +160,8 @@ def GET(self, resource, context):
class User_Profile(STLView):
access = 'is_allowed_to_view'
- title = MSG(u'Profile')
- description = MSG(u"User's profile page.")
+ title = MSG('Profile')
+ description = MSG("User's profile page.")
icon = 'action_home.png'
template = '/ui/ikaaro/user/profile.xml'
@@ -197,8 +197,8 @@ def get_namespace(self, resource, context):
class User_EditAccount(AutoEdit):
access = 'is_allowed_to_edit'
- title = MSG(u'Edit Account')
- description = MSG(u'Edit your name and email address.')
+ title = MSG('Edit Account')
+ description = MSG('Edit your name and email address.')
icon = 'card.png'
@@ -217,8 +217,8 @@ def set_value(self, resource, context, name, form):
results = context.database.search(query)
if len(results):
error = (
- u'There is another user with the "{value}" {name},'
- u' please choose another one.')
+ 'There is another user with the "{value}" {name},'
+ ' please choose another one.')
context.message = ERROR(error, name=name, value=new_value)
return True
@@ -230,8 +230,8 @@ def set_value(self, resource, context, name, form):
class User_EditPreferences(STLView):
access = 'is_allowed_to_edit'
- title = MSG(u'Edit Preferences')
- description = MSG(u'Set your preferred language and timezone.')
+ title = MSG('Edit Preferences')
+ description = MSG('Set your preferred language and timezone.')
icon = 'preferences.png'
template = '/ui/ikaaro/user/edit_preferences.xml'
schema = {
@@ -280,8 +280,8 @@ def action(self, resource, context, form):
class User_EditPassword(AutoForm):
access = 'is_allowed_to_edit'
- title = MSG(u'Edit Password')
- description = MSG(u'Change your password.')
+ title = MSG('Edit Password')
+ description = MSG('Change your password.')
icon = 'lock.png'
schema = freeze({
@@ -291,8 +291,8 @@ class User_EditPassword(AutoForm):
widgets = [
HiddenWidget('username'),
ChoosePassword_Widget('newpass', userid='username',
- title=MSG(u'New password')),
- PasswordWidget('newpass2', title=MSG(u'Confirm'))]
+ title=MSG('New password')),
+ PasswordWidget('newpass2', title=MSG('Confirm'))]
def get_schema(self, resource, context):
@@ -304,7 +304,7 @@ def get_schema(self, resource, context):
def get_widgets(self, resource, context):
if resource.name != context.user.name:
return self.widgets
- title = MSG(u'Type your current password')
+ title = MSG('Type your current password')
return self.widgets + [PasswordWidget('password', title=title)]
@@ -329,15 +329,15 @@ def _get_form(self, resource, context):
# Check the new password matches
if newpass != form['newpass2']:
- raise FormError(ERROR(u"Passwords mismatch, please try again."))
+ raise FormError(ERROR("Passwords mismatch, please try again."))
# Check old password
if resource.name == context.user.name:
password = form['password']
if not resource.authenticate(password):
message = ERROR(
- u"You mistyped your actual password, your account is"
- u" not changed.")
+ "You mistyped your actual password, your account is"
+ " not changed.")
raise FormError(message)
# Ok
@@ -364,9 +364,9 @@ def action(self, resource, context, form):
class BrowseUsers(BrowseForm):
access = 'is_admin'
- title = MSG(u'Browse Members')
+ title = MSG('Browse Members')
icon = 'userfolder.png'
- description = MSG(u'See the users.')
+ description = MSG('See the users.')
schema = {'ids': String(multiple=True, mandatory=True)}
@@ -376,7 +376,7 @@ def get_query_schema(self):
search_schema = {'search_term': Unicode}
- search_widgets = [TextWidget('search_term', title=MSG(u'Search'))]
+ search_widgets = [TextWidget('search_term', title=MSG('Search'))]
def get_items(self, resource, context):
# Build the Query
@@ -407,7 +407,7 @@ def sort_and_batch(self, resource, context, results):
sort_by)[0].gettext()
items = results.get_resources()
items = list(items)
- items.sort(key=lambda x: f(x), reverse=reverse)
+ items = sorted(items, key=lambda x: f(x), reverse=reverse)
items = items[start:start+size]
database = resource.database
return [ database.get_resource(x.abspath) for x in items ]
@@ -419,11 +419,11 @@ def sort_and_batch(self, resource, context, results):
table_columns = [
('checkbox', None),
- ('name', MSG(u'User ID')),
- ('email', MSG(u'Login')),
- ('firstname', MSG(u'First Name')),
- ('lastname', MSG(u'Last Name')),
- ('account_state', MSG(u'State'))]
+ ('name', MSG('User ID')),
+ ('email', MSG('Login')),
+ ('firstname', MSG('First Name')),
+ ('lastname', MSG('Last Name')),
+ ('account_state', MSG('State'))]
def get_item_value(self, resource, context, item, column):
@@ -434,7 +434,7 @@ def get_item_value(self, resource, context, item, column):
elif column == 'account_state':
if item.get_value('user_state') == 'pending':
href = '/users/%s/;resend_confirmation' % item.name
- return MSG(u'Resend Confirmation'), href
+ return MSG('Resend Confirmation'), href
return item.get_value_title('user_state'), None
@@ -446,14 +446,14 @@ class Users_Browse(BrowseUsers):
table_actions = [
BrowseButton(access='is_admin', name='switch_state',
- title=MSG(u'Switch state'))]
+ title=MSG('Switch state'))]
def action_switch_state(self, resource, context, form):
# Verify if after this operation, all is ok
usernames = form['ids']
if context.user.name in usernames:
- context.message = ERROR(u'You cannot change your state yourself.')
+ context.message = ERROR('You cannot change your state yourself.')
return
database = resource.database
@@ -478,16 +478,16 @@ def action_switch_state(self, resource, context, form):
class Users_AddUser(AutoAdd):
access = 'is_admin'
- title = MSG(u'Add New Member')
+ title = MSG('Add New Member')
icon = 'card.png'
- description = MSG(u'Grant access to a new user.')
+ description = MSG('Grant access to a new user.')
fields = ['email', 'password', 'password2', 'groups']
- password = ChoosePassword_Field(title=MSG(u'Password'), userid='email')
- password.tip = MSG(u'If no password is given an email will be sent to the'
- u' user, asking him to choose his password.')
- password2 = Password_Field(title=MSG(u'Repeat password'), datatype=String)
+ password = ChoosePassword_Field(title=MSG('Password'), userid='email')
+ password.tip = MSG('If no password is given an email will be sent to the'
+ ' user, asking him to choose his password.')
+ password2 = Password_Field(title=MSG('Repeat password'), datatype=String)
@proto_lazy_property
@@ -507,7 +507,7 @@ def _get_form(self, resource, context):
email = form['email'].strip()
results = context.search(email=email)
if len(results):
- raise FormError(ERROR(u'The user is already here.'))
+ raise FormError(ERROR('The user is already here.'))
# Check the password is right
if password != form['password2']:
@@ -520,9 +520,9 @@ def _get_form(self, resource, context):
actions = [
Button(access='is_admin', css='btn btn-primary',
- title=MSG(u'Add and view')),
+ title=MSG('Add and view')),
Button(access='is_admin', css='btn btn-primary', name='add_and_return',
- title=MSG(u'Add and return'))]
+ title=MSG('Add and return'))]
def get_container(self, resource, context, form):
@@ -555,4 +555,4 @@ def action_add_and_return(self, resource, context, form):
if child is None:
return
- context.message = INFO(u'User added.')
+ context.message = INFO('User added.')
diff --git a/ikaaro/utils.py b/ikaaro/utils.py
old mode 100644
new mode 100755
index bb285d10a..e983d9ac8
--- a/ikaaro/utils.py
+++ b/ikaaro/utils.py
@@ -107,16 +107,16 @@ def get_parameters(prefix, **kw):
###########################################################################
# Mark for translatios
-u'Basque'
-u'Catalan'
-u'English'
-u'French'
-u'German'
-u'Hungarian'
-u'Italian'
-u'Japanese'
-u'Portuguese'
-u'Spanish'
+'Basque'
+'Catalan'
+'English'
+'French'
+'German'
+'Hungarian'
+'Italian'
+'Japanese'
+'Portuguese'
+'Spanish'
###########################################################################
@@ -126,7 +126,9 @@ def get_parameters(prefix, **kw):
def reduce_string(title='', word_treshold=15, phrase_treshold=40):
"""Reduce words and string size.
"""
- ellipsis = u'…' if type(title) is unicode else '…'
+ if isinstance(title, bytes):
+ title = title.decode("utf-8")
+ ellipsis = '…' if type(title) is str else '…'
words = title.strip().split(' ')
for i, word in enumerate(words):
if len(word) > word_treshold:
@@ -146,9 +148,12 @@ def reduce_string(title='', word_treshold=15, phrase_treshold=40):
encodings = ['utf-8', 'windows-1252', 'cp437']
def process_name(name):
+ if type(name) is str:
+ checkid_name = checkid(name, soft=False)
+ return checkid_name, name
for encoding in encodings:
try:
- title = unicode(name, encoding)
+ title = str(name, encoding)
checkid_name = checkid(title, soft=False)
break
except UnicodeError:
@@ -170,7 +175,7 @@ def process_name(name):
def to_utf8(data):
for encoding in encodings:
try:
- return unicode(data, encoding).encode('utf-8')
+ return str(data, encoding).encode('utf-8')
except UnicodeError:
pass
@@ -203,8 +208,8 @@ def generate_password(length=6):
def get_secure_hash(password, algo, salt=None):
if salt is None:
salt = generate_password()
-
- return algos[algo](password + salt).digest(), salt
+ password_salt = (password + salt).encode("utf-8")
+ return algos[algo](password_salt).digest(), salt
@@ -303,7 +308,7 @@ def split_reference(ref):
# XXX specific case for the menu
# Be robust if the path is multilingual
type_ref = type(ref)
- if type_ref is unicode:
+ if type_ref is str:
ref = Unicode.encode(ref)
if type_ref is not Reference:
ref = get_reference(ref)
@@ -368,3 +373,32 @@ def close_fancybox(context, default=None):
# Case 2: normal
goto = context.get_form_value('referrer') or default
return get_reference(goto) if type(goto) is str else goto
+
+
+def dict_of_bytes_to_string(old_dict):
+ """
+ Convert dict bytes key value to string
+ Used in form conversion
+ """
+ from typing import Dict
+ new_dict = {}
+ for key, value in old_dict.items():
+ if type(key) is bytes:
+ key = key.decode("utf-8")
+ if type(value) is bytes:
+ value = value.decode("utf-8")
+ elif type(value) is list:
+ tmp_list = []
+ for element in value:
+ if isinstance(element, Dict):
+ element = dict_of_bytes_to_string(element)
+ elif type(element) is bytes:
+ element = element.decode("utf-8")
+ tmp_list.append(element)
+ value = tmp_list
+ elif isinstance(value, Dict):
+ value = dict_of_bytes_to_string(value)
+
+ new_dict[key] = value
+
+ return new_dict
\ No newline at end of file
diff --git a/ikaaro/views/__init__.py b/ikaaro/views/__init__.py
index 579211ad1..25b106c6b 100644
--- a/ikaaro/views/__init__.py
+++ b/ikaaro/views/__init__.py
@@ -16,10 +16,10 @@
# Import from here
-from autotable import AutoTable
-from base import CompositeView, MessageView, IconsView
-from base import Batch, BrowseForm, ContextMenu
-from base import IkaaroStaticView, CachedStaticView, get_view_scripts, get_view_styles
-from folder_views import SearchTypes_Enumerate, ZoomMenu, Folder_NewResource
-from folder_views import Folder_Rename, Folder_BrowseContent, Folder_PreviewContent
-from folder_views import Folder_Thumbnail, GoToSpecificDocument
+from .autotable import AutoTable
+from .base import CompositeView, MessageView, IconsView
+from .base import Batch, BrowseForm, ContextMenu
+from .base import IkaaroStaticView, CachedStaticView, get_view_scripts, get_view_styles
+from .folder_views import SearchTypes_Enumerate, ZoomMenu, Folder_NewResource
+from .folder_views import Folder_Rename, Folder_BrowseContent, Folder_PreviewContent
+from .folder_views import Folder_Thumbnail, GoToSpecificDocument
diff --git a/ikaaro/views/autotable.py b/ikaaro/views/autotable.py
index 1f2cd4e6f..1771b89c7 100644
--- a/ikaaro/views/autotable.py
+++ b/ikaaro/views/autotable.py
@@ -32,7 +32,7 @@
from ikaaro.utils import get_base_path_query
# Import from here
-from folder_views import Folder_BrowseContent
+from .folder_views import Folder_BrowseContent
class AutoTable(Folder_BrowseContent):
@@ -56,7 +56,7 @@ class AutoTable(Folder_BrowseContent):
# Empty table
empty_table_template = '/ui/ikaaro/views/autotable/empty_table_template.xml'
- empty_table_msg = MSG(u'No items in the list')
+ empty_table_msg = MSG('No items in the list')
# Table id / css
search_form_id = 'form-search'
@@ -78,8 +78,8 @@ class AutoTable(Folder_BrowseContent):
batch_size=Integer(default=50))
# Base table fields
- name = Char_Field(title=MSG(u'Name'))
- class_title = Char_Field(title=MSG(u'Type'))
+ name = Char_Field(title=MSG('Name'))
+ class_title = Char_Field(title=MSG('Type'))
@proto_property
@@ -171,7 +171,7 @@ def get_table_columns(self, resource, context):
continue
if name == 'name':
- columns.append((name, MSG(u'ID')))
+ columns.append((name, MSG('ID')))
else:
field = self.get_field(name)
if field:
@@ -459,7 +459,7 @@ def action_remove(self, resource, context, form):
if self.action_remove_goto:
message = context.message
if type(message) is list:
- message = MSG(u'\n'.join([x.gettext() for x in message]))
+ message = MSG('\n'.join([x.gettext() for x in message]))
return context.come_back(message, goto=self.action_remove_goto)
# Ok
return ret
diff --git a/ikaaro/views/base.py b/ikaaro/views/base.py
index 7aa57c36a..7eed1e0ce 100644
--- a/ikaaro/views/base.py
+++ b/ikaaro/views/base.py
@@ -192,7 +192,7 @@ class IconsView(STLView):
access = 'is_allowed_to_view'
template = '/ui/ikaaro/generic/icons_view.xml'
- title = MSG(u'View')
+ title = MSG('View')
def get_namespace(self, resource, context):
"""Example:
@@ -255,7 +255,7 @@ def nb_pages(self):
# Size > 0
total = self.total
- nb_pages = total / size
+ nb_pages = total // size
if (total % size) > 0:
nb_pages += 1
return nb_pages
@@ -269,7 +269,7 @@ def current_page(self):
return 1
# Size > 0
- return (self.start / size) + 1
+ return (self.start // size) + 1
@proto_property
@@ -300,8 +300,8 @@ def pages(self):
# Add middle pages
current_page = self.current_page
nb_pages = self.nb_pages
- middle_pages = range(max(current_page - 3, 2),
- min(current_page + 3, nb_pages-1) + 1)
+ middle_pages = list(range(max(current_page - 3, 2),
+ min(current_page + 3, nb_pages-1) + 1))
pages = [1] + middle_pages
if nb_pages > 1:
@@ -396,7 +396,7 @@ def get_namespace(self, resource, context):
def get_search_actions(self, resource, context):
search_button = Button(access=True,
resource=resource, context=context,
- css='btn btn-primary', title=MSG(u'Search'))
+ css='btn btn-primary', title=MSG('Search'))
return [search_button]
@@ -406,7 +406,7 @@ def get_search_namespace(self, resource, context):
form_css=self.search_form_css,
template=self.search_template,
template_field=self.search_template_field,
- title=MSG(u'Search'),
+ title=MSG('Search'),
method='get',
schema=self.search_schema,
widgets=self.search_widgets,
diff --git a/ikaaro/views/folder_views.py b/ikaaro/views/folder_views.py
index 2664dddca..6e641c738 100644
--- a/ikaaro/views/folder_views.py
+++ b/ikaaro/views/folder_views.py
@@ -44,7 +44,7 @@
from ikaaro import messages
# Import from here
-from base import IconsView, BrowseForm, ContextMenu
+from .base import IconsView, BrowseForm, ContextMenu
class SearchTypes_Enumerate(Enumerate):
@@ -71,7 +71,7 @@ def get_options(self):
for title, type in formats.items():
type = ','.join(type)
types.append({'name': type, 'value': title})
- types.sort(key=lambda x: x['value'].lower())
+ types = sorted(types, key=lambda x: x['value'].lower())
return types
@@ -85,7 +85,7 @@ def is_valid(self, value):
class ZoomMenu(ContextMenu):
- title = MSG(u'Zoom')
+ title = MSG('Zoom')
def get_items(self):
uri = self.context.uri
@@ -107,10 +107,10 @@ def get_items(self):
next_size = str(next_size)
previous_size = str(previous_size)
return [
- {'title': MSG(u'Zoom In'),
+ {'title': MSG('Zoom In'),
'src': '/ui/ikaaro/icons/16x16/zoom_in.png',
'href': uri.replace(size=next_size)},
- {'title': MSG(u'Zoom Out'),
+ {'title': MSG('Zoom Out'),
'src': '/ui/ikaaro/icons/16x16/zoom_out.png',
'href': uri.replace(size=previous_size)}
]
@@ -120,7 +120,7 @@ def get_items(self):
class Folder_NewResource(IconsView):
access = 'is_allowed_to_add'
- title = MSG(u'Add resource')
+ title = MSG('Add resource')
icon = 'new.png'
include_subclasses = True
@@ -188,7 +188,7 @@ def get_namespace(self, resource, context):
class Folder_Rename(STLView):
access = 'is_allowed_to_edit'
- title = MSG(u'Rename resources')
+ title = MSG('Rename resources')
template = '/ui/ikaaro/folder/rename.xml'
query_schema = {
'ids': String(multiple=True)}
@@ -210,8 +210,7 @@ def get_namespace(self, resource, context):
if r_to_rename and root.is_allowed_to_move(user, r_to_rename):
paths.append(x)
# Build the namespace
- paths.sort()
- paths.reverse()
+ paths = sorted(paths, reverse=True)
items = []
for path in paths:
if '/' in path:
@@ -235,8 +234,7 @@ def action(self, resource, context, form):
if len(new_names) > len(set(new_names)):
context.message = messages.MSG_NAME_CLASH
return
- paths.sort()
- paths.reverse()
+ paths = sorted(paths, reverse=True)
# Clean the copy cookie if needed
cut, cp_paths = context.get_cookie('ikaaro_cp', datatype=CopyCookie)
renamed = []
@@ -288,7 +286,7 @@ def action(self, resource, context, form):
class Folder_BrowseContent(BrowseForm):
access = 'is_allowed_to_view'
- title = MSG(u'Browse Content')
+ title = MSG('Browse Content')
context_menus = []
query_schema = merge_dicts(BrowseForm.query_schema,
sort_by=String(default='mtime'),
@@ -298,8 +296,8 @@ class Folder_BrowseContent(BrowseForm):
# Search Form
search_widgets = [
- TextWidget('text', title=MSG(u'Text')),
- SelectWidget('format', title=MSG(u'Type'))]
+ TextWidget('text', title=MSG('Text')),
+ SelectWidget('format', title=MSG('Type'))]
search_schema = {
'text': Unicode,
'format': SearchTypes_Enumerate}
@@ -308,11 +306,11 @@ class Folder_BrowseContent(BrowseForm):
table_columns = [
('checkbox', None),
('icon', None),
- ('abspath', MSG(u'Path')),
- ('title', MSG(u'Title')),
- ('format', MSG(u'Type')),
- ('mtime', MSG(u'Last Modified')),
- ('last_author', MSG(u'Last Author'))]
+ ('abspath', MSG('Path')),
+ ('title', MSG('Title')),
+ ('format', MSG('Type')),
+ ('mtime', MSG('Last Modified')),
+ ('last_author', MSG('Last Author'))]
table_actions = [
Remove_BrowseButton,
RenameButton,
@@ -417,7 +415,7 @@ def _get_key_sorted_by_unicode(self, field):
def key(item):
value = getattr(item, field)
if not value:
- return u''
+ return ''
return value.lower().translate(transmap)
return key
@@ -473,7 +471,7 @@ def sort_and_batch(self, resource, context, results):
# Case 1: Custom but slower sort algorithm
if get_key:
items = results.get_documents()
- items.sort(key=get_key(), reverse=reverse)
+ items = sorted(items, key=get_key(), reverse=reverse)
if size:
items = items[start:start+size]
elif start:
@@ -546,8 +544,7 @@ def action_remove(self, resource, context, form):
# We sort and reverse ids in order to
# remove the childs then their parents
- ids.sort()
- ids.reverse()
+ ids = sorted(ids, reverse=True)
for name in ids:
child = resource.get_resource(name, soft=True)
if child and root.is_allowed_to_remove(user, child):
@@ -750,7 +747,7 @@ def action_export_as_json(self, resource, context, form):
class Folder_PreviewContent(Folder_BrowseContent):
- title = MSG(u'Preview Content')
+ title = MSG('Preview Content')
styles = ['/ui/ikaaro/gallery/style.css']
context_menus = Folder_BrowseContent.context_menus + [ZoomMenu()]
@@ -905,7 +902,7 @@ def GET(self, resource, context):
class GoToSpecificDocument(BaseView):
access = 'is_allowed_to_view'
- title = MSG(u'Front Page')
+ title = MSG('Front Page')
icon = 'view.png'
specific_document = 'FrontPage'
specific_view = None
diff --git a/ikaaro/web/wsgi.py b/ikaaro/web/wsgi.py
index f52c63e45..c6b6d8dad 100644
--- a/ikaaro/web/wsgi.py
+++ b/ikaaro/web/wsgi.py
@@ -63,7 +63,7 @@ def application(environ, start_response):
context.on_request_end()
except HTTPError as e:
RequestMethod.handle_client_error(e, context)
- except StandardError as e:
+ except Exception as e:
tb = traceback.format_exc()
log.error("Internal error : {}".format(tb), exc_info=True)
context.set_default_response(500)
@@ -76,7 +76,11 @@ def application(environ, start_response):
status = context.status or 500
status = '{0} {1}'.format(status, reason_phrases[status])
start_response(str(status), headers)
- yield context.entity
+ data = context.entity
+ if isinstance(data, str):
+ yield data.encode("utf-8")
+ else:
+ yield data
try:
diff --git a/ikaaro/webpage.py b/ikaaro/webpage.py
index 82db63294..e238363e8 100644
--- a/ikaaro/webpage.py
+++ b/ikaaro/webpage.py
@@ -23,16 +23,16 @@
from itools.web import BaseView
# Import from ikaaro
-from autoadd import AutoAdd
-from database import Database
-from fields import HTMLFile_Field
-from file import File
+from .autoadd import AutoAdd
+from .database import Database
+from .fields import HTMLFile_Field
+from .file import File
class WebPage_View(BaseView):
access = 'is_allowed_to_view'
- title = MSG(u'View')
+ title = MSG('View')
icon = 'view.png'
@@ -47,13 +47,13 @@ def GET(self, resource, context):
class WebPage(File):
class_id = 'webpage'
- class_title = MSG(u'Web Page')
- class_description = MSG(u'Create and publish a Web Page.')
+ class_title = MSG('Web Page')
+ class_description = MSG('Create and publish a Web Page.')
class_icon16 = '/ui/ikaaro/icons/16x16/html.png'
class_icon48 = '/ui/ikaaro/icons/48x48/html.png'
- data = HTMLFile_Field(title=MSG(u'Body'))
+ data = HTMLFile_Field(title=MSG('Body'))
#######################################################################
diff --git a/ikaaro/widgets.py b/ikaaro/widgets.py
index 65785fd4d..04c9c69ae 100644
--- a/ikaaro/widgets.py
+++ b/ikaaro/widgets.py
@@ -24,7 +24,7 @@
from operator import itemgetter
from os.path import basename
from random import randint
-from urllib import quote
+from urllib.parse import quote
# Import from itools
from itools.core import freeze, get_abspath
@@ -39,9 +39,9 @@
from itools.web import BaseView, get_context
# Import from ikaaro
-from datatypes import Password_Datatype
-from datatypes import Days, Months, Years
-from utils import CMSTemplate, make_stl_template
+from .datatypes import Password_Datatype
+from .datatypes import Days, Months, Years
+from .utils import CMSTemplate, make_stl_template
@@ -97,8 +97,8 @@ class HiddenWidget(Widget):
class FileWidget(Widget):
- title = MSG(u'File')
- download_file_title = MSG(u'Download')
+ title = MSG('File')
+ download_file_title = MSG('Download')
template = make_stl_template("""
""")
oneline = False
- label_true = MSG(u'Yes')
- label_false = MSG(u'No')
+ label_true = MSG('Yes')
+ label_false = MSG('No')
def options(self):
datatype = self.datatype
@@ -296,7 +296,7 @@ class CheckboxWidget(Widget):
""")
oneline = False
- label = MSG(u'Yes')
+ label = MSG('Yes')
def options(self):
@@ -392,7 +392,7 @@ class DateWidget(Widget):
format = '%Y-%m-%d'
size = 10
show_time = False
- tip = MSG(u'Click on button "..." to choose a date (Format: "yyyy-mm-dd").')
+ tip = MSG('Click on button "..." to choose a date (Format: "yyyy-mm-dd").')
@proto_lazy_property
def scripts(self):
@@ -458,7 +458,7 @@ def value_(self):
try:
value = self.datatype.decode(value)
- except StandardError:
+ except Exception:
# XXX Heuristic here
from itools.web import get_context
context = get_context()
@@ -494,7 +494,7 @@ def value_time(self):
class PathSelectorWidget(TextWidget):
action = 'add_link'
- tip = MSG(u'Click on button "..." to select a file.')
+ tip = MSG('Click on button "..." to select a file.')
template = make_stl_template("""
# Copyright (C) 2006-2007 Hervé Cauwelier
diff --git a/scripts/icms-update.py b/scripts/icms-update.py
index df8a9d497..43f88f80b 100644
--- a/scripts/icms-update.py
+++ b/scripts/icms-update.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
# Copyright (C) 2005-2008 Juan David Ibáñez Palomar
# Copyright (C) 2006-2007 Hervé Cauwelier
@@ -46,7 +46,7 @@ def update(parser, options, target):
with server.database.init_context() as context:
log.info("STAGE 1: Find out the versions to upgrade (may take a while).")
msgs = do_run_next_update_method(context, force=options.force)
- log.info(u'\n'.join([x.gettext() if isinstance(x, MSG) else x for x in msgs]))
+ log.info('\n'.join([x.gettext() if isinstance(x, MSG) else x for x in msgs]))
diff --git a/test/__init__.py b/test/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/test/conftest.py b/test/conftest.py
new file mode 100644
index 000000000..7c2e71396
--- /dev/null
+++ b/test/conftest.py
@@ -0,0 +1,27 @@
+# Import from external
+from subprocess import run
+import shutil
+import pytest
+from ikaaro.server import Server, create_server
+
+
+@pytest.fixture(scope='function')
+def server(path='www.hforge.org', email='test@example.com', password='password',
+ root=None, modules=None,
+ listen_port=8081):
+
+ if modules is None:
+ modules = []
+ shutil.rmtree(path, ignore_errors=True)
+ shutil.rmtree('sessions', ignore_errors=True)
+ create_server(
+ target=path,
+ email=email,
+ password=password,
+ root=root,
+ modules=modules,
+ listen_port=listen_port,
+ backend="git"
+ )
+ server = Server(path)
+ return server
\ No newline at end of file
diff --git a/test/factory.py b/test/factory.py
new file mode 100644
index 000000000..4ef8528d6
--- /dev/null
+++ b/test/factory.py
@@ -0,0 +1,27 @@
+# Import from external
+import shutil
+
+# Import from ikaaro
+from ikaaro.server import Server, create_server
+
+
+def create_server_test(path='www.hforge.org', email='test@example.com', password='password',
+ root=None, modules=None,
+ listen_port=8081):
+
+ if modules is None:
+ modules = []
+
+ shutil.rmtree(path, ignore_errors=True)
+ shutil.rmtree('sessions', ignore_errors=True)
+ create_server(
+ target=path,
+ email=email,
+ password=password,
+ root=root,
+ modules=modules,
+ listen_port=listen_port,
+ backend="git"
+ )
+ server = Server(path)
+ return server
\ No newline at end of file
diff --git a/test/test.py b/test/test.py
index 38d9a2208..bf5614189 100644
--- a/test/test.py
+++ b/test/test.py
@@ -30,11 +30,19 @@
# Import tests
import test_database
import test_metadata
+import test_query
import test_server
+import test_xapian_search
from junitxml import JUnitXmlResult
-test_modules = [test_metadata, test_server, test_database]
+test_modules = [
+ test_database,
+ test_metadata,
+ test_query,
+ test_server,
+ test_xapian_search,
+]
loader = TestLoader()
@@ -61,7 +69,7 @@
elif options.mode == 'junitxml':
path = get_abspath('./junit.xml')
print('Result is here: %s' % path)
- f = file(path, 'wb')
+ f = open(path, 'wb')
result = JUnitXmlResult(f)
result.startTestRun()
ret = suite.run(result)
diff --git a/test/test_database.py b/test/test_database.py
index 8069855c5..dbee987fe 100644
--- a/test/test_database.py
+++ b/test/test_database.py
@@ -26,32 +26,32 @@
from ikaaro.folder import Folder
from ikaaro.utils import get_base_path_query
from ikaaro.text import Text
+import ikaaro.root
class FreeTestCase(TestCase):
-
def test_create_text(self):
with Database('demo.hforge.org', 19500, 20500) as database:
with database.init_context():
- root = root = database.get_resource('/')
+ root = database.get_resource('/')
# Create 1 resource
container = root.make_resource('test-create-texts', Folder)
resource = container.make_resource(None, Text)
- self.assertEqual(str(resource.abspath), '/test-create-texts/0')
+ path = str(resource.abspath)
metadata = resource.metadata
self.assertEqual(metadata.format, 'text')
database.save_changes()
# Check if resource exists
- resource = root.get_resource('/test-create-texts/0')
- self.assertEqual(resource.name, '0')
- search = database.search(abspath='/test-create-texts/0')
+ resource = root.get_resource(path)
+ self.assertEqual(len(resource.name), 32)
+ search = database.search(abspath=path)
self.assertEqual(len(search), 1)
# Del resource
- root.del_resource('/test-create-texts/0')
+ root.del_resource(path)
database.save_changes()
# Check if has been removed
- resource = root.get_resource('/test-create-texts/0', soft=True)
+ resource = root.get_resource(path, soft=True)
self.assertEqual(resource, None)
search = database.search(abspath='/test-create-texts/1')
self.assertEqual(len(search), 0)
@@ -65,12 +65,12 @@ def test_create_user(self):
email = 'test-create-user@hforge.org'
password = 'password'
user = root.make_user(email, password)
- self.assertEqual(user.name, '1')
+ self.assertEqual(len(user.name), 32)
user.set_value('groups', ['/config/groups/admins'])
database.save_changes()
# Try to get user
- user = root.get_resource('/users/1', soft=True)
- self.assertEqual(user.name, '1')
+ user = root.get_resource(f'/users/{user.name}', soft=True)
+ self.assertEqual(len(user.name), 32)
self.assertEqual(user.get_value('email'), 'test-create-user@hforge.org')
self.assertEqual(user.authenticate(password), True)
self.assertEqual(user.authenticate('badpassword'), False)
@@ -84,10 +84,10 @@ def test_create_two_resources_at_root(self):
with database.init_context():
root = database.get_resource('/')
f1 = root.make_resource(None, Folder)
- self.assertEqual(f1.name, '1')
- self.assertEqual(database.added, set(['1.metadata']))
+ self.assertEqual(len(f1.name), 32)
+ self.assertEqual(database.added, {f'{f1.name}.metadata'})
f2 = root.make_resource(None, Folder)
- self.assertEqual(f2.name, '2')
+ self.assertEqual(len(f2.name), 32)
def test_create_two_resources_in_folder(self):
@@ -97,17 +97,24 @@ def test_create_two_resources_in_folder(self):
container = root.make_resource('test-two-resources', Folder)
self.assertEqual(root.get_resource('test-two-resources').name, 'test-two-resources')
f1 = container.make_resource(None, Folder)
- self.assertEqual(f1.name, '0')
- self.assertEqual(database.added, set(['test-two-resources.metadata', 'test-two-resources/0.metadata']))
+ self.assertEqual(len(f1.name), 32)
+ self.assertEqual(database.added, {
+ 'test-two-resources.metadata',
+ f'test-two-resources/{f1.name}.metadata'
+ })
f2 = container.make_resource(None, Folder)
- self.assertEqual(f2.name, '1')
- self.assertEqual(database.added, set(['test-two-resources.metadata' , 'test-two-resources/0.metadata', 'test-two-resources/1.metadata']))
+ self.assertEqual(len(f2.name), 32)
+ self.assertEqual(database.added, {
+ 'test-two-resources.metadata',
+ f'test-two-resources/{f1.name}.metadata',
+ f'test-two-resources/{f2.name}.metadata'
+ })
def test_multilingual_search(self):
with Database('demo.hforge.org', 19500, 20500) as database:
with database.init_context():
- root = root = database.get_resource('/')
+ root = database.get_resource('/')
container = root.make_resource('test-multilingual', Folder)
# Create N resources
for i in range(0, 20):
@@ -161,18 +168,19 @@ def test_move_file(self):
root = database.get_resource('/')
container = root.make_resource('test-move', Folder)
resource = container.make_resource(None, Text, **kw)
- self.assertEqual(str(resource.abspath), '/test-move/0')
+ self.assertEqual(len(resource.name), 32)
+ self.assertEqual(str(resource.abspath), f'/test-move/{resource.name}')
database.save_changes()
# Move '/0' to '/1'
- root.move_resource('/test-move/0', '/test-move/1')
- self.assertEqual(root.get_resource('/test-move/0', soft=True), None)
+ root.move_resource(f'/test-move/{resource.name}', '/test-move/1')
+ self.assertEqual(root.get_resource(f'/test-move/{resource.name}', soft=True), None)
self.assertEqual(root.get_resource('/test-move/1').name, '1')
# Move '/1' to '/1'
root.move_resource('/test-move/1', '/test-move/1')
self.assertEqual(root.get_resource('/test-move/1').name, '1')
# Check text
r1 = root.get_resource('/test-move/1')
- data = r1.get_value('data').to_str()
+ data = r1.get_value('data').to_text()
self.assertEqual(data, 'this is text')
database.close()
@@ -201,17 +209,16 @@ def test_move_folder(self):
database.close()
- def test_set_bad_value(self):
- with Database('demo.hforge.org', 19500, 20500) as database:
- with database.init_context():
- root = database.get_resource('/')
- e = None
- try:
- root.set_value('mtime', time(10, 0))
- except Exception as e:
- pass
- self.assertNotEqual(e, None)
-
+# def test_set_bad_value(self):
+# with Database('demo.hforge.org', 19500, 20500) as database:
+# with database.init_context():
+# root = database.get_resource('/')
+# e = None
+# try:
+# root.set_value('mtime', time(10, 0))
+# except Exception as e:
+# pass
+# self.assertNotEqual(e, None)
def test_abort_transaction(self):
@@ -220,16 +227,16 @@ def test_abort_transaction(self):
root = database.get_resource('/')
kw = {'title': {'fr': u'Bonjour', 'en': u'Hello'},
'data': 'this is text'}
- resource = root.make_resource(None, Text, **kw)
- self.assertEqual(str(resource.abspath), '/0')
- self.assertNotEqual(root.get_resource('/0'), None)
+ r1 = root.make_resource(None, Text, **kw)
+ self.assertEqual(str(r1.abspath), f'/{r1.name}')
+ self.assertIsNotNone(root.get_resource(f'/{r1.name}'))
database.save_changes()
- resource = root.make_resource(None, Text, **kw)
- self.assertEqual(str(resource.abspath), '/1')
+ r2 = root.make_resource(None, Text, **kw)
+ self.assertEqual(str(r2.abspath), f'/{r2.name}')
database.catalog.index_document({'abspath': '/2'})
database.abort_changes()
- self.assertNotEqual(root.get_resource('/0'), None)
- self.assertEqual(root.get_resource('/1', soft=True), None)
+ self.assertIsNotNone(root.get_resource(f'/{r1.name}'))
+ self.assertIsNone(root.get_resource(f'/{r2.name}', soft=True))
database.close()
@@ -244,7 +251,7 @@ def test_close_transaction(self):
kw = {'title': {'fr': u'Bonjour', 'en': u'Hello'},
'data': 'this is text'}
resource = container.make_resource(None, Text, **kw)
- self.assertEqual(str(resource.abspath), '/folder-test-close-transaction/0')
+ self.assertEqual(str(resource.abspath), f'/folder-test-close-transaction/{resource.name}')
database.save_changes()
query = AndQuery(
get_base_path_query('/folder-test-close-transaction'),
diff --git a/test/test_metadata.py b/test/test_metadata.py
index 1343a01e5..44930baf0 100644
--- a/test/test_metadata.py
+++ b/test/test_metadata.py
@@ -51,7 +51,7 @@ def test_version(self):
def test_title(self):
value = self.metadata.get_property('title', language='fr').value
- self.assertEqual(type(value), unicode)
+ self.assertEqual(type(value), str)
self.assertEqual(value, u'bonjour')
@@ -84,7 +84,7 @@ def test_version(self):
def test_title(self):
value = self.metadata.get_property('title', language='en').value
- self.assertEqual(type(value), unicode)
+ self.assertEqual(type(value), str)
self.assertEqual(value, u'Hello World')
diff --git a/test/test_query.py b/test/test_query.py
new file mode 100644
index 000000000..03cf65d90
--- /dev/null
+++ b/test/test_query.py
@@ -0,0 +1,28 @@
+from unittest import TestCase, main
+
+from itools.database import AndQuery, PhraseQuery
+from ikaaro.database import Database
+
+
+class QueryTestCase(TestCase):
+
+ def test_query(self):
+ with Database('demo.hforge.org', 19500, 20500) as database:
+ with database.init_context():
+# root = database.get_resource('/')
+ # Root
+ search = database.search(PhraseQuery('abspath', '/'))
+ self.assertEqual(len(search), 1)
+ # Users
+ search = database.search(PhraseQuery('format', 'user'))
+ self.assertTrue(len(search) > 0)
+ for doc in search.get_documents():
+ path = doc.get_value('abspath')
+ search = database.search(PhraseQuery('abspath', path))
+ self.assertEqual(len(search), 1)
+ doc = search.get_documents()[0]
+ self.assertEqual(doc.get_value('abspath'), path)
+
+
+if __name__ == '__main__':
+ main()
diff --git a/test/test_server.py b/test/test_server.py
index ee5d7c446..517088ba8 100644
--- a/test/test_server.py
+++ b/test/test_server.py
@@ -15,7 +15,7 @@
# along with this program. If not, see .
# Import from the Standard Library
-from StringIO import StringIO
+from io import StringIO
from unittest import TestCase, main
# Import from itools
diff --git a/test/test_xapian_search.py b/test/test_xapian_search.py
new file mode 100644
index 000000000..27bf61cb4
--- /dev/null
+++ b/test/test_xapian_search.py
@@ -0,0 +1,49 @@
+from unittest import TestCase
+
+# Import from itools
+from itools.database import AndQuery, PhraseQuery
+
+# Import from ikaaro
+from ikaaro.folder import Folder
+from ikaaro.text import Text
+
+from factory import create_server_test
+
+class UserHistoryFolder(Folder):
+ """
+ Class to test xapian s
+ """
+
+ class_id = 'user-history'
+
+
+class TestXapianSearch(TestCase):
+
+ def setUp(self) -> None:
+ self.server = create_server_test()
+
+ def test_user_search(self):
+ with self.server.database as database:
+ database.init_context()
+ # Test /;ctrl view
+ retour = self.server.do_request('GET', '/;_ctrl')
+ assert retour['status'] == 200
+ root = database.get_resource('/')
+ email = 'test-create-user@hforge.org'
+ password = 'password'
+ user = root.make_user(email, password)
+ root.make_resource(f"users/{user.name}/toto", Text)
+
+ container = root.make_resource('test-create-texts', Folder)
+ sub_container = container.make_resource(f'users', Folder)
+ sub_container_2 = sub_container.make_resource(user.name, UserHistoryFolder)
+ sub_container_2.make_resource("device", Text)
+ self.server.database.save_changes()
+ query = AndQuery(
+ PhraseQuery("format", "user"),
+ PhraseQuery("abspath", str(user.abspath))
+ )
+ search = database.search(query)
+ self.assertEqual(len(search.get_documents()), 1)
+
+
diff --git a/tools/server_api_example.py b/tools/server_api_example.py
old mode 100644
new mode 100755
index e875e19b0..635adf89b
--- a/tools/server_api_example.py
+++ b/tools/server_api_example.py
@@ -16,10 +16,12 @@
# Import from standard library
from pprint import pprint
+import sys
# Import from ikaaro
from ikaaro.server import Server, create_server
-
+from ikaaro.root import Root
+import shutil
path = 'www.hforge.org'
email = 'test@example.com'
@@ -28,7 +30,20 @@
modules = []
listen_port = 8081
-create_server(path, email, password, root, modules, listen_port)
+
+if sys.argv[-1] == 'create':
+ shutil.rmtree(path, ignore_errors=True)
+ shutil.rmtree('sessions', ignore_errors=True)
+ create_server(
+ target=path,
+ email=email,
+ password=password,
+ root=root,
+ modules=modules,
+ listen_port=listen_port,
+ backend="git"
+ )
+
server = Server(path)
server.start(detach=False, loop=False)
print('Launch reindexation')
@@ -38,5 +53,5 @@
else:
print('Error in reindexation')
retour = server.do_request('GET', '/;_ctrl')
-pprint(retour)
+print(retour)
server.stop()